View Issue Details

IDProjectCategoryView StatusLast Update
0027765LazarusOtherpublic2015-04-09 15:58
ReporterSerguei Tarassov Assigned ToJuha Manninen  
PrioritynormalSeverityminorReproducibilityalways
Status resolvedResolutionfixed 
Platformx68 64OSWindows, Ubuntu 
Product Version1.2.6 
Summary0027765: FPCUnit: GUI ergonomy improvements
DescriptionHello,

I work with both DUnit and FPCUnit at the same time and would propose some FPCUnit improvements.

- "Run all tests" with Ctrl+R is less intuitive and usable that F9 in DUnit
- Check box states not saved between the runs so I need to do it every time...
- Cannot close form by "Escape" as in DUnit, Alt+F4 or mouse manipulations are required

If you interested these improvements I can modifications and publish patched files (normally, only 2 file concerned)
Steps To ReproduceRun any test under FPCUint GUI
TagsNo tags attached.
Fixed in Revisionr48686
LazTarget-
Widgetset
Attached Files

Activities

Juha Manninen

2015-04-01 20:12

developer   ~0082536

Could you provide a patch please?

Serguei Tarassov

2015-04-03 11:02

reporter  

guitestrunner.lfm.patch (3,793 bytes)   
--- /cygdrive/C/lazarus/components/fpcunit/guitestrunner.lfm	2014-05-06 23:52:07.524235000 +0200
+++ guitestrunner.lfm	2015-04-02 15:32:08.231268800 +0200
@@ -46,7 +46,7 @@
   OnShow = GUITestRunnerShow
   Position = poScreenCenter
   ShowHint = True
-  LCLVersion = '1.3'
+  LCLVersion = '1.2.6.0'
   object Panel1: TPanel
     Left = 0
     Height = 88
@@ -172,10 +172,10 @@
       AnchorSideTop.Control = Panel1
       AnchorSideRight.Control = Panel1
       AnchorSideRight.Side = asrBottom
-      Left = 488
+      Left = 482
       Height = 34
       Top = 7
-      Width = 80
+      Width = 86
       Action = ActCloseForm
       Anchors = [akTop, akRight]
       AutoSize = True
@@ -269,7 +269,7 @@
       Left = 92
       Height = 32
       Top = 7
-      Width = 148
+      Width = 174
       Action = ActRunHighlightedTest
       AutoSize = True
       BorderSpacing.Around = 6
@@ -367,27 +367,26 @@
       TabOrder = 0
       object tsTestTree: TTabSheet
         Caption = 'Testcase tree'
-        ClientHeight = 474
+        ClientHeight = 470
         ClientWidth = 565
         object Splitter1: TSplitter
           Cursor = crVSplit
           Left = 0
           Height = 5
-          Top = 336
+          Top = 332
           Width = 565
           Align = alBottom
           ResizeAnchor = akBottom
         end
         object TestTree: TTreeView
           Left = 6
-          Height = 324
+          Height = 320
           Top = 6
           Width = 553
           Align = alClient
           BorderSpacing.Around = 6
           BackgroundColor = clBtnFace
           Color = clBtnFace
-          DefaultItemHeight = 16
           Images = TestTreeImageList
           PopupMenu = PopupMenu3
           ReadOnly = True
@@ -403,7 +402,7 @@
         object Memo1: TMemo
           Left = 6
           Height = 121
-          Top = 347
+          Top = 343
           Width = 553
           Align = alBottom
           BorderSpacing.Around = 6
@@ -436,7 +435,7 @@
           TabOrder = 0
           BookMarkOptions.Xoffset = -18
           Gutter.Visible = False
-          Gutter.Width = 59
+          Gutter.Width = 61
           Gutter.MouseActions = <          
             item
               ClickCount = ccAny
@@ -882,7 +881,7 @@
               MouseActions = <>
             end
             object TSynGutterLineNumber
-              Width = 19
+              Width = 21
               MouseActions = <>
               MarkupInfo.Background = clBtnFace
               MarkupInfo.Foreground = clNone
@@ -1850,16 +1849,22 @@
     top = 176
     object RunAction: TAction
       Category = 'Run'
-      Caption = '  &Run'
+      Caption = '&Run'
       Hint = 'Run all checked test(s)'
       ImageIndex = 3
       OnExecute = RunExecute
+      SecondaryShortCuts.Strings = (
+        'F9'
+      )
       ShortCut = 16466
     end
     object ActCloseForm: TAction
       Caption = 'Quit'
       Hint = 'Quit Testing'
       OnExecute = ActCloseFormExecute
+      SecondaryShortCuts.Strings = (
+        'Esc'
+      )
       ShortCut = 16451
     end
     object actCopyErrorMsg: TAction
@@ -1897,6 +1902,7 @@
       ImageIndex = 4
       OnExecute = ActRunHighlightedTestExecute
       OnUpdate = ActRunHighLightedTestUpdate
+      ShortCut = 119
     end
   end
   object PopupMenu3: TPopupMenu
@@ -1905,7 +1911,8 @@
     top = 240
     object miRunTest: TMenuItem
       Action = RunAction
-      Caption = '  &Run all selected (checked) tests'
+      Caption = '&Run all selected (checked) tests'
+      ShortCutKey2 = 120
       OnClick = RunExecute
     end
     object MenuItem4: TMenuItem
    end
     object MenuItem4: TMenuItem
guitestrunner.lfm.patch (3,793 bytes)   

Serguei Tarassov

2015-04-03 11:03

reporter  

guitestrunner.pas.patch (3,103 bytes)   
--- /cygdrive/C/lazarus/components/fpcunit/guitestrunner.pas	2014-05-06 23:52:07.524235000 +0200
+++ guitestrunner.pas	2015-04-02 15:32:08.201225600 +0200
@@ -117,6 +117,8 @@
     testSuite: TTest;
     procedure BuildTree(rootNode: TTreeNode; aSuite: TTestSuite);
     function  FindNode(aTest: TTest): TTreeNode;
+    function GetConfFileName: string;
+    function MakeTestPath(Node: TTreeNode): string;
     procedure ResetNodeColors;
     procedure PaintNodeError(aNode: TTreeNode);
     procedure PaintNodeFailure(aNode: TTreeNode);
@@ -125,6 +127,8 @@
     procedure PaintNodeBusy(aNode: TTreeNode);
     procedure MemoLog(LogEntry: string);
     procedure EnableRunActions(AValue: boolean);
+    procedure RestoreTree;
+    procedure SaveTree;
   public
     procedure AddFailure(ATest: TTest; AFailure: TTestFailure);
     procedure AddError(ATest: TTest; AError: TTestFailure);
@@ -169,7 +173,7 @@
   sactCheckAll = 'Check all Tests';
   sactUncheckAll = 'Uncheck all tests';
   sactRunHighlightedTest = 'Run highlighted test';
-  smiRunTest = '  &Run all selected (checked) tests';
+  smiRunTest = '&Run all selected (checked) tests';
   smiShowfail= 'Copy message to clipboard';
   smiCopy = '&Copy';
   smiCut = 'C&ut';
@@ -180,8 +184,10 @@
 {$R *.lfm}
 
 uses
+  IniFiles,
   xmlwrite
   ;
+
 const
   // TestTreeImageList indexes:
   imgGreenBall = 0; //success result
@@ -232,12 +238,59 @@
   XMLSynEdit.Lines.Clear;
 end;
 
+function TGUITestRunner.GetConfFileName: string;
+begin
+  Result := ParamStr(0) + '.fpcunit.ini';
+end;
+
+function TGUITestRunner.MakeTestPath(Node: TTreeNode): string;
+begin
+  Result := '';
+  while Node <> nil do
+  begin
+    Result := Node.Text + '_' + Result;
+    Node := Node.Parent;
+  end;
+end;
+
+procedure TGUITestRunner.SaveTree;
+var
+  Conf: TIniFile;
+  i: integer;
+begin
+  Conf := TIniFile.Create(GetConfFileName);
+  try
+    for i := 0 to TestTree.Items.Count - 1 do
+      Conf.WriteBool('Tests', MakeTestPath(TestTree.Items[i]), TestTree.Items[i].StateIndex = Ord(tsChecked));
+  finally
+    Conf.Free;
+  end;
+end;
+
+procedure TGUITestRunner.RestoreTree;
+var
+  Conf: TIniFile;
+  i: integer;
+begin
+  Conf := TIniFile.Create(GetConfFileName);
+  try
+    for i := 0 to TestTree.Items.Count - 1 do
+      if Conf.ReadBool('Tests', MakeTestPath(TestTree.Items[i]), true) then
+        TestTree.Items[i].StateIndex := Ord(tsChecked)
+      else
+        TestTree.Items[i].StateIndex := Ord(tsUnChecked);
+  finally
+    Conf.Free;
+  end;
+end;
+
 procedure TGUITestRunner.GUITestRunnerCreate(Sender: TObject);
 begin
   barColor := clGreen;
   TestTree.Items.Clear;
   BuildTree(TestTree.Items.AddObject(nil, rsAllTests, GetTestRegistry),
     GetTestRegistry);
+  RestoreTree;
   PageControl1.ActivePage := tsTestTree;
   //
   BtnRun.Caption:= sbtnRun;
@@ -780,6 +833,7 @@
   m: TMemoryStream;
 
 begin
+  SaveTree;
   barcolor := clGreen;
   ResetNodeColors;
   failureCounter := 0;
ResetNodeColors;
   failureCounter := 0;
guitestrunner.pas.patch (3,103 bytes)   

Serguei Tarassov

2015-04-03 11:05

reporter   ~0082561

I added patches, the full sources are available in my blog: http://sgbd.arbinada.com/node/105

Juha Manninen

2015-04-06 11:07

developer   ~0082651

Last edited: 2015-04-06 11:13

View 3 revisions

Your patches fail to apply completely. See below. All patches should be made against trunk.
Other things to make applying (valid) patches easier :
1. You can add all changes into one patch.
2. You should create a patch from the top level Lazarus directory, like :
  $ svn diff /components/fpcunit/guitestrunner.lfm /components/fpcunit/guitestrunner.pas > guitestrunner.patch

BTW, the "(different line endings)" below is not an error. Patch command can deal with line endings correctly.
---

juha@juhan-kone:~/SW/lazarus_gitsvn/components/fpcunit > patch -p0 < ~/patch/guitestrunner.lfm.patch
patching file guitestrunner.lfm
Hunk 0000001 FAILED at 46 (different line endings).
Hunk 0000002 FAILED at 172 (different line endings).
Hunk 0000003 FAILED at 269 (different line endings).
Hunk 0000004 FAILED at 367 (different line endings).
Hunk 0000005 FAILED at 403 (different line endings).
Hunk 0000006 FAILED at 436 (different line endings).
Hunk 0000007 FAILED at 882 (different line endings).
Hunk 0000008 FAILED at 1850 (different line endings).
Hunk 0000009 FAILED at 1897 (different line endings).
Hunk 0000010 FAILED at 1905 (different line endings).
10 out of 10 hunks FAILED -- saving rejects to file guitestrunner.lfm.rej
juha@juhan-kone:~/SW/lazarus_gitsvn/components/fpcunit > patch -p0 < ~/patch/guitestrunner.pas.patch
patching file guitestrunner.pas
Hunk 0000001 FAILED at 117 (different line endings).
Hunk 0000002 FAILED at 125 (different line endings).
Hunk 0000003 FAILED at 169 (different line endings).
Hunk 0000004 FAILED at 180 (different line endings).
Hunk 0000005 FAILED at 232 (different line endings).
Hunk 0000006 FAILED at 780 (different line endings).
6 out of 6 hunks FAILED -- saving rejects to file guitestrunner.pas.rej

Serguei Tarassov

2015-04-07 12:18

reporter   ~0082688

I use 1.2.6 for Win32/Linux64 and the patches are taken from sources provided with Win32 distribution (it explains line endings difference).

Could you please provide SVN URL to get required sources?
I will make patches from it.

Zeljan Rikalo

2015-04-07 13:23

developer   ~0082690

http://wiki.lazarus.freepascal.org/index.php/Getting_Lazarus
You must install trunk lazarus version from svn and then create patches.

Juha Manninen

2015-04-07 13:57

developer   ~0082691

SVN URL:
  http://svn.freepascal.org/svn/lazarus/trunk

Wiki page:
  http://wiki.freepascal.org/Getting_Lazarus

Serguei Tarassov

2015-04-07 15:28

reporter   ~0082696

I see that the files was modified a little so I cannot make the patch but only merge them (reusing introduced FINI variable).

Here is 2 files attached (I don't have rights to commit them directly): quitestrunner.pas and .lfm.

Serguei Tarassov

2015-04-07 15:29

reporter  

guitestrunner.pas (26,511 bytes)   
{
  Copyright (C) 2004-2015 Dean Zobec, contributors

  This library is free software; you can redistribute it and/or modify it
  under the terms of the GNU Library General Public License as published by
  the Free Software Foundation; either version 2 of the License, or (at your
  option) any later version.

  This program is distributed in the hope that it will be useful, but WITHOUT
  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
  for more details.

  You should have received a copy of the GNU Library General Public License
  along with this library; if not, write to the Free Software Foundation,
  Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  
  
  Modified:
    Graeme Geldenhuys <graemeg@gmail.com>
    Darius Blaszijk <dhkblaszyk@zeelandnet.nl>
    Reinier Olislagers <reinierolislagers@gmail.com>
    Serguei Tarassov <serge@arbinada.com>
}

unit GuiTestRunner;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs,
  ExtCtrls, Buttons, ComCtrls, ActnList, Menus, Clipbrd, StdCtrls,
  testdecorator, xmltestreport,
  fpcunit, testregistry, SynEdit, SynHighlighterXML, gettext, Translations,
  inifiles;

type

  { TGUITestRunner }

  TGUITestRunner = class(TForm, ITestListener)
    actCopy: TAction;
    actCut: TAction;
    ActCloseForm: TAction;
    actCopyErrorMsg: TAction;
    ActCheckCurrentSuite: TAction;
    ActCheckAll: TAction;
    ActRunHighlightedTest: TAction;
    ActUncheckAll: TAction;
    ActUncheckCurrentSuite: TAction;
    btnRunHighlighted: TBitBtn;
    ilNodeStates: TImageList;
    Memo1: TMemo;
    MenuItem4: TMenuItem;
    MenuItem5: TMenuItem;
    MenuItem6: TMenuItem;
    MenuItem7: TMenuItem;
    MenuItem8: TMenuItem;
    miRunTest: TMenuItem;
    miShowfailureMsg: TMenuItem;
    pbBar: TPaintBox;
    PopupMenu3: TPopupMenu;
    RunAction: TAction;
    ActionList1: TActionList;
    ActionList2: TActionList;
    BtnRun: TBitBtn;
    BtnClose: TBitBtn;
    TestTreeImageList: TImageList;
    ResultsXMLImageList: TImageList;
    MenuItem1: TMenuItem;
    MenuItem2: TMenuItem;
    MenuItem3: TMenuItem;
    PopupMenu1: TPopupMenu;
    PopupMenu2: TPopupMenu;
    SaveDialog: TSaveDialog;
    Splitter1: TSplitter;
    TestTree: TTreeView;
    SynXMLSyn1: TSynXMLSyn;
    PageControl1: TPageControl;
    Panel1: TPanel;
    Panel2: TPanel;
    XMLToolBar: TToolBar;
    CopyXMLToolButton: TToolButton;
    CutXMLToolButton: TToolButton;
    SaveAsToolButton: TToolButton;
    tsTestTree: TTabSheet;
    tsResultsXML: TTabSheet;
    XMLSynEdit: TSynEdit;
    procedure ActCheckAllExecute(Sender: TObject);
    procedure ActCheckCurrentSuiteExecute(Sender: TObject);
    procedure ActCloseFormExecute(Sender: TObject);
    procedure ActRunHighlightedTestExecute(Sender: TObject);
    procedure ActUncheckAllExecute(Sender: TObject);
    procedure ActRunHighLightedTestUpdate(Sender: TObject);
    procedure ActUncheckCurrentSuiteExecute(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure RunExecute(Sender: TObject);
    procedure GUITestRunnerCreate(Sender: TObject);
    procedure GUITestRunnerShow(Sender: TObject);
    procedure MenuItem3Click(Sender: TObject);
    procedure SaveAsToolButtonClick(Sender: TObject);
    procedure TestTreeCreateNodeClass(Sender: TCustomTreeView;
      var NodeClass: TTreeNodeClass);
    procedure TestTreeMouseDown(Sender: TOBject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure TestTreeSelectionChanged(Sender: TObject);
    procedure actCopyErrorMsgExecute(Sender: TObject);
    procedure actCopyErrorMsgUpdate(Sender: TObject);
    procedure pbBarPaint(Sender: TObject);
    procedure actCopyExecute(Sender: TObject);
    procedure actCutExecute(Sender: TObject);
  private
    failureCounter: Integer;
    errorCounter: Integer;
    testsCounter: Integer;
    skipsCounter: Integer;
    barColor: TColor;
    testSuite: TTest;
    FFirstFailure: TTreeNode; // reference to first failed test
    FINI: TINIFile;
    procedure BuildTree(rootNode: TTreeNode; aSuite: TTestSuite);
    function  FindNode(aTest: TTest): TTreeNode;
    function MakeTestPath(Node: TTreeNode): string;
    procedure ResetNodeColors;
    procedure PaintNodeError(aNode: TTreeNode);
    procedure PaintNodeFailure(aNode: TTreeNode);
    procedure PaintNodeIgnore(aNode: TTreeNode);
    procedure PaintNodeNonFailed(aNode: TTreeNode);
    procedure PaintNodeBusy(aNode: TTreeNode);
    procedure MemoLog(LogEntry: string);
    procedure EnableRunActions(AValue: boolean);
    procedure RestoreTree;
    procedure SaveTree;
  public
    procedure AddFailure(ATest: TTest; AFailure: TTestFailure);
    procedure AddError(ATest: TTest; AError: TTestFailure);
    procedure StartTest(ATest: TTest);
    procedure EndTest(ATest: TTest);
    procedure RunTest(ATest: TTest);
    procedure StartTestSuite(ATestSuite: TTestSuite);
    procedure EndTestSuite(ATestSuite: TTestSuite);
  end;

var
  TestRunner: TGUITestRunner;

resourcestring
  rsAllTests = 'All Tests';
  rsRun = 'Run ';
  rsRuns = 'Runs: %s/%s';
  rsErrors = '%s    Errors: %s';
  rsFailures = '%s     Failures: %s';
  rsMessage = 'Message: %s';
  rsException = 'Exception: %s';
  rsExceptionMes = 'Exception message: %s';
  rsExceptionCla = 'Exception class: %s';
  rsUnitName = 'Unit name: %s';
  rsMethodName = 'Method name: %s';
  rsLineNumber = 'Line number: %s';
  rsRunning = 'Running %s';
  rsNumberOfExec = 'Number of executed tests: %s  Time elapsed: %s';
  // Visual components captions
  sfrmGUITest = 'FPCUnit - run unit test';
  sbtnRun = 'Run';
  sbtnRunH = 'Run highlighted test';
  sbtnClose = 'Close';
  stshTree = 'Testcase tree';
  stshResults = 'Results XML';
  sactRunAction = '&Run';
  sactRunActionH = 'Run all checked test(s)';
  sactCloseForm = 'Quit';
  sactCloseFormH = 'Quit Testting';
  sactCheckCurrentSuite = 'Check the Current Suite';
  sactUncheckCurrentSuite = 'Uncheck the Current Suite';
  sactCheckAll = 'Check all Tests';
  sactUncheckAll = 'Uncheck all tests';
  sactRunHighlightedTest = 'Run highlighted test';
  smiRunTest = '&Run all selected (checked) tests';
  smiShowfail= 'Copy message to clipboard';
  smiCopy = '&Copy';
  smiCut = 'C&ut';
  smiCopyClipbrd = 'Copy to clipboard';

implementation

{$R *.lfm}

uses
  xmlwrite
  ;

const
  // TestTreeImageList indexes:
  imgGreenBall = 0; //success result
  imgRedBall = 2;
  imgPurpleBall = 3;
  imgWarningSign = 4; //failure result
  imgInfoSign = 11; //error result
  imgGrayBall = 12; //default
  imgBlueBall = 13; //busy

type

  TTreeNodeState=(tsUnChecked, tsChecked);

type

  { TMessageTreeNode }

  TMessageTreeNode = class(TTreeNode)
  private
    FMessage: string;
  public
    property Message: string read FMessage write FMessage;
  end;

function FirstLine(const s: string): string;
var
  NewLinePos: integer;
begin
  NewLinePos := pos(LineEnding, s);
  if NewLinePos > 0 then
    Result := copy(s, 1, NewLinePos-1)
  else
    Result := s;
end;

{ TGUITestRunner }

procedure TGUITestRunner.actCopyExecute(Sender: TObject);
begin
  Clipboard.AsText := XMLSynEdit.Lines.Text;
end;


procedure TGUITestRunner.actCutExecute(Sender: TObject);
begin
  Clipboard.AsText := XMLSynEdit.Lines.Text;
  XMLSynEdit.Lines.Clear;
end;

function TGUITestRunner.MakeTestPath(Node: TTreeNode): string;
begin
  Result := '';
  while Node <> nil do
  begin
    Result := Node.Text + '_' + Result;
    Node := Node.Parent;
  end;
end;

procedure TGUITestRunner.SaveTree;
var
  i: integer;
begin
  for i := 0 to TestTree.Items.Count - 1 do
    FINI.WriteBool('Tests', MakeTestPath(TestTree.Items[i]), TestTree.Items[i].StateIndex = Ord(tsChecked));
end;

procedure TGUITestRunner.RestoreTree;
var
  i: integer;
begin
  for i := 0 to TestTree.Items.Count - 1 do
    if FINI.ReadBool('Tests', MakeTestPath(TestTree.Items[i]), true) then
      TestTree.Items[i].StateIndex := Ord(tsChecked)
    else
      TestTree.Items[i].StateIndex := Ord(tsUnChecked);
end;

procedure TGUITestRunner.GUITestRunnerCreate(Sender: TObject);
begin
  barColor := clGreen;
  TestTree.Items.Clear;
  BuildTree(TestTree.Items.AddObject(nil, rsAllTests, GetTestRegistry),
    GetTestRegistry);
  RestoreTree;
  PageControl1.ActivePage := tsTestTree;
  //
  BtnRun.Caption:= sbtnRun;
  btnRunHighlighted.Caption := sbtnRunH;
  BtnClose.Caption:= sbtnClose;
  tsTestTree.Caption:= stshTree;
  tsResultsXML.Caption:= stshResults;
  //
  Caption:= sfrmGUITest;
  RunAction.Caption:= sactRunAction;
  RunAction.Hint:= sactRunActionH;
  ActCloseForm.Caption:= sactCloseForm;
  ActCloseForm.Hint:= sactCloseFormH;
  ActCheckCurrentSuite.Caption:= sactCheckCurrentSuite;
  ActUncheckCurrentSuite.Caption:= sactUncheckCurrentSuite;
  ActCheckAll.Caption:= sactCheckAll;
  ActUncheckAll.Caption:= sactUncheckAll;
  ActRunHighlightedTest.Caption:= sactRunHighlightedTest;
  miRunTest.Caption:= smiRunTest;
  miShowfailureMsg.Caption:= smiShowfail;
  MenuItem1.Caption:= smiCopy;
  MenuItem2.Caption:= smiCut;
  MenuItem3.Caption:= smiCopyClipbrd;
  // Select the first entry in the tree in order to immediately activate the 
  // Run All tests button:
  if TestTree.Items.Count>0 then begin
    TestTree.Items.SelectOnlyThis(TestTree.Items[0]);
    TestTree.Items[0].Expand(False);
  end;

  FINI := TINIFile.Create(ExtractFileNameOnly(ParamStr(0)) + '.fpcunit.ini'); // Prevent ini file names conflict if tests are embedded in application
end;

procedure TGUITestRunner.RunExecute(Sender: TObject);
begin
  FFirstFailure := nil;
  testSuite := GetTestRegistry;
  TestTree.Selected := TestTree.Items[0];
  RunTest(testSuite);
end;

procedure TGUITestRunner.ActCloseFormExecute(Sender: TObject);
begin
  Close;
end;

procedure TGUITestRunner.ActCheckAllExecute(Sender: TObject);
var
  i: integer;
begin
  for i := 0 to TestTree.Items.Count -1 do
    TestTree.Items[i].StateIndex := ord(tsChecked);
end;

procedure TGUITestRunner.ActCheckCurrentSuiteExecute(Sender: TObject);
var
  i: integer;
begin
  if (TestTree.Selected <> nil) and (TestTree.Selected.Data <> nil) then
  begin
    TestTree.Selected.StateIndex := ord(tsChecked);
    for i := 0 to TestTree.Selected.Count - 1 do
      TestTree.Selected.Items[i].StateIndex := ord(tsChecked);
  end;
end;

procedure TGUITestRunner.ActRunHighlightedTestExecute(Sender: TObject);
begin
  FFirstFailure := nil;
  if (TestTree.Selected <> nil) and (TestTree.Selected.Data <> nil) then
  begin
    testSuite := TTest(TestTree.Selected.Data);
  end;
  RunTest(testSuite);
  TestTree.MakeSelectionVisible;
end;

procedure TGUITestRunner.ActUncheckAllExecute(Sender: TObject);
var
  i: integer;
begin
  for i := 0 to TestTree.Items.Count -1 do
    TestTree.Items[i].StateIndex := ord(tsUnChecked);
end;


procedure TGUITestRunner.ActRunHighLightedTestUpdate(Sender: TObject);
begin
  (Sender as TAction).Enabled := ((TestTree.Selected <> nil)
    and (TestTree.Selected.Data <> nil));
end;

procedure TGUITestRunner.ActUncheckCurrentSuiteExecute(Sender: TObject);
var
  i: integer;
begin
  if (TestTree.Selected <> nil) and (TestTree.Selected.Data <> nil) then
  begin
    TestTree.Selected.StateIndex := ord(tsUnchecked);
    for i := 0 to TestTree.Selected.Count - 1 do
      TestTree.Selected.Items[i].StateIndex := ord(tsUnChecked);
  end;
end;

procedure TGUITestRunner.FormDestroy(Sender: TObject);
begin
  // store window position and size
  FINI.WriteInteger('WindowState', 'Left', Left);
  FINI.WriteInteger('WindowState', 'Top', Top);
  FINI.WriteInteger('WindowState', 'Width', Width);
  FINI.WriteInteger('WindowState', 'Height', Height);
  FINI.Free;
end;

procedure TGUITestRunner.GUITestRunnerShow(Sender: TObject);
begin
  if (ParamStrUTF8(1) = '--now') or (ParamStrUTF8(1) = '-n') then
    RunExecute(Self);
  // restore last used position and size
  Left := FINI.ReadInteger('WindowState', 'Left', Left);
  Top := FINI.ReadInteger('WindowState', 'Top', Top);
  Width := FINI.ReadInteger('WindowState', 'Width', Width);
  Height := FINI.ReadInteger('WindowState', 'Height', Height);
end;

procedure TGUITestRunner.MenuItem3Click(Sender: TObject);
begin
  Clipboard.AsText := Memo1.Lines.Text;
end;

procedure TGUITestRunner.SaveAsToolButtonClick(Sender: TObject);
begin
  if SaveDialog.Execute then
    XMLSynEdit.Lines.SaveToFile(SaveDialog.FileName);
end;

procedure TGUITestRunner.TestTreeCreateNodeClass(Sender: TCustomTreeView;
  var NodeClass: TTreeNodeClass);
begin
  NodeClass := TMessageTreeNode;
end;

procedure TGUITestRunner.TestTreeMouseDown(Sender: TOBject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

  procedure ChangeCheck(aNode: TTreeNode; aCheck: TTreeNodeState);
  var
    i: integer;
    n: TTreeNode;
  begin
    if Assigned(aNode) then
    begin
      aNode.StateIndex := ord(aCheck);
      if (TTest(aNode.Data) is TTestSuite) then
        for i := 0 to aNode.Count - 1 do
        begin
          n := aNode.Items[i];
          ChangeCheck(n, aCheck);
        end;
    end;
  end;

var
  ht: THitTests;
  lNode: TTreeNode;
begin
  ht := (Sender as TTreeview).GetHitTestInfoAt(X, Y);
  if htOnStateIcon in ht then
  begin
    lNode := (Sender as TTreeview).GetNodeAt(X, Y);
    case lNode.StateIndex of
        0: ChangeCheck(lNode, tsChecked);
        1: ChangeCheck(lNode, tsUnChecked);
      end;
   end;
end;


procedure TGUITestRunner.TestTreeSelectionChanged(Sender: TObject);
begin
  if ((Sender as TTreeView).Selected <> nil) and
    Assigned((Sender as TTreeview).Selected.Data)  then
  begin
    btnRunHighlighted.Visible := true;
    btnRunHighlighted.Caption := rsRun + (Sender as TTreeview).Selected.Text;
  end
  else
    begin
      btnRunHighlighted.Visible := false;
      btnRunHighlighted.Caption := '';
    end;
end;


procedure TGUITestRunner.actCopyErrorMsgExecute(Sender: TObject);
begin
  ClipBoard.AsText := (TestTree.Selected as TMessageTreeNode).Message;
end;


procedure TGUITestRunner.actCopyErrorMsgUpdate(Sender: TObject);
begin
  (Sender as TAction).Enabled := Assigned(TestTree.selected) and
    (Copy(TestTree.Selected.Text, 1, 9) = 'Message: ');
end;


procedure TGUITestRunner.pbBarPaint(Sender: TObject);
var
  msg: string;
  alltests: integer;
  OldStyle: TBrushStyle;
begin
  with (Sender as TPaintBox) do
  begin
    Canvas.Lock;
    Canvas.Brush.Color := clSilver;
    Canvas.Rectangle(0, 0, Width, Height);
    Canvas.Font.Color := clWhite;
    if Assigned(TestSuite) then
    begin
      alltests := TestSuite.CountTestCases;
      if alltests - skipsCounter <> 0 then
      begin
        if FailureCounter + ErrorCounter = 0 then
          barColor := clGreen;
        Canvas.Brush.Color := barColor;
        Canvas.Rectangle(0, 0, round(TestsCounter / (alltests - skipsCounter) * Width), Height);
        msg := Format(rsRuns, [IntToStr(TestsCounter), IntToStr(alltests -
          skipsCounter)]);
        msg := Format(rsErrors, [msg, IntToStr(ErrorCounter)]);
        msg := Format(rsFailures, [msg, IntToStr(FailureCounter)]);
        OldStyle := Canvas.Brush.Style;
        Canvas.Brush.Style := bsClear;
        Canvas.Textout(10, 10,  msg);
        Canvas.Brush.Style := OldStyle;
      end;
    end;
    Canvas.UnLock;
  end;
end;


procedure TGUITestRunner.BuildTree(rootNode: TTreeNode; aSuite: TTestSuite);
var
  node: TTreeNode;
  i: integer;
begin
  rootNode.StateIndex := Ord(tsChecked);
  for i := 0 to ASuite.Tests.Count - 1 do
  begin
    node := TestTree.Items.AddChildObject(rootNode, ASuite.Test[i].TestName, ASuite.Test[i]);
    if ASuite.Test[i] is TTestSuite then
      BuildTree(Node, TTestSuite(ASuite.Test[i]))
    else
      if TObject(ASuite.Test[i]).InheritsFrom(TTestDecorator) then
        BuildTree(Node, TTestSuite(TTestDecorator(ASuite.Test[i]).Test));
    node.ImageIndex := imgGrayBall;
    node.SelectedIndex := imgGrayBall;
    node.StateIndex := ord(tsChecked);
  end;
  ResetNodeColors;
end;


function TGUITestRunner.FindNode(aTest: TTest): TTreeNode;
var
  i: integer;
begin
  Result := nil;
  for i := 0 to TestTree.Items.Count -1 do
    if (TTest(TestTree.Items[i].data) = aTest) then
    begin
      Result :=  TestTree.Items[i];
      Exit;
    end;
end;


procedure TGUITestRunner.ResetNodeColors;
var
  i: integer;
begin
  for i := 0 to TestTree.Items.Count - 1 do
  begin
    TestTree.Items[i].ImageIndex := imgGrayBall;
    TestTree.Items[i].SelectedIndex := imgGrayBall;
  end;
end;


procedure TGUITestRunner.PaintNodeError(aNode: TTreeNode);
begin
  while Assigned(aNode) do
  begin
    aNode.ImageIndex := imgRedBall;
    aNode.SelectedIndex := imgRedBall;
    if aNode.AbsoluteIndex<>0 then begin
      aNode.Expand(True);
    end;
    aNode := aNode.Parent;
    if Assigned(aNode) and
      ((aNode.ImageIndex in [imgGreenBall, imgPurpleBall, imgGrayBall, imgBlueBall]) or
      (ANode.ImageIndex = -1)) then
      PaintNodeError(aNode);
  end;
end;


procedure TGUITestRunner.PaintNodeFailure(aNode: TTreeNode);
begin
  while Assigned(aNode) do
  begin
    if ((aNode.ImageIndex in [imgGreenBall, imgGrayBall, imgBlueBall]) or
      (ANode.ImageIndex = -1)) then
    begin
      aNode.ImageIndex := imgPurpleBall;
      aNode.SelectedIndex := imgPurpleBall;
      if aNode.AbsoluteIndex<>0 then begin
        aNode.Expand(true);
      end;
    end;
    aNode := aNode.Parent;
    if Assigned(aNode) and ((aNode.ImageIndex in [imgGreenBall, imgGrayBall, imgBlueBall]) or
      (ANode.ImageIndex = -1)) then
      PaintNodeFailure(aNode);
  end;
end;

procedure TGUITestRunner.PaintNodeIgnore(aNode: TTreeNode);
// Test results with Ignore
var
  noFailedSibling: boolean;
  i: integer;
begin
  if Assigned(aNode) then
  begin
    if ((aNode.ImageIndex in [imgGrayBall, imgBlueBall]) or
      (ANode.ImageIndex = -1)) then
    begin
      aNode.ImageIndex := imgGreenBall;
      aNode.SelectedIndex := imgGreenBall;
    end;
  end;
  if Assigned(aNode.Parent) then
    if aNode.Index = aNode.Parent.Count -1 then
    begin
    aNode := aNode.Parent;
    noFailedSibling := true;
    for i := 0 to aNode.Count -2 do
    begin
      if aNode.Items[i].ImageIndex <> imgGreenBall then
        noFailedSibling := false;;
    end;
    if (aNode.ImageIndex = imgBlueBall) and
      noFailedSibling then
      PaintNodeIgnore(aNode);
    end;
end;


procedure TGUITestRunner.PaintNodeNonFailed(aNode: TTreeNode);
var
  noFailedSibling: boolean;
  i: integer;
begin
  if Assigned(aNode) then
  begin
    if ((aNode.ImageIndex in [imgGrayBall, imgBlueBall]) or
      (ANode.ImageIndex = -1)) then
    begin
      aNode.ImageIndex := imgGreenBall;
      aNode.SelectedIndex := imgGreenBall;
    end;
  end;
  if Assigned(aNode.Parent) then
    if aNode.Index = aNode.Parent.Count -1 then
    begin
    aNode := aNode.Parent;
    noFailedSibling := true;
    for i := 0 to aNode.Count -2 do
    begin
      if aNode.Items[i].ImageIndex <> imgGreenBall then
        noFailedSibling := false;;
    end;
    if (aNode.ImageIndex = imgBlueBall) and
      noFailedSibling then
      PaintNodeNonFailed(aNode);
    end;
end;


procedure TGUITestRunner.PaintNodeBusy(aNode: TTreeNode);
var
  BusySibling: boolean;
  i: integer;
begin
  if Assigned(aNode) then
  begin
    aNode.ImageIndex := imgBlueBall;
    aNode.SelectedIndex := imgBlueBall;
  end;
  if Assigned(aNode.Parent) then
  begin
    if aNode.Index = aNode.Parent.Count -1 then
    begin
      aNode := aNode.Parent;
      BusySibling := true;
      for i := 0 to aNode.Count -2 do
      begin
        if aNode.Items[i].ImageIndex <> imgGreenBall then
          BusySibling := false;;
      end;
      if (aNode.ImageIndex = imgBlueBall) and
        BusySibling then
        PaintNodeBusy(aNode);
    end;
  end;
end;


procedure TGUITestRunner.MemoLog(LogEntry: string);
begin
  Memo1.Lines.Add(TimeToStr(Now) + ' - ' + LogEntry);
end;

procedure TGUITestRunner.EnableRunActions(AValue: boolean);
begin
  ActRunHighlightedTest.Enabled := AValue;
  RunAction.Enabled := AValue;
end;

procedure TGUITestRunner.AddFailure(ATest: TTest; AFailure: TTestFailure);
var
  FailureNode: TTreeNode;
  node: TMessageTreeNode;
begin
  FailureNode := FindNode(ATest);
  if Assigned(FailureNode) then
  begin
    node := TestTree.Items.AddChild(FailureNode,
      Format(rsMessage, [FirstLine(AFailure.ExceptionMessage)]))
      as TMessageTreeNode;
    if not(AFailure.IsIgnoredTest) then
    begin
      // Genuine failure
      if not Assigned(FFirstFailure) then
        FFirstFailure := FailureNode;
      node.Message := AFailure.ExceptionMessage;
      node.ImageIndex := imgWarningSign;
      node.SelectedIndex := imgWarningSign;
      node := TestTree.Items.AddChild(FailureNode,
        Format(rsException, [AFailure.ExceptionClassName])) as TMessageTreeNode;
      node.ImageIndex := imgWarningSign;
      node.SelectedIndex := imgWarningSign;
      node := TestTree.Items.AddChild(FailureNode,
        Format('at line %d in <%s>', [AFailure.LineNumber, AFailure.UnitName])) as TMessageTreeNode;
      node.ImageIndex := imgWarningSign;
      node.SelectedIndex := imgWarningSign;
      PaintNodeFailure(FailureNode);
    end
    else
    begin
      // Although reported as a failure, the test was set up
      // to be ignored so it is actually a success of sorts
      node.Message := AFailure.ExceptionMessage;
      node.ImageIndex := imgGreenBall;
      node.SelectedIndex := imgGreenBall;
      node := TestTree.Items.AddChild(FailureNode,
        Format(rsException, [AFailure.ExceptionClassName])) as TMessageTreeNode;
      node.ImageIndex := imgGreenBall;
      node.SelectedIndex := imgGreenBall;
      PaintNodeIgnore(FailureNode);
    end;
  end;

  if not(AFailure.IsIgnoredTest) then
  begin
    Inc(failureCounter);
    if errorCounter = 0 then
      barColor := clFuchsia;
  end;
end;


procedure TGUITestRunner.AddError(ATest: TTest; AError: TTestFailure);
var
  ErrorNode, node: TTreeNode;
  MessageNode: TMessageTreeNode;
begin
  ErrorNode := FindNode(ATest);
  if Assigned(ErrorNode) then
  begin
    if not Assigned(FFirstFailure) then
      FFirstFailure := ErrorNode;
    MessageNode := TestTree.Items.AddChild(ErrorNode,
      Format(rsExceptionMes, [FirstLine(AError.ExceptionMessage)]))
      as TMessageTreeNode;
    MessageNode.Message := AError.ExceptionMessage;
    MessageNode.ImageIndex := imgWarningSign;
    MessageNode.SelectedIndex := imgWarningSign;
    node := TestTree.Items.AddChild(ErrorNode, Format(rsExceptionCla, [
      AError.ExceptionClassName]));
    node.ImageIndex := imgWarningSign;
    node.SelectedIndex := imgWarningSign;
    if (AError.SourceUnitName <> '') and
      (AError.FailedMethodName <> '')
    then
    begin
      node := TestTree.Items.AddChild(ErrorNode, Format(rsUnitName, [
        AError.SourceUnitName]));
      node.ImageIndex := imgInfoSign;
      node.SelectedIndex := imgInfoSign;
      node := TestTree.Items.AddChild(ErrorNode, Format(rsMethodName, [
        AError.FailedMethodName]));
      node.ImageIndex := imgInfoSign;
      node.SelectedIndex := imgInfoSign;
      node := TestTree.Items.AddChild(ErrorNode, Format(rsLineNumber, [IntToStr(
        AError.LineNumber)]));
      node.ImageIndex := imgInfoSign;
      node.SelectedIndex := imgInfoSign;
    end;
    PaintNodeError(ErrorNode);
  end;
  Inc(errorCounter);
  barColor := clRed;
end;


procedure TGUITestRunner.StartTest(ATest: TTest);
var
  Node: TTreeNode;
begin
  TestTree.BeginUpdate;
  Node := FindNode(ATest);
  Node.DeleteChildren;
  PaintNodeBusy(Node);
  if Node.Level=1 then begin
    Node.MakeVisible;
  end;
  if assigned(Node.Parent) and (Node.Parent.Level=1) then begin
    Node.Parent.MakeVisible;
  end;
  Application.ProcessMessages;
  TestTree.EndUpdate;
end;


procedure TGUITestRunner.EndTest(ATest: TTest);
var
  Node: TTreeNode;
begin
  TestTree.BeginUpdate;
  Inc(testsCounter);
  Node := FindNode(ATest);
  PaintNodeNonFailed(Node);
  pbbar.Refresh;
  Application.ProcessMessages;
  TestTree.EndUpdate;
end;

procedure TGUITestRunner.RunTest(ATest: TTest);
  procedure SkipUncheckedTests(aResult: TTestResult; aNode: TTreeNode);
  var
    i: integer;
  begin
    if (aNode.StateIndex = ord(tsUnChecked)) and (TTest(aNode.Data) is TTestCase) then
      aResult.AddToSkipList(TTest(aNode.Data) as TTestCase);
    for i := 0 to aNode.Count - 1 do
      SkipUncheckedTests(aResult, aNode.Items[i]);
  end;

var
  TestResult:TTestResult;
  w: TXMLResultsWriter;
  m: TMemoryStream;

begin
  SaveTree;
  barcolor := clGreen;
  ResetNodeColors;
  failureCounter := 0;
  errorCounter := 0;
  testsCounter := 0;
  skipsCounter := 0;
  EnableRunActions(false);
  TestResult := TTestResult.Create;
  try
    SkipUncheckedTests(TestResult, TestTree.Selected);
    skipsCounter := TestResult.NumberOfSkippedTests;
    TestResult.AddListener(self);
    pbBar.Invalidate;
    w := TXMLResultsWriter.Create(nil);
    try
      w.FileName := 'null'; // prevents output to the console
      TestResult.AddListener(w);

      MemoLog(Format(rsRunning, [TestTree.Selected.Text]));
      aTest.Run(TestResult);
      MemoLog(Format(rsNumberOfExec, [IntToStr(TestResult.RunTests),
        FormatDateTime('hh:nn:ss.zzz', Now - TestResult.StartingTime)]));

      w.WriteResult(TestResult);
      m := TMemoryStream.Create;
      try
        try
          WriteXMLFile(w.Document, m);
          m.Position := 0;
          XMLSynEdit.Lines.LoadFromStream(m);
        except
          on E: Exception do
            XMLSynEdit.Lines.Text:='WriteXMLFile exception: '+E.ClassName+'/'+E.Message;
        end;
      finally
        m.Free;
      end;
      pbBar.Invalidate;
    finally
      w.Free;
    end;
   finally
    EnableRunActions(true);

    TestResult.Free;
  end;
end;

procedure TGUITestRunner.StartTestSuite(ATestSuite: TTestSuite);
begin
  // do nothing
end;

procedure TGUITestRunner.EndTestSuite(ATestSuite: TTestSuite);
begin
  // scroll treeview to first failed test
  if Assigned(FFirstFailure) then
  begin
    TestTree.Selected := FFirstFailure;
    TestTree.MakeSelectionVisible;
  end;
end;

procedure TranslateResStrings;
var
  Lang, FallbackLang, S: String;

begin
  GetLanguageIDs(Lang,FallbackLang); // in unit gettext
  S:=AppendPathDelim(AppendPathDelim(ExtractFileDir(ParamStr(0))) + 'languages');
  if FallbackLang = 'pt' then
     Lang := 'pb';
  TranslateUnitResourceStrings('guitestrunner',S+'guitestrunner.%s.po', Lang,FallbackLang);
end;

initialization
  TranslateResStrings;

end.

guitestrunner.pas (26,511 bytes)   

Serguei Tarassov

2015-04-07 15:29

reporter  

guitestrunner.lfm (109,656 bytes)   
object GUITestRunner: TGUITestRunner
  Left = 312
  Height = 590
  Top = 123
  Width = 575
  Caption = 'FPCUnit - run unit tests'
  ClientHeight = 590
  ClientWidth = 575
  Constraints.MinHeight = 200
  Constraints.MinWidth = 250
  Icon.Data = {
    F6030000000001000100100E000001002000E003000016000000280000001000
    00001C0000000100200000000000800300006400000064000000000000000000
    0000000000FF000000FF00000000000000000000000000000000000000000000
    0000000000FF000000FF00000000000000000000000000000000000000000000
    0000780EBAFFA509F9FF000000FF000000000000000000000000000000000000
    0000006614FF195927FF000000FF000000000000000000000000000000000000
    0000780EBAFFCA72F9FFA509F9FF000000FF0000000000000000000000000000
    0000006614FF00B226FF195927FF000000FF0000000000000000000000000000
    0000780EBAFFCA72F9FFCA72F9FFA509F9FF000000FF00000000000000000000
    0000006614FF00B226FF00B226FF195927FF000000FF00000000000000000000
    0000780EBAFFCA72F9FFCA72F9FFCA72F9FFA509F9FF000000FF000000000000
    0000006614FF00B226FF00B226FF00B226FF195927FF000000FF000000000000
    0000780EBAFFCA72F9FFCA72F9FFCA72F9FFCA72F9FFA509F9FF000000FF0000
    0000006614FF00B226FF00B226FF00B226FF00B226FF195927FF000000FF0000
    0000780EBAFFCA72F9FFCA72F9FFCA72F9FFCA72F9FFCA72F9FFA509F9FF0000
    00FF006614FF00B226FF00B226FF00B226FF00B226FF00B226FF006614FF0066
    14FF780EBAFFCA72F9FFCA72F9FFCA72F9FFCA72F9FFCA72F9FFCA72F9FF780E
    BAFF006614FF00B226FF00B226FF00B226FF00B226FF00B226FF006614FF0000
    0000780EBAFFCA72F9FFCA72F9FFCA72F9FFCA72F9FFCA72F9FF780EBAFF0000
    0000006614FF00B226FF00B226FF00B226FF00B226FF006614FF000000000000
    0000780EBAFFCA72F9FFCA72F9FFCA72F9FFCA72F9FF780EBAFF000000000000
    0000006614FF00B226FF00B226FF00B226FF006614FF00000000000000000000
    0000780EBAFFCA72F9FFCA72F9FFCA72F9FF780EBAFF00000000000000000000
    0000006614FF00B226FF00B226FF006614FF0000000000000000000000000000
    0000780EBAFFCA72F9FFCA72F9FF780EBAFF0000000000000000000000000000
    0000006614FF00B226FF006614FF000000000000000000000000000000000000
    0000780EBAFFCA72F9FF780EBAFF000000000000000000000000000000000000
    0000006614FF006614FF00000000000000000000000000000000000000000000
    0000780EBAFF780EBAFF00000000000000000000000000000000000000000000
    0000006614FF0000000000000000000000000000000000000000000000000000
    00000000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000
    FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF
  }
  OnCreate = GUITestRunnerCreate
  OnDestroy = FormDestroy
  OnShow = GUITestRunnerShow
  Position = poScreenCenter
  ShowHint = True
  LCLVersion = '1.5'
  object Panel1: TPanel
    Left = 0
    Height = 88
    Top = 0
    Width = 575
    Align = alTop
    BevelInner = bvRaised
    BevelOuter = bvNone
    ClientHeight = 88
    ClientWidth = 575
    Constraints.MinHeight = 50
    Constraints.MinWidth = 450
    FullRepaint = False
    ParentColor = False
    TabOrder = 0
    TabStop = True
    object pbBar: TPaintBox
      AnchorSideLeft.Control = Panel1
      AnchorSideTop.Control = BtnRun
      AnchorSideTop.Side = asrBottom
      AnchorSideRight.Control = Panel1
      AnchorSideRight.Side = asrBottom
      Left = 7
      Height = 30
      Top = 49
      Width = 561
      Anchors = [akTop, akLeft, akRight]
      BorderSpacing.Around = 6
      OnPaint = pbBarPaint
    end
    object BtnRun: TBitBtn
      AnchorSideLeft.Control = Panel1
      AnchorSideTop.Control = Panel1
      Left = 7
      Height = 36
      Top = 7
      Width = 71
      Action = RunAction
      AutoSize = True
      BorderSpacing.Around = 6
      Constraints.MaxHeight = 38
      Glyph.Data = {
        36090000424D3609000000000000360000002800000018000000180000000100
        2000000000000009000064000000640000000000000000000000000000000000
        0000000000000000000000000000000000000000000000000000000000000000
        0000000000000000000000000000000000000000000000000000000000000000
        0000000000000000000000000000000000000000000000000000000000000000
        0000000000000000000000000000000000000000000000000000000000000000
        0000000000000000000000000000000000000000000000000000000000000000
        0000000000000000000000000000000000000000000000000000000000000000
        0000000000000000000000000000000000000000000000000000000000000000
        0000000000000000000000000000000000000000000000000000000000000000
        0000000000000000000000000000000000000000000000000000000000000000
        0000000000000000000000000000000000000000000000000000000000000000
        0000000000000000000000000000000000000000000000000000000000000000
        0000000000000000000000000000000000000000000000000000000000000000
        00000000000000000000FFFFFFFF000000000000000000000000000000000000
        0000000000000000000000000000FFFFFFFF0000000000000000000000000000
        0000000000000000000000000000000000000000000000000000000000000000
        00000000000000000000000000FFFFFFFFFF0000000000000000000000000000
        0000000000000000000000000000000000FFFFFFFFFF00000000000000000000
        0000000000000000000000000000000000000000000000000000000000000000
        00000000000000000000000000FF000000FFFFFFFFFF00000000000000000000
        0000000000000000000000000000000000FF000000FFFFFFFFFF000000000000
        0000000000000000000000000000000000000000000000000000000000000000
        00000000000000000000000000FFA7A7A7FF000000FFFFFFFFFF000000000000
        0000000000000000000000000000000000FFA7A7A7FF000000FFFFFFFFFF0000
        0000000000000000000000000000000000000000000000000000000000000000
        00000000000000000000000000FF9D9FA5FFC6C6C7FF000000FFFFFFFFFF0000
        0000000000000000000000000000000000FF9D9FA5FFC6C6C7FF000000FFFFFF
        FFFF000000000000000000000000000000000000000000000000000000000000
        00000000000000000000000000FF9E9C9DFFB5B7BDFFD7D7DEFF000000FFFFFF
        FFFF000000000000000000000000000000FF9E9C9DFFB5B7BDFFD7D7DEFF0000
        00FFFFFFFFFF0000000000000000000000000000000000000000000000000000
        00000000000000000000000000FF8C8E8FFFB5B7B5FFC7C6C7FFCED7D6FF0000
        00FFFFFFFFFF0000000000000000000000FF8C8E8FFFB5B7B5FFC7C6C7FFCED7
        D6FF000000FFFFFFFFFF00000000000000000000000000000000000000000000
        00000000000000000000000000FF8D8F8CFFA5ADADFFBDBDBDFFC6C7C7FFCECE
        D6FF000000FFFFFFFFFF00000000000000FF8D8F8CFFA5ADADFFBDBDBDFFC6C7
        C7FFCECED6FF000000FFFFFFFFFF000000000000000000000000000000000000
        00000000000000000000000000FF868C8DFFA5A5A5FFB5B7BDFFB7BDBFFFB7BF
        BDFFBFC6C7FF000000FF737373FF000000FF868C8DFFA5A5A5FFB5B7BDFFB7BD
        BFFFB7BFBDFFBFC6C7FF000000FFC6C6C6FF0000000000000000000000000000
        00000000000000000000000000FF878586FF9EA5A5FFB5B7B5FFB7B5B7FFA5A5
        A5FF000000FF0000000000000000000000FF878586FF9EA5A5FFB5B7B5FFB7B5
        B7FFA5A5A5FF000000FF00000000000000000000000000000000000000000000
        00000000000000000000000000FF848586FF9E9C9DFFADAFB5FF8D8F94FF0000
        00FF000000000000000000000000000000FF848586FF9E9C9DFFADAFB5FF8D8F
        94FF000000FF0000000000000000000000000000000000000000000000000000
        00000000000000000000000000FF7F7F7FFF969D9DFF7B7F7FFF000000FF0000
        0000000000000000000000000000000000FF7F7F7FFF969D9DFF7B7F7FFF0000
        00FF000000000000000000000000000000000000000000000000000000000000
        00000000000000000000000000FF7B7B7BFF6B6B6FFF000000FF000000000000
        0000000000000000000000000000000000FF7B7B7BFF6B6B6FFF000000FF0000
        0000000000000000000000000000000000000000000000000000000000000000
        00000000000000000000000000FF737373FF000000FF00000000000000000000
        0000000000000000000000000000000000FF737373FF000000FF000000000000
        0000000000000000000000000000000000000000000000000000000000000000
        00000000000000000000000000FF000000FF0000000000000000000000000000
        0000000000000000000000000000000000FF000000FF00000000000000000000
        0000000000000000000000000000000000000000000000000000000000000000
        00000000000000000000000000FF000000000000000000000000000000000000
        0000000000000000000000000000000000FF0000000000000000000000000000
        0000000000000000000000000000000000000000000000000000000000000000
        0000000000000000000000000000000000000000000000000000000000000000
        0000000000000000000000000000000000000000000000000000000000000000
        0000000000000000000000000000000000000000000000000000000000000000
        0000000000000000000000000000000000000000000000000000000000000000
        0000000000000000000000000000000000000000000000000000000000000000
        0000000000000000000000000000000000000000000000000000000000000000
        0000000000000000000000000000000000000000000000000000000000000000
        0000000000000000000000000000000000000000000000000000000000000000
        0000000000000000000000000000000000000000000000000000000000000000
        0000000000000000000000000000000000000000000000000000000000000000
        0000000000000000000000000000000000000000000000000000000000000000
        0000000000000000000000000000000000000000000000000000
      }
      ParentShowHint = False
      ShowHint = True
      TabOrder = 0
    end
    object BtnClose: TBitBtn
      AnchorSideTop.Control = Panel1
      AnchorSideRight.Control = Panel1
      AnchorSideRight.Side = asrBottom
      Left = 491
      Height = 36
      Top = 7
      Width = 77
      Action = ActCloseForm
      Anchors = [akTop, akRight]
      AutoSize = True
      BorderSpacing.Around = 6
      Caption = '&Close'
      Constraints.MaxHeight = 38
      Glyph.Data = {
        36090000424D3609000000000000360000002800000018000000180000000100
        2000000000000009000064000000640000000000000000000000000000000000
        0000000000000000000000000000000000000000000000000000000000000000
        0000000000000000000000000000000000000000000000000000000000000000
        0000000000000000000000000000000000000000000000000000000000000000
        00000000000000000000000000000000000000000000000000FF000000FF0000
        00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
        00FF000000FF000000FF000000FF000000FF000000FF00000000000000000000
        00000000000000000000000000000000000000000000000000FF8F9691FF3647
        3BFF3C5442FF445E4AFF4A6751FF506F58FF53735BFF54745CFF54745CFF5474
        5CFF54745CFF54745CFF54745CFF54745CFF000000FF00000000000000000000
        00000000000000000000000000000000000000000000000000FFD8DADAFFBDBF
        BFFF787D7AFF303C33FF324537FF3A5040FF415A47FF48634FFF4C6953FF4E6C
        56FF4E6C56FF4F6D57FF4F6D57FF4F6D57FF000000FF00000000000000000000
        00000000000000000000000000000000000000000000000000FFEEF0F0FFE3E5
        E5FFC3C6C6FFABACACFF8A8B8BFF2F3932FF28372CFF324537FF3A503FFF4058
        46FF445E4BFF47634EFF496550FF496550FF000000FF00000000000000000000
        0000000000000000000000000000000000FF00000000000000FFEFF1F1FFE4E6
        E6FFD8DBDBFFCED0D0FFB7BABAFF9B9D9DFF767777FF303832FF1F2C23FF2D3E
        31FF364A3BFF3D5543FF425B48FF445E4AFF000000FF00000000000000000000
        0000000000000000000000000000000000FF000000FF000000FFEFF1F1FFE4E6
        E6FFD8DBDBFFCED0D0FFC2C5C5FFB7B9B9FFACAEAEFF9B9D9DFF555656FF1E2A
        21FF28382CFF324537FF3A5040FF3E5543FF000000FF00000000000000000000
        0000000000000000000000000000000000FF000050FF000000FFCBCDCDFFE4E6
        E6FFD8DBDBFFCED0D0FFC2C5C5FFB7B9B9FFB7B9B9FFB7B9B9FF626363FF1923
        1BFF223025FF2D3E30FF344939FF384E3DFF000000FF00000000000000FF0000
        00FF000000FF000000FF000000FF000000FF000072FF000058FF000000FFC3C5
        C5FFD8DBDBFFCED0D0FFC2C5C5FFB7B9B9FFB7B9B9FFB7B9B9FF626363FF1C26
        1EFF243227FF2C3D30FF324537FF344839FF000000FF00000000000000FF4343
        7CFF00006AFF00006AFF00006AFF00006AFF000072FF000099FF000058FF0000
        00FFBBBDBDFFCED0D0FFC2C5C5FFB7B9B9FFB7B9B9FFB7B9B9FF626363FF202C
        23FF26352AFF2B3C30FF2E4033FF2E4033FF000000FF00000000000000FF8484
        CDFF000099FF000099FF000099FF000099FF000099FF000099FF000099FF0000
        58FF000000FFB3B5B5FFC2C5C5FFB7B9B9FFB7B9B9FFB7B9B9FF626363FF1F2B
        22FF263429FF29392DFF2A3A2EFF2A3A2EFF000000FF00000000000000FF8484
        CDFF000099FF000099FF000099FF000099FF000099FF000099FF000099FF0000
        99FF00004FFF000000FFABAEAEFFB7B9B9FFB7B9B9FFB7B9B9FF626363FF1B26
        1DFF212E24FF243227FF253328FF253328FF000000FF00000000000000FF8484
        CDFF000099FF000099FF000099FF000099FF000099FF000099FF000099FF0000
        99FF000099FF161670FF000000FFA5A6A6FF0C0C0CFFB7B9B9FF626363FF161E
        18FF1B261EFF1E2A21FF1F2B22FF1F2B22FF000000FF00000000000000FF92A3
        EFFF1E42DFFF1E42DFFF1E42DFFF1E42DFFF1E42DFFF1E42DFFF1E42DFFF1E42
        DFFF5670E6FF000000FFB4B7B7FFB7B9B9FF5C5D5DFF0C0C0CFF626363FF1219
        14FF172019FF19231CFF1A241DFF1A241DFF000000FF00000000000000FF92A3
        EFFF1E42DFFF1E42DFFF1E42DFFF1E42DFFF1E42DFFF1E42DFFF1E42DFFF5670
        E6FF000000FFBDBFBFFFC2C5C5FFB7B9B9FF5C5D5DFFB7B9B9FF626363FF0F15
        10FF121914FF141C16FF151D17FF151D17FF000000FF00000000000000FFA1B0
        F0FF627BE8FF627BE8FF627BE8FF627BE8FF778DEBFF1E42DFFF667EE9FF0000
        00FFC8CBCBFFCED0D0FFC2C5C5FFB7B9B9FFB7B9B9FFB7B9B9FF626363FF0B0F
        0CFF0D130FFF0E1410FF0F1511FF0F1511FF000000FF00000000000000FF0000
        00FF000000FF000000FF000000FF000000FF627BE8FF5670E6FF000000FFD3D5
        D5FFD8DBDBFFCED0D0FFC2C5C5FFB7B9B9FFB7B9B9FFB7B9B9FF626363FF070A
        08FF090C0AFF090D0AFF0A0E0BFF0A0E0BFF000000FF00000000000000000000
        0000000000000000000000000000000000FF6C83E9FF000000FFDCDEDEFFE4E6
        E6FFD7DADAFFCDCFCFFFC2C5C5FFB7B9B9FFB7B9B9FFB7B9B9FF626363FF0405
        04FF040604FF050705FF050705FF050705FF000000FF00000000000000000000
        0000000000000000000000000000000000FF000000FF000000FFEFF1F1FFE4E6
        E6FFD7DADAFFCDCFCFFFC1C4C4FFB7B9B9FFB7B9B9FFB7B9B9FF404141FF0000
        00FF000000FF000000FF000000FF000000FF000000FF00000000000000000000
        0000000000000000000000000000000000FF00000000000000FFEFF1F1FFE4E6
        E6FFD7DADAFFCDCFCFFFC1C4C4FFB7B9B9FFACAEAEFF8D8F8FFF262626FF0000
        00FF000000FF000000FF000000FF000000FF000000FF00000000000000000000
        00000000000000000000000000000000000000000000000000FFEFF1F1FFE4E6
        E6FFD7DADAFFCDCFCFFFC1C4C4FFA5A8A8FF747676FF747777FF1D1E1EFF0000
        00FF000000FF000000FF000000FF000000FF000000FF00000000000000000000
        00000000000000000000000000000000000000000000000000FFD4D6D6FFBCBD
        BDFFA4A8A8FF8F9292FF707372FF5E6161FF5E6161FF5E6161FF1F2020FF0000
        00FF000000FF000000FF000000FF000000FF000000FF00000000000000000000
        00000000000000000000000000000000000000000000000000FF000000FF0000
        00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
        00FF000000FF000000FF000000FF000000FF000000FF00000000000000000000
        0000000000000000000000000000000000000000000000000000000000000000
        0000000000000000000000000000000000000000000000000000000000000000
        0000000000000000000000000000000000000000000000000000
      }
      ParentShowHint = False
      ShowHint = True
      TabOrder = 1
    end
    object btnRunHighlighted: TBitBtn
      AnchorSideLeft.Control = BtnRun
      AnchorSideLeft.Side = asrBottom
      AnchorSideTop.Control = Panel1
      Left = 84
      Height = 34
      Top = 7
      Width = 169
      Action = ActRunHighlightedTest
      AutoSize = True
      BorderSpacing.Around = 6
      Constraints.MaxHeight = 38
      Constraints.MaxWidth = 390
      Glyph.Data = {
        C6070000424DC607000000000000360000002800000016000000160000000100
        2000000000009007000064000000640000000000000000000000000000000000
        0000000000000000000000000000000000000000000000000000000000000000
        0000000000000000000000000000000000000000000000000000000000000000
        0000000000000000000000000000000000000000000000000000000000000000
        0000000000000000000000000000000000000000000000000000000000000000
        0000000000000000000000000000000000000000000000000000000000000000
        00000000000000000000000000000000000000000000000000005E6363FF6367
        67FF000000000000000000000000000000000000000000000000000000000000
        0000000000000000000000000000000000000000000000000000000000000000
        000000000000000000000000000000000000565B5BFFBDC6BFFF5F635EFF0000
        0000000000000000000000000000000000000000000000000000000000000000
        0000000000000000000000000000000000000000000000000000000000000000
        00000000000000000000575B5BFFFFFFFFFFF7F7F7FF9FA5A5FF5F635EFF0000
        0000000000000000000000000000000000000000000000000000000000000000
        0000000000000000000000000000000000000000000000000000000000000000
        0000575B5BFFFFFFFFFFEFF7F7FFFFFFFFFFEFEFEFFF7B7F7FFF636763FF0000
        0000000000000000000000000000000000000000000000000000000000000000
        0000000000000000000000000000000000000000000000000000575B5BFFFFFF
        FFFFEFEFEFFFEFF7F7FFFFFFFFFFFFFFFFFFDEDFDEFF636767FF676B67FF0000
        0000000000000000000000000000000000000000000000000000000000000000
        000000000000000000000000000000000000575B5BFFFFFFFFFFEFF7F7FFF7F7
        F7FFF7F7F7FFFFFFFFFFFFFFFFFFFFFFFFFFBFBFBFFF5B5E5EFF000000000000
        0000000000000000000000000000000000000000000000000000000000000000
        00000000000000000000575B5BFFFFFFFFFFEFF7EFFFEFF7F7FFF7F7F7FFF7F7
        F7FFF7F7F7FFF7FFF7FFFFFFFFFFF7F7F7FF949796FF5E635FFF000000000000
        0000000000000000000000000000000000000000000000000000000000000000
        0000565B5BFFFFFFFFFFEFEFEFFFEFEFEFFFEFEFEFFFEFF7EFFFEFF7EFFFEFF7
        EFFFEFF7EFFFF7F7F7FFFFFFFFFFE7E7E7FF6F736FFF5F635FFF000000000000
        0000000000000000000000000000000000000000000000000000565B5AFFFFFF
        FFFFE7EFEFFFEFEFEFFFEFEFEFFFEFEFEFFFE7EFEFFFE7EFEFFFE7EFEFFFE7EF
        E7FFE7EFE7FFF7F7F7FFFFFFFFFFBFC6C6FF575A5AFF00000000000000000000
        000000000000000000000000000000000000565A5AFFFFFFFFFFEFF7EFFFEFF7
        EFFFEFF7EFFFEFF7EFFFEFF7EFFFEFF7EFFFEFEFEFFFE7EFEFFFEFF7EFFFFFFF
        FFFFE7E7E7FF737777FF5B5E5FFF000000000000000000000000000000000000
        00000000000000000000565A5AFFFFFFFFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEF
        EFFFEFEFEFFFEFEFEFFFEFF7F7FFFFFFFFFFF7F7F7FF959496FF5B5E5BFF0000
        0000000000000000000000000000000000000000000000000000000000000000
        0000575A57FFFFFFFFFFE7EFEFFFE7EFEFFFE7EFEFFFE7EFEFFFEFEFEFFFF7FF
        F7FFFFFFFFFFB7B7B7FF5A5E5BFF000000000000000000000000000000000000
        0000000000000000000000000000000000000000000000000000575A57FFFFFF
        FFFFE7EFEFFFE7EFEFFFE7EFEFFFF7F7F7FFFFFFFFFFCFD7CFFF5E6363FF5356
        52FF000000000000000000000000000000000000000000000000000000000000
        000000000000000000000000000000000000575A57FFFFFFFFFFE7EFEFFFF7F7
        F7FFFFFFFFFFE7E7E7FF737773FF575A5BFF0000000000000000000000000000
        0000000000000000000000000000000000000000000000000000000000000000
        00000000000000000000575A57FFFFFFFFFFFFFFFFFFF7F7F7FF949495FF5A5B
        5AFF000000000000000000000000000000000000000000000000000000000000
        0000000000000000000000000000000000000000000000000000000000000000
        0000575A57FFF7FFF7FFB5B5B7FF5A5B5BFF4B4E4AFF00000000000000000000
        0000000000000000000000000000000000000000000000000000000000000000
        0000000000000000000000000000000000000000000000000000575B57FF5B5F
        5FFF535656FF0000000000000000000000000000000000000000000000000000
        0000000000000000000000000000000000000000000000000000000000000000
        0000000000000000000000000000000000000000000000000000000000000000
        0000000000000000000000000000000000000000000000000000000000000000
        0000000000000000000000000000000000000000000000000000000000000000
        0000000000000000000000000000000000000000000000000000000000000000
        0000000000000000000000000000000000000000000000000000000000000000
        0000000000000000000000000000000000000000000000000000000000000000
        0000000000000000000000000000000000000000000000000000000000000000
        0000000000000000000000000000000000000000000000000000000000000000
        00000000000000000000
      }
      TabOrder = 2
    end
  end
  object Panel2: TPanel
    Left = 0
    Height = 502
    Top = 88
    Width = 575
    Align = alClient
    Caption = 'Panel2'
    ClientHeight = 502
    ClientWidth = 575
    FullRepaint = False
    TabOrder = 1
    TabStop = True
    object PageControl1: TPageControl
      Left = 1
      Height = 500
      Top = 1
      Width = 573
      ActivePage = tsTestTree
      Align = alClient
      Constraints.MinHeight = 150
      TabIndex = 0
      TabOrder = 0
      object tsTestTree: TTabSheet
        Caption = 'Testcase tree'
        ClientHeight = 465
        ClientWidth = 567
        object Splitter1: TSplitter
          Cursor = crVSplit
          Left = 0
          Height = 5
          Top = 327
          Width = 567
          Align = alBottom
          ResizeAnchor = akBottom
        end
        object TestTree: TTreeView
          Left = 6
          Height = 315
          Top = 6
          Width = 555
          Align = alClient
          BorderSpacing.Around = 6
          BackgroundColor = clBtnFace
          Color = clBtnFace
          Images = TestTreeImageList
          PopupMenu = PopupMenu3
          ReadOnly = True
          RightClickSelect = True
          ScrollBars = ssAutoBoth
          StateImages = ilNodeStates
          TabOrder = 0
          OnCreateNodeClass = TestTreeCreateNodeClass
          OnMouseDown = TestTreeMouseDown
          OnSelectionChanged = TestTreeSelectionChanged
          Options = [tvoAutoItemHeight, tvoHideSelection, tvoKeepCollapsedNodes, tvoReadOnly, tvoRightClickSelect, tvoShowButtons, tvoShowLines, tvoShowRoot, tvoToolTips]
        end
        object Memo1: TMemo
          Left = 6
          Height = 121
          Top = 338
          Width = 555
          Align = alBottom
          BorderSpacing.Around = 6
          PopupMenu = PopupMenu2
          ReadOnly = True
          ScrollBars = ssAutoVertical
          TabOrder = 1
        end
      end
      object tsResultsXML: TTabSheet
        Caption = 'Results XML'
        ClientHeight = 465
        ClientWidth = 567
        inline XMLSynEdit: TSynEdit
          Left = 6
          Height = 451
          Top = 40
          Width = 553
          Align = alClient
          BorderSpacing.Around = 6
          Font.CharSet = ANSI_CHARSET
          Font.Color = clBlack
          Font.Height = -13
          Font.Name = 'Courier'
          Font.Pitch = fpFixed
          Font.Quality = fqNonAntialiased
          ParentColor = False
          ParentFont = False
          PopupMenu = PopupMenu1
          TabOrder = 0
          BookMarkOptions.Xoffset = -18
          Gutter.Visible = False
          Gutter.Width = 57
          Gutter.MouseActions = <          
            item
              ClickCount = ccAny
              ClickDir = cdDown
              Command = emcOnMainGutterClick
            end          
            item
              Button = mbRight
              Command = emcContextMenu
            end>
          RightGutter.Width = 0
          RightGutter.MouseActions = <          
            item
              ClickCount = ccAny
              ClickDir = cdDown
              Command = emcOnMainGutterClick
            end          
            item
              Button = mbRight
              Command = emcContextMenu
            end>
          Highlighter = SynXMLSyn1
          Keystrokes = <          
            item
              Command = ecUp
              ShortCut = 38
            end          
            item
              Command = ecSelUp
              ShortCut = 8230
            end          
            item
              Command = ecScrollUp
              ShortCut = 16422
            end          
            item
              Command = ecDown
              ShortCut = 40
            end          
            item
              Command = ecSelDown
              ShortCut = 8232
            end          
            item
              Command = ecScrollDown
              ShortCut = 16424
            end          
            item
              Command = ecLeft
              ShortCut = 37
            end          
            item
              Command = ecSelLeft
              ShortCut = 8229
            end          
            item
              Command = ecWordLeft
              ShortCut = 16421
            end          
            item
              Command = ecSelWordLeft
              ShortCut = 24613
            end          
            item
              Command = ecRight
              ShortCut = 39
            end          
            item
              Command = ecSelRight
              ShortCut = 8231
            end          
            item
              Command = ecWordRight
              ShortCut = 16423
            end          
            item
              Command = ecSelWordRight
              ShortCut = 24615
            end          
            item
              Command = ecPageDown
              ShortCut = 34
            end          
            item
              Command = ecSelPageDown
              ShortCut = 8226
            end          
            item
              Command = ecPageBottom
              ShortCut = 16418
            end          
            item
              Command = ecSelPageBottom
              ShortCut = 24610
            end          
            item
              Command = ecPageUp
              ShortCut = 33
            end          
            item
              Command = ecSelPageUp
              ShortCut = 8225
            end          
            item
              Command = ecPageTop
              ShortCut = 16417
            end          
            item
              Command = ecSelPageTop
              ShortCut = 24609
            end          
            item
              Command = ecLineStart
              ShortCut = 36
            end          
            item
              Command = ecSelLineStart
              ShortCut = 8228
            end          
            item
              Command = ecEditorTop
              ShortCut = 16420
            end          
            item
              Command = ecSelEditorTop
              ShortCut = 24612
            end          
            item
              Command = ecLineEnd
              ShortCut = 35
            end          
            item
              Command = ecSelLineEnd
              ShortCut = 8227
            end          
            item
              Command = ecEditorBottom
              ShortCut = 16419
            end          
            item
              Command = ecSelEditorBottom
              ShortCut = 24611
            end          
            item
              Command = ecToggleMode
              ShortCut = 45
            end          
            item
              Command = ecCopy
              ShortCut = 16429
            end          
            item
              Command = ecPaste
              ShortCut = 8237
            end          
            item
              Command = ecDeleteChar
              ShortCut = 46
            end          
            item
              Command = ecCut
              ShortCut = 8238
            end          
            item
              Command = ecDeleteLastChar
              ShortCut = 8
            end          
            item
              Command = ecDeleteLastChar
              ShortCut = 8200
            end          
            item
              Command = ecDeleteLastWord
              ShortCut = 16392
            end          
            item
              Command = ecUndo
              ShortCut = 32776
            end          
            item
              Command = ecRedo
              ShortCut = 40968
            end          
            item
              Command = ecLineBreak
              ShortCut = 13
            end          
            item
              Command = ecSelectAll
              ShortCut = 16449
            end          
            item
              Command = ecCopy
              ShortCut = 16451
            end          
            item
              Command = ecBlockIndent
              ShortCut = 24649
            end          
            item
              Command = ecLineBreak
              ShortCut = 16461
            end          
            item
              Command = ecInsertLine
              ShortCut = 16462
            end          
            item
              Command = ecDeleteWord
              ShortCut = 16468
            end          
            item
              Command = ecBlockUnindent
              ShortCut = 24661
            end          
            item
              Command = ecPaste
              ShortCut = 16470
            end          
            item
              Command = ecCut
              ShortCut = 16472
            end          
            item
              Command = ecDeleteLine
              ShortCut = 16473
            end          
            item
              Command = ecDeleteEOL
              ShortCut = 24665
            end          
            item
              Command = ecUndo
              ShortCut = 16474
            end          
            item
              Command = ecRedo
              ShortCut = 24666
            end          
            item
              Command = ecGotoMarker0
              ShortCut = 16432
            end          
            item
              Command = ecGotoMarker1
              ShortCut = 16433
            end          
            item
              Command = ecGotoMarker2
              ShortCut = 16434
            end          
            item
              Command = ecGotoMarker3
              ShortCut = 16435
            end          
            item
              Command = ecGotoMarker4
              ShortCut = 16436
            end          
            item
              Command = ecGotoMarker5
              ShortCut = 16437
            end          
            item
              Command = ecGotoMarker6
              ShortCut = 16438
            end          
            item
              Command = ecGotoMarker7
              ShortCut = 16439
            end          
            item
              Command = ecGotoMarker8
              ShortCut = 16440
            end          
            item
              Command = ecGotoMarker9
              ShortCut = 16441
            end          
            item
              Command = ecSetMarker0
              ShortCut = 24624
            end          
            item
              Command = ecSetMarker1
              ShortCut = 24625
            end          
            item
              Command = ecSetMarker2
              ShortCut = 24626
            end          
            item
              Command = ecSetMarker3
              ShortCut = 24627
            end          
            item
              Command = ecSetMarker4
              ShortCut = 24628
            end          
            item
              Command = ecSetMarker5
              ShortCut = 24629
            end          
            item
              Command = ecSetMarker6
              ShortCut = 24630
            end          
            item
              Command = ecSetMarker7
              ShortCut = 24631
            end          
            item
              Command = ecSetMarker8
              ShortCut = 24632
            end          
            item
              Command = ecSetMarker9
              ShortCut = 24633
            end          
            item
              Command = ecNormalSelect
              ShortCut = 24654
            end          
            item
              Command = ecColumnSelect
              ShortCut = 24643
            end          
            item
              Command = ecLineSelect
              ShortCut = 24652
            end          
            item
              Command = ecTab
              ShortCut = 9
            end          
            item
              Command = ecShiftTab
              ShortCut = 8201
            end          
            item
              Command = ecMatchBracket
              ShortCut = 24642
            end>
          MouseActions = <          
            item
              ShiftMask = [ssShift, ssAlt]
              ClickDir = cdDown
              Command = emcStartSelections
              MoveCaret = True
            end          
            item
              Shift = [ssShift]
              ShiftMask = [ssShift, ssAlt]
              ClickDir = cdDown
              Command = emcStartSelections
              MoveCaret = True
              Option = 1
            end          
            item
              Shift = [ssAlt]
              ShiftMask = [ssShift, ssAlt]
              ClickDir = cdDown
              Command = emcStartColumnSelections
              MoveCaret = True
            end          
            item
              Shift = [ssShift, ssAlt]
              ShiftMask = [ssShift, ssAlt]
              ClickDir = cdDown
              Command = emcStartColumnSelections
              MoveCaret = True
              Option = 1
            end          
            item
              Button = mbRight
              Command = emcContextMenu
            end          
            item
              ClickCount = ccDouble
              ClickDir = cdDown
              Command = emcSelectWord
              MoveCaret = True
            end          
            item
              ClickCount = ccTriple
              ClickDir = cdDown
              Command = emcSelectLine
              MoveCaret = True
            end          
            item
              ClickCount = ccQuad
              ClickDir = cdDown
              Command = emcSelectPara
              MoveCaret = True
            end          
            item
              Button = mbMiddle
              ClickDir = cdDown
              Command = emcPasteSelection
              MoveCaret = True
            end          
            item
              Shift = [ssCtrl]
              ShiftMask = [ssShift, ssAlt, ssCtrl]
              Command = emcMouseLink
            end>
          MouseTextActions = <>
          MouseSelActions = <          
            item
              ClickDir = cdDown
              Command = emcStartDragMove
            end>
          VisibleSpecialChars = [vscSpace, vscTabAtLast]
          ReadOnly = True
          SelectedColor.FrameEdges = sfeAround
          SelectedColor.BackPriority = 50
          SelectedColor.ForePriority = 50
          SelectedColor.FramePriority = 50
          SelectedColor.BoldPriority = 50
          SelectedColor.ItalicPriority = 50
          SelectedColor.UnderlinePriority = 50
          SelectedColor.StrikeOutPriority = 50
          IncrementColor.FrameEdges = sfeAround
          HighlightAllColor.FrameEdges = sfeAround
          BracketHighlightStyle = sbhsBoth
          BracketMatchColor.Background = clNone
          BracketMatchColor.Foreground = clNone
          BracketMatchColor.FrameEdges = sfeAround
          BracketMatchColor.Style = [fsBold]
          FoldedCodeColor.Background = clNone
          FoldedCodeColor.Foreground = clGray
          FoldedCodeColor.FrameColor = clGray
          FoldedCodeColor.FrameEdges = sfeAround
          MouseLinkColor.Background = clNone
          MouseLinkColor.Foreground = clBlue
          MouseLinkColor.FrameEdges = sfeAround
          LineHighlightColor.Background = clNone
          LineHighlightColor.Foreground = clNone
          LineHighlightColor.FrameEdges = sfeAround
          inline TSynGutterPartList
            object TSynGutterMarks
              Width = 24
              MouseActions = <>
            end
            object TSynGutterLineNumber
              Width = 17
              MouseActions = <>
              MarkupInfo.Background = clBtnFace
              MarkupInfo.Foreground = clNone
              MarkupInfo.FrameEdges = sfeAround
              DigitCount = 2
              ShowOnlyLineNumbersMultiplesOf = 1
              ZeroStart = False
              LeadingZeros = False
            end
            object TSynGutterChanges
              Width = 4
              MouseActions = <>
              ModifiedColor = 59900
              SavedColor = clGreen
            end
            object TSynGutterSeparator
              Width = 2
              MouseActions = <>
              MarkupInfo.Background = clWhite
              MarkupInfo.Foreground = clGray
              MarkupInfo.FrameEdges = sfeAround
            end
            object TSynGutterCodeFolding
              MouseActions = <              
                item
                  Button = mbRight
                  Command = emcCodeFoldContextMenu
                end              
                item
                  ShiftMask = [ssShift]
                  Button = mbMiddle
                  ClickCount = ccAny
                  ClickDir = cdDown
                  Command = emcCodeFoldCollaps
                end              
                item
                  Shift = [ssShift]
                  ShiftMask = [ssShift]
                  Button = mbMiddle
                  ClickCount = ccAny
                  ClickDir = cdDown
                  Command = emcCodeFoldCollaps
                  Option = 1
                end              
                item
                  ClickCount = ccAny
                  ClickDir = cdDown
                  Command = emcNone
                end>
              MarkupInfo.Background = clNone
              MarkupInfo.Foreground = clGray
              MarkupInfo.FrameEdges = sfeAround
              MouseActionsExpanded = <              
                item
                  ClickCount = ccAny
                  ClickDir = cdDown
                  Command = emcCodeFoldCollaps
                end>
              MouseActionsCollapsed = <              
                item
                  Shift = [ssCtrl]
                  ShiftMask = [ssCtrl]
                  ClickCount = ccAny
                  ClickDir = cdDown
                  Command = emcCodeFoldExpand
                end              
                item
                  ShiftMask = [ssCtrl]
                  ClickCount = ccAny
                  ClickDir = cdDown
                  Command = emcCodeFoldExpand
                  Option = 1
                end>
            end
          end
        end
        object XMLToolBar: TToolBar
          Left = 0
          Height = 34
          Top = 0
          Width = 565
          ButtonHeight = 30
          ButtonWidth = 30
          Caption = 'ToolBar'
          Images = ResultsXMLImageList
          TabOrder = 1
          object CopyXMLToolButton: TToolButton
            Left = 1
            Top = 2
            Caption = 'CopyXMLToolButton'
            ImageIndex = 0
            OnClick = actCopyExecute
          end
          object CutXMLToolButton: TToolButton
            Left = 31
            Top = 2
            Caption = 'CutXMLToolButton'
            ImageIndex = 1
            OnClick = actCutExecute
          end
          object SaveAsToolButton: TToolButton
            Left = 61
            Top = 2
            Caption = 'SaveAsToolButton'
            ImageIndex = 2
            OnClick = SaveAsToolButtonClick
          end
        end
      end
    end
  end
  object TestTreeImageList: TImageList
    left = 368
    top = 176
    Bitmap = {
      4C690E0000001000000010000000000000000000000000000000000000000000
      00000F4202FF344819FF4C532EFF4D5330FF3C421BFF292B03FF000000000000
      0000000000000000000000000000000000000000000000000000005C00FF317F
      36FF96B794FFD8E2D4FFEDF3EBFFEEF3EDFFDCE3D7FFA4B19AFF54613BFF2525
      00FF0000000000000000000000000000000000000000025701FF5FB06CFFDCF6
      EAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0F6EEFF7D9E
      77FF2E2F05FF000000000000000000000000094700FF4EA85EFFCFFFE6FFE2FF
      EFFFE7FFF0FFF2FFF5FFF8FFFAFFF8FFFAFFF2FFF6FFE9FFF1FFE1FFEFFFD1FF
      EAFF6AA16AFF292500FF00000000000000001A6B17FF65E690FFC2FFDAFFCEFF
      DEFFDCFFE8FFE7FFEFFFECFFF2FFECFFF2FFE7FFF0FFDEFFE8FFCFFFDFFFC4FF
      DCFF6EED9AFF315C1DFF000000001B4803FF35A64BFF42E57CFF98F7B8FFC5FF
      D9FFCCFFDDFFD6FFE3FFDBFFE6FFDAFFE7FFD5FFE4FFCEFFDDFFC7FFD9FF9EF8
      BCFF43E87EFF3FA551FF352F04FF215C13FF49D170FF41E479FF54E785FF92F9
      B5FFB7FFCFFFC3FFD6FFC7FFD9FFC7FFDAFFC3FFD7FFB8FFCFFF96F9B8FF58E8
      88FF3FE479FF4BD575FF3D4818FF246F1FFF4FE17DFF4EEA83FF4FEB83FF57F2
      8BFF70FA9FFF8BFEB1FF97FFBAFF98FFBAFF8CFFB2FF73FBA0FF59F38DFF4FEB
      83FF4CEA83FF4EE57FFF415A24FF217721FF56E784FF54F189FF5BF48EFF5FFA
      94FF63FE96FF69FF9AFF6DFF9CFF6EFF9CFF6AFF9AFF63FE96FF60FB94FF5DF5
      8FFF54F289FF54EB86FF425B26FF137216FF5AE482FF5CFB93FF61FB94FF6BFF
      9CFF77FFA2FF80FFA6FF85FFA8FF84FFA8FF80FFA7FF78FFA3FF6CFF9DFF63FC
      95FF5AFB92FF5DE688FF404A1BFF075C04FF4CC066FF66FF9FFF69FF9BFF79FF
      A4FF85FFA9FF90FFAFFF97FFB1FF97FFB1FF92FFAFFF86FFAAFF7AFFA4FF6AFF
      9BFF62FF9EFF5FBE6FFF352F07FF0000000035772FFF6EF7A0FF72FFA3FF82FF
      A7FF92FFAFFFA0FFB6FFA9FFBAFFA9FFBAFFA1FFB6FF93FFB1FF84FFA8FF72FF
      A2FF6EFCA3FF4E6D37FF0000000000000000203500FF5FA263FF81FFB2FF8AFF
      AEFF9AFFB2FFACFFBCFFB9FFC3FFBBFFC4FFAEFFBCFF9BFFB3FF8BFFAFFF82FF
      B2FF65AB6CFF322904FF000000000000000000000000362E09FF6CA16BFF95F9
      B6FFA6FFC3FFB4FFC5FFC6FFCBFFC6FFCDFFB6FFC7FFA7FFC4FF97FBB9FF6FAA
      72FF37320EFF00000000000000000000000000000000000000002F2602FF5467
      39FF86B886FFABEAB7FFBCFAC7FFBDFAC7FFAEECB9FF8ABD8CFF586C40FF3028
      04FF000000000000000000000000000000000000000000000000000000000000
      0000322D08FF454920FF525D34FF535E34FF474B22FF332E09FF000000000000
      0000000000000000000000000000006614FF006614FF00000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000006614FF00B226FF006614FF000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000006614FF00B226FF00B226FF006614FF0000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000006614FF00B226FF00B226FF00B226FF0066
      14FF000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000006614FF00B226FF00B226FF00B226FF00B2
      26FF006614FF0000000000000000000000000000000000000000000000000000
      0000000000000000000000000000006614FF00B226FF00B226FF00B226FF00B2
      26FF00B226FF006614FF00000000000000000000000000000000000000000000
      0000000000000000000000000000006614FF00B226FF00B226FF00B226FF00B2
      26FF00B226FF00B226FF006614FF000000000000000000000000000000000000
      0000000000000000000000000000006614FF00B226FF00B226FF00B226FF00B2
      26FF00B226FF195927FF000000FF000000000000000000000000000000000000
      0000000000000000000000000000006614FF00B226FF00B226FF00B226FF00B2
      26FF195927FF000000FF00000000000000000000000000000000000000000000
      0000000000000000000000000000006614FF00B226FF00B226FF00B226FF1959
      27FF000000FF0000000000000000000000000000000000000000000000000000
      0000000000000000000000000000006614FF00B226FF00B226FF195927FF0000
      00FF000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000006614FF00B226FF195927FF000000FF0000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000006614FF195927FF000000FF000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000FF000000FF00000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000065FF13136EFF282879FF292979FF14146BFF000059FF000000000000
      0000000000000000000000000000000000000000000000000000000071FF2828
      92FF8282C5FFCBCBE8FFE7E7F5FFE8E8F6FFCECEE9FF8A8AC2FF2D2D84FF0000
      55FF0000000000000000000000000000000000000000000070FF4A4AB9FFC3C3
      F7FFF7F7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F9FFFFC8C8F8FF5252
      B3FF00005DFF000000000000000000000000000066FF2D2DB5FFA5A5FFFFC8C8
      FFFFD7D7FFFFE9E9FFFFF3F3FFFFF3F3FFFFEAEAFFFFDADAFFFFCACAFFFFAAAA
      FFFF3838B5FF000056FF0000000000000000000084FF2D2DE7FF9292FFFFACAC
      FFFFC4C4FFFFD6D6FFFFDEDEFFFFDFDFFFFFD7D7FFFFC6C6FFFFAFAFFFFF9696
      FFFF3636EDFF00007FFF00000000030369FF0909B2FF0808E4FF5E5EF7FF9999
      FFFFABABFFFFB9B9FFFFC1C1FFFFC2C2FFFFBBBBFFFFABABFFFF9B9BFFFF6666
      F8FF0A0AE6FF0808B5FF05055DFF0B0B78FF1010D6FF0000E6FF0E0EEAFF5353
      FAFF8585FFFF9B9BFFFFA1A1FFFFA1A1FFFF9C9CFFFF8888FFFF5757FBFF1111
      EBFF0000E5FF0D0DD9FF0C0C70FF0E0E86FF0D0DE3FF0000ECFF0000EEFF0303
      F6FF1E1EFCFF3F3FFFFF5353FFFF5454FFFF4343FFFF2020FDFF0404F6FF0000
      EFFF0000ECFF0A0AE6FF0D0D7EFF0F0F8AFF0D0DEAFF0000F4FF0000F8FF0000
      FEFF0000FFFF0606FFFF0C0CFFFF0C0CFFFF0707FFFF0101FFFF0000FDFF0000
      F8FF0000F4FF0A0AEDFF0F0F7EFF0F0F84FF1414E7FF0000FDFF0101FDFF0B0B
      FFFF1717FFFF1F1FFFFF2222FFFF2222FFFF2020FFFF1818FFFF0C0CFFFF0202
      FEFF0000FEFF1212ECFF101073FF070774FF1919CAFF0101FFFF0909FFFF1818
      FFFF2525FFFF2E2EFFFF3535FFFF3535FFFF2F2FFFFF2626FFFF1A1AFFFF0A0A
      FFFF0101FFFF1919CCFF09095CFF0000000015158FFF1010F9FF0E0EFFFF2121
      FFFF3030FFFF3D3DFFFF4545FFFF4646FFFF3E3EFFFF3131FFFF2323FFFF1010
      FFFF0F0FFCFF16168DFF000000000000000006065DFF2222B6FF1E1EFFFF2626
      FFFF3737FFFF4848FFFF5555FFFF5757FFFF4A4AFFFF3939FFFF2727FFFF1D1D
      FFFF2222BDFF080858FF0000000000000000000000000B0B5CFF2C2CB5FF3535
      FAFF3D3DFFFF4C4CFFFF5E5EFFFF5E5EFFFF4D4DFFFF3F3FFFFF3636FCFF2C2C
      BCFF0D0D5FFF0000000000000000000000000000000000000000070756FF2222
      88FF3D3DC8FF5454EFFF5B5BFBFF5B5BFBFF5353F0FF4040CCFF23238DFF0808
      57FF000000000000000000000000000000000000000000000000000000000000
      000008085BFF191972FF1F1F81FF1F1F82FF191972FF09095CFF000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      000077413FFF774545FF7E4F4FFF7F5151FF71403FFF602B2AFF000000000000
      00000000000000000000000000000000000000000000000000008F5D57FFA571
      78FFCBA8B1FFE9DDDEFFF5F0F0FFF6F1F1FFEADFDFFFC5A6ACFF88565DFF5B29
      24FF00000000000000000000000000000000000000008A5A53FFC68AA4FFF9CA
      F3FFFFF0FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5FFFFF8CEF3FFB679
      96FF63342EFF0000000000000000000000007C4D46FFBB6B95FFFAA2F8FFFAC3
      FAFFFAD7F9FFFCE9FBFFFDF3FDFFFDF3FDFFFCEAFBFFFAD9F8FFFBC6F9FFFFAA
      FEFFB2618FFF5C2D26FF00000000000000008E485CFFD037BCFFF48CF2FFF5AD
      F1FFF8C4F5FFFAD6F8FFFBDEFAFFFBDFFAFFFAD7F8FFF8C6F5FFF5AFF1FFF691
      F4FFD63DC6FF7D314DFF000000007C5348FFAD3687FFC904B2FFE65DDDFFF299
      EFFFF4ABF0FFF7B9F3FFF7C1F4FFF7C2F4FFF6BBF4FFF4ACF0FFF29BF0FFE865
      E0FFCD08B8FFA92984FF653A30FF8A5858FFC726A9FFD200B7FFDB0EC1FFEB53
      DEFFED85E9FFEF9AECFFF1A1EDFFF1A1EDFFEF9BEDFFEE87EAFFEC57DFFFDD11
      C2FFD200B8FFC81CACFF753E43FF965A66FFD417B9FFDF00C2FFE600C6FFF003
      D0FFF61EDCFFF442E2FFF256E4FFF257E4FFF344E2FFF620DCFFF104D0FFE700
      C7FFE000C3FFD610BBFF7F3B52FF9D5F6EFFDD17C1FFE900CBFFF402D3FFFD02
      DAFFFF0ADEFFFF16E1FFFF1FE1FFFF20E1FFFF16E0FFFF0ADFFFFD02DBFFF501
      D4FFEB00CCFFE010C3FF813C53FF9C6C6CFFE227C2FFF700D7FFFE05DBFFFF18
      E0FFFF2FE4FFFF3FE7FFFF48E8FFFF48E8FFFF40E6FFFF30E5FFFF19E1FFFE05
      DBFFF900D9FFE41BC5FF763F46FF8F685BFFD041AAFFFF00E4FFFF13E1FFFF32
      E4FFFF4AE9FFFF5EECFFFF6AEEFFFF6AEEFFFF60ECFFFF4DE9FFFF34E5FFFF17
      E0FFFF00E6FFCC2FA8FF623B2FFF000000009E526EFFFA16E3FFFF1FE8FFFF45
      E7FFFF61EDFFFF7BF0FFFF8BF4FFFF8CF4FFFF7CF2FFFF64EDFFFF47E7FFFF24
      E8FFFC16E8FF923D65FF00000000000000006A4636FFBA4496FFFF34F4FFFF4E
      EFFFFF71EFFFFF91F4FFFFABF9FFFFACFAFFFF94F5FFFF73EFFFFF52EFFFFF35
      F7FFC040A0FF5E3929FF000000000000000000000000623A2FFFB7509AFFFA5E
      F4FFFF7AFFFFFF9BFEFFFFBDFFFFFFBFFFFFFF9EFFFFFF7CFFFFFC60F6FFBF51
      A2FF663C32FF00000000000000000000000000000000000000005B3527FF8D4D
      64FFCA6FB6FFF094E9FFFBABF9FFFBACF9FFF195ECFFCE71BDFF904F6AFF5D36
      28FF000000000000000000000000000000000000000000000000000000000000
      000062342DFF774448FF864F5CFF864F5DFF77454AFF63342FFF000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      000000000000000000001517B4FF191BB3FF0000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000203A7FF9397E8FF9A9FE9FF0505A0FF00000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      000000000000373AC1FFD6D8FFFFCCCDFFFF383BBEFF00000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      00000405A7FF8C90E5FFCCCCFFFFB5B4FFFF787BE4FF060796FF000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      00003539C0FFBEC0FEFFD7D7FFFFC9C8FFFF8E8FFFFF2D2FB6FF000000000000
      0000000000000000000000000000000000000000000000000000000000000304
      A3FF8285E5FFC9C8FFFFE6E6EFFFE6E6EDFF9696FFFF5153E3FF05068BFF0000
      0000000000000000000000000000000000000000000000000000000000003539
      C0FFB2B4FEFFDFDFFFFF75756FFF707064FFC0C0FCFF5C5DFEFF2123AFFF0000
      0000000000000000000000000000000000000000000000000000090AA3FF7F82
      E7FFBDBCFFFFFBFBFFFF545450FF464641FFF6F6FEFF6D6DFFFF3031E2FF0708
      83FF0000000000000000000000000000000000000000000000003237BEFF9EA2
      FDFFCFCFFFFFFFFFFFFF757575FF636363FFFFFFFFFFA7A7FFFF2526FEFF1719
      A9FF00000000000000000000000000000000000000000C0CA0FF3042DEFF4B5F
      F5FFEDEEFCFFFFFFFFFF8C8C8CFF7E7E7EFFFFFFFFFFEAEBFEFF3037DFFF1019
      C0FF0A0A79FF000000000000000000000000000000002730BCFF132FEDFF7583
      E8FFFFFFF7FFFFFFFFFFBCBCBCFFB5B5B5FFFFFFFFFFFFFFFCFF9094D5FF040D
      C0FF12169CFF0000000000000000000000000E0E9FFF293CDEFF263DE8FFD6D8
      E5FFFAF9F2FFFDFDFEFFD5D5D7FFD2D2D3FFFDFDFEFFFAFAF5FFE1E2E5FF2D30
      BCFF080DB5FF070872FF0000000000000000272DBBFF1430EAFF7C88D7FFF9F5
      D9FFF8F6EAFFFFFFFBFF6A6A5EFF5F5F54FFFFFFF9FFFAFAEFFFFBFBE2FF8D8F
      C5FF0407B5FF0B0D93FF000000001112A0FF2A3DDBFF041CE4FF6372D1FFABAF
      D0FFA9AED9FFB3B7E0FF9C9FC7FF9A9CC4FFB4B6DCFFACAED3FFAFB0CBFF7072
      BAFF0404A4FF090BABFF05056EFF2127B5FF2E49EEFF1631E4FF112AE0FF1429
      DAFF1225D5FF0F20CFFF1A28D6FF1A24D2FF0D14C1FF0D11BDFF0B0FB9FF0508
      B5FF0608AFFF090AB9FF070888FF080A9CFF1E23AFFF2025ACFF1A1FA8FF151A
      A5FF1318A1FF11159EFF0D129AFF0C0F95FF0A0D92FF090B8FFF06098CFF080A
      89FF090A88FF060784FF02026AFF040478FF1414C3FF2525D9FF04076FFF0000
      0000000000000000000000000000000000000000000000000000000000000000
      00000000000000000000000000001010B3FF1D1DECFF302EF4FF1017CCFF7FBE
      EFFF6DBBFAFF47A3F6FF298AF0FF1073EAFF005CE3FF0045D9FF000000000000
      00000000000000000000000000002621BFFF3636F4FF2424E7FF0706C6FFDDEE
      EEFFF2FFFFFFDEFFFFFFCAFFFFFFAFFFFFFF8EFFFFFF6BF4FEFF53E3FCFF3FCE
      F9FF127CD9FF00000000000000000D32BFFF1316DBFF0000C8FF6872CAFFEAFF
      FDFFDDFFFFFFD4FFFFFFCDFFFFFFC6FFFFFFBEFFFFFFB6FFFFFFABFFFFFF96FF
      FFFF2391C4FF0000000000000000237EF2FFBBD8EEFFBECBE5FFE6FFFCFFDEFF
      FFFFD4FFFFFFCBFFFFFFC1FFFFFFB7FFFFFFACFFFFFFA2FAF7FF95F4F2FF78FF
      FFFF166BA7FF00000000000000002A80F1FFE3FFFFFFF1FFFFFFDEFFFFFFD4FF
      FFFFCBFFFFFFC2FFFEFFB7FFFFFFACFFFFFFA1FFFFFF96EFEBFF8AD2CBFF63FC
      FFFF104E89FF0000000000000000328BF6FFD6F0E5FFE0FEFDFFD6FFFFFFCCFF
      FFFFC2F2ECFFB9CEB9FFAFEFE9FFA8C9B5FFA0C0ADFF8BCFC7FF77D9D7FF51EF
      FFFF0A3469FF00000000000000003898FBFFCFE0C9FFD3E0D0FFC9CDB5FFC1CD
      B6FFBABFA2FFB2B495FFABBDA4FFA0BAA3FF8ECCC1FF7ACDCCFF61E4EBFF42DF
      FFFF071F4CFF00000000000000003DA3FDFFCDEAD5FFC8B590FFC2CAB0FFBAC4
      AAFFB1D0BBFFA7E1D6FF9BE0D5FF87EAE9FF71F3FBFF5CF2FFFF47F1FFFF36CF
      FFFF050F32FF00000000000000003FA9F8FFCBFEFAFFC5EDE4FFBBF5F0FFB0FE
      FEFFA5FFFFFF98FFFFFF86FFFFFF71F8FFFF5EF2FFFF4AEFFFFF36F0FFFF2CBE
      FAFF03041DFF000000000000000041B4F7FFC4FFFFFFBDFFFFFFB1FFFFFFA6FF
      FFFF9AFFFFFF88FBFFFF73F6FFFF5FF2FFFF4BE6FDFF31CFFEFF1BDAFFFF22A0
      F6FF01000DFF000000000000000044C7FCFFC8FFFFFFBCFFFFFFAFFFFFFFA0FF
      FFFF8DFEFFFF76F7FFFF61F2FFFF4DF0FFFF37CBEAFF20A5FFFF007EFFFF021F
      70FF0000000000000000000000001BADEEFF55E0FAFF60E8FFFF67EFFFFF69F3
      FFFF63F3FFFF5AF3FFFF4EF1FFFF3CF0FFFF31C8F2FF1D7BE7FF000E40FF0000
      000000000000000000000000000000000000000B22FF00122FFF001D41FF0029
      56FF06376CFF0D4582FF145499FF1C66B2FF1A52A8FF02041DFF000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000FF0000
      00FF000000FF000000FF000000FF000000000000000000000000000000000000
      00000000000000000000000000000000000000000000000000FF0000FFFF0000
      FFFF0000FFFF0000FFFF0000FFFF000000FF0000000000000000000000000000
      000000000000000000000000000000000000000000FF0000FFFF0000FFFF0000
      FFFF0000FFFF0000FFFF0000FFFF0004FFFF000000FF00000000000000000000
      0000000000000000000000000000000000FF0000FFFF0000FFFF00FFFFFF0000
      FFFF0000FFFF0000FFFF00FFFFFF0004FFFF0000FFFF000000FF000000000000
      0000000000000000000000000000000000FF0000FFFF0000FFFF0000FFFF00FF
      FFFF00FFFFFF00FFFFFF0004FFFF0000FFFF0000FFFF000000FF000000000000
      0000000000000000000000000000000000FF0000FFFF0000FFFF0000FFFF0000
      FFFF00FFFFFF0004FFFF0004FFFF0000FFFF0000FFFF000000FF000000000000
      0000000000000000000000000000000000FF0000FFFF0004FFFF0000FFFF00FF
      FFFF00FFFFFF00FFFFFF0000FFFF0000FFFF0000FFFF000000FF000000000000
      0000000000000000000000000000000000FF0000FFFF0000FFFF00FFFFFF0000
      FFFF0004FFFF0004FFFF00FFFFFF0000FFFF0000FFFF000000FF000000000000
      000000000000000000000000000000000000000000FF0000FFFF0000FFFF0004
      FFFF0004FFFF0000FFFF0000FFFF0000FFFF000000FF00000000000000000000
      00000000000000000000000000000000000000000000000000FF0000FFFF0000
      FFFF0000FFFF0000FFFF0000FFFF000000FF0000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000FF0000
      00FF000000FF000000FF000000FF000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000FF0000
      00FF000000FF000000FF000000FF000000000000000000000000000000000000
      00000000000000000000000000000000000000000000000000FF00A50DFF00A5
      0DFF00A50DFF00A50DFF00A50DFF000000FF0000000000000000000000000000
      000000000000000000000000000000000000000000FF00A50DFF00A50DFF00A5
      0DFF00A50DFF00A50DFF00A50DFF00A50DFF000000FF00000000000000000000
      0000000000000000000000000000000000FF00A50DFF00A50DFF00A50DFF00A5
      0DFF00A50DFF00A50DFF00A50DFF00A50DFF00A50DFF000000FF000000000000
      0000000000000000000000000000000000FF00A50DFF00A50DFF00A50DFF00A5
      0DFF00A50DFF00A50DFF00A50DFF00A50DFF00A50DFF000000FF000000000000
      0000000000000000000000000000000000FF00A50DFF00A50DFF00A50DFF00A5
      0DFF00A50DFF00A50DFF00A50DFF00A50DFF00A50DFF000000FF000000000000
      0000000000000000000000000000000000FF00A50DFF00A50DFF00A50DFF00A5
      0DFF00A50DFF00A50DFF00A50DFF00A50DFF00A50DFF000000FF000000000000
      0000000000000000000000000000000000FF00A50DFF00A50DFF00A50DFF00A5
      0DFF00A50DFF00A50DFF00A50DFF00A50DFF00A50DFF000000FF000000000000
      000000000000000000000000000000000000000000FF00A50DFF00A50DFF00A5
      0DFF00A50DFF00A50DFF00A50DFF00A50DFF000000FF00000000000000000000
      00000000000000000000000000000000000000000000000000FF00A50DFF00A5
      0DFF00A50DFF00A50DFF00A50DFF000000FF0000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000FF0000
      00FF000000FF000000FF000000FF000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000E515EDFF0000
      000000000000E515EDFF00000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000E515EDFF0000
      000000000000C922D0FF00000000E515EDFFE515EDFFE515EDFF000000000000
      00000000000000000000000000000000000000000000000000006A3A6EFFE515
      EDFFE515EDFFC922D0FF00000000C922D0FF0000000000000000000000000000
      00000000000000000000000000000000000000000000E515EDFFE515EDFFE515
      EDFFE515EDFFE515EDFFE515EDFFE515EDFF000000000000000000000000E515
      EDFFE515EDFF000000000000000000000000E515EDFFE515EDFFE515EDFFE515
      EDFFE515EDFFE515EDFFE515EDFFE515EDFFE515EDFFE515EDFFE515EDFFE515
      EDFFE515EDFFE515EDFF0000000000000000E515EDFFC61ECDFFA728ADFFE515
      EDFFE515EDFFE515EDFFE515EDFFE515EDFFE515EDFFC61ECDFFC81CCDFFE515
      EDFFE515EDFFE515EDFF0000000000000000B223B2FFE515EDFFE515EDFFE515
      EDFFC61BCDFFE515EDFF89278EFFE515EDFFB223B2FFB223B2FFB223B2FFE515
      EDFFE515EDFFE515EDFF000000000000000000000000B223B2FFE515EDFFB223
      B2FFB223B2FFE515EDFFB223B2FFE515EDFFB223B2FFB223B2FF00000000B223
      B2FFE515EDFF0000000000000000000000000000000000000000B223B2FFB223
      B2FFB223B2FFE515EDFFE515EDFFE515EDFF0000000000000000000000000000
      0000000000000000000000000000000000000000000000000000B223B2FF0000
      000000000000E515EDFF00000000E515EDFFE515EDFFE515EDFF000000000000
      0000000000000000000000000000000000000000000000000000B223B2FF0000
      000000000000B223B2FF00000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000FF0000
      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
      00FF000000FF0000000000000000000000000000000000000000000000FFCC66
      66FFCC6666FFCC6666FFCC6666FFCC6666FFCC6666FFCC6666FFCC6666FFCC66
      66FF424142FFFFFFFFFF00000000000000000000000000000000000000FFFFFF
      FFFFFFE7E7FFEFD5D5FFFFFFFFFFFFE7E7FFFFFFFFFFFFE7E7FFEFD5D5FFFFE7
      E7FF424142FFFFFFFFFF00000000000000000000000000000000000000FFFFFF
      FFFFEFD5D5FFFFFFFFFFFFE7E7FFFFFFFFFFFFE7E7FFEFD5D5FFFFE7E7FFE6CC
      CCFF424142FFFFFFFFFF000000000000000000000000000000FF000000FFFFFF
      FFFFFFFFFFFF000000FFFFFFFFFFFFE7E7FFEFD5D5FFFFE7E7FFE6CCCCFFFFE7
      E7FF424142FFFFFFFFFF000000000000000000000000FFFFFFFF000000FF0000
      00FF000000FFFFFFFFFFFFE7E7FFEFD5D5FFFFE7E7FFE6CCCCFFFFE7E7FFCCB3
      B3FF424142FFFFFFFFFF00000000000000000000000000000000000000FF8CC7
      83FF000000FFFFE7E7FFEFD5D5FFFFE7E7FFE6CCCCFFFFE7E7FFBEA5A5FFEFD5
      D5FF424142FFFFFFFFFF0000000000000000000000FFFFFFFFFF000000FF0000
      00FF000000FFEFD5D5FF000000FFE6CCCCFFFFE7E7FFBEA5A5FFEFD5D5FFB299
      99FF424142FFFFFFFFFF000000000000000000000000000000FF8CC783FF8CC7
      83FF8CC783FF000000FFE6CCCCFFFFE7E7FFB29999FFEFD5D5FFB29999FFE6CC
      CCFF424142FFFFFFFFFF0000000000000000000000FF000000FF8CC783FF5EAB
      5EFF1A821AFF000000FF000000FF424142FF424142FF424142FF424142FF4241
      42FF424142FFFFFFFFFF0000000000000000FFFFFFFF000000FF8CC783FF5EAB
      5EFF1A821AFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
      FFFFFFFFFFFFFFFFFFFF000000000000000000000000000000FF8CC783FF1A82
      1AFF1A821AFF000000FFFFFFFFFF000000000000000000000000000000000000
      000000000000000000000000000000000000000000FFFFFFFFFF000000FF0000
      00FF000000FFFFFFFFFF000000FFFFFFFFFF0000000000000000000000000000
      000000000000000000000000000000000000FFFFFFFF0000000000000000FFFF
      FFFFFFFFFFFF0000000000000000FFFFFFFF0000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000000000000000000002625B3FF6563
      C5FF1414A8FF000000000000000000000000000000000D0D98FF6363B9FF2D2D
      9FFF00000000000000000000000000000000000000003433B5FFDBDCF1FFDFE7
      FFFFCAC8E8FF1918A2FF0000000000000000131296FFC0BFDFFFDDE2FDFFDFE1
      F0FF4140A0FF0000000000000000000000002827B3FFDBDBF2FF869EFFFF1729
      F9FFAEBDFFFFCFCDE7FF15149AFF0C0B93FFC5C4E1FFBBC3F5FF1618D1FF7580
      E3FFE2E3ECFF313097FF00000000000000006664C6FFDFE9FFFF0F29F9FF001A
      F2FF0621EDFFADB9F9FFC7C5E2FFBFBFDEFFBAC0F3FF0D17D1FF0009CAFF0306
      C2FFD1D4F5FF7474B4FF00000000000000001B1AA9FFC5C4E7FFAEBDFFFF0821
      EDFF001AE8FF061BE1FFAEB6F1FFB9C0EFFF0C17D1FF000CCBFF020AC3FF9CA1
      E6FFCFCFE3FF222188FF0000000000000000000000001A19A2FFD3D1E7FFACB8
      FAFF061BE0FF0014DCFF0A20D8FF0D1FD3FF000DCCFF0009C3FF999DE4FFDBDB
      E6FF232388FF000000000000000000000000000000000000000011119AFFC6C5
      E1FFACB4F1FF0D20D8FF0014D0FF0012CCFF0714C6FF9FA2E1FFCFCEDFFF1818
      85FF0000000000000000000000000000000000000000000000000C0C94FFC2C0
      DEFFB6BCEFFF101FD1FF0011CCFF000FC6FF0913C0FFA8ABE1FFCBCADDFF1010
      7DFF0000000000000000000000000000000000000000141396FFC6C4E2FFBAC0
      F3FF0C19D1FF000DCBFF0513C6FF0712C1FF0004BBFF0507B4FFA5A6DEFFD0D0
      DEFF1A1A7BFF000000000000000000000000161598FFBDBDDFFFB9C1F4FF0C18
      D2FF000DCCFF000AC3FF9EA1E1FFA9ABE1FF0506B4FF0001AFFF0606A8FFA7A7
      DBFFC4C4D8FF1B1B78FF00000000000000006463B9FFDFE4FCFF1015D0FF0008
      C9FF0309C3FF9B9EE4FFD0D0E0FFC9C9DCFFA7A8DDFF0505A9FF0000A2FF0404
      9BFFD0D0E5FF7373A7FF00000000000000002E2DA0FFE1E0F0FF757FE2FF0D0E
      C3FF9BA1E6FFD8D8E5FF1D1D86FF14147DFFCDCDDEFFA7A7DBFF0C0C9AFF6363
      BDFFE1E1E5FF383884FF0000000000000000000000004241A0FFE1E2EDFFD0D2
      F5FFD1D1E3FF222289FF000000000000000019197CFFC8C7D8FFCFCEE5FFE0E0
      E5FF4E4E8DFF00000000000000000000000000000000000000002F2F96FF7372
      B4FF1C1C88FF00000000000000000000000000000000141578FF7171A7FF3737
      84FF000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000942B01FFA64216FFB35327FFB34E24FFA43A13FF8E1F02FF000000000000
      000000000000000000000000000000000000000000000000000000000000AF4F
      22FFDE9C6FFFFAC094FFF4B486FFF2AA7AFFF7A673FFDF804CFFAB3D17FF0000
      0000000000000000000000000000000000000000000000000000BF6536FFF9CD
      A3FFFFD6B1FFF2BA96FFE9CDBEFFE7C8B8FFE79D72FFF29E6AFFF59155FFBB49
      1FFF0000000000000000000000000000000000000000B05024FFFACCA3FFFFD2
      AEFFFABA90FFE7B18FFFF8F6F4FFF8F4F3FFDE9971FFE0824EFFE0824DFFF37F
      3FFFA83110FF000000000000000000000000952A01FFE09B6FFFFFDAB6FFFABE
      97FFF7B58CFFEA9B6CFFE2A582FFDF9D78FFDE7F4CFFDF7E4CFFD6713DFFE070
      33FFD85A20FF850F01FF0000000000000000A53F10FFF99C58FFFCBE92FFF7B8
      91FFEBA073FFE7AB88FFE4A480FFE09D77FFDC8352FFD9703AFFD56830FFCF5C
      21FFD15D1BFF951E09FF0000000000000000B34F21FFF87E27FFEC7224FFF0A6
      79FFE7986AFFE2A784FFF5F4F1FFF5F6F3FFDC8C61FFD35F24FFCF5D23FFBB47
      06FFC2520DFF9E270BFF0000000000000000B14C20FFF47F2BFFE25500FFDE60
      10FFE17A3DFFDB7A40FFEEDDD4FFF2F8F7FFD88354FFC64B0DFFB94605FFAE3F
      00FFBF4F0DFF9C230BFF0000000000000000A33C15FFED7D32FFE05901FFD854
      00FFD04700FFCF5615FFEDDED4FFF1F7F6FFCD7243FFB23500FFB24100FFAC3E
      00FFBD4C0CFF911706FF0000000000000000902406FFD66F33FFE1620FFFD251
      00FFCB4800FFCA5110FFEBDCD2FFEFF5F5FFC96F42FFAE3400FFAC3D00FFAD41
      03FFB7400DFF810602FF000000000000000000000000A93F19FFE5772DFFCE52
      04FFC34300FFC85219FFEBE2DBFFEFF9FBFFC9744EFFA62E00FFA53B00FFBD4C
      0BFF991D06FF0000000000000000000000000000000000000000B4481FFFDC6C
      23FFC9500AFFE19C6FFFEEDFD3FFEAE0D6FFEBBE9EFFBB4F13FFBA4706FFA52A
      09FF780000FF000000000000000000000000000000000000000000000000A332
      12FFC75820FFD46D2DFFCE611FFFC95C1BFFCC6124FFBB4612FF981C06FF7900
      00FF000000000000000000000000000000000000000000000000000000000000
      0000850F04FF941903FF9B1F03FF991C01FF8E0E00FF800500FF000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      000000000000373737FF565656FF646464FF515151FF252525FF000000000000
      0000000000000000000000000000000000000000000000000000000000005050
      50FFA3A3A3FFE6E6E6FFFFFFFFFFFFFFFFFFFEFEFEFFE2E2E2FF909090FF2323
      23FF000000000000000000000000000000000000000000000000575757FFCBCB
      CBFFF5F5F5FFF8F8F8FFFCFCFCFFFEFEFEFFFCFCFCFFF9F9F9FFF7F7F7FFC1C1
      C1FF323232FF00000000000000000000000000000000303030FF9C9C9CFFDDDD
      DDFFE2E2E2FFEEEEEEFFF4F4F4FFF6F6F6FFF4F4F4FFEDEDEDFFE1E1E1FFDFDF
      DFFF919191FF0F0F0FFF0000000000000000000000003A3A3AFF818181FFCFCF
      CFFFD6D6D6FFE2E2E2FFE8E8E8FFEAEAEAFFE8E8E8FFE1E1E1FFD6D6D6FFCECE
      CEFF7C7C7CFF2E2E2EFF0000000000000000363636FF4D4D4DFF5A5A5AFFA6A6
      A6FFC9C9C9FFD2D2D2FFD7D7D7FFD9D9D9FFD7D7D7FFD1D1D1FFC9C9C9FFA1A1
      A1FF585858FF4B4B4BFF141414FF00000000474747FF5B5B5BFF636363FF7474
      74FF9C9C9CFFB5B5B5FFC0C0C0FFC3C3C3FFBFBFBFFFB4B4B4FF9A9A9AFF7272
      72FF636363FF5B5B5BFF282828FF00000000535353FF686868FF777777FF8282
      82FF858585FF8C8C8CFF949494FF989898FF949494FF8C8C8CFF858585FF8181
      81FF767676FF696969FF323232FF00000000585858FF777777FF828282FF8A8A
      8AFF909090FF959595FF979797FF979797FF979797FF959595FF909090FF8A8A
      8AFF828282FF777777FF2D2D2DFF000000004E4E4EFF828282FF898989FF9090
      90FF989898FF9D9D9DFFA1A1A1FFA3A3A3FFA1A1A1FF9D9D9DFF979797FF9090
      90FF898989FF7D7D7DFF171717FF0000000000000000717171FF929292FF9595
      95FF9D9D9DFFA5A5A5FFAAAAAAFFACACACFFAAAAAAFFA4A4A4FF9D9D9DFF9595
      95FF949494FF5E5E5EFF000000000000000000000000313131FF909090FF9D9D
      9DFFA2A2A2FFABABABFFB2B2B2FFB6B6B6FFB2B2B2FFAAAAAAFFA1A1A1FF9D9D
      9DFF8C8C8CFF1A1A1AFF00000000000000000000000000000000353535FF9898
      98FFADADADFFAFAFAFFFB7B7B7FFBDBDBDFFB7B7B7FFAFAFAFFFADADADFF9494
      94FF2D2D2DFF0000000000000000000000000000000000000000000000002121
      21FF747474FFA6A6A6FFB8B8B8FFBEBEBEFFB8B8B8FFA4A4A4FF6F6F6FFF1D1D
      1DFF000000000000000000000000000000000000000000000000000000000000
      0000000000001D1D1DFF3E3E3EFF4B4B4BFF3D3D3DFF1B1B1BFF000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
      0000000000000000000000000000000000000000000000000000000000FF0000
      0000FDDCD3FFFDE5E0FFFDD8CEFFFDC6B6FFFCB3A0FFFBA28AFFF96841FF0000
      00FF00000000000000000000000000000000000000FF000000FFFBB3A0FFFDDE
      D6FFFFF4F1FFFFF4F1FFFEDED5FFFDC8BAFFFCB29EFFFC9B83FFFA8667FFF976
      52FF000000FF000000FF0000000000000000000000FFFA997EFFFDC3B4FFFED7
      CDFFFEE6DFFFFEE5DFFFFED7CCFFFDC4B3FFFCAE99FFFB9A7FFFFB8464FFFA6E
      49FFF8623AFF000000FF00000000000000FFF97E5DFFFCA58EFFFDB7A6FFFDC7
      B9FFFDD1C4FFFDD0C5FFFDC7B9FFFDB7A6FFFBA58FFFFB9376FFFA7D5DFFFA69
      43FFF8623AFFF86239FF000000FF000000FFF97C5BFFFB987EFFFCA892FFFCB3
      A0FFFCBBA9FFFCBBA9FFFDB4A1FFFBA891FFFB987EFFFA8768FFFA7550FFF862
      3AFFF8633AFFF86239FF000000FF000000FFF97654FFFA896BFFFB967BFFFCA0
      87FFFBA58EFFFCA58EFFFCA088FFFB967BFFFA896AFFFA7957FFF96842FFF862
      39FFF86239FFF8633AFF000000FF000000FFF86942FFF97854FFFA8363FFFA8A
      6CFFFB8F72FFFA8F72FFFB8B6DFFFA8262FFFA7854FFF96A44FFF86239FFF862
      3AFFF8623AFFF86239FF000000FF000000FFF86239FFF9653EFFF96E4AFFFA76
      52FFFA7956FFFA7957FFFA7652FFF96F4AFFF9653DFFF86239FFF8623AFFF862
      39FFF8623AFFF86239FF000000FF000000FFF86239FFF8623AFFF8633AFFF862
      3AFFF9633BFFF9633BFFF86239FFF86239FFF8623AFFF86239FFF8623AFFF863
      3AFFF8623AFFF86239FF000000FF000000FFF8623AFFF8623AFFF8623AFFF862
      3AFFF86239FFF8623AFFF86339FFF8623AFFF8623AFFF8623AFFF8623AFFF862
      39FFF8633AFFF86239FF000000FF00000000000000FFF86239FFF8623AFFF862
      39FFF8623AFFF8623AFFF8623AFFF8623AFFF8623AFFF8623AFFF8623AFFF862
      39FFF86239FF000000FF0000000000000000000000FF000000FFF86239FFF862
      3AFFF8623AFFF86339FFF86239FFF86239FFF8633AFFF86239FFF8623AFFF862
      3AFF000000FF000000FF00000000000000000000000000000000000000FFF862
      39FFF86239FFF86239FFF86239FFF86239FFF86239FFF8623AFFF86239FF0000
      00FF000000000000000000000000000000000000000000000000000000000000
      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
      0000000000000000000000000000
    }
  end
  object ActionList1: TActionList
    Images = ResultsXMLImageList
    left = 168
    top = 240
    object actCopy: TAction
      Category = 'edit'
      Hint = 'Copy results to clipboard'
      OnExecute = actCopyExecute
    end
    object actCut: TAction
      Category = 'edit'
      ImageIndex = 1
      OnExecute = actCutExecute
    end
  end
  object ResultsXMLImageList: TImageList
    Height = 22
    Width = 22
    left = 80
    top = 304
    Bitmap = {
      4C690300000016000000160000008B908DFF898E8CFF898E8CFF898E8CFF898E
      8CFF898E8CFF898E8CFF898E8CFF898E8CFF898E8CFF898E8CFF898E8CFF898E
      8CFF898E8CFF8B908DFF00000000000000000000000000000000000000000000
      000000000000858A88FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8D91
      90FF00000000000000000000000000000000000000000000000000000000868C
      8AFFFFFFFFFFEFF0F0FFEFF0F0FFEFF0F0FFEFF0F0FFEFF0F0FFEFF0F0FFEFF0
      F0FFEFF0F0FFEFF0F0FFEFF0F0FFEFF0F0FFFEFEFEFF8E9291FF000000000000
      00000000000000000000000000000000000000000000868C8AFFFFFFFFFFEFF0
      F0FFEFF0F0FFEFF0F0FFEFF0F0FFEFF0F0FFEEEFEFFFE8E9E9FFE8E9E9FFE8E9
      E9FFE8E9E9FFE7E8E8FFF6F6F6FF8D9190FF0000000000000000000000000000
      0000000000000000000000000000868C8AFFFFFFFFFFEFF0F0FFCACACAFFCACA
      CAFFCACACAFFC9C9C9FF959997FF898E8CFF898E8CFF898E8CFF898E8CFF8A8E
      8CFF8A8F8DFF898E8CFF898E8CFF898E8CFF898E8CFF898E8CFF898E8CFF898E
      8CFF8A8F8DFF868C8AFFFFFFFFFFEFF0F0FFEFF0F0FFEFF0F0FFEFF0F0FFE8E9
      E9FF868B89FFFFFFFFFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFE
      FEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFFFFFFFF898E8CFF868C
      8AFFFFFFFFFFEFF0F0FFCACACAFFCACACAFFCACACAFFC5C6C5FF868B89FFFFFF
      FFFFEFF0F0FFEFF0F0FFEFF0F0FFEFF0F0FFEFF0F0FFEFF0F0FFEFF0F0FFEFF0
      F0FFEFF0F0FFEFF0F0FFEFF0F0FFFEFEFEFF898E8CFF868C8AFFFFFFFFFFEFF0
      F0FFEFF0F0FFEFF0F0FFEFF0F0FFE7E8E8FF878C8AFFFFFFFFFFEFF0F0FFEFF0
      F0FFEFF0F0FFEFF0F0FFEFF0F0FFEFF0F0FFEFF0F0FFEFF0F0FFEFF0F0FFEFF0
      F0FFEEEFEFFFFEFEFEFF898E8CFF868C8AFFFFFFFFFFEFF0F0FFCACACAFFC9CA
      CAFFC9CACAFFC3C5C5FF868B89FFFFFFFFFFEFF0F0FFC6C7C7FFC6C7C7FFC6C7
      C7FFC6C7C7FFC6C7C7FFC6C7C7FFC6C7C7FFC6C7C7FFC5C6C6FFEEEEEEFFFEFE
      FEFF898E8CFF868C8AFFFFFFFFFFEFF0F0FFEEEFEFFFEEEEEEFFEDEEEEFFE5E6
      E6FF878C8AFFFFFFFFFFEFF0F0FFEEEFEFFFEEEFEFFFEEEFEFFFEEEFEFFFEEEF
      EFFFEEEFEFFFEDEEEEFFEDEEEEFFECEDEDFFEDEDEDFFFEFEFEFF898E8CFF868C
      8AFFFFFFFFFFEEEFEFFFC8C9C9FFC8C8C8FFC7C8C8FFC2C3C3FF868B89FFFFFF
      FFFFEFF0F0FFC6C7C7FFC6C7C7FFC6C7C7FFC6C7C7FFC6C7C7FFC5C6C6FFC5C5
      C5FFC5C5C5FFC4C5C5FFEEEEEEFFFEFEFEFF898E8CFF868B89FFFFFFFFFFEDEE
      EEFFECEDEDFFECECECFFEBECECFFE4E5E4FF878C8AFFFFFFFFFFEFF0F0FFEFF0
      F0FFEFF0F0FFEFF0F0FFEEEFEFFFEEEFEFFFEDEEEEFFEDEDEDFFECEDEDFFEDEE
      EEFFEDEDEDFFFEFEFEFF898E8CFF868B89FFFFFFFFFFECEDEDFFC7C7C7FFC6C7
      C7FFC5C6C6FFC1C1C1FF868B89FFFFFFFFFFEFF0F0FFC7C8C8FFC6C7C7FFC6C7
      C7FFC5C6C6FFC5C6C6FFC5C5C5FFC5C5C5FFEDEEEEFFEDEDEDFFF4F4F4FFFEFE
      FEFF898E8CFF868B89FFFDFDFDFFEBECECFFEBEBEBFFEAEBEBFFEAEAEAFFE2E3
      E3FF878C8AFFFFFFFFFFEFF0F0FFEEEFEFFFEEEEEEFFEDEEEEFFECEDEDFFECED
      EDFFEBECECFFEBEBEBFFEFEFEFFFF2F2F2FFEFEFEFFFFCFCFCFF898E8CFF868B
      89FFFAFAFAFFEAEBEBFFEAEAEAFFE9EAEAFFE9E9E9FFE1E2E2FF878C8AFFFFFF
      FFFFEEEFEFFFC5C5C5FFC5C5C5FFC4C5C5FFC4C4C4FFC3C4C4FFC3C3C3FFCDCD
      CDFFDCDCDCFFDCDCDCFFF2F2F2FFF9F9F9FF888D8BFF868B89FFF7F7F7FFEAEA
      EAFFE9E9E9FFE8E9E9FFE8E8E8FFE2E3E3FF878C8AFFFFFFFFFFEDEEEEFFEBEC
      ECFFEBEBEBFFEAEBEBFFEAEAEAFFE9EAEAFFECECECFFEFEFEFFFEDEDEDFFEFEF
      EFFFF2F2F2FFF7F7F7FF888D8BFF858A88FFF2F2F2FFF3F3F3FFF1F1F1FFF0F0
      F0FFF1F1F1FFEDEDEDFF878C8AFFFFFFFFFFECEDEDFFECECECFFEBECECFFEAEB
      EBFFEAEAEAFFEEEFEFFFF0F0F0FFEFEFEFFFF1F1F1FFF2F2F2FFF1F1F1FFBBBE
      BDFF868B89FF8B908DFF858A88FF858A88FF858A88FF858A88FF858A88FF858A
      88FF868B89FFFDFDFDFFEBECECFFEBEBEBFFEAEBEBFFEAEAEAFFECECECFFF0F0
      F0FFEEEEEEFF858A88FF858A88FF858A88FF858A88FF858A88FF858A88FF0000
      0000000000000000000000000000000000000000000000000000868B89FFFAFA
      FAFFEAEBEBFFEAEAEAFFE9EAEAFFECECECFFEFEFEFFFEFEFEFFFF1F1F1FF848A
      86FFCFCFCFFFCFCFCFFFB9BBBAFF858A88FF858B87FF00000000000000000000
      000000000000000000000000000000000000868B89FFF7F7F7FFEAEAEAFFE9E9
      E9FFEDEEEEFFF1F1F1FFF1F1F1FFF3F3F3FFF4F4F4FF878D89FFCFCFCFFFB4B5
      B4FF858A88FF8F9490FF00000000000000000000000000000000000000000000
      00000000000000000000868B89FFF2F2F2FFF2F2F2FFF1F1F1FFF0F0F0FFF1F1
      F1FFF4F4F4FFF7F7F7FFF6F6F6FF858A86FFB9BBBAFF858A88FF868C88FF0000
      0000000000000000000000000000000000000000000000000000000000000000
      00008A8F8DFF868B89FF868B89FF858A88FF858A88FF858A88FF858A88FF858A
      88FF848A87FF848A86FF858A88FF848A86FF0000000000000000000000000000
      0000000000000000000000000000000000009D9D9FFF00000000000000000000
      0000000000000000000000000000000000000000000000000000868F8DFF0000
      0000000000000000000000000000000000000000000000000000000000000000
      000000000000949C96FFCFCFCEFF9DA59FFF0000000000000000000000000000
      000000000000000000000000000000000000D6D7D7FF959597FF000000000000
      0000000000000000000000000000000000000000000000000000000000009C9F
      9EFFEFEFEFFFCFCFCFFF00000000000000000000000000000000000000000000
      000000000000AFB5B5FFF7F7F7FFCFD6D6FF0000000000000000000000000000
      000000000000000000000000000000000000000000009DA5A5FFEFEFEFFFEFEF
      EFFFA7A7A5FF00000000000000000000000000000000000000008F948EFFE7EF
      E7FFE7E7E7FFEFEFEFFF00000000000000000000000000000000000000000000
      0000000000000000000000000000959E9CFFD6D7D7FFE7E7E7FFDEDFDFFF9E9E
      9CFF00000000000000000000000000000000B7B5B5FFEFEFEFFFEFEFEFFFAFB5
      AFFF000000000000000000000000000000000000000000000000000000000000
      00000000000000000000ADB5AFFFE7E7E7FFEFEFEFFFADAFAFFF000000000000
      000000000000ADB5AFFFEFEFEFFFDEDEDEFFEFEFEFFF00000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000AFB5B5FFCFCECFFFDFDFDFFFEFEFEFFF9DA5A5FF0000000000000000BFBD
      BDFFE7E7E7FFEFEFEFFFADADAFFF000000000000000000000000000000000000
      000000000000000000000000000000000000000000000000000000000000ADB5
      AFFFE7E7E7FFDEDEDEFFCFCECFFF00000000ADADAFFFE7E7E7FFDEDEDEFFE7E7
      E7FF878C8EFF0000000000000000000000000000000000000000000000000000
      00000000000000000000000000000000000000000000979C96FFBDBFBFFFDFDF
      DFFFEFEFEFFFA5A5A7FFCED6CFFFCECFCFFFEFEFEFFFA7AFADFF000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      000000000000000000000000000000000000ADAFAFFFE7EFEFFFDFDFDFFFE7EF
      E7FFB7BFBDFFCFCECEFFC6C7C7FF000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      00000000000000000000949D97FFB5B7B7FFE7E7E7FFE7E7E7FFB5B7B7FFDEDE
      DFFFA7ADADFF0000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000008E969FFFDFDEE7FFD6D6D7FFEFEFEFFFA7A7A5FF000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      000000000000000000000000000000000000000000000000CEFF090AD7FF7373
      CEFF5657E7FF8C8DE7FF5657E7FF7373CEFF090AD7FF0000CEFF000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000CEFF4647DFFF7777EFFF5B5AEFFF5A5BEFFF5352DEFF9496
      BFFF5352DEFF5A5BEFFF7B7BEFFF7777EFFF6B6BE7FF0000CEFF000000000000
      00000000000000000000000000000000000000000000000000000000CEFF777B
      EFFF6F6FE7FF3939DFFF0000CEFF7B7BEFFF0000CEFF000000000000CEFF7B7B
      EFFF0000CEFF0808D6FF6F6FE7FF777BEFFF0000CEFF00000000000000000000
      00000000000000000000000000000000CEFF7373EFFF6F6FE7FF0000CEFF0000
      00000000CEFF7B7BEFFF0000CEFF000000000000CEFF7B7BEFFF0000CEFF0000
      00000000CEFF6F6FE7FF7373EFFF0000CEFF0000000000000000000000000000
      0000000000000000CEFF7B7BEFFF0000CEFF00000000000000005B5BDEFF7B7B
      EFFF0000CFFF000000000101CFFF7B7BEFFF0000CEFF00000000000000000000
      CEFF7B7BEFFF0000CEFF00000000000000000000000000000000000000000000
      CEFF7B7BE7FF3333D6FF0000CEFF0000CEFF7B7BEFFF4747E7FF0000BDFF0000
      00000000BDFF6363E7FF7B7BEFFF3333D6FF0000CEFF5B5BDEFF7B7BE7FF0000
      C7FF0000000000000000000000000000000000000000000000003D3DD7FF7F7F
      EFFF7B7BEFFF7B7BEFFF5757E7FF0101CEFF000094FF0000000000009DFF0101
      CEFF5757E7FF7B7BEFFF7B7BEFFF7F7FEFFF0C0CCEFF0000B5FF000000000000
      000000000000000000000000000000000000000000000000B7FF0000C7FF0000
      CEFF0000B5FF00009EFF00000000000000000000000000009EFF0000C7FF0000
      CEFF0000CEFF0000BDFF00000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000A6D7FDFF447FC8FF263E5BFF1B1B1BFF3F3F
      3FFF404040FF404040FF404040FF404040FF404040FF404040FF404040FF1C1C
      1CFF1C1C1CFF0000000000000000000000000000000000000000000000000000
      0000000000000478EAFF4AA9FAFF6FB3EEFF6B9DD0FF729ACCFFC3D0DEFFF4F7
      FAFFF2F6FBFFEEF4FAFFEAF1F9FFE6EEF8FFE2ECF7FF404040FF777777FF1C1C
      1CFF000000000000000000000000000000000000000000000000000000000000
      00FF035CB6FF0475E1FF309AF8FF7FC1F5FF5F97D2FF6187A1FF989E6EFFA4A4
      68FFA5A569FFB6BBABFFE0EAF6FF404040FF737373FF1C1C1CFF000000000000
      00000000000000000000000000000000000000000000000000000B0E10FF0618
      29FF023569FF0C7BE8FF2F84ECFF75A2EEFF8DA8DBFFD2DBE9FFE3ECF6FFE1EB
      F7FFDDE8F6FF404040FF707070FF1C1C1CFF0000000000000000000000000000
      0000000000000000000000000000000000001A1A1AFF717171FF202020FF1522
      33FF2A4571FF49679EFF5F7DB6FF44536AFF9B9B62FFB4B9A9FFDBE7F5FF4040
      40FF6D6D6DFF1C1C1CFF00000000000000000000000000000000000000000000
      000000000000000000001C1C1CFF7A7A7AFF3D3D3DFFDBDEE2FFC2C6CBFFB3B8
      BEFFACB2B9FFB0B7BEFFC3CBD6FFD6E2EFFFD8E5F4FF404040FF696969FF1C1C
      1CFF000000000000000000000000000000000000000000000000000000000000
      00001C1C1CFF797979FF777777FF3F3F3FFF3D3D3DFF3C3C3CFF3C3C3CFF3C3C
      3CFF3D3D3DFF3F3F3FFF404040FF676767FF666666FF1C1C1CFF000000000000
      00000000000000000000000000000000000000000000000000001C1C1CFF7575
      75FF737373FF727272FF707070FF6E6E6EFF6D6D6DFF6B6B6BFF696969FF6767
      67FF666666FF646464FF626262FF1C1C1CFF0000000000000000000000000000
      0000000000000000000000000000000000001C1C1CFF727272FF707070FF6E6E
      6EFF404040FF404040FF404040FF404040FF404040FF404040FF404040FF6060
      60FF5F5F5FFF1C1C1CFF00000000000000000000000000000000000000000000
      000000000000000000001C1C1CFF6E6E6EFF6D6D6DFF404040FFE6E6E6FFDBDB
      DBFFD1D1D1FFC7C7C7FF404040FF8E8E8EFF8B8B8BFF404040FF5B5B5BFF1C1C
      1CFF000000000000000000000000000000000000000000000000000000000000
      00001C1C1CFF6B6B6BFF696969FF404040FFDBDBDBFF424242FF424242FFBCBC
      BCFF404040FF858585FF838383FF404040FF585858FF1C1C1CFF000000000000
      00000000000000000000000000000000000000000000000000001C1C1CFF6767
      67FF666666FF404040FFD1D1D1FF424242FF666666FFB2B2B2FF404040FF7D7D
      7DFF7B7B7BFF404040FF545454FF1C1C1CFF0000000000000000000000000000
      0000000000000000000000000000000000001C1C1CFF646464FF626262FF4040
      40FFC7C7C7FFBCBCBCFFB2B2B2FFA7A7A7FF404040FF757575FF737373FF4040
      40FF535353FF1C1C1CFF00000000000000000000000000000000000000000000
      00000000000000000000000000001C1C1CFF1C1C1CFF1C1C1CFF404040FF4040
      40FF404040FF404040FF1C1C1CFF1C1C1CFF1C1C1CFF1C1C1CFF1C1C1CFF0000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      000000000000000000000000000000000000000000000000000000000000
    }
  end
  object PopupMenu1: TPopupMenu
    Images = ResultsXMLImageList
    left = 264
    top = 176
    object MenuItem1: TMenuItem
      Action = actCopy
      Caption = '&Copy '
      Bitmap.Data = {
        C6070000424DC607000000000000360000002800000016000000160000000100
        2000000000009007000064000000640000000000000000000000000000000000
        000000000000000000000000000000000000000000008A8F8DFF868B89FF868B
        89FF858A88FF858A88FF858A88FF858A88FF858A88FF848A87FF848A86FF858A
        88FF848A86FF0000000000000000000000000000000000000000000000000000
        0000000000000000000000000000868B89FFF2F2F2FFF2F2F2FFF1F1F1FFF0F0
        F0FFF1F1F1FFF4F4F4FFF7F7F7FFF6F6F6FF858A86FFB9BBBAFF858A88FF868C
        88FF000000000000000000000000000000000000000000000000000000000000
        000000000000868B89FFF7F7F7FFEAEAEAFFE9E9E9FFEDEEEEFFF1F1F1FFF1F1
        F1FFF3F3F3FFF4F4F4FF878D89FFCFCFCFFFB4B5B4FF858A88FF8F9490FF0000
        000000000000000000000000000000000000000000000000000000000000868B
        89FFFAFAFAFFEAEBEBFFEAEAEAFFE9EAEAFFECECECFFEFEFEFFFEFEFEFFFF1F1
        F1FF848A86FFCFCFCFFFCFCFCFFFB9BBBAFF858A88FF858B87FF8B908DFF858A
        88FF858A88FF858A88FF858A88FF858A88FF858A88FF868B89FFFDFDFDFFEBEC
        ECFFEBEBEBFFEAEBEBFFEAEAEAFFECECECFFF0F0F0FFEEEEEEFF858A88FF858A
        88FF858A88FF858A88FF858A88FF858A88FF858A88FFF2F2F2FFF3F3F3FFF1F1
        F1FFF0F0F0FFF1F1F1FFEDEDEDFF878C8AFFFFFFFFFFECEDEDFFECECECFFEBEC
        ECFFEAEBEBFFEAEAEAFFEEEFEFFFF0F0F0FFEFEFEFFFF1F1F1FFF2F2F2FFF1F1
        F1FFBBBEBDFF868B89FF868B89FFF7F7F7FFEAEAEAFFE9E9E9FFE8E9E9FFE8E8
        E8FFE2E3E3FF878C8AFFFFFFFFFFEDEEEEFFEBECECFFEBEBEBFFEAEBEBFFEAEA
        EAFFE9EAEAFFECECECFFEFEFEFFFEDEDEDFFEFEFEFFFF2F2F2FFF7F7F7FF888D
        8BFF868B89FFFAFAFAFFEAEBEBFFEAEAEAFFE9EAEAFFE9E9E9FFE1E2E2FF878C
        8AFFFFFFFFFFEEEFEFFFC5C5C5FFC5C5C5FFC4C5C5FFC4C4C4FFC3C4C4FFC3C3
        C3FFCDCDCDFFDCDCDCFFDCDCDCFFF2F2F2FFF9F9F9FF888D8BFF868B89FFFDFD
        FDFFEBECECFFEBEBEBFFEAEBEBFFEAEAEAFFE2E3E3FF878C8AFFFFFFFFFFEFF0
        F0FFEEEFEFFFEEEEEEFFEDEEEEFFECEDEDFFECEDEDFFEBECECFFEBEBEBFFEFEF
        EFFFF2F2F2FFEFEFEFFFFCFCFCFF898E8CFF868B89FFFFFFFFFFECEDEDFFC7C7
        C7FFC6C7C7FFC5C6C6FFC1C1C1FF868B89FFFFFFFFFFEFF0F0FFC7C8C8FFC6C7
        C7FFC6C7C7FFC5C6C6FFC5C6C6FFC5C5C5FFC5C5C5FFEDEEEEFFEDEDEDFFF4F4
        F4FFFEFEFEFF898E8CFF868B89FFFFFFFFFFEDEEEEFFECEDEDFFECECECFFEBEC
        ECFFE4E5E4FF878C8AFFFFFFFFFFEFF0F0FFEFF0F0FFEFF0F0FFEFF0F0FFEEEF
        EFFFEEEFEFFFEDEEEEFFEDEDEDFFECEDEDFFEDEEEEFFEDEDEDFFFEFEFEFF898E
        8CFF868C8AFFFFFFFFFFEEEFEFFFC8C9C9FFC8C8C8FFC7C8C8FFC2C3C3FF868B
        89FFFFFFFFFFEFF0F0FFC6C7C7FFC6C7C7FFC6C7C7FFC6C7C7FFC6C7C7FFC5C6
        C6FFC5C5C5FFC5C5C5FFC4C5C5FFEEEEEEFFFEFEFEFF898E8CFF868C8AFFFFFF
        FFFFEFF0F0FFEEEFEFFFEEEEEEFFEDEEEEFFE5E6E6FF878C8AFFFFFFFFFFEFF0
        F0FFEEEFEFFFEEEFEFFFEEEFEFFFEEEFEFFFEEEFEFFFEEEFEFFFEDEEEEFFEDEE
        EEFFECEDEDFFEDEDEDFFFEFEFEFF898E8CFF868C8AFFFFFFFFFFEFF0F0FFCACA
        CAFFC9CACAFFC9CACAFFC3C5C5FF868B89FFFFFFFFFFEFF0F0FFC6C7C7FFC6C7
        C7FFC6C7C7FFC6C7C7FFC6C7C7FFC6C7C7FFC6C7C7FFC6C7C7FFC5C6C6FFEEEE
        EEFFFEFEFEFF898E8CFF868C8AFFFFFFFFFFEFF0F0FFEFF0F0FFEFF0F0FFEFF0
        F0FFE7E8E8FF878C8AFFFFFFFFFFEFF0F0FFEFF0F0FFEFF0F0FFEFF0F0FFEFF0
        F0FFEFF0F0FFEFF0F0FFEFF0F0FFEFF0F0FFEFF0F0FFEEEFEFFFFEFEFEFF898E
        8CFF868C8AFFFFFFFFFFEFF0F0FFCACACAFFCACACAFFCACACAFFC5C6C5FF868B
        89FFFFFFFFFFEFF0F0FFEFF0F0FFEFF0F0FFEFF0F0FFEFF0F0FFEFF0F0FFEFF0
        F0FFEFF0F0FFEFF0F0FFEFF0F0FFEFF0F0FFFEFEFEFF898E8CFF868C8AFFFFFF
        FFFFEFF0F0FFEFF0F0FFEFF0F0FFEFF0F0FFE8E9E9FF868B89FFFFFFFFFFFEFE
        FEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFE
        FEFFFEFEFEFFFEFEFEFFFFFFFFFF898E8CFF868C8AFFFFFFFFFFEFF0F0FFCACA
        CAFFCACACAFFCACACAFFC9C9C9FF959997FF898E8CFF898E8CFF898E8CFF898E
        8CFF8A8E8CFF8A8F8DFF898E8CFF898E8CFF898E8CFF898E8CFF898E8CFF898E
        8CFF898E8CFF8A8F8DFF868C8AFFFFFFFFFFEFF0F0FFEFF0F0FFEFF0F0FFEFF0
        F0FFEFF0F0FFEEEFEFFFE8E9E9FFE8E9E9FFE8E9E9FFE8E9E9FFE7E8E8FFF6F6
        F6FF8D9190FF0000000000000000000000000000000000000000000000000000
        0000868C8AFFFFFFFFFFEFF0F0FFEFF0F0FFEFF0F0FFEFF0F0FFEFF0F0FFEFF0
        F0FFEFF0F0FFEFF0F0FFEFF0F0FFEFF0F0FFEFF0F0FFFEFEFEFF8E9291FF0000
        0000000000000000000000000000000000000000000000000000858A88FFFFFF
        FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
        FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8D9190FF00000000000000000000
        0000000000000000000000000000000000008B908DFF898E8CFF898E8CFF898E
        8CFF898E8CFF898E8CFF898E8CFF898E8CFF898E8CFF898E8CFF898E8CFF898E
        8CFF898E8CFF898E8CFF8B908DFF000000000000000000000000000000000000
        00000000000000000000
      }
      ImageIndex = 0
      OnClick = actCopyExecute
    end
    object MenuItem2: TMenuItem
      Action = actCut
      Caption = 'C&ut'
      Bitmap.Data = {
        C6070000424DC607000000000000360000002800000016000000160000000100
        2000000000009007000064000000640000000000000000000000000000000000
        0000000000000000000000000000000000000000000000000000000000000000
        0000000000000000000000000000000000000000000000000000000000000000
        0000000000000000000000000000000000000000000000000000000000000000
        0000000000000000000000000000000000000000000000000000000000000000
        0000000000000000000000000000000000000000000000000000000000000000
        00000000000000000000000000000000000000000000000000000000B7FF0000
        C7FF0000CEFF0000B5FF00009EFF00000000000000000000000000009EFF0000
        C7FF0000CEFF0000CEFF0000BDFF000000000000000000000000000000000000
        00000000000000000000000000003D3DD7FF7F7FEFFF7B7BEFFF7B7BEFFF5757
        E7FF0101CEFF000094FF0000000000009DFF0101CEFF5757E7FF7B7BEFFF7B7B
        EFFF7F7FEFFF0C0CCEFF0000B5FF000000000000000000000000000000000000
        00000000CEFF7B7BE7FF3333D6FF0000CEFF0000CEFF7B7BEFFF4747E7FF0000
        BDFF000000000000BDFF6363E7FF7B7BEFFF3333D6FF0000CEFF5B5BDEFF7B7B
        E7FF0000C7FF00000000000000000000000000000000000000000000CEFF7B7B
        EFFF0000CEFF00000000000000005B5BDEFF7B7BEFFF0000CFFF000000000101
        CFFF7B7BEFFF0000CEFF00000000000000000000CEFF7B7BEFFF0000CEFF0000
        0000000000000000000000000000000000000000CEFF7373EFFF6F6FE7FF0000
        CEFF000000000000CEFF7B7BEFFF0000CEFF000000000000CEFF7B7BEFFF0000
        CEFF000000000000CEFF6F6FE7FF7373EFFF0000CEFF00000000000000000000
        00000000000000000000000000000000CEFF777BEFFF6F6FE7FF3939DFFF0000
        CEFF7B7BEFFF0000CEFF000000000000CEFF7B7BEFFF0000CEFF0808D6FF6F6F
        E7FF777BEFFF0000CEFF00000000000000000000000000000000000000000000
        000000000000000000000000CEFF4647DFFF7777EFFF5B5AEFFF5A5BEFFF5352
        DEFF9496BFFF5352DEFF5A5BEFFF7B7BEFFF7777EFFF6B6BE7FF0000CEFF0000
        0000000000000000000000000000000000000000000000000000000000000000
        000000000000000000000000CEFF090AD7FF7373CEFF5657E7FF8C8DE7FF5657
        E7FF7373CEFF090AD7FF0000CEFF000000000000000000000000000000000000
        0000000000000000000000000000000000000000000000000000000000000000
        000000000000000000008E969FFFDFDEE7FFD6D6D7FFEFEFEFFFA7A7A5FF0000
        0000000000000000000000000000000000000000000000000000000000000000
        000000000000000000000000000000000000000000000000000000000000949D
        97FFB5B7B7FFE7E7E7FFE7E7E7FFB5B7B7FFDEDEDFFFA7ADADFF000000000000
        0000000000000000000000000000000000000000000000000000000000000000
        00000000000000000000000000000000000000000000ADAFAFFFE7EFEFFFDFDF
        DFFFE7EFE7FFB7BFBDFFCFCECEFFC6C7C7FF0000000000000000000000000000
        0000000000000000000000000000000000000000000000000000000000000000
        00000000000000000000979C96FFBDBFBFFFDFDFDFFFEFEFEFFFA5A5A7FFCED6
        CFFFCECFCFFFEFEFEFFFA7AFADFF000000000000000000000000000000000000
        0000000000000000000000000000000000000000000000000000000000000000
        0000ADB5AFFFE7E7E7FFDEDEDEFFCFCECFFF00000000ADADAFFFE7E7E7FFDEDE
        DEFFE7E7E7FF878C8EFF00000000000000000000000000000000000000000000
        00000000000000000000000000000000000000000000AFB5B5FFCFCECFFFDFDF
        DFFFEFEFEFFF9DA5A5FF0000000000000000BFBDBDFFE7E7E7FFEFEFEFFFADAD
        AFFF000000000000000000000000000000000000000000000000000000000000
        0000000000000000000000000000ADB5AFFFE7E7E7FFEFEFEFFFADAFAFFF0000
        00000000000000000000ADB5AFFFEFEFEFFFDEDEDEFFEFEFEFFF000000000000
        0000000000000000000000000000000000000000000000000000000000000000
        0000959E9CFFD6D7D7FFE7E7E7FFDEDFDFFF9E9E9CFF00000000000000000000
        000000000000B7B5B5FFEFEFEFFFEFEFEFFFAFB5AFFF00000000000000000000
        00000000000000000000000000000000000000000000000000009DA5A5FFEFEF
        EFFFEFEFEFFFA7A7A5FF00000000000000000000000000000000000000008F94
        8EFFE7EFE7FFE7E7E7FFEFEFEFFF000000000000000000000000000000000000
        0000000000000000000000000000000000009C9F9EFFEFEFEFFFCFCFCFFF0000
        0000000000000000000000000000000000000000000000000000AFB5B5FFF7F7
        F7FFCFD6D6FF0000000000000000000000000000000000000000000000000000
        00000000000000000000949C96FFCFCFCEFF9DA59FFF00000000000000000000
        00000000000000000000000000000000000000000000D6D7D7FF959597FF0000
        0000000000000000000000000000000000000000000000000000000000000000
        0000000000009D9D9FFF00000000000000000000000000000000000000000000
        0000000000000000000000000000868F8DFF0000000000000000000000000000
        00000000000000000000
      }
      OnClick = actCutExecute
    end
  end
  object PopupMenu2: TPopupMenu
    left = 264
    top = 240
    object MenuItem3: TMenuItem
      Caption = 'Copy to clipboard'
      Bitmap.Data = {
        36040000424D3604000000000000360000002800000010000000100000000100
        2000000000000004000064000000640000000000000000000000865523FFB78C
        61FFB4885CFFB38659FFB38556FFB38555FFB38454FFB58656FFA87744FF9962
        2BFFBF8D55FFC28C53FFC28B52FFC28C51FFC38F52FF91581EFFB5906BFFFFFF
        FFFFFFFFF5FFFFFEEEFFFFFCE9FFFFF8E5FFFFF5DFFFFFFAE2FFF3DEBAFFC39E
        73FFFBF5E0FFFFF7E1FFFFF3DAFFFFF1D7FFFFFADFFFCF9D63FFB28C66FFFFFF
        FFFFFFF5EDFFFFF2E6FFFFF0E1FFFFEEDDFFFFEBD7FFFFEFDAFFEDD5B5FFBD98
        70FFF5EAD8FFFFECD9FFFFE8D2FFFFE5D0FFFFF0D7FFCC9962FFB4916EFFFFFF
        FFFFFFF7EFFFFFF4E7FFFFF2E3FFFFEFE0FFFFEDD9FFFFF1DDFFEDD6B8FFBD98
        70FFF5EBD9FFFFEEDAFFFFEAD3FFFFE8D1FFFFF1D9FFCB9963FFB89B7EFFFFFF
        FFFFFFF9F2FFFFF6EDFFFFF4E8FFFFF1E4FFFFEFDEFFFFF3E2FFEDD8BCFFBD99
        72FFF5ECDCFFFFF0DDFFFFEBD7FFFFE9D4FFFFF2DCFFCB9A64FFB89A7DFFFFFF
        FFFFFFFBF8FFFFF8F1FFFFF6ECFFFFF4E8FFFFF1E2FFFFF5E7FFEDDAC0FFBD9A
        74FFF5EEDFFFFFF2E1FFFFEDDAFFFFEBD7FFFFF4E0FFCB9A65FFB89A7DFFFFFF
        FFFFFFFDFBFFFFFAF6FFFFF8F1FFFFF6EDFFFFF4E7FFFFF7ECFFEDDCC4FFBD9B
        76FFF5F0E3FFFFF3E4FFFFEFDDFFFFEDDAFFFFF6E3FFCB9B66FFB89A7DFFFFFF
        FFFFFFFFFFFFFFFEFBFFFFFBF5FFFFF8F1FFFFF6ECFFFFFAF0FFEDDEC8FFBD9C
        77FFF5F0E6FFFFF5E8FFFFF0E1FFFFEFDEFFFFF8E7FFCB9C68FFB89A7DFFFFFF
        FFFFFFFFFFFFFFFFFFFFFFFDFBFFFFFAF5FFFFF7F0FFFFFCF3FFEEE3D0FFBEA2
        83FFF5F1E8FFFFF6EAFFFFF1E3FFFFF0E0FFFFF9E9FFCB9C69FFBB9F83FFFFFF
        FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3ECE1FFC0A6
        89FFF4EFE9FFFFF8EDFFFFF3E7FFFFF1E4FFFFFAEDFFCB9C6BFFAE8B6AFFF5ED
        E3FFF2EADFFFE7DCD0FFE4D7C8FFE5D9CBFFE5D9CBFFE7DBCDFFD3BFAAFFBA9E
        80FFF8F4F0FFFFF9F0FFFFF4EAFFFFF3E7FFFFFCF0FFCB9C69FF000000007A48
        20FF7C4923FFB5916DFFC4AD95FFC1A88FFFC1A88FFFC1A78DFFBEA289FFE2D6
        C9FFFFFEFBFFFFF8F0FFFFF7EDFFFFF4EAFFFFFEF3FFCEA77DFF000000000000
        000000000000DDC5ADFFFEFDFDFFFEFDFDFFFEFDFDFFFEFDFDFFFEFEFDFFFFFF
        FDFFFFFBF6FFFFFAF3FFFFF8F0FFFFF5ECFFFFFFF6FFCFB18DFF000000000000
        000000000000E0C8B2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE
        FDFFFFFCFBFFFFFBF7FFFFFAF5FFFFF7F1FFFFFFFBFFD0B38FFF000000000000
        000000000000E3CDB6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
        FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD1B592FF000000000000
        0000000000009A6E40FFBD9871FFBA946CFFBA946CFFBA946CFFBA946CFFBA94
        6CFFBA946CFFBA946BFFBA936BFFBA946BFFBD966EFF8F6032FF
      }
      OnClick = MenuItem3Click
    end
  end
  object ActionList2: TActionList
    Images = ResultsXMLImageList
    left = 168
    top = 176
    object RunAction: TAction
      Category = 'Run'
      Caption = '&Run'
      Hint = 'Run all checked test(s)'
      ImageIndex = 3
      OnExecute = RunExecute
      SecondaryShortCuts.Strings = (
        'F9'
      )
      ShortCut = 16466
    end
    object ActCloseForm: TAction
      Caption = 'Quit'
      Hint = 'Quit Testing'
      OnExecute = ActCloseFormExecute
      SecondaryShortCuts.Strings = (
        'Esc'
      )
      ShortCut = 16451
    end
    object actCopyErrorMsg: TAction
      Category = 'Edit'
      Caption = 'actCopyErrorMsg'
      ImageIndex = 0
      OnExecute = ActCopyErrorMsgExecute
      OnUpdate = actCopyErrorMsgUpdate
    end
    object ActCheckCurrentSuite: TAction
      Category = 'Selection'
      Caption = 'Check the Current Suite'
      OnExecute = ActCheckCurrentSuiteExecute
      OnUpdate = ActRunHighLightedTestUpdate
    end
    object ActUncheckCurrentSuite: TAction
      Category = 'Selection'
      Caption = 'Uncheck the Current Suite'
      OnExecute = ActUncheckCurrentSuiteExecute
      OnUpdate = ActRunHighLightedTestUpdate
    end
    object ActCheckAll: TAction
      Category = 'Selection'
      Caption = 'Check All Tests'
      OnExecute = ActCheckAllExecute
    end
    object ActUncheckAll: TAction
      Category = 'Selection'
      Caption = 'Uncheck all tests'
      OnExecute = ActUncheckAllExecute
    end
    object ActRunHighlightedTest: TAction
      Category = 'Run'
      Caption = 'Run highlighted test'
      ImageIndex = 4
      OnExecute = ActRunHighlightedTestExecute
      OnUpdate = ActRunHighLightedTestUpdate
      ShortCut = 119
    end
  end
  object PopupMenu3: TPopupMenu
    Images = ResultsXMLImageList
    left = 368
    top = 240
    object miRunTest: TMenuItem
      Action = RunAction
      Caption = '&Run all selected (checked) tests'
      ShortCutKey2 = 120
      OnClick = RunExecute
    end
    object MenuItem4: TMenuItem
      Action = ActRunHighlightedTest
      OnClick = ActRunHighlightedTestExecute
    end
    object MenuItem5: TMenuItem
      Action = ActCheckAll
      OnClick = ActCheckAllExecute
    end
    object MenuItem6: TMenuItem
      Action = ActUncheckAll
      OnClick = ActUncheckAllExecute
    end
    object MenuItem7: TMenuItem
      Action = ActCheckCurrentSuite
      OnClick = ActCheckCurrentSuiteExecute
    end
    object MenuItem8: TMenuItem
      Action = ActUncheckCurrentSuite
      OnClick = ActUncheckCurrentSuiteExecute
    end
    object miShowfailureMsg: TMenuItem
      Action = actCopyErrorMsg
      Caption = 'Copy message to clipboard'
      Bitmap.Data = {
        C6070000424DC607000000000000360000002800000016000000160000000100
        2000000000009007000064000000640000000000000000000000000000000000
        000000000000000000000000000000000000000000008A8F8DFF868B89FF868B
        89FF858A88FF858A88FF858A88FF858A88FF858A88FF848A87FF848A86FF858A
        88FF848A86FF0000000000000000000000000000000000000000000000000000
        0000000000000000000000000000868B89FFF2F2F2FFF2F2F2FFF1F1F1FFF0F0
        F0FFF1F1F1FFF4F4F4FFF7F7F7FFF6F6F6FF858A86FFB9BBBAFF858A88FF868C
        88FF000000000000000000000000000000000000000000000000000000000000
        000000000000868B89FFF7F7F7FFEAEAEAFFE9E9E9FFEDEEEEFFF1F1F1FFF1F1
        F1FFF3F3F3FFF4F4F4FF878D89FFCFCFCFFFB4B5B4FF858A88FF8F9490FF0000
        000000000000000000000000000000000000000000000000000000000000868B
        89FFFAFAFAFFEAEBEBFFEAEAEAFFE9EAEAFFECECECFFEFEFEFFFEFEFEFFFF1F1
        F1FF848A86FFCFCFCFFFCFCFCFFFB9BBBAFF858A88FF858B87FF8B908DFF858A
        88FF858A88FF858A88FF858A88FF858A88FF858A88FF868B89FFFDFDFDFFEBEC
        ECFFEBEBEBFFEAEBEBFFEAEAEAFFECECECFFF0F0F0FFEEEEEEFF858A88FF858A
        88FF858A88FF858A88FF858A88FF858A88FF858A88FFF2F2F2FFF3F3F3FFF1F1
        F1FFF0F0F0FFF1F1F1FFEDEDEDFF878C8AFFFFFFFFFFECEDEDFFECECECFFEBEC
        ECFFEAEBEBFFEAEAEAFFEEEFEFFFF0F0F0FFEFEFEFFFF1F1F1FFF2F2F2FFF1F1
        F1FFBBBEBDFF868B89FF868B89FFF7F7F7FFEAEAEAFFE9E9E9FFE8E9E9FFE8E8
        E8FFE2E3E3FF878C8AFFFFFFFFFFEDEEEEFFEBECECFFEBEBEBFFEAEBEBFFEAEA
        EAFFE9EAEAFFECECECFFEFEFEFFFEDEDEDFFEFEFEFFFF2F2F2FFF7F7F7FF888D
        8BFF868B89FFFAFAFAFFEAEBEBFFEAEAEAFFE9EAEAFFE9E9E9FFE1E2E2FF878C
        8AFFFFFFFFFFEEEFEFFFC5C5C5FFC5C5C5FFC4C5C5FFC4C4C4FFC3C4C4FFC3C3
        C3FFCDCDCDFFDCDCDCFFDCDCDCFFF2F2F2FFF9F9F9FF888D8BFF868B89FFFDFD
        FDFFEBECECFFEBEBEBFFEAEBEBFFEAEAEAFFE2E3E3FF878C8AFFFFFFFFFFEFF0
        F0FFEEEFEFFFEEEEEEFFEDEEEEFFECEDEDFFECEDEDFFEBECECFFEBEBEBFFEFEF
        EFFFF2F2F2FFEFEFEFFFFCFCFCFF898E8CFF868B89FFFFFFFFFFECEDEDFFC7C7
        C7FFC6C7C7FFC5C6C6FFC1C1C1FF868B89FFFFFFFFFFEFF0F0FFC7C8C8FFC6C7
        C7FFC6C7C7FFC5C6C6FFC5C6C6FFC5C5C5FFC5C5C5FFEDEEEEFFEDEDEDFFF4F4
        F4FFFEFEFEFF898E8CFF868B89FFFFFFFFFFEDEEEEFFECEDEDFFECECECFFEBEC
        ECFFE4E5E4FF878C8AFFFFFFFFFFEFF0F0FFEFF0F0FFEFF0F0FFEFF0F0FFEEEF
        EFFFEEEFEFFFEDEEEEFFEDEDEDFFECEDEDFFEDEEEEFFEDEDEDFFFEFEFEFF898E
        8CFF868C8AFFFFFFFFFFEEEFEFFFC8C9C9FFC8C8C8FFC7C8C8FFC2C3C3FF868B
        89FFFFFFFFFFEFF0F0FFC6C7C7FFC6C7C7FFC6C7C7FFC6C7C7FFC6C7C7FFC5C6
        C6FFC5C5C5FFC5C5C5FFC4C5C5FFEEEEEEFFFEFEFEFF898E8CFF868C8AFFFFFF
        FFFFEFF0F0FFEEEFEFFFEEEEEEFFEDEEEEFFE5E6E6FF878C8AFFFFFFFFFFEFF0
        F0FFEEEFEFFFEEEFEFFFEEEFEFFFEEEFEFFFEEEFEFFFEEEFEFFFEDEEEEFFEDEE
        EEFFECEDEDFFEDEDEDFFFEFEFEFF898E8CFF868C8AFFFFFFFFFFEFF0F0FFCACA
        CAFFC9CACAFFC9CACAFFC3C5C5FF868B89FFFFFFFFFFEFF0F0FFC6C7C7FFC6C7
        C7FFC6C7C7FFC6C7C7FFC6C7C7FFC6C7C7FFC6C7C7FFC6C7C7FFC5C6C6FFEEEE
        EEFFFEFEFEFF898E8CFF868C8AFFFFFFFFFFEFF0F0FFEFF0F0FFEFF0F0FFEFF0
        F0FFE7E8E8FF878C8AFFFFFFFFFFEFF0F0FFEFF0F0FFEFF0F0FFEFF0F0FFEFF0
        F0FFEFF0F0FFEFF0F0FFEFF0F0FFEFF0F0FFEFF0F0FFEEEFEFFFFEFEFEFF898E
        8CFF868C8AFFFFFFFFFFEFF0F0FFCACACAFFCACACAFFCACACAFFC5C6C5FF868B
        89FFFFFFFFFFEFF0F0FFEFF0F0FFEFF0F0FFEFF0F0FFEFF0F0FFEFF0F0FFEFF0
        F0FFEFF0F0FFEFF0F0FFEFF0F0FFEFF0F0FFFEFEFEFF898E8CFF868C8AFFFFFF
        FFFFEFF0F0FFEFF0F0FFEFF0F0FFEFF0F0FFE8E9E9FF868B89FFFFFFFFFFFEFE
        FEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFE
        FEFFFEFEFEFFFEFEFEFFFFFFFFFF898E8CFF868C8AFFFFFFFFFFEFF0F0FFCACA
        CAFFCACACAFFCACACAFFC9C9C9FF959997FF898E8CFF898E8CFF898E8CFF898E
        8CFF8A8E8CFF8A8F8DFF898E8CFF898E8CFF898E8CFF898E8CFF898E8CFF898E
        8CFF898E8CFF8A8F8DFF868C8AFFFFFFFFFFEFF0F0FFEFF0F0FFEFF0F0FFEFF0
        F0FFEFF0F0FFEEEFEFFFE8E9E9FFE8E9E9FFE8E9E9FFE8E9E9FFE7E8E8FFF6F6
        F6FF8D9190FF0000000000000000000000000000000000000000000000000000
        0000868C8AFFFFFFFFFFEFF0F0FFEFF0F0FFEFF0F0FFEFF0F0FFEFF0F0FFEFF0
        F0FFEFF0F0FFEFF0F0FFEFF0F0FFEFF0F0FFEFF0F0FFFEFEFEFF8E9291FF0000
        0000000000000000000000000000000000000000000000000000858A88FFFFFF
        FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
        FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8D9190FF00000000000000000000
        0000000000000000000000000000000000008B908DFF898E8CFF898E8CFF898E
        8CFF898E8CFF898E8CFF898E8CFF898E8CFF898E8CFF898E8CFF898E8CFF898E
        8CFF898E8CFF898E8CFF8B908DFF000000000000000000000000000000000000
        00000000000000000000
      }
      OnClick = ActCopyErrorMsgExecute
    end
  end
  object SynXMLSyn1: TSynXMLSyn
    DefaultFilter = 'XML Document (*.xml,*.xsd,*.xsl,*.xslt,*.dtd)|*.xml;*.xsd;*.xsl;*.xslt;*.dtd'
    Enabled = False
    ElementAttri.FrameEdges = sfeAround
    AttributeAttri.FrameEdges = sfeAround
    NamespaceAttributeAttri.FrameEdges = sfeAround
    AttributeValueAttri.FrameEdges = sfeAround
    NamespaceAttributeValueAttri.FrameEdges = sfeAround
    TextAttri.FrameEdges = sfeAround
    CDATAAttri.FrameEdges = sfeAround
    EntityRefAttri.FrameEdges = sfeAround
    ProcessingInstructionAttri.FrameEdges = sfeAround
    CommentAttri.FrameEdges = sfeAround
    DocTypeAttri.FrameEdges = sfeAround
    SpaceAttri.FrameEdges = sfeAround
    SymbolAttri.FrameEdges = sfeAround
    WantBracesParsed = False
    left = 80
    top = 176
  end
  object ilNodeStates: TImageList
    left = 264
    top = 304
    Bitmap = {
      4C69020000001000000010000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
      FFFFFFFFFFFFFFFFFFFF00000000FFFFFFFF000000FF000000FF000000FF0000
      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
      00FF000000FFFFFFFFFF00000000FFFFFFFF000000FF000000FF000000FF0000
      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
      00FF000000FFFFFFFFFF00000000FFFFFFFF000000FF000000FFFFFFFFFFFFFF
      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000
      00FF000000FFFFFFFFFF00000000FFFFFFFF000000FF000000FFFFFFFFFFFFFF
      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000
      00FF000000FFFFFFFFFF00000000FFFFFFFF000000FF000000FFFFFFFFFFFFFF
      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000
      00FF000000FFFFFFFFFF00000000FFFFFFFF000000FF000000FFFFFFFFFFFFFF
      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000
      00FF000000FFFFFFFFFF00000000FFFFFFFF000000FF000000FFFFFFFFFFFFFF
      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000
      00FF000000FFFFFFFFFF00000000FFFFFFFF000000FF000000FFFFFFFFFFFFFF
      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000
      00FF000000FFFFFFFFFF00000000FFFFFFFF000000FF000000FFFFFFFFFFFFFF
      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000
      00FF000000FFFFFFFFFF00000000FFFFFFFF000000FF000000FFFFFFFFFFFFFF
      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000
      00FF000000FFFFFFFFFF00000000FFFFFFFF000000FF000000FFFFFFFFFFFFFF
      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000
      00FF000000FFFFFFFFFF00000000FFFFFFFF000000FF000000FF000000FF0000
      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
      00FF000000FFFFFFFFFF00000000FFFFFFFF000000FF000000FF000000FF0000
      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
      00FF000000FFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
      FFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
      FFFFFFFFFFFFFFFFFFFF00000000FFFFFFFF000000FF000000FF000000FF0000
      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
      00FF000000FFFFFFFFFF00000000FFFFFFFF000000FF000000FF000000FF0000
      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
      00FF000000FFFFFFFFFF00000000FFFFFFFF000000FF000000FFFFFFFFFFFFFF
      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000
      00FF000000FFFFFFFFFF00000000FFFFFFFF000000FF000000FFFFFFFFFFFFFF
      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFF0000
      00FF000000FFFFFFFFFF00000000FFFFFFFF000000FF000000FFFFFFFFFFFFFF
      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FF000000FFFFFFFFFF0000
      00FF000000FFFFFFFFFF00000000FFFFFFFF000000FF000000FFFFFFFFFF0000
      00FFFFFFFFFFFFFFFFFFFFFFFFFF000000FF000000FF000000FFFFFFFFFF0000
      00FF000000FFFFFFFFFF00000000FFFFFFFF000000FF000000FFFFFFFFFF0000
      00FF000000FFFFFFFFFF000000FF000000FF000000FFFFFFFFFFFFFFFFFF0000
      00FF000000FFFFFFFFFF00000000FFFFFFFF000000FF000000FFFFFFFFFF0000
      00FF000000FF000000FF000000FF000000FFFFFFFFFFFFFFFFFFFFFFFFFF0000
      00FF000000FFFFFFFFFF00000000FFFFFFFF000000FF000000FFFFFFFFFFFFFF
      FFFF000000FF000000FF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000
      00FF000000FFFFFFFFFF00000000FFFFFFFF000000FF000000FFFFFFFFFFFFFF
      FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000
      00FF000000FFFFFFFFFF00000000FFFFFFFF000000FF000000FFFFFFFFFFFFFF
      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000
      00FF000000FFFFFFFFFF00000000FFFFFFFF000000FF000000FF000000FF0000
      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
      00FF000000FFFFFFFFFF00000000FFFFFFFF000000FF000000FF000000FF0000
      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
      00FF000000FFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
      FFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000
      0000000000000000000000000000000000000000000000000000000000000000
      0000000000000000000000000000
    }
  end
  object SaveDialog: TSaveDialog
    DefaultExt = '.xml'
    Filter = 'XML file|.xml'
    FilterIndex = 0
    left = 80
    top = 240
  end
end
guitestrunner.lfm (109,656 bytes)   

Juha Manninen

2015-04-07 17:08

developer   ~0082697

> ... so I cannot make the patch ...
Yes you can. I wrote the syntax for you earlier. Here it is again :
 $ svn diff /components/fpcunit/guitestrunner.lfm /components/fpcunit/guitestrunner.pas > guitestrunner.patch

Wiki instructions :
  http://wiki.freepascal.org/Creating_A_Patch

Serguei Tarassov

2015-04-08 14:43

reporter   ~0082713

Juha, suppose that I know to use diff :)

Is it not more simple to "replace and commit" with these 2 files instead to "apply the patch and commit" ?

Serguei Tarassov

2015-04-08 14:53

reporter   ~0082714

I precise: these 2 files are of trunk, they merged manually with my modifications of 1.2.6 and then I changed some code.
So the diff is against the 48679 version of trunk...

Serguei Tarassov

2015-04-08 14:53

reporter  

guitestrunner.pas.48679.patch (3,317 bytes)   
Index: /home/serge/Projects/lazarus/trunk/components/fpcunit/guitestrunner.pas
===================================================================
--- /home/serge/Projects/lazarus/trunk/components/fpcunit/guitestrunner.pas	(revision 48679)
+++ /home/serge/Projects/lazarus/trunk/components/fpcunit/guitestrunner.pas	(working copy)
@@ -20,6 +20,7 @@
     Graeme Geldenhuys <graemeg@gmail.com>
     Darius Blaszijk <dhkblaszyk@zeelandnet.nl>
     Reinier Olislagers <reinierolislagers@gmail.com>
+    Serguei Tarassov <serge@arbinada.com>
 }
 
 unit GuiTestRunner;
@@ -121,6 +122,7 @@
     FINI: TINIFile;
     procedure BuildTree(rootNode: TTreeNode; aSuite: TTestSuite);
     function  FindNode(aTest: TTest): TTreeNode;
+    function MakeTestPath(Node: TTreeNode): string;
     procedure ResetNodeColors;
     procedure PaintNodeError(aNode: TTreeNode);
     procedure PaintNodeFailure(aNode: TTreeNode);
@@ -129,6 +131,8 @@
     procedure PaintNodeBusy(aNode: TTreeNode);
     procedure MemoLog(LogEntry: string);
     procedure EnableRunActions(AValue: boolean);
+    procedure RestoreTree;
+    procedure SaveTree;
   public
     procedure AddFailure(ATest: TTest; AFailure: TTestFailure);
     procedure AddError(ATest: TTest; AError: TTestFailure);
@@ -173,7 +177,7 @@
   sactCheckAll = 'Check all Tests';
   sactUncheckAll = 'Uncheck all tests';
   sactRunHighlightedTest = 'Run highlighted test';
-  smiRunTest = '  &Run all selected (checked) tests';
+  smiRunTest = '&Run all selected (checked) tests';
   smiShowfail= 'Copy message to clipboard';
   smiCopy = '&Copy';
   smiCut = 'C&ut';
@@ -186,6 +190,7 @@
 uses
   xmlwrite
   ;
+
 const
   // TestTreeImageList indexes:
   imgGreenBall = 0; //success result
@@ -236,12 +241,42 @@
   XMLSynEdit.Lines.Clear;
 end;
 
+function TGUITestRunner.MakeTestPath(Node: TTreeNode): string;
+begin
+  Result := '';
+  while Node <> nil do
+  begin
+    Result := Node.Text + '_' + Result;
+    Node := Node.Parent;
+  end;
+end;
+
+procedure TGUITestRunner.SaveTree;
+var
+  i: integer;
+begin
+  for i := 0 to TestTree.Items.Count - 1 do
+    FINI.WriteBool('Tests', MakeTestPath(TestTree.Items[i]), TestTree.Items[i].StateIndex = Ord(tsChecked));
+end;
+
+procedure TGUITestRunner.RestoreTree;
+var
+  i: integer;
+begin
+  for i := 0 to TestTree.Items.Count - 1 do
+    if FINI.ReadBool('Tests', MakeTestPath(TestTree.Items[i]), true) then
+      TestTree.Items[i].StateIndex := Ord(tsChecked)
+    else
+      TestTree.Items[i].StateIndex := Ord(tsUnChecked);
+end;
+
 procedure TGUITestRunner.GUITestRunnerCreate(Sender: TObject);
 begin
   barColor := clGreen;
   TestTree.Items.Clear;
   BuildTree(TestTree.Items.AddObject(nil, rsAllTests, GetTestRegistry),
     GetTestRegistry);
+  RestoreTree;
   PageControl1.ActivePage := tsTestTree;
   //
   BtnRun.Caption:= sbtnRun;
@@ -272,7 +307,7 @@
     TestTree.Items[0].Expand(False);
   end;
 
-  FINI := TINIFile.Create(ExtractFileNameOnly(ParamStr(0))+ '.ini');
+  FINI := TINIFile.Create(ExtractFileNameOnly(ParamStr(0)) + '.fpcunit.ini'); // Prevent ini file names conflict if tests are embedded in application
 end;
 
 procedure TGUITestRunner.RunExecute(Sender: TObject);
@@ -820,6 +855,7 @@
   m: TMemoryStream;
 
 begin
+  SaveTree;
   barcolor := clGreen;
   ResetNodeColors;
   failureCounter := 0;
guitestrunner.pas.48679.patch (3,317 bytes)   

Serguei Tarassov

2015-04-08 14:53

reporter  

guitestrunner.lfm.48679.patch (1,428 bytes)   
Index: /home/serge/Projects/lazarus/trunk/components/fpcunit/guitestrunner.lfm
===================================================================
--- /home/serge/Projects/lazarus/trunk/components/fpcunit/guitestrunner.lfm	(revision 48679)
+++ /home/serge/Projects/lazarus/trunk/components/fpcunit/guitestrunner.lfm	(working copy)
@@ -1850,16 +1850,22 @@
     top = 176
     object RunAction: TAction
       Category = 'Run'
-      Caption = '  &Run'
+      Caption = '&Run'
       Hint = 'Run all checked test(s)'
       ImageIndex = 3
       OnExecute = RunExecute
+      SecondaryShortCuts.Strings = (
+        'F9'
+      )
       ShortCut = 16466
     end
     object ActCloseForm: TAction
       Caption = 'Quit'
       Hint = 'Quit Testing'
       OnExecute = ActCloseFormExecute
+      SecondaryShortCuts.Strings = (
+        'Esc'
+      )
       ShortCut = 16451
     end
     object actCopyErrorMsg: TAction
@@ -1897,6 +1903,7 @@
       ImageIndex = 4
       OnExecute = ActRunHighlightedTestExecute
       OnUpdate = ActRunHighLightedTestUpdate
+      ShortCut = 119
     end
   end
   object PopupMenu3: TPopupMenu
@@ -1905,7 +1912,8 @@
     top = 240
     object miRunTest: TMenuItem
       Action = RunAction
-      Caption = '  &Run all selected (checked) tests'
+      Caption = '&Run all selected (checked) tests'
+      ShortCutKey2 = 120
       OnClick = RunExecute
     end
     object MenuItem4: TMenuItem
guitestrunner.lfm.48679.patch (1,428 bytes)   

Juha Manninen

2015-04-08 21:44

developer   ~0082723

Last edited: 2015-04-08 21:45

View 2 revisions

This time I was able to apply your patches using "patch -p6".
Your code does not work at all. A new unit test application crashes immediately. I think you have not tested your code!
Does not look very good. :(

Serguei Tarassov

2015-04-09 09:40

reporter   ~0082733

Juha,
as you can read in header of this issue, I'm working with modified version every day. And you can read also that I'm working with 1.2.6 (first 2 patches are attached for it).

If you need my code working in trunk, please, do a little effort and adapt it yourself.

Juha Manninen

2015-04-09 10:09

developer   ~0082737

Dear s_tarassov, if you want to participate in Lazarus development you must use the development version (trunk) from SVN. It is not a matter of preference or matter of opinion, all development by definition happens in trunk.

Basically there are just 2 rules for contributors :
1. Use SVN trunk.
2. Create patches against it.

There are clear instructions for both :
 http://wiki.freepascal.org/Getting_Lazarus
 http://wiki.freepascal.org/Creating_A_Patch

Serguei Tarassov

2015-04-09 10:56

reporter  

guitestrunner.lfm.48684.patch (1,428 bytes)   
Index: /home/serge/Projects/lazarus/trunk/components/fpcunit/guitestrunner.lfm
===================================================================
--- /home/serge/Projects/lazarus/trunk/components/fpcunit/guitestrunner.lfm	(revision 48684)
+++ /home/serge/Projects/lazarus/trunk/components/fpcunit/guitestrunner.lfm	(working copy)
@@ -1850,16 +1850,22 @@
     top = 176
     object RunAction: TAction
       Category = 'Run'
-      Caption = '  &Run'
+      Caption = '&Run'
       Hint = 'Run all checked test(s)'
       ImageIndex = 3
       OnExecute = RunExecute
+      SecondaryShortCuts.Strings = (
+        'F9'
+      )
       ShortCut = 16466
     end
     object ActCloseForm: TAction
       Caption = 'Quit'
       Hint = 'Quit Testing'
       OnExecute = ActCloseFormExecute
+      SecondaryShortCuts.Strings = (
+        'Esc'
+      )
       ShortCut = 16451
     end
     object actCopyErrorMsg: TAction
@@ -1897,6 +1903,7 @@
       ImageIndex = 4
       OnExecute = ActRunHighlightedTestExecute
       OnUpdate = ActRunHighLightedTestUpdate
+      ShortCut = 119
     end
   end
   object PopupMenu3: TPopupMenu
@@ -1905,7 +1912,8 @@
     top = 240
     object miRunTest: TMenuItem
       Action = RunAction
-      Caption = '  &Run all selected (checked) tests'
+      Caption = '&Run all selected (checked) tests'
+      ShortCutKey2 = 120
       OnClick = RunExecute
     end
     object MenuItem4: TMenuItem
guitestrunner.lfm.48684.patch (1,428 bytes)   

Serguei Tarassov

2015-04-09 10:56

reporter  

guitestrunner.pas.48684.patch (4,916 bytes)   
Index: /home/serge/Projects/lazarus/trunk/components/fpcunit/guitestrunner.pas
===================================================================
--- /home/serge/Projects/lazarus/trunk/components/fpcunit/guitestrunner.pas	(revision 48684)
+++ /home/serge/Projects/lazarus/trunk/components/fpcunit/guitestrunner.pas	(working copy)
@@ -20,6 +20,7 @@
     Graeme Geldenhuys <graemeg@gmail.com>
     Darius Blaszijk <dhkblaszyk@zeelandnet.nl>
     Reinier Olislagers <reinierolislagers@gmail.com>
+    Serguei Tarassov <serge@arbinada.com>
 }
 
 unit GuiTestRunner;
@@ -118,9 +119,10 @@
     barColor: TColor;
     testSuite: TTest;
     FFirstFailure: TTreeNode; // reference to first failed test
-    FINI: TINIFile;
+    FConfStore: TIniFile;
     procedure BuildTree(rootNode: TTreeNode; aSuite: TTestSuite);
     function  FindNode(aTest: TTest): TTreeNode;
+    function MakeTestPath(Node: TTreeNode): string;
     procedure ResetNodeColors;
     procedure PaintNodeError(aNode: TTreeNode);
     procedure PaintNodeFailure(aNode: TTreeNode);
@@ -129,6 +131,8 @@
     procedure PaintNodeBusy(aNode: TTreeNode);
     procedure MemoLog(LogEntry: string);
     procedure EnableRunActions(AValue: boolean);
+    procedure RestoreTree;
+    procedure SaveTree;
   public
     procedure AddFailure(ATest: TTest; AFailure: TTestFailure);
     procedure AddError(ATest: TTest; AError: TTestFailure);
@@ -173,7 +177,7 @@
   sactCheckAll = 'Check all Tests';
   sactUncheckAll = 'Uncheck all tests';
   sactRunHighlightedTest = 'Run highlighted test';
-  smiRunTest = '  &Run all selected (checked) tests';
+  smiRunTest = '&Run all selected (checked) tests';
   smiShowfail= 'Copy message to clipboard';
   smiCopy = '&Copy';
   smiCut = 'C&ut';
@@ -186,6 +190,7 @@
 uses
   xmlwrite
   ;
+
 const
   // TestTreeImageList indexes:
   imgGreenBall = 0; //success result
@@ -236,12 +241,43 @@
   XMLSynEdit.Lines.Clear;
 end;
 
+function TGUITestRunner.MakeTestPath(Node: TTreeNode): string;
+begin
+  Result := '';
+  while Node <> nil do
+  begin
+    Result := Node.Text + '_' + Result;
+    Node := Node.Parent;
+  end;
+end;
+
+procedure TGUITestRunner.SaveTree;
+var
+  i: integer;
+begin
+  for i := 0 to TestTree.Items.Count - 1 do
+    FConfStore.WriteBool('Tests', MakeTestPath(TestTree.Items[i]), TestTree.Items[i].StateIndex = Ord(tsChecked));
+end;
+
+procedure TGUITestRunner.RestoreTree;
+var
+  i: integer;
+begin
+  for i := 0 to TestTree.Items.Count - 1 do
+    if FConfStore.ReadBool('Tests', MakeTestPath(TestTree.Items[i]), true) then
+      TestTree.Items[i].StateIndex := Ord(tsChecked)
+    else
+      TestTree.Items[i].StateIndex := Ord(tsUnChecked);
+end;
+
 procedure TGUITestRunner.GUITestRunnerCreate(Sender: TObject);
 begin
+  FConfStore := TIniFile.Create(ExtractFileNameOnly(ParamStr(0)) + '.fpcunit.ini'); // Prevent ini file names conflict if tests are embedded in application
   barColor := clGreen;
   TestTree.Items.Clear;
   BuildTree(TestTree.Items.AddObject(nil, rsAllTests, GetTestRegistry),
     GetTestRegistry);
+  RestoreTree;
   PageControl1.ActivePage := tsTestTree;
   //
   BtnRun.Caption:= sbtnRun;
@@ -271,8 +307,6 @@
     TestTree.Items.SelectOnlyThis(TestTree.Items[0]);
     TestTree.Items[0].Expand(False);
   end;
-
-  FINI := TINIFile.Create(ExtractFileNameOnly(ParamStr(0))+ '.ini');
 end;
 
 procedure TGUITestRunner.RunExecute(Sender: TObject);
@@ -349,11 +383,11 @@
 procedure TGUITestRunner.FormDestroy(Sender: TObject);
 begin
   // store window position and size
-  FINI.WriteInteger('WindowState', 'Left', Left);
-  FINI.WriteInteger('WindowState', 'Top', Top);
-  FINI.WriteInteger('WindowState', 'Width', Width);
-  FINI.WriteInteger('WindowState', 'Height', Height);
-  FINI.Free;
+  FConfStore.WriteInteger('WindowState', 'Left', Left);
+  FConfStore.WriteInteger('WindowState', 'Top', Top);
+  FConfStore.WriteInteger('WindowState', 'Width', Width);
+  FConfStore.WriteInteger('WindowState', 'Height', Height);
+  FConfStore.Free;
 end;
 
 procedure TGUITestRunner.GUITestRunnerShow(Sender: TObject);
@@ -361,10 +395,10 @@
   if (ParamStrUTF8(1) = '--now') or (ParamStrUTF8(1) = '-n') then
     RunExecute(Self);
   // restore last used position and size
-  Left := FINI.ReadInteger('WindowState', 'Left', Left);
-  Top := FINI.ReadInteger('WindowState', 'Top', Top);
-  Width := FINI.ReadInteger('WindowState', 'Width', Width);
-  Height := FINI.ReadInteger('WindowState', 'Height', Height);
+  Left := FConfStore.ReadInteger('WindowState', 'Left', Left);
+  Top := FConfStore.ReadInteger('WindowState', 'Top', Top);
+  Width := FConfStore.ReadInteger('WindowState', 'Width', Width);
+  Height := FConfStore.ReadInteger('WindowState', 'Height', Height);
 end;
 
 procedure TGUITestRunner.MenuItem3Click(Sender: TObject);
@@ -820,6 +854,7 @@
   m: TMemoryStream;
 
 begin
+  SaveTree;
   barcolor := clGreen;
   ResetNodeColors;
   failureCounter := 0;
guitestrunner.pas.48684.patch (4,916 bytes)   

Serguei Tarassov

2015-04-09 10:57

reporter   ~0082738

Patches against 48684 added

Juha Manninen

2015-04-09 15:58

developer   ~0082752

Applied, thanks.

I still had to use "patch -p6" to apply it.
I don't know why you still made two separate patches although I explained how to make just one.

Issue History

Date Modified Username Field Change
2015-04-01 11:03 Serguei Tarassov New Issue
2015-04-01 20:12 Juha Manninen Note Added: 0082536
2015-04-03 11:02 Serguei Tarassov File Added: guitestrunner.lfm.patch
2015-04-03 11:03 Serguei Tarassov File Added: guitestrunner.pas.patch
2015-04-03 11:05 Serguei Tarassov Note Added: 0082561
2015-04-03 11:10 Juha Manninen Assigned To => Juha Manninen
2015-04-03 11:10 Juha Manninen Status new => assigned
2015-04-06 11:07 Juha Manninen LazTarget => -
2015-04-06 11:07 Juha Manninen Note Added: 0082651
2015-04-06 11:07 Juha Manninen Status assigned => feedback
2015-04-06 11:11 Juha Manninen Note Edited: 0082651 View Revisions
2015-04-06 11:13 Juha Manninen Note Edited: 0082651 View Revisions
2015-04-07 12:18 Serguei Tarassov Note Added: 0082688
2015-04-07 12:18 Serguei Tarassov Status feedback => assigned
2015-04-07 13:23 Zeljan Rikalo Note Added: 0082690
2015-04-07 13:57 Juha Manninen Note Added: 0082691
2015-04-07 15:28 Serguei Tarassov Note Added: 0082696
2015-04-07 15:29 Serguei Tarassov File Added: guitestrunner.pas
2015-04-07 15:29 Serguei Tarassov File Added: guitestrunner.lfm
2015-04-07 17:08 Juha Manninen Note Added: 0082697
2015-04-08 14:43 Serguei Tarassov Note Added: 0082713
2015-04-08 14:53 Serguei Tarassov Note Added: 0082714
2015-04-08 14:53 Serguei Tarassov File Added: guitestrunner.pas.48679.patch
2015-04-08 14:53 Serguei Tarassov File Added: guitestrunner.lfm.48679.patch
2015-04-08 21:44 Juha Manninen Note Added: 0082723
2015-04-08 21:45 Juha Manninen Note Edited: 0082723 View Revisions
2015-04-09 09:40 Serguei Tarassov Note Added: 0082733
2015-04-09 10:09 Juha Manninen Note Added: 0082737
2015-04-09 10:56 Serguei Tarassov File Added: guitestrunner.lfm.48684.patch
2015-04-09 10:56 Serguei Tarassov File Added: guitestrunner.pas.48684.patch
2015-04-09 10:57 Serguei Tarassov Note Added: 0082738
2015-04-09 15:58 Juha Manninen Fixed in Revision => r48686
2015-04-09 15:58 Juha Manninen Note Added: 0082752
2015-04-09 15:58 Juha Manninen Status assigned => resolved
2015-04-09 15:58 Juha Manninen Resolution open => fixed