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