Repository: hxseven/Remove-Empty-Directories Branch: master Commit: d31505f04ce2 Files: 44 Total size: 424.7 KB Directory structure: gitextract_p_szlfn3/ ├── .gitignore ├── Installer/ │ ├── README.md │ ├── legacy-files/ │ │ ├── legacy-disclaimer.txt │ │ ├── manifest-info.txt │ │ ├── red_installer-v1.iss │ │ ├── require_administrator.manifest │ │ └── set_require_administrator.bat │ ├── license.txt │ └── red_installer.iss ├── LICENSE ├── README.md ├── RED2/ │ ├── DeletionError.Designer.cs │ ├── DeletionError.cs │ ├── DeletionError.resx │ ├── Lib/ │ │ ├── Core.cs │ │ ├── DeletionWorker.cs │ │ ├── Enums.cs │ │ ├── Events.cs │ │ ├── FindEmptyDirectoryWorker.cs │ │ ├── RuntimeData.cs │ │ ├── SystemFunctions.cs │ │ ├── TreeManager.cs │ │ └── UIHelpers.cs │ ├── LogWindow.Designer.cs │ ├── LogWindow.cs │ ├── LogWindow.resx │ ├── MainWindow.Designer.cs │ ├── MainWindow.cs │ ├── MainWindow.resx │ ├── Program.cs │ ├── Properties/ │ │ ├── AssemblyInfo.cs │ │ ├── Resources.Designer.cs │ │ ├── Resources.resx │ │ ├── Resources_de.resx │ │ ├── Settings.Designer.cs │ │ └── Settings.settings │ ├── RED2.csproj │ ├── RED2.csproj.user │ ├── app.config │ ├── app.manifest │ └── packages.config ├── Scripts/ │ ├── create-1000-empty-directories.bat │ └── create-test-directories.bat └── red2_project.sln ================================================ FILE CONTENTS ================================================ ================================================ FILE: .gitignore ================================================ *.suo RED2/bin/ RED2/obj/ RED2/publish/ Installer/output/ Installer/bin/ .vs packages/ Scripts/test-* ================================================ FILE: Installer/README.md ================================================ # RED Installer This directory contains all resources related to the RED installer. I wrote this document mostly for myself because I forgot how I did it last time. Maybe it can be helpful to others too. ## How-to generate a new installer ### Step 1: Build binaries * Install Microsoft Visual Studio (Community), I used version 2019 * Open the project file "red2_project.sln" * Change to build configuration to "Release-x86" and build the solution * Then change the build configuration to "Release-x64" and build the solution again ### Step 2: Compile installer * Install Inno Setup (Version 6.1+) * Make sure you build the binaries first (see step 1) * Open red_installer-v2.iss with Inno Setup * Select "Compile" in the "Build" menu * Inno Setup should automatically find and use the newly generated binaries, otherwise, paths in the iss file might need to be fixed * Inno Setup should now compile a new installer and save it into the bin/ folder below this directory * Check the compiler output of Inno Setup to see if there were any problems * Done :) ================================================ FILE: Installer/legacy-files/legacy-disclaimer.txt ================================================ # Archived legacy disclaimer ## Remark from 2021 No more cases where reported since about ten years, so I removed this disclaimer from the main license and info files. Keeping this file is for historic reasons. ## Original message To be honest with you as user of RED I have to tell you that one user of RED (v2.1) reported that it deleted folders which were not completely empty and contained files important to him. I'm really very sorry for that! I checked all routines of RED several times to ensure nothing goes wrong, but somehow it happened on the system of that user. Unfortunately, I could not determine what caused that behaviour. In addition to that the user did not wanted to try to locate the error, because he was (understandably) very upset and uninstalled RED instantly. But he told me that the directory names contained chinese characters. So I tried to reproduce the error by testing RED with foreign directory names. But I could not find a bug - RED worked as expected. My conclusion: I currently assume it was a unfortunate exception or some sort of misconfiguration and I hope that it does not happen again. I also refactored and optimized the whole sourcecode of RED 2.2 to improve the stability and the error handling. To sum up, if you use RED for the first time have a look at the directories RED found and rethink if they are plausible. And if you want to be really safe double-click a few folders to see if they are really empty. This especially applies to systems with directory names containing any special characters. Contact me if you notice anything strange. BTW: As I originally developed RED for myself therefore I took particular care to ensure everything works correctly. ================================================ FILE: Installer/legacy-files/manifest-info.txt ================================================ http://msdn.microsoft.com/en-us/library/bb756929.aspx ================================================ FILE: Installer/legacy-files/red_installer-v1.iss ================================================ ; Script generated by the Inno Setup Script Wizard. ; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES! #include "scripts\products.iss" #include "scripts\products\dotnetfx35.iss" [Setup] ; NOTE: The value of AppId uniquely identifies this application. ; Do not use the same AppId value in installers for other applications. ; (To generate a new GUID, click Tools | Generate GUID inside the IDE.) AppId={{06F25DC8-71E2-44E2-805A-F15E15B51C74} ;AppId=Remove Empty Directories AppName=Remove Empty Directories ;AppVersion=2.2 AppVersion=2.2 (Admin Editon) AppPublisher=Jonas John AppCopyright=Remove Empty Directories Jonas John 2006-2011 AppPublisherURL=http://www.jonasjohn.de/ AppSupportURL=http://www.jonasjohn.de/ AppUpdatesURL=http://www.jonasjohn.de/ DefaultDirName={pf}\Remove Empty Directories DefaultGroupName=Remove Empty Directories AllowNoIcons=true LicenseFile=license.txt ;OutputBaseFilename=red-v2.2-setup OutputBaseFilename=red-v2.2-setup-admin SourceDir=. OutputDir=output\ ;SetupIconFile=red.ico Compression=lzma SolidCompression=true UninstallDisplayIcon={app}\RED2.exe ;MinVersion=4.1,5.0 ;PrivilegesRequired=admin ;ArchitecturesAllowed=x86 x64 ia64 ;ArchitecturesInstallIn64BitMode=x64 ia64 [Languages] Name: en; MessagesFile: compiler:Default.isl ;Name: "de"; MessagesFile: "compiler:Languages\German.isl" [Tasks] Name: desktopicon; Description: {cm:CreateDesktopIcon}; GroupDescription: {cm:AdditionalIcons}; Flags: unchecked ; Name: quicklaunchicon; Description: {cm:CreateQuickLaunchIcon}; GroupDescription: {cm:AdditionalIcons}; Flags: unchecked; OnlyBelowVersion: 0,6.1 ;Name: common; Description: "&All users"; GroupDescription: "Install For:"; Flags: exclusive unchecked ;Name: local; Description: "Just &me"; GroupDescription: "Install For:"; Flags: exclusive [Files] Source: RED2.exe; DestDir: {app}; Flags: ignoreversion Source: license.txt; DestDir: {app}; Flags: ignoreversion Source: credits.txt; DestDir: {app}; Flags: ignoreversion ; NOTE: Don't use "Flags: ignoreversion" on any shared system files [InstallDelete] ; Delete old files from RED 2.1 Name: {group}\Readme file.lnk; Type: files Name: {group}\Uninstall.lnk; Type: files Name: {app}\readme.txt; Type: files Name: {app}\lgpl.txt; Type: files Name: {app}\RED2.exe.manifest; Type: files Name: {app}\uninst.exe; Type: files [UninstallDelete] ; cleanup - delete config dir Name: {localappdata}\Remove_Empty_Directories; Type: filesandordirs; Tasks: ; Languages: ; Delete application directory if empty Name: {app}; Type: dirifempty [Icons] Name: {group}\Remove Empty Directories; Filename: {app}\RED2.exe Name: {group}\{cm:UninstallProgram,Remove Empty Directories}; Filename: {uninstallexe} Name: {commondesktop}\Remove Empty Directories; Filename: {app}\RED2.exe; Tasks: desktopicon ;Name: {userappdata}\Microsoft\Internet Explorer\Quick Launch\Remove Empty Directories; Filename: {app}\RED2.exe; Tasks: quicklaunchicon [Registry] ; remove explorer context entry if exists Root: HKCR; Subkey: Folder\shell\Remove empty dirs; ValueType: string; Flags: uninsdeletekey deletekey dontcreatekey; Tasks: ; Languages: [Run] Filename: {app}\RED2.exe; Description: {cm:LaunchProgram,Remove Empty Directories}; Flags: nowait postinstall skipifsilent shellexec; Tasks: ; Languages: [Code] function InitializeSetup(): Boolean; var UninstallerPath: String; ErrorCode: Integer; begin //install .net 3.5 if possible dotnetfx35(); // Check whether application is already installed if RegKeyExists(HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Remove Empty Directories') then begin if MsgBox('The setup has detected that RED is already installed on your computer. Do you wish to uninstall the previous version and continue with a fresh installation?', mbConfirmation, MB_YESNO) = IDYES then begin RegQueryStringValue(HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Remove Empty Directories', 'UninstallString', UninstallerPath); // ShellExec('runas', uninstaller, '/SILENT', '', SW_HIDE, ewWaitUntilTerminated, ErrorCode); // use above statement if extra level security is required usually it is not req //ShellExec('open', UninstallerPath, '/S', '', SW_SHOW, ewWaitUntilTerminated, ErrorCode); ShellExec('runas', UninstallerPath, '/S', '', SW_SHOW, ewWaitUntilTerminated, ErrorCode); //Exec(UninstallerPath, '/S', '', SW_SHOWNORMAL, ewWaitUntilTerminated, ErrorCode); end; end; Result := true; end; ================================================ FILE: Installer/legacy-files/require_administrator.manifest ================================================ ================================================ FILE: Installer/legacy-files/set_require_administrator.bat ================================================ "C:\Program Files\Microsoft SDKs\Windows\v7.0A\bin\mt.exe" -manifest "require_administrator.manifest" -outputresource:"RED2.exe;#1" pause ================================================ FILE: Installer/license.txt ================================================ DISCLAIMER RED is a tool that DELETES stuff! So please be careful with it and its settings. LICENSE The program is distributed under the terms of the GNU Lesser General Public License which I copied from here: http://www.gnu.org/copyleft/lgpl.html GNU LESSER GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. This version of the GNU Lesser General Public License incorporates the terms and conditions of version 3 of the GNU General Public License, supplemented by the additional permissions listed below. 0. Additional Definitions. As used herein, "this License" refers to version 3 of the GNU Lesser General Public License, and the "GNU GPL" refers to version 3 of the GNU General Public License. "The Library" refers to a covered work governed by this License, other than an Application or a Combined Work as defined below. An "Application" is any work that makes use of an interface provided by the Library, but which is not otherwise based on the Library. Defining a subclass of a class defined by the Library is deemed a mode of using an interface provided by the Library. A "Combined Work" is a work produced by combining or linking an Application with the Library. The particular version of the Library with which the Combined Work was made is also called the "Linked Version". The "Minimal Corresponding Source" for a Combined Work means the Corresponding Source for the Combined Work, excluding any source code for portions of the Combined Work that, considered in isolation, are based on the Application, and not on the Linked Version. The "Corresponding Application Code" for a Combined Work means the object code and/or source code for the Application, including any data and utility programs needed for reproducing the Combined Work from the Application, but excluding the System Libraries of the Combined Work. 1. Exception to Section 3 of the GNU GPL. You may convey a covered work under sections 3 and 4 of this License without being bound by section 3 of the GNU GPL. 2. Conveying Modified Versions. If you modify a copy of the Library, and, in your modifications, a facility refers to a function or data to be supplied by an Application that uses the facility (other than as an argument passed when the facility is invoked), then you may convey a copy of the modified version: a) under this License, provided that you make a good faith effort to ensure that, in the event an Application does not supply the function or data, the facility still operates, and performs whatever part of its purpose remains meaningful, or b) under the GNU GPL, with none of the additional permissions of this License applicable to that copy. 3. Object Code Incorporating Material from Library Header Files. The object code form of an Application may incorporate material from a header file that is part of the Library. You may convey such object code under terms of your choice, provided that, if the incorporated material is not limited to numerical parameters, data structure layouts and accessors, or small macros, inline functions and templates (ten or fewer lines in length), you do both of the following: a) Give prominent notice with each copy of the object code that the Library is used in it and that the Library and its use are covered by this License. b) Accompany the object code with a copy of the GNU GPL and this license document. 4. Combined Works. You may convey a Combined Work under terms of your choice that, taken together, effectively do not restrict modification of the portions of the Library contained in the Combined Work and reverse engineering for debugging such modifications, if you also do each of the following: a) Give prominent notice with each copy of the Combined Work that the Library is used in it and that the Library and its use are covered by this License. b) Accompany the Combined Work with a copy of the GNU GPL and this license document. c) For a Combined Work that displays copyright notices during execution, include the copyright notice for the Library among these notices, as well as a reference directing the user to the copies of the GNU GPL and this license document. d) Do one of the following: 0) Convey the Minimal Corresponding Source under the terms of this License, and the Corresponding Application Code in a form suitable for, and under terms that permit, the user to recombine or relink the Application with a modified version of the Linked Version to produce a modified Combined Work, in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source. 1) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (a) uses at run time a copy of the Library already present on the user's computer system, and (b) will operate properly with a modified version of the Library that is interface-compatible with the Linked Version. e) Provide Installation Information, but only if you would otherwise be required to provide such information under section 6 of the GNU GPL, and only to the extent that such information is necessary to install and execute a modified version of the Combined Work produced by recombining or relinking the Application with a modified version of the Linked Version. (If you use option 4d0, the Installation Information must accompany the Minimal Corresponding Source and Corresponding Application Code. If you use option 4d1, you must provide the Installation Information in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source.) 5. Combined Libraries. You may place library facilities that are a work based on the Library side by side in a single library together with other library facilities that are not Applications and are not covered by this License, and convey such a combined library under terms of your choice, if you do both of the following: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities, conveyed under the terms of this License. b) Give prominent notice with the combined library that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 6. Revised Versions of the GNU Lesser General Public License. The Free Software Foundation may publish revised and/or new versions of the GNU Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library as you received it specifies that a certain numbered version of the GNU Lesser General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that published version or of any later version published by the Free Software Foundation. If the Library as you received it does not specify a version number of the GNU Lesser General Public License, you may choose any version of the GNU Lesser General Public License ever published by the Free Software Foundation. If the Library as you received it specifies that a proxy can decide whether future versions of the GNU Lesser General Public License shall apply, that proxy's public statement of acceptance of any version is permanent authorization for you to choose that version for the Library. The progam may also contain traces of nuts. ================================================ FILE: Installer/red_installer.iss ================================================ // contribute: https://github.com/DomGries/InnoDependencyInstaller // official article: https://codeproject.com/Articles/20868/Inno-Setup-Dependency-Installer #define APP_ID "06F25DC8-71E2-44E2-805A-F15E15B51C74" #define MyAppSetupName "Remove Empty Directories" #define MyAppVersion "2.3" #define MyAppPublisher "Jonas John" #define MyAppCopyright 'Copyright (c) Jonas John' #define MyAppURL "https://www.jonasjohn.de/" #define MyAppSourceDir "" #define MyAppExeName "RED2.exe" #define SourceBinPathX86 "..\RED2\bin\x86\Release-x86\RED2.exe" #define SourceBinPathX64 "..\RED2\bin\x64\Release-x64\RED2.exe" ; DLL is the same for X86 & X64 #define SourceDLLPath "..\RED2\bin\x86\Release-x86\AlphaFS.dll" [Setup] ; NOTE: The value of AppId uniquely identifies this application. Do not use the same AppId value in installers for other applications. ; (To generate a new GUID, click Tools | Generate GUID inside the IDE.) AppId={{{#APP_ID}} AppName={#MyAppSetupName} AppVersion={#MyAppVersion} AppVerName={#MyAppSetupName} {#MyAppVersion} AppCopyright={#MyAppCopyright} VersionInfoVersion={#MyAppVersion} VersionInfoCompany={#MyAppPublisher} AppPublisher={#MyAppPublisher} AppPublisherURL={#MyAppURL} AppSupportURL={#MyAppURL} AppUpdatesURL={#MyAppURL} OutputBaseFilename=red-{#MyAppVersion}-setup DefaultGroupName={#MyAppSetupName} DefaultDirName={autopf}\{#MyAppSetupName} UninstallDisplayIcon={app}\{#MyAppExeName} ; SourceDir={#MyAppSourceDir} OutputDir={#SourcePath}\bin AllowNoIcons=yes LicenseFile=license.txt ; WizardStyle=modern ; Compression=lzma SolidCompression=yes MinVersion=6.0 PrivilegesRequired=admin // remove next line if you only deploy 32-bit binaries and dependencies ArchitecturesInstallIn64BitMode=x64 // dependency installation requires ready page and ready memo to be enabled (default behaviour) DisableReadyPage=no DisableReadyMemo=no // shared code for installing the dependencies [Code] // types and variables type TDependency = record Filename: String; Parameters: String; Title: String; URL: String; Checksum: String; ForceSuccess: Boolean; InstallClean: Boolean; RebootAfter: Boolean; end; InstallResult = (InstallSuccessful, InstallRebootRequired, InstallError); var MemoInstallInfo: String; Dependencies: array of TDependency; DelayedReboot, ForceX86: Boolean; DownloadPage: TDownloadWizardPage; procedure AddDependency(const Filename, Parameters, Title, URL, Checksum: String; const ForceSuccess, InstallClean, RebootAfter: Boolean); var Dependency: TDependency; I: Integer; begin MemoInstallInfo := MemoInstallInfo + #13#10 + '%1' + Title; Dependency.Filename := Filename; Dependency.Parameters := Parameters; Dependency.Title := Title; if FileExists(ExpandConstant('{tmp}{\}') + Filename) then begin Dependency.URL := ''; end else begin Dependency.URL := URL; end; Dependency.Checksum := Checksum; Dependency.ForceSuccess := ForceSuccess; Dependency.InstallClean := InstallClean; Dependency.RebootAfter := RebootAfter; I := GetArrayLength(Dependencies); SetArrayLength(Dependencies, I + 1); Dependencies[I] := Dependency; end; function IsPendingReboot: Boolean; var Value: String; begin Result := RegQueryMultiStringValue(HKEY_LOCAL_MACHINE, 'SYSTEM\CurrentControlSet\Control\Session Manager', 'PendingFileRenameOperations', Value) or (RegQueryMultiStringValue(HKEY_LOCAL_MACHINE, 'SYSTEM\CurrentControlSet\Control\Session Manager', 'SetupExecute', Value) and (Value <> '')); end; function InstallProducts: InstallResult; var ResultCode, I, ProductCount: Integer; begin Result := InstallSuccessful; ProductCount := GetArrayLength(Dependencies); MemoInstallInfo := SetupMessage(msgReadyMemoTasks); if ProductCount > 0 then begin DownloadPage.Show; for I := 0 to ProductCount - 1 do begin if Dependencies[I].InstallClean and (DelayedReboot or IsPendingReboot) then begin Result := InstallRebootRequired; break; end; DownloadPage.SetText(Dependencies[I].Title, ''); DownloadPage.SetProgress(I + 1, ProductCount); while True do begin ResultCode := 0; if ShellExec('', ExpandConstant('{tmp}{\}') + Dependencies[I].Filename, Dependencies[I].Parameters, '', SW_SHOWNORMAL, ewWaitUntilTerminated, ResultCode) then begin if Dependencies[I].RebootAfter then begin // delay reboot after install if we installed the last dependency anyways if I = ProductCount - 1 then begin DelayedReboot := True; end else begin Result := InstallRebootRequired; MemoInstallInfo := Dependencies[I].Title; end; break; end else if (ResultCode = 0) or Dependencies[I].ForceSuccess then begin break; end else if ResultCode = 3010 then begin // Windows Installer ResultCode 3010: ERROR_SUCCESS_REBOOT_REQUIRED DelayedReboot := True; break; end; end; case SuppressibleMsgBox(FmtMessage(SetupMessage(msgErrorFunctionFailed), [Dependencies[I].Title, IntToStr(ResultCode)]), mbError, MB_ABORTRETRYIGNORE, IDIGNORE) of IDABORT: begin Result := InstallError; MemoInstallInfo := MemoInstallInfo + #13#10 + ' ' + Dependencies[I].Title; break; end; IDIGNORE: begin MemoInstallInfo := MemoInstallInfo + #13#10 + ' ' + Dependencies[I].Title; break; end; end; end; if Result <> InstallSuccessful then begin break; end; end; DownloadPage.Hide; end; end; // Inno Setup event functions procedure InitializeWizard; begin DownloadPage := CreateDownloadPage(SetupMessage(msgWizardPreparing), SetupMessage(msgPreparingDesc), nil); end; function PrepareToInstall(var NeedsRestart: Boolean): String; var I: Integer; begin DelayedReboot := False; case InstallProducts of InstallError: begin Result := MemoInstallInfo; end; InstallRebootRequired: begin Result := MemoInstallInfo; NeedsRestart := True; // write into the registry that the installer needs to be executed again after restart RegWriteStringValue(HKEY_CURRENT_USER, 'SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce', 'InstallBootstrap', ExpandConstant('{srcexe}')); end; end; end; function NeedRestart: Boolean; begin Result := DelayedReboot; end; function UpdateReadyMemo(const Space, NewLine, MemoUserInfoInfo, MemoDirInfo, MemoTypeInfo, MemoComponentsInfo, MemoGroupInfo, MemoTasksInfo: String): String; begin Result := ''; if MemoUserInfoInfo <> '' then begin Result := Result + MemoUserInfoInfo + Newline + NewLine; end; if MemoDirInfo <> '' then begin Result := Result + MemoDirInfo + Newline + NewLine; end; if MemoTypeInfo <> '' then begin Result := Result + MemoTypeInfo + Newline + NewLine; end; if MemoComponentsInfo <> '' then begin Result := Result + MemoComponentsInfo + Newline + NewLine; end; if MemoGroupInfo <> '' then begin Result := Result + MemoGroupInfo + Newline + NewLine; end; if MemoTasksInfo <> '' then begin Result := Result + MemoTasksInfo; end; if MemoInstallInfo <> '' then begin if MemoTasksInfo = '' then begin Result := Result + SetupMessage(msgReadyMemoTasks); end; Result := Result + FmtMessage(MemoInstallInfo, [Space]); end; end; function NextButtonClick(const CurPageID: Integer): Boolean; var I, ProductCount: Integer; Retry: Boolean; begin Result := True; if (CurPageID = wpReady) and (MemoInstallInfo <> '') then begin DownloadPage.Show; ProductCount := GetArrayLength(Dependencies); for I := 0 to ProductCount - 1 do begin if Dependencies[I].URL <> '' then begin DownloadPage.Clear; DownloadPage.Add(Dependencies[I].URL, Dependencies[I].Filename, Dependencies[I].Checksum); Retry := True; while Retry do begin Retry := False; try DownloadPage.Download; except if GetExceptionMessage = SetupMessage(msgErrorDownloadAborted) then begin Result := False; I := ProductCount; end else begin case SuppressibleMsgBox(AddPeriod(GetExceptionMessage), mbError, MB_ABORTRETRYIGNORE, IDIGNORE) of IDABORT: begin Result := False; I := ProductCount; end; IDRETRY: begin Retry := True; end; end; end; end; end; end; end; DownloadPage.Hide; end; end; // architecture helper functions function IsX64: Boolean; begin Result := not ForceX86 and Is64BitInstallMode; end; function GetString(const x86, x64: String): String; begin if IsX64 then begin Result := x64; end else begin Result := x86; end; end; function GetArchitectureSuffix: String; begin Result := GetString('', '_x64'); end; function GetArchitectureTitle: String; begin Result := GetString(' (x86)', ' (x64)'); end; function CompareVersion(const Version1, Version2: String): Integer; var Position, Number1, Number2: Integer; begin Result := 0; while (Version1 <> '') or (Version2 <> '') do begin Position := Pos('.', Version1); if Position > 0 then begin Number1 := StrToIntDef(Copy(Version1, 1, Position - 1), 0); Delete(Version1, 1, Position); end else if Version1 <> '' then begin Number1 := StrToIntDef(Version1, 0); Version1 := ''; end else begin Number1 := 0; end; Position := Pos('.', Version2); if Position > 0 then begin Number2 := StrToIntDef(Copy(Version2, 1, Position - 1), 0); Delete(Version2, 1, Position); end else if Version2 <> '' then begin Number2 := StrToIntDef(Version2, 0); Version2 := ''; end else begin Number2 := 0; end; if Number1 < Number2 then begin Result := -1; break; end else if Number1 > Number2 then begin Result := 1; break; end; end; end; // custom setup content [Languages] // Name: en; MessagesFile: "compiler:Default.isl" // Name: nl; MessagesFile: "compiler:Languages\Dutch.isl" // Name: de; MessagesFile: "compiler:Languages\German.isl" Name: "english"; MessagesFile: "compiler:Default.isl" Name: "armenian"; MessagesFile: "compiler:Languages\Armenian.isl" Name: "brazilianportuguese"; MessagesFile: "compiler:Languages\BrazilianPortuguese.isl" Name: "catalan"; MessagesFile: "compiler:Languages\Catalan.isl" Name: "corsican"; MessagesFile: "compiler:Languages\Corsican.isl" Name: "czech"; MessagesFile: "compiler:Languages\Czech.isl" Name: "danish"; MessagesFile: "compiler:Languages\Danish.isl" Name: "dutch"; MessagesFile: "compiler:Languages\Dutch.isl" Name: "finnish"; MessagesFile: "compiler:Languages\Finnish.isl" Name: "french"; MessagesFile: "compiler:Languages\French.isl" Name: "german"; MessagesFile: "compiler:Languages\German.isl" Name: "hebrew"; MessagesFile: "compiler:Languages\Hebrew.isl" Name: "icelandic"; MessagesFile: "compiler:Languages\Icelandic.isl" Name: "italian"; MessagesFile: "compiler:Languages\Italian.isl" Name: "japanese"; MessagesFile: "compiler:Languages\Japanese.isl" Name: "norwegian"; MessagesFile: "compiler:Languages\Norwegian.isl" Name: "polish"; MessagesFile: "compiler:Languages\Polish.isl" Name: "portuguese"; MessagesFile: "compiler:Languages\Portuguese.isl" Name: "russian"; MessagesFile: "compiler:Languages\Russian.isl" Name: "slovak"; MessagesFile: "compiler:Languages\Slovak.isl" Name: "slovenian"; MessagesFile: "compiler:Languages\Slovenian.isl" Name: "spanish"; MessagesFile: "compiler:Languages\Spanish.isl" Name: "turkish"; MessagesFile: "compiler:Languages\Turkish.isl" Name: "ukrainian"; MessagesFile: "compiler:Languages\Ukrainian.isl" [Files] // TODO: .NET could be included in the installer // Source: "dotnetfx46.exe"; Flags: dontcopy noencryption Source: "{#SourceBinPathX64}"; DestDir: "{app}"; DestName: "{#MyAppExeName}"; Check: IsX64; Flags: ignoreversion Source: "{#SourceBinPathX86}"; DestDir: "{app}"; Check: not IsX64; Flags: ignoreversion Source: "{#SourceDLLPath}"; DestDir: "{app}"; Flags: ignoreversion ; NOTE: Don't use "Flags: ignoreversion" on any shared system files [Icons] Name: "{group}\{#MyAppSetupName}"; Filename: "{app}\{#MyAppExeName}" Name: "{group}\{cm:UninstallProgram,{#MyAppSetupName}}"; Filename: "{uninstallexe}" Name: "{commondesktop}\{#MyAppSetupName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon [Tasks] Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked [Registry] ; remove explorer context entry if it exists Root: HKCR; Subkey: Folder\shell\Remove empty dirs; ValueType: string; Flags: uninsdeletekey deletekey dontcreatekey; Tasks: ; Languages: [Run] Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#MyAppSetupName}}"; Flags: nowait postinstall skipifsilent [Code] function InitializeSetup: Boolean; var Version: String; UninstallerPath: String; // PrevVersion: String; ErrorCode: Integer; begin // Check whether application is already installed (legacy) if RegKeyExists(HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Remove Empty Directories') then begin if MsgBox('The setup has detected that RED is already installed on your computer. Do you wish to uninstall the previous version and continue with a fresh installation?', mbConfirmation, MB_YESNO) = IDYES then begin RegQueryStringValue(HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Remove Empty Directories', 'UninstallString', UninstallerPath); // ShellExec('runas', uninstaller, '/SILENT', '', SW_HIDE, ewWaitUntilTerminated, ErrorCode); // use above statement if extra level security is required usually it is not req //ShellExec('open', UninstallerPath, '/S', '', SW_SHOW, ewWaitUntilTerminated, ErrorCode); ShellExec('runas', UninstallerPath, '/SILENT', '', SW_SHOW, ewWaitUntilTerminated, ErrorCode); //Exec(UninstallerPath, '/S', '', SW_SHOWNORMAL, ewWaitUntilTerminated, ErrorCode); end; end; // Check whether application is already installed (new way with appId) if RegKeyExists(HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{{#APP_ID}}_is1') then begin if MsgBox('The setup has detected that RED is already installed on your computer. Do you wish to uninstall the previous version and continue with a fresh installation?', mbConfirmation, MB_YESNO) = IDYES then begin RegQueryStringValue(HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{{#APP_ID}}_is1', 'UninstallString', UninstallerPath); // ShellExec('runas', uninstaller, '/SILENT', '', SW_HIDE, ewWaitUntilTerminated, ErrorCode); // use above statement if extra level security is required usually it is not req //ShellExec('open', UninstallerPath, '/S', '', SW_SHOW, ewWaitUntilTerminated, ErrorCode); ShellExec('runas', UninstallerPath, '/SILENT', '', SW_SHOW, ewWaitUntilTerminated, ErrorCode); //Exec(UninstallerPath, '/S', '', SW_SHOWNORMAL, ewWaitUntilTerminated, ErrorCode); end; end; // Check whether application is already installed (new way with appId + WOW6432Node tree) if RegKeyExists(HKEY_LOCAL_MACHINE, 'SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\{{#APP_ID}}_is1') then begin if MsgBox('The setup has detected that RED is already installed on your computer. Do you wish to uninstall the previous version and continue with a fresh installation?', mbConfirmation, MB_YESNO) = IDYES then begin RegQueryStringValue(HKEY_LOCAL_MACHINE, 'SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\{{#APP_ID}}_is1', 'UninstallString', UninstallerPath); // RegQueryStringValue(HKEY_LOCAL_MACHINE, 'SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\{{#APP_ID}}_is1', 'DisplayVersion', PrevVersion); // ShellExec('runas', uninstaller, '/SILENT', '', SW_HIDE, ewWaitUntilTerminated, ErrorCode); // use above statement if extra level security is required usually it is not req //ShellExec('open', UninstallerPath, '/S', '', SW_SHOW, ewWaitUntilTerminated, ErrorCode); ShellExec('runas', UninstallerPath, '/SILENT', '', SW_SHOW, ewWaitUntilTerminated, ErrorCode); //Exec(UninstallerPath, '/S', '', SW_SHOWNORMAL, ewWaitUntilTerminated, ErrorCode); end; end; // Check for .NET Framework 4.6.2 // https://www.microsoft.com/en-US/download/details.aspx?id=53345 if not IsDotNetInstalled(net462, 0) then begin AddDependency('dotnetfx46.exe', '/lcid ' + IntToStr(GetUILanguage) + ' /passive /norestart', '.NET Framework 4.6.2', 'https://download.microsoft.com/download/D/5/C/D5C98AB0-35CC-45D9-9BA5-B18256BA2AE6/NDP462-KB3151802-Web.exe', '', False, False, False); end; Result := True; end; ================================================ FILE: LICENSE ================================================ GNU LESSER GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. This version of the GNU Lesser General Public License incorporates the terms and conditions of version 3 of the GNU General Public License, supplemented by the additional permissions listed below. 0. Additional Definitions. As used herein, "this License" refers to version 3 of the GNU Lesser General Public License, and the "GNU GPL" refers to version 3 of the GNU General Public License. "The Library" refers to a covered work governed by this License, other than an Application or a Combined Work as defined below. An "Application" is any work that makes use of an interface provided by the Library, but which is not otherwise based on the Library. Defining a subclass of a class defined by the Library is deemed a mode of using an interface provided by the Library. A "Combined Work" is a work produced by combining or linking an Application with the Library. The particular version of the Library with which the Combined Work was made is also called the "Linked Version". The "Minimal Corresponding Source" for a Combined Work means the Corresponding Source for the Combined Work, excluding any source code for portions of the Combined Work that, considered in isolation, are based on the Application, and not on the Linked Version. The "Corresponding Application Code" for a Combined Work means the object code and/or source code for the Application, including any data and utility programs needed for reproducing the Combined Work from the Application, but excluding the System Libraries of the Combined Work. 1. Exception to Section 3 of the GNU GPL. You may convey a covered work under sections 3 and 4 of this License without being bound by section 3 of the GNU GPL. 2. Conveying Modified Versions. If you modify a copy of the Library, and, in your modifications, a facility refers to a function or data to be supplied by an Application that uses the facility (other than as an argument passed when the facility is invoked), then you may convey a copy of the modified version: a) under this License, provided that you make a good faith effort to ensure that, in the event an Application does not supply the function or data, the facility still operates, and performs whatever part of its purpose remains meaningful, or b) under the GNU GPL, with none of the additional permissions of this License applicable to that copy. 3. Object Code Incorporating Material from Library Header Files. The object code form of an Application may incorporate material from a header file that is part of the Library. You may convey such object code under terms of your choice, provided that, if the incorporated material is not limited to numerical parameters, data structure layouts and accessors, or small macros, inline functions and templates (ten or fewer lines in length), you do both of the following: a) Give prominent notice with each copy of the object code that the Library is used in it and that the Library and its use are covered by this License. b) Accompany the object code with a copy of the GNU GPL and this license document. 4. Combined Works. You may convey a Combined Work under terms of your choice that, taken together, effectively do not restrict modification of the portions of the Library contained in the Combined Work and reverse engineering for debugging such modifications, if you also do each of the following: a) Give prominent notice with each copy of the Combined Work that the Library is used in it and that the Library and its use are covered by this License. b) Accompany the Combined Work with a copy of the GNU GPL and this license document. c) For a Combined Work that displays copyright notices during execution, include the copyright notice for the Library among these notices, as well as a reference directing the user to the copies of the GNU GPL and this license document. d) Do one of the following: 0) Convey the Minimal Corresponding Source under the terms of this License, and the Corresponding Application Code in a form suitable for, and under terms that permit, the user to recombine or relink the Application with a modified version of the Linked Version to produce a modified Combined Work, in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source. 1) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (a) uses at run time a copy of the Library already present on the user's computer system, and (b) will operate properly with a modified version of the Library that is interface-compatible with the Linked Version. e) Provide Installation Information, but only if you would otherwise be required to provide such information under section 6 of the GNU GPL, and only to the extent that such information is necessary to install and execute a modified version of the Combined Work produced by recombining or relinking the Application with a modified version of the Linked Version. (If you use option 4d0, the Installation Information must accompany the Minimal Corresponding Source and Corresponding Application Code. If you use option 4d1, you must provide the Installation Information in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source.) 5. Combined Libraries. You may place library facilities that are a work based on the Library side by side in a single library together with other library facilities that are not Applications and are not covered by this License, and convey such a combined library under terms of your choice, if you do both of the following: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities, conveyed under the terms of this License. b) Give prominent notice with the combined library that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 6. Revised Versions of the GNU Lesser General Public License. The Free Software Foundation may publish revised and/or new versions of the GNU Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library as you received it specifies that a certain numbered version of the GNU Lesser General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that published version or of any later version published by the Free Software Foundation. If the Library as you received it does not specify a version number of the GNU Lesser General Public License, you may choose any version of the GNU Lesser General Public License ever published by the Free Software Foundation. If the Library as you received it specifies that a proxy can decide whether future versions of the GNU Lesser General Public License shall apply, that proxy's public statement of acceptance of any version is permanent authorization for you to choose that version for the Library. ================================================ FILE: README.md ================================================ Remove Empty Directories ======================== RED finds, displays, and deletes empty directories recursively below a given start folder. Furthermore, it allows you to create custom rules for keeping and deleting folders (e.g. treat directories with empty files as empty). ## Features - Simple user interface - Shows empty directories before deleting them - Supports multiple delete modes (including Delete to recycle bin) - Allows white and blacklisting of directories by using filter lists - Can detect directories with empty files as empty ## System requirements - Windows 7 or 10 - Version 2.2 should also still work with older Windows versions like XP or Vista - Microsoft .NET Framework 4.6.2 or later - The installer checks for the right version and installs it if missing ## How to contribute to the project You are very welcome to contribute code, translations, or anything else :) Here are some tasks you can help with: - Look at open issues/bugs and try to fix them - Fix typos and general wording - Optimize user interface - Create a strategy/foundation for translations, are there any existing frameworks/concepts? - Add unit tests ## History The first version of RED was created by [Jonas John](http://www.jonasjohn.de/) around 2005. Since then [a small team of contributors](https://github.com/hxseven/Remove-Empty-Directories/graphs/contributors) helped to fix bugs and add new features. ## Changelog 2.3 - Disabled settings during active search or deletion process - Refactored the interface to improve the design and usability - Divided packed settings tab into three separate tabs - Renamed some options and captions to make more sense - Added more descriptions and examples to explain settings - Increased default window size and added more whitespace to make it look less crowded - Optimized config defaults - Set pause between deletions to zero because the default delete to recycle bin method is slow enough to not overwhelm the GUI - Deleted some unnecessary entries and updated some values - Removed *.tmp as default pattern to make the default settings safer because those files could still contain valuable data in some cases. - Long paths support and other improvements (contributed by gioccher, see #5) - Fix crash due to case sensitivity of paths - Speed up crawl and deletion by disabling UI updates (dubbed fast mode) - Long path support by switching to AlphaFS - And more minor improvements (see closed pull request #5 for details) - Ignore folders newer than N hours #3 (contributed by jsytniak, see #3) 2.2 - Improved error handling - Added logging of errors and deleted directories - Added multiple delete modes (e.g. delete to recycle bin) - Implemented a function to delete a single empty directory - Implemented optional function to detect paths in clipboard - Infinite loop detection - Added a few new configuration settings - Removed counting method to increase speed - Replaced old custom settings module with the default settings framework of .NET to be more standard-compliant (This should fix problems some users had when starting RED) 2.1 - Implemented a "Protect" and "Unprotect" function to let the user choose folders to keep - Implemented an update button for a fast update check 2.0 - Created the installer (using NSIS) - Updated this readme file 1.9 - Added better-looking icons to the GUI - Corrected and updates some texts 1.8 - Finished the main parts of the application - Added XML configuration file 1.7 - Removed some main parts of the new application and started using the "BackgroundWorker" for threading support. 1.6 - Finished the first prototype of the C# version 1.5 - Started the development of an entirely new version of RED by using Microsoft Visual C# (.NET 2.0) 1.4 - Updated the readme and changed the license from GPL to LGPL - fixed some small issues 1.2 - Fixed the gauge in the process window - implemented a second safety check to prevent deleting filled folders 1.1 - renamed the program to RED (Remove empty directories) - made a new icon 1.0 - changes some structure things, renamed functions, renamed variables - corrected code, fixed some issues... - optional logfile implemented - other minor changes - updated version history -> complete rewrite ;) 0.9 - Added a readme, the licenses - Translated the readme into English 0.8 - Cleaned the directories and sorted the files - Renamed some functions and variables, to make it look better 0.6 + 0.7 - I learned about WinBinder (A native Windows binding for PHP) and converted the program to PHP with a Windows GUI using WinBinder 0.5 - Used NSIS Install System (http://nsis.sourceforge.net/) to create a GUI for the perl script 0.2 - 0.4 - Minor changes - Added filters to exclude some folders like the recycler 0.1 - I made a simple perl script to delete empty folders, I called it "DEF" (Delete Empty Folders) ## Credits Third-party components - File system calls are powered by the [AlphaFS library](https://github.com/alphaleonis/AlphaFS) - The Installer is made by using [Inno Setup](https://jrsoftware.org/isinfo.php) & [Inno Setup Dependency Installer](https://github.com/DomGries/InnoDependencyInstaller) Icon sources - Nuvola icons (GNU LGPL 2.1. license) - NuoveXT icons (GPL license) - [famfamfam silk icons](http://www.famfamfam.com/lab/icons/ "famfamfam silk icons") (Creative Commons Attribution license) - [Coffee icon](https://www.freeimages.com/de/photo/coffee-and-desserts-1571223 "Coffee icon") by Ivan Freaner - Ignore list icon taken from "Primo Icon Set" made by [Webdesigner Depot](http://www.webdesignerdepot.com/) - License: Free of charge for personal or commercial purposes ## License RED is free software; you can redistribute it and/or modify it under the terms of the [GNU Lesser General Public License](http://www.gnu.org/licenses/lgpl.html) as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. ================================================ FILE: RED2/DeletionError.Designer.cs ================================================ namespace RED2 { partial class DeletionError { /// /// Erforderliche Designervariable. /// private System.ComponentModel.IContainer components = null; /// /// Verwendete Ressourcen bereinigen. /// /// True, wenn verwaltete Ressourcen gelöscht werden sollen; andernfalls False. protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } #region Vom Windows Form-Designer generierter Code /// /// Erforderliche Methode für die Designerunterstützung. /// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden. /// private void InitializeComponent() { this.label1 = new System.Windows.Forms.Label(); this.btnAbort = new System.Windows.Forms.Button(); this.btnIgnore = new System.Windows.Forms.Button(); this.btnIgnoreAllErrors = new System.Windows.Forms.Button(); this.tbErrorMessage = new System.Windows.Forms.TextBox(); this.tbPath = new System.Windows.Forms.TextBox(); this.panel1 = new System.Windows.Forms.Panel(); this.panel1.SuspendLayout(); this.SuspendLayout(); // // label1 // this.label1.AutoSize = true; this.label1.Location = new System.Drawing.Point(8, 7); this.label1.Name = "label1"; this.label1.Size = new System.Drawing.Size(301, 13); this.label1.TabIndex = 0; this.label1.Text = "An error occurred while RED tried to delete a file or a directory:"; // // btnAbort // this.btnAbort.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); this.btnAbort.DialogResult = System.Windows.Forms.DialogResult.Abort; this.btnAbort.Location = new System.Drawing.Point(158, 180); this.btnAbort.Name = "btnAbort"; this.btnAbort.Size = new System.Drawing.Size(88, 25); this.btnAbort.TabIndex = 1; this.btnAbort.Text = "A&bort"; this.btnAbort.UseVisualStyleBackColor = true; // // btnIgnore // this.btnIgnore.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); this.btnIgnore.DialogResult = System.Windows.Forms.DialogResult.Ignore; this.btnIgnore.Location = new System.Drawing.Point(251, 180); this.btnIgnore.Name = "btnIgnore"; this.btnIgnore.Size = new System.Drawing.Size(88, 25); this.btnIgnore.TabIndex = 2; this.btnIgnore.Text = "&Ignore error"; this.btnIgnore.UseVisualStyleBackColor = true; // // btnIgnoreAllErrors // this.btnIgnoreAllErrors.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); this.btnIgnoreAllErrors.DialogResult = System.Windows.Forms.DialogResult.Retry; this.btnIgnoreAllErrors.Location = new System.Drawing.Point(344, 180); this.btnIgnoreAllErrors.Name = "btnIgnoreAllErrors"; this.btnIgnoreAllErrors.Size = new System.Drawing.Size(122, 25); this.btnIgnoreAllErrors.TabIndex = 3; this.btnIgnoreAllErrors.Text = "Ignore &all errors"; this.btnIgnoreAllErrors.UseVisualStyleBackColor = true; // // tbErrorMessage // this.tbErrorMessage.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.tbErrorMessage.Font = new System.Drawing.Font("Lucida Console", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.tbErrorMessage.Location = new System.Drawing.Point(8, 53); this.tbErrorMessage.Multiline = true; this.tbErrorMessage.Name = "tbErrorMessage"; this.tbErrorMessage.ReadOnly = true; this.tbErrorMessage.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; this.tbErrorMessage.Size = new System.Drawing.Size(458, 108); this.tbErrorMessage.TabIndex = 5; // // tbPath // this.tbPath.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.tbPath.Location = new System.Drawing.Point(8, 28); this.tbPath.Name = "tbPath"; this.tbPath.ReadOnly = true; this.tbPath.Size = new System.Drawing.Size(458, 20); this.tbPath.TabIndex = 6; // // panel1 // this.panel1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.panel1.BackColor = System.Drawing.SystemColors.Window; this.panel1.Controls.Add(this.tbPath); this.panel1.Controls.Add(this.label1); this.panel1.Controls.Add(this.tbErrorMessage); this.panel1.Location = new System.Drawing.Point(0, 0); this.panel1.Name = "panel1"; this.panel1.Size = new System.Drawing.Size(476, 171); this.panel1.TabIndex = 7; // // DeletionError // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(474, 212); this.Controls.Add(this.btnIgnoreAllErrors); this.Controls.Add(this.btnIgnore); this.Controls.Add(this.btnAbort); this.Controls.Add(this.panel1); this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; this.MaximizeBox = false; this.MinimizeBox = false; this.Name = "DeletionError"; this.ShowIcon = false; this.ShowInTaskbar = false; this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; this.Text = "Warning deletion failed"; this.Load += new System.EventHandler(this.DeletionError_Load); this.panel1.ResumeLayout(false); this.panel1.PerformLayout(); this.ResumeLayout(false); } #endregion private System.Windows.Forms.Label label1; private System.Windows.Forms.Button btnAbort; private System.Windows.Forms.Button btnIgnore; private System.Windows.Forms.Button btnIgnoreAllErrors; private System.Windows.Forms.TextBox tbErrorMessage; private System.Windows.Forms.TextBox tbPath; private System.Windows.Forms.Panel panel1; } } ================================================ FILE: RED2/DeletionError.cs ================================================ using System; using System.Windows.Forms; namespace RED2 { public partial class DeletionError : Form { public DeletionError() { InitializeComponent(); } private void DeletionError_Load(object sender, EventArgs e) { } internal void SetPath(string path) { this.tbPath.Text = path; } internal void SetErrorMessage(string msg) { this.tbErrorMessage.Text = msg; } } } ================================================ FILE: RED2/DeletionError.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 ================================================ FILE: RED2/Lib/Core.cs ================================================ using System; using System.Collections.Generic; using System.ComponentModel; namespace RED2 { /// /// RED core class, handles events and communicates with the GUI /// public class REDCore { private MainWindow redMainWindow = null; public WorkflowSteps CurrentProcessStep = WorkflowSteps.Idle; private RuntimeData Data = null; // Workers private FindEmptyDirectoryWorker searchEmptyFoldersWorker = null; private DeletionWorker deletionWorker = null; // Events public event EventHandler OnError; public event EventHandler OnCancelled; public event EventHandler OnAborted; public event EventHandler OnProgressChanged; public event EventHandler OnFoundEmptyDirectory; public event EventHandler OnFinishedScanForEmptyDirs; public event EventHandler OnDeleteProcessChanged; public event EventHandler OnDeleteError; public event EventHandler OnDeleteProcessFinished; public REDCore(MainWindow mainWindow, RuntimeData data) { this.redMainWindow = mainWindow; this.Data = data; } /// /// Start searching empty folders /// public void SearchingForEmptyDirectories() { this.CurrentProcessStep = WorkflowSteps.StartSearchingForEmptyDirs; // Rest folder list this.Data.ProtectedFolderList = new Dictionary(); // Start async empty directory search worker searchEmptyFoldersWorker = new FindEmptyDirectoryWorker(); searchEmptyFoldersWorker.Data = this.Data; searchEmptyFoldersWorker.ProgressChanged += new ProgressChangedEventHandler(searchEmptyFoldersWorker_ProgressChanged); searchEmptyFoldersWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(searchEmptyFoldersWorker_RunWorkerCompleted); searchEmptyFoldersWorker.RunWorkerAsync(this.Data.StartFolder); } /// /// This function gets called on a status update of the find worker /// void searchEmptyFoldersWorker_ProgressChanged(object sender, ProgressChangedEventArgs e) { if (e.UserState is FoundEmptyDirInfoEventArgs) { var info = (FoundEmptyDirInfoEventArgs)e.UserState; if (info.Type == DirectorySearchStatusTypes.Empty) { // Found an empty dir, add it to the list this.Data.EmptyFolderList.Add(info.Directory); } else if (info.Type == DirectorySearchStatusTypes.Error && this.Data.HideScanErrors) { return; } if (this.OnFoundEmptyDirectory != null) this.OnFoundEmptyDirectory(this, info); } else if (e.UserState is string) { if (this.OnProgressChanged != null) this.OnProgressChanged(this, new ProgressChangedEventArgs(0, (string)e.UserState)); } else { // TODO: Handle unknown types } } void searchEmptyFoldersWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { this.CurrentProcessStep = WorkflowSteps.Idle; if (e.Error != null) { this.searchEmptyFoldersWorker.Dispose(); this.searchEmptyFoldersWorker = null; this.showErrorMsg(e.Error.Message); } else if (e.Cancelled) { if (this.searchEmptyFoldersWorker.ErrorInfo != null) { // A error occurred, process was stopped this.showErrorMsg(this.searchEmptyFoldersWorker.ErrorInfo.ErrorMessage); this.searchEmptyFoldersWorker.Dispose(); this.searchEmptyFoldersWorker = null; if (this.OnAborted != null) this.OnAborted(this, new EventArgs()); } else { this.searchEmptyFoldersWorker.Dispose(); this.searchEmptyFoldersWorker = null; if (this.OnCancelled != null) this.OnCancelled(this, new EventArgs()); } } else { int FolderCount = this.searchEmptyFoldersWorker.FolderCount; this.searchEmptyFoldersWorker.Dispose(); this.searchEmptyFoldersWorker = null; if (this.OnFinishedScanForEmptyDirs != null) this.OnFinishedScanForEmptyDirs(this, new FinishedScanForEmptyDirsEventArgs(this.Data.EmptyFolderList.Count, FolderCount)); } } internal void CancelCurrentProcess() { if (this.CurrentProcessStep == WorkflowSteps.StartSearchingForEmptyDirs) { if (this.searchEmptyFoldersWorker == null) return; if ((this.searchEmptyFoldersWorker.IsBusy == true) || (searchEmptyFoldersWorker.CancellationPending == false)) searchEmptyFoldersWorker.CancelAsync(); } else if (this.CurrentProcessStep == WorkflowSteps.DeleteProcessRunning) { if (this.deletionWorker == null) return; if ((this.deletionWorker.IsBusy == true) || (deletionWorker.CancellationPending == false)) deletionWorker.CancelAsync(); } } public void StartDeleteProcess() { this.CurrentProcessStep = WorkflowSteps.DeleteProcessRunning; // Kick-off deletion worker to async delete directories this.deletionWorker = new DeletionWorker(); this.deletionWorker.Data = this.Data; this.deletionWorker.ProgressChanged += new ProgressChangedEventHandler(deletionWorker_ProgressChanged); this.deletionWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(deletionWorker_RunWorkerCompleted); this.deletionWorker.RunWorkerAsync(); } void deletionWorker_ProgressChanged(object sender, ProgressChangedEventArgs e) { var state = e.UserState as DeleteProcessUpdateEventArgs; if (this.OnDeleteProcessChanged != null) this.OnDeleteProcessChanged(this, state); } void deletionWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { this.CurrentProcessStep = WorkflowSteps.Idle; if (e.Error != null) { this.showErrorMsg(e.Error.Message); this.deletionWorker.Dispose(); this.deletionWorker = null; } else if (e.Cancelled) { if (this.deletionWorker.ErrorInfo != null) { // A error occurred, process was stopped // // -> Ask user to continue if (OnDeleteError != null) OnDeleteError(this, this.deletionWorker.ErrorInfo); else throw new Exception("Internal error: event handler is missing."); } else { // The user cancelled the process if (this.OnCancelled != null) this.OnCancelled(this, new EventArgs()); } } else { // TODO: Use separate class here? int deletedCount = this.deletionWorker.DeletedCount; int failedCount = this.deletionWorker.FailedCount; int protectedCount = this.deletionWorker.ProtectedCount; this.deletionWorker.Dispose(); this.deletionWorker = null; if (this.OnDeleteProcessFinished != null) this.OnDeleteProcessFinished(this, new DeleteProcessFinishedEventArgs(deletedCount, failedCount, protectedCount)); } } internal void AddProtectedFolder(string path) { if (!this.Data.ProtectedFolderList.ContainsKey(path)) this.Data.ProtectedFolderList.Add(path, true); } internal void RemoveProtected(string FolderFullName) { if (this.Data.ProtectedFolderList.ContainsKey(FolderFullName)) this.Data.ProtectedFolderList.Remove(FolderFullName); } public string GetLogMessages() { return this.Data.LogMessages.ToString(); } private void showErrorMsg(string errorMessage) { if (this.OnError != null) this.OnError(this, new ErrorEventArgs(errorMessage)); } internal void AbortDeletion() { this.CurrentProcessStep = WorkflowSteps.Idle; this.deletionWorker.Dispose(); this.deletionWorker = null; if (this.OnAborted != null) this.OnAborted(this, new EventArgs()); } internal void ContinueDeleteProcess() { this.CurrentProcessStep = WorkflowSteps.DeleteProcessRunning; this.deletionWorker.RunWorkerAsync(); } } } ================================================ FILE: RED2/Lib/DeletionWorker.cs ================================================ using System; using System.ComponentModel; using System.Threading; using Alphaleonis.Win32.Filesystem; namespace RED2 { /// /// Deletes the empty directories RED found /// public class DeletionWorker : BackgroundWorker { public RuntimeData Data { get; set; } public int DeletedCount { get; set; } public int FailedCount { get; set; } public int ProtectedCount { get; set; } public int ListPos { get; set; } public DeletionErrorEventArgs ErrorInfo { get; set; } public DeletionWorker() { WorkerReportsProgress = true; WorkerSupportsCancellation = true; this.ListPos = 0; } protected override void OnDoWork(DoWorkEventArgs e) { // This method will run on a thread other than the UI thread. // Be sure not to manipulate any Windows Forms controls created // on the UI thread from this method. if (CancellationPending) { e.Cancel = true; return; } bool stopNow = false; string errorMessage = ""; this.ErrorInfo = null; int count = this.Data.EmptyFolderList.Count; while (this.ListPos < this.Data.EmptyFolderList.Count) { if (CancellationPending) { e.Cancel = true; return; } var folder = this.Data.EmptyFolderList[this.ListPos]; var status = DirectoryDeletionStatusTypes.Ignored; // Do not delete one time protected folders if (!this.Data.ProtectedFolderList.ContainsKey(folder)) { try { // Try to delete the directory this.secureDelete(folder); this.Data.AddLogMessage(String.Format("Successfully deleted dir \"{0}\"", folder)); status = DirectoryDeletionStatusTypes.Deleted; this.DeletedCount++; } catch (REDPermissionDeniedException ex) { errorMessage = ex.Message; this.Data.AddLogMessage(String.Format("Directory is protected by the system \"{0}\" - Message: \"{1}\"", folder, errorMessage)); status = DirectoryDeletionStatusTypes.Protected; this.ProtectedCount++; } catch (Exception ex) { errorMessage = ex.Message; stopNow = (!this.Data.IgnoreAllErrors); this.Data.AddLogMessage(String.Format("Failed to delete dir \"{0}\" - Error message: \"{1}\"", folder, errorMessage)); status = DirectoryDeletionStatusTypes.Warning; this.FailedCount++; } if (!stopNow && this.Data.PauseTime > 0) Thread.Sleep(TimeSpan.FromMilliseconds(this.Data.PauseTime)); } else status = DirectoryDeletionStatusTypes.Protected; this.ReportProgress(1, new DeleteProcessUpdateEventArgs(this.ListPos, folder, status, count)); this.ListPos++; if (stopNow) { // stop here for now if (errorMessage == "") errorMessage = "Unknown error"; e.Cancel = true; this.ErrorInfo = new DeletionErrorEventArgs(folder, errorMessage); return; } } e.Result = count; } private void secureDelete(string path) { var emptyDirectory = new DirectoryInfo(path); if (!emptyDirectory.Exists) throw new Exception("Could not delete the directory \"" + emptyDirectory.FullName + "\" because it does not exist anymore."); // Cleanup folder String[] ignoreFileList = this.Data.GetIgnoreFileList(); FileInfo[] Files = emptyDirectory.GetFiles(); if (Files != null && Files.Length != 0) { // loop trough files and cancel if containsFiles == true for (int f = 0; f < Files.Length; f++) { var file = Files[f]; string delPattern = ""; bool deleteTrashFile = SystemFunctions.MatchesIgnorePattern(file, (int)file.Length, this.Data.IgnoreEmptyFiles, ignoreFileList, out delPattern); // If only one file is good, then stop. if (deleteTrashFile) { try { SystemFunctions.SecureDeleteFile(file, this.Data.DeleteMode); this.Data.AddLogMessage(String.Format("-> Successfully deleted file \"{0}\" because it matched the ignore pattern \"{1}\"", file.FullName, delPattern)); } catch (Exception ex) { this.Data.AddLogMessage(String.Format("Failed to delete file \"{0}\" - Error message: \"{1}\"", file.FullName, ex.Message)); var msg = "Could not delete this empty (trash) file:" + Environment.NewLine + file.FullName + Environment.NewLine + Environment.NewLine + "Error message: " + ex.Message; if (ex is REDPermissionDeniedException) throw new REDPermissionDeniedException(msg, ex); else throw new Exception(msg, ex); } } } } // End cleanup // This function will ensure that the directory is really empty before it gets deleted SystemFunctions.SecureDeleteDirectory(emptyDirectory.FullName, this.Data.DeleteMode); } } } ================================================ FILE: RED2/Lib/Enums.cs ================================================ namespace RED2 { /// /// RED workflow steps /// public enum WorkflowSteps { Idle, StartSearchingForEmptyDirs, DeleteProcessRunning, } /// /// Result status types of the scan /// public enum DirectorySearchStatusTypes { Empty, Error, NotEmpty, Ignore } /// /// Result types of the deletion process /// public enum DirectoryDeletionStatusTypes { Deleted, Warning, Ignored, Protected } } ================================================ FILE: RED2/Lib/Events.cs ================================================ using System; using Alphaleonis.Win32.Filesystem; namespace RED2 { public class WorkflowStepChangedEventArgs : EventArgs { public WorkflowSteps NewStep { get; set; } public WorkflowStepChangedEventArgs(WorkflowSteps NewStep) { this.NewStep = NewStep; } } public class ErrorEventArgs : EventArgs { public string Message { get; set; } public ErrorEventArgs(string msg) { this.Message = msg; } } public class FinishedScanForEmptyDirsEventArgs : EventArgs { public int EmptyFolderCount { get; set; } public int FolderCount { get; set; } public FinishedScanForEmptyDirsEventArgs(int EmptyFolderCount, int FolderCount) { this.EmptyFolderCount = EmptyFolderCount; this.FolderCount = FolderCount; } } public class DeleteProcessUpdateEventArgs : EventArgs { public int ProgressStatus { get; set; } public string Path { get; set; } public DirectoryDeletionStatusTypes Status { get; set; } public int FolderCount { get; set; } public DeleteProcessUpdateEventArgs(int progressStatus, string path, DirectoryDeletionStatusTypes status, int folderCount) { this.ProgressStatus = progressStatus; this.Path = path; this.Status = status; this.FolderCount = folderCount; } } public class DeleteProcessFinishedEventArgs : EventArgs { public int DeletedFolderCount { get; set; } public int FailedFolderCount { get; set; } public int ProtectedCount { get; set; } public DeleteProcessFinishedEventArgs(int deletedFolderCount, int failedFolderCount, int protectedCount) { this.DeletedFolderCount = deletedFolderCount; this.FailedFolderCount = failedFolderCount; this.ProtectedCount = protectedCount; } } public class ProtectionStatusChangedEventArgs : EventArgs { public string Path { get; set; } public bool Protected { get; set; } public ProtectionStatusChangedEventArgs(string Path, bool Protected) { this.Path = Path; this.Protected = Protected; } } public class DeleteRequestFromTreeEventArgs : EventArgs { public string Directory { get; set; } public DeleteRequestFromTreeEventArgs(string Directory) { this.Directory = Directory; } } public class DeletionErrorEventArgs : EventArgs { public string Path { get; set; } public string ErrorMessage { get; set; } public DeletionErrorEventArgs(string Path, string ErrorMessage) { this.Path = Path; this.ErrorMessage = ErrorMessage; } } public class FoundEmptyDirInfoEventArgs : EventArgs { public string Directory { get; set; } public DirectorySearchStatusTypes Type { get; set; } public string ErrorMessage { get; set; } public FoundEmptyDirInfoEventArgs(string Directory, DirectorySearchStatusTypes type) { this.Directory = Directory; this.Type = type; this.ErrorMessage = ""; } public FoundEmptyDirInfoEventArgs(string Directory, DirectorySearchStatusTypes type, string ErrorMessage) { this.Directory = Directory; this.Type = type; this.ErrorMessage = ErrorMessage; } } } ================================================ FILE: RED2/Lib/FindEmptyDirectoryWorker.cs ================================================ using System; using System.Collections.Generic; using System.ComponentModel; using Alphaleonis.Win32.Filesystem; using FileAttributes = System.IO.FileAttributes; namespace RED2 { /// /// Searches for empty directories /// public class FindEmptyDirectoryWorker : BackgroundWorker { private int folderCount = 0; public int FolderCount { get { return folderCount; } } public RuntimeData Data { get; set; } private string[] ignoreFolderList = null; private string[] ignoreFileList = null; public DeletionErrorEventArgs ErrorInfo { get; set; } public int PossibleEndlessLoop { get; set; } public FindEmptyDirectoryWorker() { WorkerReportsProgress = true; WorkerSupportsCancellation = true; } protected override void OnDoWork(DoWorkEventArgs e) { DirectoryInfo startFolder = (DirectoryInfo)e.Argument; this.PossibleEndlessLoop = 0; // Clean dir list this.Data.EmptyFolderList = new List(); this.ignoreFileList = this.Data.GetIgnoreFileList(); this.ignoreFolderList = this.Data.GetIgnoreDirectories(); try { var rootStatusType = this.checkIfDirectoryEmpty(startFolder, 1); this.ReportProgress(0, new FoundEmptyDirInfoEventArgs(startFolder.FullName, rootStatusType)); if (this.PossibleEndlessLoop > this.Data.InfiniteLoopDetectionCount) { this.Data.AddLogMessage("Detected possible infinite-loop somewhere in the target path \"" + startFolder + "\" (symbolic links can cause this)"); throw new Exception("Possible infinite-loop detected (symbolic links can cause this)"); } } catch (Exception ex) { e.Cancel = true; this.Data.AddLogMessage("An error occurred during the scan process: " + ex.Message); this.ErrorInfo = new DeletionErrorEventArgs(startFolder.FullName, ex.Message); return; } if (CancellationPending) { this.Data.AddLogMessage("Scan process was cancelled"); e.Cancel = true; e.Result = 0; return; } e.Result = 1; } private DirectorySearchStatusTypes checkIfDirectoryEmpty(DirectoryInfo startDir, int depth) { if (this.PossibleEndlessLoop > this.Data.InfiniteLoopDetectionCount) { this.ReportProgress(0, new FoundEmptyDirInfoEventArgs(startDir.FullName, DirectorySearchStatusTypes.Error, "Aborted - possible infinite-loop detected")); return DirectorySearchStatusTypes.Error; } try { // Thread.Sleep(500); -> ? if (this.Data.MaxDepth != -1 && depth > this.Data.MaxDepth) return DirectorySearchStatusTypes.NotEmpty; // Cancel process if the user hits stop if (CancellationPending) return DirectorySearchStatusTypes.NotEmpty; this.folderCount++; // update status progress bar after 100 steps: if (this.folderCount % 100 == 0) this.ReportProgress(folderCount, "Checking directory: " + startDir.Name); bool containsFiles = false; // Get file list FileInfo[] fileList = null; // some directories could trigger an exception: try { fileList = startDir.GetFiles(); } catch { fileList = null; } if (fileList == null) { // CF = true = folder does not get deleted: containsFiles = true; // secure way this.Data.AddLogMessage("Failed to access files in \"" + startDir.FullName + "\""); this.ReportProgress(0, new FoundEmptyDirInfoEventArgs(startDir.FullName, DirectorySearchStatusTypes.Error, "Failed to access files")); } else if (fileList.Length == 0) { containsFiles = false; } else { string delPattern = ""; // loop trough files and cancel if containsFiles == true for (int f = 0; (f < fileList.Length && !containsFiles); f++) { FileInfo file = null; int filesize = 0; try { file = fileList[f]; filesize = (int)file.Length; } catch { // keep folder if there is a strange file that // triggers a exception: containsFiles = true; break; } // If only one file is good, then stop. if (!SystemFunctions.MatchesIgnorePattern(file, filesize, this.Data.IgnoreEmptyFiles, this.ignoreFileList, out delPattern)) containsFiles = true; } } // If the folder does not contain any files -> get subfolders: DirectoryInfo[] subFolderList = null; try { subFolderList = startDir.GetDirectories(); } catch { // If we can not read the folder -> don't delete it: this.Data.AddLogMessage("Failed to access subdirectories in \"" + startDir.FullName + "\""); this.ReportProgress(0, new FoundEmptyDirInfoEventArgs(startDir.FullName, DirectorySearchStatusTypes.Error, "Failed to access subdirectories")); return DirectorySearchStatusTypes.Error; } // The folder is empty, break here: if (!containsFiles && subFolderList.Length == 0) { return DirectorySearchStatusTypes.Empty; } bool allSubDirectoriesEmpty = true; foreach (var curDir in subFolderList) { var attribs = curDir.Attributes; bool ignoreSystemDir = (this.Data.KeepSystemFolders && ((attribs & FileAttributes.System) == FileAttributes.System)); bool ignoreHiddenDir = (this.Data.IgnoreHiddenFolders && ((attribs & FileAttributes.Hidden) == FileAttributes.Hidden)); bool ignoreSubDirectory = (ignoreSystemDir || ignoreHiddenDir); if (!ignoreSubDirectory && checkIfDirectoryIsOnIgnoreList(curDir)) { this.Data.AddLogMessage("Aborted scan of \"" + curDir.FullName + "\" because it is on the ignore list."); this.ReportProgress(0, new FoundEmptyDirInfoEventArgs(curDir.FullName, DirectorySearchStatusTypes.Ignore)); ignoreSubDirectory = true; } if (!ignoreSubDirectory && (attribs & FileAttributes.ReparsePoint) == FileAttributes.ReparsePoint) { this.Data.AddLogMessage("Aborted scan of \"" + curDir.FullName + "\" because it is a symbolic link"); this.ReportProgress(0, new FoundEmptyDirInfoEventArgs(curDir.FullName, DirectorySearchStatusTypes.Error, "Aborted because dir is a symbolic link")); ignoreSubDirectory = true; } // TODO: Implement more checks //else if ((attribs & FileAttributes.Device) == FileAttributes.Device) msg = "Device - Aborted - found"; //else if ((attribs & FileAttributes.Encrypted) == FileAttributes.Encrypted) msg = "Encrypted - found"; // The file will not be indexed by the operating system's content indexing service. // else if ((attribs & FileAttributes.NotContentIndexed) == FileAttributes.NotContentIndexed) msg = "NotContentIndexed - Device found"; //else if ((attribs & FileAttributes.Offline) == FileAttributes.Offline) msg = "Offline - found"; //else if ((attribs & FileAttributes.ReadOnly) == FileAttributes.ReadOnly) msg = "ReadOnly - found"; //else if ((attribs & FileAttributes.Temporary) == FileAttributes.Temporary) msg = "Temporary - found"; // Scan sub folder: var subFolderStatus = DirectorySearchStatusTypes.NotEmpty; if (!ignoreSubDirectory) { // JRS ADDED check for AGE of folder if(curDir.CreationTime.AddHours(this.Data.MinFolderAgeHours) < DateTime.Now) { subFolderStatus = this.checkIfDirectoryEmpty(curDir, depth + 1); } else { this.Data.AddLogMessage(String.Format(RED2.Properties.Resources.young_folder_skipped, curDir.FullName, this.Data.MinFolderAgeHours.ToString(), curDir.CreationTime.ToString())); } // Report status to the GUI if (subFolderStatus == DirectorySearchStatusTypes.Empty) this.ReportProgress(0, new FoundEmptyDirInfoEventArgs(curDir.FullName, subFolderStatus)); } // this folder is not empty: if (subFolderStatus != DirectorySearchStatusTypes.Empty || ignoreSubDirectory) allSubDirectoriesEmpty = false; } // All subdirectories are empty return (allSubDirectoriesEmpty && !containsFiles) ? DirectorySearchStatusTypes.Empty : DirectorySearchStatusTypes.NotEmpty; } catch (Exception ex) { // Error handling if (ex is System.IO.PathTooLongException) this.PossibleEndlessLoop++; this.Data.AddLogMessage("An unknown error occurred while trying to scan this directory: \"" + startDir.FullName + "\" - Error message: " + ex.Message); this.ReportProgress(0, new FoundEmptyDirInfoEventArgs(startDir.FullName, DirectorySearchStatusTypes.Error, ex.Message)); return DirectorySearchStatusTypes.Error; } } private bool checkIfDirectoryIsOnIgnoreList(DirectoryInfo Folder) { bool ignoreFolder = false; if (this.ignoreFolderList.Length > 0) { foreach (string currentPath in this.ignoreFolderList) { if (currentPath == "") continue; // skip directory if a part of it is on the filterlist // TODO: Use better compare method if (Folder.FullName.ToLower().Contains(currentPath.ToLower())) ignoreFolder = true; } } return ignoreFolder; } } } ================================================ FILE: RED2/Lib/RuntimeData.cs ================================================ using System; using System.Collections.Generic; using Alphaleonis.Win32.Filesystem; using System.Text; namespace RED2 { /// /// Container for runtime related data /// public class RuntimeData { // Configuration public DirectoryInfo StartFolder { get; set; } public bool IgnoreAllErrors { get; set; } public bool DisableLogging { get; set; } public DeleteModes DeleteMode { get; set; } public string IgnoreFiles { get; set; } public string IgnoreDirectoriesList { get; set; } public bool IgnoreEmptyFiles { get; set; } public bool IgnoreHiddenFolders { get; set; } public bool KeepSystemFolders { get; set; } public bool HideScanErrors { get; set; } public double PauseTime { get; set; } public uint MinFolderAgeHours { get; set; } public int MaxDepth { get; set; } public int InfiniteLoopDetectionCount { get; set; } public StringBuilder LogMessages = null; public Dictionary ProtectedFolderList = new Dictionary(); /// /// List containing all empty directories that were found /// public List EmptyFolderList { get; set; } public RuntimeData() { this.LogMessages = new StringBuilder(); this.ProtectedFolderList = new Dictionary(); this.EmptyFolderList = new List(); } private string[] fixNewLines(string input) { return input.Replace("\r\n", "\n").Replace("\r", "\n").Split('\n'); } public string[] GetIgnoreFileList() { return this.fixNewLines(this.IgnoreFiles); } public string[] GetIgnoreDirectories() { return this.fixNewLines(this.IgnoreDirectoriesList); } public void AddLogMessage(string msg) { this.LogMessages.AppendLine(DateTime.Now.ToString("r") + "\t" + msg); } internal void AddLogSpacer() { if (this.LogMessages.Length > 0) this.LogMessages.Append(Environment.NewLine); } } } ================================================ FILE: RED2/Lib/SystemFunctions.cs ================================================ using System; using System.Diagnostics; using System.Security.Permissions; using System.Text.RegularExpressions; using System.Windows.Forms; using Microsoft.VisualBasic.FileIO; using Microsoft.Win32; using Alphaleonis.Win32.Filesystem; using FileAccess = System.IO.FileAccess; using FileMode = System.IO.FileMode; using FileShare = System.IO.FileShare; namespace RED2 { public enum DeleteModes { RecycleBin = 0, RecycleBinShowErrors = 1, RecycleBinWithQuestion = 2, Direct = 3, Simulate = 4 } [Serializable] public class REDPermissionDeniedException : Exception { public REDPermissionDeniedException() { } public REDPermissionDeniedException(string message) : base(message) { } public REDPermissionDeniedException(string message, Exception inner) : base(message, inner) { } } /// /// A collection of (generic) system functions /// /// Exception handling should be made by the caller /// public class SystemFunctions { // Registry keys private const string registryMenuName = "Folder\\shell\\Remove empty dirs"; private const string registryCommand = "Folder\\shell\\Remove empty dirs\\command"; public static string ConvertLineBreaks(string str) { return str.Replace(@"\r\n", "\r\n").Replace(@"\n", "\n"); } public static bool MatchesIgnorePattern(FileInfo file, int filesize, bool Ignore0kbFiles, string[] ignoreFileList, out string delPattern) { bool matches_pattern = false; Regex regexPattern = null; delPattern = ""; for (int pos = 0; (pos < ignoreFileList.Length && !matches_pattern); pos++) { string pattern = ignoreFileList[pos]; // TODO: Check patterns for errors // Skip empty patterns if (pattern == "") continue; if (Ignore0kbFiles && filesize == 0) { delPattern = "[Empty file]"; matches_pattern = true; } else if (pattern.ToLower() == file.Name.ToLower()) { // Direct match - ignore case delPattern = pattern; matches_pattern = true; } else if (pattern.Contains("*") || (pattern.StartsWith("/") && pattern.EndsWith("/"))) { // Pattern is a regex if (pattern.StartsWith("/") && pattern.EndsWith("/")) { regexPattern = new Regex(pattern.Substring(1, pattern.Length - 2)); } else { pattern = Regex.Escape(pattern).Replace("\\*", ".*"); regexPattern = new Regex("^" + pattern + "$"); } if (regexPattern.IsMatch(file.Name)) { delPattern = pattern; matches_pattern = true; } } } return matches_pattern; } public static void ManuallyDeleteDirectory(string path, DeleteModes deleteMode) { if (deleteMode == DeleteModes.Simulate) return; if (path == "") throw new Exception("Could not delete directory because the path was empty."); //TODO: Add FileIOPermission code? FileSystem.DeleteDirectory(path, UIOption.AllDialogs, RecycleOption.SendToRecycleBin, UICancelOption.ThrowException); } public static bool IsDirLocked(string path) { try { // UGLY hack to determine whether we have write access // to a specific directory var r = new Random(); var tempName = path + "deltest"; int counter = 0; while (Directory.Exists(tempName)) { tempName = path + "deltest" + r.Next(0, 9999).ToString(); if (counter > 100) return true; // Something strange is going on... stop here... counter++; } Directory.Move(path, tempName); Directory.Move(tempName, path); return false; } catch //(Exception ex) { // Could not rename -> probably we have no // write access to the directory return true; } } public static bool IsFileLocked(FileInfo file) { try { using (file.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None)) { return false; } } catch //(IOException) { // Could not open file -> probably we have no // write access to the file return true; } } public static void SecureDeleteDirectory(string path, DeleteModes deleteMode) { if (deleteMode == DeleteModes.Simulate) return; if (deleteMode == DeleteModes.Direct) { Directory.Delete(path, recursive: false, ignoreReadOnly: true); //throws IOException if not empty anymore return; } // Last security check before deletion if (Directory.GetFiles(path).Length == 0 && Directory.GetDirectories(path).Length == 0) { if (deleteMode == DeleteModes.RecycleBin) { // Check CLR permissions -> could raise a exception new FileIOPermission(FileIOPermissionAccess.Write, path + Path.DirectorySeparatorChar.ToString()).Demand(); //if (!CheckWriteAccess(Directory.GetAccessControl(path))) if (IsDirLocked(path)) throw new REDPermissionDeniedException("Could not delete directory \"" + path + "\" because the access is protected by the (file) system (permission denied)."); FileSystem.DeleteDirectory(path, UIOption.OnlyErrorDialogs, RecycleOption.SendToRecycleBin, UICancelOption.ThrowException); } else if (deleteMode == DeleteModes.RecycleBinShowErrors) { FileSystem.DeleteDirectory(path, UIOption.OnlyErrorDialogs, RecycleOption.SendToRecycleBin, UICancelOption.ThrowException); } else if (deleteMode == DeleteModes.RecycleBinWithQuestion) FileSystem.DeleteDirectory(path, UIOption.AllDialogs, RecycleOption.SendToRecycleBin, UICancelOption.ThrowException); else throw new Exception("Internal error: Unknown delete mode: \"" + deleteMode.ToString() + "\""); } else throw new Exception("Aborted deletion of the directory \"" + path + "\" because it is no longer empty. This can happen if RED previously failed to delete a empty (trash) file."); } public static void SecureDeleteFile(FileInfo file, DeleteModes deleteMode) { if (deleteMode == DeleteModes.Simulate) return; if (deleteMode == DeleteModes.RecycleBin) { // Check CLR permissions -> could raise a exception new FileIOPermission(FileIOPermissionAccess.Write, file.FullName).Demand(); if (IsFileLocked(file)) throw new REDPermissionDeniedException("Could not delete file \"" + file.FullName + "\" because the access is protected by the (file) system (permission denied)."); FileSystem.DeleteFile(file.FullName, UIOption.OnlyErrorDialogs, RecycleOption.SendToRecycleBin, UICancelOption.ThrowException); } else if (deleteMode == DeleteModes.RecycleBinShowErrors) { FileSystem.DeleteFile(file.FullName, UIOption.OnlyErrorDialogs, RecycleOption.SendToRecycleBin, UICancelOption.ThrowException); } else if (deleteMode == DeleteModes.RecycleBinWithQuestion) FileSystem.DeleteFile(file.FullName, UIOption.AllDialogs, RecycleOption.SendToRecycleBin, UICancelOption.ThrowException); else if (deleteMode == DeleteModes.Direct) { // Was used for testing the error handling: // if (SystemFunctions.random.NextDouble() > 0.5) throw new Exception("Test error"); file.Delete(ignoreReadOnly: true); } else throw new Exception("Internal error: Unknown delete mode: \"" + deleteMode.ToString() + "\""); } public static string ChooseDirectoryDialog(string path) { FolderBrowserDialog folderDialog = new FolderBrowserDialog(); folderDialog.Description = RED2.Properties.Resources.please_select; folderDialog.ShowNewFolderButton = false; if (path != "") { DirectoryInfo dir = new DirectoryInfo(path); if (dir.Exists) folderDialog.SelectedPath = path; } if (folderDialog.ShowDialog() == DialogResult.OK) path = folderDialog.SelectedPath; folderDialog.Dispose(); folderDialog = null; return path; } /// /// Opens a folder /// public static void OpenDirectoryWithExplorer(string path) { if (path == "") return; string windows_folder = Environment.GetEnvironmentVariable("SystemRoot"); Process.Start(windows_folder + "\\explorer.exe", "/e,\"" + path + "\""); } /// /// Check for the registry key /// /// public static bool IsRegKeyIntegratedIntoWindowsExplorer() { return (Registry.ClassesRoot.OpenSubKey(registryMenuName) != null); } internal static void AddOrRemoveRegKey(bool add) { RegistryKey regmenu = null; RegistryKey regcmd = null; if (add) { try { regmenu = Registry.ClassesRoot.CreateSubKey(registryMenuName); if (regmenu != null) regmenu.SetValue("", "Remove empty dirs"); regcmd = Registry.ClassesRoot.CreateSubKey(registryCommand); if (regcmd != null) regcmd.SetValue("", Application.ExecutablePath + " \"%1\""); } catch (Exception ex) { MessageBox.Show(ex.ToString()); } finally { if (regmenu != null) regmenu.Close(); if (regcmd != null) regcmd.Close(); } } else { try { var reg = Registry.ClassesRoot.OpenSubKey(registryCommand); if (reg != null) { reg.Close(); Registry.ClassesRoot.DeleteSubKey(registryCommand); } reg = Registry.ClassesRoot.OpenSubKey(registryMenuName); if (reg != null) { reg.Close(); Registry.ClassesRoot.DeleteSubKey(registryMenuName); } } catch (Exception ex) { MessageBox.Show(RED2.Properties.Resources.error + "\nCould not change registry settings: " + ex.ToString()); } } } } } ================================================ FILE: RED2/Lib/TreeManager.cs ================================================ using System; using System.Collections.Generic; using System.Drawing; using System.Windows.Forms; using Alphaleonis.Win32.Filesystem; using FileAttributes = System.IO.FileAttributes; namespace RED2 { /// /// Handles tree related things /// /// TODO: Handle null references within tree nodes /// public class TreeManager { private TreeView treeView = null; private TreeNode rootNode = null; private string rootPath = ""; private Label fastModeInfoLabel = null; private Dictionary directoryToTreeNodeMapping = null; /// /// This dictionary holds the original properties of protected /// nodes so that they can be restored if the user undoes the action /// private Dictionary nodePropsBackup = new Dictionary(); public event EventHandler OnProtectionStatusChanged; public event EventHandler OnDeleteRequest; private bool fastMode { get; set; } = true; public TreeManager(TreeView dirTree, Label fastModeInfoLabel) { this.treeView = dirTree; this.treeView.MouseClick += new System.Windows.Forms.MouseEventHandler(this.tvFolders_MouseClick); this.fastModeInfoLabel = fastModeInfoLabel; this.resetTree(); this.rootPath = ""; } #region Incoming "events" public void SetFastMode(bool fastModeActive) { this.fastMode = fastModeActive; if (this.fastMode) { this.treeView.SuspendLayout(); } else { this.clearFastMode(); this.treeView.ResumeLayout(); } } public void OnSearchStart(DirectoryInfo directory) { this.resetTree(); // Disable UI updates when fast mode is enabled if (this.fastMode) { suspendTreeViewForFastMode(); } this.createRootNode(directory, DirectoryIcons.home); } public void OnSearchFinished() { this.showFastModeResults(); } public void OnDeletionProcessStart() { if (this.fastMode) { this.treeView.Nodes.Clear(); suspendTreeViewForFastMode(); } } public void OnDeletionProcessFinished() { this.showFastModeResults(); } public void OnProcessCancelled() { this.showFastModeResults(); } #endregion private void suspendTreeViewForFastMode() { this.treeView.SuspendLayout(); this.treeView.BackColor = System.Drawing.SystemColors.Control; this.fastModeInfoLabel.Visible = true; } private void clearFastMode() { this.treeView.BackColor = System.Drawing.SystemColors.Window; this.fastModeInfoLabel.Visible = false; } private void showFastModeResults() { if (!this.fastMode) return; this.treeView.ResumeLayout(); this.clearFastMode(); this.addRootNode(); // Scroll to root node and expand all dirs this.rootNode.EnsureVisible(); this.treeView.ExpandAll(); } /// /// Hack to selected the correct node /// private void tvFolders_MouseClick(object sender, MouseEventArgs e) { this.treeView.SelectedNode = this.treeView.GetNodeAt(e.X, e.Y); } private void resetTree() { this.rootNode = null; this.directoryToTreeNodeMapping = new Dictionary(); this.nodePropsBackup = new Dictionary(); this.treeView.Nodes.Clear(); } private void createRootNode(DirectoryInfo directory, DirectoryIcons imageKey) { this.rootPath = directory.FullName.Trim('\\'); rootNode = new TreeNode(directory.Name); rootNode.Tag = directory; rootNode.ImageKey = imageKey.ToString(); rootNode.SelectedImageKey = imageKey.ToString(); directoryToTreeNodeMapping = new Dictionary(); directoryToTreeNodeMapping.Add(directory.FullName, rootNode); if (!this.fastMode) { // During fast mode the root node will be added after the search finished addRootNode(); } } private void addRootNode() { if (rootNode == null || (treeView.Nodes.Count == 1 && treeView.Nodes[0] == rootNode)) return; this.treeView.Nodes.Clear(); this.treeView.Nodes.Add(rootNode); } private void scrollToNode(TreeNode node) { // Ignore when fast mode is enabled if (!this.fastMode) { node.EnsureVisible(); } } /// /// Marks a folder with the warning or deleted icon /// /// Dir path /// Icon internal void UpdateItemIcon(string path, DirectoryIcons iconKey) { var treeNode = this.findOrCreateDirectoryNodeByPath(path); treeNode.ImageKey = iconKey.ToString(); treeNode.SelectedImageKey = iconKey.ToString(); this.scrollToNode(treeNode); } // TODO: Find better code structure for the following two routines private TreeNode findOrCreateDirectoryNodeByPath(string path) { if (path == null) return null; if (directoryToTreeNodeMapping.ContainsKey(path)) return directoryToTreeNodeMapping[path]; else return AddOrUpdateDirectoryNode(path, DirectorySearchStatusTypes.NotEmpty, ""); } /// /// Add or update directory tree node /// /// Directory path /// Result status /// Error message (optional) /// public TreeNode AddOrUpdateDirectoryNode(string path, DirectorySearchStatusTypes statusType, string optionalErrorMsg) { if (directoryToTreeNodeMapping.ContainsKey(path)) { // Just update the style if the node already exists var node = directoryToTreeNodeMapping[path]; applyNodeStyle(node, path, statusType, optionalErrorMsg); return node; } var directory = new DirectoryInfo(path); // Create new tree node var newTreeNode = new TreeNode(directory.Name); applyNodeStyle(newTreeNode, path, statusType, optionalErrorMsg); newTreeNode.Tag = directory; if (directory.Parent.FullName.Trim('\\').Equals(this.rootPath, StringComparison.OrdinalIgnoreCase)) { this.rootNode.Nodes.Add(newTreeNode); } else { var parentNode = this.findOrCreateDirectoryNodeByPath(directory.Parent.FullName); parentNode.Nodes.Add(newTreeNode); } directoryToTreeNodeMapping.Add(path, newTreeNode); this.scrollToNode(newTreeNode); return newTreeNode; } private void applyNodeStyle(TreeNode treeNode, string path, DirectorySearchStatusTypes statusType, string optionalErrorMsg) { var directory = new DirectoryInfo(path); // TODO: use enums for icon names treeNode.ForeColor = (statusType == DirectorySearchStatusTypes.Empty) ? Color.Red : Color.Gray; var iconKey = ""; if (statusType == DirectorySearchStatusTypes.Empty) { var fileCount = directory.GetFiles().Length; var containsTrash = (fileCount > 0); iconKey = containsTrash ? "folder_trash_files" : "folder"; // TODO: use data from scan thread if ((directory.Attributes & FileAttributes.Hidden) == FileAttributes.Hidden) iconKey = containsTrash ? "folder_hidden_trash_files" : "folder_hidden"; if ((directory.Attributes & FileAttributes.Encrypted) == FileAttributes.Encrypted) iconKey = containsTrash ? "folder_lock_trash_files" : "folder_lock"; if ((directory.Attributes & FileAttributes.System) == FileAttributes.System) iconKey = containsTrash ? "folder_lock_trash_files" : "folder_lock"; if (containsTrash && fileCount == 1) { treeNode.Text += " (contains " + fileCount.ToString() + " empty file)"; } else if (containsTrash) { treeNode.Text += " (contains " + fileCount.ToString() + " empty files)"; } } else if (statusType == DirectorySearchStatusTypes.Error) { iconKey = "folder_warning"; if (optionalErrorMsg != "") { optionalErrorMsg = optionalErrorMsg.Replace("\r", "").Replace("\n", ""); if (optionalErrorMsg.Length > 55) optionalErrorMsg = optionalErrorMsg.Substring(0, 55) + "..."; treeNode.Text += " (" + optionalErrorMsg + ")"; } } else if (statusType == DirectorySearchStatusTypes.Ignore) { iconKey = "protected_icon"; treeNode.ForeColor = Color.Blue; } if (treeNode != this.rootNode) { treeNode.ImageKey = iconKey; treeNode.SelectedImageKey = iconKey; } } /// /// Returns the selected folder path /// public string GetSelectedFolderPath() { if (this.treeView.SelectedNode != null && this.treeView.SelectedNode.Tag != null && this.treeView.SelectedNode.Tag is DirectoryInfo) return ((DirectoryInfo)this.treeView.SelectedNode.Tag).FullName; return ""; } internal void DeleteSelectedDirectory() { if (this.treeView.SelectedNode != null && this.treeView.SelectedNode.Tag != null && this.treeView.SelectedNode.Tag is DirectoryInfo) { var folder = (DirectoryInfo)this.treeView.SelectedNode.Tag; if (OnDeleteRequest != null) OnDeleteRequest(this, new DeleteRequestFromTreeEventArgs(folder.FullName)); } } internal void RemoveNode(string path) { if (this.nodePropsBackup.ContainsKey(path)) this.nodePropsBackup.Remove(path); if (this.directoryToTreeNodeMapping.ContainsKey(path)) { this.directoryToTreeNodeMapping[path].Remove(); this.directoryToTreeNodeMapping.Remove(path); } } #region Directory protection internal void ProtectSelected() { if (treeView.SelectedNode != null) this.ProtectNode(treeView.SelectedNode); } internal void UnprotectSelected() { unprotectNode(treeView.SelectedNode); } private void unprotectNode(TreeNode node) { if (node != null) { var directory = ((DirectoryInfo)node.Tag); if (!this.nodePropsBackup.ContainsKey(directory.FullName)) { // TODO: What to do when this info is missing, show error? return; } // Restore props from backup values string[] propList = ((string)this.nodePropsBackup[directory.FullName]).Split('|'); this.nodePropsBackup.Remove(directory.FullName); node.ImageKey = propList[0]; node.SelectedImageKey = propList[0]; node.ForeColor = Color.FromArgb(Int32.Parse(propList[1])); if (OnProtectionStatusChanged != null) OnProtectionStatusChanged(this, new ProtectionStatusChangedEventArgs(directory.FullName, false)); // Unprotect all subnodes foreach (TreeNode subNode in node.Nodes) this.unprotectNode(subNode); } } private void ProtectNode(TreeNode node) { DirectoryInfo directory = (DirectoryInfo)node.Tag; if (nodePropsBackup.ContainsKey(directory.FullName)) return; if (OnProtectionStatusChanged != null) OnProtectionStatusChanged(this, new ProtectionStatusChangedEventArgs(directory.FullName, true)); // Backup node props if the user changes his mind we can restore the node // TODO: I'm sure there is a better way to do this, maybe this info can be stored // in the node.Tag or we simply recreate this info like it's a new node. nodePropsBackup.Add(directory.FullName, node.ImageKey + "|" + node.ForeColor.ToArgb().ToString()); node.ImageKey = "protected_icon"; node.SelectedImageKey = "protected_icon"; node.ForeColor = Color.Blue; // Recursively protect directories if (node.Parent != this.rootNode) ProtectNode(node.Parent); } #endregion } } ================================================ FILE: RED2/Lib/UIHelpers.cs ================================================ using System; namespace RED2 { /// /// Icon names (Warning: Entries are case sensitive) /// public enum DirectoryIcons { home, deleted, protected_icon, folder_warning } /// /// List box container class thingy /// public class DeleteModeItem { public DeleteModes DeleteMode { get; set; } public DeleteModeItem(DeleteModes Mode) { this.DeleteMode = Mode; } public static DeleteModes[] GetList() { return new DeleteModes[] { DeleteModes.RecycleBin, DeleteModes.RecycleBinShowErrors, DeleteModes.RecycleBinWithQuestion, DeleteModes.Direct, DeleteModes.Simulate }; } public override string ToString() { switch (this.DeleteMode) { case DeleteModes.RecycleBin: return "Delete to recycle bin and ignore errors (safer but slower, default setting)"; case DeleteModes.Direct: return "Bypass recycle bin and directly delete dirs (more dangerous but faster)"; case DeleteModes.RecycleBinShowErrors: return "Delete to recycle bin and show all errors (can be annoying)"; case DeleteModes.RecycleBinWithQuestion: return "Delete to recycle bin and ask before every deletion"; case DeleteModes.Simulate: return "Simulate deletion (just pretend doing it, for testing)"; // TODO: Idea -> Move files instead of deleting? default: throw new Exception("Unknown delete mode"); } } } } ================================================ FILE: RED2/LogWindow.Designer.cs ================================================ namespace RED2 { partial class LogWindow { /// /// Erforderliche Designervariable. /// private System.ComponentModel.IContainer components = null; /// /// Verwendete Ressourcen bereinigen. /// /// True, wenn verwaltete Ressourcen gelöscht werden sollen; andernfalls False. protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } #region Vom Windows Form-Designer generierter Code /// /// Erforderliche Methode für die Designerunterstützung. /// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden. /// private void InitializeComponent() { this.tbLog = new System.Windows.Forms.TextBox(); this.SuspendLayout(); // // tbLog // this.tbLog.Dock = System.Windows.Forms.DockStyle.Fill; this.tbLog.Font = new System.Drawing.Font("Lucida Console", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.tbLog.Location = new System.Drawing.Point(0, 0); this.tbLog.Multiline = true; this.tbLog.Name = "tbLog"; this.tbLog.ScrollBars = System.Windows.Forms.ScrollBars.Both; this.tbLog.Size = new System.Drawing.Size(684, 462); this.tbLog.TabIndex = 0; this.tbLog.WordWrap = false; this.tbLog.DoubleClick += new System.EventHandler(this.tbLog_DoubleClick); // // LogWindow // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(684, 462); this.Controls.Add(this.tbLog); this.MinimizeBox = false; this.Name = "LogWindow"; this.ShowIcon = false; this.ShowInTaskbar = false; this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; this.Text = "Logs"; this.Load += new System.EventHandler(this.LogWindow_Load); this.ResumeLayout(false); this.PerformLayout(); } #endregion private System.Windows.Forms.TextBox tbLog; } } ================================================ FILE: RED2/LogWindow.cs ================================================ using System; using System.Windows.Forms; namespace RED2 { public partial class LogWindow : Form { public LogWindow() { InitializeComponent(); } private void LogWindow_Load(object sender, EventArgs e) { } public void SetLog(string log) { this.tbLog.Text = log; } private void tbLog_DoubleClick(object sender, EventArgs e) { this.tbLog.SelectAll(); } } } ================================================ FILE: RED2/LogWindow.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 ================================================ FILE: RED2/MainWindow.Designer.cs ================================================ namespace RED2 { partial class MainWindow { /// /// Erforderliche Designervariable. /// private System.ComponentModel.IContainer components = null; /// /// Verwendete Ressourcen bereinigen. /// /// True, wenn verwaltete Ressourcen gelöscht werden sollen; andernfalls False. protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } #region Vom Windows Form-Designer generierter Code /// /// Erforderliche Methode für die Designerunterstützung. /// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden. /// private void InitializeComponent() { this.components = new System.ComponentModel.Container(); System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainWindow)); this.ilFolderIcons = new System.Windows.Forms.ImageList(this.components); this.tcMain = new System.Windows.Forms.TabControl(); this.tabSearch = new System.Windows.Forms.TabPage(); this.lbFastModeInfo = new System.Windows.Forms.Label(); this.btnShowLog = new System.Windows.Forms.Button(); this.btnCancel = new System.Windows.Forms.Button(); this.btnScan = new System.Windows.Forms.Button(); this.btnDelete = new System.Windows.Forms.Button(); this.pnlIcons = new System.Windows.Forms.Panel(); this.label1 = new System.Windows.Forms.Label(); this.panel5 = new System.Windows.Forms.Panel(); this.panel3 = new System.Windows.Forms.Panel(); this.label18 = new System.Windows.Forms.Label(); this.panel2 = new System.Windows.Forms.Panel(); this.label17 = new System.Windows.Forms.Label(); this.panel1 = new System.Windows.Forms.Panel(); this.label12 = new System.Windows.Forms.Label(); this.label6 = new System.Windows.Forms.Label(); this.lbStatus = new System.Windows.Forms.Label(); this.pbProgressStatus = new System.Windows.Forms.ProgressBar(); this.tvFolders = new System.Windows.Forms.TreeView(); this.cmStrip = new System.Windows.Forms.ContextMenuStrip(this.components); this.openFolderToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.scanOnlyThisDirectoryToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator4 = new System.Windows.Forms.ToolStripSeparator(); this.toolStripExpandAll = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripCollapseAll = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); this.protectFolderFromBeingDeletedToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.unprotectFolderToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator(); this.proToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator(); this.deleteToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.btnExit = new System.Windows.Forms.Button(); this.tbFolder = new System.Windows.Forms.TextBox(); this.btnChooseFolder = new System.Windows.Forms.Button(); this.lblPickAFolder = new System.Windows.Forms.Label(); this.tabSettings = new System.Windows.Forms.TabPage(); this.gbDeleteMode = new System.Windows.Forms.GroupBox(); this.label15 = new System.Windows.Forms.Label(); this.cbDeleteMode = new System.Windows.Forms.ComboBox(); this.groupBoxExplorerIntegration = new System.Windows.Forms.GroupBox(); this.lblReqAdmin = new System.Windows.Forms.Label(); this.btnExplorerRemove = new System.Windows.Forms.Button(); this.btnExplorerIntegrate = new System.Windows.Forms.Button(); this.label16 = new System.Windows.Forms.Label(); this.gbOptions = new System.Windows.Forms.GroupBox(); this.label25 = new System.Windows.Forms.Label(); this.label11 = new System.Windows.Forms.Label(); this.label21 = new System.Windows.Forms.Label(); this.cbFastSearchMode = new System.Windows.Forms.CheckBox(); this.cbHideScanErrors = new System.Windows.Forms.CheckBox(); this.cbIgnoreErrors = new System.Windows.Forms.CheckBox(); this.cbClipboardDetection = new System.Windows.Forms.CheckBox(); this.cbIgnoreHiddenFolders = new System.Windows.Forms.CheckBox(); this.cbIgnore0kbFiles = new System.Windows.Forms.CheckBox(); this.tabIgnoreList = new System.Windows.Forms.TabPage(); this.label22 = new System.Windows.Forms.Label(); this.tbIgnoreFolders = new System.Windows.Forms.TextBox(); this.label10 = new System.Windows.Forms.Label(); this.tabAdvanced = new System.Windows.Forms.TabPage(); this.gbAdvancedSettings = new System.Windows.Forms.GroupBox(); this.label20 = new System.Windows.Forms.Label(); this.label26 = new System.Windows.Forms.Label(); this.label27 = new System.Windows.Forms.Label(); this.label19 = new System.Windows.Forms.Label(); this.cbKeepSystemFolders = new System.Windows.Forms.CheckBox(); this.nuFolderAge = new System.Windows.Forms.NumericUpDown(); this.label7 = new System.Windows.Forms.Label(); this.label24 = new System.Windows.Forms.Label(); this.nuPause = new System.Windows.Forms.NumericUpDown(); this.nuMaxDepth = new System.Windows.Forms.NumericUpDown(); this.label4 = new System.Windows.Forms.Label(); this.label3 = new System.Windows.Forms.Label(); this.nuInfiniteLoopDetectionCount = new System.Windows.Forms.NumericUpDown(); this.btnResetConfig = new System.Windows.Forms.Button(); this.btnCopyDebugInfo = new System.Windows.Forms.Button(); this.gbIgnoreFilenames = new System.Windows.Forms.GroupBox(); this.label23 = new System.Windows.Forms.Label(); this.label14 = new System.Windows.Forms.Label(); this.tbIgnoreFiles = new System.Windows.Forms.TextBox(); this.label2 = new System.Windows.Forms.Label(); this.label8 = new System.Windows.Forms.Label(); this.tabAbout = new System.Windows.Forms.TabPage(); this.llGithub = new System.Windows.Forms.LinkLabel(); this.linkLabel2 = new System.Windows.Forms.LinkLabel(); this.linkLabel1 = new System.Windows.Forms.LinkLabel(); this.tbCredits = new System.Windows.Forms.TextBox(); this.lblRedStats = new System.Windows.Forms.Label(); this.label5 = new System.Windows.Forms.Label(); this.llWebsite = new System.Windows.Forms.LinkLabel(); this.lbAppTitle = new System.Windows.Forms.Label(); this.tcMain.SuspendLayout(); this.tabSearch.SuspendLayout(); this.pnlIcons.SuspendLayout(); this.cmStrip.SuspendLayout(); this.tabSettings.SuspendLayout(); this.gbDeleteMode.SuspendLayout(); this.groupBoxExplorerIntegration.SuspendLayout(); this.gbOptions.SuspendLayout(); this.tabIgnoreList.SuspendLayout(); this.tabAdvanced.SuspendLayout(); this.gbAdvancedSettings.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.nuFolderAge)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.nuPause)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.nuMaxDepth)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.nuInfiniteLoopDetectionCount)).BeginInit(); this.gbIgnoreFilenames.SuspendLayout(); this.tabAbout.SuspendLayout(); this.SuspendLayout(); // // ilFolderIcons // this.ilFolderIcons.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("ilFolderIcons.ImageStream"))); this.ilFolderIcons.TransparentColor = System.Drawing.Color.White; this.ilFolderIcons.Images.SetKeyName(0, "trash"); this.ilFolderIcons.Images.SetKeyName(1, "cancel"); this.ilFolderIcons.Images.SetKeyName(2, "deleted"); this.ilFolderIcons.Images.SetKeyName(3, "folder"); this.ilFolderIcons.Images.SetKeyName(4, "folder_hidden"); this.ilFolderIcons.Images.SetKeyName(5, "folder_lock"); this.ilFolderIcons.Images.SetKeyName(6, "folder_lock_trash_files"); this.ilFolderIcons.Images.SetKeyName(7, "folder_trash_files"); this.ilFolderIcons.Images.SetKeyName(8, "folder_warning"); this.ilFolderIcons.Images.SetKeyName(9, "help"); this.ilFolderIcons.Images.SetKeyName(10, "home"); this.ilFolderIcons.Images.SetKeyName(11, "search"); this.ilFolderIcons.Images.SetKeyName(12, "folder_hidden_trash_files"); this.ilFolderIcons.Images.SetKeyName(13, "preferences"); this.ilFolderIcons.Images.SetKeyName(14, "exit"); this.ilFolderIcons.Images.SetKeyName(15, "protected_icon"); this.ilFolderIcons.Images.SetKeyName(16, "filter"); // // tcMain // this.tcMain.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.tcMain.Controls.Add(this.tabSearch); this.tcMain.Controls.Add(this.tabSettings); this.tcMain.Controls.Add(this.tabIgnoreList); this.tcMain.Controls.Add(this.tabAdvanced); this.tcMain.Controls.Add(this.tabAbout); this.tcMain.ImageList = this.ilFolderIcons; this.tcMain.Location = new System.Drawing.Point(9, 7); this.tcMain.Multiline = true; this.tcMain.Name = "tcMain"; this.tcMain.Padding = new System.Drawing.Point(10, 5); this.tcMain.RightToLeft = System.Windows.Forms.RightToLeft.No; this.tcMain.SelectedIndex = 0; this.tcMain.ShowToolTips = true; this.tcMain.Size = new System.Drawing.Size(706, 575); this.tcMain.TabIndex = 18; // // tabSearch // this.tabSearch.AccessibleDescription = ""; this.tabSearch.AccessibleName = ""; this.tabSearch.Controls.Add(this.lbFastModeInfo); this.tabSearch.Controls.Add(this.btnShowLog); this.tabSearch.Controls.Add(this.btnCancel); this.tabSearch.Controls.Add(this.btnScan); this.tabSearch.Controls.Add(this.btnDelete); this.tabSearch.Controls.Add(this.pnlIcons); this.tabSearch.Controls.Add(this.label6); this.tabSearch.Controls.Add(this.lbStatus); this.tabSearch.Controls.Add(this.pbProgressStatus); this.tabSearch.Controls.Add(this.tvFolders); this.tabSearch.Controls.Add(this.btnExit); this.tabSearch.Controls.Add(this.tbFolder); this.tabSearch.Controls.Add(this.btnChooseFolder); this.tabSearch.Controls.Add(this.lblPickAFolder); this.tabSearch.ImageKey = "search"; this.tabSearch.Location = new System.Drawing.Point(4, 27); this.tabSearch.Name = "tabSearch"; this.tabSearch.Padding = new System.Windows.Forms.Padding(3); this.tabSearch.Size = new System.Drawing.Size(698, 544); this.tabSearch.TabIndex = 0; this.tabSearch.Text = "Find"; this.tabSearch.ToolTipText = "Search for empty directories"; this.tabSearch.UseVisualStyleBackColor = true; // // lbFastModeInfo // this.lbFastModeInfo.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.lbFastModeInfo.BackColor = System.Drawing.SystemColors.Control; this.lbFastModeInfo.ForeColor = System.Drawing.Color.Gray; this.lbFastModeInfo.Location = new System.Drawing.Point(107, 257); this.lbFastModeInfo.Name = "lbFastModeInfo"; this.lbFastModeInfo.Size = new System.Drawing.Size(346, 13); this.lbFastModeInfo.TabIndex = 18; this.lbFastModeInfo.Text = "[Fast mode is enabled, results will be shown after the process is finished]"; this.lbFastModeInfo.Visible = false; // // btnShowLog // this.btnShowLog.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); this.btnShowLog.Enabled = false; this.btnShowLog.Location = new System.Drawing.Point(380, 498); this.btnShowLog.Name = "btnShowLog"; this.btnShowLog.Size = new System.Drawing.Size(79, 34); this.btnShowLog.TabIndex = 17; this.btnShowLog.Text = "Show &logs"; this.btnShowLog.UseVisualStyleBackColor = true; this.btnShowLog.Click += new System.EventHandler(this.btnShowLog_Click); // // btnCancel // this.btnCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); this.btnCancel.Enabled = false; this.btnCancel.ImageKey = "cancel"; this.btnCancel.ImageList = this.ilFolderIcons; this.btnCancel.Location = new System.Drawing.Point(276, 498); this.btnCancel.Name = "btnCancel"; this.btnCancel.Size = new System.Drawing.Size(98, 34); this.btnCancel.TabIndex = 6; this.btnCancel.Text = "&Cancel"; this.btnCancel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; this.btnCancel.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText; this.btnCancel.UseVisualStyleBackColor = true; this.btnCancel.Click += new System.EventHandler(this.btnCancel_Click); // // btnScan // this.btnScan.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); this.btnScan.ImageKey = "search"; this.btnScan.ImageList = this.ilFolderIcons; this.btnScan.Location = new System.Drawing.Point(13, 497); this.btnScan.Name = "btnScan"; this.btnScan.Size = new System.Drawing.Size(130, 35); this.btnScan.TabIndex = 4; this.btnScan.Text = "&Find directories"; this.btnScan.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; this.btnScan.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText; this.btnScan.UseVisualStyleBackColor = true; this.btnScan.Click += new System.EventHandler(this.btnScan_Click); // // btnDelete // this.btnDelete.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); this.btnDelete.Enabled = false; this.btnDelete.ImageKey = "trash"; this.btnDelete.ImageList = this.ilFolderIcons; this.btnDelete.Location = new System.Drawing.Point(150, 497); this.btnDelete.Name = "btnDelete"; this.btnDelete.Size = new System.Drawing.Size(120, 35); this.btnDelete.TabIndex = 5; this.btnDelete.Text = "&Delete matches"; this.btnDelete.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; this.btnDelete.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText; this.btnDelete.UseVisualStyleBackColor = true; this.btnDelete.Click += new System.EventHandler(this.btnDelete_Click); // // pnlIcons // this.pnlIcons.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Right))); this.pnlIcons.BackColor = System.Drawing.SystemColors.Info; this.pnlIcons.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; this.pnlIcons.Controls.Add(this.label1); this.pnlIcons.Controls.Add(this.panel5); this.pnlIcons.Controls.Add(this.panel3); this.pnlIcons.Controls.Add(this.label18); this.pnlIcons.Controls.Add(this.panel2); this.pnlIcons.Controls.Add(this.label17); this.pnlIcons.Controls.Add(this.panel1); this.pnlIcons.Controls.Add(this.label12); this.pnlIcons.Location = new System.Drawing.Point(557, 60); this.pnlIcons.Name = "pnlIcons"; this.pnlIcons.Size = new System.Drawing.Size(126, 406); this.pnlIcons.TabIndex = 16; // // label1 // this.label1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.label1.AutoSize = true; this.label1.Location = new System.Drawing.Point(25, 382); this.label1.Name = "label1"; this.label1.Size = new System.Drawing.Size(53, 13); this.label1.TabIndex = 22; this.label1.Text = "Protected"; // // panel5 // this.panel5.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); this.panel5.BackColor = System.Drawing.Color.Blue; this.panel5.Location = new System.Drawing.Point(8, 381); this.panel5.Name = "panel5"; this.panel5.Size = new System.Drawing.Size(15, 15); this.panel5.TabIndex = 21; // // panel3 // this.panel3.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.panel3.BackColor = System.Drawing.SystemColors.Control; this.panel3.Location = new System.Drawing.Point(8, 325); this.panel3.Name = "panel3"; this.panel3.Size = new System.Drawing.Size(120, 2); this.panel3.TabIndex = 18; // // label18 // this.label18.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.label18.AutoSize = true; this.label18.Location = new System.Drawing.Point(25, 359); this.label18.Name = "label18"; this.label18.Size = new System.Drawing.Size(77, 13); this.label18.TabIndex = 20; this.label18.Text = "Will be deleted"; // // panel2 // this.panel2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); this.panel2.BackColor = System.Drawing.Color.Red; this.panel2.Location = new System.Drawing.Point(8, 358); this.panel2.Name = "panel2"; this.panel2.Size = new System.Drawing.Size(15, 15); this.panel2.TabIndex = 19; // // label17 // this.label17.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.label17.AutoSize = true; this.label17.Location = new System.Drawing.Point(24, 336); this.label17.Name = "label17"; this.label17.Size = new System.Drawing.Size(99, 13); this.label17.TabIndex = 18; this.label17.Text = "Will not be touched"; // // panel1 // this.panel1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); this.panel1.BackColor = System.Drawing.Color.Gray; this.panel1.Location = new System.Drawing.Point(8, 335); this.panel1.Name = "panel1"; this.panel1.Size = new System.Drawing.Size(15, 15); this.panel1.TabIndex = 17; // // label12 // this.label12.AutoSize = true; this.label12.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.label12.Location = new System.Drawing.Point(4, 6); this.label12.Name = "label12"; this.label12.Size = new System.Drawing.Size(98, 13); this.label12.TabIndex = 0; this.label12.Text = "Icon description"; // // label6 // this.label6.AutoSize = true; this.label6.Location = new System.Drawing.Point(11, 16); this.label6.Name = "label6"; this.label6.Size = new System.Drawing.Size(177, 13); this.label6.TabIndex = 15; this.label6.Text = "Please choose a directory to check:"; // // lbStatus // this.lbStatus.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.lbStatus.Location = new System.Drawing.Point(149, 475); this.lbStatus.Name = "lbStatus"; this.lbStatus.Size = new System.Drawing.Size(532, 13); this.lbStatus.TabIndex = 13; this.lbStatus.Text = "Status text"; // // pbProgressStatus // this.pbProgressStatus.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); this.pbProgressStatus.Location = new System.Drawing.Point(14, 475); this.pbProgressStatus.Name = "pbProgressStatus"; this.pbProgressStatus.Size = new System.Drawing.Size(129, 13); this.pbProgressStatus.TabIndex = 12; // // tvFolders // this.tvFolders.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.tvFolders.ContextMenuStrip = this.cmStrip; this.tvFolders.ImageKey = "folder"; this.tvFolders.ImageList = this.ilFolderIcons; this.tvFolders.Location = new System.Drawing.Point(14, 60); this.tvFolders.Name = "tvFolders"; this.tvFolders.SelectedImageKey = "folder"; this.tvFolders.Size = new System.Drawing.Size(533, 406); this.tvFolders.TabIndex = 3; this.tvFolders.DoubleClick += new System.EventHandler(this.tvFolders_DoubleClick); // // cmStrip // this.cmStrip.ImageScalingSize = new System.Drawing.Size(20, 20); this.cmStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.openFolderToolStripMenuItem, this.scanOnlyThisDirectoryToolStripMenuItem, this.toolStripSeparator4, this.toolStripExpandAll, this.toolStripCollapseAll, this.toolStripSeparator1, this.protectFolderFromBeingDeletedToolStripMenuItem, this.unprotectFolderToolStripMenuItem, this.toolStripSeparator3, this.proToolStripMenuItem, this.toolStripSeparator2, this.deleteToolStripMenuItem}); this.cmStrip.Name = "cmStrip"; this.cmStrip.RenderMode = System.Windows.Forms.ToolStripRenderMode.System; this.cmStrip.ShowImageMargin = false; this.cmStrip.Size = new System.Drawing.Size(202, 204); this.cmStrip.Opening += new System.ComponentModel.CancelEventHandler(this.cmStrip_Opening); // // openFolderToolStripMenuItem // this.openFolderToolStripMenuItem.Name = "openFolderToolStripMenuItem"; this.openFolderToolStripMenuItem.Size = new System.Drawing.Size(201, 22); this.openFolderToolStripMenuItem.Text = "&Open"; this.openFolderToolStripMenuItem.Click += new System.EventHandler(this.openFolderToolStripMenuItem_Click); // // scanOnlyThisDirectoryToolStripMenuItem // this.scanOnlyThisDirectoryToolStripMenuItem.Name = "scanOnlyThisDirectoryToolStripMenuItem"; this.scanOnlyThisDirectoryToolStripMenuItem.Size = new System.Drawing.Size(201, 22); this.scanOnlyThisDirectoryToolStripMenuItem.Text = "&Search only this directory"; this.scanOnlyThisDirectoryToolStripMenuItem.Click += new System.EventHandler(this.scanOnlyThisDirectoryToolStripMenuItem_Click); // // toolStripSeparator4 // this.toolStripSeparator4.Name = "toolStripSeparator4"; this.toolStripSeparator4.Size = new System.Drawing.Size(198, 6); // // toolStripExpandAll // this.toolStripExpandAll.Name = "toolStripExpandAll"; this.toolStripExpandAll.Size = new System.Drawing.Size(201, 22); this.toolStripExpandAll.Text = "&Expand all"; this.toolStripExpandAll.Click += new System.EventHandler(this.toolStripExpandAll_Click); // // toolStripCollapseAll // this.toolStripCollapseAll.Name = "toolStripCollapseAll"; this.toolStripCollapseAll.Size = new System.Drawing.Size(201, 22); this.toolStripCollapseAll.Text = "&Collapse all"; this.toolStripCollapseAll.Click += new System.EventHandler(this.toolStripCollapseAll_Click); // // toolStripSeparator1 // this.toolStripSeparator1.Name = "toolStripSeparator1"; this.toolStripSeparator1.Size = new System.Drawing.Size(198, 6); // // protectFolderFromBeingDeletedToolStripMenuItem // this.protectFolderFromBeingDeletedToolStripMenuItem.Name = "protectFolderFromBeingDeletedToolStripMenuItem"; this.protectFolderFromBeingDeletedToolStripMenuItem.Size = new System.Drawing.Size(201, 22); this.protectFolderFromBeingDeletedToolStripMenuItem.Text = "&Protect from deletion (once)"; this.protectFolderFromBeingDeletedToolStripMenuItem.Click += new System.EventHandler(this.protectFolderFromBeingDeletedToolStripMenuItem_Click); // // unprotectFolderToolStripMenuItem // this.unprotectFolderToolStripMenuItem.Name = "unprotectFolderToolStripMenuItem"; this.unprotectFolderToolStripMenuItem.Size = new System.Drawing.Size(201, 22); this.unprotectFolderToolStripMenuItem.Text = "&Unprotect"; this.unprotectFolderToolStripMenuItem.Click += new System.EventHandler(this.unprotectFolderToolStripMenuItem_Click); // // toolStripSeparator3 // this.toolStripSeparator3.Name = "toolStripSeparator3"; this.toolStripSeparator3.Size = new System.Drawing.Size(198, 6); // // proToolStripMenuItem // this.proToolStripMenuItem.Name = "proToolStripMenuItem"; this.proToolStripMenuItem.Size = new System.Drawing.Size(201, 22); this.proToolStripMenuItem.Text = "Add to permanent &ignore list"; this.proToolStripMenuItem.Click += new System.EventHandler(this.proToolStripMenuItem_Click); // // toolStripSeparator2 // this.toolStripSeparator2.Name = "toolStripSeparator2"; this.toolStripSeparator2.Size = new System.Drawing.Size(198, 6); // // deleteToolStripMenuItem // this.deleteToolStripMenuItem.Name = "deleteToolStripMenuItem"; this.deleteToolStripMenuItem.Size = new System.Drawing.Size(201, 22); this.deleteToolStripMenuItem.Text = "&Delete"; this.deleteToolStripMenuItem.Click += new System.EventHandler(this.deleteToolStripMenuItem_Click); // // btnExit // this.btnExit.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); this.btnExit.ImageKey = "exit"; this.btnExit.ImageList = this.ilFolderIcons; this.btnExit.Location = new System.Drawing.Point(558, 498); this.btnExit.Name = "btnExit"; this.btnExit.Size = new System.Drawing.Size(126, 34); this.btnExit.TabIndex = 7; this.btnExit.Text = "&Exit"; this.btnExit.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; this.btnExit.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText; this.btnExit.UseVisualStyleBackColor = true; this.btnExit.Click += new System.EventHandler(this.btnExit_Click); // // tbFolder // this.tbFolder.AccessibleDescription = "Root directory"; this.tbFolder.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.tbFolder.Location = new System.Drawing.Point(14, 34); this.tbFolder.Name = "tbFolder"; this.tbFolder.Size = new System.Drawing.Size(533, 20); this.tbFolder.TabIndex = 1; this.tbFolder.Text = "C:\\"; this.tbFolder.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.tbFolder_MouseDoubleClick); // // btnChooseFolder // this.btnChooseFolder.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); this.btnChooseFolder.Location = new System.Drawing.Point(558, 33); this.btnChooseFolder.Name = "btnChooseFolder"; this.btnChooseFolder.Size = new System.Drawing.Size(126, 21); this.btnChooseFolder.TabIndex = 2; this.btnChooseFolder.Text = "Browse..."; this.btnChooseFolder.UseVisualStyleBackColor = true; this.btnChooseFolder.Click += new System.EventHandler(this.btnChooseFolder_Click); // // lblPickAFolder // this.lblPickAFolder.AutoSize = true; this.lblPickAFolder.Location = new System.Drawing.Point(10, 13); this.lblPickAFolder.Name = "lblPickAFolder"; this.lblPickAFolder.Size = new System.Drawing.Size(0, 13); this.lblPickAFolder.TabIndex = 3; // // tabSettings // this.tabSettings.Controls.Add(this.gbDeleteMode); this.tabSettings.Controls.Add(this.groupBoxExplorerIntegration); this.tabSettings.Controls.Add(this.gbOptions); this.tabSettings.ImageKey = "preferences"; this.tabSettings.Location = new System.Drawing.Point(4, 27); this.tabSettings.Name = "tabSettings"; this.tabSettings.Padding = new System.Windows.Forms.Padding(3); this.tabSettings.Size = new System.Drawing.Size(698, 544); this.tabSettings.TabIndex = 1; this.tabSettings.Text = "Settings"; this.tabSettings.ToolTipText = "Application settings"; this.tabSettings.UseVisualStyleBackColor = true; // // gbDeleteMode // this.gbDeleteMode.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.gbDeleteMode.Controls.Add(this.label15); this.gbDeleteMode.Controls.Add(this.cbDeleteMode); this.gbDeleteMode.Location = new System.Drawing.Point(14, 358); this.gbDeleteMode.Name = "gbDeleteMode"; this.gbDeleteMode.Size = new System.Drawing.Size(669, 84); this.gbDeleteMode.TabIndex = 20; this.gbDeleteMode.TabStop = false; this.gbDeleteMode.Text = "Delete mode"; // // label15 // this.label15.AutoSize = true; this.label15.Location = new System.Drawing.Point(16, 27); this.label15.Name = "label15"; this.label15.Size = new System.Drawing.Size(204, 13); this.label15.TabIndex = 14; this.label15.Text = "How should empty directories be deleted?"; // // cbDeleteMode // this.cbDeleteMode.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.cbDeleteMode.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; this.cbDeleteMode.FormattingEnabled = true; this.cbDeleteMode.Location = new System.Drawing.Point(19, 45); this.cbDeleteMode.Name = "cbDeleteMode"; this.cbDeleteMode.Size = new System.Drawing.Size(631, 21); this.cbDeleteMode.TabIndex = 7; // // groupBoxExplorerIntegration // this.groupBoxExplorerIntegration.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.groupBoxExplorerIntegration.Controls.Add(this.lblReqAdmin); this.groupBoxExplorerIntegration.Controls.Add(this.btnExplorerRemove); this.groupBoxExplorerIntegration.Controls.Add(this.btnExplorerIntegrate); this.groupBoxExplorerIntegration.Controls.Add(this.label16); this.groupBoxExplorerIntegration.Location = new System.Drawing.Point(14, 461); this.groupBoxExplorerIntegration.Name = "groupBoxExplorerIntegration"; this.groupBoxExplorerIntegration.Size = new System.Drawing.Size(669, 71); this.groupBoxExplorerIntegration.TabIndex = 14; this.groupBoxExplorerIntegration.TabStop = false; this.groupBoxExplorerIntegration.Text = "Windows Explorer integration"; // // lblReqAdmin // this.lblReqAdmin.AutoSize = true; this.lblReqAdmin.ForeColor = System.Drawing.SystemColors.GrayText; this.lblReqAdmin.Location = new System.Drawing.Point(16, 43); this.lblReqAdmin.Name = "lblReqAdmin"; this.lblReqAdmin.Size = new System.Drawing.Size(314, 13); this.lblReqAdmin.TabIndex = 26; this.lblReqAdmin.Text = "You need to start the application as an Admin user to change this"; // // btnExplorerRemove // this.btnExplorerRemove.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); this.btnExplorerRemove.Location = new System.Drawing.Point(532, 24); this.btnExplorerRemove.Name = "btnExplorerRemove"; this.btnExplorerRemove.Size = new System.Drawing.Size(119, 34); this.btnExplorerRemove.TabIndex = 25; this.btnExplorerRemove.Text = "Uninstall"; this.btnExplorerRemove.UseVisualStyleBackColor = true; this.btnExplorerRemove.Click += new System.EventHandler(this.btnExplorerRemove_Click); // // btnExplorerIntegrate // this.btnExplorerIntegrate.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); this.btnExplorerIntegrate.Location = new System.Drawing.Point(407, 24); this.btnExplorerIntegrate.Name = "btnExplorerIntegrate"; this.btnExplorerIntegrate.Size = new System.Drawing.Size(119, 34); this.btnExplorerIntegrate.TabIndex = 24; this.btnExplorerIntegrate.Text = "Install"; this.btnExplorerIntegrate.UseVisualStyleBackColor = true; this.btnExplorerIntegrate.Click += new System.EventHandler(this.btnExplorerIntegrate_Click); // // label16 // this.label16.AutoSize = true; this.label16.Location = new System.Drawing.Point(16, 24); this.label16.Name = "label16"; this.label16.Size = new System.Drawing.Size(268, 13); this.label16.TabIndex = 14; this.label16.Text = "Integrate RED into the Windows Explorer context menu"; // // gbOptions // this.gbOptions.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.gbOptions.Controls.Add(this.label25); this.gbOptions.Controls.Add(this.label11); this.gbOptions.Controls.Add(this.label21); this.gbOptions.Controls.Add(this.cbFastSearchMode); this.gbOptions.Controls.Add(this.cbHideScanErrors); this.gbOptions.Controls.Add(this.cbIgnoreErrors); this.gbOptions.Controls.Add(this.cbClipboardDetection); this.gbOptions.Controls.Add(this.cbIgnoreHiddenFolders); this.gbOptions.Controls.Add(this.cbIgnore0kbFiles); this.gbOptions.Location = new System.Drawing.Point(14, 12); this.gbOptions.Name = "gbOptions"; this.gbOptions.Size = new System.Drawing.Size(669, 330); this.gbOptions.TabIndex = 19; this.gbOptions.TabStop = false; this.gbOptions.Text = "General options"; // // label25 // this.label25.AutoSize = true; this.label25.ForeColor = System.Drawing.SystemColors.GrayText; this.label25.Location = new System.Drawing.Point(36, 170); this.label25.Name = "label25"; this.label25.Size = new System.Drawing.Size(439, 26); this.label25.TabIndex = 22; this.label25.Text = "Whenever you start or switch into the application it will check if your clipboard" + " contains\r\na path to a directory (e.g. C:/test) and if it detects a directory it" + " will use it as the root directory"; // // label11 // this.label11.AutoSize = true; this.label11.ForeColor = System.Drawing.SystemColors.GrayText; this.label11.Location = new System.Drawing.Point(36, 53); this.label11.Name = "label11"; this.label11.Size = new System.Drawing.Size(409, 13); this.label11.TabIndex = 20; this.label11.Text = "An empty file means files with zero bytes this option also applies to multiple em" + "pty files."; // // label21 // this.label21.AutoSize = true; this.label21.ForeColor = System.Drawing.SystemColors.GrayText; this.label21.Location = new System.Drawing.Point(36, 105); this.label21.Name = "label21"; this.label21.Size = new System.Drawing.Size(586, 26); this.label21.TabIndex = 19; this.label21.Text = resources.GetString("label21.Text"); // // cbFastSearchMode // this.cbFastSearchMode.AutoSize = true; this.cbFastSearchMode.Location = new System.Drawing.Point(19, 86); this.cbFastSearchMode.Name = "cbFastSearchMode"; this.cbFastSearchMode.Size = new System.Drawing.Size(75, 17); this.cbFastSearchMode.TabIndex = 18; this.cbFastSearchMode.Text = "Fast mode"; this.cbFastSearchMode.UseVisualStyleBackColor = true; // // cbHideScanErrors // this.cbHideScanErrors.AutoSize = true; this.cbHideScanErrors.Location = new System.Drawing.Point(19, 288); this.cbHideScanErrors.Name = "cbHideScanErrors"; this.cbHideScanErrors.Size = new System.Drawing.Size(238, 17); this.cbHideScanErrors.TabIndex = 16; this.cbHideScanErrors.Tag = "hide_scan_errors"; this.cbHideScanErrors.Text = "Hide search errors (like access denied errors)"; this.cbHideScanErrors.UseVisualStyleBackColor = true; // // cbIgnoreErrors // this.cbIgnoreErrors.AutoSize = true; this.cbIgnoreErrors.Location = new System.Drawing.Point(19, 252); this.cbIgnoreErrors.Name = "cbIgnoreErrors"; this.cbIgnoreErrors.Size = new System.Drawing.Size(157, 17); this.cbIgnoreErrors.TabIndex = 15; this.cbIgnoreErrors.Tag = "ignore_deletion_errors"; this.cbIgnoreErrors.Text = "Ignore errors during deletion\r\n"; this.cbIgnoreErrors.UseVisualStyleBackColor = true; // // cbClipboardDetection // this.cbClipboardDetection.AutoSize = true; this.cbClipboardDetection.Location = new System.Drawing.Point(19, 151); this.cbClipboardDetection.Name = "cbClipboardDetection"; this.cbClipboardDetection.Size = new System.Drawing.Size(162, 17); this.cbClipboardDetection.TabIndex = 5; this.cbClipboardDetection.Tag = "clipboard_detection"; this.cbClipboardDetection.Text = "Detect paths in the clipboard"; this.cbClipboardDetection.UseVisualStyleBackColor = true; // // cbIgnoreHiddenFolders // this.cbIgnoreHiddenFolders.AutoSize = true; this.cbIgnoreHiddenFolders.Location = new System.Drawing.Point(19, 216); this.cbIgnoreHiddenFolders.Name = "cbIgnoreHiddenFolders"; this.cbIgnoreHiddenFolders.Size = new System.Drawing.Size(142, 17); this.cbIgnoreHiddenFolders.TabIndex = 4; this.cbIgnoreHiddenFolders.Tag = "ignore_hidden"; this.cbIgnoreHiddenFolders.Text = "Ignore hidden directories"; this.cbIgnoreHiddenFolders.UseVisualStyleBackColor = true; // // cbIgnore0kbFiles // this.cbIgnore0kbFiles.AutoSize = true; this.cbIgnore0kbFiles.Checked = true; this.cbIgnore0kbFiles.CheckState = System.Windows.Forms.CheckState.Checked; this.cbIgnore0kbFiles.Location = new System.Drawing.Point(19, 34); this.cbIgnore0kbFiles.Name = "cbIgnore0kbFiles"; this.cbIgnore0kbFiles.Size = new System.Drawing.Size(268, 17); this.cbIgnore0kbFiles.TabIndex = 3; this.cbIgnore0kbFiles.Tag = "ignore_0kb_files"; this.cbIgnore0kbFiles.Text = "Directories with empty files will be considered empty"; this.cbIgnore0kbFiles.UseVisualStyleBackColor = true; // // tabIgnoreList // this.tabIgnoreList.Controls.Add(this.label22); this.tabIgnoreList.Controls.Add(this.tbIgnoreFolders); this.tabIgnoreList.Controls.Add(this.label10); this.tabIgnoreList.ImageKey = "filter"; this.tabIgnoreList.Location = new System.Drawing.Point(4, 27); this.tabIgnoreList.Name = "tabIgnoreList"; this.tabIgnoreList.Padding = new System.Windows.Forms.Padding(3); this.tabIgnoreList.Size = new System.Drawing.Size(698, 544); this.tabIgnoreList.TabIndex = 4; this.tabIgnoreList.Text = "Ignore list"; this.tabIgnoreList.UseVisualStyleBackColor = true; // // label22 // this.label22.AutoSize = true; this.label22.ForeColor = System.Drawing.SystemColors.GrayText; this.label22.Location = new System.Drawing.Point(14, 38); this.label22.Name = "label22"; this.label22.Size = new System.Drawing.Size(435, 13); this.label22.TabIndex = 14; this.label22.Text = "Use one item per line and you can specify a directory name or a full path like \"C" + ":/example\"."; // // tbIgnoreFolders // this.tbIgnoreFolders.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.tbIgnoreFolders.Font = new System.Drawing.Font("Lucida Console", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.tbIgnoreFolders.Location = new System.Drawing.Point(14, 64); this.tbIgnoreFolders.Multiline = true; this.tbIgnoreFolders.Name = "tbIgnoreFolders"; this.tbIgnoreFolders.ScrollBars = System.Windows.Forms.ScrollBars.Both; this.tbIgnoreFolders.Size = new System.Drawing.Size(668, 467); this.tbIgnoreFolders.TabIndex = 6; this.tbIgnoreFolders.WordWrap = false; // // label10 // this.label10.AutoSize = true; this.label10.Location = new System.Drawing.Point(14, 16); this.label10.Name = "label10"; this.label10.Size = new System.Drawing.Size(458, 13); this.label10.TabIndex = 13; this.label10.Text = "When a directory name matches an item of this list it will be skipped (including " + "all subdirectories)."; // // tabAdvanced // this.tabAdvanced.Controls.Add(this.gbAdvancedSettings); this.tabAdvanced.Controls.Add(this.btnResetConfig); this.tabAdvanced.Controls.Add(this.btnCopyDebugInfo); this.tabAdvanced.Controls.Add(this.gbIgnoreFilenames); this.tabAdvanced.Controls.Add(this.label8); this.tabAdvanced.ImageKey = "(none)"; this.tabAdvanced.Location = new System.Drawing.Point(4, 27); this.tabAdvanced.Name = "tabAdvanced"; this.tabAdvanced.Padding = new System.Windows.Forms.Padding(3); this.tabAdvanced.Size = new System.Drawing.Size(698, 544); this.tabAdvanced.TabIndex = 3; this.tabAdvanced.Text = "Advanced settings"; this.tabAdvanced.UseVisualStyleBackColor = true; // // gbAdvancedSettings // this.gbAdvancedSettings.Controls.Add(this.label20); this.gbAdvancedSettings.Controls.Add(this.label26); this.gbAdvancedSettings.Controls.Add(this.label27); this.gbAdvancedSettings.Controls.Add(this.label19); this.gbAdvancedSettings.Controls.Add(this.cbKeepSystemFolders); this.gbAdvancedSettings.Controls.Add(this.nuFolderAge); this.gbAdvancedSettings.Controls.Add(this.label7); this.gbAdvancedSettings.Controls.Add(this.label24); this.gbAdvancedSettings.Controls.Add(this.nuPause); this.gbAdvancedSettings.Controls.Add(this.nuMaxDepth); this.gbAdvancedSettings.Controls.Add(this.label4); this.gbAdvancedSettings.Controls.Add(this.label3); this.gbAdvancedSettings.Controls.Add(this.nuInfiniteLoopDetectionCount); this.gbAdvancedSettings.Location = new System.Drawing.Point(15, 17); this.gbAdvancedSettings.Name = "gbAdvancedSettings"; this.gbAdvancedSettings.Size = new System.Drawing.Size(668, 160); this.gbAdvancedSettings.TabIndex = 30; this.gbAdvancedSettings.TabStop = false; this.gbAdvancedSettings.Text = "Advanced settings"; // // label20 // this.label20.AutoSize = true; this.label20.ForeColor = System.Drawing.SystemColors.GrayText; this.label20.Location = new System.Drawing.Point(16, 134); this.label20.Name = "label20"; this.label20.Size = new System.Drawing.Size(314, 13); this.label20.TabIndex = 19; this.label20.Text = "This gives you time to stop the process but is not really necessary"; // // label26 // this.label26.AutoSize = true; this.label26.ForeColor = System.Drawing.SystemColors.GrayText; this.label26.Location = new System.Drawing.Point(357, 79); this.label26.Name = "label26"; this.label26.Size = new System.Drawing.Size(246, 13); this.label26.TabIndex = 28; this.label26.Text = "This allows you to ignore freshly created directories"; // // label27 // this.label27.AutoSize = true; this.label27.ForeColor = System.Drawing.SystemColors.GrayText; this.label27.Location = new System.Drawing.Point(16, 78); this.label27.Name = "label27"; this.label27.Size = new System.Drawing.Size(259, 13); this.label27.TabIndex = 29; this.label27.Text = "RED will only able to find empty directories that are N "; // // label19 // this.label19.AutoSize = true; this.label19.Location = new System.Drawing.Point(357, 56); this.label19.Name = "label19"; this.label19.Size = new System.Drawing.Size(167, 13); this.label19.TabIndex = 26; this.label19.Text = "Skip folders less than N hours old:"; // // cbKeepSystemFolders // this.cbKeepSystemFolders.AutoSize = true; this.cbKeepSystemFolders.Checked = true; this.cbKeepSystemFolders.CheckState = System.Windows.Forms.CheckState.Checked; this.cbKeepSystemFolders.Location = new System.Drawing.Point(248, 26); this.cbKeepSystemFolders.Name = "cbKeepSystemFolders"; this.cbKeepSystemFolders.Size = new System.Drawing.Size(15, 14); this.cbKeepSystemFolders.TabIndex = 2; this.cbKeepSystemFolders.Tag = "keep_system_dirs"; this.cbKeepSystemFolders.UseVisualStyleBackColor = true; // // nuFolderAge // this.nuFolderAge.Location = new System.Drawing.Point(588, 52); this.nuFolderAge.Margin = new System.Windows.Forms.Padding(2); this.nuFolderAge.Maximum = new decimal(new int[] { 96, 0, 0, 0}); this.nuFolderAge.Name = "nuFolderAge"; this.nuFolderAge.Size = new System.Drawing.Size(53, 20); this.nuFolderAge.TabIndex = 25; // // label7 // this.label7.AutoSize = true; this.label7.Location = new System.Drawing.Point(16, 113); this.label7.Name = "label7"; this.label7.Size = new System.Drawing.Size(218, 13); this.label7.TabIndex = 17; this.label7.Text = "Pause between each deletion in milliseconds"; // // label24 // this.label24.AutoSize = true; this.label24.Location = new System.Drawing.Point(16, 26); this.label24.Name = "label24"; this.label24.Size = new System.Drawing.Size(190, 13); this.label24.TabIndex = 27; this.label24.Text = "Skip system directories (recommended)"; // // nuPause // this.nuPause.Location = new System.Drawing.Point(249, 109); this.nuPause.Maximum = new decimal(new int[] { 999999, 0, 0, 0}); this.nuPause.Name = "nuPause"; this.nuPause.Size = new System.Drawing.Size(53, 20); this.nuPause.TabIndex = 8; // // nuMaxDepth // this.nuMaxDepth.Location = new System.Drawing.Point(249, 52); this.nuMaxDepth.Maximum = new decimal(new int[] { 10000000, 0, 0, 0}); this.nuMaxDepth.Minimum = new decimal(new int[] { 1, 0, 0, -2147483648}); this.nuMaxDepth.Name = "nuMaxDepth"; this.nuMaxDepth.Size = new System.Drawing.Size(53, 20); this.nuMaxDepth.TabIndex = 7; this.nuMaxDepth.Value = new decimal(new int[] { 1, 0, 0, -2147483648}); // // label4 // this.label4.AutoSize = true; this.label4.Location = new System.Drawing.Point(357, 119); this.label4.Name = "label4"; this.label4.Size = new System.Drawing.Size(200, 13); this.label4.TabIndex = 20; this.label4.Text = "Infinite-loop detection: Stop after N errors"; // // label3 // this.label3.AutoSize = true; this.label3.Location = new System.Drawing.Point(16, 56); this.label3.Name = "label3"; this.label3.Size = new System.Drawing.Size(200, 13); this.label3.TabIndex = 13; this.label3.Text = "Max directory nesting depth (-1 = infinite):"; // // nuInfiniteLoopDetectionCount // this.nuInfiniteLoopDetectionCount.Location = new System.Drawing.Point(588, 115); this.nuInfiniteLoopDetectionCount.Maximum = new decimal(new int[] { 999999, 0, 0, 0}); this.nuInfiniteLoopDetectionCount.Name = "nuInfiniteLoopDetectionCount"; this.nuInfiniteLoopDetectionCount.Size = new System.Drawing.Size(53, 20); this.nuInfiniteLoopDetectionCount.TabIndex = 21; this.nuInfiniteLoopDetectionCount.Value = new decimal(new int[] { 10, 0, 0, 0}); // // btnResetConfig // this.btnResetConfig.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); this.btnResetConfig.Location = new System.Drawing.Point(318, 505); this.btnResetConfig.Name = "btnResetConfig"; this.btnResetConfig.Size = new System.Drawing.Size(183, 27); this.btnResetConfig.TabIndex = 23; this.btnResetConfig.Text = "Reset settings to default values"; this.btnResetConfig.UseVisualStyleBackColor = true; this.btnResetConfig.Click += new System.EventHandler(this.btnResetConfig_Click); // // btnCopyDebugInfo // this.btnCopyDebugInfo.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); this.btnCopyDebugInfo.Location = new System.Drawing.Point(15, 505); this.btnCopyDebugInfo.Name = "btnCopyDebugInfo"; this.btnCopyDebugInfo.Size = new System.Drawing.Size(297, 27); this.btnCopyDebugInfo.TabIndex = 24; this.btnCopyDebugInfo.Text = "Copy debugging information to clipboard (for error reports)"; this.btnCopyDebugInfo.UseVisualStyleBackColor = true; this.btnCopyDebugInfo.Click += new System.EventHandler(this.btnCopyDebugInfo_Click); // // gbIgnoreFilenames // this.gbIgnoreFilenames.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.gbIgnoreFilenames.Controls.Add(this.label23); this.gbIgnoreFilenames.Controls.Add(this.label14); this.gbIgnoreFilenames.Controls.Add(this.tbIgnoreFiles); this.gbIgnoreFilenames.Controls.Add(this.label2); this.gbIgnoreFilenames.Location = new System.Drawing.Point(15, 194); this.gbIgnoreFilenames.Name = "gbIgnoreFilenames"; this.gbIgnoreFilenames.Size = new System.Drawing.Size(668, 303); this.gbIgnoreFilenames.TabIndex = 20; this.gbIgnoreFilenames.TabStop = false; this.gbIgnoreFilenames.Text = "Filenames to ignore"; // // label23 // this.label23.AutoSize = true; this.label23.Location = new System.Drawing.Point(15, 60); this.label23.Name = "label23"; this.label23.Size = new System.Drawing.Size(357, 78); this.label23.TabIndex = 13; this.label23.Text = resources.GetString("label23.Text"); // // label14 // this.label14.AutoSize = true; this.label14.BackColor = System.Drawing.SystemColors.Info; this.label14.ForeColor = System.Drawing.Color.DarkRed; this.label14.Location = new System.Drawing.Point(484, 64); this.label14.Name = "label14"; this.label14.Padding = new System.Windows.Forms.Padding(5); this.label14.Size = new System.Drawing.Size(165, 62); this.label14.TabIndex = 12; this.label14.Text = "Warning: Use this feature with \r\ncare, a bad pattern could \r\npotentially cause a" + "ccidental \r\ndeletion of important files."; this.label14.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; // // tbIgnoreFiles // this.tbIgnoreFiles.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.tbIgnoreFiles.Font = new System.Drawing.Font("Lucida Console", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.tbIgnoreFiles.Location = new System.Drawing.Point(18, 150); this.tbIgnoreFiles.Multiline = true; this.tbIgnoreFiles.Name = "tbIgnoreFiles"; this.tbIgnoreFiles.ScrollBars = System.Windows.Forms.ScrollBars.Both; this.tbIgnoreFiles.Size = new System.Drawing.Size(631, 139); this.tbIgnoreFiles.TabIndex = 5; this.tbIgnoreFiles.WordWrap = false; // // label2 // this.label2.AutoSize = true; this.label2.Location = new System.Drawing.Point(15, 23); this.label2.Name = "label2"; this.label2.Size = new System.Drawing.Size(546, 26); this.label2.TabIndex = 10; this.label2.Text = resources.GetString("label2.Text"); // // label8 // this.label8.AutoSize = true; this.label8.Location = new System.Drawing.Point(318, 119); this.label8.Name = "label8"; this.label8.Size = new System.Drawing.Size(20, 13); this.label8.TabIndex = 18; this.label8.Text = "ms"; // // tabAbout // this.tabAbout.Controls.Add(this.llGithub); this.tabAbout.Controls.Add(this.linkLabel2); this.tabAbout.Controls.Add(this.linkLabel1); this.tabAbout.Controls.Add(this.tbCredits); this.tabAbout.Controls.Add(this.lblRedStats); this.tabAbout.Controls.Add(this.label5); this.tabAbout.Controls.Add(this.llWebsite); this.tabAbout.Controls.Add(this.lbAppTitle); this.tabAbout.ImageKey = "help"; this.tabAbout.Location = new System.Drawing.Point(4, 27); this.tabAbout.Name = "tabAbout"; this.tabAbout.Size = new System.Drawing.Size(698, 544); this.tabAbout.TabIndex = 2; this.tabAbout.Text = "About"; this.tabAbout.ToolTipText = "Shows the help and about screen"; this.tabAbout.UseVisualStyleBackColor = true; // // llGithub // this.llGithub.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); this.llGithub.AutoSize = true; this.llGithub.Location = new System.Drawing.Point(11, 103); this.llGithub.Name = "llGithub"; this.llGithub.Size = new System.Drawing.Size(38, 13); this.llGithub.TabIndex = 28; this.llGithub.TabStop = true; this.llGithub.Text = "Github"; this.llGithub.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.llGithub_LinkClicked); // // linkLabel2 // this.linkLabel2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); this.linkLabel2.AutoSize = true; this.linkLabel2.Location = new System.Drawing.Point(134, 103); this.linkLabel2.Name = "linkLabel2"; this.linkLabel2.Size = new System.Drawing.Size(128, 13); this.linkLabel2.TabIndex = 27; this.linkLabel2.TabStop = true; this.linkLabel2.Text = "Feedback / Report a bug"; this.linkLabel2.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkLabel2_LinkClicked_1); // // linkLabel1 // this.linkLabel1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); this.linkLabel1.AutoSize = true; this.linkLabel1.Location = new System.Drawing.Point(134, 81); this.linkLabel1.Name = "linkLabel1"; this.linkLabel1.Size = new System.Drawing.Size(94, 13); this.linkLabel1.TabIndex = 26; this.linkLabel1.TabStop = true; this.linkLabel1.Text = "Check for updates"; this.linkLabel1.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkLabel1_LinkClicked); // // tbCredits // this.tbCredits.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.tbCredits.Font = new System.Drawing.Font("Lucida Console", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.tbCredits.Location = new System.Drawing.Point(14, 131); this.tbCredits.Multiline = true; this.tbCredits.Name = "tbCredits"; this.tbCredits.ReadOnly = true; this.tbCredits.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; this.tbCredits.Size = new System.Drawing.Size(669, 400); this.tbCredits.TabIndex = 25; this.tbCredits.Text = resources.GetString("tbCredits.Text"); this.tbCredits.WordWrap = false; // // lblRedStats // this.lblRedStats.AutoSize = true; this.lblRedStats.Location = new System.Drawing.Point(11, 56); this.lblRedStats.Name = "lblRedStats"; this.lblRedStats.Size = new System.Drawing.Size(165, 13); this.lblRedStats.TabIndex = 20; this.lblRedStats.Text = "{Deleted N dirs placeholder label}"; // // label5 // this.label5.AutoSize = true; this.label5.Font = new System.Drawing.Font("Arial", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.label5.Location = new System.Drawing.Point(11, 36); this.label5.Name = "label5"; this.label5.Size = new System.Drawing.Size(304, 14); this.label5.TabIndex = 5; this.label5.Text = "Created by Jonas John and a some contributors (see Github)."; // // llWebsite // this.llWebsite.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); this.llWebsite.AutoSize = true; this.llWebsite.Location = new System.Drawing.Point(11, 81); this.llWebsite.Name = "llWebsite"; this.llWebsite.Size = new System.Drawing.Size(93, 13); this.llWebsite.TabIndex = 19; this.llWebsite.TabStop = true; this.llWebsite.Text = "Project homepage\r\n"; this.llWebsite.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.llWebsite_LinkClicked); // // lbAppTitle // this.lbAppTitle.AutoSize = true; this.lbAppTitle.Font = new System.Drawing.Font("Arial", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.lbAppTitle.ForeColor = System.Drawing.SystemColors.ControlText; this.lbAppTitle.Location = new System.Drawing.Point(11, 15); this.lbAppTitle.Name = "lbAppTitle"; this.lbAppTitle.Size = new System.Drawing.Size(213, 15); this.lbAppTitle.TabIndex = 0; this.lbAppTitle.Text = "Remove Empty Directories - Version "; // // MainWindow // this.AllowDrop = true; this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(724, 591); this.Controls.Add(this.tcMain); this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); this.Name = "MainWindow"; this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; this.Text = "Remove Empty Directories"; this.Activated += new System.EventHandler(this.fMain_Activated); this.Load += new System.EventHandler(this.fMain_Load); this.DragDrop += new System.Windows.Forms.DragEventHandler(this.fMain_DragDrop); this.DragEnter += new System.Windows.Forms.DragEventHandler(this.fMain_DragEnter); this.tcMain.ResumeLayout(false); this.tabSearch.ResumeLayout(false); this.tabSearch.PerformLayout(); this.pnlIcons.ResumeLayout(false); this.pnlIcons.PerformLayout(); this.cmStrip.ResumeLayout(false); this.tabSettings.ResumeLayout(false); this.gbDeleteMode.ResumeLayout(false); this.gbDeleteMode.PerformLayout(); this.groupBoxExplorerIntegration.ResumeLayout(false); this.groupBoxExplorerIntegration.PerformLayout(); this.gbOptions.ResumeLayout(false); this.gbOptions.PerformLayout(); this.tabIgnoreList.ResumeLayout(false); this.tabIgnoreList.PerformLayout(); this.tabAdvanced.ResumeLayout(false); this.tabAdvanced.PerformLayout(); this.gbAdvancedSettings.ResumeLayout(false); this.gbAdvancedSettings.PerformLayout(); ((System.ComponentModel.ISupportInitialize)(this.nuFolderAge)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.nuPause)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.nuMaxDepth)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.nuInfiniteLoopDetectionCount)).EndInit(); this.gbIgnoreFilenames.ResumeLayout(false); this.gbIgnoreFilenames.PerformLayout(); this.tabAbout.ResumeLayout(false); this.tabAbout.PerformLayout(); this.ResumeLayout(false); } #endregion private System.Windows.Forms.TabControl tcMain; private System.Windows.Forms.TabPage tabAbout; private System.Windows.Forms.Label lbAppTitle; private System.Windows.Forms.CheckBox cbIgnore0kbFiles; private System.Windows.Forms.Label label2; private System.Windows.Forms.TextBox tbIgnoreFiles; private System.Windows.Forms.CheckBox cbKeepSystemFolders; private System.Windows.Forms.CheckBox cbIgnoreHiddenFolders; private System.Windows.Forms.Label label3; private System.Windows.Forms.TabPage tabSearch; private System.Windows.Forms.Label lbStatus; private System.Windows.Forms.ProgressBar pbProgressStatus; private System.Windows.Forms.TreeView tvFolders; private System.Windows.Forms.Button btnExit; private System.Windows.Forms.Button btnCancel; private System.Windows.Forms.TextBox tbFolder; private System.Windows.Forms.Button btnChooseFolder; private System.Windows.Forms.Label lblPickAFolder; private System.Windows.Forms.Button btnScan; private System.Windows.Forms.Button btnDelete; private System.Windows.Forms.LinkLabel llWebsite; private System.Windows.Forms.Label label5; private System.Windows.Forms.Label label6; private System.Windows.Forms.NumericUpDown nuMaxDepth; private System.Windows.Forms.Label label7; private System.Windows.Forms.NumericUpDown nuPause; private System.Windows.Forms.Label label8; private System.Windows.Forms.GroupBox gbIgnoreFilenames; private System.Windows.Forms.GroupBox gbOptions; private System.Windows.Forms.TextBox tbIgnoreFolders; private System.Windows.Forms.Label label10; private System.Windows.Forms.ImageList ilFolderIcons; private System.Windows.Forms.Panel pnlIcons; private System.Windows.Forms.Label label12; private System.Windows.Forms.Label label17; private System.Windows.Forms.Panel panel1; private System.Windows.Forms.Label label18; private System.Windows.Forms.Panel panel2; private System.Windows.Forms.Panel panel3; private System.Windows.Forms.Label lblRedStats; private System.Windows.Forms.Label label1; private System.Windows.Forms.Panel panel5; private System.Windows.Forms.ContextMenuStrip cmStrip; private System.Windows.Forms.ToolStripMenuItem openFolderToolStripMenuItem; private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; private System.Windows.Forms.ToolStripMenuItem protectFolderFromBeingDeletedToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem unprotectFolderToolStripMenuItem; private System.Windows.Forms.ToolStripSeparator toolStripSeparator2; private System.Windows.Forms.ToolStripMenuItem proToolStripMenuItem; private System.Windows.Forms.CheckBox cbClipboardDetection; private System.Windows.Forms.Button btnShowLog; private System.Windows.Forms.ComboBox cbDeleteMode; private System.Windows.Forms.Label label15; private System.Windows.Forms.TextBox tbCredits; private System.Windows.Forms.LinkLabel linkLabel1; private System.Windows.Forms.CheckBox cbIgnoreErrors; private System.Windows.Forms.Label label20; private System.Windows.Forms.ToolStripSeparator toolStripSeparator3; private System.Windows.Forms.ToolStripMenuItem deleteToolStripMenuItem; private System.Windows.Forms.Label label4; private System.Windows.Forms.NumericUpDown nuInfiniteLoopDetectionCount; private System.Windows.Forms.Label label14; private System.Windows.Forms.Button btnResetConfig; private System.Windows.Forms.ToolStripMenuItem scanOnlyThisDirectoryToolStripMenuItem; private System.Windows.Forms.GroupBox groupBoxExplorerIntegration; private System.Windows.Forms.Button btnExplorerRemove; private System.Windows.Forms.Button btnExplorerIntegrate; private System.Windows.Forms.Label label16; private System.Windows.Forms.Label lblReqAdmin; private System.Windows.Forms.CheckBox cbHideScanErrors; private System.Windows.Forms.LinkLabel linkLabel2; private System.Windows.Forms.Button btnCopyDebugInfo; private System.Windows.Forms.Label label19; private System.Windows.Forms.NumericUpDown nuFolderAge; private System.Windows.Forms.CheckBox cbFastSearchMode; private System.Windows.Forms.TabPage tabAdvanced; private System.Windows.Forms.Label label21; private System.Windows.Forms.TabPage tabIgnoreList; private System.Windows.Forms.Label label22; private System.Windows.Forms.Label label11; private System.Windows.Forms.GroupBox gbDeleteMode; private System.Windows.Forms.Label label23; private System.Windows.Forms.ToolStripSeparator toolStripSeparator4; private System.Windows.Forms.ToolStripMenuItem toolStripExpandAll; private System.Windows.Forms.ToolStripMenuItem toolStripCollapseAll; private System.Windows.Forms.Label label25; private System.Windows.Forms.Label label26; private System.Windows.Forms.Label label24; private System.Windows.Forms.Label label27; private System.Windows.Forms.LinkLabel llGithub; private System.Windows.Forms.Label lbFastModeInfo; private System.Windows.Forms.TabPage tabSettings; private System.Windows.Forms.GroupBox gbAdvancedSettings; } } ================================================ FILE: RED2/MainWindow.cs ================================================ using System; using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics; using System.Drawing; using System.Reflection; using System.Security.Principal; using System.Windows.Forms; using Alphaleonis.Win32.Filesystem; namespace RED2 { public partial class MainWindow : Form { private REDCore core = null; private TreeManager tree = null; private RuntimeData Data = new RuntimeData(); private Stopwatch runtimeWatch = new Stopwatch(); #region Init methods /// /// Constructor /// public MainWindow() { InitializeComponent(); } /// /// On load /// private void fMain_Load(object sender, EventArgs e) { #region Init RED core this.core = new REDCore(this, this.Data); // Attach events this.core.OnError += new EventHandler(core_OnError); this.core.OnCancelled += new EventHandler(core_OnCancelled); this.core.OnAborted += new EventHandler(core_OnAborted); this.core.OnProgressChanged += new EventHandler(core_OnProgressChanged); this.core.OnFoundEmptyDirectory += new EventHandler(core_OnFoundEmptyDir); this.core.OnFinishedScanForEmptyDirs += new EventHandler(core_OnFoundFinishedScanForEmptyDirs); this.core.OnDeleteProcessChanged += new EventHandler(core_OnDeleteProcessChanged); this.core.OnDeleteProcessFinished += new EventHandler(core_OnDeleteProcessFinished); this.core.OnDeleteError += new EventHandler(core_OnDeleteError); #endregion // Subscribe to settings events Properties.Settings.Default.PropertyChanged += new PropertyChangedEventHandler(Default_PropertyChanged); Properties.Settings.Default.SettingChanging += new System.Configuration.SettingChangingEventHandler(Default_SettingChanging); // Init tree manager / helper this.tree = new TreeManager(this.tvFolders, this.lbFastModeInfo); this.tree.SetFastMode(Properties.Settings.Default.fast_search_mode); this.tree.OnProtectionStatusChanged += new EventHandler(tree_OnProtectionStatusChanged); this.tree.OnDeleteRequest += new EventHandler(tree_OnDeleteRequest); this.bindConfigToControls(); // Update labels this.lblRedStats.Text = String.Format(RED2.Properties.Resources.red_deleted, Properties.Settings.Default.delete_stats); this.lbAppTitle.Text += string.Format("{0}", Assembly.GetExecutingAssembly().GetName().Version.ToString()); this.lbStatus.Text = ""; this.adminCheck(); UpdateContextMenu(cmStrip, false); this.pbProgressStatus.Maximum = 100; this.pbProgressStatus.Minimum = 0; this.pbProgressStatus.Step = 5; drawDirectoryIcons(); this.processCommandLineArgs(); } /// /// Bind config settings to UI controls /// private void bindConfigToControls() { this.tbFolder.DataBindings.Add("Text", Properties.Settings.Default, "last_used_directory"); this.cbFastSearchMode.DataBindings.Add("Checked", Properties.Settings.Default, "fast_search_mode"); this.cbIgnoreHiddenFolders.DataBindings.Add("Checked", Properties.Settings.Default, "dont_scan_hidden_folders"); this.cbIgnore0kbFiles.DataBindings.Add("Checked", Properties.Settings.Default, "ignore_0kb_files"); this.cbKeepSystemFolders.DataBindings.Add("Checked", Properties.Settings.Default, "keep_system_folders"); this.cbClipboardDetection.DataBindings.Add("Checked", Properties.Settings.Default, "clipboard_detection"); this.cbHideScanErrors.DataBindings.Add("Checked", Properties.Settings.Default, "hide_scan_errors"); this.tbIgnoreFiles.DataBindings.Add("Text", Properties.Settings.Default, "ignore_files"); this.tbIgnoreFolders.DataBindings.Add("Text", Properties.Settings.Default, "ignore_directories"); this.nuMaxDepth.DataBindings.Add("Value", Properties.Settings.Default, "max_depth"); this.nuInfiniteLoopDetectionCount.DataBindings.Add("Value", Properties.Settings.Default, "infinite_loop_detection_count"); this.nuPause.DataBindings.Add("Value", Properties.Settings.Default, "pause_between"); this.cbIgnoreErrors.DataBindings.Add("Checked", Properties.Settings.Default, "ignore_deletion_errors"); this.nuFolderAge.DataBindings.Add("Value", Properties.Settings.Default, "min_folder_age_hours"); // Populate delete mode item list foreach (var d in DeleteModeItem.GetList()) this.cbDeleteMode.Items.Add(new DeleteModeItem(d)); this.cbDeleteMode.DataBindings.Add("SelectedIndex", Properties.Settings.Default, "delete_mode"); } /// /// Check if we were started with admin rights /// private void adminCheck() { var principal = new WindowsPrincipal(WindowsIdentity.GetCurrent()); if (principal.IsInRole(WindowsBuiltInRole.Administrator)) { var isIntegrated = SystemFunctions.IsRegKeyIntegratedIntoWindowsExplorer(); this.btnExplorerIntegrate.Enabled = !isIntegrated; this.btnExplorerRemove.Enabled = isIntegrated; this.Text += " (Admin mode)"; this.lblReqAdmin.ForeColor = Color.DarkGray; } else { this.groupBoxExplorerIntegration.Enabled = false; // Highlight admin info text bold // Note: Changed it from red to bold because red looked like an error // but actually it's just an info message this.lblReqAdmin.Font = new Font(Label.DefaultFont, FontStyle.Bold); // this.btnExplorerIntegrate.Enabled = false; // this.btnExplorerRemove.Enabled = false; } } /// /// Read and apply command line arguments /// private void processCommandLineArgs() { string[] args = Environment.GetCommandLineArgs(); if (args.Length > 1) { args[0] = ""; var path = String.Join("", args).Replace("\"", "").Trim(); // add ending backslash if (!path.EndsWith("\\")) path += "\\"; Properties.Settings.Default.last_used_directory = path; } } void Default_SettingChanging(object sender, System.Configuration.SettingChangingEventArgs e) { if (e.SettingName == "keep_system_folders" && !(bool)e.NewValue) { if (MessageBox.Show(this, SystemFunctions.ConvertLineBreaks(RED2.Properties.Resources.warning_really_delete), RED2.Properties.Resources.warning, MessageBoxButtons.OKCancel, MessageBoxIcon.Asterisk) == DialogResult.Cancel) e.Cancel = true; } else if (e.SettingName == "fast_search_mode") { this.tree.SetFastMode((bool)e.NewValue); } } void Default_PropertyChanged(object sender, PropertyChangedEventArgs e) { // Save settings when any of them was changed Properties.Settings.Default.Save(); } private void drawDirectoryIcons() { #region Set and display folder status icons Dictionary icons = new Dictionary(); icons.Add("home", RED2.Properties.Resources.icon_root); icons.Add("folder", RED2.Properties.Resources.icon_default); icons.Add("folder_trash_files", RED2.Properties.Resources.icon_contains_trash); icons.Add("folder_hidden", RED2.Properties.Resources.icon_hidden_folder); icons.Add("folder_lock", RED2.Properties.Resources.icon_locked_folder); icons.Add("folder_warning", RED2.Properties.Resources.icon_warning); icons.Add("protected_icon", RED2.Properties.Resources.icon_protected_folder); icons.Add("deleted", RED2.Properties.Resources.icon_deleted_folder); int xpos = 6; int ypos = 30; foreach (string key in icons.Keys) { Image Icon = (Image)this.ilFolderIcons.Images[key]; PictureBox picIcon = new PictureBox(); picIcon.Image = Icon; picIcon.Location = new System.Drawing.Point(xpos, ypos); picIcon.Name = "picIcon"; picIcon.Size = new System.Drawing.Size(Icon.Width, Icon.Height); Label picLabel = new Label(); picLabel.Text = icons[key]; picLabel.Location = new System.Drawing.Point(xpos + Icon.Width + 2, ypos + 2); picLabel.Name = "picLabel"; this.pnlIcons.Controls.Add(picIcon); this.pnlIcons.Controls.Add(picLabel); ypos += Icon.Height + 6; } #endregion } #endregion #region Step 1: Scan for empty directories /// /// Starts the Scan-Progress /// private void btnScan_Click(object sender, EventArgs e) { // Check given folder DirectoryInfo selectedDirectory = null; try { selectedDirectory = new DirectoryInfo(this.tbFolder.Text); if (!selectedDirectory.Exists) { MessageBox.Show(this, RED2.Properties.Resources.error_dir_does_not_exist); return; } } catch (Exception ex) { MessageBox.Show(this, "The given directory caused a problem:" + Environment.NewLine + ex.Message, "RED error", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } this.Data.StartFolder = selectedDirectory; updateRuntimeDataObject(); this.pbProgressStatus.Style = ProgressBarStyle.Marquee; this.setProcessActiveLock(true); this.tree.OnSearchStart(this.Data.StartFolder); UpdateContextMenu(cmStrip, false); this.Data.AddLogSpacer(); setStatusAndLogMessage(RED2.Properties.Resources.searching_empty_folders); runtimeWatch.Reset(); runtimeWatch.Start(); this.core.SearchingForEmptyDirectories(); } void core_OnProgressChanged(object sender, ProgressChangedEventArgs e) { this.lbStatus.Text = (string)e.UserState; } void core_OnFoundEmptyDir(object sender, FoundEmptyDirInfoEventArgs e) { this.tree.AddOrUpdateDirectoryNode(e.Directory, e.Type, e.ErrorMessage); } void core_OnFoundFinishedScanForEmptyDirs(object sender, FinishedScanForEmptyDirsEventArgs e) { // Search finished runtimeWatch.Stop(); setStatusAndLogMessage(String.Format( RED2.Properties.Resources.found_x_empty_folders, e.EmptyFolderCount, e.FolderCount, runtimeWatch.Elapsed.Minutes, runtimeWatch.Elapsed.Seconds )); this.btnDelete.Enabled = (e.EmptyFolderCount > 0); this.pbProgressStatus.Style = ProgressBarStyle.Blocks; this.pbProgressStatus.Maximum = e.EmptyFolderCount; this.pbProgressStatus.Minimum = 0; this.pbProgressStatus.Value = this.pbProgressStatus.Maximum; this.pbProgressStatus.Step = 5; this.setProcessActiveLock(false); this.btnScan.Enabled = true; UpdateContextMenu(cmStrip, true); this.tree.OnSearchFinished(); this.btnScan.Text = RED2.Properties.Resources.btn_scan_again; } #endregion #region Step 2: Delete empty directories private void btnDelete_Click(object sender, EventArgs e) { this.Data.AddLogSpacer(); setStatusAndLogMessage(RED2.Properties.Resources.started_deletion_process); this.btnScan.Enabled = false; UpdateContextMenu(cmStrip, false); this.btnDelete.Enabled = false; this.setProcessActiveLock(true); updateRuntimeDataObject(); this.tree.OnDeletionProcessStart(); runtimeWatch.Reset(); runtimeWatch.Start(); this.core.StartDeleteProcess(); } private void updateRuntimeDataObject() { this.Data.IgnoreAllErrors = Properties.Settings.Default.ignore_deletion_errors; this.Data.IgnoreFiles = Properties.Settings.Default.ignore_files; this.Data.IgnoreDirectoriesList = Properties.Settings.Default.ignore_directories; this.Data.IgnoreEmptyFiles = Properties.Settings.Default.ignore_0kb_files; this.Data.IgnoreHiddenFolders = Properties.Settings.Default.dont_scan_hidden_folders; this.Data.KeepSystemFolders = Properties.Settings.Default.keep_system_folders; this.Data.HideScanErrors = Properties.Settings.Default.hide_scan_errors; this.Data.MinFolderAgeHours = Properties.Settings.Default.min_folder_age_hours; this.Data.MaxDepth = (int)Properties.Settings.Default.max_depth; this.Data.InfiniteLoopDetectionCount = (int)Properties.Settings.Default.infinite_loop_detection_count; this.Data.DeleteMode = (DeleteModes)Properties.Settings.Default.delete_mode; this.Data.PauseTime = (int)Properties.Settings.Default.pause_between; } private void core_OnDeleteProcessChanged(object sender, DeleteProcessUpdateEventArgs e) { switch (e.Status) { case DirectoryDeletionStatusTypes.Deleted: this.lbStatus.Text = String.Format(RED2.Properties.Resources.removing_empty_folders, (e.ProgressStatus + 1), e.FolderCount); this.tree.UpdateItemIcon(e.Path, DirectoryIcons.deleted); break; case DirectoryDeletionStatusTypes.Protected: this.tree.UpdateItemIcon(e.Path, DirectoryIcons.protected_icon); break; default: this.tree.UpdateItemIcon(e.Path, DirectoryIcons.folder_warning); break; } this.pbProgressStatus.Value = e.ProgressStatus; } private void core_OnDeleteError(object sender, DeletionErrorEventArgs e) { var errorDialog = new DeletionError(); errorDialog.SetPath(e.Path); errorDialog.SetErrorMessage(e.ErrorMessage); var dialogResult = errorDialog.ShowDialog(); errorDialog.Dispose(); if (dialogResult == DialogResult.Abort) { this.core.AbortDeletion(); } else { // Hack: retry means -> ignore all errors if (dialogResult == DialogResult.Retry) this.Data.IgnoreAllErrors = true; this.core.ContinueDeleteProcess(); } } private void core_OnDeleteProcessFinished(object sender, DeleteProcessFinishedEventArgs e) { runtimeWatch.Stop(); setStatusAndLogMessage( String.Format(RED2.Properties.Resources.delete_process_finished, e.DeletedFolderCount, e.FailedFolderCount, e.ProtectedCount, runtimeWatch.Elapsed.Minutes, runtimeWatch.Elapsed.Seconds) ); this.pbProgressStatus.Value = this.pbProgressStatus.Maximum; this.btnDelete.Enabled = false; this.btnScan.Enabled = true; this.setProcessActiveLock(false); // Increase deletion statistics (shown in about tab) Properties.Settings.Default.delete_stats += e.DeletedFolderCount; this.lblRedStats.Text = String.Format(RED2.Properties.Resources.red_deleted, Properties.Settings.Default.delete_stats); this.tree.OnDeletionProcessFinished(); } #endregion #region Process core events / callbacks private void core_OnCancelled(object sender, EventArgs e) { this.pbProgressStatus.Style = ProgressBarStyle.Blocks; if (this.core.CurrentProcessStep == WorkflowSteps.DeleteProcessRunning) setStatusAndLogMessage(RED2.Properties.Resources.deletion_aborted); else setStatusAndLogMessage(RED2.Properties.Resources.process_cancelled); this.btnScan.Enabled = true; this.btnDelete.Enabled = false; this.setProcessActiveLock(false); this.tree.OnProcessCancelled(); } private void core_OnAborted(object sender, EventArgs e) { this.pbProgressStatus.Style = ProgressBarStyle.Blocks; if (this.core.CurrentProcessStep == WorkflowSteps.DeleteProcessRunning) setStatusAndLogMessage(RED2.Properties.Resources.deletion_aborted); else setStatusAndLogMessage(RED2.Properties.Resources.process_aborted); this.btnScan.Enabled = true; this.btnDelete.Enabled = false; this.setProcessActiveLock(false); this.tree.OnProcessCancelled(); } private void core_OnError(object sender, ErrorEventArgs e) { this.pbProgressStatus.Style = ProgressBarStyle.Blocks; MessageBox.Show(this, "Error: " + e.Message, "RED error message"); } #endregion #region Tree view related methods /// /// User clicks twice on a folder /// private void tvFolders_DoubleClick(object sender, EventArgs e) { SystemFunctions.OpenDirectoryWithExplorer(this.tree.GetSelectedFolderPath()); } private void openFolderToolStripMenuItem_Click(object sender, EventArgs e) { SystemFunctions.OpenDirectoryWithExplorer(this.tree.GetSelectedFolderPath()); } private void scanOnlyThisDirectoryToolStripMenuItem_Click(object sender, EventArgs e) { Properties.Settings.Default.last_used_directory = this.tree.GetSelectedFolderPath(); this.btnScan.PerformClick(); } private void protectFolderFromBeingDeletedToolStripMenuItem_Click(object sender, EventArgs e) { this.tree.ProtectSelected(); } private void unprotectFolderToolStripMenuItem_Click(object sender, EventArgs e) { this.tree.UnprotectSelected(); } private void tree_OnProtectionStatusChanged(object sender, ProtectionStatusChangedEventArgs e) { if (e.Protected) this.core.AddProtectedFolder(e.Path); else this.core.RemoveProtected(e.Path); } private void proToolStripMenuItem_Click(object sender, EventArgs e) { if (this.tvFolders.SelectedNode == null) return; Properties.Settings.Default.ignore_directories += "\r\n" + ((DirectoryInfo)this.tvFolders.SelectedNode.Tag).FullName; // Focus third tab (Ignore list) this.tcMain.SelectedIndex = 2; // TODO: Update the results + tree to reflect the newly ignored item // Current solution: The user has to do a complete rescan this.btnDelete.Enabled = false; } private void deleteToolStripMenuItem_Click(object sender, EventArgs e) { this.tree.DeleteSelectedDirectory(); } private void tree_OnDeleteRequest(object sender, DeleteRequestFromTreeEventArgs e) { try { var deletePath = e.Directory; // To simplify the code here there is only the RecycleBinWithQuestion or simulate possible here // (all others will be ignored) SystemFunctions.ManuallyDeleteDirectory(deletePath, (DeleteModes)Properties.Settings.Default.delete_mode); // Remove root node this.tree.RemoveNode(deletePath); this.Data.AddLogMessage("Manually deleted: \"" + deletePath + "\" including all subdirectories"); // Disable the delete button because the user has to re-scan after he manually deleted a directory this.btnDelete.Enabled = false; } catch (System.OperationCanceledException) { // The user canceled the deletion } catch (Exception ex) { this.Data.AddLogMessage("Could not manually delete \"" + e.Directory + "\" because of the following error: " + ex.Message); MessageBox.Show(this, "The directory was not deleted, because of the following error:" + Environment.NewLine + ex.Message); } } private void toolStripExpandAll_Click(object sender, EventArgs e) { this.tvFolders.ExpandAll(); } private void toolStripCollapseAll_Click(object sender, EventArgs e) { this.tvFolders.CollapseAll(); } #endregion #region GUI related functions / events /// /// Locks various GUI elements when search or deletion is active /// /// private void setProcessActiveLock(bool isActive) { this.btnCancel.Enabled = isActive; this.btnShowLog.Enabled = !isActive; this.gbOptions.Enabled = !isActive; this.gbDeleteMode.Enabled = !isActive; this.tbIgnoreFolders.Enabled = !isActive; this.gbAdvancedSettings.Enabled = !isActive; this.gbIgnoreFilenames.Enabled = !isActive; this.btnResetConfig.Enabled = !isActive; } private void btnCancel_Click(object sender, EventArgs e) { this.core.CancelCurrentProcess(); } private void setStatusAndLogMessage(string msg) { this.lbStatus.Text = msg; this.Data.AddLogMessage(msg); } /// /// Part of the drag & drop functions /// (you can drag a folder into RED) /// private void fMain_DragDrop(object sender, DragEventArgs e) { string[] s = (string[])e.Data.GetData(DataFormats.FileDrop, false); if (s.Length == 1) Properties.Settings.Default.last_used_directory = s[0].Trim(); else MessageBox.Show(this, RED2.Properties.Resources.error_only_one_folder); } /// /// Part of the drag & drop functions /// (you can drag a folder into RED) /// private void fMain_DragEnter(object sender, DragEventArgs e) { if (!e.Data.GetDataPresent(DataFormats.FileDrop)) e.Effect = DragDropEffects.None; else e.Effect = DragDropEffects.Copy; } private void fMain_Activated(object sender, EventArgs e) { // Detect paths in the clipboard if (this.cbClipboardDetection.Checked && Clipboard.ContainsText(TextDataFormat.Text)) { var clipValue = Clipboard.GetText(TextDataFormat.Text); if (clipValue.Contains(":\\") && !clipValue.Contains("\n")) { // add ending backslash if (!clipValue.EndsWith("\\")) clipValue += "\\"; Properties.Settings.Default.last_used_directory = clipValue; } } } private void tbFolder_MouseDoubleClick(object sender, MouseEventArgs e) { this.tbFolder.SelectAll(); } private void btnExit_Click(object sender, EventArgs e) { this.Close(); } /// /// Let the user select a folder /// private void btnChooseFolder_Click(object sender, EventArgs e) { Properties.Settings.Default.last_used_directory = SystemFunctions.ChooseDirectoryDialog(Properties.Settings.Default.last_used_directory); } private void btnShowConfig_Click(object sender, EventArgs e) { SystemFunctions.OpenDirectoryWithExplorer(Application.StartupPath); } private void btnShowLog_Click(object sender, EventArgs e) { var logWindow = new LogWindow(); logWindow.SetLog(this.core.GetLogMessages()); logWindow.ShowDialog(); logWindow.Dispose(); } #endregion #region Config and misc stuff private void btnResetConfig_Click(object sender, EventArgs e) { if (MessageBox.Show(this, "Do you really want to reset all settings to the default values?", "Restore default settings", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning) == System.Windows.Forms.DialogResult.OK) { Properties.Settings.Default.Reset(); this.tree.SetFastMode(Properties.Settings.Default.fast_search_mode); } } private void btnExplorerIntegrate_Click(object sender, EventArgs e) { SystemFunctions.AddOrRemoveRegKey(true); this.btnExplorerRemove.Enabled = true; this.btnExplorerIntegrate.Enabled = false; } private void btnExplorerRemove_Click(object sender, EventArgs e) { SystemFunctions.AddOrRemoveRegKey(false); this.btnExplorerRemove.Enabled = false; this.btnExplorerIntegrate.Enabled = true; } private void llWebsite_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) { Process.Start("https://www.jonasjohn.de/lab/red.htm"); } private void llGithub_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) { Process.Start("https://github.com/hxseven/Remove-Empty-Directories"); } private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) { Process.Start(string.Format("https://www.jonasjohn.de/lab/check_update.php?p=red&version={0}", Assembly.GetExecutingAssembly().GetName().Version.ToString())); } private void linkLabel2_LinkClicked_1(object sender, LinkLabelLinkClickedEventArgs e) { Process.Start("https://www.jonasjohn.de/lab/red_feedback.htm"); } private void btnCopyDebugInfo_Click(object sender, EventArgs e) { var info = new System.Text.StringBuilder(); info.AppendLine("System info"); info.Append("- RED Version: "); try { info.AppendLine(string.Format("{0}", Assembly.GetExecutingAssembly().GetName().Version.ToString())); } catch (Exception ex) { info.AppendLine("Failed (" + ex.Message + ")"); } info.Append("- Operating System: "); try { info.AppendLine(System.Environment.OSVersion.ToString()); } catch (Exception ex) { info.AppendLine("Failed (" + ex.Message + ")"); } info.Append("- Processor architecture: "); try { info.AppendLine(Environment.GetEnvironmentVariable("PROCESSOR_ARCHITECTURE")); } catch (Exception ex) { info.AppendLine("Failed (" + ex.Message + ")"); } info.Append("- Is Administrator: "); try { var principal = new WindowsPrincipal(WindowsIdentity.GetCurrent()); info.AppendLine((principal.IsInRole(WindowsBuiltInRole.Administrator) ? "Yes" : "No")); } catch (Exception ex) { info.AppendLine("Failed (" + ex.Message + ")"); } info.AppendLine(""); info.AppendLine("RED Config settings: "); try { foreach (System.Configuration.SettingsProperty setting in Properties.Settings.Default.Properties) { var value = Properties.Settings.Default.PropertyValues[setting.Name].PropertyValue.ToString(); if (setting.Name == "ignore_files" || setting.Name == "ignore_directories") value = value.Replace("\r", "").Replace("\n", "\\n"); info.AppendLine("- " + setting.Name + ": " + value); } } catch (Exception ex) { info.AppendLine("Failed (" + ex.Message + ")"); } try { Clipboard.SetText(info.ToString(), TextDataFormat.Text); MessageBox.Show("Copied this text to your clipboard:" + Environment.NewLine + Environment.NewLine + info.ToString()); } catch (Exception ex) { MessageBox.Show("Sorry, could not copy the debug info into your clipboard because of this error: " + Environment.NewLine + ex.Message); } } private void cmStrip_Opening(object sender, CancelEventArgs e) { openFolderToolStripMenuItem.Enabled = tvFolders.SelectedNode != null; } /// /// Enables/disables all items in the context menu /// /// /// private void UpdateContextMenu(ContextMenuStrip contextMenuStrip, bool enable) { foreach (ToolStripItem item in contextMenuStrip.Items) item.Enabled = enable; } #endregion } } ================================================ FILE: RED2/MainWindow.resx ================================================ text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 14, 16 AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAA6 UQAAAk1TRnQBSQFMAgEBEQEAAewBAQHsAQEBEAEAARABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAFA AwABUAMAAQEBAAEgBgABUP8AKwADFAEcAzUBVgMMARD0AAMyAVAB1AHTAdIB/wKZAZgB+wMkATbwAAMy AVAB2QHYAdcB/wHCAcABvwH/AzIBUPAAAzIBUAHZAdgB1wH/AcIBwAG/Af8DMgFQ8AADMwFSAdsB2gHZ Af8BwgHBAb8B/wMzAVLsAAMBAQIDUgGpAd0B2wHaAf8BwgHBAcAB/wNSAakDAQEC6AADPwFsAbkBuAG2 Af8B3QHcAdoB/wHCAcEBwAH/AZ8BnQGcAf8DQAFu5AADKQE+AZABjwGOAfsBvAG7AbkB/wHdAdwB2gH/ AcIBwQHAAf8BogGgAZ4B/wF/AXcBcwH7AykBPtwAAxQBHANnAekBnQGbAZoB/wG8AbsBuQH/Ad0B3AHa Af8BwgHBAcAB/wGiAaABngH/AYoBiAGHAf8DYgHpAxQBHNQAAwYBCANZAccBhgGEAYMB/wGdAZsBmgH/ AbwBuwG5Af8B3QHcAdoB/wHCAcEBwAH/AaIBoAGeAf8BigGIAYcB/wF0AXIBcAH/A1kBxwMGAQjQAANP AZcBcAFuAWwB/wGGAYQBgwH/AZ0BmwGaAf8BvAG7AbkB/wHdAdwB2gH/AcIBwQHAAf8BogGgAZ4B/wGK AYgBhwH/AXQBcgFxAf8BbAFqAWgB/wNPAZfMAAMEAQYBhQFtAVEB9wGiAYwBXAH/AawBmAFqAf8BuQGn AYIB/wHJAboBlgH/AdkBzAGqAf8BzQG+AZsB/wG8AawBhwH/AbABnQFwAf8BpwGSAWMB/wGgAYkBWQH/ AYUBbQFRAfcDBAEGyAADDAEQAbMBgAEeAf8BzgGfATwB/wHaAbMBVQH/AeUBxgFuAf8B8QHYAY0B/wH6 AekBogH/AfQB3wGVAf8B6gHOAXgB/wHgAb0BYwH/AdYBrQFOAf8BzAGcATgB/wG3AYIBHQH/AwwBEMgA AwEBAgM8AWYDQAFwA0ABcANAAXADQAFwA0ABcANAAXADQAFwA0ABcANAAXADQAFwAzwBZgMBAQL/AO4A AT4BCgH/AQABPgEKAf8BAAE+AQoB/wEAAT4BCgH/AQABPgEKAf9QAAP9Af8D/AH/A/sB/xQAA/wB/3UA AT4BCgH/AQABjAEmAf8BNwG6AY0B/wGVAdIBsgH/ATcBugGNAf8BAAGMASYB/wEAAT4BCgH/BAABwAHC AeAB/wIAAbkB/wIAAZoB/wHkAeMB1AH/GAAB7gLwAf8B0QHSAdMB/xgAA/QB/wPwAf8D7AH/At8B4gH/ AtYB2wH/AtUB2wH/At4B4QH/AuoB6wH/AvAB7wH/A/MB/xUAAaUB1AH/AQABnQHRAf8BAAGSAcwB/wEA AYwByQH/AQABggHEAf8BAAGBAcMB/wEAAYEBwwH/AQABgQHDAf8BAAGBAcMB/wEAAYEBwwH/AQABgQHD Af8BAAGBAcMB/xEAAYgB2AH/BQABiAHYAf8FAAGIAdgB/wUAAYgB2AH/AQABQAERAf8BNQG6AYsB/wEz AboBhwH/BAABMwG5AYcB/wE6AbwBjwH/AQABPgEKAf8EAAKBAc0B/wGHAZkB+gH/AQABBQHzAf8CAAGT Af8B4AHbAcwB/xAAAe4B8QHyAf8BoQGVAZQB/wGGAoEB/wG/AcABwQH/GAAC4gHrAf8CgQHGAf8CDwHA Af8CAAG9Af8CAAG9Af8CDwHAAf8CgQHFAf8C4gHrAf8ZAAGtAdgB/wGRAeEB+gH/AT4B2gH5Af8BPgHa AfkB/wE+AdoB+QH/AT4B2gH5Af8BPgHaAfkB/wE+AdoB+QH/AT4B2gH5Af8BPgHaAfkB/wE+AdoB+QH/ AQABgQHDAf8MAAEGAY4B2QH/BAABpwHdAfQB/wQAAZYB2gHzAf8EAAGGAdcB8wH/BAABBAGBAR8B/wGc AdQBtgH/DAABlQHSAbIB/wEAAT4BCgH/BAAB3gHdAewB/wGFAYkB0QH/AbwBxgH7Af8CAAHpAf8CAAGK Af8B6AHnAdkB/wgAAe8C8QH/AZgBjgGMAf8B3gHOAc8B/wHnAdkB2AH/AY0CgQH/A8AB/xAAAt0B+QH/ Ah0B3AH/AgAB2AH/AgAB4AH/AgAB3gH/AgAB3QH/AgAB4QH/AgAB2gH/Ah0B3QH/At0B+QH/FQABtgHc Af8B0gH1AfwB/wGoAewB+QH/AZIB5wH3Af8BkgHnAfcB/wGBAd0B8wH/ATYB0wHvAf8BJQHJAesB/wES Ab4B5wH/AQABtAHjAf8BPgHaAfkB/wEAAYEBwwH/EAAB7wH6Af4B/wQAAZEB5QH4Af8EAAGBAd4B9gH/ BAABJwHXAfQB/wEXAYkBNQH/AZAB0wGxAf8BkgHWAbEB/wQAATgBvAGMAf8BOgG8AY8B/wEAAT4BCgH/ CAABvQG+AdwB/wGJAY4B0QH/AbgBwgH5Af8CAAHZAf8CAAGBAf8C9gH0Af8C9gH1Af8BlwKNAf8B3AHN AcwB/wHsAeMB4gH/AeoB4AHfAf8B1gLJAf8BmgKUAf8MAALxAfwB/wIWAdwB/wIAAegB/wIAAesB/wIp AdoB/wKCAdMB/wKBAcsB/wINAcUB/wIAAeAB/wIAAeoB/wIXAd0B/wLxAfwB/xEAAbYB3AH/AdIB9QH8 Af8BqAHsAfkB/wGSAecB9wH/AZIB5wH3Af8BgQHdAfMB/wE2AdMB7wH/ASUByQHrAf8BEgG+AecB/wEA AbQB4wH/AT4B2gH5Af8BAAGBAcMB/wwAAQkBmgHaAf8EAAGzAe0B+gH/BAABlQHmAfgB/wQAAYEB3gH2 Af8EAAEnAbMBrgH/ATQBqwGBAf8BlQHUAbQB/wG6AeYB0AH/AT0BuwGPAf8BAAGPASoB/wEAAT4BCgH/ DAABwAHBAd0B/wGBAYUByAH/AagBsgH0Af8CAAHGAf8BGQEbAYgB/wGxAagBkgH/Ad8CzgH/Ae0B5QHm Af8B/AL6Af8B4AHYAdcB/wGdAZcBlgH/A/oB/wwAAosB6AH/AgAB6QH/AgAB8QH/ApsB5wH/Ar4B8wH/ ApYB+AH/AqIB9wH/AsQB6AH/AjUBvAH/AgAB4QH/AgAB7AH/AosB6AH/EQABtgHcAf8B2wH3Af0B/wGo AewB+QH/AZIB5wH3Af8BkgHnAfcB/wGBAd0B8wH/ATYB0wHvAf8BJQHJAesB/wESAb4B5wH/AQABtAHj Af8BPgHaAfkB/wEAAYEBwwH/EAAB9gH8Af4B/wQAAbkB7wH7Af8EAAGcAegB+QH/BAABgQHgAfYB/wE/ AdwB9gH/AS4BtwG0Af8BKwGXAYEB/wEiAY4BOQH/ARoBigE0Af8BBQGMAZIB/xQAAesB7AH2Af8BjgGS AdEB/wGbAaEB7wH/AgABuwH/AgABgwH/AeYB3AHXAf8B/gL8Af8B4QLZAf8BmwGTAZQB/wH5AfoB+QH/ DAAC9gH9Af8CGQHhAf8CCgH0Af8CjAHyAf8CwwH4Af8CJQH2Af8CJAHdAf8CEQHQAf8COwH0Af8CxAHm Af8CEAHBAf8CAAHyAf8CGAHiAf8C9gH9Af8NAAG2AdwB/wHiAfkB/QH/AagB7AH5Af8BkgHnAfcB/wGS AecB9wH/AYEB3QHzAf8BNgHTAe8B/wElAckB6wH/ARIBvgHnAf8BAAG0AeMB/wGRAeEB+gH/AQABggHE Af8MAAEKAaYB2gH/BAAB+AH9Av8EAAH1AfwC/wQAAdgB9gH8Af8EAAGFAeMB9wH/BAABOwHbAfUB/wQA AdcB9AH8Af8UAAHpAusB/wHGAcUBvAH/AaQBoQGcAf8BOQE8AasB/wFAAYEB3gH/ARoBFwGIAf8B+QH3 AfUB/wHoAuAB/wGZApIB/wP5Af8QAALhAfgB/wISAeAB/wI/AfYB/wLFAfcB/wKTAe8B/wI+AfUB/wLY AfcB/wKKAdYB/wIHAekB/wKwAfUB/wKBAcgB/wIRAeoB/wIRAeIB/wLhAfgB/w0AAbYB3AH/AeIB+QH9 Af8BqAHsAfkB/wGSAecB9wH/AZIB5wH3Af8BgQHdAfMB/wE2AdMB7wH/ASUByQHrAf8BEgG+AecB/wEA AbQB4wH/AZEB4QH6Af8BAAGMAckB/xAAAegB9gH7Af8EAAGIAc4B7gH/BAAByQHpAfYB/wQAAfMB/AH+ Af8EAAHwAfwB/gH/BAAB7gH7Af4B/wQAAQkBqwHaAf8MAAHGAsUB/wGbAo4B/wHBAbABrwH/AdABvwGz Af8BhAGBAaYB/wKBAa4B/wHSAcoBuAH/AbEBqAGnAf8BpQKhAf8D+wH/FAAC3gH3Af8CGwHeAf8CgwH1 Af8CzQH1Af8CjAHdAf8CggH0Af8C5wH9Af8CowHcAf8COQHqAf8CvQH2Af8CkQHVAf8CQQHtAf8CHAHg Af8C3gH3Af8NAAG2AdwB/wQAAe0B+wH9Af8B4gH5Af0B/wHbAfcB/QH/AdIB9QH8Af8B0gH1AfwB/wHH AfMB+wH/AbkB8AH6Af8BqAHsAfkB/wGRAeEB+gH/AQABnQHRAf8MAAEJAaoB2gH/BAABlAHeAfUB/wQA AYEB1QHyAf8EAAE/AcsB6gH/BAABgQHSAe8B/wQAAYEBzwHuAf8EAAHpAfcB+wH/DAAD4QH/AaYCmAH/ AekC2wH/AekB3AHdAf8B5wHaAdsB/wHlAdcBzwH/AfAB4wHaAf8B4gHbAdwB/wGLAYEBggH/AZMCjgH/ A/cB/xQAAu0B+wH/AhYB2AH/AoUB8QH/AsgB+AH/Aq8B2AH/AoMB3QH/AuoB/gH/AqkB3AH/ApYB6gH/ AtsB9AH/ApYB4gH/AoQB8AH/AhYB2QH/Au0B+wH/DQABtgHcAf8DrQH/A+sB/wOtAf8BAAG0AdgB/wEA AbYB3AH/AQABtgHcAf8BAAG0AdgB/wOtAf8DxQH/A60B/wEAAa0B2AH/EAAB9wH8Af4B/wQAAZEB3gH1 Af8EAAGsAeEB9gH/BAAB9AH9Af4B/wQAAfEB/AH+Af8EAAHuAfsB/gH/BAABCQGvAdoB/wgAAbkCtAH/ AdwC0QH/Ae0C4gH/AagCnAH/AcoCvQH/Ae0C4gH/AegC3QH/AZcCjwH/AfEC8gH/AbgCsQH/AYUCgQH/ AfUC9gH/EAAC/QL/AkIB3wH/AjwB5wH/AqsB9AH/AtYB8QH/AqkB3wH/Au0B/QH/ArEB3AH/AsYB7gH/ As0B9QH/Ap0B8AH/AjwB5wH/AkIB3wH/Av0C/xAAA60B/wPvAf8DrQH/EAADrQH/A8UB/wOtAf8QAAEJ AbMB2gH/BAAB/gP/BAAB/QH+Av8EAAHqAfcB+wH/BAABPgHHAeMB/wQAAT4BxwHjAf8EAAGBAcoB5QH/ DAABvAK1Af8B6wLhAf8BqAKdAf8B6ALsAf8BqgKlAf8B4wLaAf8B9QLvAf8BmwGUAZIB/wH7AvwB/wP8 Af8BswKtAf8BhwKBAf8BuAK3Af8D/gH/DAAC1AH0Af8CEQHYAf8CiQHuAf8CrQHyAf8CtwHyAf8C4AH6 Af8CvQHpAf8CswHvAf8CqQHzAf8CiAHuAf8CEAHYAf8C1AH0Af8UAAOtAf8D7wH/A60B/xAAA60B/wPF Af8DrQH/FAABMQHCAeEB/wQAATMBwwHiAf8EAAEyAcMB4gH/BQABsgHYAf8FAAGyAdgB/wUAAbIB2AH/ BQABswHYAf8IAAHIAsUB/wGUAosB/wHvAvAB/wPRAf8BtgGsAaoB/wH7AvkB/wHnAt8B/wGiAp0B/wP+ Af8EAAH4AvkB/wHOAsUB/wGUAYUBhAH/AcwCzQH/EAACtQHtAf8CGgHbAf8ChwHuAf8CowHzAf8CqwHz Af8CqgH0Af8CowHzAf8ChwHuAf8CGAHbAf8CtQHtAf8YAAOtAf8EAAPvAf8DrQH/A60B/wOtAf8DrQH/ A60B/wPHAf8DrQH/UAAD/AH/A/cB/wHQAc4BzQH/AbwCsQL/Av0B/wH3AvQB/wGeAZQBkwH/AeUB5gHl Af8IAAP+Af8B4gLmAf8BtQKsAf8BrQKqAf8UAALIAfEB/wIyAdwB/wIoAd8B/wI3AeYB/wI5AeYB/wIq Ad8B/wIyAdwB/wLIAfEB/yAAA60B/wQAA9UB/wPVAf8D1QH/A8cB/wPFAf8DrQH/XAABtwK0Af8BuQKv Af8BuAKyAf8BqgKjAf8B3wLhAf8UAAH4AvoB/wP9Af8YAAL5Af0B/wLfAfcB/wLPAfMB/wLQAfMB/wLf AfcB/wL5Af0B/ygAA60B/wOtAf8DrQH/A60B/wOtAf8DrQH//wBlAAHsAeMB3AH/AcABoQGLAf8BpAGB ASgB/wGOASgBAAH/AY4BKAEAAf8BpQGBASoB/wHBAaEBiwH/AewB4wHcAf+AAAH+AfkB+AH/AYEBiAHJ Af8BFgExAbIB/wHGAcUB1AH/SAAC/gH9Af8BxgGpAZUB/wGTAS4BCAH/AcsBrwGbAf8B5QHWAcsB/wH4 AfQB8QH/AfkB9QHyAf8B6AHbAdEB/wHTAboBpwH/AZUBMQELAf8BxwGrAZcB/wL+Af0B/xwAAfoB9wH7 Af8BzQHPAd4B/wHSAdQB4AH/AfIB8QHzAf9IAAH7AvYB/wE+AYEByQH/AQABNwHpAf8BAAGqAf0B/wEj AYEBtAH/ApsB2wH/ARwBIgHFAf8BIgEnAcQB/wEfASQBwQH/ARoBHwG/Af8BGAEeAbwB/wEXARsBuAH/ ARcBGwG3Af8BFgEZAbUB/wESARUBrwH/AREBEwGtAf8BDwERAasB/wERARMBqQH/ARIBEwGmAf8BCAEJ AaAB/wKDAbMB/wQAAv4B/QH/AaMBgQEnAf8BrwGGATwB/wHzAe0B6QH/Ad0ByQG6Af8BxwGlAYsB/wG7 AZEBgQH/AcEBmQGBAf8B1QG3AZ8B/wHpAdoBzQH/AfgB8wHvAf8BtwGRAYEB/wGmAYEBKwH/Av4B/QH/ DAAC/wH+Af8B5gHhAfEB/wGbAaQBvQH/AYEBjAGtAf8BmAGvAdQB/wGYAaMBygH/AYoBkgG7Af8BjwGT AbsB/wKxAckB/wHYAdYB4AH/AfcC9QH/NAAB+gH0AfcB/wExAYEBzgH/AQABNQHqAf8BBgHDAv8BEgG7 Ae0B/wGHAZoB0gH/ApEB2AH/AgAB2QH/AgAB5gH/AgAB3AH/AQABAwHWAf8CAAHRAf8CAAHOAf8CAAHI Af8CAAHCAf8CAAG+Af8CAAG4Af8CAAGzAf8CAAGqAf8CAAGiAf8CAAGdAf8CgQG2Af8EAAHHAaoBlgH/ Aa4BhQE8Af8B8wHuAekB/wG3AY8BgQH/AaUBgQEfAf8BswGHATgB/wgAAcEBlwGBAf8BxQGbAYEB/wHX AbkBoAH/AfkB9QHxAf8BtAGMAYAB/wHHAasBlwH/CAAB6gHpAfMB/wGNAZoByAH/AQQBhQGBAf8BAAGD AQAB/wE6AakBgQH/AesD/wQAAfED/wHQAeMB8QH/AaYBugHXAf8BgQGUAb8B/wGBAYMBtAH/AZEBlQG5 Af8B+AH3AfgB/xgAA/oB/wP7Af8IAAH5AfYB+wH/AS4BgQHWAf8BAAE5AfEB/wEHAcQC/wESAbwB7gH/ AYEBjgHSAf8B+QH1AfkB/wH2AfQB+QH/ASMBKAHPAf8CAAHnAf8BLwFBAd4B/wLYAdQB/wHRAdIB2wH/ AeUB5gHvAf8BQAFBAYEB/wEcAR0BJQH/Ad0B3gHmAf8B0gHTAdoB/wLYAdUB/wEwATQBvAH/AgABpwH/ AQsBDAGjAf8C8wHyAf8B7AHjAdwB/wGSAS4BBwH/AfIB6wHmAf8BsQGHATwB/wGdAToBEwH/AaMBQgEc Af8BsgGEATUB/wgAAb0BkgFCAf8BwQGWAYEB/wHFAZsBgQH/AdYBtwGdAf8B9wHxAe0B/wGTATABCQH/ AewB4wHcAf8EAAHJAcoB4wH/AYIBrgHfAf8BBgHGAUEB/wEAAZ0BAAH/ATcBnwGBAf8B1AH3Av8B5wH0 AfcB/wG/AcwByQH/AdUB8gHzAf8B4AP/AbUB7QL/AYIBzAH+Af8BHAFAAbYB/wHmAeEB6AH/DAAD/AH/ Ac0CzgH/AagBqQGrAf8BkgGTAZUB/wGMAY0BjwH/AZ0BngGfAf8C0AHMAf8BpwGmAdcB/wEoAZAB2QH/ ARkB0AL/AREBwAH0Af8BgQGKAdYB/wH4AfEB+AH/CAABwQHAAecB/wIAAdMB/wEAAQMB6AH/AbgBvQHY Af8B7QHsAeIB/wL7AfgB/wKxAa4B/wGdAZwBmgH/AvcB9QH/Au8B5gH/AbkBuwHRAf8CAAG1Af8CAAGl Af8CugHUAf8EAAHAAaEBiwH/AcMBpgGRAf8B0wG8Aa0B/wGUAS8BBgH/AZoBNwEPAf8BoQE/ARgB/wGp AYEBJQH/AcgBqAGPAf8BzAGtAZQB/wG3AYkBOAH/AbsBjwE+Af8BvwGTAYAB/wHBAZYBgQH/AecB1wHJ Af8BzwG1AaEB/wHBAaEBiwH/BAABygHMAeQB/wGGAbUB6AH/AQYBwQGBAf8BAAGqAQAB/wEpAZ0BgQH/ AccB8AL/AdUB6AHuAf8BxAGmAYEB/wHCAc8BxgH/AakB5AL/AZsBtAHGAf8BjgG+AeEB/wESAUIBwQH/ AecB4gHnAf8IAAPxAf8BpAGlAacB/wGfAZwBmQH/Ab4BtwGtAf8BzAHCAbcB/wHCAbkBrgH/AZ8BmQGR Af8BQAE/AT0B/wOBAf8CygHIAf8BgQG1AecB/wE/AYsB3gH/AfcB7wH4Af8QAAKBAdcB/wIAAeEB/wEX ASsB5QH/Au0B6gH/BAADggH/A4EB/wQAAfAB8QHsAf8BGQEgAcUB/wIAAbIB/wJCAbsB/wgAAaIBgQEm Af8B3QHMAcAB/wGvAYYBPQH/AZEBKwECAf8BlwEzAQsB/wGdAToBEwH/AacBgQEkAf8B5AHUAcgB/wHl AdYBygH/AbQBhgE1Af8BtgGHATYB/wG5AYsBOgH/AboBjgE9Af8B0QGyAZsB/wHmAdcBzAH/AaUBgQEp Af8EAAHKAcwB4wH/AYEBrgHpAf8BCQG1AYEB/wEAAZcBAAH/ATABngGOAf8BuAHqAv8B1gHtAe8B/wHO AZcBJQH/AbQBugGqAf8BggHSAv8BwgGgAUEB/wG4AacBgwH/AQABNQHHAf8B6AHiAegB/wQAA/oB/wGo AakBqgH/AcEBuQGyAf8B+gHoAdIC/wHyAd0C/wHzAd4C/wH0Ad8C/wHwAdsB/wHWAccBtAH/AaEBngGX Af8CgQGIAf8BpAGiAdwB/wH5AfUB+wH/FAAB5gHlAfQB/wESARkB0wH/ATUBQgH3Af8B1AHVAfkB/wQA Ay8B/wMdAf8EAAKtAfoB/wIAAecB/wIAAbEB/wHjAeIB6gH/CAABjQEmAQAB/wH1AfAB7QH/AZQBMQEL Af8BjgEmAQAB/wGUAS4BBgH/AZkBNQENAf8BnwE8ARUB/wHzAe0B6AH/BAAB0AG1AaAB/wGwAYEBLQH/ AbIBgwExAf8BtAGFATMB/wG9AZQBgQH/AfgB8wHwAf8BjgEnAQAB/wQAAdQB1gHnAf8BOwGoAesB/wE7 AboB2wH/AYEBtwHiAf8BgQHFAfwB/wGWAdgC/wGEAcwB9gH/ATcBmAG/Af8BLwGmAeIB/wEjAbMC/wE4 AY4BsQH/AS8BiQGwAf8BAAEzAcMB/wHwAekB5gH/BAACzAHOAf8BuQG0AbAC/wHrAdEC/wHtAdYC/wHr AdIC/wHqAdIC/wHqAdIC/wHtAdYC/wH1Ad4B/wHUAcABqgH/AS8BLgEsAf8C0AHJAf8cAAKlAeIB/wE9 AT8B5AH/ArgC/wL8Av8CIwEhAf8CFwETAf8C8QL/AiUC/wIAAdgB/wKfAc4B/wwAAY0BJgEAAf8B9QHw Ae0B/wGTAS8BCQH/AYoBIgEAAf8BkAEpAQAB/wGVATABBwH/AZoBNgEOAf8BtQGLAUAB/wH8AfsB+QH/ A/4B/wHBAZ0BggH/AawBgQEnAf8BrQGBASkB/wG3AY0BPwH/AfcB8wHvAf8BjgEnAQAB/wK0Ac4B/wGB AYIBtQH/ASwBnAHoAf8BPQG9Av8BQgG9Av8BgQHHAv8BKQGIAfQB/wEAAREB2QH/AQABJQHjAf8BAAEl AeEB/wEAASoB4wH/AQABLAHqAf8BAAE0AfIB/wEAAR0BwQH/AUEBPgGkAf8CtgHMAf8BqwGsAa4B/wHs AdgBwwL/AegBygL/AeYBxwL/AeMBwgL/AeIBwQL/AeIBwwL/AeUBxwL/AeoBzwL/AecBygH/AY8BhAGB Af8BjgGQAZIB/xwAAfwB+wH9Af8BOwE9AdcB/wGRAZMB9wH/AdUB1AL/AhkBFgH/AhIBCwH/AqQC/wEK AQsB9QH/ASsBLQHBAf8C/QH6Af8MAAGiAYEBJgH/Ad0BzAHAAf8BrAGCATgB/wGHAR0BAAH/AYsBIwEA Af8BkAEpAQAB/wGVAS8BBwH/AZkBNQENAf8BwgGhAYkB/wQAAfMB7AHoAf8BpQGBAR4B/wGmAYEBIAH/ AcMBoQGGAf8B4QHSAcYB/wGkAYEBKAH/AigBqQH/AgABsAH/ARUBhQHyAf8BLQG2Av8BMQG2Av8BKwGh AfwB/wEEAREB5wH/AQABAwHaAf8BAAEFAdoB/wEAAQMB2gH/AQABAgHaAf8BAAECAdcB/wEAAQcB2gH/ AgAB1wH/AgABqAH/AsQB1gH/AagBpwGlAv8B5QHJAv8B3wG4Av8B1wGrAv8B0wGlAv8B0QGiAv8B0wGl Av8B1wGsAv8B3gG4Av8B6QHHAf8BrAGZAYcB/wOBAf8D/AH/HAACzQHvAf8BMAE0AdwB/wG8Ab0C/wKf Aa4B/wKVAa8B/wKBAv8BDQEPAc0B/wLLAeQB/xAAAcABoQGLAf8BwwGlAZAB/wHQAbkBqQH/AYcBHQEA Af8BhwEdAQAB/wGfAUEBHgH/AaABQgEgAf8BlAEuAQUB/wGoAYEBLAH/BAAB/QH8AfsB/wGhAUABGQH/ AZ8BPQEWAf8B2gHGAbcB/wHGAaoBlQH/AcABoQGLAf8C5QHuAf8BAwEAAa0B/wEAAQ4BzQH/AR0BrAL/ AR4BqQL/AQoBKAHpAf8BAAEGAd0B/wEAAQoB3AH/AQABCgHdAf8BAAEIAdwB/wEAAQkB3QH/AQABCAHd Af8BAAEFAd4B/wIAAbwB/wKkAckB/wQAAasBqAGnAv8B3AG6Av8B0AGdAv8BzAGYAv8BzQGaAv8BzgGc Av8BzQGaAv8BzAGYAv8B0AGeAv8B3AGwAf8BsAGXAYIB/wOBAf8D+wH/IAABiwGMAeAB/wGBAYIB6wH/ AtwC/wLDAv8BLQEwAeUB/wGDAYQB0AH/FAAB7AHjAdwB/wGSAS8BCAH/AfEB6gHlAf8BpQGBASsB/wGH AR0BAAH/AbABiAE/Af8B/gL9Af8B6QHeAdYB/wH2AfIB7wH/BAAB3AHKAb0B/wGYATMBCwH/AbMBiQE+ Af8B8gHrAeYB/wGRAS4BBwH/AewB4wHcAf8EAAHBAcAB2gH/AgABlwH/AQABMAHQAf8BCwGBAfUB/wEB AQUB1gH/AQABCgHWAf8BAAEIAdYB/wEAAQoB2wH/AQABBgHWAf8BAAEHAdgB/wEAAQYB2QH/AgABxQH/ AoEBtwP/AfwB/wQAAa8BsQG0Af8B9gHMAawC/wHMAZYC/wHTAacC/wHXAa4C/wHYAbAC/wHXAa0C/wHS AaYC/wHPAZ0C/wHLAZUB/wGgAYcBgQH/AZEBlQGXAf8kAALvAfoB/wEyATUB2gH/AboBvAH7Af8BqwGs AfsB/wEoASsBzQH/Au0B9AH/GAABxgGpAZUB/wGtAYMBOgH/AfIB6wHnAf8BpgGBASwB/wGcATwBGgH/ Ad4BzgHCAf8B9wHzAfAB/wHxAeoB5gH/AdABuAGnAf8BoAFCASAB/wGtAYIBNwH/AfMB7QHoAf8BqwGB ATUB/wHGAakBlQH/DAABjgGMAb8B/wIAAZcB/wECAQ8B3wH/AQABAgHVAf8BAAECAdUB/wEAAQEB2QH/ AgAB2QH/AgAB0wH/AgAB1QH/AgABzgH/AR0BIAGrAf8C8gHxAf8IAAHFAccByQH/AdIBvQGxAv8BzAGg Av8B3wG7Av8B4QHCAv8B4QHDAv8B4AHAAv8B3QG6Av8B3AGwAf8B6gGwAYQB/wGBAUIBPwH/AcMBxAHF Af8oAAK5AewB/wE+AUIB4wH/AToBPQHeAf8CsQHiAf8cAAL+Af0B/wGjAYEBJwH/AaoBgQE0Af8B8AHo AeMB/wHQAbkBqQH/AawBggE4Af8BlgEzAQ4B/wGWATMBDgH/AawBggE4Af8B0QG6AaoB/wHwAekB5AH/ AaoBgQE1Af8BowGBAScB/wL+Af0B/wwAA/kB/wGFAYQBxAH/ATYBOgHDAf8BNgE7AcQB/wE2AToBwwH/ ATYBPAHFAf8BNQE6AcMB/wE4ATwBwwH/ATUBOgHDAf8BOAE7AbsB/wLaAeQB/wwAA/UB/wGyAbUBtgH/ AeMBvwGsAv8BzQGtAv8B5gHOAv8B8wHgAv8B8AHaAv8B3gG+Af8B7gG3AZIB/wGZAYMBgQH/AY4BkQGT Af8D+QH/LAABiQGLAeIB/wGFAYcB3gP/Af4B/yAAAv4B/QH/AcYBqQGVAf8BkQEuAQcB/wHBAaIBjQH/ AdsByQG9Af8B9AHvAesB/wH0Ae8B6wH/AdsByQG9Af8BwQGjAY0B/wGRAS0BBgH/AccBqgGWAf8C/gH9 Af8UAAL/Af4B/wL9AfgB/wH+Af0B+QL/Af4B+QP/AfkD/wH6A/8B+gP/AfoD/wH9Af8UAAHlAuYB/wGx AbQBtgH/AcoBrQGjAf8B6QG4AaUB/wHxAcYBtQH/AesBvwGsAf8BzgGfAYsB/wGVAYYBgQH/AZQBlwGZ Af8D7wH/ZAAB7AHjAdwB/wHAAaEBiwH/AaIBgQEmAf8BjQEmAQAB/wGNASYBAAH/AaIBgQEmAf8BwAGh AYsB/wHsAeMB3AH/WAAD9QH/AcMBxwHIAf8CowGkAf8BpwGeAZsB/wGcAZUBkwH/AZQClwH/AcYBxwHJ Af8D+wH/WAABogHKAe4B/wGBAbIB5gH/AREBkQHbAf8BBwGMAdkB/wEHAYwB2QH/AQcBjAHZAf8BBwGM AdkB/wEHAYwB2QH/AQcBjAHZAf8BBwGMAdkB/wEHAYwB2QH/AQcBiwHZAf8BDAGPAdoB/wGFAbkB6QH/ CQABhgHYAf8BAAGIAdgB/wEAAYcB2AH/AQABiAHYAf8BAAGIAdgB/wEAAYgB2AH/AQABiAHYAf8BAAGI AdgB/wEAAYgB2AH/AQABiAHYAf8BAAE+AQoB/wEAAT4BCgH/AQABPgEKAf8BAAE+AQoB/wEAAT4BCgH/ LAABhAGwAZQB/wEAAYEBFAH/AQABPgEKAf8BAAGBARQB/wGEAbABlAH/RAABGgGZAd0B/wHeAfEB+gH/ AagB3QH0Af8BngHbAfQB/wGWAdoB8wH/AY4B2AHzAf8BhgHXAfMB/wGBAdQB8gH/AYEB0wHyAf8BgQHS AfEB/wE/AdAB8QH/ATwBzwHxAf8BwgHqAfgB/wESAZUB2wH/CAABBgGOAdkB/wHcAfAB+gH/AacB3QH0 Af8BngHbAfQB/wGWAdoB8wH/AY4B2AHzAf8BhgHXAfMB/wGBAdQB8gH/AYEB0wHyAf8BAAE+AQoB/wEA AYwBJgH/ATcBugGNAf8BlQHSAbIB/wE3AboBjQH/AQABjAEmAf8BAAE+AQoB/yQAAYgBsgGXAf8BAAGM ASYB/wE3AboBjQH/AZUB0gGyAf8BNwG6AY0B/wEAAYwBJgH/AYEBrgGRAf8JAAGIAdgB/wUAAYgB2AH/ BQABiAHYAf8FAAGIAdgB/wUAAYgB2AH/BQABhwHYAf8FAAGGAdgB/wQAAQ4BlwHbAf8B7wH6Af4B/wGh AekB+QH/AZEB5QH4Af8BgQHhAfcB/wGBAd4B9gH/ATYB2gH1Af8BJwHXAfQB/wEaAdMB8wH/AQwB0AHy Af8BAQHNAfEB/wEAAcsB8AH/AcoB8gH7Af8BDgGXAdsB/wgAAQgBlAHaAf8B7wH6Af4B/wGhAekB+QH/ AZEB5QH4Af8BgQHhAfcB/wGBAd4B9gH/ATYB2gH1Af8BJwHXAfQB/wEaAdMB8wH/AQABQAERAf8BNQG6 AYsB/wEzAboBhwH/BAABMwG5AYcB/wE6AbwBjwH/AQABPgEKAf8EAAGiAcoB7gH/AYEBsgHmAf8BEQGR AdsB/wEHAYwB2QH/AQcBjAHZAf8BBwGMAdkB/wEHAYwB2QH/AQcBjAHZAf8BAAFAAREB/wE1AboBiwH/ ATMBugGHAf8EAAEzAbkBhwH/AToBvAGPAf8BAAGAARAB/wQAAQYBjgHZAf8EAAGnAd0B9AH/BAABlgHa AfMB/wQAAYYB1wHzAf8EAAGBAdMB8gH/BAABPwHQAfEB/wQAAcIB6gH4Af8IAAEPAZ0B2wH/AfIB+gH9 Af8BswHtAfoB/wGkAekB+QH/AZUB5gH4Af8BhQHiAfcB/wGBAd4B9gH/ATgB2wH1Af8BKgHXAfQB/wEc AdQB8wH/AQ4B0QHyAf8BAwHOAfEB/wHMAfIB+wH/AQ4BmwHbAf8IAAEJAZoB2gH/AfIB+gH9Af8BswHt AfoB/wGkAekB+QH/AZUB5gH4Af8BhQHiAfcB/wGBAd4B9gH/ATgB2wH1Af8BKgHXAfQB/wEEAYEBHwH/ AZwB1AG2Af8MAAGVAdIBsgH/AQABPgEKAf8EAAEaAZkB3QH/Ad4B8QH6Af8BqAHdAfQB/wGeAdsB9AH/ AZYB2gHzAf8BjgHYAfMB/wGGAdcB8wH/AYEB1AHyAf8BBAGBAR8B/wGcAdQBtgH/DAABlQHSAbIB/wEA AT4BCgH/CAAB7wH6Af4B/wQAAZEB5QH4Af8EAAGBAd4B9gH/BAABJwHXAfQB/wQAAQwB0AHyAf8FAAHL AfAB/wQAAQgBlAHaAf8EAAEOAaMB2wH/AfYB/AH+Af8ByAHyAfwB/wG5Ae8B+wH/AawB7AH6Af8BnAHo AfkB/wGLAeMB9wH/AYEB4AH2Af8BPwHcAfYB/wEwAdkB9QH/ASIB1gH0Af8BFwHTAfMB/wHQAfMB/AH/ AQ4BogHbAf8IAAEJAaEB2gH/AfYB/AH+Af8ByAHyAfwB/wG5Ae8B+wH/AawB7AH6Af8BnAHoAfkB/wGL AeMB9wH/AYEB4AH2Af8BPwHcAfYB/wEXAYkBNQH/AZAB0wGxAf8BkgHWAbEB/wQAATgBvAGMAf8BOgG8 AY8B/wEAAT4BCgH/BAABDgGXAdsB/wHvAfoB/gH/AaEB6QH5Af8BkQHlAfgB/wGBAeEB9wH/AYEB3gH2 Af8BNgHaAfUB/wEnAdcB9AH/ARcBiQE1Af8BkAHTAbEB/wGSAdYBsQH/BAABOAG8AYwB/wE6AbwBjwH/ AQABgAEQAf8EAAEJAZoB2gH/BAABswHtAfoB/wQAAZUB5gH4Af8EAAGBAd4B9gH/BAABKgHXAfQB/wQA AQ4B0QHyAf8EAAHMAfIB+wH/CAABDgGoAdsB/wH+A/8B+AH9Av8B9gH9Av8B9QH8Av8B8wH8Af4B/wHY AfYB/AH/AZQB5gH4Af8BhQHjAfcB/wGBAd8B9gH/ATsB2wH1Af8BLwHYAfQB/wHXAfQB/AH/AQ4BpwHb Af8IAAEKAaYB2gH/Af4D/wH4Af0C/wH2Af0C/wH1AfwC/wHzAfwB/gH/AdgB9gH8Af8BlAHmAfgB/wGF AeMB9wH/AScBswGuAf8BNAGrAYEB/wGVAdQBtAH/AboB5gHQAf8BPQG7AY8B/wEAAY8BKgH/AQABPgEK Af8EAAEPAZ0B2wH/AfIB+gH9Af8BswHtAfoB/wGkAekB+QH/AZUB5gH4Af8BhQHiAfcB/wGBAd4B9gH/ ATgB2wH1Af8BJwGzAa4B/wE0AasBgQH/AZUB1AG0Af8BugHmAdAB/wE9AbsBjwH/AQABjwEqAf8BgQGu AZEB/wgAAfYB/AH+Af8EAAG5Ae8B+wH/BAABnAHoAfkB/wQAAYEB4AH2Af8EAAEwAdkB9QH/BAABFwHT AfMB/wQAAQgBnwHaAf8EAAEMAa0B2wH/AegB9gH7Af8BlAHUAe8B/wGIAc4B7gH/AYEBwQHpAf8ByQHp AfYB/wHvAfsB/gH/Ae8B+wH+Af8B7wH7Af4B/wHvAfsB/gH/Ae8B+wH+Af8B7gH7Af4B/wH+A/8BDwGu AdsB/wgAAQgBqwHaAf8B6AH2AfsB/wGUAdQB7wH/AYgBzgHuAf8BgQHBAekB/wHJAekB9gH/Ae8B+wH+ Af8B7wH7Af4B/wHvAfsB/gH/AT8B3AH2Af8BLgG3AbQB/wErAZcBgQH/ASIBjgE5Af8BGgGKATQB/wEF AYwBkgH/CAABDgGjAdsB/wH2AfwB/gH/AcgB8gH8Af8BuQHvAfsB/wGsAewB+gH/AZwB6AH5Af8BiwHj AfcB/wGBAeAB9gH/AT8B3AH2Af8BLgG3AbQB/wErAZcBgQH/ASIBjgE5Af8BGgGKATQB/wEIAY4BlAH/ CAABCgGmAdoB/wQAAfgB/QL/BAAB9QH8Av8EAAHYAfYB/AH/BAABhQHjAfcB/wQAATsB2wH1Af8EAAHX AfQB/AH/CAABEwGuAdwB/wHxAfoB/QH/AZQB3gH1Af8BkwHcAfQB/wGBAdUB8gH/AT0BygHtAf8BIwG0 AeQB/wGGAekB+QH/ASAB2QH1Af8BEAGVAc4B/wErAacB0AH/AYEBzwHuAf8B6QH3AfsB/wERAbIB3AH/ CAABCQGqAdoB/wHxAfoB/QH/AZQB3gH1Af8BkwHcAfQB/wGBAdUB8gH/AT0BygHtAf8BIwG0AeQB/wGG AekB+QH/ASAB2QH1Af8BEAGVAc4B/wErAacB0AH/AYEBzwHuAf8B6QH3AfsB/wEHAa4B2gH/DAABDgGo AdsB/wH+A/8B+AH9Av8B9gH9Av8B9QH8Av8B8wH8Af4B/wHYAfYB/AH/AZQB5gH4Af8BhQHjAfcB/wGB Ad8B9gH/ATsB2wH1Af8BLwHYAfQB/wHXAfQB/AH/AQ4BpwHbAf8MAAHoAfYB+wH/BAABiAHOAe4B/wQA AckB6QH2Af8EAAHzAfwB/gH/BAAB8AH8Af4B/wQAAe4B+wH+Af8EAAEJAasB2gH/BAABFAG0AdwB/wH3 AfwB/gH/AY4B5AH4Af8BkQHeAfUB/wGfAeAB9QH/AawB4QH2Af8BOgG6AeYB/wGhAeYB+AH/AQsB0gHy Af8BGgHWAfYB/wEVAZgBzwH/AaABvgHXAf8B7wH0AfsB/wEoAbgB3gH/CAABCAGvAdoB/wH3AfwB/gH/ AY4B5AH4Af8BkQHeAfUB/wGfAeAB9QH/AawB4QH2Af8BOgG6AeYB/wGhAeYB+AH/AQsB0gHyAf8BGgHW AfYB/wEVAZgBzwH/AaABvgHXAf8B7wH0AfsB/wEIAaoB2AH/DAABDAGtAdsB/wHoAfYB+wH/AZQB1AHv Af8BiAHOAe4B/wGBAcEB6QH/AckB6QH2Af8B8gH8Af4B/wHzAfwB/gH/AfIB/AH+Af8B8AH8Af4B/wHv AfsB/gH/Ae4B+wH+Af8B/gP/AQ8BrgHbAf8IAAEJAaoB2gH/BAABlAHeAfUB/wQAAYEB1QHyAf8EAAE/ AcsB6gH/BAABgQHSAe8B/wQAAYEBzwHuAf8EAAHpAfcB+wH/CAABDwG1AdsB/wH9Av4B/wH+A/8C/gL/ Af0B/gL/Af4D/wGnAdUB7wH/ARcBpgHeAf8BmQHiAfYB/wEmAdwB9QH/ARkB2QH2Af8BDQGTAc0B/wEP AYoB0gH/ARUBjAHVAf8BtgHLAeIB/wQAAQkBswHaAf8B/QL+Af8B/gP/Av4C/wH9Af4C/wH+A/8BpwHV Ae8B/wEWAaYB3gH/AZkB4gH2Af8BJgHcAfUB/wEZAdkB9gH/AQ0BkwHNAf8BDQGJAdEB/wEJAYUB0gH/ AQABMQGnAf8IAAETAa4B3AH/AfEB+gH9Af8BlAHeAfUB/wGTAdwB9AH/AYEB1QHyAf8BPQHKAe0B/wE/ AcsB6gH/AYUB0wHvAf8BgQHSAe8B/wGBAdAB7wH/AYEBzwHuAf8BgQHPAe4B/wHpAfcB+wH/AREBsgHc Af8MAAH3AfwB/gH/BAABkQHeAfUB/wQAAawB4QH2Af8EAAH0Af0B/gH/BAAB8QH8Af4B/wQAAe4B+wH+ Af8EAAEJAa8B2gH/BAABLAHCAeAB/wE0AcMB4gH/ATYBxAHjAf8BNgHEAeMB/wE2AcQB4wH/ATUBxAHj Af8BKQHAAeAB/wHFAeQB9QH/AT0BuwHnAf8BOAHBAegB/wExAdkB8gH/ASEB2wH2Af8BLgHdAfcB/wEo AdgB9QH/AQgBhAHPAf8BsQHFAd8B/wEHAbQB2QH/ATEBwgHhAf8BMwHDAeIB/wEzAcMB4gH/ATMBwwHi Af8BMgHDAeIB/wEPAbYB2wH/AQABnQHZAf8BGQGqAeEB/wEjAbgB5QH/ATEB2QHyAf8BIQHbAfYB/wEu Ad0B9wH/ASgB2AH1Af8BAQGBAc0B/wEAASsBogH/BAABFAG0AdwB/wH3AfwB/gH/AY4B5AH4Af8BkQHe AfUB/wGfAeAB9QH/AawB4QH2Af8B7wH7Af4B/wH0Af0B/gH/AfMB/AH+Af8B8QH8Af4B/wHvAfsB/gH/ Ae4B+wH+Af8B+gH9Av8BKwG8AeAB/wgAAQkBswHaAf8EAAH+A/8EAAH9Af4C/wQAAeoB9wH7Af8EAAE+ AccB4wH/BAABPgHHAeMB/wQAAYEBygHlAf8sAAGBAbwB5AH/AYkB3QH0Af8BPQHgAfYB/wGBAeIB9wH/ ATIB3wH2Af8BKAHaAfYB/wEUAYUBzwH/JAABCwGXAdUB/wGJAd0B9AH/AT0B4AH2Af8BgQHiAfcB/wEy Ad8B9gH/ASgB2gH2Af8BCwGBAc0B/wQAAQ8BtQHbAf8B/QL+Af8B/gP/Av4C/wH9Af4C/wH+A/8B6gH3 AfsB/wFBAcgB5QH/AUIByQHkAf8BQgHJAeQB/wFCAckB5AH/AYEBzwHnAf8BhAHQAegB/wG6AeUB8gH/ DAABMQHCAeEB/wQAATMBwwHiAf8EAAEyAcMB4gH/BQABsgHYAf8FAAGyAdgB/wUAAbIB2AH/BQABswHY Af8oAAE8AbQB4QH/AakB7gH5Af8BgQHmAfgB/wGaAegB+AH/AYEB0QHwAf8BgQHiAfYB/wEdAZ4B2wH/ JAABDwGdAdgB/wGpAe4B+QH/AYEB5gH4Af8BmgHoAfgB/wGBAdEB8AH/AYEB4gH2Af8BEgGYAdkB/wQA ASwBwgHgAf8BNAHDAeIB/wE2AcQB4wH/ATYBxAHjAf8BNgHEAeMB/wE1AcQB4wH/ASkBwAHgAf8B7QH4 AfwB/wHzAfoB/QH/AfMB+gH9Af8B8wH6Af0B/wHzAfoB/QH/AfMB+wH9Af8B/AL+Af9oAAGPAcUB5wH/ ATEBwQHqAf8BowHwAfsB/wGBAdQB8AH/AYEBxwHsAf8BKgGnAd4B/wGyAcwB5gH/JAABCAGWAdQB/wEw AcEB6gH/AaMB8AH7Af8BgQHUAfAB/wGBAccB7AH/ASMBowHdAf8BAAFBAbYB/6gAAaEBzwHuAf8BQgHJ AewB/wHJAfMB+wH/ATYBvwHpAf8BwQHdAfEB/y0AAZEB2AH/AUIByQHsAf8ByQHzAfsB/wEqAboB5wH/ AQABhQHNAf+sAAH9Af4C/wGQAcgB6wH/AT8BvAHnAf8BrQHWAfEB/zEAAZYB2gH/AQQBmQHaAf8BGQGr AeEB/wEAAZYB2gH/SAAD/gH/AZEBqwGoAf8BAAEuAScB/wEAAS4BJwH/AQABLgEnAf8BAAEuAScB/wEA AS4BJwH/AQABLgEnAf8BAAEuAScB/wEAAS4BJwH/AQABLgEnAf8BAAEuAScB/wEAAS4BJwH/AQABLgEn Af8BkAGqAacB/wP9Af8IAAP+Af8D+wH/A/oB/wP4Af8D9wH/A/YB/wP2Af8D9wH/A/cB/wP5Af8D+wH/ A/0B/xAAA/4B/wP7Af8D+gH/A/gB/wP3Af8D9gH/A/UB/wP2Af8D9wH/A/kB/wP7Af8D/QH/SAAD+AH/ AQABLgEnAf8BgQGzAa8B/wGOAdIBzAH/AY0B0QHJAf8BiwHMAccB/wGJAcoBwwH/AYcBxgG/Af8BhgHC AbwB/wGEAb4BuAH/AYIBuwG1Af8BgQG4AbIB/wGBAbIBrAH/ATgBkwGOAf8BAAEuAScB/wP5Af8EAAP7 Af8D8wH/A+oB/wLkAeMB/wLbAdwB/wLDAckB/wKzAb0B/wKyAbwB/wLCAcgB/wLZAdoB/wLjAeIB/wPp Af8D8gH/A/oB/wgAA/sB/wPzAf8D6gH/AeIB4QHiAf8B3QLcAf8B0ALRAf8BugG+AbwB/wHKAssB/wPT Af8D2AH/A+AB/wPpAf8D8gH/A/oB/0kAAS4BJwH/AZAB1QHNAf8BMgHFAbsB/wEwAcMBuQH/AS0BvQGz Af8BKgG3Aa0B/wEnAbEBqAH/AZ4BywHEAf8BIAGmAZwB/wEdAZ8BlgH/ARkBmQGQAf8BFQGQAYcB/wFB AacBoQH/AQABLgEnAf8QAAP+Af8C4gHrAf8CgQHGAf8CDwHAAf8CAAG8Af8CAAG8Af8CDwHAAf8CgQHF Af8C4gHrAf8D/gH/GAAD/gH/A/0B/wHeAeQB4QH/AYIBrgGWAf8BNgGuAYUB/wGnAcIBswH/A/sB/wP8 Af8D/AH/A/0B/xAAAaIBygHuAf8BgQGyAeYB/wERAZEB2wH/AQcBjAHZAf8BBwGMAdkB/wEHAYwB2QH/ AQcBjAHZAf8BBwGMAdkB/wEHAYwB2QH/AQcBjAHZAf8BBwGMAdkB/wEHAYsB2QH/AQwBjwHaAf8BhQG5 AekB/wkAAS4BJwH/AZMB1wHRAf8BNQHGAbwB/wE0AcUBuwH/ATwBxAG7Af8BoQHSAc0B/wGZAcoBwwH/ AbwB2QHUAf8BuwHYAdMB/wE6Aa8BpwH/AR0BnAGSAf8BGAGSAYkB/wGBAasBowH/AQABLgEnAf8QAALd AfkB/wIdAd0B/wIAAdgB/wIAAeQB/wIAAesB/wIAAesB/wIAAeQB/wIAAdgB/wIdAd0B/wLdAfkB/xwA AdIB6QHcAf8BgQHHAZgB/wGAAdwBoAH/AYEB5gGrAf8BMAHCAYoB/wHkAfIB6gH/HAABGgGZAd0B/wHe AfEB+gH/AagB3QH0Af8BngHbAfQB/wGWAdoB8wH/AY4B2AHzAf8BhgHXAfMB/wGBAdQB8gH/AYEB0wHy Af8BgQHSAfEB/wE/AdAB8QH/ATwBzwHxAf8BwgHqAfgB/wESAZUB2wH/CQABLgEnAf8BkQHWAdAB/wE4 AccBvQH/ATYBxwG9Af8BuwHZAdMB/wGBAcYBvQH/ATABtwGuAf8BpQHOAcgB/wE2AbIBqgH/AbkB1wHS Af8BIgGgAZYB/wEbAZMBiwH/AYEBrQGoAf8BAAEuAScB/wwAAvEB/AH/AhYB3AH/AgAB6QH/AgAB8QH/ AgMB8AH/AgAB+gH/AgAB+gH/AgMB8AH/AgAB8QH/AgAB6QH/AhYB3AH/AvEB/AH/FAABvwHiAc8B/wEd AcIBgQH/ASIB1wGMAf8BIAHXAYoB/wEfAdcBiQH/ARwB0wGGAf8BOAHDAY4B/wH0AfoB9wH/GAABDgGX AdsB/wHvAfoB/gH/AaEB6QH5Af8BkQHlAfgB/wGBAeEB9wH/AYEB3gH2Af8BNgHaAfUB/wEnAdcB9AH/ ARoB0wHzAf8BDAHQAfIB/wEBAc0B8QH/AQABywHwAf8BygHyAfsB/wEOAZcB2wH/CQABLgEnAf8BhAHR AcoB/wEqAcIBuAH/ATQBxgG8Af8BuwHZAdQB/wHIAdsB1gH/AS8BtwGtAf8BLAGyAakB/wEzAbIBqQH/ AYEBvgG3Af8BIwGhAZgB/wEfAZoBkQH/AYEBrAGlAf8BAAEuAScB/wwAAosB6AH/AgAB6gH/AgAB8wH/ Ap0B8QH/AsoB9AH/Ah0B7gH/AhwB7gH/AskB9AH/ApwB8AH/AgAB8gH/AgAB6gH/AosB6AH/EAABxQHn AdQB/wEAAbgBPAH/AQABwwE7Af8BAAG+ATIB/wEAAb4BLwH/AQABwAExAf8BAAHEATcB/wEAAb4BOQH/ AYEByAGbAf8B+wH9AfwB/xQAAQ8BnQHbAf8B8gH6Af0B/wGzAe0B+gH/AaQB6QH5Af8BlQHmAfgB/wGF AeIB9wH/AYEB3gH2Af8BOAHbAfUB/wEqAdcB9AH/ARwB1AHzAf8BDgHRAfIB/wEDAc4B8QH/AcwB8gH7 Af8BDgGbAdsB/wkAAS4BJwH/AYEB0QHJAf8BJAHAAbUB/wEkAcABtQH/AZ0B0gHMAf8BQAHDAboB/wE3 AbsBsgH/AZ8B0QHMAf8BoQHSAc0B/wEpAakBnwH/ASUBogGaAf8BIgGdAZQB/wE+AaQBnwH/AQABLgEn Af8IAAL2Af0B/wIZAeEB/wILAfQB/wImAe8B/wLPAfYD/wH+Af8C1wH3Af8C1wH3A/8B/gH/AsoB9QH/ AhEB7AH/AgAB9AH/AhgB4QH/AvYB/QH/CAAB9AH7AfcB/wENAbgBgQH/AQABtAEzAf8BPwHJAZYB/wGm Ad0BvgH/AYwB1AGsAf8BEAG9AYEB/wEAAbQBKQH/AQABuAEsAf8BAAGxASoB/wGxAeEBxwH/FAABDgGj AdsB/wH2AfwB/gH/AcgB8gH8Af8BuQHvAfsB/wGsAewB+gH/AZwB6AH5Af8BiwHjAfcB/wGBAeAB9gH/ AT8B3AH2Af8BMAHZAfUB/wEiAdYB9AH/ARcB0wHzAf8B0AHzAfwB/wEOAaIB2wH/CQABLgEnAf8BgQHQ AccB/wEkAcABtQH/ASQBwAG1Af8BIwG9AbIB/wE4AcABuAH/AcgB2wHWAf8ByAHbAdYB/wGeAdABywH/ ASkBqQGgAf8BHAGeAZUB/wEbAZUBjAH/AS8BkQGKAf8BAAEuAScB/wgAAuEB+AH/AhIB4QH/AjgB9gH/ AjYB9AH/AoEB8AH/AtsB+QH/CAAC2AH4Af8CKgHsAf8CAwHxAf8CFwHzAf8CEQHhAf8C4QH4Af8IAAHP Ae0B3AH/ASQBwAGCAf8B4AHzAegB/wP+Af8IAAH1AfsB+AH/AZsB2wG4Af8BAAGyATEB/wEAAa4BJgH/ AQABsQE1Af8B3wHzAegB/xAAAQ4BqAHbAf8B/gP/AfgB/QL/AfYB/QL/AfUB/AL/AfMB/AH+Af8B2AH2 AfwB/wGUAeYB+AH/AYUB4wH3Af8BgQHfAfYB/wE7AdsB9QH/AS8B2AH0Af8B1wH0AfwB/wEOAacB2wH/ CQABLgEnAf8BgQHQAccB/wEkAcABtQH/ASQBwAG1Af8BIwG+AbMB/wEcAa4BpQH/ASgBrwGmAf8BNwGy AaoB/wEaAaIBmAH/AREBlAGLAf8BDQGJAYEB/wEKAYIBgQH/ASwBkgGKAf8BAAEuAScB/wgAAt4B9wH/ AhsB3wH/AoEB9AH/AoEB9AH/AoEB8QH/AtsB+QH/CAAC2QH5Af8CPQHvAf8CMgHxAf8CgQH0Af8CHAHf Af8C3gH3Af8IAAHoAfcB7wH/Ae8B+QH0Af8UAAH+A/8BxwHsAdcB/wEAAbYBPQH/AQABpgEhAf8BKwHD AYgB/wH4Af0B+gH/DAABDAGtAdsB/wHoAfYB+wH/AZQB1AHvAf8BiAHOAe4B/wGBAcEB6QH/AckB6QH2 Af8B8gH8Af4B/wHzAfwB/gH/AfIB/AH+Af8B8AH8Af4B/wHvAfsB/gH/Ae4B+wH+Af8B/gP/AQ8BrgHb Af8EAAGBAZwBmAH/AQABLgEnAf8BLAGaAZMB/wEIAYIBgQH/AQcCgQH/AQYCgQH/AQUCgQH/AQQBgQFC Af8BAgGBAT8B/wEAAUABOQH/AQABOwE0Af8BAAE2ATAB/wEAATQBLgH/AQABMQEqAf8BAAEuAScB/wGB AZsBlwH/BAAC7QH7Af8CFQHYAf8ChAHxAf8ChAHyAf8C0QH5A/8B/gH/AtwB+wH/At0B+wP/Af4B/wLT AfgB/wKFAfEB/wKFAfEB/wIXAdkB/wLtAfsB/ywAAdcB8gHjAf8BCQG5AYEB/wEAAaEBHgH/AacB4gHB Af8MAAETAa4B3AH/AfEB+gH9Af8BlAHeAfUB/wGTAdwB9AH/AYEB1QHyAf8BPQHKAe0B/wE/AcsB6gH/ AYUB0wHvAf8BgQHSAe8B/wGBAdAB7wH/AYEBzwHuAf8BgQHPAe4B/wHpAfcB+wH/AREBsgHcAf8FAAEu AScB/wGmAbsBtgH/AdcB4AHbAf8B1wHgAdsB/wHXAeAB2wH/AdcB4AHbAf8B1wHgAdsB/wHXAeAB2wH/ AdcB4AHbAf8B1wHgAdsB/wHXAeAB2wH/AdcB4AHbAf8B1wHgAdsB/wHXAeAB2wH/AZQBrQGpAf8BAAEu AScB/wQAAv0C/wJCAd8B/wI8AecB/wKTAfEB/wK9AfcB/wLUAfoB/wKaAfMB/wKaAfMB/wLVAfoB/wK9 AfcB/wKTAfEB/wI9AecB/wJCAd8B/wL9Av8wAAHdAfYB6AH/AQcBuQFCAf8BAAGvATQB/wHmAfgB7gH/ CAABFAG0AdwB/wH3AfwB/gH/AY4B5AH4Af8BkQHeAfUB/wGfAeAB9QH/AawB4QH2Af8B7wH7Af4B/wH0 Af0B/gH/AfMB/AH+Af8B8QH8Af4B/wHvAfsB/gH/Ae4B+wH+Af8B+gH9Av8BKwG8AeAB/wUAAS4BJwH/ AdcB4AHbAf8BHwEgARwB/wEyATcBNQH/ATYBOQE3Af8BOAE9ATsB/wE7AT8BPQH/AT4BQgFAAf8BQQGB AYAB/wOBAf8DgQH/A4EB/wOBAf8BlAGaAZgB/wHXAeAB2wH/AQABLgEnAf8IAALUAfQB/wIQAdgB/wKJ Ae0B/wKXAfEB/wKZAfEB/wKrAfMB/wKrAfMB/wKZAfEB/wKXAfEB/wKJAe0B/wIQAdgB/wLUAfQB/zgA AdYB9QHkAf8BAAG2AToB/wGBAdgBpgH/Af4B/wH+Af8EAAEPAbUB2wH/Af0C/gH/Af4D/wL+Av8B/QH+ Av8B/gP/AeoB9wH7Af8BQQHIAeUB/wFCAckB5AH/AUIByQHkAf8BQgHJAeQB/wGBAc8B5wH/AYQB0AHo Af8BugHlAfIB/wUAAS4BJwH/AdcB4AHbAf8DgQH/ASwBMQEvAf8BLwEzATEB/wExATYBNAH/ATQBOAE2 Af8BNgE7ATkB/wE5AT0BOwH/ATsBQAE+Af8BPgFCAUAB/wFAAYEBgAH/AYACgQH/Aa0BtAGxAf8B1wHg AdsB/wEAAS4BJwH/DAACtQHtAf8CGAHbAf8ChwHuAf8CogHzAf8CpwHzAf8CpwHzAf8CowHzAf8CiAHu Af8CGgHbAf8CtQHtAf9AAAHJAfIB2wH/AQoByAGBAf8B4wH5Ae0B/wQAASwBwgHgAf8BNAHDAeIB/wE2 AcQB4wH/ATYBxAHjAf8BNgHEAeMB/wE1AcQB4wH/ASkBwAHgAf8B7QH4AfwB/wHzAfoB/QH/AfMB+gH9 Af8B8wH6Af0B/wHzAfoB/QH/AfMB+wH9Af8B/AL+Af8EAAG1AcgBxQH/ATEBhgGBAf8B1wHgAdsB/wHX AeAB2wH/AdcB4AHbAf8B1wHgAdsB/wHXAeAB2wH/AdcB4AHbAf8B1wHgAdsB/wHXAeAB2wH/AdcB4AHb Af8B1wHgAdsB/wHXAeAB2wH/AdcB4AHbAf8BPAGOAYgB/wHEAdMB0QH/DAAC/gL/AsgB8QH/AjEB3AH/ AicB3wH/AjcB5gH/AjkB5wH/AioB4AH/AjMB3AH/AsgB8QH/Av4C/0QAAa4B8AHMAf8BugHzAdQB/0QA AbgBywHJAf8BAAEuAScB/wEAAS4BJwH/AQABLgEnAf8BAAEuAScB/wEAAS4BJwH/AQABLgEnAf8BAAEu AScB/wEAAS4BJwH/AQABLgEnAf8BAAEuAScB/wEAAS4BJwH/AQABLgEnAf8BmAGzAbAB/xgAAvkB/QH/ At8B9wH/As8B8wH/AtAB8wH/At8B9wH/AvkB/QH/TAAB+gH+AfwB/wHlAfsB7wH//wBBAAFCAU0BPgcA AT4DAAEoAwABQAMAAVADAAEBAQABAQUAAYABAhYAA/8BAAL/BgAB/AF/BgAB/AE/BgAB/AE/BgAB/AE/ BgAB/AE/BgAB+AEfBgAB+AEfBgAB8AEPBgAB4AEHBgABwAEDBgABwAEDBgABgAEBBgABgAEBBgABgAEB BgAC/wYAAf8BwQL/AeMB7wP/AYABhwHnAeABBwHAAQMB1QEIAYMBwwHwAQ8BwAEDAaoBnAKBAeABBwHA AQMB1QEIAcABAQHAAQMBwAEDAaoBgAHgAQEBwAEDAcABAwHVAQEB8AEDAYABAQHAAQMBqgGrAeABBwGA AQEBwAEDAdUBVQHAAQ8BgAEBAdABAwGqAasBgAEPAYABAQHAAQMB1QFVAYABBwGAAQEB4wHHAaoBqwGA AQEBwAEDAeMBxwHVAVUBgAEhAeABBwHoAQcC/wGAAWEB8AEPAfQBDwL/AeAB+QH4AR8B+AEfCv8B8AEP A/8B8AL/AcABAwH4AX8B/wHgAgABgAEBAcABBwH/AcACAAOBAQEB+QGAAgABAQKAAQEBwAEBAYABAQIA AYABAQGAAQMBwgFDAgABgAEBAQABBwHCAUMBAAKAAQEBAAEPAeABBwUAAQ8B4AEHAQABQAMAAQcB8AEP AQABQAEAAQEBAAEHAfgBHwEAAUABgAEBAQABDwH4AR8BgAEBAcABAwEAAQ8B/AE/AYABAQHAAQcBAAEP Af4BPwHAAQMB4AEPAYABHwL/AfABDwL/AcABPwL/AQABAwEAAQEB/wHBAv8BAAEDAgAB/wGAAdUBVQEA AQMBAAEIAYABCAGqAasBAAEDAQABHAGAARwB1QFVAQABAwEAAQgBgAEIAaoBqwEAAQMCAAGAAQAB1QFV AQABAwEAAQEBgAEBAaoBqwEAAQMBAAEDAYABAQHVAVUBAAEDAQABAwGAAQEBqgGrAQABAQEAAQEBgAEB AdUBVQQAAYABAQGqAasB/wGAAf8CgAEBAdUBVQH/AYAB/wKAAQED/wGAAf8BgAX/AcEB/wHBBf8BwwH/ AcMC/wIAAcABAwHAAQMC/wIAAYABAQGAAQEC/wGAAQEB4AEHAeABBwGAAQEBgAEBAeABBwHwAT8BgAEB AYABAQHAAQMB4AEfAYABAQGAAQEBwAEDAcABDwGAAQEBgAEBAYABAQGAAQ8BgAEBAYABAQKBAYYBBwGA AQEBgAEBAoEBnwEDAYABAQIAAYABAQH/AcMBgAEBAgABgAEBAf8B4QGAAQECAAHAAQMB/wHwAYABAQIA AeABBwH/AfgBgAEBAgAB4AEHAf8B/AL/AYABAQH4AR8B/wH8Cv8L 120, 16 This option disables list updates during the find and delete processes and only shows you a final result at the end. You won't be able to see the progress but it will be much faster. Hint: Set pause time to 0 to further increase deletion speed. Possible patterns: - Specific file names: test.tmp will match only files named exactly "test.tmp" - Wildcard expressions: *.tmp will match all files with the ending ".tmp" like "dummy.tmp" or "empty.tmp" - Regular expressions: /^tmp\.[0-9]+/ will match all files that are named like "tmp.001" or "tmp.002" etc Define which file names should be ignored when looking for empty directories. If one of those patterns in a filename is found RED will act as if the file doesn't exist and detect its parent directory as empty if no other files are in it. CREDITS Special thanks go to: * All the generous users that send me donations over the years. I really appreciate every contribution! * gioccher for many improvements and bugfixes he contributed * jsytniak for the "Ignore folders newer than N hours" feature he implemented * Wolf from the Computer Club Sunland Village (Mesa Arizona) for his continuous kind feedback and beta testing! * Havy A.C. (ZyntaXis) for helping me with the Windows 7 and Vista compatibility * Russ for his idea of protecting and unprotecting directories * All other kind users who did send me their feedback and error reports :) HINTS & FAQ * Right-click on a directory in the tree to get more options. * If you only care about speed you can activate "Fast mode", set delete mode to "Bypass recycle bin and directly delete dirs" and "Pause between each deletion" to zero. This should give you a great speed improvement but you will lose the recycle bin safety net and you won't see the progress. I also measured the performance difference: 1000 empty dirs in normal mode take about 40 secs, with these settings less than one second. * Why am I getting these annoying "cannot access file" or "Access to ... is denied." errors? -> That means RED tried to scan or delete a file or directory that was locked by another application. This is a safety feature to ensure that programs don't access files that are currently opened by another. To fix this problem close all other programs before using RED. If that does not help you could try using tools such as Unlocker (http://cedrick.collomb.perso.sfr.fr/unlocker/). TOOLS USED TO DEVELOP RED * Microsoft Visual Studio C# Community * Inno Setup LICENSE The program is distributed under the terms of the GNU Lesser General Public License which you can read over here: http://www.gnu.org/copyleft/lgpl.html 62 AAABAAkAICAQAAEABADoAgAAlgAAABAQEAABAAQAKAEAAH4DAAAwMAAAAQAIAKgOAACmBAAAICAAAAEA CACoCAAAThMAABAQAAABAAgAaAUAAPYbAAAwMAAAAQAgAKglAABeIQAAICAAAAEAIACoEAAABkcAABgY AAABACAAiAkAAK5XAAAQEAAAAQAgAGgEAAA2YQAAKAAAACAAAABAAAAAAQAEAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAMDBABCPTkARUE+AB44SQAxTVoAV1hXAIiEfwB0fYEAdYSIAKCjpADBwb8AvcHBAOXm 5gAAAAAAwMDAAP///wDd3d3d3d3fzMzP3d3d3d3d3d3d3d/MqqzMzKzN3d3d3d3d3d3KrP/////8zM3d 3d3d3d36zP/////////M3d3d3d3crPzMzMzM/////8/d3d3dyszMzMzMzMzM///8/d3d3Kz/yqzMzMzM zM///83d3frMz/zKvqrMzMzMzM/83d3MzK6WZpuqzMzMzMzMzP3fzMzKqZdVaZm8zOuszM/N3MzMqrto aZu7ubmWmbzM/dzMyqu4lpaZm6qqqZmZzP/8zMq7aWlmmbu+rMyrmaz/zMzKqZlprMqqzMvMypmcz8zM qqmZrJVXVVecy1dpvM/MzKq5nJUiJ1VVUZyXmszPzMzMucZVESdVVXU5/MzMz8zMzLxlIiJVVVV3I8zM zM/8zMyrVVUiJVVVV1BvqqzP3MzKx1UiIiIlVVVTfMuZzd/MzMVSIiIiIiVVU3vK6Zzf/MzHUiIiIiIi IiN5/MzP3fzMySAyJVJSIlETaf///93fzMtA3QAVVVIANWn///3d3/zLgw3d0BEN0Edq/93d3d3/+pgw 3d3d0ARXbP3d3d3d3/y5hDAAAANFdr/d3d3d3d3/q5h0MzNFV3n93d3d3d3d38uZZ1VVVXec3d3d3d3d 3d38qZZ3d3eL/d3d3d3d3d3d3fy5loia3d3d3d3d3d3d3d3d3czd3d3d3d3d3f/4D///gAH//wAAf/wA AD/4AAAP8AAAB+AAAAfAAAADwAAAAYAAAAGAAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AACAAAABgAAAAIAAAADAAAAA4AAAAeAAAA/wAAAf+AAAP/wAAH/+AAD//wAB///AD////P//KAAAABAA AAAgAAAAAQAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQARHSQAMDEyACc5QwAsP0oANEBFAFZX VgBmfIYAf4SEAI6RkQCepakAr7KzALvCxQDR0tIA7e3tAAAAAAD///7u7u/////+3u7u7u///+3u7u7u 7v/+3u3d7u7u7/3tuZvN7e7v7ty5mrzLrO7u3Jm8zd7a3u3bumZmjYre7dyWVmZ27d7u3GZWZmW8zv7q ZVVVZZ7N/uwhJWYVnu7/7XHwEBe+///+x0ETaO/////rl2eO///////cz/////gf///gB///wAP//4AB //+AAf//AAD//wAA//8AAP//AAD//wAA//+AAP//gAD//8AD///gB///8A////x///8oAAAAMAAAAGAA AAABAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIDBAAFBQUACAYHAA0NDQARDg8ABAwRAAkN EAAQDxEACxUcABISFQAYFxcAFBUZABwaHAAgHx8ADhYiAAwbJQAOJTYADyo4AB8mMQAWKjUAJSMjACko JwAqJikAKyssADIuLwAzMS8ALzE1ADIxMQA3ODcAOzk3ADc4OgBBPDYAQT06AEVAPQBIQDsAFTJEABo+ VQAkOEMALUFLADFATAA8Q0sAIkJTAC1EVAAkSVwALU5cADJQXAAaSWIAJU1kACFSaQAxVGEAPldgADtZ ZgA2XXAARURDAEhGRABJSEYAR0pPAExLSgBTSkMAUU5LAE9QTwBSUE4AXVNMAENMUwBOT1IATVVZAFRT UgBYVlQAWVhWAFdcWwBcW1kAZFtVAGBeXABiYF4Aa2VfAEJaYgBKXWQAS11pAEVhaQBVY2YAWmNkAFRl aQBbZWkAXWlrAEpncQBPbXkAVW10AFhscQBedHsAZWRiAGhlYgBnaGYAbmtnAGJrbQBsa2oAcW5qAG5w bgBwcG4Ae3NtAGFvcwBmcnUAa3JzAGV1eABseXwAdnZ1AHd4dwB+eXUAcnl6AHl9fQBBboEATnCBAGR5 gQB0foEAXYiaAGyAgQB1hIMAfIKDAHyJhgBwho4AeIeMAHaQjwBhhpQAaoSSAGaPnwB6j5AAfp6qAIGE hACDiIcAjomDAICEiACEi4sAi42NAJWNhQCTj4oAj5CPAI2OkQCHkpMAjJKSAIWcnACNmJsAkpSTAJOX mACUmZoAmZubAKGdmgCPnqMAgJ+tAJqdoACOpKMAl6OnAJ2iogCWpasAnaOoAKOkpQCopaEAoqinAKup pwCipagApKmqAKqtrACwsK4AuLGtAKSssQCrrrAArLGyAKKyuACttboArbi5ALGztAC5tbIAtri2ALq5 tQCwtrsAtbq7ALq8vAC9wL8AwcC9AL+/wAC8wsIAv8jGAL3DyAC/yMwAwsTEAMnGwQDHyMcAw8XIAMTJ yQDIyckAysrMAMrNzQDNzc0A0M7NANDRzgDEztAAy87RANDP0ADH0NEAzdHRANHR0QDR1NMA1NTTANPS 1ADS1NQA1dXVANjV0wDZ2NYA1dbYANjX2ADU2dkA29vbAOHf3gDh4d8A3d/gANzh4QDh4eEA4+TjAOTk 4wDh5OQA5eXlAOjn5wDo6OcA5+boAOjn6ADm6OgA6enpAOzq6gDq7OoA6+rsAOzr7QDq7OwA7e3tAPHw 7gDm7PEA7u/wAO7w8ADx8fEA9PPzAPP08wD09PMA8vP0APL09QD19fUA9/j3APj49wD39/gA+Pf4APf4 +AD5+fkA/Pz7APv7/AD8+vwA/Pz8AL+x/wDa0f8A////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPj08u/y 8vj6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD68uTUzL+8ubm5ub/J1d3t+gAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8tvJt7K6xNLZ5Orq5d7VzL25x9vyAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAPLUubC91+vy8/P0+Pj4+vj4+vry38q/1PIAAAAAAAAAAAAAAAAAAAAAAAAAAAD43b2x 0Ozz8vLy8vLy8/T0+Pj4+Pj4+Pry0sTb+AAAAAAAAAAAAAAAAAAAAAAAAPLQsc/s8vLy8u/t7Ozt7e/y 8vLy8/P0+Pj4+PLO0vMAAAAAAAAAAAAAAAAAAAAA6r+54e3t7Ozs7Ozs6ufq6uvs7e/v7+/y8vPz8/T4 4tDvAAAAAAAAAAAAAAAAAADlucfq6+vq5+fn5+fn5+fl5+fq6+zs7Ozw7vLy8vLy+O/S7wAAAAAAAAAA AAAAAOW5zNLO1dTY2dvb29vc4OHi4uTn5+rr7Ozs7Ozv8u/v8vT01fMAAAAAAAAAAAAA67zQ0/z85dK/ v8vQ0tLT1djb3ODh4+fq6uvr6+zt7e3t7e/z9Nf4AAAAAAAAAADzxMnc4v/////63r+3ub7HzNDV19vb 4eHn6urr6+zs7Ozs7Ozu8/LbAAAAAAAAAPzVv+Tbzs3d6Ojh3d3bxKmrr7O2wsXR2uPm5+vr6+vs7Ozs 7Ozs7fPn7AAAAAAAAOe83+Hb0sCsqp2RkY2Gka+1s7TD0dXW0dHW6+vq6ufq6+zs7Ovr7PD03foAAAAA +szS4dzY09LMv6+ahGlfX2FqkK+6paW00dba1trn4dvY2N3n6+vq6uvt8uoAAAAA57/h3dnU0tDJv7yv rq6cdlRRRl6AoJZ9eZW02ubWxquanKGx0uXq5+fr8uf8AAD8ztXd29fTzsm/vK+zr5d0c4OKnpygrq+z s6iLi6+vlJ+EgoCKh6zZ5+fn7PLyAADyxOHb2dPSzMC8r7erg3SOjY2kh5efpKmvs7vDvrW7s8yevbev qY+d1OTl6vPsAADh0N3Z19LQwbywt692iZCNiKmDio+Ul5ygqbC8xrvDxr+anpqfmZmUm9ji5/DvAADS 2NvX087Iv7e3s4mMkI6Hn5dtjY6QlJecoKmwu76w6uK/8bWnraOXjqzc5Or0+PjM4djU0s/EvLC5nIyQ joeHpJCOpbfL1dra1c++urewpdL0//XDp6OelJDO4ef48/PQ3dfT0szEt7uwj5eOjYSIpcvm6864r6qs sc3t+OfPqcjy1Orps6OalJC32+Lz8+/S29TVzsm/t72fnJCOjZ/V7LiFS0tgaWBaWl1ggaLs7tXgiEpg jZCal5y92N3t9OzU29TS0MnEvLycl5CPu+y4Yz88PkNaYUpFPD4+Skkim/jmrikcHjxrq7nS1Nvs9OzY 29TS0Mu/xrekmpfS44ZIOyMjNyJHYUpERT43PFpHFkfn8rqtnqW8zNDS1dnr+O3b29XS0Mm+0bqhnNfU a0hHPCAgISJJYVpcXEdHSVxfRQtC4vfg2NXQzNDS0tfr+PLb3dfS0MzD0rmg0tNrSj4+OCE3NzdHSVpc WlpcX2FiWjYHeO3y19LMyczO0tft+vjc4tjT0szG1bC97GNbRzw2Pj06ODw+Q0VHSlpcXF9iX0UNJ6H5 5tLMy8zO1dnz/ADd59vX1c7I0q/wnURJRD4+Qzo3ODo6PD5ER0dKWlxfX0ocEH/S+sS/ydDS09v4AADk 7OHb19XPxtHmWkdEQzo6ODY2Nzg6PDw+REVHSlpaWkk3Bmih+sikmpepzuP6AADt7Ofd29fSuvC2QUdD PDg3NiI2Nzg4ODg6PD5DREVFRUU4DFmO3Oq8rJ2PhMHnAAD66+vk4NvXy/emOUU8ODYiIjY2Njc2Nzg3 ODg6PD5DQ0M4DFmNv/rUzLKkkIOy+gAA6+/n4dzY1eqmQEU6NiI2Njg4ODo4ODc3ODc4PDw8PDw3CWiH r/yzt7ewpJeg9AAA9O/r5N3X5eCnTkM6NjY2ODo6Ojo6ODg4Nzg4ODo6OjohFGiHofz89O/v5+fs+AAA AO3y6ubX8NuuezYcHBw2ODo8PT06Ojw6Ojg3ODw8HBoXLnGHoPz////8+Pz8AAAAAPjz7+vc8Ny3kykY AAACDhkdPEM9PT49PDw8PjwOABkQV3WHofz////8/P/8AAAAAADz+O/n7Oa8pm8WAQAAAAAAAw4cQ0dF RENDHAMABA0tZ3+HsPz4+Pz/AAAAAAAAAAAA9vjv5+zGrn4rDAAAAAAAAAAABENDIRUDAAABDSRXbH+N zPTs+PwAAAAAAAAAAAAAAPj45/jPt6N8JgoBAAAAAAAAAAAAAAAAAAEFElVkbICQ7PL6/AAAAAAAAAAA AAAAAAD47Pzavq6YciobBAAAAAAAAAAAAAAAAwokT1hmbYOv/Pz8AAAAAAAAAAAAAAAAAAAA+O3wy7Ol knoxKB8LAQAAAAAAAQgIECxPUmZsdY7n/wAAAAAAAAAAAAAAAAAAAAAAAO381b2voIx3bi8kEw0KBAQK DxEqNExSXmZtg8b/AAAAAAAAAAAAAAAAAAAAAAAAAADy9Mi3q5+PeHBWNTAlJSUsMjNMTVBeZmx/r/wA AAAAAAAAAAAAAAAAAAAAAAAAAAD89PC+r6mcjoNxZ1hSTk1NTU1QU1RmbHWu+AAAAAAAAAAAAAAAAAAA AAAAAAAAAAAA/PrvvK6gl46EdWhlXlRTU1NUXmZsg7v4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD6 9MiroJeOhIJtbGZmZmZmbHWc4PwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+vrqvKWaj4qEgnV1 bXWDoOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD7+vLXu62fmZqgsNIAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP// +Af////c//8AAH///9z//AAAH///3P/wAAAH///c/8AAAAH//9z/gAAAAP//3P8AAAAAf//c/gAAAAA/ /9z8AAAAAB//3PgAAAAAD//c8AAAAAAP/9zgAAAAAAf/3OAAAAAAA//cwAAAAAAD/9zAAAAAAAH/3IAA AAAAAf/cgAAAAAAB/9yAAAAAAAH/3IAAAAAAAP/cAAAAAAAA/9wAAAAAAAD/3AAAAAAAAP/cAAAAAAAA /9wAAAAAAAD/3AAAAAAAAP/cAAAAAAAA/9wAAAAAAAD/3IAAAAAAAf/cgAAAAAAB/9yAAAAAAAH/3IAA AAAAAP/cwAAAAAAA/9zAAAAAAAD/3OAAAAAAAf/c4AAAAAAB/9zwAAAAAA//3PgAAAAAH//c/AAAAAA/ /9z+AAAAAH//3P8AAAAB///c/4AAAAP//9z/wAAAB///3P/AAAAP///c/+AAAB///9z/+AAAP///3P/8 AAH////c//8AD////9z/////////3CgAAAAgAAAAQAAAAAEACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAABQUFAAsLDAANDxQADRIYABISEwAXFxgAGxsbABQcIQAcIicAHCUsABUoNQAXLj4AGC8/ACMj JAAjJCgALSwrACMtNAAhMDkAKTY9ADMxMQA4NzcAPz06AEI8NwBDPzsAQUA/AExDPQAdNkgAHztKACtA SQAsSlYAKUlcADNRXQA/UVwALE5gADVTYQBFREMATEZBAEhGRQBJSEYASklIAE1KSABNTEoATU1MAFBO TABRUE4AXVVOAFNTUwBUU1EAVVRSAFZVVQBYVlUAW1lWAFxaWQBdXFoAX15dAGFeWwBhX10AYmFfAGdj XwBtZV8ARVxkAE5eZQBUYmYAU2VpAFtmaABIbXwAW2dwAFVscwBcbHAAYmJgAGViYABlZWMAYmZlAGdm ZgBpZ2QAaGhmAGBpaQBlbW8AampoAGxraQBsbGwAZm5wAGtzdQBidH8Abnt9AHNycAB0c3EAe3dyAHN5 eQCIhH8Ab32BAHF+ggB8foAAX4KPAF6BkQB3gIEAeoCAAH6CggB7g4QAeYiHAHeHjQB/i4oAdZOhAIKH hgCLhYAAioiFAIGHiACGiYkAg4uMAIWLjQCGjY4AiIuLAIuMiwCOjIkAjY+QAIaSkACJkZIAjZGRAIiU kwCOkZUAj56fAJCSkgCVk5AAkZSVAJWVlACfmZMAk5mYAJeamgCWmZ0AmZqaAJianQCZnZ0AnJ6eAKCb lwCmoZwAhJqlAJmeoQCQo6IAmqChAJ2hogCboaQAnKOkAJ6lpQCdpqkAl6mqAKGiogCgpKMAoqWmAKSl pgCppaMAqaenAKWnqACiqKkApqqqAKOqrgCkqa0Ap6yvAKmpqQCorKsAra2rAKmsrACurq0Ap66wAKuv sACusbIAqbK0AKe2ugCutbgAr7q7ALC1swCxsbUAsra2ALW2tgC4t7UAtLi3ALW3uAC2ubkAtbu8ALC+ vQC5uroAv7y7ALm9vQC+v74AwcG/AL3BwQC/w8QAwMLCAMHEwwDCxcUAxcbGAMfIxwDCx8gAxcnJAMTJ zwDJyckAzMvJAMvMywDJys0AzMvNAMvOzgDNzc0A0M/NAM/QzwDR0M0A0M/RAMvR0ADO0dEAzNLUANHR 0QDT09QA1NPUANLV1QDV1dUA19jXANnY1gDS2NgA19jYANbd3QDZ2dkA3NzbANnb3ADa3NwA3d3dAODe 3gDh4N8A3+LhAODh4QDk4uIA4uTjAObl4wDj4+QA4eTkAOXl5QDp5+UA5+jnAOjo5wDh5+gA5efoAOHo 6ADp6ekA6+zsAO3t7QDw7+4A8O/wAO7w8QDx8fEA9PPyAPT08wDw8vUA9fX1APf49wD5+fkA/Pv8AP39 /QD///8AAAAAAAAAAAAAAAAAAPr28fDx9vsAAAAAAAAAAAAAAAAAAAAAAAAAAAD88dXDx9Lb39zZ09Hc 9gAAAAAAAAAAAAAAAAAAAAAA6cPN6ff6+/z8/Pz8/Pbg1vMAAAAAAAAAAAAAAAAA+MvS9Pr6+Pf3+Pr7 +/v7/Pz75OEAAAAAAAAAAAAAAPHF6ff29vb08/Lz9Pb39/j6+/v79+P8AAAAAAAAAADwyeDk6enr6+zw 8PHx8vT29vb3+vr6++f9AAAAAAAA88nk/vrn0svV29/i6evw8vP09Pb39/f4++wAAAAAAPzL6+Hq9/fz 4cu2usHQ2OXx8vT09vb29vb3+vMAAAAA3+Hr4Mm1lntqcpeywM7a2trt9fLy8vT29PT39PwAAPrV8Ofg 1su/pYthTUlsmXmKs+jv2ruxu9/y8vP69gAA4+fp4dvRv7mvdGR1jJSqtrmpkaijpXiJg67s8fP3AADb 6+Tc0sO5qmZ/eppwhJOfr73Pz9DFl6KdjaDr8fr8+tzn4NbJurl3gHqSdnOFoaqssbrB1OD1xqibg7jw 9/vy5+Pe07/Aj4R8cZW94tfKxMzh8d2w4vL5wpyMkuny/PDr4NvSwbyOgoDF1348O1ZLODtYhubuqzFX apWt4fD78Ozg2dLItpiY4ocuGiUpUTYxLCxHFqLxgV19vtnf6fvx8ODZ0tS5pOVpNC0XGCdPSkw3OlA5 B6T75d7V1tzn/PTx493V2LblWjgpKSknLDI2OkhMUVEkE9Xz3dPV3Ov9+/Hp4NvY0a40MywtJyYqKy0z NkZPUDUIdvrDu8nf8v0A8vHp4MjyUzQtKCQZJicoKS0wNDY2Mw5c1d+wjIXhAAD38/Dp3eVDMicZJCQm JiYmJicrLS0tD1u08sW3lHzyAPz38ezp3VQvJCQmKCgqKCcmJygpKikRYJ788eff2/cAAPr28fHdiCQH DhkrLS0qKyooKS0QFB1ilf7+/v3+/QAAAPv28uKnIQMAAAEGFCszMTAkBQEJRGii/v3+/v4AAAAA/Pzz 8LpnCgEAAAAAARUQBQAABSBTbL76/AAAAAAAAAAA/fj6y6ZfEgUAAAAAAAAAAQQeRVlz8f0AAAAAAAAA AAAA/frfuZBeIhEGAgEBAgMLI0BTYrT+AAAAAAAAAAAAAAAA/PrIsI1lQh8bDQwcIz0/UlmL+wAAAAAA AAAAAAAAAAAA/PO6pYVtVUVAPj4/QU5Zi/YAAAAAAAAAAAAAAAAAAAAA/fa9oYRvYFlTUlJTY7n8AAAA AAAAAAAAAAAAAAAAAAAAAPzpto58bmtrfMEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPbxAAAAAAAA AAAAAAAAAAAAAP/4D///gAH//wAAf/wAAD/4AAAP8AAAB+AAAAfAAAADwAAAAYAAAAGAAAABgAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAABgAAAAIAAAADAAAAA4AAAAeAAAA/wAAAf+AAAP/wA AH/+AAD//wAB///AD////P//KAAAABAAAAAgAAAAAQAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAFBQUADRETABkZGQATHCEAER0lACYlJAAuLy4ALDAzADk6PAAnOUMALD9KADRARQBFQ0EARkZFAEhH RQBISEcAS0lIAExKSQBOTUwAUU5MAFJRTwBOUlQAUlFQAFdVVABYVlUAW1tZAGBdWgBpYlwAUWNoAFtn awBca3AAZGNhAGBrbQBqaWgAZnJ1AHd3eABme4QAZ36IAH+EhACKh4UAg4uMAIWMjACMjYsAlpOPAIiR kQCVl5cAkpiYAJaamgCfo6cAnqerAKKioQChpacAqaajAKysqwCorq0ArK6vAK2xsgCwsrIAsre4ALS5 uAC2u7wAs7+/ALW+vwC4uroAuby8AL3CwwC5w8cAwMHAAMLFxQDHyMgAyMnJAMnMzADMzc0Ays7TANHS 0QDT1dUA1dXVANLa2gDV2NkA2dnZANrc3QDd3d0A4eHiAOPj5ADj5OQA5eXlAOjn6ADm6OgA6enpAOzs 6wDt7e0A8fHxAPTz8wD19fUA+fn4AP39/QAULwAAIlAAADBwAAA9kAAATLAAAFnPAABn8AAAeP8RAIr/ MQCc/1EArv9xAMD/kQDS/7EA5P/RAP///wAAAAAAJi8AAEBQAABacAAAdJAAAI6wAACpzwAAwvAAANH/ EQDY/zEA3v9RAOP/cQDp/5EA7/+xAPb/0QD///8AAAAAAC8mAABQQQAAcFsAAJB0AACwjgAAz6kAAPDD AAD/0hEA/9gxAP/dUQD/5HEA/+qRAP/wsQD/9tEA////AAAAAAAvFAAAUCIAAHAwAACQPgAAsE0AAM9b AADwaQAA/3kRAP+KMQD/nVEA/69xAP/BkQD/0rEA/+XRAP///wAAAAAALwMAAFAEAABwBgAAkAkAALAK AADPDAAA8A4AAP8gEgD/PjEA/1xRAP96cQD/l5EA/7axAP/U0QD///8AAAAAAC8ADgBQABcAcAAhAJAA KwCwADYAzwBAAPAASQD/EVoA/zFwAP9RhgD/cZwA/5GyAP+xyAD/0d8A////AAAAAAAvACAAUAA2AHAA TACQAGIAsAB4AM8AjgDwAKQA/xGzAP8xvgD/UccA/3HRAP+R3AD/seUA/9HwAP///wAAAAAALAAvAEsA UABpAHAAhwCQAKUAsADEAM8A4QDwAPAR/wDyMf8A9FH/APZx/wD3kf8A+bH/APvR/wD///8AAAAAABsA LwAtAFAAPwBwAFIAkABjALAAdgDPAIgA8ACZEf8ApjH/ALRR/wDCcf8Az5H/ANyx/wDr0f8A////AAAA AAAIAC8ADgBQABUAcAAbAJAAIQCwACYAzwAsAPAAPhH/AFgx/wBxUf8AjHH/AKaR/wC/sf8A2tH/AP// /wAAAAAAAFxUU1RWWgAAAAAAAAAAXFFXXV5fX19ZWgAAAAAAV1JaWlpaW1xdXl5bAAAAW1JdVk1JT1Nb XFxcXV0AAFJTSTYrKjk+TlhNU1tcAFtWUEY3LTA0PD9CODRBWl9ZU0tBLzA6QURLSFhKMUldV1FJOTg1 HCAbGyhJJDNMXFpSTEUsFA0YICAiFlhQUFxdVk9AGRIOEhUaIAk7RkBcAFtUMhMNEBAPERQJL1hHTABf W0MIAwcOFxIGDC5gYGAAAF5RJQIAAAMBBB86XwAAAAAAXD0mCwUFCh0nWgAAAAAAAABZOSojHiEpVQAA AAAAAAAAAABRRUUAAAAAAAAA+B8AAOAHAADAAwAAgAEAAIABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAA AACAAAAAwAMAAOAHAADwDwAA/H8AACgAAAAwAAAAYAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAP39/QL9/f0a+/v7Svr6+nn4+PiU9vb2t/T09MLy8vLH8/PzxfT09Lv39/ee+fn5hvr6 +lv9/f0i/f39BQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAP39/QX8/PxA+fn5k/T09Nzr6+v64ODg/tbW1v7Ozs7+ycnJ/sbGxv7Gxcb+xsbG/sjI yP7MzMz+09PT/t3d3f7o6Oj98vLy4fn5+aD8/PxC/f39BgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAD9/f0I/Pz8bPX19dvm5ub+09PT/sTExP6/v8D+xcXH/tDP0f7b2tz+5OTl/uvq 7P7u7u/+7u7v/uzs7f7n5uj+39/g/tXV1/7Ly8z+yMjI/tLS0v7l5eX99fX13Pv7+3P9/f0IAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAA/f39Avz8/E/19fXd4ODg/sjIyP69vb7+y8rN/uHg4v7w8PD+9vb2/vf3 9/739/f++Pj4/vn5+f76+vr++vr6/vv7+/76+vr++vr6/vv7+/77+/r+9vb2/ujn6P7T0tT+zMzM/uDg 4P709PTj+/v7Xf39/QMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD9/f0a+fn5sujo6P7Ly8v+wcHC/tjY2v7y8fH+9/b2/vb2 9v719fX+9fX1/vX19f729vb+9vb2/vf39/74+Pf++Pj4/vn5+f75+fn++fn5/vn5+f75+vn++vr6/vr6 +v77+/v+9fX1/tzc3f7Qz9D+5ubm/vn5+bP9/f0UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP39/UP09PTm2NjY/sHBwv7X1tj+8fHx/vb2 9f729vX+9vX1/vX19f709PT+8/Pz/vLy8v7y8vL+8/Pz/vPz8/709PP+9fX1/vb29v729vb+9vb2/vb3 9v739/f++Pj4/vn5+f75+fn++fn5/vr6+v719PX+2dna/tra2v729vbd/f39LAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+/v7W+/v7/nNzc3+x8fI/uno 6f7z8/P+8/Py/vLy8v7y8vL+8vLy/vLy8v7y8vH+8fHx/u/v7/7u7u7+7+/v/u/v7/7w8PD+8fHx/vPy 8/709PT+9PT0/vT09P709PT+9fX1/vb29v739/f+9/j3/vf39/74+Pj++vr6/urq6v7Y2Nj+8/Pz6fz8 /DMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD7+/tf7Ozs+sjI yP7S0dP+7+/v/vDw8P7w8PD+7+/v/u7u7f7t7e3+7e3t/u3t7f7t7e3+7e3t/u3t7f7s7e3+7Ozs/u3t 7f7t7e3+7u/v/vDw8P7x8vL+8vLy/vLy8v7y8vL+8vPy/vP08/719fX+9vb2/vb29f729vb+9vb2/vn5 +P709PT+29vb/vPz8+n9/f0sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPz8 /Ffs7Oz6x8fH/tfV1v7f3Nz+2NbW/t3e3P7h4eD+4+Pj/uTk5P7l5eX+5ubm/ubm5v7m5ub+5ufn/ufo 6P7p6en+6urq/urq6v7r6+v+7O3s/u7u7v7v7+/+8PDw/vDx8f7w8fD+8fHx/vHy8f7y8vL+9PT0/vX1 9P709fT+9PT0/vb29f74+Pj++Pj3/t3d3f729vbh/f39GQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAA/f39NfDw8PLJycn+2NfY/uHf3v78/P3+/Pz8/uzr7f7b2tv+zMzM/s7Ozv7T1NT+2NjY/trb 2v7c3dz+3t7e/t/g4P7i4+P+5ebm/ufn5/7n6Oj+6enp/urr6/7s7e3+7u/v/u/v7/7v8PD+8PDw/vDw 8P7x8fH+8/Pz/vPz8/7z8/P+8/Pz/vPz8/709fT+9/f3/vj4+P7h4eH++Pj4xf39/QYAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAD9/f0N9vb21tDQ0P7U1NX+6Ofn/uvp6v7+/v7+/v7+/v7+/v7+/v7++/v8/ufn 6P7Nzs7+w8PD/sfIx/7Lzcz+0NLR/tXW1v7Y2tr+3d/f/uHi4v7k5eX+5ebm/ujp6f7p6ur+7O3t/u7v 7/7v7+/+8PDw/vDw8P7x8fH+8vLy/vLy8v7y8vL+8fLx/vLy8v7y8vL+8/Tz/vf39v719fT+5ubm/vv7 +3UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD7+/uS3d3d/s3Mzf7r6+v+5eXl/trX1v7Z1tP+6ejn/u/v 7v7x8O7+6+no/uno5/7p6Of+5uXl/s7P0P6ztbb+tbi3/ri8vP64wcL+wMnK/sTO0P7H0NH+09jY/uLk 5P7p7Ov+6+zs/u3u7v7v8PD+7/Dw/vDw8P7w8PD+8fLx/vLy8v7y8vL+8vLy/vHx8f7x8fH+8fHx/vPz 8/739/b+7u7u/vHx8fT9/f0hAAAAAAAAAAAAAAAAAAAAAP39/Snu7u77ycjJ/ujn6P7p6en+5eXl/tzc 3P7Qzs3+u7a1/rm0sv6vqqf+oZyZ/p6cmv6Wk5D+kY+L/qGfm/69vbv+vsTF/rrCxv6/xcX+y9DQ/tXa 2v7b4OD+2ODh/tPc3f7R2tv+2uHh/u7w8P7v8PD+7+/v/u/v7/7u7u7+7+/v/vDw8P7x8fH+8fHx/vHx 8f7w8PD+8PDw/vHx8f7y8/L++Pj4/ujo6P76+vqjAAAAAAAAAAAAAAAAAAAAAPn5+anV1dX+29vc/unp 6f7n5+f+4+Pj/t/f3/7a2tr+1dXV/s7Ozv69vbz+pKSk/ouMi/52d3X+bGxp/mlraP5ucG7+d3h3/pmb mf66vL3+wcbI/qu0tP6ptrP+v8jG/tXa2P7d4uL+4ebm/trj5P7f5uf+6+3t/unp6f7m5ub+4+Pj/uPj 4/7o6Of+7e3s/vDw8P7w8PD+7+/v/u/v7/7w8PD+8/Py/vb29f7v7+/3/f39IgAAAAAAAAAA/f39JO3t 7fjNzM3+6enq/ujo5/7k5OT+4eHg/tzc3P7Y2Nj+09PT/s7Pzv7Jycj+uby8/rK5uv62u7z+oaeo/n2G hv5daWn+W2Ji/ldcW/5kamz+g4iH/qisrv6Xo6f+eo+Q/naQj/6OpKP+wMvI/uHl5P7o7e3+2uPk/s7S 0f63uLb+pKam/qanp/6ur67+wMG+/tzc2v7s7Oz+7u/u/u7u7v7u7u7+8PDw/vb29f7u7u7++vr6kgAA AAAAAAAA+vr6hNnZ2f7d3d7+6Ojo/uXl5f7i4uL+3t7e/tnZ2f7U1NP+zs/O/snJyf66vr7+v8LD/rm7 u/6dpaL+dISC/myAgf6Djo/+jJOT/qCmqf6ipqf+p6us/rS5uf65v77+vMHB/rvBwv6tuLn+hJye/oec m/63vrz+u76+/pSen/6mqqz+jIyN/oCEiP6CiIz+ipCS/o6QkP67u7j+5OTj/uzt7P7t7e3+7u7t/vHx 8P729vb+9PT04f39/Qb9/f0E9PT02s/P0P7p6en+5ubm/uTk5P7f39/+2tva/tXV1f7Pz87+yMnI/rq+ vv7BxMT+trm4/oOOi/52hIT+j5aW/pCVlP6QlZb+qq+w/oyPj/6coaH+pamo/quvrv6ytrX+ub28/r7D wv7Eysn+ytDQ/sXMzf68xMj+xcjK/r/Cxf7W1tb+oqSn/svKzf7GwsP+u7y+/rCzt/6VmJv+qKmn/uHh 3/7r6+v+7Ozs/u7v7v739/f+8fHx/vz8/DP9/f0s6eno/tjY2f7o6Oj+5OTk/uHh4f7c3dz+19fX/tDR 0P7Jysn+vL+//sLGxv65vLv+fImG/oeSk/6YnJz+kZWU/o2Pkf6ytbb+iIqK/o2Skf6Wmpn+mp6e/p6j ov6ipqb+qa2s/rG1tf69v7/+yMvK/s7S0f7Fysn+yc/T/s/R0v7NzMz+p6Wl/qamqP6io6b+o6ir/p2j qP6co6b+mJ2h/qimo/7j4+L+6urq/u3t7f7y8/L+9PT0/vr6+nP6+vpo29vb/uPj4/7l5eX+4uLi/t7e 3v7Z2dn+0tPS/szMzP7CxMP+wMTE/sDCwv6JlJP+jpiY/picm/6TlpX+jZCQ/qWoqv6eoKD+eHt6/pGT k/6Ulpb+mJqa/puen/6foqL+o6en/qmtrP6xtLT+u7+//sbKyf7Lzs7+vL+//u7v8P7s6ur+zM3O/vH0 9/6/w8j+rrO3/q+2u/6kq7D+m6Ck/paXmf66urf+5+fn/uvr6/7v7+/++Pj3/vf396L4+Pia1tbW/unp 6f7j4+P+4ODg/tvc3P7W19f+0NDQ/snKyf67wMD+xcfH/qKop/6Ml5f+mZyc/pWWlv6NkJD+jY+P/q2u sP6bnJv+k5WX/q2wsf7Cxcb+0tXW/tzg4P7h5OT+4OTk/t3g4P7U19j+ys3O/sPGx/7CxcX+vL6+/rCx sv7b2tn++Pj4/v7+/v739/j+yc7V/q61uv6kq6/+oKSo/pueoP6ampv+2dnX/unp6f7t7e3++fn5/vb2 9sz19fW+2NjY/ujo6P7i4uL+3t7e/tra2v7W1tb+zs/P/sLExP7Fycn+vcC//pGbm/6doKD+lZeX/pGS k/6Njo3+jY6O/q2wsf7S1df+6u7u/u/x8P7a2Nb+yMbD/r68uP64tbH+u7iz/sPAvP7Y1ND+8/Px/vj5 +f7s7u7+09bX/rK0tv7R1NX+9vb2/uLg3/7v7/D+5uzx/rzBxv6mrLD+o6Sm/pueof6am53+xMXE/ubm 5v7r6ur+9vf2/vf39+Hz8/PV3Nvc/uXm5f7g4OD+3d3d/tnZ2f7U1NT+zs7O/sHFxv7KzMz+oauq/qOo qP6anJv+lZeX/pGSkf6mqar+2t3f/vDy8f7Lx8L+lY2F/m5mX/5pZF/+cW9s/nd2df5vbWr+Z2Rg/mdk YP5ua2f+cW1o/o6Jg/64sa3+8/Lx/vP09P7c3+D+5ujq/o6Nkv5iYF/+cm9s/pWUkv6bmZr+o6Oj/qKh ov6np6f+y8zM/uPj4/7o6Oj+8/Pz/vj4+PHx8fHq4ODg/uXl5f7g4OD+29zb/tfX1/7T09P+zs/P/sfL y/7Iy8r+oKmp/qCiov6am5v+l5iZ/sbJyv7v8vL+ycXA/n1zbP5dU0z+V05I/ldRTP5XU1H+ZWNh/m5v bv5hYF3+W1hW/lJOTP5UUE3+VlJO/mNhX/5hXlr+R0I//qiloP76+vn+6uzt/ra4vP5BQkf+MzM0/js5 N/5TT0z+fnt3/ra4uv7Gxsf+29zb/uDg4P7m5ub+8fHw/vj4+PXx8fHq4+Pj/uXm5v7g4OD+2tra/tfX 1/7T1NT+zc7O/s7S0/6/xMP+q7Cw/qKkpP6eoKD+2dzd/uvs6v6Vj4n+ZFtV/lNKQ/5IQDv+R0A5/kpF Qf5GQT7+XVxb/m9wcP5hX1/+V1VT/lhXVv5SUU7+SEVC/k9NS/5mZGL+Xlta/ikoJ/5eW1j+7u7t/vX2 9v7CxMj+sLa7/qOmqP6vsLL+yMnK/tXW1v7Y2dn+29vb/t3e3f7k5eT+7/Dw/vn5+ezy8vLc5eXl/ubm 5v7f4OD+2tra/tfX1/7U1NT+y87O/tbZ2f7Dxsb+rq+v/qWmp/7f4eP+4uLf/n94c/5jXVn+XVlX/lBN SP5DPDj+QTw2/kE9Of5FQD7+YF9f/m9vb/5mZWX+ZmZm/mdoZv5eXFr+XFpZ/l9eXP5nZ2X+a2pp/llX Vf4YFxf+TVVZ/uzr6/73+Pj+5unp/uPk5P7d3t7+2NnZ/tbW1v7X19f+2tra/tzd3P7i4uL+8PDw/vr6 +t309PS/5ubm/+jo6P/h4eH/29zc/9fY2P/U1dX/ys/Q/9nc3P/Ex8b/q6ys/9fa2//f39z/f3p2/2Zh Xf9UUE3/U1BP/01JR/9DPTn/SUZD/0lFQ/9JRkT/W1lZ/2BfXf5mZWX+aWlo/mZlZP5kZGL+aGdl/mtr af5vbm3+cHBu/mVkY/5GREP+CQ0Q/nmHjP7z8/L+9fX1/uHi4v7a3Nv+1tbW/tTV1P7W1tb+2dnZ/tzd 3P7i4uL+8/Pz/vr6+rP39/em5+fn/+rq6v/j5OT/3t7e/9ra2v/W1tb/zNHR/9zf3/+9vr3/yMvM//Dz 8v96dG7/aGRg/11aWP9QTEn/R0NB/1FPTv9RUE//TUpI/0pHRv9QTUz/UlBP/1VTUf5ZWVf+XV1b/mFh X/5kZGL+ZmZl/mdnZf5ra2n+cHBu/m1tbP5bWVf+GhoZ/i1BS/6wsK7+/Pz7/urs7P7c3dz+1dbW/tPU 1P7V1dX+2dnZ/t3d3f7k5OT+9/f3/vr6+pP6+vpz6Ojo/+3t7f/m5ub/4eHh/93e3f/Z2dn/z9PU/9rd 3f+7vL3/8fP0/66rqP9bV1T/YF1b/1hWVf9RT07/Uk9P/1RTUv9OS0r/SEVE/0tJSP9NTEr/TkxL/09O Tf5SUE/+V1VV/ltZWf5eXFr+YGBf/mRkYv5paGj+bW1r/m1sav5iYWD+NDMy/g8eJ/5/g4T+29va/vv7 +/7Q0ND+zc7N/tPT0v7Y2dj+2tra/t7f3v7m5ub++fn5/vv7+1n8/Pw+6+vr//Hx8f/p6en/5OXl/+Hh 4f/d3d3/1NfX/83R0f/W2Nn/6ezs/2VkYv9dWlj/WFVU/1VTUv9OTEz/TUxL/0lHRv9GREP/RkRC/0hH RP9LSUj/TUxL/09MS/5OTkz+UlFP/lZVVP5YWFf+XV1b/mJiYf5mZmT+ZmZk/mVjYv5hX13+R0VE/gQM Ef5seX3+rq6t/vr7+v7R0tP+rK+u/qKkpP6hoqH+srOy/tfX1v7r7Ov++/v75/7+/RD9/f0M8vHy6/Ly 8v/t7e3/6Ojo/+Xl5f/h4eH/3N3d/8PIyP/y9PT/v8jM/05PUv9dXFr/VFFR/1BOTP9KSUj/R0ZE/0VD Qf9CQD3/RUNB/0hGRf9JSEf/SUdF/0pIRv5LSkf+TUxJ/k9OTP5RUE7+VFRR/ldXVf5ZWFb+WlhW/ltZ V/5aWFf+TElH/hQUGf5ec3r+mJiY/ufn5v7v7/D+ycrK/rm5uf6pqqr+lpmZ/ouNjf7Q0c7+7u7u+v39 /TMAAAAA+fn5ofDw8P/w8PD/6+vr/+fo6P/k5eX/4OHh/9PV1P/3+Pj/o7K5/0dKT/9ZWVn/T05M/0hI R/9EQkL/Q0FB/0NBP/9FREL/RkVE/0ZFRP9IRkb/RkVF/0dFRP5JR0b+SEdF/khIRf5KSEf+TUtJ/k9O Tf5SUU/+VFJQ/lRSUf5VUlH+SkdG/hMVG/5edXz+k5OT/s7Ozf77+/v+4eDg/tXV1P7AwcD+ra6u/pib m/6Gior+wMDB/vn5+ZcAAAAA/f39O/Dw8P709PT/7e3t/+nq6v/n5+f/4+Tj/9/g4P/u7+//obG4/0NM U/9YWFf/S0lJ/0VDQf9CQUD/Q0JB/0VFQ/9IR0b/SUhH/0lJSP9LSkn/SEhH/0hHRv5HRkX+R0ZD/khI Rv5IR0X+SklI/k9NTP5PTkz+T0xL/k9OS/5RT0z+SUZF/gsVHP5pen3+kJGQ/ru7u/78/Pz+wMLD/sPE xP7ExcX+vsDA/qyvrv6fo6T+qKur/vX19aMAAAAA/v7+Avf398f09PT/8PDw/+vr6//o6Oj/4eLh/+vs 7f/n6Oj/qra6/0tdaf9VVFX/TEtK/0VERP9DQ0L/RUVD/0hHR/9KSkn/S0tJ/0tMSv9NS0v/S0tJ/0pK SP5JSUj+R0dG/kdGRP5JSEb+SUdF/kpIR/5MSkj+TktJ/k5LSf5NSkn+QT09/hYqNf5we3z+j5CP/rCw r/78/Pz+/f39/vj4+P709PT+9PT0/u7u7v7u7u7+8vLy/vj4+JMAAAAAAAAAAP39/Ub08/P+9vb2/+/v 7//r7Oz/4uLi//Ly8//k5eX/tr2//2qEkv9FRkf/MjEw/zExMf8yMTL/Q0ND/0lJSf9LS0r/Tk5N/09Q T/9PT07/TUxM/0xMSv5OTkz+TUxL/ktKSP5KSkf+SUZF/ktJSP5PTUz+UU9N/jQxMf4zMS/+KiYp/jJQ XP53foD+jo+P/qusrP78/Pz+/v7+/v7+/v7+/v7+/f39/vn5+f79/f3+/Pz8/vv7+1UAAAAAAAAAAP7+ /gH5+fmu9/f3//T09P/v8PD/5+fn//Pz9P/m5+f/v8TE/4Cfrf88Q0v/Kysr/wAAAP8AAAD/BgYG/yAf H/8uLi//Nzg3/05OTf9RUlH/UFFP/1BRUP5SUVD+UFBO/lBPTf5QTkz+T0xL/lNRT/5QTk3+Hx0d/gAA AP4yLi/+DBsj/ldvdv59gYL+jpCQ/rCxsf79/f3+/v7+/v7+/v7+/v7+/f39/v39/f7+/v7+/Pz87/39 /REAAAAAAAAAAAAAAAD9/f0c9/f37fr6+v/09PT/7ezs//Hx8f/r7Oz/yMvL/6SzuP9OcIH/KCgr/wQE BP8AAAD/AQEB/wEBAv8AAAD/AAAA/wcHB/8eHR7/MTAx/1NUU/5aWlr+WVhX/lZWVf5VVVL+VVNT/jQy Mv4IBwf+AAAA/g4NDf4dGx3+LU5c/mVzd/6BhIT+kJGR/r6/v/79/f3++vr6/vr6+v79/f3+/v7+oP7+ /n/+/v5o+/r7KwAAAAAAAAAAAAAAAAAAAAAAAAAA/f39Tfj3+Pn6+vr+9PT0/u3t7f7x8vL+z9HR/rW8 vv5+nqr/LURU/xQVFv8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wwMC/5SUlL+U1JR/kA/ P/4lIyP+BwYG/gAAAP4AAAD+AwMD/hwYGv4UMkL+VGxy/nF4ef6ChIT+kZOT/tXW1v74+Pj+8vLy/vn5 +f79/f2e/f39AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPz8/G75+Pn9+vr6/u7t 7v75+fn+1tjY/sHExP6jr7P/Zo+f/yQ4Q/8TFBX/AgME/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA AP4AAAD+AAAA/gAAAP4AAAD+AAAA/gAAAP4EBAT+EQ4P/g8qOP5KZ3H+YW9z/nZ7e/6GiIn+mZub/vHx 8f729vb++/v7/v38/Lj9/f0DAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAD7+/t7+vr6/fLy8f78/Pz+4ePj/svNzf61urr/lqWr/12Imv8kQlP/LzE1/w0ODv8AAAD/AAAA/wAA AP8AAAD/AAAA/wAAAP4AAAD+AAAA/gAAAP4AAAD+AAAA/ggGB/4QEBX+FDNE/kVia/5ba2/+bnR2/nt/ f/6Ii4v+ur28/v39/f78/Pz+/f39nvz8/AcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAA/Pz8Z/r6+vb08/P+8vPy/tLU1P6+w8L/q7Gy/4+eo/9hhpT/IVJp/zFA TP83ODr/FhcY/wICAv8AAAD/AAAA/wAAAP4AAAD+AAAA/gMDA/4QDxD+EA8S/goZJv4mSlv+RWBo/lVm av5qcXL+dHp6/n+Dg/6VmJj+7O3t/v7+/vP+/v5dAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP39/Tjz8vP2/Pz8/t/g4P7Jy8v/uby7/6is rf+NmZ7/cIaO/0Fugf8aSWL/FzJH/x8mMf8YGh3/ExMT/w0PD/4NDQ/+EBEW/g4WIv4OJTb+IEJT/jtZ Zv5EXGT+V2Vo/mNsbf5tdHT+eH19/oaKiv7O0dD+/v7+2P7+/jAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD7+/tp9fX2/vj4 +P7R1NP/wsPD/7S2t/+lqan/kpmb/3iHjP9keYH/T215/zZdcP8lTWT/HD9X/xk8VP4bP1T+I0ld/jFU Yf4+V2D+QVlh/kteZP5VZGf+YWpr/mpxcv50eXn+f4SF/ri9vf78/Pzv/f39KQAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAD9/f0C+vr7kvj4+f7y8/P8ys3N/re8vf+wsrP/oqam/5OXmf+Ciov/cn+C/2V1eP9YbHH/UGRr/0xf Z/5IXGT+SVxj/klbYv5OXmT+VWJl/lplZ/5famz+aHFy/nJ4ef5+g4T+tru7/vn5+fP9/f1EAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAA/f39A/v7+5P6+frJ7/DwrsfKyv63urr/qq2u/5+jpP+Ul5j/iI2O/3iB gv9veHv/Z3J0/2Bsb/5daWv+W2Zp/lplaf5cZmr+Xmls/mRtbv5qcnP+cnp7/oSKi/7Gy8r++fn57/v6 +z8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP39/QL7+/tr+vn6wfT19ZvQ09P4tbi4/6ms rP+eoqL/kpeY/4aNj/9+hYb/eX9//3J6ev5tdHb+a3J0/mpxcv5rcnP+a3N1/nJ4ef56gYP+n6en+uPm 5ub8+/y3+/v7IwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/f39KPr5 +q/5+Pmp6OrqusfJyvessbH/n6Sk/5SanP+Nk5T/h4yN/36Gh/58goT+e4GB/nqAgP59goP+hoyN/qWr rPba3d2p+/v7UP39/S/8/f0CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAP7+/gH6+fpB+vj6lPr5+pDv8PCY1tnZwcDGx+qwtrf8pqus/52kpv6fpaX+pqys+7a7 vOzKzs646uzsdfv7+yr9/f0c/f39AwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPn4+Az59/hH+/v7Sfz8/Ev6+vpH+fr6VPf4 +Fz4+fk/+fr6Hv39/Q3+/v4I/f39AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//4AA////3P/8AAAf///c//AAAAf/ /9z/wAAAAf//3P+AAAAA///c/wAAAAB//9z+AAAAAD//3PwAAAAAH//c+AAAAAAP/9zwAAAAAAf/3OAA AAAAB//c4AAAAAAD/9zAAAAAAAP/3MAAAAAAAf/cgAAAAAAB/9yAAAAAAAD/3AAAAAAAAP/cAAAAAAAA /9wAAAAAAAD/3AAAAAAAAP/cAAAAAAAA/9wAAAAAAAD/3AAAAAAAAP/cAAAAAAAA/9wAAAAAAAD/3AAA AAAAAP/cAAAAAAAA/9wAAAAAAAD/3AAAAAAAAP/cAAAAAAAA/9yAAAAAAAD/3IAAAAAAAP/cgAAAAAAA /9zAAAAAAAD/3MAAAAAAAP/c4AAAAAAB/9zwAAAAAA//3PgAAAAAH//c/AAAAAA//9z+AAAAAP//3P8A AAAB///c/4AAAAP//9z/gAAAB///3P/AAAAP///c/+AAAB///9z/+AAAP///3P/8AAD////c//+AB/// /9woAAAAIAAAAEAAAAABACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7+/gH8/Pwy+Pj4bPLy8p7t7e286Ojo1+bm5tro6OjT7e3tu/Ly 8pn5+fli/f39IQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP39/RT39/eD6enp4dXV1f/Jycr/zMvN/9PT0//Z2dr/3d3e/9zc 3f/Y2Nn/1NPU/9HR0f/b29v+7u7ux/r6+l7+/v4DAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7+/gT5+flx5eXl8MjIyf/Qz9H/5eTl//Pz8//29vb/9/f3//n5 +f/6+vr/+vr6//r6+v/6+vr/+vr6//Hw8f/e3t//19fX/+3t7db7+/tEAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD9/f0d8fHxxdDQ0P/T09T/8O/w//b29v/29fX/9PT0//Pz 8//z8/P/9PT0//X19f/29/b/9/f3//f39//4+Pj/+fn5//n5+f/4+Pj/4+Lj/+Dg4Pz4+Ph/AAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/Pz8Kurq6uTLy8v/5uXm//Pz8v/y8vH/8fHx//Hx 8f/w8PD/7+/v/+7u7v/v7+//8PDw//Ly8v/z8/P/8/Pz//T08//19fX/9/f3//f39//3+Pf/8/Pz/+Hh 4f/39/eRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP39/Sbo6OjmzczM/+De3v/j4+L/5ubm/+bm 5v/n5+f/5+jn/+jo6P/p6en/6urq/+vr6//s7Oz/7u7u//Dw8P/x8fH/8fHx//Ly8v/z8/P/9fX0//X1 9P/29vb/+Pj4/+Tk5P/4+PiDAAAAAAAAAAAAAAAAAAAAAAAAAAD9/f0N7e3t2M7Nzv/k4uL//f3+//X1 9v/j4+T/0tLT/8/Qz//V1tX/2drZ/9zd3f/h4uL/5ebm/+fn5//p6ur/7O3t/+/v7//w8PD/8PDw//Ly 8f/z8/P/8/Pz//Pz8//09PT/9/j3/+jo6P77+/tPAAAAAAAAAAAAAAAAAAAAAPb29pnQ0ND/5+fn/+Hf 3//p5+X/8/Py//Tz8v/w7+7/4eDf/87Oz/+6vLz/wMPD/8TLy//M09T/0tjY/+Lk4//q6+v/7e7u/+/w 8P/w8PD/8fHx//Ly8v/y8vL/8fHx//Hy8f/z8/P/9fX1/+7u7uX9/f0OAAAAAAAAAAD8/Pww3d3d/eHg 4f/n5+f/39/f/8/Nzf+/vLv/qaWj/5WTkP+KiIT/joyJ/6enpv+1u7z/wsfI/8vR0P/W3Nz/1t7e/9ff 3//h5+j/7vDw/+3u7v/t7e3/7u7u//Dw8P/x8fH/8PDw//Dw8P/y8/L/8PDw//f394AAAAAAAAAAAPPz 86vV1NX/6enp/+Tk5P/e3t7/19fX/9DQ0P/HyMf/rLGy/5ygoP97gYD/YGlp/2JmZf+FiYr/oqip/4+e n/+Qo6L/sL69/+Dk5P/h6Oj/2N3c/8DCwf+3ubj/w8PC/93d3P/u7u7/7u7u/+/v7//19fX/8fHx6/7+ /gv9/f0X4eHh+ePj5P/m5ub/4ODg/9nZ2f/R0dH/x8jH/7zBwf+0uLf/hpKQ/3mIh/+JkZL/naKj/6Km p/+wtbX/ub6+/7zCwv+vurv/l6mq/6+3uP+nrrD/r7Gz/46Rlf+ZnqH/l5qd/7a3tf/o6Of/7O3s/+/v 7//z8/P/+/v7VPn5+WbZ2dr/5+fn/+Li4v/c3Nz/09PT/8nJyP++wcL/sLWz/3+Liv+TmZj/jpKS/6aq qv+Ii4v/mJ2c/6Cko/+orKv/s7e3/8LGxf/N0dH/z9LS/83R1P/Ly8z/qaen/6+ur/+nrK//m6Gk/62t q//n5+b/7O3s//X29f/19fWW8vLyo93c3P/k5OT/3t/f/9bX1//Nzc3/v8PC/77BwP+IlJP/l5ub/5CS kv+foqP/j5GQ/42QkP+cn5//qays/6+zs/+ztrf/trm6/8DDw//FyMj/09XV/+Hf3v/v8fP/yMrO/660 uf+jqq7/mJqd/8HBv//q6ur/8/Py//b29sfq6urO4+Pk/+Hh4f/b3Nz/1NXU/8fJyP/Dx8f/n6em/5me nv+TlJT/i4yL/6Smp//Cxcb/4OLi/9nZ1//Qz83/zMvJ/9HQzf/i4d//6+3t/9nb3P+1t7j/4OLj/+7t 7f/w8vX/xMnP/6Sprf+eoKP/oaKi/+Xl5f/t7e3/+fn56efn5+jn5+f/39/f/9na2v/S09P/xsnJ/8HE w/+dpKT/mZqa/5eZmf/Hy8v/2djW/5+Zk/9tZV//Z2Ng/3NycP9pZ2T/Yl5b/2djX/97d3L/oJuX/+bl 4//l5+j/sbG1/1VUVP90c3H/i4iH/6Skpf+1trb/4ODg/+np6f/4+Pj36Ojo8ejp6P/e3t7/2NjY/9LT 0//Lz8//uL29/6Wnp/+lp6j/4OLi/6ahnP9dVU7/TEM9/0xGQf9PSkj/bGxs/15cW/9WVFL/UE1K/1BO S/9kYWD/Pz06/6+urP/r7O3/lZid/3x+gP+VlZT/xcbG/9jY2P/d3t3/5ubm//j4+PTq6uvi6urq/97e 3v/X2Nj/09TU/9HV1f+9wMD/ra+w/+Lk5P+LhYD/XllW/1NQTP9CPDf/Qz87/0tIRv9qamn/Z2Zm/2ho Z/9fXl3/YmFf/2xraf9hX13/Hh4f/6mvsf/29/f/4uXk/9vc3P/W1tb/19jX/9zc2//k5OT/+vr64e3t 7cjs7Oz/4eHh/9rb2//V1dX/09jY/7u8vP/i5eX/iIR//2FeW/9OSkj/TUpJ/05LSf9LSEb/UE5N/1ZV U/9dXVv/YmFg/2VlY/9oaGb/bW1s/21tbP9GRUP/KTY9/9bW1f/u7+//2tva/9TU1P/W1tb/3Nzb/+fn 5//7+/u88vPzmezs7P/m5ub/39/f/9nZ2f/T19f/0NLS/7i3tf9cWVb/WVdW/1BOTf9SUE//S0hH/0hG Rf9NS0r/T01M/1JRT/9ZV1f/XVxa/2NjYf9paWj/a2tp/1xaWf8UHCH/jZGS//b29v/Jysr/wcLC/8zN zP/e3t3/7e3t//v7+4P6+vpc7u7u/+vr6//l5eX/3t/f/8vPz//t7+//bXN2/1tZV/9SUE//SklI/0ZE Q/9DQT//SEZF/0pIR/9LSUf/TEtJ/1BQTf9UU1H/WVlX/11cWv9dXFr/WFZU/yEiJP9xfoL/1dbV/93d 3v+2t7f/n6Gh/5yenv/g4N//+vr6X/39/RDz8/Pz7+/v/+np6f/k5eX/2dva/+Lk5P9bZ3D/VlVV/0hI Rv9DQUH/REJB/0ZFRP9HRkX/SEdG/0dGRf9IR0X/SEhF/0pIR/9OTUv/UlBO/1NRT/9RT03/IyQo/299 gf+6urn/7e3t/8vMy/++v77/o6Wl/5GUlf/n6Oi8AAAAAPb29prz8/P/7Ozs/+jo6P/l5eX/2dvb/2J0 f/9TU1P/RkVE/0NDQv9HRkX/SUlI/0tLSf9LS0r/SklI/0hIRv9HRkT/SUdG/0tKSP9NS0n/TkxJ/01K Sf8gKzL/d4CB/6mpqf/5+fn/6+zs/+Pk5P/c3d3/2NnZ/+7v77sAAAAA/f39H/b29vXy8vL/7Ozs/+vr 6//Z29v/hJql/0RFR/8cHBz/JSQl/0BAP/9MTUz/UFBP/09PTv9MTEv/Tk5N/01MSv9LSkj/TEpI/1FP Tf8tKir/NDEx/ytASf9+g4P/pKWl//39/f/+/v7//v7+//v7+//+/v7/+/v7gQAAAAAAAAAA+fn5d/j4 +P/y8vL/7u7u/9/i4f+ntrr/P1Fc/w4PD/8AAAD/AQEC/wYGBv8YGBj/MjEx/01NTf9XV1f/VVRT/1RT Uf9GREP/FhQU/wYGBv8cIif/VWxz/4SHhv+trq7//f39//v7+//9/f3w/v7+qv39/ZT9/f0ZAAAAAAAA AAD+/v4D+vn5s/n5+f/w7+//6evr/7/DxP91k6H/HCUs/wIDA/8AAAD/AAAA/wAAAP8AAAD/BQUF/zg3 N/8uLi3/ExIS/wAAAP8BAQH/EhMW/zNRXf9rdXf/h4mJ/8XGxv/29vb/+fn5+/39/UgAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAD9/f0L+vr6w/T09P/19fX/zc/P/6mytP9egZH/ITA5/xAREv8AAAD/AAAA/wAA AP8AAAD/AAAA/wAAAP8AAAD/AwMD/w0SGP8sSlb/XWxw/3Z7e/+Nj5D/6uvr//v7+/b9/f1SAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD9/f0K+/v7p/b29v/c3t7/vcHB/52mqf9fgo//LE5g/ycv N/8XFxj/CQoK/wMDA/8GBgb/CwoM/w0PFP8VKDX/NlVi/1Vmaf9tdHX/foKC/7i7u//+/v7W/v7+KgAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/v4C9/f3uPT19f/Lzc3/tbe3/5uh o/93h43/SG18/ylJXP8dNkj/GC8//xcuPv8fO0r/NFJg/0VcZP9VY2f/Zm5v/3R6ev+boKD/9vb20f39 /QwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD9/f0T+fn50Ozt 7uK/w8T/r7Gy/5qen/+Di4z/bnt9/1xtcf9SZGr/Tl9m/05eZP9TYWb/W2Zo/2Rtb/9yeXn/mqCg//Dw 8dv9/f0eAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAD9/f0T+/r7nu3u7rbCxcX8qa2t/5mdnf+GjY7/eYCB/3B4eP9pcXP/Zm5w/2dvcf9tdHX/e4OE/7m+ vvL29/e0+/n7GQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAD+/v4C+/r7Xvj3+Kfe3+DLur2++JyjpP+QlZf/hYuN/4GHh/+Bh4j/kZaX/bW6 usfq7Oxy/f39IP39/QEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v7+A/r5+Tn6+fpM8/T0dOPm5YTd4OCS3eDgeenr 61b6+voi/v7+BgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/A A///AAB//AAAP/gAAB/wAAAP4AAAB8AAAAPAAAABgAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAACAAAAAwAAAAMAAAAfgAAAP8AAAH/gAAD/8AAB//gAA//8A Af//wA//KAAAABgAAAAwAAAAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAD9/f0R9vb2XOrq6pfi4uLC3Nzc3tra2uLe3t7V5OTkuO/v74H5+fk4/f39AQAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/Pz8FO7u7pTY19j20dHS/9va 2//m5uf+8PDx//T09f/y8vL/6urr/+Hh4f/c3N3+5eXl0/b29lIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAD39/dR3d3d69XU1f/t7e3/9vb1//T09P/09PT/9fX1//b29v/3+Pf/+Pj4//n5 +f/6+vr/8fHx/+Hh4f7u7u6p/f39CwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPPz823V1db95OTk//Hx 8f/w8PD+7+/v/+/v7//u7u7+7u7u/+/v7//y8vL/8/Pz//P08//19vX/9/f2//f39//s7Oz/7e3twf39 /QsAAAAAAAAAAAAAAAAAAAAA9fX1YNXV1f3l4+P/5+fn/9va2//a29v+3+Df/+Hi4v/k5eX+6Ojo/+rq 6v/t7e3/7/Dw//Dw8P/x8fH/9PTz//T09P/19fX/8fHx//Dw8K/9/f0BAAAAAAAAAAD7+/so3Nzc9OPj 4//n5eT/9fX0//X19P/i4eH/z9DQ/8HDw//Hy8z/0NbX/9nd3f/n6en/7e7u/+/w8P/w8PD/8vLy//Ly 8v/y8vL/9PT0//Dw8P/19fVjAAAAAAAAAADq6uqz3d3d/+bm5v/Z2dj/xsPC/6yqqP+OjYr+goF+/5ia mf+zuLj+w8nJ/8fPzv/W3dz/4efn/+rt7f/r6+v/6enp/+7u7v/w8PD/8PDw//Pz8//x8fHm/f39CPv7 +yrc3Nz96Ojo/+Hh4f/Y2Nj/zs7O/77Cwf+vtbX+f4yM/3J7e/9/hYb+oaan/6Ktrv+bq6v/q7q5/83T 0/+wtbX/lZiZ/5+io//ExcP/6+vr/+7u7v/y8/L/9vb2XvDw8ILe3t7/5OTk/9vb2//P0M//wMPD/6uw r/+GkI//j5SU/52hof+Tl5b/oqam/66xsf+8wMD/yc7O/8TJy//Mzc7/r66w/7GytP+fpKj/srOz/+np 6P/x8fH/9fX1qebm5sDl5eX/39/f/9TV1f/Fx8b/ur29/4+YmP+Tlpb+m52e/5GTk/+lqKj+uLu8/8HE xP/Dxsb/xMfH/8HExP/Z2dn/7e7v/8zP0/+psLX/m56h/8XFxP/s7Oz/9/j32+bm5+Tk5OT/29vb/9HS 0v/Fx8j/pKyr/5iamv+Vl5f+wcPE/8fGw/+opaH+m5mX/5KPjP+cmZX/uri1/9va2f/U19j/09PU/6qq q/+lpqn/oaGj/7S1tf/n5+f/9vb29Onp6fTj4+P/2dnZ/9DR0f/Hy8v/o6in/6qsrf/Nzcz/f3dx/1FI Qv9PSkf/aGdm/11bWf9UUk//VFFO/1tYVf+KiIb/4eLj/3p8f/94eHf/tLW0/9XV1f/i4uL/9PX0+Ozs 7Obk5OT+2dnZ/s/S0v7O0ND+tbe3/sjHxf5nYl7+U1BN/kQ/O/5GQkD+YmJh/mdnZv9kY2L+Y2Nh/mxs av9HRUT+b3V4/vHy8v/f4OD+1tfW/tjY2P/f39/+9vb24+/v78bo6Oj+3t7e/tLV1f7Lzc3+1tfW/mdj X/5VU1H+T01M/k1LSf5MSkn+UU9O/lhXVv9fXl3+ZWRj/mxsav9mZWP+Iysv/sHCwv/k5eX+0tPS/tjY 2P/h4uH++fn5uvHx8Y3u7u7/5OXl/tvc3P/W2dr/l5qb/llXVv5PTU3+SUdF/kVDQf5JR0b+TEpI/k5N S/9UU1H/W1pZ/2BfXf9fXVv/Kyst/4SNj//o6en/tLa1/6Smpf/HyMf/9vb2ifr6+jfx8fH+6urq/uTk 5P7m5+f+c36F/lNSUf5FQ0L+REJB/kdGRf5ISEf+R0ZG/khGRf9JSEb+TUxK/lFPTf9SUE7+LC4w/nuF h//g4OD+zs/P/ry9vf+bnp7+0dPTzgAAAAD29vbC8PDw/ubm5v7q6+v+hZWd/kZFRv47Ojr+RkZF/ktM Sv5OTUz+S0tK/ktLSf9JSEb+SUhG/k9MSv9BPjz+LTg+/oGGhv/V1dX+/Pz8/vn5+f/19fX++Pj4uQAA AAD5+fkz9/f3+u7u7f/t7u7/q7i9/jdCSP4BAQH+CgoK/hkZGf4xMTH+SUlJ/lVVVP9TUlD/S0lI/x4c HP8XFhb/PVNb/4eKiv/a29r//Pz8//39/ef+/v65/Pz8SwAAAAAAAAAA+vr6bfj4+P7x8fH+x8rL/m2I lP4TGBz+AAAB/gAAAP4AAAD+AwMC/ikpKf8ZGBj+AQEB/gYFBf8iN0H+Z3R2/oyPj//t7e3++fj47f39 /SgAAAAAAAAAAAAAAAAAAAAAAAAAAPv7+3j39/f83N7e/q20tv5ce4n+JDQ+/hMUFP4AAAD+AAAA/gAA AP8FBAX/CQwQ/yQ7R/9YaW7/d3x8/7Gzs//9/f3T/f39KQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAD49/dm8vLz/sXHx/6kqav+b4WO/jlZaf4lOkj+FScz/hcqNf8jOUb/OlRf/1RkaP9rcnP/jZKS/+7v 77z+/v4MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+vr6iunq6ty5vL3+oKOk/oSL jf5pdnn+WWht/lNiZ/9TYWb/XGdq/2lxc/+OlJT/5ebnyP39/REAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPv6+1Xt7u67w8XF65+jpP6KkJH+fIOD/nR6fP9zeXr/gomK/Lq/ wLzx8vJz+/v7CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAD7+voQ+vn6TOvs7HrT19eeyMzNq8XJyZbR1dVu8fLyKP7+/ggAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAP4AP0H4AB9B8AAHQeAAA0HAAAFBgAABQYAAAEEAAABBAAAAQQAAAEEAAABBAAAAQQAA AEEAAABBAAAAQQAAAEGAAABBgAAAQcAAA0HgAAdB8AAPQfgAH0H8AD9B/gD/QSgAAAAQAAAAIAAAAAEA IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+Pj4JePj44Xb2tvC39/g5OHh 4urh4eHU4N/goPLy8kkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD9/f0H5eXljtzc3fvo6Oj/9PT0//b2 9v/4+Pj/+fn4//f39//q6ur/5+fnxfn5+R8AAAAAAAAAAAAAAAD9/f0J4eHhvd3c3P/s7Oz/7Ozs/+zs 7P/s7Oz/7+/v//Ly8v/z8/P/9fb1//X19f/s7Ozj+Pj4IAAAAAAAAAAA5eXln97e3v/08/P/5+bm/9XV 1f/Mzc3/1dna/+Hj4//s7e3/8PDw//Ly8v/y8vL/9PT0//Dw8Mz9/f0D9vb2N9/f3/7i4uL/zczM/6ys q/+MjYv/h4yM/62ys/+zv7//0tra/+Xp6f/V1dX/4ODg/+/v7//y8vH/9PT0XuXk5Z3l5eX/2tra/8fJ yP+orq3/iJGR/5Wam/+ip6f/tLm4/7W+v/+9wsP/rK2v/6Gkp/+5u7v/7Ozr//X19brm5ubb4ODg/9DQ 0P+4vLz/k5iY/5eamv+wsrL/u728/8DBwP/R09L/yczM/+fo6P/KztP/n6On/8zMzP/09PTr6Ofo9dzc 3P/Nz8//rrOz/62vr/+ppqP/aWJc/2VjYf9gXVv/YF1a/4qHhf/Mzc7/d3d4/6Kiof/T09P/8PDw+uvr 6+rc3dz/09XW/8LExP+Wk4//U09N/0dDQP9XVVT/ZGNi/2RjYf9qaWj/TlJU/+fo6P/Y2Nj/2dnZ//Dw 7+bw8PC95eXl/9XY2P+4urv/WFZV/01LSv9HRUT/TEpJ/1JRT/9bW1n/ZGNh/zo7Pf+yt7j/x8jI/7m6 uv/u7u249fX1Z+7u7v/i4+P/nqer/05NTP9EQ0L/SEhH/0lIR/9IR0X/S0lI/1BOTP84Ojz/kpiZ/+fo 6P/Iycn/zc/P3f39/Qf29vba7u7u/7nDx/8sMDP/GRkZ/y4vLv9GR0b/UlFQ/0xKSf8mJST/NEBF/5WX l//9/f3//f395v39/YsAAAAA+vr6MPb19fDa3d3/ZnuE/w0RE/8AAAD/AQEB/xkZGf8FBQX/Exwh/1xr cP+xsrL/+fn50P39/RIAAAAAAAAAAAAAAAD7+/st7/Dw7ba7vP9nfoj/LD9K/xAdJf8SHib/JzlD/1Fj aP9/hIT/4+TkrP7+/goAAAAAAAAAAAAAAAAAAAAAAAAAAPr6+j3j5eXNrbCx/oSMjf9mcnX/W2dr/2Br bf+Ciov71dfXqf39/QcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+/r7GO3t7mzKzc6usbW2xaqv r7O6vr578fLyJAAAAAAAAAAAAAAAAAAAAAAAAAAA8A+cQcADnEGAAZxBgACcQQAAnEEAAJxBAACcQQAA nEEAAJxBAACcQQAAnEEAAJxBgAGcQcADnEHgB5xB8B+cQQ== ================================================ FILE: RED2/Program.cs ================================================ using System; using System.Collections.Generic; using System.Windows.Forms; namespace RED2 { static class Program { /// /// The main entry point for the application. /// [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new MainWindow()); } } } ================================================ FILE: RED2/Properties/AssemblyInfo.cs ================================================ using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information // associated with an assembly. [assembly: AssemblyTitle("Remove Empty Directories")] [assembly: AssemblyDescription("Searches and deletes empty directories recursively below the specified starting folder." )] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("Jonas John")] [assembly: AssemblyProduct("Remove Empty Directories")] [assembly: AssemblyCopyright("Copyright (c) Jonas John (Released under LGPL)")] [assembly: AssemblyTrademark("The GNU Lesser General Public License (LGPL)")] [assembly: AssemblyCulture("")] // Setting ComVisible to false makes the types in this assembly not visible // to COM components. If you need to access a type in this assembly from // COM, set the ComVisible attribute to true on that type. [assembly: ComVisible(false)] // The following GUID is for the ID of the typelib if this project is exposed to COM [assembly: Guid("8e03e827-e91d-4eac-9bfa-a23cd7cb7989")] // Version information for an assembly consists of the following four values: // // Major Version // Minor Version // Build Number // Revision // // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] [assembly: AssemblyVersion("2.3.0.0")] [assembly: AssemblyFileVersion("2.3.0.0")] ================================================ FILE: RED2/Properties/Resources.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace RED2.Properties { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] internal class Resources { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal Resources() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] internal static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("RED2.Properties.Resources", typeof(Resources).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] internal static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } /// /// Looks up a localized string similar to Search again. /// internal static string btn_scan_again { get { return ResourceManager.GetString("btn_scan_again", resourceCulture); } } /// /// Looks up a localized string similar to Deleted {0} empty directories (Failed: {1}, Skipped: {2}, Runtime: {3:D2}:{4:D2} min). /// internal static string delete_process_finished { get { return ResourceManager.GetString("delete_process_finished", resourceCulture); } } /// /// Looks up a localized string similar to Delete process was aborted.. /// internal static string deletion_aborted { get { return ResourceManager.GetString("deletion_aborted", resourceCulture); } } /// /// Looks up a localized string similar to Error:. /// internal static string error { get { return ResourceManager.GetString("error", resourceCulture); } } /// /// Looks up a localized string similar to The path you picked is not a directory or does not exist.. /// internal static string error_dir_does_not_exist { get { return ResourceManager.GetString("error_dir_does_not_exist", resourceCulture); } } /// /// Looks up a localized string similar to Ignore file settings are in a bad format. /// internal static string error_ignore_settings { get { return ResourceManager.GetString("error_ignore_settings", resourceCulture); } } /// /// Looks up a localized string similar to Only one directory can be accepted.. /// internal static string error_only_one_folder { get { return ResourceManager.GetString("error_only_one_folder", resourceCulture); } } /// /// Looks up a localized string similar to Found {0} empty directories (Checked: {1} / Runtime: {2:D2}:{3:D2} min). /// internal static string found_x_empty_folders { get { return ResourceManager.GetString("found_x_empty_folders", resourceCulture); } } /// /// Looks up a localized string similar to Contains "trash". /// internal static string icon_contains_trash { get { return ResourceManager.GetString("icon_contains_trash", resourceCulture); } } /// /// Looks up a localized string similar to Empty. /// internal static string icon_default { get { return ResourceManager.GetString("icon_default", resourceCulture); } } /// /// Looks up a localized string similar to Deleted. /// internal static string icon_deleted_folder { get { return ResourceManager.GetString("icon_deleted_folder", resourceCulture); } } /// /// Looks up a localized string similar to Hidden. /// internal static string icon_hidden_folder { get { return ResourceManager.GetString("icon_hidden_folder", resourceCulture); } } /// /// Looks up a localized string similar to Locked. /// internal static string icon_locked_folder { get { return ResourceManager.GetString("icon_locked_folder", resourceCulture); } } /// /// Looks up a localized string similar to Protected. /// internal static string icon_protected_folder { get { return ResourceManager.GetString("icon_protected_folder", resourceCulture); } } /// /// Looks up a localized string similar to Root. /// internal static string icon_root { get { return ResourceManager.GetString("icon_root", resourceCulture); } } /// /// Looks up a localized string similar to Failed. /// internal static string icon_warning { get { return ResourceManager.GetString("icon_warning", resourceCulture); } } /// /// Looks up a localized string similar to Please select the directory that you want to be cleaned. /// internal static string please_select { get { return ResourceManager.GetString("please_select", resourceCulture); } } /// /// Looks up a localized string similar to Process was aborted. /// internal static string process_aborted { get { return ResourceManager.GetString("process_aborted", resourceCulture); } } /// /// Looks up a localized string similar to Process was cancelled. /// internal static string process_cancelled { get { return ResourceManager.GetString("process_cancelled", resourceCulture); } } /// /// Looks up a localized string similar to RED deleted {0} empty directories for you since you installed it :). /// internal static string red_deleted { get { return ResourceManager.GetString("red_deleted", resourceCulture); } } /// /// Looks up a localized string similar to Deleting empty directories ({0} of {1}). /// internal static string removing_empty_folders { get { return ResourceManager.GetString("removing_empty_folders", resourceCulture); } } /// /// Looks up a localized string similar to Scanning directories.... /// internal static string scanning_folders { get { return ResourceManager.GetString("scanning_folders", resourceCulture); } } /// /// Looks up a localized string similar to Searching empty directories.... /// internal static string searching_empty_folders { get { return ResourceManager.GetString("searching_empty_folders", resourceCulture); } } /// /// Looks up a localized string similar to Started deletion process.... /// internal static string started_deletion_process { get { return ResourceManager.GetString("started_deletion_process", resourceCulture); } } /// /// Looks up a localized string similar to Warning!. /// internal static string warning { get { return ResourceManager.GetString("warning", resourceCulture); } } /// /// Looks up a localized string similar to Warning, do you want to delete empty system directories? This may harm your operating system.. /// internal static string warning_really_delete { get { return ResourceManager.GetString("warning_really_delete", resourceCulture); } } /// /// Looks up a localized string similar to \"{0}\" folder skipped because creation time [{2}] is < {1} hours old. /// internal static string young_folder_skipped { get { return ResourceManager.GetString("young_folder_skipped", resourceCulture); } } } } ================================================ FILE: RED2/Properties/Resources.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Search again Error: The path you picked is not a directory or does not exist. Ignore file settings are in a bad format Only one directory can be accepted. Found {0} empty directories (Checked: {1} / Runtime: {2:D2}:{3:D2} min) Contains "trash" Empty Deleted Hidden Locked Protected Root Failed Please select the directory that you want to be cleaned Process was cancelled RED deleted {0} empty directories for you since you installed it :) Deleting empty directories ({0} of {1}) Started deletion process... Scanning directories... Searching empty directories... Warning! Warning, do you want to delete empty system directories? This may harm your operating system. Process was aborted Delete process was aborted. Deleted {0} empty directories (Failed: {1}, Skipped: {2}, Runtime: {3:D2}:{4:D2} min) \"{0}\" folder skipped because creation time [{2}] is < {1} hours old ================================================ FILE: RED2/Properties/Resources_de.resx ================================================  text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Nochmal... red.config False Fehler: The directory you picked is not a folder or does not exist! Ignore file settings are in a bad format! Only one folder can be accepted. C:\ Found {0} empty folders (checked {1} folders) Enthält "Müll" Std. Ordner Gelöscht Versteckter Ordner Geschützter Ordner Start Ordner Could not delete True /*.tmp$/\r\ndesktop.ini\r\nThumbs.db System Volume Information\r\nRECYCLER\r\nPapierkorb\r\nRecycled\r\nNtUninstall True Qk12agAAAAAAADYAAAAoAAAAWgAAAGQAAAABABgAAAAAAAAAAAASCwAAEgsAAAAAAAAAAAAA//////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// ////////////////////////////////nDj///////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////+cOP// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////5w4////////////////////i4uLwMDA//////////// 4ODggICAgICA1dXV////////oKCg4ODg////////4ODggICAgICA4ODg////4ODgoKCg////////4ODg gICAgICA1dXV////////wMDAwMDA////////wMDAwMDA////////////4ODggICAgICAgICAgICAoKCg ////1dXVtbW1////////6urqi4uLgICAtbW1//////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// nDj////////////////V1dUgICArKyv////////KysoWFhZ1dXWAgIArKyvAwMD///9AQEDAwMD///// //9VVVV1dXV1dXUrKyvg4ODAwMBAQED////KysoWFhZ1dXWAgIAWFha1tbX///+AgICAgID///////+A gICAgID////////////V1dUWFhZVVVWAgICAgICgoKD///+Li4tLS0v////g4OAWFhZgYGCAgIA2NjZV VVX///////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////+cOP///////////////2BgYICAgCsrK9XV1f// /2BgYKCgoP///////////////////0BAQMDAwP///////////////+rq6iAgIMDAwMDAwEBAQP///2Bg YKCgoP///////8rKyiAgIP///4CAgICAgP///////4CAgICAgP///////////////9XV1SsrK6qqqv// /////////////////////3V1dWBgYP///////////yAgIMrKyv////////////////////////////// //////////////////////////////////////////////////////////////////////////////// /////5w4////////////////FhYW4ODgi4uLdXV1////QEBAKysrQEBAQEBAQEBAoKCg////QEBAwMDA ////////6urqa2trKysrgICA////wMDAQEBA////QEBAwMDA////////////AAAA////gICAgICA//// ////gICAgICA////////////////////6urqKysrqqqq////////////////////QEBAwMDA//////// ////gICAgICA//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////nDj///////////+goKBLS0v////g4OAg ICD///9gYGCLi4vAwMDAwMBVVVWLi4v///9AQECgoKD///////+Li4tLS0vq6ur////////AwMBAQED/ //9gYGCAgID////////g4OAgICD///+AgIBLS0v///////91dXWAgID////////////////////////V 1dUAAADg4OD///////////////9AQEC1tbX///////////91dXWAgID///////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////+cOP///////////0tLS7W1tf///////ysrK8rKytXV1SsrK3V1dXV1dSsrK+Dg4P///0BA QCAgIHV1daqqqqCgoCsrK4CAgCsrK////8DAwEBAQP///9XV1RYWFnV1dYCAgCAgIICAgP///4CAgAsL CzY2NnV1dRYWFsrKyv///////////////+Dg4P///+rq6gAAAMDAwP///////////////6CgoDY2Nv// /////+rq6hYWFtXV1f////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////5w4////////////gICA//////// ////wMDAwMDA////4ODggICAgICA4ODg////////oKCgysrKgICA1dXV////ysrKgICAysrK////4ODg oKCg////////4ODgi4uLgICAysrK////////wMDAwMDAtbW1gICAysrK////////////////////Kysr QEBAICAgKysr6urq////////////////////VVVVICAgQEBAFhYWa2tr//////////////////////// //////////////////////////////////////////////////////////////////////////////// ////////////////nDj///////////////////////////////////////////////////////////// ///////////////////////////////////////V1dW1tbX///////////////////////////////// ///////////////////////////////////////////V1dXAwMD///////////////////////////// ///g4ODAwMDg4OD///////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////+cOP////////////////// //////////////////////////////////////////////////////////////////////////////// /7W1tYCAgP////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// /////////////////////5w4//////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////nDj///////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////+cOP///////+Dg4EtLS0BAQEtLS+Dg4P///////////////+Dg4EtL S0BAQEBAQLW1tf///////2tra0BAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQODg4P///////6qqqkBA QEBAQEBAQEBAQEBAQEBAQGBgYICAgNXV1f////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////5w4//////// wMDAAAAAAAAAAAAAwMDA////////////////gICAAAAAAAAAAAAAtbW1////////AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAwMDA////////QEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANjY2 1dXV//////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// ////////////////////////////////nDj////////AwMAAAAAAAAAAAADAwMD///////////////8W FhYAAAAAAAAgICD///////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADV1dX///////9A QEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACqqqr///////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////+cOP// /////8DAwAAAAAAAAAAAAMDAwP///////////6CgoAAAAAAAAAAAAIqKiv7+/v7+/v39/QAAAAAAAAAA AH9/f/39/f39/f39/f39/f39/f7+/v7+/v7+/v7+/kBAQAAAAAAAAEBAQP///////////8DAwGBgYAAA AAAAAAAAAAAAAODg4P////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////5w4////////wMDAAAAAAAAAAAAAv7+//v7+/v7+/f39 NjY2AAAAAAAAFhYW5ubm+/v7+vr6+vr6AAAAAAAAAAAAfX19+fn5+fn5+vr6+vr6+vr6+vr6+/v7+/v7 +/v7Pz8/AAAAAAAAQEBA/v7+/v7+////////////qqqqAAAAAAAAAAAAYGBg//////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// nDj///////+/v78AAAAAAAAAAAC+vr77+/v6+vrGxsYAAAAAAAAAAAB8fHz29vb19fX19fX09PQAAAAA AAAAAAB6enr09PT09PT09PT09PT09PT19fX29vb29vb39/c+Pj4AAAAAAAA/Pz/7+/v8/Pz8/Pz9/f3+ /v7+/v5gYGAAAAAAAAAAAADq6ur///////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////+cOP7+/v39/b6+vgAAAAAAAAAAALu7u/b29uHh 4SkpKQAAAAAAABUVFd7e3vHx8fHx8fHx8fDw8AAAAAAAAAAAAHh4ePDw8PDw8PDw8PDw8PDw8PHx8fHx 8fHx8fLy8j09PQAAAAAAAD09Pfb29vf39/j4+Pr6+vv7+/z8/LS0tAAAAAAAAAAAAMDAwP////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// /////5w4+vr6+fn5u7u7AAAAAAAAAAAAKSkpPT09FRUVAAAAAAAAFRUVyMjI7+/v7+/w8PDw8fDx8fHy AAAAAAAAAAAAXFxcuLi4uLi4uLi4t7e4t7e38vLy8fHy8fDx8PDwPDw8AAAAAAAAPDw88fHx8vLy8/Pz 9PT09vb29/f35OTkAAAAAAAAAAAAf39//v7+//////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////nDj19fX09PS2trYAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAzMzPDwsP39/f4+Pn5+fn6+vr7+/sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC9 vb77+/v6+vv6+vo+Pj4AAAAAAAA9PT3y8vLw8PHw8PDw8PDx8fHy8vL09PQAAAAAAAAAAAB+fn78/Pz9 /f3+/v7///////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////+cOPHx8fDw8LS0tAAAAAAAAAAAACkpKT4+Pj4+PhYWFgAAAAAAAAAAAKmpqf39/f7+/v7+ /v7+/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL+/v/7+/v7+/v7+/kBAQAAAAAAAAD8/QPv7+/r6 +vj4+PX19vPz9PHx8fDw8AAAAAAAAAAAAHt7e/j4+Pr6+vz8/P39/f7+/v////////////////////// //////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////5w47u7v7+/wtra3AAAAAAAAAAAA vr69/f39/f396OjoVFRUAAAAAAAAAAAA3t7e/v79/f3+/v7+AAAAAAAAAAAAQEBAf39/f39/f39/f39/ f39/6enp/v7+/v7+/v7+QEBAAAAAAAAAQEBA/v7////+/v7+/f39/Pz8+vr62traAAAAAAAAAAAAg4OD 8/Pz9fX19/f3+vr6+/v7/f39/v7+//////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// ////////////////nDj29fb5+fm9vb0AAAAAAAAAAAC+vr79/f39/f39/f3o6OgAAAAAAAAAAACfn5/9 /f39/f3+/v4AAAAAAAAAAAB/f3/+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v5AQEAAAAAAAABAQED+ /v7+/v7+/v7+/v7//////v+fn58AAAAAAAAAAAC4t7jx8fHx8fHz8/P19fX39/f6+vr8/Pz9/f3+/v7/ //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////+cOP39/f39/b6+vgAAAAAA AAAAAL6+vv39/f39/f39/f39/QAAAAAAAAAAAH9/f/39/f79/f79/QAAAAAAAAAAAH9/f/7+/v7+/v7+ /v7+/v7+/v7+/v7+/v7+/v7+/kBAQAAAAAAAAEBAQP7+/v7+/v7+/v7+/v7+/unp6SAgIAAAAAAAABYW Fv39/fv7+/b29/Ly8vHx8fLy8vX19ff39/r6+vz8/P7+/v////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// /////////////////////5w4/f39/f39vr6+AAAAAAAAAAAAvr6+/f39/f39/f39lJSUAAAAAAAAAAAA ioqK/f39/f39/f39AAAAAAAAAAAAf39//v79/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+QEBAAAAAAAAA QEBA/v7+/v7+/v7+/v7+39/fKysrAAAAAAAAAAAAf39//////////v7+/Pv8+Pf48/Lz8fHx8/Pz9vb2 +Pj4+/v7/f39/v7+//////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////nDj9/f39/f2+vr4A AAAAAAAAAABfX19/f39/f39KSkoAAAAAAAAAAAAAAADe3t79/f39/f39/f0AAAAAAAAAAABAQEB/f39/ f39/f39/f39/f39/f3/p6en+/v39/f1AQEAAAAAAAAAgICB/f39/f39/f39AQEAAAAAAAAAAAAAAAAAr Kyvp6en+/v7+/v7+/v7////+/v78/Pz4+Pnz8/Px8fH09PT29vb5+fn8/Pz+/v7///////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////+cOP39/f39/b6+vgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AGpqav39/f39/f39/f39/QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL6+vv39/f39/UBAQAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADY2Nunp6f7+/v7+/v7+/v7+/v7+/v7+/v////7+/vz8 /Pj4+PLy8vLy8vX19fj4+Pv7+/39/f7+/v////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////5w4/f39/f39 09PTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKioqs7Oz/Pz8/fz8/Pz8/Pz8/Pz8FhYWAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAvr6+/f39/f39SkpKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAS0tLn5+f /v7+/v7+/v7+/v79/v7+/v7+/v7+/v7+/v7+/v7+/////v7++/v79vb28vLy9PT09/f3+vr6/f39/v7+ //////////////////////////////////////////////////////////////////////////////// ////////////////////////////////nDj9/f39/f39/f3T09O+vr6+vr6+vr6+vr6+vr6+vr7n5+f8 /Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pzd3d2+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr79/f39/f39/f3o 6Oi+vr6+vr6+vr6+vr6+vr6+vr7T09P9/f39/f39/v39/f39/f39/f39/f3+/v7+/v7+/v7+/v39/v7+ /v7+/v7+/v7////+/v76+vr09PTy8vL29vb5+fn8/Pz+/v7///////////////////////////////// //////////////////////////////////////////////////////////////////////////+cOPz8 /Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pv7+/z8/Pz8/Pz8/Pz8/Pz8/Pz8 /Pz8/Pz8/Pz8/Pz8/Pz8/P39/f38/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39 /f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+/f39/f7+/v7+/v/+//z8/Pb29vLy8vX1 9fn5+fz8/P7+/v////////////////////////////////////////////////////////////////// /////////////////////////////////////5w4/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8 +/v7+/v7+/v7+/v7+/v7+/v7+/v7+/z7+/v7/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/P38/f39 /Pz8/Pz8/f39/f39/f39/f39/Pz8/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39 /f39/f39/f39/f39/f39/f39/v7+/////f39+fn58/Pz9fX1+Pj4/Pz8/v7+//////////////////// //////////////////////////////////////////////////////////////////////////////// nDj8/Pz8/Pv8/Pz8/Pz8/Pz8/Pz8/Pz7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7 +/v7+/v7+/v7/Pv8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/fz8/fz8/fz9 /Pz9/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+/v7+/v7+ /v78/Pz09PT09PT4+Pj7+/v+/v7///////////////////////////////////////////////////// //////////////////////////////////////////+cOPv7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7 +/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/z8/Pz8/Pz8/Pz8 /Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz9/Pz8/P39/f39/f39/f39/f39/f39/f39 /f39/f39/f39/f39/f39/f39/f39/f39/f39/f7+/f7+/v////39/fb29vT09Pj4+Pv7+/7+/v////// //////////////////////////////////////////////////////////////////////////////// /////5w46+zr7Ozs7Ozs7Ozs7Ozs6+zs7Ozs7Ozs7Ozs7Ozs7e3t7ezs7e3t7Ozs7O3t7Ozs7Ozs7Ozs 7O3t7Ozs7e3t7O3t7e3t7u7u7u7u7+/v8PDw8PHx8PHx8fHx8vLy8vLy8fLx8vLy8fLy8vLy8vLy8fLy 8vLy8vPy8vLy8/Pz8/Pz8/Pz9PT09PX09fX09vb29vb29fX19vb19vb29fb29vX29vb19vb29vb29/f3 +Pj4+fn4+/v6/v79/Pv829vbzMzM39/f7+/v+vr6/f39/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ /v7+/v7+/v7+/v7+/v7+/v7+////////////////////////nDjp6enp6unp6enp6enp6enp6enq6urp 6urq6urp6urr6+vq6+vr6+vr6+vr6+vq6+vr7Ovr7Ovs7Ozs7Ozs7Ozs7O3t7e3s7e3v7+3t7u/v7+/v 8PDv8PDw8fHx8fHx8fHx8fHw8fHy8vLy8fHw8fHx8fHy8vLy8fLy8vLy8vLy8vLy8/Lz8/P09PT09PT1 9fX19fX19fX09PT19fX09PT29vT29vX19fX29vb29vb3+Pb3+Pb4+fj6+vr+/v79/f3e3t7Nzc3g4ODw 8PD6+vr9/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7///////////// //////////+cOObn5ubm5ubm5ubn5ufn5+fn5+fn5+Xn5+jo6Ofn6Ojo6Onp6enp6enp6enq6err6+vq 6urr6+vr6+vr6+zs6+vs7Ovr6+zs7O3u7O3u7u7v7+/v7+/v7/Dw7/Dw8PDw8PHx8fHx8fDw8PHx8fHx 8fDx8fHx8PHx8fHx8fHy8fLy8fLy8vLy8vLy8vPz8/T09fT09PX19fX19fX19fX09PX09PX19PT18/T0 9PX29fb29fb29ff39vj4+Pr6+f39/f7+/t/f38/Pz+Li4vLy8vv7+/7+/v7+/v7+/v7+/v7+/v7+/v7+ /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v///////////////////////5w44+Tj4+Ti4+Pj4+Pj5OTk4+Tk 4+Tk4+Xl5OTk5eXm5Obm5+fm5+fn6Ojo6Ojo6erq6erq6urq6enp6unp6urq6enp6uvr6+vr7O3s7Ozs 7O3t7e3t7u7u7+/v7+/v8PDw8PDv8PDw7/Dw8fHx8PHw8PHw8fHw8PHx8PDw8fHx8fHx8vLy8vLy8vLy 8/Pz8/Pz9PTz9PTz9fX09PT09PX09PT09PT08/Pz9PT09PT09fX19vX19vf29vb29/j3+vr5/f39/v7+ 39/f0NDQ5OTk8/Pz/Pz8/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+//////// ////////////////nDjd3t7d3t7e39/e39/f4eDf4ODg4eDh4eDh4eHi4+Lj4+Pi5OTl5OTm5ubm5ubn 6Ofo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojp6enq6urq6urq6+rr6+vr7Ozs7e3u7u7u7u7v7/Dv8O/v8PDw7+/v 7+/u8PDw8PDw8PDw8PHw8PDw8PDx8fHx8fHy8vLy8vLy8vLz8/P09PTz8/P09PP09PT09fT09PTz8/Pz 8/Pz8/P09PT09PT19fX09PT29vb29vb39/f6+vr8/Pz+/v7d3d3T09Pm5ub29vb9/f3+/v7+/v7+/v7+ /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7///////////////////////+cONjY2NnZ2dra2trb2tvb 29zc3Nzd3d3e3t3e3t7f397f39/g4OHh4eHj4+Tk5OXl5ebm5ufn5+fo6Ojo6Obo6Ofo6Ojo6Ofp6enq 6urq6uvr6+vs7Ozs7Ozt7e7u7u7v7+7v8PDw8O/v7+/v7/Dw8PDw8PDw8PDw8PHx8PDw8PDw8PHx8fHx 8fLy8fLy8vLy8vPz8/Pz8/P08/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/P08/T08/T09PX19PX19fX19ff3 9/n5+f39/f39/dra2tfX1+vr6/j4+P39/f7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v// /////////////////////5w40tLR09PT1NXU1NbW1dfV1tfX2NjZ2dnZ2tvb29vb29zc3N3d3d/e39/f 3+Hh4ePj4uTk4+Xl5ebm5+fn5+fn5ufn5Obm5+fn6enp6Onp6urq6uvr6uvr7Ovr7O3t7e7u7u/u7+/v 7+/v7u/v7/Dw8O/v7/Dw8PDw7/Dv8PDw8PDw8fHx8PDw8vHx8vLy8vLy8/Pz8vPy8vLy8/Pz8/Pz8vLy 8vLy8vLy8vLy8/Pz8/Pz8vLy8/Pz9PTz9PT09PT09fX19/f3+vr5/f38/Pz819fX3Nzc7u7u+vr6/f39 /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+////////////////////////nDjHyMbKysrMzMvO z87O0NDQ0dHS09LU1dPV1dXW1tbX2NjY2dna29vZ3Nzc39/e4N/f4eHg4uLj5OTk5eXk5eXl5ubm5+fl 5+fm5+fo6enp6urp6urq6urp6+rr7Ozs7O3u7u7u7+/u7+/v7+/w8PDv7+/w8PDw8PDv8PDv8PDv7+/w 8PDw8PDx8fHx8fHy8vLy8vLy8vLy8/Pz8/Ly8vLy8vLy8vLx8fHx8vLz8/Py8vLy8vLy8vLy8vPz8/P0 9PP09fT19vX3+Pf5+vn+/v34+PjU1NTh4eHy8vL8/Pz+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ /v7///////////////////////+cOL6+vb7Av8LCwsXFxcbHx8fJycnMy8vPzs7Q0NHS0tPU1NTV1dXX 19XY2Nrc3Nvd3Nze3t7f397h4OHj4+Pk5OPk5OTl5eXm5ubn5+bn5+np6ejp6efp6urq6unr7Ort7O3u 7u7u7u7v7+/v7+/w8O/w8PDw8PDx8fDw8PDw8O/v7/Hw8fHx8fHx8fLy8vHy8fLy8vPz8/Pz8/Ly8vLy 8vLy8vLy8PHy8vLy8vLy8vLy8vLy8vLy8fLy8vPz8/Pz8/P08/Pz9Pb19vf49/n5+f7+/vHx8dPT0+fn 5/f39/39/f7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v///////////////////////5w4vb2+uLi4 uLm3uLq6u7y8vcC/wMPBxMbGx8nJy8zMzc7Oz9DQ0dLS09TU1djY19nZ2Nvb2tzc297e3eDg3+Hh4OPi 4eTk4uXl5OXl5ebm5+jo6Onp6erq6Onp6evq6+vs6+3s7e7u7u/v7e/v8PDw7vDw7u/v7/Dw8PDw8PDw 8PDw8PDw8fHx8fHx8vLy8vLy8vLy8vLy8/Py8vPy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8fHy8vLx8vLy 8fHx8vLy8/Pz8/Pz9PT09fb1+Pj2+vr6/v7+6Ojo2dnZ7e3t+vr6/f39/v7+/v7+/v7+/v7+/v7+/v7+ /v7+/v7+////////////////////////nDj29fjZ2d65ubywsrCwsrGytbS1t7a5u7u9v7+/wsLCxcTH x8bHycjKysnKzMvOz83O0M7S09HU1tTY2dfZ29rc3dze4N/h4+Ph5OTj5uXk5ubn6enq7Ovq7ezq7Ozq 6+vq7Ozs7u7u7u7v8PDv7+/w8PDv7+/w8PDw8PDv8PDw8PDw8PDx8fHw8PDx8fHx8vHy8vLy8vLy8vLz 8/Py8vLy8vLy8vLy8vLy8vLy8vLx8fHy8vLy8vLx8fHx8fHx8fDx8fHz8/Lz8/T19PT09PT39/f7+/v+ /v7b29vi4uLz8/P8/Pz+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7///////////////////////+cOOzq 5vr6+Pr6/N/g5by+wqmqqqapqaaqp6erp6WpqKKpqpqnp5WqrZarr52ztqO4uqW8w6O8waG5v6e9xKK4 vaG4uqe4u7G9vcTMyNPY1N7g3+Lk5Obo6Ovu7e3v7+7v7+zs7Ors7O3t7ezu7vDw8PDw8PDx8e7w8O/v 7+/w8PDw8PDw8PDw8PDw8PHx8fHy8vHy8vLy8vLy8vLy8vHy8vPz8/Ly8vLy8vLy8vHx8fHx8fHx8fLy 8vHy8fDw8PHx8fHx8fLy8vPz8/Pz8/T09PX29Pj49/3+/fn5+dbW1unp6fj4+P39/f7+/v7+/v7+/v7+ /v7+/v7+/v7+/v///////////////////////5w4p6SitbOuxcS+3tzX9vbz6eruzNDWnKWpjaKlobO2 qbe7t8LFxc7Py9DQzdLR0tfW1tva2dzc29/e3+Pi3+Tj4Ofn2uTm09/ix9XYxNLWusrNs8PFxc7L3+He 6Orp7e/v7/Ly7vHw7O/v7e7u7e/v7u/w8PDw7/Dw7/Dw8PDw7/Dw7/Dv7+/v7+/v7/Dw8PDw8fHx8fHx 8fHx8fLy8fLy8vLy8fHx8vLy8vLy8vLy8fHx8fHx8fHx8fHx8PHw8PDw8PDw8fHx8vLy8vLy8vLy8/Tz 9fX1+Pj4/v7+6urq3Nzc8PDw+/v7/v7+/v7+/v7+/v7+/v7+/v7+/v7+//////////////////////// nDiLh4SKh4SNi4iPjImdmpa7u7ff3djv8fHf4eXCxsuzubq3vby5v7+/xcTCxsbKz87N0tHR1tXU2dnZ 3d3Z3dzd4uHc4uHg5eTh5eTk6Ofk6Ofg6OnN296+z9OyxcfQ1tPm6ebx8vLz9vXy9PTv8fHt7+/u7+/v 7+/v7+/t7+/v7+/v7+/v7+/u7u3u7+3v7+/w8O/v8O/w8PDx8fHx8fHy8vLx8vLx8fHx8fHy8vLy8vLx 8fHx8fHw8fDw8PDw8PDw8PDw8PDx8fDx8fHy8vLy8/Lz8/P09PT6+/r9/f3b29vm5ub39/f9/f3+/v7+ /v7+/v7+/v7+/v7+/v7///////////////////////+cOHt5dHp6eIKBfXt8eX19eYWFgoeIhZ6cmLy9 tt3f3ODl6sbM0rK3u6+3tba8urzBwcHHxsXKysnPz8/U0tLX1tXa2dfd3Nrg393i4d/l5ODl5OHm5ePn 5uTn5+Dm58XV2rnN0cfT0ubp5/L19PP29vDz8+7w8O/u7u3t7e3t7e7v7+7u7u3t7ezs7Ozs7Ozs7O3t 7e7u7e7u7vDv8PDw8PHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fDw8PDw8PDw8PDw8PDw8PDw8PHx8fDw 8PLy8vLy8vT09Pb29v39/fX19dzc3O/v7/v7+/7+/v7+/v7+/v7+/v7+/v7+/v////////////////// /////5w4bm5qb29rbW5qb29ucHFudXZ0eXl3eXp4fH17h4eDp6ik0dPR5Obo0tXbuLzCq7Czs7m4tr28 u8PCwcfHxszKytDPz9TU0tfX1tva2d7d2t/e3OHg4OTj4Obl4+fn4+fm5urq2eXov9PXx9PV5ejl7/Hw 8PPz7/Hx7O3t6uvr6+vr6+vr6urq6urp6enp6enp6eno6erp6urq6urq7Ozr7e3t7u7u8PDw8PDx8fHx 8fHx8PDw8fHx8PDw8PDw7+/v7+/v8O/w7+/v8O/w8PDw8PHw8fHx8vLx9PT0+fr4/v7+4+Pj5eXl9vb2 /f39/v7+/v7+/v7+/v7+/v7+////////////////////////nDhmZWJkZWRkZmJjaGNmZ2VpamlsbWxs bm1xc3J0dXR2eHh/gH6bmpe8vrra29zh5OnCyM+orLGMmZeNmpKUoJqmr6mwuLPAx8PLz87R1dTS19bV 2trY3t3d4eHh5eXj6Ofj6Ofp7Ozs7+7i6+/B1drM19jn6eft7e3u7+/s7e3n6Ojl5eXl5eXi4+Pi4uLh 4eHf397e397f39/g4eDi4+Ll5eTn5+fq6unt7ezv7+7w8PDw8PDw8PDw8PDv7+/w8O/v7+/v7+/u7+/u 7+7v7+/w8O/w8fHx8vDy8/L19vT8/Pz6+vrd3d3v7+/7+/v+/v7+/v7+/v7+/v7+/v7///////////// //////////+cOG1ycGJnZ11jYlthYWBjYmFmZGNnZmVpaWZrampsa2twb3N2dXh8eXp/fYmNi6qsqsrM yOrr7NLW3ZGirWWGjGB+gkpyck50dVB3cGWEfJSnoLS+uM7T0NTa2tnd3d7j4uDl5OXq6ejs6+3w8O/x 8eTu8MTY2tLc3OLl5OLj4+Pk4+Hh4dzc3NfY1tPS0c3OzMvMysnJyMnKx8vMyc/PzNTV0tra197f3eTk 4+jo5+zs7O/v7/Dw8O/w7+/v7+/v7+/v7+7u7u7u7u7u7u/v7+/v7/Dw8PDx8PHx8fTz8/f49v7//ubm 5ubm5vf39/39/f7+/v7+/v7+/v7+/v///////////////////////5w4rbS0naWohpCVc3l/X2ZmWV9e V19eWF5bWVxZV1tYVVxaV1pZWF5cW2NfYGZjZ2plcHJtgYJ+l5iSrq6nt7u5q7S3i5qcdYyOcIiIdoyO Z4mKTXd4V356laedyc7L1NjX2t7e3+Pi4+Xl5+vq7e/v6/Dv8fX04OzvwNLU3N/c3d3d19jVysvJwMG/ tre2ra6spaakoaGgnp+dn5+coaKgrKypuLi0xcW/0dLO29zZ4uPi6Onn7e3t7+/v7+/v7+/v7+/u7u/v 7u7u7u7u7u/v7+/u7+/v8O/w8fDw8fHx9PT0+/z7+vr639/f8fHx/Pz8/v7+/v7+/v7+/v7+//////// ////////////////nDipr6+nrKuYnppsgX1UcHFbdHljdXdganFWXF9MUVFMUVJLUVNTWWBiaHFveYJ5 g4aDi5GMlpycpayjp6+gp6uepamlqq+hpaido6eUoKKImpt2jY96kJNkhYlNenl1lIy9xMDU2NjY3Nzf 4+Pk5+bn6urp7Ozq7O3m7Oy6ztO1v762t7amp6aUl5OFiYeAh4eLj5KOkpaYmp6coaScnZ6anZ6en6Gc nZ+ioqGytK/LysXZ2tbj4+Hq6urt7e3u7+7v7+7u7u7u7u7t7e3u7u7t7e3u7u7v7+/w8O/w8PDy8vL3 +Pb+//7o6Ojq6ur5+fn+/v7+/v7+/v7+/v7///////////////////////+cOIiQiFBrZU5ucGN5emJ6 fXqNjoeWl5CYl4uRj4GGh4CGipmgp7nCx7zCw56hn5qdnaOprLK3t7m+vbzBwL7EwsDFxMLIx8LJyMHH ybzDxLjAwrK4u6CqroGUmHCMjWmLiU59gH2XkrzCvtHU09TY19jc29rd3d3g39jb2tLU1LG+wXaLjHd+ fYGLj5+lp6impYeEf5SWnYWKjHh3eHFxcW9wcH2BgIKHiYWJiJ6dnKqpqrCwrMrJxN3d2+fn5uzt7O3t 7e7u7u3t7e3t7e7t7u7u7e3t7e7u7e/v7/Dw8PDw8PT09Pz9/Pj4+OLi4vX19f39/f7+/v7+/v7+/v// /////////////////////5w4WXN0XXN0aoCBeIqMjpeZkJeXhouKf4WEiI2LlpqcrrW7v8XHoKKgjZCR naGjqK6vrLKyqrCxrrW1tLm6tLm4s7q6t728ur6+ub6+vMPCwsfHx83Lx83NwcfJtr/ChpqeeI6QcIqK XoCAdpKLucC8wsbGw8bFwMPCt7u5p6uoi5GPeISGl6Cktbe4ube9ioiHcnR1dH6AdXp8c3p+eIGEgIqQ iI+Si5GTgouPcXyAd3t5jY+LqaqkuLi109PN5OTi7Ozs7Ozs7e3t7e3s7e3t7e3s7e7t7u3t7u7t8PDw 8fDw8vLy+Pn4////5ubm7u7u+/v7/v7+/v7+/v7+////////////////////////nDhzhoaBkZKSmJmU mZiVmJiGioqCh4iRmJqnrLC7w8azt7eOkZCDiImdo6Wrrq6tsLCusrKytbW0t7e1urm4vLy4vb25vr26 vr27vr+4vr61vLy2v7/Ax8bGzMvM0M/M0tO+xsmVo6xviI1ie4BIaGV3hYCUmZiMk5KBiId9hYaMlJmv tLe1tLLY2tri3d6NjJBxdHV0eHiWn6eqrbqhq7WnsryosLegpqufoqeUlZuAhIp8f4RyeHiRlJKvsK3E xL/i4d7r6+rs7Ovs7Ozs7Ozs7Ozt7e3t7e3s7Ozv7+/v7+/w8fD09PP9/f3x8fHn5+f4+Pj+/v7+/v7+ /v7///////////////////////+cOJOZmZOZmZebm5SYl4iMi4KGh5mho62ztrzCw66wrYqMiIeNjpqg oaKmpqarqqmrq6qvra2ysbCzsrG1tbO3tra5ubi8u7q+vbzAv77CwcDFxMTJycfMzMHJycDJycfNzc7U 09HV1cvT1cnQ17zG0J6suaOstLO3vcDFzdLV3MXJzbe1t7++vfX09MPDxrC1xIGDh5eboN7j6uLe5czJ zcTEx8XIy8DBxLq9wba4vbi7waqutpSWoIeJjI2Oj6ytrMHBv97e3Orq6uvr6+vr6+vr6+vs6+zr6+3t 7e/v7u7u7vDw8PLz8vv7+v39/eTk5PT09P39/f7+/v7+/v///////////////////////5w4mJ2clJqZ jpOThoyLfoKDl5ues7e7ub6/n6Gfenx8eXx+k5eXmJ2bm5+enqKhnqSjoqWlo6moqKurqq6trbGwsLSz tbi4trq5uLy7u76+vsHBwcXExMnIx8zLy8/Oyc/PxczMzdLS0dbV0NTU3t/d9fXz/v/++Pj24uHgzNXd yczQtbKy6urq087P19/j2Nvifn14pJ+b6ens2NPUzsO+0cjGx8LCxcTEuLq8tri4vcLCvsHEsbS4mp2h kJKXj5KSnp2Ww8LB4N/c6eno6+vq6+vr6+vq6+vr6+zr7O3s7u7u7+/v8PDw9vf2////7e3t7+/v/Pz8 /v7+/v7+////////////////////////nDiSlpaRlJSMkI99gICRlZi1ubvBxsexs7SLjIpxdHSIi4uV mZmWm5uYnZyan5+boqKdoqGgpKOhpqaip6ejqKinqqqqrq6xtLS0uLi3vby6vr29wMC/xMPExsbGy8rL z87Q0tLQ1NXO09PP1NTP09TBxcTQ0dGnpqa2vsDZ6PLHyc23t7Xh3t+1s7PY4ePFyM+Ef4Cnn5q+tLO0 qqWypqK4r6y3r620srKvr7GnqqulqKmlqq6ipqmgpaifpqqTl56CgoeXmJDDwr7g4N3p6enq6urq6+rq 6urr6+rt7e3u7u7v7+/w8PD09PT9/v319fXp6en5+fn+/v7+/v7///////////////////////+cOJGV lI6QkIWHh5OZnLCztL7AwrzAwJmamHB0c4KGiJCWlZSXl5WYmJeam5ebmpudnZugn5yhoJ6iop6ko6Cl pKOmpqSop6epqaitrKyurq+1s7a5ub2+v8DDw8TFxcbJyMnNzM7Q0NHV1c/T08bMy8XLysTHxc/T19Hf 6NLc47u7u9PV19TT1cTCwb+/vqqmp5qWlZiVlZ2dnp2go52cnZuen5Sbn5icoJqfo5qippacopqgpJyj pJqhpZujpqGprKKorJOQkp+blMHBvOPj4Onp6Orq6err6uvr6uzs7O3t7O7v7u/w7/Ly8fv8+/39/efn 5/b29v7+/v7+/v///////////////////////5w4j5KRiIqKhYWFo6issLO1ury9lJSSbnBufX+AjZKR kZSTkZaVk5eWlZiYlpqZl5ybmp6dmqCfnaGhnqKin6OjoaWlpKenpKmop6urqq2trLCvrrKysbW1t7q5 vsDAwsbFx8rKyM3My87Nz9PSz9LSwcbGs7m6xcrK2+HjyMfJycnK/v//9/b4yMbGrKuqo6GfrKqqpKeq r7S6qq+znaSppauwoqqwp66yp7K3payyoKitmJ+mnaKlmaOmmKGkmKGklpudkZWXlJKSnJqXycrG5ebk 6enp6enp6urp6+vq7Ozs7u7u7u7u8PHw+Pn4////7e3t8/Pz/f39/v7+//////////////////////// nDiLj46IiYqbn6Orrq62ubyipKN0dXRrbWyGiomOkZGRk5OTlZWTl5eVmJiXmZmZnJuanp2bn5+doaGe oqGeo6OipKSjp6ajqKemqqqprKyrr66usrGxtLS1uLi6vr6/wsLAxMPGycnJzczNz8/P0tLMz8+6v8Cy tbbCw8LT1df3+Pj////+/f7i4eWuqai7u7vM0NPk7fLr8fba3uW4vsWlqq6yubuwtrqxtruwub+ttLqs srWjq7Kdpaugpaiao6WTmJuTlJiUlJWZmpqqqqfW1tHn6Ofo6efp6enq6urr6+vu7u3u7u7v7+/29vX/ //7z8/Pv7+/8/Pz+/v7///////////////////////+cOImLip+ip6aqrK2xsrS2t5OWlXN0c2hqaIKG hYyQj5CTk5OVlZOWlpaYmJebmZqcnJucnJqdnJuenZ2fnpyfn52goJ+ioqGkpKSnpqapqamtra2xsLC0 s7K1tbW4uLm+vb3CwcLGxsXKycjLys3Ozs7R0cnNza+zs7i6uubm5vz+/v////////v7/MfCwMnIycrK zeTn6P7///T3+9HW3bq+xKeqrq+0t62ztrW6vbO6wK61uqits6WssKatsZ2lqJygpJSXnpKSlJWVlJqb mrm4teHh3ufn5+jo6Onp6evr6u3t7e3t7e/v7/Pz8/7+/vj4+Ovr6/v7+/7+/v////////////////// /////5w4iYqMq66wp6mqsrS1t7u7rK2se3p4aGpmgYOEjpGQkZSTkZOSjpGQjpGQkZKTk5WWmJqbm56g oKOmpKappamqqKuuqqytqayvqaytqKytp6utqKqrqKusqqytrbCwsrW1t7y7vcHBwsXFx8jJycvLys3M ys7OvsLCvsHB0tPWx8jJ5ufl/f38//79zsbF29vc7vDz/v7+/////v//8vL12tvfx8XIrK6wq66wrbS2 rLW5rLO4qa+zqa+1o6muoKOomp2hnaKlnqClmJqclZaXm5uZ0dLM5ubl5+fn6Ono6+vq7ezs7u7t7u7u 8fLx/P38/v7+6urq+fn5/v7+////////////////////////nDiJiouusrSprK6ys7S4vLuio6J/fn57 foCJiouNjY6OkZKYm5ykp6ixs7a5vb/BxcfHy8zM0tHR1dXT19bU2NjV2dnW2dnW2drV2NnV2NfT1dXP 0tPJzc7Fx8m9wcO1uruztbaztba3uru/wcHDx8fIy8rIysrBw8O3ubm/v7+rra64u7rU08/x6+bW0tD5 +Pj9/f3////////////////5+fne3OLKzdOyu8OorrOssranrrGlq7CkrrKmq6+hp62an6ObnKCfnqCc nJ6bmZyWlpeqrKjg4N7m5ubn5+fp6unr6+vt7e3u7e3v7+/5+vn////t7e339/f+/v7///////////// //////////+cOIyOjq+ytKyusbKysqOinoiHiIqMjJSWmaSnq7W4u8HGx83P0dPW1tvf3+Di4+Tn6Ofr 6+vt7+3x8fD08/P19vL09fDz9PD09fD09PDz8+7y8u3v7+nt7Obp6eTm5t3h4djc3NDU1cbJyru/wLm7 vbu+vsLExL/AwKuvr7Gzs6eqq6qrqsXGx9LV1+Pl5v////////////////////////3+//L4/d3h6srP 1r7EzK+1u6ivsqSsr6SrsaOpraOnqqGmqaGkppmcoJSXmJaYmpqampqamM7PzOXl5Obm5ujo6Orr6uvs 6+3s7O/v7/b39f////Hx8fX19f39/f///////////////////////5w4iouKq6+un5+ci4qKkJKVpamr uL2/yczO0tbW3N/f4uXm6+/w8fP19Pf39vr6+Pz7+v39+/39+f39+vz8/P3+/P7++/7++/39+/39+/39 +/7+/f7+/P7+/P3++vz89vn68fT17/Hx6ezs4+Xl2dzdzM7Qv8LDur6/r7O0oaOjoaOioqOjvsC/1tve 9/r7/////////////////////v///f//+Pv+6fD42uDoytDUwsrPsLi/oKesoKeqoqaqoaOnpaaooaGi naKmnKGll5mdl5eZnJycury44uLh5eXl5+fm6eno6+vr6+zs7u7u8/Tz////9vb28/Pz/f39//////// ////////////////nDiIiIiJiomZnJ+xtbjHyczU2Nne4ePo7O3w9fT1+fn5+/v5/fz6/v78/v73+Pbv 7ern5d/f29PW0MrPyL/Kw7rIwLnJwbfNxr3X0Mrf29Xm497w7+r5+ff9/v78/v79/v79/v79/v78/f36 +/z19/fs7u7i5eXW2drHy824vL+kp6mdoKCur67f4ub5/P3////49/f8+/n8+/v8/f39/f74+v319vrr 8fja4ObCxci2uruztrqyucGiqrCdoqefoKSnp6eioaGam5+bnaGbn6OTlJWcm5ulqajf4N/k5OTm5ubo 6Ofq6unq6urs7Ozx8fD9/f35+fnx8fH9/f3///////////////////////+cOJqdobe6vcrOz9rd3+bq 6/D09fb5+vn8/fr9/fj8/PPz793Y0b62rqOYkY+FgYR+eoB8en57eX58e359fHt6eHt5eHp3dnp3dHl1 b3h0bnhxbXxzaoR6cp+SiL2zqN/Z0/T08fj8+/7+/v7+/v7+/v3+/vr7+/Lz8+fq6tzf4MzQ0ry/wqyt r9XY1/T7/v7//+jo6qyoprSvrby2stTOzdzb2+bp7O/19vH5/dzi68bK0a6ytqirrquvsa2vs6KipaWk pp+ho5udopWanZqcnqOjopydnaerqd3d3ePj4uXl5efn5unp6err6uzs7O/v7/z8+/v7+/Hx8fz8/P// /////////////////////5w4y9DQ3eDh6u3v8/f4+fz8+v39+fz77erkxbqvmYp+fnJob2Zebmlgcm1q dHFvd3RveXdzenh5fXt6f358e3p4dnVwcnBtbWpnbWpmcm9pd3ZveXZ0d3Nxc29tb2tlbWdhenFplY2E xsC27Orl/f39/f7+/v7+/f7++vv78vPz6ezs3eDizM/Rw8XG4ert8fb4/Pz9qKetiIeHf31/goCAenRw g394lZKNtbezzdHS09newcPLrK2zoqKlpKOlqamqpaannqGlm5yfnZ+go6Khp6Wlpqant7m53t3d4ODg 5OTk5ubm6Ojo6urq6+vq7u7t+vr6/f398PDw/Pz8////////////////////////nDjr7/D1+Pn5/Pz7 /v739vPNxLyUioB3bWVsY11rY15mYVlkXVllXVdiXllsaGNvbGtwb2tzcXF2dHN2dnVzc3BqZ2FlYmBm Y15jYF9iXVpgXFlkYF1tbGZxcm50c3JycW1saWZoZl5oY15ybGd9bWXAs6n5+PX+///+/v7+/v77+/vy 9PTr7Ozd3+DLzc/a3d7z8/Tc3+h9fIFsanBUVFdXVVRPS0pPTUpkX1prZF1+enSUj42joJ+npaein5+l pKSgoKGjo6WkoaOlpKKpqKamp6eqqqq/wcDb29vg4ODj4+Pl5uXn5+fp6enp6ent7ez3+Pf+/v7w8PD8 /Pz///////////////////////+cOPn8/Pr9/e/u6b2yp4h8cXFoYGtiW2VdVmNaU2FcVGFcV2FaVmNe W2BcWGVhXmdlYmppZ29ubnFxcHFxcG9ubmViYGBcWWBeW2JfW15bVllVUFVRT1pWUmBdV2RhXWpnYW5r aG9rZ2pmZGRgXWhkYVFFREM3MKaYj/b07/3+/v7+/v39/fj4+PP09Ojq69PU19fY2Ovw9amosV5cY09O VEhGRklKSElGRUhEQVVRS1NSTGllYG5mYXl0bo6IhpuXlaWkpKShoailpKurq6qrqausrLGzs9TW19rb 2d7f3uLi4ePj4+bn5ujo6Onp6ezs7Pb39v7+/vHx8fz8/P///////////////////////5w48/Pvuq2j f3NsbWVcal9WYFZQXFJNWlFNWVBKWFJLWlRSWFRQXFhTXFdWXFlYZmNiaGdmbGxrb3Bvb3BuampmXl1a XFpXXFpWXltYWVZUUk9MUkxKVFJNVlJQV1JQVlRPXVhVY2Nha2hnamhmYl9cYV1XW1lXExISMykjrKOW +Pj1/f39/v7+/Pz8+Pn57vDw1djZ1NjZyc3ScW92NzlBMTQ3ODg7MzU1MzE0OTY1RkNDRkZASURBWVRR YVtZdXFslZGNpqWlsri5s7i5tLa3u7y80NHR29vb3d3d3t7e4eHg4uLi5ebl6Ojn6Ojn6+vr9fX2//// 8fHx/Pz8////////////////////////nDiHe3NwaWNpXlpbVU5cTUpYS0RUS0JTTElTSkNTTEZVTEtT UExTTk5UUE1UUE5hXl5oZmRtbW1ucG9ubm1lZGJdW1ZcW1taWFdZVVNUUk5PTElSS0lST01RTkpQTEhP SkdQTElUUU5fXVdoZ2dpaGZiX1tcWFVcWlgcGxwFAgBhWEzY0837/Pv+/v79/f32+vvx8/Tg4+TR1NaU lZlOTllCQ0YyNTotMDAvMDEvMDIyMzAtLSc+PDhTT0xfW1hjXlp9eXWdn5/Aw8bJy87Ix8jU1NPb29rc 3Nvc3Nzd3d3g4N/i4uLl5eXm5ubn5+fq6ur09fT////y8vL8/Pz///////////////////////+cOGxn YWJYTVlLRVFGQE5FPk5CPEpDP1BGP0xFQExGQVFLQ1JMR05JRkpEQk5IR1xZVmVlZG9tbHBxcWxtbWJi YV9dXFtYV1dVVFVTTlJOSVBLS1FPTVVQTU9NSktKRUtFP0ZFQEhFQU9NTF5cWmpnY2toZ2JgXlpUU1xb VSAfHwAAADAoJJmTiPLy7/39/fj8/Pn7+vn5+evs7cvN0YWDim10flVbZjk6RB0hJSwtLignJzU0Ny8s KlBOS2VlZX9/gJ2dnbe4uM3NzdHS0tjY2Nra2tra2trb29vc3N3d3N7e3uHh4OTk5OXl5ebm5unq6fT0 8/////Pz8/z8/P///////////////////////5w4XVBJV0xCT0hAUEdAS0I+RT88RD84SEA5SUE8SEI7 SkRCTkhFRkM/Qj07SUNAVVRQY2JibG5scnJzbW5tZWZlXl1eWVVUVlRRVVNPVFJTVVNTV1ZVVVVRUU9K TUtGSEVCREE/R0M/SkhEVVJQYF9damhnamdnYF5dVlJTW1hVHBsdAgEBGxYYYFtS4+Ld+/v7/v7+/f39 /Pz87O/wyszRu7m39Pn71uHmvsXNrLS7qbC1tLm8ubzDw8bI09XW19jY19nZ19nY2NnY2dnZ2dnZ2NnZ 2trZ29zb3Nzc3Nzc3d7d4OHg5OTk5eXl5eXm6erp9PX1////9PT0/Pz8//////////////////////// nDhaUkxXUUhUTEZOSEVIQz9FPThDPjRFOzJDPTdAPDVGQUFJRUNFQDw/OTRJRURaV1diZGJucHBzdHVv bm5qampgX2FaWVhZWFdcWVhfXV1iYGBgYV9ZWllTUVBPTktMSEdIREJIRkRNTEtVU1FcWVlnY2Nra2po ZWVdXl1VVFBbWFYSEhMDAgISDgxBQD/R0Mv4+Pj+/v79/f3+/f3y8/PLzNDv8vHu9PXj5+fm6Ojm5+bi 5OTh4+He4N/c3t3a29va2trZ2dnY2NjX2NjY2NjY2NjY2dna2trb29vc3Nvc3Nze3t3i4+Ll5eXn5+bo 6Oj19fX////09PT9/f3///////////////////////+cOF5XVVpUUVNOSEtIQUdBPEQ9N0M5M0E5NEA5 M0E7M0VAPEM/O0M9Oj87N01KSllaWmZlZnByc3N0dHBvb2tra2VjYlxcWl1eX2RlZGZnZGloZmRkYl5d XltaVldVU1ZRUVNRT1ZST1dVU1lYVl9cWWRkYmtsa2xsaWRjZF1bWlZRTlNRUQYGBwcFBAkFCEVOVMfE vvj49/7+/v7+/v7+/vDx8tvd3vL39+Lm5uXn5+Tm5eHk49/h4d7f39zd3Nrb29nZ2dfY19bX19bX19fX 19fY19jY2NnZ2dvb29vb29zd29zd3d/f3+Tk5Obm5unp6fb29v7+/vT09P39/f////////////////// /////5w4XltYWldTUU5JSUU+ST8/QDk0QDs2QT01QTw3QT49Pzs1Pjo1RD08QD49TkxKW1pZZWdncHBv c3JybmxsaWloZWVlYmNhZmZma2tqbW1saWpqY2RjYGBfX1xZW1pZXV1dXV5bX19bX19dYmBgZGNiaWhn bW1scG5tbGlpY2JhWVhWVFBNREFCAQEBDw4KBQwTU2p1wsG89/f3/v7+/////v3+7u7v4+bl4efm5ufn 4+Xl3+Pi3t/g3d7e2tvb2drZ2NnY1tbW1dbW1tbW19fX19fX2NjY2dnZ29vb29vb3N3b3d3e39/f4uLi 5OTk6Ojo9/f2/v7+9fX1/f39////////////////////////nDhaV1VZV1VTT0xJREJDOzRBOzZBOzlB PThFQj9HQj9APT1COzlDPz1GQj9NSkpaWFllZmNra2ttbGpnZWRoZmdnaGdqaWhqbGptbmxtbm5pamll ZGJgYF1hX11iYWBmZGJmZmRoZ2ZpamZpamdpamhtbWpwcG9wcW5sbGxpaGVgX19UUVBWVFEgICECAQEM CQkUMEJweoDEw774+fj+/v7+/v79/f3q6+vg4+Pl5ubj5OTf4uHe39/c3d3Z2trX2NjW19fV1dXV1dXV 1dXW1tbX19bY2NfZ2dna2trb3Nvc3dze3t3f39/i4uLl5eXp6en5+fj9/f329vb+/v7///////////// //////////+cOFdTUldVVFJNS0NBPD03MkE8NkA/NkVCPkhGREtHRkpGQEZBP0Q/PERBP0lIR1lYWWNg YGZlY2ZkZWNiYGhlZ2pqaWxsa21sbWpsa2lpaGdoZmNiYmJiYGVkYWVlZGZnZ2hoZmpqZ2xta2xua25u bXFvbXFwb3BxbnBvbGxraWRkYlxZWVNNTFNRUAYGBggHBwUIDTZec4CDgsvMyfr6+v7+/v////z8/Obn 5+Pk5OLk5N7g4N3e3trb29na2dfX19XW1tTU1NXV1dXV1dXW1dbX1tfY19nZ2drb2tvb29zc3N7e3t/f 3+Pj4+Xl5evr6/v7+vz8/Pf39/7+/v///////////////////////5w4T0tLTktKT0xKRkJAQTo2Qz89 TUdGTkpJSkdFSUdDSkdFS0ZIS0dHS0hHT09NVlVWXVtaXVtYXVpYXFpZYGBdZmZmZ2dnaGhnZmdmZmZl ZWVjZmNhZGRjZmZkZ2dlaGhlaGhma2lna2tqbG1rbW1rb3BucXBxcXBucHBvb25tbGtpYmJiV1NTVlFP KikpAAAACQYHFDtGW298lpWR2NjU+/v7/v/+////9/f45OTl4uPj3uDg297d2tra2NjY19fX1dXU1dXV 1dXU1NXV1NbV1tbW19jX2dnY2trZ2tvZ3Nzb3t/d4OHg4+Tj5ubm7e3t/Pz8+/v7+Pj4/v7+//////// ////////////////nDhKR0RIRUVMSUdMRkVFPz1PTUtST05PS0lMSEdLSkhOSUhMR0dNS0hTUVFXVVVW VVZVVFNUU1FUVVFVVlFZWVZfX1xhYF5gYV5iY19kYl9kY19lZmRkZWVnZWRoZ2NnZ2dnZmVlZ2ZoaGdr amhqa2pubWtvb21ycXBwcXBwcXBtbWxoZ2VdXFtQT0pQUE0GBwcGBQQBCBE5ZnlydnaioaDn5+T9/f3/ ///+/v7x8PHg4uLe4ODb3d3a2trY2NjV1tbS1NTT09TU1NTT1NTV1dXX1tfX2NfZ2dnZ2tra2trb29ve 3t3g4eDj4+Pn5+fu7+7+/v36+vr6+vr+/v7///////////////////////+cOENAP0pHRVNSUVZTUlFQ TVNTU1NQT01JRExKSEpIR0hGREhFQ01KSlBOTlRQTlNQT1RTUVVSUFRST1VUU1hWVFlaV1tcWl1cW2Be XF9fXWJhYGRiYWVkYWZlZGdmZWZmZWdnZmlmZWlnZ2lpZmlpaWtraW5tbHFwbnJwbnBxb25vbmtraWVk YVZTUlNRTSMiIwAAAAQBAh5DVltrcouMirW1svPz8v7+/v////39/efo6eDi4t3e3trc29na2dXX1tPU 1NPU1NPU1NPU1NTU1NXV1dfX1tnZ2dra2tvb2t3d3d/f3uLi4uXl5Ojo6PHy8P////n5+fz8/P7+/v// /////////////////////5w4R0ZES0hHU1JTV1dXVVVUVFJTUU5NT0tJTEhGS0hFSUdFTUpJUk1MTkxK T01MTExKUE1KUlFOVFNRWFZVWFZVV1dWWVhXWFhYXVtbXl1aXF5dYGBeYWFhYGJhZGRhZmVlZWVjZ2Vk ZWZkZ2dlaWdlaGpnbW1tcG9ucHBub29ub25tbW1samhnXVpbTk1LQUJBAQEBAQACBx8sTm56eXp6mJmX zc3J+fn5////////9fb34uPj4OHh3N3d29vb2NnY1tbV09XU09TU1NXU09TU1dXV1tfW19jX2drY29zb 3d3d39/f4uPi5OXj6+rq9fX1////9/f3/f39/v7+////////////////////////nDhQTExPUFBXVlRZ VlZWUlFRTkxLR0hMSEhLSEdIRUVLSUpPTk1OSkxOTUxNTElPTU1PTUxOT01QT05VUVBUUU1RUVBTU1NY VVVZWldbW1pcW1tdW1tfXlphX1xiYF9iYWBjY2JlZGVlZWJmZWRoZ2dpamttbGtvbm1vb2xvbmxubWtt bWxra2lgXl5QTk1PTUwSEREAAAAABQ46ZnZrcHCOjo6np6bn5+b8/fz////+/v7s7Ozk5OXg4eHe3t/b 3NvX2djX2NfX19fX19bX19bX19fY2NfY2djZ2drb3Nrd3tzg39/j4+Pm5ubq6+v4+Pf+/v739vf+/v7+ /v7///////////////////////+cOFRUU1dVVVhUU1JST1FNTU9LSEpIRkpHRkZEQUdGQ0tJSE5LSktL SU1OS01NTE9MSE5MSk9MS01NTU9OS1BPTlNQUVVSU1VVVVlXVltXVVpZWVtZWl1bW15bWFxdXV1fXmBi X2NhXWVkYWVlZGdmZWdoaGxqam1tbW1ta2xsam5sa21raWxqamRiYFVRUE5MSiYkJQAAAAAAASNKXWRu dIaFhJubm7/Avvb29v7+/v////n5+dDO0M7Ny9XU0tnZ19vc29zd3Nzc3Nrb2tna2dnZ2dna2dnZ2dra 2tzc3N7f3eDg3+Pj4+fn5uzs7Pz8+/z7/Pj4+P7+/v7+/v///////////////////////5w4VFVTVlJS UE9OTk1JSktKSkhKSEREREVCQz4/RUNASUhGSklHS0pFTUlJTUpJTkxLTU1MT05NT01MT01LUk9NUE9M UlFQVVJSVlRSWVZWWFhWWlhYW1lYXFpYWltYX11aX15cY2NhYWNiZmViZ2ZjaGhna2tpa2toamtpbGpo ampoamloaWhnZWNiVVRSTEpIPTw9AAAAAAAAEy9EW3B5fX17lZSTpqal4eLg/Pz8/////v7+2djbpqqp pKeno6empqmorK2ts7SywcC+z87M2trY3t/d3N3c3Nzc3t7e39/f4eHh5OXi5+fn8PDw/v7++vn6/Pz8 /v7+/v7+////////////////////////nDhQTk5PSklMSUZIR0RJRkNJR0RIRENGQ0FEQEBGQ0BIRkNH RkNIR0dLSUlNTEtPTkxPTk1QTU5OTExPTEpOTkxQT01QUE1QUE5TUlBWVVRXVlVXVlZYV1ZbWllaWlpe XVtgXV1hYmBjZGJlZWJmZmVnaGZqaWhqaWlpaGdoaGVmZmVoZWRmY2FkYmBcWFdPSkxHRkYKCgwAAAAG HypWc3p1eXmMjYyfn57Dw8H19fT////////z8/W0tLessLCpraynqamjpaWho6OcnZ2Zm5ufoJ+rrau/ v7va2dfh4eHh4eDj4+Pl5uXp6en19fX////5+Pn+/v7+/v7+/v7///////////////////////+cOEtJ R0dGRkZEQ0ZDRUVDQ0RCQ0VEQUZFREdHR0tHR0pHRUpIRUxIR0xKSkpKSExLSk9NTFBNTlBOTU5LSkxL S05NS1BPT1FRTVNRT1ZVUFZVVVVVVFdXVFlYV1laV1xcWl5eW2FfXmFhYWRjY2ZlY2ZmZGdlZWNkYWVk YGRiYWJhYGNhX2JfXWFfXFtZVU9MSEpGRRkZGQECAQERIU1vfW52eImJiJqamausq+Tl5P39/f////39 /c7O0bW4uLO2tq2vr6mrq6Wnp52hoJibm5SWlpKVlZKWlZSVlLKzrtzc2ebm5ufn5+zs7fr6+fv7+/z8 /P7+/v7+/v7+/v///////////////////////5w4SUdGSUdGRkRDRENCQ0I+QT8+QD88Q0I+SERCSEdH SkdGSkdISUhIS0lIS0dITUtITUtJTktLS0pJTEtIS0pKS0pJT05NT01LUVBNUVFNU1JQVVNQVFVRVlVT V1dUWVlXWVlYWltaXl5dYF9dYWBdYV9dXl1cXVxbXl1bXl5cX15bXlxbXFxbXltYXFhVUExLSUVALiwu CAcHAAkVRmt7anR6hIaElZWUo6OjzM3K+fn4////////4+Plvb+/ubu7tbe3srS0rK2tpaenoKKim52d k5WWlJeWkZOUhIiJkZKQycjF6uvp8PDw9vf28fHx/Pz8/v7+/v7+/v7+//////////////////////// nDhHRkZGQ0JIRkBCQUFCPzxDQDxDQTxCQkJHRUNHRENISEVIR0dJSUdJSEZLSUdKRkVJSERKSUVMSEZK SEVJSEVNS0pNTExMS0hPTUlQTk1PT01QT05TUE1TUE9SU1FVVFNUVVFXVVNYV1ZZWFdYWVZYWFhZWVda V1ZcWFZbWVlaWVdbWllbWllaWllYVlROTExIRERAPTwRDQ8ABRA9Z3dodXiBg4GRkZCgoKC2trbv7+/+ /v7////z8/XMzc3HyMjDxMTAwMC5ubmztLSsra2nqaifoaGXmZiSlZWLjY2ChYSDhYW3ubXy8/Hq6uro 6Oj39/f9/f3+/v7+/v7///////////////////////+cOEZFQ0hEQUNCP0NAQENBQEJAP0FBPUNDQkdE REhFQ0ZFQkVFRU5LSUdGREVFRkdFREZEQ0hHREhGRUtIRUpIREpLR0tKRUpJSUpLRktMSkpLSEtMSk1L S05MS05PTVFPTVFQTFJRUVJTUFRTUVRSUVVTUlZUVFhWVVpWUllWVlpYU1lXVlhXVlhXVVZUUFBMSkdD Q0JBQREODgAEDjtndWl3eH+Bf4+Pj52dnaurq+Dh4Pz8/P////z8/ePk5ODg4NPU08rKycLCwr29vbi4 uLKztKqrq5+ioZaamZCUlIaKioGEg4CEgrW1r+bm5N3d3fDw8Pv7+/7+/v7+/v////////////////// /////5w4RENDREFBQj8+Q0JBREJBQUE/REQ/RURERURFRUVCRkRDRkRFQ0NCRkRDR0RDREREREREREND RUVFRkZFS0lIS0dGSUdISkhGSkhGS0lISEhDTEpFSklHTEtITExKTEtJUE5LTk5LUE9OUVBPUlFQVFJQ VFNRVFVTVVRUVVRTWFRUV1VUWFNUV1ZSVFJQTUtJRUNBREJDDgsMAAUTOmh3Z3Z7fICAkI+Om5qap6am z8/N+vn4/////v7/7e3t6enp5OTj4eHgzs7NxcXEv8DAuru7tLW1q6ysn6KhmJublpeXio2OgIOEf4OB n56gvbu+6Ojn9/f3/f39/v7+////////////////////////nDhBQEFDPj5CQD9DQkBGRENERENHRkJG RkNGRERFRUNGRURGRkVHRkZKSUZIR0dJSEVFRUREQ0FHRkZJRUVJRkZIRkVISEdIRkRHR0NJSUVHR0ZH R0dJR0ZKSEdLSUZMSklMTElPTE1NTUxPT05RUU9RUE9SUU9UUU5UU09TUk5VUlJUU1JTU1JXUk9TT0xL SEhGQkJGQEMKBwkACBZCbH1pd3t9gYGNjoyampqlpaW/wL/z8/L////////19PXw8PDp6enl5eTW1dXO zs7Hx8e/wMC5u7u0tbSqrKyio6OYmpqXm5uLj5J5e3qJjouamp7a2trx8fH8/Pz+/v7///////////// //////////+cOEVBQERBP0NCP0ZFQ0hFRkdGRkpIRkdHR0hHREdIR0hIR0lJRUtJSEtKSUhJSUpISEZG RkhGRUhGREhGRUdGRkhFRUZGQ0VIRElHRUlHRUhHRkZGRElGQkpGRklHSEtJSE1KSE1KSU1MSlBNTFNS TlBQT1FPTFNPS1JRUFJQTFFQT1JRUFJRUVRSUFBOTUpHRUdEQz05OwIBAgAQHk1ygGl5eXyBgYyMjJmZ maOjorS1tOrr6P7+/v///+nm6auqqsC/vdfW1OLi4NjY2M3OzcfGxr/AwLy9vLS2tqysrKKlpJiampmd nIuPkYyRkJCTlLe5ue3t7fv7+/7+/v///////////////////////5w4Q0JBRENARURDRkdESEhHSEdG SUhDSEdHSEdHSEdISkpJSUlJS0tIS0pKS0lKSkdFSEhISUhISUhGR0ZFR0VFR0ZFSEdIR0ZDSUZDSkhG R0lIRkdGRUZFSEZER0dGSUdHSUpITEtITExLUU5NUVBPUE5NUE1LUE1KUU1KT05MUFBLUE5MU1FLU1BO TkxJS0dGSURDNDI0AAAAAhonV3V/bHp6fICAiouLl5eWoaGhra6t4eLg/f39////7+7xo6aonaGinJ+g rK2uuri5wL++xsXExMTDw8XCwcLCtre3rK2toaOjkpaXmJybnZ+ejo+RkJaV5+jo+fn5/v7+//////// ////////////////nDg= -1 150 Please select the folder that you want to be cleaned Vorgang abgebrochen! RED deleted {0} directories for you! Entferne Leere Ordner Entferne Leere Ordner... Entferne Leere Ordner ({0}/{1})... Scanning folders... Searching empty folders... Achtung! Warning, do you really want to delete empty system folders?\nThis may harm your operating system. ================================================ FILE: RED2/Properties/Settings.Designer.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace RED2.Properties { [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "16.8.1.0")] internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); public static Settings Default { get { return defaultInstance; } } [global::System.Configuration.UserScopedSettingAttribute()] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("C:\\")] public string last_used_directory { get { return ((string)(this["last_used_directory"])); } set { this["last_used_directory"] = value; } } [global::System.Configuration.UserScopedSettingAttribute()] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("False")] public bool dont_scan_hidden_folders { get { return ((bool)(this["dont_scan_hidden_folders"])); } set { this["dont_scan_hidden_folders"] = value; } } [global::System.Configuration.UserScopedSettingAttribute()] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("True")] public bool ignore_0kb_files { get { return ((bool)(this["ignore_0kb_files"])); } set { this["ignore_0kb_files"] = value; } } [global::System.Configuration.UserScopedSettingAttribute()] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("True")] public bool keep_system_folders { get { return ((bool)(this["keep_system_folders"])); } set { this["keep_system_folders"] = value; } } [global::System.Configuration.UserScopedSettingAttribute()] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("False")] public bool clipboard_detection { get { return ((bool)(this["clipboard_detection"])); } set { this["clipboard_detection"] = value; } } [global::System.Configuration.UserScopedSettingAttribute()] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("desktop.ini\r\nThumbs.db\r\n.DS_Store\r\n._*")] public string ignore_files { get { return ((string)(this["ignore_files"])); } set { this["ignore_files"] = value; } } [global::System.Configuration.UserScopedSettingAttribute()] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("System Volume Information\r\nRECYCLER\r\nRecycled\r\nNtUninstall\r\n$RECYCLE.BIN\r\nGAC_MSI" + "L\r\nGAC_32\r\nwinsxs\r\nSystem32")] public string ignore_directories { get { return ((string)(this["ignore_directories"])); } set { this["ignore_directories"] = value; } } [global::System.Configuration.UserScopedSettingAttribute()] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("-1")] public decimal max_depth { get { return ((decimal)(this["max_depth"])); } set { this["max_depth"] = value; } } [global::System.Configuration.UserScopedSettingAttribute()] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("10")] public decimal infinite_loop_detection_count { get { return ((decimal)(this["infinite_loop_detection_count"])); } set { this["infinite_loop_detection_count"] = value; } } [global::System.Configuration.UserScopedSettingAttribute()] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("0")] public decimal pause_between { get { return ((decimal)(this["pause_between"])); } set { this["pause_between"] = value; } } [global::System.Configuration.UserScopedSettingAttribute()] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("True")] public bool ignore_deletion_errors { get { return ((bool)(this["ignore_deletion_errors"])); } set { this["ignore_deletion_errors"] = value; } } [global::System.Configuration.UserScopedSettingAttribute()] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("0")] public int delete_stats { get { return ((int)(this["delete_stats"])); } set { this["delete_stats"] = value; } } [global::System.Configuration.UserScopedSettingAttribute()] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("0")] public int delete_mode { get { return ((int)(this["delete_mode"])); } set { this["delete_mode"] = value; } } [global::System.Configuration.UserScopedSettingAttribute()] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("True")] public bool hide_scan_errors { get { return ((bool)(this["hide_scan_errors"])); } set { this["hide_scan_errors"] = value; } } [global::System.Configuration.UserScopedSettingAttribute()] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("0")] public uint min_folder_age_hours { get { return ((uint)(this["min_folder_age_hours"])); } set { this["min_folder_age_hours"] = value; } } [global::System.Configuration.UserScopedSettingAttribute()] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("False")] public bool fast_search_mode { get { return ((bool)(this["fast_search_mode"])); } set { this["fast_search_mode"] = value; } } } } ================================================ FILE: RED2/Properties/Settings.settings ================================================  C:\ False True True False desktop.ini Thumbs.db .DS_Store ._* System Volume Information RECYCLER Recycled NtUninstall $RECYCLE.BIN GAC_MSIL GAC_32 winsxs System32 -1 10 0 True 0 0 True 0 False ================================================ FILE: RED2/RED2.csproj ================================================  Debug AnyCPU 8.0.50727 2.0 {643E0BFC-DBFA-4FE5-ADB6-AC4387849762} WinExe Properties RED2 RED2 coffee.ico false false 12333660AF16C494E347751E1615A64A0EE33DAE RED2_TemporaryKey.pfx true false v4.6.2 2.0 publish\ true Disk false Foreground 7 Days false false true http://www.jonasjohn.de/ Remove Empty Directories Jonas John true 0 2.3.0.0 false true true true full false bin\Debug\ DEBUG;TRACE prompt 4 false pdbonly true bin\Release\ TRACE prompt 4 false RED2.Program app.manifest bin\Release-x86\ TRACE true pdbonly AnyCPU 7.3 prompt true bin\x86\Debug\ DEBUG;TRACE full x86 7.3 prompt bin\x86\Release\ TRACE true pdbonly x86 7.3 prompt bin\x86\Release-x86\ TRACE true pdbonly x86 7.3 prompt bin\Release-x64\ TRACE true pdbonly AnyCPU 7.3 prompt bin\x86\Release-x64\ TRACE true pdbonly x86 7.3 prompt true bin\x64\Debug\ DEBUG;TRACE full x64 7.3 prompt bin\x64\Release\ TRACE true pdbonly x64 7.3 prompt bin\x64\Release-x86\ TRACE true pdbonly x64 7.3 prompt bin\x64\Release-x64\ TRACE true pdbonly x64 7.3 prompt ..\packages\AlphaFS.2.2.6\lib\net452\AlphaFS.dll Form DeletionError.cs Component Form MainWindow.cs Component Form LogWindow.cs DeletionError.cs Designer MainWindow.cs LogWindow.cs ResXFileCodeGenerator Resources.Designer.cs Designer True Resources.resx True SettingsSingleFileGenerator Settings.Designer.cs True Settings.settings True False .NET Framework 3.5 SP1 Client Profile false False .NET Framework 2.0 false False .NET Framework 3.5 SP1 true False Exclude True File ================================================ FILE: RED2/RED2.csproj.user ================================================  publish\ http://www.jonasjohn.de/ de-DE false ShowAllFiles false ================================================ FILE: RED2/app.config ================================================
C:\ False True True False desktop.ini Thumbs.db .DS_Store ._* System Volume Information RECYCLER Recycled NtUninstall $RECYCLE.BIN GAC_MSIL GAC_32 winsxs System32 -1 10 0 True 0 0 True 0 False ================================================ FILE: RED2/app.manifest ================================================  true ================================================ FILE: RED2/packages.config ================================================  ================================================ FILE: Scripts/create-1000-empty-directories.bat ================================================ mkdir test-1000-dirs FOR /L %%A IN (1,1,1000) DO ( mkdir test-1000-dirs\dir-%%A ) echo "Done, created 1000 empty directories" pause ================================================ FILE: Scripts/create-test-directories.bat ================================================ rem Change active code page to utf-8 (because of special chars) chcp 65001 mkdir test-dirs\empty-1 mkdir test-dirs\empty-2 mkdir test-dirs\empty-3 mkdir test-dirs\empty-with-child-dirs-1\empty-subdir-1-of-3 mkdir test-dirs\empty-with-child-dirs-1\empty-subdir-2-of-3 mkdir test-dirs\empty-with-child-dirs-1\empty-subdir-3-of-3 mkdir test-dirs\not-empty echo Test> test-dirs\not-empty\dummy.txt mkdir test-dirs\empty-4 mkdir test-dirs\deep-nested-empty-dirs\a\b\c\d\e\f mkdir test-dirs\deep-nested-empty-dirs\a\b2 mkdir test-dirs\deep-nested-empty-dirs\a\b\c2 mkdir test-dirs\deep-nested-empty-dirs\a\b\c3 mkdir test-dirs\deep-nested-empty-dirs\a\b\c\d\e\f2 mkdir test-dirs\empty-hidden-dir attrib +h test-dirs\empty-hidden-dir /s /d mkdir test-dirs\empty-hidden-nested-dirs\a\b mkdir test-dirs\empty-hidden-nested-dirs\a2\b2 mkdir test-dirs\empty-hidden-nested-dirs\a3\b3 attrib +h test-dirs\empty-hidden-nested-dirs /s /d attrib +h test-dirs\empty-hidden-nested-dirs\* /s /d attrib +h test-dirs\empty-hidden-nested-dirs\a\* /s /d mkdir test-dirs\not-empty-hidden-dir echo Test> test-dirs\not-empty-hidden-dir\dummy.txt mkdir test-dirs\contains-1-empty-file type nul > test-dirs\contains-1-empty-file\empty.txt mkdir test-dirs\contains-3-empty-files type nul > test-dirs\contains-3-empty-files\empty-1.txt type nul > test-dirs\contains-3-empty-files\empty-2.txt type nul > test-dirs\contains-3-empty-files\empty-3.txt mkdir test-dirs\contains-empty-files-and-non-empty type nul > test-dirs\contains-empty-files-and-non-empty\empty-1.txt type nul > test-dirs\contains-empty-files-and-non-empty\empty-2.txt echo 1 > test-dirs\contains-empty-files-and-non-empty\not-empty.txt mkdir test-dirs\with-desktop.ini echo "test" > test-dirs\with-desktop.ini\desktop.ini mkdir test-dirs\with-Thumbs.db echo "test" > test-dirs\with-Thumbs.db\Thumbs.db mkdir test-dirs\with-mac-DS_Store echo "test" > test-dirs\with-mac-DS_Store\.DS_Store mkdir test-dirs\with-AppleDouble-files echo "test" > test-dirs\with-AppleDouble-files\._test1 echo "test" > test-dirs\with-AppleDouble-files\._test2 mkdir "test-dirs\empty-dirs-with-special-chars\with spaces" mkdir "test-dirs\empty-dirs-with-special-chars\spaces a b c d" mkdir "test-dirs\empty-dirs-with-special-chars\#test" mkdir "test-dirs\empty-dirs-with-special-chars\test!" mkdir "test-dirs\empty-dirs-with-special-chars\ spaces" mkdir "test-dirs\empty-dirs-with-special-chars\ spaces " mkdir "test-dirs\empty-dirs-with-special-chars\!test" mkdir "test-dirs\empty-dirs-with-special-chars\^test" mkdir "test-dirs\empty-dirs-with-special-chars\#+!^-_" mkdir "test-dirs\empty-dirs-with-special-chars\chinese\删除空目录" mkdir "test-dirs\empty-dirs-with-special-chars\chinese\测试" mkdir "test-dirs\empty-dirs-with-special-chars\chinese\红" mkdir "test-dirs\empty-dirs-with-special-chars\chinese\紅" mkdir "test-dirs\empty-dirs-with-special-chars\chinese\刪除空目錄" mkdir "test-dirs\empty-dirs-with-special-chars\chinese\去掉" mkdir "test-dirs\empty-dirs-with-special-chars\chinese\不是空的" mkdir "test-dirs\empty-dirs-with-special-chars\chinese\这个\空的\是" echo Test> test-dirs\empty-dirs-with-special-chars\chinese\不是空的\文件 echo Test> test-dirs\empty-dirs-with-special-chars\chinese\不是空的2\文件.txt mkdir "test-dirs\empty-dirs-with-special-chars\arabic\صباح الخير" mkdir "test-dirs\empty-dirs-with-special-chars\arabic\اختبار" mkdir "test-dirs\empty-dirs-with-special-chars\arabic\ر" mkdir "test-dirs\empty-dirs-with-special-chars\arabic\ليس فارغا" echo Test> "test-dirs\empty-dirs-with-special-chars\arabic\ليس فارغا\dummy.txt" mkdir "test-dirs\empty-dirs-with-special-chars\russian\т" mkdir "test-dirs\empty-dirs-with-special-chars\russian\тест" mkdir "test-dirs\empty-dirs-with-special-chars\russian\удалить пустые каталоги" mkdir "test-dirs\empty-dirs-with-special-chars\russian\не пусто" echo Test> "test-dirs\empty-dirs-with-special-chars\russian\не пусто\да да.txt" echo "Done, created all test directories" pause ================================================ FILE: red2_project.sln ================================================  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 16 VisualStudioVersion = 16.0.30907.101 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RED2", "RED2\RED2.csproj", "{643E0BFC-DBFA-4FE5-ADB6-AC4387849762}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU Debug|x64 = Debug|x64 Debug|x86 = Debug|x86 Release|Any CPU = Release|Any CPU Release|x64 = Release|x64 Release|x86 = Release|x86 Release-x64|Any CPU = Release-x64|Any CPU Release-x64|x64 = Release-x64|x64 Release-x64|x86 = Release-x64|x86 Release-x86|Any CPU = Release-x86|Any CPU Release-x86|x64 = Release-x86|x64 Release-x86|x86 = Release-x86|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {643E0BFC-DBFA-4FE5-ADB6-AC4387849762}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {643E0BFC-DBFA-4FE5-ADB6-AC4387849762}.Debug|Any CPU.Build.0 = Debug|Any CPU {643E0BFC-DBFA-4FE5-ADB6-AC4387849762}.Debug|x64.ActiveCfg = Debug|Any CPU {643E0BFC-DBFA-4FE5-ADB6-AC4387849762}.Debug|x64.Build.0 = Debug|Any CPU {643E0BFC-DBFA-4FE5-ADB6-AC4387849762}.Debug|x86.ActiveCfg = Debug|Any CPU {643E0BFC-DBFA-4FE5-ADB6-AC4387849762}.Debug|x86.Build.0 = Debug|Any CPU {643E0BFC-DBFA-4FE5-ADB6-AC4387849762}.Release|Any CPU.ActiveCfg = Release|Any CPU {643E0BFC-DBFA-4FE5-ADB6-AC4387849762}.Release|Any CPU.Build.0 = Release|Any CPU {643E0BFC-DBFA-4FE5-ADB6-AC4387849762}.Release|x64.ActiveCfg = Release|Any CPU {643E0BFC-DBFA-4FE5-ADB6-AC4387849762}.Release|x64.Build.0 = Release|Any CPU {643E0BFC-DBFA-4FE5-ADB6-AC4387849762}.Release|x86.ActiveCfg = Release|Any CPU {643E0BFC-DBFA-4FE5-ADB6-AC4387849762}.Release|x86.Build.0 = Release|Any CPU {643E0BFC-DBFA-4FE5-ADB6-AC4387849762}.Release-x64|Any CPU.ActiveCfg = Release-x64|x64 {643E0BFC-DBFA-4FE5-ADB6-AC4387849762}.Release-x64|Any CPU.Build.0 = Release-x64|x64 {643E0BFC-DBFA-4FE5-ADB6-AC4387849762}.Release-x64|x64.ActiveCfg = Release-x64|x64 {643E0BFC-DBFA-4FE5-ADB6-AC4387849762}.Release-x64|x64.Build.0 = Release-x64|x64 {643E0BFC-DBFA-4FE5-ADB6-AC4387849762}.Release-x64|x86.ActiveCfg = Release-x64|x64 {643E0BFC-DBFA-4FE5-ADB6-AC4387849762}.Release-x64|x86.Build.0 = Release-x64|x64 {643E0BFC-DBFA-4FE5-ADB6-AC4387849762}.Release-x86|Any CPU.ActiveCfg = Release-x86|x86 {643E0BFC-DBFA-4FE5-ADB6-AC4387849762}.Release-x86|Any CPU.Build.0 = Release-x86|x86 {643E0BFC-DBFA-4FE5-ADB6-AC4387849762}.Release-x86|x64.ActiveCfg = Release-x86|x86 {643E0BFC-DBFA-4FE5-ADB6-AC4387849762}.Release-x86|x64.Build.0 = Release-x86|x86 {643E0BFC-DBFA-4FE5-ADB6-AC4387849762}.Release-x86|x86.ActiveCfg = Release-x86|x86 {643E0BFC-DBFA-4FE5-ADB6-AC4387849762}.Release-x86|x86.Build.0 = Release-x86|x86 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {3E80EAAB-29DD-4BED-9F6F-6FBFF73F5E99} EndGlobalSection EndGlobal