Index: /tags/1.1.0/Forms/UFormAbout.lfm
===================================================================
--- /tags/1.1.0/Forms/UFormAbout.lfm	(revision 137)
+++ /tags/1.1.0/Forms/UFormAbout.lfm	(revision 137)
@@ -0,0 +1,103 @@
+object FormAbout: TFormAbout
+  Left = 1014
+  Height = 358
+  Top = 442
+  Width = 564
+  Caption = 'About'
+  ClientHeight = 358
+  ClientWidth = 564
+  OnCreate = FormCreate
+  OnShow = FormShow
+  Position = poScreenCenter
+  LCLVersion = '1.6.0.4'
+  object LabelDescription: TLabel
+    Left = 20
+    Height = 72
+    Top = 110
+    Width = 524
+    Align = alTop
+    BorderSpacing.Around = 20
+    Caption = 'Turn-based strategy game inspired by classic Risk board game. The game is highly configurable to allow to adjust battle field and game rules.'
+    ParentColor = False
+    WordWrap = True
+  end
+  object ButtonClose: TButton
+    Left = 451
+    Height = 25
+    Top = 318
+    Width = 93
+    Anchors = [akRight, akBottom]
+    Caption = 'Close'
+    ModalResult = 1
+    TabOrder = 0
+  end
+  object LabelContent: TLabel
+    Left = 20
+    Height = 24
+    Top = 202
+    Width = 524
+    Align = alTop
+    BorderSpacing.Around = 20
+    Caption = '   '
+    ParentColor = False
+  end
+  object ButtonHomePage: TButton
+    Left = 16
+    Height = 25
+    Top = 318
+    Width = 176
+    Anchors = [akLeft, akBottom]
+    Caption = 'Home page'
+    OnClick = ButtonHomePageClick
+    TabOrder = 1
+  end
+  object Panel1: TPanel
+    Left = 0
+    Height = 90
+    Top = 0
+    Width = 564
+    Align = alTop
+    BevelOuter = bvNone
+    ClientHeight = 90
+    ClientWidth = 564
+    FullRepaint = False
+    TabOrder = 2
+    object LabelAppName: TLabel
+      Left = 96
+      Height = 55
+      Top = 20
+      Width = 144
+      Align = alCustom
+      BorderSpacing.Around = 20
+      Caption = 'xTactics'
+      Font.Height = -40
+      ParentColor = False
+      ParentFont = False
+      WordWrap = True
+    end
+    object Image1: TImage
+      Left = 16
+      Height = 66
+      Top = 20
+      Width = 66
+      Picture.Data = {
+        1754506F727461626C654E6574776F726B47726170686963CF01000089504E47
+        0D0A1A0A0000000D49484452000000400000004008030000009DB781EC000000
+        0F504C54450000000000000000FFF9042CFFFFFFF07F75380000000174524E53
+        0040E6D8660000016E49444154789CADD6590EC3200C04D01473FF33774BC0CB
+        8C3169F98A22CF2B181A711CC9789C23AB29C46F120F377E8C6F1233D45F639B
+        B0F16D22C6B7081C2F133C5E22F2F89258C78DE089529CCFE27A25E760E1760E
+        474C5372A179E043E8C94B2A8C7C330BD16B974C681A98C4A15B2789D01C7011
+        87EEBC70A145E04B704068BE0A08CB738009240F002CB03C029040F3108802CF
+        63C00B499E00A9D02B4022F41A40055F47012284320E40215625001040510604
+        01D50060D6B570A22E3903E64C5F4F58D0560066AF3E4F4830B3C1401B0F4090
+        1CB8847172BCE0DA819AE8868091EE4241E839B014FA0A081F609E6727D1FFFF
+        69BE007C5F6C02E0FBB1B50490A7C2721B417EB58D23197B301C000C42FDB2DF
+        0535131577170C33737B0ECC5A665C016FC2AE5C9F44DB0D77575384EDFD9C81
+        DD8F78D59B2FECB7F3EA817E2712E27FB868D6091AFFC3657B4D2CE339518A73
+        A21CC7C4563C12DB714BDC8A236233EE891B714D64354F08C023531B730D1E00
+        00000049454E44AE426082
+      }
+    end
+  end
+end
Index: /tags/1.1.0/Forms/UFormAbout.lrt
===================================================================
--- /tags/1.1.0/Forms/UFormAbout.lrt	(revision 137)
+++ /tags/1.1.0/Forms/UFormAbout.lrt	(revision 137)
@@ -0,0 +1,6 @@
+TFORMABOUT.CAPTION=About
+TFORMABOUT.LABELDESCRIPTION.CAPTION=Turn-based strategy game inspired by classic Risk board game. The game is highly configurable to allow to adjust battle field and game rules.
+TFORMABOUT.BUTTONCLOSE.CAPTION=Close
+TFORMABOUT.LABELCONTENT.CAPTION=   
+TFORMABOUT.BUTTONHOMEPAGE.CAPTION=Home page
+TFORMABOUT.LABELAPPNAME.CAPTION=xTactics
Index: /tags/1.1.0/Forms/UFormAbout.pas
===================================================================
--- /tags/1.1.0/Forms/UFormAbout.pas	(revision 137)
+++ /tags/1.1.0/Forms/UFormAbout.pas	(revision 137)
@@ -0,0 +1,70 @@
+unit UFormAbout;
+
+{$mode delphi}
+
+interface
+
+uses
+  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, Menus,
+  StdCtrls, ExtCtrls, UApplicationInfo, UCommon;
+
+type
+
+  { TFormAbout }
+
+  TFormAbout = class(TForm)
+    ButtonHomePage: TButton;
+    ButtonClose: TButton;
+    Image1: TImage;
+    LabelAppName: TLabel;
+    LabelDescription: TLabel;
+    LabelContent: TLabel;
+    Panel1: TPanel;
+    procedure ButtonHomePageClick(Sender: TObject);
+    procedure FormCreate(Sender: TObject);
+    procedure FormShow(Sender: TObject);
+  private
+    { private declarations }
+  public
+    { public declarations }
+  end;
+
+var
+  FormAbout: TFormAbout;
+
+implementation
+
+{$R *.lfm}
+
+uses
+  UCore;
+
+resourcestring
+  SVersion = 'Version';
+  SReleaseDate = 'Release date';
+  SLicense = 'License';
+
+{ TFormAbout }
+
+procedure TFormAbout.FormShow(Sender: TObject);
+begin
+  with Core do begin
+    LabelAppName.Caption := ApplicationInfo.AppName;
+    LabelContent.Caption := SVersion + ': ' + ApplicationInfo.Version + LineEnding +
+      SReleaseDate + ': ' + DateToStr(ApplicationInfo.ReleaseDate) + LineEnding +
+      SLicense + ': ' + ApplicationInfo.License;
+  end;
+end;
+
+procedure TFormAbout.ButtonHomePageClick(Sender: TObject);
+begin
+  OpenWebPage(Core.ApplicationInfo.HomePage);
+end;
+
+procedure TFormAbout.FormCreate(Sender: TObject);
+begin
+  Core.CoolTranslator1.TranslateComponentRecursive(Self);
+end;
+
+end.
+
Index: /tags/1.1.0/Forms/UFormCharts.lfm
===================================================================
--- /tags/1.1.0/Forms/UFormCharts.lfm	(revision 137)
+++ /tags/1.1.0/Forms/UFormCharts.lfm	(revision 137)
@@ -0,0 +1,53 @@
+object FormCharts: TFormCharts
+  Left = 562
+  Height = 709
+  Top = 333
+  Width = 944
+  Caption = 'Charts'
+  ClientHeight = 709
+  ClientWidth = 944
+  OnClose = FormClose
+  OnShow = FormShow
+  LCLVersion = '1.6.4.0'
+  object Chart1: TChart
+    Left = 8
+    Height = 648
+    Top = 56
+    Width = 932
+    AxisList = <    
+      item
+        Minors = <>
+        Title.LabelFont.Orientation = 900
+      end    
+      item
+        Alignment = calBottom
+        Minors = <>
+      end>
+    Foot.Brush.Color = clBtnFace
+    Foot.Font.Color = clBlue
+    Title.Brush.Color = clBtnFace
+    Title.Font.Color = clBlue
+    Title.Text.Strings = (
+      'TAChart'
+    )
+    Anchors = [akTop, akLeft, akRight, akBottom]
+  end
+  object ComboBox1: TComboBox
+    Left = 24
+    Height = 34
+    Top = 8
+    Width = 392
+    ItemHeight = 0
+    ItemIndex = 0
+    Items.Strings = (
+      'Occupied cells'
+      'Military power'
+      'Discovered cells'
+      'Cities count'
+    )
+    OnChange = ComboBox1Change
+    Style = csDropDownList
+    TabOrder = 1
+    Text = 'Occupied cells'
+  end
+end
Index: /tags/1.1.0/Forms/UFormCharts.lrt
===================================================================
--- /tags/1.1.0/Forms/UFormCharts.lrt	(revision 137)
+++ /tags/1.1.0/Forms/UFormCharts.lrt	(revision 137)
@@ -0,0 +1,2 @@
+TFORMCHARTS.CAPTION=Charts
+TFORMCHARTS.COMBOBOX1.TEXT=Occupied cells
Index: /tags/1.1.0/Forms/UFormCharts.pas
===================================================================
--- /tags/1.1.0/Forms/UFormCharts.pas	(revision 137)
+++ /tags/1.1.0/Forms/UFormCharts.pas	(revision 137)
@@ -0,0 +1,103 @@
+unit UFormCharts;
+
+{$mode delphi}
+
+interface
+
+uses
+  Classes, SysUtils, FileUtil, TAGraph, TASeries, Forms, Controls, Graphics,
+  Dialogs, StdCtrls, LMessages;
+
+type
+
+  { TFormCharts }
+
+  TFormCharts = class(TForm)
+    Chart1: TChart;
+    ComboBox1: TComboBox;
+    procedure ComboBox1Change(Sender: TObject);
+    procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
+    procedure FormShow(Sender: TObject);
+  private
+    { private declarations }
+  public
+    procedure Redraw;
+    procedure Translate;
+  end;
+
+var
+  FormCharts: TFormCharts;
+
+implementation
+
+{$R *.lfm}
+
+uses
+  UCore, UGame;
+
+resourcestring
+  SOccupiedCells = 'Occupied cells';
+  SMilitaryPower = 'Military power';
+  SDiscoveredCells = 'Discovered cells';
+  SCitiesCount = 'Cities count';
+
+
+{ TFormCharts }
+
+procedure TFormCharts.ComboBox1Change(Sender: TObject);
+begin
+  Redraw;
+end;
+
+procedure TFormCharts.FormClose(Sender: TObject; var CloseAction: TCloseAction);
+begin
+  Core.PersistentForm.Save(Self);
+end;
+
+procedure TFormCharts.FormShow(Sender: TObject);
+begin
+  Core.PersistentForm.Load(Self);
+  if (ComboBox1.ItemIndex = -1) and (ComboBox1.Items.Count > 0) then
+    ComboBox1.ItemIndex := 0;
+  Redraw;
+  Translate;
+end;
+
+procedure TFormCharts.Redraw;
+var
+  I: Integer;
+  X: Integer;
+  NewSeries: TLineSeries;
+begin
+  Chart1.Series.Clear;
+  for I := 0 to Core.Game.Players.Count - 1 do
+  with TPlayer(Core.Game.Players[I]) do begin
+    NewSeries := TLineSeries.Create(nil);
+    NewSeries.LinePen.Color := Color;
+    for X := 0 to TurnStats.Count - 1 do begin
+      if ComboBox1.ItemIndex = 0 then NewSeries.AddXY(X, TGameTurnStat(TurnStats[X]).OccupiedCells)
+      else if ComboBox1.ItemIndex = 1 then NewSeries.AddXY(X, TGameTurnStat(TurnStats[X]).Units)
+      else if ComboBox1.ItemIndex = 2 then NewSeries.AddXY(X, TGameTurnStat(TurnStats[X]).DiscoveredCells)
+      else if ComboBox1.ItemIndex = 3 then NewSeries.AddXY(X, TGameTurnStat(TurnStats[X]).Cities);
+    end;
+    Chart1.AddSeries(NewSeries);
+  end;
+end;
+
+procedure TFormCharts.Translate;
+var
+  LastIndex: Integer;
+begin
+  with ComboBox1 do begin
+    LastIndex := ItemIndex;
+    Clear;
+    Items.Add(SOccupiedCells);
+    Items.Add(SMilitaryPower);
+    Items.Add(SDiscoveredCells);
+    Items.Add(SCitiesCount);
+    ItemIndex := LastIndex;
+  end;
+end;
+
+end.
+
Index: /tags/1.1.0/Forms/UFormHelp.lfm
===================================================================
--- /tags/1.1.0/Forms/UFormHelp.lfm	(revision 137)
+++ /tags/1.1.0/Forms/UFormHelp.lfm	(revision 137)
@@ -0,0 +1,25 @@
+object FormHelp: TFormHelp
+  Left = 566
+  Height = 663
+  Top = 237
+  Width = 1012
+  Caption = 'Help'
+  ClientHeight = 663
+  ClientWidth = 1012
+  Constraints.MinHeight = 223
+  Constraints.MinWidth = 424
+  OnCreate = FormCreate
+  Position = poMainFormCenter
+  LCLVersion = '1.6.4.0'
+  object Memo1: TMemo
+    Left = 6
+    Height = 651
+    Top = 6
+    Width = 1000
+    Align = alClient
+    BorderSpacing.Around = 6
+    ReadOnly = True
+    ScrollBars = ssAutoBoth
+    TabOrder = 0
+  end
+end
Index: /tags/1.1.0/Forms/UFormHelp.lrt
===================================================================
--- /tags/1.1.0/Forms/UFormHelp.lrt	(revision 137)
+++ /tags/1.1.0/Forms/UFormHelp.lrt	(revision 137)
@@ -0,0 +1,1 @@
+TFORMHELP.CAPTION=Help
Index: /tags/1.1.0/Forms/UFormHelp.pas
===================================================================
--- /tags/1.1.0/Forms/UFormHelp.pas	(revision 137)
+++ /tags/1.1.0/Forms/UFormHelp.pas	(revision 137)
@@ -0,0 +1,65 @@
+unit UFormHelp;
+
+{$mode delphi}
+
+interface
+
+uses
+  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;
+
+type
+
+  { TFormHelp }
+
+  TFormHelp = class(TForm)
+    Memo1: TMemo;
+    procedure FormCreate(Sender: TObject);
+  private
+    { private declarations }
+  public
+    { public declarations }
+  end;
+
+var
+  FormHelp: TFormHelp;
+
+
+implementation
+
+uses
+  UCore;
+
+resourcestring
+  SContent = 'xTactics is a risk based strategic game. Main focus of the game ' +
+    'is to offer player various possibilities to configure game conditions. ' +
+    'Map for game is generated randomly for each play. Game is multiplayer so ' +
+    'single player can play with other human opponents or with many computer ' +
+    'opponents.' + LineEnding + LineEnding +
+    'Each cell has defined number of units which can be instructed to attack ' +
+    'enemy or neutral adjacent cells. Units can also defend against enemy attach from adjacent cells. ' +
+    'You can move units inside your territory. ' + LineEnding +
+    'Number of units in cells grows by square root of number of units. More units cell contains, more ' +
+    'units is added each turn. Maximum number to which units grow is 99. Cell can ' +
+    'have more units but excessive cells will die gradually every turn to balance to number 99.' +
+    LineEnding + LineEnding +
+    'Resolution of attack of units is determined by rule similar to one which is ' +
+    'used in Risk game. Battle consist of several fights. Each fight attacker can use ' +
+    'up to 3 units and defender up to 2 units. Number of units for each side determine ' +
+    'number of dices. Both sides roll their dices and order them in descending order. ' +
+    'Each side takes one dice with highest value. One who has dice with higher value wins. ' +
+    'In case of tie, defender wins. Loser lose its unit and another pair of dices is evaluated. ' +
+    'This process is calculated automatically and for each planned attack win ' +
+    'probability is displayed.';
+
+{$R *.lfm}
+
+{ TFormHelp }
+
+procedure TFormHelp.FormCreate(Sender: TObject);
+begin
+  Core.CoolTranslator1.TranslateComponentRecursive(Self);
+  Memo1.Lines.Text := SContent;
+end;
+
+end.
+
Index: /tags/1.1.0/Forms/UFormMain.lfm
===================================================================
--- /tags/1.1.0/Forms/UFormMain.lfm	(revision 137)
+++ /tags/1.1.0/Forms/UFormMain.lfm	(revision 137)
@@ -0,0 +1,257 @@
+object FormMain: TFormMain
+  Left = 577
+  Height = 621
+  Top = 309
+  Width = 775
+  Caption = 'xTactics'
+  ClientHeight = 596
+  ClientWidth = 775
+  Menu = MainMenu1
+  OnClose = FormClose
+  OnCreate = FormCreate
+  OnDestroy = FormDestroy
+  OnKeyUp = FormKeyUp
+  OnShow = FormShow
+  LCLVersion = '1.6.2.0'
+  WindowState = wsMaximized
+  object StatusBar1: TStatusBar
+    Left = 0
+    Height = 28
+    Top = 568
+    Width = 775
+    Panels = <    
+      item
+        Width = 200
+      end    
+      item
+        Width = 150
+      end    
+      item
+        Width = 100
+      end>
+    SimplePanel = False
+  end
+  object ToolBar1: TToolBar
+    Left = 0
+    Height = 568
+    Top = 0
+    Width = 80
+    Align = alLeft
+    ButtonHeight = 32
+    ButtonWidth = 32
+    Images = Core.ImageListSmall
+    ParentShowHint = False
+    PopupMenu = PopupMenuToolbar
+    ShowHint = True
+    TabOrder = 1
+    object ToolButton1: TToolButton
+      Left = 1
+      Top = 2
+      Action = Core.AGameNew
+    end
+    object ToolButton2: TToolButton
+      Left = 1
+      Top = 34
+      Action = Core.AGameEndTurn
+    end
+    object ToolButton3: TToolButton
+      Left = 1
+      Top = 66
+      Action = Core.AGameEnd
+    end
+    object ToolButton4: TToolButton
+      Left = 1
+      Top = 98
+      Action = Core.AGameRestart
+    end
+    object ToolButton5: TToolButton
+      Left = 1
+      Top = 130
+      Action = Core.ASettings
+    end
+    object ToolButton6: TToolButton
+      Left = 1
+      Top = 194
+      Action = AZoomIn
+    end
+    object ToolButton7: TToolButton
+      Left = 1
+      Top = 226
+      Action = AZoomOut
+    end
+    object ToolButton8: TToolButton
+      Left = 1
+      Top = 258
+      Action = AZoomAll
+    end
+    object ToolButton9: TToolButton
+      Left = 1
+      Height = 32
+      Top = 162
+      Width = 32
+      Style = tbsSeparator
+    end
+    object ToolButton10: TToolButton
+      Left = 1
+      Height = 32
+      Top = 290
+      Width = 32
+      Style = tbsSeparator
+    end
+    object ToolButton11: TToolButton
+      Left = 1
+      Top = 322
+      Action = Core.AGameLoad
+    end
+    object ToolButton12: TToolButton
+      Left = 1
+      Top = 354
+      Action = Core.AGameSave
+    end
+    object ToolButton13: TToolButton
+      Left = 1
+      Top = 386
+      Action = Core.AExit
+    end
+  end
+  object PaintBox1: TPaintBox
+    Left = 80
+    Height = 568
+    Top = 0
+    Width = 695
+    Align = alClient
+    OnMouseDown = PaintBox1MouseDown
+    OnMouseLeave = PaintBox1MouseLeave
+    OnMouseMove = PaintBox1MouseMove
+    OnMouseUp = PaintBox1MouseUp
+    OnMouseWheelDown = PaintBox1MouseWheelDown
+    OnMouseWheelUp = PaintBox1MouseWheelUp
+    OnPaint = PaintBox1Paint
+    OnResize = PaintBox1Resize
+  end
+  object MainMenu1: TMainMenu
+    Images = Core.ImageListSmall
+    left = 224
+    top = 48
+    object MenuItem1: TMenuItem
+      Caption = 'Game'
+      object MenuItem2: TMenuItem
+        Action = Core.AGameNew
+      end
+      object MenuItem3: TMenuItem
+        Action = Core.AGameEnd
+      end
+      object MenuItem7: TMenuItem
+        Action = Core.AGameRestart
+      end
+      object MenuItem4: TMenuItem
+        Action = Core.AGameEndTurn
+      end
+      object MenuItem14: TMenuItem
+        Action = Core.AGameLoad
+      end
+      object MenuItemLoadRecent: TMenuItem
+        Caption = 'Load recent'
+      end
+      object MenuItem15: TMenuItem
+        Action = Core.AGameSave
+      end
+      object MenuItem5: TMenuItem
+        Caption = '-'
+      end
+      object MenuItem6: TMenuItem
+        Action = Core.AExit
+      end
+    end
+    object MenuItem10: TMenuItem
+      Caption = 'View'
+      object MenuItem11: TMenuItem
+        Action = AZoomAll
+      end
+      object MenuItem12: TMenuItem
+        Action = AZoomIn
+      end
+      object MenuItem13: TMenuItem
+        Action = AZoomOut
+      end
+      object MenuItem19: TMenuItem
+        Caption = '-'
+      end
+      object MenuItem21: TMenuItem
+        Action = AToolBarVisible
+      end
+      object MenuItem20: TMenuItem
+        Action = AToolBarBigIcons
+      end
+      object MenuItem22: TMenuItem
+        Action = AStatusBarVisible
+      end
+    end
+    object MenuItem8: TMenuItem
+      Caption = 'Tools'
+      object MenuItem9: TMenuItem
+        Action = Core.ASettings
+      end
+      object MenuItem24: TMenuItem
+        Action = Core.AShowCharts
+      end
+    end
+    object MenuItem16: TMenuItem
+      Caption = 'Help'
+      object MenuItem23: TMenuItem
+        Action = Core.AHelp
+      end
+      object MenuItem17: TMenuItem
+        Action = Core.AAbout
+      end
+    end
+  end
+  object Timer1: TTimer
+    Interval = 20
+    OnTimer = Timer1Timer
+    left = 154
+    top = 263
+  end
+  object ActionList1: TActionList
+    Images = Core.ImageListSmall
+    left = 280
+    top = 152
+    object AZoomIn: TAction
+      Caption = 'Zoom in'
+      ImageIndex = 8
+      OnExecute = AZoomInExecute
+      ShortCut = 16491
+    end
+    object AZoomOut: TAction
+      Caption = 'Zoom out'
+      ImageIndex = 9
+      OnExecute = AZoomOutExecute
+      ShortCut = 16493
+    end
+    object AZoomAll: TAction
+      Caption = 'Zoom all'
+      ImageIndex = 7
+      OnExecute = AZoomAllExecute
+      ShortCut = 16449
+    end
+    object AToolBarBigIcons: TAction
+      Caption = 'Toolbar big icons'
+      OnExecute = AToolBarBigIconsExecute
+    end
+    object AToolBarVisible: TAction
+      Caption = 'Toolbar visible'
+      OnExecute = AToolBarVisibleExecute
+    end
+    object AStatusBarVisible: TAction
+      Caption = 'Statusbar visible'
+      OnExecute = AStatusBarVisibleExecute
+    end
+  end
+  object PopupMenuToolbar: TPopupMenu
+    left = 452
+    top = 98
+    object MenuItem18: TMenuItem
+      Action = AToolBarBigIcons
+    end
+  end
+end
Index: /tags/1.1.0/Forms/UFormMain.lrt
===================================================================
--- /tags/1.1.0/Forms/UFormMain.lrt	(revision 137)
+++ /tags/1.1.0/Forms/UFormMain.lrt	(revision 137)
@@ -0,0 +1,14 @@
+TFORMMAIN.CAPTION=xTactics
+TFORMMAIN.MENUITEM1.CAPTION=Game
+TFORMMAIN.MENUITEMLOADRECENT.CAPTION=Load recent
+TFORMMAIN.MENUITEM5.CAPTION=-
+TFORMMAIN.MENUITEM10.CAPTION=View
+TFORMMAIN.MENUITEM19.CAPTION=-
+TFORMMAIN.MENUITEM8.CAPTION=Tools
+TFORMMAIN.MENUITEM16.CAPTION=Help
+TFORMMAIN.AZOOMIN.CAPTION=Zoom in
+TFORMMAIN.AZOOMOUT.CAPTION=Zoom out
+TFORMMAIN.AZOOMALL.CAPTION=Zoom all
+TFORMMAIN.ATOOLBARBIGICONS.CAPTION=Toolbar big icons
+TFORMMAIN.ATOOLBARVISIBLE.CAPTION=Toolbar visible
+TFORMMAIN.ASTATUSBARVISIBLE.CAPTION=Statusbar visible
Index: /tags/1.1.0/Forms/UFormMain.pas
===================================================================
--- /tags/1.1.0/Forms/UFormMain.pas	(revision 137)
+++ /tags/1.1.0/Forms/UFormMain.pas	(revision 137)
@@ -0,0 +1,417 @@
+unit UFormMain;
+
+{$mode delphi}{$H+}
+
+interface
+
+uses
+  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,
+  UGame, LCLType, Menus, ActnList, ComCtrls, types, dateutils, XMLConf;
+
+const
+  ZoomFactor = 1.5;
+  MouseMinDiff = 0.1;
+
+type
+
+  { TFormMain }
+
+  TFormMain = class(TForm)
+    AStatusBarVisible: TAction;
+    AToolBarVisible: TAction;
+    AToolBarBigIcons: TAction;
+    AZoomIn: TAction;
+    AZoomAll: TAction;
+    AZoomOut: TAction;
+    ActionList1: TActionList;
+    MainMenu1: TMainMenu;
+    MenuItem1: TMenuItem;
+    MenuItem10: TMenuItem;
+    MenuItem11: TMenuItem;
+    MenuItem12: TMenuItem;
+    MenuItem13: TMenuItem;
+    MenuItem14: TMenuItem;
+    MenuItem15: TMenuItem;
+    MenuItem16: TMenuItem;
+    MenuItem17: TMenuItem;
+    MenuItem18: TMenuItem;
+    MenuItem19: TMenuItem;
+    MenuItem2: TMenuItem;
+    MenuItem20: TMenuItem;
+    MenuItem21: TMenuItem;
+    MenuItem22: TMenuItem;
+    MenuItem23: TMenuItem;
+    MenuItem24: TMenuItem;
+    MenuItemLoadRecent: TMenuItem;
+    MenuItem3: TMenuItem;
+    MenuItem4: TMenuItem;
+    MenuItem5: TMenuItem;
+    MenuItem6: TMenuItem;
+    MenuItem7: TMenuItem;
+    MenuItem8: TMenuItem;
+    MenuItem9: TMenuItem;
+    PaintBox1: TPaintBox;
+    PopupMenuToolbar: TPopupMenu;
+    StatusBar1: TStatusBar;
+    Timer1: TTimer;
+    ToolBar1: TToolBar;
+    ToolButton1: TToolButton;
+    ToolButton10: TToolButton;
+    ToolButton11: TToolButton;
+    ToolButton12: TToolButton;
+    ToolButton13: TToolButton;
+    ToolButton2: TToolButton;
+    ToolButton3: TToolButton;
+    ToolButton4: TToolButton;
+    ToolButton5: TToolButton;
+    ToolButton6: TToolButton;
+    ToolButton7: TToolButton;
+    ToolButton8: TToolButton;
+    ToolButton9: TToolButton;
+    procedure AStatusBarVisibleExecute(Sender: TObject);
+    procedure AToolBarBigIconsExecute(Sender: TObject);
+    procedure AToolBarVisibleExecute(Sender: TObject);
+    procedure AZoomAllExecute(Sender: TObject);
+    procedure AZoomInExecute(Sender: TObject);
+    procedure AZoomOutExecute(Sender: TObject);
+    procedure FormShow(Sender: TObject);
+    procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
+    procedure FormCreate(Sender: TObject);
+    procedure FormDestroy(Sender: TObject);
+    procedure FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
+    procedure PaintBox1MouseDown(Sender: TObject; Button: TMouseButton;
+      Shift: TShiftState; X, Y: Integer);
+    procedure PaintBox1MouseLeave(Sender: TObject);
+    procedure PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
+      Y: Integer);
+    procedure PaintBox1MouseUp(Sender: TObject; Button: TMouseButton;
+      Shift: TShiftState; X, Y: Integer);
+    procedure PaintBox1MouseWheelDown(Sender: TObject; Shift: TShiftState;
+      MousePos: TPoint; var Handled: Boolean);
+    procedure PaintBox1MouseWheelUp(Sender: TObject; Shift: TShiftState;
+      MousePos: TPoint; var Handled: Boolean);
+    procedure PaintBox1Paint(Sender: TObject);
+    procedure EraseBackground(DC: HDC); override;
+    procedure PaintBox1Resize(Sender: TObject);
+    procedure Timer1Timer(Sender: TObject);
+  private
+    TempBitmap: TBitmap;
+    StartMousePoint: TPoint;
+    StartViewPoint: TPoint;
+    MoveActive: Boolean;
+    RedrawPending: Boolean;
+    Drawing: Boolean;
+    DrawDuration: TDateTime;
+    LastTimerTime: TDateTime;
+    TimerPeriod: TDateTime;
+  public
+    procedure LoadConfig(Config: TXmlConfig; Path: string);
+    procedure SaveConfig(Config: TXmlConfig; Path: string);
+    procedure ReloadView;
+    procedure Redraw;
+  end;
+
+var
+  FormMain: TFormMain;
+
+implementation
+
+uses
+  UCore;
+
+resourcestring
+  STurn = 'turn';
+
+{$R *.lfm}
+
+{ TFormMain }
+
+procedure TFormMain.PaintBox1Paint(Sender: TObject);
+var
+  DrawStart: TDateTime;
+const
+  BackgroundColor = $404040;
+begin
+  DrawStart := Now;
+  if Assigned(Core.CurrentClient) then
+  with Core.CurrentClient do begin
+    View.DestRect := Bounds(0, 0, PaintBox1.Width, PaintBox1.Height);
+    if csOpaque in PaintBox1.ControlStyle then begin
+      TempBitmap.SetSize(PaintBox1.Width, PaintBox1.Height);
+      TempBitmap.Canvas.Brush.Color := BackGroundColor; //clBackground; //PaintBox1.GetColorResolvingParent;
+      TempBitmap.Canvas.FillRect(0, 0, PaintBox1.Width, PaintBox1.Height);
+      if Assigned(ControlPlayer) then ControlPlayer.Paint(TempBitmap.Canvas, View)
+        else Core.Game.Map.Paint(TempBitmap.Canvas, View);
+      PaintBox1.Canvas.Draw(0, 0, TempBitmap);
+    end else begin
+      {$ifdef WINDOWS}
+      PaintBox1.Canvas.Brush.Color := BackgroundColor; //clBackground; //PaintBox1.GetColorResolvingParent;
+      PaintBox1.Canvas.FillRect(0, 0, PaintBox1.Width, PaintBox1.Height);
+      {$endif}
+      if Assigned(ControlPlayer) then ControlPlayer.Paint(PaintBox1.Canvas, View)
+        else Core.Game.Map.Paint(PaintBox1.Canvas, View);
+    end;
+  end;
+  DrawDuration := (9 * DrawDuration + (Now - DrawStart)) / 10;
+end;
+
+procedure TFormMain.EraseBackground(DC: HDC);
+begin
+  // Do nothing, all background space covered by controls
+end;
+
+procedure TFormMain.PaintBox1Resize(Sender: TObject);
+begin
+  if Assigned(Core.CurrentClient) then
+  with Core.CurrentClient do
+    View.DestRect := Bounds(0, 0, PaintBox1.Width, PaintBox1.Height);
+  Redraw;
+end;
+
+procedure TFormMain.Timer1Timer(Sender: TObject);
+var
+  NewCaption: string;
+begin
+  if RedrawPending and not Drawing then begin
+    Drawing := True;
+    if not Core.DevelMode then RedrawPending := False;
+    TimerPeriod := (9 * TimerPeriod + (Now - LastTimerTime)) / 10;
+    LastTimerTime := Now;
+    PaintBox1.Repaint;
+    StatusBar1.Panels[1].Text := IntToStr(Trunc(DrawDuration / OneMillisecond)) + ' / ' +
+      IntToStr(Trunc(TimerPeriod / OneMillisecond)) + ' ms' +
+      ' ' + IntToStr(Core.Game.Map.CellLinks.Count);
+    NewCaption := 'xTactics';
+    if Assigned(Core.Game.CurrentPlayer) then
+      NewCaption := Core.Game.CurrentPlayer.Name + ' - ' + STurn + ' ' + IntToStr(Core.Game.TurnCounter) + ' - ' + NewCaption;
+    Caption := NewCaption;
+    Drawing := False;
+  end;
+end;
+
+procedure TFormMain.LoadConfig(Config: TXmlConfig; Path: string);
+begin
+  with Config do begin
+    AToolBarBigIcons.Checked := GetValue(Path + '/LargeIcons', False);
+    AToolBarVisible.Checked := GetValue(Path + '/ToolBarVisible', True);
+    AStatusBarVisible.Checked := GetValue(Path + '/StatusBarVisible', False);
+  end;
+end;
+
+procedure TFormMain.SaveConfig(Config: TXmlConfig; Path: string);
+begin
+  with Config do begin
+    SetValue(Path + '/LargeIcons', AToolBarBigIcons.Checked);
+    SetValue(Path + '/ToolBarVisible', AToolBarVisible.Checked);
+    SetValue(Path + '/StatusBarVisible', AStatusBarVisible.Checked);
+  end;
+end;
+
+procedure TFormMain.ReloadView;
+begin
+  if AToolBarBigIcons.Checked then begin
+    ToolBar1.Images := Core.ImageListLarge;
+    ToolBar1.ButtonWidth := Core.ImageListLarge.Width + 7;
+    ToolBar1.ButtonHeight := Core.ImageListLarge.Height + 6;
+    ToolBar1.Width := Core.ImageListLarge.Width + 10;
+    ToolBar1.Height := Core.ImageListLarge.Height + 10;
+  end else begin
+    ToolBar1.Images := Core.ImageListSmall;
+    ToolBar1.ButtonWidth := Core.ImageListSmall.Width + 7;
+    ToolBar1.ButtonHeight := Core.ImageListSmall.Height + 6;
+    ToolBar1.Width := Core.ImageListSmall.Width + 10;
+    ToolBar1.Height := Core.ImageListSmall.Height + 10;
+  end;
+  ToolBar1.Visible := AToolBarVisible.Checked;
+  StatusBar1.Visible := AStatusBarVisible.Checked;
+end;
+
+procedure TFormMain.Redraw;
+begin
+  RedrawPending := True;
+end;
+
+procedure TFormMain.FormCreate(Sender: TObject);
+begin
+  {$IFDEF Linux}
+  //PaintBox1.ControlStyle := PaintBox1.ControlStyle + [csOpaque];
+  {$ENDIF}
+  //DoubleBuffered := True;
+  TempBitmap := TBitmap.Create;
+  TimerPeriod := 0;
+  LastTimerTime := Now;
+end;
+
+procedure TFormMain.AZoomAllExecute(Sender: TObject);
+var
+  Factor: TFloatPoint;
+  MapRect: TRect;
+  NewZoom: Single;
+begin
+  with Core, Game, CurrentClient, View do begin
+    MapRect := Map.GetPixelRect;
+    Factor := FloatPoint((DestRect.Right - DestRect.Left) / (MapRect.Right - MapRect.Left),
+      (DestRect.Bottom - DestRect.Top) / (MapRect.Bottom - MapRect.Top));
+    if Factor.X < Factor.Y then NewZoom := Factor.X
+      else NewZoom := Factor.Y;
+    if NewZoom = 0 then NewZoom := 1;
+    Zoom := NewZoom;
+    CenterMap;
+  end;
+  Redraw;
+end;
+
+procedure TFormMain.AToolBarBigIconsExecute(Sender: TObject);
+begin
+  AToolBarBigIcons.Checked := not AToolBarBigIcons.Checked;
+  ReloadView;
+end;
+
+procedure TFormMain.AStatusBarVisibleExecute(Sender: TObject);
+begin
+  AStatusBarVisible.Checked := not AStatusBarVisible.Checked;
+  ReloadView;
+end;
+
+procedure TFormMain.AToolBarVisibleExecute(Sender: TObject);
+begin
+  AToolBarVisible.Checked := not AToolBarVisible.Checked;
+  ReloadView;
+end;
+
+procedure TFormMain.AZoomInExecute(Sender: TObject);
+begin
+  with Core.CurrentClient do begin
+    View.Zoom := View.Zoom * ZoomFactor;
+  end;
+  Redraw;
+end;
+
+procedure TFormMain.AZoomOutExecute(Sender: TObject);
+var
+  D: TPoint;
+begin
+  with Core.CurrentClient do begin
+    //D := Point(Trunc(MousePos.X - View.Left / ViewZoom),
+    //  Trunc(MousePos.Y - View.Top / ViewZoom));
+    View.Zoom := View.Zoom / ZoomFactor;
+    //View := Bounds(Trunc((D.X - MousePos.X) * ViewZoom),
+    //  Trunc((D.Y - MousePos.Y) * ViewZoom),
+    //  View.Right - View.Left,
+    //  View.Bottom - View.Top);
+  end;
+  Redraw;
+end;
+
+procedure TFormMain.FormClose(Sender: TObject; var CloseAction: TCloseAction);
+begin
+  Core.Game.Running := False;
+  Core.PersistentForm.Save(Self);
+  SaveConfig(Core.XMLConfig1, 'FormMain');
+  Core.XMLConfig1.Flush;
+end;
+
+procedure TFormMain.FormDestroy(Sender: TObject);
+begin
+  TempBitmap.Free;
+end;
+
+procedure TFormMain.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState
+  );
+begin
+  if (Key = 27) or (Key = 17) then
+  if Assigned(Core.Game.CurrentPlayer) then begin
+    Core.CurrentClient.View.SelectedCell := nil;
+    Redraw;
+  end;
+end;
+
+procedure TFormMain.FormShow(Sender: TObject);
+begin
+  Core.Init;
+  LoadConfig(Core.XMLConfig1, 'FormMain');
+  Core.PersistentForm.Load(Self, wsMaximized);
+  ReloadView;
+  Redraw;
+end;
+
+procedure TFormMain.PaintBox1MouseDown(Sender: TObject; Button: TMouseButton;
+  Shift: TShiftState; X, Y: Integer);
+begin
+  if Button = mbLeft then begin
+    if Assigned(Core.CurrentClient) then begin
+      StartMousePoint := Point(X, Y);
+      StartViewPoint := Core.CurrentClient.View.SourceRect.TopLeft;
+      MoveActive := True;
+    end;
+  end;
+end;
+
+procedure TFormMain.PaintBox1MouseLeave(Sender: TObject);
+begin
+  MoveActive := False;
+end;
+
+procedure TFormMain.PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
+  Y: Integer);
+var
+  Cell: TCell;
+  OldCell: TCell;
+  CellPos: TPoint;
+begin
+  if Assigned(Core.CurrentClient) then begin
+    if MoveActive then
+    if (Abs(StartMousePoint.X - X) > Trunc(Screen.PixelsPerInch * MouseMinDiff)) or
+    (Abs(StartMousePoint.Y - Y) > Trunc(Screen.PixelsPerInch * MouseMinDiff)) then
+    with Core.Game.CurrentPlayer, Core.CurrentClient do begin
+      View.SourceRect := Bounds(Trunc(StartViewPoint.X + (StartMousePoint.X - X) / View.Zoom),
+        Trunc(StartViewPoint.Y + (StartMousePoint.Y - Y) / View.Zoom),
+        View.SourceRect.Right - View.SourceRect.Left,
+        View.SourceRect.Bottom - View.SourceRect.Top);
+      Redraw;
+    end;
+    Cell := nil;
+    OldCell := Core.CurrentClient.View.FocusedCell;
+    with Core.Game do
+      Cell := Map.PosToCell(Core.CurrentClient.View.CanvasToCellPos(Point(X, Y)), Core.CurrentClient.View );
+    if Assigned(Cell) then begin
+      Core.CurrentClient.View.FocusedCell := Cell;
+      StatusBar1.Panels[0].Text := '[' + IntToStr(Cell.PosPx.X) + ', ' + IntToStr(Cell.PosPx.Y) +
+        '] (' + IntToStr(Cell.MovesFrom.Count) + ', ' + IntToStr(Cell.MovesTo.Count) + ')';
+    end else begin
+      Core.CurrentClient.View.FocusedCell := nil;
+      StatusBar1.Panels[0].Text := '';
+    end;
+    CellPos := Core.CurrentClient.View.CanvasToCellPos(Point(X, Y));
+    StatusBar1.Panels[2].Text := 'CellPos: ' + IntToStr(CellPos.X) + ', ' + IntToStr(CellPos.Y);
+    if Cell <> OldCell then Redraw;
+  end else StatusBar1.Panels[0].Text := '';
+end;
+
+procedure TFormMain.PaintBox1MouseUp(Sender: TObject; Button: TMouseButton;
+  Shift: TShiftState; X, Y: Integer);
+begin
+  if (Abs(StartMousePoint.X - X) < Trunc(Screen.PixelsPerInch * MouseMinDiff)) and
+  (Abs(StartMousePoint.Y - Y) < Trunc(Screen.PixelsPerInch * MouseMinDiff)) then begin
+    if Core.Game.Running and (Core.Game.CurrentPlayer.Mode = pmHuman) then begin
+      Core.CurrentClient.View.SelectCell(Point(X, Y), Core.Game.CurrentPlayer, Shift);
+      Redraw;
+    end;
+  end;
+  MoveActive := False;
+end;
+
+procedure TFormMain.PaintBox1MouseWheelDown(Sender: TObject;
+  Shift: TShiftState; MousePos: TPoint; var Handled: Boolean);
+begin
+  AZoomOut.Execute;
+end;
+
+procedure TFormMain.PaintBox1MouseWheelUp(Sender: TObject; Shift: TShiftState;
+  MousePos: TPoint; var Handled: Boolean);
+begin
+  AZoomIn.Execute;
+end;
+
+end.
+
Index: /tags/1.1.0/Forms/UFormMove.lfm
===================================================================
--- /tags/1.1.0/Forms/UFormMove.lfm	(revision 137)
+++ /tags/1.1.0/Forms/UFormMove.lfm	(revision 137)
@@ -0,0 +1,150 @@
+object FormMove: TFormMove
+  Left = 435
+  Height = 257
+  Top = 165
+  Width = 367
+  ActiveControl = ButtonOk
+  Caption = 'Move'
+  ClientHeight = 257
+  ClientWidth = 367
+  Constraints.MinHeight = 257
+  Constraints.MinWidth = 367
+  OnCreate = FormCreate
+  OnKeyPress = FormKeyPress
+  OnShow = FormShow
+  Position = poMainFormCenter
+  LCLVersion = '1.6.0.4'
+  object SpinEditOnce: TSpinEdit
+    Left = 208
+    Height = 34
+    Top = 40
+    Width = 98
+    OnChange = SpinEditOnceChange
+    OnKeyPress = FormKeyPress
+    TabOrder = 0
+  end
+  object Label1: TLabel
+    Left = 16
+    Height = 24
+    Top = 40
+    Width = 49
+    Caption = 'Once:'
+    ParentColor = False
+  end
+  object ButtonOk: TButton
+    Left = 189
+    Height = 25
+    Top = 224
+    Width = 75
+    Caption = 'Ok'
+    Default = True
+    ModalResult = 1
+    TabOrder = 1
+  end
+  object ButtonCancel: TButton
+    Left = 72
+    Height = 25
+    Top = 224
+    Width = 75
+    Caption = 'Cancel'
+    ModalResult = 2
+    TabOrder = 2
+  end
+  object Label2: TLabel
+    Left = 24
+    Height = 24
+    Top = 136
+    Width = 91
+    Caption = 'Every turn:'
+    ParentColor = False
+  end
+  object SpinEditRepeat: TSpinEdit
+    Left = 208
+    Height = 34
+    Top = 128
+    Width = 98
+    OnChange = SpinEditRepeatChange
+    OnKeyPress = FormKeyPress
+    TabOrder = 3
+  end
+  object TrackBarOnce: TTrackBar
+    Left = 56
+    Height = 46
+    Top = 80
+    Width = 255
+    OnChange = TrackBarOnceChange
+    PageSize = 1
+    Position = 0
+    TickStyle = tsNone
+    Anchors = [akTop, akLeft, akRight]
+    OnKeyPress = FormKeyPress
+    TabOrder = 4
+  end
+  object TrackBarRepeat: TTrackBar
+    Left = 56
+    Height = 46
+    Top = 168
+    Width = 255
+    OnChange = TrackBarRepeatChange
+    PageSize = 1
+    Position = 0
+    TickStyle = tsNone
+    Anchors = [akTop, akLeft, akRight]
+    OnKeyPress = FormKeyPress
+    TabOrder = 5
+  end
+  object ButtonOnceMin: TButton
+    Left = 8
+    Height = 25
+    Top = 88
+    Width = 48
+    Caption = 'Min'
+    OnClick = ButtonOnceMinClick
+    TabOrder = 6
+  end
+  object ButtonOnceMax: TButton
+    Left = 311
+    Height = 25
+    Top = 88
+    Width = 48
+    Anchors = [akTop, akRight]
+    Caption = 'Max'
+    OnClick = ButtonOnceMaxClick
+    TabOrder = 7
+  end
+  object ButtonRepeatMin: TButton
+    Left = 8
+    Height = 25
+    Top = 176
+    Width = 48
+    Caption = 'Min'
+    OnClick = ButtonRepeatMinClick
+    TabOrder = 8
+  end
+  object ButtonRepeatMax: TButton
+    Left = 311
+    Height = 25
+    Top = 176
+    Width = 48
+    Anchors = [akTop, akRight]
+    Caption = 'Max'
+    OnClick = ButtonRepeatMaxClick
+    TabOrder = 9
+  end
+  object Label3: TLabel
+    Left = 16
+    Height = 24
+    Top = 8
+    Width = 135
+    Caption = 'Win probability:'
+    ParentColor = False
+  end
+  object LabelWinProbability: TLabel
+    Left = 264
+    Height = 24
+    Top = 8
+    Width = 15
+    Caption = '   '
+    ParentColor = False
+  end
+end
Index: /tags/1.1.0/Forms/UFormMove.lrt
===================================================================
--- /tags/1.1.0/Forms/UFormMove.lrt	(revision 137)
+++ /tags/1.1.0/Forms/UFormMove.lrt	(revision 137)
@@ -0,0 +1,11 @@
+TFORMMOVE.CAPTION=Move
+TFORMMOVE.LABEL1.CAPTION=Once:
+TFORMMOVE.BUTTONOK.CAPTION=Ok
+TFORMMOVE.BUTTONCANCEL.CAPTION=Cancel
+TFORMMOVE.LABEL2.CAPTION=Every turn:
+TFORMMOVE.BUTTONONCEMIN.CAPTION=Min
+TFORMMOVE.BUTTONONCEMAX.CAPTION=Max
+TFORMMOVE.BUTTONREPEATMIN.CAPTION=Min
+TFORMMOVE.BUTTONREPEATMAX.CAPTION=Max
+TFORMMOVE.LABEL3.CAPTION=Win probability:
+TFORMMOVE.LABELWINPROBABILITY.CAPTION=   
Index: /tags/1.1.0/Forms/UFormMove.pas
===================================================================
--- /tags/1.1.0/Forms/UFormMove.pas	(revision 137)
+++ /tags/1.1.0/Forms/UFormMove.pas	(revision 137)
@@ -0,0 +1,144 @@
+unit UFormMove;
+
+{$mode delphi}
+
+interface
+
+uses
+  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, Spin,
+  StdCtrls, ComCtrls;
+
+type
+
+  { TFormMove }
+
+  TFormMove = class(TForm)
+    ButtonRepeatMax: TButton;
+    ButtonOnceMin: TButton;
+    ButtonOnceMax: TButton;
+    ButtonOk: TButton;
+    ButtonCancel: TButton;
+    ButtonRepeatMin: TButton;
+    Label1: TLabel;
+    Label2: TLabel;
+    Label3: TLabel;
+    LabelWinProbability: TLabel;
+    SpinEditOnce: TSpinEdit;
+    SpinEditRepeat: TSpinEdit;
+    TrackBarOnce: TTrackBar;
+    TrackBarRepeat: TTrackBar;
+    procedure ButtonOnceMaxClick(Sender: TObject);
+    procedure ButtonRepeatMinClick(Sender: TObject);
+    procedure FormCreate(Sender: TObject);
+    procedure ButtonOnceMinClick(Sender: TObject);
+    procedure ButtonRepeatMaxClick(Sender: TObject);
+    procedure FormKeyPress(Sender: TObject; var Key: char);
+    procedure FormShow(Sender: TObject);
+    procedure SpinEditOnceChange(Sender: TObject);
+    procedure SpinEditRepeatChange(Sender: TObject);
+    procedure TrackBarOnceChange(Sender: TObject);
+    procedure TrackBarRepeatChange(Sender: TObject);
+  private
+    { private declarations }
+  public
+    DefendCount: Integer;
+    AttackCount: Integer;
+    ShowWinProbability: Boolean;
+    procedure UpdateView;
+  end;
+
+var
+  FormMove: TFormMove;
+
+implementation
+
+{$R *.lfm}
+
+uses
+  UCore;
+
+{ TFormMove }
+
+procedure TFormMove.TrackBarOnceChange(Sender: TObject);
+begin
+  if SpinEditOnce.Value <> TrackBarOnce.Position then
+    SpinEditOnce.Value := TrackBarOnce.Position;
+end;
+
+procedure TFormMove.TrackBarRepeatChange(Sender: TObject);
+begin
+  if SpinEditRepeat.Value <> TrackBarRepeat.Position then
+    SpinEditRepeat.Value := TrackBarRepeat.Position;
+end;
+
+procedure TFormMove.UpdateView;
+begin
+  LabelWinProbability.Visible := ShowWinProbability;
+  Label3.Visible := ShowWinProbability;
+  LabelWinProbability.Caption :=
+    IntToStr(Round(Core.Game.AttackProbability(AttackCount + SpinEditOnce.Value,
+    DefendCount) * 100)) + ' %';
+end;
+
+procedure TFormMove.SpinEditOnceChange(Sender: TObject);
+begin
+  if SpinEditOnce.Value <> TrackBarOnce.Position then
+    TrackBarOnce.Position := SpinEditOnce.Value;
+  UpdateView;
+end;
+
+procedure TFormMove.FormShow(Sender: TObject);
+begin
+  if SpinEditOnce.MaxValue < SpinEditOnce.Value then begin
+    SpinEditOnce.Enabled := False;
+    SpinEditOnce.Value := 0;
+    TrackBarOnce.Enabled := False;
+    TrackBarOnce.Max := 0;
+    SpinEditRepeat.SetFocus;
+  end else begin
+    SpinEditOnce.Enabled := True;
+    TrackBarOnce.Enabled := True;
+    SpinEditOnce.SetFocus;
+  end;
+  UpdateView;
+end;
+
+procedure TFormMove.ButtonOnceMaxClick(Sender: TObject);
+begin
+  TrackBarOnce.Position := TrackBarRepeat.Max;
+end;
+
+procedure TFormMove.ButtonRepeatMinClick(Sender: TObject);
+begin
+  TrackBarRepeat.Position := TrackBarRepeat.Min;
+end;
+
+procedure TFormMove.FormCreate(Sender: TObject);
+begin
+
+end;
+
+procedure TFormMove.ButtonOnceMinClick(Sender: TObject);
+begin
+  TrackBarOnce.Position := TrackBarOnce.Min;
+end;
+
+procedure TFormMove.ButtonRepeatMaxClick(Sender: TObject);
+begin
+  TrackBarRepeat.Position := TrackBarRepeat.Max;
+end;
+
+procedure TFormMove.FormKeyPress(Sender: TObject; var Key: char);
+begin
+  if Key = #13 then ButtonOk.Click;
+  if Key = #27 then ButtonCancel.Click;
+end;
+
+procedure TFormMove.SpinEditRepeatChange(Sender: TObject);
+begin
+  if SpinEditRepeat.Value <> TrackBarRepeat.Position then
+    TrackBarRepeat.Position := SpinEditRepeat.Value;
+end;
+
+end.
+
Index: /tags/1.1.0/Forms/UFormNew.lfm
===================================================================
--- /tags/1.1.0/Forms/UFormNew.lfm	(revision 137)
+++ /tags/1.1.0/Forms/UFormNew.lfm	(revision 137)
@@ -0,0 +1,463 @@
+object FormNew: TFormNew
+  Left = 1176
+  Height = 501
+  Top = 331
+  Width = 677
+  Caption = 'New game'
+  ClientHeight = 501
+  ClientWidth = 677
+  Constraints.MinHeight = 501
+  Constraints.MinWidth = 667
+  OnCreate = FormCreate
+  OnDestroy = FormDestroy
+  OnShow = FormShow
+  Position = poMainFormCenter
+  LCLVersion = '1.6.4.0'
+  object ButtonCancel: TButton
+    Left = 454
+    Height = 25
+    Top = 459
+    Width = 75
+    Anchors = [akRight, akBottom]
+    Caption = 'Cancel'
+    ModalResult = 2
+    TabOrder = 0
+  end
+  object ButtonOk: TButton
+    Left = 558
+    Height = 25
+    Top = 459
+    Width = 75
+    Anchors = [akRight, akBottom]
+    Caption = 'Ok'
+    ModalResult = 1
+    TabOrder = 1
+  end
+  object PageControl1: TPageControl
+    Left = 4
+    Height = 439
+    Top = 4
+    Width = 669
+    ActivePage = TabSheet1
+    Align = alTop
+    Anchors = [akTop, akLeft, akRight, akBottom]
+    BorderSpacing.Around = 4
+    TabIndex = 0
+    TabOrder = 2
+    object TabSheet1: TTabSheet
+      Caption = 'Players'
+      ClientHeight = 397
+      ClientWidth = 663
+      object ListView1: TListView
+        Left = 4
+        Height = 347
+        Top = 4
+        Width = 655
+        Align = alTop
+        Anchors = [akTop, akLeft, akRight, akBottom]
+        BorderSpacing.Around = 4
+        Columns = <        
+          item
+            Caption = 'Name'
+            Width = 200
+          end        
+          item
+            Caption = 'Type'
+            Width = 100
+          end        
+          item
+            Caption = 'Color'
+            Width = 100
+          end        
+          item
+            Caption = 'Start units'
+            Width = 790
+          end>
+        OwnerData = True
+        PopupMenu = PopupMenu1
+        ReadOnly = True
+        RowSelect = True
+        TabOrder = 0
+        ViewStyle = vsReport
+        OnCustomDrawSubItem = ListView1CustomDrawSubItem
+        OnData = ListView1Data
+        OnDblClick = ListView1DblClick
+        OnKeyPress = ListView1KeyPress
+        OnKeyUp = ListView1KeyUp
+        OnSelectItem = ListView1SelectItem
+      end
+      object ButtonPlayerRemove: TButton
+        Left = 224
+        Height = 25
+        Top = 359
+        Width = 83
+        Action = APlayerRemove
+        Anchors = [akLeft, akBottom]
+        TabOrder = 1
+      end
+      object ButtonPlayerAdd: TButton
+        Left = 16
+        Height = 25
+        Top = 359
+        Width = 83
+        Action = APlayerAdd
+        Anchors = [akLeft, akBottom]
+        TabOrder = 2
+      end
+      object ButtonPlayerModify: TButton
+        Left = 120
+        Height = 25
+        Top = 359
+        Width = 83
+        Action = APlayerModify
+        Anchors = [akLeft, akBottom]
+        Caption = 'Modify'
+        TabOrder = 3
+      end
+    end
+    object TabSheet2: TTabSheet
+      Caption = 'Map'
+      ClientHeight = 397
+      ClientWidth = 663
+      object Label1: TLabel
+        Left = 8
+        Height = 24
+        Top = 9
+        Width = 95
+        Caption = 'Map width:'
+        ParentColor = False
+      end
+      object Label2: TLabel
+        Left = 8
+        Height = 24
+        Top = 57
+        Width = 102
+        Caption = 'Map height:'
+        ParentColor = False
+      end
+      object SpinEditMapSizeX: TSpinEdit
+        Left = 128
+        Height = 34
+        Top = 4
+        Width = 98
+        MinValue = 2
+        OnChange = SpinEditMapSizeXChange
+        TabOrder = 0
+        Value = 2
+      end
+      object SpinEditMapSizeY: TSpinEdit
+        Left = 128
+        Height = 34
+        Top = 55
+        Width = 98
+        MinValue = 2
+        OnChange = SpinEditMapSizeYChange
+        TabOrder = 1
+        Value = 2
+      end
+      object TrackBarSizeX: TTrackBar
+        Left = 240
+        Height = 46
+        Top = 8
+        Width = 412
+        Max = 100
+        Min = 2
+        OnChange = TrackBarSizeXChange
+        Position = 2
+        TickStyle = tsNone
+        Anchors = [akTop, akLeft, akRight]
+        TabOrder = 2
+      end
+      object TrackBarSizeY: TTrackBar
+        Left = 240
+        Height = 46
+        Top = 49
+        Width = 412
+        Max = 100
+        Min = 2
+        OnChange = TrackBarSizeYChange
+        Position = 2
+        TickStyle = tsNone
+        Anchors = [akTop, akLeft, akRight]
+        TabOrder = 3
+      end
+      object Label5: TLabel
+        Left = 8
+        Height = 24
+        Top = 104
+        Width = 83
+        Caption = 'Grid type:'
+        ParentColor = False
+      end
+      object ComboBoxGridType: TComboBox
+        Left = 146
+        Height = 38
+        Top = 104
+        Width = 208
+        ItemHeight = 0
+        Items.Strings = (
+          'Hexagonal'
+          'Square'
+          'Triangular'
+        )
+        Style = csDropDownList
+        TabOrder = 4
+      end
+      object ComboBoxMapShape: TComboBox
+        Left = 146
+        Height = 38
+        Top = 144
+        Width = 208
+        ItemHeight = 0
+        Items.Strings = (
+          'Hexagonal'
+          'Square'
+          'Triangular'
+        )
+        OnChange = ComboBoxMapShapeChange
+        Style = csDropDownList
+        TabOrder = 5
+      end
+      object Label8: TLabel
+        Left = 8
+        Height = 24
+        Top = 144
+        Width = 98
+        Caption = 'Map shape:'
+        ParentColor = False
+      end
+      object CheckBoxSymetricMap: TCheckBox
+        Left = 472
+        Height = 27
+        Top = 110
+        Width = 175
+        Anchors = [akTop, akLeft, akRight]
+        AutoSize = False
+        Caption = 'Symetric map'
+        TabOrder = 6
+      end
+      object SpinEditVoidPercent: TSpinEdit
+        Left = 216
+        Height = 34
+        Top = 224
+        Width = 106
+        MinValue = 1
+        TabOrder = 7
+        Value = 1
+      end
+      object CheckBoxVoid: TCheckBox
+        Left = 8
+        Height = 28
+        Top = 232
+        Width = 187
+        Caption = 'Inaccessible places'
+        OnChange = CheckBoxVoidChange
+        TabOrder = 8
+      end
+      object CheckBoxCity: TCheckBox
+        Left = 8
+        Height = 28
+        Top = 272
+        Width = 71
+        Caption = 'Cities'
+        OnChange = CheckBoxCityChange
+        TabOrder = 9
+      end
+      object SpinEditCityPercent: TSpinEdit
+        Left = 216
+        Height = 34
+        Top = 272
+        Width = 106
+        MinValue = 1
+        TabOrder = 10
+        Value = 1
+      end
+      object Label4: TLabel
+        Left = 331
+        Height = 24
+        Top = 272
+        Width = 15
+        Caption = '%'
+        ParentColor = False
+      end
+      object Label3: TLabel
+        Left = 331
+        Height = 24
+        Top = 232
+        Width = 15
+        Caption = '%'
+        ParentColor = False
+      end
+      object SpinEditNeutralUnits: TSpinEdit
+        Left = 408
+        Height = 34
+        Top = 352
+        Width = 98
+        MaxValue = 99
+        OnChange = SpinEditMapSizeYChange
+        TabOrder = 11
+        Value = 12
+      end
+      object Label7: TLabel
+        Left = 8
+        Height = 24
+        Top = 352
+        Width = 227
+        Caption = 'Max random neutral units:'
+        ParentColor = False
+      end
+      object EditImageFile: TEdit
+        Left = 144
+        Height = 34
+        Top = 184
+        Width = 396
+        Anchors = [akTop, akLeft, akRight]
+        TabOrder = 12
+      end
+      object ButtonImageBrowse: TButton
+        Left = 548
+        Height = 25
+        Top = 192
+        Width = 99
+        Anchors = [akTop, akRight]
+        Caption = 'Browse'
+        OnClick = ButtonImageBrowseClick
+        TabOrder = 13
+      end
+      object Label9: TLabel
+        Left = 8
+        Height = 24
+        Top = 184
+        Width = 90
+        Caption = 'Image file:'
+        ParentColor = False
+      end
+      object CheckBoxBridges: TCheckBox
+        Left = 8
+        Height = 28
+        Top = 310
+        Width = 210
+        Caption = 'Bridges between cells'
+        TabOrder = 14
+      end
+    end
+    object TabSheet3: TTabSheet
+      Caption = 'Rules'
+      ClientHeight = 397
+      ClientWidth = 663
+      object RadioGroupGrowCells: TRadioGroup
+        Left = 15
+        Height = 105
+        Top = 104
+        Width = 312
+        AutoFill = True
+        Caption = 'Growing cells'
+        ChildSizing.LeftRightSpacing = 6
+        ChildSizing.EnlargeHorizontal = crsHomogenousChildResize
+        ChildSizing.EnlargeVertical = crsHomogenousChildResize
+        ChildSizing.ShrinkHorizontal = crsScaleChilds
+        ChildSizing.ShrinkVertical = crsScaleChilds
+        ChildSizing.Layout = cclLeftToRightThenTopToBottom
+        ChildSizing.ControlsPerLine = 1
+        ClientHeight = 79
+        ClientWidth = 308
+        Items.Strings = (
+          'None'
+          'Player cities'
+          'Player all'
+        )
+        TabOrder = 0
+      end
+      object Label6: TLabel
+        Left = 8
+        Height = 25
+        Top = 248
+        Width = 111
+        Caption = 'Win objective:'
+        ParentColor = False
+      end
+      object ComboBoxWinObjective: TComboBox
+        Left = 232
+        Height = 33
+        Top = 240
+        Width = 328
+        ItemHeight = 0
+        Items.Strings = (
+          'Defeat all oponents'
+          'Defeat all oponents cities'
+          'Capture position'
+          'Stay alive for number of turns'
+        )
+        Style = csDropDownList
+        TabOrder = 1
+      end
+      object RadioGroupGrowAmount: TRadioGroup
+        Left = 15
+        Height = 76
+        Top = 16
+        Width = 305
+        AutoFill = True
+        Caption = 'Per turn grow amount'
+        ChildSizing.LeftRightSpacing = 6
+        ChildSizing.EnlargeHorizontal = crsHomogenousChildResize
+        ChildSizing.EnlargeVertical = crsHomogenousChildResize
+        ChildSizing.ShrinkHorizontal = crsScaleChilds
+        ChildSizing.ShrinkVertical = crsScaleChilds
+        ChildSizing.Layout = cclLeftToRightThenTopToBottom
+        ChildSizing.ControlsPerLine = 1
+        ClientHeight = 50
+        ClientWidth = 301
+        Items.Strings = (
+          'By one'
+          'By square root'
+        )
+        TabOrder = 2
+      end
+      object CheckBoxFogOfWar: TCheckBox
+        Left = 336
+        Height = 27
+        Top = 24
+        Width = 503
+        Anchors = [akTop, akLeft, akRight]
+        AutoSize = False
+        Caption = 'Fog of war'
+        TabOrder = 3
+      end
+    end
+  end
+  object ActionList1: TActionList
+    Images = Core.ImageListSmall
+    left = 256
+    top = 440
+    object APlayerModify: TAction
+      Caption = 'Modify player'
+      OnExecute = APlayerModifyExecute
+    end
+    object APlayerAdd: TAction
+      Caption = 'Add'
+      OnExecute = APlayerAddExecute
+    end
+    object APlayerRemove: TAction
+      Caption = 'Remove'
+      OnExecute = APlayerRemoveExecute
+    end
+  end
+  object OpenPictureDialog1: TOpenPictureDialog
+    left = 424
+    top = 440
+  end
+  object PopupMenu1: TPopupMenu
+    left = 128
+    top = 440
+    object MenuItem1: TMenuItem
+      Action = APlayerAdd
+    end
+    object MenuItem2: TMenuItem
+      Action = APlayerModify
+      Default = True
+    end
+    object MenuItem3: TMenuItem
+      Action = APlayerRemove
+    end
+  end
+end
Index: /tags/1.1.0/Forms/UFormNew.lrt
===================================================================
--- /tags/1.1.0/Forms/UFormNew.lrt	(revision 137)
+++ /tags/1.1.0/Forms/UFormNew.lrt	(revision 137)
@@ -0,0 +1,31 @@
+TFORMNEW.CAPTION=New game
+TFORMNEW.BUTTONCANCEL.CAPTION=Cancel
+TFORMNEW.BUTTONOK.CAPTION=Ok
+TFORMNEW.TABSHEET1.CAPTION=Players
+TFORMNEW.LISTVIEW1.COLUMNS[0].CAPTION=Name
+TFORMNEW.LISTVIEW1.COLUMNS[1].CAPTION=Type
+TFORMNEW.LISTVIEW1.COLUMNS[2].CAPTION=Color
+TFORMNEW.LISTVIEW1.COLUMNS[3].CAPTION=Start units
+TFORMNEW.BUTTONPLAYERMODIFY.CAPTION=Modify
+TFORMNEW.TABSHEET2.CAPTION=Map
+TFORMNEW.LABEL1.CAPTION=Map width:
+TFORMNEW.LABEL2.CAPTION=Map height:
+TFORMNEW.LABEL5.CAPTION=Grid type:
+TFORMNEW.LABEL8.CAPTION=Map shape:
+TFORMNEW.CHECKBOXSYMETRICMAP.CAPTION=Symetric map
+TFORMNEW.CHECKBOXVOID.CAPTION=Inaccessible places
+TFORMNEW.CHECKBOXCITY.CAPTION=Cities
+TFORMNEW.LABEL4.CAPTION=%
+TFORMNEW.LABEL3.CAPTION=%
+TFORMNEW.LABEL7.CAPTION=Max random neutral units:
+TFORMNEW.BUTTONIMAGEBROWSE.CAPTION=Browse
+TFORMNEW.LABEL9.CAPTION=Image file:
+TFORMNEW.CHECKBOXBRIDGES.CAPTION=Bridges between cells
+TFORMNEW.TABSHEET3.CAPTION=Rules
+TFORMNEW.RADIOGROUPGROWCELLS.CAPTION=Growing cells
+TFORMNEW.LABEL6.CAPTION=Win objective:
+TFORMNEW.RADIOGROUPGROWAMOUNT.CAPTION=Per turn grow amount
+TFORMNEW.CHECKBOXFOGOFWAR.CAPTION=Fog of war
+TFORMNEW.APLAYERMODIFY.CAPTION=Modify player
+TFORMNEW.APLAYERADD.CAPTION=Add
+TFORMNEW.APLAYERREMOVE.CAPTION=Remove
Index: /tags/1.1.0/Forms/UFormNew.pas
===================================================================
--- /tags/1.1.0/Forms/UFormNew.pas	(revision 137)
+++ /tags/1.1.0/Forms/UFormNew.pas	(revision 137)
@@ -0,0 +1,397 @@
+unit UFormNew;
+
+{$mode delphi}
+
+interface
+
+uses
+  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
+  ComCtrls, Spin, ExtCtrls, ActnList, ExtDlgs, Menus, UGame;
+
+type
+
+  { TFormNew }
+
+  TFormNew = class(TForm)
+    APlayerAdd: TAction;
+    APlayerRemove: TAction;
+    APlayerModify: TAction;
+    ActionList1: TActionList;
+    ButtonImageBrowse: TButton;
+    ButtonCancel: TButton;
+    ButtonOk: TButton;
+    ButtonPlayerAdd: TButton;
+    ButtonPlayerModify: TButton;
+    ButtonPlayerRemove: TButton;
+    CheckBoxBridges: TCheckBox;
+    CheckBoxFogOfWar: TCheckBox;
+    CheckBoxCity: TCheckBox;
+    CheckBoxSymetricMap: TCheckBox;
+    CheckBoxVoid: TCheckBox;
+    ComboBoxGridType: TComboBox;
+    ComboBoxMapShape: TComboBox;
+    ComboBoxWinObjective: TComboBox;
+    EditImageFile: TEdit;
+    Label1: TLabel;
+    Label2: TLabel;
+    Label3: TLabel;
+    Label4: TLabel;
+    Label5: TLabel;
+    Label6: TLabel;
+    Label7: TLabel;
+    Label8: TLabel;
+    Label9: TLabel;
+    ListView1: TListView;
+    MenuItem1: TMenuItem;
+    MenuItem2: TMenuItem;
+    MenuItem3: TMenuItem;
+    OpenPictureDialog1: TOpenPictureDialog;
+    PageControl1: TPageControl;
+    PopupMenu1: TPopupMenu;
+    RadioGroupGrowAmount: TRadioGroup;
+    RadioGroupGrowCells: TRadioGroup;
+    SpinEditCityPercent: TSpinEdit;
+    SpinEditMapSizeX: TSpinEdit;
+    SpinEditMapSizeY: TSpinEdit;
+    SpinEditNeutralUnits: TSpinEdit;
+    SpinEditVoidPercent: TSpinEdit;
+    TabSheet1: TTabSheet;
+    TabSheet2: TTabSheet;
+    TabSheet3: TTabSheet;
+    TrackBarSizeX: TTrackBar;
+    TrackBarSizeY: TTrackBar;
+    procedure APlayerAddExecute(Sender: TObject);
+    procedure APlayerModifyExecute(Sender: TObject);
+    procedure APlayerRemoveExecute(Sender: TObject);
+    procedure ButtonImageBrowseClick(Sender: TObject);
+    procedure CheckBoxCityChange(Sender: TObject);
+    procedure CheckBoxVoidChange(Sender: TObject);
+    procedure ComboBoxMapShapeChange(Sender: TObject);
+    procedure FormCreate(Sender: TObject);
+    procedure FormDestroy(Sender: TObject);
+    procedure FormShow(Sender: TObject);
+    procedure ListView1CustomDrawSubItem(Sender: TCustomListView;
+      Item: TListItem; SubItem: Integer; State: TCustomDrawState;
+      var DefaultDraw: Boolean);
+    procedure ListView1Data(Sender: TObject; Item: TListItem);
+    procedure ListView1DblClick(Sender: TObject);
+    procedure ListView1KeyPress(Sender: TObject; var Key: char);
+    procedure ListView1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState
+      );
+    procedure ListView1SelectItem(Sender: TObject; Item: TListItem;
+      Selected: Boolean);
+    procedure SpinEditMapSizeXChange(Sender: TObject);
+    procedure SpinEditMapSizeYChange(Sender: TObject);
+    procedure TrackBarSizeYChange(Sender: TObject);
+    procedure TrackBarSizeXChange(Sender: TObject);
+  private
+    Players: TPlayers;
+  public
+    procedure Translate;
+    procedure ReloadView;
+    procedure UpdateInterface;
+    procedure Load(Game: TGame);
+    procedure Save(Game: TGame);
+  end;
+
+var
+  FormNew: TFormNew;
+
+implementation
+
+{$R *.lfm}
+
+uses
+  UFormPlayer, UCore;
+
+resourcestring
+  SGridTypeHexagon = 'Hexagonal';
+  SGridTypeSquare = 'Square';
+  SGridTypeTriangle = 'Triangonal';
+  SGridTypeVoronoi = 'Voronoi random';
+  SWinObjectiveDefeatAllOponents = 'Defeat all oponents';
+  SWinObjectiveDefeatAllCities = 'Defeat all oponents cities';
+  SWinObjectiveCapturePosition = 'Capture position';
+  SWinObjectiveStayAliveForTurns = 'Stay alive for number of turns';
+  SGrowNone = 'None';
+  SGrowPlayerCities = 'Player cities';
+  SGrowPlayerAllCells = 'Player all cells';
+  SGrowAmountByOne = 'By one';
+  SGrowAmountBySquareRoot = 'By square root';
+  SRectangular = 'Rectangular';
+  SFromImageFile = 'From image file';
+
+{ TFormNew }
+
+procedure TFormNew.ListView1Data(Sender: TObject; Item: TListItem);
+begin
+  if (Item.Index >= 0) and (Item.Index < Players.Count) then
+  with TPlayer(Players[Item.Index]) do begin
+    Item.Caption := Name;
+    Item.Data := Players[Item.Index];
+    Item.SubItems.Add(PlayerModeText[Mode]);
+    Item.SubItems.Add(''); // Do not show color text
+    Item.SubItems.Add(IntToStr(StartUnits));
+  end;
+end;
+
+procedure TFormNew.ListView1DblClick(Sender: TObject);
+begin
+  APlayerModify.Execute;
+end;
+
+procedure TFormNew.ListView1KeyPress(Sender: TObject; var Key: char);
+begin
+  if (Key = #13) then APlayerModify.Execute;
+end;
+
+procedure TFormNew.ListView1KeyUp(Sender: TObject; var Key: Word;
+  Shift: TShiftState);
+begin
+  if Key = 45 then APlayerAdd.Execute;
+  if Key = 46 then APlayerRemove.Execute;
+end;
+
+procedure TFormNew.ListView1SelectItem(Sender: TObject; Item: TListItem;
+  Selected: Boolean);
+begin
+  ReloadView;
+end;
+
+procedure TFormNew.SpinEditMapSizeXChange(Sender: TObject);
+begin
+  TrackBarSizeX.Position := SpinEditMapSizeX.Value;
+end;
+
+procedure TFormNew.SpinEditMapSizeYChange(Sender: TObject);
+begin
+  TrackBarSizeY.Position := SpinEditMapSizeY.Value;
+end;
+
+procedure TFormNew.TrackBarSizeYChange(Sender: TObject);
+begin
+  SpinEditMapSizeY.Value := TrackBarSizeY.Position;
+end;
+
+procedure TFormNew.TrackBarSizeXChange(Sender: TObject);
+begin
+  SpinEditMapSizeX.Value := TrackBarSizeX.Position;
+end;
+
+procedure TFormNew.Translate;
+var
+  LastIndex: Integer;
+begin
+  with ComboBoxGridType do begin
+    LastIndex := ItemIndex;
+    Clear;
+    Items.Add(SGridTypeHexagon);
+    Items.Add(SGridTypeSquare);
+    Items.Add(SGridTypeTriangle);
+    if Core.DevelMode then
+      Items.Add(SGridTypeVoronoi);
+    ItemIndex := LastIndex;
+  end;
+  with ComboBoxWinObjective do begin
+    LastIndex := ItemIndex;
+    Clear;
+    Items.Add(SWinObjectiveDefeatAllOponents);
+    Items.Add(SWinObjectiveDefeatAllCities);
+    Items.Add(SWinObjectiveCapturePosition);
+    Items.Add(SWinObjectiveStayAliveForTurns);
+    ItemIndex := LastIndex;
+  end;
+  with ComboBoxMapShape do begin
+    LastIndex := ItemIndex;
+    Clear;
+    Items.Add(SRectangular);
+    Items.Add(SFromImageFile);
+    ItemIndex := LastIndex;
+  end;
+  with RadioGroupGrowCells do begin
+    LastIndex := ItemIndex;
+    Items.Clear;
+    Items.Add(SGrowNone);
+    Items.Add(SGrowPlayerCities);
+    Items.Add(SGrowPlayerAllCells);
+    ItemIndex := LastIndex;
+  end;
+  with RadioGroupGrowAmount do begin
+    LastIndex := ItemIndex;
+    Items.Clear;
+    Items.Add(SGrowAmountByOne);
+    Items.Add(SGrowAmountBySquareRoot);
+    ItemIndex := LastIndex;
+  end;
+end;
+
+procedure TFormNew.ReloadView;
+begin
+  ListView1.Items.Count := Players.Count;
+  ListView1.Refresh;
+  Translate;
+  UpdateInterface;
+end;
+
+procedure TFormNew.UpdateInterface;
+begin
+  APlayerRemove.Enabled := Assigned(ListView1.Selected) and (Players.Count > 2);
+  APlayerAdd.Enabled := Players.Count < MaxPlayerCount;
+  APlayerModify.Enabled := Assigned(ListView1.Selected);
+  EditImageFile.Enabled := ComboBoxMapShape.ItemIndex = Integer(msImage);
+  ButtonImageBrowse.Enabled := ComboBoxMapShape.ItemIndex = Integer(msImage);
+end;
+
+procedure TFormNew.FormShow(Sender: TObject);
+begin
+  ReloadView;
+  //Height := Trunc(1.5 * Height);
+  PageControl1.TabIndex := 0;
+end;
+
+procedure TFormNew.ListView1CustomDrawSubItem(Sender: TCustomListView;
+  Item: TListItem; SubItem: Integer; State: TCustomDrawState;
+  var DefaultDraw: Boolean);
+begin
+  if SubItem = 2 then
+  with ListView1.Canvas do begin
+    Brush.Color := TPlayer(Item.Data).Color;
+    Brush.Style := bsSolid;
+    FillRect(Item.DisplayRectSubItem(2, drBounds));
+  end;
+end;
+
+procedure TFormNew.FormCreate(Sender: TObject);
+begin
+  Players := TPlayers.Create;
+end;
+
+procedure TFormNew.CheckBoxCityChange(Sender: TObject);
+begin
+  SpinEditCityPercent.Enabled := CheckBoxCity.Checked;
+end;
+
+procedure TFormNew.CheckBoxVoidChange(Sender: TObject);
+begin
+  SpinEditVoidPercent.Enabled := CheckBoxVoid.Checked;
+end;
+
+procedure TFormNew.ComboBoxMapShapeChange(Sender: TObject);
+begin
+  ReloadView;
+end;
+
+procedure TFormNew.APlayerModifyExecute(Sender: TObject);
+begin
+  if Assigned(ListView1.Selected) then begin
+    FormPlayer.Load(TPlayer(ListView1.Selected.Data));
+    if FormPlayer.ShowModal = mrOk then begin
+      FormPlayer.Save(TPlayer(ListView1.Selected.Data));
+      ReloadView;
+    end;
+  end;
+end;
+
+procedure TFormNew.APlayerRemoveExecute(Sender: TObject);
+begin
+  if Assigned(ListView1.Selected) then begin
+    Players.Remove(ListView1.Selected.Data);
+    ReloadView;
+  end;
+end;
+
+procedure TFormNew.ButtonImageBrowseClick(Sender: TObject);
+begin
+  OpenPictureDialog1.FileName := EditImageFile.Text;
+  if OpenPictureDialog1.Execute then begin
+    EditImageFile.Text := OpenPictureDialog1.FileName;
+  end;
+end;
+
+procedure TFormNew.APlayerAddExecute(Sender: TObject);
+var
+  NewPlayer: TPlayer;
+begin
+  if Players.Count <= (MaxPlayerCount - 1) then begin
+    NewPlayer := TPlayer.Create;
+    NewPlayer.Id := Players.GetNewPlayerId;
+    NewPlayer.Name := SPlayer + ' ' + IntToStr(NewPlayer.Id);
+    NewPlayer.Color := PlayerColors[Players.Count];
+    NewPlayer.Mode := pmComputer;
+    NewPlayer.Agressivity := caMedium;
+    Players.Add(NewPlayer);
+    ReloadView;
+  end;
+end;
+
+procedure TFormNew.FormDestroy(Sender: TObject);
+begin
+  Players.Free;
+end;
+
+procedure TFormNew.Load(Game: TGame);
+var
+  I: Integer;
+begin
+  CheckBoxSymetricMap.Checked := Game.SymetricMap;
+  CheckBoxVoid.Checked := Game.VoidEnabled;
+  SpinEditVoidPercent.Value := Game.VoidPercentage;
+  SpinEditVoidPercent.Enabled := Game.VoidEnabled;
+  for I := 0 to Players.Count - 1 do
+    Players[I] := nil;
+  Players.Count := Game.Players.Count;
+  for I := 0 to Game.Players.Count - 1 do begin
+    Players[I] := TPlayer.Create;
+    TPlayer(Players[I]).Assign(TPlayer(Game.Players[I]));
+  end;
+  Players.NewPlayerId := Game.Players.NewPlayerId;
+
+  CheckBoxCity.Checked := Game.CityEnabled;
+  SpinEditCityPercent.Value := Game.CityPercentage;
+  SpinEditMapSizeX.Value := Game.Map.Size.X;
+  SpinEditMapSizeY.Value := Game.Map.Size.Y;
+  TrackBarSizeX.Position := Game.Map.Size.X;
+  TrackBarSizeY.Position := Game.Map.Size.Y;
+  RadioGroupGrowAmount.ItemIndex := Integer(Game.GrowAmount);
+  RadioGroupGrowCells.ItemIndex := Integer(Game.GrowCells);
+  ComboBoxGridType.ItemIndex := Integer(Game.MapType) - 1;
+  ComboBoxWinObjective.ItemIndex := Integer(Game.WinObjective);
+  SpinEditNeutralUnits.Value := Game.MaxNeutralUnits;
+  ComboBoxMapShape.ItemIndex := Integer(Game.Map.Shape);
+  EditImageFile.Text := Game.MapImageFileName;
+  CheckBoxFogOfWar.Checked := Game.FogOfWar;
+  CheckBoxBridges.Checked := Game.BridgeEnabled;
+end;
+
+procedure TFormNew.Save(Game: TGame);
+var
+  I: Integer;
+begin
+  while Game.Players.Count > Players.Count do
+    Game.Players.Delete(Game.Players.Count - 1);
+  while Game.Players.Count < Players.Count do
+    Game.Players.Add(TPlayer.Create);
+  for I := 0 to Game.Players.Count - 1 do begin
+    TPlayer(Game.Players[I]).Assign(TPlayer(Players[I]));
+    TPlayer(Game.Players[I]).Game := Game;
+  end;
+  Game.Players.NewPlayerId := Players.NewPlayerId;
+  Game.SymetricMap := CheckBoxSymetricMap.Checked;
+  Game.VoidEnabled := CheckBoxVoid.Checked;
+  Game.VoidPercentage := SpinEditVoidPercent.Value;
+  Game.CityEnabled := CheckBoxCity.Checked;
+  Game.CityPercentage := SpinEditCityPercent.Value;
+  Game.Map.Size := Point(SpinEditMapSizeX.Value, SpinEditMapSizeY.Value);
+  Game.GrowAmount := TGrowAmount(RadioGroupGrowAmount.ItemIndex);
+  Game.GrowCells := TGrowCells(RadioGroupGrowCells.ItemIndex);
+  Game.MapType := TMapType(ComboBoxGridType.ItemIndex + 1);
+  Game.WinObjective := TWinObjective(ComboBoxWinObjective.ItemIndex);
+  Game.MaxNeutralUnits := SpinEditNeutralUnits.Value;
+  Game.Map.Shape := TMapShape(ComboBoxMapShape.ItemIndex);
+  Game.MapImageFileName := EditImageFile.Text;
+  Game.FogOfWar := CheckBoxFogOfWar.Checked;
+  Game.BridgeEnabled := CheckBoxBridges.Checked;
+end;
+
+end.
+
Index: /tags/1.1.0/Forms/UFormPlayer.lfm
===================================================================
--- /tags/1.1.0/Forms/UFormPlayer.lfm	(revision 137)
+++ /tags/1.1.0/Forms/UFormPlayer.lfm	(revision 137)
@@ -0,0 +1,142 @@
+object FormPlayer: TFormPlayer
+  Left = 470
+  Height = 344
+  Top = 219
+  Width = 522
+  Caption = 'Player'
+  ClientHeight = 344
+  ClientWidth = 522
+  Constraints.MinHeight = 344
+  Constraints.MinWidth = 522
+  OnShow = FormShow
+  Position = poMainFormCenter
+  LCLVersion = '1.6.4.0'
+  object Label1: TLabel
+    Left = 24
+    Height = 24
+    Top = 27
+    Width = 56
+    Caption = 'Name:'
+    ParentColor = False
+  end
+  object EditName: TEdit
+    Left = 168
+    Height = 34
+    Top = 27
+    Width = 339
+    Anchors = [akTop, akLeft, akRight]
+    TabOrder = 0
+  end
+  object ButtonCancel: TButton
+    Left = 278
+    Height = 25
+    Top = 307
+    Width = 75
+    Anchors = [akRight, akBottom]
+    Caption = 'Cancel'
+    ModalResult = 2
+    TabOrder = 1
+  end
+  object ButtonOk: TButton
+    Left = 403
+    Height = 25
+    Top = 307
+    Width = 75
+    Anchors = [akRight, akBottom]
+    Caption = 'Ok'
+    Default = True
+    ModalResult = 1
+    TabOrder = 2
+  end
+  object ComboBoxMode: TComboBox
+    Left = 168
+    Height = 34
+    Top = 72
+    Width = 339
+    Anchors = [akTop, akLeft, akRight]
+    ItemHeight = 0
+    ItemIndex = 0
+    Items.Strings = (
+      'Human'
+      'Computer'
+    )
+    OnChange = ComboBoxModeChange
+    Style = csDropDownList
+    TabOrder = 3
+    Text = 'Human'
+  end
+  object Label2: TLabel
+    Left = 24
+    Height = 24
+    Top = 72
+    Width = 53
+    Caption = 'Mode:'
+    ParentColor = False
+  end
+  object Label3: TLabel
+    Left = 24
+    Height = 24
+    Top = 128
+    Width = 50
+    Caption = 'Color:'
+    ParentColor = False
+  end
+  object ColorBox1: TColorBox
+    Left = 168
+    Height = 38
+    Top = 120
+    Width = 339
+    Style = [cbStandardColors, cbExtendedColors, cbCustomColor, cbPrettyNames]
+    Anchors = [akTop, akLeft, akRight]
+    ItemHeight = 20
+    TabOrder = 4
+  end
+  object Label4: TLabel
+    Left = 24
+    Height = 24
+    Top = 168
+    Width = 98
+    Caption = 'Agressivity:'
+    ParentColor = False
+  end
+  object ComboBoxAgressivity: TComboBox
+    Left = 168
+    Height = 34
+    Top = 168
+    Width = 339
+    Anchors = [akTop, akLeft, akRight]
+    ItemHeight = 0
+    Items.Strings = (
+      'Low'
+      'Medium'
+      'High'
+      ''
+    )
+    Style = csDropDownList
+    TabOrder = 5
+  end
+  object CheckBoxDefensive: TCheckBox
+    Left = 24
+    Height = 28
+    Top = 208
+    Width = 107
+    Caption = 'Defensive'
+    TabOrder = 6
+  end
+  object Label5: TLabel
+    Left = 24
+    Height = 24
+    Top = 248
+    Width = 94
+    Caption = 'Start units:'
+    ParentColor = False
+  end
+  object SpinEditStartUnits: TSpinEdit
+    Left = 224
+    Height = 34
+    Top = 240
+    Width = 112
+    MaxValue = 99
+    TabOrder = 7
+  end
+end
Index: /tags/1.1.0/Forms/UFormPlayer.lrt
===================================================================
--- /tags/1.1.0/Forms/UFormPlayer.lrt	(revision 137)
+++ /tags/1.1.0/Forms/UFormPlayer.lrt	(revision 137)
@@ -0,0 +1,10 @@
+TFORMPLAYER.CAPTION=Player
+TFORMPLAYER.LABEL1.CAPTION=Name:
+TFORMPLAYER.BUTTONCANCEL.CAPTION=Cancel
+TFORMPLAYER.BUTTONOK.CAPTION=Ok
+TFORMPLAYER.COMBOBOXMODE.TEXT=Human
+TFORMPLAYER.LABEL2.CAPTION=Mode:
+TFORMPLAYER.LABEL3.CAPTION=Color:
+TFORMPLAYER.LABEL4.CAPTION=Agressivity:
+TFORMPLAYER.CHECKBOXDEFENSIVE.CAPTION=Defensive
+TFORMPLAYER.LABEL5.CAPTION=Start units:
Index: /tags/1.1.0/Forms/UFormPlayer.pas
===================================================================
--- /tags/1.1.0/Forms/UFormPlayer.pas	(revision 137)
+++ /tags/1.1.0/Forms/UFormPlayer.pas	(revision 137)
@@ -0,0 +1,116 @@
+unit UFormPlayer;
+
+{$mode delphi}
+
+interface
+
+uses
+  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
+  ColorBox, Menus, Spin, UGame;
+
+type
+
+  { TFormPlayer }
+
+  TFormPlayer = class(TForm)
+    ButtonCancel: TButton;
+    ButtonOk: TButton;
+    CheckBoxDefensive: TCheckBox;
+    ColorBox1: TColorBox;
+    ComboBoxMode: TComboBox;
+    ComboBoxAgressivity: TComboBox;
+    EditName: TEdit;
+    Label1: TLabel;
+    Label2: TLabel;
+    Label3: TLabel;
+    Label4: TLabel;
+    Label5: TLabel;
+    SpinEditStartUnits: TSpinEdit;
+    procedure ComboBoxModeChange(Sender: TObject);
+    procedure FormShow(Sender: TObject);
+  private
+    { private declarations }
+  public
+    procedure Translate;
+    procedure UpdateInterface;
+    procedure Load(Player: TPlayer);
+    procedure Save(Player: TPlayer);
+  end;
+
+var
+  FormPlayer: TFormPlayer;
+
+implementation
+
+{$R *.lfm}
+
+resourcestring
+  SHuman = 'Human';
+  SComputer = 'Computer';
+  SAgroLow = 'Low';
+  SAgroMedium = 'Medium';
+  SAgroHigh = 'High';
+
+{ TFormPlayer }
+
+procedure TFormPlayer.ComboBoxModeChange(Sender: TObject);
+begin
+  UpdateInterface;
+end;
+
+procedure TFormPlayer.FormShow(Sender: TObject);
+begin
+  UpdateInterface;
+end;
+
+procedure TFormPlayer.Translate;
+var
+  LastIndex: Integer;
+begin
+  with ComboBoxMode do begin
+    LastIndex := ItemIndex;
+    Clear;
+    Items.Add(SHuman);
+    Items.Add(SComputer);
+    ItemIndex := LastIndex;
+  end;
+  with ComboBoxAgressivity do begin
+    LastIndex := ItemIndex;
+    Clear;
+    Items.Add(SAgroLow);
+    Items.Add(SAgroMedium);
+    Items.Add(SAgroHigh);
+    ItemIndex := LastIndex;
+  end;
+end;
+
+procedure TFormPlayer.UpdateInterface;
+begin
+  ComboBoxAgressivity.Visible := ComboBoxMode.ItemIndex = 1;
+  CheckBoxDefensive.Visible := ComboBoxMode.ItemIndex = 1;
+  Label4.Visible := ComboBoxMode.ItemIndex = 1;
+end;
+
+procedure TFormPlayer.Load(Player: TPlayer);
+begin
+  EditName.Text := Player.Name;
+  ComboBoxMode.ItemIndex := Integer(Player.Mode);
+  ColorBox1.Selected := Player.Color;
+  ComboBoxAgressivity.ItemIndex := Integer(Player.Agressivity);
+  CheckBoxDefensive.Checked := Player.Defensive;
+  SpinEditStartUnits.Value := Player.StartUnits;
+  UpdateInterface;
+end;
+
+procedure TFormPlayer.Save(Player: TPlayer);
+begin
+  Player.Name := EditName.Text;
+  Player.Mode := TPlayerMode(ComboBoxMode.ItemIndex);
+  Player.Color := ColorBox1.Selected;
+  Player.Agressivity := TComputerAgressivity(ComboBoxAgressivity.ItemIndex);
+  Player.Defensive := CheckBoxDefensive.Checked;
+  Player.StartUnits := SpinEditStartUnits.Value;
+end;
+
+end.
+
Index: /tags/1.1.0/Forms/UFormSettings.lfm
===================================================================
--- /tags/1.1.0/Forms/UFormSettings.lfm	(revision 137)
+++ /tags/1.1.0/Forms/UFormSettings.lfm	(revision 137)
@@ -0,0 +1,165 @@
+object FormSettings: TFormSettings
+  Left = 404
+  Height = 327
+  Top = 574
+  Width = 554
+  ActiveControl = ButtonOk
+  Caption = 'Settings'
+  ClientHeight = 327
+  ClientWidth = 554
+  Constraints.MinHeight = 327
+  Constraints.MinWidth = 554
+  OnCreate = FormCreate
+  OnShow = FormShow
+  Position = poMainFormCenter
+  LCLVersion = '1.4.4.0'
+  object ButtonOk: TButton
+    Left = 444
+    Height = 25
+    Top = 284
+    Width = 75
+    Anchors = [akRight, akBottom]
+    Caption = 'Ok'
+    ModalResult = 1
+    TabOrder = 0
+  end
+  object ButtonCancel: TButton
+    Left = 322
+    Height = 25
+    Top = 284
+    Width = 75
+    Anchors = [akRight, akBottom]
+    Caption = 'Cancel'
+    ModalResult = 2
+    TabOrder = 1
+  end
+  object PageControl1: TPageControl
+    Left = 4
+    Height = 264
+    Top = 4
+    Width = 546
+    ActivePage = TabSheetGeneral
+    Align = alTop
+    Anchors = [akTop, akLeft, akRight, akBottom]
+    BorderSpacing.Around = 4
+    TabIndex = 0
+    TabOrder = 2
+    object TabSheetGeneral: TTabSheet
+      Caption = 'General'
+      ClientHeight = 226
+      ClientWidth = 538
+      object Label2: TLabel
+        Left = 27
+        Height = 25
+        Top = 78
+        Width = 139
+        Caption = 'Animation speed:'
+        ParentColor = False
+      end
+      object SpinEditAnimSpeed: TSpinEdit
+        Left = 232
+        Height = 33
+        Top = 72
+        Width = 122
+        TabOrder = 0
+      end
+      object Label3: TLabel
+        Left = 368
+        Height = 25
+        Top = 82
+        Width = 15
+        Caption = '%'
+        ParentColor = False
+      end
+      object CheckBox1: TCheckBox
+        Left = 8
+        Height = 27
+        Top = 112
+        Width = 584
+        Anchors = [akTop, akLeft, akRight]
+        AutoSize = False
+        Caption = 'Autosave game on each turn'
+        TabOrder = 1
+      end
+      object Label1: TLabel
+        Left = 20
+        Height = 25
+        Top = 26
+        Width = 81
+        Caption = 'Language:'
+        ParentColor = False
+      end
+      object ComboBoxLanguage: TComboBox
+        Left = 178
+        Height = 33
+        Top = 24
+        Width = 196
+        ItemHeight = 25
+        Style = csDropDownList
+        TabOrder = 2
+      end
+    end
+    object TabSheetDebug: TTabSheet
+      Caption = 'Debug'
+      ClientHeight = 226
+      ClientWidth = 538
+      object CheckBoxDevelMode: TCheckBox
+        Left = 16
+        Height = 27
+        Top = 136
+        Width = 512
+        Anchors = [akTop, akLeft, akRight]
+        AutoSize = False
+        Caption = 'Developer mode'
+        TabOrder = 0
+      end
+      object Label4: TLabel
+        Left = 14
+        Height = 25
+        Top = 67
+        Width = 32
+        Caption = 'DPI:'
+        ParentColor = False
+      end
+      object SpinEditX: TSpinEdit
+        Left = 104
+        Height = 33
+        Top = 64
+        Width = 96
+        MaxValue = 500
+        MinValue = 20
+        TabOrder = 1
+        Value = 50
+      end
+      object SpinEditY: TSpinEdit
+        Left = 232
+        Height = 33
+        Top = 64
+        Width = 90
+        MaxValue = 500
+        MinValue = 20
+        TabOrder = 2
+        Value = 20
+      end
+      object Label5: TLabel
+        Left = 208
+        Height = 25
+        Top = 67
+        Width = 8
+        Caption = 'x'
+        ParentColor = False
+      end
+      object CheckBox2: TCheckBox
+        Left = 16
+        Height = 24
+        Top = 32
+        Width = 508
+        Anchors = [akTop, akLeft, akRight]
+        AutoSize = False
+        Caption = 'Automatic DPI'
+        OnChange = CheckBox2Change
+        TabOrder = 3
+      end
+    end
+  end
+end
Index: /tags/1.1.0/Forms/UFormSettings.lrt
===================================================================
--- /tags/1.1.0/Forms/UFormSettings.lrt	(revision 137)
+++ /tags/1.1.0/Forms/UFormSettings.lrt	(revision 137)
@@ -0,0 +1,13 @@
+TFORMSETTINGS.CAPTION=Settings
+TFORMSETTINGS.BUTTONOK.CAPTION=Ok
+TFORMSETTINGS.BUTTONCANCEL.CAPTION=Cancel
+TFORMSETTINGS.TABSHEETGENERAL.CAPTION=General
+TFORMSETTINGS.LABEL2.CAPTION=Animation speed:
+TFORMSETTINGS.LABEL3.CAPTION=%
+TFORMSETTINGS.CHECKBOX1.CAPTION=Autosave game on each turn
+TFORMSETTINGS.LABEL1.CAPTION=Language:
+TFORMSETTINGS.TABSHEETDEBUG.CAPTION=Debug
+TFORMSETTINGS.CHECKBOXDEVELMODE.CAPTION=Developer mode
+TFORMSETTINGS.LABEL4.CAPTION=DPI:
+TFORMSETTINGS.LABEL5.CAPTION=x
+TFORMSETTINGS.CHECKBOX2.CAPTION=Automatic DPI
Index: /tags/1.1.0/Forms/UFormSettings.pas
===================================================================
--- /tags/1.1.0/Forms/UFormSettings.pas	(revision 137)
+++ /tags/1.1.0/Forms/UFormSettings.pas	(revision 137)
@@ -0,0 +1,98 @@
+unit UFormSettings;
+
+{$mode delphi}
+
+interface
+
+uses
+  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
+  Spin, ComCtrls;
+
+type
+
+  { TFormSettings }
+
+  TFormSettings = class(TForm)
+    ButtonOk: TButton;
+    ButtonCancel: TButton;
+    CheckBox1: TCheckBox;
+    CheckBox2: TCheckBox;
+    CheckBoxDevelMode: TCheckBox;
+    ComboBoxLanguage: TComboBox;
+    Label1: TLabel;
+    Label2: TLabel;
+    Label3: TLabel;
+    Label4: TLabel;
+    Label5: TLabel;
+    PageControl1: TPageControl;
+    SpinEditX: TSpinEdit;
+    SpinEditY: TSpinEdit;
+    SpinEditAnimSpeed: TSpinEdit;
+    TabSheetGeneral: TTabSheet;
+    TabSheetDebug: TTabSheet;
+    procedure CheckBox2Change(Sender: TObject);
+    procedure FormCreate(Sender: TObject);
+    procedure FormShow(Sender: TObject);
+  private
+    { private declarations }
+  public
+    procedure Load;
+    procedure Save;
+  end;
+
+var
+  FormSettings: TFormSettings;
+
+implementation
+
+{$R *.lfm}
+
+uses
+  UCore, ULanguages;
+
+{ TFormSettings }
+
+procedure TFormSettings.CheckBox2Change(Sender: TObject);
+begin
+  SpinEditX.Enabled := not CheckBox2.Checked;
+  SpinEditY.Enabled := not CheckBox2.Checked;
+end;
+
+procedure TFormSettings.FormCreate(Sender: TObject);
+begin
+  PageControl1.TabIndex := 0;
+end;
+
+procedure TFormSettings.FormShow(Sender: TObject);
+begin
+  {$IFDEF DEBUG}
+  TabSheetDebug.TabVisible := True;
+  {$ELSE}
+  TabSheetDebug.TabVisible := False;
+  {$ENDIF}
+end;
+
+procedure TFormSettings.Load;
+begin
+  Core.CoolTranslator1.LanguageListToStrings(ComboBoxLanguage.Items);
+  ComboBoxLanguage.ItemIndex := ComboBoxLanguage.Items.IndexOfObject(Core.CoolTranslator1.Language);
+  if ComboBoxLanguage.ItemIndex = -1 then ComboBoxLanguage.ItemIndex := 0;
+  CheckBoxDevelMode.Checked := Core.DevelMode;
+  SpinEditAnimSpeed.Value := Core.AnimationSpeed;
+  CheckBox2.Checked := Core.ScaleDPI1.AutoDetect;
+  SpinEditX.Value := Core.ScaleDPI1.DPI.X;
+  SpinEditY.Value := Core.ScaleDPI1.DPI.Y;
+end;
+
+procedure TFormSettings.Save;
+begin
+  if ComboBoxLanguage.ItemIndex <> -1 then
+    Core.CoolTranslator1.Language := TLanguage(ComboBoxLanguage.Items.Objects[ComboBoxLanguage.ItemIndex]);
+  Core.DevelMode := CheckBoxDevelMode.Checked;
+  Core.AnimationSpeed := SpinEditAnimSpeed.Value;
+  Core.ScaleDPI1.AutoDetect := CheckBox2.Checked;
+  Core.ScaleDPI1.DPI := Point(SpinEditX.Value, SpinEditY.Value);
+end;
+
+end.
+
Index: /tags/1.1.0/Install/deb/build.sh
===================================================================
--- /tags/1.1.0/Install/deb/build.sh	(revision 137)
+++ /tags/1.1.0/Install/deb/build.sh	(revision 137)
@@ -0,0 +1,10 @@
+#!/bin/bash
+
+# 64-bit
+#ARCH=x86_64-linux
+
+mkdir -p /tmp/build-root
+cp -r -f ../.. /tmp/build-root
+cp -r -f debian /tmp/build-root
+cd /tmp/build-root
+dpkg-buildpackage -b -rfakeroot -us -uc
Index: /tags/1.1.0/Install/deb/debian/changelog
===================================================================
--- /tags/1.1.0/Install/deb/debian/changelog	(revision 137)
+++ /tags/1.1.0/Install/deb/debian/changelog	(revision 137)
@@ -0,0 +1,5 @@
+xtactics (1.0.0-1) precise; urgency=low
+
+  * Original version 1.0.0 packaged with lazdebian
+
+ -- Chronos <robie@centrum.cz>  Sun, 27 Nov 2016 00:51:08 +0100
Index: /tags/1.1.0/Install/deb/debian/compat
===================================================================
--- /tags/1.1.0/Install/deb/debian/compat	(revision 137)
+++ /tags/1.1.0/Install/deb/debian/compat	(revision 137)
@@ -0,0 +1,1 @@
+8
Index: /tags/1.1.0/Install/deb/debian/control
===================================================================
--- /tags/1.1.0/Install/deb/debian/control	(revision 137)
+++ /tags/1.1.0/Install/deb/debian/control	(revision 137)
@@ -0,0 +1,12 @@
+Source: xtactics
+Maintainer: Chronos <robie@centrum.cz>
+Section: utils
+Priority: optional
+Standards-Version: 1.0.0
+Build-Depends: fpc, lazarus, lcl, lcl-utils, debhelper (>= 8)
+
+Package: xtactics
+Architecture: any
+Depends: ${shlibs:Depends}, ${misc:Depends},
+Description: Turn-based strategic war game inspired by Risk board game. 
+HomePage: http://svn.zdechov.net/trac/xtactics
Index: /tags/1.1.0/Install/deb/debian/copyright
===================================================================
--- /tags/1.1.0/Install/deb/debian/copyright	(revision 137)
+++ /tags/1.1.0/Install/deb/debian/copyright	(revision 137)
@@ -0,0 +1,22 @@
+Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
+
+Files: *
+Copyright: 2016 Chronosoft
+License: GPL-2+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU 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 General Public License for more details.
+ .
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ .
+ On Debian systems, the full text of the GNU General Public
+ License version 2 can be found in the file
+ /usr/share/common-licenses/GPL-2
Index: /tags/1.1.0/Install/deb/debian/rules
===================================================================
--- /tags/1.1.0/Install/deb/debian/rules	(revision 137)
+++ /tags/1.1.0/Install/deb/debian/rules	(revision 137)
@@ -0,0 +1,27 @@
+#!/usr/bin/make -f
+
+ROOT = $(CURDIR)/debian/xtactics
+
+override_dh_auto_clean:
+	$(RM) -r lib
+	$(RM) lib *.res xtactics
+
+override_dh_auto_build:
+	lazbuild --build-mode=Release xtactics.lpi
+
+override_dh_auto_install:
+	install -d -m 755 $(ROOT)/usr/bin
+	install -s -m 755 xtactics $(ROOT)/usr/bin
+	install -d -m 755 $(ROOT)/usr/share/xtactics/languages
+	install -m 755 Languages/xtactics.po $(ROOT)/usr/share/xtactics/languages
+	install -m 755 Languages/xtactics.cs.po $(ROOT)/usr/share/xtactics/languages
+	install -d -m 755 $(ROOT)/usr/share/xtactics/images/maps
+	install -m 755 Images/Maps/Europe.png $(ROOT)/usr/share/xtactics/images/maps
+	install -m 755 Images/Maps/WorldMap.png $(ROOT)/usr/share/xtactics/images/maps
+	install -d -m 755 $(ROOT)/usr/share/applications
+	install -m 755 Install/deb/xtactics.desktop $(ROOT)/usr/share/applications
+	install -d -m 755 $(ROOT)/usr/share/pixmaps
+	install -m 755 Images/64x64/xtactics.png $(ROOT)/usr/share/pixmaps
+
+%:
+	dh $@
Index: /tags/1.1.0/Install/deb/debian/source/format
===================================================================
--- /tags/1.1.0/Install/deb/debian/source/format	(revision 137)
+++ /tags/1.1.0/Install/deb/debian/source/format	(revision 137)
@@ -0,0 +1,1 @@
+3.0 (quilt)
Index: /tags/1.1.0/Install/deb/xtactics.desktop
===================================================================
--- /tags/1.1.0/Install/deb/xtactics.desktop	(revision 137)
+++ /tags/1.1.0/Install/deb/xtactics.desktop	(revision 137)
@@ -0,0 +1,10 @@
+[Desktop Entry]
+Encoding=UTF-8
+Name=xTactics
+Comment=Turn-based strategy game inspired by Risk board game.
+Exec=xtactics
+Icon=xtactics
+Terminal=false
+Type=Application
+Categories=GNOME;Application;Game;
+StartupNotify=true
Index: /tags/1.1.0/Install/win/build.bat
===================================================================
--- /tags/1.1.0/Install/win/build.bat	(revision 137)
+++ /tags/1.1.0/Install/win/build.bat	(revision 137)
@@ -0,0 +1,4 @@
+%LAZDIR%/lazbuild.exe --lazarusdir=%LAZDIR% --build-mode=Release --cpu=i386 ../../xtactics.lpr
+%LAZDIR%/lazbuild.exe --lazarusdir=%LAZDIR% --build-mode=Release --cpu=x86_64 ../../xtactics.lpr
+
+"C:\Program Files (x86)\Inno Setup 5\iscc.exe" xTactics.iss
Index: /tags/1.1.0/Install/win/xTactics.iss
===================================================================
--- /tags/1.1.0/Install/win/xTactics.iss	(revision 137)
+++ /tags/1.1.0/Install/win/xTactics.iss	(revision 137)
@@ -0,0 +1,72 @@
+; Script generated by the Inno Setup Script Wizard.
+; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!
+
+#define MyAppName "xTactics"
+#define MyAppVersion "1.0"
+#define MyAppPublisher "Chronosoft"
+#define MyAppPublisherShort "Chronosoft"
+#define MyAppURL "http://svn.zdechov.net/trac/xtactics"
+#define MyAppExeName "xtactics.exe"
+#define MyAppDebugName "xtactics.dbg"
+#define MyAppSubDir "..\.."
+
+[Setup]
+; NOTE: The value of AppId uniquely identifies this application.
+; Do not use the same AppId value in installers for other applications.
+; (To generate a new GUID, click Tools | Generate GUID inside the IDE.)
+AppId={{044A3DC1-AAED-4ECD-8C43-5376F46460F2}
+AppName={#MyAppName}
+AppVersion={#MyAppVersion}
+;AppVerName={#MyAppName} {#MyAppVersion}
+AppPublisher={#MyAppPublisher}
+AppPublisherURL={#MyAppURL}
+AppSupportURL={#MyAppURL}
+AppUpdatesURL={#MyAppURL}
+DefaultDirName={pf}\{#MyAppPublisherShort}\{#MyAppName}
+DefaultGroupName={#MyAppPublisherShort}\{#MyAppName}
+AllowNoIcons=yes
+OutputDir=.
+OutputBaseFilename=Install-{#MyAppName}-{#MyAppVersion}
+Compression=lzma
+SolidCompression=yes
+ChangesAssociations=yes
+; "ArchitecturesInstallIn64BitMode=x64" requests that the install be
+; done in "64-bit mode" on x64, meaning it should use the native
+; 64-bit Program Files directory and the 64-bit view of the registry.
+; On all other architectures it will install in "32-bit mode".
+ArchitecturesInstallIn64BitMode=x64
+; Note: We don't set ProcessorsAllowed because we want this
+; installation to run on all architectures (including Itanium,
+; since it's capable of running 32-bit code too).
+
+[Languages]
+Name: "english"; MessagesFile: "compiler:Default.isl"
+Name: "czech"; MessagesFile: "compiler:Languages\Czech.isl"
+
+[Tasks]
+Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags:
+
+[Registry]
+Root: HKCU; Subkey: "Software\Chronosoft\xTactics"; Flags: uninsdeletekey
+
+#define FileTypeName "xTactics game"
+Root: HKCR; Subkey: ".xtg"; ValueType: string; ValueName: ""; ValueData: "{#FileTypeName}"; Flags: uninsdeletevalue
+Root: HKCR; Subkey: "{#FileTypeName}"; ValueType: string; ValueName: ""; ValueData: "{#FileTypeName}"; Flags: uninsdeletekey
+Root: HKCR; Subkey: "{#FileTypeName}\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\{#MyAppExeName},0"
+Root: HKCR; Subkey: "{#FileTypeName}\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#MyAppExeName}"" ""%1"""
+
+[Files]
+Source: "{#MyAppSubDir}\lib\x86_64-win64\{#MyAppExeName}"; DestDir: "{app}"; Flags: ignoreversion; Check: Is64BitInstallMode
+Source: "{#MyAppSubDir}\lib\i386-win32\{#MyAppExeName}"; DestDir: "{app}"; Flags: ignoreversion; Check: not Is64BitInstallMode
+Source: "{#MyAppSubDir}\Languages\*.po"; DestDir: "{app}\Languages"; Flags: ignoreversion
+Source: "{#MyAppSubDir}\Images\Maps\*.*"; DestDir: "{app}\Images\Maps"; Flags: ignoreversion
+; NOTE: Don't use "Flags: ignoreversion" on any shared system files
+
+[Icons]
+Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"
+Name: "{group}\{cm:UninstallProgram,{#MyAppName}}"; Filename: "{uninstallexe}"
+Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon
+
+[Run]
+Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, "&", "&&")}}"; Flags: nowait postinstall skipifsilent
+
Index: /tags/1.1.0/Languages/xtactics.cs.po
===================================================================
--- /tags/1.1.0/Languages/xtactics.cs.po	(revision 137)
+++ /tags/1.1.0/Languages/xtactics.cs.po	(revision 137)
@@ -0,0 +1,668 @@
+msgid ""
+msgstr ""
+"Content-Type: text/plain; charset=UTF-8\n"
+"Project-Id-Version: \n"
+"POT-Creation-Date: \n"
+"PO-Revision-Date: \n"
+"Last-Translator: Chronos <robie@centrum.cz>\n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 2.0.2\n"
+"Language: cs\n"
+
+#: tcore.aabout.caption
+msgctxt "tcore.aabout.caption"
+msgid "About"
+msgstr "O aplikaci"
+
+#: tcore.aexit.caption
+msgctxt "TCORE.AEXIT.CAPTION"
+msgid "Exit"
+msgstr "Odejít"
+
+#: tcore.aexit.hint
+msgid "Exit application"
+msgstr "Ukončit aplikaci"
+
+#: tcore.agameend.caption
+msgctxt "TCORE.AGAMEEND.CAPTION"
+msgid "End"
+msgstr "Ukončit"
+
+#: tcore.agameend.hint
+msgid "End game"
+msgstr "Ukončit hru"
+
+#: tcore.agameendturn.caption
+msgctxt "TCORE.AGAMEENDTURN.CAPTION"
+msgid "End turn"
+msgstr "Ukončit tah"
+
+#: tcore.agameendturn.hint
+msgid "End player turn"
+msgstr "Ukončit tah hráče"
+
+#: tcore.agameload.caption
+msgid "Load"
+msgstr "Načíst"
+
+#: tcore.agamenew.caption
+msgctxt "TCORE.AGAMENEW.CAPTION"
+msgid "New"
+msgstr "Nová"
+
+#: tcore.agamenew.hint
+msgctxt "tcore.agamenew.hint"
+msgid "New game"
+msgstr "Nová hra"
+
+#: tcore.agamerestart.caption
+msgctxt "TCORE.AGAMERESTART.CAPTION"
+msgid "Restart"
+msgstr "Restartovat"
+
+#: tcore.agamerestart.hint
+msgid "Restart game"
+msgstr "Restartovat hru"
+
+#: tcore.agamesave.caption
+msgid "Save"
+msgstr "Uložit"
+
+#: tcore.ahelp.caption
+msgctxt "tcore.ahelp.caption"
+msgid "Help"
+msgstr "Nápověda"
+
+#: tcore.asettings.caption
+msgctxt "tcore.asettings.caption"
+msgid "Settings"
+msgstr "Nastavení"
+
+#: tcore.asettings.hint
+msgid "Application settings"
+msgstr "Nastavení aplikace"
+
+#: tcore.ashowcharts.caption
+msgid "Show charts"
+msgstr "Ukázat grafy"
+
+#: tformabout.buttonclose.caption
+msgid "Close"
+msgstr "Zavřít"
+
+#: tformabout.buttonhomepage.caption
+msgid "Home page"
+msgstr "Domovská stránka"
+
+#: tformabout.caption
+msgctxt "tformabout.caption"
+msgid "About"
+msgstr "O aplikaci"
+
+#: tformabout.labelappname.caption
+msgctxt "tformabout.labelappname.caption"
+msgid "xTactics"
+msgstr "xTactics"
+
+#: tformabout.labelcontent.caption
+msgctxt "tformabout.labelcontent.caption"
+msgid "   "
+msgstr "   "
+
+#: tformabout.labeldescription.caption
+msgid "Turn-based strategy game inspired by classic Risk board game. The game is highly configurable to allow to adjust battle field and game rules."
+msgstr "Tahová strategie inspirovaná klasickou deskovou hrou Risk. Hra je vysoce nastavitelná a umožňuje přizpůsobit bitevní pole a herní pravidla."
+
+#: tformcharts.caption
+msgid "Charts"
+msgstr "Grafy"
+
+#: tformcharts.combobox1.text
+msgctxt "tformcharts.combobox1.text"
+msgid "Occupied cells"
+msgstr "Obsazené buňky"
+
+#: tformhelp.caption
+msgctxt "tformhelp.caption"
+msgid "Help"
+msgstr "Nápověda"
+
+#: tformmain.astatusbarvisible.caption
+msgid "Statusbar visible"
+msgstr "Viditelná stavová lišta"
+
+#: tformmain.atoolbarbigicons.caption
+msgid "Toolbar big icons"
+msgstr "Velké ikony panelu"
+
+#: tformmain.atoolbarvisible.caption
+msgid "Toolbar visible"
+msgstr "Viditelný nástrojový panel"
+
+#: tformmain.azoomall.caption
+msgid "Zoom all"
+msgstr "Zobrazit vše"
+
+#: tformmain.azoomin.caption
+msgid "Zoom in"
+msgstr "Přiblížit"
+
+#: tformmain.azoomout.caption
+msgid "Zoom out"
+msgstr "Oddálit"
+
+#: tformmain.caption
+msgctxt "tformmain.caption"
+msgid "xTactics"
+msgstr "xTactics"
+
+#: tformmain.menuitem1.caption
+msgid "Game"
+msgstr "Hra"
+
+#: tformmain.menuitem10.caption
+msgid "View"
+msgstr "Zobrazení"
+
+#: tformmain.menuitem16.caption
+msgctxt "tformmain.menuitem16.caption"
+msgid "Help"
+msgstr "Nápověda"
+
+#: tformmain.menuitem19.caption
+msgctxt "tformmain.menuitem19.caption"
+msgid "-"
+msgstr "-"
+
+#: tformmain.menuitem5.caption
+msgctxt "tformmain.menuitem5.caption"
+msgid "-"
+msgstr "-"
+
+#: tformmain.menuitem8.caption
+#| msgid "Settings"
+msgctxt "tformmain.menuitem8.caption"
+msgid "Tools"
+msgstr "Nástroje"
+
+#: tformmain.menuitemloadrecent.caption
+msgid "Load recent"
+msgstr "Načíst nedávné"
+
+#: tformmove.buttoncancel.caption
+msgctxt "tformmove.buttoncancel.caption"
+msgid "Cancel"
+msgstr "Zrušit"
+
+#: tformmove.buttonok.caption
+msgctxt "tformmove.buttonok.caption"
+msgid "Ok"
+msgstr "Ok"
+
+#: tformmove.buttononcemax.caption
+msgctxt "tformmove.buttononcemax.caption"
+msgid "Max"
+msgstr "Max"
+
+#: tformmove.buttononcemin.caption
+msgctxt "tformmove.buttononcemin.caption"
+msgid "Min"
+msgstr "Min"
+
+#: tformmove.buttonrepeatmax.caption
+msgctxt "tformmove.buttonrepeatmax.caption"
+msgid "Max"
+msgstr "Max"
+
+#: tformmove.buttonrepeatmin.caption
+msgctxt "tformmove.buttonrepeatmin.caption"
+msgid "Min"
+msgstr "Min"
+
+#: tformmove.caption
+msgid "Move"
+msgstr "Přesun"
+
+#: tformmove.label1.caption
+msgid "Once:"
+msgstr "Jednou:"
+
+#: tformmove.label2.caption
+msgid "Every turn:"
+msgstr "Každý tah:"
+
+#: tformmove.label3.caption
+msgid "Win probability:"
+msgstr "Pravděpodobnost vítězství:"
+
+#: tformmove.labelwinprobability.caption
+msgctxt "tformmove.labelwinprobability.caption"
+msgid "   "
+msgstr "   "
+
+#: tformnew.aplayeradd.caption
+#| msgid "Add player"
+msgid "Add"
+msgstr "Přidat"
+
+#: tformnew.aplayermodify.caption
+msgid "Modify player"
+msgstr "Upravit hráče"
+
+#: tformnew.aplayerremove.caption
+#| msgid "Remove player"
+msgid "Remove"
+msgstr "Odstranit"
+
+#: tformnew.buttoncancel.caption
+msgctxt "tformnew.buttoncancel.caption"
+msgid "Cancel"
+msgstr "Zrušit"
+
+#: tformnew.buttonimagebrowse.caption
+msgctxt "tformnew.buttonimagebrowse.caption"
+msgid "Browse"
+msgstr "Vybrat"
+
+#: tformnew.buttonok.caption
+msgctxt "tformnew.buttonok.caption"
+msgid "Ok"
+msgstr "Ok"
+
+#: tformnew.buttonplayermodify.caption
+msgid "Modify"
+msgstr "Upravit"
+
+#: tformnew.caption
+msgctxt "tformnew.caption"
+msgid "New game"
+msgstr "Nová hra"
+
+#: tformnew.checkboxbridges.caption
+msgid "Bridges between cells"
+msgstr "Mosty mezi buňkami"
+
+#: tformnew.checkboxcity.caption
+msgid "Cities"
+msgstr "Města"
+
+#: tformnew.checkboxfogofwar.caption
+msgid "Fog of war"
+msgstr "Skrytá mapa"
+
+#: tformnew.checkboxsymetricmap.caption
+msgid "Symetric map"
+msgstr "Symetrická mapa"
+
+#: tformnew.checkboxvoid.caption
+msgid "Inaccessible places"
+msgstr "Nepřístupná políčka"
+
+#: tformnew.label1.caption
+#| msgid "Map size:"
+msgid "Map width:"
+msgstr "Šířka mapy:"
+
+#: tformnew.label2.caption
+#| msgid "x"
+msgid "Map height:"
+msgstr "Výška mapy:"
+
+#: tformnew.label3.caption
+msgctxt "tformnew.label3.caption"
+msgid "%"
+msgstr "%"
+
+#: tformnew.label4.caption
+msgctxt "tformnew.label4.caption"
+msgid "%"
+msgstr "%"
+
+#: tformnew.label5.caption
+msgid "Grid type:"
+msgstr "Typ mřížky:"
+
+#: tformnew.label6.caption
+msgid "Win objective:"
+msgstr "Cíl vítězství:"
+
+#: tformnew.label7.caption
+msgid "Max random neutral units:"
+msgstr "Nejvíce náhodných neutrálních jednotek:"
+
+#: tformnew.label8.caption
+msgid "Map shape:"
+msgstr "Tvar mapy"
+
+#: tformnew.label9.caption
+msgid "Image file:"
+msgstr "Soubor obrázku:"
+
+#: tformnew.listview1.columns[0].caption
+msgid "Name"
+msgstr "Jméno"
+
+#: tformnew.listview1.columns[1].caption
+msgid "Type"
+msgstr "Typ"
+
+#: tformnew.listview1.columns[2].caption
+msgid "Color"
+msgstr "Barva"
+
+#: tformnew.listview1.columns[3].caption
+msgid "Start units"
+msgstr "Počátečních jednotek"
+
+#: tformnew.radiogroupgrowamount.caption
+msgid "Per turn grow amount"
+msgstr "Množství růstu za tah"
+
+#: tformnew.radiogroupgrowcells.caption
+msgid "Growing cells"
+msgstr "Rostoucí buňky:"
+
+#: tformnew.tabsheet1.caption
+msgid "Players"
+msgstr "Hráči"
+
+#: tformnew.tabsheet2.caption
+msgid "Map"
+msgstr "Mapa"
+
+#: tformnew.tabsheet3.caption
+msgid "Rules"
+msgstr "Pravidla"
+
+#: tformplayer.buttoncancel.caption
+msgctxt "tformplayer.buttoncancel.caption"
+msgid "Cancel"
+msgstr "Zrušit"
+
+#: tformplayer.buttonok.caption
+msgctxt "tformplayer.buttonok.caption"
+msgid "Ok"
+msgstr "Ok"
+
+#: tformplayer.caption
+msgctxt "tformplayer.caption"
+msgid "Player"
+msgstr "Hráč"
+
+#: tformplayer.checkboxdefensive.caption
+msgid "Defensive"
+msgstr "Obranný"
+
+#: tformplayer.comboboxmode.text
+msgctxt "tformplayer.comboboxmode.text"
+msgid "Human"
+msgstr "Člověk"
+
+#: tformplayer.label1.caption
+msgid "Name:"
+msgstr "Jméno:"
+
+#: tformplayer.label2.caption
+msgid "Mode:"
+msgstr "Režim:"
+
+#: tformplayer.label3.caption
+msgid "Color:"
+msgstr "Barva:"
+
+#: tformplayer.label4.caption
+msgid "Agressivity:"
+msgstr "Agresivita:"
+
+#: tformplayer.label5.caption
+msgid "Start units:"
+msgstr "Počátečních jednotek:"
+
+#: tformsettings.buttoncancel.caption
+msgctxt "tformsettings.buttoncancel.caption"
+msgid "Cancel"
+msgstr "Zrušit"
+
+#: tformsettings.buttonok.caption
+msgctxt "tformsettings.buttonok.caption"
+msgid "Ok"
+msgstr "Ok"
+
+#: tformsettings.caption
+msgctxt "tformsettings.caption"
+msgid "Settings"
+msgstr "Nastavení"
+
+#: tformsettings.checkbox1.caption
+msgid "Autosave game on each turn"
+msgstr "Automaticky uložit hru po každém tahu"
+
+#: tformsettings.checkbox2.caption
+msgid "Automatic DPI"
+msgstr "Automatické DPI"
+
+#: tformsettings.checkboxdevelmode.caption
+msgid "Developer mode"
+msgstr "Vývojářský režim"
+
+#: tformsettings.label1.caption
+msgid "Language:"
+msgstr "Jazyk:"
+
+#: tformsettings.label2.caption
+msgid "Animation speed:"
+msgstr "Rychlost animace:"
+
+#: tformsettings.label3.caption
+msgctxt "tformsettings.label3.caption"
+msgid "%"
+msgstr "%"
+
+#: tformsettings.label4.caption
+msgid "DPI:"
+msgstr "DPI:"
+
+#: tformsettings.label5.caption
+msgid "x"
+msgstr "x"
+
+#: tformsettings.tabsheetdebug.caption
+msgid "Debug"
+msgstr "Ladění"
+
+#: tformsettings.tabsheetgeneral.caption
+msgid "General"
+msgstr "Obecné"
+
+#: ucore.sendgame
+msgid "End game?"
+msgstr "Ukončit hru?"
+
+#: ucore.sendgamequestion
+msgid "Do you want to end current game?"
+msgstr "Chcete ukončit aktuální hru?"
+
+#: ucore.splayerwins
+msgctxt "ucore.splayerwins"
+msgid "Player %s wins"
+msgstr "Hráč %s vyhrál"
+
+#: ucore.srestartgame
+msgid "Restart game?"
+msgstr "Restartovat hru?"
+
+#: ucore.srestartgamequestion
+msgid "Do you want to restart current game?"
+msgstr "Chcete restartovat aktuální hru?"
+
+#: uformabout.slicense
+msgid "License"
+msgstr "Licence"
+
+#: uformabout.sreleasedate
+msgid "Release date"
+msgstr "Datum uvolnění"
+
+#: uformabout.sversion
+msgid "Version"
+msgstr "Verze"
+
+#: uformcharts.scitiescount
+msgid "Cities count"
+msgstr "Počet měst"
+
+#: uformcharts.sdiscoveredcells
+msgid "Discovered cells"
+msgstr "Objevených buněk"
+
+#: uformcharts.smilitarypower
+msgid "Military power"
+msgstr "Vojenská síla"
+
+#: uformcharts.soccupiedcells
+msgctxt "uformcharts.soccupiedcells"
+msgid "Occupied cells"
+msgstr "Obsazené buňky"
+
+#: uformhelp.scontent
+msgid ""
+"xTactics is a risk based strategic game. Main focus of the game is to offer player various possibilities to configure game conditions. Map for game is generated randomly for each play. Game is multiplayer so single player can play with other human opponents or with many computer opponents.\n"
+"\n"
+"Each cell has defined number of units which can be instructed to attack enemy or neutral adjacent cells. Units can also defend against enemy attach from adjacent cells. You can move units inside your territory. \n"
+"Number of units in cells grows by square root of number of units. More units cell contains, more units is added each turn. Maximum number to which units grow is 99. Cell can have more units but excessive cells will die gradually every turn to balance to number 99.\n"
+"\n"
+"Resolution of attack of units is determined by rule similar to one which is used in Risk game. Battle consist of several fights. Each fight attacker can use up to 3 units and defender up to 2 units. Number of units for each side determine number of dices. Both sides roll their dices and order them in descending order. Each side takes one dice with highest value. One who has dice with higher value wins. In case of tie, defender wins. Loser lose its unit and another pair of dices is evaluated. This process is calculated automatically and for each planned attack win probability is displayed.\n"
+msgstr ""
+"xTactics je strategická hra založena na hře Risk. Hlavní zaměření hry je nabídnout hráči různé možnosti k nastavení podmínek hry. Mapa hry je generována náhodně pro každou hru. Hra je pro více hráčů takže jeden hráč může hrát s dalšími lidskými protivníky nebo s mnoha počítačovými protivníky.\n"
+"\n"
+"Každá buňka má určitý počet jednotek, které mohou být použity k útoku na přilehlé nepřátelské nebo neutrální buňky. Jednotky se mohou bránit proti nepřátelském útoku z přilehlých buněk. Můžete přesouvat jednotky uvnitř území.\n"
+"Počet jednotek v buňkách roste o odmocninu počtu jednotek. Čím více jednotek buňka obsahuje, tím více jednotek je přidáno každý tah. Nejvyšší počet, po který jednotky rostou je 99. Buňka může mít více jednotek, ale nadbytečné jednotky umírají postupně každý tah pro vyrovnání čísla na 99.\n"
+"\n"
+"Vyhodnocení útoku jednotek je určen pravidlem podobným tomu, které je použito u hry Risk. Bitva se skládá z několika bojů. Každá boj útočník může použít do 3 jednotek a obránce do 2 jednotek. Počet jednotek pro každou stranu určuje počet kostek. Obě strany házejí jejich kostkami a seřadí je v sestupném pořadí. Každá strana bere jednu kostku s nejvyšší hodnotou. Ten, který má kostku s vyšší hodnotou vyhrává. V případě remízy, vyhrává obránce. Prohrávající ztrácí své jednotky a další pár kostek je vyhodnocen. Tento proces je vypočítáván automaticky a pro každý plánovaný útok je zobrazena odhadovaná pravděpodobnost.\n"
+
+#: uformmain.sturn
+msgid "turn"
+msgstr "tah"
+
+#: uformnew.sfromimagefile
+msgid "From image file"
+msgstr "Obrázek ze souboru"
+
+#: uformnew.sgridtypehexagon
+msgid "Hexagonal"
+msgstr "Hexagonální"
+
+#: uformnew.sgridtypesquare
+msgid "Square"
+msgstr "Čtvercová"
+
+#: uformnew.sgridtypetriangle
+msgid "Triangonal"
+msgstr "Trojúhelníková"
+
+#: uformnew.sgridtypevoronoi
+msgid "Voronoi random"
+msgstr "Náhodná Voroného"
+
+#: uformnew.sgrowamountbyone
+msgid "By one"
+msgstr "O jeden"
+
+#: uformnew.sgrowamountbysquareroot
+msgid "By square root"
+msgstr "O odmocninu"
+
+#: uformnew.sgrownone
+msgid "None"
+msgstr "Nikde"
+
+#: uformnew.sgrowplayerallcells
+msgid "Player all cells"
+msgstr "Všechny buňky hráče"
+
+#: uformnew.sgrowplayercities
+msgid "Player cities"
+msgstr "Města hráče"
+
+#: uformnew.srectangular
+msgid "Rectangular"
+msgstr "Obdelníkový"
+
+#: uformnew.swinobjectivecaptureposition
+msgid "Capture position"
+msgstr "Dobít pozici"
+
+#: uformnew.swinobjectivedefeatallcities
+msgid "Defeat all oponents cities"
+msgstr "Porazit všechny města nepřátelů"
+
+#: uformnew.swinobjectivedefeatalloponents
+msgid "Defeat all oponents"
+msgstr "Porazit všechny nepřátele"
+
+#: uformnew.swinobjectivestayaliveforturns
+msgid "Stay alive for number of turns"
+msgstr "Zůstat naživu určený počet tahů"
+
+#: uformplayer.sagrohigh
+msgid "High"
+msgstr "Vysoká"
+
+#: uformplayer.sagrolow
+msgid "Low"
+msgstr "Nízká"
+
+#: uformplayer.sagromedium
+msgid "Medium"
+msgstr "Střední"
+
+#: uformplayer.scomputer
+msgctxt "uformplayer.scomputer"
+msgid "Computer"
+msgstr "Počítač"
+
+#: uformplayer.shuman
+msgctxt "uformplayer.shuman"
+msgid "Human"
+msgstr "Člověk"
+
+#: ugame.scannotsetplayerstartcells
+msgid "Cannot choose start cell for player"
+msgstr "Nelze vybrat počáteční buňky hráčů."
+
+#: ugame.scomputer
+msgctxt "ugame.scomputer"
+msgid "Computer"
+msgstr "Počítač"
+
+#: ugame.shuman
+msgctxt "ugame.shuman"
+msgid "Human"
+msgstr "Člověk"
+
+#: ugame.sminimumplayers
+msgid "You need at least two players"
+msgstr "Potřebujete alespoň dva hráče"
+
+#: ugame.snewgamefile
+msgid "New game.xtg"
+msgstr "Nová hra.xtg"
+
+#: ugame.splayer
+msgctxt "ugame.splayer"
+msgid "Player"
+msgstr "Hráč"
+
+#: ugame.sunfinishedbattle
+msgid "Unfinished battle"
+msgstr "Neukončená bitva"
+
+#: ugame.swrongfileformat
+msgid "Wrong file format"
+msgstr "Chybný formát souboru"
+
+#: ugame.szerozoomnotalowed
+msgid "Zero zoom not allowed"
+msgstr "Nulové přiblížení není povoleno"
Index: /tags/1.1.0/Languages/xtactics.po
===================================================================
--- /tags/1.1.0/Languages/xtactics.po	(revision 137)
+++ /tags/1.1.0/Languages/xtactics.po	(revision 137)
@@ -0,0 +1,648 @@
+msgid ""
+msgstr "Content-Type: text/plain; charset=UTF-8"
+
+#: tcore.aabout.caption
+msgctxt "TCORE.AABOUT.CAPTION"
+msgid "About"
+msgstr ""
+
+#: tcore.aexit.caption
+msgctxt "TCORE.AEXIT.CAPTION"
+msgid "Exit"
+msgstr ""
+
+#: tcore.aexit.hint
+msgid "Exit application"
+msgstr ""
+
+#: tcore.agameend.caption
+msgctxt "TCORE.AGAMEEND.CAPTION"
+msgid "End"
+msgstr ""
+
+#: tcore.agameend.hint
+msgid "End game"
+msgstr ""
+
+#: tcore.agameendturn.caption
+msgctxt "TCORE.AGAMEENDTURN.CAPTION"
+msgid "End turn"
+msgstr ""
+
+#: tcore.agameendturn.hint
+msgid "End player turn"
+msgstr ""
+
+#: tcore.agameload.caption
+msgid "Load"
+msgstr ""
+
+#: tcore.agamenew.caption
+msgctxt "TCORE.AGAMENEW.CAPTION"
+msgid "New"
+msgstr ""
+
+#: tcore.agamenew.hint
+msgctxt "TCORE.AGAMENEW.HINT"
+msgid "New game"
+msgstr ""
+
+#: tcore.agamerestart.caption
+msgctxt "TCORE.AGAMERESTART.CAPTION"
+msgid "Restart"
+msgstr ""
+
+#: tcore.agamerestart.hint
+msgid "Restart game"
+msgstr ""
+
+#: tcore.agamesave.caption
+msgid "Save"
+msgstr ""
+
+#: tcore.ahelp.caption
+msgctxt "TCORE.AHELP.CAPTION"
+msgid "Help"
+msgstr ""
+
+#: tcore.asettings.caption
+msgctxt "tcore.asettings.caption"
+msgid "Settings"
+msgstr ""
+
+#: tcore.asettings.hint
+msgid "Application settings"
+msgstr ""
+
+#: tcore.ashowcharts.caption
+msgid "Show charts"
+msgstr ""
+
+#: tformabout.buttonclose.caption
+msgid "Close"
+msgstr ""
+
+#: tformabout.buttonhomepage.caption
+msgid "Home page"
+msgstr ""
+
+#: tformabout.caption
+msgctxt "tformabout.caption"
+msgid "About"
+msgstr ""
+
+#: tformabout.labelappname.caption
+msgctxt "TFORMABOUT.LABELAPPNAME.CAPTION"
+msgid "xTactics"
+msgstr ""
+
+#: tformabout.labelcontent.caption
+msgctxt "TFORMABOUT.LABELCONTENT.CAPTION"
+msgid "   "
+msgstr ""
+
+#: tformabout.labeldescription.caption
+msgid "Turn-based strategy game inspired by classic Risk board game. The game is highly configurable to allow to adjust battle field and game rules."
+msgstr ""
+
+#: tformcharts.caption
+msgid "Charts"
+msgstr ""
+
+#: tformcharts.combobox1.text
+msgctxt "tformcharts.combobox1.text"
+msgid "Occupied cells"
+msgstr ""
+
+#: tformhelp.caption
+msgctxt "TFORMHELP.CAPTION"
+msgid "Help"
+msgstr ""
+
+#: tformmain.astatusbarvisible.caption
+msgid "Statusbar visible"
+msgstr ""
+
+#: tformmain.atoolbarbigicons.caption
+msgid "Toolbar big icons"
+msgstr ""
+
+#: tformmain.atoolbarvisible.caption
+msgid "Toolbar visible"
+msgstr ""
+
+#: tformmain.azoomall.caption
+msgid "Zoom all"
+msgstr ""
+
+#: tformmain.azoomin.caption
+msgid "Zoom in"
+msgstr ""
+
+#: tformmain.azoomout.caption
+msgid "Zoom out"
+msgstr ""
+
+#: tformmain.caption
+msgctxt "tformmain.caption"
+msgid "xTactics"
+msgstr ""
+
+#: tformmain.menuitem1.caption
+msgid "Game"
+msgstr ""
+
+#: tformmain.menuitem10.caption
+msgid "View"
+msgstr ""
+
+#: tformmain.menuitem16.caption
+msgctxt "tformmain.menuitem16.caption"
+msgid "Help"
+msgstr ""
+
+#: tformmain.menuitem19.caption
+msgctxt "TFORMMAIN.MENUITEM19.CAPTION"
+msgid "-"
+msgstr ""
+
+#: tformmain.menuitem5.caption
+msgctxt "tformmain.menuitem5.caption"
+msgid "-"
+msgstr ""
+
+#: tformmain.menuitem8.caption
+msgctxt "tformmain.menuitem8.caption"
+msgid "Tools"
+msgstr ""
+
+#: tformmain.menuitemloadrecent.caption
+msgid "Load recent"
+msgstr ""
+
+#: tformmove.buttoncancel.caption
+msgctxt "tformmove.buttoncancel.caption"
+msgid "Cancel"
+msgstr ""
+
+#: tformmove.buttonok.caption
+msgctxt "tformmove.buttonok.caption"
+msgid "Ok"
+msgstr ""
+
+#: tformmove.buttononcemax.caption
+msgctxt "tformmove.buttononcemax.caption"
+msgid "Max"
+msgstr ""
+
+#: tformmove.buttononcemin.caption
+msgctxt "tformmove.buttononcemin.caption"
+msgid "Min"
+msgstr ""
+
+#: tformmove.buttonrepeatmax.caption
+msgctxt "TFORMMOVE.BUTTONREPEATMAX.CAPTION"
+msgid "Max"
+msgstr ""
+
+#: tformmove.buttonrepeatmin.caption
+msgctxt "TFORMMOVE.BUTTONREPEATMIN.CAPTION"
+msgid "Min"
+msgstr ""
+
+#: tformmove.caption
+msgid "Move"
+msgstr ""
+
+#: tformmove.label1.caption
+msgid "Once:"
+msgstr ""
+
+#: tformmove.label2.caption
+msgid "Every turn:"
+msgstr ""
+
+#: tformmove.label3.caption
+msgid "Win probability:"
+msgstr ""
+
+#: tformmove.labelwinprobability.caption
+msgctxt "tformmove.labelwinprobability.caption"
+msgid "   "
+msgstr ""
+
+#: tformnew.aplayeradd.caption
+msgid "Add"
+msgstr ""
+
+#: tformnew.aplayermodify.caption
+msgid "Modify player"
+msgstr ""
+
+#: tformnew.aplayerremove.caption
+msgid "Remove"
+msgstr ""
+
+#: tformnew.buttoncancel.caption
+msgctxt "TFORMNEW.BUTTONCANCEL.CAPTION"
+msgid "Cancel"
+msgstr ""
+
+#: tformnew.buttonimagebrowse.caption
+msgctxt "TFORMNEW.BUTTONIMAGEBROWSE.CAPTION"
+msgid "Browse"
+msgstr ""
+
+#: tformnew.buttonok.caption
+msgctxt "TFORMNEW.BUTTONOK.CAPTION"
+msgid "Ok"
+msgstr ""
+
+#: tformnew.buttonplayermodify.caption
+msgid "Modify"
+msgstr ""
+
+#: tformnew.caption
+msgctxt "tformnew.caption"
+msgid "New game"
+msgstr ""
+
+#: tformnew.checkboxbridges.caption
+msgid "Bridges between cells"
+msgstr ""
+
+#: tformnew.checkboxcity.caption
+msgid "Cities"
+msgstr ""
+
+#: tformnew.checkboxfogofwar.caption
+msgid "Fog of war"
+msgstr ""
+
+#: tformnew.checkboxsymetricmap.caption
+msgid "Symetric map"
+msgstr ""
+
+#: tformnew.checkboxvoid.caption
+msgid "Inaccessible places"
+msgstr ""
+
+#: tformnew.label1.caption
+msgid "Map width:"
+msgstr ""
+
+#: tformnew.label2.caption
+msgid "Map height:"
+msgstr ""
+
+#: tformnew.label3.caption
+msgctxt "tformnew.label3.caption"
+msgid "%"
+msgstr ""
+
+#: tformnew.label4.caption
+msgctxt "TFORMNEW.LABEL4.CAPTION"
+msgid "%"
+msgstr ""
+
+#: tformnew.label5.caption
+msgid "Grid type:"
+msgstr ""
+
+#: tformnew.label6.caption
+msgid "Win objective:"
+msgstr ""
+
+#: tformnew.label7.caption
+msgid "Max random neutral units:"
+msgstr ""
+
+#: tformnew.label8.caption
+msgid "Map shape:"
+msgstr ""
+
+#: tformnew.label9.caption
+msgid "Image file:"
+msgstr ""
+
+#: tformnew.listview1.columns[0].caption
+msgid "Name"
+msgstr ""
+
+#: tformnew.listview1.columns[1].caption
+msgid "Type"
+msgstr ""
+
+#: tformnew.listview1.columns[2].caption
+msgid "Color"
+msgstr ""
+
+#: tformnew.listview1.columns[3].caption
+msgid "Start units"
+msgstr ""
+
+#: tformnew.radiogroupgrowamount.caption
+msgid "Per turn grow amount"
+msgstr ""
+
+#: tformnew.radiogroupgrowcells.caption
+msgid "Growing cells"
+msgstr ""
+
+#: tformnew.tabsheet1.caption
+msgid "Players"
+msgstr ""
+
+#: tformnew.tabsheet2.caption
+msgid "Map"
+msgstr ""
+
+#: tformnew.tabsheet3.caption
+msgid "Rules"
+msgstr ""
+
+#: tformplayer.buttoncancel.caption
+msgctxt "TFORMPLAYER.BUTTONCANCEL.CAPTION"
+msgid "Cancel"
+msgstr ""
+
+#: tformplayer.buttonok.caption
+msgctxt "TFORMPLAYER.BUTTONOK.CAPTION"
+msgid "Ok"
+msgstr ""
+
+#: tformplayer.caption
+msgctxt "tformplayer.caption"
+msgid "Player"
+msgstr ""
+
+#: tformplayer.checkboxdefensive.caption
+msgid "Defensive"
+msgstr ""
+
+#: tformplayer.comboboxmode.text
+msgctxt "TFORMPLAYER.COMBOBOXMODE.TEXT"
+msgid "Human"
+msgstr ""
+
+#: tformplayer.label1.caption
+msgid "Name:"
+msgstr ""
+
+#: tformplayer.label2.caption
+msgid "Mode:"
+msgstr ""
+
+#: tformplayer.label3.caption
+msgid "Color:"
+msgstr ""
+
+#: tformplayer.label4.caption
+msgid "Agressivity:"
+msgstr ""
+
+#: tformplayer.label5.caption
+msgid "Start units:"
+msgstr ""
+
+#: tformsettings.buttoncancel.caption
+msgctxt "TFORMSETTINGS.BUTTONCANCEL.CAPTION"
+msgid "Cancel"
+msgstr ""
+
+#: tformsettings.buttonok.caption
+msgctxt "TFORMSETTINGS.BUTTONOK.CAPTION"
+msgid "Ok"
+msgstr ""
+
+#: tformsettings.caption
+msgctxt "tformsettings.caption"
+msgid "Settings"
+msgstr ""
+
+#: tformsettings.checkbox1.caption
+msgid "Autosave game on each turn"
+msgstr ""
+
+#: tformsettings.checkbox2.caption
+msgid "Automatic DPI"
+msgstr ""
+
+#: tformsettings.checkboxdevelmode.caption
+msgid "Developer mode"
+msgstr ""
+
+#: tformsettings.label1.caption
+msgid "Language:"
+msgstr ""
+
+#: tformsettings.label2.caption
+msgid "Animation speed:"
+msgstr ""
+
+#: tformsettings.label3.caption
+msgctxt "TFORMSETTINGS.LABEL3.CAPTION"
+msgid "%"
+msgstr ""
+
+#: tformsettings.label4.caption
+msgid "DPI:"
+msgstr ""
+
+#: tformsettings.label5.caption
+msgid "x"
+msgstr ""
+
+#: tformsettings.tabsheetdebug.caption
+msgid "Debug"
+msgstr ""
+
+#: tformsettings.tabsheetgeneral.caption
+msgid "General"
+msgstr ""
+
+#: ucore.sendgame
+msgid "End game?"
+msgstr ""
+
+#: ucore.sendgamequestion
+msgid "Do you want to end current game?"
+msgstr ""
+
+#: ucore.splayerwins
+msgctxt "ucore.splayerwins"
+msgid "Player %s wins"
+msgstr ""
+
+#: ucore.srestartgame
+msgid "Restart game?"
+msgstr ""
+
+#: ucore.srestartgamequestion
+msgid "Do you want to restart current game?"
+msgstr ""
+
+#: uformabout.slicense
+msgid "License"
+msgstr ""
+
+#: uformabout.sreleasedate
+msgid "Release date"
+msgstr ""
+
+#: uformabout.sversion
+msgid "Version"
+msgstr ""
+
+#: uformcharts.scitiescount
+msgid "Cities count"
+msgstr ""
+
+#: uformcharts.sdiscoveredcells
+msgid "Discovered cells"
+msgstr ""
+
+#: uformcharts.smilitarypower
+msgid "Military power"
+msgstr ""
+
+#: uformcharts.soccupiedcells
+msgctxt "uformcharts.soccupiedcells"
+msgid "Occupied cells"
+msgstr ""
+
+#: uformhelp.scontent
+msgid ""
+"xTactics is a risk based strategic game. Main focus of the game is to offer player various possibilities to configure game conditions. Map for game is generated randomly for each play. Game is multiplayer so single player can play with other human opponents or with many computer opponents.\n"
+"\n"
+"Each cell has defined number of units which can be instructed to attack enemy or neutral adjacent cells. Units can also defend against enemy attach from adjacent cells. You can move units inside your territory. \n"
+"Number of units in cells grows by square root of number of units. More units cell contains, more units is added each turn. Maximum number to which units grow is 99. Cell can have more units but excessive cells will die gradually every turn to balance to number 99.\n"
+"\n"
+"Resolution of attack of units is determined by rule similar to one which is used in Risk game. Battle consist of several fights. Each fight attacker can use up to 3 units and defender up to 2 units. Number of units for each side determine number of dices. Both sides roll their dices and order them in descending order. Each side takes one dice with highest value. One who has dice with higher value wins. In case of tie, defender wins. Loser lose its unit and another pair of dices is evaluated. This process is calculated automatically and for each planned attack win probability is displayed.\n"
+msgstr ""
+
+#: uformmain.sturn
+msgid "turn"
+msgstr ""
+
+#: uformnew.sfromimagefile
+msgid "From image file"
+msgstr ""
+
+#: uformnew.sgridtypehexagon
+msgid "Hexagonal"
+msgstr ""
+
+#: uformnew.sgridtypesquare
+msgid "Square"
+msgstr ""
+
+#: uformnew.sgridtypetriangle
+msgid "Triangonal"
+msgstr ""
+
+#: uformnew.sgridtypevoronoi
+msgid "Voronoi random"
+msgstr ""
+
+#: uformnew.sgrowamountbyone
+msgid "By one"
+msgstr ""
+
+#: uformnew.sgrowamountbysquareroot
+msgid "By square root"
+msgstr ""
+
+#: uformnew.sgrownone
+msgid "None"
+msgstr ""
+
+#: uformnew.sgrowplayerallcells
+msgid "Player all cells"
+msgstr ""
+
+#: uformnew.sgrowplayercities
+msgid "Player cities"
+msgstr ""
+
+#: uformnew.srectangular
+msgid "Rectangular"
+msgstr ""
+
+#: uformnew.swinobjectivecaptureposition
+msgid "Capture position"
+msgstr ""
+
+#: uformnew.swinobjectivedefeatallcities
+msgid "Defeat all oponents cities"
+msgstr ""
+
+#: uformnew.swinobjectivedefeatalloponents
+msgid "Defeat all oponents"
+msgstr ""
+
+#: uformnew.swinobjectivestayaliveforturns
+msgid "Stay alive for number of turns"
+msgstr ""
+
+#: uformplayer.sagrohigh
+msgid "High"
+msgstr ""
+
+#: uformplayer.sagrolow
+msgid "Low"
+msgstr ""
+
+#: uformplayer.sagromedium
+msgid "Medium"
+msgstr ""
+
+#: uformplayer.scomputer
+msgctxt "uformplayer.scomputer"
+msgid "Computer"
+msgstr ""
+
+#: uformplayer.shuman
+msgctxt "uformplayer.shuman"
+msgid "Human"
+msgstr ""
+
+#: ugame.scannotsetplayerstartcells
+msgid "Cannot choose start cell for player"
+msgstr ""
+
+#: ugame.scomputer
+msgctxt "ugame.scomputer"
+msgid "Computer"
+msgstr ""
+
+#: ugame.shuman
+msgctxt "ugame.shuman"
+msgid "Human"
+msgstr ""
+
+#: ugame.sminimumplayers
+msgid "You need at least two players"
+msgstr ""
+
+#: ugame.snewgamefile
+msgid "New game.xtg"
+msgstr ""
+
+#: ugame.splayer
+msgctxt "ugame.splayer"
+msgid "Player"
+msgstr ""
+
+#: ugame.sunfinishedbattle
+msgid "Unfinished battle"
+msgstr ""
+
+#: ugame.swrongfileformat
+msgid "Wrong file format"
+msgstr ""
+
+#: ugame.szerozoomnotalowed
+msgid "Zero zoom not allowed"
+msgstr ""
+
Index: /tags/1.1.0/Packages/Common/Common.lpk
===================================================================
--- /tags/1.1.0/Packages/Common/Common.lpk	(revision 137)
+++ /tags/1.1.0/Packages/Common/Common.lpk	(revision 137)
@@ -0,0 +1,132 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<CONFIG>
+  <Package Version="4">
+    <PathDelim Value="\"/>
+    <Name Value="Common"/>
+    <AddToProjectUsesSection Value="True"/>
+    <Author Value="Chronos (robie@centrum.cz)"/>
+    <CompilerOptions>
+      <Version Value="11"/>
+      <PathDelim Value="\"/>
+      <SearchPaths>
+        <UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/>
+      </SearchPaths>
+    </CompilerOptions>
+    <Description Value="Various libraries"/>
+    <License Value="GNU/GPL"/>
+    <Version Minor="7"/>
+    <Files Count="20">
+      <Item1>
+        <Filename Value="StopWatch.pas"/>
+        <UnitName Value="StopWatch"/>
+      </Item1>
+      <Item2>
+        <Filename Value="UCommon.pas"/>
+        <UnitName Value="UCommon"/>
+      </Item2>
+      <Item3>
+        <Filename Value="UDebugLog.pas"/>
+        <HasRegisterProc Value="True"/>
+        <UnitName Value="UDebugLog"/>
+      </Item3>
+      <Item4>
+        <Filename Value="UDelay.pas"/>
+        <UnitName Value="UDelay"/>
+      </Item4>
+      <Item5>
+        <Filename Value="UPrefixMultiplier.pas"/>
+        <UnitName Value="UPrefixMultiplier"/>
+      </Item5>
+      <Item6>
+        <Filename Value="UURI.pas"/>
+        <UnitName Value="UURI"/>
+      </Item6>
+      <Item7>
+        <Filename Value="UThreading.pas"/>
+        <UnitName Value="UThreading"/>
+      </Item7>
+      <Item8>
+        <Filename Value="UMemory.pas"/>
+        <UnitName Value="UMemory"/>
+      </Item8>
+      <Item9>
+        <Filename Value="UResetableThread.pas"/>
+        <UnitName Value="UResetableThread"/>
+      </Item9>
+      <Item10>
+        <Filename Value="UPool.pas"/>
+        <UnitName Value="UPool"/>
+      </Item10>
+      <Item11>
+        <Filename Value="ULastOpenedList.pas"/>
+        <HasRegisterProc Value="True"/>
+        <UnitName Value="ULastOpenedList"/>
+      </Item11>
+      <Item12>
+        <Filename Value="URegistry.pas"/>
+        <UnitName Value="URegistry"/>
+      </Item12>
+      <Item13>
+        <Filename Value="UJobProgressView.pas"/>
+        <HasRegisterProc Value="True"/>
+        <UnitName Value="UJobProgressView"/>
+      </Item13>
+      <Item14>
+        <Filename Value="UXMLUtils.pas"/>
+        <UnitName Value="UXMLUtils"/>
+      </Item14>
+      <Item15>
+        <Filename Value="UApplicationInfo.pas"/>
+        <HasRegisterProc Value="True"/>
+        <UnitName Value="UApplicationInfo"/>
+      </Item15>
+      <Item16>
+        <Filename Value="USyncCounter.pas"/>
+        <UnitName Value="USyncCounter"/>
+      </Item16>
+      <Item17>
+        <Filename Value="UListViewSort.pas"/>
+        <HasRegisterProc Value="True"/>
+        <UnitName Value="UListViewSort"/>
+      </Item17>
+      <Item18>
+        <Filename Value="UPersistentForm.pas"/>
+        <HasRegisterProc Value="True"/>
+        <UnitName Value="UPersistentForm"/>
+      </Item18>
+      <Item19>
+        <Filename Value="UFindFile.pas"/>
+        <HasRegisterProc Value="True"/>
+        <UnitName Value="UFindFile"/>
+      </Item19>
+      <Item20>
+        <Filename Value="UScaleDPI.pas"/>
+        <HasRegisterProc Value="True"/>
+        <UnitName Value="UScaleDPI"/>
+      </Item20>
+    </Files>
+    <i18n>
+      <EnableI18N Value="True"/>
+      <OutDir Value="Languages"/>
+    </i18n>
+    <Type Value="RunAndDesignTime"/>
+    <RequiredPkgs Count="2">
+      <Item1>
+        <PackageName Value="TemplateGenerics"/>
+      </Item1>
+      <Item2>
+        <PackageName Value="FCL"/>
+        <MinVersion Major="1" Valid="True"/>
+      </Item2>
+    </RequiredPkgs>
+    <UsageOptions>
+      <UnitPath Value="$(PkgOutDir)"/>
+    </UsageOptions>
+    <PublishOptions>
+      <Version Value="2"/>
+    </PublishOptions>
+    <CustomOptions Items="ExternHelp" Version="2">
+      <_ExternHelp Items="Count"/>
+    </CustomOptions>
+  </Package>
+</CONFIG>
Index: /tags/1.1.0/Packages/Common/Common.pas
===================================================================
--- /tags/1.1.0/Packages/Common/Common.pas	(revision 137)
+++ /tags/1.1.0/Packages/Common/Common.pas	(revision 137)
@@ -0,0 +1,31 @@
+{ This file was automatically created by Lazarus. Do not edit!
+  This source is only used to compile and install the package.
+ }
+
+unit Common;
+
+interface
+
+uses
+  StopWatch, UCommon, UDebugLog, UDelay, UPrefixMultiplier, UURI, UThreading, 
+  UMemory, UResetableThread, UPool, ULastOpenedList, URegistry, 
+  UJobProgressView, UXMLUtils, UApplicationInfo, USyncCounter, UListViewSort, 
+  UPersistentForm, UFindFile, UScaleDPI, LazarusPackageIntf;
+
+implementation
+
+procedure Register;
+begin
+  RegisterUnit('UDebugLog', @UDebugLog.Register);
+  RegisterUnit('ULastOpenedList', @ULastOpenedList.Register);
+  RegisterUnit('UJobProgressView', @UJobProgressView.Register);
+  RegisterUnit('UApplicationInfo', @UApplicationInfo.Register);
+  RegisterUnit('UListViewSort', @UListViewSort.Register);
+  RegisterUnit('UPersistentForm', @UPersistentForm.Register);
+  RegisterUnit('UFindFile', @UFindFile.Register);
+  RegisterUnit('UScaleDPI', @UScaleDPI.Register);
+end;
+
+initialization
+  RegisterPackage('Common', @Register);
+end.
Index: /tags/1.1.0/Packages/Common/Demo/ScaleDPI/ScaleDPI.lpi
===================================================================
--- /tags/1.1.0/Packages/Common/Demo/ScaleDPI/ScaleDPI.lpi	(revision 137)
+++ /tags/1.1.0/Packages/Common/Demo/ScaleDPI/ScaleDPI.lpi	(revision 137)
@@ -0,0 +1,98 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<CONFIG>
+  <ProjectOptions>
+    <Version Value="9"/>
+    <General>
+      <SessionStorage Value="InProjectDir"/>
+      <MainUnit Value="0"/>
+      <Title Value="ScaleDPI"/>
+      <ResourceType Value="res"/>
+      <UseXPManifest Value="True"/>
+      <Icon Value="0"/>
+    </General>
+    <i18n>
+      <EnableI18N LFM="False"/>
+    </i18n>
+    <VersionInfo>
+      <StringTable ProductVersion=""/>
+    </VersionInfo>
+    <MacroValues Count="1">
+      <Macro1 Name="LCLWidgetType" Value="customdrawn"/>
+    </MacroValues>
+    <BuildModes Count="1">
+      <Item1 Name="Default" Default="True"/>
+      <SharedMatrixOptions Count="1">
+        <Item1 ID="601562014369" Modes="Default" Type="IDEMacro" MacroName="LCLWidgetType" Value="customdrawn"/>
+      </SharedMatrixOptions>
+    </BuildModes>
+    <PublishOptions>
+      <Version Value="2"/>
+    </PublishOptions>
+    <RunParams>
+      <local>
+        <FormatVersion Value="1"/>
+      </local>
+    </RunParams>
+    <RequiredPackages Count="2">
+      <Item1>
+        <PackageName Value="Common"/>
+        <DefaultFilename Value="../../Common.lpk" Prefer="True"/>
+      </Item1>
+      <Item2>
+        <PackageName Value="LCL"/>
+      </Item2>
+    </RequiredPackages>
+    <Units Count="3">
+      <Unit0>
+        <Filename Value="ScaleDPI.lpr"/>
+        <IsPartOfProject Value="True"/>
+      </Unit0>
+      <Unit1>
+        <Filename Value="UFormMain.pas"/>
+        <IsPartOfProject Value="True"/>
+        <ComponentName Value="Form1"/>
+        <HasResources Value="True"/>
+        <ResourceBaseClass Value="Form"/>
+        <UnitName Value="UFormMain"/>
+      </Unit1>
+      <Unit2>
+        <Filename Value="UFormTest.pas"/>
+        <IsPartOfProject Value="True"/>
+        <ComponentName Value="Form2"/>
+        <HasResources Value="True"/>
+        <ResourceBaseClass Value="Form"/>
+        <UnitName Value="UFormTest"/>
+      </Unit2>
+    </Units>
+  </ProjectOptions>
+  <CompilerOptions>
+    <Version Value="11"/>
+    <Target>
+      <Filename Value="ScaleDPI"/>
+    </Target>
+    <SearchPaths>
+      <IncludeFiles Value="$(ProjOutDir)"/>
+      <UnitOutputDirectory Value="lib/$(TargetCPU)-$(TargetOS)"/>
+    </SearchPaths>
+    <Linking>
+      <Options>
+        <Win32>
+          <GraphicApplication Value="True"/>
+        </Win32>
+      </Options>
+    </Linking>
+  </CompilerOptions>
+  <Debugging>
+    <Exceptions Count="3">
+      <Item1>
+        <Name Value="EAbort"/>
+      </Item1>
+      <Item2>
+        <Name Value="ECodetoolError"/>
+      </Item2>
+      <Item3>
+        <Name Value="EFOpenError"/>
+      </Item3>
+    </Exceptions>
+  </Debugging>
+</CONFIG>
Index: /tags/1.1.0/Packages/Common/Demo/ScaleDPI/ScaleDPI.lpr
===================================================================
--- /tags/1.1.0/Packages/Common/Demo/ScaleDPI/ScaleDPI.lpr	(revision 137)
+++ /tags/1.1.0/Packages/Common/Demo/ScaleDPI/ScaleDPI.lpr	(revision 137)
@@ -0,0 +1,22 @@
+program ScaleDPI;
+
+{$mode objfpc}{$H+}
+
+uses
+  {$IFDEF UNIX}{$IFDEF UseCThreads}
+  cthreads,
+  {$ENDIF}{$ENDIF}
+  Interfaces, // this includes the LCL widgetset
+  Forms, UFormMain, Common, UFormTest
+  { you can add units after this };
+
+{$R *.res}
+
+begin
+  RequireDerivedFormResource := True;
+  Application.Initialize;
+  Application.CreateForm(TForm1, Form1);
+  Application.CreateForm(TForm2, Form2);
+  Application.Run;
+end.
+
Index: /tags/1.1.0/Packages/Common/Demo/ScaleDPI/UFormMain.lfm
===================================================================
--- /tags/1.1.0/Packages/Common/Demo/ScaleDPI/UFormMain.lfm	(revision 137)
+++ /tags/1.1.0/Packages/Common/Demo/ScaleDPI/UFormMain.lfm	(revision 137)
@@ -0,0 +1,28 @@
+object Form1: TForm1
+  Left = 348
+  Height = 273
+  Top = 527
+  Width = 779
+  Caption = 'Form1'
+  ClientHeight = 273
+  ClientWidth = 779
+  OnCreate = FormCreate
+  OnDestroy = FormDestroy
+  OnShow = FormShow
+  LCLVersion = '1.3'
+  object TrackBar1: TTrackBar
+    Left = 20
+    Height = 46
+    Top = 21
+    Width = 732
+    Max = 200
+    Min = 48
+    OnChange = TrackBar1Change
+    Position = 96
+    TabOrder = 0
+  end
+  object ScaleDPI1: TScaleDPI
+    left = 216
+    top = 184
+  end
+end
Index: /tags/1.1.0/Packages/Common/Demo/ScaleDPI/UFormMain.pas
===================================================================
--- /tags/1.1.0/Packages/Common/Demo/ScaleDPI/UFormMain.pas	(revision 137)
+++ /tags/1.1.0/Packages/Common/Demo/ScaleDPI/UFormMain.pas	(revision 137)
@@ -0,0 +1,67 @@
+unit UFormMain;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ComCtrls,
+  UScaleDPI;
+
+type
+
+  { TForm1 }
+
+  TForm1 = class(TForm)
+    ScaleDPI1: TScaleDPI;
+    TrackBar1: TTrackBar;
+    procedure FormCreate(Sender: TObject);
+    procedure FormDestroy(Sender: TObject);
+    procedure FormShow(Sender: TObject);
+    procedure TrackBar1Change(Sender: TObject);
+  private
+    { private declarations }
+  public
+    Dimensions: TControlDimension;
+  end;
+
+var
+  Form1: TForm1;
+
+implementation
+
+uses
+  UFormTest;
+
+{$R *.lfm}
+
+{ TForm1 }
+
+procedure TForm1.FormShow(Sender: TObject);
+begin
+  Form2.Show;
+  ScaleDPI1.StoreDimensions(Form2, Dimensions);
+end;
+
+procedure TForm1.TrackBar1Change(Sender: TObject);
+begin
+  with ScaleDPI1 do begin
+    DPI := Point(TrackBar1.Position, TrackBar1.Position);
+    ScaleDimensions(Form2, Dimensions);
+    Form2.ImageList1.Assign(Form2.ImageList2);
+    ScaleImageList(Form2.ImageList1, DesignDPI);
+  end;
+end;
+
+procedure TForm1.FormCreate(Sender: TObject);
+begin
+  Dimensions := TControlDimension.Create;
+end;
+
+procedure TForm1.FormDestroy(Sender: TObject);
+begin
+  Dimensions.Free;
+end;
+
+end.
+
Index: /tags/1.1.0/Packages/Common/Demo/ScaleDPI/UFormTest.lfm
===================================================================
--- /tags/1.1.0/Packages/Common/Demo/ScaleDPI/UFormTest.lfm	(revision 137)
+++ /tags/1.1.0/Packages/Common/Demo/ScaleDPI/UFormTest.lfm	(revision 137)
@@ -0,0 +1,5065 @@
+object Form2: TForm2
+  Left = 1009
+  Height = 754
+  Top = 351
+  Width = 1043
+  Caption = 'Form2'
+  ClientHeight = 725
+  ClientWidth = 1043
+  Menu = MainMenu1
+  LCLVersion = '1.3'
+  object PageControl1: TPageControl
+    Left = 24
+    Height = 496
+    Top = 56
+    Width = 696
+    ActivePage = TabSheet2
+    TabIndex = 1
+    TabOrder = 0
+    object TabSheet1: TTabSheet
+      Caption = 'TabSheet1'
+      ClientHeight = 453
+      ClientWidth = 690
+      object RadioGroup1: TRadioGroup
+        Left = 24
+        Height = 169
+        Top = 72
+        Width = 185
+        AutoFill = True
+        Caption = 'RadioGroup1'
+        ChildSizing.LeftRightSpacing = 6
+        ChildSizing.EnlargeHorizontal = crsHomogenousChildResize
+        ChildSizing.EnlargeVertical = crsHomogenousChildResize
+        ChildSizing.ShrinkHorizontal = crsScaleChilds
+        ChildSizing.ShrinkVertical = crsScaleChilds
+        ChildSizing.Layout = cclLeftToRightThenTopToBottom
+        ChildSizing.ControlsPerLine = 1
+        ClientHeight = 142
+        ClientWidth = 181
+        Items.Strings = (
+          'Item text 1'
+          'Item text 2'
+          'Item text 3'
+          'Item text 4'
+        )
+        TabOrder = 0
+      end
+    end
+    object TabSheet2: TTabSheet
+      Caption = 'TabSheet2'
+      ClientHeight = 453
+      ClientWidth = 690
+      object Button1: TButton
+        Left = 592
+        Height = 25
+        Top = 408
+        Width = 75
+        Anchors = [akRight, akBottom]
+        Caption = 'Ok'
+        TabOrder = 0
+      end
+      object Button2: TButton
+        Left = 488
+        Height = 25
+        Top = 408
+        Width = 75
+        Anchors = [akRight, akBottom]
+        Caption = 'Cancel'
+        TabOrder = 1
+      end
+    end
+    object TabSheet3: TTabSheet
+      Caption = 'TabSheet3'
+      ClientHeight = 453
+      ClientWidth = 690
+      object Edit1: TEdit
+        Left = 397
+        Height = 35
+        Top = 108
+        Width = 80
+        TabOrder = 0
+        Text = 'Edit1'
+      end
+      object Memo1: TMemo
+        Left = 152
+        Height = 90
+        Top = 192
+        Width = 150
+        Lines.Strings = (
+          'Memo1'
+        )
+        TabOrder = 1
+      end
+    end
+  end
+  object CheckBox1: TCheckBox
+    Left = 27
+    Height = 27
+    Top = 568
+    Width = 125
+    Caption = 'CheckBox1'
+    TabOrder = 1
+  end
+  object Image1: TImage
+    Left = 439
+    Height = 158
+    Top = 560
+    Width = 219
+    OnClick = Image1Click
+    Picture.Data = {
+      055449636F6E501702000000010006000000000001002000E291000066000000
+      80800000010020002808010048920000404000000100200028420000709A0100
+      3030000001002000A825000098DC01002020000001002000A810000040020200
+      101000000100200068040000E812020089504E470D0A1A0A0000000D49484452
+      000001000000010008060000005C72A866000091A94944415478DAEC5D05801C
+      F5D57FEB6EE77739492E4E8890048B11DC5BDCDD8A3B21B87CB49402C54B710D
+      5228142856B4C5030921909010BB9CDBCAADFB7EEFFD67666FF6727EBB3B7BF2
+      83C9ECADCCCCCAFBFD9F3F198C610C6318B590497D016318C318A4C318018C61
+      0CA31863043086318C628C11C018C6308A3146006318C328C618018C228C9B7D
+      327DDF06DC4CB819710BE3E6A1ADE1A71511A9AF6F0CD9C718010C63A0409B71
+      3715B769B84DC6AD0838E14ED9643299709B84BFA7EF3C849B2791483042E037
+      AFE876076EDB70DB80DB46DC6A913412527F0663181AC60820C781422EC7DD78
+      E0847CAAB0A150D3DF253DBD4ED6C3372BEBE62B4F40CF729CE8F9A10092C526
+      E82484E486C4E091FA731B43FF3046003906147812EABD71DB07B73D50D06965
+      D7889F23166E41A065C29DE2C7444F146E77470C62214FF07F2452EEECE671D1
+      9D5D49029FD388BBB5B87DC66FAB911462527FB663D8116304203150E00B70B7
+      1438A1DF1B0575BAF058A74CEF28E4749BDB00E4F40CB98C7B9E8C7B9D8CBF21
+      EBFA7CE83CA620C482FC9270731B70524DFFCBB8BFC58FD1EBC4F741624762E8
+      420A1DF8F8FFA093107E1A331F720363049065A0C05B70B717F0AB3C0AE54CE0
+      BF07B1C0CB382906B95C9E1468B99CBB5F2EE3049E1EA3DB0A7A8EBCCBE3FC1E
+      44F7C9150ADC2B41467B50405C1687442C86C21A8338EEE3F1182FD8716E1F4F
+      00DEC2FBF1DF38401CFF89C7B9BFE38904BB9DE0EF23028827BA27866E48C181
+      F77F0E3C212019AC93FA7B19AD1823802C00859E1C70C7E0761A0AE362DC2BE8
+      FEAE022F130BABBC53B069AF50C899C0276FE3A652A941AD31805AAD0395560F
+      4AA51A1F53E2634A7E8F822E57E06D05779B690A90D414380105768309360971
+      2CCA882016E74821168DB2DBB1480422113F84830108877C10090721468F2319
+      C46271460ADC3EC1EE8B0B5B92285209A18BD94126C30ADC9E4732F845EAEF6B
+      34618C003204147A25EEF6074EE87F8F7B1DDD2FACE6E2155E2CF024AC24E04A
+      A50294B4572941A3D63301D790B06B75A0D1F242AF56810A9FAF54CAD973E975
+      0AB970AC2E1A81823315B8FBD8957017CA566EE0566F8104E29C80C678018EC5
+      38A18E45131045218F44E310456208210984837E6E0B73FB102387303E2F86CF
+      E13681101841880881CED7553BC0FBD7E0EE05DC5E42326896FA7B1CE9182380
+      3403057F2EEE4EC5ED4414BE62BA4F2CF482AAAE90D12A2E6302AFE4855EAD54
+      A250AB416FB2825E6F039DD10A5A1D0ABB4A81AB3D6E4CD0E9B69CDD562915C9
+      3D230B2547004424723967F7D3B9922603B3086429CE416E458614351E6595BB
+      1DE7362280689C84399E24804884F631EEB6681FC67D38188280AF03FC5E27F8
+      7D4E08057DEC318110A2B1AE841067DA019918DC35B15D0CAFE163E0C8E04D24
+      03BFD4DFED48C41801A40128F415B83B19B75351B876A2FBBA157A7E85E75676
+      125E1478950AF428E87AA30D0C06DC1BCCB8E2E3AAAF518256AD60C24F7FAB55
+      BCC0AB3A855EC58EC3ADFE741F672670AB7FD294A0EBE01D8482FA9F1209E0CD
+      00B2F5851599D9FBFCDF249B24A0D138B7FA7792000A329100DE0E473802A03D
+      6DA14814CD841804C3DCED4020007E8F8B9101914288CC08BC9F238318674AE0
+      716271C1DFB08399E04532F8277064403E83B8D4DFF948C118010C0128F8F370
+      773D0ADB11C02DAE0C724ED238955C264FAAF42A1509B29209BCC164C37D1E6E
+      66D06A54A013841E371D137E2547043C09A895DCCA4FAB3CA9FD0AA50C947261
+      D5A773A40A3E5D027741BCC00BD181442A012455EFA4679FFF8BB7D7E3BC3350
+      10CE286F0E1009C40432486A05A401A0D093E087A36C1F08452128DE50F0FD3E
+      1F04BC2EF02119F83C0E341B82F8DA28230546048C0C7822E8E233C0BF2919E9
+      2FB83D83441092FA3730DC31460083000AFE22DCDD80C27610FD9D5CED79CF3C
+      53C399D02BD94ACD841E5776A3B518CCB8E90D3A14781568B578BF48E835BCE0
+      B3DB24FC2A41DD57245778B1B00BE74A51EFE5228117097B4A4E80E8BD247867
+      20BB9DE8628F0B82C7FB08043321C6FB0AD83EC693424C6C1E888800853E104E
+      2501FA3B10C42D14816020021EB7033CAE66F078DA513B083332200D43EC6414
+      4C04111190E3F05EDC1E4322F049FD9B18AE1823800100059F9C7A37A2302DA1
+      BFB9183C2DB5DC6A9F6ACBA330EB7460B61483C95602469319F45A151870A3BD
+      5E4782AE62C2AF15567C8D82093D110613FCA4838FB7E599C31044363D27E0B2
+      AEF1FE2ED72D930DEC6B16270189730480FB9F2302C154487446109284401A42
+      249E340B42914E8D20C893412018013F92801F49C0EFA7DBB80582E076B581DB
+      D9C269062CF210630EC7A489108BA7680578BB1D2FE97EDC1E4622E890FA3732
+      DC3046007D802FA0F91D702BFEAE741F175EEF0CD131215572EABD56AB0193A5
+      88ADF4264B1E2FEC6A30E854C94DC7938056C3A9F89CD02B383341C91F4F2EB2
+      E77B1176FE26B7EF41D00722FF3DA5FE76258544A79AB00329705EFF04F31BC4
+      448E43D20AC2BC5F809907418E087C81306E11B6F9698F5A8017CD040F120191
+      81DFEFC1D7459966C0A20BBC13B18BAF80928D1EC1FD7D4804ED52FF6E860BC6
+      08A007F039F8C70167E353B2CE0E82AF12EC7A5CBD0D262B58F3C7A1E017A290
+      EB50E85560E4059E08C0A8E7845E27083E09BD5A9174E6711A8438FE2F4AFE11
+      2EAA0F753E5BE8CA115DC980F90E040D41E43F60D104321162E42C8C3332209F
+      00A70D88080035022F92829FFFDBE3714187B3193A1C8D6852843932486A053B
+      10811FCFFF18EEEF41226894E0E319561823806E80C2BF1BEE1E4541A3905E8A
+      E02B79555F8D36BC0637A3390F6C859560B1E6A3B0E34A8F826ED4ABD96D4EE8
+      D528F468EB6B39355FCD3CFABC075FD919B7EF4EAD67E7162E6A387C535DCA07
+      52528745E6422CC1E714F0A1436622887C0324F45E412BF0A33620EC7D7E70B4
+      D5211134E0F3828C083A2309A94480E70EE025DC89DB5FC69C853D6338FCACB2
+      0614FC3CDCDD89C2772EF0329822F8BC9AAF41DBDD642960826F4535DF685033
+      A13719344CE80DBCCA9FB4F199E08B9C79BC7A2F08BE387F3FA5D06780B67BAE
+      A127A76232E1884F32E2B402218C483E8258A78F0089C043C2CF08200C6EDC7B
+      BC7E70B6D783CB5E0F417F90F90A7A2102AA58BC1849E03F527F1EB988E1FD0B
+      4B13783BFF2CDCEE42A1CB179C7B3285A0EA732BB716577C93B508F28A2BC16C
+      B68189093D27F82623EE51F0754CE557B118BE8639F352557C71720E08DE7AFE
+      3A6423F8EBD8A17A301966E43311C526026905515E2B201208469816E0F585C0
+      4324E023520881D71B00A7BD019CA81550AE41288C4440390954D7C03B0BE39D
+      D58DAFE1EE0A248206A93F8B5CC2C8FDC5F51328FCBBE0EE6F28987B88C3792C
+      E38E36127C54E32DD612B01555A0E05B99D09B49E879E1671A8096137C71F84E
+      9C9E2B083E93F9D47ADED10951E831E937E08980CC84089F74445100A61184C8
+      39889B8FD308DC480644041C290491081A91086AC1EFF72171741201A76DC405
+      6D801A9CDC8ADB03480451A93F825CC068FDF909557977A0305E807B85A0EEB3
+      221BDEB947093AE4CD2F28A946C1373161EF49F005C71E4BCB55CA53EC7A4EE8
+      BBB1EBC7B0431E4242AC19B0EC434E2B0847A39D44C0FB04386D8023028F4004
+      6D0DE068A941CD21C08820C29B065DCC022A38BA1049E00BA9DFBFD41895BF45
+      14FE5370770FE5EA274B6D157C4A2D2BBE413BDE6842C19F04B6FC2226F46623
+      27FC665EF00DBC575FDB65C54F26E7F052DF19A293FA5DE73E44C1046E2FF215
+      2453907BD208BC21E82012A07D8717DA9BB782CBD904C16098F9158808E2ACF6
+      202599E879DC5D8D44D026F57B970AA3EA6789824F8D301F47C13F91FE165668
+      05BFEAAB552AB4E135CCB95750321E2C061D584C1AB0183902A0559F09BE4688
+      E12B39A71E8BDB0B79FF5CD55DE7273CAA3EE2F441E4404C40674D02F9092202
+      1188A2068259D0E1093232A0CDE16887F6A64D480A1D9C36C0F208E29C7FA053
+      1BA050E1894802FF93FA2D4B8151F3EB44E19F8DBB7FA0904E11567D059F69C7
+      A9FB68D75B0BA0B07432DAFB6626F456A316CC4400062D53FB297B8F049FCBF4
+      E39275C465B75D3BF88C61E810970B0BE6412CC1A71E47B8E422E62CC4CDC39B
+      051DDE20124188EDDD4808EDADB5E06CD90EFE601042E1309F661C4F6A18C055
+      1EDE82FB3B475BA1D1A8F8A5A2F09F87BB075048B532BE065F48D9A5909EDE60
+      C4157F22E4E597B2959E567D2B5BF939C137E8D56CD5A7AC3DF2EA73093B5CC9
+      AD5070C33ECC51F1694A83CE44446EE54EA61F934610E5AA10298F80D28ABDBC
+      49E012114187DB0B6D4D9BA1C3D18226049200251309D1824E6DE0233CC12948
+      02AD52BFDF6C6144FF64F94E3C8F89557EC1D6A7441E1DAEFA7945A8EE174F00
+      B359C7043EB9F21B395B5F48D965A9BA8AD4E29BDE1A6D8E2133E08B15930EC3
+      643E41944B37E6320B3922E01C8448046E2400F20D9059606F85F6E64DE0F378
+      3AB581685C1C2968C2339C8C24F099D4EF351B18B13F5D5EE57F8DBAEA8A3DFC
+      ACB456454E3E239494EF04565B3EBFE26B190190CA4FF17DB2F5756A7ED5176A
+      ED455E7DF6E18DD84F2FF7912402E8EC414829C751BE00890A8EA8D0C8E7E388
+      8084DFE509321F41872700AD0DBFB1D061904F2D8E264386ECC8B84BDC8EFBFF
+      1BE926C188FC09A3F0FF0177F78B557EAE930EC5F45560B1154371F934B0990D
+      28FC5A26FCA4F273997C5CEA2EADFA5C351EDF614726EB36177F0CD222916401
+      E01B98F2441089B3A22322021FEF24E4843F044E9E08EC6D0DD0D6F81B6A0B41
+      964424440A4426C1A7C0690323B635D988FA25F32A3F79F94FA0BFC52ABF464D
+      82AD81FCD26A282CA9626ABED5A2059B499B0CF189E3F942124F676E3E246BEC
+      C7905BA0D6E59DB904BC59C0DA98715985D49928C0D71730DF0091803B80A601
+      EE9D4E68A95F0F5E4F07E71BD8D1246801CE2FF0B1D4EF33131831BF66147E1A
+      8BF51E0AFFBCAE493D5C5C9F54FE1960CBCF632BBECDA403AB59CB87F7D4AC58
+      4748DD650D3792EABE68E597FA4D8EA147887C84DC2C8338DFC928C137290973
+      4E42D206DCBC3940BE01A79BF6FEA44910E01B9244599BF4240950D6E0D94802
+      CF4BFD3ED38D11F19B46E19F80BBFFA0F04F12849F62F3E4E56769BCB62254F9
+      A7A3C0A3CA8F429F879B855FF98D7C7DBE9A6FC0418D3AE53251E7DC11F1098D
+      42F00D4CC880175A9909B903545BE0F186B928016A010ED406DCA815B4B7D443
+      5BF326D69884CA8E859C01DE2F803C90588624708FD46F2D9D18F63F6FDED9F7
+      010A7F89D8DEA7E21D9D56CBD2780B48E5273BDFCCA9FC749B65F3E93A3DFCC9
+      0A3DA13A4FEA373686A123C1A51A0B2DC8A3BC9390BA13B1BC015F38A90D3899
+      46104093A0035AEAD63193809287280559440274ACBB7177ED48996C34AC7FE7
+      28FC3461E72D147E8B20FC2CA38F547E83018A2B66405E5E41A7E09BB9301F09
+      3F2BD5E5E3FA42E71DE8528E3B86910171A3D364A420CAA5130BE142720E3ADC
+      1C09D0D65ABF015CF626D418C22CAA1027BF00244D82E7F080E78C8482A261FB
+      7347E13F0A772FA1F06B84F01CA9FC6AAAD53799A0A47236D86C6666EBDBCCDA
+      A4BD2FB4E452F3ADB7C8D127D4E18F09FFC8859048946C4A82264118EDFC105F
+      6ECCA2046E4E1B209380A2042D0D9BC0D15ACBEA0928A220AE254012F8371EEE
+      38248180D4EF6D2818963F793ECC4725BC72C1D32F38FBA80F5F69D54CB0594D
+      9047CE3E8B2E19E2D3B3261DCA64DF3DA14497FB2086E547318601423CD85468
+      5E4A2BBC400264129063D0D91160FBB6E6EDD0D6B4098281303307BA4408BEC2
+      431E8E24E094FA7D0D16C3EE578FC27F330AEE6D745B107E355FC167B1164069
+      E54CB05AF54CF08900C8E9C7849F6FC9251EA0C13E80B1657FD4413C025D9C3C
+      447E01AF88041C1D011629686BAD479360230482217C5EA42B095069F141C3B5
+      D1C8B0FAF5A3F0FF0505F61ABACDA6E22AB9FA7B2AE4B1E5954051E54E906726
+      955FC762FC56A350C4A3E262FBE23A7DD998F08F66082410E77B15C6F8966414
+      256024E0E13501B605A0BDBD055AEBD683CF1FE0C2849434D449023578A845C3
+      9104868D04A0F05F055C0D7F52F8C97BCF84BFA0028ACBA7A0AA8FABBE459B14
+      7ECAEA23E117F2F8935E7E189DF6BED7EB868FDE7F13BEFDEA13D85EB319CE38
+      F74A38E8D063A4BE2C49D1D9B4948B12444445454973C0CD990376871D5A6A7F
+      069FCF976C48DA45135832DCCC816121067C038FE76564F47711FEFCE26A282A
+      AB66A1BD3C66EF6B596EBF90D22B2EE201D9E8F6F21FB8780AAE74A98EEB5973
+      76833FDFFF3CA8D56AA92F4F32703D0A3B5B9251CB72962F204A1A6226011F26
+      6CDEBE9691693724403E81FD87936330E7C501859FC66FBD8DB2AF12DBFC3AAD
+      1A0ACBA640417125F3F027859F3CFD24FCC90A3EAE74573616DB87DF1D300B02
+      FE1DA76869B53AB8E7A19760EAF459525FA264E03920E9178844B8D166E41C64
+      15859427D01164A142A7CB8D24F013783C1DDD91C03B78A82391046252BFA7FE
+      20A76582EFCFFF290ABF412CFCB4F217944E82A2D2F149E11772FA05E1E74669
+      CB453DF972FAAD6605271FB510DADBBAAF6B51289470EF23AFC0F419BB487D99
+      924168500A020944B9E12562127076089B1B9A6AD680D7E3666DC9BB38069F46
+      02385BEAF7D31FE4AC54A0F04FC1DD5728B80542928F20FCF945559CCDCF849F
+      CBEB6769BD7A2EB38F1C838A94945E189D467F172CBFFC14F869F5B73D3E4E24
+      70D7832FC28C99F3A5BE54E9901C6602C981A74402D47F90E612082440E680C3
+      E94212F8117C3E7F323AC02615710EC63F23095C27F5DBE90B39291528FCA5B8
+      FB1A857FBC38C38F39FC0AC74149C54E2CB9278FF7F6B3EC3E9D9A0DD764C22F
+      6AD395B36F5202D8DB5AE0B4E396E00FB4E71277B9420177DEFB3CCC9CB39BD4
+      972B09C4C35085CE4344022156431065DD87852222CA1520C720690201AA1FA0
+      F1E6CC1C480824407308EE97FA3DF5869C930DBE5DF7FF50786725851F7F941A
+      BEA8A78CE2FCA4F2539CDF2C52FBD54A50AAB83E7D6321BE9E71FF5DD7C2271F
+      BED9EB73E47205FCF98115680ECC95FA722585102A14720568841995158BCD01
+      D204ECEDADD0B2FD670884828C2884DA81043752F994869F5E7A49EAF7D21372
+      4A4A50F8C915FD118DDF16AAFA947C869FD99207251366439EC90036AB96C5FA
+      D9CA8FC2AFD52853BBF6E4D4BBCA2DC4E35138FEB07910C21F6B6FD06875F0DC
+      6B5F825E6F94FA922585D831289803CC27E0ED4C1B26E720972CB481EB301449
+      2181081EE13024819C1C4D9653A28204F0100AFFC5E2925E8D8A72FB2D503A61
+      175CF98D6CD567C26FE2567E2D85FA44F3F672EA0DE528DEFEE7B3F0F4DFFFDC
+      E7F3CA2BABE1E1A7DE93FA722547727211AF0904BB90809027D0DA5403F6A6CD
+      9D24D0D94FC09148C476695CFB4AADD4EFA52B72465EF8E29E7F8A137DA84107
+      35F228AD9A0B79363357D5C7D7F293C38F2AFA84811CB2B1957F4038FB8425E0
+      74F43D0F63BF838F850BAFB85DEACB951C42311139F9227CBB312E4F20CC4A89
+      89043A50136869DC04F6D6ED10A2C622A94D45BE8E041C4B5B7F7B3F22F57B11
+      232744866FE8F12395F50AE13E127E9D5E0FA5E377019BCD9A74F85999DAAFE1
+      EBF83BD57E21B77F0CFDC32F3F7D07B72C3BA35FCFBDEA86FB60C19283A4BE64
+      C9911C5916E3CC01D2047C429BB16477A12034D5AD830EBE9438353C18BF1B4D
+      816B216590BAB4905C6A78BBFF4B14FE5DBB86FB8A2B77868282D264ACBFB37D
+      978AEBCFCFB7E816067D8C616038EFE4A5A805F4DD029FC2830F3DFD01141695
+      497DC992834B1BE63501BEB9084D2EA6DA01127E8727C05A8C356DFD113C6E67
+      D7C84082F707BC0F394202924B0D12C07D28FC97A738FD50B54FC6FA4D9CCD2F
+      2EE9550B73F8647CA84FE27771EE898B590719362F40AE8033FEB01C55E7E3A4
+      FE68FBC423F75C07FFFBF4ED7E3DD76A2B80475FF88C11F4A8470252869250DA
+      B08F751DE63A0E5315A1937204B6AD62EDC5BA3805DB13F1D82E8D3FBF522FF5
+      DB20482A3A28FCBFC7DDBF52EC7EE6F1B741D9F8B9B8F273E13ECAF23319B995
+      9FE6F171853D5CA84F6A06FBEDD71FE1E66B4E4DB98F48E0DEC7DE86D2D22A89
+      AFAE776C5CB71A6EB9F6B47E3F7FEEAE7BC1B25B1E91FAB27302B47C732DC8A9
+      BB109A03416E2211EB2CD411149511AF4F761B16F903BE0C795BF66EDFF2B1E4
+      1D8524931F147E920EB2FB6DE2345F3DDAFD6513E6A1DD6F6182CF39FD68E557
+      B3165E5C49AF3C39725B6ADC79F379F0F38FDFEC707F716905DCF7786E7AD0DB
+      5B9BE0D5171E80353F7C013EAF7B40AF3DF3821B60FF434E90FA2D480E215B30
+      C1870749C0692291D05E8C3514416DA0B9EE5770B6D74338C4751A26C2E00F70
+      67FD4F2B6E00894D01494408855F055CB2CF1EE24C3F9D460345153BA3FA5F92
+      6CE52554F651330FD6C24B29E3A6EFE682F423CE387A2E44233B3A76954A153C
+      FBC66AA92F2F8970380CEFBCFE04FCF7E337C1D1DE32E8E3C8F0BB3AFDBCEB60
+      BF311248A60D0BE3CB59A290503790EC25E04753603578DDAE1DFC0168311E52
+      B766C58720210948450077A1F02FA3DB0AA18BAF4609F985E3A1A87C326FF777
+      76EF65E1BE64279FDC71F8D56C5E0F375DDDB3203CF1CAB7A0D5EA25BDC660D0
+      0F7FB9F50FB079E3CFBDA6000F1493A7CD86E5B73F016AB556D2F7273512A261
+      A55C8E003F7B8048808A863C5CCD40B3D81FD0690AB469D48AD95BBF7FBE1924
+      2281AC4B120AFF1CDCFD8004A010C7FB8D66CEEEB7B0069EBCDD6FE06AFAE971
+      2AEE91C9643915EF7FFF5FCFC12BCFFDB5C7C7AFBDED71D869D6EE925DDFA60D
+      3FC1DD28FCA15066CAD3D51A2D5C74F5DD3067FE12C9DEA3D448242712091584
+      DC5CC2646B311A43C6670AB6356E600D46BB940FBFDCF0D30AEA77C10F38CB2E
+      B22A4A28FC74BEAFC5AABF60F7978C47BBDF6A4EF6EFA7515DD4C157AD164DE5
+      CD15C9E7F1B77B97C1F75FF79CE179C50D0FC3ACB98B24B9B6E6C6ED70FDA547
+      A675D5EF09BB2ED81F2EBCEA6E49DE67AE40281E624EC108E70FA05164D469D8
+      C9A613933F603DB8DA1B76281A92CB12FBD5AD7989A611679D04B24D00E70237
+      BB8FA9FE94EAAB55AB51EDDF09EDFE712CD4470440137A8DBA4EBB5FDCCA2B97
+      70CB55C7417DEDA61E1F3FF5BC1B61E9FE474B726DCB2F3A0C579DECB5A8339A
+      AD70CDCD8F4379D56449DE6F2E40700A46E2DC2832D6695828212612F0F8A171
+      EB0FE0F779D830529129B0A1D01CDF65CD172F8760A412000A7F01EE36A2F0E7
+      912C2BA8C20F05DC6C2D82D2AAD9DC886E51810FA9FEC9D2DE1C88F57787ABCF
+      3B003A5CED3D3E3E7BDE12B8F8DAEC5783AEFAF613F8FB5FAFC9FA79A994F8A2
+      6BFE8A5ACFE2AC9F3B57403E81780C98C79F3A0AF9A8B7A09F730A1211D8DB5B
+      A0A5762D9B3A14154283403FEFC4F57B4C0EFFE5B5D75E8B431649209B04F034
+      0AFF9942C20F65F269B51A28ABDE156C162B582D1A96E36FD20BF17E45CE57F7
+      5D79CEBEE0F5B87A7CDC60B4C07D4F7D9AF5EB7AE66FB7C037FFFDB7249F0969
+      77279CB90CF63E30F713A132016E45E77A0B52A620B51A674942C240521A3852
+      FB0BB81C4D5D4B877D0A5964E65947ECB4FDD65B6FCD9A299015D142E15F88BB
+      2FC44D3D29E127BF780214964DE4EC7EBE9F1F1BD1CD27FBC8147C9A6F8E8EE4
+      BEF29CA54C9DEB0DCB6E7F16AA27CFCCEA75FDF1BA93A0AE66A3941F0DEC7BC8
+      C970ECA9574A7A0D5221D9659832055113A0A221AE9B105F3DE87243D3D6EF21
+      100C7449108ABF35D9D678CCE79F7F2E68011927818C4B160ABF1277AB51F667
+      8A1D7F06A30957FFDD50E875DCEA6F14427E9CDDAF94513FBFAC5CE2A071E559
+      4B5898AD374C9C3A1BAEBAE529769BBEE88DEBBE875F7EFC026A36FF02AD2D75
+      100E05A1B0B81C66EEB21896EC7F2CD8F28B877C5D775C7B3C34D66D91FAE381
+      3D961C06A79D7FABD497210D282A90E0BB098552CB87696B6FDE0EED4D9B201C
+      E64D01DE21A890C58FD87D72F4DFD93205B24100C97EFE82E38F56FFE28A5990
+      5F58C2AAFBCCCCEBAF6633FB34C2A45E05BFF2E7AEFCC315672EC62F30D8E7F3
+      2A274C87F6D6065E5BE8FD3BAD9A38032E5EF620E88DE6415FD7DFEFBD127E5E
+      FD85D41F0FC389675D078BF63D4AEACBC83AC4F901C2AC01F2075034C0E50E81
+      1B49A071DB0FCC84EC921BB0ADC41A9B535D14F3658304322A5E28FCE5B8FB15
+      85DF2838FE68F537DB8AA1A47226B3F9C9F36F16A9FE94F0C38A6A86C18CEE2B
+      CE5C04D14838EDC7A5EABBE3CFBC16F65CFAFB41BDFEAD971F828FDF7D41EA8F
+      878134BEE57F5A01A5E513A5BE94AC233983905285F9D1636E1A49CEB4801038
+      EC6DD052BB86D50A881B8ACA65893F152936DEBA6AD52A6A2D9E515320D304F0
+      2CEE4EE7C2785CA59F4EA781D209BBA2DA6F06336FF79B78D55FA55274C6FB73
+      5CF809579EB17087411BE9027D0657A0E9401AC140E1B4B7C0AD97FF4EEA8F27
+      099DDE08773CF43E2847E3F09184B8A720A705B0C6A29E109B40DC5AFF2B7438
+      1A984330168B09A411D228223B579A5B6B3EFFFC73810432828C89195FECB319
+      7FC8CA64930F5CE1F34A264161C90426F8163EDB8FBCFE42C28FD0D64B361C34
+      803316A0EA96B9F90F9446FCC7473E04A56AE082F3C76B8F83D6A6ED527E3C29
+      A8183F0DAEBEFD39A92F23AB48CE1F144705825C962045059826E0F641D3B695
+      10F0079219826436A016F0D81E932397E2CB639934053249007FC3DD05C2EA4F
+      ABBBDE60C6D57F3EAEFCBAA4EA4F317F0DAFFA0BADBC7335ECD715572201643A
+      D36ECE6EFBC2E917FD71C0AF5BF5CD87F0E2DF6F91EAA3E9167B1D78021C71D2
+      E5525F4656914C15265F00DF543410E2128448032022686FA9057BD3C6AE61C1
+      A059179DAE8F6C6EC8A429901151E3FBFA6F4361D608ABBF96C27EE3768282C2
+      712CE987527DA9C69F0A7D92ADBD86595BAFABCF5E885F6C660940ADD1C19D7F
+      1F5C2EC175E7EF03E10CD5010C16E75E791F4C9BB987D4979175884791538210
+      AB15E04B874913202DC0E7F5249383E29C2FE08189D6C6E5858585914C690199
+      22807B707795D8F6371871F5AFDE15577D6D920028D75FA3518A72FD33FD35A4
+      17CBCE59C4BEAC4C838466EACE032F2AFAC7337F82955F489310D413F20A4AE1
+      FABFFC53EACBC83A840421A15680E50608A640572D80FA08B22842C26BD1F8A6
+      CB7C9B5A8F3DF6D868261284D22E7228FCF9B8DB2E9EE7472A7E7EE9342828AE
+      60B6BF3999EEAB4AE9E73FDCB0FCBCC519F5010898BCD3AE48020F0CF8757E9F
+      1B6EBBFCE0A42D9A2BB8F4C6A7A17CFC34A92F23EB6069C2A2B261D655988F0A
+      5078B069CB77E0F7FB981620440414B2F85FC6E96A6ED56834914C3804334100
+      FF87BB1B85B83FADFE7ABD01CA26EEC1049F3CFF14F3A7B01F95F9B2621FBEBD
+      CF70E280A6BACD70FF6DA767E55C264B3EDC786FFF7AF775C5E3F75C0A5B36AC
+      CAE647D3272AAB77868BAE7F4CEACB48A276EB7AF8E08DBFB355F8CADB5E046D
+      0686A1EC50364C5A00730886586B71F207D85BB683BD7913CB0B1045043A0A0D
+      DE19A59670BBD1688CA6DB1448ABC8A1F053F60AADFED664C10F0A795EE914C8
+      2FAA640460E12BFD84D55F2ECCF14BFB479E593CF5C095B069DDCAAC9C8B8A6C
+      FEF4E87F07F55AB7AB0DEEBCF6A89CD2026871B8E19E77C068B24A7A1D3FAFFA
+      0CDE7AE9AFE0F53893F7596C8570ED9DAFE16F5299F6F30923C8931D84D8BCC1
+      08783C48003EF20550B5E07710A48840AC530B50CAE3FF37B5D07E97DD6E0FA7
+      DB21986E02B81E777F14AFFEACB77FF5EEB8EAEB70F557739D7DF9629F64D86F
+      382DFDC085746EBE781F88672807A03B5CF797B7982630183C4364B53E3B64D5
+      5FCC9CBF0F9C78AEB40347DE7CE12EF8FECB7776B8BF785C355C76F3F31939A7
+      30823C1613C2829164F310D204DA9BB782B3756BD772E1F6AA3CFF2C75C2E94C
+      B743306D9287C24FBDAF6A50980B859C7F4AF9CD2B9E04F9C5E371F55773833C
+      756A7EA80797F403C37090E7171FBE041FBEF96856CFF9FB53AE815D170D2EB9
+      C7E771C19F97FD2EA7B400CA76BCE5A18F32B2D2F6175F7DFC2ABCFFFAC3DD3E
+      367FD1E170C429CB32725EF19831EA23E8A7E4203E2A405A40D3966F21180A42
+      34D25923A052C46F18A7AB7DC8E57285D2E9104C27015C86BBFB8516DF4A56EE
+      ABC3D57F0F3019B929BEE4F9D78957FF6166F70BF8CB754782A7C39ED573CE9C
+      BF2F1C77D6E0E3FA8FFEF95C68AC95B642B02B0E3AEA2258B8DFF1929D7FEBC6
+      D5A81D759F972093C9E1DABBFE05066366CC9494B90234763C10068F972381F6
+      A6CDE06AAB49A911C07F9A26D8DAE644431E4F3A1D82E924809FC423BD29E7DF
+      56540DF925D52CDB8F79FE759D937C05DB7FB8A1B1F63778ECAE73B37EDE82E2
+      4AB8E4E6C1E7F73FFAA7B3A0B941FA0A4131AAA7CD83D32FF9EBD00F344804FD
+      5EB8F39A437B7CBC6AD26C38EB8A0733726EA14E80CC004A0EF205C3AC6498CC
+      00B7C70BCDDB56A216104A691DA653464FDD695CE02D2480D08C1933D2A205A4
+      4502C7CD3A710EC8E43FA60EF85043D9C43DC168D425C37E5D6D7F7601C34C05
+      78F681CBA066D39AAC9F57A154C14DF77F3CE8D73F70CB09E0B43765FDBA7B83
+      D19C0F57FFE90D49AFE1D64B9676BAE8BBC179CB9E80B2CA29693DA7608A75E6
+      05C45923516A1C427502141A6C6BDA08EEF63A162D10D28315F2C4BF27E7B59C
+      919797E76F6B6B4B8B16901E02987DF2BDB8BB529CF863CE2B85A2F2196CF5A7
+      8D6CFFAE053FC34CF619EEB87CBF8C1500F585C34FBA06E6EE79E8A05E7BCFF5
+      47305F402E8134C59B1EC87EC72431FAFA3E2B26EC0C675DF9F0008ED83F081A
+      406744A0B387202B167239A0AD76F50E4542A546D79C4273BCD1683406D3A105
+      0C59040B26EEA7D4188BEB50A04BC4CEBFC2F25960CD2B4A120037D34F94F39F
+      F68F34F3A8DFB60E9EB9FF62C9CE6F2B28838B6F5A31A8D7DE75EDA110EEA379
+      8914B8E1DE8F40AE94CE1178F7F2C32118F0F6F838F90296DFF33E2E6AE9AF64
+      14C68BD1C63A0987225C0F41240032079A6BBE67C95C6267A04611B97E82CDFE
+      78BAB48021CBE1B8D9271D82877957ACFEEB747A289DB80798F41AD6E58765FD
+      F1AB3FA9FFDC079BF6CF33E37867C59F61EDF7FF19FA81868045079E0A7B1D7C
+      E6805FF7E7AB0F447B32A746D3335C71C71BA0CF90A3AD3F78E8B613C0EDEC7D
+      42F2C2FD4E82A5879D9391F327878AC4383380B2033DBC29606FA90167CBE664
+      DB30BE4A70D5E4BCE6DFA306E04E872F60A8622843F5FF25DC9F20AEFAB31454
+      4141E964B6F293F0B39C7F61B4D7308CFB0B78987E2CAEBEC7696712F4D99D71
+      F923505A39B054DA3BAFDC2F2B3302068A0BAE7F016C85E3243BFF53F79C072D
+      0D9B7B7D8EC16483CB6ECF4CFD02CB0BC0AF259A9C274079015CCF008FC703CD
+      DBBEEB6A0624F2B49EBD8B8CBE5FD2A1050C49124B773ED62257A89BF047A913
+      77FC29AA9A07168B8D09BFD0E74FCDAFFEB26118F71770D735FB67BCFAAF3FD0
+      680D70D96D6F0C4875CE956BEF8A0B6F7A05CCD642C9CEFFE2C397A169F74B9F
+      CF3BE38A47A1A43CBDCE4001E24AC100D302C24C0B2033A0A56E0DF8DCF61433
+      40AD883E3229DFF1279D4EE719AA16301449948D9B75D25928CD4F8A63FF3ABD
+      194A26ECCA427E4603B7FA6B858A3F810032F231661E775DBD9FD497904445F5
+      2C38E9C2FE87D0EE5E7640562A170702FADD2CBBFBA3AC9FD7D15607ABBEFC17
+      34D56E80B6E66DFD6AEB5635691738E1FCF44F3F1224968D1A8F753A037DE40C
+      442270B63780BDF1D7143340264BD44DC96BDE1B3F3FD750B580A111C0EC933F
+      C7FD122EA6CF4DF8B51671997F24F8C2604FAD866BF4A910E2FEC350030806BD
+      F0D04D47487D1929D8E77717C2BCC5FD6BB879EFB50766A5727120A05E0797DD
+      F1CED00FD407A2D130FCBCF203D8B0E653A6EE47FAD1C8B52BE472055C71E7FB
+      EC779E76F0D100C119C84282BC2FC0E70B40F3D66FB8BE819D660058B58153CA
+      ADBE4F5103F0363434040F3FFCF0D860B480414B62D9CCE3AA657215B5FC9289
+      D5FFE2EADDD1F637A6ACFEA4FED307271FC6EA7F5BD35678EEBE3F487D192920
+      0FF559573F853674799FCFFDEBF283728E00F28A2AD9F567129FBDF37758F505
+      E51A0C3D0D7AF14167C2EEFB9C9491EB24E1171283B822212E2F80EA04DAEAD7
+      83A7A3A94B6A70EC8D29058EAB552A95CB872C31D81A81C14AA3AC7CF6C937E2
+      996E177BFF8DE60228AC98CDADFE7A15E8D10CA036DF2A9590F63B3C859FB06D
+      C377F0E6B337497D193B803CE8E7DFF88F3E9F77FF0D8764B578A93FD8FBF00B
+      6097854766ECF8DB36AE84379FB9316DC7B3E495C2D9CB32D3D750982BC83A08
+      47B9E1A23EA16988B315DAEBD7A62405C920D13139BF75915C9668C3C5D72BAA
+      141C909D37680240F59FEA53178B2BFFF24AA7832DBF0CF47A5532F4C78A7E86
+      71DEBF809FBF7F1F3E7E23FB73FEFA83493B2F82C34FEE9D9C1EBCF150C91298
+      BA0395385F76FBBF49B7CEC8F1FD5E173C79D729690E7DCAE0A25BDE00B5569F
+      916BEEAC0FE82C152647A02F1066664028144C3103F2F5FE538A0C1E1A00D181
+      9A407030FD02062392B2A2A987EA555AAB03855F2DCEFD2FAE5E80AABF2E99F6
+      2BE4FD279D7F393EE8A3377CF7D90AF8E6A3CC9488A603879C703D4C99B5578F
+      8F3F71E789E0F338A4BECC24AA26CF8323CFFC53C68EFFF4DDA781DBD992F6E3
+      EEB6F789B060FF33D27E5CF12091A8A8792885044913686F5C071E67734A6D80
+      5E1579B4D262BF1F49C18126806F30CEC0411140C59C93F7C3EBFC8F58FDD7EA
+      C8FB3F9F09BE013500C1F9C785FE866FEAAF80CFDF7904D67E9B7987D560A154
+      69E0C25BDFEAF1F1F75EBA0336AFFB52EACBE4AF550DE72C7F25632BE9FBAFDE
+      099BD60EAE814ADFD7AE81F36F7E3323CE406165A76840981F2442894144004E
+      7B3D389B36A6B40B53CA63DF4FCA6B3B07AFA53D1289B83D1E4F68A00D430645
+      0068FFFF098FBE5C1CFE33DB2AD10498CCEC7FDA68BCB75A18F3350CABFEBAE2
+      EB0F9F82D55FBE2EF565F48A05079C097317773F9577CBFAAFE0FD97EF90FA12
+      190E3BE536183F75B78C1C3BE877C3937F3EA1D7029FA162CAACBDE1806333D7
+      2B80B50C13CC009E007C5E2FB4D47C972C11E6FC00109C5CD0B61F8A59E3609D
+      8103954CD9ADB7DE2A7BE2CD4D5FE1ED3DC4C53F79E37606ABAD98177E6EF5E7
+      BCFFB261D9F0B32BB6ACFF123E7825732A6B3AA0D599E0ECEB5EEDFE41FCD1FC
+      EDB6C3256F0A3265F6DEB0FFD1D764ECF89FBC712F6C58F34946DF032D7C275F
+      F624730AA61B493320CE99012C270009808880082018F0A5F8010AF4FE4B0B0D
+      9E8F510BB0534810B580F040CC800113C094DD4E32FB42B2769AF8D369FFABA0
+      A47A4FD0EB75ACE8879C7F5A3EF5573E0CDB7D77075A599EB9EB44A92FA34FEC
+      7BD4D54CC8BAC30BF79E0E5E77BB64D756346E321C7D5E661DA94FDC71144423
+      A18CBF174BFE3838E9D2C7D37EDCAEEDC3291A402410203F40D306F0381BBBFA
+      015EAC30B7DF875A41AB4EA7730FB44A70A0A2292F9F7DE2210990BF23D8F414
+      FFD71BAC50583997093FF90098FAAF24EFBFD0F4636490C0636C05CDAD6CBAAE
+      282E9F06479E736FB78FADFCE43958FD45DF21C34C20BF78021C7B41FACB6AC5
+      F875D507F0DF771ECADA7B5A74F0F9B0F3EE87A7F5987CF71FD400B86E41C268
+      71365EDCD1048EA65FBBFA01D64DCE6F3F1F09A009CD00672814F20FC40C1888
+      5832492E9F73F2DD78DE2BC50E40737E25EBFD47C2AF47E1A7611F440072856C
+      D887FFC478E1DE53C1EF750EFD4019845A6B8033AF7DB5C7C7DF78FC72686BDA
+      3C80230E1DD6827238FE229A149799909F80971E381B3CAEF47BFE7B02F5353C
+      63F9ABA8E96AD276CC649F00160D48309BDF1F88F245427E68DDF64D977C0088
+      54DB5A8F52C8A2DBC819483901E1703884660011409FABD58008E0D8638F957F
+      FD9B9ADACBCE15E2FF0A54F3F3C7CD0693A580093FB3FFA9EB0F53FFF99EFF23
+      049FBF751F6C5A2B6D038BFEE0CCEB5EEFF1474969B12BEE3B0DC2415F56AEA5
+      6CFC4C38F454723E6656F8DB1A37C1BF9EBA322BEF498C19BB1E060B0E4A6F86
+      68675250679F00C11468AFFD81F50810750C867C9DF7E66293FF7D94C9162480
+      0E3203500388423FA20103114FF9843947E68513FA66BCAD4896FFAA29FEBF10
+      ED7EAEE907C5FE357CF20FD7F577E43080B36D3BBCF198740D41FA8BC5875D0A
+      53E6ECDFEBFB78F3F14B336ECECC5E781CCCDFFBD4ACBCE7B79FBE0A49E0B7AC
+      9C4B0C955A0BA72D7B2DBD074D703901E4088C44B86880101274B66C4253A04E
+      3C4414F4AAF05B9516C7BDB158AC49A3D138066206F4573A99FA5FB9CBC9BFC7
+      F3BE21D8FFB4C2EB8D795050318739FEB8D8BF920DFB64ABBF9C1FF33D82F0C2
+      3DC743249C5B0337BB62E1C117C1D45D0EECF5395BD7FD17BE7CEFE18C38CCE4
+      A81AEF73D472A89C9C99505F57F8BD0E78E5416A92224D8463D1A148B8B3D35B
+      291AE70B848800843E01440264E2D81BD7A5380255F2D82634032EC6DB0D5DCC
+      803EA301FD260052FFBFD9A4BA299190DD22D8FF34F7CF9C3F1EAC451398F093
+      F38F2601B1DC7FF9C8B2FF057CFBE163F0EBAAF7A4BE8C5E20C315E91F689AF5
+      AF85D5AACF5F80752BDFC61F54DF25B17D9E1935C209D317C242D44032D142AB
+      277CF2FA9D50FBDBB7593B5F57986C2570CC05E91B7526440284E220561B108A
+      323320100842CBB6AFF0FB8A271D813259C237ADA0F564340BEA281A60369B3B
+      B66CD9125AB76E1D9901BDAA79FD2680A54B972A36BBC6BD80E73B41EC00B495
+      4C0793B584093FA7FE7776FE61433F469806108F4761056A01B4CF45E80C3638
+      EE926707FAAEE0FB4F9E85DFD67C30408D40C6B2FA343A3314944E8205075F0C
+      6A6DFAE7EAF57AE5ECFB384ED24A479287D3AEFD575A8FC95283793F009B1D80
+      04401B1141EBB6EF201CF6A7F801C65BEDE76A14E1F54AA5B209577FA74EA70B
+      F4A736A0BFD2299F376F9EA2393A8D6876AE98000A2AE682C96C65C2AFD57486
+      FF8673EBAFBEF0D57B0FC2E61C75068EC71578AFDF0F3ED186F21DEA367D074D
+      DBD7B24E34F15884551192A091A05BF2CB99B01757EC04E63CE95A7909F8FE93
+      A761FDF7831B9C9A4E2C3DEA5AA89AB267DA8ED7758418350A09F25A407BFD4F
+      68F6D85308A0D8E8F9934DEBFB18EF6BC4BFEDA150C8D79F0122FD915066FF1F
+      7CF0C1AAB58D796D78DB248E00144D5808069D865BFD85E21FF9C84900EA0E24
+      0CAF3D7446D63CE9FD067EE047FEE151305A8AA5BE92ACE1E5BF9E885ACBC01B
+      7CA41B1593774312B82E6DC74B0D077612008D157734FD065E5743970621FE17
+      8BF4AE97D1FEAF8B46A36D6AB5DAD39F12E17E1100D9FFAB36C72B4371EDD6A4
+      0310ED3DB5468F04B01BCBFA63ABBF5AC1BA0229152327F9A727D85BB6C0072F
+      2CCB68CEF9405139650F58FCFBCCE4A8E72236FDF801ACFC38FDD9788381566F
+      81A32F7A26ADC714D282C9D6270210A2011DF63AE868DD9C120930A8439F555A
+      5C0FA37CD60E241CD81F1195A3FD2FAF7197EE1789C9DF4F890018F221BF6216
+      9B0340B17F46008ACE08C048C79AFFBD00EB57BE29F5653090E7FD984B5ECCAA
+      F34D6ABCF9E8D910F0E54662960C7FF0275E99DE62316194788CCF0720020886
+      23E0EBB083BDF1E79448804619FDB5DA66BF03E5733BFEDD140C069D4AA5B2CF
+      E2A07E11C08C1933946ED5AC0BE209F9FD620230D9CAC1563C1955FF4E02488E
+      FC1EE11A8080CF5EBF1D9A6AB23F2A4C0CF2BEEF7DCC4D5052355BEA8F236B68
+      DCB61A3EFF676E54370A38E1F257409E260266AA3DDF2340F003B07E819410E4
+      F742EBF6952904A094C7ED93F25AAF45B9A409DD0D8140C0EEF7FB7D2693A9D7
+      E2A0BE4494A9FF5EAF57F94B93EDBE784276819800ACC553C08224A0A108804A
+      21EAFE03CC1E1D0D0440F8EEC34760EB2FD23805E9FB5872E4F5503661AED41F
+      4356F1EFA72F068F33B7661DEE7BFCED6C1C5EBA90EC0F201A254E2640183581
+      E62D5F423412491200223E35BFE57214CBADF8775D381CA656611E518F806EFD
+      00FD2280B6B636D56657D93B89846C3F711150DEB899603417B2D59FABFEEB2C
+      001A25B29FC42FDFFC03B757877EA001803AD52E38EC2A289FB4BBD46F3FAB70
+      B66C850F5764AEA478B098B3E4749836FF77693B1E5F17C47C00B1283F44144D
+      007206B66DFF01C2412FAB091088A2D2E2FC8B411DFE8EFC00A150A8C5603074
+      D4D6D6067BCB07E8930028FE8F6A84FAC75AF37A3C4F953809A868FCEEA0D319
+      B808009FFF4F11004E01186D1400B06DDDA7F0FD477FCB4ACDBDB5703CAAFDB7
+      805A6B96FA6D671D1FBDB40C1C2DB935EA9C3071D601307FDFF4D50508A140CA
+      0788C4F9706008092018037BE32F10F0B4A51040A1DEF36281C1FF7E3C1EAFA1
+      7C0034015C28BBFEDEF201FA925216FF4F688ACD2D3E1BCDC4927776015242D1
+      8445A0A5EC3F7597B1DFC3B8FDF75041ABD3EA4F1E034733FD40D34F042AB51E
+      765E74124C9A73B0D46F5512F8DD6DF0EE93E74B7D19DD62D29C8360977DCE4D
+      EB31D962C28F0E8BF22600F9015CF66DE06DAF4921008B36F07199C94DA3FAB6
+      E1DF8DB8273F80BFBCBC3C3C6802200760D43063AA37A45ACB5EC013805A6F42
+      7B673E67FFA72400C9478DEDDF1B827E17ACFEF44968D8FA3D32F8D0B3D4F468
+      6AEDBCE709307EFA5E433ED670C67FDFF83F68A9FD49EACBE81653E61ECECC80
+      7442880450383012A35C00DA22AC3188AB65634A3210AAFF3F56981D8FC9E5F2
+      6D787F3D9AE9ED7D7509EA4D5459FBAFEFBEFB4EF55BAB717E30AAFE52C6E5F6
+      3202D01AF2A0A07C36120037F853ABE6BAFFCA79EFFFE8F302740FFA827EFEFA
+      25A8DDF03F16B2EA6F051E79F60D962228A99A0393E71C02669BF4597752231A
+      0EC21B8F9E22795BB39E307DD7A360D6C293D3763C210A407B363588FC007C2E
+      80B7A30D1C8D3FA710804E19DE5065753C8A2FDD8A5B6D7F1C81BD1280E000AC
+      F314EF138C2ADF15D47A05FE38B5A602C81FB733AEFE7CFB6FD60014C55E0EA3
+      D607D01FB8DA6AA0FEB76FA0C35E0BB1480862B1302BC451690C60B4968025BF
+      0A6CC5D5905F9A994194C3196BBF780136FEF0D6D00F9421CCD8F378D8698F63
+      D37ACCCE94602E1F2014E2FA02F83D0EB037AC492100AD32B26DBCD5FE08DEA6
+      48402D6E2D9148A42388183401D4D7D7AB9B4395BF0BC794AFA41080B9187FA4
+      D341AF55A316C08D05938D9006A063C84DBCFBE47910F0DAA5BE8C1EB1F3A253
+      60DAFCF44F3A12528229F5974281D417C0EFED80F6BA552904A051441B27D8DA
+      A9EFDA567204A2BC36A339E0B2D96C819EFA04F64A004204E09706C3C9E198E2
+      71C1042002D0A34A6A2B9EC2AA00A90B90500198C91020853D1AB6AC441B702D
+      4C9C792014964FCFD099C6906B08A2F9F4F6E3E975B0A51BBB2C3D0B26EF7248
+      5A8FC98502F906215413408343A92CD8EB83B6DA6F530840A588B54FB4B55153
+      444AD9AFC17D236504F61609E84D565904005FACD9EE2EF90312C03D621F8031
+      AF0AAC4513591B70AE07A09C8506D94133C0001F3C7B29737C242F1C4F326BF1
+      A930655EFAE2AE63C85DACFEE471D8B2F63F525F46AF38F0B4FBC09C5F91F6E3
+      3201E74B83A918883507F107A1B5E6AB140250CAE3EEC9F96D0F02E703484602
+      5073F0F59412DC27016811F5FE8AABA371C5CDEC057C14C0543011AC0555A0D7
+      AB591290300034534340DE7CE4946E3BF1EC79E8555031654146CE3986DCC1DB
+      8F9F8D5A804BEACBE81172850A8EB9F4958C1C3B5915887B362B2010666DC25B
+      B6FE2F850014B278604A014700F8F73694D5FABEE605F424AD2C02B06EDD3AA5
+      D3E9D46DB217DC8A0470397B80270073D16464BB72D4009000500B50254B8033
+      9302FCFA03C7773BDD961C67879CF548463EF831E40EFEF9C0096803A773D067
+      7A412BFF41A7A77FE641B22C38C145948800685828F50568DDFA051BF82A3C47
+      264B44A7E6B73C80B76B140A054B09164A837B6A11D62301083500C81CFA3A5F
+      C5DDD1B8FC6CF6409200A682A5601C184803D0A8581F00593204987EBC76FF31
+      3D867F0E3AEDFE8CA85E63C81DFC03BFFF5C2ABDEE8A29730F83397B9D999163
+      0B7E00D61D281265034303C130B46DFB9A757916088030ADA0F901B2FF7163A1
+      40DC5ABBCC0D4C8904F44A00140244F541BFA135EF51240036744E20004BC94E
+      AC1598C9C83503A1E6200A19D70720130CF0DA5F8F869E32EB8A2A67C25EC7DC
+      B6C3FD5B7EFA00DA1B7E05B7A31E021E3B84435C030FD21ACAAA7785C9730F05
+      9D313F235FDA18D207FA91BFF9E009525F46AF38F0F40732B708910620E40244
+      62E0F5863902A8F90EA291400A014CCE6B7D5CA948D0E00772046E572A95CD2A
+      95AAA3A1A121386002A01020128061ABABF4F95842CE724F0502B096CE44412A
+      049341C34701642C7925535140A602F6D0B892CE7BE4C5CF8352CD4D9BA574D1
+      4F5EB99E097D5F5069F450327E2EEC7EC8E51999F83A86A1C3D9BC193E5A91BB
+      8D4E142A0D1C7DE9CB193BBEA0F85059700835001F12803F443302564124E84E
+      2180EA3CFB0B1A45743DDEDC8ABFE7ED6802F41A0AEC91002804585858A84233
+      C0F84B93ED9FF1846C317B40208071B3C168CA07938927001A03CEB701CF0409
+      BCF3D8B9E0EF45A0C7CFD81B763FF812E6295EF5F113034EBF55AAB4B0C72197
+      C1B8C9A3ABB26E38806CDFD7EF3B36673300E7EE7336D3263305211D982201D4
+      19C8EB0BB15C004A040AFB9D290430DEEAF8874E15594B2600E502E0EA4FCD41
+      5CD42474F7DD778F0C8800280720140A197F6D2D781B098049462701CC05A3D9
+      0A66A316B44800D40948A6C85C0F808F572C077BE3C61E1F272F6CC1B869D05A
+      FBF390CE53583103961C75236A13DACCBC91310C0AEF3E7101785DCD525FC60E
+      A01A8DC3FF90D9B664095E64D9C0D070143C5E9E00EAD74238604F21804A8BE3
+      0DBD2A4CC512C95C00D4E29D4806DDE602F44A006AB55A138BC58C9B1C45AFC4
+      E2F2A5EC01DECB6F2B9D8326403EF301502440917402668601567EF0206CCB52
+      D30D0592C9DCFDCE83EA99FB0FFD6063480BD67CFE4C4EA6011F70EA3D602B9E
+      94D17308E9C0719E00DC4400FE3012C01A34015C290430C1E6785DAB8CAC033E
+      1B90BA04F7362DA84F020887C3A66D1DA54F46E372A6E3080460299909665B11
+      187902A06620B20C4E026AAE5903FF7DEDD68C7ED05D612B9E084B8FBB2DEBBD
+      EEC7B02382FE0E78FB6F67E6D474E69209BBC05EC7DC92F1F308454171660244
+      C0EB0E819708A06E1544421EEE393C014CB4B5BDA252C436513D80D01E0C49C0
+      D15332504FD29ACC02449836B4DAEE8FC615C928001180B988FAC29780C9A403
+      835EC5114086EB005EBBF728B483B2FB0390CB95307BE9193079DE61593DEF18
+      76C4A6D5EFC28F9F3C21F56530D08C8443CFFB7BD2F19C0DC4F854608F27083E
+      24004A058E858329BE9129F92D2BD01AAF013E1908F70D28FCA401F8BAEB0BD0
+      2701A8542AF3667BFE1FC331C519EC053C01980AA6B04420B3598B04A06104C0
+      6601669004C80EF4381A877EA041C05250097B1F7F1B688D79929C7F0C1C3E7D
+      E90668ADFB45D26BD09BF2E11012FE2C75606626401C58F30F4A0072BB03CC07
+      D046A9C0D188980012D30B5B5EC4BFEB4903502814DB22914803DEDF3E680240
+      35C252E32ABC3E14535EC85EC00BB8297F22980BABC06CD280D1A003A58A6B06
+      9AC93E00AB3E7E9CAD0252815A3FEFBCF02498B1677A4B3E871BDCF67A68D8FC
+      1D0BB7067C2E0805DCAC565FA5D6815A6702ADDE0C466B29544E5B0C7A73415A
+      CF4D4359DE7F4ABA86A0F4BE0E39E761A619660B9C0F902F070E46A0A323C0B2
+      01DBB6FE8F2F14E2E4592E4B4450037895528081AB0560E9C0B888B7BB5C2E6F
+      7793827A2500AA03C0175BEABDC5970622CA641746220183B50AAC2513C164D0
+      82C9AC499A00B20C86D26920C2074F483F9EDB642B85A527FC1FE82D85525F4A
+      C641825DBBE14B68DAF2036B7316F4D80734878F86941AACC550317501ECB4F0
+      B8B409CED76FDD0D75BF7E99D5CFC25A341E0E3CEB3EBC95FD7C11A601A0F91B
+      40C177B9D104F005A17DEB17DC633C0128E5F1E0A4BCD67FE24D9A124CEAFFD6
+      BE3A03F54A00E3C68DD30683416B8DD372B62FAC4E7A3B48D0F5D672B0503D00
+      9A00269336D90F20D378FD9E63D232C976A8A0E4A349730F81B9FB9F27F5A5A4
+      156DF5EBA16EC357D05EB78EADB2D1348E42A7CFACA0622798B3F79990573A79
+      C8C7DBBCFA3DF8F1E327333EA895BA2F4F9E7F38CCD9E7AC8C9EA75724B81161
+      01B4FD5DA401787D60DFFE0DFF1027CF2A45CC3B29AF9D062592DACF34009A18
+      4C23C3F57ABDA7BF04C00A81D056505656566A63B19865BBD37CA237ACB92BF9
+      046A09662A055BC9345CFDB52C1740A551729580DDE56AA49117FEF3EC952C33
+      2C574011823D7F773594540FCFBEFC7124D3CD3F7E0035EB3E878EB69A6E0BAE
+      3281FCB2A9B0E8981BD948AD215D3F0AFF8F1F3F015B7FFA980D324D2BF0775E
+      3E790FD8FDB02BB29B17D28D0C2564C0660304FC21E87005C0EB7183A36E658A
+      0350A38C7654DBEC34BBBE81849F36A552598732DC366802884422D606B7F977
+      EE90EE21F193B4A662B095CE607900268B8E4D07621D8132FCD9ACFBFA1FF0F3
+      7F5FC8DE97D14F14944F8725C7DE3C2C42865E5CD937AEFC17DAF1DF83DFD32E
+      59910DF954A6ED7E248BB20C1D7158F3C9334864FF65CD438602859292CAA6A3
+      E05FCE127D7201540D188DC650F50F81DBE507AFDB01CE861F530840A78CD8AB
+      ACF68F80D700A82210F78C00F0B6B7BB8AC07E1140B3C7B8AF3368785AFC248D
+      A100F2C6ED0C46A30ECD001D6B0E9AA95E0062D044DE37EFCBCDC21019AA8A3B
+      2D3816765E9CBEC690E942477B1DFCF4E9D3D08E2A7E24E497FA7252602D9A00
+      FB9F797FDA6A31286760C337AF43FDC6AFC1D74103ADFB263872601656EE0C53
+      773B028AAA6649FD91EC007A07116A07E609A209E0C7F7D50ECEC6D4EEC87A55
+      B8A5D2E2F80C3A7D00E404AC1D12019009D0EAD1EDD1E637FE23E503D35A21BF
+      620E1850FDB798F5AC27007504CA4633D07FDD7712FB9273155AA30D16A37A9B
+      3F6E9AD49702AED61AF8EEDFF781B32977CCA6EE409FD921E7FE0DD4FAF40E3A
+      2113C1D9BC153A5AB7811B49D0E36A667522465B19580B2B59B297A5B83AB70B
+      C158A61FD70BC0EB0DB02880C7D10CEE9675294F33AA438D1516D77FF94E4064
+      026C1D9409409BD809E8F4AB66367AAC29F137854A070555BB83C1A001339A00
+      3A960B20EFB61F58BA29E1CB7FDE99750FF0603065D7C361DE81D20CB108FBDD
+      F0D9CB3783A36993D41F43BF410559879CFF286B873E9AD19DBE420970613E09
+      A8034D0077FB76F0DA53A72359B4C19A32530779061BF824204600D16874404E
+      40424A1850A952956E682DFA025FA5493E0305BD70C22224001D58AC7AD01B35
+      AC35789F7900696083E66D6BE0D317AECFCA973154980B2AE080B3EECDAA6F60
+      EB9AFFC0CA771FCE9A432F9DA03C82A3AE78216D53768705FAB450B81C806030
+      021E7700DCA801B85A3640A0233529AED0E05D57A0F7FD4489406402F08EC0BA
+      4187018900F085A493156F7614BF1E4BC827249F81049057310F4C161B6A0006
+      5613A0E243815DDF4F268C8257EE386C40F1682941B1F0BD4EB8252B91824F9E
+      5F0E2D35B93939A7BFB0148D8743CF7F54EACB90043D05D12802100C8451F8FD
+      A80504C051CF95028B516E76AE4433601325FF081A809008849A806FC00420A4
+      02E3C18AB7380A1E0CC7148BC497455D812CF96560B2EAC064D4815A437E80EC
+      CC0578EFD10BC0D9B22D2BE74A17A6ED7124CC3B287DC323538036E27B7FBF68
+      D87D263D61C2EC7D61C191B93701580A50121045002804C8114010DAB77D03B1
+      6830E57913F3DA3E552BE2A4FED7A3E03327206A02F58140C08E668077D0B500
+      F877518DD376AD3FA24A71BF1BF2ABD9141BB3599F0C05D278B09E6B0CD3F7A1
+      ACFDF47958FBF98AEC7F1B43C46E875D0C53763B3CBD0745FBF0ED87CF634EAE
+      9103191C7EC9636029AC92FA42B2835ECC006A0612A56EC03ECEFEF77AFCD0B6
+      F58B9410A05C96884EC96FF908059FC21E75421E006E4408F681D60224CB81F1
+      8066648FC2468FE51477489742C95A5309E48F9B0126B30ECC563D6884B2E02C
+      28013E570BBC71EFA9993F519A415965475DBD0274A6F41515BDF7F74BC0DEB0
+      71E807CA3198F2C7C111973F23F565480A612600F501F079032C07C0ED70A009
+      F0436A129022EAA9CEB37F81F7B5A1CCD24AC066030CB61C38A51F00DA0F858E
+      8061698BD7F8A0F8496A8D050AC6CF03234F002C12A052B08E41892C0C077DE9
+      D64372222D78A0603FEC2B9E4BCBB14813FA09B7918A3D8FB80A26CD1F9DA3D0
+      3924201EA30800EF0074FAC1D5D600EED6F5290480B67F4B85C5F503DE6C25C7
+      1FF0E5C0A8C193A770700D41A82598DFEF372183144413AAC95B9D856F885FA3
+      502AA1B07A314B06A24880CEA8455250F62F17200DFCF0CE83E7B118EF70C4BC
+      83CF83198B8F1BD231EC0DBFC17B7FBB28677BE5A5037285128EB9F615D01AAD
+      525F4AFAD18FAF8D750242FB9F1C808C00500370366F01AF635B4A06679ECEBF
+      ADC8E0A6C480564AFE117A02920630E89660424F40541F0AF04756BEC951F24A
+      3C21B3259F24974141D502B4FF4DA801189826A0562BB91161FC8CC04C4604D6
+      7CFC1CDB86234A27CD8503CFB96748C778E3EE53C16D6F90FAAD641CE6C20A38
+      EAAAE1F93DF7073DC948821F06122302F0710E40EA0560AFFF0582EED4FE88A5
+      26F77AAB36B019E59408603BF02DC1507B6F422DDE494D41074400D4161CF7EA
+      B6B63603EE0B509518B7C99EFF5024A6484EE4A495DE366E0E98F38A3A0980FA
+      038A3A046712A4FEBF78E3C139D526AABF30E597C1D1CB06EFC46CAD5907EF3D
+      2A7D6974B63063F1B1B0EB61174A7D19594582EF041C41FB9F1C80B4FAFB9000
+      DA6A7E8070303513B6CA6AFF5EA78C90BA4FCCC00880880049A069506DC185C1
+      200A85C28007C8C38B1957E3CABB291051ED937C124D082A9C0296A22AE60330
+      524AB05ECDFC0054E8918D80E03B0FFE01DAEB879F038CE6119CF27FEF0DFAF5
+      6FDE7B26B84648C8AF7F90C12E079C0973F63B4DEA0BC91A880062BCFDEFF770
+      EABFCF1384D6ADFFC3C52F35C96B6A7ECBE73259C28932D984AF630480DB7694
+      DF66DC3A6A6B6B8328D30323001A0D86C2AF0F040279B82FAD775BCEF384B49D
+      AE77EA0B602E83BC71D3D10CD0B38DFC002AB5926F1D269A1224D673D2C80CDB
+      7FF9023E7DF64629BFA741816AE3CFB8FBB341BD361CF4C38A1B47A763ACB072
+      2738F8C2075872D588408FFA3F4F00BCFD4F2BBFC7E543127082BD7625D30C04
+      28E5B1E0E4FCF6AFF0F90201D400E704A4D1602D68C6BB8388014D06120F078D
+      46A336B4254A1C7EDDBE2D3EF31DE227AAD47A28ACDE138C261D986D44005C42
+      90D0263C1B6AC00BD71F089150FA1A576403F4033EFDAE8F07F5DA5FFEFB2AAC
+      7C7BF40E4455690DB0DF997F647E94918A045F0044F1FFA03F041EB4FFBDB839
+      5B6AC0DDFA5B8AE3D7A00EDB2BCC8ED528FC0E8AFBD33C003E13902A015B0733
+      1C9420479B815504FA7C3E8B46A3298EC761C2467BE1F389842CD91D81AAA818
+      01582CCC0F60A0D260E60750241D813B9C2DCD4EEB5FBF7A13BEF9E75F25F9A2
+      060B73C13838E6FAC18D93FEF78317406B8DB48D3173015441386DC1EF61CE01
+      A767B5475F5AD183864C2B3C85FFC8FE0FA0FD2F10407BDD5A08BA5B5308A0D0
+      E0DD52A0F751B9673B11407FEB00C4A7EF0E3B6403E256B9C59EFFA7504C3123
+      F92414724BF14E602DAE0093558F046000AD410D2A259A018ACCCD0AEC8A576E
+      3B0A7CCED6EC9C2C0D9830676FD8E78CFF1BD46B9F5F7E004482B955D32F25A8
+      0F43E9A45DA07A977DA16AE6E2611F3264467A9C53FF2341DEFEA71E00B86FDE
+      FC05C423E11402186FB5AFD2A9A22D78B31D069005C83EBBDE3E57F174206492
+      4234052A9ABCB6B3DD21EDD1C9275183504B29E457CE645100A3C5003A939615
+      06C995D9E90F4068D9FA13FCFB81E1E3255E74C27298BAE7E052829FB962C9B0
+      29849202943BA033E7E1A2341E4AAA67C3C479FB830935AE6183043709B8D3FE
+      C7D59F6500B683BDE60736224C9063853C1E9992DFF6350ABA07658D5640B2FB
+      050268C4C5DBD9531210A15702102604A3FD6FD4E974F9F178BCBC23A85DDCE8
+      B1DC9C7C120AB852A383E2890B991FC06833809E1282B4FCB8B00C4E0CEE8AB7
+      EFFB03B46E1BDA6CC06CE1D43F7F009A4136BF78F2D28590763B6A848348416F
+      2980FCF229503E6D7798BAE0F09C341BD8EA9FE0D4FF28AAFF64FF93F033FBBF
+      792BDAFF9B586E8000A33AD45E6171913DD881B2D88C8F1101B008002EDCD43B
+      BDC7C1A0843E09401C0AC4FBCAF0A0D59B1C258FC413321D7B126B052E87C209
+      7B80C966E3CD00AE2E40415A00AB0EEC3E29A8DB930EE1C30BB81DF0D28D87E7
+      7C5E407EC5543872D9B3837A2D45009EBF665FA9DFC2B0874AAB87A5A7DE0255
+      B39664FC5CFDFDDDD3F368B18CC778F53F1481803788C2EFE3E2FFDB7F8480A7
+      2D25025064F06CC9D3F9B6A31CBA90389A842420DAE3CADF623018580870DDBA
+      7514378C7777DE1EAF892201DF7DF79D2A1008E8D014B0A109508A44307E9B33
+      FFFA605439433804F901ACA5D351E5AA02A340007A0DA8846840B65400C4CA7F
+      3D0C6B3F7A316BE71B28E8B338FEF637C098573AA8D707BD4E78F1DAD11902CC
+      048AAA67C28117DC3B686D2CDD60DE7F5AFDA35108A3FA4FF6BF972500F9A105
+      EDFF6817FBBFDAD6BE4AAD8852F8CF817F36520890EF07489A406B2412717B3C
+      9E5077214042AF04409B1009A0E6A0D41700EFAB6AF65A4E76057547084F2402
+      D05BCA20AF622612009A0166035717408D42D9C8301964CD0E40BCFFE025D0B0
+      6165D6CE37104C9CBF3FEC7DD61D433AC69317EE2EF5DB185120F360DF73EFCC
+      8A36D01B4842A8F4371E450208A1FA1F0881DFCDA9FF6E7B2BB46F5FC55A8375
+      0E02898526E5B57D8FC2EFC33FED7C0890D9FFA8B5D7F7D60C547CCE5E3F1BA1
+      33905EAF37011F09F084D47BD6755897270F22273F80168A272E62AB3F6504EA
+      4C7C3890AF0D60A642163FCC576F3E0ADC6DF5593C63DFA0D8FF19F77D8EA438
+      34DBF3A98B170CCB765FB90CEAFB7FFABD9F0EF9BB192C12FC3F64BE0ADE7F0A
+      FFF95807603F389A3683A7752B9B0F2814019935C1D632936B03CA96972F03AE
+      172200A8B1370483C15E230084BE64322512A0542A0B281280279AB0B1BDE8EE
+      784266604F42E12621A726A1C6FC3C46007A96168C668096EF16CC7202B24701
+      D1901F562C3F14D5286FD6CED917169DB41CA62F397AC8C779EE8ABD73EA7D8D
+      148C9FB314F63FFF6E694E9EE0E6FFB1E29F701442A8FE07BC01F0F1F9FFEDB5
+      ABF8B16C9D325C62746FB66AFDD4FDC74D4540C04700281148A55235E1B17A8D
+      0010FA24002112A0D1680CA84E9023701C9E607C8D33EFCA4054B533F72C1928
+      E47230155683AD6C32E86964B80509C0A0655A809C7A0470A383B36909A006D0
+      00AFDD7C744EAC96BB1F7319CC3A203D0D4C9EBF625F08F972B72DFA70C6EF97
+      3FC3FC025905E7FAE7D47F4AFE094520E427F53F007E9600E486D62D5F410C7F
+      C76207E0C4BCB61F54F2989B7700B222203E03703BCA1BFDDDD1531190807E11
+      00D504783C1EB402F4567204221154357BF4473802C664413B09B85A6784A289
+      7B3202200D40C7B20235AC3640D002B2921B2C42F3E635F0FE7D17423412CAEA
+      79C5D8EDA84B60F64167A4ED782F5CB51FAE06439B7E3386EE419D9A4EB9F7A3
+      AC9F97ABFCE3D4FF70300C416F90093FADFE54F4E56ADEC89C8382FDAF5644FD
+      13F3EC3FE2DF9411E64012600E40DEFEA786207D3A0009FD9146399280124980
+      D27FCD680A14230954C6138A299B9D85B7271232569541C24D0D420A2AE7A119
+      500806131200D302880054A0102A04333C42BC3B84FD5E78EBAE33C0D998FDE6
+      21BB1D7931CC3924BD43255FBCFA00FC71B467FDBD8C161C7DD34B905F99A5A1
+      2EB2045FF7CFADFE9CFA1F828027C01C80140568DFF63DFEED4AB1FF0BF4BEDA
+      02BD87427E5E14FE76DEFE176A001AFA4A014E9EBE1F97C81C81F9F9F96AA13D
+      182504911FA0B623EF7C7F44CDF425E6E4C355DE9457097915D3510BE0FC002C
+      2B504B25C29DCE402EBE905D12207CF3F2DDF0CBC72F43369268C8A9B4E0A465
+      3075F191693FF64B571F043E674BC6DFC368C5B42547C1E2D36FCACEC9B8AA1F
+      8E00F8D87FD0176482CFD47FA71309E03BD40C2262FB3F3129BF7D15AAFFE408
+      22FB9F1A81D652F80F1768EA01D088C2EFE8CBFE27F4470A9923100FA6223F00
+      0A703E9EA88CFC00CE807669B3D7C215689323504666800ECD80058C004803E0
+      A201FCF4606A182A97751B11C8F050E1241A7F5D091F3E7C254482BE4C7C9D4C
+      CB99BAE8085872EA0D641765E41C4FFD6137F683184366602A288313EF7A77C8
+      C7E9EB372D3CCE15FEC4D04C450220E71F1240A0835BFD9D4D9BC04DDEFF6834
+      A9FEEB55E18E4A8B631DCA5100EF7301D704A456B0FF716B119A80A0F047F953
+      0D9E00BAFA0190654AF07EEAD75CBDC951B43C1697538890110065FFD9CA6782
+      B9B08C2301336F066885CCC0CE6E413B944277B99A4CB6BADBF8BF37E0C7779F
+      024F5BFA5A6A954D9B0FFB5E784F468B51EAD67E091FDC3F7A3A0149014A5F3F
+      E7891F8644E0DD29B85D7FCF2CFB2FC179FEB9D53F8AE66A8879FF49FD0F50F3
+      8F2DDF40C8EF4989FF9718DD5B6CBA00A5F9FAF13E9600249400E3B1EA504B6F
+      EB8FFD2F5C437FC0FC00A80568DC6EB705D9A5084F5849664083DB72823BA4DD
+      8D1D8CC6832B14AC3828AF6A266F06E8900074A0D2A9935A801011C805381BB6
+      C2B72FFF051A7E5DC986460E045485662D1D0F13E6EF0F3BEF7F32680C99CF26
+      7BEFEE3F40C3FA6FA5FAB8460DF6BDF06EA8DEF5808C9E2321A8FF94F9178942
+      34C8A9FF64FF07DC54FCD30A8EEDAB21868FC5F9E7CA6589D8E4FCB6D5328807
+      F8F83F398358FC1FE5AA066F37A09CB65BAD565F5FF63FA1DF048066805C9C0F
+      80FB72649B09C19876EE7697ED5C7630320350B8951A351492196036A109C091
+      805AC7E504902F4026F205ECB0EA0FE122870252B1EA7EFE0A1AD67D0B6DDBD6
+      31CD8026CB8AAF8256764B71057310954D9F0F653B653F23EFE97377836858BA
+      88C66841D52E4BE1C0CB1F18D46BFB6A849B4CFA8973433F63A4FED3EA1F0841
+      88BCFF6CF547F5BF613D78EDF529E13FB326D85E6672D1C4571A0BE4162A0089
+      00841E808140C089E67A9FF67F77D7D6E3F3847C00B201A830281A8D96513810
+      1F9BB0C5917F6138A62CE2FC005C34C052360DCC45552C24487E00CA09202D40
+      C9C687299004B8C4A01C510486053E7AF82AD8F67DF64354A311B6F24970EC1F
+      DFC8D8F129E927110356D64D2B3C65FE857C210832F51F3500AF1FDAB67C09E1
+      603025FC576E76FE6AD284A9F30F6900140B6EA61E809402CCB7036FA11E8046
+      A331D897FD4FE83701088541685B689165A82EA04430035A7DA6431C01C35EEC
+      89BC1940F1D4FCAAF92C0A405A001180DAA061DA011B1E221409F5C400D99830
+      3A8CB0FDC7CFE13FF75D22F5658C1AE82C0570CA4303ECD9D81FF53501C98E3F
+      24D8CCF9C787FE68F5270208B883E0696F400DE0E714F55F298F8751FDA7D83F
+      4DC361F9FFB8B11660D4029CE600E2C2DC462DC0EC767BB82FFBBFBBCBEB0D29
+      1D82685C18324D395ECCF8685C396D8BA3E0C204F901793340A156310230D8F2
+      5175460D8069016406100928514B1015098DA901BD221AF4C30B172DC11F4A70
+      E8071B43BF40B52D673EF943FA0F9CE0E2FE409EFF38E7F98F06C32CF38FA9FF
+      A8FA1309D86B56A319606759AC82FA6FD3F91B4B8C1E52F7837CFA2F1B0346F1
+      7F52FFA901089A138EBEF2FFC51888E425C38156ABD5180C06A95370191100EE
+      AB6A9C796704A2AA2AC10CA0A20AA3AD046C15B39000B43C0968795F809A3903
+      A95418644258B0870EC29024CD7E5E65FABF3329417E88D7971F01AEC6D1D402
+      5C7A5085E039CFF163D6871A8DE28BFD13FC81D8EACF6C7FAAFA8BB0D01F39FF
+      48F08348003E471B386A5743241C49F1FE4FB0B6AFD5AA621E52FFF14F173500
+      01DEFE27EF3FDF10A4A3B70620DD5D5ABFDF86100EA4FE00F8B715550D961548
+      3D023A82BA058D1E332B1166B17EB902546A351454EF0A7A8B8D450288003464
+      0AB066212AA605305F808C9F283CC28477A8A0829FD797FD0E7F1063493FD986
+      42A581B39E5D9DDE83F2833E858E3FCCF647020833E1E70900F78EBA9FC0EF6C
+      618E6941FDD7A922EEF156C7AFBCFA4F0940A4FEB3F01F25FF90FA4FE13F5CA0
+      3DFD09FF09181001D02698010813990194154804808F556D75169C198E290B85
+      2E4114F737E495816DDCCE492D40432440434459B310212F804689653F453897
+      41518837AE3B72ACEA4F22A8744638E3C9F4F6941087FD28EE4F9EFF4810557F
+      22000F6E3EAAFEB3A3FABF0ACDBD30F30F08EA7FB9D9B9C1A80E91D38FA9FFC0
+      0D01AD17114093A0FEA36C46FA0AFF0918A8C43133A0B0B0504523C3A83A9006
+      86E085549129E00AEA17347BCD0702AFD2531520D302C6EF0E3A8B0534461D73
+      0AAA0D7CCF40B58A3D4721E76709CAF84BEA4F9AE060DFC13040EBA69FE0DFB7
+      9F362C271F8F1468CD7970EA635F75FF605F62D5CDEF9715FBF0A3BE48B0E3C9
+      D5BFD3F947ABBFB3FE675CFD9B38E71FAFFE6B9511EF78AB7D3D0A7B848A7FC8
+      FB4FEDBFF0C8B57C0210A9FFA42676A854AA60773300FB7BA97D3E5F3003281A
+      807F5BA84B109EBC820800A86DB8B3F0F4484C61156A0394A8EA1BF3CAC13A6E
+      3AA8510BA0C12144046A1612241250F06141393F567C10573582B0E5EBF7E0F3
+      47AE61B6DF18A40385018FBEFB9DF41C8C0FFC532E7F22CAAFFE68DF4782615E
+      FD0FB0ACBF40871357FFEFB9D53F8224C131078C3377FC66D60429F41746B9F2
+      F0C93FE4FDA7F05F0DCA22CD046C1F88F75FC060442DA53808B8C1A1CC19489A
+      80236058D0EA332D154683913350A9D140E184DD406BB2301380F20254680608
+      5A00AB144C761096259D26FD6D243A52B0FE3F2BE0EB67EFC86C0EF418FA85E9
+      FB9F080BCFBA6550AF4DF9DDF2213FE6FD8F71053F9CED1F86081FFAA3D45FDA
+      3B1BD681DFD108D1482419FBD728A2FE09B676EAFA4B317D0A0351F7DF167ED5
+      AFC1BF6B29F9A7AFF6DFBD5DEB80DF9FD02D186D0D3DB28F8DCC00BCBF926901
+      3259E5167BC14991B8C2C47202E40A50AA9560C8AF026BE9545CFDB54802A805
+      E8B9C420562948B304292CA8E88C0AB013F59422207A6BB2E43FC31BAB5E7B08
+      56BFFEB0D49731061E87DFBA024AA6CFEFF6B194DF5F2FBFBD04DFE82345F5A7
+      D53F186135FF113FE7FC0BB1D87F07B46F5B095124067A0EB506A3D795993AB6
+      58B4419AF813E17BFF9126402B3E093E85FFEA71DFAAD3E9DC3D0D00ED0D8322
+      004A0A429661CD42038180994A8463B158056506725A8011B500E39E82339054
+      7C8AFFE74FD803577F134702D43454CF970A934350DDE91094F1A6806C07E91E
+      CCCA98FBECF0D593B7C0AF1FBD2CF5658C8107FD06CF7EF9D781BE4A743B910C
+      5D27BDFE64CF4778C71FADFEFE50D2FB4F7B57E3AFE075D4B17E00941F4069C2
+      6A4534506D6BFB05E5218AC7A0FC6F0F6E54FA5BCF27FF6C47D9233270F4A7F6
+      BFAFAB1ED0BB2567A0C96452A3DA61C4BF596A30E503E0ED2A7CAFE40B383E9A
+      50E89933105777BC503014921630853901593890363D5F294829C26806501291
+      4C2816CACE6C514961AFD9006F2EFB9DD4973106114AA6CD87C36E7F6948C7E8
+      6EF58FA1F0B3B87F30C439FF7C41CE01E871437BCD77A8198478CF3FB7FA9718
+      DDDBAC5A7F9BC8F9972CFD25E14759A943B96BB65AAD2E94C3C0409C7F02064D
+      008233109947E772B9C8E9578C1754015C9970659BCFB8D01E30CE4B6A014802
+      2A8D16F2283DD8624502D0248980B40385502824540B8AFB068C601678FBFA63
+      A175D31AA92F630C221C71D79B5050BDF3A05FCFF9FC448D3E48A823BCE32FC0
+      ADFE4CF87D414604AE7AB4FD9D68FB53D30F7A2EBE54258B8626E6B7FF2CE36C
+      FF1012008BFDA36C3490F0E36D7200B2CE3F5D62FFFD56FF09832600E8921380
+      1748A3C368005B256E5531D2021C85C7C650B4D9A070D20250C0759622B055CC
+      6675014902600E412401562ECC9902C04C07FEF24668AAB0DFD90A2F9FB770CC
+      E99743301494C2097FFF62D0AF97F1A9BECC088877C6FCB9821F41F5C7CD1F60
+      C53F011765FDADE13CFFD1CED5BFD8E8A9B1697DADFCEA4F997FD40596427DF5
+      54F64B4E405AFD91009C7E447F537F77B8DE217C56C90A41B3D9AC236720DEC7
+      4282B8AFA23D6A010BDAFD86B9CCA94765C244026A0D58C7CD007D7E2953FFD5
+      061DD306547A0D1F16E47B0624FD01F88E64D96D299E2D7CF4E773A1F6874FA5
+      BE8C318870F0CDCF43D9AC85837C359FECCBDBFD42B14F9CD9FEBCEA4F04E0C1
+      953FC0D9FE8EED3F40C8D3C126013102C0FF54F26870A2CD8EB67F22CA87FED8
+      EA2FC4FE81EBFA5B8F32D74ECE3FAAFCEBADF36F6F181201903370DDBA75AC51
+      48201030A106508017496DC399168057326E9BB3E0F7E1B8CA2268019402ACD1
+      1BD014D80DD4941320F2052875B85172109F1B20680232A19D784F71C19EDE45
+      8E2FACCF9EB013AE0C63B5FDB982CAF9FBC0FED73DC1FD3188DF9458F869E587
+      3897EE4B8E3DB1E32F42EA3FDEF6B4D680A765F30EAB7FB9C5B5D1A80A52B88F
+      FABEB1D01F6EAD285FF57CD10F25003553E61F6AE0FEC138FF040C75594D6606
+      3A1C0EBD52A9B4E14516E34689414C0BF08535D3EBDCB67D042D40C1B4003518
+      0B2780B97822AF057024C0B400A17518DF3EAC9304F8CB1D418AC07344006315
+      7E39011A167AF2F3AB51FB540FEE00BC19D7B9F2F3AA7F9873FC91838FB3FD03
+      10F62211783D2CE927120C428CFAFD45B9C41F147C4785C5B5050F1513567FA1
+      ED17A9FDC0F5FC6BE0CB7EDD7DF5FDEF0B432600410BA0B6E1A809902FA00089
+      80F90290084813286BF0D8F6F684B59572961DA86035000A0A0B56CE038DC90A
+      1A23670AA892110135F307B06221DA9823912B1B1E49A6C08AD3768190D725F5
+      658C7A50E1DAA177BC0A45D3E60DEAF509AED48FF7FAC7D96CBF04DFE62B1E8C
+      24577F8AFB33C71FDE7635FC0241574BCAEA2F43DAA846D55F298F867A5AFD05
+      CF3F6E8EFEB6FDEAF5BDA7E3F313D70768341AD634944F0FA6BC80F2685C5EB1
+      D559787002D775410B50A8D4A0B514B07261B5AE5303500B5A00E506085101BE
+      9B3088CA8647825FF0D5731682AFBD51EACB18D5A0C565BF1B9E840A54FF078C
+      8478A61FE7F4234166763FADFCE1084BFA890642ACDD5784F7FA53A59F8B9A7D
+      A0F0D3201061F52FD47BEA0AF43E0AF3755DFD69EC37B5FDDE8E82DF40557F48
+      08EE81E6FD77FBFED3F11976D502F0C20A848880A0053802C639AD7ED36CD202
+      40A1600E41059A0296B29D409F57CA928298F09316A0E34880B50F53F1EDC445
+      59823279BA2E5D5AFCEBD203C159BB51EACB18BDC0DFD292CBFF0A13F71AC2EC
+      0616E707D6E08FE5FAF34EBF588413FE08AFFA477C9C0610F6F38E3F9F9B1504
+      09717F953C1AA8CE6B5F8FC78BF1AB3F79FE59D51FADFEB8AF552814B5B4FA6B
+      B55A0792C090577FF611A4EBA3EC4E0B205F007011011A2452B4D599BF7F38A6
+      B20AD98124DC6ABD91E506A80D7A2E29884F1156B2DC00DE14608D44F90E4272
+      61C41824D580E14A051FDE723234AEF952EACB1895200D74BF1B9F86B2398B07
+      FC5A61D5E7B37D78BB9F137E5AD169F58F8522C9B01FE5FC4749F871EF69D90A
+      DED66D8C2098ED4F39FFF85FA5D9B1C1A00E53A61F093479868591DF4D64FB93
+      F0A34CD5A773F527A48D00BAF305003748B4920F0D96F923EA09B5EEFC256C1D
+      57749A0286FC7230974EE56A03980620720852F72095922B18129A89B22CC1E1
+      EF186C5CF305FCE7E693A5BE8C51074341191C7EDFBB6882E60FFCC59DC3793A
+      8B7CE29CCD4FB63FADEA4CF5A7841F61F5C72D1A08FE7F7B5F166B59769EB5F6
+      78E673EE5873577757BBDB76BBE329F1007688C19108C246080594042991B050
+      848414F1122139BC002F48BC21E001780209119080584848246078800790AC24
+      D8C6DD9EBA6BAE5B773AF3B007FEEF5FFF5A7BED7DCFADBAD55D77AABE4BDA77
+      0FF70CFBECBDBFEF9FFFA5A6FD3DB5F3DE7754329BD16B175C19089F413B9E6E
+      DFE8EEA1E513C09F98B83F3AFEA2E65FE9597F6E2F91FE00FF072A1B7D9ED029
+      450488AD5689A52E8B1680AE41D7513A7C6FD0FB627FD678992BFF4222812064
+      90F7AE9229B07A55484008A0E1F803B856409B026C0EF89E540F967F499E173F
+      C9F3CE781C90C6BFFEB54FA9D9C5449F2733E86179F5CB5F53BFF0DBFFF8482F
+      5FFA2CE5C6E12F893E16FCBAD027E3325F6DF76381DABF18431398709BAFF9B8
+      CFB6BF51FD3D7AF76BAB5B7F1C78298A7D4A597FB47F5F3CFF68FB75EF794B7F
+      FE5DCFF3F22ECB0BA01F71157E00A305647970E5477B1BBF98E57E0D00F6450B
+      88EA0DB5F2D26754ADD3D526809000B6835AAD3005C41F50AE1C3CBF5AC077FE
+      E53F507FF4BB175580C73D7A2F7D44FD996FFE0BD5BD7EEBFD7F0857F8E42C73
+      7357F25BBB9F6CFAD95C4B7F56FDA722FDE76AFFDEF7D564EF3E7BFD6126284E
+      F965C7DF7BEBCD117AFB43FAA3030CF7FBA30559802CFDC507F0703E9FEF3A9E
+      FF0F2CFD319E376C6CE350640792168039B22E2112205101AC2FEF4F6B6FDC1F
+      AE7ECE1387A03105E2F68A5A7DE9D36C0240FA472D71084AF3103F96546133D3
+      B03BE5B8A73DBACFD641F4F44796CCD5BFFA4BAF3FF3AC4417E368A3B5795DFD
+      DC5FFBA67AE5E7DF67C19511FC7A1EAFB2D30FF6BB91FC48F881E4670298D9B0
+      1F72FF47DB77C8F67F8724FF8C49224F75B96F3D5CF45FE96DBF9DE7FC895CEF
+      6F1A7E40FAD3FE6D34FB84F4C70CC0B55A0D3E82D9511B7E1E653C770230A5C2
+      640A60129136690230B4AE90097043B400440736EF0FBA9FDD9F375F6535DE0F
+      58BA43D56FAEDE509D2B6F145A40439B0251031982E20F30A5C39C2350140ED9
+      5F74CE6284FFE5777E55DDFFCEFF38EDD3787106DDFFCD8F7E567DFE37FF9E5A
+      7FE3531FECB37247F5578600A4B34FA68B7C18FC1CF22BA43F6C7EEEF6DBDF55
+      FB77FF90F761F773D88F88C3F7D3C5AD95C7DF0DFD0C1EFFD4F4FA97765F0805
+      62D24AA4FDDEA57D68037BC8F97F967E7F47BA54C771F94DC39024491A711C77
+      89C536D13508FE004404E8075DA5B35F7F777FE3CBB3245ED12ABD4E134687A0
+      EED58FABE6DA158E048004A0018008382A00F0DB2E420193071C833647C07788
+      20F79EAD9B00D4BBFCE4C963FFF60FD5EFFD8D5FB8280AFA80C3272DF2E52F7D
+      4D7DEE37FFAEAA75D78A7F1CE1BE2E7D4E3C1DE8E7021F259D7D38D69FEA4C3F
+      A8FC00FF4CABFE8BA991FEB49EEA94DFDDDBDFA1FD3EFB06788A2FEDF8CB6F74
+      77DF69C73384F9ACE38FB081A49F2D487CF1FCB3E38F30B433A4B1B7B7377BD6
+      861F4F1BC742004A2A05D1368CCEBBD56834600A5C565AFADF94F5A5451A5C21
+      12F852A6C2884980937E22EB0F88DB1DAD018843101982613DE2B56F8A866C8E
+      809803621294948065BFF2A4B1F6942BFD3FFFE16FA91FFDC1BF3DE1937A3106
+      BCF91FFB8B7F5DFDCC5FFE9BCF3EA3EF939E0D91FAB6C2CFDAFCA2FA2F74B88F
+      137A2673D10044FDA7ED3EECFEFDFBFC9A3C49780E40980E6B8DD1BD4BCDC13D
+      51FD4DD80FEAFD8E38FE50F107E71F26FAD842C1CF68349A3C6BBBAFF7FBF39F
+      CBE79A7E01B45D4358907ED83A1C82F003D0B19BB2BD3158345FB937E87D0600
+      46FB30F60790848FDAAB6AE5C6A73822C09A00E706C4BCF66BD240843506090F
+      4A7E80CE18F48B6CC15CFB074E6BD2D1A30E3C5CBFFB573EAEE6A3FE699FCAB9
+      192B2F7F547DF61B7F475DFFDC57DFD7FB97CE3E6735FEBC50FBB35C6C7E1DEB
+      CFA5BC57C7FBB5DA9F0AF8132682991A6FDF53FD873F60D3205B2CACD7BF11CE
+      FB2F93DD2FDF04D51F26C098168482E00CB4AA3F2D98E70F0EC191D3ECF3B949
+      7FFB9B8F69588720261425C0635AF14D740E822F00A600BDE60A2D6B0F47BDB7
+      7627CD978D775F3BFA62D55C873FE07515D52431A8115B22F04D5B71131EB43D
+      0569098AD98672C915380F6E817BFFE7BFA9FFFA3BBF7ADAA771A64773FD8A7A
+      E9CB5F533FF32BBFA5EAAB9BCFF5B34D230F2F2F0800157D991000DBFD92E60B
+      951E453E200096FE00FF546B01B3C19EDABBFD87F4BFC2EE57B0FBBD64F1EACA
+      F6F742B2FF95A8FEB44C890430CB2F3AFDDE93669F77240168DB38FE9E57D8AF
+      3A8E9500E010FCD6B7BEC54D4388C95AF4C360985D162D0024704D214AA0BC95
+      77F7D6BE304B6B3D654800D29D48A073F935BAE92F495250CD6A01080DC21CF0
+      629D23A0C38312223419839E270AC0F90913FEFEDFFE65F5F0223BB0341A6B57
+      D4CD9FFF9A7AEB18405F1ACEC49D36D14726F1CCA5A1672EB17E56FDA7DAEE4F
+      05FC29B7F91EB2D36F311E6AE99F26BA3498EDFEBD77DAD1B46F547F7A3E39E6
+      4F6B34FAE4661F2000F4F9CBB20CBE80FDE370FCB9E3B861611D82F4A36AA401
+      744D6E00484088001D85D7933CDAF8E9DEFA173382BD710AC21F007BBF73F5E3
+      AAD1BB2CC08FB53FC03507625D3E5C140E410BD04490970A889C9FFBA45F7E12
+      FE8143BE1F7301FEDEAF7F418D1EDD39819338BBA3B176594BFA5FFB5B1F0CF4
+      4F7BC28DCA9FE78EED6FC09FD9E29E5CB2FC388C375B58C043F2A75363FF8F09
+      FC7FA466A37D51FD13EB37586F8EEE6D36FB90F0F4487AA6D8670C9023E34F15
+      D2FF2EE104B5FEBBB420E63FFBFAD7BF9E3E4FC7DFB35C9EE7F1F9EC10BC76ED
+      5A443FA6493F8E4D013A7E5DF202E0108456B0DA9F376EDE1FAE7C8AFD01DC10
+      24D4F306C4B1EA5E7B4BD57AEB4C003639A829F901356D0AE844A150CF3160FC
+      029E38060D01783AC3EB2C9B04D97CAAFEE36F7C5E4DB61F9CF6A99CE8D0A0FF
+      F3EA13047A6C1FF7304117CFD8FBD2C493FF21C035597EB9801F923F13B57F21
+      24904E67ECF5EFDFFDAE9A0D7734F8D1DF0FAA7F86783FECFE9DB7E51B21FD91
+      F537A1EFB2317F49F6418F3F54FE6D23E38FCCE5D97138FEDC711230602D80D6
+      C1BD7BF730B5780B8D439406BD2101F80536697B657BD27DE3F1A4FD9A2E18F2
+      19D02081B0D650DDAB6F71FF8040CC81C0F8038C53D021011B1D701B8C422370
+      FD017636E2A75C86934C299673C194E0DFFAF59F53D3BDAD93FBEE131E415C53
+      DD975E57D7BEF08BEAF5BFF00DD5587F4EA03FCAFD743CFD26BF37776DFED448
+      FE02FC19835F27FB58B51F0EC0D94CF51F7C5F4DF7B7D83C70EDFE30584C09FC
+      3F08BD745149F8E1525F99E1178D3EEFBAAA7FB3D99C105E16C7E1F82B5D8AE3
+      F8D065DF634C01DAAEC771DC592C166BC47670021A12C0F606BDB4F760D87B73
+      7FD6BC61FD0161A46718AAB754EFC65B2A6E7575D31068020D996894F6D91F50
+      33E64041027AF2515F97117B5ED1723C2FFB06F2CAE5F04EB9A7584276E47FFA
+      C69F54E3C7F74FF53C9ED78046D7BEF68ABAF2B37F5A7DE46BBFA17A2F7FF4D8
+      BEEB69F7D2E6F39B461EA6B0479C7DD6DB0F875F52809F9D7ED322EC87FDC183
+      B709FCF70B8F3FFC0459AA422F99DF24F0C77E3273437E32C107A7FB2AADFADF
+      915CFF4746F527C98FC4A0F438A5BFBE2E2733D814F8CA57BEE2931910AFACAC
+      3408FC5DFAA11B32B928CC001001470508B09DBB83954F0EE78D4BCA291DE61C
+      81665BF5AE7F92ECFF96F5093011C4921F209A80491B36B5039ED35FB0987340
+      FB08DC5E834F9DE9E514C677FEE937D53BFFFE9F29FD0C9D9F01E26D6E5E5797
+      3EFD65F5EA2FFD55B5F9D6178FF1CB9ED0C62FAFBCCE487B27B34FF7F233E0CF
+      58EA6715C9CFF17E027D067B5F8800A5BD939DF718FCBAB5979ED4D3CFD2E4E5
+      95ED1FD482C5C4B5FB950EF9C1EEDF12D51F73FC71C88FB677080FC3E759EC73
+      84CB7662C3A6095FBF7E1D9A400BB502F007D00FBF2A6141CC31083D7035F7FC
+      CE9DFEEAA7C6497DD517A7A017E82CC0B8D96312081A754D006C124492298810
+      A134124198D0B415F31D1230DD853C2100E502FF39440C8E6136E3E1FD9FA8FF
+      FEDBBFAC86F77E7A82B7ECD90608BABEB2A9D63EFEB3EAD53FFB2BEADA9FF8A5
+      A3BFF9B06BF63C9E5047DA6B47BFC9E7CF6D238FC2E62FD27B79991BA9BFD0C0
+      879487FA4F8430D9BEA3465B3F2292984B730F5DDF8F3F37BB7B6F37C2D9D0B1
+      FBE7F46CA3C517123DB625D79FC14F388019B08D849F9D9D9DA978FD0DF85F18
+      02E0EF73138408F8AD2449D81F400B4282D004D81F40EB955CF99D77F7D63F3D
+      CDA20E92849804B837009140674D75AEBD25E5C2A20198FC006801922D583806
+      CB9A406112F8C5E4234E31D159ED3DF8FFFECD3F523FF877FF444D771E9EEA79
+      04F5A66A6E5C532BAF7D8224FC9F5237BEF4E7547DFDCA695F9ECAC8CBD25F52
+      7A3DE3EC93725E06BFA3F65BF08BCA0FE0B37ACF2ABFF601CC761FA8C1C3B7E9
+      75736EEEC1EF43796F9AE557BB7B3FECC493BEA86CD6EE17A7DF2EEC7E5A58F5
+      87D38F30F098DEBB4FA6F104093FC7E9F5AF8ED378CA7D9802B40609587F00D9
+      3F971D53001A01FC01DD24F3BBEFF6D73FB3C8A3866FCC01D8F724E99904AE7C
+      9C48A06E41CF668068044C0291260115E9A802934068084072057C813BD63229
+      E1599FA67CF0DEDBEA8FFFF9DF570FFEF71FD0433939BE2FA26B11B77BAA75F5
+      65B5FAD1CFA82B9FFBAABAFAF9AFD2F5AF9FF62578FA30334CDB821E63E717FD
+      FB8CA7DF487E56E1E749017806FF9C9B7BB22640FF9BEEDE55A347D2CE7B51A8
+      FD2092CBAD7D4CE7B5832F719C7E48F545BC7F0F853DB48D469050FBE1F47B44
+      CFF5DE49DAFDEE388D477CA93F40661662A7A0D25A00B6D7E901ECCC9360E5BD
+      FEFAA71315C63C7760104AEBF04845AD9EEA5E7D93CC81A6CE0C743480C0C916
+      84E6E0D9FE8245848009414C8152AB315B53E42DFF05EE38E51A9E7BFFEB3FAB
+      3BDFFE0F6AEF47FF578D1FDE568BF1E0A90E0BEEC510C52CC9A3769743ACF5B5
+      CBAA79E90683BD73FD23AAFBCA4779FBCC8DA75CFFDCFCCDC5E16F5B772956F9
+      6D720F402B093E1CEA2370E752D99749B80F8E3E0EFB891F60BCFD1E2DEF6A52
+      E069BC538E1600FC1BCDC1EDF5C6F0910B7E7AB68CDD0FF06F994A3F7AE6EFC9
+      34DFE8F0830620C796EDF72C97F2C4BED7F507D0C56812F87BA40A6D12C0AF48
+      7890B30469590309CCD278EDF6FEFA2733CF0F5972233C186A12081B6DD52112
+      889A1D027E68B500E40878EC142C4880B5814A98D0D411181260E7207494DC99
+      90A46084EA93F6F42B790A0431DB7BACE6FD1D351FECD27A4F2D86FB5C39D97D
+      F90DD5B9F9FAD995E047BD8E4BEF4311DE735B75DB109F0BFEAAD497DCFE4C9A
+      7A9409404BFFD1D68FD564EF1EBD6ECE91017E9FE4F8AFD6460FAEB4FB77F302
+      FCC8F483DD0FF0C3EE7F2C21BF7B52DF0F1B6E7B3A9D0E8800A0C2252765F71F
+      F5721FFB7757F303C81C4033D14D640A2AED10C41A24B04A206D8D17B5CDBBFD
+      D5B78804026DCF0B097004A0C9E64044EAAAD5049CB5170B11184D804C02156A
+      BF823273111A73C04D1E3255456EA391336C1A7CE8465E0AE208E04D159FD29E
+      7D89EFBB69BDDAE6D780CF0DF8ADE45F30C8D9F137D3A1BEE1A3B7D5ACFF4892
+      7C8CDAAF6BFBBBD164EB7A77EF3D6D5D649978FC91EC03F023977F5BE979FD18
+      FCD846B2CF49C6FB0F1BA7FD28975285490B68231988B4804BD004681F5A0048
+      00A4B042406C4D9378ED4E7FF513A917C6DAB32F3E01AE0CAC11097C4CC59D75
+      4D0AC60F60C02F6DC63D21025F7A0A28132510E7A032E680EF150460AED68B3E
+      5DF179192EEA5D73476C7C4FCA776D038FAAB3CF38FA0066D4F32F1CF01BE71F
+      AFA76AF0F007A4496D4B8C3FD1C4916AF0AFD546F72FB791E26BC19F499A2F67
+      FA295DE2FB48E6F583E4C7A41E8F31ABCF7C3E1F1F77AAEF512EE369DF46CF38
+      05D140045D84D050D4090F224FE08AC91404092479DCBDBDBFFAD64245F51209
+      8873B073F90D15772FB12FC033B502B1F410B02641A4FD02620EA8D02F92868C
+      69200D46AC4660AF98A30A9C9F3AA317669492786CAB2E7D8CC19F69C96F63FB
+      A96EE201F02B27CC974BBE3EABF433F1FAD3B15C427FC974A206F7BFAF12E4F6
+      27739D15E8807FA331B8BDD91C3ED28A46963B921F2A3D7BFC95EEED07F0DF97
+      70DF6348FEC56231BA76ED1A9C8327EAF4AB8EB3F0EC5A12E8743A31B1629D2E
+      541B9583E8240402302420ADC64102CD4C85EDDBFDB5376759DCD67D00C4AE8F
+      7429716BF3966AAC5ED792DE01BDD9662DA0A6938B384468DB8E07857330F00A
+      8DC04920727389CD667EE0273DE10A3FD3AD3EAF5D828EF8683DF5FA2CBFB2B9
+      D397DF05BFF6EEEBF8BE4AB5CAAF04B09C9B9F3AF6FE5C833FB76ABF64F21119
+      2493A1EADFFF9E4A695D487E9DE1A7D22CBFDCD9FFC96A3CD915C16FC1AF8ABE
+      7EA6BEFF01A4BF84FE1EA3BE9FC6A8D168CC8F3BCFFF39DEA5E33F0F533A8CA2
+      A1F1788C86A21DA919B8643401A5FB07A0B1488FAE589310DABCD35FFBD838AD
+      AD7832EFA0CEFED312BFBE7255B5D66F694DC0FA01429D2C2464E04925A18A8A
+      BE02A698487184C0F417F0CB9102A7F3502EA1C3EA15F5CA7F9E71E44FDC3DB3
+      C37BEA81A7FFEE7CC9CF15901B81AF0E0BED39853C2A2D62FBC5A281CFD27FBE
+      9070DF42B48105FF6F3ED8619B3F9D8E75271F5A9480DF23F17FB5BBF7A36E38
+      1B2C03BFD2E13E801F2DBC1F9026CB0E3FE4F823DC47AF1BA1C8479D92D3EF83
+      DE9D633D17F8037EFCE31FFB6825469A40C3E408605621A40C8308688DA42134
+      1AEDD2556B11F0EAF7066BAF0F17F50D630E30114450F1913ADC536D32095047
+      E04B3FC102FC8E36C0FE00630EE86D9B3854693966C3869EC9287472CFABFD07
+      CCAD3D4B57FA2C8FCAF5CA9DA69C25D01BA2C8A46557961D48E75569017AE3ED
+      4F25D497CFE78EC34F7C00440293DDDB6AB2FD9EDE77243F3EDFA70FB8DEDB7B
+      A715CCC74BC06F62FD68EA89345F2BF9E9997D4CA0DFA5E7173500208933017E
+      E7329F99C124F0BDEF7D2F40781024405A40571A89B89A002203EB281CA21B81
+      12E3F8FEA0776B6FDEBCEA5BF55D6B02C81AF4E31A99041F51B5CEA696F8AEF4
+      17DF80CE1130F90281CD1E544E06A1ED40ECFB0501386DC9DD1A03EBA4AA161B
+      9DB52B7E46865772E4B99BF901F06B279F48FBB490FAA5745EA8FB89EED7AF09
+      403CFEE2ED371A001300A6E99A4ED588A4FE7CB4ABE3FB4952027FA092D94BDD
+      DD1FD683C554C06F1C7E46F273810F72FCD1DC03921F1A00D4FE288A760783C1
+      88B4DA134DF33DD2753FED1358764E263CB8B5B515D3456BD0053424806C41B4
+      188729C02440FB5DF804E858EDD1A8F3D2F6B47D534F3862484032008908EABD
+      ABAAB9F12A83DE73B581489381272DC795710E46156DC075109A7A0226036567
+      29CA1D3270B5FFDC21850F661ABC2843D2755C899F17B5F9CA73547DC7C957A8
+      F922F5C5D6E732DEB470F231E8A594D77AFC8DEA2FAA3EDBFEC9422DFABB6AB8
+      F50E1D1BDBC880AEE597893BBDF9E4A5EEDE0FB9AA8FEB086CA88F537C9564F9
+      29EDE043B80F52FF01D47EB2F977E9F91D369BCD2969B7C9697AFC978DB3FA04
+      9648A041633299A091089B0342022003D10454978088BE83B5FD5963F3E1A8FB
+      5AA6C2504B6EA92108433109BAA40DBCC1D584003E1C819E4404DC10A19B39A8
+      9C5A02E51281E717B316FBC649E86A03451E61EE94197AD592C303996D67F5B6
+      BCDFBBF9047F86E9BFA79CC61C7CBC027A50A8037ED3AD87557D09EF29A74F3F
+      BCF5F91CFB0B2BF97329EEC925CF3F27F08F776EAB292D99795D2A525F66EE69
+      4793EDABADFDDB8197263A97283365BDF0F633F895CEF2434F3FF6F8C3E647A8
+      0FE0A76548A6EC14B1FEB3067E7DCDCFEEB0854304FE882E62934C822E48403A
+      0A5D36E141252480102148609E85EDBB83DEEBB3ACD6E679038C6FC0840AA3BA
+      6A5F7A4DC5DDCD02F866310410578E07BAD390B2F31306656D401A8F9423069E
+      95F4AC1D2C891E98F90B8E7A47CECC93E3DEA8A7BD203FFC8069C5E5790EF833
+      2796AF1C1BDF51F7791FB6BE1BDE4B0B899F1BD0273AB5372F9140C2F5132392
+      FAF3E18E680B3ABCA78A1E7ED9A546FFF65A63F498537B25D4A7747A2F4FDF2D
+      73F841ED37893E0FCF13F88F74EF4EFBFC0C09F4FBFDB8D56A35E8E2A2C5F89A
+      8404E110BC0CAD406912E8310928AF9E077EFC70D0BDB93F6F5D2D927C74B80F
+      26816F4C82F55708ECB1CD09F04C0561AC3506AB09700A71505415D23A0FDC29
+      CA8C56E01544A08AED224A50AC4B25C8CE665E39EC3DEBAD7A9E77F5991FD7BC
+      983EDB3D95BCBC913B2FB2F5F96E128FB1F34D475E91FA2A7524BF63EB1B2F3F
+      DBED0CF445A1FECF0B52C0FF17F0F23FFE21690113B1F7757CDF7C6EE42F26D7
+      DA7B3F698473AEE5174704EC7D93DE3B91501FABFD4AC27DB246A9EFDE79007F
+      E9FE9CD1C1E7572501640C2259882EB2210198059730F780D279026DBAD47592
+      B8F170DE587B305EB99591ECD7402D9B0448210609C49D0DC90790888001BF29
+      240A2B24200B938A68069C4E2C91825CA206561B781A1138DD8972473BF0CA5E
+      C427DCB193B895F9E1872BA7698C7BAFF436A73C1700574F007E5E96F8CA16EF
+      384E3E63EFBB76BF95FC8B12F05913984ED564FBA76A36DC628240B30F2BF133
+      3D5F5F279A3CBED2EADF21953FCD6D93405DD2EB64F8F5A5B20FDEFE4792D7FF
+      4834817D38FC363636CE3CF8EDFD39E3C39280129F8092326222821568029225
+      68B20539598824729BC0D3A03B172759D4B83BECBD364B6B1D5300641B8C08B8
+      A3D61A1341506F151101A78AD073FB0A3C8908DC946299C2DC860ECDC425A529
+      CCCA6B378468E634B0870E84148F6E3A3C9771982A6F9C76F69091ECE67FF992
+      D8BD7E9D0EE349E69E21026BE32F51F75391F8027CB5D0957C4AEC77D7DE37CE
+      3F45FB93FE3D35DDBDAD137FD2252A3F7DD1E5C6E0BD95C668C7CB4D498F0EF3
+      29013FADC7B4DF979A7E346B84C447451FB6B74928A191277BFBC95C3D730EBF
+      65E33C10803D4F4302FBFBFB115DE43A5D78AE1D88A2689DF661065C1227E186
+      D40E74681B7D0462D200A247C3CE4B7B559320D4C9438AAB0B2355EB5D53F5B5
+      1B9C4DC80E40C70400012827446888C094182B99B558F9E5C623B6155925B350
+      E70F2D2703CFD1FF8BDE04A697A17B554E8804AA8FB013B62B6DE50559954378
+      4EA59E1BC6334E3D27966F419F9A6D003E236200A075118F5A140D3BADC73F49
+      4A3E00840093D19E9AECFC442D268342D587A980CF7055FEEEEE4FEA5E32F574
+      E540D5D33F9316DEA8EADB71C10F4F7F1886E8EBDF5F2C16E3198DF3027E8CF3
+      4200F65CDD3C0138FCE8C2B7E8708F2EFEBA380741049C2C8456E324813B2475
+      1BB45F23F04583697DEDC1A4F76A96EBF907B493306015DEF4108459D0587B85
+      8B8ABCD08906C8DC038608347104A21D8826607B0D385D89838AA35008A16846
+      2213981C483736A1C3A22CB9F00F543D0347C831F8A025CB795E796919F07AE5
+      34DA54457C9F25BD996CC3BEE6A09ACFF67E9A95DA722B96FA9906AD005F893D
+      AFA4838F32049068EF7F3A27757FE75D35EF3FD2ADBA4C1A70920AD168951F95
+      7C975BFDBB50F939BC8FFE7DA0216DEFDB18BF01BFD265BD0F65C6DEC752CF3F
+      2001343E4B197E471DE78900EC399BB461DA8E1A8D460D1102A4071BE7A03805
+      2FD9DA011D268473B00693205361FC68DC7EA93F6F6E7A40A68914D866215AE2
+      C32C68C02C2042B052DF01BC4264201642104D40391984D649183E412B38CC47
+      509AF2BCBA763A1A5B0DC1A182A5BE8243428F4FC8BBB7A02E25E0171A482EEA
+      7D2951C72500D7932F9E7DA3E2DB709E71F059D0A762E73B9E7D6C0BC0B5CAAF
+      D73AAFDF380225764FEBD9DE7D35DE83BA3FD3C7E533799DA722F593C995E6FE
+      ED663C1B7A1AF7380F92FA257BDF26F8D0B243D2FE31099947D2D5679B80BF4B
+      A01FA095170D9808E70AFC4B9E8A73332C09D0C50F6B34C80C6822421004C1AA
+      E3178046001258054120422026419413C4278BB0FD70B2F2CA2C8D5A45EBF0A2
+      28C893390A6BDD2BAAB6724D0568A2119A790803C71C704D03091186524B600A
+      8C6C0E41205A81C92474DA925589A06A2A94CA922B15891547A23BF2279241A5
+      D866D963EB4A77DEA8AC653B37893C991BBE33893C8EA47763F9027C1DCB2FC0
+      AF89C009F1D9745E0D72ED03480A27202D8BE10EDBF909ABFBBA49A7924C3EB3
+      F6E8CF6A7D747FBD3178E4B1B4CF3393D6AB24BE4FCB5C6AF987E2E987730FD2
+      1EF9FC5BB2BF4FCFDCA0DFEF4FBBDDEE9C08203D6FE0AF3E09E76D944A894913
+      882575989D83748CB5019000FA0BD27A8DFD02CA6B237D98B6637A4463207277
+      DABAB43D6D5FCF48A4EBE21FED24846650A8F991AAB52FA90611811F37B4F437
+      6ABF6B0E187F40E0A411BBA681C921701D85C63CB004E057128BB447C0F62EB4
+      3D0B8D695098036EC251D93BEF1D58552273CA417AD9B590BBA13D89D7E779C5
+      D697421DA3E2677991A76F53758B29B75CC95F48FD144D35C5564F2D09B861BE
+      DCAAFBC62148127FB8ADA67B77553A1B1666810B7EF129B4A2D92E49FD3B989C
+      D3432F607D6EACF22BDDBBCFE4F48F8CA79FB6B7C5DBBF456AFE36091868027D
+      93D7EFF4F133C03F37E0771E87733B2C091001040813121BC339D89ACD663D68
+      03F47FF41A44AB316802F00BA07290D387112520C044F4114192F9F1A349F7E6
+      60D658F76CF14F015E3F30208EB8A600CE42F4D333A600A70D5BD017A1411B21
+      88B4F4CF83E0407762EB23702A0F0B22503AA468D38BA55D992A4C049718965E
+      22AF72C5AA1AC0210EBE120FB8F5F6D8CCF292BD6F35003757DF80DD7AF48DCA
+      2FF67EA6A7DB56E2E4B380B71D7BCAE0B7C53DECFD5FA8D9604BCDF6EF11F0C7
+      921094589301FB4A3AF6445E32BBD41ADC6ED7A67DF81C3C8F557E56FCE992B1
+      A34F7AF74D65B24E6BEF43ED97997B39BE0F959F14CE3162FCF57A1DA461EAF9
+      ED553A4FE3BC1380F90D4818C29A2304700E120134451B5835BE012101360968
+      BF07BF006DC341086D80DEE7FBA324EE3E1C756F2EB2A8E99A05CA492B56E227
+      88DB1BAADEBBAE8246EBA0D437AABF4304864C944B02027AE5559D850E2978A6
+      0A51397E824A376371241E98F1E8B09A035B6DE7BCC46DB46136BD422BF09E02
+      7A57D5F72ADE7C1DD7CFAC4466076052A8FB9E017DE2487EA30D648608328EDF
+      CF068F18F8D96262ED7EE3D8CB5C759F84FC4A7DFC70B33978E0D18EC7A582E0
+      1DDA6625C63AFA66D2BBCF74EE85A7DF821F1376A08907FE8FFE7DA3D1685EF1
+      F42B750EC17FC893712E878D10A09CF8D6AD5BE1D6D6568D0ED589AD112AEC91
+      FA8662A275277518FBC82368431BA0ED1AFB063C2FCC728FCC82F6E5DD59F34A
+      9A8791310BEC3A08ACAF004EBFB8B5A6EA2B4404F54E1101707B0A1C00BE1083
+      EB18746B0B6C9852E633741D864E76216B076A4955A25C11AF945C54BED5B68F
+      41F5421AE95F72F02949DA917D337DB613C2B3E0B7FB06F04E224FD5CB2FF17D
+      E3EC63901B934072FB8D36902573F6E84F19F833ABFE67C6A3EF461168BB49EA
+      FEE546FF5E1CC0334F929E053EC7F533C9E7B7529F1613E263951FA0C702955F
+      08011D7CC6F4B629D9FD208C84B4CEEC3C84F98E049C1768B073F0DBDFFE36FB
+      05E8A64504EA3A1C843235399B0458441B3024D0A5B7923EAF1A04A718660181
+      3DA0C725DC9DB736F726ADCB890AE20344E017F63E3482B0D121AD609308615D
+      F9612C6DC68C03F030A7E02105469233E0957C03A6174131A989250299E0C44C
+      75560A120A37949C840E037846D257649991F6071C7B4EFCDE95FCB642CFEDC8
+      63C02F84A05CA79F95F28ED3CFE9E083FF2DA6FB6A31DCA2659B492077CD802C
+      93965FECDCC37EDE8A67BB1B8DC1835AB89896D47DC7D697B65DA6632F6CF97D
+      69E2C19E7E5A3F466C9FA4FC3E3D2703322FC7F42CCD7BBD1EC07F6EEDFDA580
+      39ED1338A6DF54320968204ED364694F80A79B6A8940CC03EC1309A80E01AE41
+      FB753A1E19B3804015ECCD5A1BBBE3E6E5850AEBDA46F7CBD38D110128DFB75A
+      41ADB1AA222283B0B9A2A304E6B58E33D0487EFF302DC098082693D0F807F817
+      56320CDD1C82DC890C081B98C4DC83D1824A7AAEA7AC6A2FFF56E2F52B497963
+      E31B7BDF34E3B05A8001BAACA5C0A674DC4DED75D728CB9D0D1F33F05384F232
+      275D57A6DCCE65D1C04FF3766DB6BDD9183E8C7C487C1C17BF3EABFBDC25D0CD
+      E8E3F01EF2F969BD2FEDBBB6CD22CE3F1CC76BA646E527CD323BCFF6FE616079
+      1147C92440A8B0D56AC5026C540C76C519B84A8C8FE80016F805441B502D2102
+      980561CE6480AEE1BEBF376BAEED8E5B57E679D8B0CE3A037CCF48F2A202119A
+      40D4DE20AD6043058D8EE3FC0BB8E7A0E738028BA840750A33CF02DE460502D1
+      045CEDC09790A195FC550760259FC00CB79536EF2BEB1CB0D57A46E54FABEA7E
+      266641E654EA15CE3F7EBDD1002A61BF12092CE66A36DA66D027D341A121984C
+      40C76C307D0010D2EBC693C71B047C78F64DBEF113D47D6BEBD3D297EE3D0C7E
+      BACF90FED8DE0F8280137B689991F45F20C4F7A2A8FC4B81F2020F6B12204A80
+      B262BAB9353419215240E35198052B20018559893509401BE8D1D211B3A0EE7B
+      7E4C6B10410822F0097DFBB3FAEACEA47565962187C080B190DA05B0034B0A61
+      D45471075AC19A0A6A8D32B89DD2626F0921B809438519E0157E022752606FAD
+      750B48B4C04D249257B97E80D2ACB9B22AC27DAEF4CF9CE9B4E1F0CB64B2CD8A
+      B7BF2AF5B3BC120148D462B2AFE650F1C7BB9CD8933B36BDFB7E4B20F47D3E31
+      42B73666E007C80F36C0E78ADD32F095063F808F4EBD23C9E5DF17F0C3B98719
+      7919F8F0F02B4D0ED34EA73347038F37DF7CF38552F90F00E4B44FE0847E239B
+      04D006683B5A5D5D8DA00DC88C44300B7AA211ACE9F4614D04B42612506DBAEB
+      DC6C0426816F88208346E079C3A4D1DB99342F4FD35A07C8B4C07448A034E780
+      9800E84910D47A2A6A74C9A8E8D27EADD25B6049E72147D52FABFE78AD129F80
+      F1EA7BB698A808047895B52A37DE5045DABEB20D389D92DDCC0DF115EABE77C0
+      1750C9E93791000276321BAA1476FDA44FDB8322DBCF78EFC589E799FE7E763B
+      E7705EA736D95EAF8FB67C8F7379D532E03BEDB9AD934FE9093AA0D6EF19F003
+      F8240CF6C8DE8703107AFE846CFDD98BE6E87B1A383E2CE3803650ABD5627A5E
+      304716A62A479F811E1C85F0111CD40654D3980504B41211282E190BA3FD7963
+      7D306BACCDD2A85900B4ACC61BF53EF7CAC40042081B2B2AAA775400428013D1
+      21001B0E94A2A26A63D29209E03422B177B9DA8C44C27E6EE96E290CE86A02C6
+      09E8A8FB6EB82FCF2B493F79410048CE49A67D96F4C97448FF4A0A27209B1469
+      2934C851004B26B8B8598A049E95DA78A719D18769CCE79AA018F8003CEBFC62
+      E72F2AEAFE48E2FAC6D647886F57BCFB7DBAD743A8FBB0F57777771764E7736C
+      FF139FF844FEA283DF79423E34A3A40DC037B0B2B2121119D066CC7D066801D8
+      E1285C31DA80D21A02FA1222A4688800598431612EA0673D6467211472D20BA6
+      69DCD89B35D747B3DA5AA282C85305191492DCA907F08DF3CF1C0F941F37593B
+      08E2167D428309821D8DCA35039CB58D1288AA9FABC224C8ABD1015510829BF4
+      E336DE340795C904D424C02075127D0CE8B16470BCD3922FC66CC763C9C8342F
+      01BEBA6DB589CCFA1460C337C379BF539FEC74A3E99EC74905628FE8BC834C6C
+      7C6C01F4ECE073808F861D23999987C37BC6DE370E3ED8F974AFC7749FA728E0
+      5B62EB3B57E0C51D1F3602B0BFD968039B9B9BFE743A0D315331FC03300BE8DF
+      2DB207E10C4436E18A380757C479A89D849ED7A4C7B1419F563B40041EE0A651
+      3A98D7BBFD59637D94C42BB916E956853729BF4587E1A2F3B04B08B99800A478
+      1019D4991C82B0CE29C93ED6643E940A8B4ABFF460DBF22247A0ECEDF74A6640
+      5E2407193301F84BD14813409F70C55D9698F5D4CEC6A3F2C3000FFC66259301
+      EF31FBB5603126157FA7474BE8C121A04CED3093429A6975DFB1F1AB12DFD8F9
+      03013F9277007E5E90C24BD21EC53BACEE77BBDDD9D6D656E278F85F585BFFB0
+      F1612480D26F5F6616D0E11AD9821C3624028046D07317D106D06BA06D888080
+      8C28434CFB10D35263CC9DEE7CB42A4F09CEFBB3C6EA685EEB4DD3A89DE6A219
+      18C79E720A834A84609C7FBE3E6967BB98C7105D901B2A0822713A8674582211
+      9EA422F3E9E8B52F5A8696BE89D8DA522997398B731C921C129E5FCFE13707C4
+      B6C4B7F001B80057A5822031233854A7F29ABF18D5A3F9B0472A3E5A6E171108
+      91F63803023E7812CE7D276FDF86F4A44BCFB8027CBBD03D64E023AC874C3E22
+      02F6EE2395970820FBB0497D777C9809C08C036601427FF470C4C65148FF6F09
+      D8BBF420F5B896808840340276142ACC54A4BC3A340229340AAD56E0231D45FB
+      0AB00DD01209D4890CBA9345DC9D24718BE0101A53A1E827E83BCD442BF6BE98
+      02962C949B2A6C7E96FC402E1E3A2424E8D8FFB64557A931BFC9FA53A55C005B
+      DDA78A94600675A6549E2F073CD6B52019D783F9B019CFFBED6836F29538F33C
+      36318C6D6F41AF74CA2E1885D57C59E6C6B36F547D13D397059EFE3E804F443E
+      8CA2680C894FC7A7747F17743CF930AAFBCBC6050114C373CD823B77EE04C63F
+      803907E82142CD40CBF113F4248CC86BF80714220639571AD6A1D112D8116D40
+      425118F81EC820A0633EB45E46A52FE53CF4774C244084D0992EA2CE348DDB99
+      0E088AED5E54041665C2AAA80A54FE52F0DBBF55CF7FF1CF4AF65FC50760476E
+      CD00037AB79167E147285E67001FFBC9A416CE87AD683E6893A40FFC34295E63
+      99C5805E5915FFA0B42FA9FA90F870E02901BBA4F296A4BD017EABD59A8D4623
+      F6EC93A9977E58D5FD65E38200CAE3807FC010013D481C3AA47F733211AD5BF4
+      00A2D8A82B1A81AB0DB08F00AFE5E423DF875961C82038400680AE9E6084618E
+      7C3C2284F67811B79234A8CFB3B0BE48835AAAA0DB6BFBDD38F58C4BBF540DB8
+      24EFDF8D08E4CB7E74351468865BFBEFB9D2DDFDBF066EE4A7D3D0CF665190CC
+      EAE1624C127E102E03BCE91222B643AE7F91A8F845D61E2D0B67DA2DABEA2B9D
+      BECBE0A77BE012C09023B349C2D2FE02F84F1F1704B07C2C25025A87F440B146
+      0060D3BA492A668BEC4AD60A84100C095822401312DA0679D440062002DA0E85
+      0C7CDA97C202CEB1A91082B2804EB3209A66516D9E1029A421134392FAB54516
+      D672C3027911F7CFDDDBEB1DF87932F2A59BFCAA520B30FD37F0B245ECA7B3C8
+      4FA65198CEE22099D6425AFC645E0A1F1C04BCD4DEEB145D526FB2DCA813B94A
+      4D271E5596F628CF9D4A3F3E0B7CA8FB749D8700BF001E6A3E26DD8449304506
+      9FF9AC25C05FF24B3FBCE382009E3C9612017C04ED36C9B7D98C3B141301A0CB
+      90A93568C9BA6DF68DC600F340690D0204023260229085B5022104AF4208A2E5
+      EB4600452ABFC9F3F702228128CDFC20CD959FE57E001322CBB8A029A0B58FCF
+      269EF1E9388EF9780F20E97B79CA8BA257790ADB99678E79F4897E9E06044EDA
+      4E233F4B30430E7FB5EDF9A7F7CC317D5AB9140B6AD5DE91F00C42EDC5B7717B
+      2BED4D69AED2C09F48579E912A800FA98FB83DEF93BA8F0ABD31AD21F1D18C73
+      6E6CFC478F1E6517C07FFAB82080A30D4B04DFFDEE773D34250519D0A190A44E
+      D46C360164D60AE8816C787AAE42B42803F0990468DF9043D3D10A6A4206881E
+      444A47107414411302F20A088BDC02447282D9795EA4F9E18FEFDB6D8CDC734E
+      FAE0CFF00EFC233FB0E1CAF08AF220F9007A3B2FD285391998932133ED50D415
+      789EC7D9032EE0E95822DD7679961DA74007E0079861DF8F20E5A52087D7747C
+      04D043D203F4F0E66321025EC0AB4FC7D30BE03FDBB82080671B252240D4E0D2
+      A54B3E49A4901E442603B42704A891610832C002325098CADC5984088C69C0E6
+      016B051E3B0E5D426032A063016208A21D3011981620187991DFA772B70B60A5
+      11C081790997FE4AE3E15765FD5F29E3A4D368D74C24825D19E79D96F288EEE7
+      36566F3DF806F0528E6BC27800FF6489D4E745127658BD17157F0ED063A65DC4
+      F15756563278F58994F30BE03FDBB82080F7376C5E2DC287F4107AC63CA08712
+      80458F423611E02FA07D104283A41608813500AC7D9D51D89046A54C0452B1C8
+      EFB144A01D88A1C7417D90817620D2B6F61F285D9720DBAA987D84A573D134C8
+      9CF4212C20A056795E76036AB7A457B8FD0A553E379D74D98127DE7BA5A5BC05
+      BE537FCF5E7CA5A53D2F70ECA1D106FD7EA8F313AC25A63F21A0631FC430433D
+      3EA9F7208E848E21790780CF9C38BE9CFD05E89F655C10C0071B9608F000BA5A
+      0149A860676707523B848900F3146400708BDA5F17F023D7C0809F3502473330
+      44603403D767600941690D01241070493FE71C73F29C2760F70C1128133B3844
+      1370C0CF002F08414B7EA57BE61BD53EAD00DEC4E98D8A6F9C7900BFF1E44F05
+      DC761BC7017EF37FA8F5787D144573001FD21EEA3D116A7AE3C68D14A087B477
+      F2F5F97C4FFB61388FE382009EDF38A0150C0603AFD3E904B4F8F400B3990049
+      0E53811EEA981E6EA41F43CAD7E8588D8E1953C098059604E8BDBA6559A11584
+      5542509A1478F62421049C932FE0F7444BB0DB95F3B6AABC32D2DDB5E173273E
+      2FD25D7AEA19D02F1CD057D57C2BF545DDE7B590C20C2A3D497748F905404F40
+      5FC86726003D547C63DB0BE8CD79BAEB8BF13EC605011CCF586A22D0DA071940
+      33A0079D4D052C046E4C7F8EE9CE2297107C9D3F603406F81650BD180B114486
+      10402AF4BA5244014440AF45C4C213326022C0B61CF3D4927860C98E2F009F1B
+      155F156A3D37D4C442DFC3C0A7CF9DD3F60102C042BF6BE6029EC80ED21DEF59
+      40C28348E8786A24BD013D5DAFBCA2E2BBEB8BF101C705011CEFB0D7D7380E8D
+      660033616F6F8F09214069DA6010C06CA097862003AC410820073ACE6B809E5E
+      CA6B391E9AE34AFC04CA310DB449C066806F4800E794212E58904071B205D073
+      51ED2DF0B1A6F758C9AFC4A12704B030FB860064213C2706E490ECB0DF17466B
+      00E08903D2B5B5B5947E3FD4FA8C4CA81CA0BF70E89DCCB82080931BA5445CE9
+      59A84008D00C6EDEBCE92D23040C024D20A00E05D46175DBAC95260ED6003000
+      76013C6B00CEDA138D40728D3CD35483253FB6F5DBF9CD197D664EA7626CFE24
+      2FE7E62706D4F472360B325DA69BD46A356B2A00F093C92433806F341AB991F2
+      8E4D8FD3B900FD098D0B0238BD712442D8D8D880C6806A459FC0E313A07C92A4
+      4C124410D86682C002AE98CFE7BC26ACE100831D3D33B09D716BFCDCA3F77966
+      BB7442047EF003496D809D35016CE318F6495AE764BA00C73C7926692A50D9C1
+      112916DACFE8FBB356AB05353E6B369BD9743ACDE89CF365127E09E0ABDB17E3
+      98C705019C8D51BA0FC65CC0B6311908481E488148C0237079861808941EC881
+      80E81972A07D8F406A173ACE80C7363E13DB0456BB8DB5CFFD4C9422001BC0F3
+      3E7D2F6F9B85BE3F07D0894472809CBE2BEBF7FB3981DE021D92BDDD6EE706EC
+      F89C0BC09FCD714100677354EF8B27C0512E31600D72B875EB96371C0E2D39E0
+      3808026BB34FC0E6350803EBF5F575BB6D06808C3549790B4A023B6F03DC583F
+      7EFC38C736408EFD6540C7FA10B02FDBBF18A7382E08E07C8D65F7EB00396018
+      82300344B1EC03A159605DAFD70F00D380DA1D06E0180039D68700FDB06317E3
+      0C8D0B027831C6B3DCC7A3BEF6A8E0BD00F9391E170470312EC68778FC7F70FB
+      757403D7F4220000000049454E44AE4260822800000080000000000100000100
+      2000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0001000000010000000100000001000000010000000100000001000000010000
+      0001000000010000000100000001000000010000000100000001000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000100000001000000028080800255555503404040043333
+      3305494949074040400839393909393939094D4D4D0A4646460B4646460B4646
+      460B4D4D4D0A3939390940404008404040085555550633333305555555038080
+      8002000000020000000100000001000000010000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000001000000018080
+      80025555550355555506404040084646460B4949490E3C3C3C11494949154545
+      451A4444441E444444224545452541414127444444294141412B4141412B4141
+      412B444444294141412747474724464646214444441E3D3D3D19404040144040
+      40103B3B3B0D4646460B40404008333333055555550380808002000000010000
+      0001000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000100000002555555032B2B2B06393939094E4E
+      4E0D434343134242421B474747244444442D434343354444443C444444444242
+      424D434343544444445A4545455D444444614242426444444466434343674444
+      446642424264424242604545455D42424259444444534444444B454545434141
+      413B414141334141412B4444442247474719474747123B3B3B0D404040083333
+      3305555555030000000200000001000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00010000000255555503555555064040400C474747124242421B434343264242
+      4232444444404545454E4343435C44444469444444744343437E444444884444
+      448F43434395444343994443439B4545449E444443A0454544A2454544A24544
+      44A1444343A04544449D4343439B43434398434343944242428E434343864444
+      447C4343437244444466454545594444444B4343433D45454530474747244545
+      451A3C3C3C114D4D4D0A55555506555555030000000100000001000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000001555555032B2B
+      2B064646460B474747124646461D4646462C4444443C4141414E4343435F4444
+      4470434343814444448E4545449A444443A3444443AB444443B2444443B74544
+      42BC454442BE454442C0464645C0464645C0454544C1454544C2454544C24545
+      44C1454542C1464543C0464543C0444443BE444443BD444443BB444443B64545
+      44B1454444A9444444A2434343984343438C4343437E4444446D4343435C4444
+      444B4242423A444444294242421B404040105555550933333305808080020000
+      0001000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000000000000155555503494949074444440F4545
+      451A444444294545453B4444444F444444664242427B4343438D4444439C4444
+      43A8444443B2454442BB454544C0464543C3464643C6484644C8484644C94747
+      43CA484643CB494744CB494744CB4A4843CB494844CC494844CC494844CC4948
+      43CC494744CC494744CB494744CB474543CB474543CB464643CA474644C94645
+      43C7464645C4454442C2444443BE454544B9454444B1444444A6444444994444
+      448B44444478444444624444444B4646463743434326434343173B3B3B0D5555
+      5506555555030000000100000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000015555550340404008404040104242421F424242324242
+      424942424261434343794444448E444443A0444443AF464543BA464645C04746
+      44C5484644C8484643CA494744CB4A4944CC4F463ED3534336DB574030E35B3E
+      2BEB5D3C28EE5E3C27F05F3C25F3603C23F5613B22F7613A21F8613B22F6603C
+      24F55F3C25F25E3D27F05C3D29ED5A3D2CE9564031E1524438D94E473FD24A48
+      44CC494843CC484844CC474543CB464543CA454544C6454544C3444443BE4444
+      43B7444444AC4444449D4444448A444444744343435C444444444343432E4040
+      401C4444440F4949490755555503000000010000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000155555503404040084B4B4B114848482043434335434343504444446C4343
+      43864444439C454544AC464543B9474644C1474643C6484643CA494744CB5045
+      3BD5564130E35D3C28EF613B23F664391EFE673A1DFF673A1EFF693C1EFF6A3D
+      1FFF6A3E1EFF6B3E1EFF6C3F1FFF6C401FFF6D411FFF6E411FFF6D401FFF6C40
+      1FFF6C3F1FFF6B3E1EFF6A3E1EFF6A3D1FFF693C1EFF673A1EFF663A1DFF6439
+      1FFC603C23F55B3D2AEC554133DF4D463FD2494843CC484644CC464643CB4646
+      45C8444443C5454544BF444343B6444444AA4343439843434381444444664444
+      444B444444314646461D40404010494949075555550300000001000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000001555555034949
+      4907404040104040402046464637444444524343436F4343438C444443A34545
+      44B4454544BF464643C6494744C94D453FD0554132E05C3C28EE623920FA663A
+      1DFF683B1EFF6A3E1EFF6D401FFF6F4220FF714420FF734620FF754821FF7C4C
+      23FF804F24FF855125FF885326FF8B5627FF8F5828FF915929FF8E5728FF8B55
+      27FF875326FF835125FF804F24FF794B22FF744721FF724520FF704420FF6E41
+      20FF6C401FFF6A3D1FFF673B1EFF65391DFF613B21F75A3D2BEA524235DD4A47
+      43CF484644CC464543CB464645C8454544C4444443BD444444B14343439F4444
+      44874343436A4242424D424242324646461D4949490E55555506808080020000
+      0001000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000000000000000000002333333053B3B3B0D4242
+      421B4141413342424251444444714444448E454544A5454442B7464543C24846
+      44C8494642CD534133DF5E3B26F265381DFF673B1EFF6A3E1FFF6D411FFF7044
+      21FF744721FF7E4D23FF8D5728FF975D2AFFA0632DFFA96930FFB26E31FFB571
+      32FFB67333FFB77433FFB87433FFB87633FFB97634FFBA7733FFB97633FFB875
+      33FFB87433FFB77433FFB67233FFB57132FFAF6C31FFA6682FFF9E612CFF955C
+      2AFF8A5528FF7A4B22FF734620FF704320FF6C401FFF693D1FFF673B1EFF6338
+      1FFC5B3C2AED524338DA494744CD484644CC454544C9444443C6454544BF4444
+      44B3434343A1444444884343436B4545454A4444442D404040184646460B4040
+      4004000000010000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000015555550339393909464646164343432A4444
+      4447444444694343438A454544A5464543B8464543C2484844C8514339D85B3C
+      2AED63381FFD673B1EFF6A3E1FFF6E4120FF734621FF7C4D23FF8D5728FF9E61
+      2CFFAD6B31FFB57233FFB97634FFBB7934FFBD7B34FFBF7E35FFC18135FFC383
+      35FFC48436FFC58636FFC68636FFC78836FFC88836FFC88936FFC78836FFC687
+      36FFC68636FFC58535FFC48436FFC38335FFC18035FFBF7E34FFBC7A34FFBA78
+      34FFB87533FFB57132FFA8692FFF995F2BFF895427FF794A22FF724520FF6D40
+      1FFF693C1FFF663A1EFF623921F9583E2EE84D443ED4484644CC454544CA4545
+      44C6454544C0434343B4434343A0444444844444446243434341434343264343
+      4313404040085555550300000001000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000001333333054949490E3E3E3E214444443C4444445E4343
+      43814545449E444443B4464543C2494744C8524237DB5E3925F465381DFF693C
+      1FFF6D4120FF724521FF7C4C23FF955B2BFFAA6A31FFB57233FFB97634FFBC7A
+      34FFC07F36FFC48436FFC78836FFCA8A37FFCC8E37FFCE9137FFD19338FFD396
+      38FFD49839FFD59839FFD59939FFD69A39FFD79B3AFFD79B39FFD79B3AFFD69A
+      39FFD59939FFD49839FFD39739FFD29539FFD09338FFCE8F38FFCB8D38FFC98A
+      37FFC68737FFC38335FFBF7E35FFBC7934FFB87533FFB47133FFA5662FFF8E57
+      28FF784A22FF704421FF6C3F1FFF683B1EFF64371EFF5A3C29EF4E433CD64846
+      44CC454544CA444443C6454444BF444444B0444444994343437A434343584242
+      42364646461D4040400C40404004000000010000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00018080800240404008404040144646462C4141414E42424274444343954444
+      43AE454544BF474543C7524035DC5F3923F565391EFF693D1FFF6E4221FF7749
+      23FF8E5729FFA5662FFFB57133FFBA7834FFBF7E35FFC38336FFC78837FFCB8C
+      38FFCF9139FFD39639FFD69A3AFFD89D3AFFDBA03BFFDDA23BFFDFA43BFFE1A7
+      3CFFE2A83CFFE2A93DFFE3AA3CFFE4AB3CFFE4AB3DFFE4AC3DFFE4AB3DFFE3AA
+      3CFFE3A93CFFE2A93DFFE2A83CFFE0A73BFFDEA43BFFDCA23BFFDA9F3AFFD89D
+      3AFFD59A3AFFD29539FFCE9038FFCA8B38FFC68637FFC28137FFBD7C36FFB876
+      34FFB26E32FF9F622EFF875427FF744621FF6D4120FF683B1FFF64381EFF5C3B
+      28F04F433BD8474744CC454444C9444443C5444444BB444444AA4444448F4242
+      426C44444447414141274B4B4B11555555060000000200000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000015555
+      55034646460B4242421B464646374545455D44444484444443A4464545BA4747
+      44C54F4138D85F3823F665391EFF6A3D20FF6F4221FF7A4B24FF975E2CFFB06E
+      34FFB87635FFBD7C36FFC28337FFC88938FFCD903AFFD2953BFFD69A3BFFD99E
+      3BFFDDA33CFFE1A73DFFE3AB3DFFE5AD3DFFE7AF3EFFE8B13EFFEAB33FFFECB5
+      3EFFECB63FFFEDB73FFFEDB73FFFEEB740FFEEB83FFFEEB93FFFEEB83FFFEEB7
+      40FFEDB63FFFEDB73FFFECB63FFFECB53EFFEAB33EFFE8B03EFFE6AF3EFFE5AC
+      3DFFE3A93DFFE0A73DFFDCA13CFFD99D3CFFD5993BFFD1943AFFCC8E39FFC687
+      38FFC18137FFBC7B36FFB77435FFAB6B32FF8E5729FF744822FF6E4120FF683C
+      1FFF64371EFF5B3A28F04B443FD3474644CC444443C9454444C3434343B64343
+      439F4343437D4545455542424232404040183939390955555503000000010000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000001333333054949
+      490E42424223454545434343436B45454591444443AE464645C04B4540CE5A3B
+      29EE63381EFF693C1FFF6F4221FF7C4D25FF995F2DFFB26F34FFBA7836FFC080
+      37FFC68739FFCC8E3AFFD1953BFFD69B3DFFDBA13EFFDFA73EFFE3AA3EFFE6AE
+      3FFFE8B140FFEBB541FFEDB741FFEEB941FFF0BB41FFF1BC41FFF2BD42FFF3BE
+      41FFF4BF42FFF4C042FFF4BF42FFF4C042FFF4C042FFF5C141FFF4C042FFF4C0
+      42FFF4BF42FFF4C042FFF4BF42FFF3BE41FFF2BD42FFF0BB41FFEFBA41FFEEB8
+      40FFEDB741FFEBB340FFE8B03FFFE5AD3FFFE2A93FFFDFA53EFFDAA03DFFD599
+      3CFFD0933BFFCA8C3AFFC48539FFBE7E37FFB87636FFAD6C33FF91592BFF7548
+      24FF6D4020FF673B1FFF62371FFD553E2FE6494543CE464645CA454544C74343
+      43BD444444AA4444448B424242644343433D4242421F4040400C555555030000
+      0001000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000000000000000000001555555064B4B4B114444
+      44294545454E444444784443439D444443B6474743C5543D31E1613720FC673B
+      1FFF6C4020FF774924FF9A5E2EFFB36F36FFBA7837FFC18039FFC8893AFFCF92
+      3CFFD4993EFFD99F3EFFDEA63FFFE3AA40FFE7AF41FFEAB442FFECB642FFEEB9
+      42FFF0BB42FFF2BE44FFF3BF43FFF4C044FFF5C143FFF6C244FFF7C244FFF7C4
+      45FFF7C444FFF7C444FFF8C544FFF8C544FFF8C544FFF8C544FFF8C544FFF8C5
+      44FFF8C444FFF7C444FFF7C444FFF7C345FFF6C344FFF5C144FFF5C143FFF4C0
+      44FFF3BF43FFF2BD43FFF0BA43FFEEB843FFECB642FFE9B342FFE6AE41FFE2A9
+      40FFDDA43FFFD89D3EFFD3973DFFCD8F3CFFC6873AFFBF7F38FFB87737FFAE6C
+      34FF90582BFF724522FF6A3E20FF65391EFF5F3822F74F4038DB474644CC4444
+      43C9434343C2434343B2444444974444447144444447474747244949490E4040
+      4004000000010000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000000000000249494907404040144343432E4444
+      445643434382454544A5444443BD4C423DCF5D3724F464371FFF6A3E20FF7145
+      22FF8C572BFFAE6C35FFBA7838FFC1813AFFC88A3CFFCF923EFFD59B3FFFDCA3
+      40FFE1A941FFE5AE42FFE9B344FFECB644FFEFB944FFF1BD45FFF2BE45FFF4C0
+      45FFF5C245FFF6C346FFF7C346FFF7C447FFF7C546FFF8C546FFF8C546FFF9C6
+      46FFF9C647FFF9C647FFF9C647FFF9C647FFF9C647FFF9C647FFF9C647FFF9C6
+      47FFF9C647FFF9C647FFF9C647FFF9C646FFF8C546FFF8C546FFF7C446FFF7C4
+      46FFF7C346FFF6C246FFF4C146FFF3BF45FFF2BE45FFF0BC45FFEEB944FFEBB5
+      44FFE8B243FFE4AC43FFDFA742FFDAA140FFD4993FFFCD903DFFC6873BFFBF7F
+      39FFB77537FFA76733FF825028FF6F4222FF683C20FF63371EFF583A2AED4846
+      42CF454545CA444343C5444444B8434343A04343437A4545454E464646284040
+      4010333333050000000100000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000024949490746464616424242324343435C4444
+      4488444443AB454544C0513F35DB61361FFC663A1FFF6D4121FF7F4E27FFA466
+      33FFB67538FFBE7F3AFFC78A3DFFCF933FFFD59B41FFDCA342FFE1AA44FFE6B1
+      45FFEAB545FFEDB846FFF0BC47FFF2BD47FFF3C047FFF4C148FFF5C248FFF6C3
+      48FFF7C448FFF7C548FFF7C548FFF8C648FFF8C648FFF8C548FFF8C648FFF8C6
+      49FFF9C649FFF9C649FFF9C649FFF9C649FFF9C649FFF9C649FFF9C649FFF9C6
+      49FFF9C649FFF9C649FFF9C649FFF8C649FFF8C648FFF8C648FFF8C648FFF8C6
+      48FFF7C548FFF7C449FFF7C348FFF6C348FFF5C348FFF4C148FFF3BF47FFF1BD
+      47FFEFBA47FFECB746FFE9B446FFE5AF44FFE0A844FFDAA142FFD39940FFCD90
+      3FFFC4863DFFBC7B3AFFB47238FF9B5F2FFF774A24FF6A3F20FF65381EFF5D38
+      23F64C423CD5464545CB454544C7444444BC444444A544444480444444534646
+      462C474747122B2B2B0600000001000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000002494949074343431742424236444444614343438D4444
+      43AE474442C4563A2BE963371EFF683B20FF704323FF925A2DFFB37037FFBB7B
+      3BFFC4853DFFCC903FFFD49A42FFDBA345FFE1AA45FFE6B047FFEAB548FFEEB9
+      49FFF0BD49FFF2BE4AFFF3C04AFFF4C14AFFF5C34AFFF6C34AFFF6C44AFFF7C4
+      4BFFF7C44BFFF7C54BFFF7C54BFFF7C54BFFF7C54AFFF7C54AFFF7C64AFFF7C6
+      4AFFF7C64AFFF7C64AFFF7C64AFFF7C64AFFF7C64AFFF7C64AFFF7C64AFFF7C6
+      4AFFF7C64AFFF7C64AFFF7C64AFFF7C64AFFF7C54AFFF7C54AFFF7C54AFFF7C5
+      4BFFF7C54BFFF7C54BFFF7C44BFFF6C44BFFF6C44AFFF6C34AFFF5C34AFFF4C2
+      4AFFF3BF49FFF1BD49FFEFBC49FFECB848FFE9B448FFE4AE47FFDFA845FFD9A0
+      43FFD29742FFCA8D3FFFC1823CFFB9783AFFAE6D36FF86532AFF6D4122FF663A
+      1FFF61361EFD523E34E0464645CB454544C8434343BE444444A9434343854343
+      43584141412F434343132B2B2B06000000010000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000014949490743434317424242364343436343434390454544B14A43
+      3ECA5B3622F463381FFF6A3F21FF784926FFA26432FFB7753AFFC0813DFFC88C
+      40FFD19642FFD9A045FFDFA947FFE5B048FFE9B54AFFECB94AFFEFBC4BFFF1BE
+      4BFFF2C04BFFF3C14CFFF4C24CFFF5C34CFFF5C34CFFF5C34CFFF6C44CFFF6C4
+      4CFFF6C44CFFF6C44CFFF6C44DFFF6C44DFFF6C54DFFF6C54DFFF6C54DFFF6C5
+      4DFFF6C54DFFF6C54DFFF6C54DFFF6C54DFFF6C54DFFF6C54DFFF6C54DFFF6C5
+      4DFFF6C54DFFF6C54DFFF6C54DFFF6C54DFFF6C54DFFF6C54DFFF6C44DFFF6C4
+      4DFFF6C44DFFF6C44CFFF6C44CFFF6C44CFFF6C44CFFF5C34CFFF5C44CFFF4C3
+      4DFFF4C24CFFF3C14CFFF2C04CFFF1BE4BFFEEBC4BFFECB84AFFE8B349FFE4AD
+      48FFDEA646FFD79E45FFCF9442FFC6893FFFBE7E3CFFB47239FF965D2FFF7145
+      24FF683C20FF62361EFF57392AEB474544CC444443C9444444C0434343AC4343
+      43894444445A4141412F47474712333333050000000100000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00012B2B2B0649494915434343354444446243434391444443B24C423BCE5E36
+      20F964381FFF6C4021FF83512AFFAC6B37FFBA7A3BFFC4853FFFCD9243FFD59C
+      45FFDCA547FFE3AD49FFE8B44BFFECB84CFFEEBB4CFFF0BD4EFFF1BF4EFFF2C0
+      4EFFF3C14EFFF4C24EFFF4C24EFFF4C24FFFF4C34FFFF4C34FFFF4C34FFFF4C3
+      4FFFF4C34FFFF4C34FFFF4C34FFFF4C34FFFF4C34FFFF4C34FFFF4C34FFFF4C3
+      4FFFF4C34FFFF4C34FFFF4C34FFFF4C34FFFF4C34FFFF4C34FFFF4C34FFFF4C3
+      4FFFF4C34FFFF4C34FFFF4C34FFFF4C34FFFF4C34FFFF4C34FFFF4C34FFFF4C3
+      4FFFF4C34FFFF4C34FFFF4C34FFFF4C34FFFF4C34FFFF4C34FFFF4C34FFFF4C2
+      4FFFF4C34EFFF4C24EFFF3C14EFFF2C04DFFF1BE4EFFF0BD4DFFEDBA4DFFEBB6
+      4CFFE6B24BFFE1AB49FFDBA347FFD39944FFCA8F42FFC0823EFFB7753AFFA466
+      34FF794B26FF693D21FF63371EFF5A3825F1474543CD444443C9434343C14444
+      44AD44444488424242594444442D4B4B4B113333330500000001000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000013333
+      330543434313424242324343435F4444448F444443B24D4038D35F351FFB6539
+      1FFF6C4122FF90592FFFB37239FFBC7D3DFFC68A42FFD09544FFD9A148FFDFAA
+      4BFFE5B14CFFEAB54DFFECBA4EFFEFBC4FFFF0BE50FFF1BF50FFF2C050FFF2C0
+      50FFF2C150FFF3C150FFF3C250FFF3C250FFF3C250FFF3C250FFF3C250FFF3C2
+      50FFF3C250FFF3C250FFF3C250FFF3C250FFF3C250FFF3C250FFF3C250FFF3C2
+      50FFF3C250FFF3C250FFF3C250FFF3C250FFF3C250FFF3C250FFF3C250FFF3C2
+      50FFF3C250FFF3C250FFF3C250FFF3C250FFF3C250FFF3C250FFF3C250FFF3C2
+      50FFF3C250FFF3C250FFF3C250FFF3C250FFF3C250FFF3C250FFF3C250FFF3C2
+      50FFF3C250FFF3C150FFF2C150FFF2C04FFFF2C050FFF1C050FFF0BE50FFEEBC
+      4FFFECB94EFFE8B44DFFE4AF4CFFDEA749FFD79F48FFCD9344FFC48640FFBA79
+      3CFFAD6D37FF824F2AFF6A3F21FF63381FFF5B3723F5484441D0444443C94343
+      43C1434343AC43434386414141564141412B4040401040404004000000010000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000001404040043C3C
+      3C114343432E4343435B4343438C454544B04F3E35D55F351EFD65391FFF6E42
+      23FF975C31FFB5733AFFBF8140FFC98E43FFD39A47FFDBA44BFFE2AD4DFFE7B3
+      4FFFEAB850FFEDBB51FFEFBD51FFF0BE52FFF0BF51FFF1C052FFF1C052FFF1C0
+      52FFF2C052FFF2C052FFF2C152FFF2C152FFF2C152FFF2C152FFF2C152FFF2C1
+      52FFF2C152FFF2C152FFF2C152FFF2C152FFF2C152FFF2C152FFF2C152FFF2C1
+      52FFF2C152FFF2C152FFF2C152FFF2C152FFF2C152FFF2C152FFF2C152FFF2C1
+      52FFF2C152FFF2C152FFF2C152FFF2C152FFF2C152FFF2C152FFF2C152FFF2C1
+      52FFF2C152FFF2C152FFF2C152FFF2C152FFF2C152FFF2C152FFF2C152FFF2C1
+      52FFF2C152FFF2C052FFF2C052FFF1C052FFF1C052FFF1C052FFF0BF51FFF0BE
+      52FFEEBD51FFECBA50FFEAB64FFFE6B14EFFE0AB4CFFD9A24AFFD09646FFC68A
+      43FFBC7D3EFFB16F3AFF88532CFF6B3F22FF63381FFF5C3621F84A433FD34443
+      43C9434343C1434343AB4242428344444452414141273737370E555555030000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000000000000000000000555555033B3B3B0D4141
+      41274343435442424287444443AE4E3D35D560341DFE65391FFF6F4324FF9C60
+      33FFB5753CFFC18341FFCC9245FFD59D49FFDDA74DFFE3AF4FFFE8B451FFEBB8
+      52FFEDBB53FFEEBD53FFEFBE53FFF0BF54FFF0BF54FFF0BF54FFF0BF54FFF0BF
+      54FFF0BF54FFF0BF54FFF0BF54FFF0BF54FFF0BF54FFF0BF54FFF0BF54FFF0BF
+      54FFF0BF54FFF0BF54FFF0BF54FFF0BF54FFF0BF54FFF0BF54FFF0BF54FFF0BF
+      54FFF0BF54FFF0BF54FFEABB52FFCAA147FFE8B952FFF0BF54FFF0BF54FFF0BF
+      54FFF0BF54FFF0BF54FFF0BF54FFF0BF54FFF0BF54FFF0BF54FFF0BF54FFF0BF
+      54FFF0BF54FFF0BF54FFF0BF54FFF0BF54FFF0BF54FFF0BF54FFF0BF54FFF0BF
+      54FFF0BF54FFF0BF54FFF0BF54FFF0BF54FFF0BF54FFF0BF54FFF0BF54FFF0BF
+      54FFEFBD53FFEEBC52FFECBA52FFEAB851FFE7B351FFE2AD4FFFDBA54CFFD39A
+      48FFC98E45FFBE8040FFB3713AFF8C562EFF6C4022FF63381FFF5C341FFA4A43
+      3ED3434343C9444444C0434343A84343437E4444444B464646214D4D4D0A8080
+      8002000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000808080023333330A404040204545
+      454A4343437E454444A94C3F38D05E341EFD643820FF704425FF9F6234FFB676
+      3DFFC28443FFCD9348FFD7A04CFFDEA94FFFE4B051FFE8B553FFEBB954FFECBB
+      54FFEDBC55FFEEBD55FFEEBE55FFEEBE55FFEEBF55FFEFBE55FFEFBE55FFEFBE
+      55FFEFBE55FFEFBE55FFEFBE55FFEFBE55FFEFBE55FFEFBE55FFEFBE55FFEFBE
+      55FFEFBE55FFEFBE55FFEFBE55FFEFBE55FFEFBE55FFB59040FF3B2F15FF1510
+      07FF090703FF020201FF000000FF000000FF000000FF010101FF070603FF110E
+      06FF1F190BFF322712FF53421DFF9D7D38FFE9BA53FFEFBE55FFEFBE55FFEFBE
+      55FFEFBE55FFEFBE55FFEFBE55FFEFBE55FFEFBE55FFEFBE55FFEFBE55FFEFBE
+      55FFEFBE55FFEFBE55FFEFBE55FFEFBE55FFEFBE55FFEFBE55FFEEBE55FFEEBE
+      55FFEEBE55FFEEBD55FFEDBC55FFECBA54FFEAB854FFE7B453FFE2AF51FFDCA6
+      4EFFD49C4BFFCA8F46FFBE8141FFB3723CFF915930FF6B3F22FF63371FFF5B34
+      20F8494340D1444444C8434343BE434343A344444474434343414545451A4949
+      4907000000010000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000001494949073D3D3D194141413F4343
+      4373424242A24B3F3BCA5E341EFC633820FF6F4225FFA06235FFB7763EFFC286
+      44FFCD944AFFD7A14DFFDFAB51FFE4B154FFE8B655FFEAB956FFECBB56FFECBB
+      56FFEDBC57FFEDBD57FFEDBC57FFEDBC57FFEDBC57FFEDBC57FFEDBC57FFEDBC
+      57FFEDBC57FFEDBC57FFEDBC57FFEDBC57FFEDBC57FFEDBC57FFEDBC57FFEDBC
+      57FFEDBC57FFEDBC57FFEDBC57FF9F7E3AFF100D06FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF010000FF100D06FF392D15FF7960
+      2CFFD0A54DFFEDBC57FFEDBC57FFEDBC57FFEDBC57FFEDBC57FFEDBC57FFEDBC
+      57FFEDBC57FFEDBC57FFEDBC57FFEDBC57FFEDBC57FFEDBC57FFEDBC57FFEDBC
+      57FFEDBC57FFEDBD57FFEDBC57FFECBB56FFEBBA56FFEAB855FFE7B455FFE3AF
+      52FFDDA951FFD59D4CFFCA9048FFBF8143FFB4733DFF915830FF6A3E23FF6236
+      1FFF5A3523F5474442CE444444C8434343BA4444449A45454568424242364040
+      4014333333050000000100000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000001404040044747471241414133444444664343
+      439849413EC35C3420FA63371FFF6D4023FF9C5F35FFB6763FFFC28645FFCE94
+      4BFFD7A14FFFDFAB53FFE4B256FFE8B656FFE9B958FFEABA58FFEBBB58FFECBB
+      58FFECBC58FFECBC58FFECBC58FFECBC58FFECBC58FFECBC58FFECBC58FFECBC
+      58FFECBC58FFECBC58FFECBC58FFECBC58FFECBC58FFECBC58FFECBC58FFECBC
+      58FFECBC58FFECBC58FF392D15FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF060502FF241D0EFF5A4822FFA98740FFEABA58FFECBC58FFECBC
+      58FFECBC58FFECBC58FFECBC58FFECBC58FFECBC58FFECBC58FFECBC58FFECBC
+      58FFECBC58FFECBC58FFECBB58FFEBBB59FFEBBA58FFEABA58FFE9B857FFE7B4
+      57FFE3B054FFDDA952FFD59E4EFFCB914AFFC08244FFB3733DFF8B552FFF693D
+      22FF61351EFF583725F2464443CC434343C6444444B4434343904343435B4141
+      412B4949490E5555550300000001000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000808080024040400C41414127434343574343438C4742
+      3FB95A3421F761361EFF6A3F22FF975D32FFB5743EFFC28546FFCE954DFFD7A1
+      51FFDFAA54FFE4B257FFE7B559FFE8B759FFE9B95AFFEAB959FFEABA59FFEABA
+      59FFEABA5AFFEABA5AFFEABA5AFFEABA5AFFEABA5AFFEABA5AFFEABA5AFFEABA
+      5AFFEABA5AFFEABA5AFFEABA5AFFEABA5AFFEABA5AFFEABA5AFFEABA5AFFEABA
+      5AFFEABA5AFF43351AFF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF010101FF141008FF4B3B
+      1DFFBD9649FFEABA5AFFEABA5AFFEABA5AFFEABA5AFFEABA5AFFEABA5AFFEABA
+      5AFFEABA5AFFEABA5AFFEABA5AFFEABA59FFEABA59FFEAB959FFE9B95AFFE8B7
+      59FFE6B558FFE2B057FFDDA954FFD59F4FFFCB914BFFBE8144FFB2703DFF8651
+      2DFF673B22FF60341DFF553728EE434343CA444444C3444444AD424242834343
+      434C404040203939390900000002000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000001494949074242421B434343454444447C444444AA5636
+      25EE60351EFF683C22FF915931FFB3733FFFC08446FFCD944DFFD7A152FFDEAB
+      55FFE3B058FFE6B55AFFE7B75AFFE8B75BFFE8B85BFFE9B95BFFE9B95BFFE9B9
+      5BFFE9B95BFFE9B95BFFE9B95BFFE9B95BFFE9B95BFFE9B95BFFE9B95BFFE9B9
+      5BFFE9B95BFFE9B95BFFE9B95BFFE9B95BFFE9B95BFFE9B95BFFE9B95BFFE9B9
+      5BFF7F6431FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF0D0B05FF4E3E1FFFC1994CFFE9B95BFFE9B95BFFE9B95BFFE9B9
+      5BFFE9B95BFFE9B95BFFE9B95BFFE9B95BFFE9B95BFFE9B85BFFE8B85BFFE8B7
+      5AFFE7B65AFFE5B459FFE2AF58FFDCA855FFD59E52FFC9904BFFBD7F44FFAF6E
+      3CFF804E2BFF653920FF5F331DFF513B31E3434343C9434343BF434343A34343
+      43724141413B4646461633333305000000010000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000001404040043C3C3C1141414133454545684343439C523A2FDC5F33
+      1DFF653A20FF86512DFFB2703EFFBE8246FFCB914DFFD5A153FFDDAA57FFE2B0
+      5AFFE5B45AFFE6B65CFFE7B65CFFE7B75CFFE7B75CFFE7B75CFFE7B75CFFE7B7
+      5CFFE7B75CFFE7B75CFFE7B75CFFE7B75CFFE7B75CFFE7B75CFFE7B75CFFE7B7
+      5CFFE7B75CFFE7B75CFFE7B75CFFE7B75CFFE7B75CFFE7B75CFFE7B75CFFB48E
+      47FF010101FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF0F0C06FF564522FFD7AB56FFE7B7
+      5CFFE7B75CFFE7B75CFFE7B75CFFE7B75CFFE7B75CFFE7B75CFFE7B75CFFE7B7
+      5CFFE7B65CFFE6B55BFFE4B25BFFE1AF59FFDBA857FFD39C51FFC88E4BFFBB7C
+      44FFAC6B3CFF774628FF633720FF5E311EFE4B403AD6444444C7434343B84343
+      43944141415E4747472B4E4E4E0D555555030000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000024D4D4D0A40404024444444534444448B4C3F38C55E311DFE6337
+      20FF774729FFAD6C3CFFBC7F45FFC9904EFFD49E54FFDCA958FFE1AF5BFFE4B3
+      5CFFE5B45CFFE6B55DFFE6B55DFFE6B65DFFE6B65DFFE6B65DFFE6B65DFFE6B6
+      5DFFE6B65DFFE6B65DFFE6B65DFFE6B65DFFE6B65DFFE6B65DFFE6B65DFFE6B6
+      5DFFE6B65DFFE6B65DFFE6B65DFFE6B65DFFE6B65DFFE6B65DFFDDAF59FF0A08
+      04FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF010101FF3429
+      15FFB8924AFFE6B65DFFE6B65DFFE6B65DFFE6B65DFFE6B65DFFE6B65DFFE6B6
+      5DFFE6B55DFFE5B65DFFE4B45DFFE3B25CFFE0AE5BFFDAA657FFD19B52FFC68B
+      4BFFB87A43FFA26438FF6C4024FF61351EFF5A3320F9464241CE444444C44343
+      43AE43434381424242494646461D404040080000000100000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000133333305464646164242423E4343437646413FAE5A331FF860351EFF6C40
+      24FFA36439FFB87B44FFC78E4EFFD29C54FFDAA759FFDFAE5CFFE2B15EFFE4B3
+      5EFFE4B35EFFE4B45FFFE4B45FFFE4B45FFFE4B45FFFE4B45FFFE4B45FFFE4B4
+      5FFFE4B45FFFE4B45FFFE4B45FFFE4B45FFFE4B45FFFE4B45FFFE4B45FFFE4B4
+      5FFFE4B45FFFE4B45FFFE4B45FFFE4B45FFFE4B45FFFE4B45FFF624D29FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF1B150BFF8C6F3BFFE4B45FFFE4B45FFFE4B45FFFE4B45FFFE4B4
+      5FFFE4B45FFFE4B45FFFE4B35EFFE3B35EFFE2B05DFFDEAC5BFFD8A458FFCF98
+      52FFC3894BFFB57441FF955A33FF673C22FF5F331DFF563627EF434343C94343
+      43BE4343439F4343436B43434335474747124040400400000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00024040400C4343432A4444445E44444496553628E65E321CFF663A21FF955A
+      33FFB57542FFC3894BFFD09A54FFD8A559FFDDAC5DFFE1B05EFFE2B25FFFE3B2
+      5FFFE3B25FFFE3B35FFFE3B35FFFE3B35FFFE3B35FFFE3B35FFFE3B35FFFE3B3
+      5FFFE3B35FFFE3B35FFFE3B35FFFE3B35FFFE3B35FFFE3B35FFFE3B35FFFE3B3
+      5FFFE3B35FFFE3B35FFFE3B35FFFE3B35FFFE3B35FFFE3B35FFF0D0A06FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF261E10FFD0A457FFE3B35FFFE3B35FFFE3B3
+      5FFFE3B35FFFE3B25FFFE3B25FFFE2B360FFE2B15FFFE0B05EFFDCAA5CFFD6A2
+      58FFCD9552FFBF8349FFB1703FFF834F2EFF633720FF5D311DFF4E3B33DE4444
+      44C7444444B54343438C44444453444444223939390900000001000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000012B2B
+      2B0640404018454545434343437E4B3D37C15D301CFF62361FFF814D2CFFB16F
+      40FFBF834AFFCC9553FFD6A35AFFDCAB5DFFDFAE5FFFE1B060FFE1B160FFE2B1
+      60FFE2B160FFE2B160FFE2B160FFE2B160FFE2B160FFE2B160FFE2B160FFE2B1
+      60FFE2B160FFE2B160FFE2B160FFE2B160FFE2B160FFE2B160FFE2B160FFE2B1
+      60FFE2B160FFE2B160FFE2B160FFE2B160FFE2B160FFA17E44FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF040302FF866939FFE2B160FFE2B1
+      60FFE2B160FFE2B160FFE2B160FFE1B260FFE1B160FFE0B05FFFDEAE5EFFDBA9
+      5DFFD49F58FFC89051FFBB7E47FFAA6A3CFF714225FF60351EFF5A321FFA4642
+      41CD434343C1444444A643434373434343394343431340404004000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000024040
+      400C4141412B424242614442429B593321F45F331DFF6C3F24FFA7663BFFBA7D
+      48FFC89052FFD39E59FFDAA85DFFDDAC60FFDFAE61FFDFB061FFE0B062FFE0B0
+      62FFE0B062FFE0B062FFE0B062FFE0B062FFE0B062FFE0B062FFE0B062FFE0B0
+      62FFE0B062FFE0B062FFE0B062FFE0B062FFE0B062FFE0B062FFE0B062FFE0B0
+      62FFE0B062FFE0B062FFE0B062FFE0B062FFE0B062FF68522EFF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF715932FFE0B0
+      62FFE0B062FFE0B062FFE0B062FFE0B062FFE0B062FFDFB061FFDFAE60FFDDAC
+      5FFFD9A65DFFD09B57FFC48B4FFFB67745FF985C35FF653921FF5E321DFF5337
+      2AE9444444C8434343B74444448F454545554444442255555509000000010000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000001333333054040
+      4018444444444343437E50382DD35D301DFF633821FF905632FFB47544FFC48A
+      50FFCF9B58FFD7A55DFFDCAB60FFDDAD62FFDEAE61FFDEAF62FFDEAF62FFDEAF
+      62FFDEAF62FFDEAF62FFDEAF62FFDEAF62FFDEAF62FFDEAF62FFDEAF62FFDEAF
+      62FFDEAF62FFDEAF62FFDEAF62FFDEAF62FFDEAF62FFDEAF62FFDEAF62FFDEAF
+      62FFDEAF62FFDEAF62FFDEAF62FFDEAF62FFDEAF62FF564426FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF010100FFA684
+      4AFFDEAF62FFDEAF62FFDEAF62FFDEAF62FFDEAF62FFDEAF62FFDEAE61FFDDAD
+      61FFDBAA60FFD5A35CFFCD9656FFC0844DFFB06F41FF7D4B2CFF61351FFF5C30
+      1CFE493F3BD4434343C2444444A6434343724444443847474712404040040000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000000000000000000000000000024646460B4444
+      44294242426047403CA45B311DFC5F331DFF754429FFAE6C3FFFBD824CFFCC96
+      56FFD5A25EFFD9A860FFDCAC62FFDDAD62FFDDAD63FFDDAD63FFDDAD63FFDDAD
+      63FFDDAD63FFDDAD63FFDDAD63FFDDAD63FFDDAD63FFDDAD63FFDDAD63FFDDAD
+      63FFDDAD63FFDDAD63FFDDAD63FFDDAD63FFDDAD63FFDDAD63FFDDAD63FFDDAD
+      63FFDDAD63FFDDAD63FFDDAD63FFDDAD63FFDDAD63FF67512EFF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0806
+      04FFCFA35DFFDDAD63FFDDAD63FFDDAD63FFDDAD63FFDDAD63FFDDAD63FFDDAC
+      62FFDBAB62FFD9A760FFD39F5BFFC89154FFB97B48FFA4643BFF683C23FF5E31
+      1DFF583323F4444444C8434343B74444448E4444445346464621404040080000
+      0001000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000040404004494949154545
+      453F4444447C533527DE5C311CFF633821FF9E5F38FFB77948FFC68E53FFD19E
+      5CFFD7A660FFDAAA62FFDBAB63FFDBAB64FFDBAC64FFDBAC64FFDBAC64FFDBAC
+      64FFDBAC64FFDBAC64FFDBAC64FFDBAC64FFDBAC64FFDBAC64FFDBAC64FFDBAC
+      64FFDBAC64FFDBAC64FFDBAC64FFDBAC64FFDBAC64FFDBAC64FFDBAC64FFDBAC
+      64FFDBAC64FFDBAC64FFDBAC64FFDBAC64FFDBAC64FFD5A862FF030301FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF4D3C23FFDBAC64FFDBAC64FFDBAC64FFDBAC64FFDBAC64FFDBAC64FFDBAB
+      64FFDBAA63FFD9A862FFD6A460FFCF995AFFC28850FFB27244FF8B5231FF6134
+      1FFF5C301CFF4C3C35DB434343C1444444A44343436F43434335404040105555
+      5503000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000140404008424242234343
+      435748413D9E5C301CFD5F331DFF7E492BFFAF6E42FFBF854FFFCD975AFFD5A3
+      61FFD8A763FFD9A963FFDAAA64FFDAAA64FFDAAA64FFDAAA64FFDAAA64FFDAAA
+      64FFDAAA64FFDAAA64FFDAAA64FFDAAA64FFDAAA64FFDAAA64FFDAAA64FFDAAA
+      64FFDAAA64FFDAAA64FFDAAA64FFDAAA64FFDAAA64FFDAAA64FFDAAA64FFDAAA
+      64FFDAAA64FFDAAA64FFDAAA64FFDAAA64FFDAAA64FFDAAA64FF594629FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF0F0C07FFDAAA64FFDAAA64FFDAAA64FFDAAA64FFDAAA64FFDAAA64FFDAAA
+      64FFDAA963FFD9A863FFD7A662FFD3A05FFFC99357FFBB7F4CFFA9683EFF6C3D
+      24FF5E311DFF573322F4444444C7444444B4444444884444444B4242421B5555
+      5506000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000555555034444440F454545344242
+      4270533629D75C311CFF623721FF9E5F39FFB87B4AFFC79057FFD19E5FFFD6A5
+      63FFD8A864FFD9A864FFD9A864FFD9A864FFD9A864FFD9A864FFD9A864FFD9A8
+      64FFD9A864FFD9A864FFD9A864FFD9A864FFD9A864FFD9A864FFD9A864FFD9A8
+      64FFD9A864FFD9A864FFD9A864FFD9A864FFD9A864FFD9A864FFD9A864FFD9A8
+      64FFD9A864FFD9A864FFD9A864FFD9A864FFD9A864FFD9A864FFD9A864FF5944
+      29FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FFBD9357FFD9A864FFD9A864FFD9A864FFD9A864FFD9A864FFD9A8
+      64FFD9A864FFD8A864FFD7A763FFD5A461FFCF9A5DFFC38A53FFB37446FF8B52
+      31FF60351EFF5C301CFF4B3D37D8444444BF4444449D434343634141412B4646
+      460B000000010000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000002B2B2B064545451A42424249453F
+      3D905A301CFC5E321DFF7A462AFFAE6D42FFC08752FFCD985CFFD3A162FFD6A5
+      64FFD7A664FFD7A664FFD7A664FFD7A664FFD7A664FFD7A664FFD7A664FFD7A6
+      64FFD7A664FFD7A664FFD7A664FFD7A664FFD7A664FFD7A664FFD7A664FFD7A6
+      64FFD7A664FFD7A664FFD7A664FFD7A664FFD7A664FFD7A664FFD7A664FFD7A6
+      64FFD7A664FFD7A664FFD7A664FFD7A664FFD7A664FFD7A664FFD7A664FFD7A6
+      64FF6A5231FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF664E2FFFD7A664FFD7A664FFD7A664FFD7A664FFD7A664FFD7A6
+      64FFD7A664FFD7A664FFD7A765FFD6A463FFD29F61FFCA945AFFBB804EFFA866
+      3DFF693B23FF5C311CFF563323F2434343C5444444AD4242427B4646463E4040
+      4014404040040000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000014D4D4D0A464646284343435F5236
+      2ACE5C301CFF60351FFF9A5C38FFB6794AFFC79059FFD09C60FFD4A364FFD5A5
+      64FFD6A565FFD6A565FFD6A565FFD6A565FFD6A565FFD6A565FFD6A565FFD6A5
+      65FFD6A565FFD6A565FFD6A565FFD6A565FFD6A565FFD6A565FFD6A565FFD6A5
+      65FFD6A565FFD6A565FFD6A565FFD6A565FFD6A565FFD6A565FFD6A565FFD6A5
+      65FFD6A565FFD6A565FFD6A565FFD6A565FFD6A565FFD6A565FFD6A565FFD6A5
+      65FFD6A565FF876840FF020101FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF624C2FFFD6A565FFD6A565FFD6A565FFD6A565FFD6A565FFD6A5
+      65FFD6A565FFD6A565FFD5A565FFD5A464FFD3A163FFCE9A5EFFC28B55FFB173
+      46FF87502FFF5E331DFF5B2F1BFF4A3E39D5444444B943434390444444534848
+      4820494949070000000100000000000000000000000000000000000000000000
+      0000000000000000000000000000555555033C3C3C1144444438444241795A30
+      1DF85C311CFF754227FFAC6C41FFBE8451FFCB975EFFD1A063FFD3A265FFD4A3
+      65FFD4A365FFD4A365FFD4A365FFD4A365FFD4A365FFD4A365FFD4A365FFD4A3
+      65FFD4A365FFD4A365FFD4A365FFD4A365FFD4A365FFD4A365FFD4A365FFD4A3
+      65FFD4A365FFD4A365FFD4A365FFD4A365FFD4A365FFD4A365FFD4A365FFD4A3
+      65FFD4A365FFD4A365FFD4A365FFD4A365FFD4A365FFD4A365FFD4A365FFD4A3
+      65FFD4A365FFD4A365FF9C784BFF010000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF6A5132FFD4A365FFD4A365FFD4A365FFD4A365FFD4A365FFD4A3
+      65FFD4A365FFD4A365FFD4A365FFD4A265FFD3A264FFD09E62FFC8935BFFBA7E
+      4DFFA5643CFF643821FF5C301CFF543527ED434343C1444444A24343436A4343
+      432E4040400C0000000200000000000000000000000000000000000000000000
+      00000000000000000000000000003333330547474719424242494E3A31AE5B2F
+      1BFF5E321DFF915433FFB47649FFC48E59FFCE9B61FFD1A165FFD3A265FFD3A2
+      65FFD3A265FFD3A265FFD3A265FFD3A265FFD3A265FFD3A265FFD3A265FFD3A2
+      65FFD3A265FFD3A265FFD3A265FFD3A265FFD3A265FFD3A265FFD3A265FFD3A2
+      65FFD3A265FFD3A265FFD3A265FFD3A265FFD3A265FFD3A265FFD3A265FFD3A2
+      65FFD3A265FFD3A265FFD3A265FFD3A265FFD3A265FFD3A265FFD3A265FFD3A2
+      65FFD3A265FFD3A265FFD3A265FF4F3D26FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF735837FFD3A265FFD3A265FFD3A265FFD3A265FFD3A265FFD3A2
+      65FFD3A265FFD3A265FFD3A265FFD3A265FFD2A166FFD19F64FFCC9960FFC087
+      55FFAF7045FF7E482BFF5D301DFF5A301CFD464241C9444444B04343437E4646
+      463E434343134040400400000000000000000000000000000000000000000000
+      000000000000000000000000000139393909454545254343435B563324DE5C30
+      1BFF663721FFA7643EFFBB8051FFC8945EFFCF9C64FFD19F65FFD1A065FFD1A0
+      65FFD1A065FFD1A065FFD1A065FFD1A065FFD1A065FFD1A065FFD1A065FFD1A0
+      65FFD1A065FFD1A065FFD1A065FFD1A065FFD1A065FFD1A065FF977449FF3226
+      19FF1B150DFF0F0C07FF070503FF070503FF201910FF503D27FF977449FFD1A0
+      65FFD1A065FFD1A065FFD1A065FFD1A065FFD1A065FFD1A065FFD1A065FFD1A0
+      65FFD1A065FFD1A065FFD1A065FFD1A065FF060503FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF927046FFD1A065FFD1A065FFD1A065FFD1A065FFD1A065FFD1A0
+      65FFD1A065FFD1A065FFD1A065FFD1A065FFD1A065FFD19F65FFCE9B63FFC68F
+      5BFFB67A4DFF975936FF5E331DFF5B2F1BFF4E3A31DE444444B94444448E4444
+      444F4949491C2B2B2B0600000001000000000000000000000000000000000000
+      00000000000000000000000000023B3B3B0D4444443146403D785B2F1CFD5C31
+      1CFF7E472BFFAE6F45FFC18958FFCB9762FFCF9C65FFCF9E66FFD09E66FFD09E
+      66FFD09E66FFD09E66FFD09E66FFD09E66FFD09E66FFD09E66FFD09E66FFD09E
+      66FFD09E66FFD09E66FFD09E66FFD09E66FF785B3BFF0F0C08FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0403
+      02FF624A30FFD09E66FFD09E66FFD09E66FFD09E66FFD09E66FFD09E66FFD09E
+      66FFD09E66FFD09E66FFD09E66FFD09E66FF332719FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF020201FFD09E66FFD09E66FFD09E66FFD09E66FFD09E66FFD09E66FFD09E
+      66FFD09E66FFD09E66FFD09E66FFD09E66FFD09E66FFCF9E65FFCE9C64FFC995
+      5FFFBD8354FFA96840FF6A3A23FF5C301CFF563323F2444444BF4343439C4242
+      4260414141273333330A00000001000000000000000000000000000000000000
+      0000000000000000000040404004434343134545453F51372BB35B2F1BFF5E31
+      1DFF985836FFB5794DFFC5905DFFCC9963FFCE9B66FFCE9C65FFCE9C65FFCE9C
+      65FFCE9C65FFCE9C65FFCE9C65FFCE9C65FFCE9C65FFCE9C65FFCE9C65FFCE9C
+      65FFCE9C65FFCE9C65FFCA9A63FF36291BFF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF0E0A07FFB28757FFCE9C65FFCE9C65FFCE9C65FFCE9C65FFCE9C
+      65FFCE9C65FFCE9C65FFCE9C65FFCE9C65FF57422BFF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF1D160EFFCE9C65FFCE9C65FFCE9C65FFCE9C65FFCE9C65FFCE9C65FFCE9C
+      65FFCE9C65FFCE9C65FFCE9C65FFCE9C65FFCE9C65FFCE9C65FFCD9C65FFCB97
+      63FFC28B5AFFB07148FF834B2DFF5C311CFF5B2F1BFF48413DCC444444A94444
+      4471454545344949490E80808002000000000000000000000000000000000000
+      000000000000000000012B2B2B064242421B4545454E573221E45B2F1BFF6939
+      21FFA8653FFFBB8254FFC89360FFCB9965FFCD9A65FFCD9A65FFCD9A65FFCD9A
+      65FFCD9A65FFCD9A65FFCD9A65FFCD9A65FFCD9A65FFCD9A65FFCD9A65FFCD9A
+      65FFCD9A65FFC79661FF130E09FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF070604FFB28557FFCD9A65FFCD9A65FFCD9A65FFCD9A
+      65FFCD9A65FFCD9A65FFCD9A65FFCD9A65FF533E29FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF80613FFFCD9A65FFCD9A65FFCD9A65FFCD9A65FFCD9A65FFCD9A65FFCD9A
+      65FFCD9A65FFCD9A65FFCD9A65FFCD9A65FFCD9A65FFCD9A65FFCC9A65FFCB98
+      64FFC5915EFFB67A4FFF9D5A38FF5D311DFF5B2F1BFF50392EE2434343B34343
+      4381434343414040401440404004000000000000000000000000000000000000
+      00000000000000000001393939094545452545413F625B2F1BFD5C301BFF7F46
+      2AFFAD6E47FFBF885AFFC89563FFCA9865FFCA9865FFCA9965FFCA9965FFCA99
+      65FFCA9965FFCA9965FFCA9965FFCA9965FFCA9965FFCA9965FFCA9965FFCA99
+      65FFCA9965FF1F1810FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF0B0806FFC89765FFCA9965FFCA9965FFCA99
+      65FFCA9965FFCA9965FFCA9965FFCA9965FF4F3B27FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF271D
+      13FFCA9965FFCA9965FFCA9965FFCA9965FFCA9965FFCA9965FFCA9965FFCA99
+      65FFCA9965FFCA9965FFCA9965FFCA9965FFCA9965FFCA9965FFCA9865FFCA97
+      64FFC79362FFBC8255FFA86540FF6B3A22FF5B2F1BFF563324F1434343BA4242
+      428E4545454E4242421B2B2B2B06000000010000000000000000000000000000
+      000000000000000000024040400C4444442D4F3A30925B2F1BFF5C301CFF9152
+      32FFB3774DFFC28D5EFFC89463FFC99665FFC99665FFC99665FFC99665FFC996
+      65FFC99665FFC99665FFC99665FFC99665FFC99665FFC99665FFC99665FFC996
+      65FF3B2C1EFF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF533E2AFFC99665FFC99665FFC996
+      65FFC99665FFC99665FFC99665FFC99665FF4B3826FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF1D160EFFB88A
+      5DFFC99665FFC99665FFC99665FFC99665FFC99665FFC99665FFC99665FFC996
+      65FFC99665FFC99665FFC99665FFC99665FFC99665FFC99665FFC99665FFC895
+      64FFC79463FFBF885BFFAD6D47FF7D4428FF5C301BFF5A301CFD444242C04343
+      43984444445A4242422340404008000000010000000000000000000000000000
+      000000000000808080024949490E43434335543527BE5B2F1BFF5F321DFFA25E
+      3AFFB87D53FFC38E60FFC69364FFC79464FFC79464FFC79464FFC79464FFC794
+      64FFC79464FFC79464FFC79464FFC79464FFC79464FFC79464FFC79464FF936D
+      4AFF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF030201FFC39062FFC79464FFC794
+      64FFC79464FFC79464FFC79464FFC79464FF483624FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF030201FF17110CFF715438FFC79464FFC794
+      64FFC79464FFC79464FFC79464FFC79464FFC79464FFC79464FFC79464FFC794
+      64FFC79464FFC79464FFC79464FFC79464FFC79464FFC79464FFC79464FFC794
+      64FFC69263FFC18C5EFFB2754EFF8F4F31FF5C301CFF5B2F1BFF4A3D37D04343
+      43A1444444664141412B4646460B000000020000000000000000000000000000
+      000000000000555555033C3C3C114343433D583120E35B2F1BFF6D3A22FFA765
+      41FFBB8258FFC38F61FFC49063FFC59163FFC59163FFC59163FFC59163FFC591
+      63FFC59163FFC59163FFC59163FFC59163FFC59163FFC59163FFC59163FF130E
+      0AFF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF876344FFC59163FFC591
+      63FFC59163FFC59163FFC59163FFC59163FF493524FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF130E
+      0AFF34261AFF634932FFA17650FFC59163FFC59163FFC59163FFC59163FFC591
+      63FFC59163FFC59163FFC59163FFC59163FFC59163FFC59163FFC59163FFC591
+      63FFC59163FFC59163FFC59163FFC59163FFC59163FFC59163FFC59163FFC591
+      62FFC49063FFC28C60FFB67C53FF9F5C3AFF5D321CFF5B2F1BFF51382DE24444
+      44A844444471414141334E4E4E0D808080020000000000000000000000000000
+      000000000000404040043A3A3A1647403C4E5B2F1BFD5B2F1BFF7E4428FFAC6C
+      46FFBD855BFFC28D61FFC28E62FFC38E62FFC38E62FFC38E62FFC38E62FFC38E
+      62FFC38E62FFC38E62FFC38E62FFC38E62FFC38E62FFC38E62FF6F5138FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF4E3927FFC38E62FFC38E
+      62FFC38E62FFC38E62FFC38E62FFC38E62FF916A49FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF010000FF37281CFFA67953FFC38E
+      62FFC38E62FFC38E62FFC38E62FFC38E62FFC38E62FFC38E62FFC38E62FFC38E
+      62FFC38E62FFC38E62FFC38E62FFC38E62FFC38E62FFC38E62FFC38E62FFC38E
+      62FFC38E62FFC38E62FFC38E62FFC38E62FFC38E62FFC38E62FFC38E62FFC38E
+      62FFC28E61FFC18C60FFB98058FFA6633FFF6B3821FF5B2F1BFF563323F14444
+      44AF4444447B4242423A40404010808080020000000000000000000000000000
+      000000000001333333054545451A513A2F7A5B2F1BFF5C301BFF8E4D2FFFB072
+      4DFFBD875DFFC08B61FFC08B60FFC08B60FFC08B60FFC08B60FFC08B60FFC08B
+      60FFC08B60FFC08B60FFC08B60FFC08B60FFC08B60FFC08B60FF1A130DFF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF443122FFC08B60FFC08B
+      60FFC08B60FFC08B60FFC08B60FFC08B60FFC08B60FF0B0806FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF080604FF8F6848FFC08B60FFC08B60FFC08B
+      60FFC08B60FFC08B60FFC08B60FFC08B60FFC08B60FFC08B60FFC08B60FFC08B
+      60FFC08B60FFC08B60FFC08B60FFC08B60FFC08B60FFC08B60FFC08B60FFC08B
+      60FFC08B60FFC08B60FFC08B60FFC08B60FFC08B60FFC08B60FFC08B60FFC08B
+      60FFC08B60FFC08A61FFBB835AFFAA6945FF7B4227FF5B2F1BFF5A301CFD4444
+      44B6444444844343434143434313555555030000000000000000000000000000
+      000000000001494949074242421F5335289A5B2F1BFF5C301CFF995735FFB377
+      51FFBD855EFFBE885FFFBE885FFFBE885FFFBE885FFFBE885FFFBE885FFFBE88
+      5FFFBE885FFFBE885FFFBE885FFFBE885FFFBE885FFFB8845DFF010100FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF644832FFBE885FFFBE88
+      5FFFBE885FFFBE885FFFBE885FFFBE885FFFBE885FFF473323FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF020101FFA57753FFBE885FFFBE885FFFBE885FFFBE88
+      5FFFBE885FFFBE885FFFBE885FFFBE885FFFBE885FFFBE885FFFBE885FFFBE88
+      5FFFBE885FFFBE885FFFBE885FFFBE885FFFBE885FFFBE885FFFBE885FFFBE88
+      5FFFBE885FFFBE885FFFBE885FFFBE885FFFBE885FFFBE885FFFBE885FFFBE88
+      5FFFBE885FFFBE885FFFBB835CFFAD6E4AFF86482CFF5B2F1BFF5B2F1BFF4841
+      3DC24444448B4343434843434317404040040000000000000000000000000000
+      0000000000014040400844444422563424B65B2F1BFF60321DFFA05C39FFB57A
+      54FFBB845DFFBC855EFFBC865EFFBC865EFFBC865EFFBC865EFFBC865EFFBC86
+      5EFFBC865EFFBC865EFFBC865EFFBC865EFFBC865EFF684B34FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF020101FFA37552FFBC865EFFBC86
+      5EFFBC865EFFBC865EFFBC865EFFBC865EFFBC865EFFB4805AFF0D0906FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF634631FFBC865EFFBC865EFFBC865EFFBC865EFFBC86
+      5EFFBC865EFFBC865EFFBC865EFFBC865EFFBC865EFFBC865EFFBC865EFFBC86
+      5EFFBC865EFFBC865EFFBC865EFFBC865EFFBC865EFFBC865EFFBC865EFFBC86
+      5EFFBC865EFFBC865EFFBC865EFFBC865EFFBC865EFFBC865EFFBC865EFFBC86
+      5EFFBC865EFFBC855EFFBA835CFFB0734FFF904F2FFF5B2F1BFF5B2F1BFF4C3D
+      36CE4444448F4242424D4545451A333333050000000100000000000000000000
+      0000000000013939390945454525583220D15B2F1BFF6A3820FFA35F3DFFB57B
+      56FFBA825CFFBA825CFFBA825CFFBA825CFFBA825CFFBA825CFFBA825CFFBA82
+      5CFFBA825CFFBA825CFFBA825CFFBA825CFFBA825CFF231911FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF5F422FFFBA825CFFBA825CFFBA82
+      5CFFBA825CFFBA825CFFBA825CFFBA825CFFBA825CFFBA825CFFA37251FF0503
+      02FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF241A12FFBA825CFFBA825CFFBA825CFFBA825CFFBA825CFFBA82
+      5CFFBA825CFFBA825CFFBA825CFFBA825CFFBA825CFFBA825CFFBA825CFFBA82
+      5CFFBA825CFFBA825CFFBA825CFFBA825CFFBA825CFFBA825CFFBA825CFFBA82
+      5CFFBA825CFFBA825CFFBA825CFFBA825CFFBA825CFFBA825CFFBA825CFFBA82
+      5CFFBA825CFFBA825CFFB9815CFFB17652FF9B5635FF5C301CFF5B2F1BFF5039
+      2FD944444492424242514040401C555555060000000100000000000000000000
+      0000000000014D4D4D0A404040285A301DEA5B2F1BFF743C24FFA56240FFB57B
+      56FFB87F5AFFB87F5AFFB87F5AFFB87F5AFFB87F5AFFB87F5AFFB87F5AFFB87F
+      5AFFB87F5AFFB87F5AFFB87F5AFFB87F5AFFB87F5AFF040302FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF010101FF513828FFB87F5AFFB87F5AFFB87F5AFFB87F
+      5AFFB87F5AFFB87F5AFFB87F5AFFB87F5AFFB87F5AFFB87F5AFFB87F5AFF8E62
+      45FF030202FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF060403FFAE7956FFB87F5AFFB87F5AFFB87F5AFFB87F5AFFB87F5AFFB87F
+      5AFFB87F5AFFB87F5AFFB87F5AFFB87F5AFFB87F5AFFB87F5AFFB87F5AFFB87F
+      5AFFB87F5AFFB87F5AFFB87F5AFFB87F5AFFB87F5AFFB87F5AFFB87F5AFFB87F
+      5AFFB87F5AFFB87F5AFFB87F5AFFB87F5AFFB87F5AFFB87F5AFFB87F5AFFB87F
+      5AFFB87F5AFFB87F5AFFB77E5AFFB27754FF9F5938FF62331EFF5B2F1BFF5336
+      29E443434395434343544242421F494949070000000100000000000000000000
+      0000000000014646460B46403E2F5B2F1BFE5B2F1BFF7D4126FFA76744FFB47A
+      57FFB57C59FFB57C59FFB57C59FFB57C59FFB57C59FFB57C59FFB57C59FFB57C
+      59FFB57C59FFB57C59FFB57C59FFB57C59FF885D43FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF130D09FF97674AFFB57C59FFB57C59FFB57C59FFB57C59FFB57C
+      59FFB57C59FFB57C59FFB57C59FFB57C59FFB57C59FFB57C59FFB57C59FFB57C
+      59FFAB7655FF312218FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0100
+      00FF7D563EFFB57C59FFB57C59FFB57C59FFB57C59FFB57C59FFB57C59FFB57C
+      59FFB57C59FFB57C59FFB57C59FFB57C59FFB57C59FFB57C59FFB57C59FFB57C
+      59FFB57C59FFB57C59FFB57C59FFB57C59FFB57C59FFB57C59FFB57C59FFB57C
+      59FFB57C59FFB57C59FFB57C59FFB57C59FFB57C59FFB57C59FFB57C59FFB57C
+      59FFB57C59FFB57C59FFB57C59FFB27754FFA15D3BFF6B3820FF5B2F1BFF5633
+      23EE444444974343435746464621404040080000000100000000000000000000
+      0000000000024646460B4B3A333F5B2F1BFF5B2F1BFF83462AFFA96948FFB378
+      56FFB47A57FFB47B57FFB47B57FFB47B57FFB47B57FFB47B57FFB47B57FFB47B
+      57FFB47B57FFB47B57FFB47B57FFB47B57FF3C291DFF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0101
+      01FF4F3626FFB47B57FFB47B57FFB47B57FFB47B57FFB47B57FFB47B57FFB47B
+      57FFB47B57FFB47B57FFB47B57FFB47B57FFB47B57FFB47B57FFB47B57FFB47B
+      57FFB47B57FFB47B57FF8E6145FF1B130DFF020101FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF080504FF875D
+      41FFB47B57FFB47B57FFB47B57FFB47B57FFB47B57FFB47B57FFB47B57FFB47B
+      57FFB47B57FF704C36FF2B1D14FF281C13FF2A1C14FF2B1D15FF2D1E15FF6646
+      32FFB47B57FFB47B57FFB47B57FFB47B57FFB47B57FFB47B57FFB47B57FFB47B
+      57FFB47B57FFB47B57FFB47B57FFB47B57FFB47B57FFB47B57FFB47B57FFB47B
+      57FFB47B57FFB47B57FFB47A58FFB27655FFA35F3EFF723C22FF5B2F1BFF5832
+      21F3434343984242425944444422404040080000000100000000000000000000
+      0000000000024646460B4E382E4A5B2F1BFF5B2F1BFF87482CFFAA6B49FFB277
+      56FFB37958FFB37958FFB37958FFB37958FFB37958FFB37958FFB37958FFB379
+      58FFB37958FFB37958FFB37958FFB37958FF100B08FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF130D0AFF9666
+      4AFFB37958FFB37958FFB37958FFB37958FFB37958FFB37958FFB37958FFB379
+      58FFB37958FFB37958FFB37958FFB37958FFB37958FFB37958FFB37958FFB379
+      58FFB37958FFB37958FFB37958FFB37958FFB37958FF7E563EFF3D291EFF130D
+      09FF010101FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF241811FFAC7554FFB379
+      58FFB37958FFB37958FFB37958FFB37958FFB37958FFB37958FF9E6B4EFF3D29
+      1EFF060403FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF060403FF3F2B1FFFA46F50FFB37958FFB37958FFB37958FFB37958FFB379
+      58FFB37958FFB37958FFB37958FFB37958FFB37958FFB37958FFB37958FFB379
+      58FFB37958FFB37958FFB37958FFB17555FFA46240FF763F25FF5B2F1BFF5931
+      1FF6434343984242425944444422404040080000000100000000000000000000
+      0000000000014646460B51372B555B2F1BFF5C301CFF8B4A2DFFAB6C4CFFB177
+      57FFB27756FFB27756FFB27756FFB27756FFB27756FFB27756FFB27756FFB277
+      56FFB27756FFB27756FFB27756FFAC7354FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF010101FF4F3526FFB27756FFB277
+      56FFB27756FFB27756FFB27756FFB27756FFB27756FFB27756FFB27756FFB277
+      56FFB27756FFB27756FFB27756FFB27756FFB27756FFB27756FFB27756FFB277
+      56FFB27756FFB27756FFB27756FFB27756FFB27756FFB27756FFB27756FFB277
+      56FFB07756FF764F39FF37251BFF100A08FF010000FF000000FF000000FF0000
+      00FF000000FF000000FF0B0806FF39261CFF895C43FFB27756FFB27756FFB277
+      56FFB27756FFB27756FFB27756FFB27756FFB27756FF4D3325FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF010000FF342219FFB27756FFB27756FFB27756FFB277
+      56FFB27756FFB27756FFB27756FFB27756FFB27756FFB27756FFB27756FFB277
+      56FFB27756FFB27756FFB27756FFB07454FFA56343FF794127FF5B2F1BFF5A30
+      1DFA444444964343435746464621494949070000000100000000000000000000
+      0000000000014D4D4D0A5234275E5B2F1BFF5C301CFF8E4D2EFFAB6E4EFFB175
+      56FFB17758FFB17758FFB17758FFB17758FFB17758FFB17758FFB17758FFB177
+      58FFB17758FFB17758FFB17758FF674633FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF17100CFF98664BFFB17758FFB17758FFB177
+      58FFB17758FFB17758FFB17758FFB17758FFB17758FFB17758FFB17758FFB177
+      58FFB17758FFB17758FFB17758FFB17758FFB17758FFB17758FFB17758FFB177
+      58FFB17758FFB17758FFB17758FFB17758FFB17758FFB17758FFB17758FFB177
+      58FFB17758FFB17758FFB17758FFB17758FFAD7556FF885C44FF855942FF8358
+      41FF805640FF99674CFFB17758FFB17758FFB17758FFB17758FFB17758FFB177
+      58FFB17758FFB17758FFB17758FFB17758FF533829FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF221711FFAF7758FFB17758FFB177
+      58FFB17758FFB17758FFB17758FFB17758FFB17758FFB17758FFB17758FFB177
+      58FFB17758FFB17758FFB17758FFAF7455FFA66545FF7D4229FF5C301CFF5B2F
+      1CFD43434394434343544242421F494949070000000100000000000000000000
+      00000000000139393909563425685B2F1BFF5C301CFF914F30FFAB6D4EFFAF73
+      55FFAF7557FFAF7557FFAF7557FFAF7557FFAF7557FFAF7557FFAF7557FFAF75
+      57FFAF7557FFAF7557FFAF7557FF2A1D15FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF020101FF583B2CFFAF7557FFAF7557FFAF7557FFAF7557FFAF75
+      57FFAF7557FFAF7557FFAF7557FFAF7557FFAF7557FFAF7557FFAF7557FFAF75
+      57FFAF7557FFAF7557FFAF7557FFAF7557FFAF7557FFAF7557FFAF7557FFAF75
+      57FFAF7557FFAF7557FFAF7557FFAF7557FFAF7557FFAF7557FFAF7557FFAF75
+      57FFAF7557FFAF7557FFAF7557FFAF7557FFAF7557FFAF7557FFAF7557FFAF75
+      57FFAF7557FFAF7557FFAF7557FFAF7557FFAF7557FFAF7557FFAF7557FFAF75
+      57FFAF7557FFAF7557FFAF7557FF5E3F2FFF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF241812FFAF7557FFAF75
+      57FFAF7557FFAF7557FFAF7557FFAF7557FFAF7557FFAF7557FFAF7557FFAF75
+      57FFAF7557FFAF7557FFAF7557FFAF7354FFA66545FF80442AFF5C301CFF5B2F
+      1BFF45434295434343504040401C555555060000000100000000000000000000
+      00000000000140404008573323715B2F1BFF5C311DFF965131FFAB6D4EFFAE73
+      55FFAF7556FFAF7556FFAF7556FFAF7556FFAF7556FFAF7556FFAF7556FFAF75
+      56FFAF7556FFAF7556FFAF7556FF0F0A08FF000000FF000000FF000000FF0403
+      02FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF1D130EFF9C694DFFAF7556FFAF7556FFAF7556FFAF7556FFAF7556FFAF75
+      56FFAF7556FFAF7556FFAF7556FFAF7556FFAF7556FFAF7556FFAF7556FFAF75
+      56FFAF7556FFAF7556FFAF7556FFAF7556FFAF7556FFAF7556FFAF7556FFAF75
+      56FFAF7556FFAF7556FFAF7556FFAF7556FFAF7556FFAF7556FFAF7556FFAF75
+      56FFAF7556FFAF7556FFAF7556FFAF7556FFAF7556FFAF7556FFAF7556FFAF75
+      56FFAF7556FFAF7556FFAF7556FFAF7556FFAF7556FFAF7556FFAF7556FFAF75
+      56FFAF7556FFAF7556FFAF7556FF0B0706FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF734D39FFAF75
+      56FFAF7556FFAF7556FFAF7556FFAF7556FFAF7556FFAF7556FFAF7556FFAF75
+      56FFAF7556FFAF7556FFAF7456FFAE7253FFA76647FF83472CFF5C301CFF5B2F
+      1BFF47413F964343434C47474719333333050000000100000000000000000000
+      000000000001494949075733236B5B2F1BFF5C311DFF955032FFA96C4DFFAE71
+      54FFAF7456FFAF7456FFAF7456FFAF7456FFAF7456FFAF7456FFAF7456FFAF74
+      56FFAF7456FFAF7456FFAF7456FF090604FF000000FF000000FF000000FF885A
+      43FF54382AFF010100FF000000FF000000FF000000FF000000FF070503FF6241
+      30FFAF7456FFAF7456FFAF7456FFAF7456FFAF7456FFAF7456FFAF7456FFAF74
+      56FFAF7456FFAF7456FFAF7456FFAF7456FFAF7456FFAF7456FFAF7456FFAF74
+      56FFAF7456FFAF7456FFAF7456FFAF7456FFAF7456FFAF7456FFAF7456FFAF74
+      56FFAF7456FFAF7456FFAF7456FFAF7456FFAF7456FFAF7456FFAF7456FFAF74
+      56FFAF7456FFAF7456FFAF7456FFAF7456FFAF7456FFAF7456FFAF7456FFAF74
+      56FFAF7456FFAF7456FFAF7456FFAF7456FFAF7456FFAF7456FFAF7456FFAF74
+      56FFAF7456FFAF7456FFA56E52FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF0A0705FFAF74
+      56FFAF7456FFAF7456FFAF7456FFAF7456FFAF7456FFAF7456FFAF7456FFAF74
+      56FFAF7456FFAF7456FFAE7355FFAD7152FFA66547FF83462CFF5C301CFF5B2F
+      1BFF45413F914444444746464616404040040000000000000000000000000000
+      000000000001333333055733235C5B2F1BFF5C311DFF925033FFA86A4DFFAD70
+      54FFAD7255FFAD7255FFAD7255FFAD7255FFAD7255FFAD7255FFAD7255FFAD72
+      55FFAD7255FFAD7255FFAD7255FF040302FF000000FF000000FF150E0AFFAD72
+      55FFAD7255FF98644BFF644231FF412B20FF442D21FF8D5D45FFAD7255FFAD72
+      55FFAD7255FFAD7255FFAD7255FFAD7255FFAD7255FFAD7255FFAD7255FFAD72
+      55FFAD7255FFAD7255FFAD7255FFAD7255FFAD7255FFAD7255FFAD7255FFAD72
+      55FFAD7255FFAD7255FFAD7255FFAD7255FFAD7255FFAD7255FFAD7255FFAD72
+      55FFAD7255FFAD7255FFAD7255FFAD7255FFAD7255FFAD7255FFAD7255FFAD72
+      55FFAD7255FFAD7255FFAD7255FFAD7255FFAD7255FFAD7255FFAD7255FFAD72
+      55FFAD7255FFAD7255FFAD7255FFAD7255FFAD7255FFAD7255FFAD7255FFAD72
+      55FFAD7255FFAD7255FFA97053FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF8B5C
+      44FFAD7255FFAD7255FFAD7255FFAD7255FFAD7255FFAD7255FFAD7255FFAD72
+      55FFAD7255FFAD7255FFAD7154FFAC6F52FFA56346FF80452BFF5C301CFF5B2F
+      1BFF434241844444444043434313555555030000000000000000000000000000
+      000000000000404040045532224C5B2F1BFF5C311DFF8F4E33FFA8684BFFAC6F
+      54FFAD7155FFAD7256FFAD7256FFAD7256FFAD7256FFAD7256FFAD7256FFAD72
+      56FFAD7256FFAD7256FFAD7256FF010101FF000000FF000000FF6E4937FFAD72
+      56FFAD7256FFAD7256FFAD7256FFAD7256FFAD7256FFAD7256FFAD7256FFAD72
+      56FFAD7256FFAD7256FFAD7256FFAD7256FFAD7256FFAD7256FFAD7256FFAD72
+      56FFAD7256FFAD7256FFAD7256FFAD7256FFAD7256FFAD7256FFAD7256FFAD72
+      56FFAD7256FFAD7256FFAD7256FFAD7256FFAD7256FFAD7256FFAD7256FFAD72
+      56FFAD7256FFAD7256FFAD7256FFAD7256FFAD7256FFAD7256FFAD7256FFAD72
+      56FFAD7256FFAD7256FFAD7256FFAD7256FFAD7256FFAD7256FFAD7256FFAD72
+      56FFAD7256FFAD7256FFAD7256FFAD7256FFAD7256FFAD7256FFAD7256FFAD72
+      56FFAD7256FFAD7256FFAD7256FF020101FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF4830
+      24FFAD7256FFAD7256FFAD7256FFAD7256FFAD7256FFAD7256FFAD7256FFAD72
+      56FFAD7256FFAD7256FFAD7155FFAB6E51FFA56446FF7E442BFF5C311DFF5A30
+      1CFC4343437A4343433940404010808080020000000000000000000000000000
+      000000000000555555035432233D5B2F1BFF5C311DFF8C4E31FFA66749FFAB6F
+      52FFAD7155FFAD7155FFAD7155FFAD7155FFAD7155FFAD7155FFAD7155FFAD71
+      55FFAD7155FFAD7155FFAD7155FF010101FF1B120DFF614030FFAD7155FFAD71
+      55FFAD7155FFAD7155FFAD7155FFAD7155FFAD7155FFAD7155FFAD7155FFAD71
+      55FFAD7155FFAD7155FFAD7155FFAD7155FFAD7155FFAD7155FFAD7155FFAD71
+      55FFAD7155FFAD7155FFAD7155FFAD7155FFAD7155FFAD7155FFAD7155FFAD71
+      55FFAD7155FFAD7155FFAD7155FFAD7155FFAD7155FFAD7155FFAD7155FFAD71
+      55FFAD7155FFAD7155FFAD7155FFAD7155FFAD7155FFAD7155FFAD7155FFAD71
+      55FFAD7155FFAD7155FFAD7155FFAD7155FFAD7155FFAD7155FFAD7155FFAD71
+      55FFAD7155FFAD7155FFAD7155FFAD7155FFAD7155FFAD7155FFAD7155FFAD71
+      55FFAD7155FFAD7155FFAD7155FF241812FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF1F14
+      0FFFAD7155FFAD7155FFAD7155FFAD7155FFAD7155FFAD7155FFAD7155FFAD71
+      55FFAD7155FFAD7155FFAC7054FFA96C50FFA46144FF7B432AFF5C311DFF5930
+      1EF74343436F424242323B3B3B0D000000020000000000000000000000000000
+      000000000000808080025636272D5B2F1BFF5C311DFF894C30FFA56648FFAA6D
+      51FFAC7054FFAC7055FFAC7055FFAC7055FFAC7055FFAC7055FFAC7055FFAC70
+      55FFAC7055FFAC7055FFAC7055FFA66C53FFAC7055FFAC7055FFAC7055FFAC70
+      55FFAC7055FFAC7055FFAC7055FFAC7055FFAC7055FFAC7055FFAC7055FFAC70
+      55FFAC7055FFAC7055FFAC7055FFAC7055FFAC7055FFAC7055FFAC7055FFAC70
+      55FFAC7055FFAC7055FFAC7055FFAC7055FFA86E53FF865742FF624030FF744B
+      39FFA66C53FFAC7055FFAC7055FFAC7055FFAC7055FFAC7055FFAC7055FFAC70
+      55FFAC7055FFAC7055FFAC7055FFAC7055FFAC7055FFAC7055FFAC7055FFAC70
+      55FFAC7055FFAC7055FFAC7055FFAC7055FFAC7055FFAC7055FFAC7055FFAC70
+      55FFAC7055FFAC7055FFAC7055FFAC7055FFAC7055FFAC7055FFAC7055FFAC70
+      55FFAC7055FFAC7055FFAC7055FF815440FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF160E
+      0BFFAC7055FFAC7055FFAC7055FFAC7055FFAC7055FFAC7055FFAC7055FFAC70
+      55FFAC7055FFAC7055FFAC6F54FFAA6D50FFA36043FF78422AFF5C311DFF5931
+      1FF1424242644343432A4D4D4D0A000000010000000000000000000000000000
+      0000000000000000000254372A1D5B2F1BFF5C311DFF864A30FFA56447FFA96C
+      51FFAB7055FFAC7157FFAC7157FFAC7157FFAC7157FFAC7157FFAC7157FFAC71
+      57FFAC7157FFAC7157FFAC7157FFAC7157FFAC7157FFAC7157FFAC7157FFAC71
+      57FFAC7157FFAC7157FFAC7157FFAC7157FFAC7157FFAC7157FFAC7157FFAC71
+      57FFAC7157FFAC7157FFAC7157FFAC7157FFAC7157FFAC7157FFAC7157FFAC71
+      57FFAC7157FF875944FF241812FF030202FF000000FF000000FF000000FF0000
+      00FF000000FF080504FF1E1410FF784F3DFFAC7157FFAC7157FFAC7157FFAC71
+      57FFAC7157FFAC7157FFAC7157FFAC7157FFAC7157FFAC7157FFAC7157FFAC71
+      57FFAC7157FFAC7157FFAC7157FFAC7157FFAC7157FFAC7157FFAC7157FFAC71
+      57FFAC7157FFAC7157FFAC7157FFAC7157FFAC7157FFAC7157FFAC7157FFAC71
+      57FFAC7157FFAC7157FFAC7157FFAC7157FF0E0907FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF140D
+      0AFFAC7157FFAC7157FFAC7157FFAC7157FFAC7157FFAC7157FFAC7157FFAC71
+      57FFAC7157FFAC7157FFAB6F54FFA96A4DFFA25F41FF733E27FF5C311DFF5832
+      20EA434343584444442240404008000000010000000000000000000000000000
+      00000000000000000001433E3C095B2F1BF75C311DFF7D462DFFA46245FFA96C
+      4FFFAB7054FFAC7156FFAC7156FFAC7156FFAC7156FFAC7156FFAC7156FFAC71
+      56FFAC7156FFAC7156FFAC7156FFAC7156FFAC7156FFAC7156FFAC7156FFAC71
+      56FFAC7156FFAC7156FFAC7156FFAC7156FFAC7156FFAC7156FFAC7156FFAC71
+      56FFAC7156FFAC7156FFAC7156FFAC7156FFAC7156FFAC7156FFAC7156FF9A65
+      4DFF160F0BFF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF19110DFF885A45FFAC7156FFAC71
+      56FFAC7156FFAC7156FFAC7156FFAC7156FFAC7156FFAC7156FFAC7156FFAC71
+      56FFAC7156FFAC7156FFAC7156FFAC7156FFAC7156FFAC7156FFAC7156FFAC71
+      56FFAC7156FFAC7156FFAC7156FFAC7156FFAC7156FFAC7156FFAC7156FFAC71
+      56FFAC7156FFAC7156FFAC7156FFAC7156FF55372AFF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF110B
+      09FFAC7156FFAC7156FFAC7156FFAC7156FFAC7156FFAC7156FFAC7156FFAC71
+      56FFAC7156FFAC7156FFAB6F54FFA86A4DFFA15E40FF6B3B25FF5C301CFF5633
+      23DC4343434C4545451A33333305000000010000000000000000000000000000
+      000000000000000000002B2B2B065B2F1CD65C311DFF744029FFA26042FFA86A
+      4FFFAC7056FFAD7258FFAD7258FFAD7258FFAD7258FFAD7258FFAD7258FFAD72
+      58FFAD7258FFAD7258FFAD7258FFAD7258FFAD7258FFAD7258FFAD7258FFAD72
+      58FFAD7258FFAD7258FFAD7258FFAD7258FFAD7258FFAD7258FFAD7258FFAD72
+      58FFAD7258FFAD7258FFAD7258FFAD7258FFAD7258FFAD7258FF905F49FF0604
+      03FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF5A3B2DFFAD72
+      58FFAD7258FFAD7258FFAD7258FFAD7258FFAD7258FFAD7258FFAD7258FFAD72
+      58FFAD7258FFAD7258FFAD7258FFAD7258FFAD7258FFAD7258FFAD7258FFAD72
+      58FFAD7258FFAD7258FFAD7258FFAD7258FFAD7258FFAD7258FFAD7258FFAD72
+      58FFAD7258FFAD7258FFAD7258FFAD7258FFAB7056FF030201FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF2116
+      11FFAD7258FFAD7258FFAD7258FFAD7258FFAD7258FFAD7258FFAD7258FFAD72
+      58FFAD7258FFAC7158FFAB6F55FFA7684DFFA05B3EFF623521FF5C301CFF5335
+      27C44545453F4343431340404004000000000000000000000000000000000000
+      00000000000000000000555555035A301DB05C311DFF6B3A25FFA25E41FFA96A
+      4EFFAD7156FFAE7359FFAE7359FFAE7359FFAE7359FFAE7359FFAE7359FFAE73
+      59FFAE7359FFAE7359FFAE7359FFAE7359FFAE7359FFAE7359FFAE7359FFAE73
+      59FFAE7359FFAE7359FFAE7359FFAE7359FFAE7359FFAE7359FFAE7359FFAE73
+      59FFAE7359FFAE7359FFAE7359FFAE7359FFAE7359FF97644DFF040202FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF010101FF8859
+      46FFAE7359FFAE7359FFAE7359FFAE7359FFAE7359FFAE7359FFAE7359FFAE73
+      59FFAE7359FFAE7359FFAE7359FFAE7359FFAE7359FFAE7359FFAE7359FFAE73
+      59FFAE7359FFAE7359FFAE7359FFAE7359FFAE7359FFAE7359FFAE7359FFAE73
+      59FFAE7359FFAE7359FFAE7359FFAE7359FFAE7359FF35231BFF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF472E
+      24FFAE7359FFAE7359FFAE7359FFAE7359FFAE7359FFAE7359FFAE7359FFAE73
+      59FFAE7359FFAE7359FFAC7056FFA7674BFF99583AFF5E331FFF5C301CFF5137
+      2BA6424242323737370E00000002000000000000000000000000000000000000
+      00000000000000000000000000025A301D895C301CFF613521FFA05D3EFFA86A
+      4EFFAD7359FFAF765CFFAF765CFFAF765CFFAF765CFFAF765CFFAF765CFFAF76
+      5CFFAF765CFFAF765CFFAF765CFFAF765CFFAF765CFFAF765CFFAF765CFFAF76
+      5CFFAF765CFFAF765CFFAF765CFFAF765CFFAF765CFFAF765CFFAF765CFFAF76
+      5CFFAF765CFFAF765CFFAF765CFFAF765CFFAF765CFF1D140FFF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0805
+      04FFA97258FFAF765CFFAF765CFFAF765CFFAF765CFFAF765CFFAF765CFFAF76
+      5CFFAF765CFFAF765CFFAF765CFFAF765CFFAF765CFFAF765CFFAF765CFFAF76
+      5CFFAF765CFFAF765CFFAF765CFFAF765CFFAF765CFFAF765CFFAF765CFFAF76
+      5CFFAF765CFFAF765CFFAF765CFFAF765CFFAF765CFF9C6A52FF010000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF7951
+      3FFFAF765CFFAF765CFFAF765CFFAF765CFFAF765CFFAF765CFFAF765CFFAF76
+      5CFFAF765CFFAE755BFFAC7156FFA6674AFF8F5336FF5E321FFF5B2F1BFF4F3B
+      3282434343263939390900000001000000000000000000000000000000000000
+      00000000000000000000000000015A301D615C301CFF5E331FFF99573BFFA86A
+      4EFFAE745AFFB0785FFFB0795FFFB0795FFFB0795FFFB0795FFFB0795FFFB079
+      5FFFB0795FFFB0795FFFB0795FFFB0795FFFB0795FFFB0795FFFB0795FFFB079
+      5FFFB0795FFFB0795FFFB0795FFFB0795FFFB0795FFFB0795FFFB0795FFFB079
+      5FFFB0795FFFB0795FFFB0795FFFB0795FFF6F4C3DFF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF5D4032FFB0795FFFB0795FFFB0795FFFB0795FFFB0795FFFB0795FFF5A3D
+      31FF291C16FF1A120EFF0E0A08FF0A0705FF17100CFF2B1E17FF453026FF8A5F
+      4AFFB0795FFFB0795FFFB0795FFFB0795FFFB0795FFFB0795FFFB0795FFFB079
+      5FFFB0795FFFB0795FFFB0795FFFB0795FFFB0795FFFB0795FFF231813FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FFAC77
+      5DFFB0795FFFB0795FFFB0795FFFB0795FFFB0795FFFB0795FFFB0795FFFB079
+      5FFFB0795FFFAF775EFFAC7257FFA56649FF864B32FF5D311EFF5B2F1BFF483F
+      3A5A4242421B2B2B2B0600000000000000000000000000000000000000000000
+      0000000000000000000000000000582F1D375B2F1BFF5E321FFF8D5035FFA768
+      4BFFAE7359FFB1785FFFB17A61FFB17A61FFB17A61FFB17A61FFB17A61FFB17A
+      61FFB17A61FFB17A61FFB17A61FFB17A61FFB17A61FFB17A61FFB17A61FFB17A
+      61FFB17A61FFB17A61FFB17A61FFB17A61FFB17A61FFB17A61FFB17A61FFB17A
+      61FFB17A61FFB17A61FFB17A61FFB17A61FF090605FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF251914FFB17A61FFB17A61FFB17A61FFB17A61FF624436FF080604FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF3E2B22FFAF7A61FFB17A61FFB17A61FFB17A61FFB17A61FFB17A61FFB17A
+      61FFB17A61FFB17A61FFB17A61FFB17A61FFB17A61FFB17A61FF885E4BFF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF100B09FFB17A
+      61FFB17A61FFB17A61FFB17A61FFB17A61FFB17A61FFB17A61FFB17A61FFB17A
+      61FFB17A61FFB0785EFFAC7156FFA46346FF7B452CFF5D311EFF5A301DF54444
+      443C474747125555550300000000000000000000000000000000000000000000
+      0000000000000000000000000000583F34075B2F1BF35D311EFF7D472FFFA565
+      48FFAE7359FFB27A62FFB37D64FFB37D64FFB37D64FFB37D64FFB37D64FFB37D
+      64FFB37D64FFB37D64FFB37D64FFB37D64FFB37D64FFB37D64FFB37D64FFB37D
+      64FFB37D64FFB37D64FFB37D64FFB37D64FFB37D64FFB37D64FFB37D64FFB37D
+      64FFB37D64FFB37D64FFB37D64FF9E6F58FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF261A15FFB37D64FFB37D64FFB37D64FF6B4B3BFF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF0C0806FF895F4CFFB37D64FFB37D64FFB37D64FFB37D64FFB37D
+      64FFB37D64FFB37D64FFB37D64FFB37D64FFB37D64FFB37D64FFB37D64FF140E
+      0BFF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF765242FFB37D
+      64FFB37D64FFB37D64FFB37D64FFB37D64FFB37D64FFB37D64FFB37D64FFB37D
+      64FFB37D64FFB17960FFAC7055FFA36143FF693B26FF5C311DFF573221CE4646
+      462C4040400C0000000200000000000000000000000000000000000000000000
+      0000000000000000000000000000000000015B2F1BB85C311DFF6C3C27FFA462
+      45FFAD7258FFB37C63FFB47F67FFB57F67FFB57F67FFB57F67FFB57F67FFB57F
+      67FFB57F67FFB57F67FFB57F67FFB57F67FFB57F67FFB57F67FFB57F67FFB57F
+      67FFB57F67FFB57F67FFB57F67FFB57F67FFB57F67FFB57F67FFB57F67FFB57F
+      67FFB57F67FFB57F67FFB57F67FF5F4336FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF51392EFFB57F67FFB57F67FF986B57FF020101FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF030202FF976A56FFB57F67FFB57F67FFB57F67FFB57F
+      67FFB57F67FFB57F67FFB57F67FFB57F67FFB57F67FFB57F67FFB57F67FF7350
+      41FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF17100DFFB57F67FFB57F
+      67FFB57F67FFB57F67FFB57F67FFB57F67FFB57F67FFB57F67FFB57F67FFB57F
+      67FFB47F67FFB17A61FFAB6E53FF9C5B3EFF603521FF5C301CFF5435279B4444
+      441E494949070000000100000000000000000000000000000000000000000000
+      0000000000000000000000000000000000005A2F1C775C301CFF603521FF9D5C
+      3FFFAC7055FFB37D64FFB58169FFB6816AFFB6816AFFB6816AFFB6816AFFB681
+      6AFFB6816AFFB6816AFFB6816AFFB6816AFFB6816AFFB6816AFFB6816AFFB681
+      6AFFB6816AFFB6816AFFB6816AFFB6816AFFB6816AFFB6816AFFB6816AFFB681
+      6AFFB6816AFFB6816AFFB6816AFF2E211BFF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0201
+      01FFA67661FFB6816AFFB6816AFF412E26FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF090605FFAA7964FFB6816AFFB6816AFFB681
+      6AFFB6816AFFB6816AFFB6816AFFB6816AFFB6816AFFB6816AFFB6816AFFB681
+      6AFF080605FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF87604FFFB6816AFFB681
+      6AFFB6816AFFB6816AFFB6816AFFB6816AFFB6816AFFB6816AFFB6816AFFB681
+      6AFFB58068FFB17A61FFA96B50FF8B5137FF5E331FFF5C301CFF4E392F5C4747
+      4712555555030000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000582E1A345C301CFF5E331FFF8D53
+      38FFAA6D51FFB37C63FFB6826BFFB8846DFFB8846DFFB8846DFFB8846DFFB884
+      6DFFB8846DFFB8846DFFB8846DFFB8846DFFB8846DFFB8846DFFB8846DFFB884
+      6DFFB8846DFFB8846DFFB8846DFFB8846DFFB8846DFFB8846DFFB8846DFFB884
+      6DFFB8846DFFB8846DFFB8846DFF140F0CFF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF4E38
+      2EFFB8846DFFB8846DFFB8846DFF16100DFF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF150F0DFFB6826DFFB8846DFFB884
+      6DFFB8846DFFB8846DFFB8846DFFB8846DFFB8846DFFB8846DFFB8846DFFB884
+      6DFF4E382EFF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF17110DFFB8846DFFB8846DFFB884
+      6DFFB8846DFFB8846DFFB8846DFFB8846DFFB8846DFFB8846DFFB8846DFFB783
+      6CFFB6816AFFB1785FFFA7684BFF7A472FFF5D311EFF5A301CF1404040284D4D
+      4D0A000000010000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000003D1F12035B2F1BEE5D311EFF7B47
+      2FFFA7684CFFB17A61FFB7836CFFB98670FFB98670FFB98670FFB98670FFB986
+      70FFB98670FFB98670FFB98670FFB98670FFB98670FFB98670FFB98670FFB986
+      70FFB98670FFB98670FFB98670FFB98670FFB98670FFB98670FFB98670FFB986
+      70FFB98670FFB98670FFB98670FF1A1310FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF0C0907FFB986
+      70FFB98670FFB98670FFB98670FF030202FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF553E34FFB98670FFB986
+      70FFB98670FFB98670FFB98670FFB98670FFB98670FFB98670FFB98670FFB986
+      70FFB98670FF19120FFF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF785749FFB98670FFB98670FFB986
+      70FFB98670FFB98670FFB98670FFB98670FFB98670FFB98670FFB98670FFB886
+      6FFFB6816AFFAF765CFFA56447FF683B26FF5C311DFF583220C13D3D3D192B2B
+      2B06000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000000000005B2F1BAA5C311DFF6639
+      25FFA46247FFAF765DFFB7836CFFBA8772FFBA8973FFBA8973FFBA8973FFBA89
+      73FFBA8973FFBA8973FFBA8973FFBA8973FFBA8973FFBA8973FFBA8973FFBA89
+      73FFBA8973FFBA8973FFBA8973FFBA8973FFBA8973FFBA8973FFBA8973FFBA89
+      73FFBA8973FFBA8973FFBA8973FF241B17FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF815F50FFBA89
+      73FFBA8973FFBA8973FFBA8973FF010101FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF201713FFBA8973FFBA89
+      73FFBA8973FFBA8973FFBA8973FFBA8973FFBA8973FFBA8973FFBA8973FFBA89
+      73FFBA8973FFAC7F6AFF070504FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF0C0907FFBA8973FFBA8973FFBA8973FFBA89
+      73FFBA8973FFBA8973FFBA8973FFBA8973FFBA8973FFBA8973FFBA8973FFB987
+      71FFB58169FFAD7157FF95583DFF603521FF5C301CFF5634257F3333330F0000
+      0003000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000000000005A2F1B4F5C301CFF5F34
+      20FF90553AFFAC7156FFB6826BFFBB8974FFBC8B75FFBC8C76FFBC8C76FFBC8C
+      76FFBC8C76FFBC8C76FFBC8C76FFBC8C76FFBC8C76FFBC8C76FFBC8C76FFBC8C
+      76FFBC8C76FFBC8C76FFBC8C76FFBC8C76FFBC8C76FFBC8C76FFBC8C76FFBC8C
+      76FFBC8C76FFBC8C76FFBC8C76FF31241FFF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF3A2B24FFBC8C76FFBC8C
+      76FFBC8C76FFBC8C76FFBC8C76FF010101FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF040303FFBC8C76FFBC8C
+      76FFBC8C76FFBC8C76FFBC8C76FFBC8C76FFBC8C76FFBC8C76FFBC8C76FFBC8C
+      76FFBC8C76FFBC8C76FFBC8C76FF7D5D4EFF362822FF0E0B09FF000000FF0000
+      00FF000000FF000000FF000000FF533E35FFBC8C76FFBC8C76FFBC8C76FFBC8C
+      76FFBC8C76FFBC8C76FFBC8C76FFBC8C76FFBC8C76FFBC8C76FFBC8B75FFBA88
+      72FFB47E66FFA96B50FF7C4831FF5E321FFF5B2F1BF94C3D362B494949070000
+      0001000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000000000005B2F1B055B2F1BEB5D31
+      1EFF77442FFFA96A4FFFB47F67FFBB8975FFBD8D78FFBD8E79FFBD8E79FFBD8E
+      79FFBD8E79FFBD8E79FFBD8E79FFBD8E79FFBD8E79FFBD8E79FFBD8E79FFBD8E
+      79FFBD8E79FFBD8E79FFBD8E79FFBD8E79FFBD8E79FFBD8E79FFBD8E79FFBD8E
+      79FFBD8E79FFBD8E79FFBD8E79FF4A372FFF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF100C0BFFBB8C79FFBD8E79FFBD8E
+      79FFBD8E79FFBD8E79FFBD8E79FF010101FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FFB58875FFBD8E
+      79FFBD8E79FFBD8E79FFBD8E79FFBD8E79FFBD8E79FFBD8E79FFBD8E79FFBD8E
+      79FFBD8E79FFBD8E79FFBD8E79FFBD8E79FFBD8E79FFBD8E79FF0B0807FF0000
+      00FF000000FF000000FF010101FFB58873FFBD8E79FFBD8E79FFBD8E79FFBD8E
+      79FFBD8E79FFBD8E79FFBD8E79FFBD8E79FFBD8E79FFBD8E79FFBD8D78FFBA88
+      71FFB17A61FFA46447FF663A26FF5C311DFF59311FBA40404010555555030000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000000000000000000000000000005A2F1B935C31
+      1DFF623824FFA06246FFB17960FFBA8973FFBE8F7AFFBF917CFFBF917CFFBF91
+      7CFFBF917CFFBF917CFFBF917CFFBF917CFFBF917CFFBF917CFFBF917CFFBF91
+      7CFFBF917CFFBF917CFFBF917CFFBF917CFFBF917CFFBF917CFFBF917CFFBF91
+      7CFFBF917CFFBF917CFFBF917CFFA27B69FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF010101FFA27B69FFBF917CFFBF917CFFBF91
+      7CFFBF917CFFBF917CFFBF917CFF020101FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF010101FFBF917CFFBF91
+      7CFFBF917CFFBF917CFFBF917CFFBF917CFFBF917CFFBF917CFFBF917CFFBF91
+      7CFFBF917CFFBF917CFFBF917CFFBF917CFFBF917CFFBF917CFF050403FF0000
+      00FF000000FF000000FF261D19FFBF917CFFBF917CFFBF917CFFBF917CFFBF91
+      7CFFBF917CFFBF917CFFBF917CFFBF917CFFBF917CFFBF917CFFBD8E79FFB886
+      6FFFAE7359FF8F553BFF603521FF5C301CFF5533246040404008000000010000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000000000000000000000000000005A2E1B355C30
+      1CFF5F3420FF895138FFAD7258FFB8866FFFBE907BFFC0937FFFC0937FFFC093
+      7FFFC0937FFFC0937FFFC0937FFFC0937FFFC0937FFFC0937FFFC0937FFFC093
+      7FFFC0937FFFC0937FFFC0937FFFC0937FFFC0937FFFC0937FFFC0937FFFC093
+      7FFFC0937FFFC0937FFFC0937FFFC0937FFF0E0B09FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF201815FFC0937FFFC0937FFFC0937FFFC093
+      7FFFC0937FFFC0937FFFC0937FFF040303FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF080605FFC0937FFFC093
+      7FFFC0937FFFC0937FFFC0937FFFC0937FFFC0937FFFC0937FFFC0937FFFC093
+      7FFFC0937FFFC0937FFFC0937FFFC0937FFFC0937FFFC0937FFF010100FF0000
+      00FF000000FF000000FF89695AFFC0937FFFC0937FFFC0937FFFC0937FFFC093
+      7FFFC0937FFFC0937FFFC0937FFFC0937FFFC0937FFFC0927EFFBD8E79FFB681
+      6AFFA96C50FF75442EFF5E321FFF5B2F1CED4E46421555555503000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000005B2F
+      1BD35D311EFF6C3E29FFA7694DFFB57F67FFBE8F7AFFC19480FFC29582FFC295
+      82FFC29582FFC29582FFC29582FFC29582FFC29582FFC29582FFC29582FFC295
+      82FFC29582FFC29582FFC29582FFC29582FFC29582FFC29582FFC29582FFC295
+      82FFC29582FFC29582FFC29582FFC29582FF473630FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF5A453CFFC29582FFC29582FFC29582FFC295
+      82FFC29582FFC29582FFC29582FF070605FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF17110FFFC29582FFC295
+      82FFC29582FFC29582FFC29582FFC29582FFC29582FFC29582FFC29582FFC295
+      82FFC29582FFC29582FFC29582FFC29582FFC29582FFB38978FF000000FF0000
+      00FF000000FF2D231EFFC29582FFC29582FFC29582FFC29582FFC29582FFC295
+      82FFC29582FFC29582FFC29582FFC29582FFC29582FFC0937FFFBC8C76FFB17A
+      61FF9C5F44FF613623FF5C311DFF59311F994040400800000001000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000005A2F
+      1B5D5C301CFF603521FF8F563DFFAF765DFFBB8A75FFC19581FFC39884FFC398
+      85FFC39885FFC39885FFC39885FFC39885FFC39885FFC39885FFC39885FFC398
+      85FFC39885FFC39885FFC39885FFC39885FFC39885FFC39885FFC39885FFC398
+      85FFC39885FFC39885FFC39885FFC39885FFAA8574FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FFAC8575FFC39885FFC39885FFC39885FFC398
+      85FFC39885FFC39885FF927264FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF5F4A41FFC39885FFC398
+      85FFC39885FFC39885FFC39885FFC39885FFC39885FFC39885FFC39885FFC398
+      85FFC39885FFC39885FFC39885FFC39885FFC39885FF8C6D60FF000000FF0000
+      00FF060504FFBA917FFFC39885FFC39885FFC39885FFC39885FFC39885FFC398
+      85FFC39885FFC39885FFC39885FFC39885FFC39884FFC0937FFFB98670FFAC70
+      55FF7C4932FF5E331FFF5C301CFA523528295555550300000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000005B2F
+      1B035B2F1BDD5D311EFF6F412CFFA96C50FFB7836CFFC0937FFFC49A87FFC59B
+      88FFC59B88FFC59B88FFC59B88FFC59B88FFC59B88FFC59B88FFC59B88FFC59B
+      88FFC59B88FFC59B88FFC59B88FFC59B88FFC59B88FFC59B88FFC59B88FFC59B
+      88FFC59B88FFC59B88FFC59B88FFC59B88FFC59B88FF1A1412FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF080605FFC59B88FFC59B88FFC59B88FFC59B88FFC59B
+      88FFC59B88FFC59B88FF1C1613FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF040303FFC19986FFC59B88FFC59B
+      88FFC59B88FFC59B88FFC59B88FFC59B88FFC59B88FFC59B88FFC59B88FFC59B
+      88FFC59B88FFC59B88FFC59B88FFC59B88FFC59B88FFB68F7EFF3D302AFF0705
+      05FF826659FFC59B88FFC59B88FFC59B88FFC59B88FFC59B88FFC59B88FFC59B
+      88FFC59B88FFC59B88FFC59B88FFC49A88FFC39885FFBE907BFFB47E66FF9F62
+      47FF633825FF5C311DFF5A301EA3494949070000000100000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00005B2F1B675C301CFF613623FF935940FFB17A61FFBE8F7AFFC49A87FFC69D
+      8BFFC69D8BFFC69D8BFFC69D8BFFC69D8BFFC69D8BFFC69D8BFFC69D8BFFC69D
+      8BFFC69D8BFFC69D8BFFC69D8BFFC69D8BFFC69D8BFFC69D8BFFC69D8BFFC69D
+      8BFFC69D8BFFC69D8BFFC69D8BFFC69D8BFFC69D8BFF3C302BFF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF2A211DFFC69D8BFFC69D8BFFC69D8BFFC69D8BFFC69D
+      8BFFC69D8BFFA48273FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF3F322CFFC69D8BFFC69D8BFFC69D
+      8BFFC69D8BFFC69D8BFFC69D8BFFC69D8BFFC69D8BFFC69D8BFFC69D8BFFC69D
+      8BFFC69D8BFFC69D8BFFC69D8BFFC69D8BFFC69D8BFFC69D8BFFC69D8BFFC69D
+      8BFFC69D8BFFC69D8BFFC69D8BFFC69D8BFFC69D8BFFC69D8BFFC69D8BFFC69D
+      8BFFC69D8BFFC69D8BFFC69D8BFFC69C8AFFC39884FFBB8A74FFAD7359FF7F4C
+      35FF5E331FFF5C301CFC5533242C808080020000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00005B2F1B075B2F1BE55E321FFF71422EFFAB6E53FFB98670FFC29783FFC69E
+      8CFFC8A08EFFC8A08EFFC8A08EFFC8A08EFFC8A08EFFC8A08EFFC8A08EFFC8A0
+      8EFFC8A08EFFC8A08EFFC8A08EFFC8A08EFFC8A08EFFC8A08EFFC8A08EFFC8A0
+      8EFFC8A08EFFC8A08EFFC8A08EFFC8A08EFFC8A08EFF392E29FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF68534AFFC8A08EFFC8A08EFFC8A08EFFC8A08EFFC8A0
+      8EFFC8A08EFF362B27FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF060505FFB89483FFC8A08EFFC8A08EFFC8A0
+      8EFFC8A08EFFC8A08EFFC8A08EFFC8A08EFFC8A08EFFC8A08EFFC8A08EFFC8A0
+      8EFFC8A08EFFC8A08EFFC8A08EFFC8A08EFFC8A08EFFC8A08EFFC8A08EFFC8A0
+      8EFFC8A08EFFC8A08EFFC8A08EFFC8A08EFFC8A08EFFC8A08EFFC8A08EFFC8A0
+      8EFFC8A08EFFC8A08EFFC79F8DFFC69D8BFFC0937FFFB57F67FFA16449FF643A
+      26FF5C311DFF5A301DAB40404004000000010000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000005B2F1B715C311DFF613623FF8F573FFFB17A61FFBF907CFFC69D
+      8BFFC8A190FFC9A291FFC9A391FFC9A391FFC9A391FFC9A391FFC9A391FFC9A3
+      91FFC9A391FFC9A391FFC9A391FFC9A391FFC9A391FFC9A391FFC9A391FFC9A3
+      91FFC9A391FFC9A391FFC9A391FFC9A391FFC9A391FF3D322CFF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF211B18FFC5A18FFFC9A391FFC9A391FFC9A391FFC9A391FFC9A3
+      91FFC5A18FFF030202FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF010101FF957A6CFFC9A391FFC9A391FFC9A391FFC9A3
+      91FFC9A391FFC9A391FFC9A391FFC9A391FFC9A391FFC9A391FFC9A391FFC9A3
+      91FFC9A391FFC9A391FFC9A391FFC9A391FFC9A391FFC9A391FFC9A391FFC9A3
+      91FFC9A391FFC9A391FFC9A391FFC9A391FFC9A391FFC9A391FFC9A391FFC9A3
+      91FFC9A391FFC9A291FFC8A18FFFC59B88FFBB8A75FFAD7258FF7C4933FF5F34
+      20FF5C301CFD5731203200000001000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000005B2F1B065C301CD85E321FFF693D29FFA56A50FFB8856EFFC498
+      86FFC9A291FFCAA494FFCAA594FFCAA594FFCAA594FFCAA594FFCAA594FFCAA5
+      94FFCAA594FFCAA594FFCAA594FFCAA594FFCAA594FFCAA594FFCAA594FFCAA5
+      94FFCAA594FFCAA594FFCAA594FFCAA594FFCAA594FF453832FF000000FF0000
+      00FF000000FF000000FF020202FF010101FF000000FF000000FF000000FF0000
+      00FF2E2622FFCAA594FFCAA594FFCAA594FFCAA594FFCAA594FFCAA594FFCAA5
+      94FF92776BFF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF655249FFCAA594FFCAA594FFCAA594FFCAA594FFCAA5
+      94FFCAA594FFCAA594FFCAA594FFCAA594FFCAA594FFCAA594FFCAA594FFCAA5
+      94FFCAA594FFCAA594FFCAA594FFCAA594FFCAA594FFCAA594FFCAA594FFCAA5
+      94FFCAA594FFCAA594FFCAA594FFCAA594FFCAA594FFCAA594FFCAA594FFCAA5
+      94FFCAA594FFCAA493FFC8A08FFFC19480FFB47E66FF975E44FF613724FF5C31
+      1DFF5A301C9C5555550300000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000005B2F1B445C301CFF603521FF804E38FFAF765DFFBE8F
+      7BFFC89F8EFFCBA596FFCCA797FFCCA797FFCCA797FFCCA797FFCCA797FFCCA7
+      97FFCCA797FFCCA797FFCCA797FFCCA797FFCCA797FFCCA797FFCCA797FFCCA7
+      97FFCCA797FFCCA797FFCCA797FFCCA797FFCCA797FF4E3F39FF000000FF0000
+      00FF000000FF000000FF766157FFCCA797FFA08377FF635249FF574740FFA889
+      7CFFCCA797FFCCA797FFCCA797FFCCA797FFCCA797FFCCA797FFCCA797FFCCA7
+      97FF91776BFF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF473A34FFCCA797FFCCA797FFCCA797FFCCA797FFCCA797FFCCA7
+      97FFCCA797FFCCA797FFCCA797FFCCA797FFCCA797FFCCA797FFCCA797FFCCA7
+      97FFCCA797FFCCA797FFCCA797FFCCA797FFCCA797FFCCA797FFCCA797FFCCA7
+      97FFCCA797FFCCA797FFCCA797FFCCA797FFCCA797FFCCA797FFCCA797FFCCA7
+      97FFCCA796FFCAA594FFC69B8AFFBA8973FFAB6E55FF6F422EFF5E321FFF5C30
+      1CEB563222150000000100000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000005B2F1BA95C311DFF633926FF9B6148FFB680
+      6AFFC39885FFCAA494FFCDA99AFFCEA99BFFCEA99BFFCEA99BFFCEA99BFFCEA9
+      9BFFCEA99BFFCEA99BFFCEA99BFFCEA99BFFCEA99BFFCEA99BFFCEA99BFFCEA9
+      9BFFCEA99BFFCEA99BFFCEA99BFFCEA99BFFCEA99BFF564741FF000000FF0000
+      00FF000000FF050404FFCEA99BFFCEA99BFFCEA99BFFCEA99BFFCEA99BFFCEA9
+      9BFFCEA99BFFCEA99BFFCEA99BFFCEA99BFFCEA99BFFCEA99BFFCEA99BFFCEA9
+      9BFF987D72FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0201
+      01FF766159FFCEA99BFFCEA99BFFCEA99BFFCEA99BFFCEA99BFFCEA99BFFCEA9
+      9BFFCEA99BFFCEA99BFFCEA99BFFCEA99BFFCEA99BFFCEA99BFFCEA99BFFCEA9
+      9BFFCEA99BFFCEA99BFFCEA99BFFCEA99BFFCEA99BFFCEA99BFFCEA99BFFCEA9
+      9BFFCEA99BFFCEA99BFFCEA99BFFCEA99BFFCEA99BFFCEA99BFFCEA99BFFCEA9
+      9BFFCDA798FFC9A291FFC0937FFFB17A61FF8A543DFF603622FF5C311DFF5B30
+      1D65000000010000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000005B2F1B1B5C301CF35E331FFF70432FFFAB6F
+      55FFBC8A75FFC79E8DFFCDA99AFFCFAB9DFFCFAC9EFFCFAC9EFFCFAC9EFFCFAC
+      9EFFCFAC9EFFCFAC9EFFCFAC9EFFCFAC9EFFCFAC9EFFCFAC9EFFCFAC9EFFCFAC
+      9EFFCFAC9EFFCFAC9EFFCFAC9EFFCFAC9EFFCFAC9EFF7E6960FF000000FF0000
+      00FF000000FF161210FFCFAC9EFFCFAC9EFFCFAC9EFFCFAC9EFFCFAC9EFFCFAC
+      9EFFCFAC9EFFCFAC9EFFCFAC9EFFCFAC9EFFCFAC9EFFCFAC9EFFCFAC9EFFCFAC
+      9EFFCFAC9EFF2F2724FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF090707FFA488
+      7EFFCFAC9EFFCFAC9EFFCFAC9EFFCFAC9EFFCFAC9EFFCFAC9EFFCFAC9EFFCFAC
+      9EFFCFAC9EFFCFAC9EFFCFAC9EFFCFAC9EFFCFAC9EFFCFAC9EFFCFAC9EFFCFAC
+      9EFFCFAC9EFFCFAC9EFFCFAC9EFFCFAC9EFFCFAC9EFFCFAC9EFFCFAC9EFFCFAC
+      9EFFCFAC9EFFCFAC9EFFCFAC9EFFCFAC9EFFCFAC9EFFCFAC9EFFCFAC9EFFCFAB
+      9DFFCCA797FFC49988FFB7836CFFA0664BFF663B28FF5D311EFF5B2F1BC77465
+      5E03000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000005B2F1B715C301CFF603622FF8250
+      39FFB17860FFC0927FFFCBA495FFD0AD9FFFD1AFA1FFD1AFA1FFD1AFA1FFD1AF
+      A1FFD1AFA1FFD1AFA1FFD1AFA1FFD1AFA1FFD1AFA1FFD1AFA1FFD1AFA1FFD1AF
+      A1FFD1AFA1FFD1AFA1FFD1AFA1FFD1AFA1FFD1AFA1FFC7A799FF000000FF0000
+      00FF000000FF2E2623FFD1AFA1FFD1AFA1FFD1AFA1FFD1AFA1FFD1AFA1FFD1AF
+      A1FFD1AFA1FFD1AFA1FFD1AFA1FFD1AFA1FFD1AFA1FFD1AFA1FFD1AFA1FFD1AF
+      A1FFD1AFA1FFD1AFA1FF2A2421FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF221C1AFFC5A599FFD1AF
+      A1FFD1AFA1FFD1AFA1FFD1AFA1FFD1AFA1FFD1AFA1FFD1AFA1FFD1AFA1FFD1AF
+      A1FFD1AFA1FFD1AFA1FFD1AFA1FFD1AFA1FFD1AFA1FFD1AFA1FFD1AFA1FFD1AF
+      A1FFD1AFA1FFD1AFA1FFD1AFA1FFD1AFA1FFD1AFA1FFD1AFA1FFD1AFA1FFD1AF
+      A1FFD1AFA1FFD1AFA1FFD1AFA1FFD1AFA1FFD1AFA1FFD1AFA1FFD1AEA0FFCFAB
+      9DFFC8A090FFBC8B77FFAB7056FF724430FF5E331FFF5C301CFA5C321E310000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000005B2F1B015B2F1BB85D311EFF6339
+      26FF945E45FFB6806AFFC59A88FFCEAA9BFFD2B0A3FFD3B2A4FFD3B2A5FFD3B2
+      A5FFD3B2A5FFD3B2A5FFD3B2A5FFD3B2A5FFD3B2A5FFD3B2A5FFD3B2A5FFD3B2
+      A5FFD3B2A5FFD3B2A5FFD3B2A5FFD3B2A5FFD3B2A5FFD3B2A5FF0C0A09FF0000
+      00FF000000FF4D413CFFD3B2A5FFD3B2A5FFD3B2A5FFD3B2A5FFD3B2A5FFD3B2
+      A5FFD3B2A5FFD3B2A5FFD3B2A5FFD3B2A5FFD3B2A5FFD3B2A5FFD3B2A5FFD3B2
+      A5FFD3B2A5FFD3B2A5FFD3B2A5FFB2968BFF443935FF090707FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF564943FFD3B2A5FFD3B2A5FFD3B2
+      A5FFD3B2A5FFD3B2A5FFD3B2A5FFD3B2A5FFD3B2A5FFD3B2A5FFD3B2A5FFD3B2
+      A5FFD3B2A5FFD3B2A5FFD3B2A5FFD3B2A5FFD3B2A5FFD3B2A5FFD3B2A5FFD3B2
+      A5FFD3B2A5FFD3B2A5FFD3B2A5FFD3B2A5FFD3B2A5FFD3B2A5FFD3B2A5FFD3B2
+      A5FFD3B2A5FFD3B2A5FFD3B2A5FFD3B2A5FFD3B2A5FFD3B2A4FFD1B0A2FFCCA7
+      97FFC19481FFB17860FF815039FF603622FF5C301CFF5B301C74000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000000000005B2F1B155C301CE55E32
+      1FFF693F2BFFA36A50FFBA8873FFC8A090FFD1AEA0FFD4B4A7FFD5B5A9FFD5B5
+      A9FFD5B5A9FFD5B5A9FFD5B5A9FFD5B5A9FFD5B5A9FFD5B5A9FFD5B5A9FFD5B5
+      A9FFD5B5A9FFD5B5A9FFD5B5A9FFD5B5A9FFD5B5A9FFD5B5A9FF2E2725FF0000
+      00FF2C2523FFC8AA9FFFD5B5A9FFD5B5A9FFD5B5A9FFD5B5A9FFD5B5A9FFD5B5
+      A9FFD5B5A9FFD5B5A9FFD5B5A9FFD5B5A9FFD5B5A9FFD5B5A9FFD5B5A9FFD5B5
+      A9FFD5B5A9FFD5B5A9FFD5B5A9FFD5B5A9FFD5B5A9FF8B766FFF000000FF0000
+      00FF000000FF000000FF000000FF2E2724FFD5B5A9FFD5B5A9FFD5B5A9FFD5B5
+      A9FFD5B5A9FFD5B5A9FFD5B5A9FFD5B5A9FFD5B5A9FFD5B5A9FFD5B5A9FFD5B5
+      A9FFD5B5A9FFD5B5A9FFD5B5A9FFD5B5A9FFD5B5A9FFD5B5A9FFD5B5A9FFD5B5
+      A9FFD5B5A9FFD5B5A9FFD5B5A9FFD5B5A9FFD5B5A9FFD5B5A9FFD5B5A9FFD5B5
+      A9FFD5B5A9FFD5B5A9FFD5B5A9FFD5B5A9FFD4B4A8FFD3B2A5FFCFAB9DFFC59B
+      89FFB6806AFF945D45FF633926FF5D311EFF5B2F1BB300000001000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000000000000000000000000000005B2F1B3F5C30
+      1CFC5F3420FF744631FFAC7359FFBE8E7AFFCBA596FFD3B2A4FFD5B7AAFFD6B8
+      ACFFD6B8ACFFD6B8ACFFD6B8ACFFD6B8ACFFD6B8ACFFD6B8ACFFD6B8ACFFD6B8
+      ACFFD6B8ACFFD6B8ACFFD6B8ACFFD6B8ACFFD6B8ACFFD6B8ACFF7F6E67FF7B69
+      62FFD6B8ACFFD6B8ACFFD6B8ACFFD6B8ACFFD6B8ACFFD6B8ACFFD6B8ACFFD6B8
+      ACFFD6B8ACFFD6B8ACFFD6B8ACFFD6B8ACFFD6B8ACFFD6B8ACFFD6B8ACFFD6B8
+      ACFFD6B8ACFFD6B8ACFFD6B8ACFFD6B8ACFFD6B8ACFF201C1AFF000000FF0000
+      00FF000000FF000000FF0E0C0BFFD1B4A8FFD6B8ACFFD6B8ACFFD6B8ACFFD6B8
+      ACFFD6B8ACFFD6B8ACFFD6B8ACFFD6B8ACFFD6B8ACFFD6B8ACFFD6B8ACFFD6B8
+      ACFFD6B8ACFFD6B8ACFFD6B8ACFFD6B8ACFFD6B8ACFFD6B8ACFFD6B8ACFFD6B8
+      ACFFD6B8ACFFD6B8ACFFD6B8ACFFD6B8ACFFD6B8ACFFD6B8ACFFD6B8ACFFD6B8
+      ACFFD6B8ACFFD6B8ACFFD6B8ACFFD6B8ACFFD5B6A9FFD1B0A1FFC8A18FFFBA87
+      71FFA1674FFF683D2AFF5E321FFF5C301CE2572D1A1300000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000005B2F
+      1B7D5C311DFF603622FF7C4D38FFAF785EFFC0937FFFCDAA9AFFD5B5A9FFD7B9
+      ADFFD8BBAFFFD8BBAFFFD8BBAFFFD8BBAFFFD8BBAFFFD8BBAFFFD8BBAFFFD8BB
+      AFFFD8BBAFFFD8BBAFFFD8BBAFFFD8BBAFFFD8BBAFFFD8BBAFFFD8BBAFFFD8BB
+      AFFFD8BBAFFFD8BBAFFFD8BBAFFFD8BBAFFFD8BBAFFFD8BBAFFFD8BBAFFFD8BB
+      AFFFD8BBAFFFD8BBAFFFD8BBAFFFD8BBAFFFD8BBAFFFD8BBAFFFD8BBAFFFD8BB
+      AFFFD8BBAFFFD8BBAFFFD8BBAFFFD8BBAFFFBBA297FF000000FF000000FF0000
+      00FF000000FF020202FFB49C92FFD8BBAFFFD8BBAFFFD8BBAFFFD8BBAFFFD8BB
+      AFFFD8BBAFFFD8BBAFFFD8BBAFFFD8BBAFFFD8BBAFFFD8BBAFFFD8BBAFFFD8BB
+      AFFFD8BBAFFFD8BBAFFFD8BBAFFFD8BBAFFFD8BBAFFFD8BBAFFFD8BBAFFFD8BB
+      AFFFD8BBAFFFD8BBAFFFD8BBAFFFD8BBAFFFD8BBAFFFD8BBAFFFD8BBAFFFD8BB
+      AFFFD8BBAFFFD8BBAFFFD8BBAFFFD7B9ADFFD3B3A6FFCAA594FFBC8B77FFA76D
+      55FF6E432FFF5E331FFF5C301CFB5A2E1B3B0000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000005B2F
+      1B025B2F1BAA5C311DFF613724FF82513CFFB27B63FFC39784FFD0AD9FFFD7B9
+      ADFFD9BDB2FFD9BDB2FFD9BDB2FFD9BDB2FFD9BDB2FFD9BDB2FFD9BDB2FFD9BD
+      B2FFD9BDB2FFD9BDB2FFD9BDB2FFD9BDB2FFD9BDB2FFD9BDB2FFD9BDB2FFD9BD
+      B2FFD9BDB2FFD9BDB2FFD9BDB2FFD9BDB2FFD9BDB2FFD9BDB2FFD9BDB2FFD9BD
+      B2FFD9BDB2FFD9BDB2FFD9BDB2FFD9BDB2FFD9BDB2FFD9BDB2FFD9BDB2FFD9BD
+      B2FFD9BDB2FFD9BDB2FFD9BDB2FFD9BDB2FF2E2826FF000000FF000000FF0000
+      00FF000000FF806F69FFD9BDB2FFD9BDB2FFD9BDB2FFD9BDB2FFD9BDB2FFD9BD
+      B2FFD9BDB2FFD9BDB2FFD9BDB2FFD9BDB2FFD9BDB2FFD9BDB2FFD9BDB2FFD9BD
+      B2FFD9BDB2FFD9BDB2FFD9BDB2FFD9BDB2FFD9BDB2FFD9BDB2FFD9BDB2FFD9BD
+      B2FFD9BDB2FFD9BDB2FFD9BDB2FFD9BDB2FFD9BDB2FFD9BDB2FFD9BDB2FFD9BD
+      B2FFD9BDB2FFD9BDB2FFD9BCB1FFD5B7AAFFCDA899FFBF907CFFAA725AFF7346
+      32FF603521FF5C301CFF5A2F1B67000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00005B2F1B065B2F1BBC5D311EFF633926FF88563FFFB47E67FFC59A88FFD1B0
+      A2FFD8BBB0FFDBC0B5FFDBC0B6FFDBC1B7FFDBC1B7FFDBC1B7FFDBC1B7FFDBC1
+      B7FFDBC1B7FFDBC1B7FFDBC1B7FFDBC1B7FFDBC1B7FFDBC1B7FFDBC1B7FFDBC1
+      B7FFDBC1B7FFDBC1B7FFDBC1B7FFDBC1B7FFDBC1B7FFDBC1B7FFDBC1B7FFDBC1
+      B7FFDBC1B7FFDBC1B7FFDBC1B7FFDBC1B7FFDBC1B7FFDBC1B7FFDBC1B7FFDBC1
+      B7FFDBC1B7FFDBC1B7FFDBC1B7FF9E8A83FF000000FF000000FF000000FF0101
+      01FF83736DFFDBC1B7FFDBC1B7FFDBC1B7FFDBC1B7FFDBC1B7FFDBC1B7FFDBC1
+      B7FFDBC1B7FFDBC1B7FFDBC1B7FFDBC1B7FFDBC1B7FFDBC1B7FFDBC1B7FFDBC1
+      B7FFDBC1B7FFDBC1B7FFDBC1B7FFDBC1B7FFDBC1B7FFDBC1B7FFDBC1B7FFDBC1
+      B7FFDBC1B7FFDBC1B7FFDBC1B7FFDBC1B7FFDBC1B7FFDBC1B7FFDBC1B7FFDBC1
+      B7FFDBC0B6FFDABFB4FFD7B9ADFFCFAC9CFFC19380FFAE765EFF774A36FF6036
+      22FF5C311DFF5B2F1B7E00000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000005B2F1B0C5B2F1BCB5D311EFF633A27FF8D5943FFB58068FFC69B
+      8AFFD2B1A4FFD9BEB2FFDCC2B8FFDDC3B9FFDDC4BAFFDDC4BAFFDDC4BAFFDDC4
+      BAFFDDC4BAFFDDC4BAFFDDC4BAFFDDC4BAFFDDC4BAFFDDC4BAFFDDC4BAFFDDC4
+      BAFFDDC4BAFFDDC4BAFFDDC4BAFFDDC4BAFFDDC4BAFFDDC4BAFFDDC4BAFFDDC4
+      BAFFDDC4BAFFDDC4BAFFDDC4BAFFDDC4BAFFDDC4BAFFDDC4BAFFDDC4BAFFDDC4
+      BAFFDDC4BAFFDDC4BAFFDDC4BAFF72655FFF000000FF000000FF040404FFA08E
+      86FFDDC4BAFFDDC4BAFFDDC4BAFFDDC4BAFFDDC4BAFFDDC4BAFFDDC4BAFFDDC4
+      BAFFDDC4BAFFDDC4BAFFDDC4BAFFDDC4BAFFDDC4BAFFDDC4BAFFDDC4BAFFDDC4
+      BAFFDDC4BAFFDDC4BAFFDDC4BAFFDDC4BAFFDDC4BAFFDDC4BAFFDDC4BAFFDDC4
+      BAFFDDC4BAFFDDC4BAFFDDC4BAFFDDC4BAFFDDC4BAFFDDC4BAFFDDC4BAFFDDC3
+      B9FFDBC1B7FFD8BBAFFFCFAC9EFFC29482FFB0785FFF7B4D38FF613623FF5C31
+      1DFF5B2F1B940000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000005B2F1B155C301CD95D311EFF633A27FF8A5842FFB57F
+      68FFC59C89FFD3B2A4FFDABFB4FFDDC4BBFFDEC6BCFFDFC6BDFFDFC6BDFFDFC6
+      BDFFDFC6BDFFDFC6BDFFDFC6BDFFDFC6BDFFDFC6BDFFDFC6BDFFDFC6BDFFDFC6
+      BDFFDFC6BDFFDFC6BDFFDFC6BDFFDFC6BDFFDFC6BDFFDFC6BDFFDFC6BDFFDFC6
+      BDFFDFC6BDFFDFC6BDFFDFC6BDFFDFC6BDFFDFC6BDFFDFC6BDFFDFC6BDFFDFC6
+      BDFFDFC6BDFFDFC6BDFFDFC6BDFFDDC4BBFF060605FF0A0908FFBCA79FFFDFC6
+      BDFFDFC6BDFFDFC6BDFFDFC6BDFFDFC6BDFFDFC6BDFFDFC6BDFFDFC6BDFFDFC6
+      BDFFDFC6BDFFDFC6BDFFDFC6BDFFDFC6BDFFDFC6BDFFDFC6BDFFDFC6BDFFDFC6
+      BDFFDFC6BDFFDFC6BDFFDFC6BDFFDFC6BDFFDFC6BDFFDFC6BDFFDFC6BDFFDFC6
+      BDFFDFC6BDFFDFC6BDFFDFC6BDFFDFC6BDFFDFC6BDFFDFC6BDFFDEC6BCFFDDC4
+      BAFFD9BCB1FFD0AD9FFFC19581FFAE775EFF7A4D38FF613724FF5C311DFF5B2F
+      1BAA5B2F1B020000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000005B2F1B205C301CDF5D311EFF633A27FF8454
+      3FFFB47E67FFC59B88FFD3B2A4FFDBC1B5FFDFC6BDFFE0C9C0FFE0C9C0FFE0C9
+      C0FFE0C9C0FFE0C9C0FFE0C9C0FFE0C9C0FFE0C9C0FFE0C9C0FFE0C9C0FFE0C9
+      C0FFE0C9C0FFE0C9C0FFE0C9C0FFE0C9C0FFE0C9C0FFE0C9C0FFE0C9C0FFE0C9
+      C0FFE0C9C0FFE0C9C0FFE0C9C0FFE0C9C0FFE0C9C0FFE0C9C0FFE0C9C0FFE0C9
+      C0FFE0C9C0FFE0C9C0FFE0C9C0FFE0C9C0FF867872FFCDB8B0FFE0C9C0FFE0C9
+      C0FFE0C9C0FFE0C9C0FFE0C9C0FFE0C9C0FFE0C9C0FFE0C9C0FFE0C9C0FFE0C9
+      C0FFE0C9C0FFE0C9C0FFE0C9C0FFE0C9C0FFE0C9C0FFE0C9C0FFE0C9C0FFE0C9
+      C0FFE0C9C0FFE0C9C0FFE0C9C0FFE0C9C0FFE0C9C0FFE0C9C0FFE0C9C0FFE0C9
+      C0FFE0C9C0FFE0C9C0FFE0C9C0FFE0C9C0FFE0C9C0FFDFC8BFFFDEC5BBFFD9BD
+      B2FFCFAC9EFFC0937FFFAB755CFF764936FF613623FF5C311DFF5B2F1BB35B2F
+      1B06000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000005B2F1B195C301CD15D311EFF6339
+      26FF80513DFFB17B63FFC39785FFD1B0A2FFDBC0B5FFDFC8BFFFE1CBC2FFE2CC
+      C4FFE2CCC4FFE2CCC4FFE2CCC4FFE2CCC4FFE2CCC4FFE2CCC4FFE2CCC4FFE2CC
+      C4FFE2CCC4FFE2CCC4FFE2CCC4FFE2CCC4FFE2CCC4FFE2CCC4FFE2CCC4FFE2CC
+      C4FFE2CCC4FFE2CCC4FFE2CCC4FFE2CCC4FFE2CCC4FFE2CCC4FFE2CCC4FFE2CC
+      C4FFE2CCC4FFE2CCC4FFE2CCC4FFE2CCC4FFE2CCC4FFE2CCC4FFE2CCC4FFE2CC
+      C4FFE2CCC4FFE2CCC4FFE2CCC4FFE2CCC4FFE2CCC4FFE2CCC4FFE2CCC4FFE2CC
+      C4FFE2CCC4FFE2CCC4FFE2CCC4FFE2CCC4FFE2CCC4FFE2CCC4FFE2CCC4FFE2CC
+      C4FFE2CCC4FFE2CCC4FFE2CCC4FFE2CCC4FFE2CCC4FFE2CCC4FFE2CCC4FFE2CC
+      C4FFE2CCC4FFE2CCC4FFE2CCC4FFE2CBC3FFE1CAC1FFDEC6BCFFD9BCB1FFCEA9
+      9BFFBF907CFFA87159FF724733FF603622FF5C311DFF5B2F1B9F5B2F1B040000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000000000005B2F1B0F5C301CC15D31
+      1EFF623825FF794D38FFAA755CFFC0927EFFCFAB9CFFD9BDB2FFDFC8BFFFE2CD
+      C5FFE3CEC6FFE4CFC7FFE4CFC7FFE4CFC7FFE4CFC7FFE4CFC7FFE4CFC7FFE4CF
+      C7FFE4CFC7FFE4CFC7FFE4CFC7FFE4CFC7FFE4CFC7FFE4CFC7FFE4CFC7FFE4CF
+      C7FFE4CFC7FFE4CFC7FFE4CFC7FFE4CFC7FFE4CFC7FFE4CFC7FFE4CFC7FFE4CF
+      C7FFE4CFC7FFE4CFC7FFE4CFC7FFE4CFC7FFE4CFC7FFE4CFC7FFE4CFC7FFE4CF
+      C7FFE4CFC7FFE4CFC7FFE4CFC7FFE4CFC7FFE4CFC7FFE4CFC7FFE4CFC7FFE4CF
+      C7FFE4CFC7FFE4CFC7FFE4CFC7FFE4CFC7FFE4CFC7FFE4CFC7FFE4CFC7FFE4CF
+      C7FFE4CFC7FFE4CFC7FFE4CFC7FFE4CFC7FFE4CFC7FFE4CFC7FFE4CFC7FFE4CF
+      C7FFE4CFC7FFE4CFC7FFE3CEC6FFE2CCC4FFDEC6BCFFD7B9ADFFCAA594FFBB89
+      75FF9F6A52FF6E4430FF603622FF5C311DFF5B2F1B8900000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000000000000000000000000000005B2F1B085B2F
+      1BAF5C311DFF603622FF6E4430FF9E6952FFBB8975FFCAA594FFD7BAAEFFDFC7
+      BEFFE3CDC6FFE5D0C9FFE5D1CAFFE5D2CAFFE5D2CAFFE5D2CAFFE5D2CAFFE5D2
+      CAFFE5D2CAFFE5D2CAFFE5D2CAFFE5D2CAFFE5D2CAFFE5D2CAFFE5D2CAFFE5D2
+      CAFFE5D2CAFFE5D2CAFFE5D2CAFFE5D2CAFFE5D2CAFFE5D2CAFFE5D2CAFFE5D2
+      CAFFE5D2CAFFE5D2CAFFE5D2CAFFE5D2CAFFE5D2CAFFE5D2CAFFE5D2CAFFE5D2
+      CAFFE5D2CAFFE5D2CAFFE5D2CAFFE5D2CAFFE5D2CAFFE5D2CAFFE5D2CAFFE5D2
+      CAFFE5D2CAFFE5D2CAFFE5D2CAFFE5D2CAFFE5D2CAFFE5D2CAFFE5D2CAFFE5D2
+      CAFFE5D2CAFFE5D2CAFFE5D2CAFFE5D2CAFFE5D2CAFFE5D2CAFFE5D2CAFFE5D2
+      CAFFE5D1CAFFE4CFC9FFE2CCC5FFDDC4BBFFD4B4A8FFC69D8CFFB7826CFF8F5E
+      47FF673E2BFF5F3420FF5C311DFE5B2F1B710000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000005B2F
+      1B035B2F1B845C311DFE5F3420FF673E2BFF8C5B46FFB5816AFFC69B8AFFD3B2
+      A5FFDDC3B9FFE3CCC5FFE6D1CBFFE6D4CDFFE7D4CEFFE7D4CEFFE7D4CEFFE7D4
+      CEFFE7D4CEFFE7D4CEFFE7D4CEFFE7D4CEFFE7D4CEFFE7D4CEFFE7D4CEFFE7D4
+      CEFFE7D4CEFFE7D4CEFFE7D4CEFFE7D4CEFFE7D4CEFFE7D4CEFFE7D4CEFFE7D4
+      CEFFE7D4CEFFE7D4CEFFE7D4CEFFE7D4CEFFE7D4CEFFE7D4CEFFE7D4CEFFE7D4
+      CEFFE7D4CEFFE7D4CEFFE7D4CEFFE7D4CEFFE7D4CEFFE7D4CEFFE7D4CEFFE7D4
+      CEFFE7D4CEFFE7D4CEFFE7D4CEFFE7D4CEFFE7D4CEFFE7D4CEFFE7D4CEFFE7D4
+      CEFFE7D4CEFFE7D4CEFFE7D4CEFFE7D4CEFFE7D4CEFFE7D4CEFFE7D3CEFFE6D3
+      CDFFE5D1C9FFE1CBC2FFDBBFB5FFD0AD9FFFC19581FFAD7760FF7E513DFF633A
+      27FF5E321FFF5C301CEE5B2F1B4F000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000005B2F1B465C301CEA5E321FFF633A27FF7A4E3AFFA8735BFFBE8F
+      7BFFCDA798FFD9BBB1FFE1C9C1FFE5D1CAFFE8D5CFFFE8D6D1FFE9D7D2FFE9D7
+      D2FFE9D7D2FFE9D7D2FFE9D7D2FFE9D7D2FFE9D7D2FFE9D7D2FFE9D7D2FFE9D7
+      D2FFE9D7D2FFE9D7D2FFE9D7D2FFE9D7D2FFE9D7D2FFE9D7D2FFE9D7D2FFE9D7
+      D2FFE9D7D2FFE9D7D2FFE9D7D2FFE9D7D2FFE9D7D2FFE9D7D2FFE9D7D2FFE9D7
+      D2FFE9D7D2FFE9D7D2FFE9D7D2FFE9D7D2FFE9D7D2FFE9D7D2FFE9D7D2FFE9D7
+      D2FFE9D7D2FFE9D7D2FFE9D7D2FFE9D7D2FFE9D7D2FFE9D7D2FFE9D7D2FFE9D7
+      D2FFE9D7D2FFE9D7D2FFE9D7D2FFE9D7D2FFE8D7D1FFE8D6D0FFE7D4CEFFE4CF
+      C9FFDFC6BDFFD5B6AAFFC8A090FFBA8872FF9E6952FF704532FF613724FF5D31
+      1EFF5C301CC95B2F1B1F00000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000005B2F1B1A5C301CC15D311EFF603622FF69412EFF8E5D
+      48FFB38068FFC49987FFD2B0A3FFDCC2B8FFE3CDC6FFE7D4CEFFE9D8D3FFEAD9
+      D4FFEADAD5FFEADAD5FFEADAD5FFEADAD5FFEADAD5FFEADAD5FFEADAD5FFEADA
+      D5FFEADAD5FFEADAD5FFEADAD5FFEADAD5FFEADAD5FFEADAD5FFEADAD5FFEADA
+      D5FFEADAD5FFEADAD5FFEADAD5FFEADAD5FFEADAD5FFEADAD5FFEADAD5FFEADA
+      D5FFEADAD5FFEADAD5FFEADAD5FFEADAD5FFEADAD5FFEADAD5FFEADAD5FFEADA
+      D5FFEADAD5FFEADAD5FFEADAD5FFEADAD5FFEADAD5FFEADAD5FFEADAD5FFEADA
+      D5FFEADAD5FFEADAD5FFEAD9D4FFEAD8D3FFE9D7D2FFE6D3CDFFE2CBC3FFDABE
+      B3FFCEAA9BFFC0927FFFAC7660FF81533FFF653C29FF5F3420FF5C311DFF5B2F
+      1B8F5B2F1B050000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000005B2F1B035B2F1B7F5C301CF85E331FFF633A
+      27FF734936FF9E6B54FFBA8873FFC8A08FFFD5B4A9FFDEC5BBFFE5D0C9FFE8D6
+      D1FFEADAD5FFEBDBD7FFECDCD7FFECDCD8FFECDCD8FFECDCD8FFECDCD8FFECDC
+      D8FFECDCD8FFECDCD8FFECDCD8FFECDCD8FFECDCD8FFECDCD8FFECDCD8FFECDC
+      D8FFECDCD8FFECDCD8FFECDCD8FFECDCD8FFECDCD8FFECDCD8FFECDCD8FFECDC
+      D8FFECDCD8FFECDCD8FFECDCD8FFECDCD8FFECDCD8FFECDCD8FFECDCD8FFECDC
+      D8FFECDCD8FFECDCD8FFECDCD8FFECDCD8FFECDCD8FFECDCD8FFECDCD8FFECDC
+      D8FFECDCD7FFEBDBD7FFEAD9D4FFE8D5CFFFE3CDC6FFDBC1B7FFD1B0A2FFC499
+      88FFB5816CFF91604BFF6C4230FF613724FF5D311EFF5C301CE75B2F1B4F0000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000000000005B2F1B245C301CB95C31
+      1DFF603521FF663D2AFF80533EFFA6725BFFBC8B76FFC9A191FFD5B5A9FFDFC5
+      BDFFE5D1CAFFE9D8D2FFEBDBD7FFECDDD9FFEDDEDBFFEEDFDCFFEEDFDCFFEEDF
+      DCFFEEDFDCFFEEDFDCFFEEDFDCFFEEDFDCFFEEDFDCFFEEDFDCFFEEDFDCFFEEDF
+      DCFFEEDFDCFFEEDFDCFFEEDFDCFFEEDFDCFFEEDFDCFFEEDFDCFFEEDFDCFFEEDF
+      DCFFEEDFDCFFEEDFDCFFEEDFDCFFEEDFDCFFEEDFDCFFEEDFDCFFEEDFDCFFEEDF
+      DCFFEEDFDCFFEEDFDCFFEEDFDCFFEEDFDCFFEEDFDCFFEDDEDBFFEDDEDAFFECDD
+      D9FFEBDAD6FFE8D6D0FFE4CEC7FFDCC1B8FFD2B0A3FFC59B89FFB8866FFF9B69
+      52FF754937FF633A27FF5E331FFF5C311DFC5B2F1B905B2F1B0E000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000005B2F
+      1B555C301CE45D311EFF603622FF673E2CFF7F523FFFA4715AFFBC8B76FFC89F
+      90FFD3B3A6FFDCC2B8FFE4CEC7FFE8D6D1FFEBDBD7FFEDDEDBFFEEE1DDFFEFE1
+      DEFFEFE1DEFFEFE2DFFFEFE2DFFFEFE2DFFFEFE2DFFFEFE2DFFFEFE2DFFFEFE2
+      DFFFEFE2DFFFEFE2DFFFEFE2DFFFEFE2DFFFEFE2DFFFEFE2DFFFEFE2DFFFEFE2
+      DFFFEFE2DFFFEFE2DFFFEFE2DFFFEFE2DFFFEFE2DFFFEFE2DFFFEFE2DFFFEFE2
+      DFFFEFE2DFFFEFE2DFFFEFE1DEFFEEE1DDFFEEE0DCFFEDDEDAFFEBDAD6FFE7D4
+      CEFFE2CBC3FFDABFB4FFD1AEA0FFC59A88FFB8846FFF9A6852FF754B38FF653B
+      28FF5F3420FF5C311DFF5C301CC55B2F1B2F0000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00005B2F1B0C5B2F1B865C301CF25E321FFF613523FF673E2BFF7C513DFFA06C
+      56FFB88570FFC49886FFCFAA9CFFD8BBAFFFE0C8C0FFE6D2CBFFEAD8D3FFECDC
+      D8FFEEE0DCFFEFE2DFFFF0E3E1FFF0E4E1FFF0E4E1FFF1E5E2FFF1E5E2FFF1E5
+      E2FFF1E5E2FFF1E5E3FFF1E5E3FFF1E5E3FFF1E5E3FFF1E5E3FFF1E5E3FFF1E5
+      E3FFF1E5E3FFF1E5E3FFF1E5E2FFF1E5E2FFF1E5E2FFF1E5E2FFF0E4E1FFF0E4
+      E1FFF0E3E0FFEFE1DEFFEEDFDCFFECDCD7FFE9D7D2FFE4CFC9FFDEC4BBFFD5B7
+      AAFFCCA696FFC0937FFFB37F69FF96664FFF744937FF653B28FF603521FF5D31
+      1EFF5C301CDF5B2F1B605B2F1B01000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000005B2F1B115B2F1B7F5C301CEE5D311EFF603622FF653C
+      29FF724936FF8E5F4AFFAA7761FFBC8C77FFC79E8DFFD0AD9FFFD8BAAFFFDEC4
+      BBFFE3CEC6FFE8D5D0FFEBDBD6FFEDDEDAFFEEE0DCFFEFE2DFFFF0E3E1FFF1E5
+      E2FFF2E6E4FFF2E6E4FFF2E7E5FFF2E7E5FFF2E7E5FFF2E7E5FFF2E7E5FFF2E7
+      E5FFF2E7E5FFF2E6E4FFF1E5E3FFF1E5E2FFF0E3E1FFEFE1DEFFEEE0DCFFECDD
+      D9FFEADAD5FFE7D3CEFFE2CCC4FFDCC2B8FFD6B7ABFFCEA99BFFC49987FFB987
+      72FFA2715BFF865844FF6C4331FF633A27FF5F3420FF5D301EFF5C301CD95B2F
+      1B605B2F1B040000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000005B2F1B0D5B2F1B775C301CE95D31
+      1EFF5F3420FF623825FF683F2DFF7A4E3BFF956450FFAA7861FFBB8974FFC296
+      83FFCAA494FFD2B0A3FFD8BBAFFFDCC2B8FFE0C8C0FFE4CFC7FFE7D4CEFFEAD9
+      D3FFECDCD7FFECDED9FFEDDEDBFFEEDFDCFFEEDFDCFFEEE0DCFFEEDFDCFFEDDF
+      DBFFEDDFDAFFECDDD9FFEBDBD7FFE9D8D2FFE6D3CCFFE3CCC5FFDFC7BEFFDBC0
+      B7FFD7B9ADFFD0AD9FFFC8A090FFC0927FFFB7856FFFA4735CFF8E5D4AFF7249
+      37FF663D2AFF613623FF5E331FFF5C311DFF5C301CD25B2F1B585B2F1B020000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000000000000000000000000000005B2F1B055B2F
+      1B505C301CAD5C311DF95D311EFF603521FF633926FF673E2CFF714836FF8559
+      45FF996954FFAC7964FFBA8871FFBF907DFFC49988FFCAA292FFCFAB9CFFD3B2
+      A5FFD6B7ABFFD8BAAFFFD9BCB1FFDABEB3FFDBBFB6FFDBC0B6FFDBC0B5FFDABD
+      B3FFD9BBB1FFD7B9ADFFD5B6A9FFD2B0A3FFCDA99AFFC8A090FFC39785FFBE8E
+      7AFFB7846FFFA7755FFF946550FF7F5340FF6D4532FF663D2AFF623725FF5F34
+      20FF5D311EFF5C301CEB5B2F1B935B2F1B350000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000005B2F1B125B2F1B695C301CC75C311DFE5D311EFF5F3420FF6136
+      23FF643928FF673E2CFF6F4633FF7D513EFF8A5B47FF956651FFA06F5AFFAA78
+      61FFB07D68FFB4806CFFB78570FFBA8873FFBC8A75FFBC8B76FFBB8A75FFBA87
+      72FFB7846EFFB2806AFFAE7C65FFA87660FF9E6D57FF92624EFF855945FF794D
+      3BFF6D4331FF673E2BFF633926FF603622FF5E331FFF5D311EFF5C301CF85C30
+      1CAD5B2F1B4F5B2F1B0500000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000005B2F1B145B2F1B565C301C995C30
+      1CDC5C311DFF5D311EFF5E331FFF603521FF613724FF633926FF653B28FF663D
+      2AFF673E2CFF69402EFF6A4230FF6D4532FF714835FF744A37FF714735FF6C43
+      31FF6A4130FF683F2DFF673E2BFF653C29FF643A28FF633926FF613623FF6035
+      21FF5E321FFF5D311EFF5C311DFC5C301CC95B2F1B865B2F1B435B2F1B080000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00005B2F1B1F5B2F1B5F5B2F1B8A5C301CB05C301CD55C301CF85C311DFF5C31
+      1DFF5C311DFF5D311EFF5E321FFF5E321FFF5E331FFF5E331FFF5E331FFF5E32
+      1FFF5D311EFF5D311EFF5C311DFF5C311DFF5C311DFF5C301CF15C301CCB5C30
+      1CA55B2F1B7F5B2F1B4E5B2F1B0F000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000000000005B2F1B025B2F1B215B2F
+      1B455B2F1B555B2F1B615B2F1B6D5B2F1B795B2F1B865C301D8D5B2F1B825B2F
+      1B765B2F1B6A5B2F1B5E5B2F1B515B2F1B3D5B2F1B1700000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000FFFFFFFFFFFF
+      FF8000FFFFFFFFFFFFFFFFFFFFFFFFFFE0000003FFFFFFFFFFFFFFFFFFFFFFFE
+      000000003FFFFFFFFFFFFFFFFFFFFFF00000000007FFFFFFFFFFFFFFFFFFFF80
+      0000000000FFFFFFFFFFFFFFFFFFFE0000000000003FFFFFFFFFFFFFFFFFF800
+      00000000000FFFFFFFFFFFFFFFFFE000000000000003FFFFFFFFFFFFFFFF8000
+      000000000000FFFFFFFFFFFFFFFE00000000000000003FFFFFFFFFFFFFFC0000
+      0000000000001FFFFFFFFFFFFFF0000000000000000007FFFFFFFFFFFFE00000
+      00000000000003FFFFFFFFFFFF80000000000000000001FFFFFFFFFFFF000000
+      000000000000007FFFFFFFFFFE000000000000000000003FFFFFFFFFFC000000
+      000000000000001FFFFFFFFFF8000000000000000000000FFFFFFFFFF0000000
+      0000000000000007FFFFFFFFE00000000000000000000003FFFFFFFFC0000000
+      0000000000000001FFFFFFFF800000000000000000000000FFFFFFFF00000000
+      00000000000000007FFFFFFE0000000000000000000000007FFFFFFE00000000
+      00000000000000003FFFFFFC0000000000000000000000001FFFFFF800000000
+      00000000000000000FFFFFF000000000000000000000000007FFFFF000000000
+      000000000000000007FFFFE000000000000000000000000003FFFFC000000000
+      000000000000000003FFFFC000000000000000000000000001FFFF8000000000
+      000000000000000001FFFF8000000000000000000000000000FFFF0000000000
+      000000000000000000FFFF00000000000000000000000000007FFE0000000000
+      0000000000000000007FFE00000000000000000000000000003FFE0000000000
+      0000000000000000003FFC00000000000000000000000000003FFC0000000000
+      0000000000000000001FFC00000000000000000000000000001FF80000000000
+      0000000000000000000FF800000000000000000000000000000FF80000000000
+      0000000000000000000FF0000000000000000000000000000007F00000000000
+      00000000000000000007F0000000000000000000000000000007E00000000000
+      00000000000000000007E0000000000000000000000000000003E00000000000
+      00000000000000000003E0000000000000000000000000000003E00000000000
+      00000000000000000003E0000000000000000000000000000003C00000000000
+      00000000000000000003C0000000000000000000000000000003C00000000000
+      00000000000000000001C0000000000000000000000000000001C00000000000
+      00000000000000000001C0000000000000000000000000000001C00000000000
+      00000000000000000001C0000000000000000000000000000001C00000000000
+      00000000000000000001C0000000000000000000000000000001C00000000000
+      00000000000000000001C0000000000000000000000000000001C00000000000
+      00000000000000000003C0000000000000000000000000000003E00000000000
+      00000000000000000003E0000000000000000000000000000003E00000000000
+      00000000000000000003E0000000000000000000000000000003E00000000000
+      00000000000000000003F0000000000000000000000000000007F00000000000
+      00000000000000000007F0000000000000000000000000000007F00000000000
+      0000000000000000000FF800000000000000000000000000000FF80000000000
+      0000000000000000000FF800000000000000000000000000000FFC0000000000
+      0000000000000000001FFC00000000000000000000000000001FFC0000000000
+      0000000000000000003FFE00000000000000000000000000003FFE0000000000
+      0000000000000000003FFE00000000000000000000000000007FFF0000000000
+      0000000000000000007FFF0000000000000000000000000000FFFF8000000000
+      000000000000000000FFFF8000000000000000000000000001FFFF8000000000
+      000000000000000001FFFFC000000000000000000000000003FFFFC000000000
+      000000000000000003FFFFE000000000000000000000000007FFFFE000000000
+      00000000000000000FFFFFF00000000000000000000000000FFFFFF800000000
+      00000000000000001FFFFFF80000000000000000000000003FFFFFFC00000000
+      00000000000000007FFFFFFC000000000000000000000000FFFFFFFE00000000
+      0000000000000000FFFFFFFF000000000000000000000001FFFFFFFF80000000
+      0000000000000003FFFFFFFF800000000000000000000007FFFFFFFFC0000000
+      000000000000000FFFFFFFFFE0000000000000000000001FFFFFFFFFF0000000
+      000000000000001FFFFFFFFFF8000000000000000000003FFFFFFFFFFC000000
+      000000000000007FFFFFFFFFFE00000000000000000001FFFFFFFFFFFF000000
+      00000000000003FFFFFFFFFFFF80000000000000000007FFFFFFFFFFFFE00000
+      0000000000000FFFFFFFFFFFFFF000000000000000001FFFFFFFFFFFFFF80000
+      0000000000007FFFFFFFFFFFFFFE0000000000000000FFFFFFFFFFFFFFFF8000
+      000000000003FFFFFFFFFFFFFFFFC000000000000007FFFFFFFFFFFFFFFFF000
+      00000000001FFFFFFFFFFFFFFFFFFC0000000000007FFFFFFFFFFFFFFFFFFF00
+      0000000003FFFFFFFFFFFFFFFFFFFFE0000000000FFFFFFFFFFFFFFFFFFFFFFC
+      000000007FFFFFFFFFFFFFFFFFFFFFFFC0000007FFFFFFFFFFFFFFFFFFFFFFFF
+      FE0001FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF280000004000
+      0000800000000100200000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000001404040044949
+      4907494949073333330580808002000000010000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0001555555064444440F464646164545451A4444441E494949234747472F4444
+      443C4444444043434335464646284242421F4242421B40404018474747123939
+      3909808080020000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000008080800239393909474747124444
+      441E434343394646465F4444447F454444924444439F454544AA444443AF4444
+      43B2444443B3454544B1454544AD444343A445444497424242884343436F4343
+      434843434326434343173B3B3B0D404040040000000100000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000808080023737370E44444422454545464343436F4544
+      4496444443AF464643BB474743C3494643C84C443CD04F423AD7524136DD5741
+      30E2544133DF504239DA4D443CD44A4440CE494744C8484744C5454544BF4444
+      43B4434343A344444480444444564747472F494949152B2B2B06000000010000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000808080024646460B424242234343435845454495454542B3474643BF4D43
+      3CD0573F2EE4643D25F6693F21FC6A3F1EFF6C3F1FFF6E411FFF734621FD7A4C
+      25FD774723FD6F4221FE6D401FFF6B3E1EFF6A3E1FFD673E23F95B3E2BEB5042
+      38DA484543CB464543C3454544B8444444A64444447145454534404040144040
+      4004000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000013939
+      39094242421F434343504544448F464645B64E423AD35A3F2DE7673E23F96C3F
+      1FFF7A4B24FD965D2AFFA5682EFFAC6D30FFB47332FFBA7834FFBD7B34FFC07F
+      35FFBE7C34FFBB7834FFB67533FFAF7031FFA76A2FFF9C622BFF835226FE6F42
+      20FF693E21FD5F3E29EE534036DE464542CB444443BE444444A44343436B4343
+      432E505050105555550300000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000080808002434343134242
+      424244444488454544B34C4139D1603D26F36B3F1FFF7F4E26FE9A602CFFB071
+      31FFBF7E35FFC88A37FFCF9138FFD29539FFD59939FFD99D3AFFDBA03BFFDDA2
+      3BFFDCA23AFFD99E3AFFD79B3AFFD39739FFD09238FFCB8D38FFC28136FFB776
+      34FFA3662EFF895528FE714322FE663C21FA543F34E0474442CA434342BC4444
+      449E424242603E3E3E212B2B2B06000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000404040044242421B4343435B4343
+      42A54C443DCB5D3C28EE6A3E20FF875228FEB07033FFC18037FFCA8B39FFD397
+      3BFFDCA23CFFE3AA3EFFE8B03FFFEAB43FFFEDB63FFFEFB940FFF1BB40FFF2BC
+      41FFF1BB40FFF0B941FFEEB740FFEBB440FFE9B23FFFE5AD3EFFDEA53DFFD79C
+      3CFFCD903AFFC48538FFB97835FF985E2DFF6F4322FE643C23F7514137DC4646
+      45C8434343B44343437D4141412F555555090000000100000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000001494949074343432644444470454343B4583C
+      2CE8693D21FE804F28FEAA6C33FFC2823AFFD2963EFFDCA33FFFE3AB41FFEAB4
+      42FFF0BB44FFF2BE44FFF4C145FFF6C244FFF7C345FFF8C545FFF9C545FFF9C6
+      45FFF9C545FFF8C445FFF7C345FFF6C345FFF5C244FFF3BF44FFF0BC43FFECB7
+      43FFE6AE42FFDFA540FFD79C3FFFC8893BFFB67536FF925B2CFF6D4021FE603A
+      25F44B413BD3434343BD434343904242423E5050501080808002000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000001393939094040403443434385484440C05F3924F47245
+      25FEA46833FFBF7F3BFFCE923FFFDBA343FFE8B246FFEEB947FFF1BD48FFF4C1
+      48FFF6C349FFF7C449FFF7C54AFFF7C549FFF7C649FFF8C649FFF8C649FFF8C5
+      49FFF8C649FFF8C649FFF8C649FFF7C549FFF7C549FFF7C449FFF6C449FFF5C2
+      48FFF2BE48FFEFBB48FFEBB647FFE0A844FFD39941FFC4863DFFB17137FF8551
+      29FE653A20FD4E3F37DA444443C3434343A04646465040404014000000020000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000004949490746464633434343914C423BCC643A22FA7C4C28FEB473
+      39FFCA8F41FFD89F46FFE4AE49FFECB84BFFF1BF4CFFF3C14DFFF4C24DFFF4C3
+      4DFFF5C44DFFF5C34DFFF5C34DFFF5C34DFFF5C34DFFF5C34DFFF5C34DFFF5C3
+      4DFFF5C34DFFF5C34DFFF5C34DFFF5C34DFFF5C34DFFF5C34DFFF5C44DFFF5C3
+      4DFFF4C24DFFF3C24DFFF2C04DFFEEBA4CFFE8B34AFFDCA546FFD09643FFBE7F
+      3CFF935B2EFF683C20FF533D31E4454544C7444444A842424255474747120000
+      0001000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000404040044646462845454586503F35D4653A21FE89552CFEBA7A3DFFD096
+      45FFE0AB4CFFE9B54FFFEEBB50FFF0BF50FFF2C051FFF2C151FFF2C151FFF2C1
+      50FFF2C151FFF2C151FFF2C151FFF2C151FFF2C151FFF2C151FFF2C151FFF2C1
+      51FFF2C151FFF2C151FFF2C151FFF2C151FFF2C151FFF2C151FFF2C151FFF2C1
+      51FFF2C151FFF2C151FFF2C151FFF1C051FFEFBD50FFEAB84FFFE4AF4DFFD79F
+      49FFC28440FFA06433FF6B3F22FE583A2AEC464443C9434343A4414141473B3B
+      3B0D000000010000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000005555
+      55034242421F434343764F3D33D3663A1FFF965D32FFBE8041FFD39B49FFE2AF
+      51FFEAB953FFEDBC54FFEEBE54FFEFBF55FFEFBF55FFEFBF55FFEFBF55FFEFBF
+      55FFEFBF55FFEFBF55FFEFBF55FFEBBD53FF7C642CFF4E3E1CFF342A13FF3D31
+      16FF57451FFF775F2AFFAD8B3DFFEFBF55FFEFBF55FFEFBF55FFEFBF55FFEFBF
+      55FFEFBF55FFEFBF55FFEFBF55FFEFBF55FFEFBE54FFEEBD55FFECBB53FFE6B3
+      52FFD9A24CFFC68A44FFAA6C38FF704324FE5A3827F0444242C5434343994646
+      463A404040080000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000024646
+      4616424242654A3F39C3623820FE965D32FFC28545FFD59E4EFFE2B054FFE9B9
+      57FFECBB57FFECBC58FFECBC58FFECBC58FFECBC58FFECBC58FFECBC58FFECBC
+      58FFECBC58FFECBC58FF634F25FF040301FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF010100FF120E07FF413418FF866B32FFDAAE
+      52FFECBC58FFECBC58FFECBC58FFECBC58FFECBC58FFECBC58FFECBB57FFEABA
+      57FFE5B455FFDAA550FFC98F48FFAD6F3CFF6B3E23FE533B2DE7434343C14343
+      438D4444442D6666660500000000000000000000000000000000000000000000
+      00000000000000000000000000000000000000000000000000004040400C4444
+      444B46413DB3603720FB89532DFFC08345FFD6A151FFE2B057FFE7B759FFE9B9
+      5BFFE9BA5BFFEAB95AFFEAB95AFFEAB95AFFEAB95AFFEAB95AFFEAB95AFFEAB9
+      5AFFEAB95AFF4C3C1DFF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF080703FF503F1FFFCBA14EFFEAB95AFFEAB95AFFEAB95AFFEAB95AFFE9BA
+      5BFFE8B75AFFE4B259FFDBA754FFC98F4BFFA36738FF663A20FF4F3D34DE4444
+      44BC4343437A4242421B00000001000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000055555503474747244440
+      40935C3623F57B492AFEB97B43FFD39D52FFE1AF5AFFE5B55CFFE6B75DFFE6B7
+      5DFFE6B75DFFE6B75DFFE6B75DFFE6B75DFFE6B75DFFE6B75DFFE6B75DFFE6B7
+      5DFF8A6D38FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF18140AFF785F30FFE2B55BFFE6B75DFFE6B7
+      5DFFE6B75DFFE6B55CFFE3B15BFFD9A556FFC4884AFF975D34FF623820FE4B40
+      39D6434343AF4141414A2E2E2E0B000000000000000000000000000000000000
+      00000000000000000000000000000000000000000000404040104343435C5636
+      27E46E4126FEB27441FFCD9752FFDDAC5CFFE2B35FFFE4B45FFFE4B45FFFE4B4
+      5FFFE4B45FFFE4B45FFFE4B45FFFE4B45FFFE4B45FFFE4B45FFFE4B45FFFE4B4
+      5FFF110D07FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF020101FF48391EFFE0B2
+      5DFFE4B45FFFE4B45FFFE3B35EFFE0AF5DFFD5A057FFBE8148FF89542FFF5E34
+      20FC46423FC94343438C44444422000000030000000000000000000000000000
+      000000000000000000000000000000000000404040044646462C4A3D37AF6034
+      1EFFA5673BFFC89051FFD9A65CFFDFB060FFE1B160FFE1B161FFE1B161FFE1B1
+      61FFE1B161FFE1B161FFE1B161FFE1B161FFE1B161FFE1B161FFE1B161FFDAAB
+      5EFF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0B09
+      05FFC49A55FFE1B161FFE1B160FFE0B161FFDCAB5EFFD09A57FFB87B46FF6E41
+      25FE54382AE9444444B4434343583333330F0000000000000000000000000000
+      000000000000000000000000000000000000434343134343436A593523EF7E4A
+      2CFEBF844DFFD5A25DFFDCAB61FFDDAD63FFDEAE62FFDEAE62FFDEAE62FFDEAE
+      62FFDEAE62FFDEAE62FFDEAE62FFDEAE62FFDEAE62FFDEAE62FFDEAE62FF9A79
+      43FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF0F0B06FFDAAC60FFDEAE62FFDEAE62FFDDAD62FFD9A75FFFCA9254FF9C61
+      39FF5E341EFE47403DCE444444973E3E3E294040400400000000000000000000
+      0000000000000000000000000000555555034141412B4C3B34BC623620FEAA6C
+      40FFCE985AFFD9A862FFDBAB64FFDBAB64FFDBAB64FFDBAB64FFDBAB64FFDBAB
+      64FFDBAB64FFDBAB64FFDBAB64FFDBAB64FFDBAB64FFDBAB64FFDBAB64FFDBAB
+      64FF1A140CFF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF6F5733FFDBAB64FFDBAB64FFDBAB64FFDAA963FFD4A15FFFBB7F
+      4CFF754429FE573628EE434343B64343435B4949490E00000000000000000000
+      00000000000000000000000000004040400C454242535B331FF4864F2FFFC086
+      51FFD4A262FFD7A764FFD8A864FFD8A864FFD8A864FFD8A864FFD8A864FFD8A8
+      64FFD8A864FFD8A864FFD8A864FFD8A864FFD8A864FFD8A864FFD8A864FFD8A8
+      64FFC69A5CFF050402FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF21190FFFD8A864FFD8A864FFD8A864FFD8A864FFD6A664FFCA93
+      59FFA1653DFF5E321DFF4A3F3AD0434343894545451A00000000000000000000
+      0000000000000000000000000000434343174F392FAB60331FFEAE7044FFCB96
+      5DFFD4A365FFD5A465FFD5A465FFD5A465FFD5A465FFD5A465FFD5A465FFD5A4
+      65FFD5A465FFD5A465FFD5A465FFD5A465FFD5A465FFD5A465FFD5A465FFD5A4
+      65FFD5A465FFAD8552FF030201FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF16110BFFD5A465FFD5A465FFD5A465FFD5A465FFD5A466FFD19E
+      61FFBB804FFF794429FE573424F1424242A94444443140404004000000000000
+      000000000000000000000000000246464628573424E57B4529FFBF8654FFCF9D
+      63FFD2A066FFD2A066FFD2A066FFD2A066FFD2A066FFD2A066FFD2A066FFD2A0
+      66FF98744AFF5B452CFF4B3924FF7B5D3CFFC4955FFFD2A066FFD2A066FFD2A0
+      66FFD2A066FFD2A066FF9F794DFF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF221A11FFD2A066FFD2A066FFD2A066FFD2A066FFD2A066FFD1A0
+      65FFC7925DFF9C5F3BFF5C311CFE464241BC464646584E4E4E0D000000000000
+      000000000000000000004646460B46403D545C2F1CFD975C39FFC8935FFFCF9C
+      65FFCF9C65FFCF9C65FFCF9C65FFCF9C65FFCF9C65FFCF9C65FFB28757FF241B
+      11FF000000FF000000FF000000FF000000FF000000FF4E3A26FFCF9C65FFCF9C
+      65FFCF9C65FFCF9C65FFCF9C65FF030201FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF755839FFCF9C65FFCF9C65FFCF9C65FFCF9C65FFCF9C65FFCF9D
+      65FFCC9962FFB4774BFF61341EFE4D3B33D8444444843D3D3D19000000000000
+      00000000000000000000434343134E392E9F5E321EFEB07249FFCA9663FFCB99
+      65FFCB9966FFCB9966FFCB9966FFCB9966FFCB9966FFA37A51FF010100FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF1D160FFFCB99
+      66FFCB9966FFCB9966FFCB9966FF0E0A07FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF040302FFCB9966FFCB9966FFCB9966FFCB9966FFCB9966FFCB9966FFCB99
+      66FFCB9865FFBE8658FF794329FE563526EF444444A546464628808080020000
+      0000000000000000000047474719563425D4734026FEBA8055FFC79464FFC894
+      64FFC89464FFC89464FFC89464FFC89464FFC69264FF0C0906FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF8A66
+      45FFC89464FFC89464FFC89464FF0F0B07FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF010000FF261C
+      13FF916B48FFC89464FFC89464FFC89464FFC89464FFC89464FFC89464FFC894
+      64FFC89464FFC28D5EFF925736FF5B301CFE454242B243434339555555060000
+      000000000000000000004A41411F5C311DF98C5032FFBE875CFFC48F63FFC48F
+      63FFC48F63FFC48F63FFC48F63FFC48F63FF3E2D1FFF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF261C
+      13FFC48F63FFC48F63FFC48F63FF19120CFF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF020201FF2A1F15FF6B4D36FFBB895FFFC48F
+      63FFC48F63FFC48F63FFC48F63FFC48F63FFC48F63FFC48F63FFC48F63FFC48F
+      63FFC48F63FFC28D62FFAA6B46FF5C301CFE4C3C35CB434343483333330A0000
+      000000000000000000014B332B405B2F1BFFA0603EFFBE885FFFBF8960FFBF89
+      60FFBF8960FFBF8960FFBF8960FFBD8760FF010100FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF1E15
+      0FFFBF8960FFBF8960FFBF8960FF614631FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF050302FFA57653FFBF8960FFBF8960FFBF8960FFBF89
+      60FFBF8960FFBF8960FFBF8960FFBF8960FFBF8960FFBF8960FFBF8960FFBF89
+      60FFBF8960FFBF8860FFB27651FF683720FD51382CDC444444563B3B3B0D0000
+      000000000000555555035234275E5B2F1BFFA96846FFBB835DFFBB845EFFBB84
+      5EFFBB845EFFBB845EFFBB845EFF75533BFF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF7B57
+      3EFFBB845EFFBB845EFFBB845EFFB9825EFF130E0AFF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF010101FF9E6F4FFFBB845EFFBB845EFFBB845EFFBB845EFFBB84
+      5EFFBB845EFFBB845EFFBB845EFFBB845EFFBB845EFFBB845EFFBB845EFFBB84
+      5EFFBB845EFFBB845EFFB57B56FF723C22FF543627E442424264404040100000
+      000000000000555555065435277D5F321EFDAB6B49FFB77D5AFFB77E5AFFB77E
+      5AFFB77E5AFFB77E5AFFB77E5AFF2E2017FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF010100FF533929FFB77E
+      5AFFB77E5AFFB77E5AFFB77E5AFFB77E5AFFAD7856FF1F150FFF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF624330FFB77E5AFFB77E5AFFB77E5AFFB77E5AFFB77E5AFFB77E
+      5AFFB77E5AFFB77E5AFFB77E5AFFB77E5AFFB77E5AFFB77E5AFFB77E5AFFB77E
+      5AFFB77E5AFFB77E5AFFB57A56FF7A4125FF583424ED44444471434343130000
+      000000000000404040085534259566351FFCAC6D4BFFB47958FFB47958FFB479
+      58FFB47958FFB47958FFB47958FF060403FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF130D09FF99674BFFB47958FFB479
+      58FFB47958FFB47958FFB47958FFB47958FFB47958FFB47958FF7B533CFF2B1D
+      15FF070403FF000000FF000000FF000000FF000000FF000000FF000000FF0101
+      01FF674633FFB47958FFB47958FFB47958FF8B5D44FF2B1D15FF080604FF0806
+      04FF100B08FF573A2AFFB27756FFB47958FFB47958FFB47958FFB47958FFB479
+      58FFB47958FFB47958FFB37956FF83462BFF5B3321F543434379494949150000
+      00000000000055555506583322A56E3A22FDAC704FFFB17757FFB17757FFB177
+      57FFB17757FFB17757FFAD7555FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF010000FF503627FFB17757FFB17757FFB17757FFB177
+      57FFB17757FFB17757FFB17757FFB17757FFB17757FFB17757FFB17757FFB177
+      57FFB17757FF9E6A4DFF573B2BFF271A13FF221711FF251912FF573A2BFFA771
+      53FFB17757FFB17757FFB17757FF402B1FFF000000FF000000FF000000FF0000
+      00FF000000FF000000FF030201FF956449FFB17757FFB17757FFB17757FFB177
+      57FFB17757FFB17757FFB17656FF8B4D30FF5B311EFA44444470434343130000
+      0000000000005555550359311FB6763E25FFAC6F51FFAF7457FFAF7457FFAF74
+      57FFAF7457FFAF7457FF7D533FFF000000FF000000FF000000FF000000FF0000
+      00FF000000FF1A110DFF96634BFFAF7457FFAF7457FFAF7457FFAF7457FFAF74
+      57FFAF7457FFAF7457FFAF7457FFAF7457FFAF7457FFAF7457FFAF7457FFAF74
+      57FFAF7457FFAF7457FFAF7457FFAF7457FFAF7457FFAF7457FFAF7457FFAF74
+      57FFAF7457FFAF7457FF644332FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF090604FFA97055FFAF7457FFAF7457FFAF74
+      57FFAF7457FFAF7457FFAE7355FF915336FF5D301CFE44424264404040100000
+      000000000000000000005A301EAF763D25FFAB6E50FFAE7256FFAE7256FFAE72
+      56FFAE7256FFAE7256FF4C3226FF000000FF2F1F17FF7D523EFF201510FF2116
+      11FF8B5B45FFAE7256FFAE7256FFAE7256FFAE7256FFAE7256FFAE7256FFAE72
+      56FFAE7256FFAE7256FFAE7256FFAE7256FFAE7256FFAE7256FFAE7256FFAE72
+      56FFAE7256FFAE7256FFAE7256FFAE7256FFAE7256FFAE7256FFAE7256FFAE72
+      56FFAE7256FFAE7256FF3F2A1FFF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF36231BFFAE7256FFAE7256FFAE72
+      56FFAE7256FFAE7256FFAD7154FF915337FF5C311DFE414141563B3B3B0D0000
+      000000000000000000005A311E966E3B24FCA96A4DFFAC7155FFAC7155FFAC71
+      55FFAC7155FFAC7155FF956249FF402A20FFAA7155FFAC7155FFAC7155FFAC71
+      55FFAC7155FFAC7155FFAC7155FFAC7155FFAC7155FFAC7155FFAC7155FFAC71
+      55FFAC7155FFAC7155FFAC7155FFAC7155FFAC7155FFAC7155FFAC7155FFAC71
+      55FFAC7155FFAC7155FFAC7155FFAC7155FFAC7155FFAC7155FFAC7155FFAC71
+      55FFAC7155FFAC7155FF472F23FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF18100CFFAC7155FFAC7155FFAC71
+      55FFAC7155FFAC7155FFAB6F53FF8A4E33FF5C321FF944444447393939090000
+      000000000000000000005831217C673723FAA76749FFAC7054FFAC7155FFAC71
+      55FFAC7155FFAC7155FFAC7155FFAC7155FFAC7155FFAC7155FFAC7155FFAC71
+      55FFAC7155FFAC7155FFAC7155FFAC7155FFAC7155FFAC7155FF503528FF291B
+      14FF1B120DFF35231AFF704A38FFAC7155FFAC7155FFAC7155FFAC7155FFAC71
+      55FFAC7155FFAC7155FFAC7155FFAC7155FFAC7155FFAC7155FFAC7155FFAC71
+      55FFAC7155FFAC7155FFA26A4FFF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF090604FFAC7155FFAC7155FFAC71
+      55FFAC7155FFAC7155FFAA6D52FF83492EFF5B3422F146464637555555060000
+      0000000000000000000059312160623520FBA46347FFAC7055FFAD7257FFAD72
+      57FFAD7257FFAD7257FFAD7257FFAD7257FFAD7257FFAD7257FFAD7257FFAD72
+      57FFAD7257FFAD7257FFAD7257FFAD7257FF7D533FFF090605FF000000FF0000
+      00FF000000FF000000FF000000FF100B08FF98644DFFAD7257FFAD7257FFAD72
+      57FFAD7257FFAD7257FFAD7257FFAD7257FFAD7257FFAD7257FFAD7257FFAD72
+      57FFAD7257FFAD7257FFAD7257FF241812FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF040302FFAD7257FFAD7257FFAD72
+      57FFAD7257FFAD7257FFAA6D51FF7C432AFF573424E543434326000000020000
+      00000000000000000000583521415E321FFEA26245FFAD7256FFAF7459FFAF74
+      59FFAF7459FFAF7459FFAF7459FFAF7459FFAF7459FFAF7459FFAF7459FFAF74
+      59FFAF7459FFAF7459FFAF7459FF7B513FFF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF0E0907FFAD7459FFAF7459FFAF74
+      59FFAF7459FFAF7459FFAF7459FFAF7459FFAF7459FFAF7459FFAF7459FFAF74
+      59FFAF7459FFAF7459FFAF7459FF845843FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF150E0BFFAF7459FFAF7459FFAF74
+      59FFAF7459FFAE7459FFAA6D50FF743F28FE553526CB40404018000000000000
+      00000000000000000000583018205E321FFF9C5C41FFAF765CFFB17960FFB179
+      60FFB17960FFB17960FFB17960FFB17960FFB17960FFB17960FFB17960FFB179
+      60FFB17960FFB17960FFB17960FF0B0806FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF885D4AFFB17960FFB179
+      60FF37251EFF090605FF0D0907FF100B09FF1A120EFF8B5F4BFFB17960FFB179
+      60FFB17960FFB17960FFB17960FFB17960FF120C09FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF3C2921FFB17960FFB17960FFB179
+      60FFB17960FFB0785EFFA96B50FF6A3C26FD553425A83B3B3B0D000000000000
+      00000000000000000000000000005E321DEA884F34FFB0785EFFB47E66FFB47E
+      66FFB47E66FFB47E66FFB47E66FFB47E66FFB47E66FFB47E66FFB47E66FFB47E
+      66FFB47E66FFB47E66FF926753FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF8B624FFFAA7860FF140E
+      0BFF000000FF000000FF000000FF000000FF000000FF000000FF5D4134FFB47E
+      66FFB47E66FFB47E66FFB47E66FFB47E66FF714F40FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF010100FFA5745EFFB47E66FFB47E66FFB47E
+      66FFB47E66FFB27A62FFA26448FF5F331FFE5236296340404004000000000000
+      00000000000000000000000000005B2F1D99723F29FCAE735AFFB6816AFFB783
+      6CFFB7836CFFB7836CFFB7836CFFB7836CFFB7836CFFB7836CFFB7836CFFB783
+      6CFFB7836CFFB7836CFF5A4135FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF050303FFB37F6AFF755445FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF7B58
+      49FFB7836CFFB7836CFFB7836CFFB7836CFFB7836CFF140F0CFF000000FF0000
+      00FF000000FF000000FF000000FF3A2922FFB7836CFFB7836CFFB7836CFFB783
+      6CFFB7836CFFB37C63FF8C5239FF5C321FF84040361C00000000000000000000
+      00000000000000000000000000005B2F1D45603520FCA6694FFFB7836CFFBA88
+      71FFBA8871FFBA8871FFBA8871FFBA8871FFBA8871FFBA8871FFBA8871FFBA88
+      71FFBA8871FFBA8871FF5C4438FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF6F5143FFBA8871FF584036FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0C09
+      07FFBA8871FFBA8871FFBA8871FFBA8871FFBA8871FF946C5AFF000000FF0000
+      00FF000000FF000000FF000000FFA97C67FFBA8871FFBA8871FFBA8871FFBA88
+      71FFB98671FFB17960FF74422BFE573221C24949490E00000000000000000000
+      0000000000000000000000000000404000045E331EF590573DFFB8866FFFBD8D
+      78FFBD8D78FFBD8D78FFBD8D78FFBD8D78FFBD8D78FFBD8D78FFBD8D78FFBD8D
+      78FFBD8D78FFBD8D78FF74574AFF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF281E1AFFBD8D78FFBD8D78FF3F2F28FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FFBB8B76FFBD8D78FFBD8D78FFBD8D78FFBD8D78FFBD8D78FFAC806DFF5F47
+      3CFF010000FF000000FF2D221CFFBD8D78FFBD8D78FFBD8D78FFBD8D78FFBD8D
+      78FFBA8973FFAB6F55FF613622FD5435246A5555550300000000000000000000
+      0000000000000000000000000000000000005C2F1BAA76442CFCB58068FFBE90
+      7BFFC0927EFFC0927EFFC0927EFFC0927EFFC0927EFFC0927EFFC0927EFFC092
+      7EFFC0927EFFC0927EFFBA8E7AFF010000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF020101FFBA8E7AFFC0927EFFC0927EFF3D2E28FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FFC0927EFFC0927EFFC0927EFFC0927EFFC0927EFFC0927EFFC0927EFFC092
+      7EFF000000FF000000FFA77F6EFFC0927EFFC0927EFFC0927EFFC0927EFFBF91
+      7DFFBA8973FF955B41FF5E311FFA463A2E160000000000000000000000000000
+      0000000000000000000000000000000000005C2E1C48603520FCA46A50FFBE8F
+      7AFFC29783FFC29783FFC29783FFC29783FFC29783FFC29783FFC29783FFC297
+      83FFC29783FFC29783FFC29783FF1B1512FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF201915FFC29783FFC29783FFC29783FF372A25FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0C09
+      08FFC29783FFC29783FFC29783FFC29783FFC29783FFC29783FFC29783FFBE95
+      81FF000000FF302520FFC29783FFC29783FFC29783FFC29783FFC29783FFC093
+      7FFFB47E66FF71402BFC5A301DB4000000020000000000000000000000000000
+      000000000000000000000000000000000000000000005D301CC77B4832FCB886
+      6FFFC49986FFC59C89FFC59C89FFC59C89FFC59C89FFC59C89FFC59C89FFC59C
+      89FFC59C89FFC59C89FFC59C89FF473831FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF57453DFFC59C89FFC59C89FFBF9885FF010101FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF876B
+      5EFFC59C89FFC59C89FFC59C89FFC59C89FFC59C89FFC59C89FFC59C89FFC59C
+      89FF100C0BFFAE8A79FFC59C89FFC59C89FFC59C89FFC59C89FFC59B88FFBF91
+      7CFF975F46FF5E331FFD5432212D000000000000000000000000000000000000
+      000000000000000000000000000000000000000000005B301D355F3420FEA168
+      50FFC39884FFC8A18FFFC8A190FFC8A190FFC8A190FFC8A190FFC8A190FFC8A1
+      90FFC8A190FFC8A190FFC8A190FF786157FF000000FF000000FF000000FF0000
+      00FF000000FF010101FFAB8A7BFFC8A190FFC8A190FF7F665CFF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF29211EFFC8A1
+      90FFC8A190FFC8A190FFC8A190FFC8A190FFC8A190FFC8A190FFC8A190FFC8A1
+      90FF997B6EFFC8A190FFC8A190FFC8A190FFC8A190FFC8A190FFC69C8AFFB580
+      68FF6C3E2AFC5A311E9F00000001000000000000000000000000000000000000
+      00000000000000000000000000000000000000000000000000005E301BAD7545
+      2FF9BA8872FFC9A291FFCBA596FFCBA596FFCBA596FFCBA596FFCBA596FFCBA5
+      96FFCBA596FFCBA596FFCBA596FFA38478FF000000FF000000FF1A1513FF2C24
+      21FF2D2521FF9C7E73FFCBA596FFCBA596FFCBA596FF40342FFF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF040303FFBA978AFFCBA5
+      96FFCBA596FFCBA596FFCBA596FFCBA596FFCBA596FFCBA596FFCBA596FFCBA5
+      96FFCBA596FFCBA596FFCBA596FFCBA596FFCBA596FFCBA495FFC39884FF925C
+      44FF5F331FF752331E1900000000000000000000000000000000000000000000
+      00000000000000000000000000000000000000000000000000005A2D1E225E34
+      20FC9B634BFFC49988FFCEA99BFFCFAB9CFFCFAB9CFFCFAB9CFFCFAB9CFFCFAB
+      9CFFCFAB9CFFCFAB9CFFCFAB9CFFCBA798FF000000FF000000FFC19F91FFCFAB
+      9CFFCFAB9CFFCFAB9CFFCFAB9CFFCFAB9CFFCFAB9CFF453934FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF0F0C0BFFB69689FFCFAB9CFFCFAB
+      9CFFCFAB9CFFCFAB9CFFCFAB9CFFCFAB9CFFCFAB9CFFCFAB9CFFCFAB9CFFCFAB
+      9CFFCFAB9CFFCFAB9CFFCFAB9CFFCFAB9CFFCEAA9BFFC9A291FFB27D66FF683C
+      28FA5B301C810000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000005D31
+      1D82663A26FAAB755EFFCAA494FFD2B0A3FFD2B1A4FFD2B1A4FFD2B1A4FFD2B1
+      A4FFD2B1A4FFD2B1A4FFD2B1A4FFD2B1A4FF020101FF1B1615FFD2B1A4FFD2B1
+      A4FFD2B1A4FFD2B1A4FFD2B1A4FFD2B1A4FFD2B1A4FFD2B1A4FF493D38FF0605
+      04FF000000FF000000FF000000FF27211FFFCEAFA2FFD2B1A4FFD2B1A4FFD2B1
+      A4FFD2B1A4FFD2B1A4FFD2B1A4FFD2B1A4FFD2B1A4FFD2B1A4FFD2B1A4FFD2B1
+      A4FFD2B1A4FFD2B1A4FFD2B1A4FFD2B0A3FFCEAA9BFFBC8B77FF7A4934FC5E32
+      1DDE5D2F170B0000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00015E311DB56F412DF9B6846EFFD0AD9FFFD5B6A9FFD5B7AAFFD5B7AAFFD5B7
+      AAFFD5B7AAFFD5B7AAFFD5B7AAFFD5B7AAFF0C0A09FF9F887FFFD5B7AAFFD5B7
+      AAFFD5B7AAFFD5B7AAFFD5B7AAFFD5B7AAFFD5B7AAFFD5B7AAFFD5B7AAFF8B78
+      6FFF000000FF000000FF25201EFFD5B7AAFFD5B7AAFFD5B7AAFFD5B7AAFFD5B7
+      AAFFD5B7AAFFD5B7AAFFD5B7AAFFD5B7AAFFD5B7AAFFD5B7AAFFD5B7AAFFD5B7
+      AAFFD5B7AAFFD5B7AAFFD5B7AAFFD3B2A5FFC49886FF88543FFE603120F3552B
+      1C24000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000552B150C5D321EDA7A4B35FBC0927FFFD4B4A8FFD8BBB0FFD9BCB1FFD9BC
+      B1FFD9BCB1FFD9BCB1FFD9BCB1FFD9BCB1FF6F605AFFD9BCB1FFD9BCB1FFD9BC
+      B1FFD9BCB1FFD9BCB1FFD9BCB1FFD9BCB1FFD9BCB1FFD9BCB1FFD9BCB1FF1B18
+      16FF000000FF090807FFD1B4ABFFD9BCB1FFD9BCB1FFD9BCB1FFD9BCB1FFD9BC
+      B1FFD9BCB1FFD9BCB1FFD9BCB1FFD9BCB1FFD9BCB1FFD9BCB1FFD9BCB1FFD9BC
+      B1FFD9BCB1FFD9BCB1FFD7B9ADFFCAA393FF98634DFF603520FC582E1B420000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000005D2E17215F3320F1875640FEC59B89FFD7B9ADFFDBC1B7FFDCC2
+      B8FFDCC2B8FFDCC2B8FFDCC2B8FFDCC2B8FFDCC2B8FFDCC2B8FFDCC2B8FFDCC2
+      B8FFDCC2B8FFDCC2B8FFDCC2B8FFDCC2B8FFDCC2B8FFDCC2B8FFDCC2B8FF0404
+      04FF0D0B0BFFC5ADA4FFDCC2B8FFDCC2B8FFDCC2B8FFDCC2B8FFDCC2B8FFDCC2
+      B8FFDCC2B8FFDCC2B8FFDCC2B8FFDCC2B8FFDCC2B8FFDCC2B8FFDCC2B8FFDCC2
+      B8FFDCC2B7FFDABEB3FFCDA99AFFA57059FF623824FC5B2F1B68000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000059311C3F5F3321F984543FFCC19482FFD7BAAEFFDFC6
+      BDFFDFC8BFFFDFC8BFFFDFC8BFFFDFC8BFFFDFC8BFFFDFC8BFFFDFC8BFFFDFC8
+      BFFFDFC8BFFFDFC8BFFFDFC8BFFFDFC8BFFFDFC8BFFFDFC8BFFFDFC8BFFFC7B3
+      ABFFD7C0B7FFDFC8BFFFDFC8BFFFDFC8BFFFDFC8BFFFDFC8BFFFDFC8BFFFDFC8
+      BFFFDFC8BFFFDFC8BFFFDFC8BFFFDFC8BFFFDFC8BFFFDFC8BFFFDFC8BFFFDFC7
+      BEFFDBC0B7FFCBA596FF9E6B53FF633925FB5D301E9300000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000005A2D19335F331EEA774935FAB98A76FFD7BA
+      AEFFE1CBC2FFE3CDC5FFE3CDC5FFE3CDC5FFE3CDC5FFE3CDC5FFE3CDC5FFE3CD
+      C5FFE3CDC5FFE3CDC5FFE3CDC5FFE3CDC5FFE3CDC5FFE3CDC5FFE3CDC5FFE3CD
+      C5FFE3CDC5FFE3CDC5FFE3CDC5FFE3CDC5FFE3CDC5FFE3CDC5FFE3CDC5FFE3CD
+      C5FFE3CDC5FFE3CDC5FFE3CDC5FFE3CDC5FFE3CDC5FFE3CDC5FFE2CCC4FFDCC2
+      B7FFC89F8FFF905F48FE613622FD5C311E790000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000005C331F195E321DCF6E422EF9AF7E
+      69FFD5B6A9FFE1CAC1FFE6D1CBFFE6D3CDFFE6D3CDFFE6D3CDFFE6D3CDFFE6D3
+      CDFFE6D3CDFFE6D3CDFFE6D3CDFFE6D3CDFFE6D3CDFFE6D3CDFFE6D3CDFFE6D3
+      CDFFE6D3CDFFE6D3CDFFE6D3CDFFE6D3CDFFE6D3CDFFE6D3CDFFE6D3CDFFE6D3
+      CDFFE6D3CDFFE6D3CDFFE6D3CDFFE6D3CDFFE6D2CCFFE3CDC6FFDBBFB5FFC195
+      83FF83523DFB5F3420F75A301A4F000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000000000000000000000602020085D301CA9653A
+      27FA94614CFFC49988FFDCC1B7FFE5D1CAFFE9D8D2FFEAD8D3FFEAD8D3FFEAD8
+      D3FFEAD8D3FFEAD8D3FFEAD8D3FFEAD8D3FFEAD8D3FFEAD8D3FFEAD8D3FFEAD8
+      D3FFEAD8D3FFEAD8D3FFEAD8D3FFEAD8D3FFEAD8D3FFEAD8D3FFEAD8D3FFEAD8
+      D3FFEAD8D3FFEAD8D3FFE9D8D3FFE7D4CEFFE0C8C0FFCFAB9CFFA87661FF7245
+      31F95E331FE6592C1C2E00000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000005E31
+      1D6860331FED6E412FF99E6D57FFCBA596FFE0C9C0FFE8D5D0FFEBDBD7FFEDDE
+      DAFFEDDEDAFFEDDEDAFFEDDEDAFFEDDEDAFFEDDEDAFFEDDEDAFFEDDEDAFFEDDE
+      DAFFEDDEDAFFEDDEDAFFEDDEDAFFEDDEDAFFEDDEDAFFEDDEDAFFEDDEDAFFEDDE
+      DAFFECDCD8FFE9D8D3FFE4CEC8FFD5B6AAFFB1836EFF7D4D3AFA613622FD5D31
+      1D9B553118150000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00005D2E170B5D311D7E603521F6744635F9A67560FFCAA494FFDDC3BAFFE6D2
+      CBFFEADAD5FFEEE0DCFFF0E3E0FFF0E3E1FFF0E3E1FFF0E3E1FFF0E3E1FFF0E3
+      E1FFF0E3E1FFF0E3E1FFF0E3E1FFF0E3E1FFF0E3E1FFEFE1DEFFECDCD7FFE8D5
+      CFFFE1CBC2FFD2B0A4FFB78A75FF855541FC633926FE5E321EB25C2E1A270000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000553118155D301E93603722FB6A412DF9855541FDA97A
+      66FFC9A292FFDCC2B8FFE6D3CDFFE9D7D2FFEAD9D4FFECDCD7FFEDDEDAFFEEDF
+      DCFFEDDEDBFFECDCD8FFEADBD5FFE9D8D3FFE7D5CEFFE1CBC2FFD1AEA0FFB588
+      75FF91604CFF734734F9633926FF5F321EC65D2E1C3700000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000552B1C125C2E1B5E5F311EB36337
+      24F8683F2CFB7F513BFB94644EFFA3745FFFAF816EFFBA8F7EFFC69D8DFFCCA7
+      97FFC9A191FFBF9584FFB38775FFA77965FF996954FF885743FE704532F96339
+      26FF5F331FD45A2F1B7C5D2E1D2C000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000005539
+      1C095C2E1A4E5E301D9D603420CB633623E6633725F9643A28FF663D2AFF693F
+      2DFC673E2BFF653B28FF643926FD623724ED613521D65F311EB45C2F1A6C582C
+      1A1D000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000000000000000000000603020105B31182A5D2E
+      1B425D311D345C331F1955550003000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000FFFFFFF80FFFFFFFFFFFFE00007FFFFFFFFFF0000007FFFFFFFFC0000001
+      FFFFFFFF00000000FFFFFFFC000000003FFFFFF8000000001FFFFFF000000000
+      07FFFFC00000000003FFFF800000000001FFFF800000000000FFFF0000000000
+      007FFE0000000000007FFC0000000000003FFC0000000000001FF80000000000
+      001FF80000000000000FF00000000000000FF000000000000007E00000000000
+      0007E000000000000007E000000000000003C000000000000003C00000000000
+      0003C000000000000001C000000000000001C000000000000001800000000000
+      0001800000000000000180000000000000018000000000000001800000000000
+      00018000000000000001C000000000000001C000000000000001C00000000000
+      0001C000000000000001C000000000000003C000000000000003E00000000000
+      0003E000000000000007E000000000000007E000000000000007F00000000000
+      000FF00000000000000FF80000000000001FF80000000000001FFC0000000000
+      003FFC0000000000007FFE0000000000007FFE000000000000FFFF0000000000
+      01FFFF800000000003FFFFC00000000007FFFFE0000000000FFFFFF000000000
+      1FFFFFF8000000003FFFFFFE000000007FFFFFFF00000001FFFFFFFFC0000007
+      FFFFFFFFF000001FFFFFFFFFFE0000FFFFFFFFFFFFF81FFFFFFFFFFFFFFFFFFF
+      FFFF280000003000000060000000010020000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000055555503333333055555
+      5506494949074040400840404008494949075555550633333305555555030000
+      0001000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000001404040044040400840404010444444314242424D4343
+      435F4643437244424281464444854343437643434363444444524444443C4646
+      46163333330A3333330500000002000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00014949490746464616434343454441417C434342AD464543C2494743C64B45
+      3FCC51443AD3544334DA534436D84F443CD14A4440C9484744C5464543C34444
+      43B84444448B4545455544444422393939090000000200000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000000000000000000000000000012B2B2B064646
+      461642424261444443AF4A4541C6544235DA613E28F06C4021FC714521FD794A
+      24FC815226FC8A5829FD865428FD7D4E25FC754723FC6F4322FD683D23F85A3E
+      2EE64F433BD3464543C6444443BB4242427C4343432639393909000000010000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000000000023C3C3C11434343574545
+      44AA4F4239D3643D26F4714522FD895629FDA4682EFFBA7933FFC28235FFC687
+      36FFCB8C37FFCF9138FFCD8F37FFC98937FFC48436FFC07F35FFB17231FF985F
+      2BFE7B4C25FC6B3F22FB5B3E2DE9494541CB454444B8444444713C3C3C1E4040
+      4004000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000004040400442424223454444924B423CCD613D
+      27F2794B26FCA6692FFFC08036FFCD8F39FFD99F3CFFE2A93EFFE6AD3EFFE8B0
+      3EFFEBB43FFFEDB640FFECB53FFFEAB23EFFE7AF3EFFE4AB3EFFDFA53CFFD396
+      3AFFC78838FFB67635FF925C2CFD6B4022FC573F31E3474645C7434343AB3F3F
+      3F3D404040080000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000004949490744444438454342AA5B3E2CEA734624FCA065
+      30FFC4853BFFD89E40FFE3AA41FFEAB443FFF1BD44FFF5C145FFF6C346FFF7C3
+      46FFF7C445FFF8C546FFF8C545FFF7C346FFF7C246FFF6C245FFF4C045FFEEB8
+      43FFE6B043FFDFA641FFCF933DFFB67737FF8A562BFD683E23FA4E4139D74343
+      43BA4040405B3B3B3B0D00000001000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000404040084545454E47433FBD623B25F58B572DFDBE7F3BFFD499
+      42FFE3AC46FFEFBA49FFF2BF4AFFF4C14BFFF6C34BFFF7C44BFFF7C44BFFF7C4
+      4CFFF7C44CFFF7C44CFFF7C44CFFF7C44CFFF7C44BFFF7C44BFFF6C44BFFF5C3
+      4AFFF3C14AFFF2BE4AFFEAB448FFDDA545FFCA8E40FFAD6F35FF6F4324FC543F
+      33E1434343C14141417940404010000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00002B2B2B06444444404B403CC6673C22FA9A6132FEC88D42FFDEA84AFFEAB7
+      4EFFEFBD50FFF2C050FFF2C150FFF3C150FFF3C150FFF3C150FFF3C150FFF3C1
+      50FFF3C150FFF3C150FFF3C150FFF3C150FFF3C150FFF3C150FFF3C150FFF3C1
+      50FFF2C150FFF2C150FFF1BF50FFEEBB4EFFE5B04CFFD69E47FFB7793BFF794A
+      29FC5B3D2CEC434342C34545456F4646460B0000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000005555
+      55034343432E4A3F3BBE673D23FCA76B37FFCD9348FFE2AD50FFEBBA54FFEEBD
+      54FFEFBE55FFEFBE55FFEFBE55FFEFBE55FFEFBE55FFEFBE55FFBF9844FF4134
+      17FF3E3116FF443618FF48391AFF52411DFF927334FFE4B651FFEFBE55FFEFBE
+      55FFEFBE55FFEFBE55FFEFBE55FFEEBE55FFEDBB54FFE8B653FFD9A24DFFBF81
+      42FF84522DFD5B3928F0444444BF434343574040400800000000000000000000
+      0000000000000000000000000000000000000000000000000000000000013E3E
+      3E1D46403DA9643923FAA56938FFD0974CFFE2AE55FFE9B859FFEBBA59FFEBBB
+      59FFEBBB59FFEBBB59FFEBBB59FFEBBB59FFEBBB59FF3C3017FF010100FF0000
+      00FF000000FF000000FF000000FF000000FF010100FF000000FF060502FF2A21
+      10FF775E2DFFE3B557FFEBBB59FFEBBB59FFEBBA59FFEABA59FFE7B558FFDAA4
+      51FFC28545FF7B4A2AFC553D2FE6434343BA4545453F40404004000000000000
+      00000000000000000000000000000000000000000000000000003333330A4441
+      41775F3925F4965E34FECC944EFFE1AF59FFE6B55CFFE7B75CFFE7B75CFFE7B7
+      5CFFE7B75CFFE7B75CFFE7B75CFFE7B75CFF68522AFF010100FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF010100FF010100FF2A2111FFA48242FFE7B75CFFE7B75CFFE7B65DFFE4B3
+      5BFFD9A556FFB97C43FF6E4127FC4E3E35DB434343A340404014000000000000
+      00000000000000000000000000000000000000000000808080024040402C5738
+      2AE384502FFDC48B4DFFDCAA5BFFE2B35FFFE3B35FFFE3B35FFFE3B35FFFE3B3
+      5FFFE3B35FFFE3B35FFFE3B35FFFE3B35FFF040302FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF010100FF070603FFB28D4AFFE3B35FFFE3B3
+      5FFFE1B05EFFD39E55FFAE713FFF633922FC47413ECB4242425D494949070000
+      000000000000000000000000000000000000000000004646460B483E3A96653A
+      23FCBA7E48FFD6A45CFFDEAE61FFDFAF62FFDFAF62FFDFAF62FFDFAF62FFDFAF
+      62FFDFAF62FFDFAF62FFDFAF62FFBC9453FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF010101FF9A7943FFDFAF
+      62FFDFAF61FFDCAB60FFCC9655FF915935FE593828EE434343AF4646461D0000
+      00010000000000000000000000000000000055555503414141335A3727EC945C
+      36FFCF9A5AFFDAAA62FFDBAB64FFDBAB64FFDBAB64FFDBAB64FFDBAB64FFDBAB
+      64FFDBAB64FFDBAB64FFDBAB64FFD3A560FF060503FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF020201FFDBAB
+      64FFDBAB64FFDBAB64FFD7A660FFBD814DFF683D24FC483E3BCF454545684949
+      490700000000000000000000000000000000494949074B3C3589683B24FCBC82
+      4FFFD5A462FFD7A764FFD7A764FFD7A764FFD7A764FFD7A764FFD7A764FFD7A7
+      64FFD7A764FFD7A764FFD7A764FFD7A764FFA8824EFF010101FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FFC89B
+      5DFFD7A764FFD7A764FFD7A664FFCD995DFF99603AFF5B3624F3434343A43B3B
+      3B0D000000000000000000000000000000003737370E5A3525E5965B38FFCB96
+      5EFFD3A265FFD3A265FFD3A265FFD3A265FFD3A265FFD3A265FFD3A265FFD3A2
+      65FFD3A265FFD3A265FFD3A265FFD3A265FFD3A265FF8E6D44FF010000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF010100FF9170
+      46FFD3A265FFD3A265FFD3A265FFD29F64FFBD8352FF663923FC49403BCA3D3D
+      3D2E80808002000000000000000080808002443F3F345D331EFCB5794DFFCE9B
+      64FFCF9D66FFCF9D66FFCF9D66FFCF9D66FFCD9B66FF533F28FF010101FF0100
+      00FF030201FF0F0B07FFA98053FFCF9D66FFCF9D66FFCF9D66FF100C08FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF010000FFBA8D
+      5CFFCF9D66FFCF9D66FFCF9D66FFCF9D65FFC99460FF874F30FE52392DE24242
+      4265494949070000000000000000555555064F382F8D6F3E27FBC18B5BFFCB97
+      65FFCB9865FFCB9865FFCB9865FFCB9865FF17110BFF010000FF000000FF0000
+      00FF000000FF000000FF010101FF99724CFFCB9865FFCB9865FF2C2116FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF010000FF201810FFCB98
+      65FFCB9865FFCB9865FFCB9865FFCB9865FFCA9664FFA56A43FF5C3321F74444
+      44974D4D4D0A0000000000000000404040085A3625CE8E5435FFC38E61FFC691
+      63FFC69163FFC69163FFC69163FF57402CFF010000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF251B13FFC69163FFC69163FF553E2BFF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF010000FF010101FF1B140DFF76573BFFC69163FFC691
+      63FFC69163FFC69163FFC69163FFC69163FFC69163FFB87D53FF603420FC4641
+      3EB74040400C0000000000000000393939095D321EF3A66744FFC08A60FFC08B
+      61FFC08B61FFC08B61FFBE8961FF010101FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF080604FFC08B61FFC08B61FF815D42FF0100
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF010000FF513B29FFC08B61FFC08B61FFC08B61FFC08B61FFC08B
+      61FFC08B61FFC08B61FFC08B61FFC08B61FFC08B61FFBC845BFF754027FC4D3B
+      33D43939391200000000000000004646460B5E311DFAAE6F4BFFBA835CFFBA83
+      5CFFBA835CFFBA835CFF76533AFF010100FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF010000FF533A29FFBA835CFFBA835CFFB8815CFF281C
+      14FF010000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF513928FFBA835CFFBA835CFFBA835CFFBA835CFFBA835CFFBA83
+      5CFFBA835CFFBA835CFFBA835CFFBA835CFFBA835CFFBA825BFF83492DFF5139
+      2DDD4646462100000001000000004D3333145F321EFBAD704EFFB47B58FFB47B
+      58FFB47B58FFB47B58FF2D1E16FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF020101FF644531FFB47B58FFB47B58FFB47B58FFB47B58FFB47B
+      58FF4F3626FF020101FF010100FF000000FF000000FF000000FF000000FF0000
+      00FF473023FFB47B58FFB47B58FFB27B58FF684833FF553A29FF6D4B35FFB47B
+      58FFB47B58FFB47B58FFB47B58FFB47B58FFB47B58FFB47B58FF8B5033FF5537
+      29E74242423255555503000000005431262C633520F9AE7251FFB27757FFB277
+      57FFB27757FFB27757FF080504FF000000FF000000FF000000FF000000FF0100
+      00FF1B120DFFA46E51FFB27757FFB27757FFB27757FFB27757FFB27757FFB277
+      57FFB27757FFB27757FF8E5F46FF483023FF140D0AFF19100CFF39271CFF6C49
+      35FFB27757FFB27757FF6B4734FF010101FF010100FF010000FF010000FF0302
+      01FF7A513CFFB27757FFB27757FFB27757FFB27757FFB27757FF955739FF5A35
+      25EE4444442D8080800200000000593320426A3823F8AD7153FFAF7457FFAF74
+      57FFAF7457FFAF7457FF010000FF010101FF000000FF000000FF050303FF6342
+      32FFAF7457FFAF7457FFAF7457FFAF7457FFAF7457FFAF7457FFAF7457FFAF74
+      57FFAF7457FFAF7457FFAF7457FFAF7457FFAF7457FFAF7457FFAF7457FFAF74
+      57FFAF7457FFAD7255FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF020101FF98654CFFAF7457FFAF7457FFAF7457FFAF7457FF9B5B3EFF5C34
+      22F44040401C000000010000000058302133673722F6AC6F52FFAE7256FFAE72
+      56FFAE7256FFA66C52FF070503FF835641FF9B664DFF6F4937FFAE7256FFAE72
+      56FFAE7256FFAE7256FFAE7256FFAE7256FFAE7256FFAE7256FFAE7256FFAE72
+      56FFAE7256FFAE7256FFAE7256FFAE7256FFAE7256FFAE7256FFAE7256FFAE72
+      56FFAE7256FF99644CFF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF3C271DFFAE7256FFAE7256FFAE7256FFAD7155FF97593DFF5D36
+      25EF3333330F00000000000000004F31271962331FF7A86A4EFFAC6F55FFAC6F
+      55FFAC6F55FFAC6F55FFAC6F55FFAC6F55FFAC6F55FFAC6F55FFAC6F55FFAC6F
+      55FFAC6F55FFAC6F55FF885844FF55372AFF5E3D2FFF6B4535FFAA6F55FFAC6F
+      55FFAC6F55FFAC6F55FFAC6F55FFAC6F55FFAC6F55FFAC6F55FFAC6F55FFAC6F
+      55FFAC6F55FFAC6F55FF050302FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF211510FFAC6F55FFAC6F55FFAC6F55FFAC6F54FF8F5237FF5936
+      28E14040400C0000000000000000333333055F321FF8A7684CFFAC7157FFAC71
+      58FFAC7158FFAC7158FFAC7158FFAC7158FFAC7158FFAC7158FFAC7158FFAC71
+      58FFAC7158FF3A261EFF010000FF010100FF010101FF010100FF040202FF8557
+      44FFAC7158FFAC7158FFAC7158FFAC7158FFAC7158FFAC7158FFAC7158FFAC71
+      58FFAC7158FFAC7158FF452E24FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF1E140FFFAC7158FFAC7158FFAC7158FFAC7056FF864B32FF5638
+      29C7393939090000000000000000000000015F331EEFA4664AFFAF775DFFAF77
+      5EFFAF775EFFAF775EFFAF775EFFAF775EFFAF775EFFAF775EFFAF775EFFAF77
+      5EFF684637FF010000FF000000FF000000FF000000FF000000FF000000FF0705
+      04FFAF775EFFAF775EFF7B5442FF583B2FFF5D3F32FF7F5644FFAF775EFFAF77
+      5EFFAF775EFFAF775EFFA57159FF010100FF000000FF000000FF000000FF0000
+      00FF010101FF664637FFAF775EFFAF775EFFAF775EFFAF765CFF7B442DFD5335
+      289A3333330500000000000000000000000061331EC8955A3FFFB37C63FFB37D
+      65FFB37D65FFB37D65FFB37D65FFB37D65FFB37D65FFB37D65FFB37D65FFB37D
+      65FF130D0BFF000000FF000000FF000000FF000000FF000000FF000000FF0201
+      01FFB37D65FF453027FF010000FF010100FF010100FF000000FF523A2FFFB37D
+      65FFB37D65FFB37D65FFB37D65FF2E211AFF000000FF000000FF000000FF0000
+      00FF010101FFB17D65FFB37D65FFB37D65FFB37D65FFAF765CFF673824FB5737
+      2A4F000000010000000000000000000000005B301D6C79442DF9B58069FFB783
+      6CFFB7836CFFB7836CFFB7836CFFB7836CFFB7836CFFB7836CFFB7836CFFB783
+      6CFF000000FF000000FF000000FF000000FF000000FF000000FF000000FF2219
+      14FFB7836CFF000000FF000000FF000000FF000000FF000000FF000000FF422F
+      27FFB7836CFFB7836CFFB7836CFFA97964FF010101FF000000FF000000FF0000
+      00FF231915FFB7836CFFB7836CFFB7836CFFB7836CFFA76C51FF5E331FF84040
+      400C0000000000000000000000000000000059311E1A623520F4B27A63FFBB8A
+      74FFBB8A75FFBB8A75FFBB8A75FFBB8A75FFBB8A75FFBB8A75FFBB8A75FFBB8A
+      75FF020201FF000000FF000000FF000000FF000000FF000000FF010100FFAA7E
+      6AFFB1826FFF000000FF000000FF000000FF000000FF000000FF000000FF0403
+      03FFBB8A75FFBB8A75FFBB8A75FFBB8A75FF6A4E42FF0B0807FF000000FF0000
+      00FF987060FFBB8A75FFBB8A75FFBB8A75FFBA8872FF90573FFF5D3623C13333
+      3305000000000000000000000000000000000000000060341FD9A0674EFFBE8F
+      7BFFBF917DFFBF917DFFBF917DFFBF917DFFBF917DFFBF917DFFBF917DFFBF91
+      7DFF130E0CFF000000FF000000FF000000FF000000FF000000FF372A24FFBF91
+      7DFFA47C6BFF010100FF000000FF000000FF000000FF000000FF000000FF0202
+      01FFBF917DFFBF917DFFBF917DFFBF917DFFBF917DFFBF917DFF000000FF1E17
+      14FFBF917DFFBF917DFFBF917DFFBF917DFFBB8A74FF703E28F9593223550000
+      000000000000000000000000000000000000000000005B2F1B6875422BF4BE8E
+      7AFFC39884FFC39884FFC39884FFC39884FFC39884FFC39884FFC39884FFC398
+      84FF41332CFF000000FF000000FF000000FF000000FF010000FFB78E7CFFC398
+      84FF8A6B5DFF010100FF000000FF000000FF000000FF000000FF000000FF0907
+      06FFC39884FFC39884FFC39884FFC39884FFC39884FFC39884FF010101FFA07D
+      6DFFC39884FFC39884FFC39884FFC29683FFA77057FF603420F04D33330A0000
+      000000000000000000000000000000000000000000004040000460331EE5A46E
+      55FFC59C89FFC79F8DFFC79F8DFFC79F8DFFC79F8DFFC79F8DFFC79F8DFFC79F
+      8DFF786055FF010101FF000000FF000000FF000000FF120E0DFFC79F8DFFC79F
+      8DFF201A17FF000000FF000000FF000000FF000000FF000000FF010100FF8B6F
+      63FFC79F8DFFC79F8DFFC79F8DFFC79F8DFFC79F8DFFC79F8DFF5E4B43FFC79F
+      8DFFC79F8DFFC79F8DFFC79F8DFFC0937FFF72422DF95C31206B000000000000
+      00000000000000000000000000000000000000000000000000005C2E1C536E3E
+      28F3C29583FFCAA594FFCBA595FFCBA595FFCBA595FFCBA595FFCBA595FFCBA5
+      95FFA98A7CFF000000FF010101FF100D0BFF171311FFAB8B7EFFCBA595FFCBA5
+      95FF030302FF000000FF000000FF000000FF000000FF010000FF2A221FFFCBA5
+      95FFCBA595FFCBA595FFCBA595FFCBA595FFCBA595FFCBA595FFCBA595FFCBA5
+      95FFCBA595FFCBA595FFC9A291FFA36D55FF5F331FE355000003000000000000
+      0000000000000000000000000000000000000000000000000000000000006133
+      1ED599654DFECCA797FFCFAC9EFFCFAC9EFFCFAC9EFFCFAC9EFFCFAC9EFFCFAC
+      9EFFCDAA9CFF000000FF3C312EFFCFAC9EFFCFAC9EFFCFAC9EFFCFAC9EFFCFAC
+      9EFF14100FFF010000FF000000FF000000FF010000FF3F3430FFCFAC9EFFCFAC
+      9EFFCFAC9EFFCFAC9EFFCFAC9EFFCFAC9EFFCFAC9EFFCFAC9EFFCFAC9EFFCFAC
+      9EFFCFAC9EFFCFAB9CFFC0937FFF6B3C27F45A2E1D4C00000000000000000000
+      0000000000000000000000000000000000000000000000000000000000005E2F
+      1B26623521F0AE7B66FFD1B0A2FFD4B4A7FFD4B4A7FFD4B4A7FFD4B4A7FFD4B4
+      A7FFD4B4A7FF060505FFB3978CFFD4B4A7FFD4B4A7FFD4B4A7FFD4B4A7FFD4B4
+      A7FFD4B4A7FF675852FF000000FF000000FF675852FFD4B4A7FFD4B4A7FFD4B4
+      A7FFD4B4A7FFD4B4A7FFD4B4A7FFD4B4A7FFD4B4A7FFD4B4A7FFD4B4A7FFD4B4
+      A7FFD3B3A6FFCAA292FF7F4D37F860321FA90000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00005B2F1A46673A23F2BE917FFFD6B8ACFFD8BBB0FFD8BBB0FFD8BBB0FFD8BB
+      B0FFD8BBB0FF6B5D58FFD8BBB0FFD8BBB0FFD8BBB0FFD8BBB0FFD8BBB0FFD8BB
+      B0FFD8BBB0FF453C38FF000000FF3E3633FFD8BBB0FFD8BBB0FFD8BBB0FFD8BB
+      B0FFD8BBB0FFD8BBB0FFD8BBB0FFD8BBB0FFD8BBB0FFD8BBB0FFD8BBB0FFD8BB
+      AFFFD2B0A3FF935F48FC60341FD2552B2B060000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000005C301D7472422DF2C69D8CFFDABFB4FFDDC3B9FFDDC3B9FFDDC3
+      B9FFDDC3B9FFDDC3B9FFDDC3B9FFDDC3B9FFDDC3B9FFDDC3B9FFDDC3B9FFDDC3
+      B9FFDDC3B9FF2C2725FF393230FFDDC3B9FFDDC3B9FFDDC3B9FFDDC3B9FFDDC3
+      B9FFDDC3B9FFDDC3B9FFDDC3B9FFDDC3B9FFDDC3B9FFDDC3B9FFDCC2B8FFD5B7
+      AAFFA26F57FF623520E85D2E1716000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000005F311E8A6C3E29F2BB8F7CFFDDC4BAFFE1CAC1FFE1CB
+      C2FFE1CBC2FFE1CBC2FFE1CBC2FFE1CBC2FFE1CBC2FFE1CBC2FFE1CBC2FFE1CB
+      C2FFE1CBC2FFE1CBC2FFE1CBC2FFE1CBC2FFE1CBC2FFE1CBC2FFE1CBC2FFE1CB
+      C2FFE1CBC2FFE1CBC2FFE1CBC2FFE1CBC2FFE1CBC2FFE0C9C0FFD4B4A8FF9561
+      4BFC613521E65D32192900000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000005B2F1C5C643924F1AC7C68FFDEC5BBFFE4CE
+      C8FFE6D1CBFFE6D1CBFFE6D1CBFFE6D1CBFFE6D1CBFFE6D1CBFFE6D1CBFFE6D1
+      CBFFE6D1CBFFE6D1CBFFE6D1CBFFE6D1CBFFE6D1CBFFE6D1CBFFE6D1CBFFE6D1
+      CBFFE6D1CBFFE6D1CBFFE6D1CBFFE5D1CAFFE2CCC5FFD0AD9FFF83523BF56133
+      1FCF59331A140000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000005D2E1C37613521EC895742F8C9A3
+      94FFE5D2CAFFE9D7D2FFEAD9D4FFEAD9D4FFEAD9D4FFEAD9D4FFEAD9D4FFEAD9
+      D4FFEAD9D4FFEAD9D4FFEAD9D4FFEAD9D4FFEAD9D4FFEAD9D4FFEAD9D4FFEAD9
+      D4FFEAD9D4FFEAD8D3FFE7D4CEFFDDC3B9FFAE806DFF6D3E2AF260311DA36633
+      3305000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000000000006227140D60321D8C6438
+      24F1976852FBD3B3A7FFE9D7D2FFECDCD7FFEDDEDBFFEEE1DDFFEEE1DDFFEEE1
+      DDFFEEE1DDFFEEE1DDFFEEE1DDFFEEE1DDFFEEE1DDFFEEE1DDFFEEDFDCFFECDD
+      D9FFEADBD5FFE3CDC6FFBC9280FF774832F2623520DB5D2E1B42000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000005831
+      1D1A61331EA8663A24F286543FF6B38876FFD6B7ACFFEBDAD6FFEEE1DDFFEFE2
+      DFFFF0E3E0FFF0E3E1FFF0E3E1FFEFE2DFFFEFE1DEFFEEE0DCFFE2CCC4FFC7A1
+      91FF9E6F5BFE72442DEF623422E85E321E5C0000000100000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000602B20185D2F1E66643623C5633823F3764530F08C5A46F79C6D
+      59FFAB7F6DFFB88F7FFFB28876FFA47764FF946450FC82513BF36C3C28EF6236
+      22EA623521975A2D1D3E55550003000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000005D2E170B5A2F1D475E3420666134
+      2182643621A6643723C2643722B6633622965F331F735C301D59592F1E2B0000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000FFFFE003FFFFFFFFFFFE00007FFFFFFFFFF800001FFF
+      FFFFFFE0000007FFFFFFFFC0000003FFFFFFFF80000001FFFFFFFF000000007F
+      FFFFFE000000007FFFFFFC000000003FFFFFF8000000001FFFFFF0000000000F
+      FFFFF0000000000FFFFFE00000000007FFFFE00000000003FFFFC00000000003
+      FFFFC00000000003FFFFC00000000001FFFF800000000001FFFF800000000001
+      FFFF800000000001FFFF800000000001FFFF800000000000FFFF800000000000
+      FFFF800000000000FFFF800000000000FFFF800000000001FFFF800000000001
+      FFFF800000000001FFFF800000000001FFFFC00000000001FFFFC00000000003
+      FFFFC00000000003FFFFE00000000007FFFFE00000000007FFFFE0000000000F
+      FFFFF0000000000FFFFFF8000000001FFFFFF8000000003FFFFFFC000000003F
+      FFFFFE000000007FFFFFFF00000000FFFFFFFF80000001FFFFFFFFC0000003FF
+      FFFFFFE000000FFFFFFFFFF800001FFFFFFFFFFE00007FFFFFFFFFFFC007FFFF
+      FFFFFFFFFFFFFFFFFFFF28000000200000004000000001002000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000002434343134646461655555503000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000000000000000000000000000004040400C4541
+      414744444285444443B548433FCD4C413BD54A423DD4464340CC454544B94444
+      4391444444534646461600000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000004949490E4545426F4C413BD06545
+      2DEB784B28F6835229FA8B572AFB955F2CFC915C2BFC88562AFA805128F97249
+      29F45C4432E346423FCF434343864444441E0000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000004545454E4D4139CE6F4629F5935D2DFCBB7D
+      34FFD39639FFE0A73BFFE6AE3DFFEAB33EFFE9B23EFFE4AB3DFFDDA33CFFCD8F
+      38FFAF7232FF83522AFA65432CEE46423FCD4343436F55555503000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000404040044745417C64422BEF8E5B2EFCC6893CFFE3AC43FFECB7
+      45FFF2BE46FFF6C347FFF8C647FFF9C748FFF9C648FFF7C447FFF5C147FFF0BC
+      46FFEAB444FFDCA341FFB77938FF7D4F2AFA574134E1434343983C3C3C110000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000147403D946C442AF5AF7538FEDDA649FFEAB64DFFF2C150FFF3C2
+      4FFFF4C34FFFF4C350FFF4C350FFF4C350FFF4C350FFF4C350FFF4C350FFF3C2
+      4FFFF3C24FFFF0BE4FFFE6B34CFFD49B46FF945E31FC60412EEA434343AB4040
+      400C000000000000000000000000000000000000000000000000000000000000
+      000046413E766D4229F7BD8241FFE0AC50FFECBB55FFEEBD57FFEEBE56FFEEBE
+      56FFEEBE56FF665125FF110E06FF110D06FF100D06FF2C2310FF9B7C38FFEEBE
+      56FFEEBE56FFEEBD56FFEEBD57FFE9B855FFD9A34DFFA46C38FE5F3E2BEE4444
+      4493808080020000000000000000000000000000000000000000000000004644
+      443D653F2AF3B77D42FFDFAB57FFE8B75BFFE8B75CFFE8B75CFFE8B75CFFE8B7
+      5CFF3E3119FF010100FF000000FF000000FF000000FF000000FF010101FF0504
+      02FF161109FF70582CFFDAAB56FFE8B75CFFE6B65BFFD9A454FF986137FC563D
+      31E4444444620000000000000000000000000000000000000000808080025A3C
+      2DD7A36B3DFED9A65BFFE2B260FFE2B361FFE2B361FFE2B361FFE2B361FFE2B3
+      61FF050402FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF030301FF2C2313FFE2B361FFE1B15FFFD09A54FF814F
+      31FB483F3BCD40404014000000000000000000000000000000004A403C5B7646
+      2CF9CE9959FFDCAC62FFDCAC63FFDCAC63FFDCAC63FFDCAC63FFDCAC63FFCDA0
+      5DFF040302FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF010000FF2E2415FFDCAC63FFDAAA61FFBE84
+      4EFF633D29F24343437A000000000000000000000000000000005C3928DAB176
+      47FFD5A463FFD6A665FFD6A665FFD6A665FFD6A665FFD6A665FFD6A665FFD6A6
+      65FF765C38FF020201FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF0B0905FFD6A665FFD6A665FFD19F
+      61FF8B5936FC4B3E37CE3333330500000000000000003F3B39136D412BF7C994
+      5EFFD19F65FFD19F65FFD19F65FF926F46FF120E09FF15100AFF4F3C26FFD19F
+      65FFD19F65FF241B11FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF0B0805FFD19F65FFD19F65FFD09E
+      65FFB98051FF5E3929F042424236000000000000000050382D71905A3AFCC996
+      64FFCA9764FFCA9764FF75573AFF020101FF000000FF000000FF010000FF2D21
+      16FFCA9764FF5A432DFF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF010100FF050403FF674D33FFCA9764FFCA9764FFCA97
+      64FFC59160FF6C402AF84343426F00000000000000005E3724C2AB704BFFC28C
+      61FFC28C61FFC28C61FF060403FF000000FF000000FF000000FF000000FF0705
+      04FFC28C61FF8B6545FF010101FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF0D0906FF77563CFFC08A61FFC28C61FFC28C61FFC28C61FFC28C
+      61FFC18C61FF895437FC4B3D369E0000000000000000613623DCB17551FFB981
+      5BFFB9815BFF7F593EFF010100FF000000FF000000FF000000FF020101FF3827
+      1BFFB9815BFFB9815BFF2B1E15FF020101FF000000FF000000FF000000FF0000
+      00FF0D0906FFB37D59FFB9815BFFB9815BFFB9815BFFB9815BFFB9815BFFB981
+      5BFFB9815BFF985E3EFF503A31BE0000000000000000633723E3AF7353FFB278
+      57FFB27857FF2C1E15FF000000FF000000FF000000FF050403FF754F3AFFB278
+      57FFB27857FFB27857FFB27857FF78503AFF281A13FF0A0705FF0A0705FF1C13
+      0DFFA87253FFA36E4FFF19110CFF060403FF110B08FF62422FFFB27857FFB278
+      57FFB27857FF9E6142FF56392CD20000000000000000663722E3AD7354FFAF74
+      57FFAF7457FF0F0A07FF0D0806FF050403FF2B1D15FFA97055FFAF7457FFAF74
+      57FFAF7457FFAF7457FFAF7457FFAF7457FFAF7457FFAF7457FFAF7457FFAF74
+      57FFAF7457FF110B08FF000000FF000000FF000000FF020201FF885A44FFAF74
+      57FFAF7457FFA16447FF5B3828D30000000000000000653622DAAB6E52FFAD71
+      56FFAD7156FF885943FFAD7156FFAD7156FFAD7156FFAD7156FFAD7156FF734B
+      39FF754D3AFF9F674EFFAD7156FFAD7156FFAD7156FFAD7156FFAD7156FFAD71
+      56FFAD7156FF35221BFF000000FF000000FF000000FF000000FF482F24FFAD71
+      56FFAD7156FF995E44FF59382ABC0000000000000000633520CBAA6B51FFAE73
+      59FFAE7359FFAE7359FFAE7359FFAE7359FFAE7359FFA46D55FF0B0706FF0101
+      01FF010101FF050302FF7F5441FFAE7359FFAE7359FFAE7359FFAE7359FFAE73
+      59FFAE7359FF805541FF020101FF000000FF000000FF000000FF4A3126FFAE73
+      59FFAE7359FF93583FFF53382C8C000000000000000064341E99A2674DFFB27B
+      63FFB27B63FFB27B63FFB27B63FFB27B63FFB27B63FF412D24FF000000FF0000
+      00FF000000FF000000FF140E0BFF785342FF060403FF050403FF120C0AFFAA75
+      5FFFB27B63FFB27B63FF090605FF000000FF000000FF030202FFA6735DFFB27B
+      63FFB27B63FF835038FC5333243E00000000000000005B2F1B3389543DF7B886
+      6FFFB8866FFFB8866FFFB8866FFFB8866FFFB8866FFF0E0A09FF000000FF0000
+      00FF000000FF010101FF5C4337FF0E0A08FF000000FF000000FF000000FF0E0A
+      08FFB8866FFFB8866FFF785749FF020101FF000000FF120E0BFFB8866FFFB886
+      6FFFB7836CFF683A26F0000000000000000000000000000000006E3C25DABD8C
+      78FFBE8F7AFFBE8F7AFFBE8F7AFFBE8F7AFFBE8F7AFF2C211CFF000000FF0000
+      00FF000000FF090706FFBE8F7AFF090706FF000000FF000000FF000000FF0504
+      03FFBE8F7AFFBE8F7AFFBE8F7AFF9F7865FF000000FF8C6A5AFFBE8F7AFFBE8F
+      7AFFAF7963FF623622C10000000000000000000000000000000064341E97A773
+      5CFEC49A87FFC49A87FFC49A87FFC49A87FFC49A87FF71594EFF000000FF0000
+      00FF010101FF765D52FFC29885FF050404FF000000FF000000FF000000FF0A08
+      07FFC49A87FFC49A87FFC49A87FFC49A87FF221B18FFC49A87FFC49A87FFC49A
+      87FF83523CF85E311C31000000000000000000000000000000005B2F1B0E6F3E
+      28E0C69D8CFFCAA392FFCAA392FFCAA392FFCAA392FFAA8A7BFF000000FF0806
+      06FF1A1513FFCAA392FF8F7468FF010101FF000000FF000000FF020202FF8F73
+      67FFCAA392FFCAA392FFCAA392FFCAA392FFBF9B8AFFCAA392FFCAA392FFB787
+      72FF643520C10000000000000000000000000000000000000000000000006433
+      1E7B9C6A53F8D1AEA0FFD1AEA0FFD1AEA0FFD1AEA0FFD1AEA0FF020202FFCDAC
+      9EFFD1AEA0FFD1AEA0FFA98C81FF0B0909FF010100FF040303FF846F65FFD1AE
+      A0FFD1AEA0FFD1AEA0FFD1AEA0FFD1AEA0FFD1AEA0FFD1AEA0FFCDA798FF7947
+      33EB5B2F1B220000000000000000000000000000000000000000000000000000
+      000064341EB5B38672FED7B9ADFFD7B9ADFFD7B9ADFFD7B9ADFF6D5E58FFD7B9
+      ADFFD7B9ADFFD7B9ADFFD7B9ADFF85736BFF000000FF9C867DFFD7B9ADFFD7B9
+      ADFFD7B9ADFFD7B9ADFFD7B9ADFFD7B9ADFFD7B9ADFFD6B7ACFF8F5E49F36233
+      1D60000000000000000000000000000000000000000000000000000000000000
+      00005B2F1B08663620CDBD9483FEDEC5BBFFDEC5BBFFDEC5BBFFDEC5BBFFDEC5
+      BBFFDEC5BBFFDEC5BBFFDEC5BBFF7F716BFF867771FFDEC5BBFFDEC5BBFFDEC5
+      BBFFDEC5BBFFDEC5BBFFDEC5BBFFDEC5BBFFDCC1B7FF9F6F5BF764331E930000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000005B2F1B0F63331EC1B08471F8E4CEC7FFE4D0C9FFE4D0C9FFE4D0
+      C9FFE4D0C9FFE4D0C9FFE4D0C9FFE4D0C9FFE4D0C9FFE4D0C9FFE4D0C9FFE4D0
+      C9FFE4D0C9FFE4D0C9FFE4D0C9FFDDC4BAFF8D5D49ED63331D81000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000005B2F1B0263331D96875844E7D0B0A4FFEBDBD7FFEBDB
+      D7FFEBDBD7FFEBDBD7FFEBDBD7FFEBDBD7FFEBDBD7FFEBDBD7FFEBDBD7FFEBDB
+      D7FFEBDBD7FFE8D6D1FFBD9585FD71412BDC61321D4F00000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000005B2F1B2265341EB990634FEBC39E
+      90FEE6D1CBFFF2E7E5FFF2E7E5FFF2E7E5FFF2E7E5FFF2E7E5FFF1E6E2FFDCC1
+      B8FFB48D7CFB7A4B36E264331E8E5B2F1B0A0000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000000000000000000000000000005B2F1B1C6233
+      1D7B67351EC6784832DA895D4AE59C7260EC976D5AEA845642E3713F29D56634
+      1EB65F311C575B2F1B0B00000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000005B2F1B055B2F1B1E5B2F1B165B2F1B01000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000FFFC3FFFFFC003FFFF0000FFFE00
+      003FF800001FF000000FF0000007E0000007C0000003C0000003C00000018000
+      0001800000018000000180000001800000018000000180000001800000018000
+      000180000003C0000003C0000003C0000007E0000007F000000FF000001FF800
+      003FFC00007FFF0000FFFFC003FFFFFC3FFF2800000010000000200000000100
+      2000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000003B3B3B0D494342374D3D347A4C3E36784642
+      413B404040100000000000000000000000000000000000000000000000000000
+      00000000000049494907573B2CAB6E4328F591602BFAB57F32FDAF7A31FD8B5C
+      2AFA683F26F4503D339F4040400C000000000000000000000000000000000000
+      00004B393231643B27EBBF8937FEF9C645FFFBC746FFFBC846FFFBC846FFFBC7
+      46FFF6C245FFAD7933FD5C3929E5453E3B320000000000000000000000003E32
+      2C076E4327EEDFAB4EFFEFBF55FFF0C055FFA4833AFF403317FF4A3B1AFF7E65
+      2DFFC49D45FFEFBF55FFD49F4AFF613C28E74D4D4D0A00000000000000005B37
+      28B7C3914EFEE4B45FFFE4B45FFFE4B45FFF3C2F19FF000000FF000000FF0000
+      00FF040301FF392D18FFCDA355FFAF7E45FD513A30A8000000005B2F1B0A8F64
+      40F8DBAE6CFFDBAD6CFF9F7E4EFFCEA366FF715937FF000000FF000000FF0000
+      00FF000000FF010100FF98784BFFDAAC6BFF7A5135F65555550357342448B286
+      5FFED5A978FF594632FF000000FF4C3C2BFFC89E70FF080604FF000000FF0000
+      00FF120F0AFF70593FFFD5A978FFD5A978FF9D7452FB4D3D37345E36249AC197
+      78FFB39073FF060504FF1B1511FF9B7C63FFCEA584FF826853FF3D3127FF3A2F
+      25FFAA896DFF8D715BFFA6856AFFCEA584FFB2876CFD51382C7B633520A7C39A
+      85FFA38271FF997A6AFFC09884FFC79F8AFFC89F8AFFC9A08BFFC9A08BFFC9A0
+      8BFF9A7A6AFF010101FF1D1714FFC59D88FFB58B76FF5835257C5F311C56B084
+      72FEC79F8DFFC79F8DFFB89382FF231C19FF1B1613FFA78576FF7F665AFFAC89
+      7AFFC59D8BFF201A17FF0F0C0BFFBB9685FF9C7462FB573120305B2F1B1EA07A
+      6BF6D2B0A3FFD2B0A3FF9A8178FF000000FF201B19FF988076FF040303FF3E34
+      30FFD2B0A3FF947C73FF52443FFFD2B0A3FF8C6657F35B2F1B02000000007449
+      36D1D8BCB2FFDDC3B9FFD5BCB2FF241F1EFF83736EFF736660FF000000FF6559
+      55FFDDC3B9FFDDC3B9FFCCB4AAFFCFB2A6FF6B3E2BB600000000000000005B2F
+      1B1F9C7869F0E8D5CFFFE8D5CFFFB4A5A1FFE8D5CFFFB6A7A2FF494341FFE2CF
+      C9FFE8D5CFFFE8D5CFFFE7D5CEFF865F4FE95B2F1B0C00000000000000000000
+      000064331E65AB8B7EF0EFE2E0FFF2E7E5FFF2E7E5FFF0E5E3FFF2E7E5FFF2E7
+      E5FFF2E7E5FFEBDDD8FF997568EC61321D3F0000000000000000000000000000
+      0000000000005C301B2A835C49D7D4BFB7FCEFE5E2FFFDFAFCFFFDF9FAFFECDF
+      DCFFCCB4ACFA794D3BC45B2F1B17000000000000000000000000000000000000
+      000000000000000000005B2F1B035B2F1B3E63331D83754934BE6F412DB76232
+      1D765B2F1B340000000000000000000000000000000000000000F81FAC41E007
+      AC41C003AC418001AC418001AC410000AC410000AC410000AC410000AC410000
+      AC410000AC418001AC418001AC41C003AC41E007AC41F01FAC41
+    }
+    Stretch = True
+  end
+  object ToolBar1: TToolBar
+    Left = 0
+    Height = 26
+    Top = 0
+    Width = 1043
+    Caption = 'ToolBar1'
+    Images = ImageList1
+    TabOrder = 2
+    object ToolButton1: TToolButton
+      Left = 1
+      Top = 2
+      Caption = 'ToolButton1'
+      ImageIndex = 0
+    end
+    object ToolButton2: TToolButton
+      Left = 24
+      Top = 2
+      Caption = 'ToolButton2'
+      ImageIndex = 1
+    end
+    object ToolButton3: TToolButton
+      Left = 47
+      Top = 2
+      Caption = 'ToolButton3'
+      ImageIndex = 2
+    end
+    object ToolButton4: TToolButton
+      Left = 70
+      Top = 2
+      Width = 10
+      Caption = 'ToolButton4'
+      Style = tbsSeparator
+    end
+    object ToolButton5: TToolButton
+      Left = 80
+      Top = 2
+      Caption = 'ToolButton5'
+      ImageIndex = 0
+    end
+  end
+  object Panel1: TPanel
+    Left = 744
+    Height = 216
+    Top = 315
+    Width = 272
+    Caption = 'Panel1'
+    TabOrder = 3
+  end
+  object ImageList1: TImageList
+    left = 736
+    top = 576
+    Bitmap = {
+      4C69030000001000000010000000A37B48FFA37B48FFA27A47FFA27946FFA178
+      45FFA07744FFA07643FF9F7542FF9E7441FF9E7340FF9D723FFF9C713EFF9C70
+      3DFF9B6F3CFF9A6E3BFF9A6D3AFFA37B48FFBEA27FFFBEA17EFFBDA17DFFBDA0
+      7CFFBD9F7CFFBC9F7BFFBB9E7AFFBB9D7AFFBB9D79FFBA9C78FFB99B78FFB99A
+      77FFB89A76FFB89975FF996C39FFA27A47FFFFFFFFFFFFFFFFFFFEFEFEFFFEFE
+      FEFFFDFDFDFFFDFDFCFFFCFCFBFFFCFBFBFFFBFBFAFFFBFAF9FFFAFAF9FFFAF9
+      F8FFF9F9F7FFF9F8F7FF986B37FFA17946FFFFFFFFFF878787FF5D5D5DFFA0A0
+      A0FFFDFCFCFFFCFCFBFFFCFBFBFFFBFBFAFFFBFAF9FFFAFAF9FFFAF9F8FFF9F8
+      F7FFF8F8F7FFF8F7F6FF976A36FFA17844FFFEFEFEFF5F5F5FFF949494FF5353
+      53FFFCFCFBFF7B7B7BFF797979FF757575FF727272FF6E6E6EFF6A6A69FF6666
+      66FF626262FFF7F7F5FF966935FFA07643FFFEFDFDFF8C8C8CFF525252FFA4A4
+      A4FFFBFBFAFFFBFBFAFFFAFAF9FFFAF9F8FFF9F9F8FFF9F8F7FFF8F8F6FFF8F7
+      F6FFF7F7F5FFF7F6F4FF966734FF9F7542FFFDFDFCFFFCFCFCFFFCFCFBFFFBFB
+      FAFFFBFAFAFFFAFAF9FFFAF9F8FFF9F9F8FFF9F8F7FFF8F8F6FFF8F7F6FFF7F6
+      F5FFF7F6F4FFF6F5F4FF956633FF9E7441FFFCFCFCFFB5B5B5FF848484FFBEBD
+      BDFFFAFAF9FFFAF9F8FFF9F9F7FFF9F8F7FFF8F8F6FFF8F7F5FFF7F6F5FFF7F6
+      F4FFF6F5F3FFF6F5F3FF946531FF9D7340FFFCFBFBFF818181FFC4C4C4FF8F8F
+      8FFFFAF9F8FF7B7B7AFF797979FF757574FF727171FF6D6D6DFF696969FF6666
+      65FF626261FFF5F4F2FF936430FF9D723EFFFBFBFAFF9F9F9EFF7F7F7FFFAEAE
+      ADFFF9F8F7FFF8F8F7FFF8F7F6FFF7F7F5FFF7F6F5FFF6F6F4FFF6F5F3FFF5F4
+      F3FFF5F4F2FFF4F3F1FF92622FFF9C703DFFFAFAF9FFFAF9F9FFF9F9F8FFF9F8
+      F7FFF8F8F7FFF8F7F6FFF7F7F5FFF7F6F5FFF6F5F4FFF6F5F3FFF5F4F3FFF5F4
+      F2FFF4F3F1FFF4F3F0FF92612EFF9B6F3CFFFAF9F8FFBEBEBDFF929292FFBCBC
+      BBFFF8F7F6FFF7F7F5FFF7F6F4FFF6F5F4FFF6F5F3FFF5F4F2FFF5F4F2FFF4F3
+      F1FFF4F2F0FFF3F2F0FF91602DFF9A6E3BFFF9F9F8FF7C7C7CFFC4C4C4FF8787
+      87FFF7F6F5FF7A7A7AFF787878FF747474FF717170FF6D6D6CFF696968FF6565
+      65FF616161FFF2F1EFFF905F2BFF996D3AFFF9F8F7FF959594FF878787FF9B9A
+      9AFFF7F6F4FFF6F5F3FFF6F5F3FFF5F4F2FFF4F3F1FFF4F3F1FFF3F2F0FFF3F2
+      EFFFF2F1EFFFF2F1EEFF8F5E2AFF996C38FFF8F7F6FFF8F7F5FFF7F6F5FFF6F6
+      F4FFF6F5F3FFF5F5F3FFF5F4F2FFF4F3F1FFF4F3F1FFF3F2F0FFF3F2EFFFF2F1
+      EFFFF2F0EEFFF1F0EDFF8E5D29FF986B37FF976A36FF966935FF966734FF9566
+      33FF946532FF946531FF936430FF92622FFF92612EFF91602DFF90602CFF905F
+      2BFF8F5D2AFF8E5C29FF8D5B28FFFF00FF00FF00FF00FF00FF00FF00FF00FF00
+      FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00
+      FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00
+      FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00
+      FF00FF00FF00FF00FF00FF00FF00FF00FF00D6B5A5FFD6B5A5FFD6B5A5FFD6B5
+      A5FFC6ADA5FFC6ADA5FFC6ADA5FFC6ADA5FFC6ADA5FFC6ADA5FFC6ADA5FFC6AD
+      A5FFC6ADA5FFFF00FF00FF00FF00D6B5A5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFF7F7FFFFF7F7FFFFF7F7FFFFF7F7FFFFF7F7FFFFEFE7FFFFEFE7FFFFEF
+      E7FFFFEFE7FF634A31FFFF00FF00D6B5A5FFFFFFFFFFD69C84FFD69484FFC694
+      73FFD68C73FFD68C63FFC68463FFC67B52FFC67342FFC66B42FFC66B42FFD67B
+      42FFFFEFE7FF634A31FFFF00FF00D6B5A5FFFFFFFFFFC69473FFFFDED6FFFFDE
+      D6FFFFD6C6FFFFCEB5FFFFCEB5FFFFC6A5FFFFC6A5FFFFB594FFFFB584FFE77B
+      42FFFFEFE7FF634A31FFFF00FF00D6B5A5FFFFFFFFFFC69473FFFFDED6FFFFEF
+      E7FFFFEFE7FFFFEFE7FFFFC6A5FFFFC6A5FFFFB594FFFFB594FFF79C73FFE77B
+      42FFFFEFE7FF634A31FFFF00FF00C6ADA5FFFFF7F7FFC69473FFFFD6C6FFFFD6
+      C6FFFFCEB5FFFFC6A5FFFFC6A5FFFFB594FFF7A584FFF79C73FFF79C73FFE773
+      42FFFFEFE7FF634A31FFFF00FF00C6ADA5FFFFF7F7FFC69473FFFFD6C6FFFFEF
+      E7FFFFEFE7FFFFEFE7FFFFE7D6FFFFDED6FFFFDED6FFFFDED6FFE78C63FFE773
+      42FFFFE7D6FF634A31FFFF00FF00C6ADA5FFFFF7F7FFC69473FFFFCEB5FFFFC6
+      A5FFFFC6A5FFFFB594FFF7A584FFF7A584FFF79C73FFE78C63FFE78463FFE773
+      42FFFFDED6FF634A31FFFF00FF00C6ADA5FFFFF7F7FFC69473FFFFCEB5FFFFEF
+      E7FFFFE7D6FFFFDED6FFFFDED6FFFFDED6FFFFD6C6FFFFD6C6FFD67B52FFE773
+      42FFFFDED6FF634A31FFFF00FF00C6ADA5FFFFF7F7FFC69473FFFFC6A5FFF7B5
+      94FFF7A584FFF79C73FFF79C73FFE78C63FFE78463FFD67B52FFD67352FFE773
+      42FFFFDED6FF634A31FFFF00FF00C6ADA5FFFFEFE7FFD69484FFE7A584FFF7A5
+      84FFF79C73FFF79C73FFE78C63FFE78463FFE78452FFE78442FFE77B42FFE784
+      52FFFFDED6FF634A31FFFF00FF00C6ADA5FFFFEFE7FFFFEFE7FFFFEFE7FFFFEF
+      E7FFFFEFE7FFFFEFE7FFFFEFE7FFFFE7D6FFFFDED6FFFFDED6FFFFDED6FFFFDE
+      D6FFFFDED6FF634A31FFFF00FF00FF00FF00634A31FF634A31FF634A31FF634A
+      31FF634A31FF634A31FF634A31FF634A31FF634A31FF634A31FF634A31FF634A
+      31FF634A31FFFF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00
+      FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00
+      FF00FF00FF00FF00FF00FF00FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00241C
+      E21E241CE26E241CE2AF241CE2BF241CE2BF241CE29F241CE25EFFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF002B23E3812C24
+      E3FF2B23E3FF4C46E8FF8D89F0FF615BEAFF2820E3FF2B23E3FF2D25E3DF3129
+      E442FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF002A22E3BF2A22E3FF2820
+      E2FF635DEAFFCECCF9FFFFFFFFFFE7E6FCFF7C77EEFF2D26E3FF271FE2FF2A22
+      E3FF2E27E362FFFFFF00FFFFFF00FFFFFF002C24E3912A22E3FF332BE4FF9995
+      F1FFF5F4FEFFFBFBFEFFF6F6FEFFF8F8FEFFFCFCFFFFB6B3F5FF433CE6FF241C
+      E2FF2A22E3FF3028E442FFFFFF00241CE22E2C24E3FF261EE2FF241CE2FF241C
+      E2FF241CE2FF241CE2FF241CE2FF241CE2FF241CE2FF241CE2FF241CE2FF261E
+      E2FF251DE2FF2B23E3DFFFFFFF00241CE29F2921E3FF241CE2FFEBEAFCFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF261E
+      E2FF231BE2FF271FE3FF231BE22E241CE2CF2720E2FF241CE2FF3C35E5FFEFEE
+      FDFF645FEBFF3D36E5FFEFEFFDFF231BE2FF908CF0FFD4D2F9FF231BE2FF231B
+      E2FF231BE2FF241CE2FF231BE27E241CE2FF271FE2FF241CE2FF453FE6FFEFEE
+      FDFF6D68ECFF4841E7FFEFEFFDFF2B23E3FF9793F1FFD6D4FAFF231BE2FF231B
+      E2FF231BE2FF231BE2FF231BE27E241CE2FF261FE2FF231BE2FF453EE6FFEFEE
+      FDFF6D68ECFF4841E7FFEFEFFDFF2B23E3FF9793F1FFD6D4FAFF231BE2FF231B
+      E1FF231BE1FF231BE1FF231BE17E231BE2DF261EE2FF4D68F9FF6981FBFFF3F4
+      FFFF8598FCFF667EFBFFF3F4FFFF4E6AFAFFA8B5FDFFDDE2FEFF4E6AFAFF4E6A
+      FAFF4255F3FF231BE1FF231BE17E231BE29F271FE3FF4961F7FFCFD7FEFFFBFB
+      FFFFE4E8FEFFDCE2FEFFFBFBFFFFD6DDFEFFECF0FEFFFAFAFFFFCDD5FEFF4E6A
+      FAFF3E4DF1FF261FE1FF231BE12E231BE22E2A22E3FF3B47EFFF5C76FAFF96A7
+      FCFFA2B1FCFFA3B2FCFF9CACFCFFA5B3FCFFA1B0FCFF9EADFCFF778CFBFF4E6A
+      FAFF3134E9FF2B23E2DFFFFFFF00FFFFFF002C24E3912A24E5FFE2E6FEFFE6EA
+      FEFFE5E9FEFFE5E9FEFFE5E9FEFFE5E9FEFFE5E9FEFFE5E9FEFFE8EBFEFF4051
+      F2FF2820E2FF3730E442FFFFFF00FFFFFF00231BE20E2B23E3CF2C29E5FF4153
+      F3FF4E6AFAFF4E6AFAFF4E6AFAFF4E6AFAFF4E6AFAFF4D69FAFF3B47EFFF2923
+      E3FF332BE362FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF002D26E2912B23
+      E2FF3032E7FF3B48EFFF4356F4FF4152F2FF3944EEFF2D2BE5FF2C24E2DF352E
+      E354FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF005049
+      E726342DE374241CE1BF231BE1BF231BE1BF251DE19F3730E464FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00FFFFFF00
+    }
+  end
+  object MainMenu1: TMainMenu
+    Images = ImageList1
+    left = 824
+    top = 344
+    object MenuItem1: TMenuItem
+      Caption = 'New Item1'
+      object MenuItem3: TMenuItem
+        Caption = 'New Item3'
+        Bitmap.Data = {
+          36040000424D3604000000000000360000002800000010000000100000000100
+          2000000000000004000064000000640000000000000000000000986B37FF976A
+          36FF966935FF966734FF956633FF946532FF946531FF936430FF92622FFF9261
+          2EFF91602DFF90602CFF905F2BFF8F5D2AFF8E5C29FF8D5B28FF996C38FFF8F7
+          F6FFF8F7F5FFF7F6F5FFF6F6F4FFF6F5F3FFF5F5F3FFF5F4F2FFF4F3F1FFF4F3
+          F1FFF3F2F0FFF3F2EFFFF2F1EFFFF2F0EEFFF1F0EDFF8E5D29FF996D3AFFF9F8
+          F7FF959594FF878787FF9B9A9AFFF7F6F4FFF6F5F3FFF6F5F3FFF5F4F2FFF4F3
+          F1FFF4F3F1FFF3F2F0FFF3F2EFFFF2F1EFFFF2F1EEFF8F5E2AFF9A6E3BFFF9F9
+          F8FF7C7C7CFFC4C4C4FF878787FFF7F6F5FF7A7A7AFF787878FF747474FF7171
+          70FF6D6D6CFF696968FF656565FF616161FFF2F1EFFF905F2BFF9B6F3CFFFAF9
+          F8FFBEBEBDFF929292FFBCBCBBFFF8F7F6FFF7F7F5FFF7F6F4FFF6F5F4FFF6F5
+          F3FFF5F4F2FFF5F4F2FFF4F3F1FFF4F2F0FFF3F2F0FF91602DFF9C703DFFFAFA
+          F9FFFAF9F9FFF9F9F8FFF9F8F7FFF8F8F7FFF8F7F6FFF7F7F5FFF7F6F5FFF6F5
+          F4FFF6F5F3FFF5F4F3FFF5F4F2FFF4F3F1FFF4F3F0FF92612EFF9D723EFFFBFB
+          FAFF9F9F9EFF7F7F7FFFAEAEADFFF9F8F7FFF8F8F7FFF8F7F6FFF7F7F5FFF7F6
+          F5FFF6F6F4FFF6F5F3FFF5F4F3FFF5F4F2FFF4F3F1FF92622FFF9D7340FFFCFB
+          FBFF818181FFC4C4C4FF8F8F8FFFFAF9F8FF7B7B7AFF797979FF757574FF7271
+          71FF6D6D6DFF696969FF666665FF626261FFF5F4F2FF936430FF9E7441FFFCFC
+          FCFFB5B5B5FF848484FFBEBDBDFFFAFAF9FFFAF9F8FFF9F9F7FFF9F8F7FFF8F8
+          F6FFF8F7F5FFF7F6F5FFF7F6F4FFF6F5F3FFF6F5F3FF946531FF9F7542FFFDFD
+          FCFFFCFCFCFFFCFCFBFFFBFBFAFFFBFAFAFFFAFAF9FFFAF9F8FFF9F9F8FFF9F8
+          F7FFF8F8F6FFF8F7F6FFF7F6F5FFF7F6F4FFF6F5F4FF956633FFA07643FFFEFD
+          FDFF8C8C8CFF525252FFA4A4A4FFFBFBFAFFFBFBFAFFFAFAF9FFFAF9F8FFF9F9
+          F8FFF9F8F7FFF8F8F6FFF8F7F6FFF7F7F5FFF7F6F4FF966734FFA17844FFFEFE
+          FEFF5F5F5FFF949494FF535353FFFCFCFBFF7B7B7BFF797979FF757575FF7272
+          72FF6E6E6EFF6A6A69FF666666FF626262FFF7F7F5FF966935FFA17946FFFFFF
+          FFFF878787FF5D5D5DFFA0A0A0FFFDFCFCFFFCFCFBFFFCFBFBFFFBFBFAFFFBFA
+          F9FFFAFAF9FFFAF9F8FFF9F8F7FFF8F8F7FFF8F7F6FF976A36FFA27A47FFFFFF
+          FFFFFFFFFFFFFEFEFEFFFEFEFEFFFDFDFDFFFDFDFCFFFCFCFBFFFCFBFBFFFBFB
+          FAFFFBFAF9FFFAFAF9FFFAF9F8FFF9F9F7FFF9F8F7FF986B37FFA37B48FFBEA2
+          7FFFBEA17EFFBDA17DFFBDA07CFFBD9F7CFFBC9F7BFFBB9E7AFFBB9D7AFFBB9D
+          79FFBA9C78FFB99B78FFB99A77FFB89A76FFB89975FF996C39FFA37B48FFA37B
+          48FFA27A47FFA27946FFA17845FFA07744FFA07643FF9F7542FF9E7441FF9E73
+          40FF9D723FFF9C713EFF9C703DFF9B6F3CFF9A6E3BFF9A6D3AFF
+        }
+        ImageIndex = 0
+        OnClick = MenuItem3Click
+      end
+      object MenuItem8: TMenuItem
+        Caption = 'New Item8'
+        Bitmap.Data = {
+          36040000424D3604000000000000360000002800000010000000100000000100
+          2000000000000004000064000000640000000000000000000000FF00FF00FF00
+          FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00
+          FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00634A
+          31FF634A31FF634A31FF634A31FF634A31FF634A31FF634A31FF634A31FF634A
+          31FF634A31FF634A31FF634A31FF634A31FFFF00FF00FF00FF00C6ADA5FFFFEF
+          E7FFFFEFE7FFFFEFE7FFFFEFE7FFFFEFE7FFFFEFE7FFFFEFE7FFFFE7D6FFFFDE
+          D6FFFFDED6FFFFDED6FFFFDED6FFFFDED6FF634A31FFFF00FF00C6ADA5FFFFEF
+          E7FFD69484FFE7A584FFF7A584FFF79C73FFF79C73FFE78C63FFE78463FFE784
+          52FFE78442FFE77B42FFE78452FFFFDED6FF634A31FFFF00FF00C6ADA5FFFFF7
+          F7FFC69473FFFFC6A5FFF7B594FFF7A584FFF79C73FFF79C73FFE78C63FFE784
+          63FFD67B52FFD67352FFE77342FFFFDED6FF634A31FFFF00FF00C6ADA5FFFFF7
+          F7FFC69473FFFFCEB5FFFFEFE7FFFFE7D6FFFFDED6FFFFDED6FFFFDED6FFFFD6
+          C6FFFFD6C6FFD67B52FFE77342FFFFDED6FF634A31FFFF00FF00C6ADA5FFFFF7
+          F7FFC69473FFFFCEB5FFFFC6A5FFFFC6A5FFFFB594FFF7A584FFF7A584FFF79C
+          73FFE78C63FFE78463FFE77342FFFFDED6FF634A31FFFF00FF00C6ADA5FFFFF7
+          F7FFC69473FFFFD6C6FFFFEFE7FFFFEFE7FFFFEFE7FFFFE7D6FFFFDED6FFFFDE
+          D6FFFFDED6FFE78C63FFE77342FFFFE7D6FF634A31FFFF00FF00C6ADA5FFFFF7
+          F7FFC69473FFFFD6C6FFFFD6C6FFFFCEB5FFFFC6A5FFFFC6A5FFFFB594FFF7A5
+          84FFF79C73FFF79C73FFE77342FFFFEFE7FF634A31FFFF00FF00D6B5A5FFFFFF
+          FFFFC69473FFFFDED6FFFFEFE7FFFFEFE7FFFFEFE7FFFFC6A5FFFFC6A5FFFFB5
+          94FFFFB594FFF79C73FFE77B42FFFFEFE7FF634A31FFFF00FF00D6B5A5FFFFFF
+          FFFFC69473FFFFDED6FFFFDED6FFFFD6C6FFFFCEB5FFFFCEB5FFFFC6A5FFFFC6
+          A5FFFFB594FFFFB584FFE77B42FFFFEFE7FF634A31FFFF00FF00D6B5A5FFFFFF
+          FFFFD69C84FFD69484FFC69473FFD68C73FFD68C63FFC68463FFC67B52FFC673
+          42FFC66B42FFC66B42FFD67B42FFFFEFE7FF634A31FFFF00FF00D6B5A5FFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F7FFFFF7F7FFFFF7F7FFFFF7F7FFFFF7
+          F7FFFFEFE7FFFFEFE7FFFFEFE7FFFFEFE7FF634A31FFFF00FF00FF00FF00D6B5
+          A5FFD6B5A5FFD6B5A5FFD6B5A5FFC6ADA5FFC6ADA5FFC6ADA5FFC6ADA5FFC6AD
+          A5FFC6ADA5FFC6ADA5FFC6ADA5FFC6ADA5FFFF00FF00FF00FF00FF00FF00FF00
+          FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00
+          FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00
+          FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00
+          FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00
+        }
+        ImageIndex = 1
+      end
+      object MenuItem9: TMenuItem
+        Caption = 'New Item9'
+        Bitmap.Data = {
+          36040000424D3604000000000000360000002800000010000000100000000100
+          2000000000000004000064000000640000000000000000000000FF00FF00FF00
+          FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00
+          FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00634A
+          31FF634A31FF634A31FF634A31FF634A31FF634A31FF634A31FF634A31FF634A
+          31FF634A31FF634A31FF634A31FF634A31FFFF00FF00FF00FF00C6ADA5FFFFEF
+          E7FFFFEFE7FFFFEFE7FFFFEFE7FFFFEFE7FFFFEFE7FFFFEFE7FFFFE7D6FFFFDE
+          D6FFFFDED6FFFFDED6FFFFDED6FFFFDED6FF634A31FFFF00FF00C6ADA5FFFFEF
+          E7FFD69484FFE7A584FFF7A584FFF79C73FFF79C73FFE78C63FFE78463FFE784
+          52FFE78442FFE77B42FFE78452FFFFDED6FF634A31FFFF00FF00C6ADA5FFFFF7
+          F7FFC69473FFFFC6A5FFF7B594FFF7A584FFF79C73FFF79C73FFE78C63FFE784
+          63FFD67B52FFD67352FFE77342FFFFDED6FF634A31FFFF00FF00C6ADA5FFFFF7
+          F7FFC69473FFFFCEB5FFFFEFE7FFFFE7D6FFFFDED6FFFFDED6FFFFDED6FFFFD6
+          C6FFFFD6C6FFD67B52FFE77342FFFFDED6FF634A31FFFF00FF00C6ADA5FFFFF7
+          F7FFC69473FFFFCEB5FFFFC6A5FFFFC6A5FFFFB594FFF7A584FFF7A584FFF79C
+          73FFE78C63FFE78463FFE77342FFFFDED6FF634A31FFFF00FF00C6ADA5FFFFF7
+          F7FFC69473FFFFD6C6FFFFEFE7FFFFEFE7FFFFEFE7FFFFE7D6FFFFDED6FFFFDE
+          D6FFFFDED6FFE78C63FFE77342FFFFE7D6FF634A31FFFF00FF00C6ADA5FFFFF7
+          F7FFC69473FFFFD6C6FFFFD6C6FFFFCEB5FFFFC6A5FFFFC6A5FFFFB594FFF7A5
+          84FFF79C73FFF79C73FFE77342FFFFEFE7FF634A31FFFF00FF00D6B5A5FFFFFF
+          FFFFC69473FFFFDED6FFFFEFE7FFFFEFE7FFFFEFE7FFFFC6A5FFFFC6A5FFFFB5
+          94FFFFB594FFF79C73FFE77B42FFFFEFE7FF634A31FFFF00FF00D6B5A5FFFFFF
+          FFFFC69473FFFFDED6FFFFDED6FFFFD6C6FFFFCEB5FFFFCEB5FFFFC6A5FFFFC6
+          A5FFFFB594FFFFB584FFE77B42FFFFEFE7FF634A31FFFF00FF00D6B5A5FFFFFF
+          FFFFD69C84FFD69484FFC69473FFD68C73FFD68C63FFC68463FFC67B52FFC673
+          42FFC66B42FFC66B42FFD67B42FFFFEFE7FF634A31FFFF00FF00D6B5A5FFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F7FFFFF7F7FFFFF7F7FFFFF7F7FFFFF7
+          F7FFFFEFE7FFFFEFE7FFFFEFE7FFFFEFE7FF634A31FFFF00FF00FF00FF00D6B5
+          A5FFD6B5A5FFD6B5A5FFD6B5A5FFC6ADA5FFC6ADA5FFC6ADA5FFC6ADA5FFC6AD
+          A5FFC6ADA5FFC6ADA5FFC6ADA5FFC6ADA5FFFF00FF00FF00FF00FF00FF00FF00
+          FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00
+          FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00
+          FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00
+          FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00
+        }
+        ImageIndex = 1
+      end
+      object MenuItem10: TMenuItem
+        Caption = 'New Item10'
+        Bitmap.Data = {
+          36040000424D3604000000000000360000002800000010000000100000000100
+          2000000000000004000064000000640000000000000000000000FFFFFF00FFFF
+          FF00FFFFFF00FFFFFF005049E726342DE374241CE1BF231BE1BF231BE1BF251D
+          E19F3730E464FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+          FF00FFFFFF002D26E2912B23E2FF3032E7FF3B48EFFF4356F4FF4152F2FF3944
+          EEFF2D2BE5FF2C24E2DF352EE354FFFFFF00FFFFFF00FFFFFF00FFFFFF00231B
+          E20E2B23E3CF2C29E5FF4153F3FF4E6AFAFF4E6AFAFF4E6AFAFF4E6AFAFF4E6A
+          FAFF4D69FAFF3B47EFFF2923E3FF332BE362FFFFFF00FFFFFF00FFFFFF002C24
+          E3912A24E5FFE2E6FEFFE6EAFEFFE5E9FEFFE5E9FEFFE5E9FEFFE5E9FEFFE5E9
+          FEFFE5E9FEFFE8EBFEFF4051F2FF2820E2FF3730E442FFFFFF00231BE22E2A22
+          E3FF3B47EFFF5C76FAFF96A7FCFFA2B1FCFFA3B2FCFF9CACFCFFA5B3FCFFA1B0
+          FCFF9EADFCFF778CFBFF4E6AFAFF3134E9FF2B23E2DFFFFFFF00231BE29F271F
+          E3FF4961F7FFCFD7FEFFFBFBFFFFE4E8FEFFDCE2FEFFFBFBFFFFD6DDFEFFECF0
+          FEFFFAFAFFFFCDD5FEFF4E6AFAFF3E4DF1FF261FE1FF231BE12E231BE2DF261E
+          E2FF4D68F9FF6981FBFFF3F4FFFF8598FCFF667EFBFFF3F4FFFF4E6AFAFFA8B5
+          FDFFDDE2FEFF4E6AFAFF4E6AFAFF4255F3FF231BE1FF231BE17E241CE2FF261F
+          E2FF231BE2FF453EE6FFEFEEFDFF6D68ECFF4841E7FFEFEFFDFF2B23E3FF9793
+          F1FFD6D4FAFF231BE2FF231BE1FF231BE1FF231BE1FF231BE17E241CE2FF271F
+          E2FF241CE2FF453FE6FFEFEEFDFF6D68ECFF4841E7FFEFEFFDFF2B23E3FF9793
+          F1FFD6D4FAFF231BE2FF231BE2FF231BE2FF231BE2FF231BE27E241CE2CF2720
+          E2FF241CE2FF3C35E5FFEFEEFDFF645FEBFF3D36E5FFEFEFFDFF231BE2FF908C
+          F0FFD4D2F9FF231BE2FF231BE2FF231BE2FF241CE2FF231BE27E241CE29F2921
+          E3FF241CE2FFEBEAFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFF261EE2FF231BE2FF271FE3FF231BE22E241CE22E2C24
+          E3FF261EE2FF241CE2FF241CE2FF241CE2FF241CE2FF241CE2FF241CE2FF241C
+          E2FF241CE2FF241CE2FF261EE2FF251DE2FF2B23E3DFFFFFFF00FFFFFF002C24
+          E3912A22E3FF332BE4FF9995F1FFF5F4FEFFFBFBFEFFF6F6FEFFF8F8FEFFFCFC
+          FFFFB6B3F5FF433CE6FF241CE2FF2A22E3FF3028E442FFFFFF00FFFFFF00FFFF
+          FF002A22E3BF2A22E3FF2820E2FF635DEAFFCECCF9FFFFFFFFFFE7E6FCFF7C77
+          EEFF2D26E3FF271FE2FF2A22E3FF2E27E362FFFFFF00FFFFFF00FFFFFF00FFFF
+          FF00FFFFFF002B23E3812C24E3FF2B23E3FF4C46E8FF8D89F0FF615BEAFF2820
+          E3FF2B23E3FF2D25E3DF3129E442FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+          FF00FFFFFF00FFFFFF00241CE21E241CE26E241CE2AF241CE2BF241CE2BF241C
+          E29F241CE25EFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+        }
+        ImageIndex = 2
+      end
+    end
+    object MenuItem2: TMenuItem
+      Caption = 'New Item2'
+      object MenuItem4: TMenuItem
+        Caption = 'New Item4'
+        Bitmap.Data = {
+          36040000424D3604000000000000360000002800000010000000100000000100
+          2000000000000004000064000000640000000000000000000000986B37FF976A
+          36FF966935FF966734FF956633FF946532FF946531FF936430FF92622FFF9261
+          2EFF91602DFF90602CFF905F2BFF8F5D2AFF8E5C29FF8D5B28FF996C38FFF8F7
+          F6FFF8F7F5FFF7F6F5FFF6F6F4FFF6F5F3FFF5F5F3FFF5F4F2FFF4F3F1FFF4F3
+          F1FFF3F2F0FFF3F2EFFFF2F1EFFFF2F0EEFFF1F0EDFF8E5D29FF996D3AFFF9F8
+          F7FF959594FF878787FF9B9A9AFFF7F6F4FFF6F5F3FFF6F5F3FFF5F4F2FFF4F3
+          F1FFF4F3F1FFF3F2F0FFF3F2EFFFF2F1EFFFF2F1EEFF8F5E2AFF9A6E3BFFF9F9
+          F8FF7C7C7CFFC4C4C4FF878787FFF7F6F5FF7A7A7AFF787878FF747474FF7171
+          70FF6D6D6CFF696968FF656565FF616161FFF2F1EFFF905F2BFF9B6F3CFFFAF9
+          F8FFBEBEBDFF929292FFBCBCBBFFF8F7F6FFF7F7F5FFF7F6F4FFF6F5F4FFF6F5
+          F3FFF5F4F2FFF5F4F2FFF4F3F1FFF4F2F0FFF3F2F0FF91602DFF9C703DFFFAFA
+          F9FFFAF9F9FFF9F9F8FFF9F8F7FFF8F8F7FFF8F7F6FFF7F7F5FFF7F6F5FFF6F5
+          F4FFF6F5F3FFF5F4F3FFF5F4F2FFF4F3F1FFF4F3F0FF92612EFF9D723EFFFBFB
+          FAFF9F9F9EFF7F7F7FFFAEAEADFFF9F8F7FFF8F8F7FFF8F7F6FFF7F7F5FFF7F6
+          F5FFF6F6F4FFF6F5F3FFF5F4F3FFF5F4F2FFF4F3F1FF92622FFF9D7340FFFCFB
+          FBFF818181FFC4C4C4FF8F8F8FFFFAF9F8FF7B7B7AFF797979FF757574FF7271
+          71FF6D6D6DFF696969FF666665FF626261FFF5F4F2FF936430FF9E7441FFFCFC
+          FCFFB5B5B5FF848484FFBEBDBDFFFAFAF9FFFAF9F8FFF9F9F7FFF9F8F7FFF8F8
+          F6FFF8F7F5FFF7F6F5FFF7F6F4FFF6F5F3FFF6F5F3FF946531FF9F7542FFFDFD
+          FCFFFCFCFCFFFCFCFBFFFBFBFAFFFBFAFAFFFAFAF9FFFAF9F8FFF9F9F8FFF9F8
+          F7FFF8F8F6FFF8F7F6FFF7F6F5FFF7F6F4FFF6F5F4FF956633FFA07643FFFEFD
+          FDFF8C8C8CFF525252FFA4A4A4FFFBFBFAFFFBFBFAFFFAFAF9FFFAF9F8FFF9F9
+          F8FFF9F8F7FFF8F8F6FFF8F7F6FFF7F7F5FFF7F6F4FF966734FFA17844FFFEFE
+          FEFF5F5F5FFF949494FF535353FFFCFCFBFF7B7B7BFF797979FF757575FF7272
+          72FF6E6E6EFF6A6A69FF666666FF626262FFF7F7F5FF966935FFA17946FFFFFF
+          FFFF878787FF5D5D5DFFA0A0A0FFFDFCFCFFFCFCFBFFFCFBFBFFFBFBFAFFFBFA
+          F9FFFAFAF9FFFAF9F8FFF9F8F7FFF8F8F7FFF8F7F6FF976A36FFA27A47FFFFFF
+          FFFFFFFFFFFFFEFEFEFFFEFEFEFFFDFDFDFFFDFDFCFFFCFCFBFFFCFBFBFFFBFB
+          FAFFFBFAF9FFFAFAF9FFFAF9F8FFF9F9F7FFF9F8F7FF986B37FFA37B48FFBEA2
+          7FFFBEA17EFFBDA17DFFBDA07CFFBD9F7CFFBC9F7BFFBB9E7AFFBB9D7AFFBB9D
+          79FFBA9C78FFB99B78FFB99A77FFB89A76FFB89975FF996C39FFA37B48FFA37B
+          48FFA27A47FFA27946FFA17845FFA07744FFA07643FF9F7542FF9E7441FF9E73
+          40FF9D723FFF9C713EFF9C703DFF9B6F3CFF9A6E3BFF9A6D3AFF
+        }
+        ImageIndex = 0
+      end
+      object MenuItem5: TMenuItem
+        Caption = 'New Item5'
+        Bitmap.Data = {
+          36040000424D3604000000000000360000002800000010000000100000000100
+          2000000000000004000064000000640000000000000000000000FF00FF00FF00
+          FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00
+          FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00634A
+          31FF634A31FF634A31FF634A31FF634A31FF634A31FF634A31FF634A31FF634A
+          31FF634A31FF634A31FF634A31FF634A31FFFF00FF00FF00FF00C6ADA5FFFFEF
+          E7FFFFEFE7FFFFEFE7FFFFEFE7FFFFEFE7FFFFEFE7FFFFEFE7FFFFE7D6FFFFDE
+          D6FFFFDED6FFFFDED6FFFFDED6FFFFDED6FF634A31FFFF00FF00C6ADA5FFFFEF
+          E7FFD69484FFE7A584FFF7A584FFF79C73FFF79C73FFE78C63FFE78463FFE784
+          52FFE78442FFE77B42FFE78452FFFFDED6FF634A31FFFF00FF00C6ADA5FFFFF7
+          F7FFC69473FFFFC6A5FFF7B594FFF7A584FFF79C73FFF79C73FFE78C63FFE784
+          63FFD67B52FFD67352FFE77342FFFFDED6FF634A31FFFF00FF00C6ADA5FFFFF7
+          F7FFC69473FFFFCEB5FFFFEFE7FFFFE7D6FFFFDED6FFFFDED6FFFFDED6FFFFD6
+          C6FFFFD6C6FFD67B52FFE77342FFFFDED6FF634A31FFFF00FF00C6ADA5FFFFF7
+          F7FFC69473FFFFCEB5FFFFC6A5FFFFC6A5FFFFB594FFF7A584FFF7A584FFF79C
+          73FFE78C63FFE78463FFE77342FFFFDED6FF634A31FFFF00FF00C6ADA5FFFFF7
+          F7FFC69473FFFFD6C6FFFFEFE7FFFFEFE7FFFFEFE7FFFFE7D6FFFFDED6FFFFDE
+          D6FFFFDED6FFE78C63FFE77342FFFFE7D6FF634A31FFFF00FF00C6ADA5FFFFF7
+          F7FFC69473FFFFD6C6FFFFD6C6FFFFCEB5FFFFC6A5FFFFC6A5FFFFB594FFF7A5
+          84FFF79C73FFF79C73FFE77342FFFFEFE7FF634A31FFFF00FF00D6B5A5FFFFFF
+          FFFFC69473FFFFDED6FFFFEFE7FFFFEFE7FFFFEFE7FFFFC6A5FFFFC6A5FFFFB5
+          94FFFFB594FFF79C73FFE77B42FFFFEFE7FF634A31FFFF00FF00D6B5A5FFFFFF
+          FFFFC69473FFFFDED6FFFFDED6FFFFD6C6FFFFCEB5FFFFCEB5FFFFC6A5FFFFC6
+          A5FFFFB594FFFFB584FFE77B42FFFFEFE7FF634A31FFFF00FF00D6B5A5FFFFFF
+          FFFFD69C84FFD69484FFC69473FFD68C73FFD68C63FFC68463FFC67B52FFC673
+          42FFC66B42FFC66B42FFD67B42FFFFEFE7FF634A31FFFF00FF00D6B5A5FFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F7FFFFF7F7FFFFF7F7FFFFF7F7FFFFF7
+          F7FFFFEFE7FFFFEFE7FFFFEFE7FFFFEFE7FF634A31FFFF00FF00FF00FF00D6B5
+          A5FFD6B5A5FFD6B5A5FFD6B5A5FFC6ADA5FFC6ADA5FFC6ADA5FFC6ADA5FFC6AD
+          A5FFC6ADA5FFC6ADA5FFC6ADA5FFC6ADA5FFFF00FF00FF00FF00FF00FF00FF00
+          FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00
+          FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00
+          FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00
+          FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00
+        }
+        ImageIndex = 1
+      end
+      object MenuItem6: TMenuItem
+        Caption = 'New Item6'
+        Bitmap.Data = {
+          36040000424D3604000000000000360000002800000010000000100000000100
+          2000000000000004000064000000640000000000000000000000986B37FF976A
+          36FF966935FF966734FF956633FF946532FF946531FF936430FF92622FFF9261
+          2EFF91602DFF90602CFF905F2BFF8F5D2AFF8E5C29FF8D5B28FF996C38FFF8F7
+          F6FFF8F7F5FFF7F6F5FFF6F6F4FFF6F5F3FFF5F5F3FFF5F4F2FFF4F3F1FFF4F3
+          F1FFF3F2F0FFF3F2EFFFF2F1EFFFF2F0EEFFF1F0EDFF8E5D29FF996D3AFFF9F8
+          F7FF959594FF878787FF9B9A9AFFF7F6F4FFF6F5F3FFF6F5F3FFF5F4F2FFF4F3
+          F1FFF4F3F1FFF3F2F0FFF3F2EFFFF2F1EFFFF2F1EEFF8F5E2AFF9A6E3BFFF9F9
+          F8FF7C7C7CFFC4C4C4FF878787FFF7F6F5FF7A7A7AFF787878FF747474FF7171
+          70FF6D6D6CFF696968FF656565FF616161FFF2F1EFFF905F2BFF9B6F3CFFFAF9
+          F8FFBEBEBDFF929292FFBCBCBBFFF8F7F6FFF7F7F5FFF7F6F4FFF6F5F4FFF6F5
+          F3FFF5F4F2FFF5F4F2FFF4F3F1FFF4F2F0FFF3F2F0FF91602DFF9C703DFFFAFA
+          F9FFFAF9F9FFF9F9F8FFF9F8F7FFF8F8F7FFF8F7F6FFF7F7F5FFF7F6F5FFF6F5
+          F4FFF6F5F3FFF5F4F3FFF5F4F2FFF4F3F1FFF4F3F0FF92612EFF9D723EFFFBFB
+          FAFF9F9F9EFF7F7F7FFFAEAEADFFF9F8F7FFF8F8F7FFF8F7F6FFF7F7F5FFF7F6
+          F5FFF6F6F4FFF6F5F3FFF5F4F3FFF5F4F2FFF4F3F1FF92622FFF9D7340FFFCFB
+          FBFF818181FFC4C4C4FF8F8F8FFFFAF9F8FF7B7B7AFF797979FF757574FF7271
+          71FF6D6D6DFF696969FF666665FF626261FFF5F4F2FF936430FF9E7441FFFCFC
+          FCFFB5B5B5FF848484FFBEBDBDFFFAFAF9FFFAF9F8FFF9F9F7FFF9F8F7FFF8F8
+          F6FFF8F7F5FFF7F6F5FFF7F6F4FFF6F5F3FFF6F5F3FF946531FF9F7542FFFDFD
+          FCFFFCFCFCFFFCFCFBFFFBFBFAFFFBFAFAFFFAFAF9FFFAF9F8FFF9F9F8FFF9F8
+          F7FFF8F8F6FFF8F7F6FFF7F6F5FFF7F6F4FFF6F5F4FF956633FFA07643FFFEFD
+          FDFF8C8C8CFF525252FFA4A4A4FFFBFBFAFFFBFBFAFFFAFAF9FFFAF9F8FFF9F9
+          F8FFF9F8F7FFF8F8F6FFF8F7F6FFF7F7F5FFF7F6F4FF966734FFA17844FFFEFE
+          FEFF5F5F5FFF949494FF535353FFFCFCFBFF7B7B7BFF797979FF757575FF7272
+          72FF6E6E6EFF6A6A69FF666666FF626262FFF7F7F5FF966935FFA17946FFFFFF
+          FFFF878787FF5D5D5DFFA0A0A0FFFDFCFCFFFCFCFBFFFCFBFBFFFBFBFAFFFBFA
+          F9FFFAFAF9FFFAF9F8FFF9F8F7FFF8F8F7FFF8F7F6FF976A36FFA27A47FFFFFF
+          FFFFFFFFFFFFFEFEFEFFFEFEFEFFFDFDFDFFFDFDFCFFFCFCFBFFFCFBFBFFFBFB
+          FAFFFBFAF9FFFAFAF9FFFAF9F8FFF9F9F7FFF9F8F7FF986B37FFA37B48FFBEA2
+          7FFFBEA17EFFBDA17DFFBDA07CFFBD9F7CFFBC9F7BFFBB9E7AFFBB9D7AFFBB9D
+          79FFBA9C78FFB99B78FFB99A77FFB89A76FFB89975FF996C39FFA37B48FFA37B
+          48FFA27A47FFA27946FFA17845FFA07744FFA07643FF9F7542FF9E7441FF9E73
+          40FF9D723FFF9C713EFF9C703DFF9B6F3CFF9A6E3BFF9A6D3AFF
+        }
+        ImageIndex = 0
+      end
+      object MenuItem7: TMenuItem
+        Caption = 'New Item7'
+        Bitmap.Data = {
+          36040000424D3604000000000000360000002800000010000000100000000100
+          2000000000000004000064000000640000000000000000000000FF00FF00FF00
+          FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00
+          FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00634A
+          31FF634A31FF634A31FF634A31FF634A31FF634A31FF634A31FF634A31FF634A
+          31FF634A31FF634A31FF634A31FF634A31FFFF00FF00FF00FF00C6ADA5FFFFEF
+          E7FFFFEFE7FFFFEFE7FFFFEFE7FFFFEFE7FFFFEFE7FFFFEFE7FFFFE7D6FFFFDE
+          D6FFFFDED6FFFFDED6FFFFDED6FFFFDED6FF634A31FFFF00FF00C6ADA5FFFFEF
+          E7FFD69484FFE7A584FFF7A584FFF79C73FFF79C73FFE78C63FFE78463FFE784
+          52FFE78442FFE77B42FFE78452FFFFDED6FF634A31FFFF00FF00C6ADA5FFFFF7
+          F7FFC69473FFFFC6A5FFF7B594FFF7A584FFF79C73FFF79C73FFE78C63FFE784
+          63FFD67B52FFD67352FFE77342FFFFDED6FF634A31FFFF00FF00C6ADA5FFFFF7
+          F7FFC69473FFFFCEB5FFFFEFE7FFFFE7D6FFFFDED6FFFFDED6FFFFDED6FFFFD6
+          C6FFFFD6C6FFD67B52FFE77342FFFFDED6FF634A31FFFF00FF00C6ADA5FFFFF7
+          F7FFC69473FFFFCEB5FFFFC6A5FFFFC6A5FFFFB594FFF7A584FFF7A584FFF79C
+          73FFE78C63FFE78463FFE77342FFFFDED6FF634A31FFFF00FF00C6ADA5FFFFF7
+          F7FFC69473FFFFD6C6FFFFEFE7FFFFEFE7FFFFEFE7FFFFE7D6FFFFDED6FFFFDE
+          D6FFFFDED6FFE78C63FFE77342FFFFE7D6FF634A31FFFF00FF00C6ADA5FFFFF7
+          F7FFC69473FFFFD6C6FFFFD6C6FFFFCEB5FFFFC6A5FFFFC6A5FFFFB594FFF7A5
+          84FFF79C73FFF79C73FFE77342FFFFEFE7FF634A31FFFF00FF00D6B5A5FFFFFF
+          FFFFC69473FFFFDED6FFFFEFE7FFFFEFE7FFFFEFE7FFFFC6A5FFFFC6A5FFFFB5
+          94FFFFB594FFF79C73FFE77B42FFFFEFE7FF634A31FFFF00FF00D6B5A5FFFFFF
+          FFFFC69473FFFFDED6FFFFDED6FFFFD6C6FFFFCEB5FFFFCEB5FFFFC6A5FFFFC6
+          A5FFFFB594FFFFB584FFE77B42FFFFEFE7FF634A31FFFF00FF00D6B5A5FFFFFF
+          FFFFD69C84FFD69484FFC69473FFD68C73FFD68C63FFC68463FFC67B52FFC673
+          42FFC66B42FFC66B42FFD67B42FFFFEFE7FF634A31FFFF00FF00D6B5A5FFFFFF
+          FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F7FFFFF7F7FFFFF7F7FFFFF7F7FFFFF7
+          F7FFFFEFE7FFFFEFE7FFFFEFE7FFFFEFE7FF634A31FFFF00FF00FF00FF00D6B5
+          A5FFD6B5A5FFD6B5A5FFD6B5A5FFC6ADA5FFC6ADA5FFC6ADA5FFC6ADA5FFC6AD
+          A5FFC6ADA5FFC6ADA5FFC6ADA5FFC6ADA5FFFF00FF00FF00FF00FF00FF00FF00
+          FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00
+          FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00
+          FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00
+          FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00
+        }
+        ImageIndex = 1
+      end
+    end
+    object MenuItem11: TMenuItem
+      Caption = 'New Item11'
+      object MenuItem12: TMenuItem
+        Caption = 'New Item12'
+        Bitmap.Data = {
+          36040000424D3604000000000000360000002800000010000000100000000100
+          2000000000000004000064000000640000000000000000000000FFFFFF00FFFF
+          FF00FFFFFF00FFFFFF005049E726342DE374241CE1BF231BE1BF231BE1BF251D
+          E19F3730E464FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+          FF00FFFFFF002D26E2912B23E2FF3032E7FF3B48EFFF4356F4FF4152F2FF3944
+          EEFF2D2BE5FF2C24E2DF352EE354FFFFFF00FFFFFF00FFFFFF00FFFFFF00231B
+          E20E2B23E3CF2C29E5FF4153F3FF4E6AFAFF4E6AFAFF4E6AFAFF4E6AFAFF4E6A
+          FAFF4D69FAFF3B47EFFF2923E3FF332BE362FFFFFF00FFFFFF00FFFFFF002C24
+          E3912A24E5FFE2E6FEFFE6EAFEFFE5E9FEFFE5E9FEFFE5E9FEFFE5E9FEFFE5E9
+          FEFFE5E9FEFFE8EBFEFF4051F2FF2820E2FF3730E442FFFFFF00231BE22E2A22
+          E3FF3B47EFFF5C76FAFF96A7FCFFA2B1FCFFA3B2FCFF9CACFCFFA5B3FCFFA1B0
+          FCFF9EADFCFF778CFBFF4E6AFAFF3134E9FF2B23E2DFFFFFFF00231BE29F271F
+          E3FF4961F7FFCFD7FEFFFBFBFFFFE4E8FEFFDCE2FEFFFBFBFFFFD6DDFEFFECF0
+          FEFFFAFAFFFFCDD5FEFF4E6AFAFF3E4DF1FF261FE1FF231BE12E231BE2DF261E
+          E2FF4D68F9FF6981FBFFF3F4FFFF8598FCFF667EFBFFF3F4FFFF4E6AFAFFA8B5
+          FDFFDDE2FEFF4E6AFAFF4E6AFAFF4255F3FF231BE1FF231BE17E241CE2FF261F
+          E2FF231BE2FF453EE6FFEFEEFDFF6D68ECFF4841E7FFEFEFFDFF2B23E3FF9793
+          F1FFD6D4FAFF231BE2FF231BE1FF231BE1FF231BE1FF231BE17E241CE2FF271F
+          E2FF241CE2FF453FE6FFEFEEFDFF6D68ECFF4841E7FFEFEFFDFF2B23E3FF9793
+          F1FFD6D4FAFF231BE2FF231BE2FF231BE2FF231BE2FF231BE27E241CE2CF2720
+          E2FF241CE2FF3C35E5FFEFEEFDFF645FEBFF3D36E5FFEFEFFDFF231BE2FF908C
+          F0FFD4D2F9FF231BE2FF231BE2FF231BE2FF241CE2FF231BE27E241CE29F2921
+          E3FF241CE2FFEBEAFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFF261EE2FF231BE2FF271FE3FF231BE22E241CE22E2C24
+          E3FF261EE2FF241CE2FF241CE2FF241CE2FF241CE2FF241CE2FF241CE2FF241C
+          E2FF241CE2FF241CE2FF261EE2FF251DE2FF2B23E3DFFFFFFF00FFFFFF002C24
+          E3912A22E3FF332BE4FF9995F1FFF5F4FEFFFBFBFEFFF6F6FEFFF8F8FEFFFCFC
+          FFFFB6B3F5FF433CE6FF241CE2FF2A22E3FF3028E442FFFFFF00FFFFFF00FFFF
+          FF002A22E3BF2A22E3FF2820E2FF635DEAFFCECCF9FFFFFFFFFFE7E6FCFF7C77
+          EEFF2D26E3FF271FE2FF2A22E3FF2E27E362FFFFFF00FFFFFF00FFFFFF00FFFF
+          FF00FFFFFF002B23E3812C24E3FF2B23E3FF4C46E8FF8D89F0FF615BEAFF2820
+          E3FF2B23E3FF2D25E3DF3129E442FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+          FF00FFFFFF00FFFFFF00241CE21E241CE26E241CE2AF241CE2BF241CE2BF241C
+          E29F241CE25EFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+        }
+        ImageIndex = 2
+      end
+      object MenuItem13: TMenuItem
+        Caption = 'New Item13'
+        Bitmap.Data = {
+          36040000424D3604000000000000360000002800000010000000100000000100
+          2000000000000004000064000000640000000000000000000000FFFFFF00FFFF
+          FF00FFFFFF00FFFFFF005049E726342DE374241CE1BF231BE1BF231BE1BF251D
+          E19F3730E464FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+          FF00FFFFFF002D26E2912B23E2FF3032E7FF3B48EFFF4356F4FF4152F2FF3944
+          EEFF2D2BE5FF2C24E2DF352EE354FFFFFF00FFFFFF00FFFFFF00FFFFFF00231B
+          E20E2B23E3CF2C29E5FF4153F3FF4E6AFAFF4E6AFAFF4E6AFAFF4E6AFAFF4E6A
+          FAFF4D69FAFF3B47EFFF2923E3FF332BE362FFFFFF00FFFFFF00FFFFFF002C24
+          E3912A24E5FFE2E6FEFFE6EAFEFFE5E9FEFFE5E9FEFFE5E9FEFFE5E9FEFFE5E9
+          FEFFE5E9FEFFE8EBFEFF4051F2FF2820E2FF3730E442FFFFFF00231BE22E2A22
+          E3FF3B47EFFF5C76FAFF96A7FCFFA2B1FCFFA3B2FCFF9CACFCFFA5B3FCFFA1B0
+          FCFF9EADFCFF778CFBFF4E6AFAFF3134E9FF2B23E2DFFFFFFF00231BE29F271F
+          E3FF4961F7FFCFD7FEFFFBFBFFFFE4E8FEFFDCE2FEFFFBFBFFFFD6DDFEFFECF0
+          FEFFFAFAFFFFCDD5FEFF4E6AFAFF3E4DF1FF261FE1FF231BE12E231BE2DF261E
+          E2FF4D68F9FF6981FBFFF3F4FFFF8598FCFF667EFBFFF3F4FFFF4E6AFAFFA8B5
+          FDFFDDE2FEFF4E6AFAFF4E6AFAFF4255F3FF231BE1FF231BE17E241CE2FF261F
+          E2FF231BE2FF453EE6FFEFEEFDFF6D68ECFF4841E7FFEFEFFDFF2B23E3FF9793
+          F1FFD6D4FAFF231BE2FF231BE1FF231BE1FF231BE1FF231BE17E241CE2FF271F
+          E2FF241CE2FF453FE6FFEFEEFDFF6D68ECFF4841E7FFEFEFFDFF2B23E3FF9793
+          F1FFD6D4FAFF231BE2FF231BE2FF231BE2FF231BE2FF231BE27E241CE2CF2720
+          E2FF241CE2FF3C35E5FFEFEEFDFF645FEBFF3D36E5FFEFEFFDFF231BE2FF908C
+          F0FFD4D2F9FF231BE2FF231BE2FF231BE2FF241CE2FF231BE27E241CE29F2921
+          E3FF241CE2FFEBEAFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+          FFFFFFFFFFFFFFFFFFFF261EE2FF231BE2FF271FE3FF231BE22E241CE22E2C24
+          E3FF261EE2FF241CE2FF241CE2FF241CE2FF241CE2FF241CE2FF241CE2FF241C
+          E2FF241CE2FF241CE2FF261EE2FF251DE2FF2B23E3DFFFFFFF00FFFFFF002C24
+          E3912A22E3FF332BE4FF9995F1FFF5F4FEFFFBFBFEFFF6F6FEFFF8F8FEFFFCFC
+          FFFFB6B3F5FF433CE6FF241CE2FF2A22E3FF3028E442FFFFFF00FFFFFF00FFFF
+          FF002A22E3BF2A22E3FF2820E2FF635DEAFFCECCF9FFFFFFFFFFE7E6FCFF7C77
+          EEFF2D26E3FF271FE2FF2A22E3FF2E27E362FFFFFF00FFFFFF00FFFFFF00FFFF
+          FF00FFFFFF002B23E3812C24E3FF2B23E3FF4C46E8FF8D89F0FF615BEAFF2820
+          E3FF2B23E3FF2D25E3DF3129E442FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+          FF00FFFFFF00FFFFFF00241CE21E241CE26E241CE2AF241CE2BF241CE2BF241C
+          E29F241CE25EFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+        }
+        ImageIndex = 2
+      end
+    end
+  end
+  object ImageList2: TImageList
+    left = 880
+    top = 576
+    Bitmap = {
+      4C69030000001000000010000000A37B48FFA37B48FFA27A47FFA27946FFA178
+      45FFA07744FFA07643FF9F7542FF9E7441FF9E7340FF9D723FFF9C713EFF9C70
+      3DFF9B6F3CFF9A6E3BFF9A6D3AFFA37B48FFBEA27FFFBEA17EFFBDA17DFFBDA0
+      7CFFBD9F7CFFBC9F7BFFBB9E7AFFBB9D7AFFBB9D79FFBA9C78FFB99B78FFB99A
+      77FFB89A76FFB89975FF996C39FFA27A47FFFFFFFFFFFFFFFFFFFEFEFEFFFEFE
+      FEFFFDFDFDFFFDFDFCFFFCFCFBFFFCFBFBFFFBFBFAFFFBFAF9FFFAFAF9FFFAF9
+      F8FFF9F9F7FFF9F8F7FF986B37FFA17946FFFFFFFFFF878787FF5D5D5DFFA0A0
+      A0FFFDFCFCFFFCFCFBFFFCFBFBFFFBFBFAFFFBFAF9FFFAFAF9FFFAF9F8FFF9F8
+      F7FFF8F8F7FFF8F7F6FF976A36FFA17844FFFEFEFEFF5F5F5FFF949494FF5353
+      53FFFCFCFBFF7B7B7BFF797979FF757575FF727272FF6E6E6EFF6A6A69FF6666
+      66FF626262FFF7F7F5FF966935FFA07643FFFEFDFDFF8C8C8CFF525252FFA4A4
+      A4FFFBFBFAFFFBFBFAFFFAFAF9FFFAF9F8FFF9F9F8FFF9F8F7FFF8F8F6FFF8F7
+      F6FFF7F7F5FFF7F6F4FF966734FF9F7542FFFDFDFCFFFCFCFCFFFCFCFBFFFBFB
+      FAFFFBFAFAFFFAFAF9FFFAF9F8FFF9F9F8FFF9F8F7FFF8F8F6FFF8F7F6FFF7F6
+      F5FFF7F6F4FFF6F5F4FF956633FF9E7441FFFCFCFCFFB5B5B5FF848484FFBEBD
+      BDFFFAFAF9FFFAF9F8FFF9F9F7FFF9F8F7FFF8F8F6FFF8F7F5FFF7F6F5FFF7F6
+      F4FFF6F5F3FFF6F5F3FF946531FF9D7340FFFCFBFBFF818181FFC4C4C4FF8F8F
+      8FFFFAF9F8FF7B7B7AFF797979FF757574FF727171FF6D6D6DFF696969FF6666
+      65FF626261FFF5F4F2FF936430FF9D723EFFFBFBFAFF9F9F9EFF7F7F7FFFAEAE
+      ADFFF9F8F7FFF8F8F7FFF8F7F6FFF7F7F5FFF7F6F5FFF6F6F4FFF6F5F3FFF5F4
+      F3FFF5F4F2FFF4F3F1FF92622FFF9C703DFFFAFAF9FFFAF9F9FFF9F9F8FFF9F8
+      F7FFF8F8F7FFF8F7F6FFF7F7F5FFF7F6F5FFF6F5F4FFF6F5F3FFF5F4F3FFF5F4
+      F2FFF4F3F1FFF4F3F0FF92612EFF9B6F3CFFFAF9F8FFBEBEBDFF929292FFBCBC
+      BBFFF8F7F6FFF7F7F5FFF7F6F4FFF6F5F4FFF6F5F3FFF5F4F2FFF5F4F2FFF4F3
+      F1FFF4F2F0FFF3F2F0FF91602DFF9A6E3BFFF9F9F8FF7C7C7CFFC4C4C4FF8787
+      87FFF7F6F5FF7A7A7AFF787878FF747474FF717170FF6D6D6CFF696968FF6565
+      65FF616161FFF2F1EFFF905F2BFF996D3AFFF9F8F7FF959594FF878787FF9B9A
+      9AFFF7F6F4FFF6F5F3FFF6F5F3FFF5F4F2FFF4F3F1FFF4F3F1FFF3F2F0FFF3F2
+      EFFFF2F1EFFFF2F1EEFF8F5E2AFF996C38FFF8F7F6FFF8F7F5FFF7F6F5FFF6F6
+      F4FFF6F5F3FFF5F5F3FFF5F4F2FFF4F3F1FFF4F3F1FFF3F2F0FFF3F2EFFFF2F1
+      EFFFF2F0EEFFF1F0EDFF8E5D29FF986B37FF976A36FF966935FF966734FF9566
+      33FF946532FF946531FF936430FF92622FFF92612EFF91602DFF90602CFF905F
+      2BFF8F5D2AFF8E5C29FF8D5B28FFFF00FF00FF00FF00FF00FF00FF00FF00FF00
+      FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00
+      FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00
+      FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00
+      FF00FF00FF00FF00FF00FF00FF00FF00FF00D6B5A5FFD6B5A5FFD6B5A5FFD6B5
+      A5FFC6ADA5FFC6ADA5FFC6ADA5FFC6ADA5FFC6ADA5FFC6ADA5FFC6ADA5FFC6AD
+      A5FFC6ADA5FFFF00FF00FF00FF00D6B5A5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFF7F7FFFFF7F7FFFFF7F7FFFFF7F7FFFFF7F7FFFFEFE7FFFFEFE7FFFFEF
+      E7FFFFEFE7FF634A31FFFF00FF00D6B5A5FFFFFFFFFFD69C84FFD69484FFC694
+      73FFD68C73FFD68C63FFC68463FFC67B52FFC67342FFC66B42FFC66B42FFD67B
+      42FFFFEFE7FF634A31FFFF00FF00D6B5A5FFFFFFFFFFC69473FFFFDED6FFFFDE
+      D6FFFFD6C6FFFFCEB5FFFFCEB5FFFFC6A5FFFFC6A5FFFFB594FFFFB584FFE77B
+      42FFFFEFE7FF634A31FFFF00FF00D6B5A5FFFFFFFFFFC69473FFFFDED6FFFFEF
+      E7FFFFEFE7FFFFEFE7FFFFC6A5FFFFC6A5FFFFB594FFFFB594FFF79C73FFE77B
+      42FFFFEFE7FF634A31FFFF00FF00C6ADA5FFFFF7F7FFC69473FFFFD6C6FFFFD6
+      C6FFFFCEB5FFFFC6A5FFFFC6A5FFFFB594FFF7A584FFF79C73FFF79C73FFE773
+      42FFFFEFE7FF634A31FFFF00FF00C6ADA5FFFFF7F7FFC69473FFFFD6C6FFFFEF
+      E7FFFFEFE7FFFFEFE7FFFFE7D6FFFFDED6FFFFDED6FFFFDED6FFE78C63FFE773
+      42FFFFE7D6FF634A31FFFF00FF00C6ADA5FFFFF7F7FFC69473FFFFCEB5FFFFC6
+      A5FFFFC6A5FFFFB594FFF7A584FFF7A584FFF79C73FFE78C63FFE78463FFE773
+      42FFFFDED6FF634A31FFFF00FF00C6ADA5FFFFF7F7FFC69473FFFFCEB5FFFFEF
+      E7FFFFE7D6FFFFDED6FFFFDED6FFFFDED6FFFFD6C6FFFFD6C6FFD67B52FFE773
+      42FFFFDED6FF634A31FFFF00FF00C6ADA5FFFFF7F7FFC69473FFFFC6A5FFF7B5
+      94FFF7A584FFF79C73FFF79C73FFE78C63FFE78463FFD67B52FFD67352FFE773
+      42FFFFDED6FF634A31FFFF00FF00C6ADA5FFFFEFE7FFD69484FFE7A584FFF7A5
+      84FFF79C73FFF79C73FFE78C63FFE78463FFE78452FFE78442FFE77B42FFE784
+      52FFFFDED6FF634A31FFFF00FF00C6ADA5FFFFEFE7FFFFEFE7FFFFEFE7FFFFEF
+      E7FFFFEFE7FFFFEFE7FFFFEFE7FFFFE7D6FFFFDED6FFFFDED6FFFFDED6FFFFDE
+      D6FFFFDED6FF634A31FFFF00FF00FF00FF00634A31FF634A31FF634A31FF634A
+      31FF634A31FF634A31FF634A31FF634A31FF634A31FF634A31FF634A31FF634A
+      31FF634A31FFFF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00
+      FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00
+      FF00FF00FF00FF00FF00FF00FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00241C
+      E21E241CE26E241CE2AF241CE2BF241CE2BF241CE29F241CE25EFFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF002B23E3812C24
+      E3FF2B23E3FF4C46E8FF8D89F0FF615BEAFF2820E3FF2B23E3FF2D25E3DF3129
+      E442FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF002A22E3BF2A22E3FF2820
+      E2FF635DEAFFCECCF9FFFFFFFFFFE7E6FCFF7C77EEFF2D26E3FF271FE2FF2A22
+      E3FF2E27E362FFFFFF00FFFFFF00FFFFFF002C24E3912A22E3FF332BE4FF9995
+      F1FFF5F4FEFFFBFBFEFFF6F6FEFFF8F8FEFFFCFCFFFFB6B3F5FF433CE6FF241C
+      E2FF2A22E3FF3028E442FFFFFF00241CE22E2C24E3FF261EE2FF241CE2FF241C
+      E2FF241CE2FF241CE2FF241CE2FF241CE2FF241CE2FF241CE2FF241CE2FF261E
+      E2FF251DE2FF2B23E3DFFFFFFF00241CE29F2921E3FF241CE2FFEBEAFCFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF261E
+      E2FF231BE2FF271FE3FF231BE22E241CE2CF2720E2FF241CE2FF3C35E5FFEFEE
+      FDFF645FEBFF3D36E5FFEFEFFDFF231BE2FF908CF0FFD4D2F9FF231BE2FF231B
+      E2FF231BE2FF241CE2FF231BE27E241CE2FF271FE2FF241CE2FF453FE6FFEFEE
+      FDFF6D68ECFF4841E7FFEFEFFDFF2B23E3FF9793F1FFD6D4FAFF231BE2FF231B
+      E2FF231BE2FF231BE2FF231BE27E241CE2FF261FE2FF231BE2FF453EE6FFEFEE
+      FDFF6D68ECFF4841E7FFEFEFFDFF2B23E3FF9793F1FFD6D4FAFF231BE2FF231B
+      E1FF231BE1FF231BE1FF231BE17E231BE2DF261EE2FF4D68F9FF6981FBFFF3F4
+      FFFF8598FCFF667EFBFFF3F4FFFF4E6AFAFFA8B5FDFFDDE2FEFF4E6AFAFF4E6A
+      FAFF4255F3FF231BE1FF231BE17E231BE29F271FE3FF4961F7FFCFD7FEFFFBFB
+      FFFFE4E8FEFFDCE2FEFFFBFBFFFFD6DDFEFFECF0FEFFFAFAFFFFCDD5FEFF4E6A
+      FAFF3E4DF1FF261FE1FF231BE12E231BE22E2A22E3FF3B47EFFF5C76FAFF96A7
+      FCFFA2B1FCFFA3B2FCFF9CACFCFFA5B3FCFFA1B0FCFF9EADFCFF778CFBFF4E6A
+      FAFF3134E9FF2B23E2DFFFFFFF00FFFFFF002C24E3912A24E5FFE2E6FEFFE6EA
+      FEFFE5E9FEFFE5E9FEFFE5E9FEFFE5E9FEFFE5E9FEFFE5E9FEFFE8EBFEFF4051
+      F2FF2820E2FF3730E442FFFFFF00FFFFFF00231BE20E2B23E3CF2C29E5FF4153
+      F3FF4E6AFAFF4E6AFAFF4E6AFAFF4E6AFAFF4E6AFAFF4D69FAFF3B47EFFF2923
+      E3FF332BE362FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF002D26E2912B23
+      E2FF3032E7FF3B48EFFF4356F4FF4152F2FF3944EEFF2D2BE5FF2C24E2DF352E
+      E354FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF005049
+      E726342DE374241CE1BF231BE1BF231BE1BF251DE19F3730E464FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00FFFFFF00
+    }
+  end
+end
Index: /tags/1.1.0/Packages/Common/Demo/ScaleDPI/UFormTest.pas
===================================================================
--- /tags/1.1.0/Packages/Common/Demo/ScaleDPI/UFormTest.pas	(revision 137)
+++ /tags/1.1.0/Packages/Common/Demo/ScaleDPI/UFormTest.pas	(revision 137)
@@ -0,0 +1,78 @@
+unit UFormTest;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ComCtrls,
+  StdCtrls, ExtCtrls, Menus, Calendar;
+
+type
+
+  { TForm2 }
+
+  TForm2 = class(TForm)
+    Button1: TButton;
+    Button2: TButton;
+    CheckBox1: TCheckBox;
+    Edit1: TEdit;
+    Image1: TImage;
+    ImageList1: TImageList;
+    ImageList2: TImageList;
+    MainMenu1: TMainMenu;
+    Memo1: TMemo;
+    MenuItem1: TMenuItem;
+    MenuItem10: TMenuItem;
+    MenuItem11: TMenuItem;
+    MenuItem12: TMenuItem;
+    MenuItem13: TMenuItem;
+    MenuItem2: TMenuItem;
+    MenuItem3: TMenuItem;
+    MenuItem4: TMenuItem;
+    MenuItem5: TMenuItem;
+    MenuItem6: TMenuItem;
+    MenuItem7: TMenuItem;
+    MenuItem8: TMenuItem;
+    MenuItem9: TMenuItem;
+    PageControl1: TPageControl;
+    Panel1: TPanel;
+    RadioGroup1: TRadioGroup;
+    TabSheet1: TTabSheet;
+    TabSheet2: TTabSheet;
+    TabSheet3: TTabSheet;
+    ToolBar1: TToolBar;
+    ToolButton1: TToolButton;
+    ToolButton2: TToolButton;
+    ToolButton3: TToolButton;
+    ToolButton4: TToolButton;
+    ToolButton5: TToolButton;
+    procedure Image1Click(Sender: TObject);
+    procedure MenuItem3Click(Sender: TObject);
+  private
+    { private declarations }
+  public
+    { public declarations }
+  end;
+
+var
+  Form2: TForm2;
+
+implementation
+
+{$R *.lfm}
+
+{ TForm2 }
+
+procedure TForm2.Image1Click(Sender: TObject);
+begin
+
+end;
+
+procedure TForm2.MenuItem3Click(Sender: TObject);
+begin
+
+end;
+
+end.
+
Index: /tags/1.1.0/Packages/Common/Languages/UDebugLog.cs.po
===================================================================
--- /tags/1.1.0/Packages/Common/Languages/UDebugLog.cs.po	(revision 137)
+++ /tags/1.1.0/Packages/Common/Languages/UDebugLog.cs.po	(revision 137)
@@ -0,0 +1,15 @@
+msgid ""
+msgstr ""
+"Content-Type: text/plain; charset=UTF-8\n"
+"Project-Id-Version: \n"
+"POT-Creation-Date: \n"
+"PO-Revision-Date: \n"
+"Last-Translator: Jiří Hajda <robie@centrum.cz>\n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: udebuglog.sfilenamenotdefined
+msgid "Filename not defined"
+msgstr "Neurčen soubor"
+
Index: /tags/1.1.0/Packages/Common/Languages/UDebugLog.po
===================================================================
--- /tags/1.1.0/Packages/Common/Languages/UDebugLog.po	(revision 137)
+++ /tags/1.1.0/Packages/Common/Languages/UDebugLog.po	(revision 137)
@@ -0,0 +1,7 @@
+msgid ""
+msgstr "Content-Type: text/plain; charset=UTF-8"
+
+#: udebuglog.sfilenamenotdefined
+msgid "Filename not defined"
+msgstr "Content-Type: text/plain; charset=UTF-8Content-Type: text/plain; charset=UTF-8Content-Type: text/plain; charset=UTF-8Content-Type: text/plain; charset=UTF-8Content-Type: text/plain; charset=UTF-8Content-Type: text/plain; charset=UTF-8Content-Type: text/plain; charset=UTF-8Content-Type: text/plain; charset=UTF-8Content-Type: text/plain; charset=UTF-8Content-Type: text/plain; charset=UTF-8Content-Type: text/plain; charset=UTF-8Content-Type: text/plain; charset=UTF-8Content-Type: text/plain; charset=UTF-8Content-Type: text/plain; charset=UTF-8Content-Type: text/plain; charset=UTF-8Content-Type: text/plain; charset=UTF-8"
+
Index: /tags/1.1.0/Packages/Common/Languages/UFindFile.po
===================================================================
--- /tags/1.1.0/Packages/Common/Languages/UFindFile.po	(revision 137)
+++ /tags/1.1.0/Packages/Common/Languages/UFindFile.po	(revision 137)
@@ -0,0 +1,7 @@
+msgid ""
+msgstr "Content-Type: text/plain; charset=UTF-8"
+
+#: ufindfile.sdirnotfound
+msgid "Directory not found"
+msgstr ""
+
Index: /tags/1.1.0/Packages/Common/Languages/UJobProgressView.po
===================================================================
--- /tags/1.1.0/Packages/Common/Languages/UJobProgressView.po	(revision 137)
+++ /tags/1.1.0/Packages/Common/Languages/UJobProgressView.po	(revision 137)
@@ -0,0 +1,31 @@
+msgid ""
+msgstr "Content-Type: text/plain; charset=UTF-8"
+
+#: ujobprogressview.sestimatedtime
+msgid "Estimated time: %s"
+msgstr ""
+
+#: ujobprogressview.sexecuted
+msgid "Executed"
+msgstr ""
+
+#: ujobprogressview.sfinished
+msgid "Finished"
+msgstr ""
+
+#: ujobprogressview.soperations
+msgid "Operations"
+msgstr ""
+
+#: ujobprogressview.spleasewait
+msgid "Please wait..."
+msgstr ""
+
+#: ujobprogressview.sterminate
+msgid "Termination"
+msgstr ""
+
+#: ujobprogressview.stotalestimatedtime
+msgid "Total estimated time: %s"
+msgstr ""
+
Index: /tags/1.1.0/Packages/Common/Languages/UPool.cs.po
===================================================================
--- /tags/1.1.0/Packages/Common/Languages/UPool.cs.po	(revision 137)
+++ /tags/1.1.0/Packages/Common/Languages/UPool.cs.po	(revision 137)
@@ -0,0 +1,19 @@
+msgid ""
+msgstr ""
+"Content-Type: text/plain; charset=UTF-8\n"
+"Project-Id-Version: \n"
+"POT-Creation-Date: \n"
+"PO-Revision-Date: \n"
+"Last-Translator: Chronos <robie@centrum.cz>\n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: upool.sobjectpoolempty
+msgid "Object pool is empty"
+msgstr "Zásobník objektů je prázdný"
+
+#: upool.sreleaseerror
+msgid "Unknown object for release from pool"
+msgstr "Neznýmý objekt pro uvolnění ze zásobníku"
+
Index: /tags/1.1.0/Packages/Common/Languages/UPool.po
===================================================================
--- /tags/1.1.0/Packages/Common/Languages/UPool.po	(revision 137)
+++ /tags/1.1.0/Packages/Common/Languages/UPool.po	(revision 137)
@@ -0,0 +1,11 @@
+msgid ""
+msgstr "Content-Type: text/plain; charset=UTF-8"
+
+#: upool.sobjectpoolempty
+msgid "Object pool is empty"
+msgstr "Content-Type: text/plain; charset=UTF-8Content-Type: text/plain; charset=UTF-8Content-Type: text/plain; charset=UTF-8Content-Type: text/plain; charset=UTF-8Content-Type: text/plain; charset=UTF-8Content-Type: text/plain; charset=UTF-8Content-Type: text/plain; charset=UTF-8Content-Type: text/plain; charset=UTF-8Content-Type: text/plain; charset=UTF-8Content-Type: text/plain; charset=UTF-8Content-Type: text/plain; charset=UTF-8Content-Type: text/plain; charset=UTF-8Content-Type: text/plain; charset=UTF-8Content-Type: text/plain; charset=UTF-8Content-Type: text/plain; charset=UTF-8Content-Type: text/plain; charset=UTF-8"
+
+#: upool.sreleaseerror
+msgid "Unknown object for release from pool"
+msgstr ""
+
Index: /tags/1.1.0/Packages/Common/Languages/UResetableThread.cs.po
===================================================================
--- /tags/1.1.0/Packages/Common/Languages/UResetableThread.cs.po	(revision 137)
+++ /tags/1.1.0/Packages/Common/Languages/UResetableThread.cs.po	(revision 137)
@@ -0,0 +1,15 @@
+msgid ""
+msgstr ""
+"Content-Type: text/plain; charset=UTF-8\n"
+"Project-Id-Version: \n"
+"POT-Creation-Date: \n"
+"PO-Revision-Date: \n"
+"Last-Translator: Chronos <robie@centrum.cz>\n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: uresetablethread.swaiterror
+msgid "WaitFor error"
+msgstr "Chyba WaitFor"
+
Index: /tags/1.1.0/Packages/Common/Languages/UResetableThread.po
===================================================================
--- /tags/1.1.0/Packages/Common/Languages/UResetableThread.po	(revision 137)
+++ /tags/1.1.0/Packages/Common/Languages/UResetableThread.po	(revision 137)
@@ -0,0 +1,7 @@
+msgid ""
+msgstr "Content-Type: text/plain; charset=UTF-8"
+
+#: uresetablethread.swaiterror
+msgid "WaitFor error"
+msgstr "Content-Type: text/plain; charset=UTF-8Content-Type: text/plain; charset=UTF-8Content-Type: text/plain; charset=UTF-8Content-Type: text/plain; charset=UTF-8Content-Type: text/plain; charset=UTF-8Content-Type: text/plain; charset=UTF-8Content-Type: text/plain; charset=UTF-8Content-Type: text/plain; charset=UTF-8Content-Type: text/plain; charset=UTF-8Content-Type: text/plain; charset=UTF-8Content-Type: text/plain; charset=UTF-8Content-Type: text/plain; charset=UTF-8Content-Type: text/plain; charset=UTF-8Content-Type: text/plain; charset=UTF-8Content-Type: text/plain; charset=UTF-8Content-Type: text/plain; charset=UTF-8"
+
Index: /tags/1.1.0/Packages/Common/Languages/UScaleDPI.po
===================================================================
--- /tags/1.1.0/Packages/Common/Languages/UScaleDPI.po	(revision 137)
+++ /tags/1.1.0/Packages/Common/Languages/UScaleDPI.po	(revision 137)
@@ -0,0 +1,7 @@
+msgid ""
+msgstr "Content-Type: text/plain; charset=UTF-8"
+
+#: uscaledpi.swrongdpi
+msgid "Wrong DPI [%d,%d]"
+msgstr ""
+
Index: /tags/1.1.0/Packages/Common/Languages/UThreading.cs.po
===================================================================
--- /tags/1.1.0/Packages/Common/Languages/UThreading.cs.po	(revision 137)
+++ /tags/1.1.0/Packages/Common/Languages/UThreading.cs.po	(revision 137)
@@ -0,0 +1,15 @@
+msgid ""
+msgstr ""
+"Content-Type: text/plain; charset=UTF-8\n"
+"Project-Id-Version: \n"
+"POT-Creation-Date: \n"
+"PO-Revision-Date: \n"
+"Last-Translator: Chronos <robie@centrum.cz>\n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: uthreading.scurrentthreadnotfound
+msgid "Current thread ID %d not found in virtual thread list."
+msgstr "Aktuální vlákno ID %d nenalezeno v seznamu virtuálních vláken."
+
Index: /tags/1.1.0/Packages/Common/Languages/UThreading.po
===================================================================
--- /tags/1.1.0/Packages/Common/Languages/UThreading.po	(revision 137)
+++ /tags/1.1.0/Packages/Common/Languages/UThreading.po	(revision 137)
@@ -0,0 +1,7 @@
+msgid ""
+msgstr "Content-Type: text/plain; charset=UTF-8"
+
+#: uthreading.scurrentthreadnotfound
+msgid "Current thread ID %d not found in virtual thread list."
+msgstr "Content-Type: text/plain; charset=UTF-8Content-Type: text/plain; charset=UTF-8Content-Type: text/plain; charset=UTF-8Content-Type: text/plain; charset=UTF-8Content-Type: text/plain; charset=UTF-8Content-Type: text/plain; charset=UTF-8Content-Type: text/plain; charset=UTF-8Content-Type: text/plain; charset=UTF-8Content-Type: text/plain; charset=UTF-8Content-Type: text/plain; charset=UTF-8Content-Type: text/plain; charset=UTF-8Content-Type: text/plain; charset=UTF-8Content-Type: text/plain; charset=UTF-8Content-Type: text/plain; charset=UTF-8Content-Type: text/plain; charset=UTF-8Content-Type: text/plain; charset=UTF-8"
+
Index: /tags/1.1.0/Packages/Common/StopWatch.pas
===================================================================
--- /tags/1.1.0/Packages/Common/StopWatch.pas	(revision 137)
+++ /tags/1.1.0/Packages/Common/StopWatch.pas	(revision 137)
@@ -0,0 +1,93 @@
+// Taken from http://delphi.about.com/od/windowsshellapi/a/delphi-high-performance-timer-tstopwatch.htm 
+unit StopWatch;
+
+interface
+
+uses
+  {$IFDEF Windows}Windows,{$ENDIF}
+  SysUtils, DateUtils;
+
+type
+  TLargeInteger = Int64;
+
+  TStopWatch = class
+  private
+    fFrequency : TLargeInteger;
+    fIsRunning: Boolean;
+    fIsHighResolution: Boolean;
+    fStartCount, fStopCount : TLargeInteger;
+    procedure SetTickStamp(var lInt : TLargeInteger) ;
+    function GetElapsedTicks: TLargeInteger;
+    function GetElapsedMiliseconds: TLargeInteger;
+    function GetElapsed: string;
+  public
+    constructor Create(const startOnCreate : Boolean = False) ;
+    procedure Start;
+    procedure Stop;
+    property IsHighResolution : Boolean read fIsHighResolution;
+    property ElapsedTicks : TLargeInteger read GetElapsedTicks;
+    property ElapsedMiliseconds : TLargeInteger read GetElapsedMiliseconds;
+    property Elapsed : string read GetElapsed;
+    property IsRunning : Boolean read fIsRunning;
+  end;
+
+implementation
+
+constructor TStopWatch.Create(const startOnCreate : boolean = false) ;
+begin
+  inherited Create;
+
+  fIsRunning := False;
+
+  {$IFDEF Windows}
+  fIsHighResolution := QueryPerformanceFrequency(fFrequency) ;
+  {$ELSE}
+  fIsHighResolution := False;
+  {$ENDIF}
+  if NOT fIsHighResolution then fFrequency := MSecsPerSec;
+
+  if StartOnCreate then Start;
+end;
+
+function TStopWatch.GetElapsedTicks: TLargeInteger;
+begin
+  Result := fStopCount - fStartCount;
+end;
+
+procedure TStopWatch.SetTickStamp(var lInt : TLargeInteger) ;
+begin
+  if fIsHighResolution then
+    {$IFDEF Windows}
+    QueryPerformanceCounter(lInt)
+    {$ELSE}
+    {$ENDIF}
+  else
+    lInt := MilliSecondOf(Now) ;
+end;
+
+function TStopWatch.GetElapsed: string;
+var
+  dt: TDateTime;
+begin
+  dt := ElapsedMiliseconds / MSecsPerSec / SecsPerDay;
+  result := Format('%d days, %s', [Trunc(dt), FormatDateTime('hh:nn:ss.z', Frac(dt))]) ;
+end;
+
+function TStopWatch.GetElapsedMiliseconds: TLargeInteger;
+begin
+  Result := (MSecsPerSec * (fStopCount - fStartCount)) div fFrequency;
+end;
+
+procedure TStopWatch.Start;
+begin
+  SetTickStamp(fStartCount);
+  fIsRunning := True;
+end;
+
+procedure TStopWatch.Stop;
+begin
+  SetTickStamp(fStopCount);
+  fIsRunning := False;
+end;
+
+end.
Index: /tags/1.1.0/Packages/Common/UApplicationInfo.pas
===================================================================
--- /tags/1.1.0/Packages/Common/UApplicationInfo.pas	(revision 137)
+++ /tags/1.1.0/Packages/Common/UApplicationInfo.pas	(revision 137)
@@ -0,0 +1,81 @@
+unit UApplicationInfo;
+
+{$mode delphi}
+
+interface
+
+uses
+  SysUtils, Registry, Classes, Forms, URegistry;
+
+type
+
+  { TApplicationInfo }
+
+  TApplicationInfo = class(TComponent)
+  private
+    FIdentification: Byte;
+    FLicense: string;
+    FVersionMajor: Byte;
+    FVersionMinor: Byte;
+    FVersionBugFix: Byte;
+    FVersionSuffix: string; // alfa, beta, RC1, RC2, ...
+    FCompanyName: string;
+    FCompanyHomePage: string;
+    FHomePage: string;
+    FAuthorsName: string;
+    FEmailContact: string;
+    FAppName: string;
+    FReleaseDate: TDateTime;
+    FRegistryKey: string;
+    FRegistryRoot: TRegistryRoot;
+    function GetVersion: string;
+  public
+    constructor Create(AOwner: TComponent); override;
+    property Version: string read GetVersion;
+  published
+    property Identification: Byte read FIdentification write FIdentification;
+    property VersionMajor: Byte read FVersionMajor write FVersionMajor;
+    property VersionMinor: Byte read FVersionMinor write FVersionMinor;
+    property VersionBugFix: Byte read FVersionBugFix write FVersionBugFix;
+    property VersionSuffix: string read FVersionSuffix write FVersionSuffix;
+    property CompanyName: string read FCompanyName write FCompanyName;
+    property CompanyHomePage: string read FCompanyHomePage write FCompanyHomePage;
+    property HomePage: string read FHomePage write FHomePage;
+    property AuthorsName: string read FAuthorsName write FAuthorsName;
+    property EmailContact: string read FEmailContact write FEmailContact;
+    property AppName: string read FAppName write FAppName;
+    property ReleaseDate: TDateTime read FReleaseDate write FReleaseDate;
+    property RegistryKey: string read FRegistryKey write FRegistryKey;
+    property RegistryRoot: TRegistryRoot read FRegistryRoot write FRegistryRoot;
+    property License: string read FLicense write FLicense;
+  end;
+
+procedure Register;
+
+implementation
+                        
+procedure Register;
+begin
+  RegisterComponents('Common', [TApplicationInfo]);
+end;
+
+{ TApplicationInfo }
+
+function TApplicationInfo.GetVersion: string;
+begin
+  Result := IntToStr(FVersionMajor) + '.' + IntToStr(FVersionMinor);
+  if FVersionSuffix <> '' then Result := Result + ' ' + FVersionSuffix
+    else Result := Result + '.' + IntToStr(FVersionBugFix);
+end;
+
+constructor TApplicationInfo.Create(AOwner: TComponent);
+begin
+  inherited Create(AOwner);
+  FVersionMajor := 1;
+  FIdentification := 1;
+  FAppName := Application.Name;
+  FRegistryKey := '\Software\' + FAppName;
+  FRegistryRoot := rrKeyCurrentUser;
+end;
+
+end.
Index: /tags/1.1.0/Packages/Common/UCommon.pas
===================================================================
--- /tags/1.1.0/Packages/Common/UCommon.pas	(revision 137)
+++ /tags/1.1.0/Packages/Common/UCommon.pas	(revision 137)
@@ -0,0 +1,505 @@
+unit UCommon;
+
+{$mode delphi}
+
+interface
+
+uses
+  {$ifdef Windows}Windows,{$endif}
+  {$ifdef Linux}baseunix,{$endif}
+  Classes, SysUtils, StrUtils, Dialogs, Process, LCLIntf,
+  FileUtil; //, ShFolder, ShellAPI;
+
+type
+  TArrayOfByte = array of Byte;
+  TArrayOfString = array of string;
+  TExceptionEvent = procedure(Sender: TObject; E: Exception) of object;
+
+  TUserNameFormat = (
+    unfNameUnknown = 0, // Unknown name type.
+    unfNameFullyQualifiedDN = 1,  // Fully qualified distinguished name
+    unfNameSamCompatible = 2, // Windows NT® 4.0 account name
+    unfNameDisplay = 3,  // A "friendly" display name
+    unfNameUniqueId = 6, // GUID string that the IIDFromString function returns
+    unfNameCanonical = 7,  // Complete canonical name
+    unfNameUserPrincipal = 8, // User principal name
+    unfNameCanonicalEx = 9,
+    unfNameServicePrincipal = 10,  // Generalized service principal name
+    unfDNSDomainName = 11);
+
+var
+  ExceptionHandler: TExceptionEvent;
+  DLLHandle1: HModule;
+
+{$IFDEF Windows}
+  GetUserNameEx: procedure (NameFormat: DWORD;
+    lpNameBuffer: LPSTR; nSize: PULONG); stdcall;
+{$ENDIF}
+
+function IntToBin(Data: Int64; Count: Byte): string;
+function BinToInt(BinStr: string): Int64;
+function TryHexToInt(Data: string; var Value: Integer): Boolean;
+function TryBinToInt(Data: string; var Value: Integer): Boolean;
+function BinToHexString(Source: AnsiString): string;
+//function DelTree(DirName : string): Boolean;
+//function GetSpecialFolderPath(Folder: Integer): string;
+function BCDToInt(Value: Byte): Byte;
+function CompareByteArray(Data1, Data2: TArrayOfByte): Boolean;
+function GetUserName: string;
+function LoggedOnUserNameEx(Format: TUserNameFormat): string;
+function SplitString(var Text: string; Count: Word): string;
+function GetBitCount(Variable: QWord; MaxIndex: Integer): Integer;
+function GetBit(Variable: QWord; Index: Byte): Boolean;
+procedure SetBit(var Variable: Int64; Index: Byte; State: Boolean); overload;
+procedure SetBit(var Variable: QWord; Index: Byte; State: Boolean); overload;
+procedure SetBit(var Variable: Cardinal; Index: Byte; State: Boolean); overload;
+procedure SetBit(var Variable: Word; Index: Byte; State: Boolean); overload;
+function AddLeadingZeroes(const aNumber, Length : integer) : string;
+function LastPos(const SubStr: String; const S: String): Integer;
+function GenerateNewName(OldName: string): string;
+function GetFileFilterItemExt(Filter: string; Index: Integer): string;
+procedure FileDialogUpdateFilterFileType(FileDialog: TOpenDialog);
+procedure DeleteFiles(APath, AFileSpec: string);
+procedure OpenWebPage(URL: string);
+procedure OpenFileInShell(FileName: string);
+procedure ExecuteProgram(CommandLine: string);
+procedure FreeThenNil(var Obj);
+function RemoveQuotes(Text: string): string;
+function ComputerName: string;
+function OccurenceOfChar(What: Char; Where: string): Integer;
+function GetDirCount(Dir: string): Integer;
+function MergeArray(A, B: array of string): TArrayOfString;
+
+
+implementation
+
+function BinToInt(BinStr : string) : Int64;
+var
+  i : byte;
+  RetVar : Int64;
+begin
+  BinStr := UpperCase(BinStr);
+  if BinStr[length(BinStr)] = 'B' then Delete(BinStr,length(BinStr),1);
+  RetVar := 0;
+  for i := 1 to length(BinStr) do begin
+    if not (BinStr[i] in ['0','1']) then begin
+      RetVar := 0;
+      Break;
+    end;
+    RetVar := (RetVar shl 1) + (byte(BinStr[i]) and 1) ;
+  end;
+
+  Result := RetVar;
+end;
+
+function BinToHexString(Source: AnsiString): string;
+var
+  I: Integer;
+begin
+  for I := 1 to Length(Source) do begin
+    Result := Result + LowerCase(IntToHex(Ord(Source[I]), 2));
+  end;
+end;
+
+
+procedure DeleteFiles(APath, AFileSpec: string);
+var
+  SearchRec: TSearchRec;
+  Find: Integer;
+  Path: string;
+begin
+  Path := IncludeTrailingPathDelimiter(APath);
+
+  Find := FindFirst(UTF8Decode(Path + AFileSpec), faAnyFile xor faDirectory, SearchRec);
+  while Find = 0 do begin
+    DeleteFile(Path + UTF8Encode(SearchRec.Name));
+
+    Find := SysUtils.FindNext(SearchRec);
+  end;
+  FindClose(SearchRec);
+end;
+
+
+function GetFileFilterItemExt(Filter: string; Index: Integer): string;
+var
+  List: TStringList;
+begin
+  try
+    List := TStringList.Create;
+    List.Text := StringReplace(Filter, '|', #10, [rfReplaceAll]);
+    Result := List[Index * 2 + 1];
+  finally
+    List.Free;
+  end;
+end;
+
+procedure FileDialogUpdateFilterFileType(FileDialog: TOpenDialog);
+var
+  FileExt: string;
+begin
+  FileExt := GetFileFilterItemExt(FileDialog.Filter, FileDialog.FilterIndex - 1);
+  Delete(FileExt, 1, 1); // Remove symbol '*'
+  if FileExt <> '.*' then
+    FileDialog.FileName := ChangeFileExt(FileDialog.FileName, FileExt)
+end;
+
+function GenerateNewName(OldName: string): string;
+var
+  I: Integer;
+  Number: Integer;
+begin
+  Number := 1;
+  // Find number on end
+  if Length(OldName) > 0 then begin
+    I := Length(OldName);
+    while (I > 1) and ((OldName[I] >= '0') and (OldName[I] <= '9')) do Dec(I);
+    TryStrToInt(Copy(OldName, I + 1, Length(OldName) - I), Number);
+    Inc(Number)
+  end;
+  Result := Copy(OldName, 1, I) + IntToStr(Number);
+end;
+
+(*function DelTree(DirName : string): Boolean;
+var
+  SHFileOpStruct : TSHFileOpStruct;
+  DirBuf : array [0..255] of char;
+begin
+  DirName := UTF8Decode(DirName);
+  try
+    Fillchar(SHFileOpStruct,Sizeof(SHFileOpStruct),0) ;
+    FillChar(DirBuf, Sizeof(DirBuf), 0 ) ;
+    StrPCopy(DirBuf, DirName) ;
+    with SHFileOpStruct do begin
+      Wnd := 0;
+      pFrom := @DirBuf;
+      wFunc := FO_DELETE;
+      fFlags := FOF_ALLOWUNDO;
+      fFlags := fFlags or FOF_NOCONFIRMATION;
+      fFlags := fFlags or FOF_SILENT;
+    end;
+    Result := (SHFileOperation(SHFileOpStruct) = 0) ;
+  except
+     Result := False;
+  end;
+end;*)
+
+function LastPos(const SubStr: String; const S: String): Integer;
+begin
+  Result := Pos(ReverseString(SubStr), ReverseString(S));
+  if (Result <> 0) then
+    Result := ((Length(S) - Length(SubStr)) + 1) - Result + 1;
+end;
+
+function BCDToInt(Value: Byte): Byte;
+begin
+  Result := (Value shr 4) * 10 + (Value and 15);
+end;
+
+(*function GetSpecialFolderPath(Folder: Integer): string;
+const
+  SHGFP_TYPE_CURRENT = 0;
+var
+  Path: array[0..MAX_PATH] of Char;
+begin
+  Result := 'C:\Test';
+  if SUCCEEDED(SHGetFolderPath(0, Folder, 0, SHGFP_TYPE_CURRENT, @path[0])) then
+    Result := path
+  else
+    Result := '';
+end;*)
+
+function IntToBin(Data: Int64; Count: Byte): string;
+var
+  I: Integer;
+begin
+  Result := '';
+  for I := 0 to Count - 1 do
+    Result := IntToStr((Data shr I) and 1) + Result;
+end;
+
+function IntToHex(Data: Cardinal; Count: Byte): string;
+const
+  Chars: array[0..15] of Char = '0123456789ABCDEF';
+var
+  I: Integer;
+begin
+  Result := '';
+  for I := 0 to Count - 1 do
+    Result := Result + Chars[(Data shr (I * 4)) and 15];
+end;
+
+function TryHexToInt(Data: string; var Value: Integer): Boolean;
+var
+  I: Integer;
+begin
+  Data := UpperCase(Data);
+  Result := True;
+  Value := 0;
+  for I := 0 to Length(Data) - 1 do begin
+    if (Data[I + 1] >= '0') and (Data[I + 1] <= '9') then
+      Value := Value or (Ord(Data[I + 1]) - Ord('0')) shl ((Length(Data) - I - 1) * 4)
+    else if (Data[I + 1] >= 'A') and (Data[I + 1] <= 'F') then
+      Value := Value or (Ord(Data[I + 1]) - Ord('A') + 10) shl ((Length(Data) - I - 1) * 4)
+    else Result := False;
+  end;
+end;
+
+function TryBinToInt(Data: string; var Value: Integer): Boolean;
+var
+  I: Integer;
+begin
+  Result := True;
+  Value := 0;
+  for I := 0 to Length(Data) - 1 do begin
+    if (Data[I + 1] >= '0') and (Data[I + 1] <= '1') then
+      Value := Value or (Ord(Data[I + 1]) - Ord('0')) shl ((Length(Data) - I - 1))
+    else Result := False;
+  end;
+end;
+
+function CompareByteArray(Data1, Data2: TArrayOfByte): Boolean;
+var
+  I: Integer;
+begin
+  if Length(Data1) = Length(Data2) then begin
+    Result := True;
+    for I := 0 to Length(Data1) - 1 do begin
+      if Data1[I] <> Data2[I] then begin
+        Result := False;
+        Break;
+      end
+    end;
+  end else Result := False;
+end;
+
+function Explode(Separator: char; Data: string): TArrayOfString;
+begin
+  SetLength(Result, 0);
+  while Pos(Separator, Data) > 0 do begin
+    SetLength(Result, Length(Result) + 1);
+    Result[High(Result)] := Copy(Data, 1, Pos(Separator, Data) - 1);
+    Delete(Data, 1, Pos(Separator, Data));
+  end;
+  SetLength(Result, Length(Result) + 1);
+  Result[High(Result)] := Data;
+end;
+
+{$IFDEF Windows}
+function GetUserName: string;
+const
+  MAX_USERNAME_LENGTH = 256;
+var
+  L: LongWord;
+begin
+  L := MAX_USERNAME_LENGTH + 2;
+  SetLength(Result, L);
+  if Windows.GetUserName(PChar(Result), L) and (L > 0) then begin
+    SetLength(Result, StrLen(PChar(Result)));
+    Result := UTF8Encode(Result);
+  end else Result := '';
+end;
+
+function GetVersionInfo: TOSVersionInfo;
+begin
+  Result.dwOSVersionInfoSize := SizeOf(Result);
+  if GetVersionEx(Result) then begin
+  end;
+end;
+{$endif}
+
+function ComputerName: string;
+{$ifdef mswindows}
+const
+ INFO_BUFFER_SIZE = 32767;
+var
+  Buffer : array[0..INFO_BUFFER_SIZE] of WideChar;
+  Ret : DWORD;
+begin
+  Ret := INFO_BUFFER_SIZE;
+  If (GetComputerNameW(@Buffer[0],Ret)) then begin
+    Result := UTF8Encode(WideString(Buffer));
+  end
+  else begin
+    Result := 'ERROR_NO_COMPUTERNAME_RETURNED';
+  end;
+end;
+{$endif}
+{$ifdef unix}
+var
+  Name: UtsName;
+begin
+  fpuname(Name);
+  Result := Name.Nodename;
+end;
+{$endif}
+
+{$ifdef windows}
+function LoggedOnUserNameEx(Format: TUserNameFormat): string;
+const
+  MaxLength = 1000;
+var
+  UserName: array[0..MaxLength] of Char;
+  VersionInfo: TOSVersionInfo;
+  Size: DWORD;
+begin
+  VersionInfo := GetVersionInfo;
+  if VersionInfo.dwPlatformId = VER_PLATFORM_WIN32_NT then begin
+    Size := MaxLength;
+    GetUserNameEx(Integer(Format), @UserName, @Size);
+    //ShowMessage(SysErrorMessage(GetLastError));
+    if GetLastError = 0 then Result := UTF8Encode(UserName)
+      else Result := GetUserName;
+  end else Result := GetUserName;
+end;
+{$ELSE}
+function GetUserName: string;
+begin
+  Result := '';
+end;
+
+function LoggedOnUserNameEx(Format: TUserNameFormat): string;
+begin
+  Result := '';
+end;
+
+{$ENDIF}
+
+function SplitString(var Text: string; Count: Word): string;
+begin
+  Result := Copy(Text, 1, Count);
+  Delete(Text, 1, Count);
+end;
+
+function GetBitCount(Variable: QWord; MaxIndex: Integer): Integer;
+var
+  I: Integer;
+begin
+  Result := 0;
+  for I := 0 to MaxIndex - 1 do
+    if ((Variable shr I) and 1) = 1 then Inc(Result);
+end;
+
+function GetBit(Variable:QWord;Index:Byte):Boolean;
+begin
+  Result := ((Variable shr Index) and 1) = 1;
+end;
+
+procedure SetBit(var Variable: Int64; Index: Byte; State: Boolean);
+begin
+  Variable := (Variable and ((1 shl Index) xor High(QWord))) or (Int64(State) shl Index);
+end;
+
+procedure SetBit(var Variable:QWord;Index:Byte;State:Boolean); overload;
+begin
+  Variable := (Variable and ((1 shl Index) xor High(QWord))) or (QWord(State) shl Index);
+end;
+
+procedure SetBit(var Variable:Cardinal;Index:Byte;State:Boolean); overload;
+begin
+  Variable := (Variable and ((1 shl Index) xor High(Cardinal))) or (Cardinal(State) shl Index);
+end;
+
+procedure SetBit(var Variable:Word;Index:Byte;State:Boolean); overload;
+begin
+  Variable := (Variable and ((1 shl Index) xor High(Word))) or (Word(State) shl Index);
+end;
+
+function AddLeadingZeroes(const aNumber, Length : integer) : string;
+begin
+  Result := SysUtils.Format('%.*d', [Length, aNumber]) ;
+end;
+
+procedure LoadLibraries;
+begin
+  {$IFDEF Windows}
+  DLLHandle1 := LoadLibrary('secur32.dll');
+  if DLLHandle1 <> 0 then
+  begin
+    @GetUserNameEx := GetProcAddress(DLLHandle1, 'GetUserNameExA');
+  end;
+  {$ENDIF}
+end;
+
+procedure FreeLibraries;
+begin
+  {$IFDEF Windows}
+  if DLLHandle1 <> 0 then FreeLibrary(DLLHandle1);
+  {$ENDIF}
+end;
+
+procedure ExecuteProgram(CommandLine: string);
+var
+  Process: TProcess;
+begin
+  try
+    Process := TProcess.Create(nil);
+    Process.CommandLine := CommandLine;
+    Process.Options := [poNoConsole];
+    Process.Execute;
+  finally
+    Process.Free;
+  end;
+end;
+
+procedure FreeThenNil(var Obj);
+begin
+  TObject(Obj).Free;
+  TObject(Obj) := nil;
+end;
+
+procedure OpenWebPage(URL: string);
+begin
+  OpenURL(URL);
+end;
+
+procedure OpenFileInShell(FileName: string);
+begin
+  ExecuteProgram('cmd.exe /c start "' + FileName + '"');
+end;
+
+function RemoveQuotes(Text: string): string;
+begin
+  Result := Text;
+  if (Pos('"', Text) = 1) and (Text[Length(Text)] = '"') then
+    Result := Copy(Text, 2, Length(Text) - 2);
+end;
+
+function OccurenceOfChar(What: Char; Where: string): Integer;
+var
+  I: Integer;
+begin
+  Result := 0;
+  for I := 1 to Length(Where) do
+    if Where[I] = What then Inc(Result);
+end;
+
+function GetDirCount(Dir: string): Integer;
+begin
+  Result := OccurenceOfChar(DirectorySeparator, Dir);
+  if Copy(Dir, Length(Dir), 1) = DirectorySeparator then
+    Dec(Result);
+end;
+
+function MergeArray(A, B: array of string): TArrayOfString;
+var
+  I: Integer;
+begin
+  SetLength(Result, Length(A) + Length(B));
+  for I := 0 to Length(A) - 1 do
+    Result[I] := A[I];
+  for I := 0 to Length(B) - 1 do
+    Result[Length(A) + I] := B[I];
+end;
+
+
+
+initialization
+
+LoadLibraries;
+
+
+finalization
+
+FreeLibraries;
+
+end.
Index: /tags/1.1.0/Packages/Common/UDebugLog.pas
===================================================================
--- /tags/1.1.0/Packages/Common/UDebugLog.pas	(revision 137)
+++ /tags/1.1.0/Packages/Common/UDebugLog.pas	(revision 137)
@@ -0,0 +1,134 @@
+unit UDebugLog; 
+
+{$mode delphi}
+
+interface
+
+uses
+  Classes, SysUtils, FileUtil, SpecializedList, SyncObjs;
+
+type
+  TDebugLogAddEvent = procedure (Group: string; Text: string) of object;
+
+  TDebugLogItem = class
+    Time: TDateTime;
+    Group: string;
+    Text: string;
+  end;
+
+  TNewItemEvent = procedure (NewItem: TDebugLogItem) of object;
+
+  { TDebugLog }
+
+  TDebugLog = class(TComponent)
+  private
+    FFileName: string;
+    FMaxCount: Integer;
+    FOnNewItem: TNewItemEvent;
+    FWriteToFileEnable: Boolean;
+    procedure SetMaxCount(const AValue: Integer);
+  public
+    Items: TListObject;
+    Lock: TCriticalSection;
+    procedure Add(Text: string; Group: string = '');
+    procedure WriteToFile(Text: string);
+    constructor Create(AOwner: TComponent); override;
+    destructor Destroy; override;
+  published
+    property WriteToFileEnable: Boolean read FWriteToFileEnable
+      write FWriteToFileEnable;
+    property FileName: string read FFileName write FFileName;
+    property MaxCount: Integer read FMaxCount write SetMaxCount;
+    property OnNewItem: TNewItemEvent read FOnNewItem write FOnNewItem;
+  end;
+
+procedure Register;
+
+implementation
+
+resourcestring
+  SFileNameNotDefined = 'Filename not defined';
+
+procedure Register;
+begin
+  RegisterComponents('Common', [TDebugLog]);
+end;
+
+{ TDebugLog }
+
+procedure TDebugLog.SetMaxCount(const AValue: Integer);
+begin
+  if FMaxCount = AValue then Exit;
+  FMaxCount := AValue;
+  try
+    Lock.Acquire;
+    if Items.Count > FMaxCount then Items.Count := AValue;
+  finally
+    Lock.Release;
+  end;
+end;
+
+procedure TDebugLog.Add(Text: string; Group: string = '');
+var
+  NewItem: TDebugLogItem;
+begin
+  NewItem := TDebugLogItem.Create;
+  NewItem.Time := Now;
+  NewItem.Group := Group;
+  NewItem.Text := Text;
+
+  try
+    Lock.Acquire;
+    Items.Insert(0, NewItem);
+    if Items.Count > MaxCount then begin
+      Items.Delete(Items.Count - 1);
+    end;
+
+    if WriteToFileEnable then begin
+      if Group <> '' then Group := Group + '[' + Group + '] ';
+      WriteToFile(Group + Text);
+    end;
+  finally
+    Lock.Release;
+  end;
+  if Assigned(FOnNewItem) then
+    FOnNewItem(NewItem);
+end;
+
+procedure TDebugLog.WriteToFile(Text: string);
+var
+  LogFile: TFileStream;
+begin
+  if FileName = '' then raise Exception.Create(SFileNameNotDefined);
+  try
+    if ExtractFileDir(FileName) <> '' then
+      ForceDirectories(ExtractFileDir(FileName));
+    if FileExists(FileName) then LogFile := TFileStream.Create(UTF8Decode(FileName), fmOpenWrite)
+      else LogFile := TFileStream.Create(UTF8Decode(FileName), fmCreate);
+    LogFile.Seek(0, soFromEnd);
+    Text := FormatDateTime('hh:nn:ss.zzz', Now) + ': ' + Text + LineEnding;
+    LogFile.WriteBuffer(Text[1], Length(Text));
+  finally
+    FreeAndNil(LogFile);
+  end;
+end;
+
+constructor TDebugLog.Create(AOwner: TComponent);
+begin
+  inherited;
+  Items := TListObject.Create;
+  Lock := TCriticalSection.Create;
+  MaxCount := 100;
+  FileName := 'DebugLog.txt';
+  WriteToFileEnable := False;
+end;
+
+destructor TDebugLog.Destroy;
+begin
+  Items.Free;
+  Lock.Free;
+  inherited;
+end;
+
+end.
+
Index: /tags/1.1.0/Packages/Common/UDelay.pas
===================================================================
--- /tags/1.1.0/Packages/Common/UDelay.pas	(revision 137)
+++ /tags/1.1.0/Packages/Common/UDelay.pas	(revision 137)
@@ -0,0 +1,75 @@
+unit UDelay;
+
+{$mode delphi}
+
+interface
+
+uses
+  Classes, SysUtils, DateUtils;
+
+type
+  { TDelay }
+
+  TDelay = class
+  private
+    FEnabled: Boolean;
+    function GetEnabled:Boolean;
+    function GetOwerflowed:Boolean;
+    function GetRunning: Boolean;
+    procedure SetEnabled(const AValue: Boolean);
+  public
+    StartTime: TDateTime;
+    Duration: Integer; // ms
+    procedure Start;
+    procedure Stop;
+    constructor Create;
+    property Overflowed: Boolean read GetOwerflowed;
+    property Running: Boolean read GetRunning;
+    property Enabled: Boolean read GetEnabled write SetEnabled;
+  end;
+
+
+implementation
+
+{ TDelay }
+
+function TDelay.GetEnabled: Boolean;
+begin
+  Result := FEnabled;
+end;
+
+function TDelay.GetOwerflowed: Boolean;
+begin
+  Result := ((Now - StartTime) > (Duration * OneMillisecond)) and FEnabled;
+end;
+
+function TDelay.GetRunning: Boolean;
+begin
+  Result := ((Now - StartTime) <= (Duration * OneMillisecond)) and FEnabled;
+end;
+
+procedure TDelay.SetEnabled(const AValue:Boolean);
+begin
+  FEnabled := True;
+end;
+
+procedure TDelay.Start;
+begin
+  StartTime := Now;
+  FEnabled := True;
+end;
+
+procedure TDelay.Stop;
+begin
+  FEnabled := False;
+end;
+
+constructor TDelay.Create;
+begin
+  Duration := 1000;
+  StartTime := 0;
+  FEnabled := False;
+end;
+
+end.
+
Index: /tags/1.1.0/Packages/Common/UFindFile.pas
===================================================================
--- /tags/1.1.0/Packages/Common/UFindFile.pas	(revision 137)
+++ /tags/1.1.0/Packages/Common/UFindFile.pas	(revision 137)
@@ -0,0 +1,150 @@
+{TFindFile
+
+Article:
+http://delphi.about.com/library/weekly/aa052300a.htm
+
+Tired of using FindFirst, Next and Close?
+Come see how to encapsulate all those functions
+in a single "find-files-recursively" component.
+It's easy to use, free and with code.
+
+
+********************************************
+Zarko Gajic
+About.com Guide to Delphi Programming
+http://delphi.about.com
+email: delphi.guide@about.com
+********************************************
+
+}
+
+unit UFindFile;
+
+interface
+
+uses
+  SysUtils, Classes, Graphics, Controls, Forms, Dialogs, FileCtrl;
+
+type
+  EDirNotFound = class(Exception);
+
+  TFileAttrKind = (ffaReadOnly, ffaHidden, ffaSysFile, ffaVolumeID, ffaDirectory, ffaArchive, ffaAnyFile);
+  TFileAttrib = set of TFileAttrKind;
+
+  TFindFile = class(TComponent)
+  private
+    s : TStringList;
+
+    fSubFolder : boolean;
+    fAttr: TFileAttrib;
+    fPath : string;
+    fFileMask : string;
+
+    procedure SetPath(Value: string);
+    procedure FileSearch(const inPath : string);
+  public
+    constructor Create(AOwner: TComponent); override;
+    destructor Destroy; override;
+
+    function SearchForFiles: TStringList;
+  published
+    property FileAttr: TFileAttrib read fAttr write fAttr;
+    property InSubFolders : boolean read fSubFolder write fSubFolder;
+    property Path : string read fPath write SetPath;
+    property FileMask : string read fFileMask write fFileMask ;
+  end;
+
+const
+{$IFDEF WINDOWS}
+  FilterAll = '*.*';
+{$ENDIF}
+{$IFDEF LINUX}
+  FilterAll = '*';
+{$ENDIF}
+
+procedure Register;
+
+implementation
+
+resourcestring
+  SDirNotFound = 'Directory not found';
+
+procedure Register;
+begin
+  RegisterComponents('Common', [TFindFile]);
+end;
+
+constructor TFindFile.Create(AOwner: TComponent);
+begin
+  inherited Create(AOwner);
+  Path := IncludeTrailingBackslash(UTF8Encode(GetCurrentDir));
+  FileMask := FilterAll;
+  FileAttr := [ffaAnyFile];
+  s := TStringList.Create;
+end;
+
+destructor TFindFile.Destroy;
+begin
+  s.Free;
+  inherited Destroy;
+end;
+
+procedure TFindFile.SetPath(Value: string);
+begin
+  if fPath <> Value then
+  begin
+    if Value <> '' then
+      if DirectoryExists(UTF8Decode(Value)) then
+        fPath := IncludeTrailingBackslash(Value)
+        else raise EDirNotFound.Create(SDirNotFound);
+  end;
+end;
+
+function TFindFile.SearchForFiles: TStringList;
+begin
+  s.Clear;
+  try
+    FileSearch(Path);
+  finally
+    Result := s;
+  end;
+end;
+
+procedure TFindFile.FileSearch(const InPath : string);
+var Rec  : TSearchRec;
+    Attr : integer;
+begin
+  Attr := 0;
+  if ffaReadOnly in FileAttr then Attr := Attr + faReadOnly;
+  if ffaHidden in FileAttr then Attr := Attr + faHidden;
+  if ffaSysFile in FileAttr then Attr := Attr + faSysFile;
+  if ffaVolumeID in FileAttr then Attr := Attr + faVolumeID;
+  if ffaDirectory in FileAttr then Attr := Attr + faDirectory;
+  if ffaArchive in FileAttr then Attr := Attr + faArchive;
+  if ffaAnyFile in FileAttr then Attr := Attr + faAnyFile;
+
+  if SysUtils.FindFirst(UTF8Decode(inPath + FileMask), Attr, Rec) = 0 then
+  try
+    repeat
+      s.Add(inPath + UTF8Encode(Rec.Name));
+    until SysUtils.FindNext(Rec) <> 0;
+  finally
+    SysUtils.FindClose(Rec);
+  end;
+
+  If not InSubFolders then Exit;
+
+  if SysUtils.FindFirst(UTF8Decode(inPath + FilterAll), faDirectory, Rec) = 0 then
+  try
+    repeat
+      if ((Rec.Attr and faDirectory) > 0) and (Rec.Name <> '.')
+      and (Rec.Name <> '..') then
+        FileSearch(IncludeTrailingBackslash(inPath + UTF8Encode(Rec.Name)));
+    until SysUtils.FindNext(Rec) <> 0;
+  finally
+    SysUtils.FindClose(Rec);
+  end;
+end; 
+
+end.
+
Index: /tags/1.1.0/Packages/Common/UJobProgressView.lfm
===================================================================
--- /tags/1.1.0/Packages/Common/UJobProgressView.lfm	(revision 137)
+++ /tags/1.1.0/Packages/Common/UJobProgressView.lfm	(revision 137)
@@ -0,0 +1,228 @@
+object FormJobProgressView: TFormJobProgressView
+  Left = 467
+  Height = 246
+  Top = 252
+  Width = 328
+  BorderIcons = [biSystemMenu]
+  ClientHeight = 246
+  ClientWidth = 328
+  Font.Height = -11
+  Font.Name = 'MS Sans Serif'
+  OnClose = FormClose
+  OnCloseQuery = FormCloseQuery
+  OnCreate = FormCreate
+  OnDestroy = FormDestroy
+  Position = poScreenCenter
+  LCLVersion = '1.6.0.4'
+  object PanelOperationsTitle: TPanel
+    Left = 0
+    Height = 24
+    Top = 0
+    Width = 328
+    Align = alTop
+    BevelOuter = bvNone
+    ClientHeight = 24
+    ClientWidth = 328
+    FullRepaint = False
+    TabOrder = 0
+    object LabelOperation: TLabel
+      Left = 8
+      Height = 13
+      Top = 8
+      Width = 66
+      Caption = 'Operations:'
+      Font.Height = -11
+      Font.Name = 'MS Sans Serif'
+      Font.Style = [fsBold]
+      ParentColor = False
+      ParentFont = False
+    end
+  end
+  object PanelLog: TPanel
+    Left = 0
+    Height = 122
+    Top = 124
+    Width = 328
+    Align = alClient
+    BevelOuter = bvSpace
+    ClientHeight = 122
+    ClientWidth = 328
+    TabOrder = 1
+    object MemoLog: TMemo
+      Left = 8
+      Height = 106
+      Top = 8
+      Width = 312
+      Anchors = [akTop, akLeft, akRight, akBottom]
+      ReadOnly = True
+      ScrollBars = ssAutoBoth
+      TabOrder = 0
+    end
+  end
+  object PanelProgress: TPanel
+    Left = 0
+    Height = 38
+    Top = 50
+    Width = 328
+    Align = alTop
+    BevelOuter = bvNone
+    ClientHeight = 38
+    ClientWidth = 328
+    TabOrder = 2
+    object ProgressBarPart: TProgressBar
+      Left = 8
+      Height = 17
+      Top = 16
+      Width = 312
+      Anchors = [akTop, akLeft, akRight]
+      TabOrder = 0
+    end
+    object LabelEstimatedTimePart: TLabel
+      Left = 8
+      Height = 13
+      Top = -2
+      Width = 71
+      Caption = 'Estimated time:'
+      ParentColor = False
+    end
+  end
+  object PanelOperations: TPanel
+    Left = 0
+    Height = 26
+    Top = 24
+    Width = 328
+    Align = alTop
+    BevelOuter = bvNone
+    ClientHeight = 26
+    ClientWidth = 328
+    FullRepaint = False
+    TabOrder = 3
+    object ListViewJobs: TListView
+      Left = 8
+      Height = 16
+      Top = 5
+      Width = 312
+      Anchors = [akTop, akLeft, akRight, akBottom]
+      AutoWidthLastColumn = True
+      BorderStyle = bsNone
+      Color = clBtnFace
+      Columns = <      
+        item
+          Width = 312
+        end>
+      OwnerData = True
+      ReadOnly = True
+      ShowColumnHeaders = False
+      SmallImages = ImageList1
+      TabOrder = 0
+      ViewStyle = vsReport
+      OnData = ListViewJobsData
+    end
+  end
+  object PanelProgressTotal: TPanel
+    Left = 0
+    Height = 36
+    Top = 88
+    Width = 328
+    Align = alTop
+    BevelOuter = bvNone
+    ClientHeight = 36
+    ClientWidth = 328
+    TabOrder = 4
+    object LabelEstimatedTimeTotal: TLabel
+      Left = 8
+      Height = 13
+      Top = 0
+      Width = 97
+      Caption = 'Total estimated time:'
+      ParentColor = False
+    end
+    object ProgressBarTotal: TProgressBar
+      Left = 8
+      Height = 16
+      Top = 16
+      Width = 312
+      Anchors = [akTop, akLeft, akRight]
+      TabOrder = 0
+    end
+  end
+  object ImageList1: TImageList
+    BkColor = clForeground
+    left = 200
+    top = 8
+    Bitmap = {
+      4C69020000001000000010000000FF00FF00FF00FF00FF00FF00FF00FF00FF00
+      FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00
+      FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00
+      FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00
+      FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00
+      FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00
+      FF00000000FF000000FFFF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00
+      FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF000000
+      00FF000000FF000000FFFF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00
+      FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00000000FF0000
+      00FF000000FF000000FFFF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00
+      FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00000000FF000000FF0000
+      00FF000000FFFF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00
+      FF00FF00FF00FF00FF00FF00FF00FF00FF00000000FF000000FF000000FF0000
+      00FFFF00FF00FF00FF00FF00FF00FF00FF00FF00FF00000000FFFF00FF00FF00
+      FF00FF00FF00FF00FF00FF00FF00000000FF000000FF000000FF000000FFFF00
+      FF00FF00FF00FF00FF00FF00FF00FF00FF00000000FF000000FF000000FFFF00
+      FF00FF00FF00FF00FF00000000FF000000FF000000FF000000FFFF00FF00FF00
+      FF00FF00FF00FF00FF00FF00FF00FF00FF00000000FF000000FF000000FF0000
+      00FFFF00FF00000000FF000000FF000000FF000000FFFF00FF00FF00FF00FF00
+      FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FFFF00FF00FF00FF00FF00FF00FF00
+      FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00000000FF0000
+      00FF000000FF000000FF000000FFFF00FF00FF00FF00FF00FF00FF00FF00FF00
+      FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF000000
+      00FF000000FF000000FFFF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00
+      FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00
+      FF00000000FFFF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00
+      FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00
+      FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00
+      FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00
+      FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00
+      FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00
+      FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00
+      FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00
+      FF00FF00FF00FF00FF00FF00FF00000000FFFF00FF00FF00FF00FF00FF00FF00
+      FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00
+      FF00FF00FF00FF00FF00FF00FF00000000FF000000FFFF00FF00FF00FF00FF00
+      FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00
+      FF00FF00FF00FF00FF00FF00FF00000000FF000084FF000000FFFF00FF00FF00
+      FF00FF00FF00FF00FF00FF00FF00FF00FF00000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF0000FFFF000084FF000000FFFF00
+      FF00FF00FF00FF00FF00FF00FF00FF00FF00000000FF0000FFFF0000FFFF0000
+      FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF000084FF0000
+      00FFFF00FF00FF00FF00FF00FF00FF00FF00000000FF0000FFFF0000FFFF0000
+      FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000
+      84FF000000FFFF00FF00FF00FF00FF00FF00000000FF0000FFFF0000FFFF0000
+      FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000
+      FFFF000084FF000000FFFF00FF00FF00FF00000000FF0000FFFF0000FFFF0000
+      FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000
+      84FF000000FFFF00FF00FF00FF00FF00FF00000000FF0000FFFF0000FFFF0000
+      FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF000084FF0000
+      00FFFF00FF00FF00FF00FF00FF00FF00FF00000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF0000FFFF000084FF000000FFFF00
+      FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00
+      FF00FF00FF00FF00FF00FF00FF00000000FF000084FF000000FFFF00FF00FF00
+      FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00
+      FF00FF00FF00FF00FF00FF00FF00000000FF000000FFFF00FF00FF00FF00FF00
+      FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00
+      FF00FF00FF00FF00FF00FF00FF00000000FFFF00FF00FF00FF00FF00FF00FF00
+      FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00
+      FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00
+      FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00
+      FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00
+      FF00FF00FF00FF00FF00FF00FF00
+    }
+  end
+  object TimerUpdate: TTimer
+    Enabled = False
+    Interval = 100
+    OnTimer = TimerUpdateTimer
+    left = 264
+    top = 8
+  end
+end
Index: /tags/1.1.0/Packages/Common/UJobProgressView.lrt
===================================================================
--- /tags/1.1.0/Packages/Common/UJobProgressView.lrt	(revision 137)
+++ /tags/1.1.0/Packages/Common/UJobProgressView.lrt	(revision 137)
@@ -0,0 +1,3 @@
+TFORMJOBPROGRESSVIEW.LABELOPERATION.CAPTION=Operations:
+TFORMJOBPROGRESSVIEW.LABELESTIMATEDTIMEPART.CAPTION=Estimated time:
+TFORMJOBPROGRESSVIEW.LABELESTIMATEDTIMETOTAL.CAPTION=Total estimated time:
Index: /tags/1.1.0/Packages/Common/UJobProgressView.pas
===================================================================
--- /tags/1.1.0/Packages/Common/UJobProgressView.pas	(revision 137)
+++ /tags/1.1.0/Packages/Common/UJobProgressView.pas	(revision 137)
@@ -0,0 +1,631 @@
+unit UJobProgressView;
+
+{$MODE Delphi}
+
+interface
+
+uses
+  SysUtils, Variants, Classes, Graphics, Controls, Forms, Syncobjs,
+  Dialogs, ComCtrls, StdCtrls, ExtCtrls, Contnrs, UThreading,
+  DateUtils;
+
+const
+  EstimatedTimeShowTreshold = 4;
+  EstimatedTimeShowTresholdTotal = 1;
+  MemoLogHeight = 200;
+  UpdateInterval = 100; // ms
+
+type
+
+  { TProgress }
+
+  TProgress = class
+  private
+    FLock: TCriticalSection;
+    FOnChange: TNotifyEvent;
+    FValue: Integer;
+    FMax: Integer;
+    procedure SetMax(const AValue: Integer);
+    procedure SetValue(const AValue: Integer);
+  public
+    procedure Increment;
+    procedure Reset;
+    constructor Create;
+    destructor Destroy; override;
+    property Value: Integer read FValue write SetValue;
+    property Max: Integer read FMax write SetMax;
+    property OnChange: TNotifyEvent read FOnChange write FOnChange;
+  end;
+
+  TFormJobProgressView = class;
+  TJobProgressView = class;
+  TJobThread = class;
+  TJob = class;
+
+  TJobProgressViewMethod = procedure(Job: TJob) of object;
+
+  { TJob }
+
+  TJob = class
+  private
+    FTerminate: Boolean;
+    procedure SetTerminate(const AValue: Boolean);
+  public
+    StartTime: TDateTime;
+    EndTime: TDateTime;
+    ProgressView: TJobProgressView;
+    Title: string;
+    Method: TJobProgressViewMethod;
+    NoThreaded: Boolean;
+    WaitFor: Boolean;
+    Progress: TProgress;
+    Thread: TJobThread;
+    ResultString: string;
+    Finished: Boolean;
+    procedure AddLogItem(Value: string);
+    constructor Create;
+    destructor Destroy; override;
+    property Terminate: Boolean read FTerminate write SetTerminate;
+  end;
+
+  TJobThread = class(TListedThread)
+    procedure Execute; override;
+  public
+    ProgressView: TJobProgressView;
+    Job: TJob;
+  end;
+
+  { TFormJobProgressView }
+
+  TFormJobProgressView = class(TForm)
+    ImageList1: TImageList;
+    Label2: TLabel;
+    LabelOperation: TLabel;
+    LabelEstimatedTimePart: TLabel;
+    LabelEstimatedTimeTotal: TLabel;
+    ListViewJobs: TListView;
+    MemoLog: TMemo;
+    PanelProgressTotal: TPanel;
+    PanelOperationsTitle: TPanel;
+    PanelLog: TPanel;
+    PanelOperations: TPanel;
+    PanelProgress: TPanel;
+    ProgressBarPart: TProgressBar;
+    ProgressBarTotal: TProgressBar;
+    TimerUpdate: TTimer;
+    procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
+    procedure FormDestroy(Sender: TObject);
+    procedure ListViewJobsData(Sender: TObject; Item: TListItem);
+    procedure TimerUpdateTimer(Sender: TObject);
+    procedure FormCreate(Sender: TObject);
+    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
+  public
+    JobProgressView: TJobProgressView;
+  end;
+
+  { TJobProgressView }
+
+  TJobProgressView = class(TComponent)
+  private
+    FAutoClose: Boolean;
+    Finished: Boolean;
+    FOnJobFinish: TJobProgressViewMethod;
+    FOnOwnerDraw: TNotifyEvent;
+    FOwnerDraw: Boolean;
+    FShowDelay: Integer;
+    FTerminate: Boolean;
+    FormList: TList;
+    TotalStartTime: TDateTime;
+    Log: TStringList;
+    procedure SetTerminate(const AValue: Boolean);
+    procedure UpdateProgress;
+    procedure ReloadJobList;
+    procedure StartJobs;
+    procedure UpdateHeight;
+    procedure JobProgressChange(Sender: TObject);
+  public
+    Form: TFormJobProgressView;
+    Jobs: TObjectList; // TListObject<TJob>
+    CurrentJob: TJob;
+    CurrentJobIndex: Integer;
+    constructor Create(TheOwner: TComponent); override;
+    destructor Destroy; override;
+    procedure Clear;
+    procedure AddJob(Title: string; Method: TJobProgressViewMethod;
+      NoThreaded: Boolean = False; WaitFor: Boolean = False);
+    procedure Start(AAutoClose: Boolean = True);
+    procedure Stop;
+    procedure TermSleep(Delay: Integer);
+    property Terminate: Boolean read FTerminate write SetTerminate;
+  published
+    property OwnerDraw: Boolean read FOwnerDraw write FOwnerDraw;
+    property ShowDelay: Integer read FShowDelay write FShowDelay;
+    property AutoClose: Boolean read FAutoClose write FAutoClose;
+    property OnJobFinish: TJobProgressViewMethod read FOnJobFinish
+      write FOnJobFinish;
+    property OnOwnerDraw: TNotifyEvent read FOnOwnerDraw
+      write FOnOwnerDraw;
+  end;
+
+  //var
+  //  FormJobProgressView: TFormJobProgressView;
+
+procedure Register;
+
+resourcestring
+  SExecuted = 'Executed';
+
+implementation
+
+{$R *.lfm}
+
+resourcestring
+  SPleaseWait = 'Please wait...';
+  STerminate = 'Termination';
+  SEstimatedTime = 'Estimated time: %s';
+  STotalEstimatedTime = 'Total estimated time: %s';
+  SFinished = 'Finished';
+  SOperations = 'Operations';
+
+procedure Register;
+begin
+  RegisterComponents('Common', [TJobProgressView]);
+end;
+
+procedure TJobThread.Execute;
+begin
+  try
+    try
+      //raise Exception.Create('Exception in job');
+      ProgressView.CurrentJob.Method(Job);
+    except
+      on E: Exception do begin
+        ProgressView.Terminate := True;
+        raise;
+      end;
+    end;
+  finally
+    Terminate;
+  end;
+end;
+
+procedure TJobProgressView.AddJob(Title: string; Method: TJobProgressViewMethod;
+  NoThreaded: Boolean = False; WaitFor: Boolean = False);
+var
+  NewJob: TJob;
+begin
+  NewJob := TJob.Create;
+  NewJob.ProgressView := Self;
+  NewJob.Title := Title;
+  NewJob.Method := Method;
+  NewJob.NoThreaded := NoThreaded;
+  NewJob.WaitFor := WaitFor;
+  NewJob.Progress.Max := 100;
+  NewJob.Progress.Reset;
+  NewJob.Progress.OnChange := JobProgressChange;
+  Jobs.Add(NewJob);
+  //ReloadJobList;
+end;
+
+procedure TJobProgressView.Start(AAutoClose: Boolean = True);
+begin
+  AutoClose := AAutoClose;
+  StartJobs;
+end;
+
+procedure TJobProgressView.StartJobs;
+var
+  I: Integer;
+begin
+  Terminate := False;
+
+  if not OwnerDraw then Form.BringToFront;
+
+  Finished := False;
+  Form.Caption := SPleaseWait;
+  try
+    FormList := Screen.DisableForms(Form);
+    Log.Clear;
+    Form.MemoLog.Clear;
+
+    Form.LabelEstimatedTimePart.Visible := False;
+    Form.LabelEstimatedTimeTotal.Visible := False;
+
+    CurrentJob := nil;
+    if ShowDelay = 0 then begin
+      Form.TimerUpdate.Interval := UpdateInterval;
+      Form.TimerUpdate.Enabled := True;
+      Form.TimerUpdateTimer(Self);
+    end else begin
+      Form.TimerUpdate.Interval := ShowDelay;
+      Form.TimerUpdate.Enabled := True;
+    end;
+
+    TotalStartTime := Now;
+    Form.ProgressBarTotal.Position := 0;
+    Form.ProgressBarTotal.Visible := False;
+    //UpdateHeight;
+
+    I := 0;
+    while I < Jobs.Count do
+    with TJob(Jobs[I]) do begin
+      CurrentJobIndex := I;
+      CurrentJob := TJob(Jobs[I]);
+      JobProgressChange(Self);
+      StartTime := Now;
+      Form.LabelEstimatedTimePart.Caption := Format(SEstimatedTime, ['']);
+      Form.ProgressBarPart.Position := 0;
+      Form.ProgressBarPart.Visible := False;
+      //Show;
+      ReloadJobList;
+      Application.ProcessMessages;
+      if NoThreaded then begin
+        Thread := nil;
+        Method(CurrentJob);
+      end else begin
+        try
+          Thread := TJobThread.Create(True);
+          with Thread do begin
+            FreeOnTerminate := False;
+            Job := CurrentJob;
+            Name := 'Job: ' + Job.Title;
+            ProgressView := Self;
+            Start;
+            while not Terminated do begin
+              Application.ProcessMessages;
+              Sleep(1);
+            end;
+            WaitFor;
+          end;
+        finally
+          FreeAndNil(Thread);
+        end;
+      end;
+      Form.ProgressBarPart.Hide;
+      if Assigned(FOnJobFinish) then
+        FOnJobFinish(CurrentJob);
+      if Terminate then Break;
+      EndTime := Now;
+      Finished := True;
+      Inc(I);
+    end;
+  finally
+    CurrentJob := nil;
+    Form.TimerUpdate.Enabled := False;
+    Screen.EnableForms(FormList);
+    //if Visible then Hide;
+    Form.MemoLog.Lines.Assign(Log);
+    if (Form.MemoLog.Lines.Count = 0) and AutoClose then begin
+      Form.Hide;
+    end;
+    Clear;
+    Form.Caption := SFinished;
+    //LabelEstimatedTimePart.Visible := False;
+    Finished := True;
+    CurrentJobIndex := -1;
+    ReloadJobList;
+  end;
+end;
+
+procedure TJobProgressView.UpdateHeight;
+var
+  H: Integer;
+  PanelOperationsVisible: Boolean;
+  PanelOperationsHeight: Integer;
+  PanelProgressVisible: Boolean;
+  PanelProgressTotalVisible: Boolean;
+  PanelLogVisible: Boolean;
+begin
+  with Form do begin
+  H := PanelOperationsTitle.Height;
+  PanelOperationsVisible := Jobs.Count > 0;
+  if PanelOperationsVisible <> PanelOperations.Visible then
+    PanelOperations.Visible := PanelOperationsVisible;
+  PanelOperationsHeight := 8 + 18 * Jobs.Count;
+  if PanelOperationsHeight <> PanelOperations.Height then
+    PanelOperations.Height := PanelOperationsHeight;
+  if PanelOperationsVisible then
+    H := H + PanelOperations.Height;
+
+  PanelProgressVisible := (Jobs.Count > 0) and not Finished;
+  if PanelProgressVisible <> PanelProgress.Visible then
+    PanelProgress.Visible := PanelProgressVisible;
+  if PanelProgressVisible then
+    H := H + PanelProgress.Height;
+  PanelProgressTotalVisible := (Jobs.Count > 1) and not Finished;
+  if PanelProgressTotalVisible <> PanelProgressTotal.Visible then
+    PanelProgressTotal.Visible := PanelProgressTotalVisible;
+  if PanelProgressTotalVisible then
+    H := H + PanelProgressTotal.Height;
+  Constraints.MinHeight := H;
+  PanelLogVisible := MemoLog.Lines.Count > 0;
+  if PanelLogVisible <> PanelLog.Visible then
+    PanelLog.Visible := PanelLogVisible;
+  if PanelLogVisible then
+    H := H + MemoLogHeight;
+  if Height <> H then Height := H;
+  end;
+end;
+
+procedure TJobProgressView.JobProgressChange(Sender: TObject);
+begin
+  if Assigned(FOnOwnerDraw) then
+    FOnOwnerDraw(Self);
+end;
+
+procedure TFormJobProgressView.TimerUpdateTimer(Sender: TObject);
+var
+  ProgressBarPartVisible: Boolean;
+  ProgressBarTotalVisible: Boolean;
+begin
+  JobProgressView.UpdateProgress;
+  if Visible and (not ProgressBarPart.Visible) and
+  Assigned(JobProgressView.CurrentJob) and
+  (JobProgressView.CurrentJob.Progress.Value > 0) then begin
+    ProgressBarPartVisible := True;
+    if ProgressBarPartVisible <> ProgressBarPart.Visible then
+      ProgressBarPart.Visible := ProgressBarPartVisible;
+    ProgressBarTotalVisible := True;
+    if ProgressBarTotalVisible <> ProgressBarTotal.Visible then
+      ProgressBarTotal.Visible := ProgressBarTotalVisible;
+  end;
+  if not Visible then begin
+    TimerUpdate.Interval := UpdateInterval;
+    if not JobProgressView.OwnerDraw then Show;
+  end;
+end;
+
+procedure TFormJobProgressView.FormDestroy(Sender:TObject);
+begin
+end;
+
+procedure TFormJobProgressView.ListViewJobsData(Sender: TObject; Item: TListItem);
+begin
+  if (Item.Index >= 0) and (Item.Index < JobProgressView.Jobs.Count) then
+  with TJob(JobProgressView.Jobs[Item.Index]) do begin
+    Item.Caption := Title;
+    if Item.Index = JobProgressView.CurrentJobIndex then Item.ImageIndex := 1
+      else if Finished then Item.ImageIndex := 0
+      else Item.ImageIndex := 2;
+    Item.Data := JobProgressView.Jobs[Item.Index];
+  end;
+end;
+
+procedure TFormJobProgressView.FormClose(Sender: TObject;
+  var CloseAction: TCloseAction);
+begin
+  ListViewJobs.Clear;
+end;
+
+procedure TFormJobProgressView.FormCreate(Sender: TObject);
+begin
+  Caption := SPleaseWait;
+  try
+    //Animate1.FileName := ExtractFileDir(UTF8Encode(Application.ExeName)) +
+    //  DirectorySeparator + 'horse.avi';
+    //Animate1.Active := True;
+  except
+
+  end;
+end;
+
+procedure TJobProgressView.Stop;
+begin
+  Terminate := True;
+end;
+
+procedure TJobProgressView.TermSleep(Delay: Integer);
+const
+  Quantum = 100;
+var
+  I: Integer;
+begin
+  Sleep(Delay mod Quantum);
+  for I := 1 to (Delay div Quantum) do begin
+    if Terminate then Break;
+    Sleep(Quantum);
+  end;
+end;
+
+procedure TFormJobProgressView.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
+begin
+  CanClose := JobProgressView.Finished;
+  JobProgressView.Terminate := True;
+  Caption := SPleaseWait + STerminate;
+end;
+
+procedure TJobProgressView.SetTerminate(const AValue: Boolean);
+var
+  I: Integer;
+begin
+  if AValue = FTerminate then Exit;
+  for I := 0 to Jobs.Count - 1 do
+    TJob(Jobs[I]).Terminate := AValue;
+  FTerminate := AValue;
+end;
+
+procedure TJobProgressView.UpdateProgress;
+const
+  OneJobValue: Integer = 100;
+var
+  TotalMax: Integer;
+  TotalValue: Integer;
+  EstimatedTimePart: TDateTime;
+  RemainingTime: TDateTime;
+begin
+  if Assigned(CurrentJob) then
+  with CurrentJob, Form do begin
+    // Part progress
+    ProgressBarPart.Max := Progress.Max;
+    ProgressBarPart.Position := Progress.Value;
+    if (Progress.Value >= EstimatedTimeShowTreshold) then begin
+      EstimatedTimePart := (Now - StartTime) / Progress.Value * (Progress.Max - Progress.Value);
+      LabelEstimatedTimePart.Caption := Format(SEstimatedTime, [
+        TimeToStr(EstimatedTimePart)]);
+      LabelEstimatedTimePart.Visible := True;
+    end;
+
+    // Total progress
+    TotalMax := Jobs.Count * OneJobValue;
+    TotalValue := Int64(CurrentJobIndex) * OneJobValue +
+      Round(Progress.Value / Progress.Max * OneJobValue);
+    ProgressBarTotal.Max := TotalMax;
+    ProgressBarTotal.Position := TotalValue;
+    if (TotalValue >= EstimatedTimeShowTresholdTotal) then begin
+      // Project estimated time according part estimated time plus
+      // estimated time by elapsed time divided by elapsed ticks mutiplied by rest ticks
+      RemainingTime := EstimatedTimePart +
+        (Now - TotalStartTime + EstimatedTimePart) /
+        ((CurrentJobIndex + 1) * OneJobValue) *
+        ((Jobs.Count - 1 - CurrentJobIndex) * OneJobValue);
+      if (RemainingTime > 0) and (RemainingTime < EncodeDate(2100, 1, 1)) then begin
+        LabelEstimatedTimeTotal.Caption := Format(STotalEstimatedTime, [
+          TimeToStr(RemainingTime)]);
+        LabelEstimatedTimeTotal.Visible := True;
+      end else begin
+        LabelEstimatedTimeTotal.Visible := False;
+      end;
+    end;
+  end;
+end;
+
+procedure TJobProgressView.ReloadJobList;
+begin
+  UpdateHeight;
+  // Workaround for not showing first line
+  Form.ListViewJobs.Items.Count := Jobs.Count + 1;
+  Form.ListViewJobs.Refresh;
+
+  if Form.ListViewJobs.Items.Count <> Jobs.Count then
+    Form.ListViewJobs.Items.Count := Jobs.Count;
+  Form.ListViewJobs.Refresh;
+  //Application.ProcessMessages;
+end;
+
+constructor TJobProgressView.Create(TheOwner: TComponent);
+begin
+  inherited;
+  if not (csDesigning in ComponentState) then begin
+    Form := TFormJobProgressView.Create(Self);
+    Form.JobProgressView := Self;
+  end;
+  Jobs := TObjectList.Create;
+  Log := TStringList.Create;
+  //PanelOperationsTitle.Height := 80;
+  ShowDelay := 0; //1000; // ms
+end;
+
+procedure TJobProgressView.Clear;
+begin
+  Jobs.Clear;
+  //ReloadJobList;
+end;
+
+destructor TJobProgressView.Destroy;
+begin
+  FreeAndNil(Log);
+  FreeAndNil(Jobs);
+  inherited;
+end;
+
+procedure TProgress.SetMax(const AValue: Integer);
+begin
+  try
+    FLock.Acquire;
+    FMax := AValue;
+    if FMax < 1 then FMax := 1;
+    if FValue >= FMax then FValue := FMax;
+  finally
+    FLock.Release;
+  end;
+end;
+
+procedure TProgress.SetValue(const AValue: Integer);
+var
+  Change: Boolean;
+begin
+  try
+    FLock.Acquire;
+    if AValue < Max then begin
+      Change := AValue <> FValue;
+      FValue := AValue;
+      if Change and Assigned(FOnChange) then
+      try
+        FLock.Release;
+        FOnChange(Self);
+      finally
+        FLock.Acquire;
+      end;
+    end;
+  finally
+    FLock.Release;
+  end;
+end;
+
+{ TProgress }
+
+procedure TProgress.Increment;
+begin
+  try
+    FLock.Acquire;
+    Value := Value + 1;
+  finally
+    FLock.Release;
+  end;
+end;
+
+procedure TProgress.Reset;
+begin
+  try
+    FLock.Acquire;
+    FValue := 0;
+  finally
+    FLock.Release;
+  end;
+end;
+
+constructor TProgress.Create;
+begin
+  FMax := 100;
+  FLock := TCriticalSection.Create;
+end;
+
+destructor TProgress.Destroy;
+begin
+  FLock.Free;
+  inherited Destroy;
+end;
+
+{ TJob }
+
+procedure TJob.SetTerminate(const AValue: Boolean);
+begin
+  if FTerminate = AValue then Exit;
+  FTerminate := AValue;
+  if AValue then begin
+    ProgressView.Terminate := AValue;
+    if Assigned(Thread) then Thread.Terminate;
+  end;
+end;
+
+procedure TJob.AddLogItem(Value: string);
+begin
+  with ProgressView do begin
+    Log.Add(Value);
+  end;
+end;
+
+constructor TJob.Create;
+begin
+  Progress := TProgress.Create;
+  Terminate := False;
+  Finished := False;
+end;
+
+destructor TJob.Destroy;
+begin
+  Progress.Free;
+  inherited;
+end;
+
+end.
Index: /tags/1.1.0/Packages/Common/ULastOpenedList.pas
===================================================================
--- /tags/1.1.0/Packages/Common/ULastOpenedList.pas	(revision 137)
+++ /tags/1.1.0/Packages/Common/ULastOpenedList.pas	(revision 137)
@@ -0,0 +1,188 @@
+unit ULastOpenedList;
+
+{$mode delphi}
+
+interface
+
+uses
+  Classes, SysUtils, Registry, URegistry, Menus, XMLConf;
+
+type
+
+  { TLastOpenedList }
+
+  TLastOpenedList = class(TComponent)
+  private
+    FMaxCount: Integer;
+    FOnChange: TNotifyEvent;
+    procedure SetMaxCount(AValue: Integer);
+    procedure LimitMaxCount;
+    procedure ItemsChange(Sender: TObject);
+    procedure DoChange;
+  public
+    Items: TStringList;
+    constructor Create(AOwner: TComponent); override;
+    destructor Destroy; override;
+    procedure LoadToMenuItem(MenuItem: TMenuItem; ClickAction: TNotifyEvent);
+    procedure LoadFromRegistry(Context: TRegistryContext);
+    procedure SaveToRegistry(Context: TRegistryContext);
+    procedure LoadFromXMLConfig(XMLConfig: TXMLConfig; Path: string);
+    procedure SaveToXMLConfig(XMLConfig: TXMLConfig; Path: string);
+    procedure AddItem(FileName: string);
+  published
+    property MaxCount: Integer read FMaxCount write SetMaxCount;
+    property OnChange: TNotifyEvent read FOnChange write FOnChange;
+  end;
+
+procedure Register;
+
+
+implementation
+
+procedure Register;
+begin
+  RegisterComponents('Common', [TLastOpenedList]);
+end;
+
+
+{ TLastOpenedList }
+
+procedure TLastOpenedList.SetMaxCount(AValue: Integer);
+begin
+  if FMaxCount = AValue then Exit;
+  FMaxCount := AValue;
+  if FMaxCount < 0 then FMaxCount := 0;
+  LimitMaxCount;
+end;
+
+procedure TLastOpenedList.LimitMaxCount;
+begin
+  while Items.Count > MaxCount do
+    Items.Delete(Items.Count - 1);
+end;
+
+procedure TLastOpenedList.ItemsChange(Sender: TObject);
+begin
+  DoChange;
+end;
+
+procedure TLastOpenedList.DoChange;
+begin
+  if Assigned(FOnChange) then
+    FOnChange(Self);
+end;
+
+constructor TLastOpenedList.Create(AOwner: TComponent);
+begin
+  inherited;
+  Items := TStringList.Create;
+  Items.OnChange := ItemsChange;
+  MaxCount := 10;
+end;
+
+destructor TLastOpenedList.Destroy;
+begin
+  Items.Free;
+  inherited;
+end;
+
+procedure TLastOpenedList.LoadToMenuItem(MenuItem: TMenuItem; ClickAction: TNotifyEvent);
+var
+  NewMenuItem: TMenuItem;
+  I: Integer;
+begin
+  if Assigned(MenuItem) then begin
+    MenuItem.Clear;
+    for I := 0 to Items.Count - 1 do begin
+      NewMenuItem := TMenuItem.Create(MenuItem);
+      NewMenuItem.Caption := Items[I];
+      NewMenuItem.OnClick := ClickAction;
+      MenuItem.Add(NewMenuItem);
+    end;
+  end;
+end;
+
+procedure TLastOpenedList.LoadFromRegistry(Context: TRegistryContext);
+var
+  I: Integer;
+  Registry: TRegistryEx;
+  FileName: string;
+begin
+  Registry := TRegistryEx.Create;
+  with Registry do
+  try
+    RootKey := Context.RootKey;
+    OpenKey(Context.Key, True);
+    Items.Clear;
+    I := 0;
+    while ValueExists('File' + IntToStr(I)) and (I < MaxCount) do begin
+      FileName := UTF8Encode(ReadStringWithDefault('File' + IntToStr(I), ''));
+      if Trim(FileName) <> '' then Items.Add(FileName);
+      Inc(I);
+    end;
+    if Assigned(FOnChange) then
+      FOnChange(Self);
+  finally
+    Free;
+  end;
+end;
+
+procedure TLastOpenedList.SaveToRegistry(Context: TRegistryContext);
+var
+  I: Integer;
+  Registry: TRegistryEx;
+begin
+  Registry := TRegistryEx.Create;
+  with Registry do
+  try
+    RootKey := Context.RootKey;
+    OpenKey(Context.Key, True);
+    for I := 0 to Items.Count - 1 do
+      WriteString('File' + IntToStr(I), UTF8Decode(Items[I]));
+  finally
+    Free;
+  end;
+end;
+
+procedure TLastOpenedList.LoadFromXMLConfig(XMLConfig: TXMLConfig; Path: string
+  );
+var
+  I: Integer;
+  Value: string;
+  Count: Integer;
+begin
+  with XMLConfig do begin
+    Count := GetValue(Path + '/Count', 0);
+    if Count > MaxCount then Count := MaxCount;
+    Items.Clear;
+    for I := 0 to Count - 1 do begin
+      Value := GetValue(Path + '/File' + IntToStr(I), '');
+      if Trim(Value) <> '' then Items.Add(Value);
+    end;
+    if Assigned(FOnChange) then
+      FOnChange(Self);
+  end;
+end;
+
+procedure TLastOpenedList.SaveToXMLConfig(XMLConfig: TXMLConfig; Path: string);
+var
+  I: Integer;
+begin
+  with XMLConfig do begin
+    SetValue(Path + '/Count', Items.Count);
+    for I := 0 to Items.Count - 1 do
+      SetValue(Path + '/File' + IntToStr(I), Items[I]);
+    Flush;
+  end;
+end;
+
+procedure TLastOpenedList.AddItem(FileName:string);
+begin
+  if Items.IndexOf(FileName) <> -1 then Items.Delete(Items.IndexOf(FileName));
+  Items.Insert(0, FileName);
+  LimitMaxCount;
+  DoChange;
+end;
+
+end.
+
Index: /tags/1.1.0/Packages/Common/UListViewSort.pas
===================================================================
--- /tags/1.1.0/Packages/Common/UListViewSort.pas	(revision 137)
+++ /tags/1.1.0/Packages/Common/UListViewSort.pas	(revision 137)
@@ -0,0 +1,493 @@
+unit UListViewSort;
+
+// Date: 2010-11-03
+
+{$mode delphi}
+
+interface
+
+uses
+  {$IFDEF Windows}Windows, CommCtrl, {$ENDIF}Classes, Graphics, ComCtrls, SysUtils,
+  Controls, DateUtils, Dialogs, SpecializedList, Forms, Grids, StdCtrls, ExtCtrls,
+  LclIntf, LMessages, LclType, LResources;
+
+type
+  TSortOrder = (soNone, soUp, soDown);
+
+  TListViewSort = class;
+
+  TCompareEvent = function (Item1, Item2: TObject): Integer of object;
+  TListFilterEvent = procedure (ListViewSort: TListViewSort) of object;
+
+  { TListViewSort }
+
+  TListViewSort = class(TComponent)
+  private
+    FListView: TListView;
+    FOnCompareItem: TCompareEvent;
+    FOnFilter: TListFilterEvent;
+    FOnCustomDraw: TLVCustomDrawItemEvent;
+    {$IFDEF Windows}FHeaderHandle: HWND;{$ENDIF}
+    FColumn: Integer;
+    FOrder: TSortOrder;
+    FOldListViewWindowProc: TWndMethod;
+    FOnColumnWidthChanged: TNotifyEvent;
+    procedure DoColumnBeginResize(const AColIndex: Integer);
+    procedure DoColumnResized(const AColIndex: Integer);
+    procedure DoColumnResizing(const AColIndex, AWidth: Integer);
+    procedure SetListView(const Value: TListView);
+    procedure ColumnClick(Sender: TObject; Column: TListColumn);
+    procedure Sort(Compare: TCompareEvent);
+    procedure DrawCheckMark(Item: TListItem; Checked: Boolean);
+    procedure GetCheckBias(var XBias, YBias, BiasTop, BiasLeft: Integer;
+      const ListView: TListView);
+    procedure ListViewCustomDrawItem(Sender: TCustomListView;
+      Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
+    procedure ListViewClick(Sender: TObject);
+    procedure UpdateColumns;
+    procedure SetColumn(const Value: Integer);
+    procedure SetOrder(const Value: TSortOrder);
+    {$IFDEF WINDOWS}
+    procedure NewListViewWindowProc(var AMsg: TMessage);
+    {$ENDIF}
+  public
+    List: TListObject;
+    Source: TListObject;
+    constructor Create(AOwner: TComponent); override;
+    destructor Destroy; override;
+    function CompareTime(Time1, Time2: TDateTime): Integer;
+    function CompareInteger(Value1, Value2: Integer): Integer;
+    function CompareString(Value1, Value2: string): Integer;
+    function CompareBoolean(Value1, Value2: Boolean): Integer;
+    procedure Refresh;
+  published
+    property ListView: TListView read FListView write SetListView;
+    property OnCompareItem: TCompareEvent read FOnCompareItem
+      write FOnCompareItem;
+    property OnFilter: TListFilterEvent read FOnFilter
+      write FOnFilter;
+    property OnCustomDraw: TLVCustomDrawItemEvent read FOnCustomDraw
+      write FOnCustomDraw;
+    property OnColumnWidthChanged: TNotifyEvent read FOnColumnWidthChanged
+      write FOnColumnWidthChanged;
+    property Column: Integer read FColumn write SetColumn;
+    property Order: TSortOrder read FOrder write SetOrder;
+  end;
+
+  { TListViewFilter }
+
+  TListViewFilter = class(TWinControl)
+  private
+    FOnChange: TNotifyEvent;
+    FStringGrid1: TStringGrid;
+    procedure DoOnKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
+    procedure DoOnResize(Sender: TObject);
+  public
+    constructor Create(AOwner: TComponent); override;
+    procedure UpdateFromListView(ListView: TListView);
+    function TextEntered: Boolean;
+    function TextEnteredCount: Integer;
+    function TextEnteredColumn(Index: Integer): Boolean;
+    function GetColValue(Index: Integer): string;
+    property StringGrid: TStringGrid read FStringGrid1 write FStringGrid1;
+  published
+    property OnChange: TNotifyEvent read FOnChange write FOnChange;
+    property Align;
+    property Anchors;
+    property BorderSpacing;
+  end;
+
+procedure Register;
+
+
+implementation
+
+procedure Register;
+begin
+  RegisterComponents('Common', [TListViewSort, TListViewFilter]);
+end;
+
+{ TListViewFilter }
+
+procedure TListViewFilter.DoOnKeyUp(Sender: TObject; var Key: Word;
+  Shift: TShiftState);
+begin
+  if Assigned(FOnChange) then
+    FOnChange(Self);
+end;
+
+procedure TListViewFilter.DoOnResize(Sender: TObject);
+begin
+  FStringGrid1.DefaultRowHeight := FStringGrid1.Height;
+end;
+
+constructor TListViewFilter.Create(AOwner: TComponent);
+begin
+  inherited Create(AOwner);
+  FStringGrid1 := TStringGrid.Create(Self);
+  FStringGrid1.Align := alClient;
+  FStringGrid1.Parent := Self;
+  FStringGrid1.Visible := True;
+  FStringGrid1.ScrollBars := ssNone;
+  FStringGrid1.FixedCols := 0;
+  FStringGrid1.FixedRows := 0;
+  FStringGrid1.RowCount := 1;
+  FStringGrid1.Options := [goFixedHorzLine, goFixedVertLine, goVertLine,
+    goHorzLine, goRangeSelect, goEditing, goAlwaysShowEditor, goSmoothScroll];
+  FStringGrid1.OnKeyUp := DoOnKeyUp;
+  FStringGrid1.OnResize := DoOnResize;
+end;
+
+procedure TListViewFilter.UpdateFromListView(ListView: TListView);
+var
+  I: Integer;
+begin
+  with FStringGrid1 do begin
+    //Columns.Clear;
+    while Columns.Count > ListView.Columns.Count do Columns.Delete(Columns.Count - 1);
+    while Columns.Count < ListView.Columns.Count do Columns.Add;
+    for I := 0 to ListView.Columns.Count - 1 do begin
+      Columns[I].Width := ListView.Columns[I].Width;
+    end;
+  end;
+end;
+
+function TListViewFilter.TextEntered: Boolean;
+begin
+  Result := TextEnteredCount > 0;
+end;
+
+function TListViewFilter.TextEnteredCount: Integer;
+var
+  I: Integer;
+begin
+  Result := 0;
+  for I := 0 to FStringGrid1.ColCount - 1 do begin
+    if FStringGrid1.Cells[I, 0] <> '' then begin
+      Inc(Result);
+    end;
+  end;
+end;
+
+function TListViewFilter.TextEnteredColumn(Index: Integer): Boolean;
+begin
+  Result := FStringGrid1.Cells[Index, 0] <> '';
+end;
+
+function TListViewFilter.GetColValue(Index: Integer): string;
+begin
+  if (Index >= 0) and (Index < StringGrid.Columns.Count) then
+    Result := StringGrid.Cells[Index, 0]
+    else Result := '';
+end;
+
+{ TListViewSort }
+
+{$IFDEF WINDOWS}
+procedure TListViewSort.NewListViewWindowProc(var AMsg: TMessage);
+var
+  vColWidth: Integer;
+  vMsgNotify: TLMNotify absolute AMsg;
+  Code: Integer;
+begin
+  // call the old WindowProc of ListView
+  FOldListViewWindowProc(AMsg);
+
+  // Currently we care only with WM_NOTIFY message
+  if AMsg.Msg = WM_NOTIFY then
+  begin
+    Code := PHDNotify(vMsgNotify.NMHdr)^.Hdr.Code;
+    case Code of
+      HDN_ENDTRACKA, HDN_ENDTRACKW:
+        DoColumnResized(PHDNotify(vMsgNotify.NMHdr)^.Item);
+
+      HDN_BEGINTRACKA, HDN_BEGINTRACKW:
+        DoColumnBeginResize(PHDNotify(vMsgNotify.NMHdr)^.Item);
+
+      HDN_TRACKA, HDN_TRACKW:
+        begin
+          vColWidth := -1;
+          if (PHDNotify(vMsgNotify.NMHdr)^.PItem<>nil)
+             and (PHDNotify(vMsgNotify.NMHdr)^.PItem^.Mask and HDI_WIDTH <> 0)
+          then
+            vColWidth := PHDNotify(vMsgNotify.NMHdr)^.PItem^.cxy;
+
+          DoColumnResizing(PHDNotify(vMsgNotify.NMHdr)^.Item, vColWidth);
+        end;
+    end;
+  end;
+end;
+{$ENDIF}
+
+procedure TListViewSort.DoColumnBeginResize(const AColIndex: Integer);
+begin
+end;
+
+procedure TListViewSort.DoColumnResizing(const AColIndex, AWidth: Integer);
+begin
+end;
+
+procedure TListViewSort.DoColumnResized(const AColIndex: Integer);
+begin
+  if Assigned(FOnColumnWidthChanged) then
+    FOnColumnWidthChanged(Self);
+end;
+
+procedure TListViewSort.ColumnClick(Sender: TObject; Column: TListColumn);
+begin
+  if Column.Index = Self.Column then begin
+    if FOrder = soUp then FOrder := soDown
+    else if FOrder = soDown then FOrder := soUp
+    else FOrder := soUp;
+  end else Self.Column := Column.Index;
+  Refresh;
+  UpdateColumns;
+end;
+
+procedure TListViewSort.SetOrder(const Value: TSortOrder);
+begin
+  FOrder := Value;
+  UpdateColumns;
+end;
+
+procedure TListViewSort.SetColumn(const Value: Integer);
+begin
+  FColumn := Value;
+  UpdateColumns;
+end;
+
+procedure TListViewSort.SetListView(const Value: TListView);
+begin
+  if FListView = Value then Exit;
+  if Assigned(FListView) then
+    ListView.WindowProc := FOldListViewWindowProc;
+  FListView := Value;
+  FListView.OnColumnClick := ColumnClick;
+  FListView.OnCustomDrawItem := ListViewCustomDrawItem;
+  FListView.OnClick := ListViewClick;
+  FOldListViewWindowProc := FListView.WindowProc;
+  {$IFDEF WINDOWS}
+  FListView.WindowProc := NewListViewWindowProc;
+  {$ENDIF}
+end;
+
+procedure TListViewSort.Sort(Compare: TCompareEvent);
+begin
+  if (List.Count > 0) then
+    List.Sort(Compare);
+end;
+
+procedure TListViewSort.Refresh;
+begin
+  if Assigned(FOnFilter) then FOnFilter(Self)
+  else if Assigned(Source) then
+    List.Assign(Source) else
+    List.Clear;
+  if ListView.Items.Count <> List.Count then
+    ListView.Items.Count := List.Count;
+  if Assigned(FOnCompareItem) and (Order <> soNone) then Sort(FOnCompareItem);
+  //ListView.Items[-1]; // Workaround for not show first row if selected
+  ListView.Refresh;
+  // Workaround for not working item selection on first row
+  //if not Assigned(ListView.Selected) then begin
+  //  ListView.Items.Count := 0;
+  //  ListView.Items.Count := List.Count;
+  //end;
+  //if ListView.Items.Count > 0 then
+  //  ListView.Items[0].Selected := True;
+  //ListView.Selected := nil;
+  UpdateColumns;
+end;
+
+const
+  //W_64: Integer = 64; {Width of thumbnail in ICON view mode}
+  H_64: Integer = 64; {Height of thumbnail size}
+  CheckWidth: Integer = 14; {Width of check mark box}
+  CheckHeight: Integer = 14; {Height of checkmark}
+  CheckBiasTop: Integer = 2; {This aligns the checkbox to be in centered}
+  CheckBiasLeft: Integer = 3; {In the row of the list item display}
+
+function TListViewSort.CompareBoolean(Value1, Value2: Boolean): Integer;
+begin
+  if Value1 > Value2 then Result := 1
+  else if Value1 < Value2 then Result := -1
+  else Result := 0;
+end;
+
+function TListViewSort.CompareInteger(Value1, Value2: Integer): Integer;
+begin
+  if Value1 > Value2 then Result := 1
+  else if Value1 < Value2 then Result := -1
+  else Result := 0;
+end;
+
+function TListViewSort.CompareString(Value1, Value2: string): Integer;
+begin
+  Result := AnsiCompareStr(Value1, Value2);
+//  if Value1 > Value2 then Result := -1
+//  else if Value1 < Value2 then Result := 1
+//  else Result := 0;
+end;
+
+function TListViewSort.CompareTime(Time1, Time2: TDateTime): Integer;
+begin
+  Result := DateUtils.CompareDateTime(Time1, Time2);
+end;
+
+constructor TListViewSort.Create(AOwner: TComponent);
+begin
+  inherited;
+  List := TListObject.Create;
+  List.OwnsObjects := False;
+end;
+
+destructor TListViewSort.Destroy;
+begin
+  List.Free;
+  inherited;
+end;
+
+procedure TListViewSort.DrawCheckMark(Item: TListItem; Checked:
+  Boolean);
+var
+  TP1: TPoint;
+  XBias, YBias: Integer;
+  OldColor: TColor;
+  BiasTop, BiasLeft: Integer;
+  Rect1: TRect;
+  lRect: TRect;
+  ItemLeft: Integer;
+begin
+  XBias := 0;
+  YBias := 0;
+  BiasTop := 0;
+  BiasLeft := 0;
+  Item.Left := 0;
+  GetCheckBias(XBias, YBias, BiasTop, BiasLeft, ListView);
+  OldColor := ListView.Canvas.Pen.Color;
+  //TP1 := Item.GetPosition;
+  lRect := Item.DisplayRect(drBounds); // Windows 7 workaround
+  TP1.X := lRect.Left;
+  TP1.Y := lRect.Top;
+  //ShowMessage(IntToStr(Item.Index) + ', ' + IntToStr(GetScrollPos(Item.ListView.Handle, SB_VERT)) + '  ' +
+  //  IntToHex(Integer(Item), 8) + ', ' + IntToStr(TP1.X) + ', ' + IntToStr(TP1.Y));
+
+//  if Checked then
+    ListView.Canvas.Brush.Color := clWhite;
+  ItemLeft := Item.Left;
+  ItemLeft := 23; // Windows 7 workaround
+  
+  Rect1.Left := ItemLeft - CheckWidth - BiasLeft + 1 + XBias;
+  //ShowMessage(IntToStr(Tp1.Y) + ', ' + IntToStr(BiasTop) + ', ' + IntToStr(XBias));
+  Rect1.Top := Tp1.Y + BiasTop + 1 + YBias;
+  Rect1.Right := ItemLeft - BiasLeft - 1 + XBias;
+  Rect1.Bottom := Tp1.Y + BiasTop + CheckHeight - 1 + YBias;
+  //ShowMessage(IntToStr(Rect1.Left) + ', ' + IntToStr(Rect1.Top) + ', ' + IntToStr(Rect1.Right) + ', ' + IntToStr(Rect1.Bottom));
+
+  ListView.Canvas.FillRect(Rect1);
+  //if Checked then ListView.Canvas.Brush.Color := clBlack
+  ListView.Canvas.Brush.Color := clBlack;
+  ListView.Canvas.FrameRect(Rect1);
+  ListView.Canvas.FrameRect(Rect(Rect1.Left - 1, Rect1.Top - 1,
+    Rect1.Right + 1, Rect1.Bottom + 1));
+  if Checked then begin
+    ListView.Canvas.Pen.Color := clBlack;
+    ListView.Canvas.MoveTo(ItemLeft - BiasLeft - 2 + XBias - 2,
+      Tp1.Y + BiasTop + 3 + YBias);
+    ListView.Canvas.LineTo(ItemLeft - BiasLeft - (CheckWidth div 2) + XBias,
+      Tp1.Y + BiasTop + (CheckHeight - 4) + YBias);
+    ListView.Canvas.LineTo(ItemLeft - BiasLeft - (CheckWidth - 3) + XBias,
+      Tp1.Y + BiasTop + (CheckHeight div 2) + YBias - 1);
+
+    ListView.Canvas.MoveTo(ItemLeft - BiasLeft - 2 - 1 + XBias - 2,
+      Tp1.Y + BiasTop + 3 + YBias);
+    ListView.Canvas.LineTo(ItemLeft - BiasLeft - (CheckWidth div 2) - 1 + XBias,
+      Tp1.Y + BiasTop + (CheckHeight - 4) + YBias);
+    ListView.Canvas.LineTo(ItemLeft - BiasLeft - (CheckWidth - 3) - 1 + XBias,
+      Tp1.Y + BiasTop + (CheckHeight div 2) + YBias - 1);
+  end;
+  //ListView.Canvas.Brush.Color := ListView.Color;
+  ListView.Canvas.Brush.Color := clWindow;
+  ListView.Canvas.Pen.Color := OldColor;
+end;
+
+procedure TListViewSort.GetCheckBias(var XBias, YBias, BiasTop, BiasLeft: Integer;
+  const ListView: TListView);
+begin
+  XBias := 0;
+  YBias := 0;
+  if ListView.ViewStyle = vsICON then
+  begin
+    YBias := H_64 - CheckHeight;
+    XBias := 0;
+  end;
+  BiasTop := CheckBiasTop;
+  BiasLeft := CheckBiasLeft;
+  if ListView.ViewStyle <> vsReport then
+  begin
+    BiasTop := 0;
+    BiasLeft := 0;
+  end;
+end;
+
+procedure TListViewSort.ListViewCustomDrawItem(Sender: TCustomListView;
+  Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
+begin
+  if Assigned(Item) then begin
+    if ListView.Checkboxes then
+      DrawCheckMark(Item, Item.Checked);
+    if Assigned(FOnCustomDraw) then
+      FOnCustomDraw(Sender, Item, State, DefaultDraw);
+  end;
+end;
+
+procedure TListViewSort.ListViewClick(Sender: TObject);
+var
+  Item: TListItem;
+  Pos: TPoint;
+  DefaultDraw: Boolean;
+begin
+  Pos := ListView.ScreenToClient(Mouse.CursorPos);
+  Item := ListView.GetItemAt(Pos.X, Pos.Y);
+  //ShowMessage(IntToStr(Item.Index) + ', ' + IntToStr(Pos.X) + ', ' + IntToStr(Pos.Y));
+  if Assigned(Item) and (Pos.X < 20) then begin
+
+    Item.Checked := not Item.Checked;
+    //ShowMessage(IntToStr(Item.Index) + ', ' +BoolToStr(Item.Checked));
+    if Assigned(ListView.OnChange) then
+      ListView.OnChange(Self, Item, ctState);
+    DefaultDraw := False;
+    ListViewCustomDrawItem(ListView, Item, [], DefaultDraw);
+      //ListView.UpdateItems(Item.Index, Item.Index);
+  end;
+end;
+
+procedure TListViewSort.UpdateColumns;
+{$IFDEF Windows}
+const
+  HDF_SORTUP = $0400;
+  HDF_SORTDOWN = $0200;
+  SortOrder: array[TSortOrder] of Word = (0, HDF_SORTUP, HDF_SORTDOWN);
+var
+  Item: THDItem;
+  I: Integer;
+begin
+  if Assigned(FListView) then begin
+    FHeaderHandle := ListView_GetHeader(FListView.Handle);
+    for I := 0 to FListView.Columns.Count - 1 do begin
+      FillChar(Item, SizeOf(THDItem), 0);
+      Item.Mask := HDI_FORMAT;
+      Header_GetItem(FHeaderHandle, I, Item);
+      Item.fmt := Item.fmt and not (HDF_SORTDOWN or HDF_SORTUP);
+      if (Column <> -1) and (I = Column) then
+        Item.fmt := Item.fmt or SortOrder[FOrder];
+      Header_SetItem(FHeaderHandle, I, Item);
+    end;
+  end;
+end;
+{$ELSE}
+begin
+end;
+{$ENDIF}
+
+end.
Index: /tags/1.1.0/Packages/Common/UMemory.pas
===================================================================
--- /tags/1.1.0/Packages/Common/UMemory.pas	(revision 137)
+++ /tags/1.1.0/Packages/Common/UMemory.pas	(revision 137)
@@ -0,0 +1,111 @@
+unit UMemory;
+
+{$mode Delphi}{$H+}
+
+interface
+
+uses
+  Classes, SysUtils;
+
+type
+
+  { TMemory }
+
+  TMemory = class
+  private
+    FData: PByte;
+    FSize: Integer;
+    function GetItem(Index: Integer): Byte;
+    procedure SetItem(Index: Integer; AValue: Byte);
+    procedure SetSize(AValue: Integer); virtual;
+  public
+    procedure Clear(Value: Byte = 0);
+    procedure Assign(Source: TMemory);
+    constructor Create;
+    destructor Destroy; override;
+    property Data: PByte read FData;
+    property Size: Integer read FSize write SetSize;
+    property Items[Index: Integer]: Byte read GetItem write SetItem; default;
+  end;
+
+  { TPositionMemory }
+
+  TPositionMemory = class(TMemory)
+  private
+    FPosition: Integer;
+  protected
+    procedure SetSize(AValue: Integer); override;
+  public
+    procedure WriteByte(Value: Byte);
+    function ReadByte: Byte;
+    property Position: Integer read FPosition write FPosition;
+  end;
+
+implementation
+
+{ TPositionMemory }
+
+procedure TPositionMemory.SetSize(AValue: Integer);
+begin
+  inherited SetSize(AValue);
+  if FPosition > FSize then FPosition := FSize;
+end;
+
+procedure TPositionMemory.WriteByte(Value: Byte);
+begin
+  if FPosition >= Size then Size := FPosition + 1;
+  Items[FPosition] := Value;
+  Inc(FPosition);
+end;
+
+function TPositionMemory.ReadByte: Byte;
+begin
+  if FPosition >= Size then Size := FPosition + 1;
+  Result := Items[FPosition];
+  Inc(FPosition);
+end;
+
+{ TMemory }
+
+procedure TMemory.SetSize(AValue: Integer);
+begin
+  if FSize = AValue then Exit;
+  FSize := AValue;
+  FData := ReAllocMem(FData, FSize);
+end;
+
+function TMemory.GetItem(Index: Integer): Byte;
+begin
+  Result := PByte(FData + Index)^;
+end;
+
+procedure TMemory.SetItem(Index: Integer; AValue: Byte);
+begin
+  PByte(FData + Index)^ := AValue;
+end;
+
+procedure TMemory.Clear(Value: Byte);
+begin
+  FillChar(FData^, Size, Value);
+end;
+
+procedure TMemory.Assign(Source: TMemory);
+begin
+  Size := Source.Size;
+  Move(Source.Data^, FData^, Size);
+end;
+
+constructor TMemory.Create;
+begin
+  FData := nil;
+  FSize := 0;
+end;
+
+destructor TMemory.Destroy;
+begin
+  Size := 0;
+  inherited Destroy;
+end;
+
+end.
+
Index: /tags/1.1.0/Packages/Common/UPersistentForm.pas
===================================================================
--- /tags/1.1.0/Packages/Common/UPersistentForm.pas	(revision 137)
+++ /tags/1.1.0/Packages/Common/UPersistentForm.pas	(revision 137)
@@ -0,0 +1,271 @@
+unit UPersistentForm;
+
+{$mode delphi}
+
+// Date: 2015-04-18
+
+interface
+
+uses
+  Classes, SysUtils, Forms, URegistry, LCLIntf, Registry, Controls, ComCtrls;
+
+type
+
+  { TPersistentForm }
+
+  TPersistentForm = class(TComponent)
+  private
+    FEntireVisible: Boolean;
+    FMinVisiblePart: Integer;
+    FRegistryContext: TRegistryContext;
+    procedure LoadControl(Control: TControl);
+    procedure SaveControl(Control: TControl);
+  public
+    FormNormalSize: TRect;
+    FormRestoredSize: TRect;
+    FormWindowState: TWindowState;
+    Form: TForm;
+    DefaultFormWindowState: TWindowState;
+    procedure LoadFromRegistry(RegistryContext: TRegistryContext);
+    procedure SaveToRegistry(RegistryContext: TRegistryContext);
+    function CheckEntireVisible(Rect: TRect): TRect;
+    function CheckPartVisible(Rect: TRect; Part: Integer): TRect;
+    procedure Load(Form: TForm; DefaultFormWindowState: TWindowState = wsNormal);
+    procedure Save(Form: TForm);
+    constructor Create(AOwner: TComponent); override;
+    property RegistryContext: TRegistryContext read FRegistryContext
+      write FRegistryContext;
+  published
+    property MinVisiblePart: Integer read FMinVisiblePart write FMinVisiblePart;
+    property EntireVisible: Boolean read FEntireVisible write FEntireVisible;
+  end;
+
+procedure Register;
+
+implementation
+
+
+procedure Register;
+begin
+  RegisterComponents('Common', [TPersistentForm]);
+end;
+
+{ TPersistentForm }
+
+procedure TPersistentForm.LoadControl(Control: TControl);
+var
+  I: Integer;
+  WinControl: TWinControl;
+begin
+  if Control is TListView then begin
+    with Form, TRegistryEx.Create do
+    try
+      RootKey := RegistryContext.RootKey;
+      OpenKey(RegistryContext.Key + '\Forms\' + Form.Name + '\' + Control.Name, True);
+      for I := 0 to TListView(Control).Columns.Count - 1 do begin
+        if ValueExists('ColWidth' + IntToStr(I)) then
+          TListView(Control).Columns[I].Width := ReadInteger('ColWidth' + IntToStr(I));
+      end;
+    finally
+      Free;
+    end;
+  end;
+
+  if Control is TWinControl then begin
+    WinControl := TWinControl(Control);
+    if WinControl.ControlCount > 0 then begin
+      for I := 0 to WinControl.ControlCount - 1 do begin
+        if WinControl.Controls[I] is TControl then begin
+          LoadControl(WinControl.Controls[I]);
+        end;
+      end;
+    end;
+  end;
+end;
+
+procedure TPersistentForm.SaveControl(Control: TControl);
+var
+  I: Integer;
+  WinControl: TWinControl;
+begin
+  if Control is TListView then begin
+    with Form, TRegistryEx.Create do
+    try
+      RootKey := RegistryContext.RootKey;
+      OpenKey(RegistryContext.Key + '\Forms\' + Form.Name + '\' + Control.Name, True);
+      for I := 0 to TListView(Control).Columns.Count - 1 do begin
+        WriteInteger('ColWidth' + IntToStr(I), TListView(Control).Columns[I].Width);
+      end;
+    finally
+      Free;
+    end;
+  end;
+
+  if Control is TWinControl then begin
+      WinControl := TWinControl(Control);
+      if WinControl.ControlCount > 0 then begin
+        for I := 0 to WinControl.ControlCount - 1 do begin
+          if WinControl.Controls[I] is TControl then begin
+            SaveControl(WinControl.Controls[I]);
+          end;
+        end;
+      end;
+    end;
+end;
+
+procedure TPersistentForm.LoadFromRegistry(RegistryContext: TRegistryContext);
+begin
+  with TRegistryEx.Create do
+  try
+    RootKey := RegistryContext.RootKey;
+    OpenKey(RegistryContext.Key + '\Forms\' + Form.Name, True);
+    // Normal size
+    FormNormalSize.Left := ReadIntegerWithDefault('NormalLeft', FormNormalSize.Left);
+    FormNormalSize.Top := ReadIntegerWithDefault('NormalTop', FormNormalSize.Top);
+    FormNormalSize.Right := ReadIntegerWithDefault('NormalWidth', FormNormalSize.Right - FormNormalSize.Left)
+      + FormNormalSize.Left;
+    FormNormalSize.Bottom := ReadIntegerWithDefault('NormalHeight', FormNormalSize.Bottom - FormNormalSize.Top)
+      + FormNormalSize.Top;
+    // Restored size
+    FormRestoredSize.Left := ReadIntegerWithDefault('RestoredLeft', FormRestoredSize.Left);
+    FormRestoredSize.Top := ReadIntegerWithDefault('RestoredTop', FormRestoredSize.Top);
+    FormRestoredSize.Right := ReadIntegerWithDefault('RestoredWidth', FormRestoredSize.Right - FormRestoredSize.Left)
+      + FormRestoredSize.Left;
+    FormRestoredSize.Bottom := ReadIntegerWithDefault('RestoredHeight', FormRestoredSize.Bottom - FormRestoredSize.Top)
+      + FormRestoredSize.Top;
+    // Other state
+    FormWindowState := TWindowState(ReadIntegerWithDefault('WindowState', Integer(DefaultFormWindowState)));
+  finally
+    Free;
+  end;
+end;
+
+procedure TPersistentForm.SaveToRegistry(RegistryContext: TRegistryContext);
+begin
+  with Form, TRegistryEx.Create do
+  try
+    RootKey := RegistryContext.RootKey;
+    OpenKey(RegistryContext.Key + '\Forms\' + Form.Name, True);
+    // Normal state
+    WriteInteger('NormalWidth', FormNormalSize.Right - FormNormalSize.Left);
+    WriteInteger('NormalHeight', FormNormalSize.Bottom - FormNormalSize.Top);
+    WriteInteger('NormalTop', FormNormalSize.Top);
+    WriteInteger('NormalLeft', FormNormalSize.Left);
+    // Restored state
+    WriteInteger('RestoredWidth', FormRestoredSize.Right - FormRestoredSize.Left);
+    WriteInteger('RestoredHeight', FormRestoredSize.Bottom - FormRestoredSize.Top);
+    WriteInteger('RestoredTop', FormRestoredSize.Top);
+    WriteInteger('RestoredLeft', FormRestoredSize.Left);
+    // Other state
+    WriteInteger('WindowState', Integer(FormWindowState));
+  finally
+    Free;
+  end;
+end;
+
+function TPersistentForm.CheckEntireVisible(Rect: TRect): TRect;
+var
+  Width: Integer;
+  Height: Integer;
+begin
+  Result := Rect;
+  Width := Rect.Right - Rect.Left;
+  Height := Rect.Bottom - Rect.Top;
+  if Result.Left < (Screen.DesktopLeft) then begin
+    Result.Left := Screen.DesktopLeft;
+    Result.Right := Screen.DesktopLeft + Width;
+  end;
+  if Result.Right > (Screen.DesktopLeft + Screen.DesktopWidth) then begin
+    Result.Left := Screen.DesktopLeft + Screen.DesktopWidth - Width;
+    Result.Right := Screen.DesktopLeft + Screen.DesktopWidth;
+  end;
+  if Result.Top < Screen.DesktopTop then begin
+    Result.Top := Screen.DesktopTop;
+    Result.Bottom := Screen.DesktopTop + Height;
+  end;
+  if Result.Bottom > (Screen.DesktopTop + Screen.DesktopHeight) then begin
+    Result.Top := Screen.DesktopTop + Screen.DesktopHeight - Height;
+    Result.Bottom := Screen.DesktopTop + Screen.DesktopHeight;
+  end;
+end;
+
+function TPersistentForm.CheckPartVisible(Rect: TRect; Part: Integer): TRect;
+var
+  Width: Integer;
+  Height: Integer;
+begin
+  Result := Rect;
+  Width := Rect.Right - Rect.Left;
+  Height := Rect.Bottom - Rect.Top;
+  if Result.Right < (Screen.DesktopLeft + Part) then begin
+    Result.Left := Screen.DesktopLeft + Part - Width;
+    Result.Right := Screen.DesktopLeft + Part;
+  end;
+  if Result.Left > (Screen.DesktopLeft + Screen.DesktopWidth - Part) then begin
+    Result.Left := Screen.DesktopLeft + Screen.DesktopWidth - Part;
+    Result.Right := Screen.DesktopLeft + Screen.DesktopWidth - Part + Width;
+  end;
+  if Result.Bottom < (Screen.DesktopTop + Part) then begin
+    Result.Top := Screen.DesktopTop + Part - Height;
+    Result.Bottom := Screen.DesktopTop + Part;
+  end;
+  if Result.Top > (Screen.DesktopTop + Screen.DesktopHeight - Part) then begin
+    Result.Top := Screen.DesktopTop + Screen.DesktopHeight - Part;
+    Result.Bottom := Screen.DesktopTop + Screen.DesktopHeight - Part + Height;
+  end;
+end;
+
+procedure TPersistentForm.Load(Form: TForm; DefaultFormWindowState: TWindowState = wsNormal);
+begin
+  Self.Form := Form;
+  Self.DefaultFormWindowState := DefaultFormWindowState;
+
+  // Set default
+  FormNormalSize := Bounds((Screen.Width - Form.Width) div 2,
+    (Screen.Height - Form.Height) div 2, Form.Width, Form.Height);
+  FormRestoredSize := Bounds((Screen.Width - Form.Width) div 2,
+    (Screen.Height - Form.Height) div 2, Form.Width, Form.Height);
+
+  LoadFromRegistry(RegistryContext);
+
+  if not EqualRect(FormNormalSize, FormRestoredSize) or
+    (FormWindowState = wsMaximized) then begin
+    // Restore to maximized state
+    Form.WindowState := wsNormal;
+    if not EqualRect(FormRestoredSize, Form.BoundsRect) then
+      Form.BoundsRect := FormRestoredSize;
+    Form.WindowState := wsMaximized;
+  end else begin
+    // Restore to normal state
+    Form.WindowState := wsNormal;
+    if FEntireVisible then FormNormalSize := CheckEntireVisible(FormNormalSize)
+      else if FMinVisiblePart > 0 then
+    FormNormalSize := CheckPartVisible(FormNormalSize, FMinVisiblePart);
+    if not EqualRect(FormNormalSize, Form.BoundsRect) then
+      Form.BoundsRect := FormNormalSize;
+  end;
+  LoadControl(Form);
+end;
+
+procedure TPersistentForm.Save(Form: TForm);
+begin
+  Self.Form := Form;
+  FormNormalSize := Bounds(Form.Left, Form.Top, Form.Width, Form.Height);
+  FormRestoredSize := Bounds(Form.RestoredLeft, Form.RestoredTop, Form.RestoredWidth,
+    Form.RestoredHeight);
+  FormWindowState := Form.WindowState;
+  SaveToRegistry(RegistryContext);
+  SaveControl(Form);
+end;
+
+constructor TPersistentForm.Create(AOwner: TComponent);
+begin
+  inherited;
+  if AOwner is TForm then Form := TForm(AOwner)
+    else Form := nil;
+  FMinVisiblePart := 50;
+  FRegistryContext.RootKey := HKEY_CURRENT_USER;
+end;
+
+end.
+
Index: /tags/1.1.0/Packages/Common/UPool.pas
===================================================================
--- /tags/1.1.0/Packages/Common/UPool.pas	(revision 137)
+++ /tags/1.1.0/Packages/Common/UPool.pas	(revision 137)
@@ -0,0 +1,203 @@
+unit UPool;
+
+{$mode Delphi}{$H+}
+
+interface
+
+uses
+  Classes, SysUtils, syncobjs, SpecializedList, UThreading;
+
+type
+  TPoolItemClass = class of TObject;
+
+  { TPool }
+
+  TPool = class
+  private
+    FReleaseEvent: TEvent;
+    function GetTotalCount: Integer;
+    function GetUsedCount: Integer; virtual;
+    procedure SetTotalCount(const AValue: Integer);
+  protected
+    function NewItemObject: TObject; virtual;
+  public
+    Items: TListObject;
+    FreeItems: TListObject;
+    function Acquire: TObject; virtual;
+    procedure Release(Item: TObject); virtual;
+    constructor Create; virtual;
+    destructor Destroy; override;
+    property TotalCount: Integer read GetTotalCount write SetTotalCount;
+    property UsedCount: Integer read GetUsedCount;
+  end;
+
+  { TThreadedPool }
+
+  TThreadedPool = class(TPool)
+  private
+    procedure SetTotalCount(const AValue: Integer);
+    function GetUsedCount: Integer; override;
+  public
+    Lock: TCriticalSection;
+    function Acquire: TObject; override;
+    procedure Release(Item: TObject); override;
+    constructor Create; override;
+    destructor Destroy; override;
+  end;
+
+resourcestring
+  SObjectPoolEmpty = 'Object pool is empty';
+  SReleaseError = 'Unknown object for release from pool';
+
+
+implementation
+
+{ TThreadedPool }
+
+procedure TThreadedPool.SetTotalCount(const AValue: Integer);
+begin
+  try
+    Lock.Acquire;
+    inherited SetTotalCount(AValue);
+  finally
+    Lock.Release;
+  end;
+end;
+
+function TThreadedPool.GetUsedCount: Integer;
+begin
+  try
+    Lock.Acquire;
+    Result := inherited GetUsedCount;
+  finally
+    Lock.Release;
+  end;
+end;
+
+function TThreadedPool.Acquire: TObject;
+begin
+  try
+    Lock.Acquire;
+    if Items.Count = 0 then
+      raise Exception.Create(SObjectPoolEmpty);
+    while FreeItems.Count = 0 do begin
+      try
+        Lock.Release;
+        //FReleaseEvent.WaitFor(1);
+        Sleep(1);
+      finally
+        Lock.Acquire;
+      end;
+    end;
+    Result := inherited Acquire;
+  finally
+    Lock.Release;
+  end;
+end;
+
+procedure TThreadedPool.Release(Item: TObject);
+begin
+  try
+    Lock.Acquire;
+    inherited Release(Item);
+  finally
+    Lock.Release;
+  end;
+end;
+
+constructor TThreadedPool.Create;
+begin
+  inherited Create;
+  Lock := TCriticalSection.Create;
+end;
+
+destructor TThreadedPool.Destroy;
+begin
+  TotalCount := 0;
+  Lock.Free;
+  inherited Destroy;
+end;
+
+{ TPool }
+
+function TPool.NewItemObject: TObject;
+begin
+  // Overload this method in descendand classes for automatic creation propert item class
+  Result := TObject.Create;
+end;
+
+function TPool.GetUsedCount: Integer;
+begin
+  Result := Items.Count - FreeItems.Count;
+end;
+
+function TPool.GetTotalCount: Integer;
+begin
+  Result := Items.Count;
+end;
+
+procedure TPool.SetTotalCount(const AValue: Integer);
+var
+  I: Integer;
+begin
+  if AValue > Items.Count then begin
+    for I := Items.Count to AValue - 1 do begin
+      Items.Add(NewItemObject);
+      FreeItems.Add(Items.Last);
+    end;
+  end else
+  if AValue < Items.Count then begin
+    for I := Items.Count - 1 downto AValue do begin
+      while FreeItems.IndexOf(Items[I]) = -1 do
+        Sleep(1);
+      FreeItems.Delete(FreeItems.IndexOf(Items[I]));
+      Items.Delete(I);
+    end;
+  end;
+end;
+
+function TPool.Acquire: TObject;
+begin
+  while FreeItems.Count = 0 do begin
+    //FReleaseEvent.WaitFor(1);
+    Sleep(1);
+  end;
+  Result := FreeItems.Last;
+  FreeItems.Count := FreeItems.Count - 1;
+  //if not Assigned(Item) then
+  //  raise Exception.Create(Format(S);
+end;
+
+procedure TPool.Release(Item: TObject);
+var
+  Index: Integer;
+begin
+  Index := Items.IndexOf(Item);
+  if Index = -1 then
+    raise Exception.Create(SReleaseError);
+
+  FreeItems.Add(Item);
+  //if FUsedCount < TotalCount then
+  //  FReleaseEvent.SetEvent;
+end;
+
+constructor TPool.Create;
+begin
+  inherited;
+  Items := TListObject.Create;
+  FreeItems := TListObject.Create;
+  FreeItems.OwnsObjects := False;
+  FReleaseEvent := TEvent.Create(nil, False, False, '');
+end;
+
+destructor TPool.Destroy;
+begin
+  TotalCount := 0;
+  FreeAndNil(FReleaseEvent);
+  FreeAndNil(FreeItems);
+  FreeAndNil(Items);
+  inherited;
+end;
+
+end.
+
Index: /tags/1.1.0/Packages/Common/UPrefixMultiplier.pas
===================================================================
--- /tags/1.1.0/Packages/Common/UPrefixMultiplier.pas	(revision 137)
+++ /tags/1.1.0/Packages/Common/UPrefixMultiplier.pas	(revision 137)
@@ -0,0 +1,120 @@
+unit UPrefixMultiplier;
+
+// Date: 2010-06-01
+
+{$mode delphi}
+
+interface
+
+uses
+  Classes, SysUtils, Math;
+
+type
+  TPrefixMultiplierItem = record
+    ShortText: string;
+    FullText: string;
+    Value: Double;
+  end;
+
+  TPrefixMultiplierDef = array[0..16] of TPrefixMultiplierItem;
+
+  { TPrefixMultiplier }
+
+  TPrefixMultiplier = class
+  private
+    function TruncateDigits(Value:Double;Digits:Integer=3):Double;
+  public
+    function Add(Value: Double; PrefixMultipliers: TPrefixMultiplierDef;
+      UnitText: string; Digits: Integer = 3): string;
+  end;
+
+const
+  BasePrefixMultipliers: TPrefixMultiplierDef =
+  (
+    (ShortText: 'y'; FullText: 'yocto'; Value: 1e-24),
+	  (ShortText: 'z'; FullText: 'zepto'; Value: 1e-21),
+    (ShortText: 'a'; FullText: 'atto'; Value: 1e-18),
+    (ShortText: 'f'; FullText: 'femto'; Value: 1e-15),
+    (ShortText: 'p'; FullText: 'piko'; Value: 1e-12),
+    (ShortText: 'n'; FullText: 'nano'; Value: 1e-9),
+    (ShortText: 'u'; FullText: 'mikro'; Value: 1e-6),
+    (ShortText: 'm'; FullText: 'mili'; Value: 1e-3),
+    (ShortText: ''; FullText: ''; Value: 1e0),
+    (ShortText: 'k'; FullText: 'kilo'; Value: 1e3),
+    (ShortText: 'M'; FullText: 'mega'; Value: 1e6),
+    (ShortText: 'G'; FullText: 'giga'; Value: 1e9),
+    (ShortText: 'T'; FullText: 'tera'; Value: 1e12),
+    (ShortText: 'P'; FullText: 'peta'; Value: 1e15),
+    (ShortText: 'E'; FullText: 'exa'; Value: 1e18),
+    (ShortText: 'Z'; FullText: 'zetta'; Value: 1e21),
+    (ShortText: 'Y'; FullText: 'yotta'; Value: 1e24)
+  );
+
+  TimePrefixMultipliers: TPrefixMultiplierDef =
+  (
+    (ShortText: 'ys'; FullText: 'yocto'; Value: 1e-24),
+	  (ShortText: 'zs'; FullText: 'zepto'; Value: 1e-21),
+    (ShortText: 'as'; FullText: 'atto'; Value: 1e-18),
+    (ShortText: 'fs'; FullText: 'femto'; Value: 1e-15),
+    (ShortText: 'ps'; FullText: 'piko'; Value: 1e-12),
+    (ShortText: 'ns'; FullText: 'nano'; Value: 1e-9),
+    (ShortText: 'us'; FullText: 'mikro'; Value: 1e-6),
+    (ShortText: 'ms'; FullText: 'mili'; Value: 1e-3),
+    (ShortText: 's'; FullText: 'sekunda'; Value: 1),
+    (ShortText: 'min'; FullText: 'minuta'; Value: 60),
+    (ShortText: 'hod'; FullText: 'hodina'; Value: 3600),
+    (ShortText: 'den'; FullText: 'den'; Value: 24 * 3600),
+    (ShortText: 'týd'; FullText: 'týden'; Value: 7 * 24 * 3600),
+    (ShortText: 'měs'; FullText: 'měsíc'; Value: 30 * 24 * 3600),
+    (ShortText: 'rok'; FullText: 'rok'; Value: 365 * 24 * 3600),
+    (ShortText: 'století'; FullText: 'století'; Value: 3153600000),
+    (ShortText: 'tisíciletí'; FullText: 'tisíciletí'; Value: 3153600000)
+  );
+
+implementation
+
+{ TPrefixMultiplier }
+
+function TPrefixMultiplier.TruncateDigits(Value: Double; Digits: Integer = 3): Double;
+var
+  II: Integer;
+  RealDigits: Integer;
+begin
+  Result := 0;
+  for II := 2 downto -1 do begin
+    if Value >= Power(10, II) then begin
+      if Digits < (II + 1) then RealDigits := II + 1
+        else RealDigits := Digits;
+      Result := Round(Value / Power(10, II - RealDigits + 1)) * Power(10, II - RealDigits + 1);
+      Break;
+    end;
+  end;
+end;
+
+function TPrefixMultiplier.Add(Value:Double;PrefixMultipliers:TPrefixMultiplierDef
+  ;UnitText:string;Digits:Integer):string;
+var
+  I: Integer;
+begin
+  if UnitText = '' then Result := FloatToStr(TruncateDigits(Value, Digits));
+  I := 8;
+  if Value = 0 then
+  else
+  if Value > 1 then begin
+    while(((Value / PrefixMultipliers[I + 1].Value) > 1) and ((I + 1) >= 0) and
+      ((I + 1) <= Length(PrefixMultipliers))) do Inc(I);
+  end else
+  if Value < 1 then begin
+    while(((Value / PrefixMultipliers[I + 1].Value) < 1) and ((I - 1) >= 0) and
+      ((I - 1) <= Length(PrefixMultipliers))) do Dec(I);
+    Inc(I);
+  end;
+  Value := Value / PrefixMultipliers[I].Value;
+
+  // Truncate digits count
+  Result := FloatToStr(TruncateDigits(Value, Digits)) + ' ' +
+    PrefixMultipliers[I].ShortText + UnitText;
+end;
+
+end.
+
Index: /tags/1.1.0/Packages/Common/URegistry.pas
===================================================================
--- /tags/1.1.0/Packages/Common/URegistry.pas	(revision 137)
+++ /tags/1.1.0/Packages/Common/URegistry.pas	(revision 137)
@@ -0,0 +1,143 @@
+unit URegistry;
+
+{$MODE Delphi}
+
+interface
+
+uses
+  Classes, Registry;
+
+type
+  TRegistryRoot = (rrKeyClassesRoot = HKEY($80000000),
+    rrKeyCurrentUser = HKEY($80000001),
+    rrKeyLocalMachine = HKEY($80000002),
+    rrKeyUsers = HKEY($80000003),
+    rrKeyPerformanceData = HKEY($80000004),
+    rrKeyCurrentConfig = HKEY($80000005),
+    rrKeyDynData = HKEY($80000006));
+
+  { TRegistryContext }
+
+  TRegistryContext = record
+    RootKey: HKEY;
+    Key: string;
+    class operator Equal(A, B: TRegistryContext): Boolean;
+  end;
+
+  { TRegistryEx }
+
+  TRegistryEx = class(TRegistry)
+  private
+    function GetCurrentContext: TRegistryContext;
+    procedure SetCurrentContext(AValue: TRegistryContext);
+  public
+    function ReadBoolWithDefault(const Name: string;
+      DefaultValue: Boolean): Boolean;
+    function ReadIntegerWithDefault(const Name: string; DefaultValue: Integer): Integer;
+    function ReadStringWithDefault(const Name: string; DefaultValue: string): string;
+    function ReadFloatWithDefault(const Name: string;
+      DefaultValue: Double): Double;
+    function DeleteKeyRecursive(const Key: string): Boolean;
+    function OpenKey(const Key: string; CanCreate: Boolean): Boolean;
+    property CurrentContext: TRegistryContext read GetCurrentContext write SetCurrentContext;
+  end;
+
+function RegContext(RootKey: HKEY; Key: string): TRegistryContext;
+
+
+implementation
+
+function RegContext(RootKey: HKEY; Key: string): TRegistryContext;
+begin
+  Result.RootKey := RootKey;
+  Result.Key := Key;
+end;
+
+{ TRegistryContext }
+
+class operator TRegistryContext.Equal(A, B: TRegistryContext): Boolean;
+begin
+  Result := (A.Key = B.Key) and (A.RootKey = B.RootKey);
+end;
+
+{ TRegistryEx }
+
+function TRegistryEx.ReadIntegerWithDefault(const Name: string;
+  DefaultValue: Integer): Integer;
+begin
+  if ValueExists(Name) then Result := ReadInteger(Name)
+    else begin
+      WriteInteger(Name, DefaultValue);
+      Result := DefaultValue;
+    end;
+end;
+
+function TRegistryEx.ReadStringWithDefault(const Name: string;
+  DefaultValue: string): string;
+begin
+  if ValueExists(Name) then Result := ReadString(Name)
+    else begin
+      WriteString(Name, DefaultValue);
+      Result := DefaultValue;
+    end;
+end;
+
+function TRegistryEx.ReadFloatWithDefault(const Name: string;
+  DefaultValue: Double): Double;
+begin
+  if ValueExists(Name) then Result := ReadFloat(Name)
+    else begin
+      WriteFloat(Name, DefaultValue);
+      Result := DefaultValue;
+    end;
+end;
+
+function TRegistryEx.DeleteKeyRecursive(const Key: string): Boolean;
+var
+  SubKeys: TStringList;
+  I: Integer;
+begin
+  try
+    SubKeys := TStringList.Create;
+    if OpenKey(Key, False) and HasSubKeys then begin
+      GetKeyNames(SubKeys);
+      for I := 0 to SubKeys.Count - 1 do
+        DeleteKeyRecursive(Key + '\' + SubKeys[I]);
+    end;
+    Result := DeleteKey(Key);
+  finally
+    SubKeys.Free;
+  end;
+end;
+
+function TRegistryEx.OpenKey(const Key: string; CanCreate: Boolean): Boolean;
+begin
+  {$IFDEF Linux}
+  CloseKey;
+  {$ENDIF}
+  Result := inherited OpenKey(Key, CanCreate);
+end;
+
+function TRegistryEx.GetCurrentContext: TRegistryContext;
+begin
+  Result.Key := CurrentPath;
+  Result.RootKey := RootKey;
+end;
+
+procedure TRegistryEx.SetCurrentContext(AValue: TRegistryContext);
+begin
+  RootKey := AValue.RootKey;
+  OpenKey(AValue.Key, True);
+end;
+
+function TRegistryEx.ReadBoolWithDefault(const Name: string;
+  DefaultValue: Boolean): Boolean;
+begin
+  if ValueExists(Name) then Result := ReadBool(Name)
+    else begin
+      WriteBool(Name, DefaultValue);
+      Result := DefaultValue;
+    end;
+end;
+
+end.
Index: /tags/1.1.0/Packages/Common/UResetableThread.pas
===================================================================
--- /tags/1.1.0/Packages/Common/UResetableThread.pas	(revision 137)
+++ /tags/1.1.0/Packages/Common/UResetableThread.pas	(revision 137)
@@ -0,0 +1,299 @@
+unit UResetableThread;
+
+{$mode Delphi}{$H+}
+
+interface
+
+uses
+  Classes, SysUtils, syncobjs, UThreading, UPool;
+
+type
+  TResetableThread = class;
+
+  { TResetableThreadExecute }
+
+  TResetableThreadExecute = class(TTermThread)
+    Parent: TResetableThread;
+    procedure Execute; override;
+  end;
+
+  { TResetableThread }
+
+  TResetableThread = class
+  private
+    FLock: TCriticalSection;
+    FOnException: TExceptionEvent;
+    FOnFinished: TNotifyEvent;
+    FStartEvent: TEvent;
+    FStopEvent: TEvent;
+    FThread: TResetableThreadExecute;
+    FStopPending: Boolean;
+    FRunning: Boolean;
+    FRunningPending: Boolean;
+    function GetRunning: Boolean;
+    procedure WaitForStart;
+    procedure WaitForStop;
+  public
+    Method: TMethodCall;
+    procedure Stop;
+    procedure Start;
+    constructor Create;
+    destructor Destroy; override;
+    property OnFinished: TNotifyEvent read FOnFinished write FOnFinished;
+    property StopPending: Boolean read FStopPending;
+    property Running: Boolean read GetRunning;
+    property OnException: TExceptionEvent read FOnException
+      write FOnException;
+  end;
+
+  { TThreadPool }
+
+  TThreadPool = class(TThreadedPool)
+  private
+    FOnException: TExceptionEvent;
+    procedure MethodFinish(Sender: TObject);
+  protected
+    function NewItemObject: TObject; override;
+  public
+    LastExceptionClass: TClass;
+    LastExceptionMessage: string;
+    procedure ThreadException(Sender: TObject; E: Exception);
+    procedure CheckException;
+    procedure WaitForEmpty;
+    procedure Clear;
+    procedure RunInThread(AMethod: TMethodCall);
+    constructor Create; override;
+    destructor Destroy; override;
+    property OnException: TExceptionEvent read FOnException
+      write FOnException;
+  end;
+
+resourcestring
+  SWaitError = 'WaitFor error';
+
+
+implementation
+
+{ TResetableThread }
+
+function TResetableThread.GetRunning: Boolean;
+begin
+  Result := FRunning;
+end;
+
+procedure TResetableThread.Stop;
+begin
+  try
+    FLock.Acquire;
+    if FRunning then FStopPending := True;
+  finally
+    FLock.Release;
+  end;
+end;
+
+procedure TResetableThread.Start;
+begin
+  try
+    FLock.Acquire;
+    //FRunningPending := True;
+    FStartEvent.SetEvent;
+  finally
+    FLock.Release;
+  end;
+end;
+
+procedure TResetableThread.WaitForStart;
+//var
+//  WaitResult: TWaitResult;
+begin
+  //try
+  //  FLock.Acquire;
+//  while (not FThread.Terminate) and (not FRunning) and (not FRunningPending) do
+//    Sleep(1);
+  //repeat
+    //try
+    //  FLock.Release;
+      //WaitResult := FStartEvent.WaitFor(1);
+    //finally
+    //  FLock.Acquire;
+    //end;
+  //until (WaitResult <> wrTimeout) or FRunning or FThread.Terminated;
+  //if WaitResult = wrError then
+  //  raise Exception.Create(SWaitError);
+  //finally
+  //  FLock.Release;
+  //end;
+end;
+
+procedure TResetableThread.WaitForStop;
+//var
+//  WaitState: TWaitResult;
+begin
+  try
+    FLock.Acquire;
+    repeat
+      try
+        FLock.Release;
+        //WaitState := FStopEvent.WaitFor(1);
+        Sleep(1);
+      finally
+        FLock.Acquire;
+      end;
+    until (not FRunning); // or (WaitState <> wrTimeout);
+  finally
+    FLock.Release;
+  end;
+end;
+
+constructor TResetableThread.Create;
+begin
+  FLock := TCriticalSection.Create;
+  FRunning := False;
+  FStopPending := False;
+  FStartEvent := TEvent.Create(nil, False, False, '');
+  FStopEvent := TEvent.Create(nil, False, False, '');
+  FThread := TResetableThreadExecute.Create(True);
+  FThread.Name := 'ResetableThread';
+  FThread.Parent := Self;
+  FThread.Resume;
+end;
+
+destructor TResetableThread.Destroy;
+begin
+  Stop;
+  WaitForStop;
+  FThread.Free; // Do not use FreeAndNil
+  FreeAndNil(FStartEvent);
+  FreeAndNil(FStopEvent);
+  FreeAndNil(FLock);
+  inherited Destroy;
+end;
+
+{ TResetableThreadExecute }
+
+procedure TResetableThreadExecute.Execute;
+var
+  WaitResult: TWaitResult;
+begin
+  while not Terminated do
+  with Parent do begin
+    try
+      FLock.Acquire;
+      //WaitForStart;
+      (*while (not Terminated) and (not FRunning) and (not FRunningPending) do
+      try
+        FLock.Release;
+        Sleep(1);
+      finally
+        FLock.Acquire;
+      end;*)
+      repeat
+        try
+          FLock.Release;
+          WaitResult := FStartEvent.WaitFor(1);
+        finally
+          FLock.Acquire;
+        end;
+      until (WaitResult <> wrTimeout) or Terminated;
+
+      if not Terminated then begin
+        //try
+          //FLock.Acquire;
+          FRunning := True;
+          FRunningPending := False;
+          try
+            FLock.Release;
+            try
+              try
+                Method;
+              finally
+                if Assigned(FOnFinished) then
+                  FOnFinished(Parent);
+              end;
+            except
+              on E: Exception do
+                if Assigned(FOnException) then
+                  FOnException(Self, E);
+            end;
+          finally
+            FLock.Acquire;
+          end;
+          FRunning := False;
+          FStopPending := False;
+          FStopEvent.SetEvent;
+        //finally
+          //FLock.Release;
+        //end;
+      end;
+    finally
+      FLock.Release;
+    end;
+  end;
+end;
+
+{ TThreadPool }
+
+procedure TThreadPool.MethodFinish(Sender: TObject);
+begin
+  Release(Sender);
+end;
+
+procedure TThreadPool.ThreadException(Sender: TObject; E: Exception);
+begin
+  LastExceptionClass := E.ClassType;
+  LastExceptionMessage := E.Message;
+end;
+
+procedure TThreadPool.CheckException;
+begin
+  if Assigned(LastExceptionClass) then
+    raise Exception.Create(LastExceptionMessage);
+end;
+
+function TThreadPool.NewItemObject: TObject;
+begin
+  Result := TResetableThread.Create;
+  TResetableThread(Result).OnException := ThreadException;
+end;
+
+procedure TThreadPool.WaitForEmpty;
+begin
+  while UsedCount > 0 do begin
+    Sleep(1);
+  end;
+end;
+
+procedure TThreadPool.Clear;
+begin
+  TotalCount := 0;
+  LastExceptionClass := nil;
+  LastExceptionMessage := '';
+end;
+
+procedure TThreadPool.RunInThread(AMethod: TMethodCall);
+begin
+  try
+    with TResetableThread(Acquire) do begin
+      Method := AMethod;
+      OnFinished := MethodFinish;
+      Start;
+    end;
+  finally
+    CheckException;
+  end;
+end;
+
+constructor TThreadPool.Create;
+begin
+  inherited Create;
+end;
+
+destructor TThreadPool.Destroy;
+begin
+  TotalCount := 0;
+  WaitForEmpty;
+  inherited Destroy;
+end;
+
+end.
+
Index: /tags/1.1.0/Packages/Common/UScaleDPI.pas
===================================================================
--- /tags/1.1.0/Packages/Common/UScaleDPI.pas	(revision 137)
+++ /tags/1.1.0/Packages/Common/UScaleDPI.pas	(revision 137)
@@ -0,0 +1,347 @@
+unit UScaleDPI;
+
+{ See: http://wiki.lazarus.freepascal.org/High_DPI }
+
+{$mode delphi}{$H+}
+
+interface
+
+uses
+  Classes, Forms, Graphics, Controls, ComCtrls, LCLType, SysUtils, StdCtrls,
+  Contnrs;
+
+type
+
+  { TControlDimension }
+
+  TControlDimension = class
+    BoundsRect: TRect;
+    FontHeight: Integer;
+    Controls: TObjectList; // TList<TControlDimension>
+    // Class specifics
+    ButtonSize: TPoint; // TToolBar
+    CoolBandWidth: Integer;
+    ConstraintsMin: TPoint; // TForm
+    ConstraintsMax: TPoint; // TForm
+    constructor Create;
+    destructor Destroy; override;
+  end;
+
+  { TScaleDPI }
+
+  TScaleDPI = class(TComponent)
+  private
+    FAutoDetect: Boolean;
+    FDesignDPI: TPoint;
+    FDPI: TPoint;
+    procedure SetAutoDetect(AValue: Boolean);
+    procedure SetDesignDPI(AValue: TPoint);
+    procedure SetDPI(AValue: TPoint);
+  public
+    procedure StoreDimensions(Control: TControl; Dimensions: TControlDimension);
+    procedure RestoreDimensions(Control: TControl; Dimensions: TControlDimension);
+    procedure ScaleDimensions(Control: TControl; Dimensions: TControlDimension);
+    procedure ApplyToAll(FromDPI: TPoint);
+    procedure ScaleControl(Control: TControl; FromDPI: TPoint);
+    procedure ScaleImageList(ImgList: TImageList; FromDPI: TPoint);
+    function ScalePoint(APoint: TPoint; FromDPI: TPoint): TPoint;
+    function ScaleRect(ARect: TRect; FromDPI: TPoint): TRect;
+    function ScaleX(Size: Integer; FromDPI: Integer): Integer;
+    function ScaleY(Size: Integer; FromDPI: Integer): Integer;
+    constructor Create(AOwner: TComponent); override;
+    property DesignDPI: TPoint read FDesignDPI write SetDesignDPI;
+    property DPI: TPoint read FDPI write SetDPI;
+  published
+    property AutoDetect: Boolean read FAutoDetect write SetAutoDetect;
+  end;
+
+procedure Register;
+
+
+implementation
+
+resourcestring
+  SWrongDPI = 'Wrong DPI [%d,%d]';
+
+procedure Register;
+begin
+  RegisterComponents('Common', [TScaleDPI]);
+end;
+
+{ TControlDimension }
+
+constructor TControlDimension.Create;
+begin
+  Controls := TObjectList.Create;
+end;
+
+destructor TControlDimension.Destroy;
+begin
+  FreeAndNil(Controls);
+  inherited Destroy;
+end;
+
+procedure TScaleDPI.SetAutoDetect(AValue: Boolean);
+begin
+  if FAutoDetect = AValue then Exit;
+  FAutoDetect := AValue;
+  if AValue then begin
+    DPI := Point(ScreenInfo.PixelsPerInchX, ScreenInfo.PixelsPerInchY);
+  end;
+end;
+
+procedure TScaleDPI.SetDesignDPI(AValue: TPoint);
+begin
+  if (FDesignDPI.X = AValue.X) and (FDesignDPI.Y = AValue.Y) then Exit;
+  if (AValue.X <= 0) or (AValue.Y <= 0) then
+    raise Exception.Create(Format(SWrongDPI, [AValue.X, AValue.Y]));
+  FDesignDPI := AValue;
+end;
+
+procedure TScaleDPI.SetDPI(AValue: TPoint);
+begin
+  if (FDPI.X = AValue.X) and (FDPI.Y = AValue.Y) then Exit;
+  if (AValue.X <= 0) or (AValue.Y <= 0) then
+    raise Exception.Create(Format(SWrongDPI, [AValue.X, AValue.Y]));
+  FDPI := AValue;
+end;
+
+procedure TScaleDPI.StoreDimensions(Control: TControl;
+  Dimensions: TControlDimension);
+var
+  NewControl: TControlDimension;
+  I: Integer;
+begin
+  Dimensions.BoundsRect := Control.BoundsRect;
+  Dimensions.FontHeight := Control.Font.GetTextHeight('Hg');
+  Dimensions.Controls.Clear;
+  if Control is TToolBar then
+    Dimensions.ButtonSize := Point(TToolBar(Control).ButtonWidth, TToolBar(Control).ButtonHeight);
+  if Control is TForm then begin
+    Dimensions.ConstraintsMin := Point(TForm(Control).Constraints.MinWidth,
+      TForm(Control).Constraints.MinHeight);
+    Dimensions.ConstraintsMax := Point(TForm(Control).Constraints.MaxWidth,
+      TForm(Control).Constraints.MaxHeight);
+  end;
+  if Control is TWinControl then
+  for I := 0 to TWinControl(Control).ControlCount - 1 do begin
+    if TWinControl(Control).Controls[I] is TControl then
+    // Do not scale docked forms twice
+    if not (TWinControl(Control).Controls[I] is TForm) then begin
+      NewControl := TControlDimension.Create;
+      Dimensions.Controls.Add(NewControl);
+      StoreDimensions(TWinControl(Control).Controls[I], NewControl);
+    end;
+  end;
+end;
+
+procedure TScaleDPI.RestoreDimensions(Control: TControl;
+  Dimensions: TControlDimension);
+var
+  I: Integer;
+begin
+  Control.BoundsRect := Dimensions.BoundsRect;
+  Control.Font.Height := Dimensions.FontHeight;
+  if Control is TToolBar then begin
+    TToolBar(Control).ButtonWidth := Dimensions.ButtonSize.X;
+    TToolBar(Control).ButtonHeight := Dimensions.ButtonSize.Y;
+  end;
+  if Control is TForm then begin
+    TForm(Control).Constraints.MinWidth := Dimensions.ConstraintsMin.X;
+    TForm(Control).Constraints.MinHeight := Dimensions.ConstraintsMin.Y;
+    TForm(Control).Constraints.MaxWidth := Dimensions.ConstraintsMax.X;
+    TForm(Control).Constraints.MaxHeight := Dimensions.ConstraintsMax.Y;
+  end;
+  if Control is TWinControl then
+  for I := 0 to TWinControl(Control).ControlCount - 1 do begin
+    if TWinControl(Control).Controls[I] is TControl then
+    // Do not scale docked forms twice
+    if not (TWinControl(Control).Controls[I] is TForm) then begin
+      RestoreDimensions(TWinControl(Control).Controls[I], TControlDimension(Dimensions.Controls[I]));
+    end;
+  end;
+end;
+
+procedure TScaleDPI.ScaleDimensions(Control: TControl;
+  Dimensions: TControlDimension);
+var
+  I: Integer;
+begin
+  Control.BoundsRect := ScaleRect(Dimensions.BoundsRect, DesignDPI);
+  Control.Font.Height := ScaleY(Dimensions.FontHeight, DesignDPI.Y);
+  if Control is TToolBar then begin
+    TToolBar(Control).ButtonWidth := ScaleX(Dimensions.ButtonSize.X, DesignDPI.X);
+    TToolBar(Control).ButtonHeight := ScaleY(Dimensions.ButtonSize.Y, DesignDPI.Y);
+  end;
+  if Control is TCoolBar then begin
+    with TCoolBar(Control) do
+    for I := 0 to Bands.Count - 1 do
+    with TCoolBand(Bands[I]) do begin
+      MinWidth := ScaleX(Dimensions.ButtonSize.X, DesignDPI.X);
+      MinHeight := ScaleY(Dimensions.ButtonSize.Y, DesignDPI.Y);
+      //Width := ScaleX(Dimensions.BoundsRect.Left -
+    end;
+  end;
+  if Control is TForm then begin
+    TForm(Control).Constraints.MinWidth := ScaleX(Dimensions.ConstraintsMin.X, DesignDPI.X);
+    TForm(Control).Constraints.MaxWidth := ScaleX(Dimensions.ConstraintsMax.X, DesignDPI.X);
+    TForm(Control).Constraints.MinHeight := ScaleY(Dimensions.ConstraintsMin.Y, DesignDPI.Y);
+    TForm(Control).Constraints.MaxHeight := ScaleY(Dimensions.ConstraintsMax.Y, DesignDPI.Y);
+  end;
+  if Control is TWinControl then
+  for I := 0 to TWinControl(Control).ControlCount - 1 do begin
+    if TWinControl(Control).Controls[I] is TControl then
+    // Do not scale docked forms twice
+    if not (TWinControl(Control).Controls[I] is TForm) then begin
+      ScaleDimensions(TWinControl(Control).Controls[I], TControlDimension(Dimensions.Controls[I]));
+    end;
+  end;
+end;
+
+procedure TScaleDPI.ApplyToAll(FromDPI: TPoint);
+var
+  I: Integer;
+begin
+  for I := 0 to Screen.FormCount - 1 do begin
+    ScaleControl(Screen.Forms[I], FromDPI);
+  end;
+end;
+
+procedure TScaleDPI.ScaleImageList(ImgList: TImageList; FromDPI: TPoint);
+var
+  TempBmp: TBitmap;
+  Temp: array of TBitmap;
+  NewWidth, NewHeight: integer;
+  I: Integer;
+begin
+  NewWidth := ScaleX(ImgList.Width, FromDPI.X);
+  NewHeight := ScaleY(ImgList.Height, FromDPI.Y);
+
+  SetLength(Temp, ImgList.Count);
+  for I := 0 to ImgList.Count - 1 do
+  begin
+    TempBmp := TBitmap.Create;
+    TempBmp.PixelFormat := pf32bit;
+    ImgList.GetBitmap(I, TempBmp);
+    Temp[I] := TBitmap.Create;
+    Temp[I].SetSize(NewWidth, NewHeight);
+    Temp[I].PixelFormat := pf32bit;
+    Temp[I].TransparentColor := TempBmp.TransparentColor;
+    //Temp[I].TransparentMode := TempBmp.TransparentMode;
+    Temp[I].Transparent := True;
+    Temp[I].Canvas.Brush.Style := bsSolid;
+    Temp[I].Canvas.Brush.Color := Temp[I].TransparentColor;
+    Temp[I].Canvas.FillRect(0, 0, Temp[I].Width, Temp[I].Height);
+
+    if (Temp[I].Width = 0) or (Temp[I].Height = 0) then Continue;
+    Temp[I].Canvas.StretchDraw(Rect(0, 0, Temp[I].Width, Temp[I].Height), TempBmp);
+    TempBmp.Free;
+  end;
+
+  ImgList.Clear;
+  ImgList.Width := NewWidth;
+  ImgList.Height := NewHeight;
+
+  for I := 0 to High(Temp) do
+  begin
+    ImgList.Add(Temp[I], nil);
+    Temp[i].Free;
+  end;
+end;
+
+function TScaleDPI.ScaleX(Size: Integer; FromDPI: Integer): Integer;
+begin
+  Result := MulDiv(Size, DPI.X, FromDPI);
+end;
+
+function TScaleDPI.ScaleY(Size: Integer; FromDPI: Integer): Integer;
+begin
+  Result := MulDiv(Size, DPI.Y, FromDPI);
+end;
+
+function TScaleDPI.ScalePoint(APoint: TPoint; FromDPI: TPoint): TPoint;
+begin
+  Result.X := ScaleX(APoint.X, FromDPI.X);
+  Result.Y := ScaleY(APoint.Y, FromDPI.Y);
+end;
+
+function TScaleDPI.ScaleRect(ARect: TRect; FromDPI: TPoint): TRect;
+begin
+  Result.TopLeft := ScalePoint(ARect.TopLeft, FromDPI);
+  Result.BottomRight := ScalePoint(ARect.BottomRight, FromDPI);
+end;
+
+constructor TScaleDPI.Create(AOwner: TComponent);
+begin
+  inherited;
+  DPI := Point(96, 96);
+  DesignDPI := Point(96, 96);
+end;
+
+procedure TScaleDPI.ScaleControl(Control: TControl; FromDPI: TPoint);
+var
+  I: Integer;
+  WinControl: TWinControl;
+  ToolBarControl: TToolBar;
+  OldAnchors: TAnchors;
+  OldAutoSize: Boolean;
+begin
+  //if Control is TMemo then Exit;
+  //if Control is TForm then
+  //  Control.DisableAutoSizing;
+  with Control do begin
+    //OldAutoSize := AutoSize;
+    //AutoSize := False;
+    //Anchors := [];
+    Left := ScaleX(Left, FromDPI.X);
+    Top := ScaleY(Top, FromDPI.Y);
+    //if not (akRight in Anchors) then
+    Width := ScaleX(Width, FromDPI.X);
+    //if not (akBottom in Anchors) then
+    Height := ScaleY(Height, FromDPI.Y);
+    {$IFDEF LCL Qt}
+      Font.Size := 0;
+    {$ELSE}
+      Font.Height := ScaleY(Font.GetTextHeight('Hg'), FromDPI.Y);
+    {$ENDIF}
+    //Anchors := OldAnchors;
+    //AutoSize := OldAutoSize;
+  end;
+
+  if Control is TCoolBar then
+  with TCoolBar(Control) do begin
+    BeginUpdate;
+    for I := 0 to Bands.Count - 1 do
+      with Bands[I] do begin
+        MinWidth := ScaleX(MinWidth, FromDPI.X);
+        MinHeight := ScaleY(MinHeight, FromDPI.Y);
+        Width := ScaleX(Width, FromDPI.X);
+        //Control.Invalidate;
+      end;
+    EndUpdate;
+  end;
+
+  if Control is TToolBar then begin
+    ToolBarControl := TToolBar(Control);
+    with ToolBarControl do begin
+      ButtonWidth := ScaleX(ButtonWidth, FromDPI.X);
+      ButtonHeight := ScaleY(ButtonHeight, FromDPI.Y);
+    end;
+  end;
+
+  //if not (Control is TCustomPage) then
+  if Control is TWinControl then begin
+    WinControl := TWinControl(Control);
+    if WinControl.ControlCount > 0 then begin
+      for I := 0 to WinControl.ControlCount - 1 do begin
+        if WinControl.Controls[I] is TControl then begin
+          ScaleControl(WinControl.Controls[I], FromDPI);
+        end;
+      end;
+    end;
+  end;
+  //if Control is TForm then
+  //  Control.EnableAutoSizing;
+end;
+
+end.
Index: /tags/1.1.0/Packages/Common/USyncCounter.pas
===================================================================
--- /tags/1.1.0/Packages/Common/USyncCounter.pas	(revision 137)
+++ /tags/1.1.0/Packages/Common/USyncCounter.pas	(revision 137)
@@ -0,0 +1,81 @@
+unit USyncCounter;
+
+{$mode delphi}
+
+interface
+
+uses
+  Classes, SysUtils, SyncObjs;
+
+type
+
+  { TSyncCounter }
+
+  TSyncCounter = class
+  private
+    Top: Integer;
+    Current: Integer;
+  public
+    Lock: TCriticalSection;
+    function Allocate: Integer;
+    function CurrentEqualTo(AValue: Integer): Boolean;
+    procedure Increment;
+    constructor Create;
+    destructor Destroy; override;
+    procedure Assign(Source: TSyncCounter);
+  end;
+
+implementation
+
+{ TSyncCounter }
+
+function TSyncCounter.Allocate: Integer;
+begin
+  try
+    Lock.Acquire;
+    Result := Top;
+    Inc(Top);
+  finally
+    Lock.Release;
+  end;
+end;
+
+function TSyncCounter.CurrentEqualTo(AValue: Integer): Boolean;
+begin
+  try
+    Lock.Acquire;
+    Result := AValue = Current;
+  finally
+    Lock.Release;
+  end;
+end;
+
+procedure TSyncCounter.Increment;
+begin
+  try
+    Lock.Acquire;
+    Inc(Current);
+  finally
+    Lock.Release;
+  end;
+end;
+
+constructor TSyncCounter.Create;
+begin
+  Lock := TCriticalSection.Create;
+end;
+
+destructor TSyncCounter.Destroy;
+begin
+  Lock.Free;
+  inherited Destroy;
+end;
+
+procedure TSyncCounter.Assign(Source: TSyncCounter);
+begin
+  Current := Source.Current;
+  Top := Source.Top;
+end;
+
+end.
+
Index: /tags/1.1.0/Packages/Common/UThreading.pas
===================================================================
--- /tags/1.1.0/Packages/Common/UThreading.pas	(revision 137)
+++ /tags/1.1.0/Packages/Common/UThreading.pas	(revision 137)
@@ -0,0 +1,380 @@
+unit UThreading;
+
+{$mode delphi}
+
+interface
+
+uses
+  Classes, SysUtils, Forms, Contnrs, SyncObjs;
+
+type
+  TExceptionEvent = procedure (Sender: TObject; E: Exception) of object;
+  TMethodCall = procedure of object;
+
+
+  { TVirtualThread }
+
+  TVirtualThread = class
+  private
+    function GetFinished: Boolean; virtual; abstract;
+    function GetFreeOnTerminate: Boolean; virtual; abstract;
+    function GetPriority: TThreadPriority; virtual; abstract;
+    function GetSuspended: Boolean; virtual; abstract;
+    function GetTerminated: Boolean; virtual; abstract;
+    function GetThreadId: Integer; virtual; abstract;
+    procedure SetFreeOnTerminate(const AValue: Boolean); virtual; abstract;
+    procedure SetPriority(const AValue: TThreadPriority); virtual; abstract;
+    procedure SetSuspended(const AValue: Boolean); virtual; abstract;
+    procedure SetTerminated(const AValue: Boolean); virtual; abstract;
+  public
+    Name: string;
+    procedure Execute; virtual; abstract;
+    procedure Resume; virtual; abstract;
+    procedure Suspend; virtual; abstract;
+    procedure Start; virtual; abstract;
+    procedure Terminate; virtual; abstract;
+    procedure Synchronize(AMethod: TThreadMethod); virtual; abstract;
+    procedure WaitFor; virtual; abstract;
+    procedure Sleep(Delay: Integer); virtual; abstract;
+    property FreeOnTerminate: Boolean read GetFreeOnTerminate
+      write SetFreeOnTerminate;
+    property Suspended: Boolean read GetSuspended
+      write SetSuspended;
+    property Priority: TThreadPriority read GetPriority write SetPriority;
+    property Terminated: Boolean read GetTerminated write SetTerminated;
+    property Finished: Boolean read GetFinished;
+    property ThreadId: Integer read GetThreadId;
+  end;
+
+  TVirtualThreadClass = class of TVirtualThread;
+
+  TListedThread = class;
+
+  { TListedThreadExecute }
+
+  TListedThreadExecute = class(TThread)
+    Parent: TListedThread;
+    procedure Execute; override;
+  end;
+
+  { TListedThread }
+
+  TListedThread = class(TVirtualThread)
+  private
+    FTerminated: Boolean;
+    FFinished: Boolean;
+    FThread: TListedThreadExecute;
+    function GetFinished: Boolean; override;
+    function GetFreeOnTerminate: Boolean; override;
+    function GetPriority: TThreadPriority; override;
+    function GetSuspended: Boolean; override;
+    function GetTerminated: Boolean; override;
+    function GetThreadId: Integer; override;
+    procedure SetFreeOnTerminate(const AValue: Boolean); override;
+    procedure SetPriority(const AValue: TThreadPriority); override;
+    procedure SetSuspended(const AValue: Boolean); override;
+    procedure SetTerminated(const AValue: Boolean); override;
+  public
+    constructor Create(CreateSuspended: Boolean;
+                       const StackSize: SizeUInt = DefaultStackSize);
+    destructor Destroy; override;
+    procedure Sleep(Delay: Integer); override;
+    procedure Execute; override;
+    procedure Resume; override;
+    procedure Suspend; override;
+    procedure Start; override;
+    procedure Terminate; override;
+    procedure Synchronize(AMethod: TThreadMethod); override;
+    procedure WaitFor; override;
+  end;
+
+  TTermThreadState = (ttsReady, ttsRunning, ttsFinished, ttsExceptionOccured);
+
+  { TTermThread }
+
+  TTermThread = class(TListedThread)
+  private
+    FOnFinished: TNotifyEvent;
+  public
+    State: TTermThreadState;
+    ExceptionMessage: string;
+    Method: TMethodCall;
+    procedure Execute; override;
+    property OnFinished: TNotifyEvent read FOnFinished write FOnFinished;
+  end;
+
+  { TThreadList }
+
+  TThreadList = class(TObjectList)
+    function FindById(Id: Integer): TVirtualThread;
+    constructor Create; virtual;
+  end;
+
+var
+  ThreadList: TThreadList;
+  ThreadListLock: TCriticalSection;
+  OnException: TExceptionEvent;
+
+procedure RunInThread(Method: TMethodCall);
+procedure RunInThreadAsync(Method: TMethodCall; Callback: TNotifyEvent = nil);
+procedure Synchronize(Method: TMethodCall);
+
+resourcestring
+  SCurrentThreadNotFound = 'Current thread ID %d not found in virtual thread list.';
+
+
+implementation
+
+procedure RunInThread(Method: TMethodCall);
+var
+  Thread: TTermThread;
+begin
+  try
+    Thread := TTermThread.Create(True);
+    Thread.FreeOnTerminate := False;
+    Thread.Method := Method;
+    Thread.Resume;
+    while (Thread.State = ttsRunning) or (Thread.State = ttsReady) do begin
+      if MainThreadID = ThreadID then Application.ProcessMessages;
+      Sleep(1);
+    end;
+    if Thread.State = ttsExceptionOccured then
+      raise Exception.Create(Thread.ExceptionMessage);
+  finally
+    Thread.Free;
+  end;
+end;
+
+procedure RunInThreadAsync(Method: TMethodCall; Callback: TNotifyEvent = nil);
+var
+  Thread: TTermThread;
+begin
+  try
+    Thread := TTermThread.Create(True);
+    Thread.FreeOnTerminate := True;
+    Thread.Method := Method;
+    Thread.OnFinished := CallBack;
+    Thread.Resume;
+    //if Thread.State = ttsExceptionOccured then
+    //  raise Exception.Create(Thread.ExceptionMessage);
+  finally
+  end;
+end;
+
+procedure Synchronize(Method: TMethodCall);
+var
+  Thread: TVirtualThread;
+begin
+  if MainThreadID = ThreadID then Method
+  else begin
+    Thread := ThreadList.FindById(ThreadID);
+    if Assigned(Thread) then begin
+      Thread.Synchronize(Method);
+    end else raise Exception.Create(Format(SCurrentThreadNotFound, [ThreadID]));
+  end;
+end;
+
+{ TThreadList }
+
+function TThreadList.FindById(Id: Integer): TVirtualThread;
+var
+  I: Integer;
+begin
+  I := 0;
+  while (I < ThreadList.Count) and (TVirtualThread(ThreadList[I]).ThreadID <> Id) do
+    Inc(I);
+  if I < ThreadList.Count then Result := TVirtualThread(ThreadList[I])
+    else Result := nil;
+end;
+
+constructor TThreadList.Create;
+begin
+  inherited Create;
+end;
+
+{ TListedThreadExecute }
+
+procedure TListedThreadExecute.Execute;
+begin
+  try
+    try
+      Parent.Execute;
+    except
+      on E: Exception do
+        if Assigned(OnException) then
+          OnException(Parent.FThread, E);
+    end;
+  finally
+    Parent.FFinished := True;
+  end;
+end;
+
+{ TListedThread }
+
+function TListedThread.GetFinished: Boolean;
+begin
+  Result := FFinished;
+end;
+
+function TListedThread.GetFreeOnTerminate: Boolean;
+begin
+  Result := FThread.FreeOnTerminate;
+end;
+
+function TListedThread.GetPriority: TThreadPriority;
+begin
+  Result := FThread.Priority;
+end;
+
+function TListedThread.GetSuspended: Boolean;
+begin
+  Result := FThread.Suspended;
+end;
+
+function TListedThread.GetTerminated: Boolean;
+begin
+  Result := FTerminated;
+end;
+
+function TListedThread.GetThreadId: Integer;
+begin
+  Result := FThread.ThreadID;
+end;
+
+procedure TListedThread.SetFreeOnTerminate(const AValue: Boolean);
+begin
+  FThread.FreeOnTerminate := AValue;
+end;
+
+procedure TListedThread.SetPriority(const AValue: TThreadPriority);
+begin
+  FThread.Priority := AValue;
+end;
+
+procedure TListedThread.SetSuspended(const AValue: Boolean);
+begin
+  FThread.Suspended := AValue;
+end;
+
+procedure TListedThread.SetTerminated(const AValue: Boolean);
+begin
+  FTerminated := AValue;
+  if AValue then FThread.Terminate;
+end;
+
+constructor TListedThread.Create(CreateSuspended: Boolean;
+  const StackSize: SizeUInt);
+begin
+  FFinished := False;
+  FTerminated := False;
+
+  FThread := TListedThreadExecute.Create(True, StackSize);
+  FThread.Parent := Self;
+  try
+    ThreadListLock.Acquire;
+    ThreadList.Add(Self);
+  finally
+    ThreadListLock.Release;
+  end;
+  if CreateSuspended = False then FThread.Start;
+end;
+
+destructor TListedThread.Destroy;
+begin
+  if not Suspended then
+  begin
+    Terminate;
+    WaitFor;
+  end;
+  try
+    ThreadListLock.Acquire;
+    ThreadList.Delete(ThreadList.IndexOf(Self));
+  finally
+    ThreadListLock.Release;
+  end;
+  FThread.Free;
+  inherited Destroy;
+end;
+
+procedure TListedThread.Sleep(Delay: Integer);
+const
+  Quantum = 20;
+var
+  I: Integer;
+begin
+  if Terminated then Exit;
+  SysUtils.Sleep(Delay mod Quantum);
+  for I := 1 to (Delay div Quantum) do begin
+    if Terminated then Break;
+    SysUtils.Sleep(Quantum);
+  end;
+end;
+
+procedure TListedThread.Execute;
+begin
+end;
+
+procedure TListedThread.Resume;
+begin
+  FThread.Resume;
+end;
+
+procedure TListedThread.Suspend;
+begin
+  FThread.Suspend;
+end;
+
+procedure TListedThread.Start;
+begin
+  FThread.Start;
+end;
+
+procedure TListedThread.Terminate;
+begin
+  FTerminated := True;
+  FThread.Terminate;
+end;
+
+procedure TListedThread.Synchronize(AMethod: TThreadMethod);
+begin
+  FThread.Synchronize(FThread, AMethod);
+end;
+
+procedure TListedThread.WaitFor;
+begin
+  FThread.WaitFor;
+end;
+
+{ TTermThread }
+
+procedure TTermThread.Execute;
+begin
+  try
+    State := ttsRunning;
+    Method;
+    State := ttsFinished;
+    if Assigned(FOnFinished) then
+      FOnFinished(Self);
+  except
+    on E: Exception do begin
+      ExceptionMessage := E.Message;
+      State := ttsExceptionOccured;
+      if Assigned(OnException) then
+        OnException(FThread, E);
+    end;
+  end;
+end;
+
+initialization
+
+ThreadListLock := TCriticalSection.Create;
+ThreadList := TThreadList.Create;
+ThreadList.OwnsObjects := False;
+
+finalization
+
+ThreadList.Free;
+ThreadListLock.Free;
+
+end.
+
Index: /tags/1.1.0/Packages/Common/UURI.pas
===================================================================
--- /tags/1.1.0/Packages/Common/UURI.pas	(revision 137)
+++ /tags/1.1.0/Packages/Common/UURI.pas	(revision 137)
@@ -0,0 +1,354 @@
+unit UURI;
+
+// Date: 2011-04-04
+
+{$mode delphi}
+
+interface
+
+uses
+  Classes, SysUtils;
+
+const
+  URIPathSeparator = '/';
+
+type
+
+  { TPath }
+
+  TPath = class
+  private
+    function GetAsString: string;
+    procedure SetAsString(AValue: string);
+  public
+    Items: TStringList;
+    IsAbsolute: Boolean;
+    DirSeparator: string;
+    procedure Assign(Source: TPath);
+    constructor Create;
+    destructor Destroy; override;
+    property AsString: string read GetAsString write SetAsString;
+  end;
+
+  { TFileName }
+
+  TFileNamePart = (fnpDrive, fnpDirectory, fnpName, fnpExtension);
+  TFileNameParts = set of TFileNamePart;
+
+  TFileName = class
+  private
+  public
+    Drive: string;
+    Directory: TPath;
+    Name: string;
+    Extension: string;
+    function Combine(Parts: TFileNameParts = [fnpDrive, fnpDirectory, fnpName, fnpExtension]): string;
+    procedure Parse(AValue: string);
+    procedure Assign(Source: TFileName);
+    constructor Create;
+    destructor Destroy; override;
+  end;
+
+  { TURI }
+
+  TURI = class(TPersistent)
+  private
+    function GetAsString: string;
+    procedure SetAsString(Value: string);
+  public
+    Scheme: string;
+    Authority: string;
+    Path: TFileName;
+    Query: string;
+    Fragment: string;
+    constructor Create;
+    procedure Clear;
+    destructor Destroy; override;
+    procedure Assign(Source: TPersistent); override;
+    property AsString: string read GetAsString write SetAsString;
+  end;
+
+  { TURL }
+
+  TURL = class(TURI)
+  private
+    function GetAsString: string;
+    procedure SetAsString(Value: string);
+  public
+    UserName: string;
+    Password: string;
+    Host: string;
+    Port: Word;
+    constructor Create;
+    destructor Destroy; override;
+    property AsString: string read GetAsString write SetAsString;
+  end;
+
+implementation
+
+function LeftCutString(var Source: string; out Output: string; Delimiter: string; Allowed: string = ''): Boolean;
+var
+  I, J: Integer;
+  Matched: Boolean;
+begin
+  I := 1;
+  Matched := True;
+  while (I < Length(Source)) and Matched do begin
+    Matched := True;
+    if (Source[I] = Delimiter) then Matched := False;
+    //for J := 1 to Length(Allowed) do
+    //  if Source[I] = Allowed[J] then Matched := True;
+    if Matched then Inc(I);
+  end;
+  if (Delimiter = Copy(Source, I, Length(Delimiter))) or (I = Length(Source)) then begin
+    Output := Copy(Source, 1, I - 1);
+    Delete(Source, 1, Length(Output) + Length(Delimiter));
+    Result := True;
+  end else begin
+    Output := '';
+    Result := False;
+  end;
+end;
+
+function RightCutString(var Source: string; out Output: string; Delimiter: string; Allowed: string = ''): Boolean;
+var
+  I, J: Integer;
+  Matched: Boolean;
+begin
+  I := Length(Source);
+  Matched := True;
+  while (I > 0) and Matched do begin
+    Matched := True;
+    if (Source[I] = Delimiter) then Matched := False;
+    //for J := 1 to Length(Allowed) do
+    //  if Source[I] = Allowed[J] then Matched := True;
+    if Matched then Dec(I);
+  end;
+  if (Delimiter = Copy(Source, I - Length(Delimiter) + 1, Length(Delimiter))) or (I = 0) then begin
+    Output := Copy(Source, I + 1, Length(Source) - I);
+    Delete(Source, I, Length(Output) + Length(Delimiter));
+    Result := True;
+  end else begin
+    Output := '';
+    Result := False;
+  end;
+end;
+
+{ TPath }
+
+function TPath.GetAsString: string;
+var
+  I: Integer;
+begin
+  if IsAbsolute then Result := DirSeparator
+    else Result := '';
+  for I := 0 to Items.Count - 1 do
+    Result := Result + Items[I] + DirSeparator;
+end;
+
+procedure TPath.SetAsString(AValue: string);
+var
+  Name: string;
+begin
+  Items.Clear;
+  if Length(AValue) > 0 then begin
+    if AValue[1] = DirSeparator then begin
+      IsAbsolute := True;
+      Delete(AValue, 1, 1);
+    end else IsAbsolute := False;
+    while Pos(DirSeparator, AValue) > 0 do begin
+      Name := Copy(AValue, 1, Pos(DirSeparator, AValue) - 1);
+      Delete(AValue, 1, Pos(DirSeparator, AValue));
+      Items.Add(Name);
+    end;
+    if Length(AValue) > 0 then
+      Items.Add(AValue);
+  end else IsAbsolute := False;
+end;
+
+procedure TPath.Assign(Source: TPath);
+begin
+  IsAbsolute := Source.IsAbsolute;
+  Items.Assign(Source.Items);
+  DirSeparator := Source.DirSeparator;
+end;
+
+constructor TPath.Create;
+begin
+  Items := TStringList.Create;
+  DirSeparator := DirectorySeparator;
+end;
+
+destructor TPath.Destroy;
+begin
+  Items.Free;
+  inherited Destroy;
+end;
+
+{ TURI }
+
+function TURI.GetAsString: string;
+begin
+  Result := '';
+  if Scheme <> '' then Result := Scheme + ':';
+  if Path.Combine <> '' then begin
+    Result := Result + '//' + Authority;
+    if Scheme = 'file' then Result := Result + URIPathSeparator;
+    Result := Result + Path.Combine;
+  end;
+  if Query <> '' then Result := Result + '?' + Query;
+  if Fragment <> '' then Result := Result + '#' + Fragment;
+end;
+
+procedure TURI.SetAsString(Value: string);
+var
+  HostAddr: string;
+  HostPort: string;
+begin
+  LeftCutString(Value, Scheme, ':');
+  if Copy(Value, 1, 2) = '//' then begin
+    Value := Copy(Value, 3, Length(Value));
+    LeftCutString(Value, Authority, URIPathSeparator);
+  end;
+  RightCutString(Value, Fragment, '#');
+  RightCutString(Value, Query, '?', '=&');
+  //if Scheme = 'file' then Delete(Value, 1, 1); // Remove beginning slash
+  Path.Parse(Value);
+end;
+
+constructor TURI.Create;
+begin
+  Path := TFileName.Create;
+  Path.Directory.DirSeparator := URIPathSeparator;
+end;
+
+procedure TURI.Clear;
+begin
+  Scheme := '';
+  Authority := '';
+  Path.Parse('');
+  Fragment := '';
+  Query := '';
+end;
+
+destructor TURI.Destroy;
+begin
+  Path.Free;
+  inherited Destroy;
+end;
+
+procedure TURI.Assign(Source: TPersistent);
+begin
+  if Source is TURI then begin
+    Scheme := TURI(Source).Scheme;
+    Authority := TURI(Source).Authority;
+    Path.Assign(TURI(Source).Path);
+    Fragment := TURI(Source).Fragment;
+    Query := TURI(Source).Query;
+  end else inherited Assign(Source);
+end;
+
+{ TURL }
+
+function TURL.GetAsString: string;
+begin
+  Result := '';
+  if Scheme <> '' then Result := Scheme + '://';
+  if UserName <> '' then begin
+    Result := Result + UserName;
+    if UserName <> '' then Result := Result + ':' + Password;
+    Result := Result + '@';
+  end;
+  if Host <> '' then Result := Result + Host;
+  if Port <> 0 then Result := Result + ':' + IntToStr(Port);
+  if Path.Combine <> '' then Result := Result + Path.Combine;
+  if Query <> '' then Result := Result + '?' + Query;
+  if Fragment <> '' then Result := Result + '#' + Fragment;
+end;
+
+procedure TURL.SetAsString(Value: string);
+var
+  HostAddr: string;
+  HostPort: string;
+  TempPath: string;
+begin
+  LeftCutString(Value, Scheme, '://');
+  if LeftCutString(Value, UserName, ':') then LeftCutString(Value, Password, '@')
+    else LeftCutString(Value, UserName, '@');
+  RightCutString(Value, Fragment, '#');
+  RightCutString(Value, Query, '?', '=&');
+  if LeftCutString(Value, HostAddr, ':', '.') then begin
+    LeftCutString(Value, HostPort, '');
+    Port := StrToInt(HostPort);
+  end else LeftCutString(Value, HostAddr, '', '.');
+  Host := HostAddr;
+  LeftCutString(Value, TempPath, '', URIPathSeparator + '.');
+  Path.Parse(TempPath);
+end;
+
+constructor TURL.Create;
+begin
+
+end;
+
+destructor TURL.Destroy;
+begin
+  inherited Destroy;
+end;
+
+{ TFileName }
+
+function TFileName.Combine(Parts: TFileNameParts): string;
+begin
+  Result := '';
+  if (fnpDrive in Parts) and (Drive <> '') then Result := Result + Drive;
+  if (fnpDirectory in Parts) and (Directory.AsString <> '') then
+    Result := Result + Directory.AsString;
+  if (fnpName in Parts) then Result := Result + Name;
+  if (fnpExtension in Parts) and (Extension <> '') then
+    Result := Result + Extension;
+end;
+
+procedure TFileName.Parse(AValue: string);
+begin
+  if Pos(ExtensionSeparator, AValue) > 0 then begin
+    RightCutString(AValue, Extension, ExtensionSeparator);
+    Extension := ExtensionSeparator + Extension;
+  end else Extension := '';
+  if Pos(Directory.DirSeparator, AValue) > 0 then
+    RightCutString(AValue, Name, Directory.DirSeparator)
+    else begin
+      Name := AValue;
+      AValue := '';
+    end;
+  if Pos(DriveSeparator, AValue) > 0 then begin
+    LeftCutString(AValue, Drive, DriveSeparator);
+    Drive := Drive + DriveSeparator;
+  end else Drive := '';
+  if (Drive <> '') and (AValue = '') then
+    Directory.AsString := Directory.DirSeparator
+    else Directory.AsString := AValue;
+end;
+
+procedure TFileName.Assign(Source: TFileName);
+begin
+  Name := Source.Name;
+  Extension := Source.Extension;
+  Drive := Source.Drive;
+  Directory.Assign(Source.Directory);
+end;
+
+constructor TFileName.Create;
+begin
+  Directory := TPath.Create;
+end;
+
+destructor TFileName.Destroy;
+begin
+  Directory.Free;
+  inherited Destroy;
+end;
+
+
+end.
+
Index: /tags/1.1.0/Packages/Common/UXMLUtils.pas
===================================================================
--- /tags/1.1.0/Packages/Common/UXMLUtils.pas	(revision 137)
+++ /tags/1.1.0/Packages/Common/UXMLUtils.pas	(revision 137)
@@ -0,0 +1,234 @@
+unit UXMLUtils;
+
+{$mode delphi}
+
+interface
+
+uses
+  {$IFDEF WINDOWS}Windows,{$ENDIF}
+  Classes, SysUtils, DateUtils, XMLRead, XMLWrite, DOM;
+
+function XMLTimeToDateTime(XMLDateTime: string): TDateTime;
+function DateTimeToXMLTime(Value: TDateTime; ApplyLocalBias: Boolean = True): WideString;
+procedure WriteInteger(Node: TDOMNode; Name: string; Value: Integer);
+procedure WriteInt64(Node: TDOMNode; Name: string; Value: Int64);
+procedure WriteBoolean(Node: TDOMNode; Name: string; Value: Boolean);
+procedure WriteString(Node: TDOMNode; Name: string; Value: string);
+procedure WriteDateTime(Node: TDOMNode; Name: string; Value: TDateTime);
+function ReadInteger(Node: TDOMNode; Name: string; DefaultValue: Integer): Integer;
+function ReadInt64(Node: TDOMNode; Name: string; DefaultValue: Int64): Int64;
+function ReadBoolean(Node: TDOMNode; Name: string; DefaultValue: Boolean): Boolean;
+function ReadString(Node: TDOMNode; Name: string; DefaultValue: string): string;
+function ReadDateTime(Node: TDOMNode; Name: string; DefaultValue: TDateTime): TDateTime;
+
+
+implementation
+
+function GetTimeZoneBias: Integer;
+{$IFDEF WINDOWS}
+var
+  TimeZoneInfo: TTimeZoneInformation;
+begin
+  case GetTimeZoneInformation(TimeZoneInfo) of
+  TIME_ZONE_ID_STANDARD: Result := TimeZoneInfo.Bias + TimeZoneInfo.StandardBias;
+  TIME_ZONE_ID_DAYLIGHT: Result := TimeZoneInfo.Bias + TimeZoneInfo.DaylightBias;
+  else
+    Result := 0;
+  end;
+end;
+{$ELSE}
+begin
+  Result := 0;
+end;
+{$ENDIF}
+
+function LeftCutString(var Source: string; out Output: string; Delimiter: string; Allowed: string = ''): Boolean;
+var
+  I, J: Integer;
+  Matched: Boolean;
+begin
+  I := 1;
+  Matched := True;
+  while (I < Length(Source)) and Matched do begin
+    Matched := True;
+    if (Source[I] = Delimiter) then Matched := False;
+    //for J := 1 to Length(Allowed) do
+    //  if Source[I] = Allowed[J] then Matched := True;
+    if Matched then Inc(I);
+  end;
+  if (Delimiter = Copy(Source, I, Length(Delimiter))) or (I = Length(Source)) then begin
+    Output := Copy(Source, 1, I - 1);
+    Delete(Source, 1, Length(Output) + Length(Delimiter));
+    Result := True;
+  end else begin
+    Output := '';
+    Result := False;
+  end;
+end;
+
+function XMLTimeToDateTime(XMLDateTime: string): TDateTime;
+var
+  Part: string;
+  Year: Integer;
+  Month: Integer;
+  Day: Integer;
+  Hour: Integer;
+  Minute: Integer;
+  Second: Integer;
+  SecondFraction: Double;
+  Millisecond: Integer;
+begin
+  if LeftCutString(XMLDateTime, Part, '-') then
+    Year := StrToInt(Part);
+  if LeftCutString(XMLDateTime, Part, '-') then
+    Month := StrToInt(Part);
+  if Pos('T', XMLDateTime) > 0 then begin
+    if LeftCutString(XMLDateTime, Part, 'T') then
+      Day := StrToInt(Part);
+    if LeftCutString(XMLDateTime, Part, ':') then
+      Hour := StrToInt(Part);
+    if LeftCutString(XMLDateTime, Part, ':') then
+      Minute := StrToInt(Part);
+    if Pos('.', XMLDateTime) > 0 then begin
+      if LeftCutString(XMLDateTime, Part, '.') then
+        Second := StrToInt(Part);
+      if Pos('+', XMLDateTime) > 0 then
+        LeftCutString(XMLDateTime, Part, '+') else
+      if Pos('-', XMLDateTime) > 0 then
+        LeftCutString(XMLDateTime, Part, '-') else
+      if Pos('Z', XMLDateTime) > 0 then
+        LeftCutString(XMLDateTime, Part, 'Z');
+      SecondFraction := StrToFloat('0' + DecimalSeparator + Part);
+      Millisecond := Trunc(SecondFraction * 1000);
+    end else begin
+      if Pos('+', XMLDateTime) > 0 then
+        LeftCutString(XMLDateTime, Part, '+') else
+      if Pos('-', XMLDateTime) > 0 then
+        LeftCutString(XMLDateTime, Part, '-') else
+      if Pos('Z', XMLDateTime) > 0 then
+        LeftCutString(XMLDateTime, Part, 'Z');
+      Second := StrToInt(Part);
+      Millisecond := 0;
+    end;
+  end else begin
+    Day := StrToInt(XMLDateTime);
+  end;
+  Result := EncodeDateTime(Year, Month, Day, Hour, Minute, Second, Millisecond);
+  // TODO: Correct time by zone bias
+end;
+
+function DateTimeToXMLTime(Value: TDateTime; ApplyLocalBias: Boolean = True): WideString;
+const
+  Neg: array[Boolean] of string =  ('+', '-');
+var
+  Bias: Integer;
+begin
+  Result := FormatDateTime('yyyy''-''mm''-''dd''T''hh'':''nn'':''ss''.''zzz', Value); { Do not localize }
+  Bias := GetTimeZoneBias;
+  if (Bias <> 0) and ApplyLocalBias then
+  begin
+    Result := Format('%s%s%.2d:%.2d', [Result, Neg[Bias > 0],                         { Do not localize }
+                                       Abs(Bias) div MinsPerHour,
+                                       Abs(Bias) mod MinsPerHour]);
+  end else
+    Result := Result + 'Z'; { Do not localize }
+end;
+
+procedure WriteInteger(Node: TDOMNode; Name: string; Value: Integer);
+var
+  NewNode: TDOMNode;
+begin
+  NewNode := Node.OwnerDocument.CreateElement(Name);
+  NewNode.TextContent := IntToStr(Value);
+  Node.AppendChild(NewNode);
+end;
+
+procedure WriteInt64(Node: TDOMNode; Name: string; Value: Int64);
+var
+  NewNode: TDOMNode;
+begin
+  NewNode := Node.OwnerDocument.CreateElement(Name);
+  NewNode.TextContent := IntToStr(Value);
+  Node.AppendChild(NewNode);
+end;
+
+procedure WriteBoolean(Node: TDOMNode; Name: string; Value: Boolean);
+var
+  NewNode: TDOMNode;
+begin
+  NewNode := Node.OwnerDocument.CreateElement(Name);
+  NewNode.TextContent := BoolToStr(Value);
+  Node.AppendChild(NewNode);
+end;
+
+procedure WriteString(Node: TDOMNode; Name: string; Value: string);
+var
+  NewNode: TDOMNode;
+begin
+  NewNode := Node.OwnerDocument.CreateElement(Name);
+  NewNode.TextContent := Value;
+  Node.AppendChild(NewNode);
+end;
+
+procedure WriteDateTime(Node: TDOMNode; Name: string; Value: TDateTime);
+var
+  NewNode: TDOMNode;
+begin
+  NewNode := Node.OwnerDocument.CreateElement(Name);
+  NewNode.TextContent := DateTimeToXMLTime(Value);
+  Node.AppendChild(NewNode);
+end;
+
+function ReadInteger(Node: TDOMNode; Name: string; DefaultValue: Integer): Integer;
+var
+  NewNode: TDOMNode;
+begin
+  Result := DefaultValue;
+  NewNode := Node.FindNode(Name);
+  if Assigned(NewNode) then
+    Result := StrToInt(NewNode.TextContent);
+end;
+
+function ReadInt64(Node: TDOMNode; Name: string; DefaultValue: Int64): Int64;
+var
+  NewNode: TDOMNode;
+begin
+  Result := DefaultValue;
+  NewNode := Node.FindNode(Name);
+  if Assigned(NewNode) then
+    Result := StrToInt64(NewNode.TextContent);
+end;
+
+function ReadBoolean(Node: TDOMNode; Name: string; DefaultValue: Boolean): Boolean;
+var
+  NewNode: TDOMNode;
+begin
+  Result := DefaultValue;
+  NewNode := Node.FindNode(Name);
+  if Assigned(NewNode) then
+    Result := StrToBool(NewNode.TextContent);
+end;
+
+function ReadString(Node: TDOMNode; Name: string; DefaultValue: string): string;
+var
+  NewNode: TDOMNode;
+begin
+  Result := DefaultValue;
+  NewNode := Node.FindNode(Name);
+  if Assigned(NewNode) then
+    Result := NewNode.TextContent;
+end;
+
+function ReadDateTime(Node: TDOMNode; Name: string; DefaultValue: TDateTime
+  ): TDateTime;
+var
+  NewNode: TDOMNode;
+begin
+  Result := DefaultValue;
+  NewNode := Node.FindNode(Name);
+  if Assigned(NewNode) then
+    Result := XMLTimeToDateTime(NewNode.TextContent);
+end;
+
+end.
+
Index: /tags/1.1.0/Packages/CoolTranslator/CoolTranslator.lpk
===================================================================
--- /tags/1.1.0/Packages/CoolTranslator/CoolTranslator.lpk	(revision 137)
+++ /tags/1.1.0/Packages/CoolTranslator/CoolTranslator.lpk	(revision 137)
@@ -0,0 +1,57 @@
+<?xml version="1.0"?>
+<CONFIG>
+  <Package Version="4">
+    <PathDelim Value="\"/>
+    <Name Value="CoolTranslator"/>
+    <AddToProjectUsesSection Value="True"/>
+    <Author Value="Chronos (robie@centrum.cz)"/>
+    <CompilerOptions>
+      <Version Value="10"/>
+      <PathDelim Value="\"/>
+      <SearchPaths>
+        <UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/>
+      </SearchPaths>
+      <Other>
+        <CompilerPath Value="$(CompPath)"/>
+      </Other>
+    </CompilerOptions>
+    <Description Value="Application interface translator tool"/>
+    <License Value="GNU/GPL"/>
+    <Version Minor="1"/>
+    <Files Count="3">
+      <Item1>
+        <Filename Value="UCoolTranslator.pas"/>
+        <HasRegisterProc Value="True"/>
+        <UnitName Value="UCoolTranslator"/>
+      </Item1>
+      <Item2>
+        <Filename Value="ULanguages.pas"/>
+        <UnitName Value="ULanguages"/>
+      </Item2>
+      <Item3>
+        <Filename Value="ReadMe.txt"/>
+        <Type Value="Text"/>
+      </Item3>
+    </Files>
+    <i18n>
+      <EnableI18N Value="True"/>
+      <OutDir Value="Languages"/>
+    </i18n>
+    <Type Value="RunAndDesignTime"/>
+    <RequiredPkgs Count="2">
+      <Item1>
+        <PackageName Value="LCL"/>
+      </Item1>
+      <Item2>
+        <PackageName Value="FCL"/>
+        <MinVersion Major="1" Valid="True"/>
+      </Item2>
+    </RequiredPkgs>
+    <UsageOptions>
+      <UnitPath Value="$(PkgOutDir)"/>
+    </UsageOptions>
+    <PublishOptions>
+      <Version Value="2"/>
+    </PublishOptions>
+  </Package>
+</CONFIG>
Index: /tags/1.1.0/Packages/CoolTranslator/CoolTranslator.pas
===================================================================
--- /tags/1.1.0/Packages/CoolTranslator/CoolTranslator.pas	(revision 137)
+++ /tags/1.1.0/Packages/CoolTranslator/CoolTranslator.pas	(revision 137)
@@ -0,0 +1,21 @@
+{ This file was automatically created by Lazarus. Do not edit!
+  This source is only used to compile and install the package.
+ }
+
+unit CoolTranslator; 
+
+interface
+
+uses
+  UCoolTranslator, ULanguages, LazarusPackageIntf;
+
+implementation
+
+procedure Register; 
+begin
+  RegisterUnit('UCoolTranslator', @UCoolTranslator.Register); 
+end; 
+
+initialization
+  RegisterPackage('CoolTranslator', @Register); 
+end.
Index: /tags/1.1.0/Packages/CoolTranslator/Demo/Languages/TranslatorDemo.cs.po
===================================================================
--- /tags/1.1.0/Packages/CoolTranslator/Demo/Languages/TranslatorDemo.cs.po	(revision 137)
+++ /tags/1.1.0/Packages/CoolTranslator/Demo/Languages/TranslatorDemo.cs.po	(revision 137)
@@ -0,0 +1,45 @@
+msgid ""
+msgstr ""
+"Content-Type: text/plain; charset=UTF-8\n"
+"Project-Id-Version: \n"
+"POT-Creation-Date: \n"
+"PO-Revision-Date: \n"
+"Last-Translator: Jiří Hajda <software@mezservis.cz>\n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: tform1.form1.caption
+msgctxt "TFORM1.FORM1.CAPTION"
+msgid "Translator Demo"
+msgstr "Ukázka Translatoru"
+
+#: tmainform.button1.caption
+msgid "Show MainForm.Name"
+msgstr "Ukázat MainForm.Name"
+
+#: tmainform.caption
+msgctxt "TMAINFORM.CAPTION"
+msgid "Translator Demo"
+msgstr "Ukázka Translatoru"
+
+#: tmainform.label1.caption
+msgid "MainForm"
+msgstr "HlavníFormulář"
+
+#: tmainform.label2.caption
+msgid "Form name as label caption:"
+msgstr "Jméno formuláře jako titulek textu:"
+
+#: tmainform.label3.caption
+msgid "Language list:"
+msgstr ""
+
+#: tmainform.label4.caption
+msgid "Excludes:"
+msgstr ""
+
+#: umainform.stranslatedtext
+msgid "Text stored in resourcestring"
+msgstr "TExt uložený jako zdrojový řetězec"
+
Index: /tags/1.1.0/Packages/CoolTranslator/Demo/Languages/TranslatorDemo.de.po
===================================================================
--- /tags/1.1.0/Packages/CoolTranslator/Demo/Languages/TranslatorDemo.de.po	(revision 137)
+++ /tags/1.1.0/Packages/CoolTranslator/Demo/Languages/TranslatorDemo.de.po	(revision 137)
@@ -0,0 +1,37 @@
+msgid ""
+msgstr "Content-Type: text/plain; charset=UTF-8"
+
+#: tform1.form1.caption
+msgctxt "TFORM1.FORM1.CAPTION"
+msgid "Translator Demo"
+msgstr ""
+
+#: tmainform.button1.caption
+msgid "Show MainForm.Name"
+msgstr ""
+
+#: tmainform.caption
+msgctxt "TMAINFORM.CAPTION"
+msgid "Translator Demo"
+msgstr ""
+
+#: tmainform.label1.caption
+msgid "MainForm"
+msgstr ""
+
+#: tmainform.label2.caption
+msgid "Form name as label caption:"
+msgstr ""
+
+#: tmainform.label3.caption
+msgid "Language list:"
+msgstr ""
+
+#: tmainform.label4.caption
+msgid "Excludes:"
+msgstr ""
+
+#: umainform.stranslatedtext
+msgid "Text stored in resourcestring"
+msgstr ""
+
Index: /tags/1.1.0/Packages/CoolTranslator/Demo/Languages/TranslatorDemo.po
===================================================================
--- /tags/1.1.0/Packages/CoolTranslator/Demo/Languages/TranslatorDemo.po	(revision 137)
+++ /tags/1.1.0/Packages/CoolTranslator/Demo/Languages/TranslatorDemo.po	(revision 137)
@@ -0,0 +1,37 @@
+msgid ""
+msgstr "Content-Type: text/plain; charset=UTF-8"
+
+#: tform1.form1.caption
+msgctxt "TFORM1.FORM1.CAPTION"
+msgid "Translator Demo"
+msgstr ""
+
+#: tmainform.button1.caption
+msgid "Show MainForm.Name"
+msgstr ""
+
+#: tmainform.caption
+msgctxt "TMAINFORM.CAPTION"
+msgid "Translator Demo"
+msgstr ""
+
+#: tmainform.label1.caption
+msgid "MainForm"
+msgstr ""
+
+#: tmainform.label2.caption
+msgid "Form name as label caption:"
+msgstr ""
+
+#: tmainform.label3.caption
+msgid "Language list:"
+msgstr ""
+
+#: tmainform.label4.caption
+msgid "Excludes:"
+msgstr ""
+
+#: umainform.stranslatedtext
+msgid "Text stored in resourcestring"
+msgstr ""
+
Index: /tags/1.1.0/Packages/CoolTranslator/Demo/TranslatorDemo.lpi
===================================================================
--- /tags/1.1.0/Packages/CoolTranslator/Demo/TranslatorDemo.lpi	(revision 137)
+++ /tags/1.1.0/Packages/CoolTranslator/Demo/TranslatorDemo.lpi	(revision 137)
@@ -0,0 +1,305 @@
+<?xml version="1.0"?>
+<CONFIG>
+  <ProjectOptions>
+    <Version Value="9"/>
+    <PathDelim Value="\"/>
+    <General>
+      <MainUnit Value="0"/>
+      <ResourceType Value="res"/>
+      <UseXPManifest Value="True"/>
+      <Icon Value="0"/>
+      <ActiveWindowIndexAtStart Value="0"/>
+    </General>
+    <i18n>
+      <EnableI18N Value="True"/>
+      <OutDir Value="Languages"/>
+    </i18n>
+    <VersionInfo>
+      <StringTable ProductVersion=""/>
+    </VersionInfo>
+    <BuildModes Count="1" Active="Default">
+      <Item1 Name="Default" Default="True"/>
+    </BuildModes>
+    <PublishOptions>
+      <Version Value="2"/>
+      <IncludeFileFilter Value="*.(pas|pp|inc|lfm|lpr|lrs|lpi|lpk|sh|xml)"/>
+      <ExcludeFileFilter Value="*.(bak|ppu|o|so);*~;backup"/>
+    </PublishOptions>
+    <RunParams>
+      <local>
+        <FormatVersion Value="1"/>
+      </local>
+    </RunParams>
+    <RequiredPackages Count="2">
+      <Item1>
+        <PackageName Value="CoolTranslator"/>
+        <MinVersion Minor="1" Valid="True"/>
+      </Item1>
+      <Item2>
+        <PackageName Value="LCL"/>
+      </Item2>
+    </RequiredPackages>
+    <Units Count="12">
+      <Unit0>
+        <Filename Value="TranslatorDemo.lpr"/>
+        <IsPartOfProject Value="True"/>
+        <UnitName Value="TranslatorDemo"/>
+        <UsageCount Value="21"/>
+      </Unit0>
+      <Unit1>
+        <Filename Value="UMainForm.pas"/>
+        <IsPartOfProject Value="True"/>
+        <ComponentName Value="MainForm"/>
+        <HasResources Value="True"/>
+        <ResourceBaseClass Value="Form"/>
+        <UnitName Value="UMainForm"/>
+        <IsVisibleTab Value="True"/>
+        <EditorIndex Value="0"/>
+        <WindowIndex Value="0"/>
+        <TopLine Value="1"/>
+        <CursorPos X="29" Y="18"/>
+        <UsageCount Value="21"/>
+        <Loaded Value="True"/>
+        <LoadedDesigner Value="True"/>
+      </Unit1>
+      <Unit2>
+        <Filename Value="E:\Projekty2\FreePascalManager\trunk\Instance\5\Lazarus\lcl\stdctrls.pp"/>
+        <UnitName Value="StdCtrls"/>
+        <WindowIndex Value="0"/>
+        <TopLine Value="565"/>
+        <CursorPos X="24" Y="577"/>
+        <UsageCount Value="11"/>
+      </Unit2>
+      <Unit3>
+        <Filename Value="E:\Projekty2\FreePascalManager\trunk\Instance\5\FPC\rtl\objpas\classes\classesh.inc"/>
+        <WindowIndex Value="0"/>
+        <TopLine Value="686"/>
+        <CursorPos X="3" Y="659"/>
+        <UsageCount Value="11"/>
+      </Unit3>
+      <Unit4>
+        <Filename Value="..\UCoolTranslator.pas"/>
+        <UnitName Value="UCoolTranslator"/>
+        <EditorIndex Value="1"/>
+        <WindowIndex Value="0"/>
+        <TopLine Value="274"/>
+        <CursorPos X="33" Y="288"/>
+        <UsageCount Value="11"/>
+        <Loaded Value="True"/>
+      </Unit4>
+      <Unit5>
+        <Filename Value="E:\Projekty2\FreePascalManager\trunk\Instance\5\Lazarus\lcl\include\customlistbox.inc"/>
+        <WindowIndex Value="0"/>
+        <TopLine Value="524"/>
+        <CursorPos X="1" Y="535"/>
+        <UsageCount Value="10"/>
+      </Unit5>
+      <Unit6>
+        <Filename Value="E:\Projekty2\FreePascalManager\trunk\Instance\5\Lazarus\lcl\interfaces\win32\win32listsl.inc"/>
+        <WindowIndex Value="0"/>
+        <TopLine Value="226"/>
+        <CursorPos X="1" Y="238"/>
+        <UsageCount Value="10"/>
+      </Unit6>
+      <Unit7>
+        <Filename Value="E:\Projekty2\FreePascalManager\trunk\Instance\5\Lazarus\lcl\include\winfileutil.inc"/>
+        <WindowIndex Value="0"/>
+        <TopLine Value="549"/>
+        <CursorPos X="1" Y="566"/>
+        <UsageCount Value="10"/>
+      </Unit7>
+      <Unit8>
+        <Filename Value="E:\Projekty2\FreePascalManager\trunk\Instance\5\Lazarus\lcl\translations.pas"/>
+        <UnitName Value="Translations"/>
+        <WindowIndex Value="0"/>
+        <TopLine Value="747"/>
+        <CursorPos X="54" Y="759"/>
+        <UsageCount Value="10"/>
+      </Unit8>
+      <Unit9>
+        <Filename Value="E:\Projekty2\FreePascalManager\trunk\Instance\5\Lazarus\lcl\include\control.inc"/>
+        <WindowIndex Value="0"/>
+        <TopLine Value="2702"/>
+        <CursorPos X="18" Y="2717"/>
+        <UsageCount Value="10"/>
+      </Unit9>
+      <Unit10>
+        <Filename Value="E:\Projekty2\FreePascalManager\trunk\Instance\5\FPC\rtl\inc\objpash.inc"/>
+        <WindowIndex Value="0"/>
+        <TopLine Value="189"/>
+        <CursorPos X="26" Y="201"/>
+        <UsageCount Value="10"/>
+      </Unit10>
+      <Unit11>
+        <Filename Value="..\ULanguages.pas"/>
+        <UnitName Value="ULanguages"/>
+        <EditorIndex Value="2"/>
+        <WindowIndex Value="0"/>
+        <TopLine Value="1"/>
+        <CursorPos X="32" Y="10"/>
+        <UsageCount Value="10"/>
+        <Loaded Value="True"/>
+      </Unit11>
+    </Units>
+    <JumpHistory Count="30" HistoryIndex="29">
+      <Position1>
+        <Filename Value="..\UCoolTranslator.pas"/>
+        <Caret Line="37" Column="48" TopLine="23"/>
+      </Position1>
+      <Position2>
+        <Filename Value="..\UCoolTranslator.pas"/>
+        <Caret Line="106" Column="17" TopLine="103"/>
+      </Position2>
+      <Position3>
+        <Filename Value="..\UCoolTranslator.pas"/>
+        <Caret Line="110" Column="52" TopLine="103"/>
+      </Position3>
+      <Position4>
+        <Filename Value="UMainForm.pas"/>
+        <Caret Line="56" Column="1" TopLine="36"/>
+      </Position4>
+      <Position5>
+        <Filename Value="UMainForm.pas"/>
+        <Caret Line="57" Column="1" TopLine="37"/>
+      </Position5>
+      <Position6>
+        <Filename Value="UMainForm.pas"/>
+        <Caret Line="58" Column="1" TopLine="38"/>
+      </Position6>
+      <Position7>
+        <Filename Value="UMainForm.pas"/>
+        <Caret Line="48" Column="45" TopLine="39"/>
+      </Position7>
+      <Position8>
+        <Filename Value="..\UCoolTranslator.pas"/>
+        <Caret Line="110" Column="65" TopLine="103"/>
+      </Position8>
+      <Position9>
+        <Filename Value="..\UCoolTranslator.pas"/>
+        <Caret Line="240" Column="56" TopLine="231"/>
+      </Position9>
+      <Position10>
+        <Filename Value="..\UCoolTranslator.pas"/>
+        <Caret Line="248" Column="23" TopLine="231"/>
+      </Position10>
+      <Position11>
+        <Filename Value="..\UCoolTranslator.pas"/>
+        <Caret Line="241" Column="45" TopLine="231"/>
+      </Position11>
+      <Position12>
+        <Filename Value="..\UCoolTranslator.pas"/>
+        <Caret Line="240" Column="53" TopLine="228"/>
+      </Position12>
+      <Position13>
+        <Filename Value="..\UCoolTranslator.pas"/>
+        <Caret Line="249" Column="25" TopLine="228"/>
+      </Position13>
+      <Position14>
+        <Filename Value="..\UCoolTranslator.pas"/>
+        <Caret Line="241" Column="1" TopLine="228"/>
+      </Position14>
+      <Position15>
+        <Filename Value="..\UCoolTranslator.pas"/>
+        <Caret Line="242" Column="13" TopLine="228"/>
+      </Position15>
+      <Position16>
+        <Filename Value="..\UCoolTranslator.pas"/>
+        <Caret Line="241" Column="5" TopLine="228"/>
+      </Position16>
+      <Position17>
+        <Filename Value="..\UCoolTranslator.pas"/>
+        <Caret Line="242" Column="1" TopLine="228"/>
+      </Position17>
+      <Position18>
+        <Filename Value="..\UCoolTranslator.pas"/>
+        <Caret Line="243" Column="1" TopLine="228"/>
+      </Position18>
+      <Position19>
+        <Filename Value="..\UCoolTranslator.pas"/>
+        <Caret Line="279" Column="37" TopLine="276"/>
+      </Position19>
+      <Position20>
+        <Filename Value="..\UCoolTranslator.pas"/>
+        <Caret Line="278" Column="7" TopLine="274"/>
+      </Position20>
+      <Position21>
+        <Filename Value="..\UCoolTranslator.pas"/>
+        <Caret Line="224" Column="1" TopLine="212"/>
+      </Position21>
+      <Position22>
+        <Filename Value="..\UCoolTranslator.pas"/>
+        <Caret Line="279" Column="30" TopLine="267"/>
+      </Position22>
+      <Position23>
+        <Filename Value="..\UCoolTranslator.pas"/>
+        <Caret Line="224" Column="49" TopLine="212"/>
+      </Position23>
+      <Position24>
+        <Filename Value="..\UCoolTranslator.pas"/>
+        <Caret Line="64" Column="28" TopLine="52"/>
+      </Position24>
+      <Position25>
+        <Filename Value="..\UCoolTranslator.pas"/>
+        <Caret Line="278" Column="6" TopLine="276"/>
+      </Position25>
+      <Position26>
+        <Filename Value="..\UCoolTranslator.pas"/>
+        <Caret Line="279" Column="29" TopLine="274"/>
+      </Position26>
+      <Position27>
+        <Filename Value="UMainForm.pas"/>
+        <Caret Line="48" Column="45" TopLine="39"/>
+      </Position27>
+      <Position28>
+        <Filename Value="UMainForm.pas"/>
+        <Caret Line="59" Column="20" TopLine="39"/>
+      </Position28>
+      <Position29>
+        <Filename Value="UMainForm.pas"/>
+        <Caret Line="9" Column="29" TopLine="1"/>
+      </Position29>
+      <Position30>
+        <Filename Value="UMainForm.pas"/>
+        <Caret Line="18" Column="29" TopLine="1"/>
+      </Position30>
+    </JumpHistory>
+  </ProjectOptions>
+  <CompilerOptions>
+    <Version Value="11"/>
+    <PathDelim Value="\"/>
+    <Target>
+      <Filename Value="TranslatorDemo"/>
+    </Target>
+    <SearchPaths>
+      <IncludeFiles Value="$(ProjOutDir)"/>
+      <UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/>
+    </SearchPaths>
+    <Linking>
+      <Options>
+        <Win32>
+          <GraphicApplication Value="True"/>
+        </Win32>
+      </Options>
+    </Linking>
+    <Other>
+      <CompilerMessages>
+        <UseMsgFile Value="True"/>
+      </CompilerMessages>
+      <CompilerPath Value="$(CompPath)"/>
+    </Other>
+  </CompilerOptions>
+  <Debugging>
+    <Exceptions Count="3">
+      <Item1>
+        <Name Value="EAbort"/>
+      </Item1>
+      <Item2>
+        <Name Value="ECodetoolError"/>
+      </Item2>
+      <Item3>
+        <Name Value="EFOpenError"/>
+      </Item3>
+    </Exceptions>
+  </Debugging>
+  <EditorMacros Count="0"/>
+</CONFIG>
Index: /tags/1.1.0/Packages/CoolTranslator/Demo/TranslatorDemo.lpr
===================================================================
--- /tags/1.1.0/Packages/CoolTranslator/Demo/TranslatorDemo.lpr	(revision 137)
+++ /tags/1.1.0/Packages/CoolTranslator/Demo/TranslatorDemo.lpr	(revision 137)
@@ -0,0 +1,20 @@
+program TranslatorDemo;
+
+{$mode objfpc}{$H+}
+
+uses
+  {$IFDEF UNIX}{$IFDEF UseCThreads}
+  cthreads,
+  {$ENDIF}{$ENDIF}
+  Interfaces, // this includes the LCL widgetset
+  Forms, UMainForm, CoolTranslator
+  { you can add units after this };
+
+{$R *.res}
+
+begin
+  Application.Initialize;
+  Application.CreateForm(TMainForm, MainForm);
+  Application.Run;
+end.
+
Index: /tags/1.1.0/Packages/CoolTranslator/Demo/UMainForm.lfm
===================================================================
--- /tags/1.1.0/Packages/CoolTranslator/Demo/UMainForm.lfm	(revision 137)
+++ /tags/1.1.0/Packages/CoolTranslator/Demo/UMainForm.lfm	(revision 137)
@@ -0,0 +1,74 @@
+object MainForm: TMainForm
+  Left = 406
+  Height = 240
+  Top = 191
+  Width = 466
+  Caption = 'Translator Demo'
+  ClientHeight = 240
+  ClientWidth = 466
+  OnCreate = FormCreate
+  LCLVersion = '1.1'
+  object ListBox1: TListBox
+    Left = 171
+    Height = 168
+    Top = 24
+    Width = 141
+    ItemHeight = 0
+    OnSelectionChange = ListBox1SelectionChange
+    TabOrder = 0
+  end
+  object Button1: TButton
+    Left = 8
+    Height = 25
+    Top = 208
+    Width = 128
+    Caption = 'Show MainForm.Name'
+    OnClick = Button1Click
+    TabOrder = 1
+  end
+  object Label1: TLabel
+    Left = 10
+    Height = 13
+    Top = 24
+    Width = 46
+    Caption = 'MainForm'
+    ParentColor = False
+  end
+  object Label2: TLabel
+    Left = 10
+    Height = 13
+    Top = 6
+    Width = 134
+    Caption = 'Form name as label caption:'
+    ParentColor = False
+  end
+  object Label3: TLabel
+    Left = 171
+    Height = 13
+    Top = 8
+    Width = 67
+    Caption = 'Language list:'
+    ParentColor = False
+  end
+  object ListBox2: TListBox
+    Left = 321
+    Height = 168
+    Top = 24
+    Width = 135
+    ItemHeight = 0
+    TabOrder = 2
+  end
+  object Label4: TLabel
+    Left = 321
+    Height = 13
+    Top = 10
+    Width = 46
+    Caption = 'Excludes:'
+    ParentColor = False
+  end
+  object CoolTranslator1: TCoolTranslator
+    POFilesFolder = 'Languages'
+    left = 72
+    top = 72
+  end
+end
Index: /tags/1.1.0/Packages/CoolTranslator/Demo/UMainForm.lrt
===================================================================
--- /tags/1.1.0/Packages/CoolTranslator/Demo/UMainForm.lrt	(revision 137)
+++ /tags/1.1.0/Packages/CoolTranslator/Demo/UMainForm.lrt	(revision 137)
@@ -0,0 +1,6 @@
+TMAINFORM.CAPTION=Translator Demo
+TMAINFORM.BUTTON1.CAPTION=Show MainForm.Name
+TMAINFORM.LABEL1.CAPTION=MainForm
+TMAINFORM.LABEL2.CAPTION=Form name as label caption:
+TMAINFORM.LABEL3.CAPTION=Language list:
+TMAINFORM.LABEL4.CAPTION=Excludes:
Index: /tags/1.1.0/Packages/CoolTranslator/Demo/UMainForm.pas
===================================================================
--- /tags/1.1.0/Packages/CoolTranslator/Demo/UMainForm.pas	(revision 137)
+++ /tags/1.1.0/Packages/CoolTranslator/Demo/UMainForm.pas	(revision 137)
@@ -0,0 +1,64 @@
+unit UMainForm;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
+  UCoolTranslator, ULanguages;
+
+type
+
+  { TMainForm }
+
+  TMainForm = class(TForm)
+    Button1: TButton;
+    CoolTranslator1: TCoolTranslator;
+    Label1: TLabel;
+    Label2: TLabel;
+    Label3: TLabel;
+    Label4: TLabel;
+    ListBox1: TListBox;
+    ListBox2: TListBox;
+    procedure Button1Click(Sender: TObject);
+    procedure FormCreate(Sender: TObject);
+    procedure ListBox1SelectionChange(Sender: TObject; User: boolean);
+  private
+    { private declarations }
+  public
+    { public declarations }
+  end; 
+
+var
+  MainForm: TMainForm;
+
+implementation
+
+resourcestring
+  STranslatedText = 'Text stored in resourcestring';
+
+{$R *.lfm}
+
+{ TMainForm }
+
+procedure TMainForm.FormCreate(Sender: TObject);
+begin
+  CoolTranslator1.LanguageListToStrings(ListBox1.Items);
+  CoolTranslator1.ComponentExcludes.DumpToStrings(ListBox2.Items);
+end;
+
+procedure TMainForm.Button1Click(Sender: TObject);
+begin
+  ShowMessage(MainForm.Name);
+end;
+
+procedure TMainForm.ListBox1SelectionChange(Sender: TObject; User: boolean);
+begin
+  if ListBox1.ItemIndex <> - 1 then
+  with CoolTranslator1 do
+    Language := TLanguage(ListBox1.Items.Objects[ListBox1.ItemIndex]);
+end;
+
+end.
+
Index: /tags/1.1.0/Packages/CoolTranslator/Languages/UCoolTranslator.po
===================================================================
--- /tags/1.1.0/Packages/CoolTranslator/Languages/UCoolTranslator.po	(revision 137)
+++ /tags/1.1.0/Packages/CoolTranslator/Languages/UCoolTranslator.po	(revision 137)
@@ -0,0 +1,15 @@
+msgid ""
+msgstr "Content-Type: text/plain; charset=UTF-8"
+
+#: ucooltranslator.slanguageautomatic
+msgid "Automatic"
+msgstr ""
+
+#: ucooltranslator.slanguageczech
+msgid "Czech"
+msgstr ""
+
+#: ucooltranslator.slanguageenglish
+msgid "English"
+msgstr ""
+
Index: /tags/1.1.0/Packages/CoolTranslator/Languages/ULanguages.cs.po
===================================================================
--- /tags/1.1.0/Packages/CoolTranslator/Languages/ULanguages.cs.po	(revision 137)
+++ /tags/1.1.0/Packages/CoolTranslator/Languages/ULanguages.cs.po	(revision 137)
@@ -0,0 +1,789 @@
+msgid ""
+msgstr ""
+"Content-Type: text/plain; charset=UTF-8\n"
+"Project-Id-Version: \n"
+"POT-Creation-Date: \n"
+"PO-Revision-Date: \n"
+"Last-Translator: Jiří Hajda <software@mezservis.cz>\n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ulanguages.slangauto
+msgid "Automatic"
+msgstr "Automaticky"
+
+#: ulanguages.slang_aa
+msgid "Afar"
+msgstr ""
+
+#: ulanguages.slang_ab
+msgid "Abkhazian"
+msgstr "Abcházština"
+
+#: ulanguages.slang_ae
+msgid "Avestan"
+msgstr ""
+
+#: ulanguages.slang_af
+msgid "Afrikaans"
+msgstr "Afrikánština"
+
+#: ulanguages.slang_ak
+msgid "Akan"
+msgstr ""
+
+#: ulanguages.slang_am
+msgid "Amharic"
+msgstr ""
+
+#: ulanguages.slang_an
+msgid "Aragonese"
+msgstr ""
+
+#: ulanguages.slang_ar
+msgid "Arabic"
+msgstr "Arabština"
+
+#: ulanguages.slang_as
+msgid "Assamese"
+msgstr ""
+
+#: ulanguages.slang_av
+msgid "Avaric"
+msgstr ""
+
+#: ulanguages.slang_ay
+msgid "Aymara"
+msgstr ""
+
+#: ulanguages.slang_az
+msgid "Azerbaijani"
+msgstr ""
+
+#: ulanguages.slang_ba
+msgid "Bashkir"
+msgstr ""
+
+#: ulanguages.slang_be
+msgid "Belarusian"
+msgstr ""
+
+#: ulanguages.slang_bg
+msgid "Bulgarian"
+msgstr "Maďarština"
+
+#: ulanguages.slang_bh
+msgid "Bihari"
+msgstr ""
+
+#: ulanguages.slang_bi
+msgid "Bislama"
+msgstr ""
+
+#: ulanguages.slang_bm
+msgid "Bambara"
+msgstr ""
+
+#: ulanguages.slang_bn
+msgid "Bengali"
+msgstr ""
+
+#: ulanguages.slang_bo
+msgid "Tibetan"
+msgstr "Tibetština"
+
+#: ulanguages.slang_br
+msgid "Breton"
+msgstr ""
+
+#: ulanguages.slang_bs
+msgid "Bosnian"
+msgstr ""
+
+#: ulanguages.slang_ca
+msgid "Catalan"
+msgstr "Katalánština"
+
+#: ulanguages.slang_ce
+msgid "Chechen"
+msgstr ""
+
+#: ulanguages.slang_ch
+msgid "Chamorro"
+msgstr ""
+
+#: ulanguages.slang_co
+msgid "Corsican"
+msgstr ""
+
+#: ulanguages.slang_cr
+msgid "Cree"
+msgstr "Kríjština"
+
+#: ulanguages.slang_cs
+msgid "Czech"
+msgstr "Čeština"
+
+#: ulanguages.slang_cv
+msgid "Chuvash"
+msgstr ""
+
+#: ulanguages.slang_cy
+msgid "Welsh"
+msgstr ""
+
+#: ulanguages.slang_da
+msgid "Danish"
+msgstr "Dánština"
+
+#: ulanguages.slang_de
+msgid "German"
+msgstr "Němčina"
+
+#: ulanguages.slang_de_at
+msgid "Austrian German"
+msgstr "Australská němčina"
+
+#: ulanguages.slang_de_ch
+msgid "Swiss German"
+msgstr "Švédská němčina"
+
+#: ulanguages.slang_dv
+msgid "Divehi"
+msgstr ""
+
+#: ulanguages.slang_dz
+msgid "Dzongkha"
+msgstr ""
+
+#: ulanguages.slang_ee
+msgid "Ewe"
+msgstr ""
+
+#: ulanguages.slang_el
+msgid "Greek"
+msgstr "Řečtina"
+
+#: ulanguages.slang_en
+msgid "English"
+msgstr "Angličtina"
+
+#: ulanguages.slang_en_au
+msgid "Australian English"
+msgstr "Australská angličtina"
+
+#: ulanguages.slang_en_ca
+msgid "Canadian English"
+msgstr "Kanadská angličtina"
+
+#: ulanguages.slang_en_gb
+msgid "British English"
+msgstr "Britská angličtina"
+
+#: ulanguages.slang_en_us
+msgid "American English"
+msgstr "Americká angličtina"
+
+#: ulanguages.slang_eo
+msgid "Esperanto"
+msgstr "Esperanto"
+
+#: ulanguages.slang_es
+msgid "Spanish"
+msgstr "Španělština"
+
+#: ulanguages.slang_et
+msgid "Estonian"
+msgstr "Estonština"
+
+#: ulanguages.slang_eu
+msgid "Basque"
+msgstr ""
+
+#: ulanguages.slang_fa
+msgid "Persian"
+msgstr "Perština"
+
+#: ulanguages.slang_ff
+msgid "Fulah"
+msgstr ""
+
+#: ulanguages.slang_fi
+msgid "Finnish"
+msgstr "Finština"
+
+#: ulanguages.slang_fj
+msgid "Fijian"
+msgstr ""
+
+#: ulanguages.slang_fo
+msgid "Faroese"
+msgstr ""
+
+#: ulanguages.slang_fr
+msgid "French"
+msgstr "Francouzština"
+
+#: ulanguages.slang_fr_be
+msgctxt "ulanguages.slang_fr_be"
+msgid "Walloon"
+msgstr ""
+
+#: ulanguages.slang_fy
+msgid "Frisian"
+msgstr ""
+
+#: ulanguages.slang_ga
+msgid "Irish"
+msgstr "Irština"
+
+#: ulanguages.slang_gd
+msgid "Gaelic"
+msgstr ""
+
+#: ulanguages.slang_gl
+msgid "Gallegan"
+msgstr ""
+
+#: ulanguages.slang_gn
+msgid "Guarani"
+msgstr ""
+
+#: ulanguages.slang_gu
+msgid "Gujarati"
+msgstr ""
+
+#: ulanguages.slang_gv
+msgid "Manx"
+msgstr ""
+
+#: ulanguages.slang_ha
+msgid "Hausa"
+msgstr ""
+
+#: ulanguages.slang_he
+msgid "Hebrew"
+msgstr "Hebrejština"
+
+#: ulanguages.slang_hi
+msgid "Hindi"
+msgstr ""
+
+#: ulanguages.slang_ho
+msgid "Hiri Motu"
+msgstr ""
+
+#: ulanguages.slang_hr
+msgid "Croatian"
+msgstr "Chorvatština"
+
+#: ulanguages.slang_ht
+msgid "Haitian"
+msgstr ""
+
+#: ulanguages.slang_hu
+msgid "Hungarian"
+msgstr "Maďarština"
+
+#: ulanguages.slang_hy
+msgid "Armenian"
+msgstr "Arménština"
+
+#: ulanguages.slang_hz
+msgid "Herero"
+msgstr ""
+
+#: ulanguages.slang_ia
+msgid "Interlingua"
+msgstr ""
+
+#: ulanguages.slang_id
+msgid "Indonesian"
+msgstr ""
+
+#: ulanguages.slang_ie
+msgid "Interlingue"
+msgstr ""
+
+#: ulanguages.slang_ig
+msgid "Igbo"
+msgstr ""
+
+#: ulanguages.slang_ii
+msgid "Sichuan Yi"
+msgstr ""
+
+#: ulanguages.slang_ik
+msgid "Inupiaq"
+msgstr ""
+
+#: ulanguages.slang_io
+msgid "Ido"
+msgstr ""
+
+#: ulanguages.slang_is
+msgid "Icelandic"
+msgstr "Islandština"
+
+#: ulanguages.slang_it
+msgid "Italian"
+msgstr "Italština"
+
+#: ulanguages.slang_iu
+msgid "Inuktitut"
+msgstr ""
+
+#: ulanguages.slang_ja
+msgid "Japanese"
+msgstr "Japonština"
+
+#: ulanguages.slang_jv
+msgid "Javanese"
+msgstr ""
+
+#: ulanguages.slang_ka
+msgid "Georgian"
+msgstr "Gruzínština"
+
+#: ulanguages.slang_kg
+msgid "Kongo"
+msgstr "Konžština"
+
+#: ulanguages.slang_ki
+msgid "Kikuyu"
+msgstr ""
+
+#: ulanguages.slang_kj
+msgid "Kuanyama"
+msgstr ""
+
+#: ulanguages.slang_kk
+msgid "Kazakh"
+msgstr ""
+
+#: ulanguages.slang_kl
+msgid "Greenlandic"
+msgstr "Grónština"
+
+#: ulanguages.slang_km
+msgid "Khmer"
+msgstr ""
+
+#: ulanguages.slang_kn
+msgid "Kannada"
+msgstr "Kannadština"
+
+#: ulanguages.slang_ko
+msgid "Korean"
+msgstr "Korejština"
+
+#: ulanguages.slang_kr
+msgid "Kanuri"
+msgstr ""
+
+#: ulanguages.slang_ks
+msgid "Kashmiri"
+msgstr ""
+
+#: ulanguages.slang_ku
+msgid "Kurdish"
+msgstr ""
+
+#: ulanguages.slang_kv
+msgid "Komi"
+msgstr ""
+
+#: ulanguages.slang_kw
+msgid "Cornish"
+msgstr "Kornština"
+
+#: ulanguages.slang_ky
+msgid "Kirghiz"
+msgstr ""
+
+#: ulanguages.slang_la
+msgid "Latin"
+msgstr "Latina"
+
+#: ulanguages.slang_lb
+msgid "Luxembourgish"
+msgstr "Lucemburština"
+
+#: ulanguages.slang_lg
+msgid "Ganda"
+msgstr ""
+
+#: ulanguages.slang_li
+msgid "Limburgan"
+msgstr ""
+
+#: ulanguages.slang_ln
+msgid "Lingala"
+msgstr ""
+
+#: ulanguages.slang_lo
+msgid "Lao"
+msgstr "Laoština"
+
+#: ulanguages.slang_lt
+msgid "Lithuanian"
+msgstr "Litevština"
+
+#: ulanguages.slang_lu
+msgid "Luba-Katanga"
+msgstr ""
+
+#: ulanguages.slang_lv
+msgid "Latvian"
+msgstr "Lotyština"
+
+#: ulanguages.slang_mg
+msgid "Malagasy"
+msgstr ""
+
+#: ulanguages.slang_mh
+msgid "Marshallese"
+msgstr ""
+
+#: ulanguages.slang_mi
+msgid "Maori"
+msgstr ""
+
+#: ulanguages.slang_mk
+msgid "Macedonian"
+msgstr "Makedonština"
+
+#: ulanguages.slang_ml
+msgid "Malayalam"
+msgstr ""
+
+#: ulanguages.slang_mn
+msgid "Mongolian"
+msgstr "Mongolština"
+
+#: ulanguages.slang_mo
+msgid "Moldavian"
+msgstr "Moldavština"
+
+#: ulanguages.slang_mr
+msgid "Marathi"
+msgstr ""
+
+#: ulanguages.slang_ms
+msgid "Malay"
+msgstr ""
+
+#: ulanguages.slang_mt
+msgid "Maltese"
+msgstr ""
+
+#: ulanguages.slang_my
+msgid "Burmese"
+msgstr ""
+
+#: ulanguages.slang_na
+msgid "Nauru"
+msgstr ""
+
+#: ulanguages.slang_nb
+msgid "Norwegian Bokmaal"
+msgstr ""
+
+#: ulanguages.slang_nd
+msgid "Ndebele, North"
+msgstr ""
+
+#: ulanguages.slang_ne
+msgid "Nepali"
+msgstr ""
+
+#: ulanguages.slang_ng
+msgid "Ndonga"
+msgstr ""
+
+#: ulanguages.slang_nl
+msgid "Dutch"
+msgstr "Němčina"
+
+#: ulanguages.slang_nl_be
+msgid "Flemish"
+msgstr ""
+
+#: ulanguages.slang_nn
+msgid "Norwegian Nynorsk"
+msgstr ""
+
+#: ulanguages.slang_no
+msgid "Norwegian"
+msgstr "Norština"
+
+#: ulanguages.slang_nr
+msgid "Ndebele, South"
+msgstr ""
+
+#: ulanguages.slang_nv
+msgid "Navajo"
+msgstr "Navažština"
+
+#: ulanguages.slang_ny
+msgid "Chichewa"
+msgstr ""
+
+#: ulanguages.slang_oc
+msgid "Occitan"
+msgstr ""
+
+#: ulanguages.slang_oj
+msgid "Ojibwa"
+msgstr ""
+
+#: ulanguages.slang_om
+msgid "Oromo"
+msgstr ""
+
+#: ulanguages.slang_or
+msgid "Oriya"
+msgstr ""
+
+#: ulanguages.slang_os
+msgid "Ossetian"
+msgstr ""
+
+#: ulanguages.slang_pa
+msgid "Panjabi"
+msgstr ""
+
+#: ulanguages.slang_pi
+msgid "Pali"
+msgstr ""
+
+#: ulanguages.slang_pl
+msgid "Polish"
+msgstr "Polština"
+
+#: ulanguages.slang_ps
+msgid "Pushto"
+msgstr ""
+
+#: ulanguages.slang_pt
+msgid "Portuguese"
+msgstr "Portugalština"
+
+#: ulanguages.slang_pt_br
+msgid "Brazilian Portuguese"
+msgstr "Brazislká portugalština"
+
+#: ulanguages.slang_qu
+msgid "Quechua"
+msgstr ""
+
+#: ulanguages.slang_rm
+msgid "Raeto-Romance"
+msgstr ""
+
+#: ulanguages.slang_rn
+msgid "Rundi"
+msgstr ""
+
+#: ulanguages.slang_ro
+msgid "Romanian"
+msgstr "Romština"
+
+#: ulanguages.slang_ru
+msgid "Russian"
+msgstr "Ruština"
+
+#: ulanguages.slang_rw
+msgid "Kinyarwanda"
+msgstr ""
+
+#: ulanguages.slang_sa
+msgid "Sanskrit"
+msgstr ""
+
+#: ulanguages.slang_sc
+msgid "Sardinian"
+msgstr ""
+
+#: ulanguages.slang_sd
+msgid "Sindhi"
+msgstr ""
+
+#: ulanguages.slang_se
+msgid "Northern Sami"
+msgstr ""
+
+#: ulanguages.slang_sg
+msgid "Sango"
+msgstr ""
+
+#: ulanguages.slang_si
+msgid "Sinhalese"
+msgstr ""
+
+#: ulanguages.slang_sk
+msgid "Slovak"
+msgstr "Slovenština"
+
+#: ulanguages.slang_sl
+msgid "Slovenian"
+msgstr "Slovinština"
+
+#: ulanguages.slang_sm
+msgid "Samoan"
+msgstr ""
+
+#: ulanguages.slang_sn
+msgid "Shona"
+msgstr ""
+
+#: ulanguages.slang_so
+msgid "Somali"
+msgstr ""
+
+#: ulanguages.slang_sq
+msgid "Albanian"
+msgstr "Albánština"
+
+#: ulanguages.slang_sr
+msgid "Serbian"
+msgstr ""
+
+#: ulanguages.slang_ss
+msgid "Swati"
+msgstr ""
+
+#: ulanguages.slang_st
+msgid "Sotho, Southern"
+msgstr ""
+
+#: ulanguages.slang_su
+msgid "Sundanese"
+msgstr "Sundština"
+
+#: ulanguages.slang_sv
+msgid "Swedish"
+msgstr "Švédština"
+
+#: ulanguages.slang_sw
+msgid "Swahili"
+msgstr ""
+
+#: ulanguages.slang_ta
+msgid "Tamil"
+msgstr ""
+
+#: ulanguages.slang_te
+msgid "Telugu"
+msgstr ""
+
+#: ulanguages.slang_tg
+msgid "Tajik"
+msgstr ""
+
+#: ulanguages.slang_th
+msgid "Thai"
+msgstr ""
+
+#: ulanguages.slang_ti
+msgid "Tigrinya"
+msgstr ""
+
+#: ulanguages.slang_tk
+msgid "Turkmen"
+msgstr ""
+
+#: ulanguages.slang_tl
+msgid "Tagalog"
+msgstr ""
+
+#: ulanguages.slang_tn
+msgid "Tswana"
+msgstr ""
+
+#: ulanguages.slang_to
+msgid "Tonga"
+msgstr ""
+
+#: ulanguages.slang_tr
+msgid "Turkish"
+msgstr "Turečtina"
+
+#: ulanguages.slang_ts
+msgid "Tsonga"
+msgstr ""
+
+#: ulanguages.slang_tt
+msgid "Tatar"
+msgstr "Tatarština"
+
+#: ulanguages.slang_tw
+msgid "Twi"
+msgstr ""
+
+#: ulanguages.slang_ty
+msgid "Tahitian"
+msgstr ""
+
+#: ulanguages.slang_ug
+msgid "Uighur"
+msgstr ""
+
+#: ulanguages.slang_uk
+msgid "Ukrainian"
+msgstr "Ukrajinština"
+
+#: ulanguages.slang_ur
+msgid "Urdu"
+msgstr ""
+
+#: ulanguages.slang_uz
+msgid "Uzbek"
+msgstr ""
+
+#: ulanguages.slang_ve
+msgid "Venda"
+msgstr ""
+
+#: ulanguages.slang_vi
+msgid "Vietnamese"
+msgstr "Vietnamština"
+
+#: ulanguages.slang_vo
+msgid "Volapuk"
+msgstr ""
+
+#: ulanguages.slang_wa
+msgctxt "ulanguages.slang_wa"
+msgid "Walloon"
+msgstr ""
+
+#: ulanguages.slang_wo
+msgid "Wolof"
+msgstr ""
+
+#: ulanguages.slang_xh
+msgid "Xhosa"
+msgstr ""
+
+#: ulanguages.slang_yi
+msgid "Yiddish"
+msgstr ""
+
+#: ulanguages.slang_yo
+msgid "Yoruba"
+msgstr ""
+
+#: ulanguages.slang_za
+msgid "Zhuang"
+msgstr ""
+
+#: ulanguages.slang_zh
+msgid "Chinese"
+msgstr "Čínština"
+
+#: ulanguages.slang_zu
+msgid "Zulu"
+msgstr "Zuluština"
+
Index: /tags/1.1.0/Packages/CoolTranslator/Languages/ULanguages.po
===================================================================
--- /tags/1.1.0/Packages/CoolTranslator/Languages/ULanguages.po	(revision 137)
+++ /tags/1.1.0/Packages/CoolTranslator/Languages/ULanguages.po	(revision 137)
@@ -0,0 +1,781 @@
+msgid ""
+msgstr "Content-Type: text/plain; charset=UTF-8"
+
+#: ulanguages.slangauto
+msgid "Automatic"
+msgstr ""
+
+#: ulanguages.slang_aa
+msgid "Afar"
+msgstr ""
+
+#: ulanguages.slang_ab
+msgid "Abkhazian"
+msgstr ""
+
+#: ulanguages.slang_ae
+msgid "Avestan"
+msgstr ""
+
+#: ulanguages.slang_af
+msgid "Afrikaans"
+msgstr ""
+
+#: ulanguages.slang_ak
+msgid "Akan"
+msgstr ""
+
+#: ulanguages.slang_am
+msgid "Amharic"
+msgstr ""
+
+#: ulanguages.slang_an
+msgid "Aragonese"
+msgstr ""
+
+#: ulanguages.slang_ar
+msgid "Arabic"
+msgstr ""
+
+#: ulanguages.slang_as
+msgid "Assamese"
+msgstr ""
+
+#: ulanguages.slang_av
+msgid "Avaric"
+msgstr ""
+
+#: ulanguages.slang_ay
+msgid "Aymara"
+msgstr ""
+
+#: ulanguages.slang_az
+msgid "Azerbaijani"
+msgstr ""
+
+#: ulanguages.slang_ba
+msgid "Bashkir"
+msgstr ""
+
+#: ulanguages.slang_be
+msgid "Belarusian"
+msgstr ""
+
+#: ulanguages.slang_bg
+msgid "Bulgarian"
+msgstr ""
+
+#: ulanguages.slang_bh
+msgid "Bihari"
+msgstr ""
+
+#: ulanguages.slang_bi
+msgid "Bislama"
+msgstr ""
+
+#: ulanguages.slang_bm
+msgid "Bambara"
+msgstr ""
+
+#: ulanguages.slang_bn
+msgid "Bengali"
+msgstr ""
+
+#: ulanguages.slang_bo
+msgid "Tibetan"
+msgstr ""
+
+#: ulanguages.slang_br
+msgid "Breton"
+msgstr ""
+
+#: ulanguages.slang_bs
+msgid "Bosnian"
+msgstr ""
+
+#: ulanguages.slang_ca
+msgid "Catalan"
+msgstr ""
+
+#: ulanguages.slang_ce
+msgid "Chechen"
+msgstr ""
+
+#: ulanguages.slang_ch
+msgid "Chamorro"
+msgstr ""
+
+#: ulanguages.slang_co
+msgid "Corsican"
+msgstr ""
+
+#: ulanguages.slang_cr
+msgid "Cree"
+msgstr ""
+
+#: ulanguages.slang_cs
+msgid "Czech"
+msgstr ""
+
+#: ulanguages.slang_cv
+msgid "Chuvash"
+msgstr ""
+
+#: ulanguages.slang_cy
+msgid "Welsh"
+msgstr ""
+
+#: ulanguages.slang_da
+msgid "Danish"
+msgstr ""
+
+#: ulanguages.slang_de
+msgid "German"
+msgstr ""
+
+#: ulanguages.slang_de_at
+msgid "Austrian German"
+msgstr ""
+
+#: ulanguages.slang_de_ch
+msgid "Swiss German"
+msgstr ""
+
+#: ulanguages.slang_dv
+msgid "Divehi"
+msgstr ""
+
+#: ulanguages.slang_dz
+msgid "Dzongkha"
+msgstr ""
+
+#: ulanguages.slang_ee
+msgid "Ewe"
+msgstr ""
+
+#: ulanguages.slang_el
+msgid "Greek"
+msgstr ""
+
+#: ulanguages.slang_en
+msgid "English"
+msgstr ""
+
+#: ulanguages.slang_en_au
+msgid "Australian English"
+msgstr ""
+
+#: ulanguages.slang_en_ca
+msgid "Canadian English"
+msgstr ""
+
+#: ulanguages.slang_en_gb
+msgid "British English"
+msgstr ""
+
+#: ulanguages.slang_en_us
+msgid "American English"
+msgstr ""
+
+#: ulanguages.slang_eo
+msgid "Esperanto"
+msgstr ""
+
+#: ulanguages.slang_es
+msgid "Spanish"
+msgstr ""
+
+#: ulanguages.slang_et
+msgid "Estonian"
+msgstr ""
+
+#: ulanguages.slang_eu
+msgid "Basque"
+msgstr ""
+
+#: ulanguages.slang_fa
+msgid "Persian"
+msgstr ""
+
+#: ulanguages.slang_ff
+msgid "Fulah"
+msgstr ""
+
+#: ulanguages.slang_fi
+msgid "Finnish"
+msgstr ""
+
+#: ulanguages.slang_fj
+msgid "Fijian"
+msgstr ""
+
+#: ulanguages.slang_fo
+msgid "Faroese"
+msgstr ""
+
+#: ulanguages.slang_fr
+msgid "French"
+msgstr ""
+
+#: ulanguages.slang_fr_be
+msgctxt "ulanguages.slang_fr_be"
+msgid "Walloon"
+msgstr ""
+
+#: ulanguages.slang_fy
+msgid "Frisian"
+msgstr ""
+
+#: ulanguages.slang_ga
+msgid "Irish"
+msgstr ""
+
+#: ulanguages.slang_gd
+msgid "Gaelic"
+msgstr ""
+
+#: ulanguages.slang_gl
+msgid "Gallegan"
+msgstr ""
+
+#: ulanguages.slang_gn
+msgid "Guarani"
+msgstr ""
+
+#: ulanguages.slang_gu
+msgid "Gujarati"
+msgstr ""
+
+#: ulanguages.slang_gv
+msgid "Manx"
+msgstr ""
+
+#: ulanguages.slang_ha
+msgid "Hausa"
+msgstr ""
+
+#: ulanguages.slang_he
+msgid "Hebrew"
+msgstr ""
+
+#: ulanguages.slang_hi
+msgid "Hindi"
+msgstr ""
+
+#: ulanguages.slang_ho
+msgid "Hiri Motu"
+msgstr ""
+
+#: ulanguages.slang_hr
+msgid "Croatian"
+msgstr ""
+
+#: ulanguages.slang_ht
+msgid "Haitian"
+msgstr ""
+
+#: ulanguages.slang_hu
+msgid "Hungarian"
+msgstr ""
+
+#: ulanguages.slang_hy
+msgid "Armenian"
+msgstr ""
+
+#: ulanguages.slang_hz
+msgid "Herero"
+msgstr ""
+
+#: ulanguages.slang_ia
+msgid "Interlingua"
+msgstr ""
+
+#: ulanguages.slang_id
+msgid "Indonesian"
+msgstr ""
+
+#: ulanguages.slang_ie
+msgid "Interlingue"
+msgstr ""
+
+#: ulanguages.slang_ig
+msgid "Igbo"
+msgstr ""
+
+#: ulanguages.slang_ii
+msgid "Sichuan Yi"
+msgstr ""
+
+#: ulanguages.slang_ik
+msgid "Inupiaq"
+msgstr ""
+
+#: ulanguages.slang_io
+msgid "Ido"
+msgstr ""
+
+#: ulanguages.slang_is
+msgid "Icelandic"
+msgstr ""
+
+#: ulanguages.slang_it
+msgid "Italian"
+msgstr ""
+
+#: ulanguages.slang_iu
+msgid "Inuktitut"
+msgstr ""
+
+#: ulanguages.slang_ja
+msgid "Japanese"
+msgstr ""
+
+#: ulanguages.slang_jv
+msgid "Javanese"
+msgstr ""
+
+#: ulanguages.slang_ka
+msgid "Georgian"
+msgstr ""
+
+#: ulanguages.slang_kg
+msgid "Kongo"
+msgstr ""
+
+#: ulanguages.slang_ki
+msgid "Kikuyu"
+msgstr ""
+
+#: ulanguages.slang_kj
+msgid "Kuanyama"
+msgstr ""
+
+#: ulanguages.slang_kk
+msgid "Kazakh"
+msgstr ""
+
+#: ulanguages.slang_kl
+msgid "Greenlandic"
+msgstr ""
+
+#: ulanguages.slang_km
+msgid "Khmer"
+msgstr ""
+
+#: ulanguages.slang_kn
+msgid "Kannada"
+msgstr ""
+
+#: ulanguages.slang_ko
+msgid "Korean"
+msgstr ""
+
+#: ulanguages.slang_kr
+msgid "Kanuri"
+msgstr ""
+
+#: ulanguages.slang_ks
+msgid "Kashmiri"
+msgstr ""
+
+#: ulanguages.slang_ku
+msgid "Kurdish"
+msgstr ""
+
+#: ulanguages.slang_kv
+msgid "Komi"
+msgstr ""
+
+#: ulanguages.slang_kw
+msgid "Cornish"
+msgstr ""
+
+#: ulanguages.slang_ky
+msgid "Kirghiz"
+msgstr ""
+
+#: ulanguages.slang_la
+msgid "Latin"
+msgstr ""
+
+#: ulanguages.slang_lb
+msgid "Luxembourgish"
+msgstr ""
+
+#: ulanguages.slang_lg
+msgid "Ganda"
+msgstr ""
+
+#: ulanguages.slang_li
+msgid "Limburgan"
+msgstr ""
+
+#: ulanguages.slang_ln
+msgid "Lingala"
+msgstr ""
+
+#: ulanguages.slang_lo
+msgid "Lao"
+msgstr ""
+
+#: ulanguages.slang_lt
+msgid "Lithuanian"
+msgstr ""
+
+#: ulanguages.slang_lu
+msgid "Luba-Katanga"
+msgstr ""
+
+#: ulanguages.slang_lv
+msgid "Latvian"
+msgstr ""
+
+#: ulanguages.slang_mg
+msgid "Malagasy"
+msgstr ""
+
+#: ulanguages.slang_mh
+msgid "Marshallese"
+msgstr ""
+
+#: ulanguages.slang_mi
+msgid "Maori"
+msgstr ""
+
+#: ulanguages.slang_mk
+msgid "Macedonian"
+msgstr ""
+
+#: ulanguages.slang_ml
+msgid "Malayalam"
+msgstr ""
+
+#: ulanguages.slang_mn
+msgid "Mongolian"
+msgstr ""
+
+#: ulanguages.slang_mo
+msgid "Moldavian"
+msgstr ""
+
+#: ulanguages.slang_mr
+msgid "Marathi"
+msgstr ""
+
+#: ulanguages.slang_ms
+msgid "Malay"
+msgstr ""
+
+#: ulanguages.slang_mt
+msgid "Maltese"
+msgstr ""
+
+#: ulanguages.slang_my
+msgid "Burmese"
+msgstr ""
+
+#: ulanguages.slang_na
+msgid "Nauru"
+msgstr ""
+
+#: ulanguages.slang_nb
+msgid "Norwegian Bokmaal"
+msgstr ""
+
+#: ulanguages.slang_nd
+msgid "Ndebele, North"
+msgstr ""
+
+#: ulanguages.slang_ne
+msgid "Nepali"
+msgstr ""
+
+#: ulanguages.slang_ng
+msgid "Ndonga"
+msgstr ""
+
+#: ulanguages.slang_nl
+msgid "Dutch"
+msgstr ""
+
+#: ulanguages.slang_nl_be
+msgid "Flemish"
+msgstr ""
+
+#: ulanguages.slang_nn
+msgid "Norwegian Nynorsk"
+msgstr ""
+
+#: ulanguages.slang_no
+msgid "Norwegian"
+msgstr ""
+
+#: ulanguages.slang_nr
+msgid "Ndebele, South"
+msgstr ""
+
+#: ulanguages.slang_nv
+msgid "Navajo"
+msgstr ""
+
+#: ulanguages.slang_ny
+msgid "Chichewa"
+msgstr ""
+
+#: ulanguages.slang_oc
+msgid "Occitan"
+msgstr ""
+
+#: ulanguages.slang_oj
+msgid "Ojibwa"
+msgstr ""
+
+#: ulanguages.slang_om
+msgid "Oromo"
+msgstr ""
+
+#: ulanguages.slang_or
+msgid "Oriya"
+msgstr ""
+
+#: ulanguages.slang_os
+msgid "Ossetian"
+msgstr ""
+
+#: ulanguages.slang_pa
+msgid "Panjabi"
+msgstr ""
+
+#: ulanguages.slang_pi
+msgid "Pali"
+msgstr ""
+
+#: ulanguages.slang_pl
+msgid "Polish"
+msgstr ""
+
+#: ulanguages.slang_ps
+msgid "Pushto"
+msgstr ""
+
+#: ulanguages.slang_pt
+msgid "Portuguese"
+msgstr ""
+
+#: ulanguages.slang_pt_br
+msgid "Brazilian Portuguese"
+msgstr ""
+
+#: ulanguages.slang_qu
+msgid "Quechua"
+msgstr ""
+
+#: ulanguages.slang_rm
+msgid "Raeto-Romance"
+msgstr ""
+
+#: ulanguages.slang_rn
+msgid "Rundi"
+msgstr ""
+
+#: ulanguages.slang_ro
+msgid "Romanian"
+msgstr ""
+
+#: ulanguages.slang_ru
+msgid "Russian"
+msgstr ""
+
+#: ulanguages.slang_rw
+msgid "Kinyarwanda"
+msgstr ""
+
+#: ulanguages.slang_sa
+msgid "Sanskrit"
+msgstr ""
+
+#: ulanguages.slang_sc
+msgid "Sardinian"
+msgstr ""
+
+#: ulanguages.slang_sd
+msgid "Sindhi"
+msgstr ""
+
+#: ulanguages.slang_se
+msgid "Northern Sami"
+msgstr ""
+
+#: ulanguages.slang_sg
+msgid "Sango"
+msgstr ""
+
+#: ulanguages.slang_si
+msgid "Sinhalese"
+msgstr ""
+
+#: ulanguages.slang_sk
+msgid "Slovak"
+msgstr ""
+
+#: ulanguages.slang_sl
+msgid "Slovenian"
+msgstr ""
+
+#: ulanguages.slang_sm
+msgid "Samoan"
+msgstr ""
+
+#: ulanguages.slang_sn
+msgid "Shona"
+msgstr ""
+
+#: ulanguages.slang_so
+msgid "Somali"
+msgstr ""
+
+#: ulanguages.slang_sq
+msgid "Albanian"
+msgstr ""
+
+#: ulanguages.slang_sr
+msgid "Serbian"
+msgstr ""
+
+#: ulanguages.slang_ss
+msgid "Swati"
+msgstr ""
+
+#: ulanguages.slang_st
+msgid "Sotho, Southern"
+msgstr ""
+
+#: ulanguages.slang_su
+msgid "Sundanese"
+msgstr ""
+
+#: ulanguages.slang_sv
+msgid "Swedish"
+msgstr ""
+
+#: ulanguages.slang_sw
+msgid "Swahili"
+msgstr ""
+
+#: ulanguages.slang_ta
+msgid "Tamil"
+msgstr ""
+
+#: ulanguages.slang_te
+msgid "Telugu"
+msgstr ""
+
+#: ulanguages.slang_tg
+msgid "Tajik"
+msgstr ""
+
+#: ulanguages.slang_th
+msgid "Thai"
+msgstr ""
+
+#: ulanguages.slang_ti
+msgid "Tigrinya"
+msgstr ""
+
+#: ulanguages.slang_tk
+msgid "Turkmen"
+msgstr ""
+
+#: ulanguages.slang_tl
+msgid "Tagalog"
+msgstr ""
+
+#: ulanguages.slang_tn
+msgid "Tswana"
+msgstr ""
+
+#: ulanguages.slang_to
+msgid "Tonga"
+msgstr ""
+
+#: ulanguages.slang_tr
+msgid "Turkish"
+msgstr ""
+
+#: ulanguages.slang_ts
+msgid "Tsonga"
+msgstr ""
+
+#: ulanguages.slang_tt
+msgid "Tatar"
+msgstr ""
+
+#: ulanguages.slang_tw
+msgid "Twi"
+msgstr ""
+
+#: ulanguages.slang_ty
+msgid "Tahitian"
+msgstr ""
+
+#: ulanguages.slang_ug
+msgid "Uighur"
+msgstr ""
+
+#: ulanguages.slang_uk
+msgid "Ukrainian"
+msgstr ""
+
+#: ulanguages.slang_ur
+msgid "Urdu"
+msgstr ""
+
+#: ulanguages.slang_uz
+msgid "Uzbek"
+msgstr ""
+
+#: ulanguages.slang_ve
+msgid "Venda"
+msgstr ""
+
+#: ulanguages.slang_vi
+msgid "Vietnamese"
+msgstr ""
+
+#: ulanguages.slang_vo
+msgid "Volapuk"
+msgstr ""
+
+#: ulanguages.slang_wa
+msgctxt "ulanguages.slang_wa"
+msgid "Walloon"
+msgstr ""
+
+#: ulanguages.slang_wo
+msgid "Wolof"
+msgstr ""
+
+#: ulanguages.slang_xh
+msgid "Xhosa"
+msgstr ""
+
+#: ulanguages.slang_yi
+msgid "Yiddish"
+msgstr ""
+
+#: ulanguages.slang_yo
+msgid "Yoruba"
+msgstr ""
+
+#: ulanguages.slang_za
+msgid "Zhuang"
+msgstr ""
+
+#: ulanguages.slang_zh
+msgid "Chinese"
+msgstr ""
+
+#: ulanguages.slang_zu
+msgid "Zulu"
+msgstr ""
+
Index: /tags/1.1.0/Packages/CoolTranslator/ReadMe.txt
===================================================================
--- /tags/1.1.0/Packages/CoolTranslator/ReadMe.txt	(revision 137)
+++ /tags/1.1.0/Packages/CoolTranslator/ReadMe.txt	(revision 137)
@@ -0,0 +1,46 @@
+=Introduction=
+
+This package contains component which make translation of application easy.
+
+==Features==
+
+* Easy to use non-visual component
+* Support runtime translation
+* Native to lazarus (use .po files)
+* Native to FPC (use resourcestrings)
+* Supply available language list
+
+=How translation is done=
+
+Strings are translated runtime and there is no need to do it as first step during initialization phase.
+
+==Resourcestring=
+
+Resourcestrings are translated automatically.
+
+==Components==
+
+All application components are translated automatically.
+This mean all TPersistent descendants with published properties linked to Application object.
+
+===Component and properties exclusion===
+It is possible to exclude properties which should not be translated
+
+===TCollection, TStrings===
+Some class properties are translated.
+
+* TCollection: TListView.Columns
+* TStrings: TRadioGroup.Items, TPageControl.Pages, TComboBox.Items, TMemo.Lines
+
+==Other constants==
+
+
+==Custom translation==
+
+You can handle OnTranslate event and do translation of custom structures.
+
+=Download=
+
+You can download source code using subversion:
+
+svn checkout http://svn.zdechov.net/PascalClassLibrary/CoolTranslator
Index: /tags/1.1.0/Packages/CoolTranslator/UCoolTranslator.pas
===================================================================
--- /tags/1.1.0/Packages/CoolTranslator/UCoolTranslator.pas	(revision 137)
+++ /tags/1.1.0/Packages/CoolTranslator/UCoolTranslator.pas	(revision 137)
@@ -0,0 +1,559 @@
+unit UCoolTranslator;
+
+{$mode Delphi}{$H+}
+
+interface
+
+uses
+  Classes, SysUtils, Forms, ExtCtrls, Controls, Contnrs, LazFileUtils, LazUTF8,
+  Translations, TypInfo, Dialogs, FileUtil, LCLProc, ULanguages, LCLType;
+
+type
+  THandleStringEvent = function (AValue: string): string of object;
+
+  { TComponentExcludes }
+
+  TComponentExcludes = class
+    ExcludedClassType: TClass;
+    PropertyExcludes: TStringList;
+    constructor Create;
+    destructor Destroy; override;
+  end;
+
+  { TComponentExcludesList }
+
+  TComponentExcludesList = class(TObjectList)
+    function FindByClassType(AClassType: TClass): TComponentExcludes;
+    procedure DumpToStrings(Strings: TStrings);
+  end;
+
+  { TCoolTranslator }
+
+  TCoolTranslator = class(TComponent)
+  private
+    FLanguage: TLanguage;
+    FOnAutomaticLanguage: THandleStringEvent;
+    FOnTranslate: TNotifyEvent;
+    FPOFilesFolder: string;
+    FPOFiles: TObjectList; // TObjectList<TPOFile>;
+    function GetLocale: string;
+    function GetLocaleShort: string;
+    function FindLocaleFileName(LCExt: string): string;
+    function GetLocaleFileName(const LangID, LCExt: string): string;
+    procedure ReloadFiles;
+    procedure SetPOFilesFolder(const AValue: string);
+    procedure SetLanguage(const AValue: TLanguage);
+    procedure TranslateProperty(Component: TPersistent; PropInfo: PPropInfo);
+    function IsExcluded(Component: TPersistent; PropertyName: string): Boolean;
+    function GetLangFileDir: string;
+  public
+    ComponentExcludes: TComponentExcludesList;
+    Languages: TLanguageList;
+    procedure Translate;
+    procedure LanguageListToStrings(Strings: TStrings);
+    procedure TranslateResourceStrings(PoFileName: string);
+    procedure TranslateUnitResourceStrings(UnitName: string; PoFileName: string);
+    procedure TranslateComponent(Component: TPersistent);
+    procedure TranslateComponentRecursive(Component: TComponent);
+    function TranslateText(Identifier, Text: string): string;
+    procedure AddExcludes(AClassType: TClass; PropertyName: string);
+    procedure CheckLanguageFiles;
+    constructor Create(AOwner: TComponent); override;
+    destructor Destroy; override;
+  published
+    property POFilesFolder: string read FPOFilesFolder write SetPOFilesFolder;
+    property Language: TLanguage read FLanguage write SetLanguage;
+    property OnTranslate: TNotifyEvent read FOnTranslate write FOnTranslate;
+    property OnAutomaticLanguage: THandleStringEvent read FOnAutomaticLanguage
+      write FOnAutomaticLanguage;
+  end;
+
+procedure Register;
+
+implementation
+
+procedure Register;
+begin
+  RegisterComponents('Samples', [TCoolTranslator]);
+end;
+
+{ TComponentExcludesList }
+
+function TComponentExcludesList.FindByClassType(AClassType: TClass
+  ): TComponentExcludes;
+var
+  I: Integer;
+begin
+  I := 0;
+  while (I < Count) and (TComponentExcludes(Items[I]).ExcludedClassType <> AClassType) do
+    Inc(I);
+  if I < Count then Result := TComponentExcludes(Items[I])
+    else Result := nil;
+end;
+
+procedure TComponentExcludesList.DumpToStrings(Strings: TStrings);
+var
+  I, J: Integer;
+  Text: string;
+begin
+  Strings.Clear;
+  for I := 0 to Count - 1 do
+  with TComponentExcludes(Items[I]) do begin
+    Text := ExcludedClassType.ClassName + ': ';
+    for J := 0 to PropertyExcludes.Count - 1 do
+      Text := Text + PropertyExcludes[J] + ', ';
+    Strings.Add(Text);
+  end;
+end;
+
+{ TComponentExcludes }
+
+constructor TComponentExcludes.Create;
+begin
+  PropertyExcludes := TStringList.Create;
+end;
+
+destructor TComponentExcludes.Destroy;
+begin
+  PropertyExcludes.Free;
+  inherited Destroy;
+end;
+
+
+{ TCoolTranslator }
+
+procedure TCoolTranslator.Translate;
+var
+  I, J: Integer;
+  Po: TPoFile;
+begin
+  TranslateComponentRecursive(Application);
+
+  // Merge files to single translation file
+  try
+    Po := TPOFile.Create;
+    for I := 0 to FPOFiles.Count - 1 do
+    with TPoFile(FPoFiles[I]) do
+      for J := 0 to Items.Count - 1 do
+      with TPoFileItem(Items[J]) do
+        Po.Add(IdentifierLow, Original, Translation, Comments, Context,
+          Flags, PreviousID);
+    Translations.TranslateResourceStrings(Po);
+  finally
+    Po.Free;
+  end;
+end;
+
+procedure TCoolTranslator.ReloadFiles;
+var
+  FileName: string;
+  FileList: TStringList;
+  I: Integer;
+  LocaleShort: string;
+  SearchMask: string;
+begin
+  FPOFiles.Clear;
+  if Assigned(FLanguage) then
+  try
+    LocaleShort := GetLocaleShort;
+    //ShowMessage(ExtractFileDir(Application.ExeName) +
+    //  DirectorySeparator + 'Languages' + ' ' + '*.' + LocaleShort + '.po');
+    SearchMask := '*';
+    if LocaleShort <> '' then SearchMask := SearchMask + '.' + LocaleShort;
+    SearchMask := SearchMask + '.po';
+    FileList := FindAllFiles(GetLangFileDir, SearchMask);
+    for I := 0 to FileList.Count - 1 do begin
+      FileName := FileList[I];
+      //FileName := FindLocaleFileName('.po');
+      if FileExists(FileName) and (
+      ((LocaleShort = '') and (Pos('.', FileName) = Pos('.po', FileName))) or
+      (LocaleShort <> '')) then FPOFiles.Add(TPOFile.Create(FileName));
+    end;
+  finally
+    FileList.Free;
+  end;
+end;
+
+procedure TCoolTranslator.SetPOFilesFolder(const AValue: string);
+begin
+  if FPoFilesFolder = AValue then Exit;
+  FPoFilesFolder := AValue;
+  ReloadFiles;
+  CheckLanguageFiles;
+end;
+
+procedure TCoolTranslator.SetLanguage(const AValue: TLanguage);
+begin
+  if FLanguage = AValue then Exit;
+  FLanguage := AValue;
+  ReloadFiles;
+  Translate;
+  if Assigned(FOnTranslate) then FOnTranslate(Self);
+end;
+
+procedure TCoolTranslator.TranslateComponent(Component: TPersistent);
+var
+  I, Count: Integer;
+  PropInfo: PPropInfo;
+  PropList: PPropList;
+  Excludes: TComponentExcludes;
+begin
+  Count := GetTypeData(Component.ClassInfo)^.PropCount;
+  if Count > 0 then begin
+    GetMem(PropList, Count * SizeOf(Pointer));
+    try
+      GetPropInfos(Component.ClassInfo, PropList);
+      for I := 0 to Count - 1 do
+      begin
+        PropInfo := PropList^[I];
+        if PropInfo = nil then
+          Break;
+        TranslateProperty(Component, PropInfo);
+      end;
+    finally
+      FreeMem(PropList, Count * SizeOf(Pointer));
+    end;
+  end;
+end;
+
+procedure TCoolTranslator.TranslateComponentRecursive(Component: TComponent);
+var
+  I: Integer;
+begin
+  TranslateComponent(Component);
+  for I := 0 to Component.ComponentCount - 1 do
+    TranslateComponentRecursive(Component.Components[I]);
+end;
+
+procedure TCoolTranslator.TranslateProperty(Component: TPersistent;
+  PropInfo: PPropInfo);
+var
+  PropType: PTypeInfo;
+  Obj: TObject;
+  I: Integer;
+begin
+
+//  PropInfo^.Name;
+  // Using IsDefaultPropertyValue will tell us if we should write out
+  // a given property because it was different from the default or
+  // different from the Ancestor (if applicable).
+  if (PropInfo^.GetProc <> nil) and
+     ((PropInfo^.SetProc <> nil) or
+     ((PropInfo^.PropType^.Kind = tkClass) and
+      (TObject(GetOrdProp(Component, PropInfo)) is TComponent) and
+      (csSubComponent in TComponent(GetOrdProp(Component, PropInfo)).ComponentStyle))) then
+  begin
+    begin
+      PropType := PropInfo^.PropType;
+      case PropType^.Kind of
+        tkString, tkLString, tkWString, tkAString: begin
+          if (UpperCase(PropType.Name) = 'TTRANSLATESTRING') then
+          //if not IsExcluded(Component, PropInfo^.Name) then
+              SetStrProp(Component, PropInfo, TranslateText(PropInfo^.Name, GetWideStrProp(Component, PropInfo)));
+        end;
+        tkClass: begin
+          Obj := TObject(GetOrdProp(Component, PropInfo));
+          if Obj is TCollection then
+            for I := 0 to TCollection(Obj).Count - 1 do
+              with TCollection(Obj).Items[I] do
+                TranslateComponent(TCollection(Obj).Items[I]);
+          (*if Obj is TStrings then
+            for I := 0 to TStrings(Obj).Count - 1 do
+              with TStrings(Obj) do
+                Strings[I] := TranslateText(Strings[I], Strings[I]);
+          *)
+        end;
+      end;
+    end;
+  end;
+end;
+
+function TCoolTranslator.IsExcluded(Component: TPersistent; PropertyName: string
+  ): Boolean;
+var
+  Item: TClass;
+
+  Excludes: TComponentExcludes;
+begin
+  Result := False;
+  Item := Component.ClassType;
+  while Assigned(Item) do begin
+    //ShowMessage(Component.Name + ', ' + Component.ClassName + ', ' + Item.ClassName + ', ' + PropertyName);
+    Excludes := ComponentExcludes.FindByClassType(Item.ClassType);
+    if Assigned(Excludes) then begin
+      if Excludes.PropertyExcludes.IndexOf(PropertyName) <> -1 then begin
+        Result := True;
+        Exit;
+      end;
+    end;
+    Item := Item.ClassParent;
+  end;
+end;
+
+function TCoolTranslator.GetLangFileDir: string;
+begin
+  Result := FPOFilesFolder;
+  if Copy(Result, 1, 1) <> DirectorySeparator then
+    Result := ExtractFileDir(UTF8Encode(Application.ExeName)) +
+      DirectorySeparator + Result;
+end;
+
+procedure TCoolTranslator.LanguageListToStrings(Strings: TStrings);
+var
+  I: Integer;
+  ItemName: string;
+begin
+  with Strings do begin
+    Clear;
+    for I := 0 to Languages.Count - 1 do
+    with TLanguage(Languages[I]) do
+      if Available then begin
+        ItemName := Name;
+        if Code <> '' then ItemName := ItemName + ' (' + Code + ')';
+        AddObject(ItemName, Languages[I]);
+      end;
+  end;
+end;
+
+procedure TCoolTranslator.TranslateResourceStrings(PoFileName: string);
+begin
+  Translations.TranslateResourceStrings(PoFileName);
+end;
+
+procedure TCoolTranslator.TranslateUnitResourceStrings(UnitName: string;
+  PoFileName: string);
+begin
+  Translations.TranslateUnitResourceStrings(UnitName, PoFileName);
+end;
+
+function TCoolTranslator.TranslateText(Identifier, Text: string): string;
+var
+  I: Integer;
+begin
+  Result := '';
+  if Text <> '' then begin
+    for I := 0 to FPoFiles.Count - 1 do begin
+      Result := TPoFile(FPOFiles[I]).Translate(Identifier, Text);
+      if Result <> Text then Break;
+    end;
+    if Result = '' then Result := Text;
+  end else Result := '';
+end;
+
+procedure TCoolTranslator.AddExcludes(AClassType: TClass; PropertyName: string
+  );
+var
+  NewItem: TComponentExcludes;
+begin
+  NewItem := ComponentExcludes.FindByClassType(AClassType);
+  if not Assigned(NewItem) then begin
+    NewItem := TComponentExcludes.Create;
+    NewItem.ExcludedClassType := AClassType;
+    ComponentExcludes.Add(NewItem);
+  end;
+  NewItem.PropertyExcludes.Add(PropertyName);
+end;
+
+procedure TCoolTranslator.CheckLanguageFiles;
+var
+  I: Integer;
+  LangDir: string;
+begin
+  LangDir := GetLangFileDir;
+  TLanguage(Languages[0]).Available := True; // Automatic
+
+  for I := 1 to Languages.Count - 1 do
+  with TLanguage(Languages[I]) do begin
+    Available := FileExists(LangDir + DirectorySeparator + ExtractFileNameOnly(Application.ExeName) +
+      '.' + Code + ExtensionSeparator + 'po') or (Code = 'en');
+  end;
+end;
+
+constructor TCoolTranslator.Create(AOwner: TComponent);
+begin
+  inherited;
+  FPOFiles := TObjectList.Create;
+  ComponentExcludes := TComponentExcludesList.Create;
+  Languages := TLanguageList.Create;
+  POFilesFolder := 'Languages';
+  CheckLanguageFiles;
+
+  // LCL
+  AddExcludes(TComponent, 'Name');
+  //AddExcludes(TAction, 'Category');
+  AddExcludes(TControl, 'HelpKeyword');
+end;
+
+destructor TCoolTranslator.Destroy;
+begin
+  FPOFiles.Free;
+  Languages.Free;
+  ComponentExcludes.Free;
+  inherited Destroy;
+end;
+
+function TCoolTranslator.GetLocale: string;
+var
+  Lang: string;
+  I: Integer;
+  T: string;
+begin
+  // Win32 user may decide to override locale with LANG variable.
+  Lang := GetEnvironmentVariable('LANG');
+
+  // Use user selected language
+  if Assigned(Language) and (Language.Code <> '') then
+    Lang := Language.Code;
+
+  if Lang = '' then begin
+    for i := 1 to Paramcount - 1 do
+      if (ParamStr(i) = '--LANG') or (ParamStr(i) = '-l') or
+        (ParamStr(i) = '--lang') then
+        Lang := ParamStr(i + 1);
+  end;
+  if Lang = '' then
+    LCLGetLanguageIDs(Lang, T);
+
+  if Assigned(Language) and (Language.Code = '') and Assigned(FOnAutomaticLanguage) then begin
+    Lang := FOnAutomaticLanguage(Lang);
+  end;
+
+  Result := Lang;
+end;
+
+function TCoolTranslator.GetLocaleShort: string;
+begin
+  Result := Copy(GetLocale, 1, 2);
+end;
+
+function TCoolTranslator.FindLocaleFileName(LCExt: string): string;
+var
+  T: string;
+  Lang: string;
+begin
+  Result := '';
+  Lang := GetLocale;
+
+  Result := GetLocaleFileName(Lang, LCExt);
+  if Result <> '' then
+    Exit;
+
+  Result := ChangeFileExt(ParamStr(0), LCExt);
+  if FileExistsUTF8(Result) then
+    Exit;
+
+  Result := '';
+end;
+
+function TCoolTranslator.GetLocaleFileName(const LangID, LCExt: string): string;
+var
+  LangShortID: string;
+  FormatLang: string;
+begin
+  if LangID <> '' then FormatLang := '.%s' else FormatLang := '';
+
+  begin
+
+    // ParamStrUTF8(0) is said not to work properly in linux, but I've tested it
+    Result := ExtractFilePath(ParamStrUTF8(0)) + LangID +
+      DirectorySeparator + ChangeFileExt(ExtractFileName(ParamStrUTF8(0)), LCExt);
+    if FileExistsUTF8(Result) then
+      exit;
+
+    Result := ExtractFilePath(ParamStrUTF8(0)) + 'languages' + DirectorySeparator + LangID +
+      DirectorySeparator + ChangeFileExt(ExtractFileName(ParamStrUTF8(0)), LCExt);
+    if FileExistsUTF8(Result) then
+      exit;
+
+    Result := ExtractFilePath(ParamStrUTF8(0)) + 'locale' + DirectorySeparator
+      + LangID + DirectorySeparator + ChangeFileExt(ExtractFileName(ParamStrUTF8(0)), LCExt);
+    if FileExistsUTF8(Result) then
+      exit;
+
+    Result := ExtractFilePath(ParamStrUTF8(0)) + 'locale' + DirectorySeparator
+      + LangID + DirectorySeparator + 'LC_MESSAGES' + DirectorySeparator +
+      ChangeFileExt(ExtractFileName(ParamStrUTF8(0)), LCExt);
+    if FileExistsUTF8(Result) then
+      exit;
+
+    {$IFDEF UNIX}
+    // In unix-like systems we can try to search for global locale
+    Result := '/usr/share/locale/' + LangID + '/LC_MESSAGES/' +
+      ChangeFileExt(ExtractFileName(ParamStrUTF8(0)), LCExt);
+    if FileExistsUTF8(Result) then
+      exit;
+    {$ENDIF}
+    // Let us search for reducted files
+    LangShortID := copy(LangID, 1, 2);
+    // At first, check all was checked
+    Result := ExtractFilePath(ParamStrUTF8(0)) + LangShortID +
+      DirectorySeparator + ChangeFileExt(ExtractFileName(ParamStrUTF8(0)), LCExt);
+    if FileExistsUTF8(Result) then
+      exit;
+
+    Result := ExtractFilePath(ParamStrUTF8(0)) + 'languages' + DirectorySeparator +
+      LangShortID + DirectorySeparator + ChangeFileExt(
+      ExtractFileName(ParamStrUTF8(0)), LCExt);
+    if FileExistsUTF8(Result) then
+      exit;
+
+    Result := ExtractFilePath(ParamStrUTF8(0)) + 'locale' + DirectorySeparator
+      + LangShortID + DirectorySeparator + ChangeFileExt(
+      ExtractFileName(ParamStrUTF8(0)), LCExt);
+    if FileExistsUTF8(Result) then
+      exit;
+
+    Result := ExtractFilePath(ParamStrUTF8(0)) + 'locale' + DirectorySeparator
+      + LangShortID + DirectorySeparator + 'LC_MESSAGES' + DirectorySeparator +
+      ChangeFileExt(ExtractFileName(ParamStrUTF8(0)), LCExt);
+    if FileExistsUTF8(Result) then
+      exit;
+
+    // Full language in file name - this will be default for the project
+    // We need more careful handling, as it MAY result in incorrect filename
+    try
+      Result := ExtractFilePath(ParamStrUTF8(0)) + ChangeFileExt(ExtractFileName(ParamStrUTF8(0)), Format(FormatLang, [LangID])) + LCExt;
+      if FileExistsUTF8(Result) then
+        exit;
+      // Common location (like in Lazarus)
+      Result := ExtractFilePath(ParamStrUTF8(0)) + 'locale' + DirectorySeparator +
+        ChangeFileExt(ExtractFileName(ParamStrUTF8(0)), Format(FormatLang, [LangID])) + LCExt;
+      if FileExistsUTF8(Result) then
+        exit;
+
+      Result := ExtractFilePath(ParamStrUTF8(0)) + 'languages' +
+        DirectorySeparator + ChangeFileExt(ExtractFileName(ParamStrUTF8(0)), Format(FormatLang, [LangID])) + LCExt;
+      if FileExistsUTF8(Result) then
+        exit;
+    except
+      Result := ''; // Or do something else (useless)
+    end;
+
+    {$IFDEF UNIX}
+    Result := '/usr/share/locale/' + LangShortID + '/LC_MESSAGES/' +
+      ChangeFileExt(ExtractFileName(ParamStrUTF8(0)), LCExt);
+    if FileExistsUTF8(Result) then
+      exit;
+    {$ENDIF}
+    Result := ExtractFilePath(ParamStrUTF8(0)) + ChangeFileExt(
+      ExtractFileName(ParamStrUTF8(0)), Format(FormatLang, [LangShortID])) + LCExt;
+    if FileExistsUTF8(Result) then
+      exit;
+
+    Result := ExtractFilePath(ParamStrUTF8(0)) + 'locale' + DirectorySeparator +
+      ChangeFileExt(ExtractFileName(ParamStrUTF8(0)), Format(FormatLang, [LangShortID])) + LCExt;
+    if FileExistsUTF8(Result) then
+      exit;
+
+    Result := ExtractFilePath(ParamStrUTF8(0)) + 'languages' + DirectorySeparator +
+      ChangeFileExt(ExtractFileName(ParamStrUTF8(0)), Format(FormatLang, [LangShortID])) + LCExt;
+    if FileExistsUTF8(Result) then
+      exit;
+  end;
+
+  Result := '';
+end;
+
+
+end.
+
Index: /tags/1.1.0/Packages/CoolTranslator/ULanguages.pas
===================================================================
--- /tags/1.1.0/Packages/CoolTranslator/ULanguages.pas	(revision 137)
+++ /tags/1.1.0/Packages/CoolTranslator/ULanguages.pas	(revision 137)
@@ -0,0 +1,447 @@
+unit ULanguages;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+  Classes, SysUtils, Contnrs;
+
+type
+  TLanguage = class
+    Name: string;
+    Code: string;
+    Available: Boolean;
+  end;
+
+  { TLanguageList }
+
+  TLanguageList = class(TObjectList)
+    function SearchByCode(ACode: string): TLanguage;
+    procedure AddNew(Code: string; Name: string);
+    constructor Create;
+  end;
+
+
+resourcestring
+  SLangAuto = 'Automatic';
+  SLang_aa = 'Afar';
+  SLang_ab = 'Abkhazian';
+  SLang_ae = 'Avestan';
+  SLang_af = 'Afrikaans';
+  SLang_ak = 'Akan';
+  SLang_am = 'Amharic';
+  SLang_an = 'Aragonese';
+  SLang_ar = 'Arabic';
+  SLang_as = 'Assamese';
+  SLang_av = 'Avaric';
+  SLang_ay = 'Aymara';
+  SLang_az = 'Azerbaijani';
+  SLang_ba = 'Bashkir';
+  SLang_be = 'Belarusian';
+  SLang_bg = 'Bulgarian';
+  SLang_bh = 'Bihari';
+  SLang_bi = 'Bislama';
+  SLang_bm = 'Bambara';
+  SLang_bn = 'Bengali';
+  SLang_bo = 'Tibetan';
+  SLang_br = 'Breton';
+  SLang_bs = 'Bosnian';
+  SLang_ca = 'Catalan';
+  SLang_ce = 'Chechen';
+  SLang_ch = 'Chamorro';
+  SLang_co = 'Corsican';
+  SLang_cr = 'Cree';
+  SLang_cs = 'Czech';
+  SLang_cv = 'Chuvash';
+  SLang_cy = 'Welsh';
+  SLang_da = 'Danish';
+  SLang_de = 'German';
+  SLang_de_AT = 'Austrian German';
+  SLang_de_CH = 'Swiss German';
+  SLang_dv = 'Divehi';
+  SLang_dz = 'Dzongkha';
+  SLang_ee = 'Ewe';
+  SLang_el = 'Greek';
+  SLang_en = 'English';
+  SLang_en_AU = 'Australian English';
+  SLang_en_CA = 'Canadian English';
+  SLang_en_GB = 'British English';
+  SLang_en_US = 'American English';
+  SLang_eo = 'Esperanto';
+  SLang_es = 'Spanish';
+  SLang_et = 'Estonian';
+  SLang_eu = 'Basque';
+  SLang_fa = 'Persian';
+  SLang_ff = 'Fulah';
+  SLang_fi = 'Finnish';
+  SLang_fj = 'Fijian';
+  SLang_fo = 'Faroese';
+  SLang_fr = 'French';
+  SLang_fr_BE = 'Walloon';
+  SLang_fy = 'Frisian';
+  SLang_ga = 'Irish';
+  SLang_gd = 'Gaelic';
+  SLang_gl = 'Gallegan';
+  SLang_gn = 'Guarani';
+  SLang_gu = 'Gujarati';
+  SLang_gv = 'Manx';
+  SLang_ha = 'Hausa';
+  SLang_he = 'Hebrew';
+  SLang_hi = 'Hindi';
+  SLang_ho = 'Hiri Motu';
+  SLang_hr = 'Croatian';
+  SLang_ht = 'Haitian';
+  SLang_hu = 'Hungarian';
+  SLang_hy = 'Armenian';
+  SLang_hz = 'Herero';
+  SLang_ia = 'Interlingua';
+  SLang_id = 'Indonesian';
+  SLang_ie = 'Interlingue';
+  SLang_ig = 'Igbo';
+  SLang_ii = 'Sichuan Yi';
+  SLang_ik = 'Inupiaq';
+  SLang_io = 'Ido';
+  SLang_is = 'Icelandic';
+  SLang_it = 'Italian';
+  SLang_iu = 'Inuktitut';
+  SLang_ja = 'Japanese';
+  SLang_jv = 'Javanese';
+  SLang_ka = 'Georgian';
+  SLang_kg = 'Kongo';
+  SLang_ki = 'Kikuyu';
+  SLang_kj = 'Kuanyama';
+  SLang_kk = 'Kazakh';
+  SLang_kl = 'Greenlandic';
+  SLang_km = 'Khmer';
+  SLang_kn = 'Kannada';
+  SLang_ko = 'Korean';
+  SLang_kr = 'Kanuri';
+  SLang_ks = 'Kashmiri';
+  SLang_ku = 'Kurdish';
+  SLang_kw = 'Cornish';
+  SLang_kv = 'Komi';
+  SLang_ky = 'Kirghiz';
+  SLang_la = 'Latin';
+  SLang_lb = 'Luxembourgish';
+  SLang_lg = 'Ganda';
+  SLang_li = 'Limburgan';
+  SLang_ln = 'Lingala';
+  SLang_lo = 'Lao';
+  SLang_lt = 'Lithuanian';
+  SLang_lu = 'Luba-Katanga';
+  SLang_lv = 'Latvian';
+  SLang_mg = 'Malagasy';
+  SLang_mh = 'Marshallese';
+  SLang_mi = 'Maori';
+  SLang_mk = 'Macedonian';
+  SLang_ml = 'Malayalam';
+  SLang_mn = 'Mongolian';
+  SLang_mo = 'Moldavian';
+  SLang_mr = 'Marathi';
+  SLang_ms = 'Malay';
+  SLang_mt = 'Maltese';
+  SLang_my = 'Burmese';
+  SLang_na = 'Nauru';
+  SLang_nb = 'Norwegian Bokmaal';
+  SLang_nd = 'Ndebele, North';
+  SLang_ne = 'Nepali';
+  SLang_ng = 'Ndonga';
+  SLang_nl = 'Dutch';
+  SLang_nl_BE = 'Flemish';
+  SLang_nn = 'Norwegian Nynorsk';
+  SLang_no = 'Norwegian';
+  SLang_nr = 'Ndebele, South';
+  SLang_nv = 'Navajo';
+  SLang_ny = 'Chichewa';
+  SLang_oc = 'Occitan';
+  SLang_oj = 'Ojibwa';
+  SLang_om = 'Oromo';
+  SLang_or = 'Oriya';
+  SLang_os = 'Ossetian';
+  SLang_pa = 'Panjabi';
+  SLang_pi = 'Pali';
+  SLang_pl = 'Polish';
+  SLang_ps = 'Pushto';
+  SLang_pt = 'Portuguese';
+  SLang_pt_BR = 'Brazilian Portuguese';
+  SLang_qu = 'Quechua';
+  SLang_rm = 'Raeto-Romance';
+  SLang_rn = 'Rundi';
+  SLang_ro = 'Romanian';
+  SLang_ru = 'Russian';
+  SLang_rw = 'Kinyarwanda';
+  SLang_sa = 'Sanskrit';
+  SLang_sc = 'Sardinian';
+  SLang_sd = 'Sindhi';
+  SLang_se = 'Northern Sami';
+  SLang_sg = 'Sango';
+  SLang_si = 'Sinhalese';
+  SLang_sk = 'Slovak';
+  SLang_sl = 'Slovenian';
+  SLang_sm = 'Samoan';
+  SLang_sn = 'Shona';
+  SLang_so = 'Somali';
+  SLang_sq = 'Albanian';
+  SLang_sr = 'Serbian';
+  SLang_ss = 'Swati';
+  SLang_st = 'Sotho, Southern';
+  SLang_su = 'Sundanese';
+  SLang_sv = 'Swedish';
+  SLang_sw = 'Swahili';
+  SLang_ta = 'Tamil';
+  SLang_te = 'Telugu';
+  SLang_tg = 'Tajik';
+  SLang_th = 'Thai';
+  SLang_ti = 'Tigrinya';
+  SLang_tk = 'Turkmen';
+  SLang_tl = 'Tagalog';
+  SLang_tn = 'Tswana';
+  SLang_to = 'Tonga';
+  SLang_tr = 'Turkish';
+  SLang_ts = 'Tsonga';
+  SLang_tt = 'Tatar';
+  SLang_tw = 'Twi';
+  SLang_ty = 'Tahitian';
+  SLang_ug = 'Uighur';
+  SLang_uk = 'Ukrainian';
+  SLang_ur = 'Urdu';
+  SLang_uz = 'Uzbek';
+  SLang_ve = 'Venda';
+  SLang_vi = 'Vietnamese';
+  SLang_vo = 'Volapuk';
+  SLang_wa = 'Walloon';
+  SLang_wo = 'Wolof';
+  SLang_xh = 'Xhosa';
+  SLang_yi = 'Yiddish';
+  SLang_yo = 'Yoruba';
+  SLang_za = 'Zhuang';
+  SLang_zh = 'Chinese';
+  SLang_zu = 'Zulu';
+
+implementation
+
+
+{ TLanguageList }
+
+function TLanguageList.SearchByCode(ACode: string): TLanguage;
+var
+  I: Integer;
+begin
+  I := 0;
+  while (I < Count) and (TLanguage(Items[I]).Code < ACode) do Inc(I);
+  if I < Count then Result := TLanguage(Items[I])
+    else Result := nil;
+end;
+
+procedure TLanguageList.AddNew(Code: string; Name: string);
+var
+  NewItem: TLanguage;
+begin
+  NewItem := TLanguage.Create;
+  NewItem.Name := Name;
+  NewItem.Code := Code;
+  Add(NewItem);
+end;
+
+constructor TLanguageList.Create;
+begin
+  inherited Create;
+  AddNew('', SLangAuto);
+  AddNew('aa', SLang_aa);
+  AddNew('ab', SLang_ab);
+  AddNew('ae', SLang_ae);
+  AddNew('af', SLang_af);
+  AddNew('ak', SLang_ak);
+  AddNew('am', SLang_am);
+  AddNew('an', SLang_an);
+  AddNew('ar', SLang_ar);
+  AddNew('as', SLang_as);
+  AddNew('av', SLang_av);
+  AddNew('ay', SLang_ay);
+  AddNew('az', SLang_az);
+  AddNew('ba', SLang_ba);
+  AddNew('be', SLang_be);
+  AddNew('bg', SLang_bg);
+  AddNew('bh', SLang_bh);
+  AddNew('bi', SLang_bi);
+  AddNew('bm', SLang_bm);
+  AddNew('bn', SLang_bn);
+  AddNew('bo', SLang_bo);
+  AddNew('br', SLang_br);
+  AddNew('bs', SLang_bs);
+  AddNew('ca', SLang_ca);
+  AddNew('ce', SLang_ce);
+  AddNew('ch', SLang_ch);
+  AddNew('co', SLang_co);
+  AddNew('cr', SLang_cr);
+  AddNew('cs', SLang_cs);
+  AddNew('cv', SLang_cv);
+  AddNew('cy', SLang_cy);
+  AddNew('da', SLang_da);
+  AddNew('de', SLang_de);
+  AddNew('de_AT', SLang_de_AT);
+  AddNew('de_CH', SLang_de_CH);
+  AddNew('dv', SLang_dv);
+  AddNew('dz', SLang_dz);
+  AddNew('ee', SLang_ee);
+  AddNew('el', SLang_el);
+  AddNew('en', SLang_en);
+  AddNew('en_AU', SLang_en_AU);
+  AddNew('en_CA', SLang_en_CA);
+  AddNew('en_GB', SLang_en_GB);
+  AddNew('en_US', SLang_en_US);
+  AddNew('eo', SLang_eo);
+  AddNew('es', SLang_es);
+  AddNew('et', SLang_et);
+  AddNew('eu', SLang_eu);
+  AddNew('fa', SLang_fa);
+  AddNew('ff', SLang_ff);
+  AddNew('fi', SLang_fi);
+  AddNew('fj', SLang_fj);
+  AddNew('fo', SLang_fo);
+  AddNew('fr', SLang_fr);
+  AddNew('fr_BE', SLang_fr_BE);
+  AddNew('fy', SLang_fy);
+  AddNew('ga', SLang_ga);
+  AddNew('gd', SLang_gd);
+  AddNew('gl', SLang_gl);
+  AddNew('gn', SLang_gn);
+  AddNew('gu', SLang_gu);
+  AddNew('gv', SLang_gv);
+  AddNew('ha', SLang_ha);
+  AddNew('he', SLang_he);
+  AddNew('hi', SLang_hi);
+  AddNew('ho', SLang_ho);
+  AddNew('hr', SLang_hr);
+  AddNew('ht', SLang_ht);
+  AddNew('hu', SLang_hu);
+  AddNew('hy', SLang_hy);
+  AddNew('hz', SLang_hz);
+  AddNew('ia', SLang_ia);
+  AddNew('id', SLang_id);
+  AddNew('ie', SLang_ie);
+  AddNew('ig', SLang_ig);
+  AddNew('ii', SLang_ii);
+  AddNew('ik', SLang_ik);
+  AddNew('io', SLang_io);
+  AddNew('is', SLang_is);
+  AddNew('it', SLang_it);
+  AddNew('iu', SLang_iu);
+  AddNew('ja', SLang_ja);
+  AddNew('jv', SLang_jv);
+  AddNew('ka', SLang_ka);
+  AddNew('kg', SLang_kg);
+  AddNew('ki', SLang_ki);
+  AddNew('kj', SLang_kj);
+  AddNew('kk', SLang_kk);
+  AddNew('kl', SLang_kl);
+  AddNew('km', SLang_km);
+  AddNew('kn', SLang_kn);
+  AddNew('ko', SLang_ko);
+  AddNew('kr', SLang_kr);
+  AddNew('ks', SLang_ks);
+  AddNew('ku', SLang_ku);
+  AddNew('kw', SLang_kw);
+  AddNew('kv', SLang_kv);
+  AddNew('ky', SLang_ky);
+  AddNew('la', SLang_la);
+  AddNew('lb', SLang_lb);
+  AddNew('lg', SLang_lg);
+  AddNew('li', SLang_li);
+  AddNew('ln', SLang_ln);
+  AddNew('lo', SLang_lo);
+  AddNew('lt', SLang_lt);
+  AddNew('lu', SLang_lu);
+  AddNew('lv', SLang_lv);
+  AddNew('mg', SLang_mg);
+  AddNew('mh', SLang_mh);
+  AddNew('mi', SLang_mi);
+  AddNew('mk', SLang_mk);
+  AddNew('ml', SLang_ml);
+  AddNew('mn', SLang_mn);
+  AddNew('mo', SLang_mo);
+  AddNew('mr', SLang_mr);
+  AddNew('ms', SLang_ms);
+  AddNew('mt', SLang_mt);
+  AddNew('my', SLang_my);
+  AddNew('na', SLang_na);
+  AddNew('nb', SLang_nb);
+  AddNew('nd', SLang_nd);
+  AddNew('ne', SLang_ne);
+  AddNew('ng', SLang_ng);
+  AddNew('nl', SLang_nl);
+  AddNew('nl_BE', SLang_nl_BE);
+  AddNew('nn', SLang_nn);
+  AddNew('no', SLang_no);
+  AddNew('nr', SLang_nr);
+  AddNew('nv', SLang_nv);
+  AddNew('ny', SLang_ny);
+  AddNew('oc', SLang_oc);
+  AddNew('oj', SLang_oj);
+  AddNew('om', SLang_om);
+  AddNew('or', SLang_or);
+  AddNew('os', SLang_os);
+  AddNew('pa', SLang_pa);
+  AddNew('pi', SLang_pi);
+  AddNew('pl', SLang_pl);
+  AddNew('ps', SLang_ps);
+  AddNew('pt', SLang_pt);
+  AddNew('pt_BR', SLang_pt_BR);
+  AddNew('qu', SLang_qu);
+  AddNew('rm', SLang_rm);
+  AddNew('rn', SLang_rn);
+  AddNew('ro', SLang_ro);
+  AddNew('ru', SLang_ru);
+  AddNew('rw', SLang_rw);
+  AddNew('sa', SLang_sa);
+  AddNew('sc', SLang_sc);
+  AddNew('sd', SLang_sd);
+  AddNew('se', SLang_se);
+  AddNew('sg', SLang_sg);
+  AddNew('si', SLang_si);
+  AddNew('sk', SLang_sk);
+  AddNew('sl', SLang_sl);
+  AddNew('sm', SLang_sm);
+  AddNew('sn', SLang_sn);
+  AddNew('so', SLang_so);
+  AddNew('sq', SLang_sq);
+  AddNew('sr', SLang_sr);
+  AddNew('ss', SLang_ss);
+  AddNew('st', SLang_st);
+  AddNew('su', SLang_su);
+  AddNew('sv', SLang_sv);
+  AddNew('sw', SLang_sw);
+  AddNew('ta', SLang_ta);
+  AddNew('te', SLang_te);
+  AddNew('tg', SLang_tg);
+  AddNew('th', SLang_th);
+  AddNew('ti', SLang_ti);
+  AddNew('tk', SLang_tk);
+  AddNew('tl', SLang_tl);
+  AddNew('tn', SLang_tn);
+  AddNew('to', SLang_to);
+  AddNew('tr', SLang_tr);
+  AddNew('ts', SLang_ts);
+  AddNew('tt', SLang_tt);
+  AddNew('tw', SLang_tw);
+  AddNew('ty', SLang_ty);
+  AddNew('ug', SLang_ug);
+  AddNew('uk', SLang_uk);
+  AddNew('ur', SLang_ur);
+  AddNew('uz', SLang_uz);
+  AddNew('ve', SLang_ve);
+  AddNew('vi', SLang_vi);
+  AddNew('vo', SLang_vo);
+  AddNew('wa', SLang_wa);
+  AddNew('wo', SLang_wo);
+  AddNew('xh', SLang_xh);
+  AddNew('yi', SLang_yi);
+  AddNew('yo', SLang_yo);
+  AddNew('za', SLang_za);
+  AddNew('zh', SLang_zh);
+  AddNew('zu', SLang_zu);
+end;
+
+end.
+
Index: /tags/1.1.0/Packages/TemplateGenerics/Additional/UBinarySerializer.pas
===================================================================
--- /tags/1.1.0/Packages/TemplateGenerics/Additional/UBinarySerializer.pas	(revision 137)
+++ /tags/1.1.0/Packages/TemplateGenerics/Additional/UBinarySerializer.pas	(revision 137)
@@ -0,0 +1,379 @@
+unit UBinarySerializer;
+
+{$mode delphi}{$H+}
+
+interface
+
+uses
+  Classes, SysUtils, DateUtils, SpecializedList, SpecializedStream;
+
+type
+  TEndianness = (enBig, enLittle);
+
+  { TBinarySerializer }
+
+  TBinarySerializer = class
+  private
+    FGrow: Boolean;
+    FList: TListByte;
+    FEndianness: TEndianness;
+    SwapData: Boolean;
+    procedure SetList(const AValue: TListByte);
+    procedure SetEndianness(const AValue: TEndianness);
+    procedure ReverseByteOrder(var Buffer; Count: Integer);
+  public
+    Position: Integer;
+    OwnsList: Boolean;
+    procedure Write(var Buffer; Count: Integer); //inline;
+    procedure Read(var Buffer; Count: Integer); //inline;
+
+    procedure Assign(Source: TBinarySerializer);
+    procedure WriteByte(Data: Byte);
+    procedure WriteWord(Data: Word);
+    procedure WriteCardinal(Data: Cardinal);
+    procedure WriteInt64(Data: Int64);
+    procedure WriteString(Data: string);
+    procedure WriteShortString(Data: ShortString);
+    procedure WriteAnsiString(Data: string);
+    procedure WriteUnixTime(Data: TDateTime);
+    procedure WriteDouble(Value: Double);
+    procedure WriteSingle(Value: Single);
+    procedure WriteStream(AStream: TStreamByte; Count: Integer);
+    procedure WriteStreamPart(AStream: TStreamByte; Count: Integer);
+    procedure WriteList(List: TListByte; StartIndex, Count: Integer);
+    function ReadByte: Byte;
+    function ReadWord: Word;
+    function ReadCardinal: Cardinal;
+    function ReadInt64: Int64;
+    function ReadString(Length: Integer): string;
+    function ReadShortString: string;
+    function ReadAnsiString: string;
+    function ReadStringTerminated(Terminator: string = #0): string;
+    function ReadUnixTime: TDateTime;
+    function ReadDouble: Double;
+    function ReadSingle: Single;
+    procedure ReadStream(AStream: TStream; Count: Integer);
+    procedure ReadStreamPart(AStream: TStream; Count: Integer);
+    procedure ReadList(List: TListByte; StartIndex, Count: Integer);
+    constructor Create; overload;
+    procedure Clear;
+    destructor Destroy; override;
+    property Endianness: TEndianness read FEndianness write SetEndianness;
+    property List: TListByte read FList write SetList;
+    property Grow: Boolean read FGrow write FGrow;
+  end;
+
+
+implementation
+
+{ TBinarySerializer }
+
+function TBinarySerializer.ReadAnsiString: string;
+var
+  StringLength: Longint;
+begin
+  StringLength := 0;
+  Read(StringLength, SizeOf(StringLength));
+  Result := ReadString(StringLength);
+end;
+
+function TBinarySerializer.ReadStringTerminated(Terminator: string = #0): string;
+var
+  Data: Char;
+  I: Integer;
+  OldPosition: Integer;
+begin
+  OldPosition := Position;
+  Result := '';
+  I := 1;
+  repeat
+    if Position >= FList.Count then Break;
+    Data := Chr(ReadByte);
+    if Data <> Terminator[I] then begin
+      Result := Result + Data;
+      I := 1;
+    end else Inc(I);
+  until I > Length(Terminator);
+  if not (I > Length(Terminator)) then begin
+    Result := '';
+    Position := OldPosition;
+  end;
+end;
+
+function TBinarySerializer.ReadByte: Byte;
+begin
+  Result := 0;
+  Read(Result, SizeOf(Byte));
+end;
+
+function TBinarySerializer.ReadCardinal: Cardinal;
+begin
+  Result := 0;
+  Read(Result, SizeOf(Cardinal));
+  if SwapData then Result := SwapEndian(Result);
+end;
+
+function TBinarySerializer.ReadInt64: Int64;
+begin
+  Result := 0;
+  Read(Result, SizeOf(Int64));
+  if SwapData then Result := SwapEndian(Result);
+end;
+
+function TBinarySerializer.ReadString(Length: Integer): string;
+begin
+  if Length > 0 then begin
+    SetLength(Result, Length);
+    Read(Result[1], Length);
+  end else Result := '';
+end;
+
+function TBinarySerializer.ReadShortString: string;
+var
+  Count: Byte;
+begin
+  Count := 0;
+  Read(Count, 1);
+  Result := ReadString(Count);
+end;
+
+procedure TBinarySerializer.ReadStream(AStream: TStream; Count: Integer);
+var
+  Buffer: array of Byte;
+begin
+  if Count > 0 then begin
+    SetLength(Buffer, Count);
+    Read(Buffer[0], Count);
+    AStream.Size := Count;
+    AStream.Position := 0;
+    AStream.Write(Buffer[0], Count);
+  end;
+end;
+
+procedure TBinarySerializer.ReadStreamPart(AStream: TStream; Count: Integer);
+var
+  Buffer: array of Byte;
+begin
+  if Count > 0 then begin
+    SetLength(Buffer, Count);
+    Read(Buffer[0], Count);
+    if AStream.Size < (AStream.Position + Count) then
+      AStream.Size := AStream.Position + Count;
+    Write(Buffer[0], Count);
+  end;
+end;
+
+procedure TBinarySerializer.ReadList(List: TListByte; StartIndex, Count: Integer
+  );
+var
+  Buffer: array of Byte;
+begin
+  if Count > (List.Count - StartIndex) then Count := (List.Count - StartIndex); // Limit max. stream size
+  if Count > 0 then begin
+    SetLength(Buffer, Count);
+    Read(Pointer(Buffer)^, Count);
+    List.ReplaceBuffer(StartIndex, Pointer(Buffer)^, Count);
+  end;
+end;
+
+procedure TBinarySerializer.WriteStreamPart(AStream: TStreamByte; Count: Integer);
+var
+  Buffer: array of Byte;
+begin
+  if Count > AStream.Size then Count := AStream.Size; // Limit max. stream size
+  if Count > 0 then begin
+    SetLength(Buffer, Count);
+    AStream.ReadBuffer(Pointer(Buffer)^, Count);
+    Write(Pointer(Buffer)^, Count);
+  end;
+end;
+
+procedure TBinarySerializer.WriteList(List: TListByte; StartIndex, Count: Integer);
+var
+  Buffer: array of Byte;
+begin
+//  if Count > (List.Count - StartIndex) then Count := (List.Count - StartIndex); // Limit max. stream size
+  if Count > 0 then begin
+    SetLength(Buffer, Count);
+    List.GetBuffer(StartIndex, PByte(Buffer)^, Count);
+    Write(Pointer(Buffer)^, Count);
+  end;
+end;
+
+constructor TBinarySerializer.Create;
+begin
+  inherited;
+  Endianness := enLittle;
+  FList := nil;
+  FGrow := True;
+end;
+
+procedure TBinarySerializer.Clear;
+begin
+  FList.Count := 0;
+  Position := 0;
+end;
+
+destructor TBinarySerializer.Destroy;
+begin
+  if OwnsList then FList.Free;
+  inherited Destroy;
+end;
+
+function TBinarySerializer.ReadUnixTime: TDateTime;
+begin
+  Result := UnixToDateTime(ReadCardinal);
+end;
+
+function TBinarySerializer.ReadDouble: Double;
+begin
+  Result := 0;
+  Read(Result, SizeOf(Double));
+end;
+
+function TBinarySerializer.ReadSingle: Single;
+begin
+  Result := 0;
+  Read(Result, SizeOf(Single));
+end;
+
+function TBinarySerializer.ReadWord: Word;
+begin
+  Result := 0;
+  Read(Result, SizeOf(Word));
+  if SwapData then Result := SwapEndian(Result);
+end;
+
+procedure TBinarySerializer.SetList(const AValue: TListByte);
+begin
+  if OwnsList then FList.Free;
+  FList := AValue;
+end;
+
+procedure TBinarySerializer.SetEndianness(const AValue: TEndianness);
+begin
+  FEndianness := AValue;
+  {$if defined(FPC_LITTLE_ENDIAN)}
+  SwapData := FEndianness = enBig;
+  {$elseif defined(FPC_BIG_ENDIAN)}
+  SwapData := FEndianness = enLittle;
+  {$endif}
+end;
+
+procedure TBinarySerializer.ReverseByteOrder(var Buffer; Count: Integer);
+var
+  I: Integer;
+  Temp: Byte;
+type
+  TBytes = array of Byte;
+begin
+  I := 0;
+  while I < (Count div 2) do begin
+    Temp := TBytes(Buffer)[Count - 1 - I];
+    TBytes(Buffer)[Count - 1 - I] := TBytes(Buffer)[I];
+    TBytes(Buffer)[I] := Temp;
+    I := I + 1;
+  end;
+end;
+
+procedure TBinarySerializer.Write(var Buffer; Count: Integer);
+var
+  NewCount: Integer;
+begin
+  if FGrow then begin
+    NewCount := Position + Count;
+    if FList.Count < NewCount then
+      FList.Count := NewCount;
+  end;
+  FList.ReplaceBuffer(Position, Buffer, Count);
+  Inc(Position, Count);
+end;
+
+procedure TBinarySerializer.Read(var Buffer; Count: Integer);
+begin
+  FList.GetBuffer(Position, Buffer, Count);
+  Inc(Position, Count);
+end;
+
+procedure TBinarySerializer.Assign(Source: TBinarySerializer);
+begin
+  FList := Source.FList;
+end;
+
+procedure TBinarySerializer.WriteAnsiString(Data: string);
+var
+  StringLength: Longint;
+begin
+  StringLength := Length(Data);
+  Write(StringLength, SizeOf(StringLength));
+  Write(Data[1], StringLength);
+end;
+
+procedure TBinarySerializer.WriteByte(Data: Byte);
+begin
+  Write(Data, SizeOf(Byte));
+end;
+
+procedure TBinarySerializer.WriteCardinal(Data: Cardinal);
+begin
+  if SwapData then Data := SwapEndian(Data);
+  Write(Data, SizeOf(Cardinal));
+end;
+
+procedure TBinarySerializer.WriteInt64(Data: Int64);
+begin
+  if SwapData then Data := SwapEndian(Data);
+  Write(Data, SizeOf(Int64));
+end;
+
+procedure TBinarySerializer.WriteString(Data:string);
+begin
+  if Length(Data) > 0 then
+    Write(Data[1], Length(Data));
+end;
+
+procedure TBinarySerializer.WriteShortString(Data: ShortString);
+begin
+  WriteByte(Length(Data));
+  Write(Data[1], Length(Data));
+end;
+
+procedure TBinarySerializer.WriteStream(AStream: TStreamByte; Count: Integer);
+var
+  Buffer: array of Byte;
+begin
+  if Count > AStream.Size then Count := AStream.Size; // Limit max. stream size
+  AStream.Position := 0;
+  if Count > 0 then begin
+    SetLength(Buffer, Count);
+    AStream.ReadBuffer(Pointer(Buffer)^, Count);
+    Write(Pointer(Buffer)^, Count);
+  end;
+end;
+
+procedure TBinarySerializer.WriteDouble(Value: Double);
+begin
+  Write(Value, SizeOf(Double));
+end;
+
+procedure TBinarySerializer.WriteSingle(Value: Single);
+begin
+  Write(Value, SizeOf(Single));
+end;
+
+procedure TBinarySerializer.WriteUnixTime(Data: TDateTime);
+var
+  DataUnix: Int64;
+begin
+  DataUnix := DateTimeToUnix(Data);
+  WriteCardinal(DataUnix);
+end;
+
+procedure TBinarySerializer.WriteWord(Data: Word);
+begin
+  if SwapData then Data := SwapEndian(Data);
+  Write(Data, SizeOf(Word));
+end;
+
+end.
+
Index: /tags/1.1.0/Packages/TemplateGenerics/Demo/Demo.lpi
===================================================================
--- /tags/1.1.0/Packages/TemplateGenerics/Demo/Demo.lpi	(revision 137)
+++ /tags/1.1.0/Packages/TemplateGenerics/Demo/Demo.lpi	(revision 137)
@@ -0,0 +1,840 @@
+<?xml version="1.0"?>
+<CONFIG>
+  <ProjectOptions>
+    <Version Value="9"/>
+    <General>
+      <MainUnit Value="0"/>
+      <ResourceType Value="res"/>
+      <UseXPManifest Value="True"/>
+      <Icon Value="0"/>
+      <ActiveWindowIndexAtStart Value="0"/>
+    </General>
+    <i18n>
+      <EnableI18N LFM="False"/>
+    </i18n>
+    <VersionInfo>
+      <StringTable ProductVersion=""/>
+    </VersionInfo>
+    <BuildModes Count="1">
+      <Item1 Name="default" Default="True"/>
+    </BuildModes>
+    <PublishOptions>
+      <Version Value="2"/>
+      <IncludeFileFilter Value="*.(pas|pp|inc|lfm|lpr|lrs|lpi|lpk|sh|xml)"/>
+      <ExcludeFileFilter Value="*.(bak|ppu|ppw|o|so);*~;backup"/>
+    </PublishOptions>
+    <RunParams>
+      <local>
+        <FormatVersion Value="1"/>
+        <LaunchingApplication PathPlusParams="/usr/bin/xterm -T 'Lazarus Run Output' -e $(LazarusDir)/tools/runwait.sh $(TargetCmdLine)"/>
+      </local>
+    </RunParams>
+    <RequiredPackages Count="2">
+      <Item1>
+        <PackageName Value="TemplateGenerics"/>
+        <DefaultFilename Value="../TemplateGenerics.lpk" Prefer="True"/>
+      </Item1>
+      <Item2>
+        <PackageName Value="LCL"/>
+      </Item2>
+    </RequiredPackages>
+    <Units Count="75">
+      <Unit0>
+        <Filename Value="Demo.lpr"/>
+        <IsPartOfProject Value="True"/>
+        <UnitName Value="Demo"/>
+        <WindowIndex Value="0"/>
+        <TopLine Value="1"/>
+        <CursorPos X="26" Y="8"/>
+        <UsageCount Value="233"/>
+        <DefaultSyntaxHighlighter Value="Delphi"/>
+      </Unit0>
+      <Unit1>
+        <Filename Value="UMainForm.pas"/>
+        <IsPartOfProject Value="True"/>
+        <ComponentName Value="MainForm"/>
+        <ResourceBaseClass Value="Form"/>
+        <UnitName Value="UMainForm"/>
+        <EditorIndex Value="0"/>
+        <WindowIndex Value="0"/>
+        <TopLine Value="640"/>
+        <CursorPos X="20" Y="653"/>
+        <UsageCount Value="233"/>
+        <Bookmarks Count="1">
+          <Item0 X="65" Y="275" ID="2"/>
+        </Bookmarks>
+        <Loaded Value="True"/>
+        <LoadedDesigner Value="True"/>
+        <DefaultSyntaxHighlighter Value="Delphi"/>
+      </Unit1>
+      <Unit2>
+        <Filename Value="../Specialized/ListDouble.pas"/>
+        <UnitName Value="ListDouble"/>
+        <WindowIndex Value="0"/>
+        <TopLine Value="1"/>
+        <CursorPos X="1" Y="11"/>
+        <UsageCount Value="3"/>
+      </Unit2>
+      <Unit3>
+        <Filename Value="../Specialized/SpecializedList.pas"/>
+        <UnitName Value="SpecializedList"/>
+        <EditorIndex Value="3"/>
+        <WindowIndex Value="0"/>
+        <TopLine Value="47"/>
+        <CursorPos X="20" Y="60"/>
+        <UsageCount Value="15"/>
+        <Loaded Value="True"/>
+      </Unit3>
+      <Unit4>
+        <Filename Value="../Specialized/ListObject.pas"/>
+        <UnitName Value="ListObject"/>
+        <WindowIndex Value="0"/>
+        <TopLine Value="33"/>
+        <CursorPos X="12" Y="56"/>
+        <UsageCount Value="3"/>
+      </Unit4>
+      <Unit5>
+        <Filename Value="../Specialized/ListPointer.pas"/>
+        <UnitName Value="ListPointer"/>
+        <WindowIndex Value="0"/>
+        <TopLine Value="1"/>
+        <CursorPos X="23" Y="21"/>
+        <UsageCount Value="3"/>
+      </Unit5>
+      <Unit6>
+        <Filename Value="../Specialized/TreeString.pas"/>
+        <UnitName Value="TreeString"/>
+        <WindowIndex Value="0"/>
+        <TopLine Value="1"/>
+        <CursorPos X="23" Y="24"/>
+        <UsageCount Value="3"/>
+      </Unit6>
+      <Unit7>
+        <Filename Value="../Specialized/TreePointer.pas"/>
+        <UnitName Value="TreePointer"/>
+        <WindowIndex Value="0"/>
+        <TopLine Value="1"/>
+        <CursorPos X="23" Y="13"/>
+        <UsageCount Value="3"/>
+      </Unit7>
+      <Unit8>
+        <Filename Value="../Specialized/TreeObject.pas"/>
+        <UnitName Value="TreeObject"/>
+        <WindowIndex Value="0"/>
+        <TopLine Value="1"/>
+        <CursorPos X="23" Y="24"/>
+        <UsageCount Value="3"/>
+      </Unit8>
+      <Unit9>
+        <Filename Value="../Specialized/TreeInteger.pas"/>
+        <UnitName Value="TreeInteger"/>
+        <WindowIndex Value="0"/>
+        <TopLine Value="1"/>
+        <CursorPos X="31" Y="13"/>
+        <UsageCount Value="3"/>
+      </Unit9>
+      <Unit10>
+        <Filename Value="../Specialized/ListString.pas"/>
+        <UnitName Value="ListString"/>
+        <WindowIndex Value="0"/>
+        <TopLine Value="1"/>
+        <CursorPos X="29" Y="17"/>
+        <UsageCount Value="3"/>
+      </Unit10>
+      <Unit11>
+        <Filename Value="../Generic/TreeImplementation.tpl"/>
+        <WindowIndex Value="0"/>
+        <TopLine Value="1"/>
+        <CursorPos X="1" Y="4"/>
+        <UsageCount Value="3"/>
+        <DefaultSyntaxHighlighter Value="None"/>
+      </Unit11>
+      <Unit12>
+        <Filename Value="../Generic/TreeInterface.tpl"/>
+        <WindowIndex Value="0"/>
+        <TopLine Value="1"/>
+        <CursorPos X="21" Y="6"/>
+        <UsageCount Value="3"/>
+        <DefaultSyntaxHighlighter Value="None"/>
+      </Unit12>
+      <Unit13>
+        <Filename Value="../Generic/ListInterface.tpl"/>
+        <WindowIndex Value="0"/>
+        <TopLine Value="1"/>
+        <CursorPos X="1" Y="1"/>
+        <UsageCount Value="3"/>
+        <DefaultSyntaxHighlighter Value="None"/>
+      </Unit13>
+      <Unit14>
+        <Filename Value="../Generic/ListImplementation.tpl"/>
+        <WindowIndex Value="0"/>
+        <TopLine Value="1"/>
+        <CursorPos X="25" Y="13"/>
+        <UsageCount Value="4"/>
+        <DefaultSyntaxHighlighter Value="None"/>
+      </Unit14>
+      <Unit15>
+        <Filename Value="../Generic/DictionaryImplementation.tpl"/>
+        <WindowIndex Value="0"/>
+        <TopLine Value="4"/>
+        <CursorPos X="3" Y="6"/>
+        <UsageCount Value="3"/>
+        <DefaultSyntaxHighlighter Value="None"/>
+      </Unit15>
+      <Unit16>
+        <Filename Value="../Generic/DictionaryInterface.tpl"/>
+        <WindowIndex Value="0"/>
+        <TopLine Value="1"/>
+        <CursorPos X="14" Y="16"/>
+        <UsageCount Value="3"/>
+        <DefaultSyntaxHighlighter Value="None"/>
+      </Unit16>
+      <Unit17>
+        <Filename Value="../Specialized/DictionaryString.pas"/>
+        <UnitName Value="DictionaryString"/>
+        <WindowIndex Value="0"/>
+        <TopLine Value="1"/>
+        <CursorPos X="32" Y="18"/>
+        <UsageCount Value="3"/>
+      </Unit17>
+      <Unit18>
+        <Filename Value="../Generic/StackInterface.tpl"/>
+        <WindowIndex Value="0"/>
+        <TopLine Value="1"/>
+        <CursorPos X="20" Y="12"/>
+        <UsageCount Value="1"/>
+        <DefaultSyntaxHighlighter Value="None"/>
+      </Unit18>
+      <Unit19>
+        <Filename Value="../Specialized/StackString.pas"/>
+        <UnitName Value="StackString"/>
+        <WindowIndex Value="0"/>
+        <TopLine Value="1"/>
+        <CursorPos X="1" Y="22"/>
+        <UsageCount Value="1"/>
+      </Unit19>
+      <Unit20>
+        <Filename Value="../Generic/StackImplementation.tpl"/>
+        <WindowIndex Value="0"/>
+        <TopLine Value="1"/>
+        <CursorPos X="1" Y="1"/>
+        <UsageCount Value="1"/>
+        <DefaultSyntaxHighlighter Value="None"/>
+      </Unit20>
+      <Unit21>
+        <Filename Value="../Generic/QueueImplementation.tpl"/>
+        <WindowIndex Value="0"/>
+        <TopLine Value="1"/>
+        <CursorPos X="1" Y="3"/>
+        <UsageCount Value="1"/>
+        <DefaultSyntaxHighlighter Value="None"/>
+      </Unit21>
+      <Unit22>
+        <Filename Value="../Generic/QueueInterface.tpl"/>
+        <WindowIndex Value="0"/>
+        <TopLine Value="1"/>
+        <CursorPos X="1" Y="3"/>
+        <UsageCount Value="1"/>
+        <DefaultSyntaxHighlighter Value="None"/>
+      </Unit22>
+      <Unit23>
+        <Filename Value="../Specialized/ListChar.pas"/>
+        <UnitName Value="ListChar"/>
+        <WindowIndex Value="0"/>
+        <TopLine Value="45"/>
+        <CursorPos X="9" Y="79"/>
+        <UsageCount Value="10"/>
+      </Unit23>
+      <Unit24>
+        <Filename Value="../Generic/SetInterface.tpl"/>
+        <WindowIndex Value="0"/>
+        <TopLine Value="1"/>
+        <CursorPos X="21" Y="4"/>
+        <UsageCount Value="5"/>
+        <DefaultSyntaxHighlighter Value="None"/>
+      </Unit24>
+      <Unit25>
+        <Filename Value="../Specialized/SetChar.pas"/>
+        <UnitName Value="SetChar"/>
+        <WindowIndex Value="0"/>
+        <TopLine Value="1"/>
+        <CursorPos X="1" Y="25"/>
+        <UsageCount Value="5"/>
+      </Unit25>
+      <Unit26>
+        <Filename Value="../Generic/SetImplementation.tpl"/>
+        <WindowIndex Value="0"/>
+        <TopLine Value="1"/>
+        <CursorPos X="1" Y="3"/>
+        <UsageCount Value="5"/>
+        <DefaultSyntaxHighlighter Value="None"/>
+      </Unit26>
+      <Unit27>
+        <Filename Value="../Generic/RangeInterface.tpl"/>
+        <WindowIndex Value="0"/>
+        <TopLine Value="1"/>
+        <CursorPos X="7" Y="4"/>
+        <UsageCount Value="5"/>
+        <DefaultSyntaxHighlighter Value="None"/>
+      </Unit27>
+      <Unit28>
+        <Filename Value="../Specialized/RangeDateTime.pas"/>
+        <UnitName Value="RangeDateTime"/>
+        <WindowIndex Value="0"/>
+        <TopLine Value="1"/>
+        <CursorPos X="14" Y="15"/>
+        <UsageCount Value="5"/>
+      </Unit28>
+      <Unit29>
+        <Filename Value="../Generic/RangeImplementation.tpl"/>
+        <WindowIndex Value="0"/>
+        <TopLine Value="1"/>
+        <CursorPos X="14" Y="18"/>
+        <UsageCount Value="5"/>
+        <DefaultSyntaxHighlighter Value="None"/>
+      </Unit29>
+      <Unit30>
+        <Filename Value="../Specialized/ListVariant.pas"/>
+        <UnitName Value="ListVariant"/>
+        <WindowIndex Value="0"/>
+        <TopLine Value="2"/>
+        <CursorPos X="30" Y="8"/>
+        <UsageCount Value="5"/>
+      </Unit30>
+      <Unit31>
+        <Filename Value="ListObject.pas"/>
+        <UnitName Value="ListObject"/>
+        <WindowIndex Value="0"/>
+        <TopLine Value="13"/>
+        <CursorPos X="15" Y="12"/>
+        <UsageCount Value="7"/>
+        <DefaultSyntaxHighlighter Value="Delphi"/>
+      </Unit31>
+      <Unit32>
+        <Filename Value="../Generic/GenericList.inc"/>
+        <EditorIndex Value="4"/>
+        <WindowIndex Value="0"/>
+        <TopLine Value="42"/>
+        <CursorPos X="15" Y="55"/>
+        <UsageCount Value="107"/>
+        <Loaded Value="True"/>
+      </Unit32>
+      <Unit33>
+        <Filename Value="../Generic/GenericDictionary.inc"/>
+        <WindowIndex Value="0"/>
+        <TopLine Value="31"/>
+        <CursorPos X="44" Y="47"/>
+        <UsageCount Value="93"/>
+      </Unit33>
+      <Unit34>
+        <Filename Value="../Generic/GenericObjectList.inc"/>
+        <WindowIndex Value="0"/>
+        <TopLine Value="1"/>
+        <CursorPos X="36" Y="48"/>
+        <UsageCount Value="93"/>
+      </Unit34>
+      <Unit35>
+        <Filename Value="../Generic/GenericQueue.inc"/>
+        <WindowIndex Value="0"/>
+        <TopLine Value="3"/>
+        <CursorPos X="1" Y="3"/>
+        <UsageCount Value="93"/>
+      </Unit35>
+      <Unit36>
+        <Filename Value="../Generic/GenericSet.inc"/>
+        <WindowIndex Value="0"/>
+        <TopLine Value="11"/>
+        <CursorPos X="42" Y="11"/>
+        <UsageCount Value="93"/>
+      </Unit36>
+      <Unit37>
+        <Filename Value="../Generic/GenericStack.inc"/>
+        <WindowIndex Value="0"/>
+        <TopLine Value="3"/>
+        <CursorPos X="1" Y="3"/>
+        <UsageCount Value="93"/>
+      </Unit37>
+      <Unit38>
+        <Filename Value="../Generic/GenericTree.inc"/>
+        <WindowIndex Value="0"/>
+        <TopLine Value="1"/>
+        <CursorPos X="22" Y="30"/>
+        <UsageCount Value="93"/>
+      </Unit38>
+      <Unit39>
+        <Filename Value="../Specialized/SpecializedDictionary.pas"/>
+        <UnitName Value="SpecializedDictionary"/>
+        <WindowIndex Value="0"/>
+        <TopLine Value="6"/>
+        <CursorPos X="56" Y="36"/>
+        <UsageCount Value="92"/>
+      </Unit39>
+      <Unit40>
+        <Filename Value="../Specialized/SpecializedStack.pas"/>
+        <UnitName Value="SpecializedStack"/>
+        <WindowIndex Value="0"/>
+        <TopLine Value="27"/>
+        <CursorPos X="50" Y="59"/>
+        <UsageCount Value="91"/>
+      </Unit40>
+      <Unit41>
+        <Filename Value="../Specialized/SpecializedTree.pas"/>
+        <UnitName Value="SpecializedTree"/>
+        <WindowIndex Value="0"/>
+        <TopLine Value="57"/>
+        <CursorPos X="48" Y="85"/>
+        <UsageCount Value="91"/>
+      </Unit41>
+      <Unit42>
+        <Filename Value="../Generic/GenericRange.inc"/>
+        <WindowIndex Value="0"/>
+        <TopLine Value="1"/>
+        <CursorPos X="33" Y="14"/>
+        <UsageCount Value="91"/>
+      </Unit42>
+      <Unit43>
+        <Filename Value="../Specialized/SpecializedQueue.pas"/>
+        <UnitName Value="SpecializedQueue"/>
+        <WindowIndex Value="0"/>
+        <TopLine Value="52"/>
+        <CursorPos X="1" Y="81"/>
+        <UsageCount Value="91"/>
+      </Unit43>
+      <Unit44>
+        <Filename Value="../Specialized/SpecializedSet.pas"/>
+        <UnitName Value="SpecializedSet"/>
+        <WindowIndex Value="0"/>
+        <TopLine Value="29"/>
+        <CursorPos X="1" Y="62"/>
+        <UsageCount Value="91"/>
+      </Unit44>
+      <Unit45>
+        <Filename Value="../Specialized/SpecializedObjectList.pas"/>
+        <UnitName Value="SpecializedObjectList"/>
+        <WindowIndex Value="0"/>
+        <TopLine Value="9"/>
+        <CursorPos X="60" Y="36"/>
+        <UsageCount Value="90"/>
+      </Unit45>
+      <Unit46>
+        <Filename Value="../Generic/GenericMatrix.inc"/>
+        <WindowIndex Value="0"/>
+        <TopLine Value="9"/>
+        <CursorPos X="28" Y="23"/>
+        <UsageCount Value="102"/>
+      </Unit46>
+      <Unit47>
+        <Filename Value="../../../../lazarus/trunk/lcl/graphics.pp"/>
+        <UnitName Value="Graphics"/>
+        <WindowIndex Value="0"/>
+        <TopLine Value="2624"/>
+        <CursorPos X="37" Y="2636"/>
+        <UsageCount Value="89"/>
+        <DefaultSyntaxHighlighter Value="Delphi"/>
+      </Unit47>
+      <Unit48>
+        <Filename Value="../../../../lazarus/trunk/lcl/interfaces/carbon/issues.xml"/>
+        <WindowIndex Value="0"/>
+        <TopLine Value="94"/>
+        <CursorPos X="1" Y="1"/>
+        <UsageCount Value="5"/>
+        <DefaultSyntaxHighlighter Value="XML"/>
+      </Unit48>
+      <Unit49>
+        <Filename Value="/usr/share/fpcsrc/rtl/objpas/classes/classesh.inc"/>
+        <WindowIndex Value="0"/>
+        <TopLine Value="199"/>
+        <CursorPos X="14" Y="213"/>
+        <UsageCount Value="27"/>
+        <DefaultSyntaxHighlighter Value="Delphi"/>
+      </Unit49>
+      <Unit50>
+        <Filename Value="/usr/share/fpcsrc/rtl/objpas/classes/lists.inc"/>
+        <WindowIndex Value="0"/>
+        <TopLine Value="199"/>
+        <CursorPos X="3" Y="201"/>
+        <UsageCount Value="27"/>
+        <DefaultSyntaxHighlighter Value="Delphi"/>
+      </Unit50>
+      <Unit51>
+        <Filename Value="../Generic/GenericListObject.inc"/>
+        <EditorIndex Value="5"/>
+        <WindowIndex Value="0"/>
+        <TopLine Value="11"/>
+        <CursorPos X="34" Y="24"/>
+        <UsageCount Value="21"/>
+        <Loaded Value="True"/>
+      </Unit51>
+      <Unit52>
+        <Filename Value="/usr/share/fpcsrc/rtl/objpas/objpas.pp"/>
+        <UnitName Value="objpas"/>
+        <WindowIndex Value="0"/>
+        <TopLine Value="1"/>
+        <CursorPos X="27" Y="26"/>
+        <UsageCount Value="27"/>
+        <DefaultSyntaxHighlighter Value="Delphi"/>
+      </Unit52>
+      <Unit53>
+        <Filename Value="/usr/share/fpcsrc/rtl/inc/systemh.inc"/>
+        <WindowIndex Value="0"/>
+        <TopLine Value="381"/>
+        <CursorPos X="3" Y="398"/>
+        <UsageCount Value="27"/>
+        <DefaultSyntaxHighlighter Value="Delphi"/>
+      </Unit53>
+      <Unit54>
+        <Filename Value="/usr/share/fpcsrc/rtl/inc/varianth.inc"/>
+        <WindowIndex Value="0"/>
+        <TopLine Value="475"/>
+        <CursorPos X="10" Y="503"/>
+        <UsageCount Value="6"/>
+        <DefaultSyntaxHighlighter Value="Delphi"/>
+      </Unit54>
+      <Unit55>
+        <Filename Value="../../../../lazarus/trunk/lcl/include/control.inc"/>
+        <WindowIndex Value="0"/>
+        <TopLine Value="2270"/>
+        <CursorPos X="22" Y="2273"/>
+        <UsageCount Value="18"/>
+        <DefaultSyntaxHighlighter Value="Delphi"/>
+      </Unit55>
+      <Unit56>
+        <Filename Value="../Specialized/SpecializedMatrix.pas"/>
+        <UnitName Value="SpecializedMatrix"/>
+        <WindowIndex Value="0"/>
+        <TopLine Value="1"/>
+        <CursorPos X="25" Y="41"/>
+        <UsageCount Value="19"/>
+      </Unit56>
+      <Unit57>
+        <Filename Value="../ReadMe.txt"/>
+        <WindowIndex Value="0"/>
+        <TopLine Value="1"/>
+        <CursorPos X="28" Y="10"/>
+        <UsageCount Value="8"/>
+        <DefaultSyntaxHighlighter Value="None"/>
+      </Unit57>
+      <Unit58>
+        <Filename Value="../../../../Programy/Lazarus/fpc/2.4.3/source/rtl/objpas/dateutil.inc"/>
+        <WindowIndex Value="0"/>
+        <TopLine Value="38"/>
+        <CursorPos X="3" Y="50"/>
+        <UsageCount Value="10"/>
+        <DefaultSyntaxHighlighter Value="Delphi"/>
+      </Unit58>
+      <Unit59>
+        <Filename Value="../../../../Programy/Lazarus/fpc/2.4.3/source/rtl/objpas/classes/classesh.inc"/>
+        <WindowIndex Value="0"/>
+        <TopLine Value="649"/>
+        <CursorPos X="38" Y="671"/>
+        <UsageCount Value="9"/>
+        <DefaultSyntaxHighlighter Value="Delphi"/>
+      </Unit59>
+      <Unit60>
+        <Filename Value="../../../../Programy/Lazarus/fpc/2.4.3/source/rtl/objpas/classes/stringl.inc"/>
+        <WindowIndex Value="0"/>
+        <TopLine Value="1185"/>
+        <CursorPos X="22" Y="1196"/>
+        <UsageCount Value="9"/>
+        <DefaultSyntaxHighlighter Value="Delphi"/>
+      </Unit60>
+      <Unit61>
+        <Filename Value="../../../../Programy/Lazarus/fpc/2.4.3/source/rtl/objpas/types.pp"/>
+        <UnitName Value="types"/>
+        <WindowIndex Value="0"/>
+        <TopLine Value="112"/>
+        <CursorPos X="3" Y="124"/>
+        <UsageCount Value="9"/>
+        <DefaultSyntaxHighlighter Value="Delphi"/>
+      </Unit61>
+      <Unit62>
+        <Filename Value="../../../../Projekty2/FreePascalManager/trunk/Instance/1/FPC/rtl/objpas/sysutils/sysstrh.inc"/>
+        <WindowIndex Value="0"/>
+        <TopLine Value="71"/>
+        <CursorPos X="10" Y="84"/>
+        <UsageCount Value="9"/>
+        <DefaultSyntaxHighlighter Value="Delphi"/>
+      </Unit62>
+      <Unit63>
+        <Filename Value="../../../../Projekty2/FreePascalManager/trunk/Instance/1/FPC/rtl/objpas/sysutils/sysstr.inc"/>
+        <WindowIndex Value="0"/>
+        <TopLine Value="148"/>
+        <CursorPos X="11" Y="169"/>
+        <UsageCount Value="9"/>
+        <DefaultSyntaxHighlighter Value="Delphi"/>
+      </Unit63>
+      <Unit64>
+        <Filename Value="../../../../Projekty2/FreePascalManager/trunk/Instance/1/FPC/rtl/inc/systemh.inc"/>
+        <WindowIndex Value="0"/>
+        <TopLine Value="511"/>
+        <CursorPos X="11" Y="524"/>
+        <UsageCount Value="9"/>
+        <DefaultSyntaxHighlighter Value="Delphi"/>
+      </Unit64>
+      <Unit65>
+        <Filename Value="../../../../Projekty2/FreePascalManager/trunk/Instance/1/FPC/rtl/i386/i386.inc"/>
+        <WindowIndex Value="0"/>
+        <TopLine Value="411"/>
+        <CursorPos X="10" Y="424"/>
+        <UsageCount Value="9"/>
+        <DefaultSyntaxHighlighter Value="Delphi"/>
+      </Unit65>
+      <Unit66>
+        <Filename Value="../Specialized/SpecializedStream.pas"/>
+        <UnitName Value="SpecializedStream"/>
+        <EditorIndex Value="8"/>
+        <WindowIndex Value="0"/>
+        <TopLine Value="106"/>
+        <CursorPos X="48" Y="107"/>
+        <UsageCount Value="15"/>
+        <Loaded Value="True"/>
+      </Unit66>
+      <Unit67>
+        <Filename Value="../../../../../Lazarus/0.9.31_2.6.0/lcl/lclclasses.pp"/>
+        <UnitName Value="LCLClasses"/>
+        <WindowIndex Value="0"/>
+        <TopLine Value="25"/>
+        <CursorPos X="32" Y="40"/>
+        <UsageCount Value="9"/>
+      </Unit67>
+      <Unit68>
+        <Filename Value="../../../../../Lazarus/0.9.31_2.6.0/lcl/controls.pp"/>
+        <UnitName Value="Controls"/>
+        <WindowIndex Value="0"/>
+        <TopLine Value="1"/>
+        <CursorPos X="39" Y="11"/>
+        <UsageCount Value="9"/>
+      </Unit68>
+      <Unit69>
+        <Filename Value="../../../../../Lazarus/0.9.31_2.6.0/fpc/2.6.0/source/rtl/inc/objpash.inc"/>
+        <WindowIndex Value="0"/>
+        <TopLine Value="179"/>
+        <CursorPos X="23" Y="192"/>
+        <UsageCount Value="10"/>
+      </Unit69>
+      <Unit70>
+        <Filename Value="../../../../../Lazarus/0.9.31_2.6.0/fpc/2.6.0/source/rtl/inc/objpas.inc"/>
+        <WindowIndex Value="0"/>
+        <TopLine Value="265"/>
+        <CursorPos X="9" Y="267"/>
+        <UsageCount Value="10"/>
+      </Unit70>
+      <Unit71>
+        <Filename Value="../Generic/GenericStream.inc"/>
+        <IsVisibleTab Value="True"/>
+        <EditorIndex Value="7"/>
+        <WindowIndex Value="0"/>
+        <TopLine Value="40"/>
+        <CursorPos X="18" Y="20"/>
+        <UsageCount Value="15"/>
+        <Loaded Value="True"/>
+      </Unit71>
+      <Unit72>
+        <Filename Value="../../../../../Lazarus/0.9.31_2.6.0/fpc/2.6.0/source/rtl/objpas/classes/classesh.inc"/>
+        <EditorIndex Value="1"/>
+        <WindowIndex Value="0"/>
+        <TopLine Value="891"/>
+        <CursorPos X="18" Y="908"/>
+        <UsageCount Value="13"/>
+        <Loaded Value="True"/>
+      </Unit72>
+      <Unit73>
+        <Filename Value="../../../../../Lazarus/0.9.31_2.6.0/fpc/2.6.0/source/rtl/objpas/classes/streams.inc"/>
+        <EditorIndex Value="2"/>
+        <WindowIndex Value="0"/>
+        <TopLine Value="739"/>
+        <CursorPos X="18" Y="750"/>
+        <UsageCount Value="13"/>
+        <Loaded Value="True"/>
+      </Unit73>
+      <Unit74>
+        <Filename Value="../Generic/GenericListString.inc"/>
+        <EditorIndex Value="6"/>
+        <WindowIndex Value="0"/>
+        <TopLine Value="8"/>
+        <CursorPos X="34" Y="21"/>
+        <UsageCount Value="12"/>
+        <Loaded Value="True"/>
+      </Unit74>
+    </Units>
+    <JumpHistory Count="30" HistoryIndex="28">
+      <Position1>
+        <Filename Value="UMainForm.pas"/>
+        <Caret Line="142" Column="1" TopLine="128"/>
+      </Position1>
+      <Position2>
+        <Filename Value="UMainForm.pas"/>
+        <Caret Line="143" Column="1" TopLine="128"/>
+      </Position2>
+      <Position3>
+        <Filename Value="../Generic/GenericList.inc"/>
+        <Caret Line="161" Column="1" TopLine="148"/>
+      </Position3>
+      <Position4>
+        <Filename Value="../Specialized/SpecializedStream.pas"/>
+        <Caret Line="93" Column="21" TopLine="80"/>
+      </Position4>
+      <Position5>
+        <Filename Value="UMainForm.pas"/>
+        <Caret Line="150" Column="22" TopLine="129"/>
+      </Position5>
+      <Position6>
+        <Filename Value="../Generic/GenericStream.inc"/>
+        <Caret Line="22" Column="12" TopLine="9"/>
+      </Position6>
+      <Position7>
+        <Filename Value="../Generic/GenericStream.inc"/>
+        <Caret Line="37" Column="18" TopLine="35"/>
+      </Position7>
+      <Position8>
+        <Filename Value="UMainForm.pas"/>
+        <Caret Line="157" Column="79" TopLine="132"/>
+      </Position8>
+      <Position9>
+        <Filename Value="../Specialized/SpecializedStream.pas"/>
+        <Caret Line="58" Column="45" TopLine="46"/>
+      </Position9>
+      <Position10>
+        <Filename Value="../Specialized/SpecializedStream.pas"/>
+        <Caret Line="119" Column="12" TopLine="100"/>
+      </Position10>
+      <Position11>
+        <Filename Value="../Generic/GenericList.inc"/>
+        <Caret Line="197" Column="39" TopLine="182"/>
+      </Position11>
+      <Position12>
+        <Filename Value="../Specialized/SpecializedStream.pas"/>
+        <Caret Line="119" Column="12" TopLine="100"/>
+      </Position12>
+      <Position13>
+        <Filename Value="../Specialized/SpecializedStream.pas"/>
+        <Caret Line="61" Column="38" TopLine="48"/>
+      </Position13>
+      <Position14>
+        <Filename Value="../Specialized/SpecializedStream.pas"/>
+        <Caret Line="130" Column="15" TopLine="117"/>
+      </Position14>
+      <Position15>
+        <Filename Value="../Specialized/SpecializedStream.pas"/>
+        <Caret Line="64" Column="36" TopLine="51"/>
+      </Position15>
+      <Position16>
+        <Filename Value="../Specialized/SpecializedStream.pas"/>
+        <Caret Line="58" Column="29" TopLine="45"/>
+      </Position16>
+      <Position17>
+        <Filename Value="../Specialized/SpecializedStream.pas"/>
+        <Caret Line="78" Column="45" TopLine="78"/>
+      </Position17>
+      <Position18>
+        <Filename Value="../Specialized/SpecializedStream.pas"/>
+        <Caret Line="64" Column="64" TopLine="48"/>
+      </Position18>
+      <Position19>
+        <Filename Value="../Specialized/SpecializedStream.pas"/>
+        <Caret Line="82" Column="3" TopLine="68"/>
+      </Position19>
+      <Position20>
+        <Filename Value="../Generic/GenericListObject.inc"/>
+        <Caret Line="20" Column="21" TopLine="1"/>
+      </Position20>
+      <Position21>
+        <Filename Value="../Generic/GenericListObject.inc"/>
+        <Caret Line="24" Column="17" TopLine="11"/>
+      </Position21>
+      <Position22>
+        <Filename Value="../Generic/GenericListString.inc"/>
+        <Caret Line="1" Column="1" TopLine="1"/>
+      </Position22>
+      <Position23>
+        <Filename Value="UMainForm.pas"/>
+        <Caret Line="43" Column="15" TopLine="28"/>
+      </Position23>
+      <Position24>
+        <Filename Value="../Generic/GenericStream.inc"/>
+        <Caret Line="13" Column="1" TopLine="1"/>
+      </Position24>
+      <Position25>
+        <Filename Value="../Specialized/SpecializedStream.pas"/>
+        <Caret Line="84" Column="35" TopLine="40"/>
+      </Position25>
+      <Position26>
+        <Filename Value="../Specialized/SpecializedStream.pas"/>
+        <Caret Line="126" Column="39" TopLine="111"/>
+      </Position26>
+      <Position27>
+        <Filename Value="../Specialized/SpecializedStream.pas"/>
+        <Caret Line="128" Column="1" TopLine="111"/>
+      </Position27>
+      <Position28>
+        <Filename Value="../Specialized/SpecializedStream.pas"/>
+        <Caret Line="68" Column="32" TopLine="55"/>
+      </Position28>
+      <Position29>
+        <Filename Value="../Specialized/SpecializedStream.pas"/>
+        <Caret Line="121" Column="1" TopLine="106"/>
+      </Position29>
+      <Position30>
+        <Filename Value="../Generic/GenericList.inc"/>
+        <Caret Line="55" Column="15" TopLine="42"/>
+      </Position30>
+    </JumpHistory>
+  </ProjectOptions>
+  <CompilerOptions>
+    <Version Value="11"/>
+    <Target>
+      <Filename Value="Demo"/>
+    </Target>
+    <SearchPaths>
+      <IncludeFiles Value="$(ProjOutDir)"/>
+      <UnitOutputDirectory Value="lib/$(TargetCPU)-$(TargetOS)"/>
+    </SearchPaths>
+    <Parsing>
+      <SyntaxOptions>
+        <SyntaxMode Value="Delphi"/>
+        <CStyleOperator Value="False"/>
+        <AllowLabel Value="False"/>
+        <CPPInline Value="False"/>
+        <CStyleMacros Value="True"/>
+      </SyntaxOptions>
+    </Parsing>
+    <CodeGeneration>
+      <Checks>
+        <IOChecks Value="True"/>
+        <RangeChecks Value="True"/>
+        <OverflowChecks Value="True"/>
+        <StackChecks Value="True"/>
+      </Checks>
+    </CodeGeneration>
+    <Linking>
+      <Debugging>
+        <DebugInfoType Value="dsStabs"/>
+        <UseHeaptrc Value="True"/>
+      </Debugging>
+      <Options>
+        <Win32>
+          <GraphicApplication Value="True"/>
+        </Win32>
+      </Options>
+    </Linking>
+    <Other>
+      <CompilerMessages>
+        <UseMsgFile Value="True"/>
+      </CompilerMessages>
+      <CompilerPath Value="$(CompPath)"/>
+    </Other>
+  </CompilerOptions>
+  <Debugging>
+    <Exceptions Count="3">
+      <Item1>
+        <Name Value="EAbort"/>
+      </Item1>
+      <Item2>
+        <Name Value="ECodetoolError"/>
+      </Item2>
+      <Item3>
+        <Name Value="EFOpenError"/>
+      </Item3>
+    </Exceptions>
+  </Debugging>
+</CONFIG>
Index: /tags/1.1.0/Packages/TemplateGenerics/Demo/Demo.lpr
===================================================================
--- /tags/1.1.0/Packages/TemplateGenerics/Demo/Demo.lpr	(revision 137)
+++ /tags/1.1.0/Packages/TemplateGenerics/Demo/Demo.lpr	(revision 137)
@@ -0,0 +1,23 @@
+program Demo;
+
+{$mode objfpc}{$H+}
+
+uses
+  {$IFDEF UNIX}{$IFDEF UseCThreads}
+  cthreads,
+  {$ENDIF}{$ENDIF}
+  Interfaces, // this includes the LCL widgetset
+  Forms, SysUtils, UMainForm, TemplateGenerics;
+
+{$R *.res}
+
+const
+  HeapTraceLogFileName = 'heaptrclog.trc';
+begin
+  DeleteFile(ExtractFilePath(ParamStr(0)) + HeapTraceLogFileName);
+  SetHeapTraceOutput(ExtractFilePath(ParamStr(0)) + HeapTraceLogFileName);
+  Application.Initialize;
+  Application.CreateForm(TMainForm, MainForm);
+  Application.Run;
+end.
+
Index: /tags/1.1.0/Packages/TemplateGenerics/Demo/UMainForm.lfm
===================================================================
--- /tags/1.1.0/Packages/TemplateGenerics/Demo/UMainForm.lfm	(revision 137)
+++ /tags/1.1.0/Packages/TemplateGenerics/Demo/UMainForm.lfm	(revision 137)
@@ -0,0 +1,151 @@
+object MainForm: TMainForm
+  Left = 261
+  Height = 520
+  Top = 104
+  Width = 692
+  ActiveControl = ButtonIntegerList
+  Caption = 'Template generics demo'
+  ClientHeight = 520
+  ClientWidth = 692
+  OnCreate = FormCreate
+  OnDestroy = FormDestroy
+  LCLVersion = '0.9.31'
+  object ButtonIntegerList: TButton
+    Left = 8
+    Height = 25
+    Top = 8
+    Width = 128
+    Caption = 'TListInteger'
+    OnClick = ButtonIntegerListClick
+    TabOrder = 0
+  end
+  object ButtonStringList: TButton
+    Left = 8
+    Height = 25
+    Top = 40
+    Width = 128
+    Caption = 'TListString'
+    OnClick = ButtonStringListClick
+    TabOrder = 1
+  end
+  object ButtonDictionaryString: TButton
+    Left = 8
+    Height = 25
+    Top = 72
+    Width = 128
+    Caption = 'TDictionaryString'
+    OnClick = ButtonDictionaryStringClick
+    TabOrder = 2
+  end
+  object ButtonQueueInteger: TButton
+    Left = 8
+    Height = 25
+    Top = 102
+    Width = 128
+    Caption = 'TQueueInteger'
+    OnClick = ButtonQueueIntegerClick
+    TabOrder = 3
+  end
+  object ButtonCharList: TButton
+    Left = 8
+    Height = 25
+    Top = 134
+    Width = 128
+    Caption = 'TListChar(TString)'
+    OnClick = ButtonCharListClick
+    TabOrder = 4
+  end
+  object ButtonBenchmarkListString: TButton
+    Left = 8
+    Height = 24
+    Top = 456
+    Width = 128
+    Anchors = [akLeft, akBottom]
+    Caption = 'TListString'
+    OnClick = ButtonBenchmarkListStringClick
+    TabOrder = 5
+  end
+  object ButtonListObject: TButton
+    Left = 8
+    Height = 25
+    Top = 163
+    Width = 128
+    Caption = 'TListObject'
+    OnClick = ButtonListObjectClick
+    TabOrder = 6
+  end
+  object ButtonBenchmarkDictionary: TButton
+    Left = 8
+    Height = 25
+    Top = 424
+    Width = 128
+    Anchors = [akLeft, akBottom]
+    Caption = 'TDictionaryStringString'
+    OnClick = ButtonBenchmarkDictionaryClick
+    TabOrder = 7
+  end
+  object ButtonMatrixInteger: TButton
+    Left = 8
+    Height = 25
+    Top = 192
+    Width = 128
+    Caption = 'TMatrixInteger'
+    OnClick = ButtonMatrixIntegerClick
+    TabOrder = 8
+  end
+  object ListViewOutput: TListView
+    Left = 144
+    Height = 491
+    Top = 24
+    Width = 542
+    Anchors = [akTop, akLeft, akRight, akBottom]
+    Columns = <    
+      item
+        Caption = 'Action'
+        Width = 200
+      end    
+      item
+        Caption = 'Value'
+        Width = 321
+      end>
+    ReadOnly = True
+    TabOrder = 9
+    ViewStyle = vsReport
+  end
+  object LabelTestName: TLabel
+    Left = 144
+    Height = 14
+    Top = 8
+    Width = 10
+    Caption = '   '
+    ParentColor = False
+  end
+  object Label1: TLabel
+    Left = 10
+    Height = 14
+    Top = 408
+    Width = 62
+    Anchors = [akLeft, akBottom]
+    Caption = 'Benchmarks:'
+    ParentColor = False
+  end
+  object ButtonBenchmarkListPointer: TButton
+    Left = 8
+    Height = 24
+    Top = 488
+    Width = 128
+    Anchors = [akLeft, akBottom]
+    Caption = 'TListPointer'
+    OnClick = ButtonBenchmarkListPointerClick
+    TabOrder = 10
+  end
+  object ButtonStreamByte: TButton
+    Left = 10
+    Height = 25
+    Top = 224
+    Width = 128
+    Caption = 'TMemoryStreamByte'
+    OnClick = ButtonStreamByteClick
+    TabOrder = 11
+  end
+end
Index: /tags/1.1.0/Packages/TemplateGenerics/Demo/UMainForm.pas
===================================================================
--- /tags/1.1.0/Packages/TemplateGenerics/Demo/UMainForm.pas	(revision 137)
+++ /tags/1.1.0/Packages/TemplateGenerics/Demo/UMainForm.pas	(revision 137)
@@ -0,0 +1,782 @@
+unit UMainForm;
+
+{$mode delphi}{$H+}
+
+interface
+
+uses
+  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
+  ComCtrls, SpecializedList, SpecializedDictionary, SpecializedQueue,
+  DateUtils, SpecializedMatrix, SpecializedStream;
+
+type
+
+  { TMainForm }
+
+  TMainForm = class(TForm)
+    ButtonStreamByte: TButton;
+    ButtonBenchmarkDictionary: TButton;
+    ButtonBenchmarkListPointer: TButton;
+    ButtonListObject: TButton;
+    ButtonBenchmarkListString: TButton;
+    ButtonCharList: TButton;
+    ButtonMatrixInteger: TButton;
+    ButtonQueueInteger: TButton;
+    ButtonDictionaryString: TButton;
+    ButtonIntegerList: TButton;
+    ButtonStringList: TButton;
+    Label1: TLabel;
+    LabelTestName: TLabel;
+    ListViewOutput: TListView;
+    procedure ButtonBenchmarkDictionaryClick(Sender: TObject);
+    procedure ButtonBenchmarkListPointerClick(Sender: TObject);
+    procedure ButtonBenchmarkListStringClick(Sender: TObject);
+    procedure ButtonCharListClick(Sender: TObject);
+    procedure ButtonDictionaryStringClick(Sender: TObject);
+    procedure ButtonIntegerListClick(Sender: TObject);
+    procedure ButtonMatrixIntegerClick(Sender: TObject);
+    procedure ButtonListObjectClick(Sender: TObject);
+    procedure ButtonQueueIntegerClick(Sender: TObject);
+    procedure ButtonStringListClick(Sender: TObject);
+    procedure ButtonStreamByteClick(Sender: TObject);
+    procedure FormCreate(Sender: TObject);
+    procedure FormDestroy(Sender: TObject);
+  public
+    MeasureDuration: TDateTime;
+    Bitmap: TBitmap;
+    procedure UpdateButtonState(Enabled: Boolean);
+    procedure WriteOutput(Text1: string = ''; Text2: string = '');
+  end;
+
+var
+  MainForm: TMainForm;
+
+implementation
+
+{$R *.lfm}
+
+{ TMainForm }
+
+procedure TMainForm.FormCreate(Sender: TObject);
+begin
+  MeasureDuration := 100 * OneMillisecond;
+end;
+
+procedure TMainForm.ButtonIntegerListClick(Sender: TObject);
+var
+  List: TListInteger;
+  List2: TListInteger;
+  I: Integer;
+begin
+  ListViewOutput.Clear;
+  LabelTestName.Caption := 'TListInteger test';
+  List := TListInteger.Create;
+  List2 := TListInteger.Create;
+  with List do try
+    AddArray([10, 20, 30, 40]);
+    WriteOutput('AddArray([10, 20, 30, 40])', Implode(',', IntToStr));
+    Clear;
+    WriteOutput('Clear', Implode(',', IntToStr));
+    for I := 0 to 10 do Add(I);
+    WriteOutput('for I := 0 to 10 do Add(I)', Implode(',', IntToStr));
+    WriteOutput('Count', IntToStr(Count));
+    Reverse;
+    WriteOutput('Reverse', Implode(',', IntToStr));
+    WriteOutput('First', IntToStr(First));
+    WriteOutput('Last', IntToStr(Last));
+    MoveItems(3, 2, 3);
+    WriteOutput('MoveItems(3, 2, 3)', Implode(',', IntToStr));
+    Insert(5, 11);
+    WriteOutput('Insert(5, 11)', Implode(',', IntToStr));
+    DeleteItems(0, 10);
+    WriteOutput('Delete(0, 10)', Implode(',', IntToStr));
+    List2.SetArray([1, 0]);
+    WriteOutput('EqualTo([6, 11])', BoolToStr(EqualTo(List2)));
+    List2.SetArray([2, 0]);
+    WriteOutput('EqualTo([7, 11])', BoolToStr(EqualTo(List2)));
+    InsertCount(0, 3);
+    WriteOutput('InsertCount(0, 3)', Implode(',', IntToStr));
+    Fill(0, 3, 9);
+    WriteOutput('Fill(0, 3, 9)', Implode(',', IntToStr));
+  finally
+    Free;
+    List2.Free;
+  end;
+end;
+
+procedure TMainForm.ButtonMatrixIntegerClick(Sender: TObject);
+var
+  Matrix: TMatrixInteger;
+  I: Integer;
+begin
+  ListViewOutput.Clear;
+  LabelTestName.Caption := 'TMatrixInteger test';
+  Matrix := TMatrixInteger.Create;
+  with Matrix do try
+    Count := CreateIndex(2, 2);
+    WriteOutput('Count := CreateIndex(2, 2)', '[' + Implode('; ', ', ', IntToStr) + ']');
+    Fill(CreateIndex(0, 0), Count, 1);
+    WriteOutput('Fill(1)', '[' + Implode('; ', ', ', IntToStr) + ']');
+    Count := CreateIndex(3, 3);
+    WriteOutput('Count := CreateIndex(3, 3)', '[' + Implode('; ', ', ', IntToStr) + ']');
+    WriteOutput('Count [Y, X]', IntToStr(Count.Y) + ', ' + IntToStr(Count.X));
+    Clear;
+    WriteOutput('Clear', '[' + Implode('; ', ', ', IntToStr) + ']');
+    WriteOutput('Count [Y, X]', IntToStr(Count.Y) + ', ' + IntToStr(Count.X));
+  finally
+    Free;
+  end;
+end;
+
+procedure TMainForm.ButtonStreamByteClick(Sender: TObject);
+var
+  Stream: TMemoryStreamByte;
+  I: Integer;
+  ByteArray: array of Byte;
+  ByteArrayText: string;
+begin
+  ListViewOutput.Clear;
+  LabelTestName.Caption := 'TStreamByte test';
+  Stream := TMemoryStreamByte.Create;
+  with Stream do try
+    WriteOutput('Size := ', IntToStr(Stream.Size));
+    Write(1);
+    WriteOutput('Write(1)', '');
+    WriteOutput('Size, Position', IntToStr(Stream.Size) + ', ' + IntToStr(Stream.Position));
+    WriteArray([2, 3, 4]);
+    WriteOutput('WriteArray([2, 3, 4])', '');
+    WriteOutput('Size, Position', IntToStr(Stream.Size) + ', ' + IntToStr(Stream.Position));
+    Position := 1;
+    WriteOutput('Position := 1', '');
+    WriteOutput('Size, Position', IntToStr(Stream.Size) + ', ' + IntToStr(Stream.Position));
+    WriteOutput('Read', IntToStr(Read));
+    WriteOutput('Size, Position', IntToStr(Stream.Size) + ', ' + IntToStr(Stream.Position));
+    ByteArray := ReadArray(2);
+    ByteArrayText := '[';
+    for I := 0 to Length(ByteArray) - 1 do begin
+      ByteArrayText := ByteArrayText + IntToStr(ByteArray[I]);
+      if I < Length(ByteArray) - 1 then ByteArrayText := ByteArrayText + ', ';
+    end;
+    ByteArrayText := ByteArrayText + ']';
+    WriteOutput('ReadArray', ByteArrayText);
+    WriteOutput('Size, Position', IntToStr(Stream.Size) + ', ' + IntToStr(Stream.Position));
+  finally
+    Free;
+  end;
+end;
+
+function ObjectToStr(Obj: TObject): string;
+begin
+  Result := Obj.ClassName;
+end;
+
+procedure TMainForm.ButtonListObjectClick(Sender: TObject);
+var
+  List: TListObject;
+  I: Integer;
+begin
+  ListViewOutput.Clear;
+  LabelTestName.Caption := 'TListObject test';
+  List := TListObject.Create;
+  with List do try
+    AddArray([TObject.Create, TObject.Create, TObject.Create, TObject.Create]);
+    WriteOutput('AddArray([TObject.Create, TObject.Create, TObject.Create, TObject.Create])', Implode(',', ObjectToStr));
+    Clear;
+    WriteOutput('Clear', Implode(',', ObjectToStr));
+    for I := 0 to 10 do Add(TObject.Create);
+    WriteOutput('for I := 0 to 10 do Add(TObject.Create)', Implode(',', ObjectToStr));
+    WriteOutput('Count', IntToStr(Count));
+    Reverse;
+    WriteOutput('Reverse', Implode(',', ObjectToStr));
+    MoveItems(3, 2, 3);
+    WriteOutput('MoveItems(3, 2, 3)', Implode(',', ObjectToStr));
+  finally
+    Free;
+  end;
+end;
+
+procedure TMainForm.ButtonQueueIntegerClick(Sender: TObject);
+var
+  Queue: TQueueInteger;
+  I: Integer;
+begin
+  ListViewOutput.Clear;
+  LabelTestName.Caption := 'TQueueInteger test';
+  Queue := TQueueInteger.Create;
+  with Queue do try
+    Enqueue(1);
+    Enqueue(2);
+    Enqueue(3);
+    WriteOutput('Enqueue(1),Enqueue(2),Enqueue(3) ', List.Implode(',', IntToStr));
+    Enqueue(4);
+    WriteOutput('Enqueue(4)', List.Implode(',', IntToStr));
+    WriteOutput('Dequeued item', IntToStr(Dequeue));
+    WriteOutput('Dequeue', List.Implode(',', IntToStr));
+  finally
+    Free;
+  end;
+end;
+
+function StringPairToStr(Pair: TPairStringString): string;
+begin
+  Result := Pair.Key + ':' + Pair.Value;
+end;
+
+procedure TMainForm.ButtonDictionaryStringClick(Sender: TObject);
+var
+  Dictionary: TDictionaryStringString;
+begin
+  ListViewOutput.Clear;
+  LabelTestName.Caption := 'TDictionaryString test';
+  Dictionary := TDictionaryStringString.Create;
+  with Dictionary do try
+    Add('Key1', 'Value1');
+    Add('Key2', 'Value2');
+    Add('Key3', 'Value3');
+    WriteOutput('Add(''Key1'', ''Value1''),Add(''Key1'', ''Value1''),Add(''Key1'', ''Value1'')', Implode(',', StringPairToStr));
+    WriteOutput('Values[Key2]', Values['Key2']);
+    WriteOutput('Values[Key2] = None');
+    Values['Key2'] := 'None';
+    WriteOutput('Values[Key2]', Values['Key2']);
+    WriteOutput('Values[Key0]', Values['Key0']);
+    WriteOutput('Keys[2]', Keys[2]);
+  finally
+    Free;
+  end;
+end;
+
+function CharToStr(Value: Char): string;
+begin
+  Result := Value;
+end;
+
+procedure TMainForm.ButtonCharListClick(Sender: TObject);
+var
+  List: TListChar;
+  List2: TListChar;
+begin
+  ListViewOutput.Clear;
+  LabelTestName.Caption := 'TListChar test';
+  List := TListChar.Create;
+  List2 := TListChar.Create;
+  with List do try
+    AddArray([' ', ' ', 'A', 'b', 'c', 'd', ' ']);
+    WriteOutput('AddArray(['' '', '' '', ''A'', ''b'', ''c'', ''d'', '' ''])',
+      '''' + Implode('', CharToStr) + '''');
+    Reverse;
+    WriteOutput('Reverse', '''' + Implode('', CharToStr) + '''');
+    TrimLeft;
+    WriteOutput('TrimLeft', '''' + Implode('', CharToStr) + '''');
+    TrimRight;
+    WriteOutput('TrimRight', '''' + Implode('', CharToStr) + '''');
+    UpperCase;
+    WriteOutput('UpperCase', '''' + Implode('', CharToStr) + '''');
+    LowerCase;
+    WriteOutput('LowerCase', '''' + Implode('', CharToStr) + '''');
+    WriteOutput('IndexOf(''c'')', IntToStr(IndexOf('c')));
+    List2.AddArray(['c', 'b']);
+    WriteOutput('IndexOfList(''cb'')', IntToStr(IndexOfList(List2)));
+  finally
+    List2.Free;
+    Free;
+  end;
+end;
+
+procedure TMainForm.ButtonBenchmarkListStringClick(Sender: TObject);
+var
+  List: TListString;
+  List2: TStringList;
+  StartTime: TDateTime;
+  I: Integer;
+const
+  SampleText: string = 'text';
+  SampleCount: Integer = 100000;
+begin
+  LabelTestName.Caption := 'Generic specialized TListString vs. classic non-generic TStringList benchmark';
+  ListViewOutput.Clear;
+  try
+    UpdateButtonState(False);
+    List := TListString.Create;
+    List2 := TStringList.Create;
+
+    StartTime := Now;
+    repeat
+      List.Add(SampleText);
+    until (Now - StartTime) > MeasureDuration;
+    WriteOutput('TListString.Add', IntToStr(List.Count) + ' ops');
+    List.Clear;
+    Application.ProcessMessages;
+
+    StartTime := Now;
+    repeat
+      List2.Add(SampleText);
+    until (Now - StartTime) > MeasureDuration;
+    WriteOutput('TStringList.Add', IntToStr(List2.Count) + ' ops');
+    List2.Clear;
+    Application.ProcessMessages;
+
+    StartTime := Now;
+    repeat
+      List.Insert(0, SampleText);
+    until (Now - StartTime) > MeasureDuration;
+    WriteOutput('TListString.Insert', IntToStr(List.Count) + ' ops');
+    List.Clear;
+    Application.ProcessMessages;
+
+    StartTime := Now;
+    repeat
+      List2.Insert(0, SampleText);
+    until (Now - StartTime) > MeasureDuration;
+    WriteOutput('TStringList.Insert', IntToStr(List2.Count) + ' ops');
+    List2.Clear;
+    Application.ProcessMessages;
+
+    for I := 0 to SampleCount - 1 do
+      List.Add(SampleText);
+    StartTime := Now;
+    I := 0;
+    repeat
+      List.Delete(0);
+      Inc(I);
+    until (Now - StartTime) > MeasureDuration;
+    WriteOutput('TListString.Delete', IntToStr(I) + ' ops');
+    List.Clear;
+    Application.ProcessMessages;
+
+    for I := 0 to SampleCount - 1 do
+      List2.Add(SampleText);
+    StartTime := Now;
+    I := 0;
+    repeat
+      List2.Delete(0);
+      Inc(I);
+    until (Now - StartTime) > MeasureDuration;
+    WriteOutput('TStringList.Delete', IntToStr(I) + ' ops');
+    Application.ProcessMessages;
+
+    for I := 0 to SampleCount - 1 do
+      List.Add(SampleText);
+    StartTime := Now;
+    I := 0;
+    repeat
+      List.Move(Round(SampleCount * 0.3), Round(SampleCount * 0.7));
+      Inc(I);
+    until (Now - StartTime) > MeasureDuration;
+    WriteOutput('TListString.Move', IntToStr(I) + ' ops');
+    List.Clear;
+    Application.ProcessMessages;
+
+    for I := 0 to SampleCount - 1 do
+      List2.Add(SampleText);
+    StartTime := Now;
+    I := 0;
+    repeat
+      List2.Move(Round(SampleCount * 0.3), Round(SampleCount * 0.7));
+      Inc(I);
+    until (Now - StartTime) > MeasureDuration;
+    WriteOutput('TStringList.Move', IntToStr(I) + ' ops');
+    Application.ProcessMessages;
+
+    for I := 0 to SampleCount - 1 do
+      List.Add(SampleText);
+    StartTime := Now;
+    I := 0;
+    repeat
+      List.Exchange(Round(SampleCount * 0.3), Round(SampleCount * 0.7));
+      Inc(I);
+    until (Now - StartTime) > MeasureDuration;
+    WriteOutput('TListString.Exchange', IntToStr(I) + ' ops');
+    List.Clear;
+    Application.ProcessMessages;
+
+    for I := 0 to SampleCount - 1 do
+    List2.Add(SampleText);
+    StartTime := Now;
+    I := 0;
+    repeat
+      List2.Exchange(Round(SampleCount * 0.3), Round(SampleCount * 0.7));
+      Inc(I);
+    until (Now - StartTime) > MeasureDuration;
+    WriteOutput('TStringList.Exchange', IntToStr(I) + ' ops');
+    Application.ProcessMessages;
+
+    for I := 0 to SampleCount - 1 do
+      List.Add(SampleText + IntToStr(I));
+    StartTime := Now;
+    I := 0;
+    repeat
+      List.IndexOf(SampleText + IntToStr(I mod List.Count));
+      Inc(I);
+    until (Now - StartTime) > MeasureDuration;
+    WriteOutput('TListString.IndexOf', IntToStr(I) + ' ops');
+    List.Clear;
+    Application.ProcessMessages;
+
+    for I := 0 to SampleCount - 1 do
+      List2.Add(SampleText + IntToStr(I));
+    StartTime := Now;
+    I := 0;
+    repeat
+      List2.IndexOf(SampleText + IntToStr(I mod List2.Count));
+      Inc(I);
+    until (Now - StartTime) > MeasureDuration;
+    WriteOutput('TStringList.IndexOf', IntToStr(I) + ' ops');
+    Application.ProcessMessages;
+
+  finally
+    UpdateButtonState(True);
+    List.Free;
+    List2.Free;
+  end;
+end;
+
+procedure TMainForm.ButtonBenchmarkDictionaryClick(Sender: TObject);
+var
+  Dictionary: TDictionaryStringString;
+  Dictionary2: TStringList;
+  StartTime: TDateTime;
+  I: Integer;
+  R: string;
+begin
+  LabelTestName.Caption := 'Generic specialized TDictionaryStringString vs. classic non-generic TStringList benchmark';
+  ListViewOutput.Clear;
+  try
+    UpdateButtonState(False);
+    Dictionary := TDictionaryStringString.Create;
+    Dictionary2 := TStringList.Create;
+    Dictionary2.NameValueSeparator := '|';
+
+    I := 0;
+    StartTime := Now;
+    repeat
+      Dictionary.Add(IntToStr(I), IntToStr(I));
+      I := I + 1;
+    until (Now - StartTime) > MeasureDuration;
+    WriteOutput('TDictionaryStringString.Add', IntToStr(Dictionary.Count) + ' ops');
+    Application.ProcessMessages;
+
+    I := 0;
+    StartTime := Now;
+    repeat
+      Dictionary2.Add(IntToStr(I) + Dictionary2.NameValueSeparator + IntToStr(I));
+      I := I + 1;
+    until (Now - StartTime) > MeasureDuration;
+    WriteOutput('TStringList.Add', IntToStr(Dictionary2.Count) + ' ops');
+    Application.ProcessMessages;
+
+    I := 0;
+    StartTime := Now;
+    repeat
+      R := Dictionary.Values[IntToStr(I mod Dictionary.Count)];
+      I := I + 1;
+    until (Now - StartTime) > MeasureDuration;
+    WriteOutput('TDictionaryStringString.Values', IntToStr(I) + ' ops');
+    Application.ProcessMessages;
+
+    I := 0;
+    StartTime := Now;
+    repeat
+      R := Dictionary2.Values[IntToStr(I mod Dictionary2.Count)];
+      I := I + 1;
+    until (Now - StartTime) > MeasureDuration;
+    WriteOutput('TStringList.Values', IntToStr(I) + ' ops');
+    Application.ProcessMessages;
+
+    I := 0;
+    StartTime := Now;
+    repeat
+      R := Dictionary.Keys[I mod Dictionary.Count];
+      I := I + 1;
+    until (Now - StartTime) > MeasureDuration;
+    WriteOutput('TDictionaryStringString.Keys', IntToStr(I) + ' ops');
+    Application.ProcessMessages;
+
+    I := 0;
+    StartTime := Now;
+    repeat
+      R := Dictionary2.Names[I mod Dictionary2.Count];
+      I := I + 1;
+    until (Now - StartTime) > MeasureDuration;
+    WriteOutput('TStringList.Keys(Names)', IntToStr(I) + ' ops');
+    Application.ProcessMessages;
+
+    I := 0;
+    StartTime := Now;
+    repeat
+      R := Dictionary.Items[I mod Dictionary.Count].Value;
+      I := I + 1;
+    until (Now - StartTime) > MeasureDuration;
+    WriteOutput('TDictionaryStringString.Items', IntToStr(I) + ' ops');
+    Application.ProcessMessages;
+
+    I := 0;
+    StartTime := Now;
+    repeat
+      R := Dictionary2.ValueFromIndex[I mod Dictionary2.Count];
+      I := I + 1;
+    until (Now - StartTime) > MeasureDuration;
+    WriteOutput('TStringList.Items(ValueFromIndex)', IntToStr(I) + ' ops');
+    Application.ProcessMessages;
+
+  finally
+    UpdateButtonState(True);
+    Dictionary.Free;
+    Dictionary2.Free;
+  end;
+end;
+
+procedure TMainForm.ButtonBenchmarkListPointerClick(Sender: TObject);
+var
+  List: TListPointer;
+  List2: TFPList;
+  StartTime: TDateTime;
+  I: Integer;
+const
+  SampleCount: Integer = 100000;
+begin
+  LabelTestName.Caption := 'Generic specialized TListObject vs. classic non-generic TFPList benchmark';
+  ListViewOutput.Clear;
+  try
+    UpdateButtonState(False);
+    List := TListPointer.Create;
+    List2 := TFPList.Create;
+
+    WriteOutput('TListPointer.InstanceSize', IntToStr(TListPointer.InstanceSize) + ' bytes');
+    WriteOutput('TFPList.InstanceSize', IntToStr(TFPList.InstanceSize) + ' bytes');
+
+    StartTime := Now;
+    repeat
+      List.Add(Pointer(1));
+    until (Now - StartTime) > MeasureDuration;
+    WriteOutput('TListPointer.Add', IntToStr(List.Count) + ' ops');
+    List.Clear;
+    Application.ProcessMessages;
+
+    StartTime := Now;
+    repeat
+      List2.Add(Pointer(1));
+    until (Now - StartTime) > MeasureDuration;
+    WriteOutput('TFPList.Add', IntToStr(List2.Count) + ' ops');
+    List2.Clear;
+    Application.ProcessMessages;
+
+    StartTime := Now;
+    repeat
+      List.Insert(0, Pointer(1));
+    until (Now - StartTime) > MeasureDuration;
+    WriteOutput('TListPointer.Insert', IntToStr(List.Count) + ' ops');
+    List.Clear;
+    Application.ProcessMessages;
+
+    StartTime := Now;
+    repeat
+      List2.Insert(0, Pointer(1));
+    until (Now - StartTime) > MeasureDuration;
+    WriteOutput('TFPList.Insert', IntToStr(List2.Count) + ' ops');
+    List2.Clear;
+    Application.ProcessMessages;
+
+    for I := 0 to SampleCount - 1 do
+      List.Add(Pointer(1));
+    StartTime := Now;
+    I := 0;
+    repeat
+      List.Delete(0);
+      Inc(I);
+    until (Now - StartTime) > MeasureDuration;
+    WriteOutput('TListPointer.Delete', IntToStr(I) + ' ops');
+    List.Clear;
+    Application.ProcessMessages;
+
+    for I := 0 to SampleCount - 1 do
+      List2.Add(Pointer(1));
+    StartTime := Now;
+    I := 0;
+    repeat
+      List2.Delete(0);
+      Inc(I);
+    until (Now - StartTime) > MeasureDuration;
+    WriteOutput('TFPList.Delete', IntToStr(I) + ' ops');
+    Application.ProcessMessages;
+
+    for I := 0 to SampleCount - 1 do
+      List.Add(Pointer(1));
+    StartTime := Now;
+    I := 0;
+    repeat
+      List.Move(Round(SampleCount * 0.3), Round(SampleCount * 0.7));
+      Inc(I);
+    until (Now - StartTime) > MeasureDuration;
+    WriteOutput('TListPointer.Move', IntToStr(I) + ' ops');
+    List.Clear;
+    Application.ProcessMessages;
+
+    for I := 0 to SampleCount - 1 do
+    List2.Add(Pointer(1));
+    StartTime := Now;
+    I := 0;
+    repeat
+      List2.Move(Round(SampleCount * 0.3), Round(SampleCount * 0.7));
+      Inc(I);
+    until (Now - StartTime) > MeasureDuration;
+    WriteOutput('TFPList.Move', IntToStr(I) + ' ops');
+    Application.ProcessMessages;
+
+    for I := 0 to SampleCount - 1 do
+      List.Add(Pointer(1));
+    StartTime := Now;
+    I := 0;
+    repeat
+      List.Exchange(Round(SampleCount * 0.3), Round(SampleCount * 0.7));
+      Inc(I);
+    until (Now - StartTime) > MeasureDuration;
+    WriteOutput('TListPointer.Exchange', IntToStr(I) + ' ops');
+    List.Clear;
+    Application.ProcessMessages;
+
+    for I := 0 to SampleCount - 1 do
+    List2.Add(Pointer(1));
+    StartTime := Now;
+    I := 0;
+    repeat
+      List2.Exchange(Round(SampleCount * 0.3), Round(SampleCount * 0.7));
+      Inc(I);
+    until (Now - StartTime) > MeasureDuration;
+    WriteOutput('TFPList.Exchange', IntToStr(I) + ' ops');
+    Application.ProcessMessages;
+
+    for I := 0 to SampleCount - 1 do
+      List.Add(Pointer(1));
+    StartTime := Now;
+    I := 0;
+    repeat
+      List.IndexOf(Pointer(I mod List.Count));
+      Inc(I);
+    until (Now - StartTime) > MeasureDuration;
+    WriteOutput('TListPointer.IndexOf', IntToStr(I) + ' ops');
+    List.Clear;
+    Application.ProcessMessages;
+
+    for I := 0 to SampleCount - 1 do
+    List2.Add(Pointer(1));
+    StartTime := Now;
+    I := 0;
+    repeat
+      List2.IndexOf(Pointer(I mod List2.Count));
+      Inc(I);
+    until (Now - StartTime) > MeasureDuration;
+    WriteOutput('TFPList.IndexOf', IntToStr(I) + ' ops');
+    Application.ProcessMessages;
+
+    for I := 0 to SampleCount - 1 do
+      List.Add(Pointer(1));
+    StartTime := Now;
+    I := 0;
+    repeat
+      List[I mod List.Count] := Pointer(1);
+      Inc(I);
+    until (Now - StartTime) > MeasureDuration;
+    WriteOutput('TListPointer[I] write', IntToStr(I) + ' ops');
+    List.Clear;
+    Application.ProcessMessages;
+
+    for I := 0 to SampleCount - 1 do
+    List2.Add(Pointer(1));
+    StartTime := Now;
+    I := 0;
+    repeat
+      List2[I mod List2.Count] := Pointer(1);
+      Inc(I);
+    until (Now - StartTime) > MeasureDuration;
+    WriteOutput('TFPList[I] write', IntToStr(I) + ' ops');
+    Application.ProcessMessages;
+
+    for I := 0 to SampleCount - 1 do
+      List.Add(Pointer(1));
+    StartTime := Now;
+    I := 0;
+    repeat
+      List[I mod List.Count];
+      Inc(I);
+    until (Now - StartTime) > MeasureDuration;
+    WriteOutput('TListPointer[I] read', IntToStr(I) + ' ops');
+    List.Clear;
+    Application.ProcessMessages;
+
+    for I := 0 to SampleCount - 1 do
+    List2.Add(Pointer(1));
+    StartTime := Now;
+    I := 0;
+    repeat
+      List2[I mod List2.Count];
+      Inc(I);
+    until (Now - StartTime) > MeasureDuration;
+    WriteOutput('TFPList[I] read', IntToStr(I) + ' ops');
+    Application.ProcessMessages;
+  finally
+    UpdateButtonState(True);
+    List.Free;
+    List2.Free;
+  end;
+end;
+
+function StrToStr(Value: string): string;
+begin
+  Result := Value;
+end;
+
+procedure TMainForm.ButtonStringListClick(Sender: TObject);
+var
+  List: TListString;
+begin
+  ListViewOutput.Clear;
+  WriteOutput('TListString test');
+  List := TListString.Create;
+  with List do try
+    AddArray(['One', 'Two', 'Three', 'Four', 'Five', 'Six', 'Seven']);
+    WriteOutput('Count', IntToStr(Count));
+    WriteOutput('Implode', Implode(',', StrToStr));
+    WriteOutput('Reverse');
+    Reverse;
+    WriteOutput('Implode', Implode(',', StrToStr));
+    WriteOutput('First', First);
+    WriteOutput('Last', Last);
+    MoveItems(2, 3, 3);
+    WriteOutput('Implode', Implode(',', StrToStr));
+    InsertCount(0, 3);
+    WriteOutput('InsertCount(0, 3)', Implode(',', StrToStr));
+    Fill(0, 3, 'Zero');
+    WriteOutput('Fill(0, 3, ''Zero'')', Implode(',', StrToStr));
+  finally
+    Free;
+  end;
+end;
+
+procedure TMainForm.FormDestroy(Sender: TObject);
+begin
+end;
+
+procedure TMainForm.UpdateButtonState(Enabled: Boolean);
+begin
+  ButtonBenchmarkDictionary.Enabled := Enabled;
+  ButtonBenchmarkListString.Enabled := Enabled;
+  ButtonCharList.Enabled := Enabled;
+  ButtonDictionaryString.Enabled := Enabled;
+  ButtonIntegerList.Enabled := Enabled;
+  ButtonListObject.Enabled := Enabled;
+  ButtonMatrixInteger.Enabled := Enabled;
+  ButtonQueueInteger.Enabled := Enabled;
+  ButtonStringList.Enabled := Enabled;
+end;
+
+procedure TMainForm.WriteOutput(Text1: string = ''; Text2: string = '');
+var
+  NewItem: TListItem;
+begin
+  NewItem := ListViewOutput.Items.Add;
+  NewItem.Caption := Text1;
+  NewItem.SubItems.Add(Text2);
+end;
+
+end.
+
Index: /tags/1.1.0/Packages/TemplateGenerics/Generic/GenericBitmap.inc
===================================================================
--- /tags/1.1.0/Packages/TemplateGenerics/Generic/GenericBitmap.inc	(revision 137)
+++ /tags/1.1.0/Packages/TemplateGenerics/Generic/GenericBitmap.inc	(revision 137)
@@ -0,0 +1,72 @@
+{$IFDEF INTERFACE}
+
+// TGBitmap<TGBitmapIndexX, TGBitmapIndexY, TGBitmapItem>
+{$DEFINE TGMatrixIndexX := TGBitmapIndexX}
+{$DEFINE TGMatrixIndexY := TGBitmapIndexY}
+{$DEFINE TGMatrixItem := TGBitmapItem}
+{$DEFINE TGMatrixIndex := TGBitmapIndex}
+{$DEFINE TGMatrixRow := TGBitmapRow}
+{$DEFINE TGMatrix := TGBitmapMatrix}
+{$DEFINE INTERFACE}
+{$I 'GenericMatrix.inc'}
+
+  // TGBitmap<TGBitmapIndex, TGBitmapIndex, TGBitmapItem> = class
+  TGBitmap = class(TGMatrix)
+  private
+    function GetWidth: TGBitmapIndexX;
+    function GetHeight: TGBitmapIndexX;
+    procedure SetWidth(Value: TGBitmapIndexX);
+    procedure SetHeight(Value: TGBitmapIndexY);
+  public
+    property Pixels[X: TGBitmapIndexX; Y: TGBitmapIndexY]: TGBitmapItem
+      read GetItemXY write PutItemXY;
+    property Width: TGBitmapIndexX read GetWidth write SetWidth;
+    property Height: TGBitmapIndexY read GetHeight write SetHeight;
+  end;
+
+{$UNDEF INTERFACE}
+{$ENDIF}
+
+{$IFDEF IMPLEMENTATION_USES}
+
+  {$DEFINE IMPLEMENTATION_USES}
+  {$I 'GenericMatrix.inc'}
+
+{$UNDEF IMPLEMENTATION_USES}
+{$ENDIF}
+
+{$IFDEF IMPLEMENTATION}
+
+// TGBitmap<TGBitmapIndexX, TGBitmapIndexY, TGBitmapItem>
+{$DEFINE TGMatrixIndexX := TGBitmapIndexX}
+{$DEFINE TGMatrixIndexY := TGBitmapIndexY}
+{$DEFINE TGMatrixItem := TGBitmapItem}
+{$DEFINE TGMatrixIndex := TGBitmapIndex}
+{$DEFINE TGMatrixRow := TGBitmapRow}
+{$DEFINE TGMatrix := TGBitmapMatrix}
+{$DEFINE IMPLEMENTATION}
+{$I 'GenericMatrix.inc'}
+
+function TGBitmap.GetWidth: TGBitmapIndexX;
+begin
+  Result := Count.X;
+end;
+
+function TGBitmap.GetHeight: TGBitmapIndexX;
+begin
+  Result := Count.Y;
+end;
+
+procedure TGBitmap.SetWidth(Value: TGBitmapIndexX);
+begin
+  Count := CreateIndex(Value, Count.Y);
+end;
+
+procedure TGBitmap.SetHeight(Value: TGBitmapIndexY);
+begin
+  Count := CreateIndex(Count.X, Value);
+end;
+
+{$UNDEF IMPLEMENTATION}
+{$ENDIF}
+
Index: /tags/1.1.0/Packages/TemplateGenerics/Generic/GenericDictionary.inc
===================================================================
--- /tags/1.1.0/Packages/TemplateGenerics/Generic/GenericDictionary.inc	(revision 137)
+++ /tags/1.1.0/Packages/TemplateGenerics/Generic/GenericDictionary.inc	(revision 137)
@@ -0,0 +1,105 @@
+{$IFDEF INTERFACE}
+
+  TGDictionary = class;
+
+  TGPair = record
+    Key: TGPairKey;
+    Value: TGPairValue;
+  end;
+
+{$DEFINE TGListIndex := TGDictionaryIndex}
+{$DEFINE TGListItem := TGPair}
+{$DEFINE TGList := TGDictionaryList}
+{$DEFINE INTERFACE}
+{$I 'GenericList.inc'}
+
+  // TGDictionary<TGDictionaryIndex, TGPair<TGPairKey, TGPairValue>> = class(TGList)
+  TGDictionary = class(TGList)
+  private
+    function GetKey(Index: TGDictionaryIndex): TGPairKey;
+    function GetValue(Key: TGPairKey): TGPairValue;
+    procedure PutKey(Index: TGDictionaryIndex; const AValue: TGPairKey);
+    procedure PutValue(Key: TGPairKey; const AValue: TGPairValue);
+  public
+    function SearchKey(Key: TGPairKey): TGDictionaryIndex;
+    procedure Add(Key: TGPairKey; Value: TGPairValue);
+    property Values[Index: TGPairKey]: TGPairValue
+      read GetValue write PutValue;
+    property Keys[Index: TGDictionaryIndex]: TGPairKey
+      read GetKey write PutKey;
+  end;
+
+{$UNDEF INTERFACE}
+{$ENDIF}
+
+
+{$IFDEF IMPLEMENTATION_USES}
+{$I '..\Generic\GenericList.inc'}
+{$UNDEF IMPLEMENTATION_USES}
+{$ENDIF}
+
+
+{$IFDEF IMPLEMENTATION}
+
+{$DEFINE TGListIndex := TGDictionaryIndex}
+{$DEFINE TGListItem := TGPair}
+{$DEFINE TGList := TGDictionaryList}
+{$DEFINE IMPLEMENTATION}
+{$I 'GenericList.inc'}
+
+function TGDictionary.GetKey(Index: TGDictionaryIndex): TGPairKey;
+begin
+  Result := Items[Index].Key;
+end;
+
+function TGDictionary.GetValue(Key: TGPairKey): TGPairValue;
+begin
+  Result := Items[SearchKey(Key)].Value;
+end;
+
+procedure TGDictionary.PutKey(Index: TGDictionaryIndex;
+  const AValue: TGPairKey);
+var
+  Item: TGPair;
+begin
+  //Items[Index].Key := AValue;
+  Item := Items[Index];
+  Item.Key := AValue;
+  Items[Index] := Item;
+end;
+
+procedure TGDictionary.PutValue(Key: TGPairKey;
+  const AValue: TGPairValue);
+var
+  Item: TGPair;
+  Index: TGDictionaryIndex;
+begin
+  //Items[SearchKey(Index)].Value := AValue;
+  Index := SearchKey(Key);
+  Item := Items[Index];
+  Item.Value := AValue;
+  Items[Index] := Item;
+end;
+
+function TGDictionary.SearchKey(Key: TGPairKey): TGDictionaryIndex;
+begin
+  Result := 0;
+  while Result < Count do begin
+    if Items[Result].Key = Key then begin
+      Break;
+    end;
+    Result := Result + 1;
+  end;
+end;
+
+procedure TGDictionary.Add(Key: TGPairKey; Value: TGPairValue);
+var
+  NewPair: TGPair;
+begin
+  NewPair.Key := Key;
+  NewPair.Value := Value;
+  inherited Add(NewPair);
+end;
+
+{$UNDEF IMPLEMENTATION}
+{$ENDIF}
Index: /tags/1.1.0/Packages/TemplateGenerics/Generic/GenericFileList.inc
===================================================================
--- /tags/1.1.0/Packages/TemplateGenerics/Generic/GenericFileList.inc	(revision 137)
+++ /tags/1.1.0/Packages/TemplateGenerics/Generic/GenericFileList.inc	(revision 137)
@@ -0,0 +1,92 @@
+{$IFDEF INTERFACE}
+
+{$DEFINE TGListIndex := TGFileListIndex}
+{$DEFINE TGListItem := TGFileListItem}
+{$DEFINE TGList := TGFileListList}
+{$DEFINE INTERFACE}
+{$I 'GenericList.inc'}
+
+  // TGFileList<TGFileListIndex, TGFileListItem>
+  TGFileList = class(TGList)
+  private
+    FFileName: string;
+    FMode: Word;
+    FHandle: THandle;
+    procedure SetFileName(const Value: string);
+    procedure SetMode(const Value: Word);
+    function GetOpenned: Boolean;
+  public
+    constructor Create; override;
+    destructor Destroy; override;
+    procedure Open;
+    procedure Close;
+    property FileName: string read FFileName write SetFileName;
+    property Mode: Word read FMode write SetMode;
+    property Openned: Boolean read GetOpenned;
+  end;
+
+{$UNDEF INTERFACE}
+{$ENDIF}
+
+
+{$IFDEF IMPLEMENTATION}
+
+{$DEFINE TGListIndex := TGFileListIndex}
+{$DEFINE TGListItem := TGFileListItem}
+{$DEFINE TGList := TGFileListList}
+{$DEFINE IMPLEMENTATION}
+{$I 'GenericList.inc'}
+
+constructor TGFileList.Create;
+begin
+  inherited;
+  FHandle := feInvalidHandle;
+end;
+
+destructor TGFileList.Destroy;
+begin
+  Close;
+  inherited;
+end;
+
+procedure TGFileList.Open;
+begin
+  If (Mode and fmCreate) > 0 then
+    FHandle := FileCreate(FFileName, FMode, 438)
+  else
+    FHandle := FileOpen(FFileName, FMode);
+end;
+
+procedure TGFileList.Close;
+begin
+  if FHandle <> feInvalidHandle then FileClose(FHandle);
+end;
+
+procedure TGFileList.SetFileName(const Value: string);
+begin
+  if FFileName = Value then Exit;
+  FFileName := Value;
+  if FHandle <> feInvalidHandle then begin
+    Close;
+    Open;
+  end;
+end;
+
+procedure TGFileList.SetMode(const Value: Word);
+begin
+  if FMode = Value then Exit;
+  FMode := Value;
+  if FHandle <> feInvalidHandle then begin
+    Close;
+    Open;
+  end;
+end;
+
+function TGFileList.GetOpenned: Boolean;
+begin
+  Result := FHandle <> feInvalidHandle;
+end;
+
+{$UNDEF IMPLEMENTATION}
+{$ENDIF}
+
Index: /tags/1.1.0/Packages/TemplateGenerics/Generic/GenericList.inc
===================================================================
--- /tags/1.1.0/Packages/TemplateGenerics/Generic/GenericList.inc	(revision 137)
+++ /tags/1.1.0/Packages/TemplateGenerics/Generic/GenericList.inc	(revision 137)
@@ -0,0 +1,706 @@
+{$IFDEF INTERFACE}
+
+  // TGList implemented using templates
+  // - item operations (Add, Insert, ReplaceArray, Get, Set, IndexOf,
+  //   Extract, Delete, Exchange)
+  // - item range operations (DeleteItems, InsertItems, ReplaceItems,
+  //   Move, Fill)
+  // - other TGList operations (AddList, InsertList,
+  //   ReplaceList, GetList, IndexOfList)
+  // - dynamic array operations (AddArray, InsertArray,
+  //   ReplaceArray, GetArray, IndexOfArray)
+  // - all items operations (Clear, Reverse, Sort)
+
+  //TGAbstractList = class
+
+  //end;
+
+  // TGList<TGListIndex, TGListItem> = class
+  TGList = class//(TGAbstractList)
+  public
+    type
+      PItem = ^TGListItem;
+      TSortCompare = function(Item1, Item2: TGListItem): Integer of object;
+      TToStringConverter = function(Item: TGListItem): string;
+      TFromStringConverter = function(Text: string): TGListItem;
+      TItemArray = array of TGListItem;
+  private
+    FItems: array of TGListItem;
+    FCount: TGListIndex;
+    FUpdateCount: Integer;
+    FOnUpdate: TNotifyEvent;
+    function Get(Index: TGListIndex): TGListItem;
+    function GetCapacity: TGListIndex;
+    function GetLast: TGListItem;
+    function GetFirst: TGListItem;
+    procedure SetCapacity(const AValue: TGListIndex);
+    procedure SetCapacityOptimized(const NewCapacity: TGListIndex);
+    procedure SetLast(AValue: TGListItem);
+    procedure SetFirst(AValue: TGListItem);
+    procedure QuickSort(L, R : TGListIndex; Compare: TSortCompare);
+    procedure DoUpdate;
+  protected
+    procedure Put(Index: TGListIndex; const AValue: TGListItem); virtual;
+    procedure SetCount(const AValue: TGListIndex); virtual;
+  public
+    function CompareMem(P1, P2: Pointer; Length: cardinal): Boolean; inline;
+    function Add(Item: TGListItem): TGListIndex;
+    procedure AddArray(Values: array of TGListItem);
+    procedure AddList(List: TGList);
+    procedure AddListPart(List: TGList; ItemIndex, ItemCount: TGListIndex);
+    procedure Assign(Source: TGList); virtual;
+    constructor Create; virtual;
+    procedure Clear; virtual;
+    procedure Delete(Index: TGListIndex); virtual;
+    procedure DeleteItems(Index, Count: TGListIndex);
+    function EqualTo(List: TGList): Boolean;
+    procedure Exchange(Index1, Index2: TGListIndex);
+    procedure Explode(Text, Separator: string; Converter: TFromStringConverter; SlicesCount: Integer = -1);
+    function Extract(Item: TGListItem): TGListItem;
+    property First: TGListItem read GetFirst write SetFirst;
+    procedure Fill(Start, Count: TGListIndex; Value: TGListItem);
+    function GetArray(Index, ACount: TGListIndex): TItemArray;
+    procedure GetList(List: TGList; Index, ACount: TGListIndex);
+    procedure GetBuffer(Index: TGListIndex; var Buffer; Count: TGListIndex);
+    function Implode(Separator: string; Converter: TToStringConverter): string;
+    function IndexOf(Item: TGListItem; Start: TGListIndex = 0): TGListIndex; virtual;
+    function IndexOfList(List: TGList; Start: TGListIndex = 0): TGListIndex;
+    function IndexOfArray(Values: array of TGListItem; Start: TGListIndex = 0): TGListIndex;
+    procedure Insert(Index: TGListIndex; Item: TGListItem);
+    procedure InsertList(Index: TGListIndex; List: TGList);
+    procedure InsertArray(Index: TGListIndex; Values: array of TGListItem);
+    procedure InsertCount(Index: TGListIndex; ACount: TGListIndex);
+    procedure Move(CurIndex, NewIndex: TGListIndex);
+    procedure MoveItems(CurIndex, NewIndex, Count: TGListIndex);
+    function Remove(Item: TGListItem): TGListIndex;
+    procedure Reverse;
+    procedure ReplaceArray(Index: TGListIndex; Values: array of TGListItem);
+    procedure ReplaceList(Index: TGListIndex; Source: TGList);
+    procedure ReplaceListPart(Index: TGListIndex; Source: TGList;
+      SourceIndex, SourceCount: TGListIndex);
+    procedure ReplaceBuffer(Index: TGListIndex; var Buffer; Count: TGListIndex);
+    procedure Sort(Compare: TSortCompare);
+    procedure SetArray(Values: array of TGListItem);
+    procedure BeginUpdate;
+    procedure EndUpdate;
+    procedure Update;
+    property Count: TGListIndex read FCount write SetCount;
+    property Capacity: TGListIndex read GetCapacity write SetCapacity;
+    property Items[Index: TGListIndex]: TGListItem read Get write Put; default;
+    property Last: TGListItem read GetLast write SetLast;
+    property OnUpdate: TNotifyEvent read FOnUpdate write FOnUpdate;
+  end;
+
+{$UNDEF INTERFACE}
+{$ENDIF}
+
+{$IFDEF IMPLEMENTATION_USES}
+
+uses
+  RtlConsts;
+
+{$UNDEF IMPLEMENTATION_USES}
+{$ENDIF}
+
+{$IFDEF IMPLEMENTATION}
+
+{ TGList }
+
+constructor TGList.Create;
+begin
+  FCount := 0;
+  FUpdateCount := 0;
+end;
+
+procedure TGList.GetBuffer(Index: TGListIndex; var Buffer; Count: TGListIndex);
+var
+  P: PItem;
+  I: TGListIndex;
+begin
+  if (Index + Count) > FCount then
+    raise EListError.CreateFmt(SListIndexError, [Index + Count]);
+  P := PItem(@Buffer);
+  I := 0;
+  while I < Count do begin
+    P^ := Items[Index + I];
+    Inc(P, 1);
+    I := I + 1;
+  end;
+end;
+
+procedure TGList.ReplaceBuffer(Index: TGListIndex; var Buffer; Count: TGListIndex);
+var
+  P: PItem;
+  I: TGListIndex;
+begin
+  if (Index + Count) > FCount then
+    raise EListError.CreateFmt(SListIndexError, [Index + Count]);
+  P := PItem(@Buffer);
+  I := 0;
+  while I < Count do begin
+    Items[Index + I] := P^;
+    Inc(P, 1);
+    I := I + 1;
+  end;
+end;
+
+procedure TGList.ReplaceArray(Index: TGListIndex; Values: array of TGListItem);
+var
+  I: TGListIndex;
+begin
+  I := 0;
+  while I < Length(Values) do begin
+    Items[Index + I] := Values[I];
+    I := I + 1;
+  end;
+  Update;
+end;
+
+procedure TGList.ReplaceList(Index: TGListIndex; Source: TGList);
+var
+  I: TGListIndex;
+begin
+  I := 0;
+  while I < Source.Count do begin
+    Items[Index + I] := Source[I];
+    I := I + 1;
+  end;
+  Update;
+end;
+
+procedure TGList.ReplaceListPart(Index: TGListIndex; Source: TGList;
+  SourceIndex, SourceCount: TGListIndex);
+var
+  I: TGListIndex;
+begin
+  I := 0;
+  while I < SourceCount do begin
+    Items[Index + I] := Source[SourceIndex + I];
+    I := I + 1;
+  end;
+  Update;
+end;
+
+function TGList.GetCapacity: TGListIndex;
+begin
+  Result := Length(FItems);
+end;
+
+procedure TGList.SetCapacity(const AValue: TGListIndex);
+begin
+  if (AValue < FCount) then
+    raise EListError.CreateFmt(SListCapacityError, [AValue]);
+  SetLength(FItems, AValue);
+end;
+
+procedure TGList.SetCapacityOptimized(const NewCapacity: TGListIndex);
+var
+  IncSize: TGListIndex;
+begin
+  if NewCapacity > Capacity then begin
+    IncSize := NewCapacity - Capacity;
+    // Expand
+    if IncSize = 1 then begin
+      IncSize := 4;
+      if Capacity > 3 then IncSize := IncSize + 4;
+      if Capacity > 8 then IncSize := IncSize + 8;
+      if Capacity > 63 then IncSize := IncSize + Capacity shr 2; // Grow by one quarter
+    end;
+    Capacity := Capacity + IncSize;
+  end else
+  if NewCapacity < Capacity then begin
+    // Contract
+    if (Capacity > 256) and (FCount < Capacity shr 2) then
+    begin
+      Capacity := Capacity shr 1;
+    end;
+  end;
+end;
+
+function TGList.Get(Index: TGListIndex): TGListItem;
+begin
+  if (Index < 0) or (Index >= Count) then
+    raise EListError.CreateFmt(SListIndexError, [Index]);
+  Result := FItems[Index];
+end;
+
+procedure TGList.Put(Index: TGListIndex; const AValue: TGListItem);
+begin
+  if (Index < 0) or (Index >= Count) then
+    raise EListError.CreateFmt(SListIndexError, [Index]);
+  FItems[Index] := AValue;
+end;
+
+procedure TGList.SetCount(const AValue: TGListIndex);
+begin
+  if (AValue < 0) then
+    raise EListError.CreateFmt(SListCountError, [AValue]);
+  if AValue > Capacity then SetCapacityOptimized(AValue); // Before FCount change
+  FCount := AValue;
+  if AValue < Capacity then SetCapacityOptimized(AValue); // After FCount change
+end;
+
+function TGList.GetArray(Index, ACount: TGListIndex): TItemArray;
+var
+  I: Integer;
+begin
+  SetLength(Result, ACount);
+  I := 0;
+  while I < Count do begin
+    Result[I] := FItems[Index + I];
+    I := I + 1;
+  end;
+end;
+
+procedure TGList.GetList(List: TGList; Index, ACount: TGListIndex);
+begin
+  List.Clear;
+  List.AddListPart(Self, Index, ACount);
+end;
+
+procedure TGList.QuickSort(L, R: TGListIndex; Compare: TSortCompare);
+var
+  I, J: TGListIndex;
+  P, Q: TGListItem;
+begin
+ repeat
+   I := L;
+   J := R;
+   P := FItems[(L + R) div 2];
+   repeat
+     while Compare(P, FItems[I]) > 0 do
+       I := I + 1;
+     while Compare(P, FItems[J]) < 0 do
+       J := J - 1;
+     if I <= J then
+     begin
+       Q := FItems[I];
+       FItems[I] := FItems[J];
+       FItems[J] := Q;
+       I := I + 1;
+       J := J - 1;
+     end;
+   until I > J;
+   if L < J then
+     QuickSort(L, J, Compare);
+   L := I;
+  until I >= R;
+end;
+
+procedure TGList.Assign(Source: TGList);
+var
+  I: TGListIndex;
+begin
+  Count := Source.Count;
+  I := 0;
+  while I < Count do begin
+    FItems[I] := Source[I];
+    I := I + 1;
+  end;
+  Update;
+end;
+
+function TGList.Extract(Item: TGListItem): TGListItem;
+var
+  I: TGListIndex;
+begin
+  I := IndexOf(Item);
+  if I >= 0 then begin
+    Result := Item;
+    Delete(I);
+  end else
+    raise EListError.CreateFmt(SListIndexError, [0]);
+end;
+
+function TGList.CompareMem(P1, P2: Pointer; Length: cardinal): Boolean;
+var
+  I: Cardinal;
+begin
+  Result := True;
+  I := 0;
+  if (P1) <> (P2) then
+    while Result and (I < Length) do
+    begin
+      Result := PByte(P1)^ = PByte(P2)^;
+      Inc(I);
+      Inc(pchar(P1));
+      Inc(pchar(P2));
+    end;
+end;
+
+function TGList.IndexOf(Item: TGListItem; Start: TGListIndex): TGListIndex;
+begin
+  Result := Start;
+  while (Result < FCount) and
+//  not CompareMem(@FItems[Result], @Item, SizeOf(TGListItem)) do
+  not (CompareByte(FItems[Result], Item, SizeOf(TGListItem)) = 0) do
+    Result := Result + 1;
+  if Result = FCount then Result := -1;
+end;
+
+procedure TGList.Insert(Index: TGListIndex; Item: TGListItem);
+begin
+  if (Index < 0) or (Index > FCount) then
+    raise EListError.CreateFmt(SListIndexError, [Index]);
+  try
+    BeginUpdate;
+    InsertCount(Index, 1);
+    FItems[Index] := Item;
+  finally
+    EndUpdate;
+  end;
+end;
+
+procedure TGList.InsertList(Index: TGListIndex; List: TGList);
+begin
+  if (Index < 0) or (Index > FCount) then
+    raise EListError.CreateFmt(SListIndexError, [Index]);
+  InsertCount(Index, List.Count);
+  ReplaceList(Index, List);
+end;
+
+procedure TGList.InsertArray(Index: TGListIndex; Values: array of TGListItem);
+begin
+  if (Index < 0) or (Index > FCount) then
+    raise EListError.CreateFmt(SListIndexError, [Index]);
+  InsertCount(Index, Length(Values));
+  ReplaceArray(Index, Values);
+end;
+
+procedure TGList.InsertCount(Index: TGListIndex; ACount: TGListIndex);
+begin
+  if (Index < 0) or (Index > FCount) then
+    raise EListError.CreateFmt(SListIndexError, [Index]);
+  Count := Count + ACount;
+  if Index < FCount then
+    System.Move(FItems[Index], FItems[Index + ACount], (FCount - ACount - Index) * SizeOf(TGListItem));
+  Update;
+end;
+
+function TGList.IndexOfList(List: TGList; Start: TGListIndex): TGListIndex;
+var
+  I: TGListIndex;
+begin
+  if List.Count > 0 then begin
+    Result := IndexOf(List[0], Start);
+    if Result <> -1 then begin
+      I := 1;
+      while I < List.Count do begin
+        if not CompareMem(Addr(FItems[Result + I]), Addr(List.FItems[I]), SizeOf(TGListItem)) then begin
+          Result := -1;
+          Break;
+        end;
+        I := I + 1;
+      end;
+    end;
+  end else Result := -1;
+end;
+
+function TGList.IndexOfArray(Values: array of TGListItem; Start: TGListIndex): TGListIndex;
+var
+  I: TGListIndex;
+begin
+  if Length(Values) > 0 then begin
+    Result := IndexOf(Values[0], Start);
+    if Result <> -1 then begin
+      I := 1;
+      while I < Length(Values) do begin
+        if not CompareMem(Addr(FItems[Result + I]), Addr(Values[I]), SizeOf(TGListItem)) then begin
+          Result := -1;
+          Break;
+        end;
+        I := I + 1;
+      end;
+    end;
+  end else Result := -1;
+end;
+
+function TGList.GetLast: TGListItem;
+begin
+  if FCount = 0 then
+    raise EListError.CreateFmt(SListIndexError, [0])
+  else
+    Result := FItems[FCount - 1];
+end;
+
+procedure TGList.SetLast(AValue: TGListItem);
+begin
+  if FCount = 0 then
+    raise EListError.CreateFmt(SListIndexError, [0])
+  else
+    FItems[FCount - 1] := AValue;
+end;
+
+function TGList.GetFirst: TGListItem;
+begin
+  if FCount = 0 then
+    raise EListError.CreateFmt(SListIndexError, [0])
+  else
+    Result := FItems[0];
+end;
+
+procedure TGList.SetFirst(AValue: TGListItem);
+begin
+  if FCount = 0 then
+    raise EListError.CreateFmt(SListIndexError, [0])
+  else
+    FItems[0] := AValue;
+end;
+
+procedure TGList.Move(CurIndex, NewIndex: TGListIndex);
+var
+  Temp: TGListItem;
+begin
+  if ((CurIndex < 0) or (CurIndex > Count - 1)) then
+    raise EListError.CreateFmt(SListIndexError, [CurIndex]);
+  if ((NewIndex < 0) or (NewIndex > Count -1)) then
+    raise EListError.CreateFmt(SlistIndexError, [NewIndex]);
+  Temp := FItems[CurIndex];
+  if NewIndex > CurIndex then begin
+    System.Move(FItems[CurIndex + 1], FItems[CurIndex], (NewIndex - CurIndex) * SizeOf(TGListItem));
+  end else
+  if NewIndex < CurIndex then begin
+    System.Move(FItems[NewIndex], FItems[NewIndex + 1], (CurIndex - NewIndex) * SizeOf(TGListItem));
+  end;
+  FItems[NewIndex] := Temp;
+  //Delete(CurIndex);
+  //Insert(NewIndex, Temp);
+  Update;
+end;
+
+procedure TGList.MoveItems(CurIndex, NewIndex, Count: TGListIndex);
+var
+  S: Integer;
+  D: Integer;
+begin
+  if CurIndex < NewIndex then begin
+    S := CurIndex + Count - 1;
+    D := NewIndex + Count - 1;
+    while S >= CurIndex do begin
+      Move(S, D);
+      S := S - 1;
+      D := D - 1;
+    end;
+  end else
+  if CurIndex > NewIndex then begin
+    S := CurIndex;
+    D := NewIndex;
+    while S < (CurIndex + Count) do begin
+      Move(S, D);
+      S := S + 1;
+      D := D + 1;
+    end;
+  end;
+  Update;
+end;
+
+function TGList.Remove(Item: TGListItem): TGListIndex;
+begin
+  Result := IndexOf(Item);
+  if Result <> -1 then
+    Delete(Result)
+    else raise Exception.CreateFmt(SItemNotFound, [0]);
+end;
+
+function TGList.EqualTo(List: TGList): Boolean;
+var
+  I: TGListIndex;
+begin
+  Result := Count = List.Count;
+  if Result then begin
+    I := 0;
+    while I < Count do begin
+      if not CompareMem(Addr(FItems[I]), Addr(List.FItems[I]), SizeOf(TGListItem)) then begin
+        Result := False;
+        Break;
+      end;
+      I := I + 1;
+    end;
+  end;
+end;
+
+procedure TGList.Reverse;
+var
+  I: TGListIndex;
+begin
+  I := 0;
+  while I < (Count div 2) do begin
+    Exchange(I, Count - 1 - I);
+    I := I + 1;
+  end;
+  Update;
+end;
+
+procedure TGList.Sort(Compare: TSortCompare);
+begin
+  if FCount > 1 then
+    QuickSort(0, FCount - 1, Compare);
+  Update;
+end;
+
+procedure TGList.AddArray(Values: array of TGListItem);
+var
+  I: TGListIndex;
+begin
+  I := 0;
+  while I <= High(Values) do begin
+    Add(Values[I]);
+    I := I + 1;
+  end;
+  Update;
+end;
+
+procedure TGList.SetArray(Values: array of TGListItem);
+var
+  I: TGListIndex;
+begin
+  Clear;
+  I := 0;
+  while I <= High(Values) do begin
+    Add(Values[I]);
+    I := I + 1;
+  end;
+end;
+
+procedure TGList.BeginUpdate;
+begin
+  Inc(FUpdateCount);
+end;
+
+procedure TGList.EndUpdate;
+begin
+  if FUpdateCount > 0 then Dec(FUpdateCount);
+  if FUpdateCount = 0 then DoUpdate;
+end;
+
+procedure TGList.DoUpdate;
+begin
+  if Assigned(FOnUpdate) then FOnUpdate(Self);
+end;
+
+procedure TGList.Update;
+begin
+  if FUpdateCount = 0 then DoUpdate;
+end;
+
+function TGList.Implode(Separator: string; Converter: TToStringConverter): string;
+var
+  I: TGListIndex;
+begin
+  Result := '';
+  I := 0;
+  while I < Count do begin
+    Result := Result + Converter(FItems[I]);
+    if I < (Count - 1) then
+      Result := Result + Separator;
+    I := I + 1;
+  end;
+end;
+
+procedure TGList.Explode(Text, Separator: string; Converter: TFromStringConverter; SlicesCount: Integer = -1);
+begin
+  Clear;
+  while (Pos(Separator, Text) > 0) and
+  ((Count < (SlicesCount - 1)) or (SlicesCount = -1)) do begin
+    Add(Converter(Copy(Text, 1, Pos(Separator, Text) - 1)));
+    System.Delete(Text, 1, Pos(Separator, Text) + Length(Separator) - 1);
+  end;
+  Add(Converter(Text));
+end;
+
+function TGList.Add(Item: TGListItem): TGListIndex;
+begin
+  Count := Count + 1;
+  Result := FCount - 1;
+  FItems[Result] := Item;
+  Update;
+end;
+
+procedure TGList.AddList(List: TGList);
+var
+  I: TGListIndex;
+  J: TGListIndex;
+begin
+  I := Count;
+  J := 0;
+  Count := Count + List.Count;
+  while I < Count do begin
+    Items[I] := List[J];
+    I := I + 1;
+    J := J + 1;
+  end;
+  Update;
+end;
+
+procedure TGList.AddListPart(List: TGList; ItemIndex, ItemCount: TGListIndex);
+var
+  I: TGListIndex;
+  J: TGListIndex;
+begin
+  I := Count;
+  J := ItemIndex;
+  Count := Count + ItemCount;
+  while I < Count do begin
+    Items[I] := List[J];
+    I := I + 1;
+    J := J + 1;
+  end;
+  Update;
+end;
+
+procedure TGList.Clear;
+begin
+  Count := 0;
+  Capacity := 0;
+end;
+
+procedure TGList.Delete(Index: TGListIndex);
+begin
+  if (Index < 0) or (Index >= FCount) then
+    raise EListError.CreateFmt(SListIndexError, [Index]);
+  FCount := FCount - 1;
+  System.Move(FItems[Index + 1], FItems[Index], (FCount - Index) * SizeOf(TGListItem));
+  SetCapacityOptimized(Capacity - 1);
+  Update;
+end;
+
+procedure TGList.DeleteItems(Index, Count: TGListIndex);
+var
+  I: TGListIndex;
+begin
+  I := Index;
+  while I < (Index + Count) do begin
+    Delete(Index);
+    I := I + 1;
+  end;
+  Update;
+end;
+
+procedure TGList.Fill(Start, Count: TGListIndex; Value: TGListItem);
+var
+  I: TGListIndex;
+begin
+  I := Start;
+  while I < Count do begin
+    FItems[I] := Value;
+    I := I + 1;
+  end;
+  Update;
+end;
+
+procedure TGList.Exchange(Index1, Index2: TGListIndex);
+var
+  Temp: TGListItem;
+begin
+  if ((Index1 >= FCount) or (Index1 < 0)) then
+    raise EListError.CreateFmt(SListIndexError, [Index1]);
+  if ((Index2 >= FCount) or (Index2 < 0)) then
+    raise EListError.CreateFmt(SListIndexError, [Index2]);
+  Temp := FItems[Index1];
+  FItems[Index1] := FItems[Index2];
+  FItems[Index2] := Temp;
+  Update;
+end;
+
+{$UNDEF IMPLEMENTATION}
+{$ENDIF}
Index: /tags/1.1.0/Packages/TemplateGenerics/Generic/GenericListAbstract.inc
===================================================================
--- /tags/1.1.0/Packages/TemplateGenerics/Generic/GenericListAbstract.inc	(revision 137)
+++ /tags/1.1.0/Packages/TemplateGenerics/Generic/GenericListAbstract.inc	(revision 137)
@@ -0,0 +1,36 @@
+{$IFDEF INTERFACE}
+
+  { TGAbstractList }
+
+  TGAbstractList = class
+  private
+    FOnUpdate: TNotifyEvent;
+    function Get(const Index: Integer): Integer; virtual; abstract;
+    function GetCapacity: Integer; virtual; abstract;
+    function GetCount: Integer; virtual; abstract;
+    function GetFirst: Integer; virtual; abstract;
+    function GetLast: Integer; virtual; abstract;
+    procedure Put(const Index: Integer; const AValue: Integer); virtual; abstract;
+    procedure SetCapacity(const AValue: Integer); virtual; abstract;
+    procedure SetCount(const AValue: Integer); virtual; abstract;
+    procedure SetFirst(const AValue: Integer); virtual; abstract;
+    procedure SetLast(const AValue: Integer); virtual; abstract;
+  public
+    type
+      PItem = ^TGListItem;
+    property Count: TGListIndex read GetCount write SetCount;
+    property Capacity: TGListIndex read GetCapacity write SetCapacity;
+    property Items[Index: TGListIndex]: TGListItem read Get write Put; default;
+    property First: TGListItem read GetFirst write SetFirst;
+    property Last: TGListItem read GetLast write SetLast;
+    property OnUpdate: TNotifyEvent read FOnUpdate write FOnUpdate;
+  end;
+
+
+{$UNDEF INTERFACE}
+{$ENDIF}
+
+{$IFDEF IMPLEMENTATION}
+{$UNDEF IMPLEMENTATION}
+{$ENDIF}
+
Index: /tags/1.1.0/Packages/TemplateGenerics/Generic/GenericListObject.inc
===================================================================
--- /tags/1.1.0/Packages/TemplateGenerics/Generic/GenericListObject.inc	(revision 137)
+++ /tags/1.1.0/Packages/TemplateGenerics/Generic/GenericListObject.inc	(revision 137)
@@ -0,0 +1,112 @@
+{$IFDEF INTERFACE}
+
+{$DEFINE TGListIndex := TGListObjectIndex}
+{$DEFINE TGListItem := TGListObjectItem}
+{$DEFINE TGList := TGListObjectList}
+{$DEFINE INTERFACE}
+{$I 'GenericList.inc'}
+
+  // TGListObject<TListObjectIndex, TListObjectItem> = class(TGList)
+  TGListObject = class(TGList)
+  protected
+    procedure Put(Index: TGListIndex; const AValue: TGListItem); override;
+    procedure SetCount(const AValue: TGListIndex); override;
+  public
+    OwnsObjects: Boolean;
+    function AddNew(NewObject: TGListItem = nil): TGListItem;
+    function InsertNew(Index: TGListIndex; NewObject: TGListItem = nil): TGListItem;
+    procedure Delete(Index: TGListObjectIndex); override;
+    procedure Assign(Source: TGList); override;
+    constructor Create; override;
+    destructor Destroy; override;
+  end;
+
+{$UNDEF INTERFACE}
+{$ENDIF}
+
+{$IFDEF IMPLEMENTATION_USES}
+
+  {$DEFINE IMPLEMENTATION_USES}
+  {$I 'GenericList.inc'}
+
+{$UNDEF IMPLEMENTATION_USES}
+{$ENDIF}
+
+{$IFDEF IMPLEMENTATION}
+
+{$DEFINE TGListIndex := TGListObjectIndex}
+{$DEFINE TGListItem := TGListObjectItem}
+{$DEFINE TGList := TGListObjectList}
+{$DEFINE IMPLEMENTATION}
+{$I 'GenericList.inc'}
+
+{ TGListObject }
+
+function TGListObject.AddNew(NewObject: TGListItem = nil): TGListItem;
+begin
+  if Assigned(NewObject) then Result := NewObject
+    else Result := TGListItem.Create;
+  Add(Result);
+end;
+
+function TGListObject.InsertNew(Index: TGListIndex;
+  NewObject: TGListItem = nil): TGListItem;
+begin
+  if Assigned(NewObject) then Result := NewObject
+    else Result := TGListItem.Create;
+  Insert(Index, Result);
+end;
+
+procedure TGListObject.Assign(Source: TGList);
+begin
+  Clear;
+  OwnsObjects := False;
+  inherited;
+end;
+
+procedure TGListObject.Put(Index: TGListIndex; const AValue: TGListItem);
+begin
+  if OwnsObjects and (FItems[Index] <> AValue) then FItems[Index].Free;
+  inherited Put(Index, AValue);
+end;
+
+procedure TGListObject.Delete(Index: TGListObjectIndex);
+begin
+  if OwnsObjects then FItems[Index].Free;
+  inherited Delete(Index);
+end;
+
+procedure TGListObject.SetCount(const AValue: TGListIndex);
+var
+  I: TGListObjectIndex;
+begin
+  if OwnsObjects then begin
+    I := FCount - 1;
+    while I >= AValue do begin
+      FItems[I].Free;
+      I := I - 1;
+    end;
+  end;
+  I := FCount;
+  inherited;
+  // Nil newly allocated items
+  while I < AValue do begin
+    FItems[I] := nil;
+    I := I + 1;
+  end;
+end;
+
+constructor TGListObject.Create;
+begin
+  inherited;
+  OwnsObjects := True;
+end;
+
+destructor TGListObject.Destroy;
+begin
+  Clear;
+  inherited;
+end;
+
+{$UNDEF IMPLEMENTATION}
+{$ENDIF}
Index: /tags/1.1.0/Packages/TemplateGenerics/Generic/GenericListString.inc
===================================================================
--- /tags/1.1.0/Packages/TemplateGenerics/Generic/GenericListString.inc	(revision 137)
+++ /tags/1.1.0/Packages/TemplateGenerics/Generic/GenericListString.inc	(revision 137)
@@ -0,0 +1,87 @@
+{$IFDEF INTERFACE}
+
+{$DEFINE TGListIndex := TGListStringIndex}
+{$DEFINE TGListItem := TGListStringItem}
+{$DEFINE TGList := TGListStringList}
+{$DEFINE INTERFACE}
+{$I 'GenericList.inc'}
+
+  // TGListString<TListStringIndex, TListStringItem> = class(TGList)
+  TGListString = class(TGList)
+  private
+  public
+    procedure Delete(Index: TGListStringIndex); override;
+    procedure Clear; override;
+    procedure Assign(Source: TGList); override;
+    function IndexOf(Item: TGListItem; Start: TGListIndex = 0): TGListIndex; override;
+    constructor Create; override;
+    destructor Destroy; override;
+  end;
+
+{$UNDEF INTERFACE}
+{$ENDIF}
+
+{$IFDEF IMPLEMENTATION_USES}
+
+  {$DEFINE IMPLEMENTATION_USES}
+  {$I 'GenericList.inc'}
+
+{$UNDEF IMPLEMENTATION_USES}
+{$ENDIF}
+
+{$IFDEF IMPLEMENTATION}
+
+{$DEFINE TGListIndex := TGListStringIndex}
+{$DEFINE TGListItem := TGListStringItem}
+{$DEFINE TGList := TGListStringList}
+{$DEFINE IMPLEMENTATION}
+{$I 'GenericList.inc'}
+
+{ TGListString }
+
+procedure TGListString.Assign(Source: TGList);
+begin
+  Clear;
+  inherited;
+end;
+
+procedure TGListString.Delete(Index: TGListStringIndex);
+begin
+  FItems[Index] := '';
+  inherited Delete(Index);
+end;
+
+procedure TGListString.Clear;
+var
+  I: TGListStringIndex;
+begin
+  I := 0;
+  while I < Count do begin
+    FItems[I] := '';
+    I := I + 1;
+  end;
+  inherited Clear;
+end;
+
+function TGListString.IndexOf(Item: TGListItem; Start: TGListIndex): TGListIndex;
+begin
+  Result := Start;
+  while (Result < Count) and
+  (CompareStr(FItems[Result], Item) <> 0) do
+    Result := Result + 1;
+  if Result = FCount then Result := -1;
+end;
+
+constructor TGListString.Create;
+begin
+  inherited;
+end;
+
+destructor TGListString.Destroy;
+begin
+  Clear;
+  inherited Destroy;
+end;
+
+{$UNDEF IMPLEMENTATION}
+{$ENDIF}
Index: /tags/1.1.0/Packages/TemplateGenerics/Generic/GenericMatrix.inc
===================================================================
--- /tags/1.1.0/Packages/TemplateGenerics/Generic/GenericMatrix.inc	(revision 137)
+++ /tags/1.1.0/Packages/TemplateGenerics/Generic/GenericMatrix.inc	(revision 137)
@@ -0,0 +1,623 @@
+// Work in progress...
+
+{$IFDEF INTERFACE}
+
+  // TGMatrix<TGMatrixIndex, TGMatrixIndex, TGMatrixItem> = class
+  TGMatrix = class
+  public
+    type
+      TSortCompare = function(const Item1, Item2: TGMatrixItem): Integer of object;
+      TToStringConverter = function(Item: TGMatrixItem): string;
+      TFromStringConverter = function(Text: string): TGMatrixItem;
+      TRow = array of TGMatrixItem;
+      TMerge = function(Item1, Item2: TGMatrixItem): TGMatrixItem of object;
+
+      TIndex = record
+        X: TGMatrixIndexX;
+        Y: TGMatrixIndexY;
+      end;
+  private
+    FItems: array of array of TGMatrixItem;
+    FCount: TIndex;
+    function GetItemXY(X: TGMatrixIndexX; Y: TGMatrixIndexY): TGMatrixItem;
+    function GetItem(Index: TIndex): TGMatrixItem;
+    function GetCapacity: TIndex;
+    function GetLast: TGMatrixItem;
+    function GetFirst: TGMatrixItem;
+    procedure SetCapacity(const AValue: TIndex);
+    procedure SetLast(AValue: TGMatrixItem);
+    procedure SetFirst(AValue: TGMatrixItem);
+    procedure PutItemXY(X: TGMatrixIndexX; Y: TGMatrixIndexY; const AValue: TGMatrixItem); virtual;
+    procedure PutItem(Index: TIndex; const AValue: TGMatrixItem); virtual;
+    procedure SetCount(const AValue: TIndex);
+  public
+    function Add(Item: TGMatrixItem): TIndex;
+    procedure AddMatrix(Values: array of TRow);
+    procedure AddList(List: TGMatrix);
+    procedure Assign(Source: TGMatrix);
+    procedure Clear; virtual;
+    procedure Contract;
+    function CreateIndex(X: TGMatrixIndexY; Y: TGMatrixIndexX): TIndex;
+    procedure Delete(Index: TIndex); virtual;
+    procedure DeleteItems(Index, Count: TIndex);
+    function EqualTo(List: TGMatrix): Boolean;
+    procedure Expand;
+    function Extract(Item: TGMatrixItem): TGMatrixItem;
+    procedure Exchange(Index1, Index2: TIndex);
+    property First: TGMatrixItem read GetFirst write SetFirst;
+    procedure FillAll(Value: TGMatrixItem);
+    procedure Fill(Start, Count: TIndex; Value: TGMatrixItem);
+    function Implode(RowSeparator, ColSeparator: string; Converter: TToStringConverter): string;
+    procedure Explode(Text, Separator: string; Converter: TFromStringConverter; SlicesCount: Integer = -1);
+    function IndexOf(Item: TGMatrixItem; Start: TIndex): TIndex;
+    function IndexOfList(List: TGMatrix; Start: TIndex): TIndex;
+    procedure Insert(Index: TIndex; Item: TGMatrixItem);
+    procedure InsertList(Index: TIndex; List: TGMatrix);
+    procedure InsertArray(Index: TIndex; Values: array of TGMatrixItem);
+    procedure Move(CurIndex, NewIndex: TIndex);
+    procedure MoveItems(CurIndex, NewIndex, Count: TIndex);
+    procedure Merge(Index: TIndex; Source: TGMatrix; Proc: TMerge);
+    procedure Replace(Index: TIndex; Source: TGMatrix);
+    function Remove(Item: TGMatrixItem): TIndex;
+    procedure Reverse;
+    procedure ReverseHorizontal;
+    procedure ReverseVertical;
+    procedure Sort(Compare: TSortCompare);
+    procedure SetArray(Values: array of TGMatrixItem);
+    property Count: TIndex read FCount write SetCount;
+    property Capacity: TIndex read GetCapacity write SetCapacity;
+    property ItemsXY[X: TGMatrixIndexX; Y: TGMatrixIndexY]: TGMatrixItem
+      read GetItemXY write PutItemXY; default;
+    property Items[Index: TIndex]: TGMatrixItem
+      read GetItem write PutItem;
+    property Last: TGMatrixItem read GetLast write SetLast;
+  end;
+
+{$UNDEF INTERFACE}
+{$ENDIF}
+
+{$IFDEF IMPLEMENTATION_USES}
+
+uses
+  RtlConsts;
+
+resourcestring
+  SMatrixIndexError = 'Matrix index error [X: %d, Y: %d]';
+
+{$UNDEF IMPLEMENTATION_USES}
+{$ENDIF}
+
+{$IFDEF IMPLEMENTATION}
+
+{ TGMatrix }
+
+procedure TGMatrix.Replace(Index: TIndex; Source: TGMatrix);
+var
+  X: TGMatrixIndexX;
+  Y: TGMatrixIndexY;
+begin
+  Y := 0;
+  while Y < Source.Count.Y do begin
+    X := 0;
+    while X < Source.Count.X do begin
+      ItemsXY[Index.X + X, Index.Y + Y] := Source.ItemsXY[X, Y];
+      X := X + 1;
+    end;
+    Y := Y + 1;
+  end;
+end;
+
+procedure TGMatrix.Merge(Index: TIndex; Source: TGMatrix; Proc: TMerge);
+var
+  X: TGMatrixIndexX;
+  Y: TGMatrixIndexY;
+begin
+  Y := 0;
+  while Y < Source.Count.Y do begin
+    X := 0;
+    while X < Source.Count.X do begin
+      ItemsXY[Index.X + X, Index.Y + Y] := Proc(ItemsXY[Index.X + X, Index.Y + Y], Source.ItemsXY[X, Y]);
+      X := X + 1;
+    end;
+    Y := Y + 1;
+  end;
+end;
+
+function TGMatrix.CreateIndex(X: TGMatrixIndexY; Y: TGMatrixIndexX): TIndex;
+begin
+  Result.X := X;
+  Result.Y := Y;
+end;
+
+function TGMatrix.GetCapacity: TIndex;
+begin
+  Result.Y := Length(FItems);
+  if Result.Y > 0 then Result.X := Length(FItems[0]) else Result.X := 0;
+end;
+
+procedure TGMatrix.SetCapacity(const AValue: TIndex);
+var
+  Y: TGMatrixIndexY;
+begin
+  if (Capacity.X <> AValue.X) and (Capacity.Y <> AValue.Y) then begin
+(*    SetLength(FItems, AValue.Y);
+    Y := 0;
+    while Y < Length(FItems) do begin
+      SetLength(FItems[Y], AValue.X);
+      Y := Y + 1;
+    end;
+  end;
+  *)
+    SetLength(FItems, AValue.Y, AValue.X);
+  end;
+end;
+
+function TGMatrix.GetItemXY(X: TGMatrixIndexX; Y: TGMatrixIndexY): TGMatrixItem;
+begin
+  if (X < 0) or (X >= Count.X) or
+    (Y < 0) or (Y >= Count.Y) then
+    raise EListError.CreateFmt(SMatrixIndexError, [X, Y]);
+  Result := FItems[Y, X];
+end;
+
+function TGMatrix.GetItem(Index: TIndex): TGMatrixItem;
+begin
+  if (Index.X < 0) or (Index.X >= Count.X) or
+    (Index.Y < 0) or (Index.Y >= Count.Y) then
+    raise EListError.CreateFmt(SMatrixIndexError, [Index.X, Index.Y]);
+  Result := FItems[Index.Y, Index.X];
+end;
+
+procedure TGMatrix.PutItemXY(X: TGMatrixIndexX; Y: TGMatrixIndexY; const AValue: TGMatrixItem);
+begin
+  if (X < 0) or (X >= Count.X) or
+    (Y < 0) or (Y >= Count.Y) then
+    raise EListError.CreateFmt(SMatrixIndexError, [X, Y]);
+  FItems[Y, X] := AValue;
+end;
+
+procedure TGMatrix.PutItem(Index: TIndex; const AValue: TGMatrixItem);
+begin
+  if (Index.X < 0) or (Index.X >= Count.X) or
+    (Index.Y < 0) or (Index.Y >= Count.Y) then
+    raise EListError.CreateFmt(SMatrixIndexError, [Index.X, Index.Y]);
+  FItems[Index.Y, Index.X] := AValue;
+end;
+
+procedure TGMatrix.SetCount(const AValue: TIndex);
+begin
+  Capacity := AValue;
+  FCount := AValue;
+end;
+
+procedure TGMatrix.Assign(Source: TGMatrix);
+var
+  Index: TIndex;
+begin
+  Count := Source.Count;
+  Index.Y := 0;
+  while Index.Y < Count.Y do begin
+    Index.X := 0;
+    while Index.X < Count.X do begin
+      Items[Index] := Source.Items[Index];
+      Index.X := Index.X + 1;
+    end;
+    Index.Y := Index.Y + 1;
+  end;
+end;
+
+procedure TGMatrix.Expand;
+var
+  IncSize: TIndex;
+  NewCapacity: TIndex;
+begin
+  if (FCount.X = Capacity.X) then begin
+    IncSize.X := 4;
+    if Capacity.X > 3 then IncSize.X := IncSize.X + 4;
+    if Capacity.X > 8 then IncSize.X := IncSize.X + 8;
+    if Capacity.X > 63 then IncSize.X := IncSize.X + Capacity.X shr 2;
+    NewCapacity.X := Capacity.X + IncSize.X;
+  end;
+  if (FCount.Y = Capacity.Y) then begin
+    IncSize.Y := 4;
+    if Capacity.Y > 3 then IncSize.Y := IncSize.Y + 4;
+    if Capacity.Y > 8 then IncSize.Y := IncSize.Y + 8;
+    if Capacity.Y > 63 then IncSize.Y := IncSize.Y + Capacity.Y shr 2;
+    NewCapacity.Y := Capacity.Y + IncSize.Y;
+  end;
+  Capacity := NewCapacity;
+end;
+
+procedure TGMatrix.Contract;
+var
+  NewCapacity: TIndex;
+begin
+  if (Capacity.X > 256) and (FCount.X < Capacity.X shr 2) then
+  begin
+    NewCapacity.X := Capacity.X shr 1;
+  end;
+  if (Capacity.Y > 256) and (FCount.Y < Capacity.Y shr 2) then
+  begin
+    NewCapacity.Y := Capacity.Y shr 1;
+  end;
+  Capacity := NewCapacity;
+end;
+
+function TGMatrix.Extract(Item: TGMatrixItem): TGMatrixItem;
+var
+  I: TIndex;
+begin
+(*  I := IndexOf(Item);
+  if I >= 0 then begin
+    Result := Item;
+    Delete(I);
+  end else
+    raise EListError.CreateFmt(SListIndexError, [0]);
+    *)
+end;
+
+function TGMatrix.IndexOf(Item: TGMatrixItem; Start: TIndex): TIndex;
+begin
+(*  Result := Start;
+  while (Result < FCount) and
+  not CompareMem(Addr(FItems[Result]), Addr(Item), SizeOf(TGMatrixItem)) do
+    Result := Result + 1;
+  if Result = FCount then Result := -1;
+  *)
+end;
+
+procedure TGMatrix.Insert(Index: TIndex; Item: TGMatrixItem);
+begin
+(*  if (Index < 0) or (Index > FCount ) then
+    raise EListError.CreateFmt(SListIndexError, [Index]);
+  if FCount = Capacity then Expand;
+  if Index < FCount then
+    System.Move(FItems[Index], FItems[Index + 1], (FCount - Index) * SizeOf(TGMatrixItem));
+  FItems[Index] := Item;
+  FCount := FCount + 1;
+  *)
+end;
+
+procedure TGMatrix.InsertList(Index: TIndex; List: TGMatrix);
+var
+  I: TIndex;
+begin
+(*  I := 0;
+  while (I < List.Count) do begin
+    Insert(Index + I, List[I]);
+    I := I + 1;
+  end;
+  *)
+end;
+
+function TGMatrix.IndexOfList(List: TGMatrix; Start: TIndex): TIndex;
+var
+  I: TIndex;
+begin
+(*  if List.Count > 0 then begin
+    Result := IndexOf(List[0], Start);
+    if Result <> -1 then begin
+      I := 1;
+      while I < List.Count do begin
+        if not CompareMem(Addr(FItems[Result + I]), Addr(List.FItems[I]), SizeOf(TGMatrixItem)) then begin
+          Result := -1;
+          Break;
+        end;
+        I := I + 1;
+      end;
+    end;
+  end else Result := -1;
+  *)
+end;
+
+function TGMatrix.GetLast: TGMatrixItem;
+begin
+(*  if FCount = 0 then
+    raise EListError.CreateFmt(SListIndexError, [0])
+  else
+    Result := Items[FCount - 1];
+    *)
+end;
+
+procedure TGMatrix.SetLast(AValue: TGMatrixItem);
+begin
+(*  if FCount = 0 then
+    raise EListError.CreateFmt(SListIndexError, [0])
+  else
+    Items[FCount - 1] := AValue;
+    *)
+end;
+
+function TGMatrix.GetFirst: TGMatrixItem;
+begin
+(*  if FCount = 0 then
+    raise EListError.CreateFmt(SListIndexError, [0])
+  else
+    Result := Items[0];
+    *)
+end;
+
+procedure TGMatrix.SetFirst(AValue: TGMatrixItem);
+begin
+(*  if FCount = 0 then
+    raise EListError.CreateFmt(SListIndexError, [0])
+  else
+    Items[0] := AValue;
+    *)
+end;
+
+procedure TGMatrix.Move(CurIndex, NewIndex: TIndex);
+var
+  Temp: TGMatrixItem;
+begin
+(*  if ((CurIndex < 0) or (CurIndex > Count - 1)) then
+    raise EListError.CreateFmt(SListIndexError, [CurIndex]);
+  if ((NewIndex < 0) or (NewIndex > Count -1)) then
+    raise EListError.CreateFmt(SlistIndexError, [NewIndex]);
+  Temp := FItems[CurIndex];
+  if NewIndex > CurIndex then begin
+    System.Move(FItems[CurIndex + 1], FItems[CurIndex], (NewIndex - CurIndex) * SizeOf(TGMatrixItem));
+  end else
+  if NewIndex < CurIndex then begin
+    System.Move(FItems[NewIndex], FItems[NewIndex + 1], (CurIndex - NewIndex) * SizeOf(TGMatrixItem));
+  end;
+  FItems[NewIndex] := Temp;
+  //Delete(CurIndex);
+  //Insert(NewIndex, Temp);*)
+end;
+
+procedure TGMatrix.MoveItems(CurIndex, NewIndex, Count: TIndex);
+var
+  S: Integer;
+  D: Integer;
+begin
+(*  if CurIndex < NewIndex then begin
+    S := CurIndex + Count - 1;
+    D := NewIndex + Count - 1;
+    while S >= CurIndex do begin
+      Move(S, D);
+      S := S - 1;
+      D := D - 1;
+    end;
+  end else
+  if CurIndex > NewIndex then begin
+    S := CurIndex;
+    D := NewIndex;
+    while S < (CurIndex + Count) do begin
+      Move(S, D);
+      S := S + 1;
+      D := D + 1;
+    end;
+  end;*)
+end;
+
+function TGMatrix.Remove(Item: TGMatrixItem): TIndex;
+begin
+(*  Result := IndexOf(Item);
+  if Result <> -1 then
+    Delete(Result); *)
+end;
+
+function TGMatrix.EqualTo(List: TGMatrix): Boolean;
+var
+  I: TIndex;
+begin
+(*  Result := Count = List.Count;
+  if Result then begin
+    I := 0;
+    while I < Count do begin
+      if not CompareMem(Addr(FItems[I]), Addr(List.FItems[I]), SizeOf(TGMatrixItem)) then begin
+        Result := False;
+        Break;
+      end;
+      I := I + 1;
+    end;
+  end; *)
+end;
+
+procedure TGMatrix.Reverse;
+var
+  X: TGMatrixIndexX;
+  Y: TGMatrixIndexY;
+begin
+  Y := 0;
+  while Y < (Count.Y - 1) do begin
+    X := 1 + Y;
+    while X < Count.X do begin
+      Exchange(CreateIndex(X, Y), CreateIndex(Y, X));
+      X := X + 1;
+    end;
+    Y := Y + 1;
+  end;
+end;
+
+procedure TGMatrix.ReverseHorizontal;
+var
+  X: TGMatrixIndexX;
+  Y: TGMatrixIndexY;
+begin
+  Y := 0;
+  while Y < Count.Y do begin
+    X := 0;
+    while X < (Count.X div 2) do begin
+      Exchange(CreateIndex(X, Y), CreateIndex(Count.X - 1 - X, Y));
+      X := X + 1;
+    end;
+    Y := Y + 1;
+  end;
+end;
+
+procedure TGMatrix.ReverseVertical;
+var
+  X: TGMatrixIndexX;
+  Y: TGMatrixIndexY;
+begin
+  X := 0;
+  while X < Count.X do begin
+    Y := 0;
+    while Y < (Count.Y div 2) do begin
+      Exchange(CreateIndex(X, Y), CreateIndex(X, Count.Y - 1 - Y));
+      Y := Y + 1;
+    end;
+    X := X + 1;
+  end;
+end;
+
+procedure TGMatrix.Sort(Compare: TSortCompare);
+begin
+(*  if FCount > 1 then
+    QuickSort(0, FCount - 1, Compare); *)
+end;
+
+procedure TGMatrix.AddMatrix(Values: array of TRow);
+var
+  I: TIndex;
+begin
+(*  I := 0;
+  while I <= High(Values) do begin
+    Add(Values[I]);
+    I := I + 1;
+  end; *)
+end;
+
+procedure TGMatrix.SetArray(Values: array of TGMatrixItem);
+var
+  I: TIndex;
+begin
+(*  Clear;
+  I := 0;
+  while I <= High(Values) do begin
+    Add(Values[I]);
+    I := I + 1;
+  end; *)
+end;
+
+procedure TGMatrix.InsertArray(Index: TIndex; Values: array of TGMatrixItem);
+var
+  I: TIndex;
+begin
+(*  I := 0;
+  while I <= High(Values) do begin
+    Insert(Index + I, Values[I]);
+    I := I + 1;
+  end; *)
+end;
+
+function TGMatrix.Implode(RowSeparator, ColSeparator: string; Converter: TToStringConverter): string;
+var
+  Y: TGMatrixIndexY;
+  X: TGMatrixIndexX;
+begin
+  Result := '';
+  Y := 0;
+  while Y < Count.Y do begin
+    X := 0;
+    while X < Count.X do begin
+      Result := Result + Converter(ItemsXY[X, Y]);
+      if X < (Count.X - 1) then
+        Result := Result + ColSeparator;
+      X := X + 1;
+    end;
+    if Y < (Count.Y - 1) then
+      Result := Result + RowSeparator;
+    Y := Y + 1;
+  end;
+end;
+
+procedure TGMatrix.Explode(Text, Separator: string; Converter: TFromStringConverter; SlicesCount: Integer = -1);
+begin
+(*  Clear;
+  while (Pos(Separator, Text) > 0) and
+  ((Count < (SlicesCount - 1)) or (SlicesCount = -1)) do begin
+    Add(Converter(Copy(Text, 1, Pos(Separator, Text) - 1)));
+    System.Delete(Text, 1, Pos(Separator, Text) + Length(Separator) - 1);
+  end;
+  Add(Converter(Text)); *)
+end;
+
+function TGMatrix.Add(Item: TGMatrixItem): TIndex;
+begin
+(*  if FCount = Capacity then
+    Self.Expand;
+  FItems[FCount] := Item;
+  Result := FCount;
+  FCount := FCount + 1; *)
+end;
+
+procedure TGMatrix.AddList(List: TGMatrix);
+var
+  I: TIndex;
+begin
+(*  I := 0;
+  while I < List.Count do begin
+    Add(List[I]);
+    I := I + 1;
+  end; *)
+end;
+
+procedure TGMatrix.Clear;
+begin
+  Count := CreateIndex(0, 0);
+  Capacity := CreateIndex(0, 0);
+end;
+
+procedure TGMatrix.Delete(Index: TIndex);
+begin
+(*  if (Index < 0) or (Index >= FCount) then
+    raise EListError.CreateFmt(SListIndexError, [Index]);
+  FCount := FCount - 1;
+  System.Move(FItems[Index + 1], FItems[Index], (FCount - Index) * SizeOf(TGMatrixItem));
+  Contract;
+  *)
+end;
+
+procedure TGMatrix.DeleteItems(Index, Count: TIndex);
+var
+  I: TIndex;
+begin
+(*  I := Index;
+  while I < (Index + Count) do begin
+    Delete(Index);
+    I := I + 1;
+  end;
+  *)
+end;
+
+procedure TGMatrix.Fill(Start, Count: TIndex; Value: TGMatrixItem);
+var
+  X: TGMatrixIndexX;
+  Y: TGMatrixIndexY;
+begin
+  Y := Start.Y;
+  while Y < Count.Y do begin
+    X := Start.X;
+    while X < Count.X do begin
+      ItemsXY[X, Y] := Value;
+      X := X + 1;
+    end;
+    Y := Y + 1;
+  end;
+end;
+
+procedure TGMatrix.FillAll(Value: TGMatrixItem);
+begin
+  Fill(CreateIndex(0, 0), CreateIndex(Count.X - 1, Count.Y - 1), Value);
+end;
+
+procedure TGMatrix.Exchange(Index1, Index2: TIndex);
+var
+  Temp: TGMatrixItem;
+begin
+  if (Index1.X < 0) or (Index1.X >= Count.X) or
+    (Index1.Y < 0) or (Index1.Y >= Count.Y) then
+    raise EListError.CreateFmt(SMatrixIndexError, [Index1.X, Index1.Y]);
+  if (Index2.X < 0) or (Index2.X >= Count.X) or
+    (Index2.Y < 0) or (Index2.Y >= Count.Y) then
+    raise EListError.CreateFmt(SMatrixIndexError, [Index2.X, Index2.Y]);
+  Temp := FItems[Index1.Y, Index1.X];
+  FItems[Index1.Y, Index1.X] := FItems[Index2.Y, Index2.X];
+  FItems[Index2.Y, Index2.X] := Temp;
+end;
+
+{$UNDEF IMPLEMENTATION}
+{$ENDIF}
Index: /tags/1.1.0/Packages/TemplateGenerics/Generic/GenericPoint.inc
===================================================================
--- /tags/1.1.0/Packages/TemplateGenerics/Generic/GenericPoint.inc	(revision 137)
+++ /tags/1.1.0/Packages/TemplateGenerics/Generic/GenericPoint.inc	(revision 137)
@@ -0,0 +1,23 @@
+{$IFDEF INTERFACE}
+
+// TGPoint<TPointType> = class
+TGPoint = class
+  X: TGPointType;
+  Y: TGPointType;
+  procedure Add(Point: TGPoint);
+end;
+
+{$UNDEF INTERFACE}
+{$ENDIF}
+
+{$IFDEF IMPLEMENTATION}
+
+procedure TGPoint.Add(Point: TGPoint);
+begin
+  X := X + Point.X;
+  Y := Y + Point.Y;
+end;
+
+{$UNDEF IMPLEMENTATION}
+{$ENDIF}
+
Index: /tags/1.1.0/Packages/TemplateGenerics/Generic/GenericQueue.inc
===================================================================
--- /tags/1.1.0/Packages/TemplateGenerics/Generic/GenericQueue.inc	(revision 137)
+++ /tags/1.1.0/Packages/TemplateGenerics/Generic/GenericQueue.inc	(revision 137)
@@ -0,0 +1,89 @@
+{$IFDEF INTERFACE}
+
+{$DEFINE TGListIndex := TGQueueIndex}
+{$DEFINE TGListItem := TGQueueItem}
+{$DEFINE TGList := TGQueueList}
+{$DEFINE INTERFACE}
+{$I 'GenericList.inc'}
+
+  // TGQueue<TQueueIndex, TQueueItem> = class(TGList)
+  TGQueue = class
+  private
+    FList: TGList;
+    function GetCount: TGQueueIndex;
+  public
+    procedure Enqueue(Value: TGQueueItem);
+    procedure EnqueueArray(Values: array of TGQueueItem);
+    procedure EnqueueList(List: TGList);
+    function Dequeue: TGQueueItem;
+    function Peek: TGQueueItem;
+    constructor Create;
+    destructor Destroy; override;
+    property List: TGList read FList;
+    property Count: TGQueueIndex read GetCount;
+  end;
+
+{$UNDEF INTERFACE}
+{$ENDIF}
+
+{$IFDEF IMPLEMENTATION_USES}
+
+  {$DEFINE IMPLEMENTATION_USES}
+  {$I 'GenericList.inc'}
+
+{$UNDEF IMPLEMENTATION_USES}
+{$ENDIF}
+
+{$IFDEF IMPLEMENTATION}
+
+{$DEFINE TGListIndex := TGQueueIndex}
+{$DEFINE TGListItem := TGQueueItem}
+{$DEFINE TGList := TGQueueList}
+{$DEFINE IMPLEMENTATION}
+{$I 'GenericList.inc'}
+
+{ TGQueue }
+
+procedure TGQueue.Enqueue(Value: TGQueueItem);
+begin
+  FList.Add(Value);
+end;
+
+procedure TGQueue.EnqueueArray(Values: array of TGQueueItem);
+begin
+  FList.AddArray(Values);
+end;
+
+procedure TGQueue.EnqueueList(List: TGList);
+begin
+  FList.AddList(List);
+end;
+
+function TGQueue.Peek: TGQueueItem;
+begin
+  Result := FList.First;
+end;
+
+constructor TGQueue.Create;
+begin
+  FList := TGList.Create;
+end;
+
+destructor TGQueue.Destroy;
+begin
+  FList.Free;
+  inherited Destroy;
+end;
+
+function TGQueue.Dequeue: TGQueueItem;
+begin
+  Result := FList.Extract(FList.First);
+end;
+
+function TGQueue.GetCount: TGQueueIndex;
+begin
+  Result := FList.Count;
+end;
+
+{$UNDEF IMPLEMENTATION}
+{$ENDIF}
Index: /tags/1.1.0/Packages/TemplateGenerics/Generic/GenericRange.inc
===================================================================
--- /tags/1.1.0/Packages/TemplateGenerics/Generic/GenericRange.inc	(revision 137)
+++ /tags/1.1.0/Packages/TemplateGenerics/Generic/GenericRange.inc	(revision 137)
@@ -0,0 +1,44 @@
+{$IFDEF INTERFACE}
+
+  // TGRange<TRangeItem> = class
+  TGRange = class
+  private
+    procedure SetDistance(const AValue: TRangeItem);
+    function GetDistance: TRangeItem;
+  public
+    A: TRangeItem;
+    B: TRangeItem;
+    procedure SetRange(NewA, NewB: TRangeItem);
+    property Distance: TRangeItem read GetDistance write SetDistance;
+  end;
+
+{$UNDEF INTERFACE}
+{$ENDIF}
+
+{$IFDEF IMPLEMENTATION}
+
+{ TGRange }
+
+procedure TGRange.SetDistance(const AValue: TRangeItem);
+begin
+  B := A + AValue;
+end;
+
+function TGRange.GetDistance: TRangeItem;
+begin
+  Result := B - A;
+end;
+
+procedure TGRange.SetRange(NewA, NewB: TRangeItem);
+begin
+  if NewA > NewB then begin
+    A := NewB;
+    B := NewA;
+  end else begin
+    A := NewA;
+    B := NewB;
+  end;
+end;
+
+{$UNDEF IMPLEMENTATION}
+{$ENDIF}
Index: /tags/1.1.0/Packages/TemplateGenerics/Generic/GenericRectangle.inc
===================================================================
--- /tags/1.1.0/Packages/TemplateGenerics/Generic/GenericRectangle.inc	(revision 137)
+++ /tags/1.1.0/Packages/TemplateGenerics/Generic/GenericRectangle.inc	(revision 137)
@@ -0,0 +1,283 @@
+{$IFDEF INTERFACE}
+
+// TGRectangle<TGRectangleDimension> = class
+TGRectangle = class
+private
+  function GetBottomLeft: TGRectanglePoint;
+  function GetBottomRight: TGRectanglePoint;
+  function GetHeight: TGRectangleDimension;
+  function GetSize: TGRectanglePoint;
+  function GetTopLeft: TGRectanglePoint;
+  function GetTopRight: TGRectanglePoint;
+  function GetWidth: TGRectangleDimension;
+  function GetEmpty: Boolean;
+  procedure SetBottom(const AValue: TGRectangleDimension);
+  procedure SetBottomLeft(const AValue: TGRectanglePoint);
+  procedure SetBottomRight(const AValue: TGRectanglePoint);
+  procedure SetHeight(const AValue: TGRectangleDimension);
+  procedure SetLeft(const AValue: TGRectangleDimension);
+  procedure SetRight(const AValue: TGRectangleDimension);
+  procedure SetSize(const AValue: TGRectanglePoint);
+  procedure SetTop(const AValue: TGRectangleDimension);
+  procedure SetTopLeft(const AValue: TGRectanglePoint);
+  procedure SetTopRight(const AValue: TGRectanglePoint);
+  procedure SetWidth(const AValue: TGRectangleDimension);
+  procedure SetEmpty(const AValue: Boolean);
+public
+  FLeft: TGRectangleDimension;
+  FTop: TGRectangleDimension;
+  FRight: TGRectangleDimension;
+  FBottom: TGRectangleDimension;
+  KeepSize: Boolean;
+
+  procedure Assign(Source: TGRectangle);
+  function IsPointInside(Pos: TGRectanglePoint): Boolean;
+  function IsRectInside(Rect: TGRectangle): Boolean;
+  procedure Intersect(Rect1, Rect2: TGRectangle);
+  procedure IntersectWith(Rect: TGRectangle);
+  procedure Union(Rect1, Rect2: TGRectangle);
+  procedure UnionWith(Rect: TGRectangle);
+
+  procedure SetRect(Left, Top, Width, Height: TGRectangleDimension);
+  procedure SetBounds(Left, Top, Right, Bottom: TGRectangleDimension);
+
+  property Left: TGRectangleDimension read FLeft write SetLeft;
+  property Top: TGRectangleDimension read FTop write SetTop;
+  property Right: TGRectangleDimension read FRight write SetRight;
+  property Bottom: TGRectangleDimension read FBottom write SetBottom;
+
+  property Width: TGRectangleDimension read GetWidth write SetWidth;
+  property Height: TGRectangleDimension read GetHeight write SetHeight;
+
+  property TopLeft: TGRectanglePoint read GetTopLeft write SetTopLeft;
+  property TopRight: TGRectanglePoint read GetTopRight write SetTopRight;
+  property BottomLeft: TGRectanglePoint read GetBottomLeft write SetBottomLeft;
+  property BottomRight: TGRectanglePoint read GetBottomRight write SetBottomRight;
+
+  property Size: TGRectanglePoint read GetSize write SetSize;
+  property Empty: Boolean read GetEmpty write SetEmpty;
+end;
+
+
+{$UNDEF INTERFACE}
+{$ENDIF}
+
+{$IFDEF IMPLEMENTATION_USES}
+
+uses Math;
+
+{$UNDEF IMPLEMENTATION_USES}
+{$ENDIF}
+
+{$IFDEF IMPLEMENTATION}
+
+{ TGRectangle }
+
+function TGRectangle.GetBottomLeft: TGRectanglePoint;
+begin
+  Result.X := Left;
+  Result.Y := Bottom;
+end;
+
+function TGRectangle.GetBottomRight: TGRectanglePoint;
+begin
+  Result.X := Right;
+  Result.Y := Bottom;
+end;
+
+function TGRectangle.GetHeight: TGRectangleDimension;
+begin
+  Result := Bottom - Top;
+end;
+
+function TGRectangle.GetSize: TGRectanglePoint;
+begin
+  Result.X := Width;
+  Result.Y := Height;
+end;
+
+function TGRectangle.GetTopLeft: TGRectanglePoint;
+begin
+  Result.X := Left;
+  Result.Y := Top;
+end;
+
+function TGRectangle.GetTopRight: TGRectanglePoint;
+begin
+  Result.X := Right;
+  Result.Y := Top;
+end;
+
+function TGRectangle.GetWidth: TGRectangleDimension;
+begin
+  Result := Right - Left;
+end;
+
+procedure TGRectangle.SetBottom(const AValue: TGRectangleDimension);
+begin
+  if FBottom = AValue then exit;
+  if KeepSize then FTop := FTop + (AValue - FBottom);
+  FBottom := AValue;
+end;
+
+procedure TGRectangle.SetBottomLeft(const AValue: TGRectanglePoint);
+begin
+  Left := AValue.X;
+  Bottom := AValue.Y;
+end;
+
+procedure TGRectangle.SetBottomRight(const AValue: TGRectanglePoint);
+begin
+  Right := AValue.X;
+  Bottom := AValue.Y;
+end;
+
+procedure TGRectangle.SetHeight(const AValue: TGRectangleDimension);
+begin
+  Bottom := Top + AValue;
+end;
+
+procedure TGRectangle.SetLeft(const AValue: TGRectangleDimension);
+begin
+  if FLeft = AValue then Exit;
+  if KeepSize then FRight := FRight + (AValue - FLeft);
+  FLeft := AValue;
+end;
+
+procedure TGRectangle.SetRight(const AValue: TGRectangleDimension);
+begin
+  if FRight = AValue then Exit;
+  if KeepSize then FLeft := FLeft + (AValue - FRight);
+  FRight := AValue;
+end;
+
+procedure TGRectangle.SetSize(const AValue: TGRectanglePoint);
+begin
+  Width := AValue.X;
+  Height := AValue.Y;
+end;
+
+procedure TGRectangle.SetTop(const AValue: TGRectangleDimension);
+begin
+  if FTop = AValue then Exit;
+  if KeepSize then FBottom := FBottom + (AValue - FTop);
+  FTop := AValue;
+end;
+
+procedure TGRectangle.SetTopLeft(const AValue: TGRectanglePoint);
+begin
+  Left := AValue.X;
+  Top := AValue.Y;
+end;
+
+procedure TGRectangle.SetTopRight(const AValue: TGRectanglePoint);
+begin
+  Right := AValue.X;
+  Top := AValue.Y;
+end;
+
+procedure TGRectangle.SetWidth(const AValue: TGRectangleDimension);
+begin
+  Right := Left + AValue;
+end;
+
+procedure TGRectangle.Assign(Source: TGRectangle);
+begin
+  Left := Source.Left;
+  Top := Source.Top;
+  Right := Source.Right;
+  Bottom := Source.Bottom;
+  KeepSize := Source.KeepSize;
+end;
+
+function TGRectangle.IsPointInside(Pos: TGRectanglePoint): Boolean;
+begin
+  Result := (Pos.X >= Left) and (Pos.Y >= Top) and
+    (Pos.X <= Right) and (Pos.Y <= Bottom);
+end;
+
+function TGRectangle.IsRectInside(Rect: TGRectangle): Boolean;
+begin
+  Result := (Rect.Left >= Left) and (Rect.Top >= Top) and
+    (Rect.Right <= Right) and (Rect.Bottom <= Bottom);
+end;
+
+procedure TGRectangle.Intersect(Rect1, Rect2: TGRectangle);
+begin
+  if Rect1.Empty or Rect2.Empty then Empty := True
+  else begin
+    Left := Max(Rect1.Left, Rect2.Left);
+    Top := Max(Rect1.Top, Rect2.Top);
+    Right := Min(Rect1.Right, Rect2.Right);
+    Bottom := Min(Rect1.Bottom, Rect2.Bottom);
+  end;
+end;
+
+procedure TGRectangle.IntersectWith(Rect: TGRectangle);
+begin
+  if Empty or Rect.Empty then Empty := True
+  else begin
+    Left := Max(Left, Rect.Left);
+    Top := Max(Top, Rect.Top);
+    Right := Min(Right, Rect.Right);
+    Bottom := Min(Bottom, Rect.Bottom);
+  end;
+end;
+
+procedure TGRectangle.Union(Rect1, Rect2: TGRectangle);
+begin
+  if Rect1.Empty then Assign(Rect2)
+  else
+  if Rect2.Empty then Assign(Rect1)
+  else begin
+    Left := Min(Rect1.Left, Rect2.Left);
+    Top := Min(Rect1.Top, Rect2.Top);
+    Right := Max(Rect1.Right, Rect2.Right);
+    Bottom := Max(Rect1.Bottom, Rect2.Bottom);
+  end;
+end;
+
+procedure TGRectangle.UnionWith(Rect: TGRectangle);
+begin
+  if Empty then Assign(Rect)
+  else
+  if not Rect.Empty then begin
+    Left := Min(Left, Rect.Left);
+    Top := Min(Top, Rect.Top);
+    Right := Max(Right, Rect.Right);
+    Bottom := Max(Bottom, Rect.Bottom);
+  end;
+end;
+
+procedure TGRectangle.SetRect(Left, Top, Width, Height: TGRectangleDimension);
+begin
+  Self.Left := Left;
+  Self.Top := Top;
+  Self.Width := Width;
+  Self.Height := Height;
+end;
+
+procedure TGRectangle.SetBounds(Left, Top, Right, Bottom: TGRectangleDimension);
+begin
+  Self.Left := Left;
+  Self.Top := Top;
+  Self.Right := Right;
+  Self.Bottom := Bottom;
+end;
+
+function TGRectangle.GetEmpty: Boolean;
+begin
+  Result := (Bottom <= Top) or (Right <= Left);
+end;
+
+procedure TGRectangle.SetEmpty(const AValue: Boolean);
+begin
+  Top := 0;
+  Bottom := 0;
+  Left := 0;
+  Right := 0;
+end;
+
+{$UNDEF IMPLEMENTATION}
+{$ENDIF}
+
Index: /tags/1.1.0/Packages/TemplateGenerics/Generic/GenericSet.inc
===================================================================
--- /tags/1.1.0/Packages/TemplateGenerics/Generic/GenericSet.inc	(revision 137)
+++ /tags/1.1.0/Packages/TemplateGenerics/Generic/GenericSet.inc	(revision 137)
@@ -0,0 +1,58 @@
+{$IFDEF INTERFACE}
+
+{$DEFINE TGListIndex := TGSetIndex}
+{$DEFINE TGListItem := TGSetItem}
+{$DEFINE TGList := TGSetList}
+{$DEFINE INTERFACE}
+{$I 'GenericList.inc'}
+
+  // TGSet<TGSetIndex, TGSetItem> = class
+  TGSet = class
+  private
+    FList: TGList;
+  public
+    function IsIn(Item: TGSetItem): Boolean;
+    constructor Create;
+    destructor Destroy; override;
+    property List: TGList read FList;
+  end;
+
+{$UNDEF INTERFACE}
+{$ENDIF}
+
+{$IFDEF IMPLEMENTATION_USES}
+
+  {$DEFINE IMPLEMENTATION_USES}
+  {$I 'GenericList.inc'}
+
+{$UNDEF IMPLEMENTATION_USES}
+{$ENDIF}
+
+{$IFDEF IMPLEMENTATION}
+
+{$DEFINE TGListIndex := TGSetIndex}
+{$DEFINE TGListItem := TGSetItem}
+{$DEFINE TGList := TGSetList}
+{$DEFINE IMPLEMENTATION}
+{$I 'GenericList.inc'}
+
+{ TGSet }
+
+function TGSet.IsIn(Item: TGSetItem): Boolean;
+begin
+  Result := FList.IndexOf(Item) <> -1;
+end;
+
+constructor TGSet.Create;
+begin
+  FList := TGList.Create;
+end;
+
+destructor TGSet.Destroy;
+begin
+  FList.Free;
+  inherited Destroy;
+end;
+
+{$UNDEF IMPLEMENTATION}
+{$ENDIF}
Index: /tags/1.1.0/Packages/TemplateGenerics/Generic/GenericStack.inc
===================================================================
--- /tags/1.1.0/Packages/TemplateGenerics/Generic/GenericStack.inc	(revision 137)
+++ /tags/1.1.0/Packages/TemplateGenerics/Generic/GenericStack.inc	(revision 137)
@@ -0,0 +1,64 @@
+{$IFDEF INTERFACE}
+
+{$DEFINE TGListIndex := TGStackIndex}
+{$DEFINE TGListItem := TGStackItem}
+{$DEFINE TGList := TGStackList}
+{$DEFINE INTERFACE}
+{$I 'GenericList.inc'}
+
+  // TGStack<TStackIndex, TStackItem> = class(TGList)
+  TGStack = class
+  private
+    FList: TGList;
+  public
+    procedure Push(Value: TGStackItem);
+    function Pop: TGStackItem;
+    constructor Create;
+    destructor Destroy; override;
+    property List: TGList read FList;
+  end;
+
+{$UNDEF INTERFACE}
+{$ENDIF}
+
+{$IFDEF IMPLEMENTATION_USES}
+
+  {$DEFINE IMPLEMENTATION_USES}
+  {$I 'GenericList.inc'}
+
+{$UNDEF IMPLEMENTATION_USES}
+{$ENDIF}
+
+{$IFDEF IMPLEMENTATION}
+
+{$DEFINE TGListIndex := TGStackIndex}
+{$DEFINE TGListItem := TGStackItem}
+{$DEFINE TGList := TGStackList}
+{$DEFINE IMPLEMENTATION}
+{$I 'GenericList.inc'}
+
+{ TGStack }
+
+procedure TGStack.Push(Value: TGStackItem);
+begin
+  FList.Add(Value);
+end;
+
+function TGStack.Pop: TGStackItem;
+begin
+  Result := FList.Extract(FList.Last);
+end;
+
+constructor TGStack.Create;
+begin
+  FList := TGList.Create;
+end;
+
+destructor TGStack.Destroy;
+begin
+  FList.Free;
+  inherited Destroy;
+end;
+
+{$UNDEF IMPLEMENTATION}
+{$ENDIF}
Index: /tags/1.1.0/Packages/TemplateGenerics/Generic/GenericStream.inc
===================================================================
--- /tags/1.1.0/Packages/TemplateGenerics/Generic/GenericStream.inc	(revision 137)
+++ /tags/1.1.0/Packages/TemplateGenerics/Generic/GenericStream.inc	(revision 137)
@@ -0,0 +1,83 @@
+{$IFDEF INTERFACE}
+
+
+// TGStream<TGStreamIndex, TGStreamItem> = class
+TGStream = class
+public
+  type
+    TItemArray = array of TGStreamItem;
+private
+procedure SetSize(AValue: TGStreamIndex);
+  function GetSize: TGStreamIndex;
+  procedure SetPosition(AValue: TGStreamIndex);
+  function GetPosition: TGStreamIndex;
+public
+  procedure Assign(Source: TGStream); virtual;
+  procedure Write(Item: TGStreamItem); virtual; abstract;
+  procedure WriteArray(Item: array of TGStreamItem); virtual; abstract;
+  procedure WriteStream(Stream: TGStream; Count: TGStreamIndex); virtual; abstract;
+  function Read: TGStreamItem; virtual; abstract;
+  function ReadArray(Count: TGStreamIndex): TItemArray; virtual; abstract;
+  function ReadStream(Stream: TGStream; Count: TGStreamIndex): TGStreamIndex; virtual; abstract;
+  function Insert(Count: TGStreamIndex): TGStreamIndex; virtual; abstract;
+  function Remove(Count: TGStreamIndex): TGStreamIndex; virtual; abstract;
+  function Seek(Offset: TGStreamIndex; Origin: TSeekOrigin = soCurrent):
+    TGStreamIndex; virtual; abstract;
+  constructor Create; virtual;
+  property Position: TGStreamIndex read GetPosition write SetPosition;
+  property Size: TGStreamIndex read GetSize write SetSize;
+end;
+
+{$UNDEF INTERFACE}
+{$ENDIF}
+
+{$IFDEF IMPLEMENTATION}
+
+procedure TGStream.Assign(Source: TGStream);
+begin
+end;
+
+procedure TGStream.SetPosition(AValue: TGStreamIndex);
+begin
+  Seek(AValue, soBegin);
+end;
+
+function TGStream.GetPosition: TGStreamIndex;
+begin
+  Result := Seek(0, soCurrent);
+end;
+
+procedure TGStream.SetSize(AValue: TGStreamIndex);
+var
+  StreamSize: TGStreamIndex;
+  OldPosition: TGStreamIndex;
+begin
+  OldPosition := Seek(0, soCurrent);
+  StreamSize := Size;
+  if AValue > StreamSize then begin
+    Seek(StreamSize, soBegin);
+    Insert(AValue - StreamSize);
+  end else
+  if AValue < StreamSize then begin
+    Seek(AValue, soBegin);
+    Remove(StreamSize - AValue);
+  end;
+  Position := OldPosition;
+end;
+
+function TGStream.GetSize: TGStreamIndex;
+var
+  OldPosition: Integer;
+begin
+  OldPosition := Position;
+  Result := Seek(0, soEnd);
+  Position := OldPosition;
+end;
+
+constructor TGStream.Create;
+begin
+  inherited;
+end;
+
+{$UNDEF IMPLEMENTATION}
+{$ENDIF}
Index: /tags/1.1.0/Packages/TemplateGenerics/Generic/GenericTree.inc
===================================================================
--- /tags/1.1.0/Packages/TemplateGenerics/Generic/GenericTree.inc	(revision 137)
+++ /tags/1.1.0/Packages/TemplateGenerics/Generic/GenericTree.inc	(revision 137)
@@ -0,0 +1,60 @@
+{$IFDEF INTERFACE}
+
+  TGTreeNode = class;
+
+{$DEFINE TGListIndex := TGTreeIndex}
+{$DEFINE TGListItem := TGTreeNode}
+{$DEFINE TGList := TGTreeNodeList}
+{$DEFINE INTERFACE}
+{$I 'GenericList.inc'}
+
+  // TGTreeNode<TGTreeIndex, TGTreeItem> = class
+  TGTreeNode = class
+    Childs: TGTreeNodeList;
+    Value: TGTreeItem;
+    procedure Clear;
+  end;
+
+  // TGTree<TGTreeIndex, TGTreeItem> = class
+  TGTree = class
+    TopItem: TGTreeNode;
+    procedure Clear;
+  end;
+
+{$UNDEF INTERFACE}
+{$ENDIF}
+
+{$IFDEF IMPLEMENTATION_USES}
+
+  {$DEFINE IMPLEMENTATION_USES}
+  {$I 'GenericList.inc'}
+
+{$UNDEF INTERFACE_USES}
+{$ENDIF}
+
+
+{$IFDEF IMPLEMENTATION}
+{$UNDEF IMPLEMENTATION}
+
+{$DEFINE TGListIndex := TGTreeIndex}
+{$DEFINE TGListItem := TGTreeNode}
+{$DEFINE TGList := TGTreeNodeList}
+{$DEFINE IMPLEMENTATION}
+{$I 'GenericList.inc'}
+
+{ TGTreeNode }
+
+procedure TGTreeNode.Clear;
+begin
+  Childs.Clear;
+end;
+
+{ TGTree }
+
+procedure TGTree.Clear;
+begin
+  if Assigned(TopItem) then TopItem.Clear;
+end;
+
+{$UNDEF IMPLEMENTATION}
+{$ENDIF}
Index: /tags/1.1.0/Packages/TemplateGenerics/ReadMe.txt
===================================================================
--- /tags/1.1.0/Packages/TemplateGenerics/ReadMe.txt	(revision 137)
+++ /tags/1.1.0/Packages/TemplateGenerics/ReadMe.txt	(revision 137)
@@ -0,0 +1,14 @@
+Template generics
+=================
+
+Tutorial and basic information:
+  http://wiki.freepascal.org/Templates
+
+Version: 0.3
+Release date: 2011-01-01
+Author: Chronos
+Email: robie@centrum.cz
+
+
+Main subversion repository:
+http://svn.zdechov.net/svn/PascalClassLibrary/Generics/TemplateGenerics
Index: /tags/1.1.0/Packages/TemplateGenerics/Specialized/SpecializedBitmap.pas
===================================================================
--- /tags/1.1.0/Packages/TemplateGenerics/Specialized/SpecializedBitmap.pas	(revision 137)
+++ /tags/1.1.0/Packages/TemplateGenerics/Specialized/SpecializedBitmap.pas	(revision 137)
@@ -0,0 +1,80 @@
+  unit SpecializedBitmap;
+
+{$mode Delphi}{$H+}
+
+interface
+
+uses
+  Classes, SysUtils,
+  Graphics, FPImage;
+
+type
+  {$MACRO ON}
+
+// TBitmapTColor<Integer, Integer, TColor>
+{$DEFINE TGBitmapIndexX := Integer}
+{$DEFINE TGBitmapIndexY := Integer}
+{$DEFINE TGBitmapItem := TColor}
+{$DEFINE TGBitmapIndex := TBitmapTColorIndex}
+{$DEFINE TGBitmapRow := TBitmapTColorRow}
+{$DEFINE TGBitmapMatrix := TBitmapTColorMatrix}
+{$DEFINE TGBitmap := TBitmapTColor}
+{$DEFINE TGBitmapSortCompare := TBitmapTColorSortCompare}
+{$DEFINE TGBitmapToStringConverter := TBitmapTColorToStringConverter}
+{$DEFINE TGBitmapFromStringConverter := TBitmapTColorFromStringConverter}
+{$DEFINE TGBitmapMerge := TBitmapTColorMerge}
+{$DEFINE INTERFACE}
+{$I 'GenericBitmap.inc'}
+
+// TBitmapTFPColor<Integer, Integer, TFPColor>
+{$DEFINE TGBitmapIndexX := Integer}
+{$DEFINE TGBitmapIndexY := Integer}
+{$DEFINE TGBitmapItem := TFPColor}
+{$DEFINE TGBitmapIndex := TBitmapTFPColorIndex}
+{$DEFINE TGBitmapRow := TBitmapTFPColorRow}
+{$DEFINE TGBitmapMatrix := TBitmapTFPColorMatrix}
+{$DEFINE TGBitmap := TBitmapTFPColor}
+{$DEFINE TGBitmapSortCompare := TBitmapTFPColorSortCompare}
+{$DEFINE TGBitmapToStringConverter := TBitmapTFPColorToStringConverter}
+{$DEFINE TGBitmapFromStringConverter := TBitmapTFPColorFromStringConverter}
+{$DEFINE TGBitmapMerge := TBitmapTFPColorMerge}
+{$DEFINE INTERFACE}
+{$I 'GenericBitmap.inc'}
+
+implementation
+
+{$DEFINE IMPLEMENTATION_USES}
+{$I 'GenericBitmap.inc'}
+
+// TBitmapTColor<Integer, Integer, TColor>
+{$DEFINE TGBitmapIndexX := Integer}
+{$DEFINE TGBitmapIndexY := Integer}
+{$DEFINE TGBitmapItem := TColor}
+{$DEFINE TGBitmapIndex := TBitmapTColorIndex}
+{$DEFINE TGBitmapRow := TBitmapTColorRow}
+{$DEFINE TGBitmapMatrix := TBitmapTColorMatrix}
+{$DEFINE TGBitmap := TBitmapTColor}
+{$DEFINE TGBitmapSortCompare := TBitmapTColorSortCompare}
+{$DEFINE TGBitmapToStringConverter := TBitmapTColorToStringConverter}
+{$DEFINE TGBitmapFromStringConverter := TBitmapTColorFromStringConverter}
+{$DEFINE TGBitmapMerge := TBitmapTColorMerge}
+{$DEFINE IMPLEMENTATION}
+{$I 'GenericBitmap.inc'}
+
+// TBitmapTFPColor<Integer, Integer, TFPColor>
+{$DEFINE TGBitmapIndexX := Integer}
+{$DEFINE TGBitmapIndexY := Integer}
+{$DEFINE TGBitmapItem := TFPColor}
+{$DEFINE TGBitmapIndex := TBitmapTFPColorIndex}
+{$DEFINE TGBitmapRow := TBitmapTFPColorRow}
+{$DEFINE TGBitmapMatrix := TBitmapTFPColorMatrix}
+{$DEFINE TGBitmap := TBitmapTFPColor}
+{$DEFINE TGBitmapSortCompare := TBitmapTFPColorSortCompare}
+{$DEFINE TGBitmapToStringConverter := TBitmapTFPColorToStringConverter}
+{$DEFINE TGBitmapFromStringConverter := TBitmapTFPColorFromStringConverter}
+{$DEFINE TGBitmapMerge := TBitmapTFPColorMerge}
+{$DEFINE IMPLEMENTATION}
+{$I 'GenericBitmap.inc'}
+
+end.
+
Index: /tags/1.1.0/Packages/TemplateGenerics/Specialized/SpecializedDictionary.pas
===================================================================
--- /tags/1.1.0/Packages/TemplateGenerics/Specialized/SpecializedDictionary.pas	(revision 137)
+++ /tags/1.1.0/Packages/TemplateGenerics/Specialized/SpecializedDictionary.pas	(revision 137)
@@ -0,0 +1,61 @@
+unit SpecializedDictionary;
+
+{$mode delphi}
+
+interface
+
+uses
+  Classes, SysUtils;
+
+type
+{$MACRO ON}
+
+// TDictionaryStringString<Integer, TPair<string, string>>
+{$DEFINE TGDictionaryIndex := Integer}
+{$DEFINE TGPair := TPairStringString}
+{$DEFINE TGPairKey := string}
+{$DEFINE TGPairValue := string}
+{$DEFINE TGDictionary := TDictionaryStringString}
+{$DEFINE TGDictionaryList := TDictionaryStringStringList}
+{$DEFINE INTERFACE}
+{$I 'GenericDictionary.inc'}
+
+// TDictionaryIntegerString<Integer, TPair<Integer, string>>
+{$DEFINE TGDictionaryIndex := Integer}
+{$DEFINE TGPair := TPairIntegerString}
+{$DEFINE TGPairKey := Integer}
+{$DEFINE TGPairValue := string}
+{$DEFINE TGDictionary := TDictionaryIntegerString}
+{$DEFINE TGDictionaryList := TDictionaryIntegerStringList}
+{$DEFINE INTERFACE}
+{$I 'GenericDictionary.inc'}
+
+
+implementation
+
+{$DEFINE IMPLEMENTATION_USES}
+{$I '..\Generic\GenericDictionary.inc'}
+
+
+// TDictionaryStringString<Integer, TPair<string, string>>
+{$DEFINE TGDictionaryIndex := Integer}
+{$DEFINE TGPair := TPairStringString}
+{$DEFINE TGPairKey := string}
+{$DEFINE TGPairValue := string}
+{$DEFINE TGDictionary := TDictionaryStringString}
+{$DEFINE TGDictionaryList := TDictionaryStringStringList}
+{$DEFINE IMPLEMENTATION}
+{$I 'GenericDictionary.inc'}
+
+// TDictionaryIntegerString<Integer, TPair<Integer, string>>
+{$DEFINE TGDictionaryIndex := Integer}
+{$DEFINE TGPair := TPairIntegerString}
+{$DEFINE TGPairKey := Integer}
+{$DEFINE TGPairValue := string}
+{$DEFINE TGDictionary := TDictionaryIntegerString}
+{$DEFINE TGDictionaryList := TDictionaryIntegerStringList}
+{$DEFINE IMPLEMENTATION}
+{$I 'GenericDictionary.inc'}
+
+
+end.
Index: /tags/1.1.0/Packages/TemplateGenerics/Specialized/SpecializedList.pas
===================================================================
--- /tags/1.1.0/Packages/TemplateGenerics/Specialized/SpecializedList.pas	(revision 137)
+++ /tags/1.1.0/Packages/TemplateGenerics/Specialized/SpecializedList.pas	(revision 137)
@@ -0,0 +1,415 @@
+unit SpecializedList;
+
+{$mode delphi}
+
+interface
+
+uses
+  Classes, SysUtils;
+
+type
+{$MACRO ON}
+
+// TListInteger<Integer, Integer>
+{$DEFINE TGListIndex := Integer}
+{$DEFINE TGListItem := Integer}
+{$DEFINE TGList := TListInteger}
+{$DEFINE INTERFACE}
+{$I 'GenericList.inc'}
+
+// TListBoolean<Integer, Boolean>
+{$DEFINE TGListIndex := Integer}
+{$DEFINE TGListItem := Boolean}
+{$DEFINE TGList := TListBoolean}
+{$DEFINE INTERFACE}
+{$I 'GenericList.inc'}
+
+// TListSmallInt<Integer, SmallInt>
+{$DEFINE TGListIndex := Integer}
+{$DEFINE TGListItem := SmallInt}
+{$DEFINE TGList := TListSmallInt}
+{$DEFINE INTERFACE}
+{$I 'GenericList.inc'}
+
+// TListDouble<Integer, Double>
+{$DEFINE TGListIndex := Integer}
+{$DEFINE TGListItem := Double}
+{$DEFINE TGList := TListDouble}
+{$DEFINE INTERFACE}
+{$INCLUDE '..\Generic\GenericList.inc'}
+
+// TListPointer<Integer, Pointer>
+{$DEFINE TGListIndex := Integer}
+{$DEFINE TGListItem := Pointer}
+{$DEFINE TGList := TListPointer}
+{$DEFINE INTERFACE}
+{$I 'GenericList.inc'}
+
+// TListString<Integer, string>
+{$DEFINE TGListStringIndex := Integer}
+{$DEFINE TGListStringItem := string}
+{$DEFINE TGListString := TListString}
+{$DEFINE INTERFACE}
+{$I 'GenericListString.inc'}
+
+// TListByte<Integer, Byte>
+{$DEFINE TGListIndex := Integer}
+{$DEFINE TGListItem := Byte}
+{$DEFINE TGList := TListByteBase}
+{$DEFINE INTERFACE}
+{$I 'GenericList.inc'}
+
+TListByte = class(TListByteBase)
+  procedure WriteToStream(Stream: TStream);
+  procedure WriteToStreamPart(Stream: TStream; ItemIndex, ItemCount: TGListIndex);
+  procedure ReplaceStream(Stream: TStream);
+  procedure ReplaceStreamPart(Stream: TStream; ItemIndex, ItemCount: TGListIndex);
+  procedure AddStream(Stream: TStream);
+  procedure AddStreamPart(Stream: TStream; ItemCount: TGListIndex);
+end;
+
+// TListChar<Integer, Char>
+{$DEFINE TGListIndex := Integer}
+{$DEFINE TGListItem := Char}
+{$DEFINE TGList := TListCharBase}
+{$DEFINE INTERFACE}
+{$I 'GenericList.inc'}
+
+// TListObject<Integer, TObject>
+{$DEFINE TGListObjectIndex := Integer}
+{$DEFINE TGListObjectItem := TObject}
+{$DEFINE TGListObjectList := TListObjectList}
+{$DEFINE TGListObject := TListObject}
+{$DEFINE INTERFACE}
+{$I 'GenericListObject.inc'}
+
+
+{ TListChar }
+
+// TListByte<Integer, Char>
+TListChar = class(TListCharBase)
+  procedure UpperCase;
+  procedure LowerCase;
+  procedure Trim;
+  procedure TrimLeft;
+  procedure TrimRight;
+end;
+
+// TListMethodBase<Integer, TMethod>
+{$DEFINE TGListIndex := Integer}
+{$DEFINE TGListItem := TMethod}
+{$DEFINE TGList := TListMethodBase}
+{$DEFINE INTERFACE}
+{$I 'GenericList.inc'}
+
+// TListMethod<Integer, TMethod>
+TListMethod = class(TListMethodBase)
+  procedure CallAll;
+end;
+
+// TListNotifyEventBase<Integer, TNotifyEvent>
+{$DEFINE TGListIndex := Integer}
+{$DEFINE TGListItem := TNotifyEvent}
+{$DEFINE TGList := TListNotifyEventBase}
+{$DEFINE INTERFACE}
+{$I 'GenericList.inc'}
+
+// TListNotifyEvent<Integer, TNotifyEvent>
+TListNotifyEvent = class(TListNotifyEventBase)
+  procedure CallAll(Sender: TObject);
+end;
+
+
+TBaseEvent = procedure of object;
+
+// TListSimpleEventBase<Integer, TBaseEvent>
+{$DEFINE TGListIndex := Integer}
+{$DEFINE TGListItem := TBaseEvent}
+{$DEFINE TGList := TListSimpleEventBase}
+{$DEFINE INTERFACE}
+{$I 'GenericList.inc'}
+
+// TListSimpleEvent<Integer, TSimpleEvent>
+TListSimpleEvent = class(TListSimpleEventBase)
+  procedure CallAll;
+end;
+
+
+// TFileListByte<Integer, Byte>
+{$DEFINE TGFileListIndex := Integer}
+{$DEFINE TGFileListItem := Byte}
+{$DEFINE TGFileListList := TFileListListByte}
+{$DEFINE TGFileList := TFileListByte}
+{$DEFINE INTERFACE}
+{$I 'GenericFileList.inc'}
+
+function StrToStr(Value: string): string;
+
+
+
+
+
+implementation
+
+{$DEFINE IMPLEMENTATION_USES}
+{$I 'GenericList.inc'}
+
+// TListInteger<Integer, Integer>
+{$DEFINE TGListIndex := Integer}
+{$DEFINE TGListItem := Integer}
+{$DEFINE TGList := TListInteger}
+{$DEFINE IMPLEMENTATION}
+{$I 'GenericList.inc'}
+
+// TListSmallInt<Integer, SmallInt>
+{$DEFINE TGListIndex := Integer}
+{$DEFINE TGListItem := SmallInt}
+{$DEFINE TGList := TListSmallInt}
+{$DEFINE IMPLEMENTATION}
+{$I 'GenericList.inc'}
+
+// TListBoolean<Integer, Boolean>
+{$DEFINE TGListIndex := Integer}
+{$DEFINE TGListItem := Boolean}
+{$DEFINE TGList := TListBoolean}
+{$DEFINE IMPLEMENTATION}
+{$I 'GenericList.inc'}
+
+// TListDouble<Integer, Double>
+{$DEFINE TGListIndex := Integer}
+{$DEFINE TGListItem := Double}
+{$DEFINE TGList := TListDouble}
+{$DEFINE IMPLEMENTATION}
+{$I 'GenericList.inc'}
+
+// TListPointer<Integer, Pointer>
+{$DEFINE TGListIndex := Integer}
+{$DEFINE TGListItem := Pointer}
+{$DEFINE TGList := TListPointer}
+{$DEFINE IMPLEMENTATION}
+{$I 'GenericList.inc'}
+
+// TListString<Integer, string>
+{$DEFINE TGListStringIndex := Integer}
+{$DEFINE TGListStringItem := string}
+{$DEFINE TGListString := TListString}
+{$DEFINE IMPLEMENTATION}
+{$I 'GenericListString.inc'}
+
+// TListByte<Integer, Byte>
+{$DEFINE TGListIndex := Integer}
+{$DEFINE TGListItem := Byte}
+{$DEFINE TGList := TListByteBase}
+{$DEFINE IMPLEMENTATION}
+{$I 'GenericList.inc'}
+
+// TListByte<Integer, Char>
+{$DEFINE TGListIndex := Integer}
+{$DEFINE TGListItem := Char}
+{$DEFINE TGList := TListCharBase}
+{$DEFINE IMPLEMENTATION}
+{$I 'GenericList.inc'}
+
+// TListObject<Integer, TObject>
+{$DEFINE TGListObjectIndex := Integer}
+{$DEFINE TGListObjectItem := TObject}
+{$DEFINE TGListObjectList := TListObjectList}
+{$DEFINE TGListObject := TListObject}
+{$DEFINE IMPLEMENTATION}
+{$I 'GenericListObject.inc'}
+
+// TListMethod<Integer, TMethod>
+{$DEFINE TGListIndex := Integer}
+{$DEFINE TGListItem := TMethod}
+{$DEFINE TGList := TListMethodBase}
+{$DEFINE IMPLEMENTATION}
+{$I 'GenericList.inc'}
+
+// TListNotifyEventBase<Integer, TNotifyEvent>
+{$DEFINE TGListIndex := Integer}
+{$DEFINE TGListItem := TNotifyEvent}
+{$DEFINE TGList := TListNotifyEventBase}
+{$DEFINE IMPLEMENTATION}
+{$I 'GenericList.inc'}
+
+// TListSimpleEventBase<Integer, TBaseEvent>
+{$DEFINE TGListIndex := Integer}
+{$DEFINE TGListItem := TBaseEvent}
+{$DEFINE TGList := TListSimpleEventBase}
+{$DEFINE IMPLEMENTATION}
+{$I 'GenericList.inc'}
+
+// TFileListByte<Integer, Byte>
+{$DEFINE TGFileListIndex := Integer}
+{$DEFINE TGFileListItem := Byte}
+{$DEFINE TGFileListList := TFileListListByte}
+{$DEFINE TGFileList := TFileListByte}
+{$DEFINE IMPLEMENTATION}
+{$I 'GenericFileList.inc'}
+
+
+function StrToStr(Value: string): string;
+begin
+  Result := Value;
+end;
+
+{ TListSimpleEvent }
+
+procedure TListSimpleEvent.CallAll;
+var
+  I: TGListIndex;
+begin
+  I := 0;
+  while (I < Count) do begin
+    TBaseEvent(Items[I])();
+    I := I + 1;
+  end;
+end;
+
+
+{ TListChar }
+
+procedure TListChar.UpperCase;
+var
+  I: TGListIndex;
+begin
+  for I := 0 to Count - 1 do
+    if (FItems[I] in ['a'..'z']) then
+      FItems[I] := Char(Byte(FItems[I]) - 32);
+end;
+
+procedure TListChar.LowerCase;
+var
+  I: TGListIndex;
+begin
+  for I := 0 to Count - 1 do
+    if (FItems[I] in ['A'..'Z']) then
+      FItems[I] := Char(Byte(FItems[I]) + 32);
+end;
+
+procedure TListChar.Trim;
+begin
+  TrimLeft;
+  TrimRight;
+end;
+
+procedure TListChar.TrimLeft;
+var
+  I: TGListIndex;
+begin
+  I := 0;
+  while (I < Count) and (FItems[I] = ' ') do
+    I := I + 1;
+  if I < Count then
+    DeleteItems(0, I);
+end;
+
+procedure TListChar.TrimRight;
+var
+  I: TGListIndex;
+begin
+  I := Count - 1;
+  while (I >= 0) and (FItems[I] = ' ') do
+    I := I - 1;
+  if I >= 0 then
+    DeleteItems(I + 1, Count - I - 1);
+end;
+
+procedure TListMethod.CallAll;
+var
+  I: TGListIndex;
+begin
+  I := 0;
+  while (I < Count) do begin
+    Items[I];
+    I := I + 1;
+  end;
+end;
+
+procedure TListNotifyEvent.CallAll(Sender: TObject);
+var
+  I: TGListIndex;
+begin
+  I := Count - 1;
+  while (I >= 0) do begin
+    TNotifyEvent(Items[I])(Sender);
+    I := I - 1;
+  end;
+end;
+
+{ TListByte }
+
+procedure TListByte.WriteToStream(Stream: TStream);
+var
+  I: Integer;
+begin
+  Stream.Position := 0;
+  I := 0;
+  while I < Count do begin
+    Stream.WriteByte(Items[I]);
+    I := I + 1;
+  end;
+end;
+
+procedure TListByte.WriteToStreamPart(Stream: TStream; ItemIndex, ItemCount: Integer);
+var
+  I: Integer;
+begin
+  I := ItemIndex;
+  while I < ItemCount do begin
+    Stream.WriteByte(Items[I]);
+    I := I + 1;
+  end;
+end;
+
+procedure TListByte.ReplaceStream(Stream: TStream);
+var
+  I: Integer;
+begin
+  Stream.Position := 0;
+  I := 0;
+  while I < Count do begin
+    Items[I] := Stream.ReadByte;
+    I := I + 1;
+  end;
+end;
+
+procedure TListByte.ReplaceStreamPart(Stream: TStream; ItemIndex,
+  ItemCount: Integer);
+var
+  I: Integer;
+begin
+  I := ItemIndex;
+  while I < ItemCount do begin
+    Items[I] := Stream.ReadByte;
+    I := I + 1;
+  end;
+end;
+
+procedure TListByte.AddStream(Stream: TStream);
+var
+  I: Integer;
+begin
+  Stream.Position := 0;
+  I := Count;
+  Count := Count + Stream.Size;
+  while I < Count do begin
+    Items[I] := Stream.ReadByte;
+    I := I + 1;
+  end;
+end;
+
+procedure TListByte.AddStreamPart(Stream: TStream; ItemCount: Integer);
+var
+  I: Integer;
+begin
+  I := Count;
+  Count := Count + ItemCount;
+  while I < Count do begin
+    Items[I] := Stream.ReadByte;
+    I := I + 1;
+  end;
+end;
+
+
+end.
Index: /tags/1.1.0/Packages/TemplateGenerics/Specialized/SpecializedMatrix.pas
===================================================================
--- /tags/1.1.0/Packages/TemplateGenerics/Specialized/SpecializedMatrix.pas	(revision 137)
+++ /tags/1.1.0/Packages/TemplateGenerics/Specialized/SpecializedMatrix.pas	(revision 137)
@@ -0,0 +1,79 @@
+unit SpecializedMatrix;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+  Classes, SysUtils; 
+
+type
+  {$MACRO ON}
+
+// TMatrixInteger<Integer, Integer, Integer>
+{$DEFINE TGMatrixIndexX := Integer}
+{$DEFINE TGMatrixIndexY := Integer}
+{$DEFINE TGMatrixItem := Integer}
+{$DEFINE TGMatrixIndex := TMatrixIntegerIndex}
+{$DEFINE TGMatrixRow := TMatrixIntegerRow}
+{$DEFINE TGMatrix := TMatrixInteger}
+{$DEFINE INTERFACE}
+{$I 'GenericMatrix.inc'}
+
+// TMatrixByte<Integer, Integer, Byte>
+{$DEFINE TGMatrixIndexX := Integer}
+{$DEFINE TGMatrixIndexY := Integer}
+{$DEFINE TGMatrixItem := Byte}
+{$DEFINE TGMatrixIndex := TMatrixByteIndex}
+{$DEFINE TGMatrixRow := TMatrixByteRow}
+{$DEFINE TGMatrix := TMatrixByte}
+{$DEFINE INTERFACE}
+{$I 'GenericMatrix.inc'}
+
+// TMatrixObject<Integer, Integer, TObject>
+{$DEFINE TGMatrixIndexX := Integer}
+{$DEFINE TGMatrixIndexY := Integer}
+{$DEFINE TGMatrixItem := TObject}
+{$DEFINE TGMatrixIndex := TMatrixObjectIndex}
+{$DEFINE TGMatrixRow := TMatrixObjectRow}
+{$DEFINE TGMatrix := TMatrixObject}
+{$DEFINE INTERFACE}
+{$I 'GenericMatrix.inc'}
+
+implementation
+
+{$DEFINE IMPLEMENTATION_USES}
+{$I 'GenericMatrix.inc'}
+
+// TMatrixInteger<Integer, Integer, Integer>
+{$DEFINE TGMatrixIndexX := Integer}
+{$DEFINE TGMatrixIndexY := Integer}
+{$DEFINE TGMatrixItem := Integer}
+{$DEFINE TGMatrixIndex := TMatrixIntegerIndex}
+{$DEFINE TGMatrixRow := TMatrixIntegerRow}
+{$DEFINE TGMatrix := TMatrixInteger}
+{$DEFINE IMPLEMENTATION}
+{$I 'GenericMatrix.inc'}
+
+// TMatrixByte<Integer, Integer, Byte>
+{$DEFINE TGMatrixIndexX := Integer}
+{$DEFINE TGMatrixIndexY := Integer}
+{$DEFINE TGMatrixItem := Byte}
+{$DEFINE TGMatrixIndex := TMatrixByteIndex}
+{$DEFINE TGMatrixRow := TMatrixByteRow}
+{$DEFINE TGMatrix := TMatrixByte}
+{$DEFINE IMPLEMENTATION}
+{$I 'GenericMatrix.inc'}
+
+// TMatrixObject<Integer, Integer, TObject>
+{$DEFINE TGMatrixIndexX := Integer}
+{$DEFINE TGMatrixIndexY := Integer}
+{$DEFINE TGMatrixItem := TObject}
+{$DEFINE TGMatrixIndex := TMatrixObjectIndex}
+{$DEFINE TGMatrixRow := TMatrixObjectRow}
+{$DEFINE TGMatrix := TMatrixObject}
+{$DEFINE IMPLEMENTATION}
+{$I 'GenericMatrix.inc'}
+
+end.
+
Index: /tags/1.1.0/Packages/TemplateGenerics/Specialized/SpecializedPoint.pas
===================================================================
--- /tags/1.1.0/Packages/TemplateGenerics/Specialized/SpecializedPoint.pas	(revision 137)
+++ /tags/1.1.0/Packages/TemplateGenerics/Specialized/SpecializedPoint.pas	(revision 137)
@@ -0,0 +1,63 @@
+unit SpecializedPoint;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+  Classes, SysUtils;
+
+{$MACRO ON}
+
+type
+// TPoint<Integer>
+{$DEFINE TGPointType := Integer}
+{$DEFINE TGPoint := TPoint}
+{$DEFINE INTERFACE}
+{$I 'GenericPoint.inc'}
+
+// TSmallPoint<SmallInt>
+{$DEFINE TGPointType := SmallInt}
+{$DEFINE TGPoint := TSmallPoint}
+{$DEFINE INTERFACE}
+{$I 'GenericPoint.inc'}
+
+// TPointSingle<Single>
+{$DEFINE TGPointType := Single}
+{$DEFINE TGPoint := TPointSingle}
+{$DEFINE INTERFACE}
+{$I 'GenericPoint.inc'}
+
+// TPointDouble<Double>
+{$DEFINE TGPointType := Double}
+{$DEFINE TGPoint := TPointDouble}
+{$DEFINE INTERFACE}
+{$I 'GenericPoint.inc'}
+
+implementation
+
+// TPoint<Integer>
+{$DEFINE TGPointType := Integer}
+{$DEFINE TGPoint := TPoint}
+{$DEFINE IMPLEMENTATION}
+{$I 'GenericPoint.inc'}
+
+// TSmallPoint<SmallInt>
+{$DEFINE TGPointType := SmallInt}
+{$DEFINE TGPoint := TSmallPoint}
+{$DEFINE IMPLEMENTATION}
+{$I 'GenericPoint.inc'}
+
+// TPointSingle<Single>
+{$DEFINE TGPointType := Single}
+{$DEFINE TGPoint := TPointSingle}
+{$DEFINE IMPLEMENTATION}
+{$I 'GenericPoint.inc'}
+
+// TPointDouble<Double>
+{$DEFINE TGPointType := Double}
+{$DEFINE TGPoint := TPointDouble}
+{$DEFINE IMPLEMENTATION}
+{$I 'GenericPoint.inc'}
+end.
+
Index: /tags/1.1.0/Packages/TemplateGenerics/Specialized/SpecializedQueue.pas
===================================================================
--- /tags/1.1.0/Packages/TemplateGenerics/Specialized/SpecializedQueue.pas	(revision 137)
+++ /tags/1.1.0/Packages/TemplateGenerics/Specialized/SpecializedQueue.pas	(revision 137)
@@ -0,0 +1,66 @@
+unit SpecializedQueue;
+
+{$mode delphi}
+
+interface
+
+uses
+  Classes, SysUtils;
+
+type
+{$MACRO ON}
+
+// TQueueInteger<Integer, Integer>
+{$DEFINE TGQueueIndex := Integer}
+{$DEFINE TGQueueItem := Integer}
+{$DEFINE TGQueue := TQueueInteger}
+{$DEFINE TGQueueList := TQueueListInteger}
+{$DEFINE INTERFACE}
+{$I 'GenericQueue.inc'}
+
+// TQueueInteger<Integer, Pointer>
+{$DEFINE TGQueueIndex := Integer}
+{$DEFINE TGQueueItem := Pointer}
+{$DEFINE TGQueue := TQueuePointer}
+{$DEFINE TGQueueList := TQueueListPointer}
+{$DEFINE INTERFACE}
+{$I 'GenericQueue.inc'}
+
+// TQueueByte<Integer, Byte>
+{$DEFINE TGQueueIndex := Integer}
+{$DEFINE TGQueueItem := Byte}
+{$DEFINE TGQueue := TQueueByte}
+{$DEFINE TGQueueList := TQueueListByte}
+{$DEFINE INTERFACE}
+{$I 'GenericQueue.inc'}
+
+implementation
+
+{$DEFINE IMPLEMENTATION_USES}
+{$I 'GenericQueue.inc'}
+
+// TQueueInteger<Integer, Integer>
+{$DEFINE TGQueueIndex := Integer}
+{$DEFINE TGQueueItem := Integer}
+{$DEFINE TGQueue := TQueueInteger}
+{$DEFINE TGQueueList := TQueueListInteger}
+{$DEFINE IMPLEMENTATION}
+{$I '..\Generic\GenericQueue.inc'}
+
+// TQueueInteger<Integer, Pointer>
+{$DEFINE TGQueueIndex := Integer}
+{$DEFINE TGQueueItem := Pointer}
+{$DEFINE TGQueue := TQueuePointer}
+{$DEFINE TGQueueList := TQueueListPointer}
+{$DEFINE IMPLEMENTATION}
+{$I 'GenericQueue.inc'}
+
+// TQueueByte<Integer, Byte>
+{$DEFINE TGQueueIndex := Integer}
+{$DEFINE TGQueueItem := Byte}
+{$DEFINE TGQueue := TQueueByte}
+{$DEFINE TGQueueList := TQueueListByte}
+{$DEFINE IMPLEMENTATION}
+{$I 'GenericQueue.inc'}
+
+end.
Index: /tags/1.1.0/Packages/TemplateGenerics/Specialized/SpecializedRectangle.pas
===================================================================
--- /tags/1.1.0/Packages/TemplateGenerics/Specialized/SpecializedRectangle.pas	(revision 137)
+++ /tags/1.1.0/Packages/TemplateGenerics/Specialized/SpecializedRectangle.pas	(revision 137)
@@ -0,0 +1,70 @@
+unit SpecializedRectangle;
+
+{$mode Delphi}{$H+}
+
+interface
+
+uses
+  Classes, SysUtils, SpecializedPoint, Types;
+
+type
+{$MACRO ON}
+
+// TRectangle = TGRectangle<Integer>
+{$DEFINE TGRectangleDimension := Integer}
+{$DEFINE TGRectangle := TBaseRectangle}
+{$DEFINE TGRectanglePoint := TPoint}
+{$DEFINE INTERFACE}
+{$I 'GenericRectangle.inc'}
+  TRectangle = class(TBaseRectangle)
+  private
+    procedure SetTRect(const AValue: TRect);
+    function GetTRect: TRect;
+  public
+    property AsTRect: TRect read GetTRect write SetTRect;
+  end;
+
+// TRectangleDouble = TGRectangle<Double>
+{$DEFINE TGRectangleDimension := Double}
+{$DEFINE TGRectangle := TRectangleDouble}
+{$DEFINE TGRectanglePoint := TPointDouble}
+{$DEFINE INTERFACE}
+{$I 'GenericRectangle.inc'}
+
+implementation
+
+{$DEFINE IMPLEMENTATION_USES}
+{$I 'GenericRectangle.inc'}
+
+// TRectangleInteger = TGRectangle<Integer>
+{$DEFINE TGRectangleDimension := Integer}
+{$DEFINE TGRectangle := TBaseRectangle}
+{$DEFINE TGRectanglePoint := TPoint}
+{$DEFINE IMPLEMENTATION}
+{$I 'GenericRectangle.inc'}
+
+function TRectangle.GetTRect: TRect;
+begin
+  Result.Left := Left;
+  Result.Top := Top;
+  Result.Bottom := Bottom;
+  Result.Right := Right;
+end;
+
+procedure TRectangle.SetTRect(const AValue: TRect);
+begin
+  Left := AValue.Left;
+  Top := AValue.Top;
+  Bottom := AValue.Bottom;
+  Right := AValue.Right;
+end;
+
+// TRectangleDouble = TGRectangle<Double>
+{$DEFINE TGRectangleDimension := Double}
+{$DEFINE TGRectangle := TRectangleDouble}
+{$DEFINE TGRectanglePoint := TPointDouble}
+{$DEFINE IMPLEMENTATION}
+{$I 'GenericRectangle.inc'}
+
+end.
+
Index: /tags/1.1.0/Packages/TemplateGenerics/Specialized/SpecializedSet.pas
===================================================================
--- /tags/1.1.0/Packages/TemplateGenerics/Specialized/SpecializedSet.pas	(revision 137)
+++ /tags/1.1.0/Packages/TemplateGenerics/Specialized/SpecializedSet.pas	(revision 137)
@@ -0,0 +1,50 @@
+unit SpecializedSet;
+
+{$mode delphi}
+
+interface
+
+uses
+  Classes, SysUtils;
+
+type
+{$MACRO ON}
+
+// TSetInteger<Integer, Integer>
+{$DEFINE TGSetIndex := Integer}
+{$DEFINE TGSetItem := Integer}
+{$DEFINE TGSetList := TSetListInteger}
+{$DEFINE TGSet := TSetInteger}
+{$DEFINE INTERFACE}
+{$I 'GenericSet.inc'}
+
+// TSetPointer<Integer, Pointer>
+{$DEFINE TGSetIndex := Integer}
+{$DEFINE TGSetItem := Pointer}
+{$DEFINE TGSetList := TSetListPointer}
+{$DEFINE TGSet := TSetPointer}
+{$DEFINE INTERFACE}
+{$I 'GenericSet.inc'}
+
+implementation
+
+{$DEFINE IMPLEMENTATION_USES}
+{$I 'GenericSet.inc'}
+
+// TSetInteger<Integer, Integer>
+{$DEFINE TGSetIndex := Integer}
+{$DEFINE TGSetItem := Integer}
+{$DEFINE TGSetList := TSetListInteger}
+{$DEFINE TGSet := TSetInteger}
+{$DEFINE IMPLEMENTATION}
+{$I 'GenericSet.inc'}
+
+// TSetPointer<Integer, Pointer>
+{$DEFINE TGSetIndex := Integer}
+{$DEFINE TGSetItem := Pointer}
+{$DEFINE TGSetList := TSetListPointer}
+{$DEFINE TGSet := TSetPointer}
+{$DEFINE IMPLEMENTATION}
+{$I 'GenericSet.inc'}
+
+end.
Index: /tags/1.1.0/Packages/TemplateGenerics/Specialized/SpecializedStack.pas
===================================================================
--- /tags/1.1.0/Packages/TemplateGenerics/Specialized/SpecializedStack.pas	(revision 137)
+++ /tags/1.1.0/Packages/TemplateGenerics/Specialized/SpecializedStack.pas	(revision 137)
@@ -0,0 +1,50 @@
+unit SpecializedStack;
+
+{$mode delphi}
+
+interface
+
+uses
+  Classes, SysUtils;
+
+type
+{$MACRO ON}
+
+// TStackInteger<Integer, Integer>
+{$DEFINE TGStackIndex := Integer}
+{$DEFINE TGStackItem := Integer}
+{$DEFINE TGStackList := TListStackInteger}
+{$DEFINE TGStack := TStackInteger}
+{$DEFINE INTERFACE}
+{$I 'GenericStack.inc'}
+
+// TStackInteger<Integer, Pointer>
+{$DEFINE TGStackIndex := Integer}
+{$DEFINE TGStackItem := Pointer}
+{$DEFINE TGStackList := TListStackPointer}
+{$DEFINE TGStack := TStackPointer}
+{$DEFINE INTERFACE}
+{$I 'GenericStack.inc'}
+
+
+implementation
+
+{$DEFINE IMPLEMENTATION_USES}
+{$I 'GenericStack.inc'}
+
+// TStackInteger<Integer, Integer>
+{$DEFINE TGStackIndex := Integer}
+{$DEFINE TGStackItem := Integer}
+{$DEFINE TGStackList := TListStackInteger}
+{$DEFINE TGStack := TStackInteger}
+{$DEFINE IMPLEMENTATION}
+{$I 'GenericStack.inc'}
+
+// TStackInteger<Integer, Pointer>
+{$DEFINE TGStackIndex := Integer}
+{$DEFINE TGStackItem := Pointer}
+{$DEFINE TGStackList := TListStackPointer}
+{$DEFINE TGStack := TStackPointer}
+{$DEFINE IMPLEMENTATION}
+{$I 'GenericStack.inc'}
+end.
Index: /tags/1.1.0/Packages/TemplateGenerics/Specialized/SpecializedStream.pas
===================================================================
--- /tags/1.1.0/Packages/TemplateGenerics/Specialized/SpecializedStream.pas	(revision 137)
+++ /tags/1.1.0/Packages/TemplateGenerics/Specialized/SpecializedStream.pas	(revision 137)
@@ -0,0 +1,222 @@
+unit SpecializedStream;
+
+{$mode delphi}
+
+interface
+
+uses
+  Classes, SysUtils, SpecializedList, DateUtils;
+
+type
+  TSeekOrigin = (soBegin, soCurrent, soEnd);
+
+{$MACRO ON}
+
+// TStreamInteger<Integer, Integer>
+{$DEFINE TGStreamIndex := Integer}
+{$DEFINE TGStreamItem := Integer}
+{$DEFINE TGStreamList := TListStreamInteger}
+{$DEFINE TGStream := TStreamInteger}
+{$DEFINE INTERFACE}
+{$I 'GenericStream.inc'}
+
+// TStreamByte<Integer, Byte>
+{$DEFINE TGStreamIndex := Integer}
+{$DEFINE TGStreamItem := Byte}
+{$DEFINE TGStreamList := TListStreamByte}
+{$DEFINE TGStream := TBaseStreamByte}
+{$DEFINE INTERFACE}
+{$I 'GenericStream.inc'}
+
+// TStreamPointer<Integer, Pointer>
+{$DEFINE TGStreamIndex := Integer}
+{$DEFINE TGStreamItem := Pointer}
+{$DEFINE TGStreamList := TListStreamPointer}
+{$DEFINE TGStream := TStreamPointer}
+{$DEFINE INTERFACE}
+{$I 'GenericStream.inc'}
+
+  TStreamByte = class(TBaseStreamByte)
+    function ReadBuffer(var Buffer; Count: Integer): Integer; virtual; abstract;
+    function WriteBuffer(var Buffer; Count: Integer): Integer; virtual; abstract;
+  end;
+
+  { TMemoryStreamByte }
+
+  TMemoryStreamByte = class(TStreamByte)
+  private
+    FList: TListByte;
+    FOwnsList: Boolean;
+    FPosition: Integer;
+  public
+    procedure Assign(Source: TBaseStreamByte); override;
+    procedure Write(Item: Byte); override;
+    procedure WriteArray(Values: array of Byte); override;
+    procedure WriteList(List: TListByte);
+    function WriteBuffer(var Buffer; Count: Integer): Integer; override;
+    procedure WriteStream(Stream: TBaseStreamByte; Count: Integer); override;
+    function Read: Byte; override;
+    function ReadArray(Count: Integer): TItemArray; override;
+    function ReadList(List: TListByte; Count: Integer): Integer;
+    function ReadBuffer(var Buffer; Count: Integer): Integer; override;
+    function ReadStream(Stream: TBaseStreamByte; Count: Integer): Integer; override;
+    function Insert(Count: Integer): Integer; override;
+    function Remove(Count: Integer): Integer; override;
+    function Seek(Offset: Integer; Origin: TSeekOrigin = soCurrent): Integer; override;
+    constructor Create; override; overload;
+    constructor Create(AList: TListByte); overload;
+    destructor Destroy; override;
+    property OwnsList: Boolean read FOwnsList write FOwnsList;
+    property List: TListByte read FList;
+  end;
+
+
+implementation
+
+{ TMemoryStreamByte }
+
+procedure TMemoryStreamByte.Assign(Source: TBaseStreamByte);
+begin
+  inherited;
+  if Source is TMemoryStreamByte then begin
+    FList.Assign(TMemoryStreamByte(Source).FList);
+    FPosition := TMemoryStreamByte(Source).FPosition;
+  end;
+end;
+
+procedure TMemoryStreamByte.Write(Item: Byte);
+begin
+  if FList.Count < (FPosition + 1) then
+    FList.Count := FPosition + 1;
+  FList[FPosition] := Item;
+  Inc(FPosition);
+end;
+
+procedure TMemoryStreamByte.WriteArray(Values: array of Byte);
+begin
+  if FList.Count < (FPosition + Length(Values)) then
+    FList.Count := FPosition + Length(Values);
+  FList.ReplaceArray(FPosition, Values);
+  Inc(FPosition, Length(Values));
+end;
+
+procedure TMemoryStreamByte.WriteList(List: TListByte);
+begin
+  FList.ReplaceList(FPosition, List);
+end;
+
+procedure TMemoryStreamByte.WriteStream(Stream: TBaseStreamByte; Count: Integer);
+begin
+
+end;
+
+function TMemoryStreamByte.WriteBuffer(var Buffer; Count: Integer): Integer;
+begin
+
+end;
+
+function TMemoryStreamByte.Read: Byte;
+begin
+  Result := FList[FPosition];
+  Inc(FPosition);
+end;
+
+function TMemoryStreamByte.ReadArray(Count: Integer): TItemArray;
+begin
+  Result := FList.GetArray(FPosition, Count);
+end;
+
+function TMemoryStreamByte.ReadList(List: TListByte; Count: Integer): Integer;
+begin
+  if (FPosition + Count) > FList.Count then
+    Count := FList.Count - FPosition;
+  FList.GetList(List, FPosition, Count);
+  Result := Count;
+end;
+
+function TMemoryStreamByte.ReadBuffer(var Buffer; Count: Integer): Integer;
+begin
+
+end;
+
+function TMemoryStreamByte.ReadStream(Stream: TBaseStreamByte; Count: Integer
+  ): Integer;
+begin
+
+end;
+
+function TMemoryStreamByte.Insert(Count: Integer): Integer;
+begin
+  FList.InsertCount(FPosition, Count);
+  Result := Count;
+end;
+
+function TMemoryStreamByte.Remove(Count: Integer): Integer;
+begin
+  Result := FList.Count - FPosition;
+  if Count < Result then Result := Count;
+  FList.DeleteItems(FPosition, Count);
+end;
+
+function TMemoryStreamByte.Seek(Offset: Integer; Origin: TSeekOrigin): Integer;
+begin
+  case Origin of
+    soBegin: FPosition := Offset;
+    soCurrent: FPosition := FPosition + Offset;
+    soEnd: FPosition := FList.Count + Offset;
+  end;
+  if FPosition > FList.Count then FPosition := FList.Count;
+  if FPosition < 0 then FPosition := 0;
+  Result := FPosition;
+end;
+
+constructor TMemoryStreamByte.Create;
+begin
+  inherited;
+  FList := TListByte.Create;
+  OwnsList := True;
+end;
+
+constructor TMemoryStreamByte.Create(AList: TListByte);
+begin
+  inherited Create;
+  FList := AList;
+  OwnsList := False;
+end;
+
+destructor TMemoryStreamByte.Destroy;
+begin
+  if OwnsList then FList.Free;
+  inherited Destroy;
+end;
+
+{$DEFINE IMPLEMENTATION_USES}
+{$I 'GenericStream.inc'}
+
+// TStreamInteger<Integer, Integer>
+{$DEFINE TGStreamIndex := Integer}
+{$DEFINE TGStreamItem := Integer}
+{$DEFINE TGStreamList := TListStreamInteger}
+{$DEFINE TGStream := TStreamInteger}
+{$DEFINE IMPLEMENTATION}
+{$I 'GenericStream.inc'}
+
+// TStreamByte<Integer, Byte>
+{$DEFINE TGStreamIndex := Integer}
+{$DEFINE TGStreamItem := Byte}
+{$DEFINE TGStreamList := TListStreamByte}
+{$DEFINE TGStream := TBaseStreamByte}
+{$DEFINE IMPLEMENTATION}
+{$I 'GenericStream.inc'}
+
+// TStreamPointer<Integer, Pointer>
+{$DEFINE TGStreamIndex := Integer}
+{$DEFINE TGStreamItem := Pointer}
+{$DEFINE TGStreamList := TListStreamPointer}
+{$DEFINE TGStream := TStreamPointer}
+{$DEFINE IMPLEMENTATION}
+{$I 'GenericStream.inc'}
+
+
+
+end.
Index: /tags/1.1.0/Packages/TemplateGenerics/Specialized/SpecializedTree.pas
===================================================================
--- /tags/1.1.0/Packages/TemplateGenerics/Specialized/SpecializedTree.pas	(revision 137)
+++ /tags/1.1.0/Packages/TemplateGenerics/Specialized/SpecializedTree.pas	(revision 137)
@@ -0,0 +1,71 @@
+unit SpecializedTree;
+
+{$mode delphi}
+
+interface
+
+uses
+  Classes, SysUtils;
+
+type
+{$MACRO ON}
+// TTreeInteger<Integer, Integer>
+{$DEFINE TGTreeIndex := Integer}
+{$DEFINE TGTreeItem := Integer}
+{$DEFINE TGTree := TTreeInteger}
+{$DEFINE TGTreeNode := TTreeNodeInteger}
+{$DEFINE TGTreeNodeList := TTreeNodeListInteger}
+{$DEFINE INTERFACE}
+{$I 'GenericTree.inc'}
+
+// TTreeString<Integer, string>
+{$DEFINE TGTreeIndex := Integer}
+{$DEFINE TGTreeItem := string}
+{$DEFINE TGTree := TTreeString}
+{$DEFINE TGTreeNode := TTreeNodeString}
+{$DEFINE TGTreeNodeList := TTreeNodeListString}
+{$DEFINE INTERFACE}
+{$I 'GenericTree.inc'}
+
+// TTreePointer<Integer, Pointer>
+{$DEFINE TGTreeIndex := Integer}
+{$DEFINE TGTreeItem := Pointer}
+{$DEFINE TGTree := TTreePointer}
+{$DEFINE TGTreeNode := TTreeNodePointer}
+{$DEFINE TGTreeNodeList := TTreeNodeListPointer}
+{$DEFINE INTERFACE}
+{$I 'GenericTree.inc'}
+
+implementation
+
+{$DEFINE IMPLEMENTATION_USES}
+{$I 'GenericTree.inc'}
+
+// TTreeInteger<Integer, Integer>
+{$DEFINE TGTreeIndex := Integer}
+{$DEFINE TGTreeItem := Integer}
+{$DEFINE TGTree := TTreeInteger}
+{$DEFINE TGTreeNode := TTreeNodeInteger}
+{$DEFINE TGTreeNodeList := TTreeNodeListInteger}
+{$DEFINE IMPLEMENTATION}
+{$I 'GenericTree.inc'}
+
+// TTreeString<Integer, string>
+{$DEFINE TGTreeIndex := Integer}
+{$DEFINE TGTreeItem := string}
+{$DEFINE TGTree := TTreeString}
+{$DEFINE TGTreeNode := TTreeNodeString}
+{$DEFINE TGTreeNodeList := TTreeNodeListString}
+{$DEFINE IMPLEMENTATION}
+{$I 'GenericTree.inc'}
+
+// TTreePointer<Integer, Pointer>
+{$DEFINE TGTreeIndex := Integer}
+{$DEFINE TGTreeItem := Pointer}
+{$DEFINE TGTree := TTreePointer}
+{$DEFINE TGTreeNode := TTreeNodePointer}
+{$DEFINE TGTreeNodeList := TTreeNodeListPointer}
+{$DEFINE IMPLEMENTATION}
+{$I 'GenericTree.inc'}
+
+end.
Index: /tags/1.1.0/Packages/TemplateGenerics/TemplateGenerics.lpk
===================================================================
--- /tags/1.1.0/Packages/TemplateGenerics/TemplateGenerics.lpk	(revision 137)
+++ /tags/1.1.0/Packages/TemplateGenerics/TemplateGenerics.lpk	(revision 137)
@@ -0,0 +1,164 @@
+<?xml version="1.0"?>
+<CONFIG>
+  <Package Version="4">
+    <PathDelim Value="\"/>
+    <Name Value="TemplateGenerics"/>
+    <AddToProjectUsesSection Value="True"/>
+    <Author Value="Chronos (robie@centrum.cz)"/>
+    <CompilerOptions>
+      <Version Value="11"/>
+      <PathDelim Value="\"/>
+      <SearchPaths>
+        <IncludeFiles Value="Generic"/>
+        <OtherUnitFiles Value="Specialized;Generic;Additional"/>
+        <UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/>
+      </SearchPaths>
+      <CodeGeneration>
+        <Optimizations>
+          <VariablesInRegisters Value="True"/>
+          <OptimizationLevel Value="3"/>
+        </Optimizations>
+      </CodeGeneration>
+      <Other>
+        <CompilerMessages>
+          <UseMsgFile Value="True"/>
+        </CompilerMessages>
+        <CompilerPath Value="$(CompPath)"/>
+      </Other>
+    </CompilerOptions>
+    <Description Value="Generic classes implemented as templates."/>
+    <Version Minor="4"/>
+    <Files Count="28">
+      <Item1>
+        <Filename Value="ReadMe.txt"/>
+        <Type Value="Text"/>
+      </Item1>
+      <Item2>
+        <Filename Value="Generic\GenericDictionary.inc"/>
+        <Type Value="Include"/>
+      </Item2>
+      <Item3>
+        <Filename Value="Generic\GenericList.inc"/>
+        <Type Value="Include"/>
+      </Item3>
+      <Item4>
+        <Filename Value="Generic\GenericListObject.inc"/>
+        <Type Value="Include"/>
+      </Item4>
+      <Item5>
+        <Filename Value="Generic\GenericFileList.inc"/>
+      </Item5>
+      <Item6>
+        <Filename Value="Generic\GenericQueue.inc"/>
+        <Type Value="Include"/>
+      </Item6>
+      <Item7>
+        <Filename Value="Generic\GenericRange.inc"/>
+        <Type Value="Include"/>
+      </Item7>
+      <Item8>
+        <Filename Value="Generic\GenericSet.inc"/>
+        <Type Value="Include"/>
+      </Item8>
+      <Item9>
+        <Filename Value="Generic\GenericStack.inc"/>
+        <Type Value="Include"/>
+      </Item9>
+      <Item10>
+        <Filename Value="Generic\GenericTree.inc"/>
+        <Type Value="Include"/>
+      </Item10>
+      <Item11>
+        <Filename Value="Generic\GenericMatrix.inc"/>
+        <UnitName Value="GenericMatrix"/>
+      </Item11>
+      <Item12>
+        <Filename Value="Generic\GenericListString.inc"/>
+        <UnitName Value="GenericListString"/>
+      </Item12>
+      <Item13>
+        <Filename Value="Generic\GenericBitmap.inc"/>
+        <UnitName Value="GenericBitmap"/>
+      </Item13>
+      <Item14>
+        <Filename Value="Generic\GenericPoint.inc"/>
+        <Type Value="Include"/>
+      </Item14>
+      <Item15>
+        <Filename Value="Generic\GenericStream.inc"/>
+        <UnitName Value="GenericStream"/>
+      </Item15>
+      <Item16>
+        <Filename Value="Generic\GenericRectangle.inc"/>
+        <UnitName Value="GenericRectangle"/>
+      </Item16>
+      <Item17>
+        <Filename Value="Specialized\SpecializedList.pas"/>
+        <UnitName Value="SpecializedList"/>
+      </Item17>
+      <Item18>
+        <Filename Value="Specialized\SpecializedDictionary.pas"/>
+        <UnitName Value="SpecializedDictionary"/>
+      </Item18>
+      <Item19>
+        <Filename Value="Specialized\SpecializedStack.pas"/>
+        <UnitName Value="SpecializedStack"/>
+      </Item19>
+      <Item20>
+        <Filename Value="Specialized\SpecializedTree.pas"/>
+        <UnitName Value="SpecializedTree"/>
+      </Item20>
+      <Item21>
+        <Filename Value="Specialized\SpecializedQueue.pas"/>
+        <UnitName Value="SpecializedQueue"/>
+      </Item21>
+      <Item22>
+        <Filename Value="Specialized\SpecializedSet.pas"/>
+        <UnitName Value="SpecializedSet"/>
+      </Item22>
+      <Item23>
+        <Filename Value="Specialized\SpecializedPoint.pas"/>
+        <UnitName Value="SpecializedPoint"/>
+      </Item23>
+      <Item24>
+        <Filename Value="Specialized\SpecializedMatrix.pas"/>
+        <UnitName Value="SpecializedMatrix"/>
+      </Item24>
+      <Item25>
+        <Filename Value="Specialized\SpecializedBitmap.pas"/>
+        <UnitName Value="SpecializedBitmap"/>
+      </Item25>
+      <Item26>
+        <Filename Value="Specialized\SpecializedStream.pas"/>
+        <UnitName Value="SpecializedStream"/>
+      </Item26>
+      <Item27>
+        <Filename Value="Specialized\SpecializedRectangle.pas"/>
+        <UnitName Value="SpecializedRectangle"/>
+      </Item27>
+      <Item28>
+        <Filename Value="Additional\UBinarySerializer.pas"/>
+        <UnitName Value="UBinarySerializer"/>
+      </Item28>
+    </Files>
+    <Type Value="RunAndDesignTime"/>
+    <RequiredPkgs Count="2">
+      <Item1>
+        <PackageName Value="LCLBase"/>
+      </Item1>
+      <Item2>
+        <PackageName Value="FCL"/>
+        <MinVersion Major="1" Valid="True"/>
+      </Item2>
+    </RequiredPkgs>
+    <UsageOptions>
+      <UnitPath Value="$(PkgOutDir)"/>
+    </UsageOptions>
+    <PublishOptions>
+      <Version Value="2"/>
+    </PublishOptions>
+    <CustomOptions Items="ExternHelp" Version="2">
+      <_ExternHelp Items="Count"/>
+    </CustomOptions>
+  </Package>
+</CONFIG>
Index: /tags/1.1.0/Packages/TemplateGenerics/TemplateGenerics.pas
===================================================================
--- /tags/1.1.0/Packages/TemplateGenerics/TemplateGenerics.pas	(revision 137)
+++ /tags/1.1.0/Packages/TemplateGenerics/TemplateGenerics.pas	(revision 137)
@@ -0,0 +1,23 @@
+{ This file was automatically created by Lazarus. Do not edit!
+  This source is only used to compile and install the package.
+ }
+
+unit TemplateGenerics;
+
+interface
+
+uses
+  SpecializedList, SpecializedDictionary, SpecializedStack, SpecializedTree, 
+  SpecializedQueue, SpecializedSet, SpecializedPoint, SpecializedMatrix, 
+  SpecializedBitmap, SpecializedStream, SpecializedRectangle, 
+  UBinarySerializer, LazarusPackageIntf;
+
+implementation
+
+procedure Register;
+begin
+end;
+
+initialization
+  RegisterPackage('TemplateGenerics', @Register);
+end.
Index: /tags/1.1.0/Release notes.txt
===================================================================
--- /tags/1.1.0/Release notes.txt	(revision 137)
+++ /tags/1.1.0/Release notes.txt	(revision 137)
@@ -0,0 +1,31 @@
+Version 1.0.0 (2016-12-10)
+==========================
+
+* Added: Zoomable map.
+* Added: Store application configuration in XML file.
+* Added: Allow to save and load game to game file in XML format with extension .xtg.
+* Added: Localization support. Additional language is Czech.
+* Added: High DPI support.
+* Added: Multiple map cell shapes as hexagons, squares and triangles.
+* Added: Bridges between remote cells visible as lines.
+* Added: Multiple players support. Players can have different color and other starting properties.
+* Added: Application now automatically open saved game file given as command line parameter after execution.
+* Added: Computer player settings to be low, medium or highly aggresive in attacking.
+* Added: Holding SHIFT key during click to attack maximum available power is moved without dialog confirmation.
+* Added: With mouse click and with CTRL key pressed new move will set maximum one time and repeated unit counts to selected target cell.
+* Added: New game option "Fog of war" which cause map to be covered to black and only explored cells will be visible.
+* Added: Auto save game to file option in settings.
+* Added: New game option "Map shape" which can use image in file as base for map generation. Black color is used as void.
+* Added: Support for symetric map usable for two players game.
+* Added: Confirmation dialog for ending game.
+* Added: Support for switching large icons in toolbar.
+* Added: About form with information about application.
+* Added: Support for cities. Cities can be used as only growing cells.
+* Added: Allow to set grow rate as square root of cell power.
+* Added: Amount of inaccessible cells can be adjusted in New game dialog.
+* Added: Player customize dialog window.
+* Added: Toolbar for quick access to common actions.
+* Added: Player start units setting.
+* Added: Size of map can be adjusted in New game dialog.
+* Added: Visualization of planned moves between cells for next turn.
+* Added: Player mode human or computer. 
Index: /tags/1.1.0/UCore.lfm
===================================================================
--- /tags/1.1.0/UCore.lfm	(revision 137)
+++ /tags/1.1.0/UCore.lfm	(revision 137)
@@ -0,0 +1,2075 @@
+object Core: TCore
+  OnCreate = DataModuleCreate
+  OnDestroy = DataModuleDestroy
+  OldCreateOrder = False
+  Height = 542
+  HorizontalOffset = 565
+  VerticalOffset = 329
+  Width = 752
+  object ActionList1: TActionList
+    Images = ImageListSmall
+    left = 72
+    top = 32
+    object AGameNew: TAction
+      Caption = 'New'
+      Hint = 'New game'
+      ImageIndex = 5
+      OnExecute = AGameNewExecute
+      ShortCut = 16462
+    end
+    object AExit: TAction
+      Caption = 'Exit'
+      Hint = 'Exit application'
+      ImageIndex = 1
+      OnExecute = AExitExecute
+      ShortCut = 32883
+    end
+    object AGameEnd: TAction
+      Caption = 'End'
+      Hint = 'End game'
+      ImageIndex = 4
+      OnExecute = AGameEndExecute
+      ShortCut = 16454
+    end
+    object AGameEndTurn: TAction
+      Caption = 'End turn'
+      Hint = 'End player turn'
+      ImageIndex = 0
+      OnExecute = AGameEndTurnExecute
+      ShortCut = 16468
+    end
+    object AGameRestart: TAction
+      Caption = 'Restart'
+      Hint = 'Restart game'
+      ImageIndex = 3
+      OnExecute = AGameRestartExecute
+      ShortCut = 16466
+    end
+    object ASettings: TAction
+      Caption = 'Settings'
+      Hint = 'Application settings'
+      ImageIndex = 6
+      OnExecute = ASettingsExecute
+      ShortCut = 120
+    end
+    object AGameSave: TAction
+      Caption = 'Save'
+      ImageIndex = 11
+      OnExecute = AGameSaveExecute
+      ShortCut = 16467
+    end
+    object AGameLoad: TAction
+      Caption = 'Load'
+      ImageIndex = 10
+      OnExecute = AGameLoadExecute
+      ShortCut = 16463
+    end
+    object AAbout: TAction
+      Caption = 'About'
+      ImageIndex = 2
+      OnExecute = AAboutExecute
+    end
+    object AHelp: TAction
+      Caption = 'Help'
+      OnExecute = AHelpExecute
+    end
+    object AShowCharts: TAction
+      Caption = 'Show charts'
+      OnExecute = AShowChartsExecute
+    end
+  end
+  object ImageListSmall: TImageList
+    left = 419
+    top = 224
+    Bitmap = {
+      4C690C00000010000000100000000000000000000000E3AA4BD6E5B35EFFE3B1
+      61F2DEA85AF3D9A156F3D49B50F3CF904AF3CA8C47F3C58743F3C0813CF3BF80
+      38F8A75E20FB00000000000000000000000000000000E6AF53E7F6D084FFF8D8
+      8BFFF1C979FFEFC471FFECBE69FFE8B75FFFE6B154FFE2AA49FFDEA340FFE9AC
+      3CFFB26A1EFF00000000000000000000000000000000E4A64184D7A258C4DCBB
+      8AFFE9C591FFE3BD8AFFE0B888FFDAB486FFD5AE82FFD0A67FFFCDA17BFFB98B
+      6AF9A053169E0000000000000000000000000000000000000000B5A8B41DDAD7
+      E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC8C7
+      DACB00000000000000000000000000000000000000000000000000000000C0B3
+      B2FFCAFDFFFF63E7FEFF45E2FCFF54DDFAFF53D8F8FF43D5FDFF62C9E8FFBDA0
+      A2AD00000000000000000000000000000000000000000000000000000000AA94
+      9A6D8BC7D2FFB5F2FFFF08D3FCFF00CBFEFF00CBFFFF00C5FFFF77A2B7FFC19D
+      9D18000000000000000000000000000000000000000000000000000000000000
+      0000A08B928F8AB2C0FF71DEF7FF00D5FFFF1AC3F4FF8C9AABFFBA92923E0000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000BA817D4B4AA9C3FF00CEFFFF93919ADCBB8A860B000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000966E6C4B539CBDFF03CCFFFF80838CDC8F76780B000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00007B70778FF3BFB1FF4BD1F9FF00CEFFFFB6C9CEFFB58E8DFF80767C3E0000
+      0000000000000000000000000000000000000000000000000000000000007263
+      6A6DE4C4BCFFC9FAFFFF14C9FFFF00C9FFFF64DBF5FFE4D4CEFF9D8383FF776C
+      731800000000000000000000000000000000000000000000000000000000AF8C
+      85FFA0EDFFFF00BEFFFF04C4FEFF0FCDFEFF00D2FFFF21DDFCFFB3AEADFF7F64
+      68AD0000000000000000000000000000000000000000000000006E56632277A0
+      B9FF00D5FFFF00C9FFFF00D4FFFF00DBFFFF00E1FFFF00EEFFFF39E6FDFF7D6E
+      81CF0000000000000000000000000000000000000000E3A74286CA8F44C99696
+      7AFF62A498FF71A28EFF6CA08AFF669E88FF629C86FF5D9C86FF52A28BFF9565
+      48FC9F5316A200000000000000000000000000000000E7B155E7FBD68DFFFFE2
+      97FFFFD27FFFFFCD79FFFFC771FFFFC067FFFFBA5EFFFEB453FFF7AC4BFFF5BC
+      4FFFB66F25FF00000000000000000000000000000000E3AA4BD6E5B15AFFE1AB
+      53F2DCA34CF3D69B47F3D29341F3CD8C3DF3C78537F3C17E31F3BC772BF3BB75
+      25F8A65C1BFB0000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF0000000000000000000000000000
+      000000000000000000000000000000000000000000FF000000FFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FF0000000000000000000000000000
+      000000000000000000000000000000000000000000FF008484FF000000FFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FF0000000000000000000000000000
+      0000840000FF000000000000000000000000000000FF008484FF008484FF0000
+      00FFFFFFFFFFFFFFFFFFFFFFFFFF000000FF0000000000000000000000008400
+      00FF840000FF000000000000000000000000000000FF008484FF008484FF0084
+      84FF000000FFFFFFFFFFFFFFFFFF000000FF0000000000000000840000FF8400
+      00FF840000FF840000FF840000FF00000000000000FF008484FF008484FF0084
+      84FF000000FFFFFFFFFFFFFFFFFF000000FF00000000840000FF840000FF8400
+      00FF840000FF840000FF840000FF00000000000000FF008484FF008484FF0084
+      84FF000000FFFFFFFFFFFFFFFFFF000000FF0000000000000000840000FF8400
+      00FF840000FF840000FF840000FF00000000000000FF008484FF008484FF0084
+      84FF000000FFFFFFFFFFFFFFFFFF000000FF0000000000000000000000008400
+      00FF840000FF000000000000000000000000000000FF008484FF008484FF0000
+      00FF000000FFFFFFFFFFFFFFFFFF000000FF0000000000000000000000000000
+      0000840000FF000000000000000000000000000000FF008484FF008484FF0084
+      84FF000000FFFFFFFFFFFFFFFFFF000000FF0000000000000000000000000000
+      0000000000000000000000000000000000FF000000FF008484FF008484FF0084
+      84FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF0000000000000000000000000000000000000000000000FF008484FF0084
+      84FF000000FF0000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000FF0084
+      84FF000000FF0000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00FF000000FF0000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000FF0000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000000000000000000000000000C584
+      44FFC28342FFD89C6DFFD69668FFD49463FFD69668FFB2793CFFB1783BFF0000
+      0000000000000000000000000000000000000000000000000000C58442FFDCA2
+      77FFF3DAC7FFFCF7F1FFFFFEFEFFFFFEFEFFFCF4EDFFF1D6C0FFC7935DFFA66F
+      33FF0000000000000000000000000000000000000000C48443FFE5B999FFFCF4
+      EDFFFBD2C1FFFAA887FFFD8757FFFD8454FFF8A582FFF7CEBDFFFAF1E7FFD2A7
+      7AFFA36A2AFF000000000000000000000000C48445FFDCA277FFFCF4EDFFFABF
+      A6FFFF7A43FFFFBB9EFFFFF6F3FFFFFEFEFFFEEDE5FFFA9970FFF3B69CFFF8F0
+      E6FFBB8B56FF986426FF0000000000000000C48341FFF0DAC3FFFAD1C0FFFF79
+      40FFFF986EFFFFFEFEFFFFC9B2FFFD9164FFFAC6AFFFFEF5F1FFF5773DFFEDC5
+      B2FFE4CBB3FF905D21FF0000000000000000D1834CFFFCF7F1FFFAA582FFFF73
+      3AFFFF844EFFFFAE8AFFFE6C2DFFF76727FFF19268FFFFFEFEFFE98354FFD785
+      60FFF8F1ECFF81551FFF0000000000000000CD844EFFFFFEFEFFFC814CFFFF70
+      31FFFF6B2CFFFD6928FFF86523FFF49265FFFDF5F1FFF4D4C5FFC65018FFBA59
+      27FFFEFEFDFF834A1CFF0000000000000000CD8147FFFFFEFEFFF87A46FFF968
+      29FFF66525FFF16020FFF18653FFFFFEFEFFF0BFA8FFC55A24FFB64C15FFB757
+      24FFFEFEFDFF7F481AFF0000000000000000CD7F45FFFCF4EDFFEC9772FFE860
+      21FFE05A1DFFDB5819FFEDAA89FFFFFEFEFFC84E12FFB94C11FFB34C13FFC77B
+      53FFF6F0ECFF7A4319FF0000000000000000B4793AFFEFD6C1FFEDC5B2FFDD5A
+      1AFFD55617FFD25313FFD87D4DFFE3A686FFBB4C11FFB34A12FFB64A10FFDEB9
+      A6FFDCC9B8FF563C0DFF0000000000000000B67734FFD6996BFFF9F0E7FFDDA4
+      88FFC75013FFC04E11FFDCA688FFFFFEFEFFB54911FFB64A10FFD59E82FFF3EC
+      E7FF9A7352FF49340DFF000000000000000000000000B2702BFFDBAB80FFF8EF
+      E7FFE2BBA6FFCC7E56FFC15823FFC05722FFC97F56FFDEBAA7FFF2EBE7FFB393
+      76FF483108FF0000000000000000000000000000000000000000A1692CFFC088
+      58FFE0C9B4FFF7F1ECFFFEFDFCFFFEFDFCFFF5F0ECFFDCC9B8FF9E7857FF4731
+      08FF000000000000000000000000000000000000000000000000000000009164
+      29FF855A24FF885015FF824A1DFF7E4719FF794417FF583C0EFF49340DFF0000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000339966FF0000
+      00000000000066CC99FF009933FF009933FF009933FF339966FF000000000000
+      0000000000000000000000000000000000000000000000000000009933FF3399
+      66FF009933FF009933FF009933FF009933FF009933FF339966FF339966FF0000
+      0000000000000000000000000000000000000000000000000000009933FF0099
+      33FF009933FF009933FF66CC99FF000000000000000066CC99FF009933FF66CC
+      99FF000000000000000000000000000000000000000000000000009933FF0099
+      33FF009933FF339966FF0000000000000000000000000000000066CC99FF0099
+      33FF000000000000000000000000000000000000000000000000009933FF0099
+      33FF009933FF009933FF339966FF000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000339966FF009933FF009933FF009933FF0099
+      33FF000000000000000000000000000000000000000000000000009933FF66CC
+      99FF00000000000000000000000000000000339966FF009933FF009933FF0099
+      33FF00000000000000000000000000000000000000000000000066CC99FF0099
+      33FF66CC99FF000000000000000066CC99FF009933FF009933FF009933FF0099
+      33FF000000000000000000000000000000000000000000000000000000003399
+      66FF339966FF009933FF009933FF009933FF009933FF009933FF339966FF0099
+      33FF000000000000000000000000000000000000000000000000000000000000
+      0000339966FF009933FF009933FF009933FF66CC99FF00000000000000003399
+      66FF000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF000000
+      880E00008841000088670000887A0000887A00008867000088410000880EFFFF
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00000088420B0B
+      97892728BFC53939D1ED4A49DDFF5656E1FF5D5DDFEE4F4FD0C617179D890000
+      8842FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00000088482828B6AE504F
+      DCFA6362E3FF7777E9FF8787EEFF9292F2FF9999F5FF9B9BF6FF9595F6FB5555
+      CCB200008848FFFFFF00FFFFFF00FFFFFF00000088423333BCAE6D6DE8FF8383
+      EEFFA0A0E4FFAFAFC2FFADADAFFFACABAFFFAFAFC0FFB0B0E9FFA8A8FBFF9A9A
+      FBFF5352CEB300008842FFFFFF000000880E18199F8A8181F0FA9898F6FFB1B1
+      D4FFABABACFFBDBDBDFFE4E4E4FFF5F6F6FFF2F2F2FF9A9AEEFFA8A7FCFF9E9D
+      FBFF8A8AF9FB1E1EA58C00008810000088416B6BDDC9A0A0FAFFB0B0E8FFABAB
+      ABFFD3D3D3FFFCFCFCFFFAFAFAFFF7F7F7FF9999FCFF9F9FFCFF9D9DFCFF9898
+      EEFF8484FBFF5959E1CE00008842000088699A9AF6F2A9AAFCFFB1B0C3FFC1C1
+      C1FFFDFDFDFFFAFAFAFFF7F6F6FF8B8BFCFF9595FCFF9393FCFF6B6BC5FFA2A2
+      BFFF6868FBFF2424F2ED0000886900008877A3A4FBFDA0A0FCFFADADB2FFE4E4
+      E4FFF9F9F9FFF4F4F4FF5A5AFBFF6F6FFBFF7F80FBFF6262C7FFA6A6A6FFEBEB
+      FAFF1515F6FF0707F3FC00008877000088778A8AFAFD8181FBFFA8A9B1FFF1F1
+      F0FFF1F1F1FF1313F9FF1E1EF9FF1919F9FF0C0CC4FFA3A3A3FFF9F8F9FFE5E5
+      F8FF0000EFFF0000EAFC00008877000088696161F4F05656FAFF8F8FBEFFEAEA
+      E9FF0606F4FF0F10F8FF0A0AF6FF0101C0FFA3A3A3FFF9F8F8FFF9F9F9FFA8A8
+      ECFF0000E4FF0000DAEC00008869000088412C2BDBC51616F9FF4445E0FF0000
+      E3FF0404F3FF0000EBFF0000BCFFA2A2A2FFF8F8F8FFF9F9F8FFEEEFEFFF3E3E
+      DDFF0000D5FF0000BBC2000088420000880E02019E880303F0F90000F0FF0000
+      EDFF0000EAFF0000B7FFA2A2A2FFF8F8F8FFF9F8F9FFEBECEEFF6C6CD9FF0000
+      C9FF0000C3F90000938800008810FFFFFF00000088420000BCA90000E6FF0000
+      E1FF1A1AD5FF8282B3FFE9EAF7FFEAE9F6FFA8A8E4FF3030CAFF0000BDFF0000
+      B8FF00009FAB00008842FFFFFF00FFFFFF00FFFFFF00000088480000B3AB0000
+      D1FA0000CCFF0000C7FF0000C2FF0000BBFF0000B6FF0000B1FF0000ABFA0000
+      99AC00008848FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00000088430000
+      92870000ACC20000B2EE0000B0FF0000AAFF0000A3EE000099C400008C880000
+      8843FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000
+      8810000088420000886A0000887A0000887A0000886A0000884300008811FFFF
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00047FBD96047FBDFF047FBDFF047FBDFF047FBDFF047FBDFF047F
+      BDFF047FBDFF047FBDAB047FBD42FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+      FF00047FBD7E3FA0CEFFDFF9FDFFDFF9FDFFDFF9FDFFDFF9FDFFDFF9FDFFDFF9
+      FDFFDFF9FDFF97D1E8FF0780BEFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00047F
+      BD4B1689C2FFC1EBF7FF93E8F9FF52DBF6FF52DBF6FF52DBF6FF52DBF6FFB9F0
+      FBFF79C8E5FF0680BEFF047FBD42FFFFFF00FFFFFF00FFFFFF00047FBD03047F
+      BDB49CD4EAFFBCF1FBFF4DD9F5FF4DD9F5FF4DD9F5FF4DD9F5FFB8F0FBFF74C5
+      E4FF0680BEFF047FBD3CFFFFFF00FFFFFF00FFFFFF00FFFFFF00047FBD9061B2
+      D8FFC3F2FCFF4BD8F5FF4BD8F5FF4BD8F5FF4BD8F5FFB7EFFBFF74C5E4FF0680
+      BEFF047FBD36FFFFFF00FFFFFF00FFFFFF00FFFFFF00047FBD6C2893C8FFC8F1
+      FBFF6EDFF6FF49D7F4FF49D7F4FF49D7F4FFA2EBF9FF6FC2E2FF047FBDFF047F
+      BDFF047FBDAE047FBD45FFFFFF00FFFFFF00047FBD2A0982BFFFB4E2F2FFA6EB
+      FAFF4AD7F4FF47D6F4FF47D6F4FF47D6F4FF47D6F4FFC5F3FCFFDEF8FDFFDEF8
+      FDFF99D2E9FF1B8CC4FF047FBD1BFFFFFF00047FBD9381C4E2FFBCF0FAFFB5EE
+      FAFFB5EEFAFFB5EEFAFF45D4F3FF45D4F3FF45D4F3FFB5EEFAFFA6E5F5FF40A5
+      D2FF047FBDAE047FBD45FFFFFF00FFFFFF00047FBD2A047FBD96047FBDFF047F
+      BDFF047FBDFF6BC0E1FFA1E9F9FF81E2F7FFB3EDFAFF77C7E5FF1388C2FF047F
+      BD81FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00047F
+      BD935DB0D7FFC4F1FBFFB3EDFAFFA0E1F4FF3CA2D0FF047FBDA8047FBD3FFFFF
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00047FBD8744A2
+      D0FFC9F1FBFFB2ECFAFF70C3E3FF0F85C1FF047FBD7BFFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00047FBD7B2A94C8FFC3EC
+      F7FF9EDFF2FF359ECEFF047FBD9F047FBD36FFFFFF00FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00047FBD3C1689C2FFBEE8F5FF6ABF
+      E0FF0C84C0FF047FBD78FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00FFFFFF00047FBD090C83BFFF8DCBE6FF2F9ACCFF047F
+      BD96047FBD2DFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00FFFFFF00047FBD39349ACBFF0B83BFFF047FBD3FFFFF
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00047FBD39047FBD09FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+      FF00FFFFFF00FFFFFF00FFFFFF00A37B48FFA37B48FFA27A47FFA27946FFA178
+      45FFA07744FFA07643FF9F7542FF9E7441FF9E7340FF9D723FFF9C713EFF9C70
+      3DFF9B6F3CFF9A6E3BFF9A6D3AFFA37B48FFBEA27FFFBEA17EFFBDA17DFFBDA0
+      7CFFBD9F7CFFBC9F7BFFBB9E7AFFBB9D7AFFBB9D79FFBA9C78FFB99B78FFB99A
+      77FFB89A76FFB89975FF996C39FFA27A47FFFFFFFFFFFFFFFFFFFEFEFEFFFEFE
+      FEFFFDFDFDFFFDFDFCFFFCFCFBFFFCFBFBFFFBFBFAFFFBFAF9FFFAFAF9FFFAF9
+      F8FFF9F9F7FFF9F8F7FF986B37FFA17946FFFFFFFFFF878787FF5D5D5DFFA0A0
+      A0FFFDFCFCFFFCFCFBFFFCFBFBFFFBFBFAFFFBFAF9FFFAFAF9FFFAF9F8FFF9F8
+      F7FFF8F8F7FFF8F7F6FF976A36FFA17844FFFEFEFEFF5F5F5FFF949494FF5353
+      53FFFCFCFBFF7B7B7BFF797979FF757575FF727272FF6E6E6EFF6A6A69FF6666
+      66FF626262FFF7F7F5FF966935FFA07643FFFEFDFDFF8C8C8CFF525252FFA4A4
+      A4FFFBFBFAFFFBFBFAFFFAFAF9FFFAF9F8FFF9F9F8FFF9F8F7FFF8F8F6FFF8F7
+      F6FFF7F7F5FFF7F6F4FF966734FF9F7542FFFDFDFCFFFCFCFCFFFCFCFBFFFBFB
+      FAFFFBFAFAFFFAFAF9FFFAF9F8FFF9F9F8FFF9F8F7FFF8F8F6FFF8F7F6FFF7F6
+      F5FFF7F6F4FFF6F5F4FF956633FF9E7441FFFCFCFCFFB5B5B5FF848484FFBEBD
+      BDFFFAFAF9FFFAF9F8FFF9F9F7FFF9F8F7FFF8F8F6FFF8F7F5FFF7F6F5FFF7F6
+      F4FFF6F5F3FFF6F5F3FF946531FF9D7340FFFCFBFBFF818181FFC4C4C4FF8F8F
+      8FFFFAF9F8FF7B7B7AFF797979FF757574FF727171FF6D6D6DFF696969FF6666
+      65FF626261FFF5F4F2FF936430FF9D723EFFFBFBFAFF9F9F9EFF7F7F7FFFAEAE
+      ADFFF9F8F7FFF8F8F7FFF8F7F6FFF7F7F5FFF7F6F5FFF6F6F4FFF6F5F3FFF5F4
+      F3FFF5F4F2FFF4F3F1FF92622FFF9C703DFFFAFAF9FFFAF9F9FFF9F9F8FFF9F8
+      F7FFF8F8F7FFF8F7F6FFF7F7F5FFF7F6F5FFF6F5F4FFF6F5F3FFF5F4F3FFF5F4
+      F2FFF4F3F1FFF4F3F0FF92612EFF9B6F3CFFFAF9F8FFBEBEBDFF929292FFBCBC
+      BBFFF8F7F6FFF7F7F5FFF7F6F4FFF6F5F4FFF6F5F3FFF5F4F2FFF5F4F2FFF4F3
+      F1FFF4F2F0FFF3F2F0FF91602DFF9A6E3BFFF9F9F8FF7C7C7CFFC4C4C4FF8787
+      87FFF7F6F5FF7A7A7AFF787878FF747474FF717170FF6D6D6CFF696968FF6565
+      65FF616161FFF2F1EFFF905F2BFF996D3AFFF9F8F7FF959594FF878787FF9B9A
+      9AFFF7F6F4FFF6F5F3FFF6F5F3FFF5F4F2FFF4F3F1FFF4F3F1FFF3F2F0FFF3F2
+      EFFFF2F1EFFFF2F1EEFF8F5E2AFF996C38FFF8F7F6FFF8F7F5FFF7F6F5FFF6F6
+      F4FFF6F5F3FFF5F5F3FFF5F4F2FFF4F3F1FFF4F3F1FFF3F2F0FFF3F2EFFFF2F1
+      EFFFF2F0EEFFF1F0EDFF8E5D29FF986B37FF976A36FF966935FF966734FF9566
+      33FF946532FF946531FF936430FF92622FFF92612EFF91602DFF90602CFF905F
+      2BFF8F5D2AFF8E5C29FF8D5B28FFD5704E00E17B5900EA846228EC86649DEC86
+      64DFEC8664FAEC8664DFEC86649DEA846228E17B5900D5704E00D5704E00A054
+      3B00361C14000000000000000000D5704E00DF7A5851E17D5BDFE9A78DCAF2D4
+      C5C0F4E7DCC8EDC9B5BAE5A082C8E17D5BDFDF7A5851D5704E00D5704E00D570
+      4E00D5704E00A0543B006B382700CF6A4828D16E4DDFE8BEAAC8FAF5F0E6FBF6
+      F2E7FBF6F2E7FAF5F0E6F5EAE0E0E7BCA7C8D16E4CDFCF6A4828CD684600CD68
+      4600CD684600CD684600CD684600C05C3A9DD29074CAF7EDE4E2C05C3AFFC05C
+      3AFFF9EFECFFC05C3AFFC05C3AFFF4E9DDE0D18D6FC8C05C3A9DC05C3A00C05C
+      3A00C05C3A00C05C3A00C05C3A00B24E2CDFDFBCA5BCF4E9DDE0B24E2CFFFAF4
+      EEF0F4E9DDE0FAF4EEF0B24E2CFFF4E9DDE0DDB69DB7B24E2CDFB24E2C00B24E
+      2C00B24E2C00B24E2C00B24E2C00AB4624FAEBD6C3C6FBF6F1E6F7EDE9FFFBF6
+      F2E7F6EDE4CEFBF6F2E7F7EDE9FFF4E9DDE0E7CFB9C0AB4624FAAB462400AB46
+      2400AB462400AB462400AB462400AD4422DFE1BEAAC2FBF6F1E6AD4422FFFDFB
+      F9F3FBF6F2E7FDFBF9F3AD4422FFF4E9DDE0DEB7A0BBAD4422DFAD442200AD44
+      2200AD442200AD442200AD442200B849279DD18B73D2FAF5EFE7B84927FFB849
+      27FFF8EDEAFFB84927FFB84927FFF5EBE1E2CF866BCDB849279DB8492700B849
+      2700B8492700B8492700B8492700C6502E28C95433DFECC3B5D4FBF8F4EAFBF6
+      F2E7FBF6F2E7FBF6F2E7F9F3ECE6E5BCADDBC35332E86942373A3E80CB003E80
+      CB003E80CB003E80CB003E80CB00CC533100D7593751DA5E3CDFE99D88D6F4D5
+      CACCF8EEE7D7F4D4C9CBE79881D2D0593AEABC9388FF3D546F8F3C4B5C273E80
+      CB003E80CB003E80CB003E80CB00CC533100D95A3800E4613F28E763419DE763
+      41DFE76341FAE76341DFE763419D843A263E243A549D4483CAFF3F78BAE03C4C
+      5D343E80CB003E80CB003E80CB0033150D00A4442B00E4613F00EA644200EA64
+      4200EA644200EA644200EA6442003E80CB002F6199683E7FC9FC3E80CBFF407A
+      BDE73D4E62463E80CB003E80CB00000000000000000000000000753221007532
+      21007532210075322100753221003E80CB003E80CB002A55866A3E7EC8FB3E80
+      CBFF427CBFEA3E4F635C3E80CB00000000000000000000000000000000000000
+      00000000000000000000000000003E80CB003E80CB003E80CB0023476F703E7E
+      C7FA3E80CBFF3D7ABFE83E80CB090000000200000005000000080000000C0000
+      0011000000160000001B0000001F00000024000000280000002C0000002F1C37
+      558C3D7DC5F83260958D00000008000000010000000300000004000000060000
+      00090000000B0000000E00000010000000120000001400000016000000180000
+      00191B37572A0000001600000004000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000B16743FFC281
+      4FFFD3A279FFD2A076FFBC784AFFB06642FF0000000000000000000000000000
+      00000000000000000000000000000000000000000000BF7F56FFEAC99EFFF4DF
+      C3FFF6E2C9FFF6E2C9FFF4DFC4FFE3BD90FFBB784EFF00000000000000000000
+      000000000000000000000000000000000000BA7549FFF2D9B7FFF6E2C9FFF8E7
+      CEFFBDB09BFFCCBCA3FFF7E3C6FFF6E2C9FFEFD4B2FFB56D44FF000000000000
+      000000000000000000000000000000000000E5C095FFF6E2C9FFFAEBD2FFFCF2
+      E1FF080705FF444038FFFAE7C5FFF7E1BCFFF6E2C9FFD7A777FF000000000000
+      0000000000000000000000000000BD794BFFF3DDC0FFF8E5CAFFFCEFD9FFFDF8
+      EEFF080705FF454039FFFAE9CAFFF8E1B4FFF5E0BEFFECCFAAFFB36A42FF0000
+      0000000000000000000000000000C1804EFFF6E2C9FFF9E6C5FF080705FF0807
+      05FF080705FF080705FF080705FF433B2CFFF5DBAEFFF3DBBAFFB46C42FF0000
+      0000000000000000000000000000BC784AFFF6E4CBFFF8E3C0FF443E35FF443E
+      35FF080705FF171410FF443D30FF6F6145FFF4DAADFFF0D6B4FFB46C42FF0000
+      0000000000000000000000000000B06642FFECCEA7FFF6E2C3FFF8E1B4FFF9E4
+      BEFF080705FF443D30FFF7DCA7FFF3D28DFFF5E1C4FFE3BD90FFAE6340FF0000
+      000000000000000000000000000000000000CB946AFFF6E2C9FFF6DFB9FFF6D8
+      9EFF433927FF6F5F40FFF3D088FFF5DEBBFFEADFC5FF8A7B59FF000000000000
+      000000000000000000000000000000000000AF6542FFD5A57AFFF6E2C9FFF5E0
+      C1FFF4DAADFFF4DBB0FFF5E1C4FFEADCC3FF809170FF7A7B81FF2577BFFF0000
+      0000000000000000000000000000000000000000000000000000C18256FFDEB5
+      8BFFE9CAA6FFE8C7A0FFDBAF84FFAB774FFF6B7286FF48AFDBFF3A95CBFF2462
+      A0FF00000000000000000000000000000000000000000000000000000000B46C
+      42FFB46C42FFB46C42FFB46C42FF00000000000000002B78B8FF42A4D8FF3588
+      C0FF215286FF0000000000000000000000000000000000000000000000000000
+      00000000000000000000000000000000000000000000000000002867A0FF3C9A
+      D6FF2B6DA5FF215286FF00000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000002B6D
+      A5FF3790D5FF215286FF00000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000215286FF0000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000B87248FFBF7D4DFFBC794BFFB46C45FF0000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000B87248FFDCB1
+      88FFF0D7B3FFF8E8D4FFF5E2C9FFEDD0AAFFD19C6EFFAF6441FF000000000000
+      00000000000000000000000000000000000000000000B77148FFEACAA2FFF6E2
+      C9FFF7E5CAFFF8E7CCFFF8E5C8FFF6E2C9FFF6E2C9FFD8A97BFFAF6441FF0000
+      00000000000000000000000000000000000000000000E0B88DFFF6E2C9FFF9E9
+      D0FFFCF0DDFFFCF0DDFFFBECD2FFFAE6C2FFF7E2C1FFF6E2C9FFCA9163FF0000
+      000000000000000000000000000000000000BB774AFFF3DCBDFFF7E5CAFFFCEF
+      DAFFFDF8EEFFFDF9F0FFFCF0DDFFFAE8C8FFF8E0B3FFF5E2C6FFE4BF92FFAE64
+      40FF00000000000000000000000000000000C48450FFF6E2C9FFBCAE96FF0807
+      05FF080705FF080705FF080705FF080705FF433B2CFFF5DDB5FFEACCA9FFB56D
+      42FF00000000000000000000000000000000C3834FFFF6E2C9FFCBBA9DFF443F
+      35FF444037FF444037FF443F35FF443E32FF6F6246FFF5DBB1FFEACBA9FFB46C
+      42FF00000000000000000000000000000000B66F46FFF2DABCFFF7E1BFFFF9E4
+      BBFFFAE6C2FFFAE7C4FFF9E4BCFFF7DEACFFF3D18CFFF5E0C0FFE1BA8EFFAE63
+      40FF0000000000000000000000000000000000000000DEB58DFFF6E2C9FFF6DC
+      ADFFF7DCA9FFF7DCA9FFF6D99FFFF3D18AFFF4DAACFFEADFC5FF9A8660FF0000
+      00000000000000000000000000000000000000000000B56D45FFE8C7A3FFF6E2
+      C9FFF5DCB2FFF4D69FFFF3D69EFFF5DEB9FFF6E2C9FF99A384FF7D6E6EFF2678
+      C2FF000000000000000000000000000000000000000000000000B46B43FFD6A7
+      7FFFEDD1AFFFF6E2C9FFF4DEC0FFE7C59EFF9B8C68FF7D6E6EFF51AED3FF3082
+      BEFF000000000000000000000000000000000000000000000000000000000000
+      0000B06640FFB56D42FFB46C42FFB06640FF000000002678C2FF348AC5FF42A5
+      D8FF2868A1FF0000000000000000000000000000000000000000000000000000
+      00000000000000000000000000000000000000000000000000002464A2FF3689
+      C1FF3D9BD6FF265F95FF00000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000002153
+      88FF327FBBFF3791D5FF215286FF000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000215286FF235A90FF00000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000000000FF000000FF000000FF0000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000FF0000000000000000000000000000
+      00FF00000000000000FF00000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000FF000000FF0000000000000000000000FF000000FF000000FF0000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00FF000000FF000000FF00000000000000FF00FFFFFFFFFFFFFF00FFFFFF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000000000
+      0000000000000000000000000000000000FFFFFFFFFF00FFFFFFFFFFFFFF00FF
+      FFFFFFFFFFFF00FFFFFFFFFFFFFF00FFFFFFFFFFFFFF000000FF000000000000
+      0000000000000000000000000000000000FF00FFFFFFFFFFFFFF00FFFFFFFFFF
+      FFFF00FFFFFFFFFFFFFF00FFFFFFFFFFFFFF00FFFFFF000000FF000000000000
+      0000000000000000000000000000000000FFFFFFFFFF00FFFFFFFFFFFFFF00FF
+      FFFF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF00FFFFFFFFFFFFFF00FFFFFF0000
+      00FF008484FF008484FF008484FF008484FF008484FF008484FF008484FF0084
+      84FF008484FF000000FF00000000000000FFFFFFFFFF00FFFFFF000000FF0084
+      84FF008484FF008484FF008484FF008484FF008484FF008484FF008484FF0084
+      84FF000000FF0000000000000000000000FF00FFFFFF000000FF008484FF0084
+      84FF008484FF008484FF008484FF008484FF008484FF008484FF008484FF0000
+      00FF000000000000000000000000000000FF000000FF008484FF008484FF0084
+      84FF008484FF008484FF008484FF008484FF008484FF008484FF000000FF0000
+      0000000000000000000000000000000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF0000000000000000000000FF008484FF000000FFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000
+      00FFFFFFFFFF000000FF0000000000000000000000FF008484FF000000FFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000
+      00FF000000FF000000FF0000000000000000000000FF008484FF000000FFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000
+      00FF008484FF000000FF0000000000000000000000FF008484FF000000FFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000
+      00FF008484FF000000FF0000000000000000000000FF008484FF000000FFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000
+      00FF008484FF000000FF0000000000000000000000FF008484FF000000FFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000
+      00FF008484FF000000FF0000000000000000000000FF008484FF008484FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0084
+      84FF008484FF000000FF0000000000000000000000FF008484FF008484FF0084
+      84FF008484FF008484FF008484FF008484FF008484FF008484FF008484FF0084
+      84FF008484FF000000FF0000000000000000000000FF008484FF008484FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF008484FF000000FF0000000000000000000000FF008484FF008484FF0000
+      00FF000000FF000000FF000000FF000000FF000000FFFFFFFFFFFFFFFFFF0000
+      00FF008484FF000000FF0000000000000000000000FF008484FF008484FF0000
+      00FF000000FF000000FF000000FF000000FF000000FFFFFFFFFFFFFFFFFF0000
+      00FF008484FF000000FF0000000000000000000000FF008484FF008484FF0000
+      00FF000000FF000000FF000000FF000000FF000000FFFFFFFFFFFFFFFFFF0000
+      00FF008484FF000000FF000000000000000000000000000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF00000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000
+    }
+  end
+  object CoolTranslator1: TCoolTranslator
+    POFilesFolder = 'Languages'
+    OnTranslate = CoolTranslator1Translate
+    left = 73
+    top = 232
+  end
+  object ImageListLarge: TImageList
+    Height = 32
+    Width = 32
+    left = 419
+    top = 152
+    Bitmap = {
+      4C690C0000002000000020000000000000000000000000000000E2AA4B36E2A9
+      4AA1E4AD50E0E4B059F5E4B25FFCE3B160F5E1AE5FF2DFAA5CF3DDA559F3DAA2
+      57F3D89F55F3D59C51F3D2984EF3CF924BF3CD8E49F3CA8C48F3C88A46F3C688
+      44F3C48641F3C1833DF3C0803AF4BE8038F7B97631F9AD6725FAA65E1FBCA55D
+      203F000000000000000000000000000000000000000000000000E3AB4E37E3AB
+      4CA4E6B055E3E8B761F6E8BA68FDE8BB6AF8E7B96AF5E5B365F6E3AF61F6DFAC
+      5EF6DDA85CF6DBA558F6D9A155F6D69C51F6D4994EF6D2964CF6D09449F6CE92
+      46F6CC8F42F6C98B3FF6C88A3BF7C88B3AF9C28031FBB26C25FBAA621FBDAA61
+      203F000000000000000000000000000000000000000000000000E4AE5039E5AE
+      51AAE9B45CEAEFC371F8F2CA7CFEF2CC7EFDF0CB7DFCEEC476FCECC070FCEABD
+      6CFCE8BA69FCE7B765FCE5B361FCE2B05DFCE1AD58FCE0AA53FCDEA54EFCDCA3
+      49FCDA9F45FCD79C40FCD99C3DFCDCA03CFDD29234FEBB7626FEAF681EBEAF67
+      1F40000000000000000000000000000000000000000000000000E6B05334E4AE
+      509BE8B45CD7EDC172E8F0C97FF4F1CF87FBF0CF88FFF0CB82FFEFC77DFFEDC4
+      79FFEBC176FFEABE73FFE8BB6FFFE6B86BFFE4B566FFE3B262FFE1AE5DFFDFAB
+      59FFDDA755FFDBA451FFDBA34DFFDBA349FED2963DF8BB7628EDAF671DADAF69
+      1E3A000000000000000000000000000000000000000000000000EBB04E27E5AA
+      4976E4AC52AAE1AE61C5E1B570DEE2BF82F4E5C48BFFE9C68BFFEAC489FFE8C1
+      86FFE5BE83FFE4BB82FFE2B880FFDFB67EFFDDB47BFFDAB178FFD8AD75FFD6A9
+      73FFD4A670FFD2A36EFFCE9E68FEC89662FCC08852E9AF6C2FC8A55B1A89A65E
+      1B2E000000000000000000000000000000000000000000000000EAAD4719E6A8
+      444ADFA44C71D7A2588DD7AE75B4DABD95E6E0C7A4FFEAD0AAFFEED2ABFFECCF
+      A9FFE9CDA7FFE9CBA7FFE7C9A6FFE5C8A5FFE3C6A4FFE0C4A2FFDFC1A1FFDDBE
+      A0FFDBBC9EFFDAB99DFFD2B095FBC3A088F2B98E73D0AB6D4295A0531659A155
+      191E000000000000000000000000000000000000000000000000FFBF3F08E0A3
+      4719DAAA5B2ACDA06A3ED3BBA575D9CCC8D1E2D8D4FFF2E9DFFFF9F0E3FFF9EF
+      E2FFF8EEE2FFF8EEE2FFF7EDE1FFF6EDE1FFF6ECE1FFF5EBE0FFF4EAE0FFF4E9
+      DFFFF3E9DFFFF3E8DEFFE8DCD6F5D0C2C4E1C1AFB1ABB6917F54A155191E994C
+      190A000000000000000000000000000000000000000000000000000000000000
+      0000CCCCCC05B4A5A511CCC3CF51D2CCD8C5DBDAE2FFEBF3F6FFEBFDFFFFDFFB
+      FFFFD6F9FFFFD3F8FFFFD2F8FEFFD3F7FEFFD4F6FEFFD4F6FEFFD3F5FEFFD1F5
+      FEFFD2F4FDFFD6F2FBFFD4E7F1F0CBCDDAD3C4BECE93C5C0D031000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00007F7F7F02AAAAAA06C4B9BD46C6BBBFC1CBCDCFFFD4EEEFFFC4FAFFFF9EF2
+      FEFF85ECFEFF7AEAFEFF77E9FDFF7CE6FCFF7FE5FBFF7EE3FBFF7BE1FBFF75E0
+      FDFF78DDFAFF83D9F2FF93CDE1EDAEB8C4C8BFAAB288C0AAB52D000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000BEB0B037BDAEAFA4BDC1C1E4BBE1E5F6AAEFF7FF89EC
+      FCFF68E7FEFF47E1FDFF38DDFCFF3DDAFCFF3FD8FBFF3ED6FBFF3BD4FBFF35D2
+      FDFF40CDF5FF5AC4E4FF74BAD2E29CACB8A6BEA0A266BB9DA522000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000B8A2AA24B4A1A66DAAB3B9AD9ECCD4E49DDCE6FFA0E9
+      F7FF7FE9FEFF3ADDFDFF17D5FDFF16D1FDFF15CFFDFF15CFFEFF14CDFEFF12CB
+      FEFF29C2F0FF59B3D2FF77AAC0CF92A6B46EC2A0A02ECCAAAA0F000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000B299A514A88F9C3E9CA7AF7791B9C2BF96C7D2EAA4D9
+      E6F889DFF2FF44D9F8FF1AD4FCFF09D0FEFF02CDFEFF05CAFDFF0EC6F8FF1CBE
+      EFFF36B4DEF361A8C3DB7D9FB2A0879EAD42C891910ECC999905000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000B6919107AA919D159F9BA3409AA2AA8797ACB7C095BC
+      C9EA86C8DAFF66D5EEFF41D9FAFF16D5FDFF05D0FDFF0FC9F9FF29BDE9FF54AD
+      CEFF6EA3BCDB81A0B2929399A555929AA221CC9999057F7F7F02000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000A08D971BA28C95509999A28591A9
+      B5B883B8C8DD6FC8DFF44ED2EFFF1AD3FAFF0DCCF6FD27BEE7F948B2D5E973A2
+      BACF9098A89D9F969F53BD919123AA94940C0000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000AA8D8D09A08D971BA19398399F9A
+      9F6381A7B49A5EB2C9DD3FBDDCFF15CAF3FF1AC5EEF852ABC7EC749EB1BE829C
+      AE6F9599A73AA199A11EBF94940CBF7F7F040000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000AE867813B17F
+      7A387D92A17855A1BCD23AB0D1FF14C4F0FF21BFE8F6669FB4E58E8D96A8958D
+      953FBF9F9F08AAAAAA0300000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000A1786B139F71
+      7138778A9B78579BB8D23DABCFFF16C1EFFF20BCE7F65F99AEE584858EA88985
+      8D3F9F7F7F08AA55550300000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000717171097A717A1BA5868639C195
+      9063969EA89A60A7C4DD3DB2D9FF16C4F3FF22C0E9F868A5B8EC92949DBE9E90
+      956FAF8C883AA17F7F1E7F7F7F0C7F7F7F040000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000007A717A1B7C6F7950A88B8B85DAAD
+      A4B8BDBCBDDD6EC1DCF43AC6F0FF14CBFAFF2AC8EFFD7EBECEF9ACB0B5E9B19B
+      9BCFB18D8B9D9F8487537B7B7B237F6A7F0C0000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000006D6D6D076D616D158F7F8340A08D8F87B9A4A3C0DCC3
+      BBEABECFD2FF68CFEDFF2ECEFCFF10CEFEFF29CDF6FF7ACDE2FFAAC2C9FFB9AB
+      ACFFBB9C99DBA78D8D92907E81558B737B21666666057F7F7F02000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000007266661473626A3EA08B8B77C8ADA9BFD3C5C1EAD3E0
+      DEF8A7E4F0FF4ED3F9FF19CBFEFF09CBFFFF1ECEFBFF5BD4F1FF91D1E0FFC0C8
+      C9FFCBB5B1F3AD9593DB9A8182A0927B7F426D6D6D0E66666605000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000008D7878248E74776DA69696ADC7C0BEE4C4D6DAFFA6E4
+      F2FF75E3FFFF32D1FFFF0DC8FFFF07CAFFFF16CEFDFF39D6FAFF65D8F0FF99D7
+      E1FFAFC4C6FFA7A0A1FFA08B8BCF927D7F6E7969692E8877770F000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000A6868137A78782A4AA9F9FE4AFCED6F691DDF3FF52D3
+      FBFF28CCFFFF13C8FEFF09C7FEFF0ACBFEFF0FCEFEFF16D3FDFF27D6F9FF44D9
+      F4FF69CDDDFF97B1B6FFA59999E2907C7FA67F6469667F696922000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00007F7F7F026D486D079C8A8E46A19192C197A6AEFF83D2E4FF5ADDFFFF1ECB
+      FFFF01C3FFFF02C7FEFF05CAFEFF09CFFEFF08D2FEFF03D5FFFF06D9FEFF13DE
+      FEFF38D8EEFF76C6D0FF90ACB1ED848289C87F6770888266712D000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00006D484807664C6614818A99538499AAC66EABC1FF40CBEBFF1ED6FFFF0ACC
+      FFFF00C9FFFF01CEFFFF02D2FFFF03D6FFFF03D9FFFF01DCFFFF02E0FFFF06E7
+      FFFF1CE5F9FF44DDEFFF5FC1D2F1718C9CD57C6B7C957A6B7A32000000000000
+      0000000000000000000000000000000000000000000000000000E2AA3809E0AD
+      4719C693442DB17F4D42938D7E79829AA0D365A8B9FF32BED7FF1AC7E5FF1BC2
+      E4FF1CC2E3FF1BC5E2FF1BC9E2FF1ACBE2FF19CDE1FF19CFE1FF18D2E1FF18D7
+      E1FF21D9E1FF36D6E1FF4EBDC8F66F8890E485696CAE8D6351559C52181F994C
+      190A000000000000000000000000000000000000000000000000E1A6441AE0A7
+      434CD79C4474CA904491B1905CB896967DE87D9F94FF5BABA8FF4DB0B0FF52AD
+      ADFF54ADAAFF52ADA8FF50AEA7FF4EAEA7FF4CAEA6FF4AAEA5FF49AEA4FF47B0
+      A4FF47B2A5FF4BB3A7FF5CA194FB7D7A6AF592644CD3985A2E989D53165C9C52
+      181F000000000000000000000000000000000000000000000000E5AC4C28E3AB
+      4877E0A84EADDBA756C8CDA564E1B9A878F5A7AB86FF93AE8EFF8CAF90FF92AE
+      8CFF94AD88FF92AB85FF90A983FF8EA881FF8CA67FFF8AA57DFF89A37BFF86A3
+      7AFF83A37AFF7EA47BFF879A6FFEA08556FEAB7440ECA86529CBA65D1B8BA25C
+      1B2F000000000000000000000000000000000000000000000000E6B05334E6B0
+      529BE8B55ED8EEC274E9EDC883F5E7CD8BFCE2CD8DFFDBC988FFD9C684FFDBC3
+      81FFDBC27DFFDBBF79FFDABC76FFD9B972FFD9B76EFFD8B46AFFD8B266FFD6B0
+      62FFD4AD5FFFD0AB5CFFD2A958FFD9A751FFD29843F9BD7A2EEEB26923AEB469
+      233A000000000000000000000000000000000000000000000000E4AE5039E7AF
+      52AAEAB85EEAF2C676F8F5CE82FEF6D285FDF7D181FCF6CA77FCF6C571FCF5C2
+      6FFCF4C06BFCF4BC67FCF3B864FCF2B55FFCF2B25BFCF1AF57FCF1AC51FCEFA8
+      4DFCEDA448FCEAA045FCE8A143FCE7A844FDD89A3CFEBF7A2BFEB26A22BEB36B
+      2340000000000000000000000000000000000000000000000000E3AB4E37E4AB
+      4DA4E7B155E3E9B761F6E9B965FDE9B965F8E9B761F5E6B15CF6E5AD58F6E1AA
+      56F6DFA652F6DEA24FF6DC9E4CF6DA9B49F6D89846F6D69543F6D5913FF6D28E
+      3CF6CF8939F6CC8635F6CB8532F7C98730F9C17C2BFBB26A22FBAA611DBDAA61
+      203F000000000000000000000000000000000000000000000000E2AA4B36E2A9
+      4AA1E4AD4FE0E4AF56F5E3AF58FCE2AC55F5E0A851F2DDA44DF3DBA04AF3D89D
+      48F3D59946F3D29543F3D09040F3CD8D3DF3CB8A3BF3C88738F3C68335F3C380
+      32F3C07B30F3BC782DF3BC7629F4BA7526F7B56E22F9AB621DFAA55C1BBCA55D
+      1C3F000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000001000000030000000400000
+      0040000000400000004000000040000000400000004000000040000000400000
+      0040000000400000004000000040000000400000003000000010000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000000000300000008F000000BF0000
+      00BF000000BF000000BF000000BF000000BF000000BF000000BF000000BF0000
+      00BF000000BF000000BF000000BF000000BF0000008F00000030000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000000000000000000040000000BF000000FF0000
+      00FF101010FF303030FF404040FF404040FF404040FF404040FF404040FF4040
+      40FF404040FF404040FF303030FF101010FF000000BF00000040000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000000000000000000040000000BF000000FF0000
+      00FF303030FF8F8F8FFFBFBFBFFFBFBFBFFFBFBFBFFFBFBFBFFFBFBFBFFFBFBF
+      BFFFBFBFBFFFBFBFBFFF8F8F8FFF303030FF000000BF00000040000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000000000000000000040000000BF000808FF0019
+      19FF304949FF8F9898FFCFCFCFFFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFBFBFBFFF404040FF000000BF00000040000000000000
+      0000000000000000000000000000000000007F00001084000030840000307F00
+      00100000000000000000000000000000000000000040000000BF001919FF004A
+      4AFF105A5AFF304949FF707070FFCFCFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFBFBFBFFF404040FF000000BF00000040000000000000
+      000000000000000000000000000000000000840000308300008F8300008F8400
+      00300000000000000000000000000000000000000040000000BF002121FF0063
+      63FF006B6BFF003A3AFF304949FF8F9898FFCFCFCFFFEFEFEFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFBFBFBFFF404040FF000000BF00000040000000000000
+      000000000000000000007F0000108400003084000070830000CF840000BF8300
+      00400000000000000000000000000000000000000040000000BF002121FF0063
+      63FF007C7CFF006B6BFF105A5AFF304949FF707070FFCFCFCFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFBFBFBFFF404040FF000000BF00000040000000000000
+      00000000000000000000840000308300008F830000CF840000EF840000BF8300
+      00400000000000000000000000000000000000000040000000BF002121FF0063
+      63FF008484FF008484FF006B6BFF003A3AFF304949FF8F9898FFCFCFCFFFEFEF
+      EFFFFFFFFFFFFFFFFFFFBFBFBFFF404040FF000000BF00000040000000000000
+      00007F0000108400003084000070830000CF840000FF840000FF830000CF8400
+      00708300004083000040830000400000000000000040000000BF002121FF0063
+      63FF008484FF008484FF007C7CFF006B6BFF105A5AFF304949FF707070FFCFCF
+      CFFFFFFFFFFFFFFFFFFFBFBFBFFF404040FF000000BF00000040000000000000
+      0000840000308300008F830000CF840000EF840000FF840000FF840000EF8300
+      00CF840000BF840000BF840000BF0000000000000040000000BF002121FF0063
+      63FF008484FF008484FF008484FF008484FF006363FF002121FF404040FFBFBF
+      BFFFFFFFFFFFFFFFFFFFBFBFBFFF404040FF000000BF000000407F0000108400
+      003084000070830000CF840000FF840000FF840000FF840000FF840000FF8400
+      00FF840000FF840000FF840000FF0000000000000040000000BF002121FF0063
+      63FF008484FF008484FF008484FF008484FF006363FF002121FF404040FFBFBF
+      BFFFFFFFFFFFFFFFFFFFBFBFBFFF404040FF000000BF00000040840000308300
+      008F830000CF840000EF840000FF840000FF840000FF840000FF840000FF8400
+      00FF840000FF840000FF840000FF0000000000000040000000BF002121FF0063
+      63FF008484FF008484FF008484FF008484FF006363FF002121FF404040FFBFBF
+      BFFFFFFFFFFFFFFFFFFFBFBFBFFF404040FF000000BF00000040840000308300
+      008F830000CF840000EF840000FF840000FF840000FF840000FF840000FF8400
+      00FF840000FF840000FF840000FF0000000000000040000000BF002121FF0063
+      63FF008484FF008484FF008484FF008484FF006363FF002121FF404040FFBFBF
+      BFFFFFFFFFFFFFFFFFFFBFBFBFFF404040FF000000BF000000407F0000108400
+      003084000070830000CF840000FF840000FF840000FF840000FF840000FF8400
+      00FF840000FF840000FF840000FF0000000000000040000000BF002121FF0063
+      63FF008484FF008484FF008484FF008484FF006363FF002121FF404040FFBFBF
+      BFFFFFFFFFFFFFFFFFFFBFBFBFFF404040FF000000BF00000040000000000000
+      0000840000308300008F830000CF840000EF840000FF840000FF840000EF8300
+      00CF840000BF840000BF840000BF0000000000000040000000BF002121FF0063
+      63FF008484FF008484FF008484FF008484FF006363FF002121FF404040FFBFBF
+      BFFFFFFFFFFFFFFFFFFFBFBFBFFF404040FF000000BF00000040000000000000
+      00007F0000108400003084000070830000CF840000FF840000FF830000CF8400
+      00708300004083000040830000400000000000000040000000BF002121FF0063
+      63FF008484FF008484FF007C7CFF006B6BFF004A4AFF001919FF404040FFBFBF
+      BFFFFFFFFFFFFFFFFFFFBFBFBFFF404040FF000000BF00000040000000000000
+      00000000000000000000840000308300008F830000CF840000EF840000BF8300
+      00400000000000000000000000000000000000000040000000BF002121FF0063
+      63FF008484FF008484FF006B6BFF003A3AFF001919FF000808FF404040FFBFBF
+      BFFFFFFFFFFFFFFFFFFFBFBFBFFF404040FF000000BF00000040000000000000
+      000000000000000000007F0000108400003084000070830000CF840000BF8300
+      00400000000000000000000000000000000000000040000000BF002121FF0063
+      63FF008484FF008484FF006B6BFF003A3AFF001919FF000808FF404040FFBFBF
+      BFFFFFFFFFFFFFFFFFFFBFBFBFFF404040FF000000BF00000040000000000000
+      000000000000000000000000000000000000840000308300008F8300008F8400
+      00300000000000000000000000000000000000000040000000BF002121FF0063
+      63FF008484FF008484FF007C7CFF006B6BFF004A4AFF001919FF404040FFBFBF
+      BFFFFFFFFFFFFFFFFFFFBFBFBFFF404040FF000000BF00000040000000000000
+      0000000000000000000000000000000000007F00001084000030840000307F00
+      00100000000000000000000000000000004000000070000000CF002121FF0063
+      63FF008484FF008484FF008484FF008484FF006363FF002121FF303030FF8F8F
+      8FFFBFBFBFFFBFBFBFFF8F8F8FFF303030FF000000CF00000070000000400000
+      0040000000400000004000000040000000400000003000000010000000000000
+      0000000000000000000000000000000000BF000000CF000000EF002121FF0063
+      63FF008484FF008484FF008484FF008484FF006363FF002121FF101010FF3030
+      30FF404040FF404040FF303030FF101010FF000000EF000000CF000000BF0000
+      00BF000000BF000000BF000000BF000000BF0000008F00000030000000000000
+      0000000000000000000000000000000000BF000000BF000000BF001E1ECF004E
+      4EEF006B6BFF007C7CFF008484FF008484FF006363FF002121FF000000EF0000
+      00CF000000BF000000BF000000BF000000BF000000BF000000BF000000BF0000
+      00BF000000BF000000BF000000BF000000BF0000008F00000030000000000000
+      000000000000000000000000000000000040000000400000004000121270001E
+      1ECF003A3AFF006B6BFF008484FF008484FF006363FF002121FF000000CF0000
+      0070000000400000004000000040000000400000004000000040000000400000
+      0040000000400000004000000040000000400000003000000010000000000000
+      0000000000000000000000000000000000000000000000000000000000300000
+      008F001E1ECF004E4EEF006B6BFF007C7CFF006363FF002121FF000000BF0000
+      0040000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000100000
+      003000121270001E1ECF003A3AFF006B6BFF006363FF002121FF000000BF0000
+      0040000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000300000008F001E1ECF004E4EEF004A4AFF001919FF000000BF0000
+      0040000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000100000003000121270001E1ECF001919FF000808FF000000BF0000
+      0040000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000300000008F000000CF000000EF000000BF0000
+      0040000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000100000003000000070000000CF000000BF0000
+      0040000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000000000000000000040000000BF000000BF0000
+      0040000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000BF7F3F10C4844530C3834340C3834340C7874B40D397
+      6340D79B6B40D7976740D7976740D3936340D3936340D7976740CB8F5B40BB7F
+      4740B3773B40AF773B40AF7A3A30AF7F3F100000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000C4844530C583438FC48444BFC28242BFC8894DBFD296
+      62BFD89A6CBFD69869BFD69666BFD59564BFD59564BFD69666BFCD8E5DBFBA80
+      46BFB2793CBFB1783ABFB2793A8FAF7A3A300000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000BF7F3F10C4844530C8884B70CB8B50CFCC8F56FFCE955FFFD39F6EFFDDAD
+      83FFE1B38EFFE1B18EFFE0B08DFFE0AF8BFFDFAF8AFFE0AE8AFFD8A77EFFC998
+      68FFBF8C57FFB9834AFFB67D42CFAF783D70A46F3530AF6F2F10000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000C4844530C583438FCB8B4ECFD39662EFDBA579FFE3BA97FFEACBB1FFF0DA
+      C6FFF4E2D2FFF4E3D7FFF5E4D8FFF5E4D8FFF4E2D5FFF3DFCFFFEED6C1FFE6C7
+      AAFFDAB28CFFCA9967FFBC864DEFAE783DCFA76E338FAA6F3530000000000000
+      0000000000000000000000000000000000000000000000000000BF7F3F10C484
+      4530C88A4F70CC9057CFD39B67FFDEAE86FFE9BFA1FFF1D0B9FFF7DBCAFFFAE1
+      D3FFFDE3D6FFFEE1D5FFFFE0D4FFFFE0D4FFFEE0D4FFFCE1D3FFF9DECEFFF5D8
+      C4FFEBCAAFFFDCB590FFCB9F71FFBA8954FFB07B42CFAA743870A46A2A309F6F
+      2F10000000000000000000000000000000000000000000000000C4844530C483
+      438FCB9057CFD8A477EFE3B996FFEED3BDFFF6DDCCFFF8D7C6FFFACEBBFFFAC2
+      AAFFFCB699FFFDAA89FFFEA480FFFEA37FFFFDA887FFFAB496FFF8BFA5FFF6CB
+      B5FFF4D3C0FFEFD7C3FFE4CAAEFFD1AA7FFFC0905BEFAE783DCFA46A2A8FA46A
+      2A3000000000000000000000000000000000BF7F3F10C4844530C6884B70CA8B
+      4ECFD29B68FFE3B997FFEFD0B9FFF7DFD0FFFCDDCDFFFCC7B0FFFCB99DFFFBB1
+      92FFFCAB89FFFDA582FFFEA37EFFFEA37FFFFDA886FFFAB294FFF9B99FFFF8BF
+      A6FFF8C9B5FFF8DACAFFF1D9C5FFE3C4A5FFCFA87DFFB6844DFFA77134CFA16D
+      2F709A6425309F5F2F100000000000000000C4844530C483458FCA8B51CFD296
+      63EFDEAE86FFEED3BDFFF8DFD0FFFAD2C0FFFBBEA2FFFD9F78FFFE9A70FFFEAD
+      8BFFFEC0A5FFFED1BFFFFFDCCEFFFFDED2FFFEDFD2FFFDDCCEFFFCCEBAFFFAB4
+      95FFF8AE8EFFF6BDA4FFF3CCB6FFF0D8C4FFE0C7ABFFC3996BFFAE7C44EFA16D
+      31CF9963278F9A642A300000000000000000C3834340C48444BFCB8F56FFDAA5
+      79FFE8BFA0FFF5DDCCFFFCDCCCFFFCBDA2FFFCA37DFFFE8C5EFFFF9468FFFFBA
+      9CFFFFD4C1FFFFE3D8FFFFE9E0FFFFE5DAFFFEE3D8FFFDE3D7FFFDD7C6FFFCBD
+      A2FFF9AE8DFFF6A987FFF4B79AFFF5D6C4FFEAD3BEFFD1AE88FFB98D5BFFA271
+      37FF966225BF976327400000000000000000C3833F40C48242BFCE965EFFE1BA
+      95FFEFD0B7FFF7D6C5FFFBC6AFFFFD9E76FFFE8C5CFFFF8F61FFFFA884FFFFD7
+      C5FFFFE7DDFFFFDACBFFFFCAB5FFFEB699FFFDB597FFFCC7B0FFFCD4C2FFFDDA
+      CCFFFBC9B2FFF79D74FFF39A6FFFF1BEA5FFEBCBB6FFDFC1A5FFC8A47EFFA476
+      41FF925E22BF935F23400000000000000000C7834340C88244BFD29B67FFE8CA
+      ACFFF5DBC7FFF9CDB8FFFBB394FFFE8B5BFFFF7F49FFFF8C5DFFFFA985FFFFD5
+      C2FFFFDCCDFFFFC0A5FFFEA782FFFD9164FFFB9367FFF9AD8BFFFAC9B4FFFDE8
+      DFFFFCD8C8FFF59A6FFFF08959FFEAA787FFE8BDA6FFE9CDB9FFD2B79AFFA47A
+      49FF8C5C21BF8B5B1F400000000000000000CB834740CE8249BFD99E70FFEED5
+      BFFFFAE0D0FFFAC0A7FFFBA27CFFFE8451FFFF7A42FFFF8450FFFF986AFFFFB4
+      93FFFFB391FFFE9364FFFD7F49FFFA763DFFF87D47FFF59469FFF7B69BFFFCE5
+      DBFFFBDDD0FFF19F7AFFE98658FFE1906BFFE2AA8FFFEED3C4FFD7C4AFFFA17B
+      4FFF855820BF83571F400000000000000000CF834B40D0824DBFDCA176FFF2DC
+      CBFFFDE2D4FFFCB495FFFC9265FFFE7D47FFFF753BFFFF7B42FFFF8651FFFF96
+      67FFFE9160FFFD773CFFFB6C2EFFF87034FFF6804BFFF59C76FFF7BDA4FFFBE1
+      D7FFF6D4C6FFE89670FFDD7848FFD47A4FFFDA997AFFEFD6C9FFDBCCBCFFA07B
+      53FF81521EBF7F531F400000000000000000CB834F40CE844EBFDBA279FFF3DF
+      D0FFFEE0D3FFFDA782FFFD8450FFFE773DFFFF7134FFFF7134FFFF7438FFFE79
+      3EFFFD763AFFFA6C2CFFF86F32FFF67F4AFFF69D74FFF9C7B1FFFADDD0FFF8DE
+      D2FFEDBEA9FFD97D52FFCC5F2BFFC56332FFD08A67FFEED5C8FFDECFC2FFA178
+      54FF824D1DBF834F1B400000000000000000CB834F40CD844DBFDAA279FFF3E0
+      D2FFFEDFD2FFFC9F78FFFC7B44FFFD7236FFFD6D2EFFFD6B2BFFFD6929FFFB68
+      27FFF96929FFF76C2DFFF77D47FFF79D75FFF7BCA0FFF9D9CAFFF6DBCEFFEDC2
+      ADFFDF9C7CFFCC6939FFC0511BFFBC5622FFCB825CFFEDD5C8FFDFD1C5FFA177
+      54FF814A1CBF834B1B400000000000000000CB7F4B40CD8249BFDAA176FFF3DF
+      D1FFFDDED1FFFB9C75FFF97841FFFA6F32FFFA692AFFF96828FFF86626FFF563
+      23FFF46A2CFFF3773EFFF6976CFFFACAB4FFFADDD1FFF6D2C2FFEBB89FFFDA8D
+      68FFCB6E3FFFC05824FFB9501AFFB95521FFCA815BFFECD4C7FFDED1C4FFA076
+      53FF80491ABF7F471B400000000000000000CB7F4740CD8146BFDA9F74FFF2DD
+      CDFFFCDDD0FFF8A07BFFF57B47FFF56D31FFF46526FFF26424FFF06222FFED5F
+      1FFFED6B2FFFEF8350FFF4AB88FFFCE2D7FFF9E7E0FFEDBAA2FFDD906AFFCB6A
+      38FFBF541DFFB94F18FFB7511CFFBA5B29FFCC8762FFECD4C7FFDCCEC1FF9E74
+      52FF7D461ABF7F471B400000000000000000CB7F4340CD8045BFD99D71FFF1D9
+      C6FFF9DDCFFFF3A98AFFEE8456FFED6E34FFEB6122FFE75F20FFE55D1EFFE25B
+      1CFFE46C33FFEB9063FFF3B89CFFFBE7DEFFF4D9CDFFDE8F69FFCC642FFFC257
+      1EFFBA4F16FFB64D15FFB85621FFBF683AFFD19271FFEBD3C6FFD9C8BAFF9B70
+      4FFF7C4419BF7B4317400000000000000000C77F4340C67D42BFD4996AFFECD1
+      BAFFF6DACAFFF0B59AFFEB916AFFE77038FFE35E1EFFDF5B1DFFDC591BFFDA58
+      19FFDD6930FFE58D62FFECB193FFF4D6C7FFEBC2ADFFD27445FFC14E12FFBB4D
+      11FFB74C12FFB54C13FFBA5C28FFC77B53FFD6A186FFE7D0C2FFD0BDADFF916A
+      49FF714116BF734313400000000000000000BB7B3F40BA7A3DBFC99361FFE4C5
+      A8FFF1D5C1FFEFC2ADFFEAA281FFE3733DFFDE5B1BFFDA581AFFD75618FFD555
+      16FFD76227FFDC7C4BFFE1956EFFE7AF92FFDFA180FFC96936FFBC4D11FFB74C
+      12FFB54B12FFB54B12FFBE6331FFD09272FFDBB49FFFE0C9B9FFC2AE98FF8063
+      3EFF603D10BF5F3F0F400000000000000000B3773B40B57939BFC28C56FFDCB4
+      8FFFEBC9B0FFEFCDBBFFEBB79DFFE28658FFDA672EFFD55B1EFFD05415FFCF53
+      14FFD16025FFD77A4AFFDE946EFFE6AF92FFDEA080FFC66836FFB84B11FFB54B
+      12FFB74F19FFBB5A26FFC7794FFFDAAC94FFDEC1B1FFD2B8A5FFAE957AFF7158
+      32FF543A0DBF533B0B400000000000000000B7773740B67835BFBF8449FFD39D
+      6EFFE3B897FFF0D6C4FFF0D0BEFFE3A788FFD98257FFD0622AFFC95114FFC650
+      13FFCA632CFFD6895FFFE3AF93FFF1D5C7FFE8C1ADFFC77145FFB64A11FFB64A
+      11FFBC5A26FFC77951FFD69F82FFE6CABBFFDDCABCFFBB9E86FF937454FF644B
+      25FF4D360DBF4B370B400000000000000000B97A3530B777338FBD7E40CFC88A
+      53EFD6A378FFE8CBB1FFEED5C2FFE7C1ABFFDFA486FFD47E52FFCB6733FFC65F
+      28FFC86836FFD1855CFFDCA385FFE9C4B1FFE2B59EFFC8764BFFBB5A27FFBF62
+      31FFC77950FFD59F82FFDEBBA7FFE2CDBFFFCCB9A8FF9D7F62FF795935EF5B42
+      1CCF49330E8F4A350A300000000000000000BF7F2F10B4743530B8783870BB79
+      39CFC58B53FFD9AC82FFE6C4A7FFEED4C2FFECCDBCFFE1AF95FFD79572FFCE7E
+      54FFC97143FFC86E3FFFCA7144FFCE7B52FFCD7D54FFC7754AFFC87D54FFD093
+      72FFDAAC95FFE5CABBFFE1CCBFFFCDB5A1FFA99075FF765C39FF5B4119CF543B
+      14704A350F304F2F0F1000000000000000000000000000000000B46F2A30B470
+      2A8FBA7D3ECFC7925EEFD4A981FFE3C7ADFFE8D0BDFFE4C4B0FFDFB69EFFDAA4
+      87FFD59573FFD28862FFD08159FFD08159FFD18761FFD39573FFD6A487FFDBB5
+      A0FFDEC2B1FFDDCABDFFCCB9A9FFAA9075FF876C4AEF614822CF4931088F4A2F
+      0A30000000000000000000000000000000000000000000000000AF6F2F10B46F
+      2A30AF743670B07840CFB78450FFC6986DFFD3AB89FFDCBDA3FFE4C9B6FFE9D1
+      C1FFEDD4C6FFEED4C6FFEFD4C6FFEFD4C6FFEED4C6FFEBD4C6FFE7D0C2FFE0C9
+      B9FFD3B9A6FFBEA189FF9F8265FF775D3AFF604821CF563F19704A2F0A304F2F
+      0F10000000000000000000000000000000000000000000000000000000000000
+      00009F6A2A30A2692C8FA77036CFB07A46EFBA8B5DFFC4A27FFFCEB49AFFD7C2
+      ADFFDDCBBAFFDECFC1FFDFD0C4FFDED0C4FFDCCDC0FFD8C8BAFFD0BDADFFC2AE
+      98FFAF967CFF967757FF7B5B38EF5B421BCF4731088F4A2F0A30000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00009F6F2F109F6A2A309D6B2F709D6C34CF9D703AFF9C7443FF9E7749FFA278
+      4AFFA4784DFFA27852FFA07654FF9F7553FF9D7351FF99714EFF916B48FF8163
+      3DFF725933FF654C26FF5C431DCF543D1470452F0A304F2F0F10000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000008F642A309263298F8E6228BF885D25BF865820BF8652
+      19BF864E16BF844C1ABF81491CBF7E481ABF7D4619BF7A4518BF714215BF603E
+      10BF543A0EBF4D360DBF49330E8F4A350A300000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000008F5F2F108F642A308F632740875B234087571F408753
+      1740874F1740834B1B407F471B407F471B407B4717407B4317406F4313405F3F
+      0F40533B0F404B370B404A350F304F2F0F100000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00002F9F6F10359A6430359A64302F9F6F1000000000000000006FCF9F1064C9
+      9A304BBF7F401BA74B40009733400097334000973340009733400B973F402797
+      5740359A64302F9F6F1000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000359A6A303399678F3399678F359A6A3000000000000000006AC99A3067CD
+      998F4DBE80BF1AA64DBF009932BF009932BF009932BF009932BF0D9940BF2699
+      59BF3399678F359A6A3000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000027975B40269959BF27995BCF2B985F70279757400B973F402DAF5D7047BC
+      79CF3AB66DFF14A347FF009933FF009933FF009933FF009933FF0D9940FF2699
+      59FF329966CF34986670359A64302F9F6F100000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000B973F400D9940BF149947EF279859CF269959BF0D9940BF089D3BCF14A3
+      47EF13A346FF079C3AFF009933FF009933FF009933FF009933FF0D9940FF2699
+      59FF339966EF339866CF3399678F359A6A300000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000973340009932BF0A993DFF1D9950FF1D9950FF0A993DFF009933FF0099
+      33FF079C3AFF13A346FF14A347EF089D3BCF009932BF009932BF139D47CF33A3
+      66EF3AA36DFF2D9C60FF2B9D5ECF42AD767064C99A306FCF9F10000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000973340009932BF039936FF0A993DFF0A993DFF039936FF009933FF0099
+      33FF14A347FF3AB66DFF47BC79CF2DAF5D70009733400097334034AF667052BC
+      86CF47B67AFF20A353FF1EA352EF4BBC7ECF67CD998F6AC99A30000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000973340009932BF009933FF009933FF009933FF009933FF039936FF0A99
+      3DFF1EA352EF4BBC7ECF67CD998F6AC99A3000000000000000006AC99A3067CD
+      998F4EC082CF29AD5CEF27AC5AFF40B973FF4DC080BF4FBF7F40000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000973340009932BF009933FF009933FF009933FF009933FF0A993DFF1D99
+      50FF2B9D5ECF42AD767064C99A306FCF9F1000000000000000006FCF9F1064C9
+      9A3058C38A704EC082CF40B973FF27AC5AFF19A64CBF1BA34B40000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000973340009932BF009933FF009933FF009933FF009933FF0A993DFF1D99
+      50FF27995BCF2B985F70359A64302F9F6F100000000000000000000000000000
+      00006AC99A3067CD998F4DBE80BF1AA64DBF0099338F009A3530000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000973340009932BF009933FF009933FF009933FF009933FF039936FF0A99
+      3DFF149947EF279859CF3399678F359A6A300000000000000000000000000000
+      00006FCF9F1064C99A304BBF7F401BA74B40009A3530009F2F10000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000009A35300099338F009932BF009932BF009932BF009932BF009932BF0099
+      32BF0D9940BF269959BF3399678F359A6A300000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000009F2F10009A353000973340009733400097334000973340009733400097
+      33400B973F4027975740359A64302F9F6F100000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000002F9F6F10359A6430279757400B973F40009733400097
+      334000973340009733400097334000973340009A3530009F2F10000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000359A6A303399678F269959BF0D9940BF009932BF0099
+      32BF009932BF009932BF009932BF009932BF0099338F009A3530000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000009F2F10009A35301BA74B404BBF7F4064C99A306FCF9F10000000000000
+      00000000000000000000359A6A303399678F279859CF149947EF0A993DFF0399
+      36FF009933FF009933FF009933FF009933FF009932BF00973340000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000009A35300099338F1AA64DBF4DBE80BF67CD998F6AC99A30000000000000
+      000000000000000000002F9F6F10359A64302B985F7027995BCF1D9950FF0A99
+      3DFF009933FF009933FF009933FF009933FF009932BF00973340000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00001BA34B4019A64CBF27AC5AFF40B973FF4EC082CF58C38A7064C99A306FCF
+      9F1000000000000000006FCF9F1064C99A3042AD76702B9D5ECF1D9950FF0A99
+      3DFF009933FF009933FF009933FF009933FF009932BF00973340000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00004FBF7F404DC080BF40B973FF27AC5AFF29AD5CEF4EC082CF67CD998F6AC9
+      9A3000000000000000006AC99A3067CD998F4BBC7ECF1EA352EF0A993DFF0399
+      36FF009933FF009933FF009933FF009933FF009932BF00973340000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00006AC99A3067CD998F4BBC7ECF1EA352EF20A353FF47B67AFF52BC86CF34AF
+      667000973340009733402DAF5D7047BC79CF3AB66DFF14A347FF009933FF0099
+      33FF039936FF0A993DFF0A993DFF039936FF009932BF00973340000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00006FCF9F1064C99A3042AD76702B9D5ECF2D9C60FF3AA36DFF33A366EF139D
+      47CF009932BF009932BF089D3BCF14A347EF13A346FF079C3AFF009933FF0099
+      33FF0A993DFF1D9950FF1D9950FF0A993DFF009932BF00973340000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000359A6A303399678F339866CF339966EF269959FF0D99
+      40FF009933FF009933FF009933FF009933FF079C3AFF13A346FF14A347EF089D
+      3BCF0D9940BF269959BF279859CF149947EF0D9940BF0B973F40000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000002F9F6F10359A643034986670329966CF269959FF0D99
+      40FF009933FF009933FF009933FF009933FF14A347FF3AB66DFF47BC79CF2DAF
+      5D700B973F40279757402B985F7027995BCF269959BF27975B40000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000359A6A303399678F269959BF0D99
+      40BF009932BF009932BF009932BF009932BF1AA64DBF4DBE80BF67CD998F6AC9
+      9A300000000000000000359A6A303399678F3399678F359A6A30000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000002F9F6F10359A6430279757400B97
+      3F40009733400097334000973340009733401BA74B404BBF7F4064C99A306FCF
+      9F1000000000000000002F9F6F10359A6430359A64302F9F6F10000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000007F040000730B0000841B000089340000884B0000
+      875E0000886C000089750000877A0000877A000089750000886C0000875E0000
+      884B000089340000841B0000730B00007F040000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000007F040000890D0A0A8A1806068C260D0D993A1212A2551515A56C1818
+      A67F1A1AA88E1C1CAA971F1FAB9B2222AC9B2525AD972727AE8E2727AD802828
+      AE6C2424AB551A1AA23A0D0D93260A0A8A180000890D00007F04000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000890D0000862607078F400B0B955C1212A2791E20B2962729BEAE2E2F
+      C5C23535C9D13C3BCDDA4241D2DE4747D3DE4C4CD4DA4F4FD4D14F4FD1C34A4A
+      CDAF3E3EC1962525AC791313985C07078F40000086260000890D000000000000
+      0000000000000000000000000000000000000000000000000000000099050000
+      7F0E0D0D97251111994B1B1BA56F2222AF932B2BB8B13535C4C83D3ECEDB4546
+      D4EA4D4DD9F55655DEFC5C5CE2FF6262E4FF6767E5FC6B6BE4F56B6BE2EB6868
+      DEDC5F5FD6C94F4FC8B14141BA943434AF702424A44C1A1A9A2600007F0E0000
+      99050000000000000000000000000000000000000000000000000000910E0000
+      88291010994E1E1EAC7C2F2FBBA63E3ECBCB4949D5E25352D9EC5B5BDEF36364
+      E2F86C6CE4FC7473E7FE7B7BEBFF8080EDFF8585EEFE8888EEFC8B8BEFF88B8B
+      EFF38989EDEC8484E9E37777E1CD5E5ECFA84242BC7F2323A14F000088290000
+      910E0000000000000000000000000000000000007F040000890D0D0D97251717
+      9E4D2727AF7A3838C0AB4747CED15656DBED6261E1FC6D6CE2FE7776E3FF8080
+      E1FF8888DFFF8E8EDFFF9393DFFF9696E1FF9A9AE3FF9D9DE6FF9F9FEAFFA0A0
+      F0FF9E9EF3FE9B9BF5FD9090F1EF7878E3D36161D2AD4141BB7C2323A64E1B1B
+      9E250000890D00007F0400000000000000000000890D0000862618189E4A2929
+      B07C3F3FC4AA5656D6D66666E1F07171E7F97C7CE8FE8A8AE5FF9595DEFF9D9D
+      D2FFA2A2C8FFA3A3C2FFA4A4BFFFA5A5C0FFA7A6C3FFA8A8CAFFAAAAD5FFABAB
+      E5FFA9A9F0FFA5A5F6FE9E9EF7FA9393F4F08181EAD75F5FD5AD4242C07F2525
+      AA4B000086260000890D0000000000007F040A0A94180B0B8F402727AA6F4343
+      C4A65A5AD6D06F6FE4F07E7EEBFF8989E9FF9494E4FF9E9EDBFFA7A7D1FFAFAF
+      C7FFB5B5C0FFB9B9BEFFBCBCBEFFBDBEC0FFBFBEC4FFBFBFCAFFBABAD4FFB0B0
+      E3FFAAAAEFFFA9A9F8FFA5A5FBFF9F9FFBFF8F8FF4F17474E5D45A5AD3A93333
+      B4710B0B91410A0A8E1900007F040000730B0D149A261515995D383AB8946464
+      DBCB7979E9ED8787EFF99393EDFFA0A0E1FFA7A7D3FFA8A8C2FFADADBBFFB6B6
+      BEFFC1C1C5FFCFCFD1FFD9DADBFFE0E1E1FFE2E3E5FFE2E2E5FFD1D1E7FFB0B0
+      EBFFA2A1F1FFA6A6F9FFA6A5FCFFA0A0FBFF9595F8FA8786F3EF7171E6CD4040
+      C0961818A25E13139F280000940C0000841B2222A43B3032AF7A5151C9B27A7A
+      E7E38E8EF2FC9999F2FEA2A2E9FFABABD4FFB1B1C5FFB4B4BBFFBBBBBBFFC7C7
+      C7FFD4D4D4FFE2E2E2FFECEDEDFFF3F4F4FFEFF0F6FFE3E3F5FFCCCCF4FFACAC
+      F2FF9E9EF5FFA3A3FAFFA4A3FBFF9F9EF9FF9897F8FE8E8DF8FD7979EFE44E4E
+      CFB52E2EB77D2121AB3D00008C1D000089343232AE565353CA986E6EDDCB8B8B
+      EFED9C9CF4FEA6A6EFFFABABDEFFACACC3FFB4B4BAFFC2C2C4FFD2D2D2FFE4E4
+      E4FFEFEFEFFFF3F3F3FFF5F5F5FFF6F7F7FFE5E5F7FFC2C2F9FFABABF9FFA3A3
+      F9FF9F9FFAFFA0A0FBFF9F9EFAFF9B9BF4FF9594F3FF8A8AF8FE7A7AF3EE5F5F
+      E1CE4747CF9C2B2BB358000088360000884B3A3AB66D6C6CDAB18383E9DF9999
+      F4F5A6A6F4FFADADE6FFB1B0D4FFB0B0BCFFBCBCBCFFD2D2D2FFE5E5E5FFF4F4
+      F4FFFBFBFBFFFAFAFAFFF2F2F9FFE4E4F9FFCCCCF9FFAAAAFBFF9A9AFCFF9C9C
+      FCFF9A9AF9FF9494F2FF9393ECFF9898E6FF9393E8FF8585F5FF7171F6F55858
+      EBE04242DCB32525B76E0000864C0000885F4141B7817E7EE3C69696F3EEA1A1
+      F7FAA9AAF0FFAEAED8FFB4B3C9FFB9B9C0FFC9C9C9FFE5E5E5FFF4F4F4FFF9F9
+      F9FFFAFAFAFFF9F8F8FFE3E3F8FFBBBBFAFFA3A3FBFF9B9BFCFF9797FCFF9797
+      FCFF8F8FF2FF7F7FDDFF8282D1FF9595CDFF9494D7FF7C7CEFFF6060F7F94040
+      F2EC2929E2C41515B5810000885F0000876D4343B78F8888E9D3A0A0F8F7A4A4
+      F9FDA9AAEDFFAEAECEFFB7B6C2FFC3C3C8FFD6D6D6FFF0F0F0FFFBFBFBFFFAFA
+      FAFFEEEEF8FFDADAF8FFBDBCF9FF9797FBFF8787FCFF8D8DFCFF8E8EF9FF898A
+      F2FF8484E2FF7D7DCAFF8989C2FFA6A6CAFF9D9DD9FF6C6CEFFF4545F7FC2A2A
+      F4F51818E4D00C0CB38E0000876D000086744444B7968B8BEBD9A1A1F9FCA2A2
+      FAFEA5A5EBFFABABC8FFBAB9C0FFD0D0D3FFE3E3E3FFF3F3F3FFF9F9F9FFF7F7
+      F7FFD9D9F7FF9F9FF9FF7E7EFAFF7979FBFF7A7AFBFF8182FBFF7F80F2FF7475
+      DEFF7979CBFF8D8DB7FFA8A8BDFFC9C9DCFFAEAEEEFF5656F4FF2323F6FD1515
+      F4FA0B0BE4D70606B39500008674000087774141B7998787EBDC9B9BFAFE9A9A
+      FBFF9D9DEAFFA7A7C5FFBBBBC0FFD8D8DAFFEBEBEBFFF3F3F3FFE9E9F7FFCBCB
+      F6FFA0A0F7FF6868F9FF4F4FFBFF5656FBFF5C5CF7FF6061F1FF6767E2FF6E6F
+      CAFF8584BEFFA9A9BCFFC6C6CBFFDEDEEAFFB4B4F8FF4747F6FF0E0EF3FE0808
+      F1FD0404E1DB0303B39800008777000087773C3CB5997D7DEADC8E8EF9FE8B8B
+      FAFF9191E9FFA1A2C4FFBABBC1FFDDDDDEFFEFEFEEFFF2F2F2FFCACAF4FF7676
+      F7FF4444F8FF3535F9FF2E2EFAFF2E2EFAFF2D2DF0FF2A2ADCFF4444C9FF7878
+      B5FFA8A7BBFFD0D0D7FFE5E4EAFFE6E6F3FFAFAFF7FF3E3EF3FF0505EFFE0303
+      ECFD0101DEDB0101B19800008777000086743434B5966E6EE8D97D7DF8FC7878
+      F9FE8181EAFF9798C6FFB5B6C3FFDCDCE0FFE1E1EFFFC5C5F1FF8E8EF4FF3C3C
+      F7FF1414F9FF1717F9FF1818F5FF1414EEFF1B1BDFFF2A2AC7FF5454BBFF9797
+      B9FFC9C8C9FFE9E9E9FFF0F0F8FFDFDFF6FFA1A1F3FF3535EEFF0000EAFD0000
+      E7FA0000D9D70000AE95000086740000876D2E2EB58F5D5DE7D26868F6F76363
+      F8FC6E6EEBFF8889CBFFABABC7FFD6D6DFFFC1C1EDFF6C6CF1FF3535F5FF1D1D
+      F7FF1011F8FF0F10F8FF0D0DEDFF0909D9FF2525C6FF6060B4FF9797B9FFCACA
+      D5FFE9E8E8FFF4F4F4FFE9E9F7FFC8C8F1FF8A8AEDFF2E2EE9FF0000E5FB0000
+      E0F40000D3CF0000AC8E0000876D0000885F2725B5814B4AE2C45151F2EC4949
+      F6F95454EDFF6F6FD3FF898ACFFFA3A3DFFF8585EBFF3030F1FF0708F4FF0A0B
+      F5FF0B0BF2FF0809EBFF1010DCFF2121C5FF4E4EB9FF9595B8FFC9C8C8FFE9E9
+      E8FFF8F8F8FFF7F7F7FFDCDDF3FFA8A8ECFF6A6AE6FF2424E2FF0000DDF80000
+      D7E90000CAC10000A9800000885F0000884B1E1CB56C3534D9AF3534E8DC2A2A
+      F3F43333F1FF4B4BE0FF5051DBFF4242E1FF2D2DE8FF1212F0FF0405F2FF0404
+      F0FF0404E5FF0303D4FF2121C3FF5C5CB2FF9595B8FFC9C9D5FFE8E8E8FFF4F4
+      F3FFF7F7F7FFF3F4F3FFCBCCEEFF7F7FE5FF4343DFFF1717DBFF0000D3F30000
+      CAD90000BDAC0000A56C0000864C000089341512AE552220C8961E1DDBC81515
+      EEEC1A1AF1FE2B2BE8FF2627E5FF0D0DE5FF0101E8FF0202EEFF0202ECFF0101
+      E3FF0A0AD4FF1F1FC0FF4D4DB7FF9494B8FFC8C8C8FFE9E8E9FFF8F7F8FFF7F7
+      F6FFEBECF3FFD8D9ECFFA6A7E6FF5656DDFF2323D6FF0C0CD2FE0000CAEB0000
+      BDC60000AF9400009F55000088360000841B0808A23A0E0EAE790D0DC9B00A0A
+      E7E20A0AF0FC0F0FEDFE0D0DECFF0404EBFF0000EBFF0101ECFF0101E2FF0000
+      CEFF1F1FBDFF5C5CAFFF9494B8FFC9C9D5FFE8E8E8FFF4F3F4FFF7F6F7FFF2F2
+      F3FFD6D7ECFFA5A6E3FF6D6EDBFF2F2FD2FF0C0CCBFE0404C9FC0000BFE20000
+      AEAF00009F780000973B00008C1D0000730B000093260202985C0303B9920202
+      DBCA0202E8EC0101EBF90000EDFF0000EBFF0202E9FF0505E6FF0D0DD9FF1A1A
+      C2FF4646B7FF8F90B7FFC4C5C8FFE5E5E8FFF1F0F7FFE9E8F5FFDBDAF0FFC7C7
+      E9FFA1A2E1FF6C6CD7FF3D3DCFFF1414C8FF0000C2F90000BEEC0000B5CA0000
+      A2920000905C00008F270000940C00007F0400008A1800008F400202AB6E0101
+      C6A30101D4CE0000E3EF0000E8FF0000E5FF0505E2FF0F0FDDFF2727D1FF4E4E
+      BEFF7F7FC0FFBABBD6FFDDDEE7FFE8E8F1FFE2E1F4FFC9C8EDFFA5A5E4FF7676
+      D9FF4E4ED0FF2C2CC8FF1414C2FF0707BEFF0000B8EF0000B0CF0000A6A40000
+      996E00008B4000008A1800007F04000000000000890D0000862600009E4A0000
+      B3790000C2A80000D6D40000DCEF0000DDF90505DAFE0F0FD5FF2727CDFF4E4E
+      BFFF7575C5FF9B9CDDFFAFB0E9FFB0AFE8FFA4A3E4FF8B8ADDFF6868D4FF3B3B
+      C9FF1B1BC1FF0909BBFE0000B7F90000B4EF0000AFD40000A3A800009A7A0000
+      904A000086260000890D000000000000000000007F040000890D000097250000
+      A14C0000AC790000BFA80000C8CF0000D2EC0202D3FC0505CFFE0D0DCCFF1A1A
+      C5FF2727C6FF3434CCFF3A3BCEFF3B3ACBFF3736C8FF2E2EC4FF2323BFFF1414
+      BAFF0909B5FE0303B2FC0000ADED0000A6D00000A1A9000097790000914D0000
+      90250000890D00007F04000000000000000000000000000000000000910E0000
+      882900009B4D0000AB7A0000B5A40000C3CA0000C7E20000C6EB0000C4F30000
+      C2F80000C1FC0000BEFE0000BCFF0000B9FF0000B5FE0000B3FC0000B0F80000
+      ADF30000AAEC0000A8E20000A3CB00009CA50000957B00008E4D000088290000
+      910E000000000000000000000000000000000000000000000000000099050000
+      7F0E0000972500009B4A0000A06F0000A7920000AEAF0000B4C60000B6DA0000
+      B7EA0000B7F50000B5FC0000B3FF0000B0FF0000ADFC0000AAF50000A6EB0000
+      A3DB00009EC700009BB0000096930000936F0000904A0000892500007F0E0000
+      9905000000000000000000000000000000000000000000000000000000000000
+      00000000890D0000862600008B400000905C000099780000A5940000A9AD0000
+      ACC20000ADD10000AADA0000AADE0000A6DE0000A3DA0000A2D100009EC30000
+      9AAF000095960000917900008B5D00008B40000086260000890D000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000007F040000890D00008A1800008F270000973B0000995500009B6C0000
+      9A8100009B8F000099970000999B0000979B000096970000958F000094810000
+      926E00008F570000903C00008C2800008A180000890D00007F04000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000007F040000940C00008C1D000088360000894C0000
+      8A600000886E000088760000877A0000877A000088760000886E00008A600000
+      874D000086370000881E0000890D00007F040000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000067FBB26047E
+      BB71047FBDB0047EBDE5047FBDFF047FBDFF047FBDFF047FBDFF047FBDFF047F
+      BDFF047FBDFF047FBDFF047FBDFF047FBDFF047FBDFF047FBDFF047FBDEA037F
+      BDC0057EBD91057FBF5C037FBD42000000000000000000000000000000000000
+      000000000000000000000000000000000000007FBF080A7FBF181287BF441989
+      C18D2491C7C43499CBEC3B9ECDFF3B9ECDFF3B9ECDFF3B9ECDFF3B9ECDFF3B9E
+      CDFF3B9ECDFF3B9ECDFF3B9ECDFF3B9ECDFF3B9ECDFF3B9ECDFF399DCDEF379B
+      CCD02D94C9AD178AC3850680BD71000000000000000000000000000000000000
+      0000000000000000000000000000000000000A7FB418077DBE47198BC3803096
+      C8C454ACD4EB8DCBE4F9A8DBEDFFA8DBEDFFA8DBEDFFA8DBEDFFA8DBEDFFA8DB
+      EDFFA8DBEDFFA8DBEDFFA8DBEDFFA8DBEDFFA8DBEDFFA8DBEDFF9ED5EAFA88C8
+      E4EF61B2D8E42792C8D6077FBED0000000000000000000000000000000000000
+      000000000000000000000066CC05007FC80E0984BC360C81BF7C2894C8B651AB
+      D3E77BC3E2FFB1E5F3FFC8F4FCFFC0F2FCFFBCF2FBFFBCF2FBFFBCF2FBFFBCF2
+      FBFFBCF2FBFFBCF2FBFFC2F3FCFFCFF6FCFFD2F4FBFFCAEFF9FFB1E1F1FF88C9
+      E4FF5CB0D7F32690C7DC077FBED0000000000000000000000000000000000000
+      00000000000000000000007FC80E067FC22A0D84C0621287C2B53A9DCDE781C6
+      E3F7A2DDF1FFA5E8F7FF9AEAF9FF81E5F9FF75E3F8FF75E3F8FF75E3F8FF75E3
+      F8FF75E3F8FF75E3F8FF89E6F9FFAFEFFBFFB7EBF8FF9FDCF0FF78C4E2FF45A4
+      D1FF2690C7DC1488C1950680BD71000000000000000000000000000000000000
+      0000000000000000FF01007FBA1A037FBF4C1B8CC48C3198CAD95AB0D7FF9ED9
+      EDFFB1EAF9FF92E7F9FF76E2F7FF5DDDF7FF51DBF6FF51DBF6FF51DBF6FF51DB
+      F6FF58DCF6FF65DFF7FF7BE1F7FF99E4F6FF95DAEFFF6FC2E2FF49ABD5F31F8F
+      C5DB0680BEA70580BD59057FBC32000000000000000000000000000000000000
+      00000000FF01007FFF02067FBF28047FBD742D97C8B367B6DAE68BCDE6FFADE4
+      F4FFA6EBFAFF77E2F8FF5BDCF6FF52DAF6FF4EDAF5FF4EDAF5FF4EDAF5FF4EDA
+      F5FF63DEF7FF8AE6F9FF98E4F6FF8CD7EEFF6DC1E2FF3CA1D1FF1F91C6DA1188
+      C192057FBD56067FB8280078B411000000000000000000000000000000000000
+      0000007FCC0A087BC11D1689C44E208EC39F49A6D1D58ACCE6F1A4DFF1FFA1E7
+      F7FF8BE6F9FF62DDF7FF4DD9F5FF4DD9F5FF4DD9F5FF4DD9F5FF53DAF6FF61DD
+      F6FF78E1F7FF97E4F6FF94D9EFFF6CC0E2FF47A8D5F31E8FC7D90680BEA50681
+      BD55077FBB22008BB90B00000000000000000000000000000000000000000000
+      00000984C61B067FBD522490C58D44A3D0CC6BBADCF1A1DBEFFAA5E8F7FF7CE2
+      F7FF60DDF6FF53DAF6FF4CD8F5FF4CD8F5FF4CD8F5FF4CD8F5FF60DDF7FF88E5
+      F9FF97E4F6FF8BD7EEFF6DC0E2FF3BA1D1FF1E8EC6DA1186C38E067FBD52067F
+      BB26008BB90B007FBF04000000000000000000000000000000000091B6070C7F
+      BF141085C23F1087C188349ACBC167B8DBEA88CDE7FFA2E3F4FF95E8F9FF63DE
+      F7FF4BD8F5FF4BD8F5FF4BD8F5FF4BD8F5FF50D9F5FF5BDCF6FF72DFF6FF94E2
+      F6FF92D8EEFF6CC0E1FF44A7D4FF1B8DC5FF0580BDD5047EBE7F077FBB44077F
+      BB220089C40D007FBF04000000000000000000000000000000000C8CBF140881
+      BC3D1385C076208EC5BF49A6D2EA8DCFE8F8A4E2F4FF8FE4F6FF75E1F7FF58DB
+      F6FF4AD7F4FF4AD7F4FF4AD7F4FF4AD7F4FF5ADBF5FF7CE3F7FF89E0F4FF84D3
+      EDFF69BEE0FF39A0CFFF198CC5FF0C84C0FF047FBDE4047FBDAC0680BD79067D
+      BE4B0682BD270089C40D00000000000000000055AA03007FBF080B85BF2C0682
+      BE6F208DC5AD41A1CFE368B9DDFFA3DEF1FFA9EBFAFF7CE2F7FF5EDCF6FF50D8
+      F5FF49D7F4FF49D7F4FF49D7F4FF49D7F4FF59DBF5FF7BE2F7FF8AE0F4FF87D4
+      EDFF72C2E2FF4DAAD4FF3B9DCDFF3B9DCDFF399DCDF0369CCCD13097CAAF1E8D
+      C6871186BF590F87C322006DB60700000000007FBF080A7FB4180982BD4E0882
+      BDAC2E96CAE473BDDDF699D6ECFFA8E5F6FF98E8F9FF6ADEF6FF50D9F5FF4BD7
+      F4FF48D6F4FF48D6F4FF48D6F4FF48D6F4FF4DD8F4FF58DAF5FF73DEF5FF9CE4
+      F6FFADE3F3FFAADDEFFFA8DAEDFFA8DAEDFF9ED5EAFA88C8E4F066B6DBE4359A
+      CCD7178AC3A21389C243007FBF14000000000071B812047FBA341889C3732491
+      C6D14BA7D3FF92D1E9FFB3E7F6FFADEBF9FF99E8F9FF76E1F7FF64DDF6FF63DC
+      F6FF5CDBF5FF4ED7F4FF47D6F4FF47D6F4FF47D6F4FF47D6F4FF66DDF6FFA3EB
+      FAFFC5F2FBFFCDF3FBFFCAEFF9FFBDE7F5FFA9DCEEFA8CCCE5F066B6DBE4359A
+      CCD7178AC3A21389C243007FBF1400000000087BB41F057EBB5B2B95C89A56AC
+      D5DE79C2E1FFA4DEF0FFB8EDF9FFB4EEFAFFACECFAFFA0EAF9FF9AE8F9FF9AE8
+      F9FF85E4F7FF5BDAF5FF46D5F3FF46D5F3FF46D5F3FF46D5F3FF63DCF5FF9CE9
+      F9FFB8EEFAFFB6EBF8FFA1DEF0FF7BC6E4FF5DB3D9F044A4D0D13097CAAF1E8D
+      C6871186BF590F87C322006DB60700000000087BB41F057EBB5B2C95C7945CAF
+      D7CA76C0E0EB86CCE7F98DD4EBFF8AD3EBFF89D2EBFF89D2EBFF8FD6EDFF9CDF
+      F2FF91E1F4FF6EDCF5FF5AD9F5FF56D8F4FF57D8F4FF5EDAF5FF72DDF5FF94E2
+      F5FF9CDFF2FF8BD3EBFF71C3E3F74BABD6E82E9ACCC9178BC39A0480BE6F077D
+      BE470682BD270089C40D00000000000000000071B812047FBA34188BC35F2C96
+      C9953199CAC4319ACCEC329BCCFF319BCCFF309BCCFF309BCCFF44A7D3FF6AC0
+      E1FF81D2EBFF87DEF4FF84E2F8FF78E0F7FF7CE1F7FF8FE5F8FF93E2F5FF8BD7
+      EEFF73C4E3FF4CACD6FF339CCDE82593C9B91B8DC5841188C0490682C0250A7F
+      BF180089C40D007FBF040000000000000000007FBF080A7FB418047FBA340582
+      BC5C037FBD84047FBDAC037EBDC9047EBCDB0982BEEB1588C2F8349BCDFF67BC
+      DFFF8BD4ECFF9DE3F5FF9EE8F9FF90E4F8FF8CE0F5FF93DCF1FF89D3EBFA70C3
+      E2EF4FAED7E32894C9D61185C0B40A82BF7D067DBC490A7FBF18000000000000
+      0000000000000000000000000000000000000055AA03007FBF080087C3110883
+      BD1F057FBF2C0481C039057CBC5C057FBE921A8BC3C23A9CCDEB61B4DAFF94D5
+      ECFFAEE7F6FFAEEAF8FFA9E9F9FF9EE4F7FF89D6EEFF6AC0E1FF51AED7EF38A0
+      CFCE2794CAAA198AC4830E83C15B0984BF340A7FBF18007FBF08000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000071AA090A84C1191685C0451B8BC48B399DCEC267B6DBEB8ACCE7FFAEE4
+      F4FFB9EDF9FFAAE6F6FF99DDF2FF86D0EBFF6BC0E1F748A9D4E62D99CAC6168B
+      C396047EBE6B077DBE43077BBD23007FBF0C0000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000097FBA1A067FBB4C1C8BC3853498CAC458AED6EB94D0E9F8B0E4F4FFB5EA
+      F8FFAAE6F6FF8FD5EDFF6EC2E3FF47A9D5FF2F9ACDE62392C8B51A8CC47F1184
+      C147077FBF240B7FC516007FBF0C007FBF040000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000007FBF080B85
+      BC170F85BC411386C2832E96C8BC55ABD5E97AC3E2FFA8DEF1FFB3E8F7FF9EDD
+      F1FF87D0EAF96CC0E1ED4BACD6E12493C9D30C83C1B10880BD790781BC450B79
+      BC17000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000000000000000000000000000000B79BC170781
+      BC451287C07E218EC5C047A4D1E986C8E4F8A5DCEFFFA7E1F2FF94D7EEFF69BE
+      E0FF4CACD6ED379FCEC92593C8A41689C57C0B82C056057FBC320B85BC17007F
+      BF08000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000007FBF04008BB90B0A82BE330C82
+      BD792391C5B543A2D0E666B7DBFF96D3EAFFA0DBEFFF86CEE8FF69BDDEF743A6
+      D2E62895C9C41589C391057FBC64047FBF3C087BBD1F0073B90B000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000008BB90B077FBB220E85BD5A1286
+      C1B2389DCDE67AC2E0F793D1E9FF87CCE7FF6DBEE0FF45A7D3FF2D97CAE62291
+      C7B3188AC37D1287C3440783C121007FBF14007FCC0A007FBF04000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000007FFF020883C11D0982BD521B8BC3922E96
+      CADA4EA9D3FF81C6E3FF8BCCE6F96BBDDEEB48AAD4DE2091C6D10B83BFAE0881
+      BE76077FBB440B79BC1700000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000006DB6070881C0390B81BE9D2892C7DB5AAE
+      D6F369B8DCFF5AB1D8FF4AA8D3EC369ECDC42393C79D1589C4750981BC510582
+      BD2F0B79BC17007FBF0800000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000000079C2151385BF501687C2C52C95C9FF57AD
+      D6FF5FB2D9F33EA1D0DB2592C8B81288C3880580BD5D047DC035097FBA1A009F
+      BF08000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000057CBB2D1C8CC3622892C7CB2B94C8FF2B95
+      C9FF2993C8DB2491C7931B8BC55D0D88C3380883BD1F007FB8120071AA0900AA
+      AA03000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000057CBD2B218EC2542E97C8A52892C6CB1487
+      C2C50B81BF9D097FBF54077BBD23007FBF0C0000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000007FC80E1B89C725218EC5541C8CC3620F85
+      C2500881C0390883C11D007FBF0C007FBF040000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000007FC80E057CBD2B057CBB2D0079
+      C215006DB607007FFF0200000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000A37B48FFA37B48FFA37B48FFA37B48FFA27A
+      47FFA27A47FFA27946FFA27946FFA17845FFA17845FFA07744FFA07744FFA076
+      43FFA07643FF9F7542FF9F7542FF9E7441FF9E7441FF9E7340FF9E7340FF9D72
+      3FFF9D723FFF9C713EFF9C713EFF9C703DFF9C703DFF9B6F3CFF9B6F3CFF9A6E
+      3BFF9A6E3BFF9A6D3AFF9A6D3AFFA37B48FFA57E4CFFA88252FFAA8556FFA984
+      55FFA98455FFA98354FFA98354FFA88253FFA88253FFA78152FFA78152FFA780
+      51FFA78051FFA67F50FFA67F50FFA57E4FFFA57E4FFFA57E4EFFA57E4EFFA47D
+      4DFFA47D4DFFA37C4DFFA37C4DFFA37B4CFFA37B4CFFA27A4BFFA27A4BFFA279
+      4AFFA07646FF9C703EFF9A6D3AFFA37B48FFA88353FFB29167FFB79871FFB797
+      70FFB79770FFB6976FFFB6976FFFB6966EFFB6966EFFB6956EFFB6956EFFB595
+      6DFFB5956DFFB4946CFFB4946CFFB4936CFFB4936CFFB4936BFFB4936BFFB392
+      6AFFB3926AFFB2916AFFB2916AFFB29069FFB29069FFB18F68FFB18F68FFB18E
+      67FFAB865BFF9F7545FF996C39FFA37B48FFAE8B5EFFC3AA89FFCEB99FFFCEB9
+      9EFFCEB99EFFCDB89DFFCDB89DFFCDB89DFFCDB89DFFCDB79CFFCDB79CFFCCB7
+      9BFFCCB79BFFCBB69AFFCBB69AFFCBB59AFFCBB59AFFCBB599FFCBB599FFCAB4
+      98FFCAB498FFC9B398FFC9B398FFC9B297FFC9B297FFC8B296FFC8B296FFC8B1
+      96FFBCA07EFFA57D50FF996C39FFA27A47FFB5966DFFDCCDB9FFEFE8DFFFEFE8
+      DFFFEFE8DFFFEEE7DEFFEEE7DEFFEEE7DEFFEEE7DEFFEDE6DDFFEDE6DDFFEDE6
+      DCFFEDE6DCFFECE5DBFFECE5DBFFECE4DBFFECE4DBFFEBE4DAFFEBE4DAFFEBE3
+      D9FFEBE3D9FFEAE2D9FFEAE2D9FFEAE1D8FFEAE1D8FFE9E1D7FFE9E1D7FFE9E0
+      D7FFD5C3AFFFAC885FFF986B38FFA27A47FFB99B75FFE8DED1FFF8F8F8FFE9E9
+      E9FFDFDFDFFFD9D9D9FFDADADAFFE2E2E2FFECECECFFF7F7F7FFFDFDFDFFFDFD
+      FCFFFDFDFCFFFCFCFBFFFCFCFBFFFCFBFBFFFCFBFBFFFBFBFAFFFBFBFAFFFBFA
+      F9FFFBFAF9FFFAFAF9FFFAFAF9FFFAF9F8FFFAF9F8FFF9F9F7FFF9F9F7FFF9F8
+      F7FFE1D5C7FFB08E67FF986B37FFA17946FFB99B74FFE8DED1FFE9E9E9FFBCBC
+      BCFF9E9E9EFF8E8E8EFF929292FFABABABFFC9C9C9FFECEBEBFFFDFCFCFFFCFC
+      FBFFFCFCFBFFFCFBFBFFFCFBFBFFFBFBFAFFFBFBFAFFFBFAF9FFFBFAF9FFFAFA
+      F9FFFAFAF9FFFAF9F8FFFAF9F8FFF9F8F7FFF9F8F7FFF8F8F7FFF8F8F7FFF8F7
+      F6FFE0D4C6FFAF8D66FF976A36FFA17946FFB99B74FFE8DED1FFDEDEDEFF9E9E
+      9EFF797979FF707070FF747474FF848484FFA9A9A9FFE1E0E0FFF5F4F4FFE4E4
+      E3FFDCDCDBFFDCDBDBFFDBDADAFFDADAD9FFD9D9D9FFD9D8D8FFD9D8D7FFD7D7
+      D7FFD7D7D6FFD6D6D5FFD6D5D4FFD5D4D3FFD4D3D3FFD3D3D2FFDCDCDBFFEFEE
+      EDFFE0D4C6FFAF8D66FF976A36FFA17845FFB89A73FFE7DDD0FFD9D9D9FF8F8F
+      8FFF707070FF7F7F7FFF7F7F7FFF6E6E6EFF8C8C8CFFD7D7D6FFE4E4E3FFB3B3
+      B3FF9B9B9BFF9B9A9AFF999999FF979797FF969696FF959595FF949393FF9292
+      92FF909090FF8F8F8EFF8D8D8CFF8C8B8BFF8A8A8AFF888888FFA3A3A3FFDCDB
+      DAFFDFD4C5FFAE8D65FF966935FFA17844FFB89A73FFE7DDD0FFD9D9D9FF908F
+      8FFF717171FF7E7E7EFF7D7D7DFF6E6E6EFF8C8C8CFFD7D7D6FFE4E4E3FFB3B3
+      B3FF9B9B9BFF9A9A9AFF999998FF979797FF969595FF959594FF939393FF9291
+      91FF909090FF8E8E8DFF8D8D8CFF8B8B8BFF8A8A89FF888888FFA3A3A3FFDBDB
+      D9FFDFD4C5FFAE8D65FF966935FFA07743FFB89972FFE7DCCFFFDFDEDEFFA1A0
+      A0FF7A7A7AFF6B6B6BFF6E6E6EFF858585FFABABABFFE0E0E0FFF3F3F2FFE3E3
+      E2FFDBDBDAFFDADAD9FFDADAD9FFD9D8D8FFD9D8D7FFD8D8D7FFD7D7D6FFD7D6
+      D5FFD6D5D5FFD5D5D3FFD4D4D3FFD4D3D2FFD3D3D2FFD2D2D1FFDBDBDAFFEEED
+      EBFFDFD3C4FFAE8C64FF966834FFA07643FFB89872FFE7DBCFFFE9E8E8FFBEBD
+      BDFF9E9E9EFF888888FF8C8C8CFFABABABFFCACACAFFEBEAEAFFFBFBFAFFFBFB
+      FAFFFBFBFAFFFAFAF9FFFAFAF9FFFAF9F8FFFAF9F8FFF9F9F8FFF9F9F8FFF9F8
+      F7FFF9F8F7FFF8F8F6FFF8F8F6FFF8F7F6FFF8F7F6FFF7F7F5FFF7F7F5FFF7F6
+      F4FFDFD2C4FFAE8B64FF966734FF9F7542FFB79771FFE6DBCEFFF6F6F5FFE7E7
+      E7FFDDDDDDFFD5D5D5FFD7D7D6FFE0E0E0FFEBEBEAFFF6F5F5FFFBFAFAFFFAFA
+      F9FFFAFAF9FFFAF9F8FFFAF9F8FFF9F9F8FFF9F9F8FFF9F8F7FFF9F8F7FFF8F8
+      F6FFF8F8F6FFF8F7F6FFF8F7F6FFF7F6F5FFF7F6F5FFF7F6F4FFF7F6F4FFF6F5
+      F4FFDED1C4FFAD8A63FF956633FF9F7542FFB79771FFE6DBCEFFF8F8F8FFEFEF
+      EFFFE7E7E7FFE1E1E0FFE2E2E1FFE8E8E7FFF0EFEFFFF7F6F6FFFBFAFAFFFAFA
+      F9FFFAFAF9FFFAF9F8FFFAF9F8FFF9F9F8FFF9F9F8FFF9F8F7FFF9F8F7FFF8F8
+      F6FFF8F8F6FFF8F7F6FFF8F7F6FFF7F6F5FFF7F6F5FFF7F6F4FFF7F6F4FFF6F5
+      F4FFDED1C4FFAD8A63FF956633FF9E7441FFB69670FFE5DACDFFEFEFEFFFD4D4
+      D4FFBEBEBEFFABABABFFADADACFFC3C2C2FFD9D8D8FFEFEFEEFFFAFAF9FFFAF9
+      F8FFFAF9F8FFF9F9F7FFF9F9F7FFF9F8F7FFF9F8F7FFF8F8F6FFF8F8F6FFF8F7
+      F5FFF8F7F5FFF7F6F5FFF7F6F5FFF7F6F4FFF7F6F4FFF6F5F3FFF6F5F3FFF6F5
+      F3FFDED1C3FFAD8962FF946532FF9E7441FFB69670FFE5DACDFFE7E7E7FFBDBD
+      BDFFA3A3A3FF999999FF9C9B9BFFABAAAAFFC4C4C3FFE8E8E7FFF2F2F1FFE2E2
+      E1FFDADAD9FFD9D9D8FFD9D9D7FFD8D8D7FFD8D7D6FFD7D7D5FFD6D6D5FFD6D5
+      D3FFD5D4D3FFD4D3D2FFD3D3D2FFD3D2D1FFD3D2D0FFD1D1CFFFDADAD8FFEDEC
+      EAFFDED1C3FFAD8962FF946531FF9D7340FFB5956FFFE4D9CCFFE0E0E0FFAAAA
+      AAFF989898FFAAAAAAFFAEAEAEFFA1A1A1FFB3B3B2FFE2E2E1FFE2E2E1FFB3B3
+      B2FF9B9B9AFF9A9A99FF989898FF979796FF959594FF949493FF939292FF9190
+      90FF8F8F8EFF8D8D8DFF8C8C8BFF8B8B8AFF8A8988FF888886FFA3A3A1FFDAD9
+      D7FFDDD0C2FFAC8861FF936430FF9D7340FFB5956FFFE4D9CCFFDFDFDFFFA6A6
+      A5FF939393FFA8A8A8FFACACACFF9E9E9EFFB0B0AFFFE1E1E0FFE2E2E1FFB2B2
+      B1FF9A9A99FF9A9998FF989898FF969695FF959594FF949393FF939291FF9090
+      90FF8F8F8EFF8D8D8CFF8C8B8BFF8B8A89FF898988FF888786FFA3A2A0FFD9D9
+      D7FFDDD0C2FFAC8861FF936430FF9D723FFFB5946EFFE4D9CBFFE2E2E2FFB1B1
+      B0FF969695FF929292FF969696FFA1A1A1FFBBBBBAFFE4E4E3FFF1F1F0FFE1E1
+      E0FFD9D9D8FFD9D8D7FFD8D7D7FFD7D7D5FFD6D6D5FFD6D5D4FFD6D5D4FFD4D4
+      D3FFD4D4D2FFD3D2D1FFD3D2D0FFD2D1D0FFD1D0CFFFD1D0CEFFDAD9D7FFEBEA
+      E8FFDCCFC1FFAB8760FF92632FFF9D723EFFB5946DFFE4D9CBFFEAEAE9FFC7C7
+      C6FFB0B0AFFFA4A4A3FFA7A7A6FFB8B8B7FFCFCFCEFFEBEBEAFFF9F8F7FFF8F8
+      F7FFF8F8F7FFF8F7F6FFF8F7F6FFF7F7F5FFF7F7F5FFF7F6F5FFF7F6F5FFF6F6
+      F4FFF6F6F4FFF6F5F3FFF6F5F3FFF5F4F3FFF5F4F3FFF5F4F2FFF5F4F2FFF4F3
+      F1FFDCCFC1FFAB8660FF92622FFF9C713DFFB4936CFFE3D8CAFFF5F5F4FFE9E8
+      E8FFE1E1E0FFDDDDDCFFDEDEDDFFE3E3E2FFEBEAE9FFF4F4F3FFF8F8F7FFF8F7
+      F6FFF8F7F6FFF7F7F5FFF7F7F5FFF7F6F5FFF7F6F5FFF6F5F4FFF6F5F4FFF6F5
+      F3FFF6F5F3FFF5F4F3FFF5F4F3FFF5F4F2FFF5F4F2FFF4F3F1FFF4F3F1FFF4F3
+      F0FFDCCFC0FFAB865FFF92612EFF9C703DFFB4936CFFE3D8CAFFF6F6F5FFEFEE
+      EEFFE8E8E7FFE2E2E1FFE2E2E1FFE7E7E6FFEEEDECFFF4F4F3FFF8F8F7FFF8F7
+      F6FFF8F7F6FFF7F7F5FFF7F7F5FFF7F6F5FFF7F6F5FFF6F5F4FFF6F5F4FFF6F5
+      F3FFF6F5F3FFF5F4F3FFF5F4F3FFF5F4F2FFF5F4F2FFF4F3F1FFF4F3F1FFF4F3
+      F0FFDCCFC0FFAB865FFF92612EFF9B6F3CFFB3926BFFE2D7C9FFEFEEEDFFD8D8
+      D7FFC5C5C4FFB4B4B4FFB4B4B3FFC4C4C3FFD7D6D5FFEDECEBFFF8F7F6FFF7F7
+      F5FFF7F7F5FFF7F6F4FFF7F6F4FFF6F5F4FFF6F5F4FFF6F5F3FFF6F5F3FFF5F4
+      F2FFF5F4F2FFF5F4F2FFF5F4F2FFF4F3F1FFF4F3F1FFF4F2F0FFF4F2F0FFF3F2
+      F0FFDBCEBFFFAA855EFF91602DFF9B6F3CFFB3926BFFE2D7C9FFE7E6E5FFC1C1
+      C0FFAAAAA9FFA2A2A2FFA3A3A2FFABABAAFFC1C1C0FFE6E5E4FFF0EFEEFFE0E0
+      DEFFD8D8D6FFD8D7D5FFD7D6D5FFD6D5D4FFD5D5D4FFD5D4D3FFD5D4D2FFD3D3
+      D1FFD3D2D0FFD2D2D0FFD2D1CFFFD1D0CEFFD0CFCEFFD0CECDFFD8D7D5FFEAE9
+      E7FFDBCEBFFFAA855EFF91602DFF9A6E3BFFB2916AFFE1D6C9FFDEDEDDFFA8A8
+      A7FF979797FFADADADFFAFAFAFFF9D9D9DFFADADADFFDFDEDDFFE0DFDEFFB1B1
+      B0FF999999FF999898FF979796FF959595FF949493FF939392FF929190FF9090
+      8EFF8E8E8DFF8D8D8BFF8B8B8AFF8A8989FF888887FF878686FFA1A0A0FFD7D6
+      D5FFDACDBEFFA9845DFF905F2CFF9A6E3BFFB2916AFFE1D6C9FFDCDBDAFFA0A0
+      A0FF8F8F8FFFA8A8A8FFABABABFF969696FFA7A7A7FFDCDBDBFFE0DFDEFFB0B0
+      B0FF999998FF989898FF979796FF959594FF949393FF939291FF919190FF908F
+      8EFF8E8E8DFF8C8C8BFF8B8B89FF898988FF888887FF868685FFA0A0A0FFD7D6
+      D5FFDACDBEFFA9845CFF905F2BFF996D3AFFB19069FFE1D5C8FFDFDEDDFFA9A9
+      A9FF919190FF959594FF969696FF969595FFAEAEAEFFDFDEDDFFEFEEEDFFDFDE
+      DDFFD7D6D5FFD7D6D5FFD6D6D4FFD5D4D3FFD5D4D2FFD4D3D1FFD3D2D1FFD3D2
+      D0FFD2D1D0FFD1D0CEFFD0D0CEFFD0CFCDFFCFCFCCFFCECDCCFFD7D6D5FFE9E8
+      E6FFD9CCBDFFA8835BFF8F5E2AFF996D3AFFB19069FFE1D5C8FFE6E5E4FFC1C0
+      BFFFACABAAFFA6A6A5FFA7A7A6FFAEADADFFC3C2C2FFE6E5E3FFF7F6F4FFF6F5
+      F3FFF6F5F3FFF6F5F3FFF6F5F3FFF5F4F2FFF5F4F2FFF4F3F1FFF4F3F1FFF4F3
+      F1FFF4F3F1FFF3F2F0FFF3F2F0FFF3F2EFFFF3F2EFFFF2F1EFFFF2F1EFFFF2F1
+      EEFFD9CCBDFFA8835BFF8F5E2AFF996C39FFB18F68FFE0D4C7FFF2F1F0FFE6E5
+      E3FFDFDEDCFFDCDBDAFFDCDCDBFFDEDEDCFFE5E5E3FFF1F0EEFFF6F5F3FFF5F5
+      F3FFF5F5F3FFF5F4F2FFF5F4F2FFF4F3F1FFF4F3F1FFF4F3F1FFF4F3F1FFF3F2
+      F0FFF3F2F0FFF3F2EFFFF3F2EFFFF2F1EFFFF2F1EFFFF2F0EEFFF2F0EEFFF1F0
+      EDFFD8CBBCFFA7825AFF8E5D29FF996C38FFAB865CFFCEBAA3FFE0D4C6FFE0D4
+      C5FFE0D4C5FFDFD3C5FFDFD2C5FFDED2C4FFDED2C4FFDED1C3FFDED1C3FFDDD1
+      C3FFDDD1C3FFDDD0C2FFDDD0C2FFDCCFC1FFDCCFC1FFDCCFC0FFDCCFC0FFDBCE
+      BFFFDBCEBFFFDACEBEFFDACEBEFFDACDBEFFDACDBEFFD9CCBDFFD9CBBDFFD8CB
+      BCFFC6AF97FFA1784EFF8E5D29FF986B37FF9E7443FFA9855AFFAF8D66FFAF8D
+      65FFAF8D65FFAE8C64FFAE8B64FFAD8A63FFAD8A63FFAD8962FFAD8962FFAC89
+      62FFAC8962FFAC8861FFAC8861FFAB8760FFAB8660FFAB865FFFAB865FFFAA85
+      5EFFAA855EFFA9855DFFA9855DFFA9845CFFA9845CFFA8835BFFA8825BFFA781
+      5AFFA1784EFF946535FF8D5C28FF986B37FF986B37FF976A36FF976A36FF9669
+      35FF966935FF966834FF966734FF956633FF956633FF946532FF946532FF9465
+      31FF946531FF936430FF936430FF92632FFF92622FFF92612EFF92612EFF9160
+      2DFF91602DFF90602CFF90602CFF905F2BFF905F2BFF8F5E2AFF8F5D2AFF8E5C
+      29FF8E5C29FF8D5B28FF8D5B28FF000000000000000000000000E57F660AEE88
+      5D1EEC886345EB876380EA8663AEEB8663CFEB8663E6EC8663F3EC8663F3EB86
+      63E6EB8663CFEA8663AEEB876380EC886345EE885D1EE57F660A000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000FF996605DD77550FE37C5925E57F
+      5B46E989656AEA8F6E94E99272B5EC9678CCEC987ADDED997CE8ED987BE8EC96
+      77DCEA9273CBE9906FB4E88B6A94E686656AE57F5B46E37C5925DD77550FFF99
+      6605000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000EE88550FDD79582EE27C5A5AE17C
+      5A95E48766B5E9987CBBE9A68DC2EEB6A0C6EFC1ADCBF1C8B5D1F0C5B2D1EEBB
+      A4C8EBB095C2E8A185BFE59373BBE48564B4E17C5A95E27C5A5ADD79582EEE88
+      550F000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000CC664C0AD5755225D774525ADC7D5D8EE088
+      69C1E5977BD8EBAF99D3EFC4B1D0F2D5C6CCF4E2D5CBF6E8DECEF3E6DBCEF2DC
+      CDC8EECDBBC8EBBCA6CCE7A98FD1E49479D6E08868C1DC7D5B8ED774525AD575
+      5225BF5F3F08AA55550300000000000000000000000000000000000000000000
+      0000000000000000000000000000CC6E441ECF6D4C46D26E4D94D87F60C0E09D
+      84CAE9BAA6D3F2D6C8DBF6E5DCDFF8ECE3DEF8F0E9DEF9F1EBDFF8F1E9DFF8EE
+      E5DCF5E6DDDBF2DDD0DBEECEBDD7E9B7A2D1E09C82CAD87F5FC0D26E4B94CF6D
+      4C46C76E4217BF5F3F0800000000000000000000000000000000000000000000
+      0000000000000000000000000000C7633E45CA6D496BCF7353B5D7896ED7E4B4
+      A0D2EBCBBBD6E9CBBDE5EBCDBFECEACCBFEDEED7CCEDF6EAE4EDF6EAE4EDEED7
+      CCECE8C8BAECE8C6B5E9E8C4B4E1E9C6B4D5E4B29CD1D88A6BD6D07452B4CA6D
+      496BC4663F34D2694B1100000000000000000000000000000000000000000000
+      0000000000000000000000000000C15D3B80C66C4B94CE7F61BCDA9F86D2EBCC
+      BDD9E8C7B7E3D5957DF2CD8064F9CD8064F9D89C87F9EED3CBF9EED3CBF9D89B
+      87F9CC7D62F9CC7D60F8D49279F0E6C3B1E2E9C9B6D7DA9D81D1CF7F5EBAC66C
+      4A94C15F3A60C75F3F2000000000000000000000000000000000000000000000
+      0000000000000000000000000000BB5736AEC26A49B4CE8A6EC1DEB19BCDEED9
+      CBDBE5C3B3E9C97A5DF8C06242FEC97659FCD89C86FAEDD1C8F8EDD1C8F8D89C
+      86FAC97659FCC06242FEC9795CF7E4C1AEE8EDD7C6D9DDAE95CBCE886ABEC369
+      48B3BC583682BD58352B00000000000000000000000000000000000000000000
+      0000000000000000000000000000B5502ECFBD6747CBD0967BC4E2C1ACC8EFDD
+      CFD8E3C0AEE8C47457F7C26F51FCDCAC99F7EDD3C7F1F1E2D9EBF1E2D9EBEDD3
+      C7F1DCAC99F7C26F51FCC47457F7E2BFADE8EEDCCCD7E2BDA6C4D09376C0BD66
+      45CAB4502F9BB54E313400000000000000000000000000000000000000000000
+      0000000000000000000000000000B04B29E6BB6645DCD29F86C9E7CFBCC7F0E3
+      D5D9E8CBBDE9CE907AF8D0947DFBECD3C8F2F9F2EBE9F5ECE3E0F5ECE3E0F9F2
+      EBE9ECD3C8F2D0947DFBCE9078F7E5C9B9E8EEE0D0D7E6CAB4C3D19B80C5BA64
+      43DBB04B29ACAF4A2B3A00000000000000000000000000000000000000000000
+      0000000000000000000000000000AD4825F3BA6445E7D6A78FD0ECD9C9CCF5EB
+      E2DCF4E7DEEBE9CEC4F9EAD1C6FAF4E8E2EFF9F2EDE4F6EEE6D8F6EEE6D8F9F2
+      EDE4F4E8E2EFEAD1C6FAE9CDC2F7EFDFD3E8EFE2D3D8E9D3BEC6D3A187CCB962
+      42E6AC4825B7AB47253D00000000000000000000000000000000000000000000
+      0000000000000000000000000000AC4623F3B86244E8D6A88FD1EDDACCCDF5ED
+      E5DEF5E9E1ECE9CEC4F9E9CFC5FAF5E9E4EFFAF4F0E5F7F0EBDAF7F0EBDAFAF4
+      F0E5F5E9E4EFE9CFC5FAE8CBC0F7EFDFD3E8EFE2D3D8E9D2BEC7D4A188CCB761
+      41E7AB4522B7AB47253D00000000000000000000000000000000000000000000
+      0000000000000000000000000000AB4422E6B86041DDD3A188CCE9D2C1CCF5EB
+      E3DDEBD2C6ECCC8E77F9CE907AFBECD5CBF4FCF8F5ECFAF4F0E5FAF4F0E5FCF8
+      F5ECECD5CBF4CE907AFBCB8A72F7E5C8B7E8EFE0D0D7E6C9B5C5D09980C7B75D
+      3EDCAB4423ACAB46233A00000000000000000000000000000000000000000000
+      0000000000000000000000000000AE4423CFB95E40CDD1957BC8E5C3B3CEF3E6
+      DDDEE7C6B9ECC06E52F9BE664AFDDCA999F8EFD6CDF4F6E9E4EFF6E9E4EFEFD6
+      CDF4DCA999F8BE664AFDBE6A4DF7E1BDAAE8EDDACCD9E1BBA7C8CE8E74C3B85C
+      3DCBAE45249BB044273400000000000000000000000000000000000000000000
+      0000000000000000000000000000B44726AEBD5D3FB6CC856CC6DFB09ED4F1DF
+      D6E1E7C7BAEDC56F54F9BA5333FEC3684CFDD5927DFBECD0C6FAECD0C6FAD592
+      7DFBC3684CFDBA5333FEC36C50F8E3BDACE9EBD5C7DCDBAA93CFCB8065C2BC5C
+      3CB4B4482582B747292B00000000000000000000000000000000000000000000
+      0000000000000000000000000000B9492780C15C3D95CB7358C0DA9984D8EDCE
+      C3DFEACABDE8D38E78F4C67256FAC77156F9D3907BF9ECCFC6F9ECCFC6F9D390
+      7BF9C77056F9C77054F9D08A72F3E6C2B2E6E7C6B7DDD5937AD7C76F53C0B858
+      3A98AD472864B145262100000000000000000000000000000000000000000000
+      0000000000000000000000000000C04D2845C358366BC95F40B6D37C62DBE6B4
+      A3DAEDCEC2DFEACBBFEAE8C9BCEFE8C7BBEEECD2C8EDF5E8E3EDF5E8E3EDECD2
+      C8EDE8C7BAEDE9C5B8ECE9C6B8E8E8C7B9E1DFAD9BDECE785DE0BF5C3DBEA751
+      37778D44303F9148301500000000000000000000000000000000000000000000
+      0000000000000000000000000000C3552A1EC8533346CB543394D36B4EC2E095
+      7FD0EBB7A7DBF2D5C9E2F7E6DEE4F8EAE5E2F9F0EAE1FAF3EEE2FAF3EEE2F9F0
+      EAE1F8E9E2E1F5E1D8E1F0CFC2E0E4B09FE0D8927DE2C87359EAB56149C78B57
+      4D77564A523E4848511C48486D07555555030000000000000000000000000000
+      0000000000000000000000000000CC4C330ACE523025CE55355AD562418FDB71
+      52C3E2866BDCEBA692DBEFBFB0D9F3D3C9D5F6E2D9D5F7ECE5D9F7ECE3D9F6E3
+      DAD4F2D1C6D4EEBBABD6E59F8ADBD98066E3CF765DEBC2806CF5AB7D72DA7366
+      6D9A424F67633E4C603539455C163F3F5F080000000000000000000000000000
+      000000000000000000000000000000000000DD55330FD258372EDA5D385AD95E
+      3A95DE6C4EB7E6876DC2E99B85CBEDAD9BCFF0BAAAD5F3C3B4DCF2C3B3DCF1BA
+      AAD4EDAC99CEE99780C8DF8065C3D06447C1BE644DC9AA7A6FDD8E7E83D85E6F
+      8BBA3E6692963D66966B3C66984339628B1F334C660A55555503000000000000
+      000000000000000000000000000000000000CC663305DD55330FDC603E25DA5E
+      3D46E268496BE7735596E7785AB8E87C5ECFEA7F63E0EB8264EBEA8264EBEA7F
+      63E0E87B5ECFE77657B7DD6B4D9AC2593C7A8F52457C67585EA2536480C14873
+      AAD8427ABAD73F77B6BE3E72AE8F3E63904A3D46601D334C660A000000000000
+      0000000000000000000000000000000000000000000000000000DF5F3F08DD58
+      4217E6624434E7644260E5634083E664419BE56440ADE76341B6E76341B6E564
+      40ADE664419BE5634083DB5E3D64B04E3341564044472F425C77305A88AC3E78
+      B9E34181C6F93F7CC0EE3D77B9C63E6EA7833E66914D3E6089253A4E620D3333
+      6605000000000000000000000000000000000000000000000000AA555503DF5F
+      3F08F0694B11E7673F20E2623F2CE6623F34E465413AE564423DE564423DE465
+      413AE6623F34E2623F2CE05C3D21AD512E16445069292F537F5C3468A0973D7B
+      C0DB3E80C8FC3E7EC7F93E7DC3E83F79BACA3F74AF993E6491563F4C5F283648
+      5B0E000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000336699142F63973B366EAB713B77
+      BCB53C7CC4E13D7FC8F43E7EC7FA3F7CC3F14079B9CE4071A78E41638D5A3C58
+      7F2E3C5A69115555550600000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000246D91073366991432649F383366
+      A3723670B1AA3C7BC2E13D7EC9FB3E7EC7FA407DC4EB417BBBCF4173ACA33F62
+      8A653F5362344B4B691100000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000000000000000000026598C142A55
+      883C31649E723872B7B63B78C0E23D7DC6F53F7FC7FA407DC4F33F79B9D43E6B
+      A19C3D648C603C618E227F7FFF02000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000244891072659
+      8C142C598F392D5D9475356AA8AD3B79BFE23D7EC8FB3F7FC7FA3E7CC3ED3D77
+      BAD33D76B5953C78B4374891B607000000010000000100000001000000020000
+      0002000000020000000300000003000000040000000500000005000000060000
+      000700000007000000080000000800000009000000090000000A0000000A0000
+      000B172F47201B395F4B29558780356DAABF3976BBE63D7CC4F63D7DC6F23C78
+      BCDD3B76B89F3874B53B38718D09000000020000000200000003000000050000
+      000500000007000000080000000A0000000C0000000E00000010000000110000
+      00140000001500000017000000180000001A0000001C0000001D0000001F0000
+      0020060C12290D1B28381C395859254D768E2F6097BC3976B9E53B7BC1E4386F
+      AFBA3568A37D3061972F1F1F3F08000000020000000300000004000000050000
+      0006000000080000000A0000000C0000000E0000001000000013000000140000
+      0017000000190000001B0000001C0000001F0000002100000022000000240000
+      002600000028000000290C19263B152E465E264C7885356EAEAF3876B9AF3365
+      A1852F588B56264D7B2100000007000000010000000200000003000000040000
+      00050000000600000007000000090000000A0000000C0000000E0000000F0000
+      00100000001200000014000000150000001600000018000000190000001A0000
+      001B0000001D0000001E070E15240F1F2F301B3B5F402A5B8E542E629953294E
+      7F3E1F3E63291E2D4B1100000005000000010000000200000003000000030000
+      0004000000050000000600000007000000080000000A0000000B0000000C0000
+      000D0000000F0000001000000011000000120000001300000014000000150000
+      0016000000170000001800000018000000190811231D142E492614304B250912
+      251B000000120000000900000004000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000AF6F3F10AF644530B36F4740BF7B4B40C7875B40CF9B6F40D3A37740D39F
+      7740CB976B40C3835340B7734740B36B4340AF644530AF6F3F10000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000AF6A4530B267438FB56E46BFBE7A4CBFC6895ABFCE9A6EBFD2A278BFD2A1
+      76BFCD966ABFC28255BFB97448BFB26A44BFB067438FAF6A4530000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000BF7F5F10BF7F
+      5530BF7F5870C08059CFC3865EFFCB9368FFD29F75FFD9AC85FFDCB28CFFDBB1
+      8CFFD7A982FFCF9A71FFC78D64FFC0825AFFBC7C56CFBA7A5470B97A4F30BF7F
+      4F10000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000BF7F5A30BE7E
+      578FC88E65CFD6A77DEFDFB78FFFE5C29FFFE9CAAAFFECCFB2FFEDD2B5FFEDD2
+      B5FFECCEB1FFE8C9A9FFE2BE9BFFDAAF87FFD19D74EFC3865DCFBB794E8FB97A
+      4F30000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000BF6F4F10B9744A30C3885F70CA92
+      6CCFD4A47DFFE5C19AFFF0D4B0FFF4DDBFFFF2DEC4FFECD8C0FFE9D6BEFFEBD8
+      BFFFEEDAC1FFF3DEC3FFF2DABBFFEBCDA8FFE0B991FFD09D75FFC68C65CFBF7F
+      5870B46F4530AF6F3F1000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000B9744A30BB75498FC78D63CFDCB3
+      8DEFE9C9A7FFF0D6B7FFF5DEC1FFF7E3C8FFECDBC2FFD7C7B0FFCEBFA8FFD4C3
+      ABFFDFCDB3FFEEDBBFFFF5E0C3FFF2DBBDFFEDD2B2FFE6C4A2FFD9AC88EFC386
+      5ECFB56E438FB46A453000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000C7875B40C5885CBFD09D74FFE8C7
+      A4FFF4DDC0FFF6E2C8FFF8E6CDFFF9E9D1FFDFD1BBFFAA9F8DFF978C7AFFA397
+      84FFBEAF98FFE4D2B6FFF8E4C6FFF7E2C6FFF5E0C2FFF2DBBCFFE4C09FFFCB93
+      6BFFBD7C51BFBB7B4F4000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000DBAB7F40DAAD82BFE1BA93FFEFD4
+      B4FFF6E2C7FFF8E7CDFFFAEBD3FFFBEED9FFCAC0B0FF676157FF423D35FF5A54
+      49FF8B816FFFD5C4A9FFF9E5C4FFF8E3C1FFF6E1C0FFF5E0C3FFEBCDAEFFD8AA
+      81FFCE986ABFCF976B4000000000000000000000000000000000000000000000
+      0000000000000000000000000000BB774B40D6A67A70E6C199CFECCFAAFFF3DC
+      BFFFF8E5CCFFFAEAD1FFFBEED8FFFCF2E0FFBFB8ADFF45423DFF171512FF3532
+      2BFF726A5CFFCDBEA3FFF9E6C4FFF8E3BDFFF7E1BDFFF6E2C4FFEFD5B6FFE3BD
+      95FFD8AB7ECFCA916870B46A4530AF6F3F100000000000000000000000000000
+      0000000000000000000000000000BD794ABFCD966BCFE6C3A0EFF1DABBFFF6E1
+      C5FFF9E7CDFFFBECD4FFFCF0DCFFFDF5E6FFC0BBB2FF45433EFF171512FF3632
+      2CFF726A5DFFCDBFA5FFFAE7C5FFF9E3BBFFF7E1B9FFF6E1BFFFF2DAB8FFEACC
+      A6FFDCB38AEFC2865ECFB46A438FB46A45300000000000000000000000000000
+      0000000000000000000000000000BE7B4CFFCC9469FFE7C6A5FFF5E0C4FFF7E4
+      C8FFEADAC0FFCDC2ADFFBFB7A8FFC0BAB0FF928F88FF363431FF13120FFF2B27
+      22FF585147FF9C917EFFC1B298FFC8B694FFD5C29DFFEBD5B1FFF4DCB7FFF0D5
+      B1FFDFB893FFC2845DFFB26A42BFB36B43400000000000000000000000000000
+      0000000000000000000000000000C07E4DFFCD976CFFE8C9A8FFF6E2C7FFF8E5
+      C7FFCCBDA3FF726B5DFF45423BFF45433EFF363431FF171614FF0C0B08FF1412
+      0FFF23201BFF39352DFF50493DFF655B48FF928368FFD4BE9AFFF5DBB3FFF3D9
+      B5FFE2BD99FFC3875FFFB46C42BFB36B43400000000000000000000000000000
+      0000000000000000000000000000C07E4DFFCD986CFFE9CAAAFFF7E3C8FFF8E5
+      C5FFC1B197FF4F493EFF171511FF171511FF13110EFF0C0B08FF090806FF0B0A
+      07FF0F0D0AFF14120EFF252119FF40392AFF786A52FFCCB58FFFF5DBB1FFF3DA
+      B6FFE3BE9BFFC48860FFB46C42BFB36B43400000000000000000000000000000
+      0000000000000000000000000000BD7A4BFFCC956BFFE8C9ABFFF7E4C8FFF8E4
+      C4FFC8B79BFF665D4FFF353029FF353029FF2A2620FF13120EFF0B0907FF100F
+      0BFF1C1813FF2D281FFF413A2CFF584E39FF88785BFFD1BA92FFF4DAB0FFF2D8
+      B3FFE2BD99FFC3875FFFB46C42BFB36B43400000000000000000000000000000
+      0000000000000000000000000000B97448FFC88E66FFE5C4A4FFF5E0C2FFF7E2
+      C1FFD6C4A6FF938670FF716756FF716757FF574F43FF221F1AFF0F0D0AFF1C19
+      13FF363026FF5D5340FF796B50FF887755FFA9956EFFDCC49CFFF3D9B1FFEFD3
+      ADFFDEB791FFC1845CFFB26942BFB36B43400000000000000000000000000000
+      0000000000000000000000000000B36B44FFC2855FFFE0B995FFF1D7B5FFF5DF
+      BEFFECD8B7FFD6C3A0FFCBB997FFCCBA9AFF9B8E76FF39342BFF14120EFF2D28
+      1FFF5D5341FFA69471FFCCB586FFD0B67FFFDBC08CFFEDD5ADFFF2D8B5FFEACA
+      A2FFD9AC83FFBD7D57FFB06541BFAF673F400000000000000000000000000000
+      0000000000000000000000000000B06642BFC0815CCFD9AD87EFE9C8A3FFF2DA
+      B9FFF7E2C1FFF8E1B9FFF8E1B6FFF8E1B6FFC0AE8CFF4F4738FF252117FF413A
+      2AFF796B4FFFCCB484FFF6D99EFFF4D79BFFF4D8A4FFF3DEB9FFE9D4B4FFD7BA
+      93FFC79D75EFB77955CFAE63408FAF643F300000000000000000000000000000
+      0000000000000000000000000000AF674340C3886170D09D76CFDCB38DFFEDD3
+      B4FFF6E1C4FFF7E0BCFFF7DEB3FFF7DCABFFC6AF84FF655841FF403826FF584D
+      35FF887651FFD0B47BFFF5D698FFF5DAA8FFF3DCB5FFEFDFC0FFDACBADFFB4A1
+      7EFFA28863CFA67A5670AF643F30AF5F3F100000000000000000000000000000
+      000000000000000000000000000000000000C3876340C48861BFCF9B76FFE3C1
+      A0FFF0D6B7FFF4DDBBFFF6DEB7FFF6DCADFFD4BC8FFF918060FF78694DFF8877
+      57FFA9946BFFDBBF88FFF4D7A1FFF3DCB3FFEAD9BAFFD9D0B4FFBDB89DFF998F
+      76FF7E7B6BCF5D788A702574BF301F7FBF100000000000000000000000000000
+      000000000000000000000000000000000000B76F4F40B5714DBFC0825DFFD4A4
+      7DFFE3BF9CFFF0D6B7FFF6E1C2FFF5DFBCFFEAD3ADFFD3BD97FFCBB48EFFD0BA
+      92FFDBC59CFFECD5ADFFF3DDB8FFEFDDBEFFD9CEB2FFB0B395FF949B82FF8686
+      7BFF6C7A86EF4078AACF2577BE8F257ABF300000000000000000000000000000
+      000000000000000000000000000000000000AF644530AE65438FB97550BFCC95
+      6CBFDBB089CFE5C3A2EFEBCDAEFFEED3B2FFF0D6B2FFF1D6ADFFF1D6ACFFF1D6
+      ACFFF0D6AEFFEFD5B2FFE9D0B1FFE0C7A9FFC3B49AFF939882FF78897EFF7189
+      8FFF5D86A3FF3B81B8FF297CBECF2671B37025649F301F5F9F10000000000000
+      000000000000000000000000000000000000AF5F3F10AF644530B7734F40CB93
+      6B40CF9F7670CE9B73CFD4A47CFFDFB68FFFE6C39DFFEACBA4FFECCDA7FFEBCD
+      A5FFE9C8A0FFE4C098FFD8B18AFFC59B76FFA88B71FF837F7BFF698491FF5C98
+      B4FF4D9DC6FF3D93C7FF3284C0EF2970ACCF2363A08F25649F30000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000BF845A30C283578FC68C61CFD09B72EFD6A77EFFDAAF88FFDCB28CFFDBB1
+      8AFFD9AC83FFD4A379FFC9966CEFB78359CF9A765DBF7A7278BF5D809DCF4998
+      C3EF40A0D1FF3E9BCFFF388DC5FF2E77B2FF2769A6CF246198701F5584301F4F
+      8F10000000000000000000000000000000000000000000000000000000000000
+      0000BF7F5F10BF845530BF7F5670BE7E55CFBF8056FFC18259FFC1835BFFC183
+      5AFFC08158FFBF7E54FFBC7C52CFB67A51709B775B407B7377404B7DA6703685
+      BCCF368DC6FF3D9AD0FF3D98CEFF3587BFFF2D76AEEF266096CF2153878F1F55
+      8A30000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000B46A4530B46C438FB46C42BFB46C42BFB46C42BFB46C
+      42BFB46C42BFB46C42BFB46C438FB46A453000000000000000002A7AB9302A79
+      B98F3081BDCF388EC6EF3B93C9FF388FC7FF3280B8FF28669CFF23588DCF2256
+      8A701F5584301F4F8F1000000000000000000000000000000000000000000000
+      00000000000000000000AF6F3F10B46A4530B36B4340B36B4340B36B4340B36B
+      4340B36B4340B36B4340B46A4530AF6F3F1000000000000000002F7FBF102A7A
+      B9302D76B1702E76AECF327EB7FF378EC8FF368AC4FF2D72AAFF276298EF2358
+      8DCF2153878F1F558A3000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00002A6A9F302967A08F2D73ADCF3486C2EF3689C4FF307CB7FF2B6DA6FF255B
+      91FF215286BF1F53874000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00002F6F9F102A649F302D6FA8702E77B0CF317CB7FF3383C3FF307AB8FF2660
+      97FF215286BF1F53874000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000002A6AA4302A6EA58F2D73ADCF307CBBEF2E77B5EF2661
+      98CF2153878F1F558A3000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000002F6F9F102A6FA43028669F7027629BCF266198CF245B
+      91701F5584301F4F8F1000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000001F538740215286BF215286BF1F53
+      8740000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000BF6F4F10B9744A30BB734740BB7B
+      4B40BF7B4B40BB7B4B40BB774B40B76F4740B46A4530AF6F3F10000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000B9744A30B973498FBA7549BFBD7A
+      4CBFBE7C4DBFBD7A4CBFBA764ABFB66E46BFB46C458FB46A4530000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000BF6F4F10B9744A30BF835740D39F7740CF9D7170C78E66CFC88F66FFCB95
+      6CFFCC976EFFCB956CFFC89068FFC48962FFC38760CFC88F6470C78F6340B773
+      4B40AF643F30AF5F3F1000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000B9744A30B973498FC18258BFD2A178BFDDB68DCFE1BB95EFE4C29FFFE8CA
+      ACFFE9CCB0FFE8CAACFFE5C4A3FFE1BC97FFDBB289EFD5A578CFC98E62BFB872
+      4CBFAE63418FAF643F3000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000BF6F4F10B46F
+      4A30BF7F5470C3875DCFCC966DFFDBB08AFFE6C5A1FFEED4B1FFF3DEBFFFF7E5
+      CCFFF7E7D0FFF7E5CBFFF4E0C3FFF1D9B8FFEACBA7FFE0B790FFD3A078FFC283
+      5DFFB8734ECFB36D4870AF643F30AF5F3F100000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000B96F4A30B772
+      498FC3865DCFD5A77EEFE2BD97FFEBCDADFFF1D9BCFFF4DFC2FFF6E3C7FFF8E6
+      CCFFF8E7CDFFF8E6CAFFF7E3C6FFF5E0C3FFF2DABEFFEFD4B6FFE6C3A1FFD6A6
+      7EFFC78D64EFB8734ECFAE63418FAF643F300000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000C3835740C182
+      59BFCD966EFFE2BD98FFF0D5B4FFF4DFC3FFF7E5CCFFF8E7CEFFF8E9D0FFF9E9
+      D0FFF9E9CFFFF9E8CCFFF9E6CAFFF8E4C8FFF7E3C7FFF7E2C7FFF1D8B9FFE6C2
+      9DFFD5A67EFFC0815BFFB57049BFB76F47400000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000D7A77B40D5A6
+      7CBFDEB48DFFECCFAFFFF5DFC3FFF7E4CAFFF9E9D1FFFAECD6FFFBEED9FFFBEE
+      D9FFFBEDD6FFFAEBD2FFFAE9CDFFF9E7C7FFF8E4C4FFF8E3C3FFF5DFC0FFF1D7
+      B9FFE4C19FFFCE9972FFC4865ABFC3835B400000000000000000000000000000
+      000000000000000000000000000000000000BF7F4F10B9744A30D1A17670E1BB
+      93CFEACAA5FFF2DBBDFFF7E5CCFFF9E9D0FFFBEDD6FFFCF0DEFFFCF2E2FFFCF2
+      E2FFFCF1DEFFFBEED8FFFBECD1FFFAE9C8FFF9E5C2FFF8E3BFFFF7E2C0FFF6E2
+      C6FFEDD1B2FFDAAE86FFCE986BCFC1845B70AF643F30AF5F3F10000000000000
+      000000000000000000000000000000000000B97A4A30BB774A8FCB9369CFE4C1
+      9CEFF1D7B7FFF5E0C4FFF8E7CDFFFAECD4FFFCF0DCFFFDF4E5FFFDF6EBFFFDF7
+      EBFFFDF5E7FFFCF1DFFFFCEDD6FFFBEACBFFFAE6C3FFF9E2BAFFF7E1BBFFF6E2
+      C3FFF0D6B7FFE3BF97FFD4A378EFBD7C56CFAE63408FAF643F30000000000000
+      000000000000000000000000000000000000BF7B4B40BD7A4CBFCB9369FFE6C5
+      A3FFF1DCBFFFEBD9BEFFDECFB7FFCABEABFFBFB7A9FFC0BAB0FFC0BCB5FFC0BD
+      B5FFC0BBB2FFBFB7ABFFBFB4A3FFBEB19BFFC1B296FFC8B593FFD5C29EFFEBD7
+      B6FFF1D9B7FFE9CAA2FFD9AB82FFBE7E57FFB06641BFAF673F40000000000000
+      000000000000000000000000000000000000C37F4F40C1814EBFCF996CFFE9C9
+      A8FFEBD7BDFFD6C5ACFFA99D89FF676054FF45423CFF45433EFF454340FF4544
+      40FF45433FFF45423CFF45413AFF454037FF50493CFF655B48FF928369FFD4C0
+      9FFFF2D9B4FFECCEA9FFDCB18BFFC1835AFFB46A42BFB36B4340000000000000
+      000000000000000000000000000000000000C3834F40C48450BFD19C6EFFEACB
+      ABFFE9D6BDFFCEBDA4FF968A76FF413C33FF171511FF171512FF171512FF1715
+      12FF171512FF171511FF171511FF171511FF252119FF40392AFF786B53FFCCB7
+      94FFF2D9B1FFEDD0ACFFDDB48FFFC2855CFFB56D42BFB36B4340000000000000
+      000000000000000000000000000000000000C3834F40C2824EBFD09B6EFFE9CA
+      ABFFEAD7BEFFD3C2A7FFA3957FFF5A5346FF35312AFF35322BFF35322BFF3532
+      2BFF35322BFF35312AFF353128FF353028FF413A2DFF584E39FF89795CFFD1BB
+      95FFF2D8B0FFEDCFABFFDDB38FFFC2845CFFB46C42BFB36B4340000000000000
+      000000000000000000000000000000000000BF7F4F40C07D4DBFCD976CFFE8C7
+      A8FFEDD9BEFFDECBAEFFBDAD92FF8B7F6AFF716958FF726A59FF726A5AFF726A
+      5AFF726A5AFF716958FF716855FF716752FF796C52FF887856FFAA956FFFDCC5
+      9DFFF2D7B0FFEBCCA7FFDBAF8AFFC0815AFFB26942BFB36B4340000000000000
+      000000000000000000000000000000000000BB734B40B97449BFC88E67FFE5C2
+      A2FFF1DBBDFFEED8B9FFE4D0AFFFD4C2A1FFCCBC9BFFCDBD9EFFCDBDA0FFCDBD
+      A1FFCDBD9FFFCCBC9CFFCCBA97FFCBB891FFCCB689FFD0B57FFFDBC08BFFEDD4
+      ACFFF1D7B3FFE8C79FFFD6A880FFBD7C56FFB06541BFAF673F40000000000000
+      000000000000000000000000000000000000B96F4A30B76E478FC78D67CFE2BC
+      9BEFEFD5B5FFF5DDBDFFF8E2BFFFF8E2BAFFF8E3B9FFF9E4BBFFF9E4BDFFF9E4
+      BDFFF9E3BBFFF8E2B7FFF8E0B1FFF7DDA8FFF5D9A0FFF4D598FFF4D79FFFF3DD
+      B6FFEAD4B2FFD8BA93FFC89D75EFB87955CFAE63408FAF643F30000000000000
+      000000000000000000000000000000000000BF6F4F10B46F4530CF9A7470E0B8
+      92CFE8C7A4FFF2D9BBFFF7E1C1FFF7DFB6FFF7DEB0FFF8DFB0FFF8DFB0FFF8DF
+      B0FFF8DEAEFFF7DDA9FFF6DAA2FFF5D697FFF4D597FFF4D7A0FFF3DAACFFEFDE
+      BCFFDDCDAEFFBCA682FFAC9068CFAD7F5870AF643F30AF5F3F10000000000000
+      0000000000000000000000000000000000000000000000000000D3A37B40D4A4
+      7CBFDCB18CFFEBCEAFFFF4DCBDFFF5DDB7FFF6DDB2FFF7DDAEFFF7DCAAFFF6DB
+      A8FFF6DAA5FFF5D9A1FFF5D79DFFF4D598FFF4D69EFFF5DAACFFEDD9B4FFDED3
+      B5FFC5BCA1FFA49478FF8B806BCF647D8A70257AC4302F7FBF10000000000000
+      0000000000000000000000000000000000000000000000000000BF7F5740C080
+      58BFCB936DFFE0BB98FFEFD3B2FFF4DCBDFFF6E0BDFFF6DEB5FFF6DBACFFF5D9
+      A5FFF5D7A1FFF4D79FFFF4D8A2FFF5DAA9FFF5DCB3FFF6DFBDFFE4D4B7FFBFBE
+      A0FFA3A38AFF8F8375FF71757BEF4377A7CF2779C48F2A7AC430000000000000
+      0000000000000000000000000000000000000000000000000000B46A4530B56E
+      458FC1825BCFD3A37DEFE0B996FFEACAACFFF0D5B5FFF2D8B3FFF4DAAFFFF4DA
+      ACFFF5D9A9FFF4D8A7FFF3D8AAFFF2D8AFFFEDD5B2FFE4CFB1FFCCBFA5FFA5A4
+      8BFF8A9081FF7A8486FF607E96FF3B7CB3FF297AC1BF2B7BC340000000000000
+      0000000000000000000000000000000000000000000000000000AF6F3F10B46F
+      4530BA785170C08059CFC98F69FFD7A984FFE3BE99FFEBCDA8FFF1D7B4FFF4DD
+      BBFFF6DEBDFFF5DDB9FFF2D8B3FFEDCFAAFFDCC19CFFC0AC8AFFA7987EFF9085
+      77FF7A8485FF6695A9FF5197BBFF3987BEFF2D80C0BF2F7FBF40000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000B46A4530B46A438FBD7A52BFCE9870BFD8AC85CFDBB48EEFE0BA99FFE4C1
+      A3FFE6C4A6FFE5C2A2FFE2BD9BFFDCB28EFFCCA781EFAE9672CF8C8371CF7276
+      7DEF607E96FF5198BDFF459FCDFF3A91C7FF3388C2CF2F7DB6702A6A9F302F6F
+      9F10000000000000000000000000000000000000000000000000000000000000
+      0000AF6F3F10B46A4530BB7B5340CF976F40C8916B70C1855ECFC1835EFFC488
+      62FFC58A63FFC48962FFC38660FFBF815BFFBB8058CFAF845F70667F8F704377
+      A8CF3C7DB4FF3C8CC2FF3C96CBFF3D9ACFFF3992C7EF2E78B0CF2969A28F2A6A
+      9F30000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000AF6A3F30B067408FB16841BFB46A
+      42BFB56D42BFB46C42BFB26A42BFB16841BFB067408FAF6A3F302A7AC4302779
+      C48F297BC1CF2E7EBDEF3488C2FF3C97CDFF3B94C9FF327FB8FF2C73ACCF2B6B
+      A170255F94302F5F8F1000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000AF6F3F10AF643F30AF673F40B36B
+      4340B36B4340B36B4340B36B4340AF673F40AF643F30AF6F3F102F7FBF10257A
+      C4302671B670286EADCF2D76B2FF3588C0FF3990C7FF388FC9FF3485BEEF2C6D
+      A5CF275E958F2A5F943000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00002564A4302363A48F286BA7CF2E77AEEF3382BAFF388EC8FF368AC5FF2F76
+      B0FF2969A2CF266196701F538740000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00001F5F9F102564A43024619A70266197CF2A6AA1FF317DB7FF3486C3FF3485
+      C5FF307AB8EF276299CF215286BF000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000001F558A302153898F245D93CF2B6DA6EF2F78B4FF3180
+      BFFF2E79B7EF276199CF215286BF000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000001F4F8F101F558A3022588F70245D92CF266097FF2865
+      9EFF27669ECF265F96701F538740000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000001F538740215286BF225489FF2358
+      8EFF225A90BF235B8F4000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000000000000000000000140000005E0000007A0000
+      007A0000007A0000007A000000700000002A0000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000000000000000000029000000C1000000FB0000
+      00FB000000FB000000FB000000E6000000570000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000015000000590000007400000088000000910000
+      009100000091000000910000008E0000007A000000680000002B000000040000
+      003F0000006C0000003400000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000030000000C6000000CE00000040000000090000
+      000900000009000000090000001C000000A4000000E800000060000000090000
+      008C000000F20000007600000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000001F0000007E0000008200000024000000000000
+      000000000000000000000000000D00000067000000990000007A000000690000
+      00BC000000FB0000007A00000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000030000000C0000000D00000003000000000000
+      00000000000000000000000000010000000A0000001C00000099000000F10000
+      00F9000000FB0000007A00000000000000000000002A00000057000000580000
+      005800000058000000580000003A000000070000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      00000000000000000000000000070000003A00000062000000BE000000FF0000
+      00FF000000FB0000007A000000000000000000000070000000E6000000EA0000
+      00EA000000EA000000EA00000099000000130000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      000000000000000000000000001300000099000000EB000000F7000000FF0000
+      00FF000000FB0000007A000000000000004E003A3AA2004E4EFC224E4EFF4B4E
+      4EFF304E4EFF054E4EFF004343C20010105D0000004E0000004E0000004E0000
+      004E0000004E0000004E0000004E0000004E0000004E0000004E0000004E0000
+      004E00000046000000180000000F00000075000000B1000000B1000000B10000
+      00B1000000AE0000005500000000000000E4007373F100E0E0FF62E4E4FFDCE4
+      E4FF8BE4E4FF0DE4E4FF009B9BF6001515E6000000E4000000E4000000E40000
+      00E4000000E4000000E4000000E4000000E4000000E4000000E4000000E40000
+      00E4000000CC0000004600000002000000120000001B0000001B0000001B0000
+      001B0000001B0000000D00000000000000FF207A7AFF43FBFBFF78FFFFFFB6FF
+      FFFF8CFFFFFF4BFFFFFF2DBEBEFF065353FF154444FF3D4444FF324444FF0944
+      44FF104444FF394444FF374444FF0D4444FF0B4444FF344444FF3B3B3BFF1212
+      12FF000000E40000004E00000000000000000000000000000000000000000000
+      0000000000000000000000000000000000FF6A7A7AFFDAFBFBFF8DFFFFFF29FF
+      FFFF6BFFFFFFD2FFFFFF91F3F3FF12E0E0FF44DDDDFFC6DDDDFFA2DDDDFF1DDD
+      DDFF33DDDDFFB9DDDDFFB2DDDDFF2BDDDDFF24DDDDFFAADDDDFFC0C0C0FF3B3B
+      3BFF000000E40000004E00000000000000000000000000000000000000000000
+      0000000000000000000000000000000000FF5E7A7AFFC1FBFBFF88FFFFFF40FF
+      FFFF70FFFFFFBBFFFFFF94FFFFFF46FFFFFF65FFFFFFB5FFFFFFA0FFFFFF4DFF
+      FFFF5AFFFFFFAEFFFFFFAAFFFFFF55FFFFFF51FFFFFFA5FFFFFFAADDDDFF3444
+      44FF000000E40000004E00000000000000000000000000000000000000000000
+      0000000000000000000000000000000000FF147A7AFF29FBFBFF74FFFFFFCEFF
+      FFFF92FFFFFF35FFFFFF66FFFFFFC6FFFFFFA1FFFFFF3DFFFFFF58FFFFFFBFFF
+      FFFFAEFFFFFF46FFFFFF4CFFFFFFB3FFFFFFB9FFFFFF51FFFFFF24DDDDFF0B44
+      44FF000000E40000004E00000000000000000000000000000000000000000000
+      0000000000000000000000000000000000FF187A7AFF31FBFBFF76FFFFFFC8FF
+      FFFF90FFFFFF3BFFFFFF68FFFFFFC0FFFFFF8EF0F0FF16D2D2FF37CDCDFFB2CD
+      CDFF9ECDCDFF22CDCDFF28CDCDFFA5CDCDFFABCDCDFF2FCDCDFF00B2B2FF0037
+      37FF000000E90000007100000032000000320000003200000032000000320000
+      0032000000320000003200000032000000FF627A7AFFCAFBFBFF89FFFFFF37FF
+      FFFF6FFFFFFFC4FFFFFF97FFFFFF3FFFFFFF23C0C0FF054848FF0D3232FF2B32
+      32FF263232FF083232FF0A3232FF283232FF2A3232FF0C3232FF002B2BFF000D
+      0DFF000000FA000000DC000000CD000000CD000000CD000000CD000000CD0000
+      00CD000000CD000000CD000000CD000000FF667A7AFFD2FBFBFF8BFFFFFF31FF
+      FFFF6DFFFFFFCAFFFFFF8BF1F1FF12D8D8FF009B9BFF002B2BFF001616FF0016
+      16FF001616FF001616FF001616FF001616FF001616FF001616FF001616FF0016
+      16FF001616FF001616FF001616FF001616FF001616FF001616FF001515FF0009
+      09FF000000FE000000E9000000D5000000FF1C7A7AFF3AFBFBFF77FFFFFFBFFF
+      FFFF8FFFFFFF44FFFFFF27BBBBFF054B4BFF004848FF006161FF006666FF0066
+      66FF006666FF006666FF006666FF006666FF006666FF006666FF006666FF0066
+      66FF006666FF006666FF006666FF006666FF006666FF006666FF006262FF002C
+      2CFF000000FC000000980000003B000000FF107A7AFF21FBFBFF72FFFFFFD6FF
+      FFFF87F2F2FF0DDFDFFF009898FF002222FF003535FF007878FF008484FF0084
+      84FF008484FF008484FF008484FF008484FF008484FF008484FF008484FF0084
+      84FF008484FF008484FF008484FF008484FF008383FF007979FF006F6FFE0035
+      35EC000000DA0000006A00000000000000FF5A7A7AFFB8FBFBFF87FFFFFF49FF
+      FFFF2AB6B6FF044F4FFF004E4EFF005F5FFF006C6CFF008080FF008484FF0084
+      84FF008484FF008484FF008484FF008484FF008484FF008484FF008484FF0084
+      84FF008484FF008484FF008484FF008484FF007E7EFF004949FF002323F8001A
+      1A94000000430000002000000000000000FF6D7A7AFFE0FBFBFF82F3F3FF08E5
+      E5FF009191FF001A1AFF003737FF007A7AFF008484FF008484FF008484FF0084
+      84FF008484FF008484FF008484FF008484FF008484FF008484FF008484FF0084
+      84FF008484FF008484FF008383FF007B7BFF007070FD003131EE000000DC0000
+      0062000000000000000000000000000000FF257A7AFF4DFBFBFF2CB3B3FF0354
+      54FF005353FF005C5CFF006A6AFF008181FF008484FF008484FF008484FF0084
+      84FF008484FF008484FF008484FF008484FF008484FF008484FF008484FF0084
+      84FF008484FF008484FF007C7CFF004848FF002727F5001B1B920000004B0000
+      0022000000000000000000000000000000FF007070FF00E6E6FF008A8AFF0012
+      12FF003A3AFF007D7DFF008484FF008484FF008484FF008484FF008484FF0084
+      84FF008484FF008484FF008484FF008484FF008484FF008484FF008484FF0084
+      84FF008383FF007C7CFF007070FD002C2CF1000000DC0000005B000000000000
+      0000000000000000000000000000000000FF002A2AFF005757FF005757FF0057
+      57FF006868FF008181FF008484FF008484FF008484FF008484FF008484FF0084
+      84FF008484FF008484FF008484FF008484FF008484FF008484FF008484FF0084
+      84FF007B7BFF004848FF002C2CF1001B1B910000005300000022000000000000
+      0000000000000000000000000000000000FF000000FF000000FF003636FF0078
+      78FF007C7CFF007C7CFF007C7CFF007C7CFF007C7CFF007C7CFF007C7CFF007C
+      7CFF007C7CFF007C7CFF007C7CFF007C7CFF007C7CFF007C7CFF007C7CFF007C
+      7CFF007070FD002727F5000000DC000000530000000000000000000000000000
+      0000000000000000000000000000000000FF000000FF000000FF001616FF0032
+      32FF003333FF003333FF003333FF003333FF003333FF003333FF003333FF0033
+      33FF003333FF003333FF003333FF003333FF003333FF003333FF003333FF0033
+      33FF003131EE001B1B920000005B000000220000000000000000000000000000
+      0000000000000000000000000000000000F6000000F6000000F6000000F60000
+      00F6000000F6000000F6000000F6000000F6000000F6000000F6000000F60000
+      00F6000000F6000000F6000000F6000000F6000000F6000000F6000000F60000
+      00F6000000DC0000004B00000000000000000000000000000000000000000000
+      00000000000000000000000000000000006E0000006E0000006E0000006E0000
+      006E0000006E0000006E0000006E0000006E0000006E0000006E0000006E0000
+      006E0000006E0000006E0000006E0000006E0000006E0000006E0000006E0000
+      006E000000620000002200000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000003A000000780000007A0000
+      007A0000007A0000007A0000007A0000007A0000007A0000007A0000007A0000
+      007A0000007A0000007A0000007A0000007A0000007A0000007A0000007A0000
+      007A0000007A0000007A0000007A0000007A0000007A0000007A0000007A0000
+      007A000000780000003A000000000000000000000078000000F7000000FB0000
+      00FB000000FB000000FB000000FB000000FB000000FB000000FB000000FB0000
+      00FB000000FB000000FB000000FB000000FB000000FB000000FB000000FB0000
+      00FB000000FB000000FB000000FB000000FB000000FB000000FB000000FB0000
+      00FB000000F70000007800000000000000000000007A000000FB001818FF0037
+      37FF002323FF000303FF262626FF656565FF6E6E6EFF6E6E6EFF6E6E6EFF6E6E
+      6EFF6E6E6EFF6E6E6EFF6E6E6EFF6E6E6EFF6E6E6EFF6E6E6EFF6E6E6EFF6E6E
+      6EFF6E6E6EFF6E6E6EFF656565FF262626FF060606FF434343FF6A6A6AFF2F2F
+      2FFF000000FB0000007A00000000000000000000007A000000FB003737FF007B
+      7BFF004E4EFF000707FF555555FFE2E2E2FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6
+      F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6
+      F6FFF6F6F6FFF6F6F6FFE2E2E2FF555555FF0E0E0EFF969696FFEDEDEDFF6A6A
+      6AFF000000FB0000007A00000000000000000000007A000000FB003939FF007F
+      7FFF005151FF000808FF585858FFEAEAEAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFEAEAEAFF585858FF090909FF606060FF969696FF4343
+      43FF000000FB0000007A00000000000000000000007A000000FB003939FF007F
+      7FFF005151FF000808FF585858FFEAEAEAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFEAEAEAFF585858FF010101FF090909FF0E0E0EFF0606
+      06FF000000FB0000007A00000000000000000000007A000000FB003939FF007F
+      7FFF005151FF000808FF585858FFEAEAEAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFEAEAEAFF585858FF000303FF001C1CFF002C2CFF0014
+      14FF000000FB0000007A00000000000000000000007A000000FB003939FF007F
+      7FFF005151FF000808FF585858FFEAEAEAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFEAEAEAFF585858FF000707FF004A4AFF007575FF0034
+      34FF000000FB0000007A00000000000000000000007A000000FB003939FF007F
+      7FFF005151FF000808FF585858FFEAEAEAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFEAEAEAFF585858FF000808FF005151FF007F7FFF0039
+      39FF000000FB0000007A00000000000000000000007A000000FB003939FF007F
+      7FFF005151FF000808FF585858FFEAEAEAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFEAEAEAFF585858FF000808FF005151FF007F7FFF0039
+      39FF000000FB0000007A00000000000000000000007A000000FB003939FF007F
+      7FFF005151FF000808FF585858FFEAEAEAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFEAEAEAFF585858FF000808FF005151FF007F7FFF0039
+      39FF000000FB0000007A00000000000000000000007A000000FB003939FF007F
+      7FFF005151FF000808FF585858FFEAEAEAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFEAEAEAFF585858FF000808FF005151FF007F7FFF0039
+      39FF000000FB0000007A00000000000000000000007A000000FB003939FF007F
+      7FFF005151FF000808FF585858FFEAEAEAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFEAEAEAFF585858FF000808FF005151FF007F7FFF0039
+      39FF000000FB0000007A00000000000000000000007A000000FB003939FF007F
+      7FFF005151FF000808FF585858FFEAEAEAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFEAEAEAFF585858FF000808FF005151FF007F7FFF0039
+      39FF000000FB0000007A00000000000000000000007A000000FB003939FF007F
+      7FFF005B5BFF002020FF475858FFBCBEBEFFCDCDCDFFCDCDCDFFCDCDCDFFCDCD
+      CDFFCDCDCDFFCDCDCDFFCDCDCDFFCDCDCDFFCDCDCDFFCDCDCDFFCDCDCDFFCDCD
+      CDFFCDCDCDFFCDCDCDFFBCBEBEFF475858FF002020FF005B5BFF007F7FFF0039
+      39FF000000FB0000007A00000000000000000000007A000000FB003939FF007F
+      7FFF007A7AFF006C6CFF115757FF2E3737FF323232FF323232FF323232FF3232
+      32FF323232FF323232FF323232FF323232FF323232FF323232FF323232FF3232
+      32FF323232FF323232FF2E3737FF115757FF006C6CFF007A7AFF007F7FFF0039
+      39FF000000FB0000007A00000000000000000000007A000000FB003939FF007F
+      7FFF008484FF008484FF005E5EFF001F1FFF001616FF001616FF001616FF0016
+      16FF001616FF001616FF001616FF001616FF001616FF001616FF001616FF0016
+      16FF001616FF001616FF001F1FFF005E5EFF008484FF008484FF007F7FFF0039
+      39FF000000FB0000007A00000000000000000000007A000000FB003939FF007F
+      7FFF008484FF008484FF007A7AFF006868FF006666FF006666FF006666FF0066
+      66FF006666FF006666FF006666FF006666FF006666FF006666FF006666FF0066
+      66FF006666FF006666FF006868FF007A7AFF008484FF008484FF007F7FFF0039
+      39FF000000FB0000007A00000000000000000000007A000000FB003939FF007F
+      7FFF008484FF008484FF007E7EFF007474FF007272FF007272FF007272FF0072
+      72FF007272FF007272FF007272FF007272FF007272FF007272FF007272FF0072
+      72FF007272FF007272FF007272FF007272FF007474FF007D7DFF007F7FFF0039
+      39FF000000FB0000007A00000000000000000000007A000000FB003939FF007F
+      7FFF008484FF008484FF006262FF002B2BFF002323FF002323FF002323FF0023
+      23FF002323FF002323FF002323FF002323FF002323FF002323FF002323FF0023
+      23FF002323FF002323FF002323FF002323FF002929FF005E5EFF007F7FFF0039
+      39FF000000FB0000007A00000000000000000000007A000000FB003939FF007F
+      7FFF008484FF008484FF005757FF000B0BFF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF040404FF1414
+      14FF1B1B1BFF1B1B1BFF191919FF090909FF000808FF005151FF007F7FFF0039
+      39FF000000FB0000007A00000000000000000000007A000000FB003939FF007F
+      7FFF008484FF008484FF005757FF000B0BFF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF181818FF8282
+      82FFB1B1B1FFB1B1B1FFA2A2A2FF3D3D3DFF000808FF005151FF007F7FFF0039
+      39FF000000FB0000007A00000000000000000000007A000000FB003939FF007F
+      7FFF008484FF008484FF005757FF000B0BFF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF222222FFBBBB
+      BBFFFFFFFFFFFFFFFFFFEAEAEAFF585858FF000808FF005151FF007F7FFF0039
+      39FF000000FB0000007A00000000000000000000007A000000FB003939FF007F
+      7FFF008484FF008484FF005757FF000B0BFF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF222222FFBBBB
+      BBFFFFFFFFFFFFFFFFFFEAEAEAFF585858FF000808FF005151FF007F7FFF0039
+      39FF000000FB0000007A00000000000000000000007A000000FB003939FF007F
+      7FFF008484FF008484FF005757FF000B0BFF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF222222FFBBBB
+      BBFFFFFFFFFFFFFFFFFFEAEAEAFF585858FF000808FF005151FF007F7FFF0039
+      39FF000000FB0000007A00000000000000000000007A000000FB003939FF007F
+      7FFF008484FF008484FF005757FF000B0BFF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF222222FFBBBB
+      BBFFFFFFFFFFFFFFFFFFEAEAEAFF585858FF000808FF005151FF007F7FFF0039
+      39FF000000FB0000007A000000000000000000000076000000F2003838FA007B
+      7BFF007F7FFF007F7FFF005454FF000A0AFF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF212121FFB4B4
+      B4FFF6F6F6FFF6F6F6FFE2E2E2FF555555FF000707FF004E4EFF007B7BFF0037
+      37FF000000FB0000007A0000000000000000000000340000006C002424AC0038
+      38FA003939FF003939FF002525FF000505FF000000FF000000FF000000FF0000
+      00FF000000FF000000FF000000FF000000FF000000FF000000FF0F0F0FFF5151
+      51FF6E6E6EFF6E6E6EFF656565FF262626FF000303FF002323FF003737FF0018
+      18FF000000FB0000007A000000000000000000000000000000000000006C0000
+      00F2000000FB000000FB000000FB000000FB000000FB000000FB000000FB0000
+      00FB000000FB000000FB000000FB000000FB000000FB000000FB000000FB0000
+      00FB000000FB000000FB000000FB000000FB000000FB000000FB000000FB0000
+      00FB000000F70000007800000000000000000000000000000000000000340000
+      00760000007A0000007A0000007A0000007A0000007A0000007A0000007A0000
+      007A0000007A0000007A0000007A0000007A0000007A0000007A0000007A0000
+      007A0000007A0000007A0000007A0000007A0000007A0000007A0000007A0000
+      007A000000780000003A00000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000000000000000000000000000000000000000
+      0000000000000000000000000000
+    }
+  end
+  object XMLConfig1: TXMLConfig
+    StartEmpty = False
+    RootName = 'CONFIG'
+    ReadOnly = False
+    left = 73
+    top = 296
+  end
+  object OpenDialog1: TOpenDialog
+    DefaultExt = '.xtmap'
+    left = 600
+    top = 155
+  end
+  object SaveDialog1: TSaveDialog
+    DefaultExt = '.xtmap'
+    left = 600
+    top = 88
+  end
+  object ApplicationInfo: TApplicationInfo
+    Identification = 1
+    VersionMajor = 1
+    VersionMinor = 0
+    VersionBugFix = 0
+    VersionSuffix = 'alfa'
+    CompanyName = 'Chronosoft'
+    CompanyHomePage = 'http://svn.zdechov.net/trac/xtactics'
+    HomePage = 'http://svn.zdechov.net/trac/xtactics'
+    AuthorsName = 'Chronos'
+    AppName = 'xTactics'
+    ReleaseDate = 42913
+    RegistryKey = '\Software\xTactics'
+    RegistryRoot = rrKeyCurrentUser
+    License = 'CC0'
+    left = 73
+    top = 96
+  end
+  object PersistentForm: TPersistentForm
+    MinVisiblePart = 50
+    EntireVisible = False
+    left = 416
+    top = 320
+  end
+  object ScaleDPI1: TScaleDPI
+    AutoDetect = False
+    left = 72
+    top = 360
+  end
+  object LastOpenedList1: TLastOpenedList
+    MaxCount = 10
+    OnChange = LastOpenedList1Change
+    left = 73
+    top = 160
+  end
+end
Index: /tags/1.1.0/UCore.lrt
===================================================================
--- /tags/1.1.0/UCore.lrt	(revision 137)
+++ /tags/1.1.0/UCore.lrt	(revision 137)
@@ -0,0 +1,17 @@
+TCORE.AGAMENEW.CAPTION=New
+TCORE.AGAMENEW.HINT=New game
+TCORE.AEXIT.CAPTION=Exit
+TCORE.AEXIT.HINT=Exit application
+TCORE.AGAMEEND.CAPTION=End
+TCORE.AGAMEEND.HINT=End game
+TCORE.AGAMEENDTURN.CAPTION=End turn
+TCORE.AGAMEENDTURN.HINT=End player turn
+TCORE.AGAMERESTART.CAPTION=Restart
+TCORE.AGAMERESTART.HINT=Restart game
+TCORE.ASETTINGS.CAPTION=Settings
+TCORE.ASETTINGS.HINT=Application settings
+TCORE.AGAMESAVE.CAPTION=Save
+TCORE.AGAMELOAD.CAPTION=Load
+TCORE.AABOUT.CAPTION=About
+TCORE.AHELP.CAPTION=Help
+TCORE.ASHOWCHARTS.CAPTION=Show charts
Index: /tags/1.1.0/UCore.pas
===================================================================
--- /tags/1.1.0/UCore.pas	(revision 137)
+++ /tags/1.1.0/UCore.pas	(revision 137)
@@ -0,0 +1,463 @@
+unit UCore;
+
+{$mode delphi}
+
+interface
+
+uses
+  Classes, SysUtils, XMLConf, FileUtil, ActnList, Controls, Dialogs, Forms,
+  UGame, UApplicationInfo, UPersistentForm, UScaleDPI, UCoolTranslator,
+  URegistry, ULastOpenedList, Registry, Menus;
+
+type
+
+  { TCore }
+
+  TCore = class(TDataModule)
+    AAbout: TAction;
+    AShowCharts: TAction;
+    AHelp: TAction;
+    AGameSave: TAction;
+    AGameLoad: TAction;
+    ApplicationInfo: TApplicationInfo;
+    ASettings: TAction;
+    ActionList1: TActionList;
+    AExit: TAction;
+    AGameEnd: TAction;
+    AGameEndTurn: TAction;
+    AGameNew: TAction;
+    AGameRestart: TAction;
+    CoolTranslator1: TCoolTranslator;
+    ImageListLarge: TImageList;
+    ImageListSmall: TImageList;
+    LastOpenedList1: TLastOpenedList;
+    OpenDialog1: TOpenDialog;
+    PersistentForm: TPersistentForm;
+    SaveDialog1: TSaveDialog;
+    ScaleDPI1: TScaleDPI;
+    XMLConfig1: TXMLConfig;
+    procedure AAboutExecute(Sender: TObject);
+    procedure AExitExecute(Sender: TObject);
+    procedure AGameEndExecute(Sender: TObject);
+    procedure AGameEndTurnExecute(Sender: TObject);
+    procedure AGameLoadExecute(Sender: TObject);
+    procedure AGameNewExecute(Sender: TObject);
+    procedure AGameRestartExecute(Sender: TObject);
+    procedure AGameSaveExecute(Sender: TObject);
+    procedure AHelpExecute(Sender: TObject);
+    procedure ASettingsExecute(Sender: TObject);
+    procedure AShowChartsExecute(Sender: TObject);
+    procedure CoolTranslator1Translate(Sender: TObject);
+    procedure DataModuleCreate(Sender: TObject);
+    procedure DataModuleDestroy(Sender: TObject);
+    procedure LastOpenedList1Change(Sender: TObject);
+  private
+    FInitialized: Boolean;
+    StoredDimension: TControlDimension;
+    RegistryContext: TRegistryContext;
+    procedure LoadRecentExecute(Sender: TObject);
+    procedure ProcessComputerTurns;
+    procedure StartNewGame;
+    procedure DoPlayerChange(Sender: TObject);
+    procedure DoOnMove(CellFrom, CellTo: TCell; var CountOnce,
+      CountRepeat: Integer; Update: Boolean; var Confirm: Boolean);
+    procedure DoOnWin(Player: TPlayer);
+    procedure Delay(Time: Integer);
+    procedure GameNewTurnExecute(Sender: TObject);
+    procedure AutoSave;
+    function GetPlayer: TPlayer;
+    procedure LoadConfig;
+    procedure SaveConfig;
+    procedure CommandLineParams;
+    procedure ScaleDPI;
+    procedure SelectClient;
+    procedure LoadGame(FileName: string);
+  public
+    Game: TGame;
+    UseSingleView: Boolean;
+    DevelMode: Boolean;
+    AnimationSpeed: Integer;
+    AutoSaveEnabled: Boolean;
+    CurrentClient: TClient;
+    procedure UpdateActions;
+    procedure Init;
+    property Initialized: Boolean read FInitialized;
+  end;
+
+var
+  Core: TCore;
+
+
+implementation
+
+{$R *.lfm}
+
+uses
+  UFormMove, UFormMain, UFormNew, UFormSettings, UFormAbout, UFormPlayer,
+  UFormHelp, UFormCharts;
+
+const
+  DefaultRegKey = '\Software\Chronosoft\xTactics';
+
+resourcestring
+  SPlayerWins = 'Player %s wins';
+  SEndGame = 'End game?';
+  SEndGameQuestion = 'Do you want to end current game?';
+  SRestartGame = 'Restart game?';
+  SRestartGameQuestion = 'Do you want to restart current game?';
+
+
+{ TCore }
+
+procedure TCore.DoOnMove(CellFrom, CellTo: TCell; var CountOnce,
+  CountRepeat: Integer; Update: Boolean; var Confirm: Boolean);
+var
+  I: Integer;
+begin
+  if Update then FormMove.SpinEditOnce.MaxValue := CellFrom.GetAvialPower + CountOnce
+    else FormMove.SpinEditOnce.MaxValue := CellFrom.GetAvialPower;
+  FormMove.SpinEditOnce.Value := CountOnce;
+  FormMove.TrackBarOnce.Max := FormMove.SpinEditOnce.MaxValue;
+  FormMove.TrackBarOnce.Position := FormMove.SpinEditOnce.Value;
+  FormMove.SpinEditRepeat.MaxValue := Game.Map.MaxPower;
+  FormMove.SpinEditRepeat.Value := CountRepeat;
+  FormMove.TrackBarRepeat.Max := FormMove.SpinEditRepeat.MaxValue;
+  FormMove.TrackBarRepeat.Position := FormMove.SpinEditRepeat.Value;
+  FormMove.DefendCount := CellTo.Power;
+  // Attack count from other surrounding cells without current move if already exists
+  FormMove.AttackCount := 0;
+  for I := 0 to CellTo.MovesTo.Count - 1 do
+  if TUnitMove(CellTo.MovesTo[I]).CellFrom <> CellFrom then
+    FormMove.AttackCount := FormMove.AttackCount + TUnitMove(CellTo.MovesTo[I]).CountOnce;
+  FormMove.ShowWinProbability := CellTo.Player <> CellFrom.Player;
+
+  if FormMove.ShowModal = mrOk then begin
+    CountOnce := FormMove.SpinEditOnce.Value;
+    CountRepeat := FormMove.SpinEditRepeat.Value;
+    Confirm := True;
+  end else Confirm := False;
+end;
+
+procedure TCore.DoOnWin(Player: TPlayer);
+begin
+  FormMain.Redraw;
+  ShowMessage(Format(SPlayerWins, [Player.Name]));
+end;
+
+procedure TCore.Delay(Time: Integer);
+const
+  Slice = 50; // ms
+begin
+  while Time > 0 do begin
+    Application.ProcessMessages;
+    if Time > Slice then Sleep(Slice) else Sleep(Time);
+    Dec(Time, Slice);
+  end;
+end;
+
+procedure TCore.GameNewTurnExecute(Sender: TObject);
+begin
+  if AutoSaveEnabled then AutoSave;
+end;
+
+procedure TCore.AutoSave;
+var
+  OldFileName: string;
+begin
+  OldFileName := Game.FileName;
+  Game.SaveToFile(GetAppConfigDir(False) + 'AutoSave.xtg');
+  Game.FileName := OldFileName;
+end;
+
+function TCore.GetPlayer: TPlayer;
+begin
+  Result := Game.CurrentPlayer;
+end;
+
+procedure TCore.LoadConfig;
+begin
+  RegistryContext := RegContext(HKEY_CURRENT_USER, DefaultRegKey);
+  PersistentForm.RegistryContext := RegistryContext;
+  XMLConfig1.Filename := GetAppConfigDir(False) + 'Config.xml';
+
+  LastOpenedList1.LoadFromXMLConfig(XMLConfig1, 'RecentFiles');
+  DevelMode := XMLConfig1.GetValue('DevelMode', false);
+  AnimationSpeed := XMLConfig1.GetValue('AnimationSpeed', 50);
+  AutoSaveEnabled := XMLConfig1.GetValue('AutoSave', True);
+  CoolTranslator1.Language := CoolTranslator1.Languages.SearchByCode(String(XMLConfig1.GetValue('Language', '')));
+  ScaleDPI1.DPI := Point(XMLConfig1.GetValue('DPIX', 96), XMLConfig1.GetValue('DPIY', 96));
+  ScaleDPI1.AutoDetect := XMLConfig1.GetValue('DPIAuto', True);
+end;
+
+procedure TCore.SaveConfig;
+begin
+  XMLConfig1.SetValue('Language', WideString(CoolTranslator1.Language.Code));
+  LastOpenedList1.SaveToXMLConfig(XMLConfig1, 'RecentFiles');
+  XMLConfig1.SetValue('DevelMode', DevelMode);
+  XMLConfig1.SetValue('AnimationSpeed', AnimationSpeed);
+  XMLConfig1.SetValue('AutoSave', AutoSaveEnabled);
+  XMLConfig1.SetValue('DPIX', ScaleDPI1.DPI.X);
+  XMLConfig1.SetValue('DPIY', ScaleDPI1.DPI.Y);
+  XMLConfig1.SetValue('DPIAuto', ScaleDPI1.AutoDetect);
+end;
+
+procedure TCore.CommandLineParams;
+var
+  FileName: string;
+begin
+  // Command line parameter handling
+  if (ParamCount > 0) then begin
+    FileName := UTF8Encode(ParamStr(1));
+    if FileExists(FileName) then LoadGame(FileName);
+  end;
+end;
+
+procedure TCore.ScaleDPI;
+var
+  I: Integer;
+begin
+  {$ifdef DEBUG}
+  with Core.ScaleDPI1 do begin
+    //DesignDPI := Point(144, 144);
+    if (DesignDPI.X <> DPI.X) or (DesignDPI.Y <> DPI.Y) then begin
+      //ApplyToAll(DesignDPI);
+      FormNew.Show;
+      FormNew.Hide;
+      for I := 0 to Screen.FormCount - 1 do
+      if (Screen.Forms[I].WindowState = wsNormal) or
+        (Screen.Forms[I].WindowState = wsMinimized) then begin
+        StoreDimensions(Screen.Forms[I], StoredDimension);
+        ScaleDimensions(Screen.Forms[I], StoredDimension);
+      end;
+      ScaleImageList(Core.ImageListSmall, DesignDPI);
+      ScaleImageList(Core.ImageListLarge, DesignDPI);
+    end;
+  end;
+  {$endif}
+end;
+
+procedure TCore.SelectClient;
+var
+  FirstHuman: TPlayer;
+begin
+  FirstHuman := Game.Players.GetFirstHuman;
+  if Assigned(FirstHuman) then CurrentClient := FirstHuman.Client
+    else CurrentClient := TClient(Game.Clients.First);
+end;
+
+procedure TCore.UpdateActions;
+begin
+  Core.AGameEndTurn.Enabled := Core.Game.Running;
+  Core.AGameEnd.Enabled := Core.Game.Running;
+end;
+
+procedure TCore.AExitExecute(Sender: TObject);
+begin
+  Game.Running := False;
+  Application.Terminate;
+end;
+
+procedure TCore.AAboutExecute(Sender: TObject);
+begin
+  FormAbout := TFormAbout.Create(Self);
+  try
+    FormAbout.ShowModal;
+  finally
+    FreeAndNil(FormAbout);
+  end;
+end;
+
+procedure TCore.AGameEndExecute(Sender: TObject);
+begin
+  if MessageDlg(SEndGame, SEndGameQuestion, mtConfirmation, mbYesNo, 0) = mrYes then begin
+    Game.Running := False;
+    FormMain.Redraw;
+    UpdateActions;
+  end;
+end;
+
+procedure TCore.ProcessComputerTurns;
+var
+  Computer: TComputer;
+begin
+  while Game.Running and (Game.CurrentPlayer.Mode <> pmHuman) do begin
+    if Game.CurrentPlayer.Mode = pmComputer then begin
+      Computer := TComputer.Create;
+      try
+        Computer.Game := Game;
+        Computer.Process;
+      finally
+        Computer.Free;
+      end;
+      FormMain.Redraw;
+      Delay(Trunc((100 - AnimationSpeed) / 100 * 2000));
+    end;
+    Game.NextTurn;
+    FormMain.Redraw;
+    Application.ProcessMessages;
+    Sleep(1);
+  end;
+end;
+
+procedure TCore.AGameEndTurnExecute(Sender: TObject);
+begin
+  Game.NextTurn;
+  FormMain.Redraw;
+  ProcessComputerTurns;
+  UpdateActions;
+end;
+
+procedure TCore.AGameLoadExecute(Sender: TObject);
+begin
+  if (Game.FileName = '') and (LastOpenedList1.Items.Count > 0) then
+    OpenDialog1.FileName := LastOpenedList1.Items[0]
+    else OpenDialog1.FileName := Game.FileName;
+  if OpenDialog1.Execute then begin
+    LoadGame(OpenDialog1.FileName);
+  end;
+end;
+
+procedure TCore.AGameNewExecute(Sender: TObject);
+begin
+  FormNew.Load(Game);
+  if FormNew.ShowModal = mrOk then begin
+    FormNew.Save(Game);
+    StartNewGame;
+  end;
+end;
+
+procedure TCore.AGameRestartExecute(Sender: TObject);
+begin
+  if MessageDlg(SRestartGame, SRestartGameQuestion, mtConfirmation, mbYesNo, 0) = mrYes then begin
+    StartNewGame;
+  end;
+end;
+
+procedure TCore.AGameSaveExecute(Sender: TObject);
+begin
+  if (Game.FileName = '') and (LastOpenedList1.Items.Count > 0) then
+    SaveDialog1.FileName := ExtractFileDir(LastOpenedList1.Items[0])
+    else SaveDialog1.FileName := Game.FileName;
+  if SaveDialog1.Execute then begin
+    Game.SaveToFile(SaveDialog1.FileName);
+    LastOpenedList1.AddItem(SaveDialog1.FileName);
+  end;
+end;
+
+procedure TCore.AHelpExecute(Sender: TObject);
+begin
+  FormHelp := TFormHelp.Create(Self);
+  try
+    FormHelp.ShowModal;
+  finally
+    FreeAndNil(FormHelp);
+  end;
+end;
+
+procedure TCore.ASettingsExecute(Sender: TObject);
+begin
+  FormSettings.Load;
+  if FormSettings.ShowModal = mrOk then begin
+    FormSettings.Save;
+    Game.SaveConfig(XMLConfig1, 'Game');
+  end;
+end;
+
+procedure TCore.AShowChartsExecute(Sender: TObject);
+begin
+  FormCharts.Show;
+end;
+
+procedure TCore.CoolTranslator1Translate(Sender: TObject);
+begin
+  UGame.InitStrings;
+  FormNew.Translate;
+  FormPlayer.Translate;
+end;
+
+procedure TCore.DataModuleCreate(Sender: TObject);
+begin
+  Game := TGame.Create;
+  Game.OnMove := DoOnMove;
+  Game.OnWin := DoOnWin;
+  Game.OnNewTurn := GameNewTurnExecute;
+  Game.OnPlayerChange := DoPlayerChange;
+  StoredDimension := TControlDimension.Create;
+  XMLConfig1.Filename := GetAppConfigDir(False) + 'Config.xml';
+  ForceDirectories(GetAppConfigDir(False));
+end;
+
+procedure TCore.DataModuleDestroy(Sender: TObject);
+begin
+  StoredDimension.Free;;
+  Game.SaveConfig(XMLConfig1, 'Game');
+  SaveConfig;
+  FreeAndNil(Game);
+end;
+
+procedure TCore.LastOpenedList1Change(Sender: TObject);
+begin
+  LastOpenedList1.LoadToMenuItem(FormMain.MenuItemLoadRecent, LoadRecentExecute);
+end;
+
+procedure TCore.LoadRecentExecute(Sender: TObject);
+begin
+  LoadGame((Sender as TMenuItem).Caption);
+end;
+
+procedure TCore.LoadGame(FileName: string);
+begin
+  Game.LoadFromFile(FileName);
+  SelectClient;
+  LastOpenedList1.AddItem(FileName);
+  with Core.CurrentClient do
+    View.DestRect := Bounds(0, 0, FormMain.PaintBox1.Width, FormMain.PaintBox1.Height);
+  FormMain.AZoomAll.Execute;
+  FormMain.Redraw;
+  if FormCharts.Visible then FormCharts.Redraw;
+end;
+
+procedure TCore.StartNewGame;
+begin
+  Game.New;
+  SelectClient;
+  Game.Running := True;
+  FormMain.Redraw;
+  if FormCharts.Visible then FormCharts.Redraw;
+  ProcessComputerTurns;
+  UpdateActions;
+end;
+
+procedure TCore.DoPlayerChange(Sender: TObject);
+begin
+  if Assigned(Game.CurrentPlayer) and Assigned(Game.CurrentPlayer.Client) then
+    CurrentClient := Game.CurrentPlayer.Client;
+  if FormCharts.Visible then FormCharts.Redraw;
+end;
+
+procedure TCore.Init;
+begin
+  if not Core.Initialized then begin
+    {$IFDEF Linux}
+    // If installed in Linux system then use installation directory for po files
+    if Application.ExeName = '/usr/bin/xtactics' then
+      CoolTranslator1.POFilesFolder := '/usr/share/xtactics/languages';
+    {$ENDIF}
+    FInitialized := True;
+
+    LoadConfig;
+    Game.LoadConfig(XMLConfig1, 'Game');
+
+    // Update translated default player names
+    TPlayer(Game.Players[0]).Name := SPlayer + ' 1';
+    TPlayer(Game.Players[1]).Name := SPlayer + ' 2';
+
+    CommandLineParams;
+    ScaleDPI;
+
+    if Game.FileName = '' then StartNewGame;
+  end;
+end;
+
+end.
+
Index: /tags/1.1.0/UGame.pas
===================================================================
--- /tags/1.1.0/UGame.pas	(revision 137)
+++ /tags/1.1.0/UGame.pas	(revision 137)
@@ -0,0 +1,3264 @@
+unit UGame;
+
+{$mode delphi}{$H+}
+
+interface
+
+uses
+  Classes, SysUtils, ExtCtrls, Graphics, Contnrs, XMLConf, XMLRead, XMLWrite,
+  DOM, Math, LazFileUtils, UXMLUtils, Dialogs, Types, LCLType, LCLIntf;
+
+const
+  DefaultPlayerStartUnits = 5;
+  HexCellMulX = 1.12;
+  HexCellMulY = 1.292;
+  SquareCellMulX = 1.05;
+  SquareCellMulY = 1.05;
+  TriangleCellMulX = 0.55;
+  TriangleCellMulY = 1.05;
+  MaxPlayerCount = 8;
+
+type
+  TGame = class;
+  TPlayer = class;
+  TView = class;
+  TUnitMoves = class;
+  TCells = class;
+  TMap = class;
+  TCellLinks = class;
+  TMapArea = class;
+  TClient = class;
+
+  TFloatPoint = record
+    X, Y: Double;
+  end;
+
+  TPointArray = array of TPoint;
+
+  TTerrainType = (ttVoid, ttNormal, ttCity);
+
+  { TCell }
+
+  TCell = class
+  private
+    FArea: TMapArea;
+    FMap: TMap;
+    FPower: Integer;
+    procedure SetArea(AValue: TMapArea);
+    procedure SetPower(AValue: Integer);
+  public
+    Id: Integer;
+    PosPx: TPoint;
+    Polygon: TPointArray;
+    Terrain: TTerrainType;
+    PlayerId: Integer;
+    Player: TPlayer;
+    MovesFrom: TUnitMoves;
+    MovesTo: TUnitMoves;
+    NeighborsId: array of Integer;
+    Neighbors: TCells;
+    Mark: Boolean;
+    Links: TCellLinks;
+    procedure AreaExtend;
+    procedure FixRefId;
+    procedure LoadFromNode(Node: TDOMNode);
+    procedure SaveToNode(Node: TDOMNode);
+    procedure Assign(Source: TCell);
+    function IsVisible(View: TView): Boolean;
+    function GetColor: TColor;
+    function GetAvialPower: Integer;
+    function GetAttackPower: Integer;
+    constructor Create;
+    destructor Destroy; override;
+    property Power: Integer read FPower write SetPower;
+    property Map: TMap read FMap write FMap;
+    property Area: TMapArea read FArea write SetArea;
+  end;
+
+  TCellArray = array of TCell;
+
+  { TCells }
+
+  TCells = class(TObjectList)
+    Map: TMap;
+    procedure FixRefId;
+    function FindById(Id: Integer): TCell;
+    procedure LoadFromNode(Node: TDOMNode);
+    procedure SaveToNode(Node: TDOMNode);
+    procedure ClearMark;
+  end;
+
+  { TCellLink }
+
+  TCellLink = class
+    Points: array of TPoint;
+    Cells: TCells;
+    Map: TMap;
+    procedure LoadFromNode(Node: TDOMNode);
+    procedure SaveToNode(Node: TDOMNode);
+    constructor Create;
+    destructor Destroy; override;
+  end;
+
+  { TCellLinks }
+
+  TCellLinks = class(TObjectList)
+    Map: TMap;
+    function FindByCells(Cell1, Cell2: TCell): TCellLink;
+    procedure LoadFromNode(Node: TDOMNode);
+    procedure SaveToNode(Node: TDOMNode);
+  end;
+
+  { TView }
+
+  TView = class
+  private
+    FDestRect: TRect;
+    FZoom: Double;
+    procedure SetDestRect(AValue: TRect);
+    procedure SetZoom(AValue: Double);
+  public
+    Game: TGame;
+    SourceRect: TRect;
+    FocusedCell: TCell;
+    SelectedCell: TCell;
+    procedure Clear;
+    constructor Create;
+    destructor Destroy; override;
+    procedure SelectCell(Pos: TPoint; Player: TPlayer; ShiftState: TShiftState);
+    procedure CenterMap;
+    procedure CenterPlayerCity(Player: TPlayer);
+    function CanvasToCellPos(Pos: TPoint): TPoint;
+    function CellToCanvasPos(Pos: TPoint): TPoint;
+    function CanvasToCellRect(Pos: TRect): TRect;
+    function CellToCanvasRect(Pos: TRect): TRect;
+    procedure Assign(Source: TView);
+    property DestRect: TRect read FDestRect write SetDestRect;
+    property Zoom: Double read FZoom write SetZoom;
+  end;
+
+  { TCanvasEx }
+
+  TCanvasEx = class(TCanvas)
+    class procedure TextOutEx(Canvas: TCanvas; X,Y: Integer; const Text: string; MovePen: Boolean = True);
+    class procedure PolygonEx(Canvas: TCanvas; const Points: array of TPoint; Winding: Boolean);
+  end;
+
+  TMapShape = (msRectangle, msImage);
+
+  { TMapArea }
+
+  TMapArea = class
+    Id: Integer;
+    Map: TMap;
+    BridgeCount: Integer;
+    Cells: TCells;
+    procedure GetBorderCells(List: TCells);
+    constructor Create;
+    destructor Destroy; override;
+  end;
+
+  TMapAreas = class(TObjectList)
+  end;
+
+  { TMap }
+
+  TMap = class
+  private
+    FSize: TPoint;
+    function GetSize: TPoint; virtual;
+    procedure PaintCell(Canvas: TCanvas; Pos: TPoint; Text: string; View: TView;
+      Cell: TCell);
+    procedure DrawArrow(Canvas: TCanvas; View: TView; Pos: TPoint; Angle: Double;
+      Text: string);
+    procedure SetSize(AValue: TPoint); virtual;
+  protected
+    FNewCellId: Integer;
+    function GetNewCellId: Integer; virtual;
+  public
+    Game: TGame;
+    MaxPower: Integer;
+    DefaultCellSize: TPoint;
+    Cells: TCells;
+    Shape: TMapShape;
+    Image: TImage;
+    CellLinks: TCellLinks;
+    Areas: TMapAreas;
+    function IsOutsideShape(Coord: TPoint): Boolean; virtual;
+    function IsCellsNeighbor(Cell1, Cell2: TCell): Boolean; virtual;
+    function IsValidIndex(Index: TPoint): Boolean; virtual;
+    procedure Assign(Source: TMap); virtual;
+    procedure LoadFromFile(FileName: string); virtual;
+    procedure SaveToFile(FileName: string); virtual;
+    procedure LoadFromNode(Node: TDOMNode);
+    procedure SaveToNode(Node: TDOMNode);
+    function PosToCell(Pos: TPoint; View: TView): TCell; virtual;
+    function CellToPos(Cell: TCell): TPoint; virtual;
+    procedure Grow(APlayer: TPlayer); virtual;
+    procedure ComputePlayerStats; virtual;
+    procedure Generate; virtual;
+    constructor Create; virtual;
+    destructor Destroy; override;
+    procedure Paint(Canvas: TCanvas; View: TView); virtual;
+    function GetPixelRect: TRect; virtual;
+    procedure ForEachCells(Method: TMethod); virtual;
+    property Size: TPoint read GetSize write SetSize;
+  end;
+
+  TPlayerCells = class;
+  TPlayerMap = class;
+
+  { TPlayerCell }
+
+  TPlayerCell = class
+    Explored: Boolean;
+    InVisibleRange: Boolean;
+    MapCell: TCell;
+    List: TPlayerCells;
+    procedure LoadFromNode(Node: TDOMNode);
+    procedure SaveToNode(Node: TDOMNode);
+  end;
+
+  { TPlayerCells }
+
+  TPlayerCells = class(TObjectList)
+    Map: TPlayerMap;
+    function SearchCell(Cell: TCell): TPlayerCell;
+    procedure LoadFromNode(Node: TDOMNode);
+    procedure SaveToNode(Node: TDOMNode);
+  end;
+
+  { TPlayerMap }
+
+  TPlayerMap = class
+    Cells: TPlayerCells;
+    Player: TPlayer;
+    procedure LoadFromNode(Node: TDOMNode);
+    procedure SaveToNode(Node: TDOMNode);
+    procedure Update;
+    constructor Create;
+    destructor Destroy; override;
+    procedure CheckVisibility;
+    procedure Paint(Canvas: TCanvas; View: TView);
+  end;
+
+  { TGameTurnStat }
+
+  TGameTurnStat = class
+    OccupiedCells: Integer;
+    Units: Integer;
+    DiscoveredCells: Integer;
+    Cities: Integer;
+    procedure LoadFromNode(Node: TDOMNode);
+    procedure SaveToNode(Node: TDOMNode);
+  end;
+
+  { TGameTurnStats }
+
+  TGameTurnStats = class(TObjectList)
+    procedure LoadFromNode(Node: TDOMNode);
+    procedure SaveToNode(Node: TDOMNode);
+  end;
+
+  TPlayerMode = (pmHuman, pmComputer);
+  TComputerAgressivity = (caLow, caMedium, caHigh);
+
+  { TPlayer }
+
+  TPlayer = class
+  private
+    FClient: TClient;
+    FGame: TGame;
+    procedure SetClient(AValue: TClient);
+    procedure SetGame(AValue: TGame);
+  public
+    Id: Integer;
+    Name: string;
+    Color: TColor;
+    Mode: TPlayerMode;
+    TotalUnits: Integer;
+    TotalCells: Integer;
+    TotalCities: Integer;
+    TotalDiscovered: Integer;
+    StartUnits: Integer;
+    StartCell: TCell;
+    PlayerMap: TPlayerMap;
+    Defensive: Boolean;
+    Agressivity: TComputerAgressivity;
+    TurnStats: TGameTurnStats;
+    procedure Clear;
+    procedure LoadFromNode(Node: TDOMNode);
+    procedure SaveToNode(Node: TDOMNode);
+    procedure Paint(Canvas: TCanvas; View: TView);
+    constructor Create;
+    destructor Destroy; override;
+    procedure Assign(Source: TPlayer);
+    property Game: TGame read FGame write SetGame;
+    property Client: TClient read FClient write SetClient;
+  end;
+
+
+  { TComputer }
+
+  TComputer = class
+    Game: TGame;
+    Targets: TObjectList;
+    CellProcessDirection: Boolean;
+    procedure AttackNeutral;
+    procedure AttackPlayers;
+    procedure InnerMoves;
+    procedure IncreaseMoves;
+    procedure Process;
+    procedure FallBack;
+    function AttackersCount(Cell: TCell): Integer;
+  end;
+
+  TPlayerArray = array of TPlayer;
+
+  { TPlayers }
+
+  TPlayers = class(TObjectList)
+    Game: TGame;
+    NewPlayerId: Integer;
+    function FindById(Id: Integer): TPlayer;
+    procedure New(Name: string; Color: TColor; Mode: TPlayerMode);
+    function GetNewPlayerId: Integer;
+    procedure LoadFromNode(Node: TDOMNode);
+    procedure SaveToNode(Node: TDOMNode);
+    constructor Create;
+    function GetFirstHuman: TPlayer;
+  end;
+
+  { TUnitMove }
+
+  TUnitMove = class
+  private
+    FCellFrom: TCell;
+    FCellTo: TCell;
+    procedure SetCellFrom(AValue: TCell);
+    procedure SetCellTo(AValue: TCell);
+  public
+    List: TUnitMoves;
+    CountOnce: Integer;
+    CountRepeat: Integer;
+    procedure LoadFromNode(Node: TDOMNode);
+    procedure SaveToNode(Node: TDOMNode);
+    constructor Create;
+    destructor Destroy; override;
+    property CellFrom: TCell read FCellFrom write SetCellFrom;
+    property CellTo: TCell read FCellTo write SetCellTo;
+  end;
+
+  { TUnitMoves }
+
+  TUnitMoves = class(TObjectList)
+    Game: TGame;
+    procedure LoadFromNode(Node: TDOMNode);
+    procedure SaveToNode(Node: TDOMNode);
+  end;
+
+  { TClient }
+
+  TClient = class
+  private
+    FGame: TGame;
+    FControlPlayer: TPlayer;
+    procedure SetControlPlayer(AValue: TPlayer);
+    procedure SetGame(AValue: TGame);
+  public
+    Name: string;
+    View: TView;
+    constructor Create;
+    destructor Destroy; override;
+    property ControlPlayer: TPlayer read FControlPlayer write SetControlPlayer;
+    property Game: TGame read FGame write SetGame;
+  end;
+
+  { TClients }
+
+  TClients = class(TObjectList)
+    Game: TGame;
+    procedure New(Name: string);
+  end;
+
+  { TGame }
+
+  TMoveEvent = procedure(CellFrom, CellTo: TCell; var CountOnce, CountRepeat: Integer;
+    Update: Boolean; var Confirm: Boolean) of object;
+  TWinEvent = procedure(Player: TPlayer) of object;
+  TGrowAmount = (gaByOne, gaBySquareRoot);
+  TGrowCells = (gcNone, gcPlayerCities, gcPlayerAll);
+  TMapType = (mtNone, mtHexagon, mtSquare, mtTriangle, mtVoronoi);
+  TWinObjective = (woDefeatAllOponents, woDefeatAllOponentsCities,
+    woSpecialCaptureCell, woStayAliveForDefinedTurns);
+
+  TGame = class
+  private
+    FMapType: TMapType;
+    FOnMove: TMoveEvent;
+    FOnNewTurn: TNotifyEvent;
+    FOnPlayerChange: TNotifyEvent;
+    FOnWin: TWinEvent;
+    FRunning: Boolean;
+    LoadedImageFileName: string;
+    ProbabilityMatrix: array of array of Single;
+    procedure Attack(var AttackPower, DefendPower: Integer);
+    procedure MoveAll(Player: TPlayer);
+    procedure ClearMovesFromCell(Cell: TCell);
+    procedure RecordTurnStats;
+    procedure SetMapType(AValue: TMapType);
+    function SetMove(CellFrom, CellTo: TCell; Power: Integer; Confirmation: Boolean = True): TUnitMove;
+    procedure SetRunning(AValue: Boolean);
+    procedure UpdateRepeatMoves(Player: TPlayer);
+    procedure CheckCounterMove(Move: TUnitMove);
+    function SearchDifferentCellArea(List: TCells; SourceArea, DestArea: TMapArea): TCell;
+    procedure BuildTerrain;
+    procedure BuildBridges;
+    procedure BuildMapAreas;
+    procedure InitClients;
+  public
+    Players: TPlayers;
+    Clients: TClients;
+    Map: TMap;
+    MapImageFileName: string;
+    VoidEnabled: Boolean;
+    VoidPercentage: Integer;
+    SymetricMap: Boolean;
+    GrowCells: TGrowCells;
+    GrowAmount: TGrowAmount;
+    CityEnabled: Boolean;
+    CityPercentage: Integer;
+    CurrentPlayer: TPlayer;
+    Moves: TUnitMoves;
+    TurnCounter: Integer;
+    WinObjective: TWinObjective;
+    SpecialCaptureCell: TCell;
+    StayAliveForDefinedTurns: Integer;
+    MaxNeutralUnits: Integer;
+    FileName: string;
+    FogOfWar: Boolean;
+    BridgeEnabled: Boolean;
+    function AttackProbability(AttackCount, DefendCount: Integer): Double;
+    procedure LoadConfig(Config: TXmlConfig; Path: string);
+    procedure SaveConfig(Config: TXmlConfig; Path: string);
+    procedure LoadFromFile(FileName: string);
+    procedure SaveToFile(FileName: string);
+    procedure ComputePlayerStats;
+    function GetAlivePlayers: TPlayerArray;
+    function GetAlivePlayersWithCities: TPlayerArray;
+    procedure NextTurn;
+    procedure CheckWinObjective;
+    constructor Create;
+    destructor Destroy; override;
+    procedure New;
+    procedure EndGame(Winner: TPlayer = nil);
+    property Running: Boolean read FRunning write SetRunning;
+    property MapType: TMapType read FMapType write SetMapType;
+  published
+    property OnMove: TMoveEvent read FOnMove write FOnMove;
+    property OnWin: TWinEvent read FOnWin write FOnWin;
+    property OnNewTurn: TNotifyEvent read FOnNewTurn write FOnNewTurn;
+    property OnPlayerChange: TNotifyEvent read FOnPlayerChange write FOnPlayerChange;
+  end;
+
+var
+  PlayerModeText: array[TPlayerMode] of string;
+
+const
+  clOrange = $009Aff;
+  PlayerColors: array[0..7] of TColor = (clBlue, clRed, clGreen, clOrange,
+    clPurple, clMaroon, clAqua, clFuchsia);
+  ComputerAggroProbability: array[TComputerAgressivity] of Single = (0.9, 0.7, 0.5);
+
+procedure InitStrings;
+function FloatPoint(AX, AY: Double): TFloatPoint;
+
+resourcestring
+  SPlayer = 'Player';
+
+
+implementation
+
+uses
+  UMap;
+
+resourcestring
+  SMinimumPlayers = 'You need at least two players';
+  SHuman = 'Human';
+  SComputer = 'Computer';
+  SCannotSetPlayerStartCells = 'Cannot choose start cell for player';
+  SWrongFileFormat = 'Wrong file format';
+  SUnfinishedBattle = 'Unfinished battle';
+  SNewGameFile = 'New game.xtg';
+  SZeroZoomNotAlowed = 'Zero zoom not allowed';
+
+procedure InitStrings;
+begin
+  PlayerModeText[pmHuman] := SHuman;
+  PlayerModeText[pmComputer] := SComputer;
+end;
+
+function FloatPoint(AX, AY: Double): TFloatPoint;
+begin
+  Result.X := AX;
+  Result.Y := AY;
+end;
+
+function RectEquals(A, B: TRect): Boolean;
+begin
+  Result := (A.Left = B.Left) and (A.Top = B.Top) and
+    (A.Right = B.Right) and (A.Bottom = B.Bottom);
+end;
+
+function PtInRect(const Rect: TRect; Pos: TPoint): Boolean;
+begin
+  Result := (Pos.X >= Rect.Left) and (Pos.Y >= Rect.Top) and
+    (Pos.X <= Rect.Right) and (Pos.Y <= Rect.Bottom);
+end;
+
+function PtInPoly(const Points: array of TPoint; Pos: TPoint): Boolean;
+var
+  Count, K, J : Integer;
+begin
+  Result := False;
+  Count := Length(Points) ;
+  J := Count - 1;
+  for K := 0 to Count - 1 do begin
+  if ((Points[K].Y <= Pos.Y) and (Pos.Y < Points[J].Y)) or
+    ((Points[J].Y <= Pos.Y) and (Pos.Y < Points[K].Y)) then
+    begin
+    if (Pos.X < (Points[j].X - Points[K].X) *
+       (Pos.Y - Points[K].Y) /
+       (Points[j].Y - Points[K].Y) + Points[K].X) then
+        Result := not Result;
+    end;
+    J := K;
+  end;
+end;
+
+function GetPolygonRect(Polygon: array of TPoint): TRect;
+var
+  I: Integer;
+begin
+  Result := Rect(High(Integer), High(Integer),
+    Low(Integer), Low(Integer));
+  for I := 0 to Length(Polygon) - 1 do
+  with Polygon[I] do begin
+    if X > Result.Right then
+      Result.Right := X;
+    if X < Result.Left then
+      Result.Left := X;
+    if Y > Result.Bottom then
+      Result.Bottom := Y;
+    if Y < Result.Top then
+      Result.Top := Y;
+  end;
+end;
+
+function HalfColor(Color: TColor): TColor;
+begin
+  Result :=
+    ((((Color shr 0) and $ff) shr 1) shl 0) or
+    ((((Color shr 8) and $ff) shr 1) shl 8) or
+    ((((Color shr 16) and $ff) shr 1) shl 16) or
+    ((((Color shr 24) and $ff) shr 0) shl 24);
+end;
+
+{ TGameTurnStat }
+
+procedure TGameTurnStat.LoadFromNode(Node: TDOMNode);
+begin
+  OccupiedCells := ReadInteger(Node, 'OccupiedCells', 0);
+  Units := ReadInteger(Node, 'Units', 0);
+  DiscoveredCells := ReadInteger(Node, 'DiscoveredCells', 0);
+  Cities := ReadInteger(Node, 'Cities', 0);
+end;
+
+procedure TGameTurnStat.SaveToNode(Node: TDOMNode);
+begin
+  WriteInteger(Node, 'OccupiedCells', OccupiedCells);
+  WriteInteger(Node, 'Units', Units);
+  WriteInteger(Node, 'DiscoveredCells', DiscoveredCells);
+  WriteInteger(Node, 'Cities', Cities);
+end;
+
+{ TGameTurnStats }
+
+procedure TGameTurnStats.LoadFromNode(Node: TDOMNode);
+var
+  Node2: TDOMNode;
+  NewTurnStat: TGameTurnStat;
+begin
+  Count := 0;
+  Node2 := Node.FirstChild;
+  while Assigned(Node2) and (Node2.NodeName = 'TurnStat') do begin
+    NewTurnStat := TGameTurnStat.Create;
+    NewTurnStat.LoadFromNode(Node2);
+    Add(NewTurnStat);
+    Node2 := Node2.NextSibling;
+  end;
+end;
+
+procedure TGameTurnStats.SaveToNode(Node: TDOMNode);
+var
+  I: Integer;
+  NewNode: TDOMNode;
+begin
+  for I := 0 to Count - 1 do begin;
+    NewNode := Node.OwnerDocument.CreateElement('TurnStat');
+    Node.AppendChild(NewNode);
+    TGameTurnStat(Items[I]).SaveToNode(NewNode);
+  end;
+end;
+
+{ TClients }
+
+procedure TClients.New(Name: string);
+var
+  NewClient: TClient;
+begin
+  NewClient := TClient.Create;
+  NewClient.Game := Game;
+  NewClient.Name := Name;
+  Add(NewClient);
+end;
+
+{ TClient }
+
+procedure TClient.SetGame(AValue: TGame);
+begin
+  if FGame = AValue then Exit;
+  FGame := AValue;
+  View.Game := AValue;
+end;
+
+procedure TClient.SetControlPlayer(AValue: TPlayer);
+begin
+  if FControlPlayer = AValue then Exit;
+  if Assigned(FControlPlayer) then
+    FControlPlayer.FClient := nil;
+  FControlPlayer := AValue;
+  if Assigned(FControlPlayer) then
+     FControlPlayer.FClient := Self;
+end;
+
+constructor TClient.Create;
+begin
+  View := TView.Create;
+end;
+
+destructor TClient.Destroy;
+begin
+  ControlPlayer := nil;
+  FreeAndNil(View);
+  inherited Destroy;
+end;
+
+{ TCellLink }
+
+procedure TCellLink.LoadFromNode(Node: TDOMNode);
+var
+  Node2: TDOMNode;
+  Node3: TDOMNode;
+begin
+  Node3 := Node.FindNode('Points');
+  if Assigned(Node3) then begin
+    SetLength(Points, 0);
+    Node2 := Node3.FirstChild;
+    while Assigned(Node2) and (Node2.NodeName = 'Point') do begin
+      SetLength(Points, Length(Points) + 1);
+      Points[High(Points)].X := ReadInteger(Node2, 'X', 0);
+      Points[High(Points)].Y := ReadInteger(Node2, 'Y', 0);
+      Node2 := Node2.NextSibling;
+    end;
+  end;
+end;
+
+procedure TCellLink.SaveToNode(Node: TDOMNode);
+var
+  NewNode: TDOMNode;
+  NewNode2: TDOMNode;
+  I: Integer;
+begin
+  NewNode := Node.OwnerDocument.CreateElement('Points');
+  Node.AppendChild(NewNode);
+  for I := 0 to Length(Points) - 1 do begin
+    NewNode2 := NewNode.OwnerDocument.CreateElement('Point');
+    NewNode.AppendChild(NewNode2);
+    WriteInteger(NewNode2, 'X', Points[I].X);
+    WriteInteger(NewNode2, 'Y', Points[I].Y);
+  end;
+end;
+
+constructor TCellLink.Create;
+begin
+  Cells := TCells.Create;
+  Cells.OwnsObjects := False;
+end;
+
+destructor TCellLink.Destroy;
+var
+  I: Integer;
+  LastState: Boolean;
+begin
+  for I := 0 to Cells.Count - 1 do begin
+    if TCell(Cells[I]).Neighbors.Remove(TCell(Cells[1 - I])) = -1 then
+      raise Exception.Create('Can''t remove cell from neighbour cell');
+    if TCell(Cells[I]).Links.Remove(Self) = -1 then
+      raise Exception.Create('Can''t remove cell from neighbour cell');
+  end;
+  FreeAndNil(Cells);
+  if Assigned(Map) then begin
+    // To remove itself from list we need disable owning to not be called twice
+    try
+      LastState := Map.CellLinks.OwnsObjects;
+      Map.CellLinks.OwnsObjects := False;
+      Map.CellLinks.Remove(Self);
+    finally
+      Map.CellLinks.OwnsObjects := LastState;
+    end;
+  end;
+  inherited Destroy;
+end;
+
+{ TCellLinks }
+
+function TCellLinks.FindByCells(Cell1, Cell2: TCell): TCellLink;
+var
+  I: Integer;
+begin
+  I := 0;
+  while (I < Count) do begin
+    if (TCellLink(Items[I]).Cells[0] = Cell1) and (TCellLink(Items[I]).Cells[1] = Cell2) then
+      Break;
+    if (TCellLink(Items[I]).Cells[0] = Cell2) and (TCellLink(Items[I]).Cells[1] = Cell1) then
+      Break;
+    Inc(I);
+  end;
+  if I < Count then Result := TCellLink(Items[I])
+    else Result := nil;
+end;
+
+procedure TCellLinks.LoadFromNode(Node: TDOMNode);
+var
+  Node2: TDOMNode;
+  NewCell: TCellLink;
+begin
+  Count := 0;
+  Node2 := Node.FirstChild;
+  while Assigned(Node2) and (Node2.NodeName = 'CellLink') do begin
+    NewCell := TCellLink.Create;
+    //NewCell.Map := Map;
+    NewCell.LoadFromNode(Node2);
+    Add(NewCell);
+    Node2 := Node2.NextSibling;
+  end;
+end;
+
+procedure TCellLinks.SaveToNode(Node: TDOMNode);
+var
+  I: Integer;
+  NewNode2: TDOMNode;
+begin
+  for I := 0 to Count - 1 do
+  with TCellLink(Items[I]) do begin
+    NewNode2 := Node.OwnerDocument.CreateElement('CellLink');
+    Node.AppendChild(NewNode2);
+    SaveToNode(NewNode2);
+  end;
+end;
+
+{ TMapArea }
+
+procedure TMapArea.GetBorderCells(List: TCells);
+var
+  I: Integer;
+  J: Integer;
+  NeighVoidCount: Integer;
+begin
+  List.Clear;
+
+  Map.Cells.ClearMark;
+
+  for I := 0 to Cells.Count - 1 do
+  with TCell(Cells[I]) do begin
+    NeighVoidCount := 0;
+    for J := 0 to Neighbors.Count - 1 do
+    with TCell(Neighbors[J]) do
+      if (Terrain = ttVoid) then Inc(NeighVoidCount);
+
+    if (NeighVoidCount > 0) and (Area = Self) and (not Mark) then begin
+        List.Add(TCell(Self.Cells[I]));
+        Mark := True;
+      end;
+  end;
+end;
+
+constructor TMapArea.Create;
+begin
+  Cells := TCells.Create;
+  Cells.OwnsObjects := False;
+end;
+
+destructor TMapArea.Destroy;
+begin
+  FreeAndNil(Cells);
+  inherited Destroy;
+end;
+
+{ TPlayerCell }
+
+procedure TPlayerCell.LoadFromNode(Node: TDOMNode);
+begin
+  Explored := ReadBoolean(Node, 'Explored', False);
+  MapCell := List.Map.Player.Game.Map.Cells.FindById(ReadInteger(Node, 'MapCell', 0));
+end;
+
+procedure TPlayerCell.SaveToNode(Node: TDOMNode);
+begin
+  WriteBoolean(Node, 'Explored', Explored);
+  WriteInteger(Node, 'MapCell', MapCell.Id);
+end;
+
+{ TPlayerCells }
+
+function TPlayerCells.SearchCell(Cell: TCell): TPlayerCell;
+var
+  I: Integer;
+begin
+  I := 0;
+  while (I < Count) and (TPlayerCell(Items[I]).MapCell <> Cell) do Inc(I);
+  if I < Count then Result := TPlayerCell(Items[I])
+    else Result := nil;
+end;
+
+procedure TPlayerCells.LoadFromNode(Node: TDOMNode);
+var
+  Node2: TDOMNode;
+  NewCell: TPlayerCell;
+begin
+  Count := 0;
+  Node2 := Node.FirstChild;
+  while Assigned(Node2) and (Node2.NodeName = 'Cell') do begin
+    NewCell := TPlayerCell.Create;
+    NewCell.List := Self;
+    NewCell.LoadFromNode(Node2);
+    Add(NewCell);
+    Node2 := Node2.NextSibling;
+  end;
+end;
+
+procedure TPlayerCells.SaveToNode(Node: TDOMNode);
+var
+  I: Integer;
+  NewNode: TDOMNode;
+begin
+  for I := 0 to Count - 1 do begin;
+    NewNode := Node.OwnerDocument.CreateElement('Cell');
+    Node.AppendChild(NewNode);
+    TPlayerCell(Items[I]).SaveToNode(NewNode);
+  end;
+end;
+
+{ TPlayerMap }
+
+procedure TPlayerMap.LoadFromNode(Node: TDOMNode);
+var
+  NewNode: TDOMNode;
+begin
+  with Node do begin
+    NewNode := FindNode('Cells');
+    if Assigned(NewNode) then
+      Cells.LoadFromNode(NewNode);
+  end;
+end;
+
+procedure TPlayerMap.SaveToNode(Node: TDOMNode);
+var
+  NewNode: TDOMNode;
+begin
+  with Node do begin
+    NewNode := OwnerDocument.CreateElement('Cells');
+    AppendChild(NewNode);
+    Cells.SaveToNode(NewNode);
+  end;
+end;
+
+procedure TPlayerMap.Update;
+var
+  I: Integer;
+  OldCount: Integer;
+begin
+  // Update players cells count to map cells count to be 1:1
+  OldCount := Cells.Count;
+  Cells.Count := Player.Game.Map.Cells.Count;
+  for I := OldCount to Cells.Count - 1 do
+    Cells[I] := TPlayerCell.Create;
+
+  for I := 0 to Cells.Count - 1 do
+  with TPlayerCell(Cells[I]) do begin
+    List := Cells;
+    Explored := False;
+    InVisibleRange := False;
+    MapCell := TCell(Player.Game.Map.Cells[I]);
+  end;
+end;
+
+constructor TPlayerMap.Create;
+begin
+  Cells := TPlayerCells.Create;
+  Cells.Map := Self;
+end;
+
+destructor TPlayerMap.Destroy;
+begin
+  FreeAndNil(Cells);
+  inherited Destroy;
+end;
+
+procedure TPlayerMap.CheckVisibility;
+var
+  I: Integer;
+  C: Integer;
+  NeighCount: Integer;
+begin
+  for I := 0 to Cells.Count - 1 do
+  with TPlayerCell(Cells[I]) do begin
+    NeighCount := 0;
+    for C := 0 to MapCell.Neighbors.Count - 1 do
+      if TCell(MapCell.Neighbors[C]).Player = Player then
+        Inc(NeighCount);
+
+    InVisibleRange := (NeighCount > 0) or (TCell(MapCell).Player = Player);
+    if InVisibleRange and not Explored then Explored := True;
+  end;
+end;
+
+procedure TPlayerMap.Paint(Canvas: TCanvas; View: TView);
+var
+  I: Integer;
+  C: Integer;
+  Cell: TPlayerCell;
+  PosFrom, PosTo: TPoint;
+  Angle: Double;
+  ArrowCenter: TPoint;
+  Move: TUnitMove;
+  CellText: string;
+begin
+  with Canvas, View do
+  try
+    Lock;
+    // Draw cell links
+    Pen.Color := clBlack;
+    Pen.Style := psSolid;
+    Pen.Width := 3;
+    for C := 0 to Player.Game.Map.CellLinks.Count - 1 do
+    with TCellLink(Player.Game.Map.CellLinks[C]) do begin
+      if Length(Points) >= 2 then begin
+        MoveTo(View.CellToCanvasPos(Points[0]));
+        for I := 1 to Length(Points) - 1 do
+          LineTo(View.CellToCanvasPos(Points[I]));
+      end;
+    end;
+
+    // Draw cells
+    for C := 0 to Cells.Count - 1 do begin
+      Cell := TPlayerCell(Cells[C]);
+      if (Cell.MapCell.Terrain <> ttVoid) and Cell.MapCell.IsVisible(View) then begin
+        CellText := IntToStr(Cell.MapCell.GetAvialPower);
+        if Assigned(SelectedCell) and (SelectedCell = Cell.MapCell) then
+            Brush.Color := clGreen
+          else if Assigned(SelectedCell) and Player.Game.Map.IsCellsNeighbor(SelectedCell, Cell.MapCell) then
+            Brush.Color := clPurple
+          else if Player.Game.FogOfWar then begin
+            if Cell.InVisibleRange then begin
+              Brush.Color := Cell.MapCell.GetColor;
+            end else begin
+              if Cell.Explored then begin
+                Brush.Color := $404040;
+                CellText := '';
+              end else begin
+                Brush.Color := clBlack;
+                CellText := '';
+              end;
+            end;
+          end else Brush.Color := Cell.MapCell.GetColor;
+        Player.Game.Map.PaintCell(Canvas, Cell.MapCell.PosPx, CellText, View, Cell.MapCell);
+      end else
+      if Game.FogOfWar and (Cell.MapCell.Terrain = ttVoid) and (not Cell.Explored) then begin
+        Brush.Color := clBlack;
+        Player.Game.Map.PaintCell(Canvas, Cell.MapCell.PosPx, '', View, Cell.MapCell);
+      end;
+    end;
+
+    // Draw arrows
+    Pen.Color := clCream;
+    for I := 0 to Game.Moves.Count - 1 do begin
+      Move := TUnitMove(Game.Moves[I]);
+      PosFrom := Player.Game.Map.CellToPos(Move.CellFrom);
+      PosTo := Player.Game.Map.CellToPos(Move.CellTo);
+      // In Fog of war mode show only
+      if Game.FogOfWar and not Cells.SearchCell(Move.CellFrom).InVisibleRange and
+        not Cells.SearchCell(Move.CellTo).InVisibleRange then
+        Continue;
+      if Move.CountRepeat > 0 then Pen.Width := 2
+        else Pen.Width := 1;
+      Angle := ArcTan((PosTo.Y - PosFrom.Y) / (PosTo.X - PosFrom.X));
+      if Sign(PosTo.X - PosFrom.X) = -1 then Angle := Angle + Pi;
+      ArrowCenter := View.CellToCanvasPos(Point(Trunc(PosFrom.X + (PosTo.X - PosFrom.X) / 2),
+        Trunc(PosFrom.Y + (PosTo.Y - PosFrom.Y) / 2)));
+      Player.Game.Map.DrawArrow(Canvas, View, ArrowCenter,
+        Angle, IntToStr(Move.CountOnce));
+    end;
+  finally
+    Unlock;
+  end;
+end;
+
+{ TCanvasEx }
+
+class procedure TCanvasEx.TextOutEx(Canvas: TCanvas; X, Y: Integer; const Text: string;
+  MovePen: Boolean);
+var
+  Flags : Cardinal;
+begin
+  with Canvas do begin
+    Changing;
+    RequiredState([csHandleValid, csFontValid, csBrushValid]);
+    Flags := 0;
+    if TextStyle.Opaque then
+      Flags := ETO_Opaque;
+    ExtUTF8Out(Handle, X, Y, Flags, nil, PChar(Text), Length(Text), nil);
+    if MovePen then MoveTo(X + TextWidth(Text), Y);
+    Changed;
+  end;
+end;
+
+class procedure TCanvasEx.PolygonEx(Canvas: TCanvas; const Points: array of TPoint; Winding: Boolean);
+begin
+  //Changing;
+  //RequiredState([csHandleValid, csBrushValid, csPenValid]);
+  LCLIntf.Polygon(Canvas.Handle, @Points[0], Length(Points), Winding);
+  //Changed;
+end;
+
+
+{ TCells }
+
+procedure TCells.FixRefId;
+var
+  I: Integer;
+begin
+  for I := 0 to Count - 1 do
+  TCell(Items[I]).FixRefId;
+end;
+
+function TCells.FindById(Id: Integer): TCell;
+var
+  I: Integer;
+begin
+  I := 0;
+  while (I < Count) and (TCell(Items[I]).Id <> Id) do Inc(I);
+  if I < Count then Result := TCell(Items[I])
+    else Result := nil;
+end;
+
+procedure TCells.LoadFromNode(Node: TDOMNode);
+var
+  Node2: TDOMNode;
+  NewCell: TCell;
+begin
+  Count := 0;
+  Node2 := Node.FirstChild;
+  while Assigned(Node2) and (Node2.NodeName = 'Cell') do begin
+    NewCell := TCell.Create;
+    NewCell.Map := Map;
+    NewCell.LoadFromNode(Node2);
+    Add(NewCell);
+    Node2 := Node2.NextSibling;
+  end;
+end;
+
+procedure TCells.SaveToNode(Node: TDOMNode);
+var
+  I: Integer;
+  NewNode2: TDOMNode;
+begin
+  for I := 0 to Count - 1 do
+  with TCell(Items[I]) do begin
+    NewNode2 := Node.OwnerDocument.CreateElement('Cell');
+    Node.AppendChild(NewNode2);
+    SaveToNode(NewNode2);
+  end;
+end;
+
+procedure TCells.ClearMark;
+var
+  I: Integer;
+begin
+  for I := 0 to Count - 1 do
+    TCell(Items[I]).Mark := False;
+end;
+
+{ TPlayers }
+
+function TPlayers.FindById(Id: Integer): TPlayer;
+var
+  I: Integer;
+begin
+  I := 0;
+  while (I < Count) and (TPlayer(Items[I]).Id <> Id) do Inc(I);
+  if I < Count then Result := TPlayer(Items[I])
+    else Result := nil;
+end;
+
+procedure TPlayers.New(Name: string; Color: TColor; Mode: TPlayerMode);
+var
+  NewPlayer: TPlayer;
+begin
+  NewPlayer := TPlayer.Create;
+  NewPlayer.Game := Game;
+  NewPlayer.Name := Name;
+  NewPlayer.Color := Color;
+  NewPlayer.Mode := Mode;
+  NewPlayer.Id := GetNewPlayerId;
+  if Mode = pmComputer then
+    NewPlayer.Agressivity := caMedium;
+  Add(NewPlayer);
+end;
+
+function TPlayers.GetNewPlayerId: Integer;
+begin
+  Result := NewPlayerId;
+  Inc(NewPlayerId);
+end;
+
+procedure TPlayers.LoadFromNode(Node: TDOMNode);
+var
+  Node2: TDOMNode;
+  NewPlayer: TPlayer;
+begin
+  Count := 0;
+  Node2 := Node.FirstChild;
+  while Assigned(Node2) and (Node2.NodeName = 'Player') do begin
+    NewPlayer := TPlayer.Create;
+    NewPlayer.Game := Game;
+    NewPlayer.LoadFromNode(Node2);
+    Add(NewPlayer);
+    Node2 := Node2.NextSibling;
+  end;
+end;
+
+procedure TPlayers.SaveToNode(Node: TDOMNode);
+var
+  I: Integer;
+  NewNode: TDOMNode;
+begin
+  for I := 0 to Count - 1 do begin;
+    NewNode := Node.OwnerDocument.CreateElement('Player');
+    Node.AppendChild(NewNode);
+    TPlayer(Items[I]).SaveToNode(NewNode);
+  end;
+end;
+
+constructor TPlayers.Create;
+begin
+  inherited Create;
+  NewPlayerId := 1;
+end;
+
+function TPlayers.GetFirstHuman: TPlayer;
+var
+  I: Integer;
+begin
+  I := 0;
+  while (I < Count) and (TPlayer(Items[I]).Mode <> pmHuman) do Inc(I);
+  if I < Count then Result := TPlayer(Items[I])
+    else Result := nil;
+end;
+
+{ TUnitMoves }
+
+procedure TUnitMoves.LoadFromNode(Node: TDOMNode);
+var
+  Node2: TDOMNode;
+  NewUnitMove: TUnitMove;
+begin
+  Count := 0;
+  Node2 := Node.FirstChild;
+  while Assigned(Node2) and (Node2.NodeName = 'UnitMove') do begin
+    NewUnitMove := TUnitMove.Create;
+    NewUnitMove.List := Self;
+    NewUnitMove.LoadFromNode(Node2);
+    Add(NewUnitMove);
+    Node2 := Node2.NextSibling;
+  end;
+end;
+
+procedure TUnitMoves.SaveToNode(Node: TDOMNode);
+var
+  I: Integer;
+  NewNode: TDOMNode;
+begin
+  for I := 0 to Count - 1 do begin;
+    NewNode := Node.OwnerDocument.CreateElement('UnitMove');
+    Node.AppendChild(NewNode);
+    TUnitMove(Items[I]).SaveToNode(NewNode);
+  end;
+end;
+
+{ TMap }
+
+function TMap.GetSize: TPoint;
+begin
+  Result:= FSize;
+end;
+
+procedure TMap.SetSize(AValue: TPoint);
+begin
+  if (FSize.X <> AValue.X) or (FSize.Y <> AValue.Y) then begin
+    FSize := AValue;
+    Generate;
+  end;
+end;
+
+function TMap.GetNewCellId: Integer;
+begin
+  Result := FNewCellId;
+  Inc(FNewCellId);
+end;
+
+function TMap.IsOutsideShape(Coord: TPoint): Boolean;
+var
+  Rect: TRect;
+  Color: TColor;
+  Pos: TPoint;
+begin
+  case Shape of
+    msRectangle: Result := False;
+    msImage: begin
+      Rect := GetPixelRect;
+      with Image.Picture.Bitmap do begin
+        Pos := Point(Trunc(Coord.X / (Rect.Right - Rect.Left) * Width),
+          Trunc(Coord.Y / (Rect.Bottom - Rect.Top) * Height));
+        Color := Canvas.Pixels[Pos.X, Pos.Y];
+      end;
+      Result := Color <> clWhite;
+    end;
+    else Result := False;
+  end;
+end;
+
+procedure TMap.DrawArrow(Canvas: TCanvas; View: TView; Pos: TPoint;
+  Angle: Double; Text: string);
+var
+  Points: array of TPoint;
+  FPoints: array of TFloatPoint;
+  I: Integer;
+  ArrowSize: TPoint;
+begin
+  Canvas.Brush.Color := clWhite;
+  Canvas.Pen.Color := clBlack;
+  SetLength(Points, 8);
+  SetLength(FPoints, 8);
+  ArrowSize := Point(Trunc(DefaultCellSize.X / 3 * View.Zoom),
+    Trunc(DefaultCellSize.Y / 3 * View.Zoom));
+  FPoints[0] := FloatPoint(+0.5 * ArrowSize.X, +0 * ArrowSize.Y);
+  FPoints[1] := FloatPoint(+0 * ArrowSize.X, +0.5 * ArrowSize.Y);
+  FPoints[2] := FloatPoint(+0 * ArrowSize.X, +0.25 * ArrowSize.Y);
+  FPoints[3] := FloatPoint(-0.5 * ArrowSize.X, +0.25 * ArrowSize.Y);
+  FPoints[4] := FloatPoint(-0.5 * ArrowSize.X, -0.25 * ArrowSize.Y);
+  FPoints[5] := FloatPoint(+0 * ArrowSize.X, -0.25 * ArrowSize.Y);
+  FPoints[6] := FloatPoint(+0 * ArrowSize.X, -0.5 * ArrowSize.Y);
+  FPoints[7] := FloatPoint(+0.5 * ArrowSize.X, 0 * ArrowSize.Y);
+  // Rotate
+  for I := 0 to Length(Points) - 1 do
+    FPoints[I] := FloatPoint(FPoints[I].X * Cos(Angle) - FPoints[I].Y * Sin(Angle),
+      FPoints[I].X * Sin(Angle) + FPoints[I].Y * Cos(Angle));
+  // Shift
+  for I := 0 to Length(Points) - 1 do
+    Points[I] := Point(Trunc(FPoints[I].X + Pos.X), Trunc(FPoints[I].Y + Pos.Y));
+  with Canvas do begin
+    Brush.Style := bsSolid;
+    Polygon(Points);
+    Brush.Style := bsClear;
+    Font.Color := clBlack;
+    Font.Size := Trunc(26 * View.Zoom);
+    TextOut(Pos.X - TextWidth(Text) div 2,
+      Pos.Y - TextHeight(Text) div 2, Text);
+    Pen.Width := 1;
+  end;
+end;
+
+function TMap.IsCellsNeighbor(Cell1, Cell2: TCell): Boolean;
+begin
+  Result := Cell1.Neighbors.IndexOf(Cell2) <> -1;
+end;
+
+function TMap.IsValidIndex(Index: TPoint): Boolean;
+begin
+  Result := False;
+end;
+
+procedure TMap.Assign(Source: TMap);
+var
+  I: Integer;
+begin
+  MaxPower := Source.MaxPower;
+  Game := Source.Game;
+  Size := Source.Size;
+  DefaultCellSize := Source.DefaultCellSize;
+  Shape := Source.Shape;
+  Image.Picture.Bitmap.Assign(Source.Image.Picture.Bitmap);
+
+  // TODO: How to copy cells
+  {// Copy all cells
+  Cells.Count := 0;
+  Cells.Count := Source.Cells.Count;
+  for I := 0 to Cells.Count - 1 do begin
+    Cells[I] := TCell.Create;
+    TCell(Cells[I]).Map := Self;
+    TCell(Cells[I]).Assign(TCell(Source.Cells[I]));
+  end;
+  }
+end;
+
+procedure TMap.LoadFromFile(FileName: string);
+begin
+
+end;
+
+procedure TMap.SaveToFile(FileName: string);
+begin
+
+end;
+
+procedure TMap.LoadFromNode(Node: TDOMNode);
+var
+  Node2: TDOMNode;
+begin
+  Size := Point(ReadInteger(Node, 'SizeX', 0), ReadInteger(Node, 'SizeY', 0));
+  DefaultCellSize.X := ReadInteger(Node, 'DefaultCellSizeX', 1);
+  DefaultCellSize.Y := ReadInteger(Node, 'DefaultCellSizeY', 1);
+  MaxPower := ReadInteger(Node, 'MaxPower', 99);
+  Shape := TMapShape(ReadInteger(Node, 'Shape', Integer(msRectangle)));
+  Node2 := Node.FindNode('Cells');
+  if Assigned(Node2) then
+    Cells.LoadFromNode(Node2);
+  Node2 := Node.FindNode('CellLinks');
+  if Assigned(Node2) then
+    CellLinks.LoadFromNode(Node2);
+end;
+
+procedure TMap.SaveToNode(Node: TDOMNode);
+var
+  NewNode: TDOMNode;
+  NewNode2: TDOMNode;
+  I: Integer;
+begin
+  WriteInteger(Node, 'DefaultCellSizeX', DefaultCellSize.X);
+  WriteInteger(Node, 'DefaultCellSizeY', DefaultCellSize.Y);
+  WriteInteger(Node, 'MaxPower', MaxPower);
+  WriteInteger(Node, 'Shape', Integer(Shape));
+  WriteInteger(Node, 'SizeX', Size.X);
+  WriteInteger(Node, 'SizeY', Size.Y);
+  NewNode := Node.OwnerDocument.CreateElement('Cells');
+  Node.AppendChild(NewNode);
+  Cells.SaveToNode(NewNode);
+  NewNode := Node.OwnerDocument.CreateElement('CellLinks');
+  Node.AppendChild(NewNode);
+  CellLinks.SaveToNode(NewNode);
+end;
+
+function TMap.PosToCell(Pos: TPoint; View: TView): TCell;
+var
+  I: Integer;
+begin
+  Result := nil;
+  for I := 0 to Cells.Count - 1 do
+  if TCell(Cells[I]).Terrain <> ttVoid then begin
+    if PtInPoly(TCell(Cells[I]).Polygon, Pos) then begin
+      Result := TCell(Cells[I]);
+      Exit;
+    end;
+  end;
+end;
+
+function TMap.CellToPos(Cell: TCell): TPoint;
+begin
+  Result := Cell.PosPx;
+end;
+
+procedure TMap.Grow(APlayer: TPlayer);
+var
+  I: Integer;
+  Addition: Integer;
+  Dies: Integer;
+begin
+  for I := 0 to Cells.Count - 1 do
+  with TCell(Cells[I]) do begin
+    if (Player = APlayer) and ((Game.GrowCells = gcPlayerAll) or
+    ((Game.GrowCells = gcPlayerCities) and (Terrain = ttCity))) then begin
+      if Power < MaxPower then begin
+        // Increase units count
+        if Game.GrowAmount = gaByOne then Addition := 1
+          else if Game.GrowAmount = gaBySquareRoot then begin
+            Addition := Trunc(Sqrt(Power));
+            if Addition = 0 then Addition := 1;
+          end;
+        Power := Min(Power + Addition, MaxPower);
+      end else
+      if Power > MaxPower then begin
+        // Reduce units count
+        // If cell has more then MaxPower units then additional units dies
+        // in twice of squeare root of unites over MaxPower
+        Dies := 2 * Trunc(Sqrt(Power - MaxPower));
+        Power := Max(Power - Dies, 0);
+      end;
+    end;
+  end;
+end;
+
+procedure TMap.PaintCell(Canvas: TCanvas; Pos: TPoint; Text: string; View: TView;
+  Cell: TCell);
+var
+  I: Integer;
+  TextPos: TPoint;
+  Points: array of TPoint;
+  TextSize: TSize;
+begin
+  with Canvas do begin
+    if Assigned(View.FocusedCell) and (View.FocusedCell = Cell) then begin
+      Pen.Color := clYellow;
+      Pen.Style := psSolid;
+      Pen.Width := 1;
+    end else
+    if Cell.Terrain = ttCity then begin
+      // Cannot set clear border as it will display shifted on gtk2
+      //Pen.Style := psClear;
+      Pen.Color := clBlack;
+      Pen.Style := psSolid;
+      Pen.Width := 3;
+    end else begin
+      // Cannot set clear border as it will display shifted on gtk2
+      //Pen.Style := psClear;
+      Pen.Color := Brush.Color;
+      Pen.Style := psSolid;
+      Pen.Width := 0;
+    end;
+    // Transform view
+    SetLength(Points, Length(Cell.Polygon));
+    for I := 0 to Length(Points) - 1 do
+      Points[I] := View.CellToCanvasPos(Cell.Polygon[I]);
+    Brush.Style := bsSolid;
+    //Polygon(Points, False, 0, Length(Points));
+    TCanvasEx.PolygonEx(Canvas, Points, False);
+    //MoveTo(Points[0].X, Points[0].Y);
+    //LineTo(Points[1].X, Points[1].Y);
+
+    // Show cell text
+    if Text <> '0' then begin
+      Pen.Style := psSolid;
+      Font.Color := clWhite;
+      Brush.Style := bsClear;
+      Font.Size := Trunc(42 * View.Zoom);
+      TextPos := View.CellToCanvasPos(Pos);
+      TextSize := TextExtent(Text);
+      TCanvasEx.TextOutEx(Canvas, Round(TextPos.X) - TextSize.cx div 2,
+        Round(TextPos.Y) - TextSize.cy div 2, Text, False);
+    end;
+  end;
+end;
+
+procedure TMap.ComputePlayerStats;
+var
+  I: Integer;
+begin
+  for I := 0 to Cells.Count - 1 do
+  with TCell(Cells[I]) do begin
+    if Assigned(Player) then begin
+      Player.TotalCells := Player.TotalCells + 1;
+      Player.TotalUnits := Player.TotalUnits + Power;
+      if Terrain = ttCity then
+        Player.TotalCities := Player.TotalCities + 1;
+    end;
+  end;
+end;
+
+procedure TMap.Generate;
+var
+  X, Y: Integer;
+  I: Integer;
+  NewCell: TCell;
+begin
+  // Free previous
+  Cells.Count := 0;
+  // Allocate and init new
+  Cells.Count := FSize.Y * FSize.X;
+  FNewCellId := 1;
+  for Y := 0 to FSize.Y - 1 do
+  for X := 0 to FSize.X - 1 do begin
+    NewCell := TCell.Create;
+    NewCell.Map := Self;
+    NewCell.PosPx := Point(X, Y);
+    NewCell.Id := GetNewCellId;
+    Cells[Y * FSize.X + X] := NewCell;
+  end;
+end;
+
+constructor TMap.Create;
+begin
+  MaxPower := 99;
+  DefaultCellSize := Point(220, 220);
+  Cells := TCells.Create;
+  Cells.Map := Self;
+  Size := Point(0, 0);
+  Image := TImage.Create(nil);
+  CellLinks := TCellLinks.Create;
+  CellLinks.Map := Self;
+  Areas := TMapAreas.Create;
+end;
+
+destructor TMap.Destroy;
+begin
+  Size := Point(0, 0);
+  FreeAndNil(Areas);
+  FreeAndNil(CellLinks);
+  FreeAndNil(Image);
+  FreeAndNil(Cells);
+  inherited Destroy;
+end;
+
+function TMap.GetPixelRect: TRect;
+var
+  I: Integer;
+  CellRect: TRect;
+begin
+  Result := Rect(0, 0, 0, 0);
+  // This is generic algorithm to determine pixel size of entire map
+  for I := 0 to Cells.Count - 1 do begin
+    CellRect := GetPolygonRect(TCell(Cells[I]).Polygon);
+    if I = 0 then Result := CellRect
+      else begin
+        if CellRect.Right > Result.Right then Result.Right := CellRect.Right;
+        if CellRect.Bottom > Result.Bottom then Result.Bottom := CellRect.Bottom;
+        if CellRect.Left < Result.Left then Result.Left := CellRect.Left;
+        if CellRect.Top < Result.Top then  Result.Top := CellRect.Top;
+      end;
+  end;
+end;
+
+procedure TMap.ForEachCells(Method: TMethod);
+begin
+
+end;
+
+{ TUnitMove }
+
+procedure TUnitMove.SetCellFrom(AValue: TCell);
+begin
+  if FCellFrom = AValue then Exit;
+  if Assigned(AValue) and not Assigned(FCellFrom) then begin
+    AValue.MovesFrom.Add(Self);
+  end else
+  if not Assigned(AValue) and Assigned(FCellFrom) then begin
+    FCellFrom.MovesFrom.Remove(Self);
+  end;
+  FCellFrom := AValue;
+end;
+
+procedure TUnitMove.SetCellTo(AValue: TCell);
+begin
+  if FCellTo = AValue then Exit;
+  if Assigned(AValue) and not Assigned(FCellTo) then begin
+    AValue.MovesTo.Add(Self);
+  end else
+  if not Assigned(AValue) and Assigned(FCellTo) then begin
+    FCellTo.MovesTo.Remove(Self);
+  end;
+  FCellTo := AValue;
+end;
+
+procedure TUnitMove.LoadFromNode(Node: TDOMNode);
+begin
+  CountOnce := ReadInteger(Node, 'CountOnce', 0);
+  CountRepeat := ReadInteger(Node, 'CountRepeat', 0);
+  CellFrom := List.Game.Map.Cells.FindById(ReadInteger(Node, 'CellFrom', 0));
+  CellTo := List.Game.Map.Cells.FindById(ReadInteger(Node, 'CellTo', 0));
+end;
+
+procedure TUnitMove.SaveToNode(Node: TDOMNode);
+begin
+  WriteInteger(Node, 'CountOnce', CountOnce);
+  WriteInteger(Node, 'CountRepeat', CountRepeat);
+  WriteInteger(Node, 'CellFrom', CellFrom.Id);
+  WriteInteger(Node, 'CellTo', CellTo.Id);
+end;
+
+constructor TUnitMove.Create;
+begin
+  List := nil; // Is later set to parent list owning item
+  FCellFrom := nil;
+  FCellTo := nil;
+end;
+
+destructor TUnitMove.Destroy;
+var
+  LastState: Boolean;
+begin
+  CellFrom := nil;
+  CellTo := nil;
+  if Assigned(List) then begin
+    // To remove itself from list we need disable owning to not be called twice
+    try
+      LastState := List.OwnsObjects;
+      List.OwnsObjects := False;
+      List.Remove(Self);
+    finally
+      List.OwnsObjects := LastState;
+    end;
+  end;
+  inherited Destroy;
+end;
+
+{ TView }
+
+procedure TView.SetZoom(AValue: Double);
+begin
+  if FZoom = AValue then Exit;
+  if AValue = 0 then
+    raise Exception.Create(SZeroZoomNotAlowed);
+  FZoom := AValue;
+  SourceRect := Bounds(Trunc(SourceRect.Left + (SourceRect.Right - SourceRect.Left) div 2 - (DestRect.Right - DestRect.Left) / Zoom / 2),
+    Trunc(SourceRect.Top +  (SourceRect.Bottom - SourceRect.Top) div 2 - (DestRect.Bottom - DestRect.Top) / Zoom / 2),
+    Trunc((DestRect.Right - DestRect.Left) / Zoom),
+    Trunc((DestRect.Bottom - DestRect.Top) / Zoom));
+end;
+
+procedure TView.Clear;
+begin
+  FocusedCell := nil;
+  SelectedCell := nil;
+end;
+
+procedure TView.SetDestRect(AValue: TRect);
+var
+  Diff: TPoint;
+begin
+  if RectEquals(FDestRect, AValue) then Exit;
+  Diff := Point(Trunc((DestRect.Right - DestRect.Left) / Zoom - (AValue.Right - AValue.Left) / Zoom) div 2,
+    Trunc((DestRect.Bottom - DestRect.Top) / Zoom - (AValue.Bottom - AValue.Top) / Zoom) div 2);
+  FDestRect := AValue;
+  SourceRect := Bounds(SourceRect.Left + Diff.X, SourceRect.Top + Diff.Y,
+    Trunc((DestRect.Right - DestRect.Left) / Zoom),
+    Trunc((DestRect.Bottom - DestRect.Top) / Zoom));
+end;
+
+constructor TView.Create;
+begin
+  Zoom := 1.5;
+  Clear;
+end;
+
+destructor TView.Destroy;
+begin
+  inherited Destroy;
+end;
+
+{ TCell }
+
+procedure TCell.SetPower(AValue: Integer);
+begin
+  if FPower = AValue then Exit;
+  if AValue < 0 then
+    raise Exception.Create('Not allowed to substract power under zero do negative value');
+  FPower := AValue;
+end;
+
+procedure TCell.SetArea(AValue: TMapArea);
+begin
+  if FArea = AValue then Exit;
+  if Assigned(FArea) then FArea.Cells.Remove(Self);
+  FArea := AValue;
+  if Assigned(FArea) then FArea.Cells.Add(Self);
+end;
+
+procedure TCell.AreaExtend;
+var
+  I: Integer;
+begin
+  for I := 0 to Neighbors.Count - 1 do
+  with TCell(Neighbors[I]) do
+  if (Terrain <> ttVoid) and (not Assigned(Area)) then begin
+    Area := Self.Area;
+    AreaExtend;
+  end;
+end;
+
+procedure TCell.FixRefId;
+var
+  I: Integer;
+begin
+  Player := Map.Game.Players.FindById(PlayerId);
+
+  Neighbors.Count := Length(NeighborsId);
+  for I := 0 to Length(NeighborsId) - 1 do begin
+     Neighbors[I] := Map.Cells.FindById(NeighborsId[I]);
+  end;
+end;
+
+procedure TCell.LoadFromNode(Node: TDOMNode);
+var
+  Node2: TDOMNode;
+  Node3: TDOMNode;
+  NewCell: TCell;
+begin
+  Id := ReadInteger(Node, 'Id', 0);
+  Power := ReadInteger(Node, 'Power', 0);
+  Terrain := TTerrainType(ReadInteger(Node, 'Terrain', Integer(ttVoid)));
+  PosPx.X := ReadInteger(Node, 'PosX', 0);
+  PosPx.Y := ReadInteger(Node, 'PosY', 0);
+  PlayerId := ReadInteger(Node, 'Player', 0);
+
+  Node3 := Node.FindNode('Neighbours');
+  if Assigned(Node3) then begin
+    SetLength(NeighborsId, 0);
+    Node2 := Node3.FirstChild;
+    while Assigned(Node2) and (Node2.NodeName = 'Neighbour') do begin
+      SetLength(NeighborsId, Length(NeighborsId) + 1);
+      NeighborsId[High(NeighborsId)] := ReadInteger(Node2, 'Id', 0);
+      Node2 := Node2.NextSibling;
+    end;
+  end;
+
+  Node3 := Node.FindNode('Polygon');
+  if Assigned(Node3) then begin
+    SetLength(Polygon, 0);
+    Node2 := Node3.FirstChild;
+    while Assigned(Node2) and (Node2.NodeName = 'Point') do begin
+      SetLength(Polygon, Length(Polygon) + 1);
+      Polygon[High(Polygon)].X := ReadInteger(Node2, 'X', 0);
+      Polygon[High(Polygon)].Y := ReadInteger(Node2, 'Y', 0);
+      Node2 := Node2.NextSibling;
+    end;
+  end;
+end;
+
+procedure TCell.SaveToNode(Node: TDOMNode);
+var
+  NewNode: TDOMNode;
+  NewNode2: TDOMNode;
+  I: Integer;
+begin
+  WriteInteger(Node, 'Id', Id);
+  WriteInteger(Node, 'Power', Power);
+  WriteInteger(Node, 'Terrain', Integer(Terrain));
+  WriteInteger(Node, 'PosX', PosPx.X);
+  WriteInteger(Node, 'PosY', PosPx.Y);
+  if Assigned(Player) then
+    WriteInteger(Node, 'Player', Player.Id)
+    else WriteInteger(Node, 'Player', 0);
+  NewNode := Node.OwnerDocument.CreateElement('Neighbours');
+  Node.AppendChild(NewNode);
+  for I := 0 to Neighbors.Count - 1 do begin
+    NewNode2 := NewNode.OwnerDocument.CreateElement('Neighbour');
+    NewNode.AppendChild(NewNode2);
+    WriteInteger(NewNode2, 'Id', TCell(Neighbors[I]).Id);
+  end;
+  NewNode := Node.OwnerDocument.CreateElement('Polygon');
+  Node.AppendChild(NewNode);
+  for I := 0 to Length(Polygon) - 1 do begin
+    NewNode2 := NewNode.OwnerDocument.CreateElement('Point');
+    NewNode.AppendChild(NewNode2);
+    WriteInteger(NewNode2, 'X', Polygon[I].X);
+    WriteInteger(NewNode2, 'Y', Polygon[I].Y);
+  end;
+end;
+
+procedure TCell.Assign(Source: TCell);
+begin
+  Id := Source.Id;
+  PosPx := Source.PosPx;
+  Terrain := Source.Terrain;
+  Polygon := Source.Polygon;
+  Player := Source.Player;
+  Mark := Source.Mark;
+  // TODO: How to copy neighbours and moves list
+end;
+
+function TCell.IsVisible(View: TView): Boolean;
+var
+  RectA, RectB: TRect;
+begin
+  RectA := GetPolygonRect(Polygon);
+  RectB := View.SourceRect;
+  Result := ((RectA.Left < RectB.Right) and (RectA.Right > RectB.Left) and
+    (RectA.Top < RectB.Bottom) and (RectA.Bottom > RectB.Top));
+end;
+
+function TCell.GetColor: TColor;
+begin
+  if Assigned(Player) then Result := Player.Color
+    else Result := clGray;
+end;
+
+function TCell.GetAvialPower: Integer;
+var
+  I: Integer;
+begin
+  Result := Power;
+  for I := 0 to MovesFrom.Count - 1 do
+    Result := Result - TUnitMove(MovesFrom[I]).CountOnce;
+  if Result < 0 then Result := 0;
+end;
+
+function TCell.GetAttackPower: Integer;
+var
+  I: Integer;
+begin
+  Result := 0;
+  for I := 0 to MovesTo.Count - 1 do
+    Result := Result + TUnitMove(MovesTo[I]).CountOnce;
+end;
+
+constructor TCell.Create;
+begin
+  Player := nil;
+  Neighbors := TCells.Create;
+  Neighbors.OwnsObjects := False;
+  MovesFrom := TUnitMoves.Create;
+  MovesFrom.OwnsObjects := False;
+  MovesTo := TUnitMoves.Create;
+  MovesTo.OwnsObjects := False;
+  Links := TCellLinks.Create;
+  Links.OwnsObjects := False;
+end;
+
+destructor TCell.Destroy;
+var
+  I: Integer;
+begin
+  for I := MovesFrom.Count - 1 downto 0 do
+    TUnitMove(MovesFrom[I]).Free;
+  FreeAndNil(MovesFrom);
+  for I := MovesTo.Count - 1 downto 0 do
+    TUnitMove(MovesTo[I]).Free;
+  FreeAndNil(MovesTo);
+  for I := Links.Count - 1 downto 0 do
+    TCellLink(Links[I]).Free;
+  FreeAndNil(Links);
+  for I := Neighbors.Count - 1 downto 0 do
+    if TCell(Neighbors[I]).Neighbors.Remove(Self) = -1 then
+      raise Exception.Create('Can''t remove cell from neighbour cell');
+  FreeAndNil(Neighbors);
+  inherited Destroy;
+end;
+
+{ TPlayer }
+
+function TView.CanvasToCellPos(Pos: TPoint): TPoint;
+begin
+  Result := Point(Trunc(Pos.X / Zoom + SourceRect.Left),
+    Trunc(Pos.Y / Zoom + SourceRect.Top));
+end;
+
+function TView.CellToCanvasPos(Pos: TPoint): TPoint;
+begin
+  Result := Point(Trunc((Pos.X - SourceRect.Left) * Zoom),
+    Trunc((Pos.Y - SourceRect.Top) * Zoom));
+end;
+
+function TView.CanvasToCellRect(Pos: TRect): TRect;
+begin
+  Result.TopLeft := CanvasToCellPos(Pos.TopLeft);
+  Result.BottomRight := CanvasToCellPos(Pos.BottomRight);
+end;
+
+function TView.CellToCanvasRect(Pos: TRect): TRect;
+begin
+  Result.TopLeft := CellToCanvasPos(Pos.TopLeft);
+  Result.BottomRight := CellToCanvasPos(Pos.BottomRight);
+end;
+
+procedure TView.Assign(Source: TView);
+begin
+  SourceRect := Source.SourceRect;
+  FDestRect := Source.DestRect;
+  FZoom := Source.Zoom;
+  SelectedCell := Source.SelectedCell;
+  FocusedCell := Source.FocusedCell;
+end;
+
+procedure TPlayer.SetGame(AValue: TGame);
+begin
+  if FGame = AValue then Exit;
+  FGame := AValue;
+end;
+
+procedure TPlayer.Clear;
+begin
+  TurnStats.Clear;
+end;
+
+procedure TPlayer.SetClient(AValue: TClient);
+begin
+  if FClient=AValue then Exit;
+  if Assigned(FClient) then FClient.FControlPlayer := nil;
+  FClient := AValue;
+  if Assigned(FClient) then FClient.FControlPlayer := Self;
+end;
+
+procedure TPlayer.LoadFromNode(Node: TDOMNode);
+var
+  NewNode: TDOMNode;
+begin
+  Id := ReadInteger(Node, 'Id', 0);
+  Name := ReadString(Node, 'Name', '');
+  Color := ReadInteger(Node, 'Color', clSilver);
+  Mode := TPlayerMode(ReadInteger(Node, 'Mode', Integer(pmHuman)));
+  StartCell := FGame.Map.Cells.FindById(ReadInteger(Node, 'StartCell', 0));
+  StartUnits := ReadInteger(Node, 'StartUnits', 0);
+  Agressivity := TComputerAgressivity(ReadInteger(Node, 'Agressivity', Integer(caMedium)));
+  Defensive := ReadBoolean(Node, 'Defensive', False);
+
+  with Node do begin
+    NewNode := FindNode('Map');
+    if Assigned(NewNode) then
+      PlayerMap.LoadFromNode(NewNode);
+  end;
+  with Node do begin
+    NewNode := FindNode('TurnStats');
+    if Assigned(NewNode) then
+      TurnStats.LoadFromNode(NewNode);
+  end;
+end;
+
+procedure TPlayer.SaveToNode(Node: TDOMNode);
+var
+  NewNode: TDOMNode;
+begin
+  WriteInteger(Node, 'Id', Id);
+  WriteString(Node, 'Name', Name);
+  WriteInteger(Node, 'Color', Color);
+  WriteInteger(Node, 'Mode', Integer(Mode));
+  WriteInteger(Node, 'StartCell', StartCell.Id);
+  WriteInteger(Node, 'StartUnits', StartUnits);
+  WriteInteger(Node, 'Agressivity', Integer(Agressivity));
+  WriteBoolean(Node, 'Defensive', Defensive);
+
+  with Node do begin
+    NewNode := OwnerDocument.CreateElement('Map');
+    AppendChild(NewNode);
+    PlayerMap.SaveToNode(NewNode);
+  end;
+  with Node do begin
+    NewNode := OwnerDocument.CreateElement('TurnStats');
+    AppendChild(NewNode);
+    TurnStats.SaveToNode(NewNode);
+  end;
+end;
+
+function CellCompare(Item1, Item2: Pointer): Integer;
+begin
+  if TCell(Item1).Power > TCell(Item2).Power then Result := 1
+  else if TCell(Item1).Power < TCell(Item2).Power then Result := -1
+  else Result := 0;
+end;
+
+function CellCompareDescending(Item1, Item2: Pointer): Integer;
+begin
+  if TCell(Item1).Power > TCell(Item2).Power then Result := -1
+  else if TCell(Item1).Power < TCell(Item2).Power then Result := 1
+  else Result := 0;
+end;
+
+procedure TComputer.AttackNeutral;
+var
+  AllCells: TCells;
+  TotalPower: Integer;
+  AttackPower: Integer;
+  TotalAttackPower: Integer;
+  I, J: Integer;
+  C: Integer;
+  CanAttack: Integer;
+  TargetCells: TCells;
+  S: string;
+const
+  AttackDiff = 1;
+begin
+  AllCells := Game.Map.Cells;
+  TargetCells := TCells.Create;
+  TargetCells.OwnsObjects := False;
+
+  // Get list of all attack target cells
+  for C := 0 to AllCells.Count - 1 do
+  with TCell(AllCells[C]) do begin
+    if (Terrain <> ttVoid) and (Player = nil) then begin
+      CanAttack := 0;
+      for I := 0 to Neighbors.Count - 1 do
+      if (TCell(Neighbors[I]).Player = Game.CurrentPlayer) then begin
+        Inc(CanAttack);
+      end;
+      if CanAttack > 0 then TargetCells.Add(AllCells[C]);
+    end;
+  end;
+
+  // Sort ascending to attack cells with lower power first
+  // Low power cells are better for expanding our teritorry
+  TargetCells.Sort(CellCompare);
+
+  for C := 0 to TargetCells.Count - 1 do
+  with TCell(TargetCells[C]) do begin
+      // Attack to not owned cell yet
+      // Count own possible power
+      TotalPower := 0;
+      for I := 0 to Neighbors.Count - 1 do
+      if (TCell(Neighbors[I]).Player = Game.CurrentPlayer) then begin
+        TotalPower := TotalPower + TCell(Neighbors[I]).GetAvialPower;
+      end;
+      // Attack if target is weaker
+      if TotalPower >= (Power + AttackDiff) then begin
+        TotalAttackPower := 0;
+        for I := 0 to Neighbors.Count - 1 do
+        if (TCell(Neighbors[I]).Player = Game.CurrentPlayer) then begin
+          // Use only necessary power
+          AttackPower := Power - TotalAttackPower + AttackDiff;
+          if TCell(Neighbors[I]).GetAvialPower < AttackPower then
+            AttackPower := TCell(Neighbors[I]).GetAvialPower;
+          Game.SetMove(Tcell(Neighbors[I]), TCell(TargetCells[C]), AttackPower, False);
+          TotalAttackPower := TotalAttackPower + AttackPower;
+        end;
+      end;
+  end;
+
+  TargetCells.Free;
+end;
+
+procedure TComputer.AttackPlayers;
+var
+  AllCells: TCells;
+  TotalPower: Integer;
+  AttackPower: Integer;
+  TotalAttackPower: Integer;
+  I, J: Integer;
+  C: Integer;
+  CanAttack: Integer;
+  TargetCells: TCells;
+  S: string;
+const
+  AttackDiff = 2;
+begin
+  if Game.CurrentPlayer.Defensive then Exit;
+
+  AllCells := Game.Map.Cells;
+  TargetCells := TCells.Create;
+  TargetCells.OwnsObjects := False;
+
+  // Get list of all attack target cells
+  for C := 0 to AllCells.Count - 1 do
+  with TCell(AllCells[C]) do begin
+    if (Terrain <> ttVoid) and (Player <> Game.CurrentPlayer) and (Player <> nil) then begin
+      CanAttack := 0;
+      for I := 0 to Neighbors.Count - 1 do
+      if (TCell(Neighbors[I]).Player = Game.CurrentPlayer) then begin
+        Inc(CanAttack);
+      end;
+      if CanAttack > 0 then TargetCells.Add(AllCells[C]);
+    end;
+  end;
+
+  // Sort descending to attack cells with higher power first
+  // Higher power enemy cells can grow faster and is more dangerous
+  TargetCells.Sort(CellCompareDescending);
+
+  for C := 0 to TargetCells.Count - 1 do
+  with TCell(TargetCells[C]) do begin
+      // Attack to not owned cell yet
+      // Count own possible power
+      TotalPower := 0;
+      for I := 0 to Neighbors.Count - 1 do
+      if (TCell(Neighbors[I]).Player = Game.CurrentPlayer) then begin
+        TotalPower := TotalPower + TCell(Neighbors[I]).GetAvialPower;
+      end;
+      // Attack if target is weaker
+      if Game.AttackProbability(TotalPower, Power) >= ComputerAggroProbability[Game.CurrentPlayer.Agressivity] then begin
+        // Try to limit total attacking power to necessary minimum
+        while Game.AttackProbability(TotalPower - 1, Power) >= ComputerAggroProbability[Game.CurrentPlayer.Agressivity] do
+          Dec(TotalPower);
+
+        // Collect required attack units from our cells
+        TotalAttackPower := 0;
+        for I := 0 to Neighbors.Count - 1 do
+        if (TCell(Neighbors[I]).Player = Game.CurrentPlayer) then begin
+          // Use only necessary power
+          AttackPower := TotalPower - TotalAttackPower;
+          if TCell(Neighbors[I]).GetAvialPower < AttackPower then
+            AttackPower := TCell(Neighbors[I]).GetAvialPower;
+          Game.SetMove(TCell(Neighbors[I]), TCell(TargetCells[C]), AttackPower, False);
+          TotalAttackPower := TotalAttackPower + AttackPower;
+          if TotalAttackPower >= TotalPower then Break;
+        end;
+      end;
+  end;
+
+  TargetCells.Free;
+end;
+
+procedure TComputer.InnerMoves;
+var
+  AllCells: TCells;
+  I, J: Integer;
+  C: Integer;
+  CanAttack: Integer;
+  TargetCells: TCells;
+  NewTargetCells: TCells;
+  Cells2: TCells;
+  MovedPower: Integer;
+begin
+  // We need to move available power to borders to be available for attacks
+  // or defense
+  AllCells := Game.Map.Cells;
+  TargetCells := TCells.Create;
+  TargetCells.OwnsObjects := False;
+  NewTargetCells := TCells.Create;
+  NewTargetCells.OwnsObjects := False;
+
+  // Get list of all enemy border cells
+  for C := 0 to AllCells.Count - 1 do
+  with TCell(AllCells[C]) do begin
+    if (Player <> Game.CurrentPlayer) and (Player <> nil) and (Terrain <> ttVoid) then begin
+      CanAttack := 0;
+      for I := 0 to Neighbors.Count - 1 do
+      if ((TCell(Neighbors[I]).Player = Game.CurrentPlayer) or
+      (TCell(Neighbors[I]).Player = nil)) and (TCell(Neighbors[I]).Terrain <> ttVoid) then begin
+        Inc(CanAttack);
+      end;
+      if CanAttack > 0 then TargetCells.Add(AllCells[C]);
+    end;
+  end;
+
+  if CellProcessDirection then begin
+    // Reverse array
+    for I := 0 to (TargetCells.Count div 2) - 1 do
+      TargetCells.Exchange(I, TargetCells.Count - 1 - I);
+  end;
+
+  Game.Map.Cells.ClearMark;
+
+  while TargetCells.Count > 0 do begin
+    // Set mark for selected border cells
+    for C := 0 to TargetCells.Count - 1 do
+      TCell(TargetCells[C]).Mark := True;
+
+    // Move all power from unmarked cells and mark them
+    NewTargetCells.Count := 0;
+    for C := 0 to TargetCells.Count - 1 do
+    with TCell(TargetCells[C]) do begin
+      for I := 0 to Neighbors.Count - 1 do begin
+        if (TCell(Neighbors[I]).Terrain <> ttVoid) and (not TCell(Neighbors[I]).Mark) then begin
+          if (TCell(TargetCells[C]).Player = Game.CurrentPlayer) and
+          (TCell(Neighbors[I]).Player = Game.CurrentPlayer) then begin
+            // Do not take units from front line
+            Cells2 := TCell(Neighbors[I]).Neighbors;
+            CanAttack := 0;
+            for J := 0 to Cells2.Count - 1 do
+            if ((TCell(Cells2[J]).Player <> Game.CurrentPlayer) or (TCell(Cells2[J]).Player = nil))
+            and (TCell(Cells2[J]).Terrain <> ttVoid) then begin
+              Inc(CanAttack);
+            end;
+            if CanAttack = 0 then begin
+              MovedPower := TCell(Neighbors[I]).GetAvialPower;
+              if (TCell(TargetCells[C]).GetAvialPower + TCell(TargetCells[C]).GetAttackPower + MovedPower) > Game.Map.MaxPower then
+                MovedPower := Game.Map.MaxPower - TCell(TargetCells[C]).GetAvialPower - TCell(TargetCells[C]).GetAttackPower;
+              Game.SetMove(TCell(Neighbors[I]), TCell(TargetCells[C]), MovedPower, False);
+            end;
+          end;
+          TCell(Neighbors[I]).Mark := True;
+          NewTargetCells.Add(TCell(Neighbors[I]));
+        end;
+      end;
+    end;
+
+    // Use source cells NewTargetCells as new TargetCells
+    TargetCells.Free;
+    TargetCells := NewTargetCells;
+    NewTargetCells := TCells.Create;
+    NewTargetCells.OwnsObjects := False;
+  end;
+
+  TargetCells.Free;
+  NewTargetCells.Free;
+end;
+
+procedure TComputer.IncreaseMoves;
+var
+  I: Integer;
+begin
+  // If available power remains then use all for existed unit moves
+  for I := 0 to Game.Moves.Count - 1 do
+  with TUnitMove(Game.Moves[I]) do begin
+    if CellFrom.GetAvialPower > 0 then
+      CountOnce := CountOnce + CellFrom.GetAvialPower;
+  end;
+end;
+
+procedure TComputer.Process;
+begin
+  AttackPlayers;
+  AttackNeutral;
+  InnerMoves;
+  IncreaseMoves;
+  //FallBack;
+  CellProcessDirection := not CellProcessDirection;
+end;
+
+procedure TComputer.FallBack;
+var
+  C: Integer;
+  I: Integer;
+  AllCells: TCells;
+  BorderCells: TCells;
+  EnemyPower: Integer;
+begin
+  BorderCells := TCells.Create;
+  BorderCells.OwnsObjects := False;
+  AllCells := Game.Map.Cells;
+
+  // Get list of border cells
+  for C := 0 to AllCells.Count - 1 do
+  with TCell(AllCells[C]) do begin
+    if (Terrain <> ttVoid) and (Player = Game.CurrentPlayer)  then begin
+      if AttackersCount(TCell(AllCells[C])) > 0 then
+        BorderCells.Add(AllCells[C]);
+    end;
+  end;
+
+  // Move all units back to inner area from weak border cells
+  for C := 0 to BorderCells.Count - 1 do
+  with TCell(BorderCells[C]) do begin
+    // Calculate enemy power
+    // TODO: Do not sum different enemy power to one value
+    EnemyPower := 0;
+    for I := 0 to Neighbors.Count - 1 do
+    if (TCell(Neighbors[I]).Player <> Game.CurrentPlayer) and (TCell(Neighbors[I]).Player <> nil) then begin
+      Inc(EnemyPower, TCell(Neighbors[I]).Power);
+    end;
+    if EnemyPower > (GetAvialPower + GetAttackPower) then begin
+      // Fallback
+      for I := MovesTo.Count - 1 downto 0 do
+        TUnitMove(MovesTo[I]).Free;
+      for I := 0 to Neighbors.Count - 1 do
+      if (TCell(Neighbors[I]).Player = Game.CurrentPlayer) and (AttackersCount(TCell(Neighbors[I])) = 0) then begin
+
+        Game.SetMove(TCell(BorderCells[C]), TCell(Neighbors[I]), GetAvialPower, False);
+        Break;
+      end;
+    end;
+  end;
+
+  BorderCells.Free;
+end;
+
+function TComputer.AttackersCount(Cell: TCell): Integer;
+var
+  I: Integer;
+begin
+  Result := 0;
+  for I := 0 to Cell.Neighbors.Count - 1 do
+  if (TCell(Cell.Neighbors[I]).Player <> Game.CurrentPlayer) and
+    (TCell(Cell.Neighbors[I]).Player <> nil) then begin
+      Inc(Result);
+  end;
+end;
+
+procedure TView.SelectCell(Pos: TPoint; Player: TPlayer; ShiftState: TShiftState);
+var
+  NewSelectedCell: TCell;
+  UnitMove: TUnitMove;
+  I: Integer;
+begin
+  NewSelectedCell := Game.Map.PosToCell(CanvasToCellPos(Pos), Self);
+  if Assigned(NewSelectedCell) then begin
+    if Assigned(SelectedCell) and Game.Map.IsCellsNeighbor(NewSelectedCell, SelectedCell) then begin
+      if ssShift in ShiftState then begin
+        // Make maximum unit move without confirmation dialog
+        for I := SelectedCell.MovesFrom.Count - 1 downto 0 do
+          TUnitMove(SelectedCell.MovesFrom[I]).Free;
+        Game.SetMove(SelectedCell, NewSelectedCell, SelectedCell.Power, False);
+        SelectedCell := nil;
+      end else
+      if ssCtrl in ShiftState then begin
+        // If CTRL key pressed then storno all moved from selected cell and
+        // move all power to new selected cell
+        for I := SelectedCell.MovesFrom.Count - 1 downto 0 do
+          TUnitMove(SelectedCell.MovesFrom[I]).Free;
+        UnitMove := Game.SetMove(SelectedCell, NewSelectedCell, SelectedCell.Power, False);
+        if Assigned(UnitMove) then
+          UnitMove.CountRepeat := Player.Game.Map.MaxPower;
+        if NewSelectedCell.Player = Player then SelectedCell := NewSelectedCell
+          else SelectedCell := nil;
+      end else begin
+        Game.SetMove(SelectedCell, NewSelectedCell, SelectedCell.Power);
+        SelectedCell := nil;
+      end;
+    end else
+    if (NewSelectedCell <> SelectedCell) and (NewSelectedCell.Player = Player) then
+      SelectedCell := NewSelectedCell
+    else
+    if (NewSelectedCell = SelectedCell) and (NewSelectedCell.Player = Player) then
+      SelectedCell := nil;
+  end;
+end;
+
+procedure TView.CenterMap;
+var
+  MapRect: TRect;
+begin
+  MapRect := Game.Map.GetPixelRect;
+  SourceRect := Bounds(MapRect.Left + (MapRect.Right - MapRect.Left) div 2 - (SourceRect.Right - SourceRect.Left) div 2,
+    MapRect.Top + (MapRect.Bottom - MapRect.Top) div 2 - (SourceRect.Bottom - SourceRect.Top) div 2,
+    SourceRect.Right - SourceRect.Left,
+    SourceRect.Bottom - SourceRect.Top);
+end;
+
+procedure TView.CenterPlayerCity(Player: TPlayer);
+begin
+  SourceRect := Bounds(Player.StartCell.PosPx.X - (SourceRect.Right - SourceRect.Left) div 2,
+    Player.StartCell.PosPx.Y - (SourceRect.Bottom - SourceRect.Top) div 2,
+    SourceRect.Right - SourceRect.Left,
+    SourceRect.Bottom - SourceRect.Top);
+end;
+
+procedure TPlayer.Paint(Canvas: TCanvas; View: TView);
+begin
+  PlayerMap.Paint(Canvas, View);
+end;
+
+constructor TPlayer.Create;
+begin
+  StartUnits := DefaultPlayerStartUnits;
+  StartCell := nil;
+  PlayerMap := TPlayerMap.Create;
+  PlayerMap.Player := Self;
+  TurnStats := TGameTurnStats.Create;
+end;
+
+destructor TPlayer.Destroy;
+begin
+  FreeAndNil(TurnStats);
+  FreeAndNil(PlayerMap);
+  inherited Destroy;
+end;
+
+procedure TPlayer.Assign(Source: TPlayer);
+begin
+  Id := Source.Id;
+  Name := Source.Name;
+  Color := Source.Color;
+  Mode := Source.Mode;
+  Game := Source.Game;
+  TotalCells := Source.TotalCells;
+  TotalUnits := Source.TotalUnits;
+  StartUnits := Source.StartUnits;
+  StartCell := Source.StartCell;
+  Agressivity := Source.Agressivity;
+  Defensive := Source.Defensive;
+end;
+
+{ TGame }
+
+function ComparePointer(Item1, Item2: Pointer): Integer;
+begin
+  Result := -CompareValue(Integer(Item1), Integer(Item2));
+end;
+
+procedure TGame.Attack(var AttackPower, DefendPower: Integer);
+var
+  AttackerDiceCount: Integer;
+  DefenderDiceCount: Integer;
+  S: string;
+  I: Integer;
+  AttackRolls: TList;
+  DefendRolls: TList;
+begin
+  AttackRolls := TList.Create;
+  DefendRolls := TList.Create;
+  if AttackPower < 1 then
+    raise Exception.Create('Attacker power have to be higher then 0.');
+  if DefendPower < 0 then
+    raise Exception.Create('Defender power have to be higher then or equal to 0.');
+  while (AttackPower > 0) and (DefendPower > 0) do begin
+    // Risk game rules:
+    // Each side do their dice roll and compare result. Defender wins tie.
+    // Attacker can use three dices and defender two
+    AttackerDiceCount := Min(AttackPower, 3);
+    DefenderDiceCount := Min(DefendPower, 2);
+    // Roll and sort numbers
+    AttackRolls.Count := AttackerDiceCount;
+    for I := 0 to AttackerDiceCount - 1 do begin
+      AttackRolls[I] := Pointer(Random(7));
+    end;
+    AttackRolls.Sort(ComparePointer);
+    S := 'Att:';
+    for I := 0 to AttackerDiceCount - 1 do
+      S := S + IntToStr(Integer(AttackRolls[I])) + ', ';
+    DefendRolls.Count := DefenderDiceCount;
+    for I := 0 to DefenderDiceCount - 1 do begin
+      DefendRolls[I] := Pointer(Random(7));
+    end;
+    DefendRolls.Sort(ComparePointer);
+    S := S + ' Def:';
+    for I := 0 to DefenderDiceCount - 1 do
+      S := S + IntToStr(Integer(DefendRolls[I])) + ', ';
+    // Resolution
+    for I := 0 to Min(AttackerDiceCount, DefenderDiceCount) - 1 do
+      if AttackRolls[I] > DefendRolls[I] then Dec(DefendPower)
+      else Dec(AttackPower);
+  end;
+  AttackRolls.Free;
+  DefendRolls.Free;
+end;
+
+function TGame.AttackProbability(AttackCount, DefendCount: Integer): Double;
+var
+  OA, OD: Integer;
+  Len: Integer;
+  I: Integer;
+begin
+  if AttackCount = 0 then begin
+    Result := 0;
+    Exit;
+  end;
+  if DefendCount = 0 then begin
+    Result := 1;
+    Exit;
+  end;
+
+  // Enlarge probability cache table on demand
+  if Length(ProbabilityMatrix) < AttackCount then begin
+    SetLength(ProbabilityMatrix, AttackCount);
+  end;
+  if Length(ProbabilityMatrix[AttackCount - 1]) < DefendCount then begin
+    Len := Length(ProbabilityMatrix[AttackCount - 1]);
+    SetLength(ProbabilityMatrix[AttackCount - 1], DefendCount);
+    for I := Len to Length(ProbabilityMatrix[AttackCount - 1]) - 1 do
+      ProbabilityMatrix[AttackCount - 1][I] := -1;
+  end;
+
+  if ProbabilityMatrix[AttackCount - 1, DefendCount - 1] <> -1 then begin
+    // Use cached value
+    Result := ProbabilityMatrix[AttackCount - 1, DefendCount - 1];
+    Exit;
+  end else Result := 1;
+
+  OA := Min(AttackCount, 3);
+  OD := Min(DefendCount, 2);
+
+  if (OA = 1) and (OD = 1) then
+    Result := 0.4167 * AttackProbability(AttackCount, DefendCount - 1) +
+      0.5833 * AttackProbability(AttackCount - 1, DefendCount)
+  else if (OA = 2) and (OD = 1) then
+    Result := 0.5787 * AttackProbability(AttackCount, DefendCount - 1) +
+      0.4213 * AttackProbability(AttackCount - 1, DefendCount)
+  else if (OA = 3) and (OD = 1) then
+    Result := 0.6597 * AttackProbability(AttackCount, DefendCount - 1) +
+      0.3403 * AttackProbability(AttackCount - 1, DefendCount)
+  else if (OA = 1) and (OD = 2) then
+    Result := 0.2546 * AttackProbability(AttackCount, DefendCount - 1) +
+      0.7454 * AttackProbability(AttackCount - 1, DefendCount)
+  else if (OA = 2) and (OD = 2) then
+    Result := 0.2276 * AttackProbability(AttackCount, DefendCount - 2) +
+      0.4483 * AttackProbability(AttackCount - 2, DefendCount) +
+      0.3241 * AttackProbability(AttackCount - 1, DefendCount - 1)
+  else if (OA = 3) and (OD = 2) then
+    Result := 0.3717 * AttackProbability(AttackCount, DefendCount - 2) +
+      0.2926 * AttackProbability(AttackCount - 2, DefendCount) +
+      0.3358 * AttackProbability(AttackCount - 1, DefendCount - 1);
+  ProbabilityMatrix[AttackCount - 1, DefendCount - 1] := Result;
+end;
+
+procedure TGame.MoveAll(Player: TPlayer);
+var
+  I: Integer;
+  AttackerPower: Integer;
+  DefenderPower: Integer;
+  UnitCount: Integer;
+begin
+  I := 0;
+  while I < Moves.Count do
+  with TUnitMove(Moves[I]) do begin
+  if CountOnce > 0 then begin
+    if CellFrom.Player = Player then begin
+      UnitCount := CountOnce;
+      if CountOnce > CellFrom.Power then
+        UnitCount := CellFrom.Power;
+      if CellTo.Player = Player then begin
+        // Inner move
+        CellTo.Power := CellTo.Power + UnitCount;
+      end else begin
+        AttackerPower := UnitCount;
+        DefenderPower := CellTo.Power;
+        Attack(AttackerPower, DefenderPower);
+        if DefenderPower = 0 then begin
+          // Attacker wins with possible loses
+          ClearMovesFromCell(CellTo);
+          CellTo.Player := Player;
+          CellTo.Power := AttackerPower;
+        end else
+        if AttackerPower = 0 then begin
+          // Defender wins with possible loses
+          CellTo.Power := DefenderPower;
+        end else
+          raise Exception.Create(SUnfinishedBattle);
+      end;
+      CellFrom.Power := CellFrom.Power - UnitCount;
+      CountOnce := 0;
+    end;
+    end;
+    Inc(I);
+  end;
+  // Remove empty moves
+  for I := Moves.Count - 1 downto 0 do
+  if (TUnitMove(Moves[I]).CellFrom.Player = Player) and
+    (TUnitMove(Moves[I]).CountOnce = 0) and (TUnitMove(Moves[I]).CountRepeat = 0) then
+    Moves.Delete(I);
+end;
+
+procedure TGame.ClearMovesFromCell(Cell: TCell);
+var
+  I: Integer;
+begin
+  for I := Moves.Count - 1 downto 0 do
+  if TUnitMove(Moves[I]).CellFrom = Cell then
+    Moves.Delete(I);
+end;
+
+procedure TGame.SetMapType(AValue: TMapType);
+var
+  OldMap: TMap;
+begin
+  if FMapType = AValue then Exit;
+  OldMap := Map;
+  case AValue of
+    mtNone: Map := TMap.Create;
+    mtHexagon: Map := THexMap.Create;
+    mtSquare: Map := TSquareMap.Create;
+    mtTriangle: Map := TTriangleMap.Create;
+    mtVoronoi: Map := TVoronoiMap.Create;
+    else Map := TMap.Create;
+  end;
+  Map.Assign(OldMap);
+  OldMap.Free;
+  FMapType := AValue;
+end;
+
+function TGame.SetMove(CellFrom, CellTo: TCell; Power: Integer; Confirmation: Boolean = True): TUnitMove;
+var
+  NewMove: TUnitMove;
+  OldMove: TUnitMove;
+  I: Integer;
+  CountOnce: Integer;
+  CountRepeat: Integer;
+  Confirm: Boolean;
+begin
+  I := 0;
+  Confirm := True;
+  while (I < Moves.Count) and ((TUnitMove(Moves[I]).CellFrom <> CellFrom) or
+    (TUnitMove(Moves[I]).CellTo <> CellTo)) do Inc(I);
+  if I < Moves.Count then OldMove := TUnitMove(Moves[I])
+    else OldMove := nil;
+  Result := OldMove;
+  if Assigned(OldMove) then begin
+    CountOnce := OldMove.CountOnce;
+    CountRepeat := OldMove.CountRepeat;
+    if Assigned(CurrentPlayer) and Confirmation and
+      Assigned(FOnMove) then FOnMove(CellFrom, CellTo, CountOnce, CountRepeat, True, Confirm);
+  end else begin
+    CountOnce := Power;
+    CountRepeat := 0;
+    if Assigned(CurrentPlayer) and Confirmation and
+      Assigned(FOnMove) then FOnMove(CellFrom, CellTo, CountOnce, CountRepeat, False, Confirm);
+  end;
+  if Confirm then begin
+    if Assigned(OldMove) then begin
+      // Already have such move
+      if (CountOnce = 0) and (CountRepeat = 0) then Moves.Delete(I)
+        else begin
+          OldMove.CountOnce := CountOnce;
+          OldMove.CountRepeat := CountRepeat;
+          CheckCounterMove(OldMove);
+        end;
+    end else begin
+      // Add new move
+      if (CountOnce > 0) or (CountRepeat > 0) then begin
+        NewMove := TUnitMove(Moves[Moves.Add(TUnitMove.Create)]);
+        NewMove.List := Moves;
+        NewMove.CellFrom := CellFrom;
+        NewMove.CellTo := CellTo;
+        NewMove.CountOnce := CountOnce;
+        NewMove.CountRepeat := CountRepeat;
+        Result := NewMove;
+        CheckCounterMove(NewMove);
+      end;
+    end;
+  end;
+end;
+
+procedure TGame.SetRunning(AValue: Boolean);
+var
+  I: Integer;
+begin
+  if FRunning = AValue then Exit;
+  if AValue then begin
+    if Players.Count < 2 then raise Exception.Create(SMinimumPlayers);
+    FRunning := AValue;
+  end else begin
+    FRunning := AValue;
+    for I := 0 to Clients.Count - 1 do
+    with TClient(Clients[I]) do begin
+      View.Clear;
+    end;
+  end;
+end;
+
+procedure TGame.UpdateRepeatMoves(Player: TPlayer);
+var
+  I: Integer;
+begin
+  for I := 0 to Moves.Count - 1 do
+  with TUnitMove(Moves[I]) do begin
+    if CellFrom.Player = Player then
+      if CountRepeat <= CellFrom.GetAvialPower then
+        CountOnce := CountRepeat
+        else CountOnce := CellFrom.GetAvialPower;
+  end;
+end;
+
+procedure TGame.CheckCounterMove(Move: TUnitMove);
+var
+  I: Integer;
+  CounterMove: TUnitMove;
+begin
+  I := 0;
+  while (I < Moves.Count) and ((TUnitMove(Moves[I]).CellTo <> Move.CellFrom) or
+    (TUnitMove(Moves[I]).CellFrom <> Move.CellTo)) do Inc(I);
+  if I < Moves.Count then CounterMove := TUnitMove(Moves[I])
+    else CounterMove := nil;
+  if Assigned(CounterMove) then begin
+    // For now, just remove counter move
+    Moves.Remove(CounterMove);
+  end;
+end;
+
+function TGame.SearchDifferentCellArea(List: TCells; SourceArea, DestArea: TMapArea): TCell;
+var
+  NewList: TCells;
+  NewListVoid: TCells;
+  I: Integer;
+  C: Integer;
+begin
+  Result := nil;
+  NewList := TCells.Create;
+  NewList.OwnsObjects := False;
+  NewListVoid := TCells.Create;
+  NewListVoid.OwnsObjects := False;
+
+  for C := 0 to List.Count - 1 do
+  with TCell(List[C]) do begin
+    for I := 0 to Neighbors.Count - 1 do
+    with TCell(Neighbors[I]) do
+    if (not Mark) and (Terrain <> ttVoid) and (Area <> SourceArea) and ((DestArea = nil) or (DestArea = Area)) then begin
+      NewList.Add(TCell(TCell(List[C]).Neighbors[I]));
+      Mark := True;
+    end else
+    if (not Mark) and (Terrain = ttVoid) then begin
+      NewListVoid.Add(TCell(TCell(List[C]).Neighbors[I]));
+      Mark := True;
+    end;
+  end;
+
+  if NewList.Count > 0 then begin
+    // We found cell with different area
+    Result := TCell(NewList[Random(NewList.Count)]);
+  end else
+  if NewListVoid.Count > 0 then begin
+    // Cell was not found but we have more void cells to check
+    Result := SearchDifferentCellArea(NewListVoid, SourceArea, DestArea);
+  end;
+
+  NewListVoid.Free;
+  NewList.Free;
+end;
+
+procedure TGame.BuildTerrain;
+var
+  C: Integer;
+begin
+  if (Map.Shape = msImage) and FileExists(MapImageFileName) and
+  (LoadedImageFileName <> MapImageFileName) then begin
+    LoadedImageFileName := MapImageFileName;
+    Map.Image.Picture.LoadFromFile(MapImageFileName);
+  end;
+
+  // Randomize map terrain
+  for C := 0 to Map.Cells.Count - 1 do
+  with TCell(Map.Cells[C]) do begin
+    if (VoidEnabled and (Random < VoidPercentage / 100)) or
+    (Map.IsOutsideShape(PosPx)) then Terrain := ttVoid
+      else begin
+        if CityEnabled and (Random < CityPercentage / 100) then Terrain := ttCity
+          else Terrain := ttNormal;
+      end;
+    Power := Random(MaxNeutralUnits + 1);
+    Player := nil;
+  end;
+end;
+
+procedure TGame.BuildBridges;
+var
+  List: TCells;
+  BorderList: TCells;
+  Cell: TCell;
+  FoundCell1: TCell;
+  FoundCell2: TCell;
+  I: Integer;
+  J: Integer;
+  NewLink: TCellLink;
+begin
+  List := TCells.Create;
+  List.OwnsObjects := False;
+
+  BorderList := TCells.Create;
+  BorderList.OwnsObjects := False;
+
+  // Build area bridges
+  if Map.Areas.Count > 1 then
+  for I := 0 to Map.Areas.Count - 1 do
+  with TMapArea(Map.Areas[I]) do begin
+    GetBorderCells(BorderList);
+    for J := 0 to 1 do begin
+
+    Cell := TCell(BorderList[Random(BorderList.Count)]);
+    List.Clear;
+    List.Add(Cell);
+
+    Map.Cells.ClearMark;
+
+    // Find nearest cell with different area
+    FoundCell1 := SearchDifferentCellArea(List, TMapArea(Map.Areas[I]), nil);
+    if Assigned(FoundCell1) then begin
+      // Again find back nearest cell with different area.
+      // This will ensure that both cells are closest ones
+
+      Map.Cells.ClearMark;
+      List[0] := FoundCell1;
+      FoundCell2 := SearchDifferentCellArea(List, FoundCell1.Area, TMapArea(Map.Areas[I]));
+      if Assigned(FoundCell2) then begin
+        // Check if link not exists already
+        if not Assigned(FoundCell1.Links.FindByCells(FoundCell1, FoundCell2)) then begin
+          NewLink := TCellLink.Create;
+          FoundCell1.Neighbors.Add(FoundCell2);
+          FoundCell1.Links.Add(NewLink);
+          FoundCell2.Neighbors.Add(FoundCell1);
+          FoundCell2.Links.Add(NewLink);
+          SetLength(NewLink.Points, 2);
+          NewLink.Cells.Add(FoundCell1);
+          NewLink.Points[0] := FoundCell1.PosPx;
+          NewLink.Cells.Add(FoundCell2);
+          NewLink.Points[1] := FoundCell2.PosPx;
+          NewLink.Map := Map;
+          Map.CellLinks.Add(NewLink);
+          Inc(BridgeCount);
+        end;
+      end;
+    end;
+    end;
+
+  end;
+  List.Free;
+  BorderList.Free;
+end;
+
+procedure TGame.BuildMapAreas;
+var
+  C: Integer;
+  NewArea: TMapArea;
+begin
+  for C := 0 to Map.Cells.Count - 1 do
+  with TCell(Map.Cells[C]) do
+    Area := nil;
+  Map.Areas.Clear;
+  for C := 0 to Map.Cells.Count - 1 do
+  with TCell(Map.Cells[C]) do
+  if (Terrain <> ttVoid) and (not Assigned(Area)) then begin
+    NewArea := TMapArea(Map.Areas[Map.Areas.Add(TMapArea.Create)]);
+    NewArea.Id := Map.Areas.Count;
+    NewArea.Map := Map;
+    Area := NewArea;
+    AreaExtend;
+  end;
+end;
+
+procedure TGame.InitClients;
+var
+  I: Integer;
+begin
+  Clients.Clear;
+  Clients.New('Spectator');
+  for I := 0 to Players.Count - 1 do
+  with TPlayer(Players[I]) do
+  if Mode = pmHuman then begin
+    Clients.New(TPlayer(Players[I]).Name);
+    TPlayer(Players[I]).Client := TClient(Clients.Last);
+  end;
+
+  for I := 0 to Clients.Count - 1 do
+  with TClient(Clients[I]) do begin
+    View.Clear;
+    View.Zoom := 1;
+    if Assigned(ControlPlayer) then View.CenterPlayerCity(ControlPlayer)
+      else View.CenterMap;
+  end;
+end;
+
+procedure TGame.SaveConfig(Config: TXmlConfig; Path: string);
+begin
+  with Config do begin
+    SetValue(Path + '/GridType', Integer(MapType));
+    SetValue(Path + '/MapImage', MapImageFileName);
+    SetValue(Path + '/SymetricMap', SymetricMap);
+    SetValue(Path + '/FogOfWar', FogOfWar);
+    SetValue(Path + '/VoidEnabled', VoidEnabled);
+    SetValue(Path + '/VoidPercentage', VoidPercentage);
+    SetValue(Path + '/MapSizeX', Map.Size.X);
+    SetValue(Path + '/MapSizeY', Map.Size.Y);
+    SetValue(Path + '/MapShape', Integer(Map.Shape));
+    SetValue(Path + '/CityEnabled', CityEnabled);
+    SetValue(Path + '/CityPercentage', CityPercentage);
+    SetValue(Path + '/BridgeEnabled', BridgeEnabled);
+    SetValue(Path + '/GrowAmount', Integer(GrowAmount));
+    SetValue(Path + '/GrowCells', Integer(GrowCells));
+    SetValue(Path + '/WinObjective', Integer(WinObjective));
+  end;
+end;
+
+procedure TGame.LoadConfig(Config: TXmlConfig; Path: string);
+var
+  Value: Integer;
+begin
+  with Config do begin
+    MapType := TMapType(GetValue(Path + '/GridType', Integer(mtHexagon)));
+    MapImageFileName := GetValue(Path + '/MapImage', MapImageFileName);
+    SymetricMap := GetValue(Path + '/SymetricMap', False);
+    FogOfWar := GetValue(Path + '/FogOfWar', False);
+    VoidEnabled := GetValue(Path + '/VoidEnabled', True);
+    VoidPercentage := GetValue(Path + '/VoidPercentage', 20);
+    Map.Size := Point(GetValue(Path + '/MapSizeX', 10),
+      GetValue(Path + '/MapSizeY', 10));
+    Value := GetValue(Path + '/MapShape', 0);
+    if (Value >= Integer(Low(TMapShape))) and (Value <= Integer(High(TMapShape))) then
+      Map.Shape := TMapShape(Value) else Map.Shape := Low(TMapShape);
+    CityEnabled := GetValue(Path + '/CityEnabled', False);
+    CityPercentage := GetValue(Path + '/CityPercentage', 10);
+    BridgeEnabled := GetValue(Path + '/BridgeEnabled', True);
+    Value := GetValue(Path + '/GrowAmount', Integer(gaBySquareRoot));
+    if (Value >= Integer(Low(TGrowAmount))) and (Value <= Integer(High(TGrowAmount))) then
+      GrowAmount := TGrowAmount(Value) else GrowAmount := Low(TGrowAmount);
+    Value := GetValue(Path + '/GrowCells', Integer(gcPlayerAll));
+    if (Value >= Integer(Low(TGrowCells))) and (Value <= Integer(High(TGrowCells))) then
+      GrowCells := TGrowCells(Value) else GrowCells := Low(TGrowCells);
+    Value := GetValue(Path + '/WinObjective', Integer(woDefeatAllOponents));
+    if (Value >= Integer(Low(TWinObjective))) and (Value <= Integer(High(TWinObjective))) then
+      WinObjective := TWinObjective(Value) else WinObjective := Low(TWinObjective);
+  end;
+end;
+
+procedure TGame.LoadFromFile(FileName: string);
+var
+  NewNode: TDOMNode;
+  Doc: TXMLDocument;
+  RootNode: TDOMNode;
+  I: Integer;
+begin
+  Self.FileName := FileName;
+  ReadXMLFile(Doc, UTF8Decode(FileName));
+  with Doc do try
+    if Doc.DocumentElement.NodeName <> 'XtacticsGame' then
+      raise Exception.Create(SWrongFileFormat);
+    RootNode := Doc.DocumentElement;
+    with RootNode do begin
+      SymetricMap := ReadBoolean(RootNode, 'SymetricMap', False);
+      FogOfWar := ReadBoolean(RootNode, 'FogOfWar', False);
+      VoidEnabled := ReadBoolean(RootNode, 'VoidEnabled', False);
+      VoidPercentage := ReadInteger(RootNode, 'VoidPercentage', 0);
+      MaxNeutralUnits := ReadInteger(RootNode, 'MaxNeutralUnits', 3);
+      GrowCells := TGrowCells(ReadInteger(RootNode, 'GrowCells', Integer(gcNone)));
+      GrowAmount := TGrowAmount(ReadInteger(RootNode, 'GrowAmount', Integer(gaByOne)));
+      CityEnabled := ReadBoolean(RootNode, 'CityEnabled', False);
+      CityPercentage := ReadInteger(RootNode, 'CityPercentage', 0);
+      BridgeEnabled := ReadBoolean(RootNode, 'BridgeEnabled', False);
+      TurnCounter := ReadInteger(RootNode, 'TurnCounter', 0);
+      WinObjective := TWinObjective(ReadInteger(RootNode, 'WinObjective', Integer(woDefeatAllOponents)));
+      ReadInteger(RootNode, 'StayAliveForDefinedTurns', StayAliveForDefinedTurns);
+
+      NewNode := FindNode('Map');
+      if Assigned(NewNode) then
+        Map.LoadFromNode(NewNode);
+
+      NewNode := FindNode('Players');
+      if Assigned(NewNode) then
+        Players.LoadFromNode(NewNode);
+      if Players.Count > 0 then CurrentPlayer := TPlayer(Players[0])
+        else CurrentPlayer := nil;
+
+      InitClients;
+
+      NewNode := FindNode('UnitMoves');
+      if Assigned(NewNode) then
+        Moves.LoadFromNode(NewNode);
+
+      Map.Cells.FixRefId;
+
+      for I := 0 to Players.Count - 1 do begin
+        TPlayer(Players[I]).PlayerMap.Update;
+        TPlayer(Players[I]).PlayerMap.CheckVisibility;
+      end;
+      Running := ReadBoolean(RootNode, 'Running', True);
+    end;
+  finally
+    Doc.Free;
+  end;
+end;
+
+procedure TGame.SaveToFile(FileName: string);
+var
+  NewNode: TDOMNode;
+  Doc: TXMLDocument;
+  RootNode: TDOMNode;
+begin
+  Self.FileName := FileName;
+  Doc := TXMLDocument.Create;
+  with Doc do try
+    RootNode := CreateElement('XtacticsGame');
+    AppendChild(RootNode);
+    with RootNode do begin
+      WriteBoolean(RootNode, 'SymetricMap', SymetricMap);
+      WriteBoolean(RootNode, 'FogOfWar', FogOfWar);
+      WriteBoolean(RootNode, 'VoidEnabled', VoidEnabled);
+      WriteInteger(RootNode, 'VoidPercentage', VoidPercentage);
+      WriteInteger(RootNode, 'MaxNeutralUnits', MaxNeutralUnits);
+      WriteInteger(RootNode, 'GrowCells', Integer(GrowCells));
+      WriteInteger(RootNode, 'GrowAmount', Integer(GrowAmount));
+      WriteBoolean(RootNode, 'CityEnabled', CityEnabled);
+      WriteInteger(RootNode, 'CityPercentage', CityPercentage);
+      WriteBoolean(RootNode, 'BridgeEnabled', BridgeEnabled);
+      WriteInteger(RootNode, 'TurnCounter', TurnCounter);
+      WriteInteger(RootNode, 'WinObjective', Integer(WinObjective));
+      WriteInteger(RootNode, 'StayAliveForDefinedTurns', StayAliveForDefinedTurns);
+      WriteBoolean(RootNode, 'Running', Running);
+
+      NewNode := OwnerDocument.CreateElement('Map');
+      AppendChild(NewNode);
+      Map.SaveToNode(NewNode);
+
+      NewNode := OwnerDocument.CreateElement('Players');
+      AppendChild(NewNode);
+      Players.SaveToNode(NewNode);
+
+      NewNode := OwnerDocument.CreateElement('UnitMoves');
+      AppendChild(NewNode);
+      Moves.SaveToNode(NewNode);
+  end;
+    ForceDirectoriesUTF8(ExtractFileDir(FileName));
+    WriteXMLFile(Doc, UTF8Decode(FileName));
+  finally
+    Doc.Free;
+  end;
+end;
+
+procedure TGame.ComputePlayerStats;
+var
+  I: Integer;
+  J: Integer;
+begin
+  for I := 0 to Players.Count - 1 do
+  with TPlayer(Players[I]) do begin
+    TotalUnits := 0;
+    TotalCells := 0;
+    TotalCities := 0;
+
+    TotalDiscovered := 0;
+    for J := 0 to PlayerMap.Cells.Count - 1 do
+    with TPlayerCell(PlayerMap.Cells[J]) do begin
+      if Explored then Inc(TotalDiscovered);
+    end;
+  end;
+
+  Map.ComputePlayerStats;
+end;
+
+procedure TGame.RecordTurnStats;
+var
+  I: Integer;
+  NewStat: TGameTurnStat;
+begin
+  for I := 0 to Players.Count - 1 do
+  with TPlayer(Players[I]) do begin
+    NewStat := TGameTurnStat.Create;
+    NewStat.DiscoveredCells := TotalDiscovered;
+    NewStat.OccupiedCells := TotalCells;
+    NewStat.Units := TotalUnits;
+    NewStat.Cities := TotalCities;
+    TurnStats.Add(NewStat);
+  end;
+end;
+
+function TGame.GetAlivePlayers: TPlayerArray;
+var
+  I: Integer;
+begin
+  SetLength(Result, 0);
+  for I := 0 to Players.Count - 1 do
+    if TPlayer(Players[I]).TotalCells > 0 then begin
+      SetLength(Result, Length(Result) + 1);
+      Result[Length(Result) - 1] := TPlayer(Players[I]);
+    end;
+end;
+
+function TGame.GetAlivePlayersWithCities: TPlayerArray;
+var
+  I: Integer;
+begin
+  SetLength(Result, 0);
+  for I := 0 to Players.Count - 1 do
+    if TPlayer(Players[I]).TotalCities > 0 then begin
+      SetLength(Result, Length(Result) + 1);
+      Result[Length(Result) - 1] := TPlayer(Players[I]);
+    end;
+end;
+
+procedure TGame.NextTurn;
+var
+  PrevPlayer: TPlayer;
+begin
+  //TODO CurrentPlayer.View.SelectedCell := nil;
+  MoveAll(CurrentPlayer);
+  Map.Grow(CurrentPlayer);
+  UpdateRepeatMoves(CurrentPlayer);
+  ComputePlayerStats;
+  PrevPlayer := CurrentPlayer;
+  // Skip dead players
+  repeat
+    CurrentPlayer := TPlayer(Players[(Players.IndexOf(CurrentPlayer) + 1) mod Players.Count]);
+    if Assigned(FOnPlayerChange) then
+      FOnPlayerChange(Self);
+  until CurrentPlayer.TotalCells > 0;
+  if Players.IndexOf(CurrentPlayer) < Players.IndexOf(PrevPlayer) then begin
+    Inc(TurnCounter);
+    RecordTurnStats;
+    if Assigned(FOnNewTurn) then
+      FOnNewTurn(Self);
+  end;
+  CheckWinObjective;
+  CurrentPlayer.PlayerMap.CheckVisibility;
+  // For computers take view from previous human
+  //if CurrentPlayer.Mode = pmComputer then CurrentPlayer.View.Assign(PrevPlayer.View);
+end;
+
+procedure TGame.CheckWinObjective;
+var
+  AlivePlayers: TPlayerArray;
+  Winner: TPlayer;
+begin
+  Winner := nil;
+  if WinObjective = woDefeatAllOponents then begin
+    AlivePlayers := GetAlivePlayers;
+    if (Length(AlivePlayers) <= 1) then begin
+      if Length(AlivePlayers) > 0 then Winner := TPlayer(AlivePlayers[0]);
+      EndGame(Winner);
+    end;
+  end else
+  if WinObjective = woDefeatAllOponentsCities then begin
+    AlivePlayers := GetAlivePlayersWithCities;
+    if (Length(AlivePlayers) <= 1) then begin
+      if Length(AlivePlayers) > 0 then Winner := TPlayer(AlivePlayers[0]);
+      EndGame(Winner);
+    end;
+  end else
+  if WinObjective = woSpecialCaptureCell then begin
+    if Assigned(SpecialCaptureCell) and Assigned(SpecialCaptureCell.Player) then
+      EndGame(SpecialCaptureCell.Player);
+  end else
+  if WinObjective = woStayAliveForDefinedTurns then begin
+    // TODO: Not only one can win but multiple human players can survive.
+    if TurnCounter > StayAliveForDefinedTurns then
+      EndGame(nil);
+  end;
+end;
+
+constructor TGame.Create;
+begin
+  Moves := TUnitMoves.Create;
+  Moves.Game := Self;
+  Map := TMap.Create;
+  Players := TPlayers.Create;
+  Players.Game := Self;
+  Clients := TClients.Create;
+  Clients.Game := Self;
+
+  MapImageFileName := 'Images/Maps/WorldMap.png';
+  Randomize;
+
+  Players.New(SPlayer + ' 1', clBlue, pmHuman);
+  Players.New(SPlayer + ' 2', clRed, pmComputer);
+
+  VoidEnabled := True;
+  VoidPercentage := 20;
+  MaxNeutralUnits := 4;
+
+  Map.Game := Self;
+  Map.Size := Point(3, 3);
+end;
+
+destructor TGame.Destroy;
+begin
+  FreeAndNil(Clients);
+  FreeAndNil(Moves);
+  FreeAndNil(Players);
+  FreeAndNil(Map);
+  inherited Destroy;
+end;
+
+procedure TGame.New;
+var
+  I: Integer;
+  Counter: Integer;
+  C: Integer;
+  LastAreaCount: Integer;
+begin
+  FileName := SNewGameFile;
+  TurnCounter := 1;
+  Moves.Clear;
+
+  BuildTerrain;
+
+  // Build bridges
+  Map.CellLinks.Clear;
+  if BridgeEnabled then begin
+    BuildMapAreas;
+    LastAreaCount := -1;
+    while (Map.Areas.Count > 1) and (Map.Areas.Count <> LastAreaCount) do begin
+      LastAreaCount := Map.Areas.Count;
+      BuildBridges;
+      BuildMapAreas;
+    end;
+  end;
+
+  if SymetricMap then begin
+    for C := 0 to (Map.Cells.Count div 2) - 1 do begin
+      TCell(Map.Cells[C]).Terrain :=
+        TCell(Map.Cells[Map.Cells.Count - 1 - C]).Terrain;
+      TCell(Map.Cells[C]).Power :=
+        TCell(Map.Cells[Map.Cells.Count - 1 - C]).Power;
+    end;
+  end;
+
+  for I := 0 to Players.Count - 1 do
+  with TPlayer(Players[I]) do begin
+    Clear;
+    PlayerMap.Update;
+    if (Map.Size.X > 0) and (Map.Size.Y > 0) then begin
+      // Try to obtain start cell for each player
+      StartCell := nil;
+      Counter := 0;
+      while not Assigned(StartCell) or Assigned(StartCell.Player) or
+     (StartCell.Terrain = ttVoid) do begin
+        StartCell := TCell(Map.Cells[Random(Map.Cells.Count)]);
+        Inc(Counter);
+        if Counter > 100 then
+          raise Exception.Create(SCannotSetPlayerStartCells);
+      end;
+      if SymetricMap and (I = 1) then
+        StartCell := TCell(Map.Cells[Map.Cells.Count - 1 - Map.Cells.IndexOf(TPlayer(Players[0]).StartCell)]);
+
+      StartCell.Terrain := ttCity;
+      StartCell.Player := TPlayer(Players[I]);
+      StartCell.Power := TPlayer(Players[I]).StartUnits;
+    end;
+    PlayerMap.CheckVisibility;
+  end;
+  if Players.Count > 0 then CurrentPlayer := TPlayer(Players[0])
+    else CurrentPlayer := nil;
+
+  InitClients;
+end;
+
+procedure TGame.EndGame(Winner: TPlayer = nil);
+begin
+  Running := False;
+  if Assigned(OnWin) and Assigned(Winner) then OnWin(Winner);
+end;
+
+procedure TMap.Paint(Canvas: TCanvas; View: TView);
+var
+  I: Integer;
+  C: Integer;
+  Cell: TCell;
+  PosFrom, PosTo: TPoint;
+  Angle: Double;
+  ArrowCenter: TPoint;
+  Move: TUnitMove;
+begin
+  with Canvas, View do
+  try
+    Lock;
+
+    // Draw cell links
+    Pen.Color := clBlack;
+    Pen.Style := psSolid;
+    Pen.Width := 3;
+    for C := 0 to CellLinks.Count - 1 do
+    with TCellLink(CellLinks[C]) do begin
+      if Length(Points) >= 2 then begin
+        MoveTo(View.CellToCanvasPos(Points[0]));
+        for I := 1 to Length(Points) - 1 do
+          LineTo(View.CellToCanvasPos(Points[I]));
+      end;
+    end;
+
+    // Draw cells
+    for C := 0 to Cells.Count - 1 do begin
+      Cell := TCell(Cells[C]);
+      if (Cell.Terrain <> ttVoid) and Cell.IsVisible(View) then begin
+        if Assigned(SelectedCell) and (SelectedCell = Cell) then
+            Brush.Color := clGreen
+          else if Assigned(SelectedCell) and IsCellsNeighbor(SelectedCell, Cell) then
+            Brush.Color := clPurple
+          else Brush.Color := Cell.GetColor;
+        //Pen.Color := clBlack;
+        PaintCell(Canvas, Cell.PosPx, IntToStr(Cell.GetAvialPower), View, Cell);
+      end;
+
+    end;
+
+    // Draw arrows
+    Pen.Color := clCream;
+    for I := 0 to Game.Moves.Count - 1 do begin
+      Move := TUnitMove(Game.Moves[I]);
+      PosFrom := CellToPos(Move.CellFrom);
+      PosTo := CellToPos(Move.CellTo);
+      if Move.CountRepeat > 0 then Pen.Width := 2
+        else Pen.Width := 1;
+      Angle := ArcTan((PosTo.Y - PosFrom.Y) / (PosTo.X - PosFrom.X));
+      if Sign(PosTo.X - PosFrom.X) = -1 then Angle := Angle + Pi;
+      ArrowCenter := View.CellToCanvasPos(Point(Trunc(PosFrom.X + (PosTo.X - PosFrom.X) / 2),
+        Trunc(PosFrom.Y + (PosTo.Y - PosFrom.Y) / 2)));
+      DrawArrow(Canvas, View, ArrowCenter,
+        Angle, IntToStr(Move.CountOnce));
+    end;
+  finally
+    Unlock;
+  end;
+end;
+
+end.
Index: /tags/1.1.0/UMap.pas
===================================================================
--- /tags/1.1.0/UMap.pas	(revision 137)
+++ /tags/1.1.0/UMap.pas	(revision 137)
@@ -0,0 +1,332 @@
+unit UMap;
+
+{$mode delphi}
+
+interface
+
+uses
+  Classes, SysUtils, UGame, XMLConf, XMLRead, XMLWrite, DOM;
+
+type
+  { THexMap }
+
+  THexMap = class(TMap)
+  private
+    function IsCellsPosNeighbor(CellPos1, CellPos2: TPoint): Boolean;
+    procedure GetCellPosNeighbors(CellPos: TPoint; Neighbours: TCells);
+    function GetHexagonPolygon(Pos: TPoint; Size: TPoint): TPointArray;
+  public
+    procedure LoadFromFile(FileName: string); override;
+    procedure SaveToFile(FileName: string); override;
+    function IsValidIndex(Index: TPoint): Boolean; override;
+    procedure Generate; override;
+  end;
+
+  { TSquareMap }
+
+  TSquareMap = class(TMap)
+  private
+    function GetSquarePolygon(Pos: TPoint; Size: TPoint): TPointArray;
+  public
+    function IsValidIndex(Index: TPoint): Boolean; override;
+    procedure Generate; override;
+  end;
+
+  { TTriangleMap }
+
+  TTriangleMap = class(TMap)
+  private
+    function GetTrianglePolygon(Pos: TPoint; Size: TPoint; Reverse: Boolean): TPointArray;
+  public
+    function IsValidIndex(Index: TPoint): Boolean; override;
+    procedure Generate; override;
+  end;
+
+  { TVoronoiMap }
+
+  TVoronoiMap = class(TMap)
+  private
+    function GetTrianglePolygon(Pos: TPoint; Size: TPoint; Reverse: Boolean): TPointArray;
+  public
+    procedure Generate; override;
+  end;
+
+
+implementation
+
+{ THexMap }
+
+function THexMap.GetHexagonPolygon(Pos: TPoint; Size: TPoint): TPointArray;
+var
+  Shift: TFloatPoint;
+begin
+  Shift := FloatPoint(0.5 * cos(30 / 180 * Pi), 0.5 * sin(30 / 180 * Pi));
+  SetLength(Result, 6);
+  Result[0] := Point(Trunc(Pos.X + 0 * Size.X), Trunc(Pos.Y - 0.5 * Size.Y));
+  Result[1] := Point(Trunc(Pos.X + Shift.X * Size.X), Trunc(Pos.Y - Shift.Y * Size.Y));
+  Result[2] := Point(Trunc(Pos.X + Shift.X * Size.X), Trunc(Pos.Y + Shift.Y * Size.Y));
+  Result[3] := Point(Trunc(Pos.X + 0 * Size.X), Trunc(Pos.Y + 0.5 * Size.Y));
+  Result[4] := Point(Trunc(Pos.X - Shift.X * Size.X), Trunc(Pos.Y + Shift.Y * Size.Y));
+  Result[5] := Point(Trunc(Pos.X - Shift.X * Size.X), Trunc(Pos.Y - Shift.Y * Size.Y));
+end;
+
+function THexMap.IsCellsPosNeighbor(CellPos1, CellPos2: TPoint): Boolean;
+var
+  DX: Integer;
+  DY: Integer;
+  MinY: Integer;
+begin
+  if CellPos1.Y < CellPos2.Y then MinY:= CellPos1.Y
+    else MinY := CellPos2.Y;
+  DX := CellPos2.X - CellPos1.X;
+  DY := CellPos2.Y - CellPos1.Y;
+  Result := (Abs(DX) <= 1) and (Abs(DY) <= 1) and
+  ((((MinY mod 2) = 1) and
+    not ((DX = 1) and (DY = -1)) and
+    not ((DX = -1) and (DY = 1))) or
+    (((MinY mod 2) = 0) and
+    not ((DX = -1) and (DY = -1)) and
+    not ((DX = 1) and (DY = 1))));
+  Result := Result and not ((CellPos1.X = CellPos2.X) and (CellPos1.Y = CellPos2.Y));
+end;
+
+procedure THexMap.LoadFromFile(FileName: string);
+var
+  Doc: TXMLDocument;
+begin
+  try
+    ReadXMLFile(Doc, FileName);
+    if Doc.DocumentElement.TagName <> 'Map' then
+      raise Exception.Create('Invalid map format');
+  finally
+    Doc.Free;
+  end;
+  inherited LoadFromFile(FileName);
+end;
+
+procedure THexMap.SaveToFile(FileName: string);
+var
+  Doc: TXMLDocument;
+  RootNode: TDOMNode;
+begin
+  try
+    Doc := TXMLDocument.Create;
+    RootNode := Doc.CreateElement('Map');
+    Doc.Appendchild(RootNode);
+    WriteXMLFile(Doc, FileName);
+  finally
+    Doc.Free;
+  end;
+  inherited SaveToFile(FileName);
+end;
+
+function THexMap.IsValidIndex(Index: TPoint): Boolean;
+begin
+  Result := (Index.X >= 0) and (Index.X < Size.X) and
+    (Index.Y >= 0) and (Index.Y < Size.Y);
+end;
+
+procedure THexMap.GetCellPosNeighbors(CellPos: TPoint; Neighbours: TCells);
+var
+  X, Y: Integer;
+begin
+  Neighbours.Count := 0;
+  for Y := -1 to 1 do
+  for X := -1 to 1 do
+  if IsValidIndex(Point(CellPos.X + X, CellPos.Y + Y)) and
+  IsCellsPosNeighbor(CellPos, Point((CellPos.X + X), (CellPos.Y + Y))) then begin
+    Neighbours.Add(TCell(Cells[(CellPos.Y + Y) * Size.X + (CellPos.X + X)]));
+  end;
+end;
+
+procedure THexMap.Generate;
+var
+  X, Y: Integer;
+  I: Integer;
+  NewCell: TCell;
+  PX, PY: Double;
+begin
+  // Free previous
+  Cells.Count := 0;
+  FNewCellId := 1;
+
+  // Allocate and init new
+  Cells.Count := Size.Y * Size.X;
+  for Y := 0 to Size.Y - 1 do
+  for X := 0 to Size.X - 1 do begin
+    NewCell := TCell.Create;
+    NewCell.Map := Self;
+    PX := X;
+    PY := Y;
+    if (Y and 1) = 1 then begin
+      PX := PX + 0.5;
+      //Y := Y + 0.5;
+    end;
+    NewCell.PosPx := Point(Trunc(PX * DefaultCellSize.X / HexCellMulX),
+      Trunc(PY * DefaultCellSize.Y / HexCellMulY));
+    NewCell.Polygon := GetHexagonPolygon(NewCell.PosPx, DefaultCellSize);
+    NewCell.Id := GetNewCellId;
+    Cells[Y * Size.X + X] := NewCell;
+  end;
+
+  // Generate neightbours
+  for Y := 0 to Size.Y - 1 do
+  for X := 0 to Size.X - 1 do
+  with TCell(Cells[Y * Size.X + X]) do begin
+    GetCellPosNeighbors(Point(X, Y), Neighbors);
+  end;
+end;
+
+
+{ TSquareMap }
+
+procedure TSquareMap.Generate;
+var
+  X, Y: Integer;
+  NewCell: TCell;
+begin
+  // Free previous
+  Cells.Count := 0;
+  FNewCellId := 1;
+  // Allocate and init new
+  Cells.Count := Size.Y * Size.X;
+  for Y := 0 to Size.Y - 1 do
+  for X := 0 to Size.X - 1 do begin
+    NewCell := TCell.Create;
+    NewCell.Map := Self;
+    NewCell.PosPx := Point(Trunc(X * DefaultCellSize.X * SquareCellMulX),
+      Trunc(Y * DefaultCellSize.Y * SquareCellMulY));
+    NewCell.Polygon := GetSquarePolygon(NewCell.PosPx, DefaultCellSize);
+    NewCell.Id := GetNewCellId;
+    Cells[Y * Size.X + X] := NewCell;
+  end;
+
+  // Generate neighbours
+  for Y := 0 to Size.Y - 1 do
+  for X := 0 to Size.X - 1 do
+  with TCell(Cells[Y * Size.X + X]) do begin
+    if IsValidIndex(Point(X + 1, Y + 0)) then
+      Neighbors.Add(TCell(Cells[(Y + 0) * Size.X + (X + 1)]));
+    if IsValidIndex(Point(X + 0, Y + 1)) then
+      Neighbors.Add(TCell(Cells[(Y + 1) * Size.X + (X + 0)]));
+    if IsValidIndex(Point(X - 1, Y + 0)) then
+      Neighbors.Add(TCell(Cells[(Y + 0) * Size.X + (X - 1)]));
+    if IsValidIndex(Point(X + 0, Y - 1)) then
+      Neighbors.Add(TCell(Cells[(Y - 1) * Size.X + (X + 0)]));
+  end;
+end;
+
+function TSquareMap.IsValidIndex(Index: TPoint): Boolean;
+begin
+  Result := (Index.X >= 0) and (Index.X < Size.X) and
+    (Index.Y >= 0) and (Index.Y < Size.Y);
+end;
+
+function TSquareMap.GetSquarePolygon(Pos: TPoint; Size: TPoint): TPointArray;
+begin
+  SetLength(Result, 4);
+  Result[0] := Point(Trunc(Pos.X - Size.X / 2), Trunc(Pos.Y - Size.Y / 2));
+  Result[1] := Point(Trunc(Pos.X + Size.X / 2), Trunc(Pos.Y - Size.Y / 2));
+  Result[2] := Point(Trunc(Pos.X + Size.X / 2), Trunc(Pos.Y + Size.Y / 2));
+  Result[3] := Point(Trunc(Pos.X - Size.X / 2), Trunc(Pos.Y + Size.Y / 2));
+end;
+
+{ TVoronoiMap }
+
+function TVoronoiMap.GetTrianglePolygon(Pos: TPoint; Size: TPoint;
+  Reverse: Boolean): TPointArray;
+begin
+
+end;
+
+procedure TVoronoiMap.Generate;
+var
+  X, Y: Integer;
+  I, J, PI: Integer;
+  V, VN: Integer;
+  NewCell: TCell;
+  Pos: TPoint;
+begin
+  // Free previous
+  Cells.Count := 0;
+  FNewCellId := 1;
+  // Allocate and init new
+  Cells.Count := Size.Y * Size.X;
+  for Y := 0 to Size.Y - 1 do
+  for X := 0 to Size.X - 1 do begin
+    NewCell := TCell.Create;
+    NewCell.Map := Self;
+    NewCell.PosPx := Point(Trunc(Random * Size.X * DefaultCellSize.X),
+      Trunc(Random * Size.Y * DefaultCellSize.Y));
+    SetLength(NewCell.Polygon, 1);
+    NewCell.Polygon[0] := NewCell.PosPx;
+    NewCell.Id := GetNewCellId;
+    Cells[Y * Size.X + X] := NewCell;
+  end;
+end;
+
+{ TTriangleMap }
+
+function TTriangleMap.GetTrianglePolygon(Pos: TPoint; Size: TPoint;
+  Reverse: Boolean): TPointArray;
+var
+  Rev: Integer;
+begin
+  if Reverse then Rev := -1
+    else Rev := 1;
+  SetLength(Result, 3);
+  Result[0] := Point(Trunc(Pos.X - Size.X / 2), Trunc(Pos.Y - (Size.Y * 0.8) / 2 * Rev));
+  Result[1] := Point(Trunc(Pos.X + Size.X / 2), Trunc(Pos.Y - (Size.Y * 0.8) / 2 * Rev));
+  Result[2] := Point(Trunc(Pos.X), Trunc(Pos.Y + (Size.Y * 1.2) / 2 * Rev));
+end;
+
+function TTriangleMap.IsValidIndex(Index: TPoint): Boolean;
+begin
+  Result := (Index.X >= 0) and (Index.X < Size.X) and
+    (Index.Y >= 0) and (Index.Y < Size.Y);
+end;
+
+procedure TTriangleMap.Generate;
+var
+  X, Y: Integer;
+  Rev: Integer;
+  Reverse: Boolean;
+  NewCell: TCell;
+begin
+  // Free previous
+  Cells.Count := 0;
+  FNewCellId := 1;
+  // Allocate and init new
+  Cells.Count := Size.Y * Size.X;
+  for Y := 0 to Size.Y - 1 do
+  for X := 0 to Size.X - 1 do begin
+    NewCell := TCell.Create;
+    NewCell.Map := Self;
+    Reverse := Boolean(X mod 2) xor Boolean(Y mod 2);
+    if Reverse then Rev := -1
+      else Rev := 1;
+    NewCell.PosPx := Point(Trunc(X * DefaultCellSize.X * TriangleCellMulX),
+      Trunc((Y * DefaultCellSize.Y * TriangleCellMulY) - (0.1 * Rev * DefaultCellSize.Y)));
+    NewCell.Polygon := GetTrianglePolygon(NewCell.PosPx, DefaultCellSize, Reverse);
+    NewCell.Id := GetNewCellId;
+    Cells[Y * Size.X + X] := NewCell;
+  end;
+
+  // Generate neighbours
+  for Y := 0 to Self.Size.Y - 1 do
+  for X := 0 to Size.X - 1 do
+  with TCell(Cells[Y * Size.X + X]) do begin
+    if Boolean(X mod 2) xor Boolean(Y mod 2) then Rev := -1
+      else Rev := 1;
+    if IsValidIndex(Point(X + 1, Y + 0)) then
+      Neighbors.Add(TCell(Cells[(Y + 0) * Size.X + (X + 1)]));
+    if IsValidIndex(Point(X + 0, Y - 1 * Rev)) then
+      Neighbors.Add(TCell(Cells[(Y - 1 * Rev) * Size.X + (X + 0)]));
+    if IsValidIndex(Point(X - 1, Y + 0)) then
+      Neighbors.Add(TCell(Cells[(Y + 0) * Size.X + (X - 1)]));
+  end;
+end;
+
+
+end.
+
Index: /tags/1.1.0/xtactics.lpi
===================================================================
--- /tags/1.1.0/xtactics.lpi	(revision 137)
+++ /tags/1.1.0/xtactics.lpi	(revision 137)
@@ -0,0 +1,314 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<CONFIG>
+  <ProjectOptions>
+    <Version Value="10"/>
+    <General>
+      <SessionStorage Value="InProjectDir"/>
+      <MainUnit Value="0"/>
+      <Title Value="xtactics"/>
+      <ResourceType Value="res"/>
+      <UseXPManifest Value="True"/>
+      <XPManifest>
+        <DpiAware Value="True"/>
+      </XPManifest>
+      <Icon Value="0"/>
+    </General>
+    <i18n>
+      <EnableI18N Value="True"/>
+      <OutDir Value="Languages"/>
+    </i18n>
+    <VersionInfo>
+      <StringTable ProductVersion=""/>
+    </VersionInfo>
+    <BuildModes Count="4">
+      <Item1 Name="Debug" Default="True"/>
+      <Item2 Name="Release">
+        <CompilerOptions>
+          <Version Value="11"/>
+          <Target>
+            <Filename Value="xtactics"/>
+          </Target>
+          <SearchPaths>
+            <IncludeFiles Value="$(ProjOutDir)"/>
+            <OtherUnitFiles Value="Forms"/>
+            <UnitOutputDirectory Value="lib/$(TargetCPU)-$(TargetOS)"/>
+          </SearchPaths>
+          <Parsing>
+            <SyntaxOptions>
+              <SyntaxMode Value="Delphi"/>
+              <CStyleOperator Value="False"/>
+              <AllowLabel Value="False"/>
+              <CPPInline Value="False"/>
+            </SyntaxOptions>
+          </Parsing>
+          <CodeGeneration>
+            <SmartLinkUnit Value="True"/>
+            <Optimizations>
+              <OptimizationLevel Value="3"/>
+            </Optimizations>
+          </CodeGeneration>
+          <Linking>
+            <Debugging>
+              <GenerateDebugInfo Value="False"/>
+              <StripSymbols Value="True"/>
+            </Debugging>
+            <LinkSmart Value="True"/>
+            <Options>
+              <Win32>
+                <GraphicApplication Value="True"/>
+              </Win32>
+            </Options>
+          </Linking>
+        </CompilerOptions>
+      </Item2>
+      <Item3 Name="Windows 32-bit">
+        <CompilerOptions>
+          <Version Value="11"/>
+          <Target>
+            <Filename Value="lib/$(TargetCPU)-$(TargetOS)/xtactics"/>
+          </Target>
+          <SearchPaths>
+            <IncludeFiles Value="$(ProjOutDir)"/>
+            <OtherUnitFiles Value="Forms"/>
+            <UnitOutputDirectory Value="lib/$(TargetCPU)-$(TargetOS)"/>
+          </SearchPaths>
+          <Parsing>
+            <SyntaxOptions>
+              <SyntaxMode Value="Delphi"/>
+              <CStyleOperator Value="False"/>
+              <AllowLabel Value="False"/>
+              <CPPInline Value="False"/>
+            </SyntaxOptions>
+          </Parsing>
+          <CodeGeneration>
+            <SmartLinkUnit Value="True"/>
+            <TargetCPU Value="i386"/>
+            <TargetOS Value="win32"/>
+            <Optimizations>
+              <OptimizationLevel Value="3"/>
+            </Optimizations>
+          </CodeGeneration>
+          <Linking>
+            <Debugging>
+              <GenerateDebugInfo Value="False"/>
+              <StripSymbols Value="True"/>
+            </Debugging>
+            <LinkSmart Value="True"/>
+            <Options>
+              <Win32>
+                <GraphicApplication Value="True"/>
+              </Win32>
+            </Options>
+          </Linking>
+        </CompilerOptions>
+      </Item3>
+      <Item4 Name="Windows 64-bit">
+        <CompilerOptions>
+          <Version Value="11"/>
+          <Target>
+            <Filename Value="lib/$(TargetCPU)-$(TargetOS)/xtactics"/>
+          </Target>
+          <SearchPaths>
+            <IncludeFiles Value="$(ProjOutDir)"/>
+            <OtherUnitFiles Value="Forms"/>
+            <UnitOutputDirectory Value="lib/$(TargetCPU)-$(TargetOS)"/>
+          </SearchPaths>
+          <Parsing>
+            <SyntaxOptions>
+              <SyntaxMode Value="Delphi"/>
+              <CStyleOperator Value="False"/>
+              <AllowLabel Value="False"/>
+              <CPPInline Value="False"/>
+            </SyntaxOptions>
+          </Parsing>
+          <CodeGeneration>
+            <SmartLinkUnit Value="True"/>
+            <TargetCPU Value="x86_64"/>
+            <TargetOS Value="win64"/>
+            <Optimizations>
+              <OptimizationLevel Value="3"/>
+            </Optimizations>
+          </CodeGeneration>
+          <Linking>
+            <Debugging>
+              <GenerateDebugInfo Value="False"/>
+              <StripSymbols Value="True"/>
+            </Debugging>
+            <LinkSmart Value="True"/>
+            <Options>
+              <Win32>
+                <GraphicApplication Value="True"/>
+              </Win32>
+            </Options>
+          </Linking>
+        </CompilerOptions>
+      </Item4>
+    </BuildModes>
+    <PublishOptions>
+      <Version Value="2"/>
+    </PublishOptions>
+    <RunParams>
+      <local>
+        <FormatVersion Value="1"/>
+      </local>
+    </RunParams>
+    <RequiredPackages Count="6">
+      <Item1>
+        <PackageName Value="TAChartLazarusPkg"/>
+      </Item1>
+      <Item2>
+        <PackageName Value="TemplateGenerics"/>
+        <DefaultFilename Value="Packages/TemplateGenerics/TemplateGenerics.lpk" Prefer="True"/>
+      </Item2>
+      <Item3>
+        <PackageName Value="Common"/>
+        <DefaultFilename Value="Packages/Common/Common.lpk" Prefer="True"/>
+      </Item3>
+      <Item4>
+        <PackageName Value="FCL"/>
+      </Item4>
+      <Item5>
+        <PackageName Value="CoolTranslator"/>
+        <DefaultFilename Value="Packages/CoolTranslator/CoolTranslator.lpk" Prefer="True"/>
+      </Item5>
+      <Item6>
+        <PackageName Value="LCL"/>
+      </Item6>
+    </RequiredPackages>
+    <Units Count="12">
+      <Unit0>
+        <Filename Value="xtactics.lpr"/>
+        <IsPartOfProject Value="True"/>
+      </Unit0>
+      <Unit1>
+        <Filename Value="UGame.pas"/>
+        <IsPartOfProject Value="True"/>
+      </Unit1>
+      <Unit2>
+        <Filename Value="UCore.pas"/>
+        <IsPartOfProject Value="True"/>
+        <ComponentName Value="Core"/>
+        <HasResources Value="True"/>
+        <ResourceBaseClass Value="DataModule"/>
+      </Unit2>
+      <Unit3>
+        <Filename Value="Forms/UFormPlayer.pas"/>
+        <IsPartOfProject Value="True"/>
+        <ComponentName Value="FormPlayer"/>
+        <HasResources Value="True"/>
+        <ResourceBaseClass Value="Form"/>
+      </Unit3>
+      <Unit4>
+        <Filename Value="Forms/UFormSettings.pas"/>
+        <IsPartOfProject Value="True"/>
+        <ComponentName Value="FormSettings"/>
+        <HasResources Value="True"/>
+        <ResourceBaseClass Value="Form"/>
+      </Unit4>
+      <Unit5>
+        <Filename Value="Forms/UFormMain.pas"/>
+        <IsPartOfProject Value="True"/>
+        <ComponentName Value="FormMain"/>
+        <HasResources Value="True"/>
+        <ResourceBaseClass Value="Form"/>
+      </Unit5>
+      <Unit6>
+        <Filename Value="Forms/UFormMove.pas"/>
+        <IsPartOfProject Value="True"/>
+        <ComponentName Value="FormMove"/>
+        <HasResources Value="True"/>
+        <ResourceBaseClass Value="Form"/>
+      </Unit6>
+      <Unit7>
+        <Filename Value="Forms/UFormNew.pas"/>
+        <IsPartOfProject Value="True"/>
+        <ComponentName Value="FormNew"/>
+        <HasResources Value="True"/>
+        <ResourceBaseClass Value="Form"/>
+      </Unit7>
+      <Unit8>
+        <Filename Value="Forms/UFormAbout.pas"/>
+        <IsPartOfProject Value="True"/>
+        <ComponentName Value="FormAbout"/>
+        <HasResources Value="True"/>
+        <ResourceBaseClass Value="Form"/>
+      </Unit8>
+      <Unit9>
+        <Filename Value="Forms/UFormHelp.pas"/>
+        <IsPartOfProject Value="True"/>
+        <ComponentName Value="FormHelp"/>
+        <HasResources Value="True"/>
+        <ResourceBaseClass Value="Form"/>
+      </Unit9>
+      <Unit10>
+        <Filename Value="UMap.pas"/>
+        <IsPartOfProject Value="True"/>
+      </Unit10>
+      <Unit11>
+        <Filename Value="Forms/UFormCharts.pas"/>
+        <IsPartOfProject Value="True"/>
+        <ComponentName Value="FormCharts"/>
+        <HasResources Value="True"/>
+        <ResourceBaseClass Value="Form"/>
+      </Unit11>
+    </Units>
+  </ProjectOptions>
+  <CompilerOptions>
+    <Version Value="11"/>
+    <Target>
+      <Filename Value="xtactics"/>
+    </Target>
+    <SearchPaths>
+      <IncludeFiles Value="$(ProjOutDir)"/>
+      <OtherUnitFiles Value="Forms"/>
+      <UnitOutputDirectory Value="lib/$(TargetCPU)-$(TargetOS)"/>
+    </SearchPaths>
+    <Parsing>
+      <SyntaxOptions>
+        <SyntaxMode Value="Delphi"/>
+        <CStyleOperator Value="False"/>
+        <IncludeAssertionCode Value="True"/>
+        <AllowLabel Value="False"/>
+        <CPPInline Value="False"/>
+      </SyntaxOptions>
+    </Parsing>
+    <CodeGeneration>
+      <Checks>
+        <IOChecks Value="True"/>
+        <RangeChecks Value="True"/>
+        <OverflowChecks Value="True"/>
+        <StackChecks Value="True"/>
+      </Checks>
+    </CodeGeneration>
+    <Linking>
+      <Debugging>
+        <UseHeaptrc Value="True"/>
+        <UseExternalDbgSyms Value="True"/>
+      </Debugging>
+      <Options>
+        <Win32>
+          <GraphicApplication Value="True"/>
+        </Win32>
+      </Options>
+    </Linking>
+    <Other>
+      <CompilerMessages>
+        <IgnoredMessages idx5024="True"/>
+      </CompilerMessages>
+      <CustomOptions Value="-dDEBUG"/>
+    </Other>
+  </CompilerOptions>
+  <Debugging>
+    <Exceptions Count="3">
+      <Item1>
+        <Name Value="EAbort"/>
+      </Item1>
+      <Item2>
+        <Name Value="ECodetoolError"/>
+      </Item2>
+      <Item3>
+        <Name Value="EFOpenError"/>
+      </Item3>
+    </Exceptions>
+  </Debugging>
+</CONFIG>
Index: /tags/1.1.0/xtactics.lpr
===================================================================
--- /tags/1.1.0/xtactics.lpr	(revision 137)
+++ /tags/1.1.0/xtactics.lpr	(revision 137)
@@ -0,0 +1,42 @@
+program xtactics;
+
+{$mode objfpc}{$H+}
+
+uses
+  {$IFDEF UNIX}
+  cthreads, clocale,
+  {$ENDIF}
+  Interfaces, // this includes the LCL widgetset
+  Forms, tachartlazaruspkg, UGame, UCore, Common, CoolTranslator,
+  TemplateGenerics, UFormPlayer
+  { you can add units after this },
+  SysUtils, UFormSettings, UFormMain, UFormMove, UFormNew, UFormAbout,
+  UFormHelp, UMap, UFormCharts;
+
+{$R *.res}
+
+{$IFDEF DEBUG}
+const
+  HeapTraceLog = 'heaptrclog.trc';
+{$ENDIF}
+
+
+begin
+  {$IFDEF DEBUG}
+  // Heap trace
+  DeleteFile(ExtractFilePath(ParamStr(0)) + HeapTraceLog);
+  SetHeapTraceOutput(ExtractFilePath(ParamStr(0)) + HeapTraceLog);
+  {$ENDIF}
+
+  RequireDerivedFormResource := True;
+  Application.Initialize;
+  Application.CreateForm(TCore, Core);
+  Application.CreateForm(TFormMain, FormMain);
+  Application.CreateForm(TFormNew, FormNew);
+  Application.CreateForm(TFormMove, FormMove);
+  Application.CreateForm(TFormPlayer, FormPlayer);
+  Application.CreateForm(TFormSettings, FormSettings);
+  Application.CreateForm(TFormCharts, FormCharts);
+  Application.Run;
+end.
+
