aboutsummaryrefslogtreecommitdiff
path: root/Source
diff options
context:
space:
mode:
authorJuha Vehviläinen <jusu@users.sourceforge.net>2002-07-06 17:50:18 +0000
committerJuha Vehviläinen <jusu@users.sourceforge.net>2002-07-06 17:50:18 +0000
commit4d64e4cd434426234a5c313c151cd79b6afc299e (patch)
tree5c23dd6acc65b869741d3bb9d33912d74bb7407d /Source
*** empty log message ***svn2git-root
svn path=/trunk/Framestein/; revision=27
Diffstat (limited to 'Source')
-rw-r--r--Source/Filez.pas87
-rw-r--r--Source/Framestein.cfg39
-rw-r--r--Source/Framestein.dof91
-rw-r--r--Source/Framestein.dpr46
-rw-r--r--Source/Framestein.dsk222
-rw-r--r--Source/Framestein.resbin0 -> 4056 bytes
-rw-r--r--Source/FsAviWriter.pas888
-rw-r--r--Source/GPL.txt340
-rw-r--r--Source/README.txt36
-rw-r--r--Source/Strz.pas182
-rw-r--r--Source/configureunit.dfm157
-rw-r--r--Source/configureunit.pas120
-rw-r--r--Source/dc.inc42
-rw-r--r--Source/effectsunit.pas109
-rw-r--r--Source/fsDcAvi.pas1615
-rw-r--r--Source/fsaviunit.dfm23
-rw-r--r--Source/fsaviunit.pas103
-rw-r--r--Source/fsbrowserunit.dfm35
-rw-r--r--Source/fsbrowserunit.pas113
-rw-r--r--Source/fscopyunit.dfm26
-rw-r--r--Source/fscopyunit.pas349
-rw-r--r--Source/fsdrawunit.dfm17
-rw-r--r--Source/fsdrawunit.pas101
-rw-r--r--Source/fsformunit.pas18
-rw-r--r--Source/fsframeunit.dfm146
-rw-r--r--Source/fsframeunit.pas1098
-rw-r--r--Source/fsinfounit.dfm16
-rw-r--r--Source/fsinfounit.pas53
-rw-r--r--Source/fsspeedbutton.pas48
-rw-r--r--Source/fstextunit.dfm18
-rw-r--r--Source/fstextunit.pas148
-rw-r--r--Source/logunit.dfm100
-rw-r--r--Source/logunit.pas60
-rw-r--r--Source/mainunit.dfm3547
-rw-r--r--Source/mainunit.pas903
-rw-r--r--Source/pluginunit.pas227
-rw-r--r--Source/pshostunit.pas145
37 files changed, 11268 insertions, 0 deletions
diff --git a/Source/Filez.pas b/Source/Filez.pas
new file mode 100644
index 0000000..1560a77
--- /dev/null
+++ b/Source/Filez.pas
@@ -0,0 +1,87 @@
+unit Filez;
+{$I-}
+
+interface
+
+uses
+ Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;
+
+type
+ THandleFileEvent = procedure( const SearchRec:TSearchRec;
+ const FullPath: String ) of object;
+ // fullpath contains filepath+filename
+
+ TScanDir = class(TComponent)
+ private
+ { Private declarations }
+ FOnHandleFile : THandleFileEvent;
+ protected
+ { Protected declarations }
+ public
+ { Public declarations }
+ procedure Scan( const Path : String );
+ constructor Create( AOwner:TComponent ); override;
+ published
+ { Published declarations }
+ property OnHandleFile : THandleFileEvent read FOnHandleFile write FOnHandleFile;
+ end;
+
+ function FileSizeByName( const FileName:String ):Longint;
+
+procedure Register;
+
+implementation
+
+uses
+ Strz;
+
+function FileSizeByName( const FileName:String ):Longint;
+var
+ F:file of Byte;
+begin
+ Result := 0;
+ AssignFile(F, FileName);
+ Reset(F);
+ if IoResult<>0 then Exit;
+ Result := FileSize(F);
+ Close(F);
+end;
+
+constructor TScanDir.Create( AOwner:TComponent );
+begin
+ inherited Create( AOwner );
+
+ FOnHandleFile := nil;
+end;
+
+procedure TScanDir.Scan( const Path : String );
+var
+ SearchRec : TSearchRec;
+ Result : Integer;
+ S : String;
+begin
+ if not Assigned(FOnHandleFile) then
+ Exit;
+
+ S := VerifyBackSlash(Path);
+ Result := FindFirst( S+'*.*', faAnyFile, SearchRec);
+ if Result=0 then
+ repeat
+ if (SearchRec.Name='.') or (SearchRec.Name='..') then
+ Continue;
+
+ FOnHandleFile( SearchRec,
+ S+SearchRec.Name );
+
+ if SearchRec.Attr and faDirectory>0 then
+ Scan( S+SearchRec.Name );
+ until FindNext(SearchRec)<>0;
+end;
+
+procedure Register;
+begin
+ RegisterComponents('Labrz', [TScanDir]);
+end;
+
+end.
+
diff --git a/Source/Framestein.cfg b/Source/Framestein.cfg
new file mode 100644
index 0000000..cdbef8d
--- /dev/null
+++ b/Source/Framestein.cfg
@@ -0,0 +1,39 @@
+-$A+
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J+
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U-
+-$V+
+-$W-
+-$X+
+-$YD
+-$Z1
+-cg
+-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-LE"c:\program files\borland\delphi5\Projects\Bpl"
+-LN"c:\program files\borland\delphi5\Projects\Bpl"
+-U"\lab\common;C:\lab\common\DelphiX2000_0717-2\Source;\lab\common\fastlib;\lab\common\pshost;C:\lab\common\G32"
+-O"\lab\common;C:\lab\common\DelphiX2000_0717-2\Source;\lab\common\fastlib;\lab\common\pshost;C:\lab\common\G32"
+-I"\lab\common;C:\lab\common\DelphiX2000_0717-2\Source;\lab\common\fastlib;\lab\common\pshost;C:\lab\common\G32"
+-R"\lab\common;C:\lab\common\DelphiX2000_0717-2\Source;\lab\common\fastlib;\lab\common\pshost;C:\lab\common\G32"
diff --git a/Source/Framestein.dof b/Source/Framestein.dof
new file mode 100644
index 0000000..d217e75
--- /dev/null
+++ b/Source/Framestein.dof
@@ -0,0 +1,91 @@
+[Compiler]
+A=1
+B=0
+C=1
+D=1
+E=0
+F=0
+G=1
+H=1
+I=1
+J=1
+K=0
+L=1
+M=0
+N=1
+O=1
+P=1
+Q=0
+R=0
+S=0
+T=0
+U=0
+V=1
+W=0
+X=1
+Y=1
+Z=1
+ShowHints=1
+ShowWarnings=1
+UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+[Linker]
+MapFile=0
+OutputObjs=0
+ConsoleApp=1
+DebugInfo=0
+RemoteSymbols=0
+MinStackSize=16384
+MaxStackSize=1048576
+ImageBase=4194304
+ExeDescription=
+[Directories]
+OutputDir=
+UnitOutputDir=
+PackageDLLOutputDir=
+PackageDCPOutputDir=
+SearchPath=\lab\common;C:\lab\common\DelphiX2000_0717-2\Source;\lab\common\fastlib;\lab\common\pshost;C:\lab\common\G32
+Packages=Vcl50;Vclx50;VclSmp50;Qrpt50;Vcldb50;Vclbde50;ibevnt50;vcldbx50;TeeUI50;TeeDB50;Tee50;TeeQR50;VCLIB50;vclie50;Inetdb50;Inet50;NMFast50;dclocx50;dclaxserver50;temppak;janDrawPack;pdpak
+Conditionals=
+DebugSourceDirs=
+UsePackages=0
+[Parameters]
+RunParams=
+HostApplication=
+[Language]
+ActiveLang=
+ProjectLang=$0000040B
+RootDir=
+[Version Info]
+IncludeVerInfo=1
+AutoIncBuild=1
+MajorVer=0
+MinorVer=1
+Release=1
+Build=77
+Debug=0
+PreRelease=1
+Special=0
+Private=0
+DLL=0
+Locale=1033
+CodePage=1252
+[Version Info Keys]
+CompanyName=
+FileDescription=
+FileVersion=0.1.1.77
+InternalName=
+LegalCopyright=
+LegalTrademarks=
+OriginalFilename=
+ProductName=Framestein
+ProductVersion=1.0.0.0
+Comments=
+[HistoryLists\hlUnitAliases]
+Count=1
+Item0=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+[HistoryLists\hlSearchPath]
+Count=4
+Item0=\lab\common;C:\lab\common\DelphiX2000_0717-2\Source;\lab\common\fastlib;\lab\common\pshost;C:\lab\common\G32
+Item1=\lab\common;C:\lab\common\DelphiX2000_0717-2\Source;\lab\common\fastlib;\lab\common\pshost
+Item2=\lab\common;C:\lab\common\DelphiX2000_0717-2\Source;\lab\common\fastlib
+Item3=\lab\common;C:\lab\common\DelphiX2000_0717-2\Source
diff --git a/Source/Framestein.dpr b/Source/Framestein.dpr
new file mode 100644
index 0000000..4dd00b2
--- /dev/null
+++ b/Source/Framestein.dpr
@@ -0,0 +1,46 @@
+{ Copyright (C) 2001-2002 Juha Vehviläinen
+ 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.}
+
+program Framestein;
+
+{%ToDo 'Framestein.todo'}
+
+uses
+ Forms,
+ mainunit in 'mainunit.pas' {main},
+ fsframeunit in 'fsframeunit.pas' {fsframe},
+ fscopyunit in 'fscopyunit.pas' {fscopy},
+ fstextunit in 'fstextunit.pas' {fstext},
+ fsformunit in 'fsformunit.pas',
+ fsdrawunit in 'fsdrawunit.pas' {fsdraw},
+ effectsunit in 'effectsunit.pas',
+ pluginunit in 'pluginunit.pas',
+ logunit in 'logunit.pas' {log},
+ fsbrowserunit in 'fsbrowserunit.pas' {fsbrowser},
+ fsinfounit in 'fsinfounit.pas' {fsinfo},
+ configureunit in 'configureunit.pas' {configure},
+ pshostunit in 'pshostunit.pas',
+ fsaviunit in 'fsaviunit.pas' {FsAvi},
+ progressunit in 'progressunit.pas' {Progress};
+
+{$R *.RES}
+
+begin
+ Application.Initialize;
+ Application.Title := 'Framestein';
+ Application.CreateForm(Tmain, main);
+ Application.CreateForm(Tlog, log);
+ Application.CreateForm(Tconfigure, configure);
+ Application.CreateForm(TFsAvi, FsAvi);
+ Application.CreateForm(TProgress, Progress);
+ Application.Run;
+end.
+
diff --git a/Source/Framestein.dsk b/Source/Framestein.dsk
new file mode 100644
index 0000000..69b37b9
--- /dev/null
+++ b/Source/Framestein.dsk
@@ -0,0 +1,222 @@
+[Closed Files]
+File_0=SourceModule,'c:\lab\Framestein\mainunit.pas',0,1,417,14,429,1,0
+File_1=SourceModule,'c:\lab\Framestein\fsframeunit.pas',0,1,746,1,758,1,0
+File_2=SourceModule,'c:\lab\Framestein\fsaviunit.pas',0,1,45,12,56,0,0
+File_3=SourceModule,'c:\lab\Framestein\FsAviWriter.pas',0,1,312,15,323,0,0
+File_4=SourceModule,'C:\lab\Framestein\progressunit.pas',0,1,1,13,10,0,0
+File_5=SourceModule,'c:\lab\Framestein\logunit.pas',0,1,38,1,53,1,0
+File_6=SourceModule,'c:\lab\framestein\fsspeedbutton.pas',0,1,30,1,40,0,0
+File_7=SourceModule,'c:\lab\Framestein\fsbrowserunit.pas',0,1,93,1,105,0,0
+File_8=SourceModule,'c:\lab\Framestein\pluginunit.pas',0,1,134,1,147,0,0
+File_9=SourceModule,'c:\lab\common\Strz.pas',0,1,1,1,1,0,0
+
+[Modules]
+Count=0
+EditWindowCount=0
+
+[C:\Program Files\Borland\Delphi5\Projects\ProjectGroup1.bpg]
+FormState=0
+FormOnTop=0
+
+[c:\lab\Framestein\framestein.dpr]
+FormState=0
+FormOnTop=0
+
+[c:\lab\Framestein\Framestein.todo]
+FormState=0
+FormOnTop=0
+
+[Watches]
+Count=1
+Watch0='longint(pointer(_pshost.fdata+100+((i-1)*4)^)',256,0,18,1,0
+
+[Breakpoints]
+Count=0
+
+[AddressBreakpoints]
+Count=0
+
+[Main Window]
+Create=1
+Visible=1
+State=2
+Left=0
+Top=0
+Width=1024
+Height=105
+MaxLeft=-4
+MaxTop=-4
+MaxWidth=1032
+MaxHeight=105
+ClientWidth=1024
+ClientHeight=78
+
+[ProjectManager]
+Create=1
+Visible=0
+State=0
+Left=245
+Top=124
+Width=148
+Height=449
+MaxLeft=-1
+MaxTop=-1
+ClientWidth=140
+ClientHeight=425
+TBDockHeight=494
+LRDockWidth=140
+Dockable=1
+
+[CPUWindow]
+Create=1
+Visible=0
+State=0
+Left=463
+Top=216
+Width=533
+Height=353
+MaxLeft=-1
+MaxTop=-1
+ClientWidth=525
+ClientHeight=326
+DumpPane=79
+DisassemblyPane=187
+RegisterPane=231
+FlagPane=64
+
+[AlignmentPalette]
+Create=1
+Visible=1
+State=0
+Left=36
+Top=641
+Width=156
+Height=82
+MaxLeft=-1
+MaxTop=-1
+ClientWidth=150
+ClientHeight=60
+
+[PropertyInspector]
+Create=1
+Visible=1
+State=0
+Left=0
+Top=97
+Width=241
+Height=639
+MaxLeft=-1
+MaxTop=-1
+ClientWidth=231
+ClientHeight=613
+TBDockHeight=494
+LRDockWidth=190
+Dockable=0
+SplitPos=140
+ArrangeBy=Name
+SelectedItem=
+ExpandedItems=Anchors,Display,Font,Font.Style,Options,Pen,VertScrollBar
+HiddenCategories=
+ShowStatusBar=1
+
+[WatchWindow]
+Create=1
+Visible=0
+State=0
+Left=246
+Top=567
+Width=813
+Height=187
+MaxLeft=-1
+MaxTop=-1
+ClientWidth=805
+ClientHeight=163
+TBDockHeight=65
+LRDockWidth=421
+Dockable=1
+
+[BreakpointWindow]
+Create=1
+Visible=0
+State=0
+Left=298
+Top=323
+Width=556
+Height=236
+MaxLeft=-1
+MaxTop=-1
+ClientWidth=548
+ClientHeight=212
+TBDockHeight=197
+LRDockWidth=737
+Dockable=1
+Column0Width=100
+Column1Width=60
+Column2Width=240
+Column3Width=40
+Column4Width=75
+Column5Width=75
+
+[CallStackWindow]
+Create=1
+Visible=1
+State=0
+Left=365
+Top=303
+Width=290
+Height=161
+MaxLeft=-1
+MaxTop=-1
+ClientWidth=282
+ClientHeight=137
+TBDockHeight=161
+LRDockWidth=294
+Dockable=1
+
+[ThreadStatusWindow]
+Create=1
+Visible=0
+State=0
+Left=193
+Top=107
+Width=624
+Height=152
+MaxLeft=-1
+MaxTop=-1
+ClientWidth=616
+ClientHeight=128
+TBDockHeight=152
+LRDockWidth=624
+Dockable=1
+Column0Width=145
+Column1Width=100
+Column2Width=115
+Column3Width=250
+
+[ToDo List]
+Create=1
+Visible=1
+State=0
+Left=244
+Top=427
+Width=753
+Height=296
+MaxLeft=-1
+MaxTop=-1
+ClientWidth=745
+ClientHeight=272
+TBDockHeight=170
+LRDockWidth=896
+Dockable=0
+Column0Width=564
+Column1Width=30
+Column2Width=100
+Column3Width=70
+Column4Width=70
+SortOrder=0
+ShowHints=1
+ShowChecked=1
+
+[DockHosts]
+DockHostCount=0
+
diff --git a/Source/Framestein.res b/Source/Framestein.res
new file mode 100644
index 0000000..ee5ac49
--- /dev/null
+++ b/Source/Framestein.res
Binary files differ
diff --git a/Source/FsAviWriter.pas b/Source/FsAviWriter.pas
new file mode 100644
index 0000000..6373846
--- /dev/null
+++ b/Source/FsAviWriter.pas
@@ -0,0 +1,888 @@
+unit FsAviWriter;
+
+//
+// FSAviWriter - Framestein modified version of AviWriter.
+//
+
+/////////////////////////////////////////////////////////////////////////////
+// //
+// AviWriter -- a component to create rudimentary AVI files //
+// by Elliott Shevin, with large pieces of code //
+// stolen from Anders Melander //
+// version 1.0. Please send comments, suggestions, and advice //
+// to shevine@aol.com. //
+/////////////////////////////////////////////////////////////////////////////
+// //
+// AviWriter will build an AVI file containing one stream of any //
+// number of TBitmaps, plus a single WAV file. //
+// //
+// Properties: //
+// Bitmaps : A TList of pointers to TBitmap objects which become //
+// frames of the AVI video stream. The component //
+// allocates and frees the TList, but the caller //
+// is responsible for managing the TBitmaps themselves. //
+// Manipulate the list as you would any other TList. //
+// At least one bitmap is required. //
+// Height, Width: //
+// The dimensions of the AVI video, in pixels. //
+// FrameTime: //
+// The duration of each video frame, in milliseconds. //
+// Stretch: If TRUE, each TBitmap on the Bitmaps list is //
+// stretches to the dimensions specified in Height //
+// and Width. If FALSE, each TBitmap is copied from //
+// its upper left corner without stretching. //
+// FileName: The name of the AVI file to be written. //
+// WAVFileName: //
+// The name of a WAV file which will become the audio //
+// stream for the AVI. Optional. //
+// //
+// Method: //
+// Write: Creates the AVI file named by FileName. //
+/////////////////////////////////////////////////////////////////////////////
+// Wish List: //
+// I'd like to be able to enhance this component in two ways, but //
+// don't know how. Please send ideas to shevine@aol.com. //
+// 1. So far, it's necessary to transform the video stream into //
+// and AVI file on disk. I'd prefer to do this in memory. //
+// 2. MIDI files for audio. //
+/////////////////////////////////////////////////////////////////////////////
+
+interface
+
+uses
+ Windows,Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
+ StdCtrls, DIB,
+{$ifdef VER90}
+ ole2;
+{$else}
+ ActiveX;
+{$endif}
+
+////////////////////////////////////////////////////////////////////////////////
+// //
+// Video for Windows //
+// //
+////////////////////////////////////////////////////////////////////////////////
+// //
+// Adapted from Thomas Schimming's VFW.PAS //
+// (c) 1996 Thomas Schimming, schimmin@iee1.et.tu-dresden.de //
+// (c) 1998,99 Anders Melander //
+// //
+////////////////////////////////////////////////////////////////////////////////
+// //
+// Ripped all COM/ActiveX stuff and added some AVI stream functions. //
+// //
+////////////////////////////////////////////////////////////////////////////////
+
+type
+
+ { TAVIFileInfoW record }
+
+ LONG = Longint;
+ PVOID = Pointer;
+
+// TAVIFileInfo dwFlag values
+const
+ AVIF_HASINDEX = $00000010;
+ AVIF_MUSTUSEINDEX = $00000020;
+ AVIF_ISINTERLEAVED = $00000100;
+ AVIF_WASCAPTUREFILE = $00010000;
+ AVIF_COPYRIGHTED = $00020000;
+ AVIF_KNOWN_FLAGS = $00030130;
+
+ AVIERR_UNSUPPORTED = $80044065; // MAKE_AVIERR(101)
+ AVIERR_BADFORMAT = $80044066; // MAKE_AVIERR(102)
+ AVIERR_MEMORY = $80044067; // MAKE_AVIERR(103)
+ AVIERR_INTERNAL = $80044068; // MAKE_AVIERR(104)
+ AVIERR_BADFLAGS = $80044069; // MAKE_AVIERR(105)
+ AVIERR_BADPARAM = $8004406A; // MAKE_AVIERR(106)
+ AVIERR_BADSIZE = $8004406B; // MAKE_AVIERR(107)
+ AVIERR_BADHANDLE = $8004406C; // MAKE_AVIERR(108)
+ AVIERR_FILEREAD = $8004406D; // MAKE_AVIERR(109)
+ AVIERR_FILEWRITE = $8004406E; // MAKE_AVIERR(110)
+ AVIERR_FILEOPEN = $8004406F; // MAKE_AVIERR(111)
+ AVIERR_COMPRESSOR = $80044070; // MAKE_AVIERR(112)
+ AVIERR_NOCOMPRESSOR = $80044071; // MAKE_AVIERR(113)
+ AVIERR_READONLY = $80044072; // MAKE_AVIERR(114)
+ AVIERR_NODATA = $80044073; // MAKE_AVIERR(115)
+ AVIERR_BUFFERTOOSMALL = $80044074; // MAKE_AVIERR(116)
+ AVIERR_CANTCOMPRESS = $80044075; // MAKE_AVIERR(117)
+ AVIERR_USERABORT = $800440C6; // MAKE_AVIERR(198)
+ AVIERR_ERROR = $800440C7; // MAKE_AVIERR(199)
+
+type
+ TAVIFileInfoW = record
+ dwMaxBytesPerSec, // max. transfer rate
+ dwFlags, // the ever-present flags
+ dwCaps,
+ dwStreams,
+ dwSuggestedBufferSize,
+
+ dwWidth,
+ dwHeight,
+
+ dwScale,
+ dwRate, // dwRate / dwScale == samples/second
+ dwLength,
+
+ dwEditCount: DWORD;
+
+ szFileType: array[0..63] of WideChar; // descriptive string for file type?
+ end;
+ PAVIFileInfoW = ^TAVIFileInfoW;
+
+// TAVIStreamInfo dwFlag values
+const
+ AVISF_DISABLED = $00000001;
+ AVISF_VIDEO_PALCHANGES= $00010000;
+ AVISF_KNOWN_FLAGS = $00010001;
+
+type
+ TAVIStreamInfoA = record
+ fccType,
+ fccHandler,
+ dwFlags, // Contains AVITF_* flags
+ dwCaps: DWORD;
+ wPriority,
+ wLanguage: WORD;
+ dwScale,
+ dwRate, // dwRate / dwScale == samples/second
+ dwStart,
+ dwLength, // In units above...
+ dwInitialFrames,
+ dwSuggestedBufferSize,
+ dwQuality,
+ dwSampleSize: DWORD;
+ rcFrame: TRect;
+ dwEditCount,
+ dwFormatChangeCount: DWORD;
+ szName: array[0..63] of AnsiChar;
+ end;
+ TAVIStreamInfo = TAVIStreamInfoA;
+ PAVIStreamInfo = ^TAVIStreamInfo;
+
+ { TAVIStreamInfoW record }
+
+ TAVIStreamInfoW = record
+ fccType,
+ fccHandler,
+ dwFlags, // Contains AVITF_* flags
+ dwCaps: DWORD;
+ wPriority,
+ wLanguage: WORD;
+ dwScale,
+ dwRate, // dwRate / dwScale == samples/second
+ dwStart,
+ dwLength, // In units above...
+ dwInitialFrames,
+ dwSuggestedBufferSize,
+ dwQuality,
+ dwSampleSize: DWORD;
+ rcFrame: TRect;
+ dwEditCount,
+ dwFormatChangeCount: DWORD;
+ szName: array[0..63] of WideChar;
+ end;
+
+ PAVIStream = pointer;
+ PAVIFile = pointer;
+ TAVIStreamList = array[0..0] of PAVIStream;
+ PAVIStreamList = ^TAVIStreamList;
+ TAVISaveCallback = function (nPercent: integer): LONG; stdcall;
+
+ TAVICompressOptions = packed record
+ fccType : DWORD;
+ fccHandler : DWORD;
+ dwKeyFrameEvery : DWORD;
+ dwQuality : DWORD;
+ dwBytesPerSecond : DWORD;
+ dwFlags : DWORD;
+ lpFormat : pointer;
+ cbFormat : DWORD;
+ lpParms : pointer;
+ cbParms : DWORD;
+ dwInterleaveEvery : DWORD;
+ end;
+ PAVICompressOptions = ^TAVICompressOptions;
+
+const
+ ICMF_CHOOSE_KEYFRAME = $0001; // show KeyFrame Every box
+ ICMF_CHOOSE_DATARATE = $0002; // show DataRate box
+ ICMF_CHOOSE_PREVIEW = $0004; // allow expanded preview dialog
+
+// Palette change data record
+const
+ RIFF_PaletteChange: DWORD = 1668293411;
+type
+ TAVIPalChange = packed record
+ bFirstEntry : byte;
+ bNumEntries : byte;
+ wFlags : WORD;
+ peNew : array[byte] of TPaletteEntry;
+ end;
+ PAVIPalChange = ^TAVIPalChange;
+
+ APAVISTREAM = array[0..1] of PAVISTREAM;
+ APAVICompressOptions = array[0..1] of PAVICompressOptions;
+ PAPAVICompressOptions = ^APAVICompressOptions;
+
+procedure AVIFileInit; stdcall;
+procedure AVIFileExit; stdcall;
+function AVIFileOpen(var ppfile: PAVIFile; szFile: PChar; uMode: UINT; lpHandler: pointer): HResult; stdcall;
+function AVIFileCreateStream(pfile: PAVIFile; var ppavi: PAVISTREAM; var psi: TAVIStreamInfo): HResult; stdcall;
+function AVIStreamSetFormat(pavi: PAVIStream; lPos: LONG; lpFormat: pointer; cbFormat: LONG): HResult; stdcall;
+function AVIStreamReadFormat(pavi: PAVIStream; lPos: LONG; lpFormat: pointer; var cbFormat: LONG): HResult; stdcall;
+function AVIStreamWrite(pavi: PAVIStream; lStart, lSamples: LONG; lpBuffer: pointer; cbBuffer: LONG; dwFlags: DWORD; var plSampWritten: LONG; var plBytesWritten: LONG): HResult; stdcall;
+function AVIStreamRelease(pavi: PAVISTREAM): ULONG; stdcall;
+function AVIFileRelease(pfile: PAVIFile): ULONG; stdcall;
+function AVIFileGetStream(pfile: PAVIFile; var ppavi: PAVISTREAM; fccType: DWORD; lParam: LONG): HResult; stdcall;
+function CreateEditableStream(var ppsEditable: PAVISTREAM; psSource: PAVISTREAM): HResult; stdcall;
+function AVISaveV(szFile: PChar; pclsidHandler: PCLSID; lpfnCallback: TAVISaveCallback;
+ nStreams: integer; pavi: APAVISTREAM; lpOptions: APAVICompressOptions): HResult; stdcall;
+function AVISaveOptions(hwnd: HWND; uiFlags: UINT; nStreams: integer;
+ ppavi: APAVISTREAM; plpOptions: PAPAVICOMPRESSOPTIONS): Boolean; stdcall; external 'avifil32.dll';
+function AVIMakeCompressedStream(var ppaviCompressed: PAVISTREAM;
+ ppaviSource: PAVISTREAM; plpOptions: APAVICompressOptions;
+ pclsidHandler: PCLSID): HResult; stdcall; external 'avifil32.dll';
+
+const
+ AVIERR_OK = 0;
+
+ AVIIF_LIST = $01;
+ AVIIF_TWOCC = $02;
+ AVIIF_KEYFRAME = $10;
+
+ streamtypeVIDEO = $73646976; // DWORD( 'v', 'i', 'd', 's' )
+ streamtypeAUDIO = $73647561; // DWORD( 'a', 'u', 'd', 's' )
+
+
+type
+ TPixelFormat = (pfDevice, pf1bit, pf4bit, pf8bit, pf15bit, pf16bit,
+ pf24bit, pf32bit, pfCustom);
+
+type
+ TAviWriter = class(TComponent)
+ private
+ TempFileName : string;
+ pFile : PAVIFile;
+ fHeight : integer;
+ fWidth : integer;
+ fStretch : boolean;
+ fFrameTime : integer;
+ fFileName : string;
+ fWavFileName : string;
+ VideoStream : PAVISTREAM;
+ AudioStream : PAVISTREAM;
+
+ Pstream : PAVISTREAM;
+ StreamInfo : TAVIStreamInfo;
+
+ CompOptions : APAVICompressOptions;
+ cmp1, cmp2 : TAviCompressOptions;
+
+ procedure AddVideo;
+ procedure AddAudio;
+ procedure InternalGetDIBSizes(Bitmap: HBITMAP; var InfoHeaderSize: Integer;
+ var ImageSize: longInt; PixelFormat: TPixelFormat);
+ function InternalGetDIB(Bitmap: HBITMAP; Palette: HPALETTE;
+ var BitmapInfo; var Bits; PixelFormat: TPixelFormat): Boolean;
+ procedure InitializeBitmapInfoHeader(Bitmap: HBITMAP; var Info: TBitmapInfoHeader;
+ PixelFormat: TPixelFormat);
+ procedure SetWavFileName(value : string);
+ { Private declarations }
+ protected
+ { Protected declarations }
+ public
+ Bitmaps : TList;
+ FramePos : Longint;
+ Prepared : Boolean;
+ fps : Integer;
+ constructor Create(AOwner : TComponent); override;
+ destructor Destroy; override;
+ procedure Write;
+ procedure Prepare;
+ procedure AddFrame(const DIB: TDIB);
+ procedure Finish;
+ { Public declarations }
+ published
+ property Height : integer read fHeight write fHeight;
+ property Width : integer read fWidth write fWidth;
+ property FrameTime: integer read fFrameTime write fFrameTime;
+ property Stretch : boolean read fStretch write fStretch;
+ property FileName : string read fFileName write fFileName;
+ property WavFileName : string read fWavFileName write SetWavFileName;
+ { Published declarations }
+ end;
+
+procedure Register;
+
+implementation
+
+uses
+ mainunit,
+ progressunit;
+
+function MAKEFOURCC(ch0, ch1, ch2, ch3: Char): Cardinal;
+begin
+ Result :=
+ (DWORD(BYTE(ch0))) or (DWORD(BYTE(ch1)) shl 8) or
+ (DWORD(BYTE(ch2)) shl 16) or (DWORD(BYTE(ch3)) shl 24 );
+end;
+
+constructor TAviWriter.Create(AOwner : TComponent);
+var
+ tempdir : string;
+ l : integer;
+begin
+ inherited Create(AOwner);
+ fHeight := screen.height div 10;
+ fWidth := screen.width div 10;
+ fFrameTime := 1000;
+ fStretch := true;
+ fFileName := '';
+ Bitmaps := TList.create;
+ AVIFileInit;
+
+ setlength(tempdir,MAX_PATH + 1);
+ l := GetTempPath(MAX_PATH,pchar(tempdir));
+ setlength(tempdir,l);
+ if copy(tempdir,length(tempdir),1) <> '\'
+ then tempdir := tempdir + '\';
+ TempFileName := tempdir + '~AWTemp.avi';
+ Prepared := False;
+
+ CompOptions[0] := @cmp1;
+ CompOptions[1] := @cmp2;
+
+ FillChar(cmp1, Sizeof(cmp1), 0);
+ FillChar(cmp2, Sizeof(cmp1), 0);
+
+ cmp1.fccType := streamtypeVIDEO;
+ cmp1.fccHandler := MakeFourCC('m','j','p','g');
+// cmp1.dwQuality :=
+
+ fps := 25;
+end;
+
+destructor TAviWriter.Destroy;
+begin
+ Bitmaps.free;
+ AviFileExit;
+ inherited;
+end;
+
+procedure TAviWriter.Write;
+var
+ Bitmap : TBitmap;
+ ExtBitmap : TBitmap;
+ nstreams : integer;
+ i : integer;
+ Streams : APAVISTREAM;
+ CompOptions : APAVICompressOptions;
+ AVIERR : integer;
+ refcount : integer;
+begin
+ AudioStream := nil;
+ VideoStream := nil;
+
+ // If no bitmaps are on the list, raise an error.
+ if Bitmaps.count < 1 then
+ raise Exception.Create('No bitmaps on the Bitmaps list');
+
+ // If anything on the Bitmaps TList is not a bitmap, raise
+ // an error.
+ for i := 0 to Bitmaps.count - 1 do begin
+ ExtBitmap := Bitmaps[i];
+ if not(ExtBitmap is TBitmap)
+ then raise Exception.Create('Bitmaps[' + inttostr(i)
+ + '] is not a TBitmap');
+ end;
+
+ try
+ AddVideo;
+
+ if WavFileName <> ''
+ then AddAudio;
+
+ // Create the output file.
+ if WavFileName <> ''
+ then nstreams := 2
+ else nstreams := 1;
+
+ Streams[0] := VideoStream;
+ Streams[1] := AudioStream;
+ CompOptions[0] := nil;
+ CompOptions[1] := nil;
+
+ AVIERR := AVISaveV(pchar(FileName),
+ nil, // File handler
+ nil, // Callback
+ nStreams, // Number of streams Streams, CompOptions); // Compress options for VideoStream if AVIERR <> AVIERR_OK then raise Exception.Create('Unable to write output file'); finally if assigned(VideoStream) then AviStreamRelease(VideoStream); if assigned(AudioStream)
+ then AviStreamRelease(AudioStream); try repeat
+ refcount := AviFileRelease(pFile);
+ until refcount <= 0;
+ except
+ end;
+
+ DeleteFile(TempFileName);
+ end;
+end;
+
+procedure TAviWriter.AddVideo;
+var
+ Pstream : PAVISTREAM;
+ StreamInfo : TAVIStreamInfo;
+ BitmapInfo : PBitmapInfoHeader;
+ BitmapInfoSize : Integer;
+ BitmapSize : longInt;
+ BitmapBits : pointer;
+ Bitmap : TBitmap;
+ ExtBitmap : TBitmap;
+ Samples_Written : LONG;
+ Bytes_Written : LONG;
+ AVIERR : integer;
+ i : integer;
+ startpos : DWORD;
+ len : DWORD;
+begin
+
+ // Open AVI file for write
+ if (AVIFileOpen(pFile, pchar(TempFileName),
+ OF_WRITE or OF_CREATE OR OF_SHARE_EXCLUSIVE, nil)
+ <> AVIERR_OK)
+ then
+ raise Exception.Create('Failed to create AVI video work file');
+
+ // Allocate the bitmap to which the bitmaps on the Bitmaps Tlist
+ // will be copied.
+ Bitmap := TBitmap.create;
+ Bitmap.Height := self.Height;
+ Bitmap.Width := self.Width;
+
+ // Write the stream header.
+ try
+ FillChar(StreamInfo, sizeof(StreamInfo), 0);
+
+ // Set frame rate and scale
+ StreamInfo.dwRate := 1000;
+ StreamInfo.dwScale := fFrameTime;
+ StreamInfo.fccType := streamtypeVIDEO;
+ StreamInfo.fccHandler := 0;
+ StreamInfo.dwFlags := 0;
+ StreamInfo.dwSuggestedBufferSize := 0;
+ StreamInfo.rcFrame.Right := self.width;
+ StreamInfo.rcFrame.Bottom := self.height;
+
+ // Open AVI data stream
+ if (AVIFileCreateStream(pFile, pStream, StreamInfo) <> AVIERR_OK) then
+ raise Exception.Create('Failed to create AVI video stream');
+
+ try
+ // Write the bitmaps to the stream.
+ for i := 0 to Bitmaps.count - 1 do begin
+ try
+ BitmapInfo := nil;
+ BitmapBits := nil;
+
+ // Copy the bitmap from the list to the AVI bitmap,
+ // stretching if desired. If the caller elects not to
+ // stretch, use the first pixel in the bitmap as a
+ // background color in case either the height or
+ // width of the source is smaller than the output.
+ // If Draw fails, do a StretchDraw.
+ ExtBitmap := Bitmaps[i];
+ if fStretch
+ then Bitmap.Canvas.StretchDraw
+ (Rect(0,0,self.width,self.height),ExtBitmap)
+ else try
+ with Bitmap.Canvas do begin
+ Brush.Color := ExtBitmap.Canvas.Pixels[0,0];
+ Brush.Style := bsSolid;
+ FillRect(Rect(0,0,Bitmap.Width,Bitmap.Height));
+ Draw(0,0,ExtBitmap);
+ end;
+ except
+ Bitmap.Canvas.StretchDraw
+ (Rect(0,0,self.width,self.height),ExtBitmap);
+ end;
+
+ // Determine size of DIB
+ InternalGetDIBSizes(Bitmap.Handle, BitmapInfoSize, BitmapSize, pf8bit);
+ if (BitmapInfoSize = 0) then
+ raise Exception.Create('Failed to retrieve bitmap info');
+
+ // Get DIB header and pixel buffers
+ GetMem(BitmapInfo, BitmapInfoSize);
+ GetMem(BitmapBits, BitmapSize);
+ InternalGetDIB
+ (Bitmap.Handle, 0, BitmapInfo^, BitmapBits^, pf8bit);
+
+ // On the first time through, set the stream format.
+ if i = 0 then
+ if (AVIStreamSetFormat(pStream, 0, BitmapInfo, BitmapInfoSize) <> AVIERR_OK) then
+ raise Exception.Create('Failed to set AVI stream format');
+
+ // Write frame to the video stream
+ AVIERR :=
+ AVIStreamWrite(pStream, i, 1, BitmapBits, BitmapSize, AVIIF_KEYFRAME,
+ Samples_Written, Bytes_Written);
+ if AVIERR <> AVIERR_OK then
+ raise Exception.Create
+ ('Failed to add frame to AVI. Err='
+ + inttohex(AVIERR,8));
+ finally
+ if (BitmapInfo <> nil) then
+ FreeMem(BitmapInfo);
+ if (BitmapBits <> nil) then
+ FreeMem(BitmapBits);
+ end;
+ end;
+
+ // Create the editable VideoStream from pStream.
+ if CreateEditableStream(VideoStream,pStream) <> AVIERR_OK then
+ raise Exception.Create
+ ('Could not create Video Stream');
+ finally
+ AviStreamRelease(pStream);
+ end;
+
+ finally
+ Bitmap.free;
+ end;
+end;
+
+procedure TAviWriter.AddAudio;
+var
+ InputFile : PAVIFILE;
+ hr : integer;
+ InputStream : PAVIStream;
+ avisClip : TAVISTREAMINFO;
+ l, selstart : DWORD;
+ pastecode : integer;
+begin
+ // Open the audio file.
+ hr := AVIFileOpen(InputFile, pchar(WavFileName),OF_READ, nil);
+ case hr of
+ 0: ;
+ AVIERR_BADFORMAT : raise Exception.Create('The file could not be read, indicating a corrupt file or an unrecognized format.');
+ AVIERR_MEMORY : raise Exception.Create('The file could not be opened because of insufficient memory.');
+ AVIERR_FILEREAD : raise Exception.Create('A disk error occurred while reading the audio file.');
+ AVIERR_FILEOPEN : raise Exception.Create('A disk error occurred while opening the audio file.');
+ REGDB_E_CLASSNOTREG : raise Exception.Create('According to the registry, the type of audio file specified in AVIFileOpen does not have a handler to process it.');
+ else raise Exception.Create('Unknown error opening audio file');
+ end;
+
+ // Open the audio stream.
+ try
+ if (AVIFileGetStream(InputFile, InputStream, 0, 0) <> AVIERR_OK) then
+ raise Exception.Create('Unable to get audio stream');
+
+ try
+ // Create AudioStream as a copy of InputStream
+ if (CreateEditableStream(AudioStream,InputStream) <> AVIERR_OK) then
+ raise Exception.Create('Failed to create editable AVI audio stream');
+ finally
+ AviStreamRelease(InputStream);
+ end;
+
+ finally
+ AviFileRelease(InputFile);
+ end;
+end;
+
+// --------------
+// InternalGetDIB
+// --------------
+// Converts a bitmap to a DIB of a specified PixelFormat.
+//
+// Parameters:
+// Bitmap The handle of the source bitmap.
+// Pal The handle of the source palette.
+// BitmapInfo The buffer that will receive the DIB's TBitmapInfo structure.
+// A buffer of sufficient size must have been allocated prior to
+// calling this function.
+// Bits The buffer that will receive the DIB's pixel data.
+// A buffer of sufficient size must have been allocated prior to
+// calling this function.
+// PixelFormat The pixel format of the destination DIB.
+//
+// Returns:
+// True on success, False on failure.
+//
+// Note: The InternalGetDIBSizes function can be used to calculate the
+// nescessary sizes of the BitmapInfo and Bits buffers.
+//
+function TAviWriter.InternalGetDIB(Bitmap: HBITMAP; Palette: HPALETTE;
+ var BitmapInfo; var Bits; PixelFormat: TPixelFormat): Boolean;
+// From graphics.pas, "optimized" for our use
+var
+ OldPal : HPALETTE;
+ DC : HDC;
+begin
+ InitializeBitmapInfoHeader(Bitmap, TBitmapInfoHeader(BitmapInfo), PixelFormat);
+ OldPal := 0;
+ DC := CreateCompatibleDC(0);
+ try
+ if (Palette <> 0) then
+ begin
+ OldPal := SelectPalette(DC, Palette, False);
+ RealizePalette(DC);
+ end;
+ Result := (GetDIBits(DC, Bitmap, 0, abs(TBitmapInfoHeader(BitmapInfo).biHeight),
+ @Bits, TBitmapInfo(BitmapInfo), DIB_RGB_COLORS) <> 0);
+ finally
+ if (OldPal <> 0) then
+ SelectPalette(DC, OldPal, False);
+ DeleteDC(DC);
+ end;
+end;
+
+
+// -------------------
+// InternalGetDIBSizes
+// -------------------
+// Calculates the buffer sizes nescessary for convertion of a bitmap to a DIB
+// of a specified PixelFormat.
+// See the GetDIBSizes API function for more info.
+//
+// Parameters:
+// Bitmap The handle of the source bitmap.
+// InfoHeaderSize
+// The returned size of a buffer that will receive the DIB's
+// TBitmapInfo structure.
+// ImageSize The returned size of a buffer that will receive the DIB's
+// pixel data.
+// PixelFormat The pixel format of the destination DIB.
+//
+procedure TAviWriter.InternalGetDIBSizes(Bitmap: HBITMAP; var InfoHeaderSize: Integer;
+ var ImageSize: longInt; PixelFormat: TPixelFormat);
+// From graphics.pas, "optimized" for our use
+var
+ Info : TBitmapInfoHeader;
+begin
+ InitializeBitmapInfoHeader(Bitmap, Info, PixelFormat);
+ // Check for palette device format
+ if (Info.biBitCount > 8) then
+ begin
+ // Header but no palette
+ InfoHeaderSize := SizeOf(TBitmapInfoHeader);
+ if ((Info.biCompression and BI_BITFIELDS) <> 0) then
+ Inc(InfoHeaderSize, 12);
+ end else
+ // Header and palette
+ InfoHeaderSize := SizeOf(TBitmapInfoHeader) + SizeOf(TRGBQuad) * (1 shl Info.biBitCount);
+ ImageSize := Info.biSizeImage;
+end;
+
+// --------------------------
+// InitializeBitmapInfoHeader
+// --------------------------
+// Fills a TBitmapInfoHeader with the values of a bitmap when converted to a
+// DIB of a specified PixelFormat.
+//
+// Parameters:
+// Bitmap The handle of the source bitmap.
+// Info The TBitmapInfoHeader buffer that will receive the values.
+// PixelFormat The pixel format of the destination DIB.
+//
+{$IFDEF BAD_STACK_ALIGNMENT}
+ // Disable optimization to circumvent optimizer bug...
+ {$IFOPT O+}
+ {$DEFINE O_PLUS}
+ {$O-}
+ {$ENDIF}
+{$ENDIF}
+
+
+procedure TAviWriter.InitializeBitmapInfoHeader(Bitmap: HBITMAP; var Info: TBitmapInfoHeader;
+ PixelFormat: TPixelFormat);
+// From graphics.pas, "optimized" for our use
+var
+ DIB : TDIBSection;
+ Bytes : Integer;
+ function AlignBit(Bits, BitsPerPixel, Alignment: Cardinal): Cardinal;
+ begin
+ Dec(Alignment);
+ Result := ((Bits * BitsPerPixel) + Alignment) and not Alignment;
+ Result := Result SHR 3;
+ end;
+begin
+ DIB.dsbmih.biSize := 0;
+ Bytes := GetObject(Bitmap, SizeOf(DIB), @DIB);
+ if (Bytes = 0) then
+ raise Exception.Create('Invalid bitmap');
+// Error(sInvalidBitmap);
+
+ if (Bytes >= (sizeof(DIB.dsbm) + sizeof(DIB.dsbmih))) and
+ (DIB.dsbmih.biSize >= sizeof(DIB.dsbmih)) then
+ Info := DIB.dsbmih
+ else
+ begin
+ FillChar(Info, sizeof(Info), 0);
+ with Info, DIB.dsbm do
+ begin
+ biSize := SizeOf(Info);
+ biWidth := bmWidth;
+ biHeight := bmHeight;
+ end;
+ end;
+ case PixelFormat of
+ pf1bit: Info.biBitCount := 1;
+ pf4bit: Info.biBitCount := 4;
+ pf8bit: Info.biBitCount := 8;
+ pf24bit: Info.biBitCount := 24;
+ else
+// Error(sInvalidPixelFormat);
+ raise Exception.Create('Invalid pixel foramt');
+ // Info.biBitCount := DIB.dsbm.bmBitsPixel * DIB.dsbm.bmPlanes;
+ end;
+ Info.biPlanes := 1;
+ Info.biCompression := BI_RGB; // Always return data in RGB format
+ Info.biSizeImage := AlignBit(Info.biWidth, Info.biBitCount, 32) * Cardinal(abs(Info.biHeight));
+end;
+{$IFDEF O_PLUS}
+ {$O+}
+ {$UNDEF O_PLUS}
+{$ENDIF}
+
+procedure TAviWriter.SetWavFileName(value : string);
+begin
+ if lowercase(fWavFileName) <> lowercase(value)
+ then if lowercase(ExtractFileExt(value)) <> '.wav'
+ then raise Exception.Create('WavFileName must name a file '
+ + 'with the .wav extension')
+ else fWavFileName := value;
+end;
+
+
+procedure Register;
+begin
+ RegisterComponents('Labrz', [TAviWriter]);
+end;
+
+ procedure AVIFileInit; stdcall; external 'avifil32.dll' name 'AVIFileInit';
+ procedure AVIFileExit; stdcall; external 'avifil32.dll' name 'AVIFileExit';
+ function AVIFileOpen; external 'avifil32.dll' name 'AVIFileOpenA';
+ function AVIFileCreateStream; external 'avifil32.dll' name 'AVIFileCreateStreamA';
+ function AVIStreamSetFormat; external 'avifil32.dll' name 'AVIStreamSetFormat';
+ function AVIStreamReadFormat; external 'avifil32.dll' name 'AVIStreamReadFormat';
+ function AVIStreamWrite; external 'avifil32.dll' name 'AVIStreamWrite';
+ function AVIStreamRelease; external 'avifil32.dll' name 'AVIStreamRelease';
+ function AVIFileRelease; external 'avifil32.dll' name 'AVIFileRelease';
+ function AVIFileGetStream; external 'avifil32.dll' name 'AVIFileGetStream';
+ function CreateEditableStream; external 'avifil32.dll' name 'CreateEditableStream';
+ function AVISaveV; external 'avifil32.dll' name 'AVISaveV';
+
+procedure TAviWriter.Prepare;
+begin
+ if Prepared then begin
+ main.Post('Finishing previous file..');
+ Finish;
+ end;
+
+ AudioStream := nil;
+ VideoStream := nil;
+
+ if (AVIFileOpen(pFile, pchar(TempFileName),
+ OF_WRITE or OF_CREATE or OF_SHARE_EXCLUSIVE, nil) <> AVIERR_OK) then
+ raise Exception.Create('Failed to create AVI video work file');
+
+ FillChar(StreamInfo, sizeof(StreamInfo), 0);
+
+ // Set frame rate and scale
+ StreamInfo.dwRate := fps*1000;
+ StreamInfo.dwScale := fFrameTime;
+ StreamInfo.fccType := streamtypeVIDEO;
+ StreamInfo.fccHandler := 0;
+ StreamInfo.dwFlags := 0;
+ StreamInfo.dwSuggestedBufferSize := 0;
+ StreamInfo.rcFrame.Right := self.width;
+ StreamInfo.rcFrame.Bottom := self.height;
+
+ // Open AVI data stream
+ if (AVIFileCreateStream(pFile, pStream, StreamInfo) <> AVIERR_OK) then
+ raise Exception.Create('Failed to create AVI video stream');
+
+ FramePos := 0;
+ Prepared := True;
+end;
+
+procedure TAviWriter.AddFrame(const DIB: TDIB);
+var
+ Samples_Written : LONG;
+ Bytes_Written : LONG;
+ AVIERR : integer;
+begin
+ if not Prepared then begin
+ main.Post('fs.avi: internal error, not prepared to add frame.');
+ Exit;
+ end;
+
+ // On the first time through, set the stream format.
+ if FramePos = 0 then begin
+ if (AVIStreamSetFormat(pStream, 0, DIB.BitmapInfo, DIB.BitmapInfoSize) <> AVIERR_OK) then
+ raise Exception.Create('Failed to set AVI stream format');
+ end;
+
+ // Write frame to the video stream
+ AVIERR := AVIStreamWrite(pStream, FramePos, 1, DIB.PBits, DIB.Size, AVIIF_KEYFRAME,
+ Samples_Written, Bytes_Written);
+
+ Inc(FramePos);
+
+ if AVIERR <> AVIERR_OK then
+ raise Exception.Create('Failed to add frame to AVI. Err='+
+ inttohex(AVIERR,8));
+end;
+
+function avisavecallback(nPercent: UINT): ULONG; stdcall;
+begin
+// Write('fs.avi: '+IntToStr(nPercent)+'%'+#13);
+ Progress.pb1.Position := nPercent;
+ Result := AVIERR_OK;
+end;
+
+procedure TAviWriter.Finish;
+var
+ nstreams: Integer;
+ Streams : APAVISTREAM;
+ AVIERR : integer;
+ refcount : integer;
+begin
+ if not Prepared then begin
+ main.Post('fs.avi: nothing to write.');
+ Exit;
+ end;
+
+ if CreateEditableStream(VideoStream,pStream) <> AVIERR_OK then
+ raise Exception.Create('Could not create Video Stream');
+
+ AviStreamRelease(pStream);
+
+ nstreams := 1;
+
+ Streams[0] := VideoStream;
+ Streams[1] := nil;//AudioStream;
+
+ if AVISaveOptions(0, ICMF_CHOOSE_PREVIEW, nStreams, Streams, @CompOptions) then begin
+
+ Progress.Show;
+
+ AVIERR := AVISaveV(pchar(FileName),
+ nil, // File handler
+ @avisavecallback, // Callback
+ nStreams, // Number of streams Streams, CompOptions); // Compress options for VideoStream Progress.Hide; // I get some strange error but the file is always ok so... screw it { if AVIERR <> AVIERR_OK then raise Exception.Create('Error on write - check output file.'); } if assigned(VideoStream) then AviStreamRelease(VideoStream); if assigned(AudioStream)
+ then AviStreamRelease(AudioStream); try repeat
+ refcount := AviFileRelease(pFile);
+ until refcount <= 0;
+ except
+ end;
+
+ DeleteFile(TempFileName);
+
+ Prepared := False;
+ end;
+end;
+
+end.
+
diff --git a/Source/GPL.txt b/Source/GPL.txt
new file mode 100644
index 0000000..14db8fc
--- /dev/null
+++ b/Source/GPL.txt
@@ -0,0 +1,340 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/Source/README.txt b/Source/README.txt
new file mode 100644
index 0000000..4037c52
--- /dev/null
+++ b/Source/README.txt
@@ -0,0 +1,36 @@
+To compile:
+
+
+- Install DelphiX by Hiroyuki Hori, http://www.yks.ne.jp/~hori/ <hori@ingjapan.ne.jp>
+
+The above link doesn't always work, try these:
+
+http://turbo.gamedev.net/DelphiX2000_0717a.zip
+http://turbo.gamedev.net/delphix.asp
+
+
+- Install FastLib by G-Soft, http://gfody.com <gfody@home.com>
+
+
+- Install TScanDir in Filez.pas (in this directory).
+
+
+- Correct your Search path and compile!
+
+
+- Framestein needs ijl15.dll (included in Framestein-directory) to load/save jpegs
+ and to send jpeg-compressed frames thru network.
+
+
+--- note to versions >= 0.27 ---
+
+
+The photoshop filter host functionality is based on commercial code from http://www.case2000.com.
+Due to my modifications the original component won't compile with Framestein and
+I don't have the permission to release my modified version.
+
+To compile Fs without the PSHost, ignore errors on C2PhotoShopHost, and comment out
+the implementation in pshostunit.pas.
+
+I'm planning a .dll of my version of the component to rid of this problem.
+Mail me for info.
diff --git a/Source/Strz.pas b/Source/Strz.pas
new file mode 100644
index 0000000..85ad4a7
--- /dev/null
+++ b/Source/Strz.pas
@@ -0,0 +1,182 @@
+unit Strz;
+
+interface
+
+uses
+ Windows;
+
+type
+ CharSet = set of Char;
+
+// General
+function MyStrToInt(const S: String): Integer; // some special checking, no exceptions
+function MyStrToFloat(const S: String): Extended; // some special checking, no exceptions
+function StrToRect(const S: String): TRect;
+function Long2Str(L : LongInt) : string;
+function SearchAndReplace( S, Old, New:String ):String;
+function WordCount(S : string; WordDelims : CharSet) : Integer;
+ {-Given a set of word delimiters, return number of words in S}
+function ExtractWord(N : Integer; S : string; WordDelims : CharSet) : string;
+ {-Given a set of word delimiters, return the N'th word in S}
+
+// Filez
+function VerifyBackSlash( const FileName:String ):String;
+
+implementation
+
+uses
+ Classes, SysUtils;
+
+function StrToRect(const S: String): TRect;
+var
+ i: Integer;
+begin
+ Result := Rect(0, 0, 0, 0);
+ if S='' then Exit;
+ i := WordCount(S, [' ']);
+ Result.Left := MyStrToInt(ExtractWord(1, S, [' ']));
+ if i>1 then
+ Result.Top := MyStrToInt(ExtractWord(2, S, [' ']));
+ if i>2 then
+ Result.Right := MyStrToInt(ExtractWord(3, S, [' ']));
+ if i>3 then
+ Result.Bottom := MyStrToInt(ExtractWord(4, S, [' ']));
+end;
+
+function MyStrToInt(const S: String): Integer;
+var
+ St: String;
+begin
+ Result := 0;
+ if (S='') or (S='-') or (S='0') then Exit;
+ try
+ Result := StrToInt(S);
+ except
+ St := S;
+ while Pos('.', St)>0 do
+ St[Pos('.', St)] := ',';
+ try Result := Trunc(StrToFloat(St)); except end;
+ end;
+end;
+
+function MyStrToFloat(const S: String): Extended;
+var
+ St: String;
+ i: Integer;
+begin
+ Result := 0;
+ if (S='') or (S='-') or (S='0') then Exit;
+ St := S;
+ i := Pos('.', St);
+ if i>0 then
+ St[i] := ',';
+ try
+ Result := StrToFloat(St);
+ except
+ end;
+end;
+
+function VerifyBackSlash( const FileName:String ):String;
+begin
+ if FileName[Length(FileName)]='\' then
+ Result := FileName
+ else
+ Result := FileName + '\';
+end;
+
+function Long2Str(L : LongInt) : string;
+ {-Convert a long/word/integer/byte/shortint to a string}
+var
+ S : string;
+begin
+ Str(L, S);
+ Long2Str := S;
+end;
+
+{-----}
+
+ function WordCount(S : string; WordDelims : CharSet) : Integer;
+ {-Given a set of word delimiters, return number of words in S}
+ var
+ {I,} Count : Integer; {!!.12}
+ I, SLen : Word; {!!.12}
+ begin
+ Count := 0;
+ I := 1;
+ SLen:=Length(S);
+
+ while I <= SLen do begin
+ {skip over delimiters}
+ while (I <= SLen) and (S[I] in WordDelims) do
+ Inc(I);
+
+ {if we're not beyond end of S, we're at the start of a word}
+ if I <= SLen then
+ Inc(Count);
+
+ {find the end of the current word}
+ while (I <= SLen) and not(S[I] in WordDelims) do
+ Inc(I);
+ end;
+
+ WordCount := Count;
+ end;
+
+ function ExtractWord(N : Integer; S : string; WordDelims : CharSet) : string;
+ {-Given a set of word delimiters, return the N'th word in S}
+ var
+ I : Word; {!!.12}
+ Count, Len : Integer;
+ SLen : Longint;
+ Str : String;
+ begin
+ Count := 0;
+ I := 1;
+ Len := 0;
+ Str := '';
+ SLen := Length(S);
+
+// ExtractWord[0] := #0;
+
+ while (I <= SLen) and (Count <> N) do begin
+ {skip over delimiters}
+ while (I <= SLen) and (S[I] in WordDelims) do
+ Inc(I);
+
+ {if we're not beyond end of S, we're at the start of a word}
+ if I <= SLen then
+ Inc(Count);
+
+ {find the end of the current word}
+ while (I <= SLen) and not(S[I] in WordDelims) do begin
+ {if this is the N'th word, add the I'th character to Tmp}
+ if Count = N then begin
+ Inc(Len);
+ SetLength(Str, Len);
+// ExtractWord[0] := Char(Len);
+ Str[Len] := S[I];
+// ExtractWord[Len] := S[I];
+ end;
+
+ Inc(I);
+ end;
+ end;
+ ExtractWord := Str;
+ end;
+
+function SearchAndReplace( S, Old, New:String ):String;
+var
+ Ts : String;
+ i : Integer;
+begin
+ Ts := S;
+ i := Pos(Old, Ts);
+ while i>0 do begin
+ Delete(Ts, i, Length(Old));
+ Insert(New, Ts, i);
+ i := Pos(Old, Ts);
+ end;
+ SearchAndReplace := Ts;
+end;
+
+end.
diff --git a/Source/configureunit.dfm b/Source/configureunit.dfm
new file mode 100644
index 0000000..5a9e46d
--- /dev/null
+++ b/Source/configureunit.dfm
@@ -0,0 +1,157 @@
+object configure: Tconfigure
+ Left = 317
+ Top = 185
+ Width = 443
+ Height = 351
+ BorderWidth = 4
+ Caption = 'Configuration'
+ Color = clBtnFace
+ Font.Charset = DEFAULT_CHARSET
+ Font.Color = clWindowText
+ Font.Height = -11
+ Font.Name = 'MS Sans Serif'
+ Font.Style = []
+ OldCreateOrder = False
+ Position = poScreenCenter
+ OnCreate = FormCreate
+ PixelsPerInch = 96
+ TextHeight = 13
+ object PageControl1: TPageControl
+ Left = 0
+ Top = 0
+ Width = 427
+ Height = 275
+ ActivePage = TSConnections
+ Align = alClient
+ TabOrder = 0
+ object TSConnections: TTabSheet
+ Caption = 'Connections'
+ object Label1: TLabel
+ Left = 16
+ Top = 36
+ Width = 114
+ Height = 13
+ Caption = 'Host running Pure Data:'
+ end
+ object Label2: TLabel
+ Left = 16
+ Top = 60
+ Width = 95
+ Height = 13
+ Caption = 'Listen to Pd on port:'
+ end
+ object Label3: TLabel
+ Left = 16
+ Top = 84
+ Width = 103
+ Height = 13
+ Caption = 'Pd is listening on port:'
+ end
+ object Label4: TLabel
+ Left = 16
+ Top = 112
+ Width = 385
+ Height = 13
+ Caption =
+ 'NOTE: if you change the default ports, you need to modify fs.mai' +
+ 'n.pd accordingly.'
+ end
+ object Label5: TLabel
+ Left = 16
+ Top = 164
+ Width = 194
+ Height = 13
+ Caption = 'Listen to Framestein connections on port:'
+ end
+ object EditPdHost: TEdit
+ Left = 152
+ Top = 32
+ Width = 225
+ Height = 21
+ Ctl3D = True
+ ParentCtl3D = False
+ TabOrder = 0
+ Text = 'localhost'
+ end
+ object EditPdReceivePort: TEdit
+ Left = 152
+ Top = 56
+ Width = 225
+ Height = 21
+ Ctl3D = True
+ ParentCtl3D = False
+ TabOrder = 1
+ Text = '6001'
+ end
+ object EditPdSendPort: TEdit
+ Left = 152
+ Top = 80
+ Width = 225
+ Height = 21
+ Ctl3D = True
+ ParentCtl3D = False
+ TabOrder = 2
+ Text = '6002'
+ end
+ object EditFsPort: TEdit
+ Left = 224
+ Top = 160
+ Width = 153
+ Height = 21
+ Ctl3D = True
+ ParentCtl3D = False
+ TabOrder = 3
+ Text = '6010'
+ end
+ object CBEnableFSConns: TCheckBox
+ Left = 224
+ Top = 184
+ Width = 97
+ Height = 17
+ Caption = 'Enable'
+ TabOrder = 4
+ end
+ end
+ object TSGeneral: TTabSheet
+ Caption = 'General'
+ ImageIndex = 1
+ object CBDockMain: TCheckBox
+ Left = 16
+ Top = 36
+ Width = 377
+ Height = 17
+ Caption = 'Dock main window to Pd on connect'
+ TabOrder = 0
+ end
+ end
+ end
+ object Panel1: TPanel
+ Left = 0
+ Top = 275
+ Width = 427
+ Height = 41
+ Align = alBottom
+ BevelOuter = bvNone
+ TabOrder = 1
+ object ButtonOk: TButton
+ Left = 8
+ Top = 8
+ Width = 75
+ Height = 25
+ Caption = 'Ok'
+ Default = True
+ TabOrder = 0
+ OnClick = ButtonOkClick
+ end
+ object ButtonCancel: TButton
+ Left = 96
+ Top = 8
+ Width = 75
+ Height = 25
+ Cancel = True
+ Caption = 'Cancel'
+ TabOrder = 1
+ OnClick = ButtonCancelClick
+ end
+ end
+end
diff --git a/Source/configureunit.pas b/Source/configureunit.pas
new file mode 100644
index 0000000..88dff73
--- /dev/null
+++ b/Source/configureunit.pas
@@ -0,0 +1,120 @@
+unit configureunit;
+
+interface
+
+uses
+ Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
+ StdCtrls, ExtCtrls, ComCtrls;
+
+type
+ Tconfigure = class(TForm)
+ PageControl1: TPageControl;
+ TSConnections: TTabSheet;
+ Panel1: TPanel;
+ ButtonOk: TButton;
+ ButtonCancel: TButton;
+ Label1: TLabel;
+ EditPdHost: TEdit;
+ Label2: TLabel;
+ EditPdReceivePort: TEdit;
+ Label3: TLabel;
+ EditPdSendPort: TEdit;
+ Label4: TLabel;
+ Label5: TLabel;
+ EditFsPort: TEdit;
+ CBEnableFSConns: TCheckBox;
+ TSGeneral: TTabSheet;
+ CBDockMain: TCheckBox;
+ procedure ButtonCancelClick(Sender: TObject);
+ procedure ButtonOkClick(Sender: TObject);
+ procedure FormCreate(Sender: TObject);
+ private
+ { Private declarations }
+ public
+ { Public declarations }
+ procedure Execute;
+ end;
+
+var
+ configure: Tconfigure;
+
+implementation
+
+uses
+ Registry,
+ mainunit;
+
+{$R *.DFM}
+
+procedure Tconfigure.ButtonOkClick(Sender: TObject);
+var
+ Reg: TRegistry;
+begin
+ Reg := TRegistry.Create;
+ Reg.RootKey := HKEY_CURRENT_USER;
+
+ main.PdHost := EditPdHost.Text;
+ main.PdReceivePort := StrToInt(EditPdReceivePort.Text);
+ main.PdSendPort := StrToInt(EditPdSendPort.Text);
+ main.FSPort := StrToInt(EditFsPort.Text);
+ main.EnableFSConns := CBEnableFSConns.Checked;
+ main.DockMain := CBDockMain.Checked;
+
+ try
+ if Reg.OpenKey('\Software\Framestein', True) then begin
+ Reg.WriteString('PdHost', main.PdHost);
+ Reg.WriteInteger('PDReceivePort', main.PDReceivePort);
+ Reg.WriteInteger('PDSendPort', main.PDSendPort);
+ Reg.WriteInteger('FSPort', main.FSPort);
+ Reg.WriteBool('EnableFSConns', main.EnableFSConns);
+ Reg.WriteBool('DockMain', main.DockMain);
+ end;
+ except
+ end;
+
+ Reg.CloseKey;
+ Reg.Free;
+
+ main.ss1.Active := False;
+ main.ss1.Port := main.PDReceivePort;
+ main.ss1.Active := True;
+
+ main.csToPd.Active := False;
+ main.csToPd.Host := main.PdHost;
+ main.csToPd.Port := main.PdSendPort;
+ main.csToPd.Active := True;
+
+ main.ssfs.Active := False;
+ main.ssfs.Port := main.FSPort;
+ main.ssfs.Active := main.EnableFSConns;
+
+ ModalResult := mrOk;
+end;
+
+procedure Tconfigure.ButtonCancelClick(Sender: TObject);
+begin
+ ModalResult := mrCancel;
+end;
+
+procedure Tconfigure.Execute;
+begin
+ // load values from main
+ EditPdHost.Text := main.PdHost;
+ if EditPdHost.Text='' then EditPdHost.Text:='localhost';
+ EditPdReceivePort.Text := IntToStr(main.PdReceivePort);
+ EditPdSendPort.Text := IntToStr(main.PdSendPort);
+ EditFsPort.Text := IntToStr(main.FSPort);
+ CBEnableFSConns.Checked := main.EnableFSConns;
+ CBDockMain.Checked := main.DockMain;
+ // show
+ ShowModal;
+end;
+
+procedure Tconfigure.FormCreate(Sender: TObject);
+begin
+ if main.RunConfig then
+ Execute;
+end;
+
+end.
+
diff --git a/Source/dc.inc b/Source/dc.inc
new file mode 100644
index 0000000..a90d6f3
--- /dev/null
+++ b/Source/dc.inc
@@ -0,0 +1,42 @@
+{$O+,A+,W-,R-,Q-,B-,X+,T-,P+,H+,J+,C-}
+
+//--------------- Dream Company section ----------------------------
+
+{$IFDEF VER93}
+{$DEFINE BCB}
+{$DEFINE CPB1}
+{$ENDIF}
+
+{$IFNDEF VER80}
+ {$IFNDEF VER90}
+ {$IFNDEF VER93}
+ {$IFDEF VER110}
+ {$DEFINE CPB3} { C++ Builder 3.0 or higher}
+ {$DEFINE BCB}
+ {$ENDIF}
+ {$DEFINE D3} { Delphi 3.0 or higher }
+ {$ENDIF}
+ {$ENDIF}
+{$ENDIF}
+
+{$IFDEF VER120}
+ {$DEFINE D4}
+ {$DEFINE D3}
+ {$DEFINE CPB3}
+{$ENDIF}
+
+{$IFDEF VER125}
+{$DEFINE CPB4}
+{$DEFINE D4}
+{$DEFINE D3}
+{$DEFINE CPB3}
+{$DEFINE BCB}
+{$ENDIF}
+
+{$IFDEF VER130}
+{$DEFINE CPB4}
+{$DEFINE D4}
+{$DEFINE D3}
+{$DEFINE CPB3}
+{$DEFINE D5}
+{$ENDIF}
diff --git a/Source/effectsunit.pas b/Source/effectsunit.pas
new file mode 100644
index 0000000..791eeae
--- /dev/null
+++ b/Source/effectsunit.pas
@@ -0,0 +1,109 @@
+{ Copyright (C) 2001 Juha Vehviläinen
+ 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.}
+
+unit effectsunit;
+{This unit demonstrates how to work on the pixel level..
+
+ If you're adding an effect, all it takes is a couple of lines in
+ fsframeunit.pas to call your routine. Look for 'scramble' there
+ to see how.
+
+ If you're adding a new copymode, look for all occurences of
+ 'dsBlend' in fscopyunit.pas to see how to do that.
+
+ Also see everything in Framestein\Plugins-directory, you can write
+ effects and copymodes as plugins and never recompile framestein..
+ or touch the pascal code. This is likely the way I'll be doing them
+ from now on, to keep the program "core" as simple and small as possible..
+}
+
+interface
+
+uses
+ Windows, Messages, SysUtils, Classes, Graphics, DirectX, DXDraws;
+
+procedure scramble(const d: TDirectDrawSurface);
+procedure blend(const d1, d2: TDirectDrawSurface; const amount: Extended);
+
+implementation
+
+function ScanLine16(const sd: TDDSurfaceDesc; const y: Integer): Pointer;
+begin
+ Result := Pointer(Integer(sd.lpSurface) + y*sd.lPitch);
+end;
+
+procedure scramble(const d: TDirectDrawSurface);
+var
+ x,y: Integer;
+ p16: PWordArray;
+ sd: TDDSurfaceDesc;
+begin
+ if (d.Width=0) or (d.Height=0) then Exit;
+ d.Lock(sd);
+ case d.BitCount of
+ 16: for y:=0 to d.Height-1 do begin
+ p16 := ScanLine16(sd, y);
+ for x:=0 to d.Width-1 do
+ p16[x]:=random(16777216);
+ end;
+ end;
+ d.UnLock;
+end;
+
+function r16(color: cardinal): byte; register;
+begin;
+ result := (color shr 11) shl 3;
+end;
+
+function g16(color: cardinal): byte; register;
+begin;
+ result := ((color and 2016) shr 5) shl 2;
+end;
+
+function b16(color: cardinal): byte; register;
+begin;
+ result := (color and 31) shl 3;
+end;
+
+procedure blend(const d1, d2: TDirectDrawSurface; const amount: Extended);
+var
+ x, y, w, h: Integer;
+ p1, p2: PWordArray;
+ sd1, sd2: TDDSurfaceDesc;
+ c1,c2: cardinal;
+begin
+ if (d1.Width=0) or (d2.Width=0) or
+ (d1.BitCount<>16) or (d2.BitCount<>16) then Exit;
+ w := d1.Width;
+ h := d1.Height;
+ if d2.Width<w then w:=d2.Width;
+ if d2.Height<h then h:=d2.Height;
+
+ d1.Lock(sd1);
+ d2.Lock(sd2);
+ for y:=0 to h-1 do begin
+ p1:=ScanLine16(sd1, y);
+ p2:=ScanLine16(sd2, y);
+ for x:=0 to w-1 do begin
+ c1 := p1[x];
+ c2 := p2[x];
+ p2[x] :=
+ ((round((1-amount)*r16(c1)+amount*r16(c2)) shr 3) shl 11) or // r value shifted
+ ((round((1-amount)*g16(c1)+amount*g16(c2)) shr 2) shl 5) or // g value shifted
+ (round((1-amount)*b16(c1)+amount*b16(c2)) shr 3); // add blue
+ end;
+ end;
+ d1.UnLock;
+ d2.UnLock;
+end;
+
+end.
+
diff --git a/Source/fsDcAvi.pas b/Source/fsDcAvi.pas
new file mode 100644
index 0000000..889ed82
--- /dev/null
+++ b/Source/fsDcAvi.pas
@@ -0,0 +1,1615 @@
+{*******************************************************}
+{ }
+{ TDCAVIPlayer component }
+{ }
+{ Copyright (c) 1997-1999 Dream Company }
+{ http://www.dream-com.com }
+{ e-mail: contact@dream-com.com }
+{ }
+{*******************************************************}
+{Modified for Framestein, look for '_FS'}
+
+unit fsdcAVI;
+
+interface
+{$I dc.inc}
+uses
+ Windows, Messages, Graphics, Classes, Controls, mmSystem
+ {$IFNDEF D3},SysUtils{$ENDIF};
+
+const
+ WM_NEXTFRAME = WM_USER + 1;
+
+ cBufSize = 2048; {audio buffer size}
+ CAheadBuffers = 8;
+
+type
+ TAudioPlay = class
+ private
+ fBufferSize : integer;
+ fAVI : pointer;
+ fSampleSize : integer;
+ fEnd : integer;
+ fPlaying : boolean;
+ fWaveOut : HWAVEOUT;
+ fBegin : integer;
+ fCurrent : integer;
+
+ function OpenDevice(W : HWND; pAvi : pointer) : boolean;
+ function FillBuffer : boolean;
+ public
+ destructor Destroy; override;
+ procedure AudioPlayMessage(W : PWAVEHDR);
+ procedure Stop;
+ function Play(W : HWND; pAvi : Pointer; lStart, lEnd : longint) : boolean;
+ end;
+
+
+ TDCAVIPlayer = class(TCustomControl)
+ private
+ _dc : THandle;
+ fActive : boolean;
+ fAutoSize : boolean;
+ fCenter : boolean;
+ fFileName : string;
+ fOpen : boolean;
+ fRepetitions : integer;
+ fStartFrame : integer;
+ fStopFrame : integer;
+ fTransparent : boolean;
+ fSkipFrames : boolean;
+ fStretch : boolean;
+ fLength : integer;
+ fFrameWidth : integer;
+ fFrameHeight : integer;
+ fPlaySound : boolean;
+
+ fOnClose : TNotifyEvent;
+ fOnOpen : TNotifyEvent;
+ fOnStart : TNotifyEvent;
+ fOnStop : TNotifyEvent;
+
+ favifile : pointer;
+ faudiostream : pointer;
+ fvideostream : pointer;
+ fFrame : integer;
+ fTimer : THandle;
+ fgetframe : pointer;
+ fdrawing : boolean;
+ fdrawcontrol : integer;
+ ftempdc : THandle;
+ ftempbitmap : THandle;
+ foldbitmap : THandle;
+ frepeatcount : integer;
+ fdelay : integer;
+ fbackchanged : boolean;
+ fBlockChanges : boolean;
+ faudioplay : TAudioPlay;
+ hdrawdib : THandle;
+
+ fxstart : integer;
+ fystart : integer;
+ fofs : integer;
+ fxofs : integer;
+ fyofs : integer;
+ fiwidth : integer;
+ fiheight : integer;
+
+ procedure PlayNextFrame(var Msg : TMessage); message WM_NEXTFRAME;
+ procedure SaveBackground;
+ procedure AdjustControlsize;
+ procedure ShowRect;
+ procedure KillTempDC;
+ procedure HookWndProc;
+ procedure UnHookWndProc;
+ procedure MMWOM_DONE(var M:TMessage); message MM_WOM_DONE;
+ procedure PlayAudio(startframe, endframe : integer);
+ procedure CalcFrameLayout;
+ procedure DisplayChange(var Msg : TMessage); message WM_DISPLAYCHANGE;
+ procedure ValidateFrameNumber(var val : integer);
+ procedure UpdateFrameNumber;
+ function ZOrder : integer;
+ procedure StartDrawing;
+ function GetFrameRate: integer;
+ protected
+ procedure UpdateOtherAVIPlayers;
+ function PaintDisabled : boolean;
+ procedure CreateParams (var Params: TCreateParams); override;
+ procedure ShowFrame;
+ procedure WMPaint(var Msg : TWMPaint); message WM_PAINT;
+ procedure WMEraseBkgnd(var Msg : TMessage); message WM_ERASEBKGND;
+ procedure WMMove (var Msg : TMessage); message WM_MOVE;
+ procedure WMSize (var Msg : TMessage); message WM_SIZE;
+
+ procedure Loaded; override;
+ procedure SetActive (val : boolean); virtual;
+ procedure SetAutoSize (val : boolean); virtual;
+ procedure SetCenter (val : boolean); virtual;
+ procedure SetFileName (val : string); virtual;
+ procedure SetRepetitions (val : integer); virtual;
+ procedure SetStartFrame (val : integer); virtual;
+ procedure SetStopFrame (val : integer); virtual;
+ procedure SetTransparent (val : boolean); virtual;
+ procedure SetStretch (val : boolean); virtual;
+ procedure SetPlaySound(val : boolean); virtual;
+
+ procedure OpenFile; virtual;
+ procedure CloseFile; virtual;
+
+ procedure DoOpen; virtual;
+ procedure DoClose; virtual;
+ procedure DoStart; virtual;
+ procedure DoStop; virtual;
+ public
+ procedure DrawFrameToDC(dc : THandle); {_FS - This was private}
+ constructor Create (AOwner : TComponent); override;
+ destructor Destroy; override;
+ procedure Play (FromFrame, ToFrame: Word; Count: Integer);
+ procedure Reset;
+ procedure Seek (Frame : integer);
+ procedure Stop;
+
+ {_FS - add: property FrameRate}
+ property FrameRate : integer read GetFrameRate;
+ property FrameCount : integer read fLength;
+ property FrameHeight: Integer read FFrameHeight;
+ property FrameWidth : Integer read FFrameWidth;
+
+ property Open : boolean read fOpen;
+
+ published
+ property Active : boolean read fActive write SetActive default false;
+ property AutoSize : boolean read fAutoSize write SetAutoSize default true;
+ property Center : boolean read fCenter write SetCenter default true;
+ property FileName : string read fFileName write SetFileName;
+ property PlaySound : boolean read fPlaySound write SetPlaySound default true;
+ property Repetitions : integer read fRepetitions write SetRepetitions default 0;
+ property StartFrame : integer read fStartFrame write SetStartFrame default 1;
+ property StopFrame : integer read fStopFrame write SetStopFrame default 0;
+ property Stretch : boolean read fStretch write SetStretch default false;
+ property Transparent : boolean read fTransparent write SetTransparent default true;
+
+ property Position : integer read fFrame write Seek;
+
+ property OnOpen: TNotifyEvent read fOnOpen write fOnOpen;
+ property OnClose: TNotifyEvent read fOnClose write fOnClose;
+ property OnStart: TNotifyEvent read fOnStart write fOnStart;
+ property OnStop: TNotifyEvent read fOnStop write fOnStop;
+
+ property Align;
+ property Color;
+ property ParentColor;
+ property ParentShowHint;
+ property ShowHint;
+ property Visible;
+
+ property OnMouseDown;
+ property OnClick;
+ end;
+
+type
+ TAVIStream = record
+ fccType : longint;
+ fccHandler : longint;
+ dwFlags : longint;
+ dwCaps : longint;
+ wPriority : word;
+ wLanguage : word;
+ dwScale : longint;
+ dwRate : longint;
+ dwStart : longint;
+ dwLength : longint;
+ dwInitialFrames : longint;
+ dwSuggestedBufferSize : longint;
+ dwQuality : longint;
+ dwSampleSize : longint;
+ rcFrame : TRect;
+ dwEditCount : longint;
+ dwFormatChangeCount : longint;
+ Name : array [0..64] of char;
+ end;
+
+ PAVIStream = ^TAVIStream;
+
+ PAVIFile = pointer;
+
+ TAVIFileInfo = record
+ dwMaxBytesPerSec : longint; // max. transfer rate
+ dwFlags : longint; // the ever-present flags
+ dwCaps : longint;
+ dwStreams : longint;
+ dwSuggestedBufferSize : longint;
+
+ dwWidth : longint;
+ dwHeight : longint;
+
+ dwScale : longint;
+ dwRate : longint; // dwRate / dwScale == samples/second
+ dwLength : longint;
+
+ dwEditCount : longint;
+
+ szFileType : array[0..63] of char; // descriptive string for file type?
+ end;
+
+ PAVIFileInfo = ^TAVIFileInfo;
+
+ TAVIStreamInfo = record
+ fccType : longint;
+ fccHandler : longint;
+ dwFlags : longint; // Contains AVITF_* flags
+ dwCaps : longint;
+ wPriority : word;
+ wLanguage : word;
+ dwScale : longint;
+ dwRate : longint; // dwRate / dwScale == samples/second
+ dwStart : longint;
+ dwLength : longint; // In units above...
+ dwInitialFrames : longint;
+ dwSuggestedBufferSize : longint;
+ dwQuality : longint;
+ dwSampleSize : longint;
+ rcFrame : TRect;
+ dwEditCount : longint;
+ dwFormatChangeCount : longint;
+ szName : array[0..63] of char;
+ end;
+
+ PAVIStreamInfo = ^TAVIStreamInfo;
+
+
+//BeginSkipConst
+procedure AVIFileInit; stdcall; external 'avifil32.dll' name 'AVIFileInit';
+
+procedure AVIFileExit; stdcall; external 'avifil32.dll' name 'AVIFileExit';
+
+function AVIFileOpen(avifile : pointer; filename : pchar; mode : integer;
+ CLSID : pointer) : integer; stdcall; external 'avifil32.dll' name 'AVIFileOpen';
+
+function AVIFileRelease(avifile : pointer) : longint; stdcall; external 'avifil32.dll' name 'AVIFileRelease';
+
+function AVIFileGetStream(avifile : pointer; avistream : PAVIStream;
+ streamtype : longint; lParam : longint) : integer; stdcall; external 'avifil32.dll' name 'AVIFileGetStream';
+
+function AVIStreamGetFrameOpen(avistream : PAVIStream; bitmapwanted : pointer) : pointer; stdcall; external 'avifil32.dll' name 'AVIStreamGetFrameOpen';
+
+procedure AVIStreamGetFrameClose(pget : pointer); stdcall; external 'avifil32.dll' name 'AVIStreamGetFrameClose';
+
+function AVIStreamGetFrame(getframe : pointer; position : longint) : pointer; stdcall; external 'avifil32.dll' name 'AVIStreamGetFrame';
+
+function AVIStreamOpenFromFile(avistream : PAVIStream; filename : pchar;
+ streamtype : word; lParam : longint;
+ mode : longint; clsid : pointer) : integer; stdcall; external 'avifil32.dll' name 'AVIStreamOpenFromFile';
+
+procedure AVIStreamRelease(avistream : PAVIStream); stdcall; external 'avifil32.dll' name 'AVIStreamRelease';
+function AVIFileInfo(pfile : PAVIFile; pfi : PAVIFileInfo; lSize : longint) : integer; stdcall; external 'avifil32.dll' name 'AVIFileInfo';
+
+function AVIStreamInfo(pstream : PAVIStream; psi : PAVISTREAMINFO; lsize : longint) : integer; stdcall; external 'avifil32.dll' name 'AVIStreamInfo';
+function AVIStreamRead(pavi : PAVIStream; lStart, lSamples : longint;
+ lpBuffer : pointer; cbBuffer : longint;
+ plBytes, plSamples : pointer) : integer; stdcall; external 'avifil32.dll' name 'AVIStreamRead';
+
+function AVIStreamReadFormat(pavi : PAVIStream; lPos : longint;
+ lpFormat : pointer; lpcbFormat : pointer) : integer; stdcall; external 'avifil32.dll' name 'AVIStreamReadFormat';
+
+function AVIStreamBeginStreaming(pavi : PAVIStream; lStart, lEnd, lRate : longint) : integer; stdcall; external 'avifil32.dll' name 'AVIStreamBeginStreaming';
+function AVIStreamEndStreaming(pavi : PAVIStream) : integer; stdcall; external 'avifil32.dll' name 'AVIStreamEndStreaming';
+function AVIStreamStart(pavi : PAVIStream) : longint; stdcall; external 'avifil32.dll' name 'AVIStreamStart';
+function AVIStreamLength(pavi: PAVIStream) : longint; stdcall; external 'avifil32.dll' name 'AVIStreamLength';
+function AVIStreamSampleToTime(pavi : PAVIStream; lSample : longint) : longint; stdcall; external 'avifil32.dll' name 'AVIStreamSampleToTime';
+function AVIStreamTimeToSample(pavi : PAVIStream; Time : longint) : longint; stdcall; external 'avifil32.dll' name 'AVIStreamTimeToSample';
+
+function DrawDIBOpen : THandle; stdcall; external 'msvfw32.dll' name 'DrawDibOpen';
+procedure DrawDIBClose (h : THandle); stdcall; external 'msvfw32.dll' name 'DrawDibClose';
+procedure DrawDibDraw (hdib, dc : THandle; xDst, yDst, dxDst, dyDst : integer;
+ lpbi, lpBits : pointer; xSrc, ySrc, dxSrc, dySrc, wFlags : integer); stdcall; external 'msvfw32.dll' name 'DrawDibDraw';
+//EndSkipConst
+
+const
+ streamtypeAUDIO : longint = $73647561;
+ streamtypeVIDEO : longint = $73646976;
+
+ AVISTREAMREAD_CONVENIENT = -1;
+
+ DDF_HALFTONE = $1000;
+
+{-----------------------------------------------------------------------}
+
+implementation
+
+function Min(A, B: Integer): Integer;
+begin
+ if A < B then
+ Result := A
+ else
+ Result := B;
+end;
+
+function Max(A, B: Integer): Integer;
+begin
+ if A > B then
+ Result := A
+ else
+ Result := B;
+end;
+
+function RectWidth(const R: TRect): Integer;
+begin
+ with R do
+ Result := Right - Left;
+end;
+
+function RectHeight(const R: TRect): Integer;
+begin
+ with R do
+ Result := Bottom - Top;
+end;
+
+{$IFNDEF D3}
+function TransparentStretchBlt(DstDC: HDC; DstX, DstY, DstW, DstH: Integer;
+ SrcDC: HDC; SrcX, SrcY, SrcW, SrcH: Integer; MaskDC: HDC; MaskX,
+ MaskY: Integer): Boolean;
+const
+ ROP_DstCopy = $00AA0029;
+var
+ MemDC : THandle;
+ MemBmp : THandle;
+ Save : THandle;
+ crText : TColorRef;
+ crBack : TColorRef;
+begin
+ Result := True;
+ if (Win32Platform = VER_PLATFORM_WIN32_NT) and (SrcW = DstW) and (SrcH = DstH) then
+ begin
+ MemBmp := CreateCompatibleBitmap(SrcDC, 1, 1);
+ MemBmp := SelectObject(MaskDC, MemBmp);
+ MaskBlt(DstDC, DstX, DstY, DstW, DstH, SrcDC, SrcX, SrcY, MemBmp, MaskX,
+ MaskY, MakeRop4(ROP_DstCopy, SrcCopy));
+ MemBmp := SelectObject(MaskDC, MemBmp);
+ DeleteObject(MemBmp);
+ exit;
+ end;
+
+ MemDC := CreateCompatibleDC(0);
+ MemBmp := CreateCompatibleBitmap(SrcDC, SrcW, SrcH);
+ Save := SelectObject(MemDC, MemBmp);
+ StretchBlt(MemDC, 0, 0, SrcW, SrcH, MaskDC, MaskX, MaskY, SrcW, SrcH, SrcCopy);
+ StretchBlt(MemDC, 0, 0, SrcW, SrcH, SrcDC, SrcX, SrcY, SrcW, SrcH, SrcErase);
+ crText := SetTextColor(DstDC, $0);
+ crBack := SetBkColor(DstDC, $FFFFFF);
+ StretchBlt(DstDC, DstX, DstY, DstW, DstH, MaskDC, MaskX, MaskY, SrcW, SrcH, SrcAnd);
+ StretchBlt(DstDC, DstX, DstY, DstW, DstH, MemDC, 0, 0, SrcW, SrcH, SrcInvert);
+ SetTextColor(DstDC, crText);
+ SetTextColor(DstDC, crBack);
+ SelectObject(MemDC, Save);
+ DeleteObject(MemBmp);
+ DeleteDC(MemDC);
+end;
+{$ENDIF}
+
+Procedure TransparentBitBltEx(sourcedc, destdc: THandle; SrcRect,DstRect: TRect;
+ atranscolor: longint);
+Var
+ monobitmap: THandle;
+ oldbkcolor: longint;
+ monodc: THandle;
+ width: integer;
+ height: integer;
+ oldbitmap: THandle;
+Begin
+ With SrcRect do
+ Begin
+ width := RectWidth(SrcRect);
+ height := RectHeight(SrcRect);
+ monodc := CreateCompatibleDC(sourcedc);
+ monobitmap := CreateCompatibleBitmap(monodc, width, height);
+ oldbitmap := SelectObject(monodc, monobitmap);
+ Try
+ oldbkcolor := SetBkColor(sourcedc, atranscolor);
+ BitBlt(monodc, 0, 0, width, height, sourcedc, Left, Top, SRCCOPY);
+ SetBkColor(sourcedc, oldbkcolor);
+ TransparentStretchBlt(destdc, DstRect.Left, DstRect.Top, RectWidth(DstRect),
+ RectHeight(DstRect), SourceDC, left, top, width, height, monodc, 0, 0);
+ Finally
+ SelectObject(monodc, oldbitmap);
+ DeleteDC(monodc);
+ DeleteObject(monobitmap);
+ End;
+ End;
+End;
+
+Procedure TransparentBitBlt(sourcedc, destdc: THandle; arect: TRect;
+ atranscolor: longint; aoriginX,aoriginY: Integer);
+begin
+ TransparentBitBltEx(sourcedc, destdc,arect,
+ Rect(aoriginX,aoriginY,aoriginX+RectWidth(arect),aoriginY+RectHeight(arect)),
+ atranscolor);
+end;
+
+Function GetTransparentColor(dc: THandle; const arect: TRect): longint;
+Begin
+ Result := GetPixel(dc, arect.left, arect.bottom);
+End;
+
+{-----------------------------------------------------------------------}
+
+function AVIStreamEnd (pavi : PAVIStream) : longint;
+begin
+ result := AVIStreamStart(pavi) + AVIStreamLength(pavi);
+end;
+
+{-----------------------------------------------------------------------}
+
+function AVIStreamFormatSize (pavi : PAVIStream; lPos : longint; plSize : pointer) : longint;
+begin
+ result := AVIStreamReadFormat(pavi, lPos, nil, plSize);
+end;
+
+{-----------------------------------------------------------------------}
+
+constructor TDCAVIPlayer.Create (AOwner : TComponent);
+begin
+ inherited Create(AOwner);
+ width := 100;
+ height := 50;
+
+ fAutoSize := true;
+ fCenter := true;
+ fStartFrame := 1;
+ fTransparent := true;
+ fSkipFrames := true;
+ fAutoSize := true;
+ fBackChanged := true;
+ fblockchanges := true;
+ fPlaySound := true;
+
+ AVIFileInit;
+ faudioplay := TAudioPlay.Create;
+ HookWndProc;
+ hdrawdib := DrawDIBOpen;
+end;
+
+{------------------------------------------------------------------}
+
+destructor TDCAVIPlayer.Destroy;
+begin
+ Stop;
+ UnHookWndProc;
+ DrawDIBClose(hdrawdib);
+ KillTempDC;
+ CloseFile;
+ faudioplay.Free;
+ AVIFileExit;
+ inherited Destroy;
+end;
+
+{------------------------------------------------------------------}
+
+procedure TDCAVIPlayer.CreateParams(var Params: TCreateParams);
+begin
+ inherited CreateParams(Params);
+ Params.ExStyle := Params.ExStyle or WS_EX_TRANSPARENT;
+end;
+
+{------------------------------------------------------------------}
+
+function TDCAVIPlayer.ZOrder : integer;
+begin
+ if Parent <> nil then
+ with Parent do
+ for result := 0 to ControlCount - 1 do
+ if Controls[result] = self then
+ exit;
+
+ result := -1
+end;
+
+{------------------------------------------------------------------}
+
+procedure Timer(uID, uMsg, dwUser, dw1, dw2 : longint); stdcall;
+begin
+ PostMessage(TDCAVIPlayer(dwUser).Handle, WM_NEXTFRAME, 0, 0);
+end;
+
+{------------------------------------------------------------------}
+
+procedure TDCAVIPlayer.PlayAudio(startframe, endframe : integer);
+var
+ astart : integer;
+ aend : integer;
+begin
+ if (faudiostream = nil) or not fPlaySound then
+ exit;
+
+ astart := AVIStreamTimeToSample(faudiostream, AVIStreamSampleToTime(fvideostream, startFrame));
+ aend := AVIStreamTimeToSample(faudiostream, AVIStreamSampleToTime(fvideostream, endFrame));
+ faudioplay.play(handle, faudiostream, astart, aend);
+end;
+
+{------------------------------------------------------------------}
+
+procedure TDCAVIPlayer.Play (FromFrame, ToFrame: Word; Count: Integer);
+var
+ info : TAVIStreamInfo;
+ ainfo : TAVIStreamInfo;
+begin
+ Stop;
+ if not Assigned(fvideostream) then
+ exit;
+
+ fFrame := FromFrame;
+ fStartFrame := FromFrame;
+ fStopFrame := ToFrame;
+ frepeatCount := Count;
+ AVIStreamInfo(fvideostream, @info, sizeof(info));
+ fdelay := MulDiv(info.dwScale, 1000, info.dwRate);
+
+ DoStart;
+ fActive := true;
+ if Assigned(faudiostream) then
+ begin
+ AVIStreamInfo(fvideostream, @ainfo, sizeof(info));
+ PlayAudio(fFrame, fStopFrame);
+ end;
+
+ fTimer := timeSetEvent(fdelay, 0, @Timer, integer(self), TIME_PERIODIC);
+end;
+
+{------------------------------------------------------------------}
+
+procedure TDCAVIPlayer.Stop;
+begin
+ if ftimer <> 0 then
+ begin
+ timeKillEvent(fTimer);
+ fTimer := 0;
+ end;
+
+ if not fActive then
+ exit;
+
+ faudioplay.stop;
+ fActive := false;
+ DoStop;
+ ShowFrame;
+end;
+
+{------------------------------------------------------------------}
+
+procedure TDCAVIPlayer.Seek (Frame : integer);
+begin
+ if Frame = fFrame then
+ exit;
+
+ Stop;
+ ValidateFrameNumber(Frame);
+ fFrame := Frame;
+ Invalidate;
+end;
+
+{------------------------------------------------------------------}
+
+procedure TDCAVIPlayer.Loaded;
+var
+ _startframe : integer;
+ _stopframe : integer;
+begin
+ inherited Loaded;
+
+ if ffilename <> '' then
+ begin
+ fBlockChanges := false;
+ _startframe := fstartframe;
+ _stopframe := fStopFrame;
+ OpenFile;
+ fstartframe := _startframe;
+ fStopFrame := _stopframe;
+ fBlockChanges := true;
+ end;
+
+
+ if fActive then
+ if fOpen then
+ Play(fStartFrame, fStopFrame, fRepetitions)
+ else
+ fActive := false;
+
+end;
+
+{------------------------------------------------------------------}
+
+procedure TDCAVIPlayer.SetActive(val : boolean);
+begin
+ if val = fActive then
+ exit;
+
+ if not (csReading in ComponentState) then
+ if val then
+ begin
+ Play(fStartFrame, fStopFrame, fRepetitions)
+ end
+ else
+ begin
+ Stop;
+ if csDesigning in ComponentState then
+ begin
+ fFrame := 0;
+ ShowFrame;
+ end;
+ end;
+
+end;
+
+{------------------------------------------------------------------}
+
+procedure TDCAVIPlayer.SetAutoSize(val : boolean);
+begin
+ if val = fAutoSize then
+ exit;
+
+ fAutoSize := val;
+ AdjustControlsize;
+end;
+
+{------------------------------------------------------------------}
+
+procedure TDCAVIPlayer.SetCenter(val : boolean);
+begin
+ if val = fCenter then
+ exit;
+
+ fCenter := val;
+ if not fTransparent then
+ Invalidate;
+
+ ShowFrame;
+end;
+
+{------------------------------------------------------------------}
+
+procedure TDCAVIPlayer.SetFileName(val : string);
+var
+ wasactive : boolean;
+begin
+ if val = fFileName then
+ exit;
+
+ ffilename := val;
+ if csReading in ComponentState then
+ exit;
+
+ wasactive := fActive;
+
+ Reset;
+
+ Invalidate;
+ ShowFrame;
+
+ if val = '' then
+ begin
+ fbackchanged := true;
+ Parent.Invalidate;
+ UpdateWindow(Parent.Handle);
+ end;
+
+ if wasActive then
+ if not (csReading in ComponentState) then
+ Active := true
+ else
+ fActive := true;
+end;
+
+{------------------------------------------------------------------}
+
+procedure TDCAVIPlayer.SetRepetitions(val : integer);
+begin
+ if val = fRepetitions then
+ exit;
+
+ fRepetitions := val;
+ if csDesigning in ComponentState then
+ begin
+ Stop;
+ fFrame := 0;
+ ShowFrame;
+ end;
+end;
+
+{------------------------------------------------------------------}
+
+procedure TDCAVIPlayer.ValidateFrameNumber(var val : integer);
+begin
+ if fOpen then
+ if val > fLength - 1 then
+ val := fLength - 1
+ else
+ if val < 0 then
+ val := 0;
+end;
+
+{------------------------------------------------------------------}
+
+procedure TDCAVIPlayer.SetStartFrame(val : integer);
+begin
+ if (val = fStartFrame) then
+ exit;
+
+ ValidateFrameNumber(val);
+ fStartFrame := val;
+end;
+
+{------------------------------------------------------------------}
+
+procedure TDCAVIPlayer.SetStopFrame(val : integer);
+begin
+ if val = fStopFrame then
+ exit;
+
+ ValidateFrameNumber(val);
+ fStopFrame := val;
+end;
+
+{------------------------------------------------------------------}
+
+procedure TDCAVIPlayer.SetTransparent(val : boolean);
+begin
+ if val = fTransparent then
+ exit;
+
+ fTransparent := val;
+ Invalidate;
+ ShowFrame;
+end;
+
+{------------------------------------------------------------------}
+
+procedure TDCAVIPlayer.SetStretch (val : boolean);
+begin
+ if val = fStretch then
+ exit;
+
+ fStretch := val;
+ if not (csReading in ComponentState) then
+ begin
+ if not val then
+ invalidate;
+
+ if not fActive then
+ ShowFrame;
+ end;
+end;
+
+{------------------------------------------------------------------}
+
+procedure TDCAVIPlayer.SetPlaySound (val : boolean);
+begin
+ if val = fPlaySound then
+ exit;
+
+ fPlaySound := val;
+ if fActive then
+ if val then
+ PlayAudio(fFrame, fStopFrame)
+ else
+ faudioplay.Stop;
+end;
+
+{------------------------------------------------------------------}
+
+procedure TDCAVIPlayer.AdjustControlsize;
+var
+ info : TAVIStreamInfo;
+ r : TRect;
+ r2 : TRect;
+ i : integer;
+ crect : TRect;
+begin
+ if fautosize and fOpen then
+ begin
+ AVIStreamInfo(fvideostream, @info, sizeof(info));
+ if fblockchanges then
+ Parent.Perform(WM_SETREDRAW, 0, 0);
+ r := Rect(left, top, left + width, top + height);
+ with info.rcframe do
+ SetBounds(self.left, self.top, right - left, bottom - top);
+ if fblockchanges then
+ begin
+ Parent.Perform(WM_SETREDRAW, 1, 0);
+ r2 := Rect(left, top, left + width, top + height);
+ SubtractRect(r, r, r2);
+ InvalidateRect(Parent.Handle, @r, true);
+ with Parent do
+ for i := 0 to ControlCount - 1 do
+ begin
+ with Controls[i] do
+ crect := Rect(left, top, left + width, top + height);
+
+ if (Controls[i] is TWinControl) and (Controls[i] <> self) and
+ InterSectRect(r2, r, crect) then
+ Controls[i].Invalidate;
+ end;
+ end;
+ end;
+end;
+
+{------------------------------------------------------------------}
+
+procedure TDCAVIPlayer.OpenFile;
+var
+ info : TAVIStreamInfo;
+begin
+ if ffilename = '' then
+ exit;
+
+ if (AVIFileOpen(@favifile, @(ffilename[1]), 0, nil) <> 0) then
+ exit;
+
+ if (AVIFileGetStream(favifile, @fvideostream, streamtypeVIDEO, 0) <> 0) then
+ begin
+ AVIFileRelease(favifile);
+ exit;
+ end;
+
+ fgetframe := AVIStreamGetFrameOpen(fvideostream, nil);
+
+ if fgetframe = nil then
+ begin
+ AVIStreamRelease(fvideostream);
+ AVIFileRelease(favifile);
+ exit;
+ end;
+
+ AVIFileGetStream(favifile, @faudiostream, streamtypeAUDIO, 0);
+
+ AVIStreamInfo(fvideostream, @info, sizeof(info));
+ with info do
+ begin
+ fLength := dwlength;
+ fFrameWidth := rcframe.right - rcframe.left;
+ fFrameHeight := rcframe.bottom - rcframe.top;
+ fStartFrame := dwStart;
+ fStopFrame := fLength - 1;
+ end;
+ fFrame := fStartFrame;
+ fOpen := true;
+ SetWindowLong(handle, GWL_EXSTYLE, GetWindowLong(handle, GWL_EXSTYLE) and (not WS_EX_TRANSPARENT));
+ AdjustControlsize;
+ fbackchanged := true;
+ Invalidate;
+{ ShowFrame;
+ Parent.Invalidate;}
+ DoOpen;
+end;
+
+{------------------------------------------------------------------}
+
+procedure TDCAVIPlayer.CloseFile;
+begin
+ if not fOpen then
+ exit;
+
+ if fActive then
+ Stop;
+
+ if Assigned(fgetframe) then
+ AVIStreamGetFrameClose(fgetframe);
+
+ if Assigned(faudiostream) then
+ AVIStreamRelease(faudiostream);
+
+ if Assigned(fvideostream) then
+ AVIStreamRelease(fvideostream);
+
+ if Assigned(favifile) then
+ AVIFileRelease(favifile);
+
+ faudiostream := nil;
+ fvideostream := nil;
+ favifile := nil;
+ fgetframe := nil;
+ fOpen := false;
+ fLength := 0;
+ DoClose;
+end;
+
+{------------------------------------------------------------------}
+
+procedure TDCAVIPlayer.CalcFrameLayout;
+begin
+ fxstart := 0;
+ fystart := 0;
+ if csDesigning in ComponentState then
+ fofs := 1
+ else
+ fofs := 0;
+
+ if fOpen then
+ begin
+ fiwidth := FrameWidth;
+ fiheight := FrameHeight;
+ end
+ else
+ begin
+ fiwidth := self.width;
+ fiheight := self.height;
+ end;
+
+ if not Stretch and fCenter then
+ begin
+ fxstart := (self.width - fiwidth) div 2;
+ fystart := (self.height - fiheight) div 2;
+ end;
+
+ if not Transparent then
+ begin
+ if fxstart > 0 then
+ fxofs := 0
+ else
+ fxofs := fofs;
+
+ if fystart > 0 then
+ fyofs := 0
+ else
+ fyofs := fofs;
+ end;
+end;
+
+{------------------------------------------------------------------}
+
+procedure TDCAVIPlayer.StartDrawing;
+begin
+ fdrawing := true;
+ fdrawcontrol := ZOrder;
+end;
+
+{------------------------------------------------------------------}
+
+procedure TDCAVIPlayer.DrawFrameToDC(dc : THandle);
+var
+ memdc : THandle;
+ formdc : THandle;
+ image : pointer;
+ imagestart : integer;
+ bitmap : THandle;
+ fbitmap : THandle;
+ oldmemobject : THandle;
+ oldfobject : THandle;
+ width : integer;
+ height : integer;
+
+begin
+{_FS - We're not using your window anyway...}
+// if PaintDisabled then
+// exit;
+
+ if fTransparent and (fBackChanged or not fActive) then
+ begin
+ SaveBackGround;
+ fBackChanged := false;
+ end;
+
+ StartDrawing;
+ memdc := CreateCompatibleDC(dc);
+ formdc := CreateCompatibleDC(dc);
+ try
+ image := AVIStreamGetFrame(fgetframe, fFrame);
+ CalcFrameLayout;
+
+ if fStretch then
+ begin
+ width := self.width;
+ height := self.height;
+ end
+ else
+ begin
+ width := fiwidth;
+ height := fiheight;
+ end;
+
+ imagestart := 0;
+
+ if Assigned(image) then
+ begin
+ SetStretchBltMode(memdc, HALFTONE);
+ imagestart := TBitmapInfoHeader(image^).biSize + TBitmapInfoHeader(image^).biClrUsed * 4;
+ end;
+
+ if fTransparent then
+ begin
+ bitmap := CreateCompatibleBitmap(dc, width, height);
+ oldmemobject := SelectObject(memdc, bitmap);
+
+ StretchDIBits(memdc, 0, 0, width, height, 0, 0, fiwidth, fiheight, pchar(image) + imagestart,
+ TBitmapInfo(image^), 0, SRCCOPY);
+
+ fbitmap := CreateCompatibleBitmap(dc, self.width, self.height);
+ oldfobject := SelectObject(formdc, fbitmap);
+
+ BitBlt(formdc, 0, 0, self.width, self.height, ftempdc, 0, 0, SRCCOPY);
+
+ if Assigned(image) then
+ TransparentBitBlt(memdc, formdc, Rect(0, 0, width, height),
+ GetTransparentColor(memdc, Rect(0, 0, width - 1, height - 1)),
+ fxstart, fystart);
+
+ BitBlt(dc, fofs, fofs, self.width - fofs * 2, self.height - fofs * 2, formdc, fofs, fofs, SRCCOPY);
+
+ SelectObject(formdc, oldfobject);
+ DeleteObject(fbitmap);
+ SelectObject(memdc, oldmemobject);
+ DeleteObject(bitmap);
+ end
+ else
+ DrawDibDraw(hdrawdib, dc, fxstart, fystart, width - fxofs * 2, height - fyofs * 2,
+ image, pchar(image) + imagestart, 0, 0, fiwidth, fiheight, DDF_HALFTONE);
+
+ finally
+ DeleteDC(memdc);
+ DeleteDC(formdc);
+ fdrawing := false;
+ end;
+end;
+
+{------------------------------------------------------------------}
+
+function TDCAVIPlayer.PaintDisabled : boolean;
+begin
+ result := fDrawing or ([csReading, csLoading] * ComponentState <> []) or (Parent = nil)
+ or ([csReading, csLoading] * Parent.ComponentState <> [])
+ or not HandleAllocated or not ({_FS-visible or }(csDesigning in ComponentState));
+end;
+
+{------------------------------------------------------------------}
+
+procedure TDCAVIPlayer.ShowFrame;
+var
+ dc : THandle;
+ brush : THandle;
+begin
+ if PaintDisabled then
+ exit;
+
+ if _dc = 0 then
+ dc := GetDC(handle)
+ else
+ dc := _dc;
+
+ if not (fTransparent or fOpen) then
+ begin
+ brush := CreateSolidBrush(ColorToRGB(Color));
+ FillRect(dc, ClientRect, brush);
+ DeleteObject(brush);
+ end
+ else
+ DrawFrameToDC(dc);
+
+ if _dc = 0 then
+ ReleaseDC(handle, dc);
+
+ ShowRect;
+end;
+
+{------------------------------------------------------------------}
+
+procedure TDCAVIPlayer.UpdateFrameNumber;
+begin
+ if (fFrame >= fStopFrame) then
+ begin
+ if frepeatcount > 0 then
+ begin
+ dec(fRepeatCount);
+ if fRepeatCount = 0 then
+ begin
+ Stop;
+ exit;
+ end;
+ end;
+
+ fFrame := fStartFrame - 1;
+ PlayAudio(fStartFrame, fStopFrame);
+ end;
+end;
+
+{------------------------------------------------------------------}
+
+procedure TDCAVIPlayer.UpdateOtherAVIPlayers;
+var
+ r : TRect;
+ i : integer;
+begin
+ with Parent do
+ for i := ControlCount - 1 downto 0 do
+ begin
+ if (Controls[i] = self) then
+ break;
+
+ if (Controls[i].Visible) and (Controls[i] is TDCAVIPlayer) then
+ with TDCAVIPlayer(Controls[i]) do
+ if [csDestroying, csLoading] * ComponentState = [] then
+ begin
+ fbackchanged := true;
+ r := ClientRect;
+ InvalidateRect(Handle, @r, true);
+ end;
+ end;
+end;
+
+{------------------------------------------------------------------}
+
+procedure TDCAVIPlayer.PlayNextFrame(var Msg : TMessage);
+begin
+ UpdateFrameNumber;
+ inc(fFrame);
+ if fActive and not fDrawing then
+ begin
+ ShowFrame;
+ UpdateOtherAVIPlayers;
+ end;
+end;
+
+{------------------------------------------------------------------}
+
+procedure TDCAVIPlayer.SaveBackground;
+var
+ dc : THandle;
+ formdc : THandle;
+ oldfbitmap : THandle;
+ fbitmap : THandle;
+ fdc : THandle;
+begin
+ if Parent = nil then
+ exit;
+
+ StartDrawing;
+ dc := GetDC(handle);
+ fdc := GetDC(parent.handle);
+ formdc := CreateCompatibleDC(fdc);
+ fbitmap := CreateCompatibleBitmap(fdc, parent.width, parent.height);
+ oldfbitmap := SelectObject(formdc, fbitmap);
+
+ if ftempdc = 0 then
+ begin
+ ftempdc := CreateCompatibleDC(dc);
+ ftempbitmap := CreateCompatibleBitmap(dc, width, height);
+ foldbitmap := SelectObject(ftempdc, ftempbitmap);
+ end;
+ IntersectClipRect(formdc, left, top, left + width + 1, top + height + 1);
+
+
+ with parent do
+ PaintTo(formdc, 0, 0);
+
+ SetViewPortOrgEx(formDC, 0, 0, nil);
+ BitBlt(ftempdc, 0, 0, width, height, formdc, left + 1, top + 1, SRCCOPY);
+ SelectObject(formdc, oldfbitmap);
+ DeleteObject(fbitmap);
+ DeleteDC(formdc);
+ ReleaseDC(Parent.Handle, fdc);
+ ReleaseDC(handle, dc);
+
+ fdrawing := false;
+end;
+
+{------------------------------------------------------------------}
+
+procedure TDCAVIPlayer.WMPaint(var Msg : TWMPaint);
+var
+ ps : TPaintStruct;
+begin
+ _dc := Msg.DC;
+ if _dc = 0 then
+ _dc := BeginPaint(handle, ps);
+
+ try
+ Msg.result := 0;
+
+{ if name = 'DCAVIPlay3' then
+ asm nop end;}
+
+ ShowFrame;
+
+ finally
+ if Msg.DC = 0 then
+ EndPaint(handle, ps);
+ _dc := 0;
+ end;
+end;
+
+{------------------------------------------------------------------}
+
+procedure TDCAVIPlayer.WMEraseBkgnd(var Msg : TMessage);
+var
+ brush : THandle;
+ r : TRect;
+ dc : THandle;
+ width : integer;
+ height : integer;
+begin
+ if PaintDisabled then
+ exit;
+
+ if not (fTransparent or fStretch) then
+ begin
+ CalcFrameLayout;
+ if fStretch then
+ begin
+ width := self.width;
+ height := self.height;
+ end
+ else
+ begin
+ width := fiwidth;
+ height := fiheight;
+ end;
+
+ dc := GetDC(handle);
+ brush := CreateSolidBrush(ColorToRGB(Color));
+ r := rect(fofs, fofs, self.width, fystart);
+ FillRect(dc, r, brush);
+
+ r := rect(fofs, fystart, fxstart, self.height);
+ FillRect(dc, r, brush);
+
+ r := rect(fxstart, fystart + height, self.width - fofs * 2, self.height - fofs * 2);
+ FillRect(dc, r, brush);
+
+ r := rect(fxstart + width, fystart, self.width - fofs * 2, fystart + height);
+ FillRect(dc, r, brush);
+
+ DeleteObject(brush);
+ ReleaseDC(handle, dc);
+ end;
+end;
+
+{------------------------------------------------------------------}
+
+procedure TDCAVIPlayer.WMMove (var Msg : TMessage);
+begin
+ inherited;
+ fbackchanged := true;
+ ShowFrame;
+ UpdateOtherAVIPlayers;
+end;
+
+{------------------------------------------------------------------}
+
+procedure TDCAVIPlayer.KillTempDC;
+begin
+ if ftempdc <> 0 then
+ begin
+ SelectObject(ftempdc, foldbitmap);
+ DeleteObject(ftempbitmap);
+ DeleteDC(ftempdc);
+ ftempdc := 0;
+ end;
+end;
+
+{------------------------------------------------------------------}
+
+procedure TDCAVIPlayer.WMSize (var Msg : TMessage);
+begin
+ StartDrawing;
+ KillTempDC;
+ inherited;
+ fBackChanged := true;
+ fdrawing := false;
+ AdjustControlsize;
+ if not Active then
+ ShowFrame;
+ UpdateOtherAVIPlayers;
+end;
+
+{------------------------------------------------------------------}
+
+procedure TDCAVIPlayer.ShowRect;
+var
+ DC : THandle;
+ Pen : THandle;
+ SavePen : THandle;
+ SaveBrush : THandle;
+begin
+ if not (csDesigning in ComponentState) then
+ exit;
+
+ dc := GetDC(Handle);
+ Pen := CreatePen(PS_DOT, 1, clBlack);
+ SavePen := SelectObject(dc, Pen);
+ SaveBrush := SelectObject(dc, GetStockobject(HOLLOW_BRUSH));
+ Rectangle(dc, 0, 0, width, height);
+ SelectObject(DC, SavePen);
+ DeleteObject(Pen);
+ SelectObject(DC, SaveBrush);
+ ReleaseDC(Handle, DC);
+end;
+
+{------------------------------------------------------------------}
+
+var
+ WHook : HHook;
+ hooks : TList;
+
+type TCWPStruct = packed record
+ lParam : LPARAM;
+ wParam : WPARAM;
+ message : integer;
+ wnd : HWND;
+end;
+
+function CallWndProcHook(nCode : integer; wParam : Longint; var Msg : TCWPStruct) : longint; stdcall;
+var
+ i : integer;
+ r : TRect;
+ r2 : TRect;
+
+ function IsPaintMsg : boolean;
+ var
+ c : TWinControl;
+ begin
+ result := false;
+ c := FindControl(msg.wnd);
+ if (c <> nil) and not (c is TDCAVIPlayer) and
+ TDCAVIPlayer(hooks[i]).HandleAllocated and
+ (TDCAVIPlayer(hooks[i]).owner = c.owner) or
+ (TDCAVIPlayer(hooks[i]).owner = c) then
+ begin
+ GetWindowRect(msg.wnd , r);
+ GetWindowRect(TDCAVIPlayer(hooks[i]).handle, r2);
+ result := IntersectRect(r, r, r2);
+ end;
+ end;
+
+begin
+ Result := CallNextHookEx(WHook, nCode, wParam, Longint(@Msg));
+
+ if ((msg.message > CN_BASE) and (msg.message < CN_BASE + 500)) or
+ (msg.message = WM_PAINT) or (msg.message = WM_SIZE)
+{ or (msg.message = WM_ERASEBKGND)} then
+ for i := 0 to hooks.Count - 1 do
+ with TDCAVIPlayer(hooks[i]) do
+ if HandleAllocated and Transparent and IsPaintMsg then
+ begin
+ fbackchanged := true;
+ r := ClientRect;
+ InvalidateRect(Handle, @r, true);
+ end;
+end;
+
+{------------------------------------------------------------------}
+
+procedure AddHook(o : TDCAVIPlayer);
+begin
+ if hooks.Count = 0 then
+ WHook := SetWindowsHookEx(WH_CALLWNDPROC, @CallWndProcHook, 0, GetCurrentThreadId);
+ hooks.Add(o);
+end;
+
+{------------------------------------------------------------------}
+
+procedure RemoveHook(o : TDCAVIPlayer);
+begin
+ hooks.Remove(o);
+ if hooks.Count = 0 then
+ UnHookWindowsHookEx(WHook);
+end;
+
+{------------------------------------------------------------------}
+
+procedure TDCAVIPlayer.HookWndProc;
+begin
+ AddHook(self);
+end;
+
+{------------------------------------------------------------------}
+
+procedure TDCAVIPlayer.UnHookWndProc;
+begin
+ RemoveHook(self);
+end;
+
+{------------------------------------------------------------------}
+
+procedure TDCAVIPlayer.Reset;
+begin
+ CloseFile;
+ OpenFile;
+end;
+
+{------------------------------------------------------------------}
+
+procedure TDCAVIPlayer.DoOpen;
+begin
+ if Assigned(fOnOpen) then
+ fOnOpen(self);
+end;
+
+{------------------------------------------------------------------}
+
+procedure TDCAVIPlayer.DoClose;
+begin
+ if Assigned(fOnClose) then
+ fOnClose(self);
+end;
+
+{------------------------------------------------------------------}
+
+procedure TDCAVIPlayer.DoStart;
+begin
+ if Assigned(fOnStart) then
+ fOnStart(self);
+end;
+
+{------------------------------------------------------------------}
+
+procedure TDCAVIPlayer.MMWOM_DONE(var M:TMessage);
+begin
+ faudioplay.AudioPlayMessage(PWAVEHDR(M.lParam));
+end;
+
+{------------------------------------------------------------------}
+
+procedure TDCAVIPlayer.DoStop;
+begin
+ if Assigned(fOnStop) then
+ fOnStop(Self);
+end;
+
+{------------------------------------------------------------------}
+
+procedure TDCAVIPlayer.DisplayChange(var Msg : TMessage);
+begin
+ DrawDIBClose(hdrawdib);
+ hdrawdib := DrawDIBOpen;
+end;
+
+{------------------------------------------------------}
+
+destructor TAudioPlay.Destroy;
+begin
+ Stop;
+ inherited;
+end;
+
+{--------------------------------------------------------------}
+
+procedure TAudioPlay.AudioPlayMessage(W : PWAVEHDR);
+begin
+ waveOutUnprepareHeader(FWaveOut, W, sizeof(TWAVEHDR));
+ FreeMem(W, FBufferSize + sizeof(TWAVEHDR));
+ if FPlaying then
+ FillBuffer;
+end;
+
+{--------------------------------------------------------------}
+
+function TAudioPlay.FillBuffer : Boolean;
+var
+ AudioBuf : PWAVEHDR;
+ SamplesToPlay : integer;
+ lRead : integer;
+begin
+ Result := false;
+ GetMem(AudioBuf, fBufferSize + sizeof(TWAVEHDR));
+ with AudioBuf^ do
+ begin
+ dwuser := integer(Self);
+ dwFlags := WHDR_DONE;
+ lpData := pointer(integer(AudioBuf) + sizeof(TWAVEHDR));
+ dwBufferLength := fBufferSize;
+ end;
+ if waveOutPrepareHeader(FWaveOut, AudioBuf,
+ sizeof(TWAVEHDR)) <> MMSYSERR_NOERROR then
+ begin
+ FreeMem(AudioBuf, fBufferSize + sizeof(TWAVEHDR));
+ exit;
+ end;
+
+ SamplesToPlay := Min(fEnd - fCurrent, fBufferSize div fSampleSize);
+ if SamplesToPlay > 0 then
+ begin
+ AVIStreamRead(fAvi, fCurrent, SamplesToPlay, AudioBuf.lpData,
+ fBufferSize, @AudioBuf.dwBufferLength, @lRead);
+ if LRead = SamplesToPlay then
+ begin
+ inc(fCurrent, lRead);
+ waveOutWrite(fWaveOut, AudioBuf, sizeof(TWAVEHDR));
+ end;
+ end;
+ fPlaying := true;
+ result := true;
+end;
+
+{--------------------------------------------------------------}
+
+function TAudioPlay.OpenDevice(W : HWND; pAvi : pointer) : boolean;
+var
+ strhdr : TAVISTREAMINFO;
+ lpFormat : pointer;
+ cbFormat : longint;
+begin
+ result := false;
+ fAVI := pAvi;
+ AVIStreamInfo(pAvi, @StrHdr, sizeof(StrHdr));
+ fSampleSize := StrHdr.dwSampleSize;
+ if (fSampleSize <= 0) then
+ exit;
+
+ fBufferSize := Max(fSampleSize, cBufSize);
+ AVIStreamFormatSize(pavi, 0, @cbFormat);
+ GetMem(lpFormat, cbFormat);
+ FillChar(lpFormat^, cbFormat, 0);
+ AVIStreamReadFormat(pAvi, 0, lpFormat, @cbFormat);
+ sndPlaySound(nil, 0);
+ if waveOutOpen(@FWaveOut, WAVE_MAPPER, lpFormat,
+ W, 0, CALLBACK_WINDOW) = 0 then
+ result := true;
+
+ FreeMem(lpFormat, cbFormat);
+end;
+
+{--------------------------------------------------------------}
+
+procedure TAudioPlay.Stop;
+begin
+ if fWaveOut <> 0 then
+ begin
+ FPlaying := false;
+ waveOutReset(FWaveOut);
+ waveOutClose(FWaveOut);
+ fWaveOut := 0;
+ end;
+end;
+
+{--------------------------------------------------------------}
+
+function TAudioPlay.Play(W : HWND; pAvi : Pointer; lStart, lEnd : longint) : boolean;
+var
+ i : integer;
+begin
+ if fPlaying then
+ Stop;
+
+ Result := false;
+ if lStart < 0 then
+ lStart := AVIStreamStart(pavi);
+
+ if lEnd < 0 then
+ lEnd := AVIStreamEnd(pavi);
+
+ if lStart >= lEnd then
+ exit;
+
+ if not OpenDevice(W, pAvi) then
+ exit;
+
+ waveOutPause(fWaveOut);
+ fBegin := lStart;
+ FCurrent := lStart;
+ fEnd := lEnd;
+ fPlaying := true;
+ for i := 1 to CAheadBuffers do
+ FillBuffer;
+
+ waveOutRestart(FWaveOut);
+ result := true;
+end;
+
+{---------------------------------------------------------------------}
+{_FS: add}
+function TDCAVIPlayer.GetFrameRate: integer;
+var
+ info: TAviStreamInfo;
+begin
+ Result:=0;
+ if not Assigned(fvideostream) then Exit;
+ AVIStreamInfo(fvideostream, @info, sizeof(info));
+ Result := info.dwRate div info.dwScale;
+end;
+{_FS: end add}
+
+initialization
+ hooks := TList.Create;
+finalization
+ if hooks.Count > 0 then
+ UnHookWindowsHookEx(WHook);
+ hooks.Free;
+end.
diff --git a/Source/fsaviunit.dfm b/Source/fsaviunit.dfm
new file mode 100644
index 0000000..761db79
--- /dev/null
+++ b/Source/fsaviunit.dfm
@@ -0,0 +1,23 @@
+object FsAvi: TFsAvi
+ Left = 243
+ Top = 106
+ Width = 226
+ Height = 103
+ Caption = 'FsAvi'
+ Color = clBtnFace
+ Font.Charset = DEFAULT_CHARSET
+ Font.Color = clWindowText
+ Font.Height = -11
+ Font.Name = 'MS Sans Serif'
+ Font.Style = []
+ OldCreateOrder = False
+ OnCreate = FormCreate
+ OnDestroy = FormDestroy
+ PixelsPerInch = 96
+ TextHeight = 13
+ object sd1: TSaveDialog
+ Filter = 'AVI files|*.avi'
+ Left = 8
+ Top = 8
+ end
+end
diff --git a/Source/fsaviunit.pas b/Source/fsaviunit.pas
new file mode 100644
index 0000000..6f81e0b
--- /dev/null
+++ b/Source/fsaviunit.pas
@@ -0,0 +1,103 @@
+unit fsaviunit;
+
+interface
+
+uses
+ Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
+ fsformunit,
+ fsaviwriter, ExtCtrls, StdCtrls, Buttons;
+
+type
+ TFsAvi = class(TFsForm)
+ sd1: TSaveDialog;
+ procedure FormCreate(Sender: TObject);
+ procedure FormDestroy(Sender: TObject);
+ procedure BitBtn1Click(Sender: TObject);
+ procedure Button1Click(Sender: TObject);
+ procedure Button2Click(Sender: TObject);
+ private
+ { Private declarations }
+ a: TAviWriter;
+ public
+ { Public declarations }
+ procedure Parse(const S: String); override;
+ end;
+
+var
+ FsAvi: TFsAvi;
+
+implementation
+
+uses
+ fsframeunit, strz, mainunit;
+
+{$R *.DFM}
+
+{ Tavi }
+
+procedure TFsAvi.Parse(const S: String);
+var
+ s1: String;
+ f: TFsFrame;
+begin
+ if S='' then Exit;
+
+ s1 := UpperCase(ExtractWord(1, S, [' ']));
+
+ if s1='WRITE' then begin
+ a.FileName := Copy(S, Length(s1)+2, 255);
+ if a.Filename='' then
+ if sd1.Execute then begin
+ a.Filename := sd1.Filename;
+ if UpperCase(ExtractFileExt(a.Filename))<>'.AVI' then
+ a.Filename := a.Filename+'.avi';
+ end else
+ Exit;
+ a.Finish;
+ Exit;
+ end else
+ if s1='FPS' then begin
+ a.fps := MyStrToInt(Copy(S, Length(s1)+2, 255));
+ Exit;
+ end;
+
+ if not a.Prepared then
+ a.Prepare;
+
+ f := FindFrame(S);
+ if f=nil then Exit;
+
+ a.Width := f.d1.SurfaceWidth;
+ a.Height := f.d1.SurfaceHeight;
+
+ f.dDib.DIB.Assign(f.d1.Surface);
+ a.AddFrame(f.dDib.DIB);
+ main.SendReturnValues(PdName+'pos='+IntToStr(a.FramePos));
+end;
+
+procedure TFsAvi.FormCreate(Sender: TObject);
+begin
+ a := TAviWriter.Create(Self);
+end;
+
+procedure TFsAvi.FormDestroy(Sender: TObject);
+begin
+ a.Free;
+end;
+
+procedure TFsAvi.BitBtn1Click(Sender: TObject);
+begin
+ a.Write;
+end;
+
+procedure TFsAvi.Button1Click(Sender: TObject);
+begin
+ a.Prepare;
+end;
+
+procedure TFsAvi.Button2Click(Sender: TObject);
+begin
+ a.Finish;
+end;
+
+end.
diff --git a/Source/fsbrowserunit.dfm b/Source/fsbrowserunit.dfm
new file mode 100644
index 0000000..97c5299
--- /dev/null
+++ b/Source/fsbrowserunit.dfm
@@ -0,0 +1,35 @@
+inherited fsbrowser: Tfsbrowser
+ Left = 266
+ Top = 377
+ Width = 237
+ Height = 257
+ Caption = 'fsbrowser'
+ FormStyle = fsNormal
+ OldCreateOrder = True
+ PixelsPerInch = 96
+ TextHeight = 13
+ inherited d1: TDXDraw [1]
+ Width = 229
+ Height = 230
+ TabOrder = 2
+ end
+ inherited PanelMute: TPanel [2]
+ Width = 229
+ Height = 230
+ end
+ object br: TWebBrowser [3]
+ Left = 0
+ Top = 0
+ Width = 229
+ Height = 230
+ Align = alClient
+ TabOrder = 0
+ OnBeforeNavigate2 = brBeforeNavigate2
+ ControlData = {
+ 4C000000AB170000C51700000000000000000000000000000000000000000000
+ 000000004C000000000000000000000001000000E0D057007335CF11AE690800
+ 2B2E126208000000000000004C0000000114020000000000C000000000000046
+ 8000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000100000000000000000000000000000000000000}
+ end
+end
diff --git a/Source/fsbrowserunit.pas b/Source/fsbrowserunit.pas
new file mode 100644
index 0000000..b507902
--- /dev/null
+++ b/Source/fsbrowserunit.pas
@@ -0,0 +1,113 @@
+unit fsbrowserunit;
+
+interface
+
+uses
+ Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
+ fsframeunit, Filez, DIB, Menus, DXDraws, ExtCtrls, OleCtrls, SHDocVw,
+ C2PhotoShopHost, ExtDlgs, StdCtrls;
+
+type
+ Tfsbrowser = class(Tfsframe)
+ br: TWebBrowser;
+ procedure FormCreate(Sender: TObject);
+ procedure brBeforeNavigate2(Sender: TObject; const pDisp: IDispatch;
+ var URL, Flags, TargetFrameName, PostData, Headers: OleVariant;
+ var Cancel: WordBool);
+ private
+ { Private declarations }
+ public
+ { Public declarations }
+ PdName: String;
+ procedure Parse(const S: String); override;
+ procedure CopyToSurface;
+ end;
+
+var
+ fsbrowser: Tfsbrowser;
+
+implementation
+
+uses
+ ActiveX,
+ Strz, mainunit;
+
+{$R *.DFM}
+
+{ Tfsbrowser }
+
+procedure Tfsbrowser.Parse(const S: String);
+var
+ s1, s2: String;
+begin
+ s1 := Trim(UpperCase(ExtractWord(1, S, [' '])));
+ if s1='' then Exit;
+ if (s1[1] in ['0'..'9']) and
+ (Pos('X', s1)>0) then begin
+ Width := MyStrToInt(ExtractWord(1, s1, ['X']));
+ Height := MyStrToInt(ExtractWord(2, s1, ['X']));
+ end else
+ if s1='OPEN' then begin
+ s2 := Copy(S, Length(s1)+2, 255);
+ br.Navigate(s2);
+ end else
+ if s1='STOP' then begin
+ br.Stop;
+ end else
+ if s1='REFRESH' then begin
+ br.Refresh;
+ end else begin
+ if
+ (UpperCase(Copy(S, 1, 4))='HTTP') or
+ (UpperCase(Copy(S, 1, 4))='FILE')
+ then
+ br.Navigate(S)
+ else
+ inherited Parse(S);
+ end;
+end;
+
+procedure Tfsbrowser.FormCreate(Sender: TObject);
+begin
+ inherited;
+ ClientWidth := 480;
+ ClientHeight := 360;
+end;
+
+procedure Tfsbrowser.CopyToSurface;
+var
+ DrawRect: TRect;
+begin
+ if (br.ClientWidth<>d1.Surface.Width) or
+ (br.ClientHeight<>d1.Surface.Height) then
+ d1.SetSize(br.ClientWidth, br.ClientHeight);
+
+ DrawRect := Rect(0, 0, d1.Surface.Width, d1.Surface.Height);
+ (br.Document as IViewObject).Draw(
+ DVASPECT_CONTENT, 1, nil, nil, 0,
+ d1.Surface.Canvas.Handle, @DrawRect, nil, nil, 0);
+
+ d1.Surface.Canvas.Release;
+end;
+
+procedure Tfsbrowser.brBeforeNavigate2(Sender: TObject;
+ const pDisp: IDispatch; var URL, Flags, TargetFrameName, PostData,
+ Headers: OleVariant; var Cancel: WordBool);
+var
+ St: String;
+begin
+ if UpperCase(Copy(URL, 1, 3))='FS:' then begin
+ St := Copy(URL, 4, 255);
+
+ St := SearchAndReplace(St, '%exepath',
+ ExtractFilePath(Application.ExeName));
+ St := SearchAndReplace(St, '//', '/');
+ St := SearchAndReplace(St, '\/', '/');
+
+ main.SendReturnValuesString(PdName+'link', St);
+ Cancel:=True;
+ end;
+end;
+
+end.
+
diff --git a/Source/fscopyunit.dfm b/Source/fscopyunit.dfm
new file mode 100644
index 0000000..922152d
--- /dev/null
+++ b/Source/fscopyunit.dfm
@@ -0,0 +1,26 @@
+object fscopy: Tfscopy
+ Left = 231
+ Top = 103
+ Width = 257
+ Height = 93
+ Caption = 'fscopy'
+ Color = clBtnFace
+ Font.Charset = DEFAULT_CHARSET
+ Font.Color = clWindowText
+ Font.Height = -11
+ Font.Name = 'MS Sans Serif'
+ Font.Style = []
+ OldCreateOrder = False
+ WindowState = wsMinimized
+ OnClose = FormClose
+ OnCreate = FormCreate
+ PixelsPerInch = 96
+ TextHeight = 13
+ object copypsh: TC2PhotoShopHost
+ SerialNumber = 0
+ BackColor = clBlack
+ ForeColor = clBlack
+ Left = 8
+ Top = 8
+ end
+end
diff --git a/Source/fscopyunit.pas b/Source/fscopyunit.pas
new file mode 100644
index 0000000..0206d8f
--- /dev/null
+++ b/Source/fscopyunit.pas
@@ -0,0 +1,349 @@
+{ Copyright (C) 2001 Juha Vehviläinen
+ 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.}
+
+unit fscopyunit;
+
+interface
+
+uses
+ Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
+ mainunit, fsformunit, fsframeunit, StdCtrls, C2PhotoShopHost;
+
+type
+ TDrawStyles = (dsCopy, dsROP, dsAlpha, dsAdd, dsSub,
+ dsBlend, dsPlugin, dsFilter);
+ TRectTypes = (rtAll, rtRandom, rtSpecific);
+
+ Tfscopy = class(TFsForm)
+ copypsh: TC2PhotoShopHost;
+ procedure FormClose(Sender: TObject; var Action: TCloseAction);
+ procedure FormCreate(Sender: TObject);
+ private
+ { Private declarations }
+ f1, f2: TFsFrame;
+ DrawStyle: TDrawStyles;
+ dsROPMode: Integer;
+ SourceType: TRectTypes;
+ DestType: TRectTypes;
+ SourceRect, DestRect: TRect;
+ iAlpha, iAdd, iSub: Integer;
+ iBlend: Extended;
+ Transparent, MirrorLeftRight, MirrorUpdown: Boolean;
+ iPlugin, iPluginArgs: String;
+ iFilter, iFilterArgs: String;
+
+ procedure GetFrames(const S: String);
+ public
+ { Public declarations }
+ procedure Parse(const S: String); override;
+ end;
+
+var
+ fscopy: Tfscopy;
+
+implementation
+
+{$R *.DFM}
+
+uses
+ DxDraws, DirectX,
+ effectsunit, fsbrowserunit, pshostunit,
+ Strz;
+
+procedure Tfscopy.FormClose(Sender: TObject; var Action: TCloseAction);
+begin
+ Action := caFree;
+end;
+
+procedure Tfscopy.GetFrames(const S: String);
+const
+ f1name: String = '-1';
+ f2name: String = '-1';
+var
+ s1, s2: String;
+begin
+ if (Pos(' ', S)=0) then Exit;
+
+ s1 := UpperCase(ExtractWord(1, S, [' ']));
+ s2 := UpperCase(ExtractWord(2, S, [' ']));
+
+ if (s1<>f1name) or (f1=nil) then
+ f1 := FindFrame(s1);
+
+ if (s2<>f2name) or (f2=nil) then
+ f2 := FindFrame(s2);
+
+ f1name := s1; f2name := s2;
+end;
+
+procedure Tfscopy.Parse(const S: String);
+
+ procedure SwapInt(var i1, i2: Integer);
+ var
+ tmpi: Integer;
+ begin
+ tmpi := i1;
+ i1 := i2;
+ i2 := tmpi;
+ end;
+
+var
+ s1: String;
+ bltFlags: Cardinal;
+ df: TDDBltFX;
+ ddck: TDDColorKey;
+ sx1, sy1, sx2, sy2, dx1, dy1, dx2, dy2: Integer;
+begin
+ if (S='') then Exit;
+
+ s1 := UpperCase(ExtractWord(1, S, [' ']));
+
+ if Pos('FS.FRAME', s1)=0 then
+ if s1='COPY' then begin DrawStyle := dsCopy; Exit; end else
+ if s1='BLEND' then begin
+ DrawStyle := dsBlend;
+ iBlend := MyStrToFloat(ExtractWord(2, S, [' ']));
+ Exit;
+ end else
+ if s1='ALPHA' then begin
+ DrawStyle := dsAlpha;
+ iAlpha := MyStrToInt(ExtractWord(2, S, [' ']));
+ Exit;
+ end else
+ if s1='ADD' then begin
+ DrawStyle := dsAdd;
+ iAdd := MyStrToInt(ExtractWord(2, S, [' ']));
+ Exit;
+ end else
+ if s1='SUB' then begin
+ DrawStyle := dsSub;
+ iSub := MyStrToInt(ExtractWord(2, S, [' ']));
+ Exit;
+ end else
+ if s1='SOURCE' then begin
+ if Pos(' ', S)>0 then begin // at least x1 specified
+ SourceRect := StrToRect(Copy(S, Length(s1)+2, 255));
+ SourceType := rtSpecific;
+ Exit;
+ end;
+ end else
+ if s1='DEST' then begin
+ if Pos(' ', S)>0 then begin // at least x1 specified
+ DestRect := StrToRect(Copy(S, Length(s1)+2, 255));
+ DestType := rtSpecific;
+ Exit;
+ end;
+ end else
+ if s1='SOURCE_ALL' then begin SourceType := rtAll; Exit; end else
+ if s1='SOURCE_RANDOM' then begin SourceType := rtRandom; Exit; end else
+ if s1='DEST_ALL' then begin DestType := rtAll; Exit; end else
+ if s1='DEST_RANDOM' then begin DestType := rtRandom; Exit; end else
+
+ if s1='BLACKNESS' then begin DrawStyle := dsROP; dsROPMode := cmBlackness; Exit; end else
+ if s1='DSTINVERT' then begin DrawStyle := dsROP; dsROPMode := cmDstInvert; Exit; end else
+ if s1='MERGECOPY' then begin DrawStyle := dsROP; dsROPMode := cmMergeCopy; Exit; end else
+ if s1='MERGEPAINT' then begin DrawStyle := dsROP; dsROPMode := cmMergePaint; Exit; end else
+ if s1='NOTSRCCOPY' then begin DrawStyle := dsROP; dsROPMode := cmNotSrcCopy; Exit; end else
+ if s1='NOTSRCERASE' then begin DrawStyle := dsROP; dsROPMode := cmNotSrcErase; Exit; end else
+ if s1='PATCOPY' then begin DrawStyle := dsROP; dsROPMode := cmPatCopy; Exit; end else
+ if s1='PATINVERT' then begin DrawStyle := dsROP; dsROPMode := cmPatInvert; Exit; end else
+ if s1='PATPAINT' then begin DrawStyle := dsROP; dsROPMode := cmPatPaint; Exit; end else
+ if s1='SRCAND' then begin DrawStyle := dsROP; dsROPMode := cmSrcAnd; Exit; end else
+ if s1='SRCCOPY' then begin DrawStyle := dsROP; dsROPMode := cmSrcCopy; Exit; end else
+ if s1='SRCERASE' then begin DrawStyle := dsROP; dsROPMode := cmSrcErase; Exit; end else
+ if s1='SRCINVERT' then begin DrawStyle := dsROP; dsROPMode := cmSrcInvert; Exit; end else
+ if s1='SRCPAINT' then begin DrawStyle := dsROP; dsROPMode := cmSrcPaint; Exit; end else
+ if s1='WHITENESS' then begin DrawStyle := dsROP; dsROPMode := cmWhiteness; Exit; end else
+
+ if s1='TRANSPARENT_0' then begin Transparent := False; Exit; end else
+ if s1='TRANSPARENT_1' then begin Transparent := True; Exit; end else
+ if s1='MIRRORLEFTRIGHT_0' then begin MirrorLeftRight := False; Exit; end else
+ if s1='MIRRORLEFTRIGHT_1' then begin MirrorLeftRight := True; Exit; end else
+ if s1='MIRRORUPDOWN_0' then begin MirrorUpDown := False; Exit; end else
+ if s1='MIRRORUPDOWN_1' then begin MirrorUpDown := True; Exit; end else
+ if main.Plugins.IsPlugin(s1) then begin
+ DrawStyle := dsPlugin;
+ iPlugin := s1;
+ iPluginArgs := Copy(S, Length(s1)+2, 255);
+ Exit;
+ end else
+ if pshostunit.IsFilter(s1) then begin
+ DrawStyle := dsFilter;
+ iFilter := s1;
+ iFilterArgs := Copy(S, Length(s1)+2, 255);
+ Exit;
+ end;
+
+
+ GetFrames(S);
+ if (f1=nil) or (f2=nil) then Exit;
+ if (f1.d1=nil) or (f2.d1=nil) then Exit;
+
+ if (f1.ParentWindow>0) and not IsWindow(f1.ParentWindow) then Exit;
+ if (f2.ParentWindow>0) and not IsWindow(f2.ParentWindow) then Exit;
+
+ if f1 is TFsBrowser then begin
+ (f1 as TFsBrowser).CopyToSurface;
+ end;
+
+ case SourceType of
+ rtAll: begin
+ sx1 := 0;
+ sy1 := 0;
+ sx2 := f1.d1.Surface.Width;
+ sy2 := f1.d1.Surface.Height;
+ end;
+ rtRandom: begin
+ sx1 := Random(f1.d1.Surface.Width);
+ sx2 := Random(f1.d1.Surface.Width);
+ sy1 := Random(f1.d1.Surface.Height);
+ sy2 := Random(f1.d1.Surface.Height);
+ end;
+ rtSpecific: begin
+ sx1 := SourceRect.Left;
+ sy1 := SourceRect.Top;
+ sx2 := SourceRect.Right;
+ sy2 := SourceRect.Bottom;
+ end;
+ end;
+
+ case DestType of
+ rtAll: begin
+ dx1 := 0;
+ dy1 := 0;
+ dx2 := f2.d1.Surface.Width;
+ dy2 := f2.d1.Surface.Height;
+ end;
+ rtRandom: begin
+ dx1 := Random(f2.d1.Surface.Width);
+ dx2 := Random(f2.d1.Surface.Width);
+ dy1 := Random(f2.d1.Surface.Height);
+ dy2 := Random(f2.d1.Surface.Height);
+ end;
+ rtSpecific: begin
+ dx1 := DestRect.Left;
+ dy1 := DestRect.Top;
+ dx2 := DestRect.Right;
+ dy2 := DestRect.Bottom;
+ end;
+ end;
+
+ if sx2<sx1 then swapint(sx2, sx1);
+ if sy2<sy1 then swapint(sy2, sy1);
+ if dx2<dx1 then swapint(dx2, dx1);
+ if dy2<dy1 then swapint(dy2, dy1);
+
+ if sx2=sx1 then inc(sx2);
+ if sy2=sy1 then inc(sy2);
+ if dx2=dx1 then inc(dx2);
+ if dy2=dy1 then inc(dy2);
+
+ if sx1<0 then sx1:=0;
+ if sy1<0 then sy1:=0;
+ if sx2>f1.d1.Surface.Width then sx2:=f1.d1.Surface.Width;
+ if sy2>f1.d1.Surface.Height then sy2:=f1.d1.Surface.Height;
+ if dx1<0 then dx1:=0;
+ if dy1<0 then dy1:=0;
+ if dx2>f2.d1.Surface.Width then dx2:=f1.d1.Surface.Width;
+ if dy2>f2.d1.Surface.Height then dy2:=f2.d1.Surface.Height;
+
+ case DrawStyle of
+ dsCopy: begin
+ ddck.dwColorSpaceLowValue := 0;
+ ddck.dwColorSpaceHighValue := 0;
+ DF.dwsize := SizeOf(DF);
+ DF.dwROP := cmSrcCopy;
+ DF.dwDDFX := 0;
+ DF.ddckSrcColorkey := ddck;
+ DF.ddckDestColorkey := ddck;
+ bltFlags := DDBLT_DDFX;
+ if Transparent then bltFlags := bltFlags or DDBLT_KEYSRCOVERRIDE;
+ if MirrorLeftRight then
+ DF.dwDDFX := DF.dwDDFX or DDBLTFX_MIRRORLEFTRIGHT;
+ if MirrorUpDown then
+ DF.dwDDFX := DF.dwDDFX or DDBLTFX_MIRRORUPDOWN;
+
+ if not f2.d1.Surface.Blt(
+ Rect(dx1, dy1, dx2, dy2),
+ Rect(sx1, sy1, sx2, sy2),
+ bltFlags or {DDBLT_ROP or} DDBLT_WAIT,
+ DF, f1.d1.Surface ) then
+ main.Post(Self.Name+': blt failed.')
+ else
+ f2.FlipRequest;
+ end;
+ dsROP: begin
+ StretchBlt(f2.d1.Surface.Canvas.Handle,
+ dx1, dy1, dx2-dx1, dy2-dy1,
+ f1.d1.Surface.Canvas.Handle,
+ sx1, sy1, sx2-sx1, sy2-sy1, dsROPMode);
+
+ f1.d1.Surface.Canvas.Release;
+ f2.d1.Surface.Canvas.Release;
+ f2.FlipRequest;
+ end;
+ dsAlpha: begin
+ f2.d1.Surface.DrawAlpha(
+ Rect(dx1, dy1, dx2, dy2),
+ Rect(sx1, sy1, sx2, sy2),
+ f1.d1.Surface, False, iAlpha);
+ f2.FlipRequest;
+ end;
+ dsAdd: begin
+ f2.d1.Surface.DrawAdd(
+ Rect(dx1, dy1, dx2, dy2),
+ Rect(sx1, sy1, sx2, sy2),
+ f1.d1.Surface, False, iAdd);
+ f2.FlipRequest;
+ end;
+ dsSub: begin
+ f2.d1.Surface.DrawSub(
+ Rect(dx1, dy1, dx2, dy2),
+ Rect(sx1, sy1, sx2, sy2),
+ f1.d1.Surface, False, iSub);
+ f2.FlipRequest;
+ end;
+ dsBlend: begin
+ blend(f1.d1.Surface, f2.d1.Surface, iBlend);
+ f2.FlipRequest;
+ end;
+ dsPlugin: begin
+ if main.Plugins.CallCopy(f1.d1.Surface, f2.d1.Surface,
+ iPlugin, iPluginArgs) then begin
+ f1.FlipRequest;
+ f2.FlipRequest;
+ end;
+ end;
+ dsFilter: begin
+ if pshostunit.Filter_copy(Self.copypsh,
+ f1.d1.Surface, f2.d1.Surface,
+ iFilter, iFilterArgs) then begin
+ f1.FlipRequest;
+ f2.FlipRequest;
+ end;
+ end;
+ end;
+end;
+
+procedure Tfscopy.FormCreate(Sender: TObject);
+begin
+ f1 := nil; f2 := nil;
+ DrawStyle := dsCopy;
+ SourceType := rtAll;
+ DestType := rtAll;
+ iAlpha := 50; iAdd := 255; iSub := 255;
+ Transparent := False;
+ MirrorLeftRight := False;
+ MirrorUpDown := False;
+end;
+
+end.
+
diff --git a/Source/fsdrawunit.dfm b/Source/fsdrawunit.dfm
new file mode 100644
index 0000000..9a73308
--- /dev/null
+++ b/Source/fsdrawunit.dfm
@@ -0,0 +1,17 @@
+object fsdraw: Tfsdraw
+ Left = 245
+ Top = 177
+ Width = 247
+ Height = 106
+ Caption = 'fsdraw'
+ Color = clBtnFace
+ Font.Charset = DEFAULT_CHARSET
+ Font.Color = clWindowText
+ Font.Height = -11
+ Font.Name = 'MS Sans Serif'
+ Font.Style = []
+ OldCreateOrder = False
+ OnCreate = FormCreate
+ PixelsPerInch = 96
+ TextHeight = 13
+end
diff --git a/Source/fsdrawunit.pas b/Source/fsdrawunit.pas
new file mode 100644
index 0000000..c67b3d4
--- /dev/null
+++ b/Source/fsdrawunit.pas
@@ -0,0 +1,101 @@
+{ Copyright (C) 2001 Juha Vehviläinen
+ 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.}
+
+unit fsdrawunit;
+
+interface
+
+uses
+ Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
+ fsformunit, fsframeunit, fstextunit;
+
+type
+ Tfsdraw = class(TFsForm)
+ procedure FormCreate(Sender: TObject);
+ private
+ dest: TFsFrame;
+ { Private declarations }
+ public
+ { Public declarations }
+ procedure Parse(const S: String); override;
+ end;
+
+var
+ fsdraw: Tfsdraw;
+
+implementation
+
+uses
+ mainunit, Strz;
+
+{$R *.DFM}
+
+{ Tfsdraw }
+
+procedure Tfsdraw.Parse(const S: String);
+var
+ r: TRect;
+ x, y: Integer;
+ s1, sa: String;
+ b: Boolean;
+begin
+ if (S='') then Exit;
+ s1 := ExtractWord(WordCount(S, [' ']), S, [' ']);
+ dest := FindFrame(s1);
+ if (dest=nil) or (dest.d1=nil) then Exit;
+
+ sa := UpperCase(Copy(S, 1, Pos(s1, S)-2));
+
+ b := ParsePenProperties(dest.d1.Surface.Canvas, sa);
+ dest.d1.Surface.Canvas.Release;
+
+ s1 := ExtractWord(1, sa, [' ']);
+
+ if b then Exit else
+ if s1='MODE_SOLID' then begin
+ dest.d1.Surface.Canvas.Brush.Style := bsSolid;
+ dest.d1.Surface.Canvas.Release;
+ end else
+ if s1='MODE_CLEAR' then begin
+ dest.d1.Surface.Canvas.Brush.Style := bsClear;
+ dest.d1.Surface.Canvas.Release;
+ end else
+ if s1='RECT' then begin
+ dest.d1.Surface.Canvas.Rectangle(StrToRect(Copy(sa, Length(s1)+2, 255)));
+ dest.d1.Surface.Canvas.Release;
+ dest.FlipRequest;
+ end else
+ if s1='LINE' then begin
+ r := StrToRect(Copy(sa, Length(s1)+2, 255));
+ with dest.d1.Surface.Canvas do begin
+ MoveTo(r.Left, r.Top);
+ LineTo(r.Right, r.Bottom);
+ end;
+ dest.d1.Surface.Canvas.Release;
+ dest.FlipRequest;
+ end else
+ if s1='PLOT' then begin
+ x := MyStrToInt(ExtractWord(2, sa, [' ']));
+ y := MyStrToInt(ExtractWord(3, sa, [' ']));
+ dest.d1.Surface.Canvas.Pixels[x, y] :=
+ dest.d1.Surface.Canvas.Pen.Color;
+ dest.d1.Surface.Canvas.Release;
+ dest.FlipRequest;
+ end else
+end;
+
+procedure Tfsdraw.FormCreate(Sender: TObject);
+begin
+ dest := nil;
+end;
+
+end.
+
diff --git a/Source/fsformunit.pas b/Source/fsformunit.pas
new file mode 100644
index 0000000..3f71db8
--- /dev/null
+++ b/Source/fsformunit.pas
@@ -0,0 +1,18 @@
+unit fsformunit;
+
+interface
+
+uses
+ Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;
+
+type
+ TFsForm = class(TForm)
+ public
+ PdName: String;
+ procedure Parse(const S: String); virtual; abstract;
+ end;
+
+implementation
+
+end.
+ \ No newline at end of file
diff --git a/Source/fsframeunit.dfm b/Source/fsframeunit.dfm
new file mode 100644
index 0000000..3e38f21
--- /dev/null
+++ b/Source/fsframeunit.dfm
@@ -0,0 +1,146 @@
+object fsframe: Tfsframe
+ Left = 583
+ Top = 507
+ Width = 277
+ Height = 198
+ Caption = 'fs.frame'
+ Color = clBtnFace
+ Font.Charset = DEFAULT_CHARSET
+ Font.Color = clWindowText
+ Font.Height = -11
+ Font.Name = 'MS Sans Serif'
+ Font.Style = []
+ OldCreateOrder = False
+ PopupMenu = PopupMenu1
+ Position = poDefaultSizeOnly
+ OnClose = FormClose
+ OnCreate = FormCreate
+ OnDestroy = FormDestroy
+ OnMouseWheel = FormMouseWheel
+ PixelsPerInch = 96
+ TextHeight = 13
+ object LabelFoo: TLabel
+ Left = 8
+ Top = 136
+ Width = 44
+ Height = 13
+ Caption = 'LabelFoo'
+ Visible = False
+ end
+ object PanelMute: TPanel
+ Left = 0
+ Top = 0
+ Width = 269
+ Height = 171
+ Align = alClient
+ BevelOuter = bvNone
+ Caption = 'mute'
+ Ctl3D = True
+ ParentCtl3D = False
+ TabOrder = 1
+ end
+ object d1: TDXDraw
+ Left = 0
+ Top = 0
+ Width = 269
+ Height = 171
+ AutoInitialize = True
+ AutoSize = False
+ Color = clBtnFace
+ Display.FixedBitCount = False
+ Display.FixedRatio = False
+ Display.FixedSize = False
+ Options = [doStretch, doDirectX7Mode, doHardware, doSelectDriver]
+ SurfaceHeight = 171
+ SurfaceWidth = 269
+ Align = alClient
+ PopupMenu = PopupMenu1
+ TabOrder = 0
+ OnMouseDown = d1MouseDown
+ OnMouseMove = d1MouseMove
+ OnMouseUp = d1MouseUp
+ end
+ object PopupMenu1: TPopupMenu
+ OnPopup = PopupMenu1Popup
+ Left = 8
+ Top = 8
+ object MiBufferImages: TMenuItem
+ Caption = 'Buffer images'
+ OnClick = MiBufferImagesClick
+ end
+ object MiSaveFrame: TMenuItem
+ Caption = 'Save this image as ..'
+ OnClick = MiSaveFrameClick
+ end
+ object Mi11: TMenuItem
+ Caption = 'zoom 1:&1'
+ OnClick = Mi11Click
+ end
+ object Mi12: TMenuItem
+ Caption = 'zoom 1:&2'
+ OnClick = Mi12Click
+ end
+ object Mi176x144: TMenuItem
+ Caption = 'zoom 176x144'
+ OnClick = Mi176x144Click
+ end
+ object MiMute: TMenuItem
+ Caption = 'Mute'
+ OnClick = MiMuteClick
+ end
+ object MiBorders: TMenuItem
+ Caption = 'Borders'
+ Checked = True
+ OnClick = MiBordersClick
+ end
+ object MiStayOnTop: TMenuItem
+ Caption = 'StayOnTop'
+ OnClick = MiStayOnTopClick
+ end
+ object MiMouseTrack: TMenuItem
+ Caption = 'MouseTrack'
+ OnClick = MiMouseTrackClick
+ end
+ object MiHideCursor: TMenuItem
+ Caption = 'HideCursor'
+ OnClick = MiHideCursorClick
+ end
+ object MiUndock: TMenuItem
+ Caption = 'Undock'
+ OnClick = MiUndockClick
+ end
+ end
+ object dDib: TDXDIB
+ Left = 8
+ Top = 40
+ end
+ object dirBuffer: TScanDir
+ OnHandleFile = dirBufferHandleFile
+ Left = 8
+ Top = 72
+ end
+ object opd1: TOpenPictureDialog
+ Filter = 'All (*.jpg;*.bmp;*.avi)|*.jpg;*.bmp;*.avi'
+ Options = [ofHideReadOnly, ofAllowMultiSelect, ofFileMustExist, ofEnableSizing]
+ Left = 8
+ Top = 104
+ end
+ object framepsh: TC2PhotoShopHost
+ SerialNumber = 0
+ BackColor = clBlack
+ ForeColor = clBlack
+ Left = 40
+ Top = 8
+ end
+ object svd1: TSaveDialog
+ Filter = '*.bmp|BMP files'
+ Options = [ofOverwritePrompt, ofHideReadOnly, ofPathMustExist, ofEnableSizing]
+ Left = 40
+ Top = 104
+ end
+ object dirUse: TScanDir
+ OnHandleFile = dirUseHandleFile
+ Left = 40
+ Top = 72
+ end
+end
diff --git a/Source/fsframeunit.pas b/Source/fsframeunit.pas
new file mode 100644
index 0000000..e3316a7
--- /dev/null
+++ b/Source/fsframeunit.pas
@@ -0,0 +1,1098 @@
+{ Copyright (C) 2001 Juha Vehviläinen
+ 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.}
+
+unit fsframeunit;
+
+interface
+
+uses
+ Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
+ Menus, Jpeg, DXDraws,
+ FastDIB, fsDcAvi,
+ fsformunit, ExtCtrls, DIB, Filez, ExtDlgs, C2PhotoShopHost, Buttons,
+ StdCtrls;
+
+type
+ TFastDIBList = TList;
+
+ Tfsframe = class(TFsForm)
+ d1: TDXDraw;
+ PopupMenu1: TPopupMenu;
+ Mi11: TMenuItem;
+ Mi12: TMenuItem;
+ MiMute: TMenuItem;
+ dDib: TDXDIB;
+ MiBorders: TMenuItem;
+ MiStayOnTop: TMenuItem;
+ dirBuffer: TScanDir;
+ PanelMute: TPanel;
+ MiMouseTrack: TMenuItem;
+ MiBufferImages: TMenuItem;
+ opd1: TOpenPictureDialog;
+ MiSaveFrame: TMenuItem;
+ Mi176x144: TMenuItem;
+ MiHideCursor: TMenuItem;
+ framepsh: TC2PhotoShopHost;
+ MiUndock: TMenuItem;
+ svd1: TSaveDialog;
+ dirUse: TScanDir;
+ LabelFoo: TLabel;
+ procedure FormClose(Sender: TObject; var Action: TCloseAction);
+ procedure Mi11Click(Sender: TObject);
+ procedure Mi12Click(Sender: TObject);
+ procedure MiMuteClick(Sender: TObject);
+ procedure FormCreate(Sender: TObject);
+ procedure FormDestroy(Sender: TObject);
+ procedure MiBordersClick(Sender: TObject);
+ procedure MiStayOnTopClick(Sender: TObject);
+ procedure dirBufferHandleFile(const SearchRec: TSearchRec;
+ const FullPath: String);
+ procedure d1MouseDown(Sender: TObject; Button: TMouseButton;
+ Shift: TShiftState; X, Y: Integer);
+ procedure d1MouseMove(Sender: TObject; Shift: TShiftState; X,
+ Y: Integer);
+ procedure d1MouseUp(Sender: TObject; Button: TMouseButton;
+ Shift: TShiftState; X, Y: Integer);
+ procedure MiMouseTrackClick(Sender: TObject);
+ procedure MiBufferImagesClick(Sender: TObject);
+ procedure PopupMenu1Popup(Sender: TObject);
+ procedure MiSaveFrameClick(Sender: TObject);
+ procedure Mi176x144Click(Sender: TObject);
+ procedure MiHideCursorClick(Sender: TObject);
+ procedure FormMouseWheel(Sender: TObject; Shift: TShiftState;
+ WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
+ procedure MiUndockClick(Sender: TObject);
+ procedure dirUseHandleFile(const SearchRec: TSearchRec;
+ const FullPath: String);
+ protected
+ fx1, fx2: TFastDIB;
+ private
+ { Private declarations }
+ AutoFlip, Smooth: Boolean;
+ picBuf: TFastDIBList;
+ picIndex: Integer;
+ AutoSend: Boolean;
+ AutoSend_Address: String;
+ AutoSend_jpegqualitynet: Integer;
+ AutoSend_sendjpg: Boolean;
+ MouseTrack: Boolean; // report mouse x y
+ MouseRect: Boolean; // report dragged rectangle
+ FHideCursor: Boolean; // hide cursor in this frame
+ jpgquality: Integer;
+ jpegqualitynet: Integer;
+ prevtop: Integer;
+ prevmute: Boolean;
+ filelist: TStringList;
+ filelistIndex: Integer;
+
+ procedure ClearPicBuf;
+ procedure StayOnTop(const Yes: Boolean);
+ function Getnextfilename(const dir, ext: String): String;
+ procedure _prefx;
+ procedure _postfx(const f: TFastDIB);
+ procedure _postavi;
+ procedure SendMouseTrack(const X, Y: Integer);
+ procedure SendMouseRect(const x1, y1, x2, y2: Integer);
+ function GetDocked: Boolean;
+ procedure SetHideCursor(const Value: Boolean);
+ procedure NewButton(const receivename: String;
+ const x, y: Integer; const buttoncaption: String);
+ public
+ { Public declarations }
+ avi: TDcAviPlayer;
+ NameTag: String;
+ procedure Borders(const Yes: Boolean);
+ procedure Parse(const S: String); override;
+ procedure FlipRequest;
+ procedure AutoSendRequest;
+ procedure HandleDroppedFile(const S: String);
+ property Docked: Boolean read GetDocked;
+ property HideCursor: Boolean read FHideCursor write SetHideCursor;
+ end;
+
+var
+ fsframe: Tfsframe;
+
+function FindFrame(const S: String): TFsFrame;
+
+implementation
+
+{$R *.DFM}
+
+uses
+ ShellApi,
+ FastFX, FastFiles,
+ mainunit, effectsunit, fsspeedbutton,
+ Strz,
+ FileCtrl,
+ pshostunit;
+
+function FindFrame(const S: String): TFsFrame;
+begin
+ Result := TFsFrame(main.FindComponent(main.CompName(S)));
+end;
+
+{ Tfsframe }
+
+procedure Tfsframe._prefx;
+begin
+ dDib.DIB.Assign( d1.Surface );
+ fx1.LoadFromHandle( dDib.DIB.Handle );
+end;
+
+procedure Tfsframe._postfx(const f: TFastDIB);
+begin
+ f.Draw(d1.Surface.Canvas.Handle, 0, 0);
+ d1.Surface.Canvas.Release;
+ FlipRequest;
+end;
+
+procedure Tfsframe._postavi;
+begin
+ d1.SetSize(avi.Width, avi.Height);
+ avi.DrawFrameToDC(d1.Surface.Canvas.Handle);
+ d1.Surface.Canvas.Release;
+ FlipRequest;
+end;
+
+procedure Tfsframe.Parse(const S: String);
+var
+ fs, s1, Ext: String;
+ i, o, u, x, y: Integer;
+ fpic: TFastDIB;
+ savejpg, sendjpg: Boolean;
+ R: TRect;
+begin
+ if S='' then Exit;
+ if (ParentWindow>0) and not
+ IsWindow(ParentWindow) then Exit;
+
+ s1 := UpperCase(ExtractWord(1, S, [' ']));
+ Ext := UpperCase(ExtractFileExt(S));
+ if s1='SAVE' then begin // SAVE <dir> <"bmp" or number for jpeg quality>
+ s1 := ExtractWord(2, S, [' ']);
+ if s1='' then Exit;
+ savejpg := True;
+ if WordCount(S, [' '])>2 then begin
+ Ext := UpperCase(ExtractWord(3, S, [' ']));
+ if Ext='BMP' then savejpg := False else begin
+ i := StrToInt(Ext); if i>0 then jpgquality := i;
+ end;
+ end;
+ if not DirectoryExists(s1) then begin
+ main.Post('Save: Directory '+s1+' doesn''t exist.');
+ Exit;
+ end;
+ if savejpg then Ext:='.jpg' else Ext:='.bmp';
+ fs := Getnextfilename(s1, Ext);
+ _prefx;
+ if savejpg then
+ SaveJPGFile(fx1, s1+'\'+fs, jpgquality)
+ else
+ fx1.SaveToFile(s1+'\'+fs);
+ end;
+ if (s1='BUFFER') or (Ext='.JPG') or (Ext='.BMP') then begin
+ fs := S;
+ if UpperCase(ExtractWord(1, fs, [' ']))<>'BUFFER' then begin
+ if main.FileExistsInSearchPath(fs) then begin
+ d1.Surface.LoadFromFile(fs);
+ FlipRequest;
+ end else
+ main.Post('Failed opening '+fs);
+ end else begin
+ fs := Copy(fs, 8, 255);
+ if main.FileExistsInSearchPath(fs) then begin
+ main.Post('buffering '+fs);
+ fpic := TFastDIB.Create;
+ fpic.Bpp := 16;
+ if Ext='.JPG' then
+ LoadJPGFile(fpic, fs, True)
+ else if Ext='.BMP' then
+ fpic.LoadFromFile(fs);
+ picBuf.Add(fpic);
+ end else
+ if DirectoryExists(fs) then begin
+ main.Post('buffering directory '+fs);
+ dirBuffer.Scan(fs);
+ end else
+ main.Post('Failed opening '+fs);
+ end;
+ end else
+ if s1='FLIP_MANUAL' then begin
+ AutoFlip := False;
+ end else
+ if s1='FLIP_AUTO' then begin
+ AutoFlip := True;
+ end else
+ if s1='FLIP' then begin
+ d1.Flip;
+ AutoSendRequest;
+ end else
+ if s1='NEXT' then begin
+ if picBuf.Count=0 then begin
+ if filelist.Count=0 then begin
+ if avi.Open then begin
+ if avi.Position=avi.FrameCount-1 then
+ avi.Seek(0)
+ else
+ avi.Seek(avi.Position+1);
+ _postavi;
+ end;
+ Exit;
+ end;
+ Inc(filelistIndex);
+ if filelistIndex>=filelist.Count then
+ filelistIndex := 0;
+ Parse(filelist.Strings[filelistIndex]);
+ Exit;
+ end;
+ Inc(picIndex);
+ if picIndex>=picBuf.Count then
+ picIndex := 0;
+ fpic := picBuf[picIndex];
+ d1.Surface.SetSize(fpic.Width, fpic.Height);
+ _postfx(fpic);
+ end else
+ if s1='PREV' then begin
+ if picBuf.Count=0 then begin
+ if filelist.Count=0 then begin
+ // avi
+ if avi.Open then begin
+ if avi.Position=0 then
+ avi.Seek(avi.FrameCount-1)
+ else
+ avi.Seek(avi.Position-1);
+ _postavi;
+ end;
+ Exit;
+ end;
+
+ // filelist
+ Dec(filelistIndex);
+ if filelistIndex<0 then
+ filelistIndex := filelist.Count-1;
+ Parse(filelist.Strings[filelistIndex]);
+ Exit;
+
+ end;
+ // picbuf
+ Dec(picIndex);
+ if picIndex<0 then
+ picIndex := PicBuf.Count-1;
+ fpic := picBuf[picIndex];
+ d1.Surface.SetSize(fpic.Width, fpic.Height);
+ _postfx(fpic);
+
+ end else
+ if s1='SEEK' then begin
+ s1 := ExtractWord(2, S, [' ']);
+ if s1='' then Exit;
+ if picBuf.Count=0 then begin
+ if filelist.Count=0 then begin
+ if avi.Open then begin
+ if s1[Length(s1)]='*' then
+ i := Trunc(MyStrToFloat(Copy(s1, 1, Length(s1)-1))*avi.FrameCount-1)
+ else
+ i := MyStrToInt(s1);
+ avi.Seek(i);
+ _postavi;
+ end;
+ Exit;
+ end;
+
+ if s1[Length(s1)]='*' then
+ i := Trunc(MyStrToFloat(Copy(s1, 1, Length(s1)-1))*filelist.Count-1)
+ else
+ i := MyStrToInt(s1);
+ if (i>=0) and (i<filelist.Count) then
+ Parse(filelist.Strings[i]);
+ Exit;
+ end;
+ if s1[Length(s1)]='*' then
+ i := Trunc(MyStrToFloat(Copy(s1, 1, Length(s1)-1))*picBuf.Count-1)
+ else
+ i := MyStrToInt(s1);
+ if (i>=0) and (i<picBuf.Count) then begin
+ fpic := picBuf[i];
+ d1.Surface.SetSize(fpic.Width, fpic.Height);
+ _postfx(fpic);
+ end;
+ end else
+ if s1='RANDOM' then begin
+ if picBuf.Count=0 then begin
+ if filelist.Count=0 then begin
+ if avi.Open then begin
+ avi.Seek(Random(avi.FrameCount));
+ _postavi;
+ end;
+ Exit;
+ end;
+ Parse(filelist.Strings[Random(filelist.Count)]);
+ Exit;
+ end;
+ fpic := picBuf[Random(picBuf.Count)];
+ d1.Surface.SetSize(fpic.Width, fpic.Height);
+ _postfx(fpic);
+ end else
+ if s1='CLEAR' then begin
+ ClearPicBuf;
+ filelist.Clear;
+ end else
+ if (Ext='.AVI') then begin
+ fs := S;
+ if main.FileExistsInSearchPath(fs) then begin
+ avi.FileName := fs;
+ if avi.Open then begin
+ avi.Seek(0);
+ _postavi;
+ end;
+ end else
+ main.Post('Failed opening '+fs);
+ end else
+ if S[1] in ['0'..'9'] then begin
+ s1 := UpperCase(S);
+ if Pos('X', s1)>0 then begin
+ x := MyStrToInt(Trim(ExtractWord(1, s1, ['X'])));
+ y := MyStrToInt(Trim(ExtractWord(2, s1, ['X'])));
+ d1.Surface.SetSize(x, y);
+ d1.Initialize;
+ ClientWidth := x;
+ ClientHeight := y;
+ end else
+ if Pos('+', s1)>0 then begin
+ x := MyStrToInt(Trim(ExtractWord(1, s1, ['+'])));
+ y := MyStrToInt(Trim(ExtractWord(2, s1, ['+'])));
+ Left := x;
+ Top := y;
+ end else
+ Exit;
+ end else
+ if s1='DISPLAY' then begin
+ s1 := UpperCase(Trim(Copy(S, 8, 255)));
+ x := MyStrToInt(Trim(ExtractWord(1, s1, ['X'])));
+ y := MyStrToInt(Trim(ExtractWord(2, s1, ['X'])));
+ if (x>0) and (y>0) then begin
+ ClientWidth := x;
+ ClientHeight := y;
+ end;
+ end else
+ if s1='BORDERS_0' then begin
+ Borders(False);
+ end else
+ if s1='BORDERS_1' then begin
+ Borders(True);
+ end else
+ if s1='STAYONTOP_1' then begin
+ StayOnTop(True);
+ end else
+ if s1='STAYONTOP_0' then begin
+ StayOnTop(False);
+ end else
+ if s1='MUTE_0' then begin
+ MiMute.Checked := True;
+ MiMute.Click;
+ end else
+ if s1='MUTE_1' then begin
+ MiMute.Checked := False;
+ MiMute.Click;
+ end else
+ // FastLib effects
+ if s1='MOSAIC' then begin
+ i := MyStrToInt(ExtractWord(2, S, [' ']));
+ if i=0 then i:=6;
+ _prefx;
+ FastFX.Mosaic(fx1, i, i);
+ _postfx(fx1);
+ end else
+ if s1='SMOOTH_0' then begin
+ Smooth := False;
+ end else
+ if s1='SMOOTH_1' then begin
+ Smooth := True;
+ end else
+ if s1='ROTATE' then begin
+ i := MyStrToInt(ExtractWord(2, S, [' ']));
+ if i=0 then Exit;
+ _prefx;
+ fx2.SetSize(fx1.Width, fx1.Height, fx1.Bpp);
+ fx2.Clear(IntToColor(0));
+ FastFX.Rotate(fx1, fx2, i, Smooth);
+ _postfx(fx2);
+ end else
+ if s1='ROTOZOOM' then begin
+ i := MyStrToInt(ExtractWord(2, S, [' ']));
+ o := MyStrToInt(ExtractWord(3, S, [' ']));
+ if (i=0) and (o=0) then Exit;
+ _prefx;
+ fx2.SetSize(fx1.Width, fx1.Height, fx1.Bpp);
+ fx2.Clear(IntToColor(0));
+ FastFX.Rotozoom(fx1, fx2, i, o, Smooth);
+ _postfx(fx2);
+ end else
+ if s1='SATURATION' then begin
+ i := MyStrToInt(ExtractWord(2, S, [' ']));
+ _prefx;
+ FastFX.Saturation(fx1, i);
+ _postfx(fx1);
+ end else
+ if s1='INVERT' then begin
+ _prefx;
+ FastFX.Invert(fx1);
+ _postfx(fx1);
+ end else
+ if s1='SOFT' then begin
+ _prefx;
+ FastFX.QuickSoft(fx1);
+ _postfx(fx1);
+ end else
+ if s1='SHARP' then begin
+ _prefx;
+ FastFX.QuickSharp(fx1);
+ _postfx(fx1);
+ end else
+ if s1='EMBOSS' then begin
+ _prefx;
+ FastFX.QuickEmboss(fx1);
+ _postfx(fx1);
+ end else
+ if s1='ADDITION' then begin
+ i := MyStrToInt(ExtractWord(2, S, [' ']));
+ o := MyStrToInt(ExtractWord(3, S, [' ']));
+ u := MyStrToInt(ExtractWord(4, S, [' ']));
+ if (i=0) and (o=0) and (u=0) then Exit;
+ _prefx;
+ FastFX.Addition(fx1, i, o, u);
+ _postfx(fx1);
+ end else
+ if s1='GAMMA' then begin
+ i := MyStrToInt(ExtractWord(2, S, [' ']));
+ o := MyStrToInt(ExtractWord(3, S, [' ']));
+ u := MyStrToInt(ExtractWord(4, S, [' ']));
+ if (i=0) and (o=0) and (u=0) then Exit;
+ _prefx;
+ FastFX.Gamma(fx1, i, o, u);
+ _postfx(fx1);
+ end else
+ if s1='CONTRAST' then begin
+ i := MyStrToInt(ExtractWord(2, S, [' ']));
+ o := MyStrToInt(ExtractWord(3, S, [' ']));
+ u := MyStrToInt(ExtractWord(4, S, [' ']));
+ if (i=0) and (o=0) and (u=0) then Exit;
+ _prefx;
+ FastFX.Contrast(fx1, i, o, u);
+ _postfx(fx1);
+ end else
+ if s1='LIGHTNESS' then begin
+ i := MyStrToInt(ExtractWord(2, S, [' ']));
+ o := MyStrToInt(ExtractWord(3, S, [' ']));
+ u := MyStrToInt(ExtractWord(4, S, [' ']));
+ if (i=0) and (o=0) and (u=0) then Exit;
+ _prefx;
+ FastFX.Lightness(fx1, i, o, u);
+ _postfx(fx1);
+ end else
+ if s1='SCRAMBLE' then begin
+ scramble(d1.Surface);
+ FlipRequest;
+ end else
+ if s1='CONNECT' then begin
+ i:=WordCount(S, [' ']);
+ if i<3 then begin
+ main.Post('Usage: Connect <host> <port>');
+ Exit;
+ end;
+ s1:=ExtractWord(2, S, [' ']);
+ i := MyStrToInt(ExtractWord(3, S, [' ']));
+ if i<=0 then Exit;
+ if (main.csfs.Host<>s1) or (main.csfs.Port<>i) then begin
+ if main.csfs.Active then
+ main.csfs.Active:=False;
+ main.csfs.Host:=s1;
+ main.csfs.Port:=i;
+ end;
+ main.csfs.Open;
+ end else
+ if s1='DISCONNECT' then begin
+ main.csfs.Close;
+ end else
+ if (s1='SEND') or (s1='SEND_AUTO') then begin
+ i:=WordCount(S, [' ']);
+ if i<2 then begin
+ main.Post('Usage: Send <nametag> ["pure" for uncompressed or jpeg quality (default=80)]');
+ main.Post('Use "receive <nametag>" to set receiving fs.frame on the other end.');
+ Exit;
+ end;
+ sendjpg := True;
+ if i>2 then begin
+ Ext := UpperCase(ExtractWord(3, S, [' ']));
+ if Ext='PURE' then
+ sendjpg := False
+ else begin
+ jpegqualitynet := MyStrToInt(Ext);
+ if jpegqualitynet<=0 then jpegqualitynet:=80;
+ end;
+ end;
+ if sendjpg then
+ _prefx;
+ main.SendFrame(Self, ExtractWord(2, S, [' ']),
+ fx1, jpegqualitynet, sendjpg);
+ if s1='SEND_AUTO' then begin
+ AutoSend := True;
+ AutoSend_Address := ExtractWord(2, S, [' ']);
+ AutoSend_jpegqualitynet := jpegqualitynet;
+ AutoSend_sendjpg := sendjpg;
+ end;
+ end else
+ if s1='SEND_MANUAL' then begin
+ AutoSend := False;
+ end else
+ if s1='RECEIVE' then begin
+ Self.NameTag := ExtractWord(2, S, [' ']);
+ end else
+ if s1='MOUSETRACK_1' then begin
+ MouseTrack := True;
+ MiMouseTrack.Checked := True;
+ end else
+ if s1='MOUSETRACK_0' then begin
+ MouseTrack := False;
+ MiMouseTrack.Checked := False;
+ end else
+ if s1='MOUSERECT_1' then begin
+ MouseRect := True;
+ end else
+ if s1='MOUSERECT_0' then begin
+ MouseRect := False;
+ end else
+ if s1='HIDECURSOR_1' then begin
+ MiHideCursor.Checked := True;
+ HideCursor := True;
+ end else
+ if s1='HIDECURSOR_0' then begin
+ MiHideCursor.Checked := False;
+ HideCursor := False;
+ end else
+ if s1='DOCK' then begin
+ DockTitle := Copy(S, Length(s1)+2, 255);
+ DockHandle:=0;
+ EnumWindows(@mainunit.WinEnumerator_SubStr, 0);
+ if DockHandle>0 then begin
+ if MiBorders.Checked then
+ MiBorders.Click;
+ if GetWindowRect(DockHandle, R) then begin
+ d1.Hide;
+ WindowState := wsNormal;
+ ParentWindow := 0;
+ Parent := nil;
+ ParentWindow := DockHandle;
+ Left := 0;
+ Top := 0;
+ d1.Show;
+ d1.Initialize;
+ BringToFront;
+ DragAcceptFiles(Handle, True);
+ end;
+ end;
+ end else
+ if s1='SHOW' then begin
+ Self.Top := prevtop;
+ if not prevmute and MiMute.Checked then
+ MiMute.Click;
+ end else
+ if s1='HIDE' then begin
+ // ugly, but.
+ prevtop := Self.Top;
+ Self.Top := Screen.Height;
+ prevmute := MiMute.Checked;
+ if not prevmute then MiMute.Click;
+ end else
+ if s1='BUFFERIZE' then begin
+ _prefx;
+ fpic := TFastDIB.Create;
+ fpic.LoadFromHandle(fx1.Handle);
+ picBuf.Add(fpic);
+ end else
+ if s1='MAXIMIZE' then begin
+ WindowState := wsMaximized;
+ end else
+ if s1='MINIMIZE' then begin
+ WindowState := wsMinimized;
+ end else
+ if s1='BRINGTOFRONT' then begin
+ BringToFront;
+ end else
+ if s1='USE' then begin // use directory
+ s1 := Copy(S, Length(s1)+2, 255);
+ if DirectoryExists(s1) then begin
+ i := filelist.Count;
+ dirUse.Scan(s1);
+ main.Post('Using '+IntToStr(filelist.Count-i)+' images from '+s1+', total of '+IntToStr(filelist.Count));
+ end else
+ main.Post('nonexistent directory: '+s1);
+ end else
+ if s1='BUTTON' then begin
+ s1 := Copy(S, Length(s1)+2, 255);
+ if WordCount(s1, [' '])<>4 then Exit;
+ NewButton(ExtractWord(1, s1, [' ']), // receive name
+ MyStrToInt(ExtractWord(2, s1, [' '])), // x
+ MyStrToInt(ExtractWord(3, s1, [' '])), // y
+ ExtractWord(4, s1, [' ']) // caption
+ );
+ end else
+ if False{your new effect here} then begin
+ end else
+ if main.Plugins.IsPlugin(s1) then begin
+ if main.Plugins.CallEffect(d1.Surface, s1, Copy(S, Length(s1)+2, 255)) then
+ FlipRequest;
+ end else
+ if pshostunit.IsFilter(s1) then begin
+ pshostunit.Filter_effect(framepsh, d1.Surface, s1, Copy(S, Length(s1)+2, 255));
+ FlipRequest;
+ end else
+end;
+
+procedure Tfsframe.FormClose(Sender: TObject; var Action: TCloseAction);
+begin
+ Action := caFree;
+end;
+
+procedure Tfsframe.Mi11Click(Sender: TObject);
+begin
+ ClientWidth := d1.Surface.Width;
+ ClientHeight := d1.Surface.Height;
+end;
+
+procedure Tfsframe.Mi12Click(Sender: TObject);
+begin
+ ClientWidth := d1.Surface.Width * 2;
+ ClientHeight := d1.Surface.Height * 2;
+end;
+
+procedure Tfsframe.MiMuteClick(Sender: TObject);
+begin
+ MiMute.Checked := not MiMute.Checked;
+ d1.Visible := not MiMute.Checked;
+end;
+
+procedure Tfsframe.ClearPicBuf;
+var
+ f: TFastDIB;
+ i: Integer;
+begin
+ if picBuf.Count=0 then Exit;
+ for i:=picBuf.Count-1 downto 0 do begin
+ f := picBuf[i];
+ f.Free;
+ picBuf.Delete(i);
+ end;
+end;
+
+procedure Tfsframe.FlipRequest;
+begin
+ if AutoFlip then begin
+ d1.Flip;
+ AutoSendRequest;
+ end;
+end;
+
+procedure Tfsframe.AutoSendRequest;
+begin
+ if AutoSend and main.csfs.Active then begin
+ if AutoSend_sendjpg then
+ _prefx;
+ main.SendFrame(Self, AutoSend_address,
+ fx1, AutoSend_jpegqualitynet, AutoSend_sendjpg);
+ end;
+end;
+
+procedure Tfsframe.Borders(const Yes: Boolean);
+begin
+ _prefx;
+ d1.Hide;
+ if Yes and (ParentWindow=0) then
+ BorderStyle := bsSizeable
+ else
+ BorderStyle := bsNone;
+ d1.Show;
+ d1.Initialize;
+ _postfx(fx1);
+ MiBorders.Checked := Yes;
+ DragAcceptFiles(Handle, True);
+end;
+
+procedure Tfsframe.StayOnTop(const Yes: Boolean);
+begin
+ _prefx;
+ d1.Hide;
+ if Yes and (ParentWindow=0) then
+ FormStyle := fsStayOnTop
+ else
+ FormStyle := fsNormal;
+ d1.Show;
+ d1.Initialize;
+ _postfx(fx1);
+ MiStayOnTop.Checked := Yes;
+ DragAcceptFiles(Handle, True);
+end;
+
+procedure Tfsframe.MiBordersClick(Sender: TObject);
+begin
+ if Docked then Exit;
+ MiBorders.Checked := not MiBorders.Checked;
+ Borders(MiBorders.Checked);
+end;
+
+procedure Tfsframe.MiStayOnTopClick(Sender: TObject);
+begin
+ if Docked then Exit;
+ MiStayOnTop.Checked := not MiStayOnTop.Checked;
+ StayOnTop(MiStayOnTop.Checked);
+end;
+
+procedure Tfsframe.dirBufferHandleFile(const SearchRec: TSearchRec;
+ const FullPath: String);
+var
+ S: String;
+begin
+ S := UpperCase(ExtractFileExt(FullPath));
+ if (S='.BMP') or (S='.JPG') then
+ Parse('BUFFER '+FullPath);
+end;
+
+procedure Tfsframe.dirUseHandleFile(const SearchRec: TSearchRec;
+ const FullPath: String);
+var
+ S: String;
+begin
+ S := UpperCase(ExtractFileExt(FullPath));
+ if (S='.BMP') or (S='.JPG') then
+ filelist.Add(FullPath);
+end;
+
+function Tfsframe.Getnextfilename(const dir, ext: String): String;
+const
+ pref = 'fs';
+ last: Integer = 0;
+ predir: string = '';
+var
+ S: String;
+begin
+ if dir<>predir then last := 0;
+ repeat
+ Inc(last);
+ S := pref + IntToStr(last);
+ while Length(S)<8 do Insert('0', S, 3);
+ S := S+ext;
+ until not FileExists(S);
+ Result := S;
+ predir := dir;
+end;
+
+procedure Tfsframe.FormCreate(Sender: TObject);
+begin
+ ClientWidth := 176;
+ ClientHeight := 144;
+ d1.SetSize( ClientWidth, ClientHeight );
+ d1.Initialize;
+ with d1.Surface.Canvas do begin
+ Pen.Color := clWhite;
+ Brush.Color := clWhite;
+ Font.Color := clWhite;
+ end;
+ d1.Surface.Canvas.Release;
+ AutoFlip := True;
+ AutoSend := False;
+ Smooth := True;
+ avi := TDcAviPlayer.Create(Self);
+ avi.Parent := Self;
+ avi.Visible := False;
+ avi.Transparent := False;
+ avi.Stretch := False;
+ avi.PlaySound := False;
+ fx1 := TFastDIB.Create;
+ fx2 := TFastDIB.Create;
+ picBuf := TFastDIBList.Create;
+ picIndex := -1;
+ MouseTrack := False;
+ MouseRect := False;
+ HideCursor := False;
+ jpgquality := 85;
+ jpegqualitynet := 80;
+ prevtop := 0;
+ prevmute := False;
+ filelist := TStringList.Create;
+ filelistIndex := -1;
+ DragAcceptFiles(Handle, True);
+end;
+
+procedure Tfsframe.FormDestroy(Sender: TObject);
+begin
+ avi.Free;
+ fx1.Free;
+ fx2.Free;
+ ClearPicBuf;
+ picBuf.Free;
+ filelist.Free;
+end;
+
+var
+ LeftDown: Boolean;
+ OrgX, OrgY: Integer;
+
+procedure Tfsframe.d1MouseDown(Sender: TObject; Button: TMouseButton;
+ Shift: TShiftState; X, Y: Integer);
+begin
+ case Button of
+ mbLeft: begin
+ LeftDown := True;
+ main.SendReturnValues(PdName+'mousedown=1');
+ if MouseTrack and not MouseRect and not (ssAlt in Shift) then
+ SendMouseTrack(X, Y)
+ else begin
+ OrgX := X;
+ OrgY := Y;
+ end;
+ end;
+ end;
+end;
+
+procedure Tfsframe.d1MouseMove(Sender: TObject; Shift: TShiftState; X,
+ Y: Integer);
+begin
+ if LeftDown then begin
+ if MouseTrack and not (ssAlt in Shift) then begin
+ if not MouseRect then
+ SendMouseTrack(X, Y)
+ else
+ SendMouseRect(OrgX, OrgY, X, Y);
+ end else begin
+ Left := Left + (X-OrgX);
+ Top := Top + (Y-OrgY);
+ end;
+ end;
+end;
+
+procedure Tfsframe.d1MouseUp(Sender: TObject; Button: TMouseButton;
+ Shift: TShiftState; X, Y: Integer);
+begin
+ case Button of
+ mbLeft: begin
+ LeftDown:=False;
+(* these values were sent at "mousemove"
+ if MouseRect then
+ SendMouseRect(OrgX, OrgY, X, Y);*)
+ main.SendReturnValues(PdName+'mouseup=1');
+ if not MouseTrack or (ssAlt in Shift) then begin
+// main.Post('moved to '+
+// IntToStr(Left)+'+'+
+// IntToStr(Top)
+// );
+ main.SendReturnValues(
+ PdName+'winy='+IntToStr(Top)+';'+
+ PdName+'winx='+IntToStr(Left)
+ );
+ end;
+ end;
+ end;
+end;
+
+procedure Tfsframe.SendMouseTrack(const X, Y: Integer);
+var
+ a, b: Integer;
+begin
+ a := X;
+ b := Y;
+ // handle aspect ratios different from 1:1
+ if d1.Surface.Width<>d1.Width then
+ a := Trunc((d1.Surface.Width / d1.Width) * X);
+ if d1.Surface.Height<>d1.Height then
+ b := Trunc((d1.Surface.Height / d1.Height) * Y);
+
+ main.SendReturnValues(
+ PdName+'y='+IntToStr(b)+';'+
+ PdName+'x='+IntToStr(a)
+ );
+end;
+
+procedure Tfsframe.SendMouseRect(const x1, y1, x2, y2: Integer);
+var
+ a, b, c, d: Integer;
+begin
+ a := x1;
+ b := y1;
+ c := x2;
+ d := y2;
+ // handle aspect ratios different from 1:1
+ if d1.Surface.Width<>d1.Width then
+ a := Trunc((d1.Surface.Width / d1.Width) * x1);
+ if d1.Surface.Height<>d1.Height then
+ b := Trunc((d1.Surface.Height / d1.Height) * y1);
+ if d1.Surface.Width<>d1.Width then
+ c := Trunc((d1.Surface.Width / d1.Width) * x2);
+ if d1.Surface.Height<>d1.Height then
+ d := Trunc((d1.Surface.Height / d1.Height) * y2);
+
+ main.SendReturnValues(
+ PdName+'y2='+IntToStr(d)+';'+
+ PdName+'x2='+IntToStr(c)+';'+
+ PdName+'y1='+IntToStr(b)+';'+
+ PdName+'x1='+IntToStr(a)
+ );
+end;
+
+procedure Tfsframe.MiMouseTrackClick(Sender: TObject);
+begin
+ MouseTrack := not MouseTrack;
+ MiMouseTrack.Checked := MouseTrack;
+end;
+
+procedure Tfsframe.HandleDroppedFile(const S: String);
+var
+ i: Integer;
+ St: String;
+begin
+ Parse(S);
+ main.SendReturnValues(PdName+'bang=1');
+ // send string as a series of ascii..
+ main.SendReturnValuesString(PDName+'file', S);
+end;
+
+procedure Tfsframe.MiBufferImagesClick(Sender: TObject);
+var
+ i: Integer;
+ s: String;
+begin
+ if opd1.Execute then begin
+ if opd1.Files.Count>0 then
+ for i:=0 to opd1.Files.Count-1 do begin
+ if '.AVI'<>UpperCase(ExtractFileExt(opd1.files[i])) then
+ s := 'BUFFER '
+ else
+ s := '';
+ Parse(s+opd1.files[i]);
+ end;
+ // tee uusi canvas jossa valitut failit....
+ end;
+{
+#N canvas 0 0 700 300 12;
+#X obj 23 17 inlet;
+#X obj 15 45 outlet;
+#X msg 71 17 buffer file1.bmp \, buffer file2.bmp \, buffer file3.bmp;
+#X connect 0 0 2 0;
+#X connect 2 0 1 0;
+}
+end;
+
+function Tfsframe.GetDocked: Boolean;
+begin
+ Result := ParentWindow<>0;
+end;
+
+procedure Tfsframe.PopupMenu1Popup(Sender: TObject);
+begin
+ MiBorders.Enabled := not Docked;
+ MiStayOnTop.Enabled := not Docked;
+ MiUndock.Enabled := Docked;
+end;
+
+procedure Tfsframe.MiSaveFrameClick(Sender: TObject);
+var
+ S: String;
+begin
+ if svd1.Execute then begin
+ S := svd1.Filename;
+ if Uppercase(ExtractFileExt(S))<>'.BMP' then
+ S := S+'.bmp';
+ _prefx;
+ fx1.SaveToFile(S);
+ end;
+{
+ _prefx;
+ if savejpg then
+ SaveJPGFile(fx1, s1+'\'+fs, jpgquality)
+ else
+ fx1.SaveToFile(s1+'\'+fs);
+}
+end;
+
+procedure Tfsframe.Mi176x144Click(Sender: TObject);
+begin
+ Parse('display 176x144');
+end;
+
+procedure Tfsframe.SetHideCursor(const Value: Boolean);
+begin
+ FHideCursor := Value;
+ if Value then
+ d1.Cursor := crNone
+ else
+ d1.Cursor := crDefault;
+end;
+
+procedure Tfsframe.MiHideCursorClick(Sender: TObject);
+begin
+ MiHideCursor.Checked := not MiHideCursor.Checked;
+ HideCursor := MiHideCursor.Checked;
+end;
+
+procedure Tfsframe.FormMouseWheel(Sender: TObject; Shift: TShiftState;
+ WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
+var
+ asp: Extended;
+begin
+ if WheelDelta>0 then begin
+ ClientWidth := Trunc(ClientWidth * (WheelDelta / 100));
+ if not (ssShift in Shift) then
+ ClientHeight := Trunc(ClientHeight * (WheelDelta / 100));
+ end else begin
+ ClientWidth := Trunc(ClientWidth / Abs(WheelDelta / 100));
+ if not (ssShift in Shift) then
+ ClientHeight := Trunc(ClientHeight / Abs(WheelDelta / 100));
+ end;
+ // correct aspect ratio...
+ if ssShift in Shift then begin
+ asp := d1.Surface.Width / d1.Surface.Height;
+ if asp>0 then
+ ClientHeight := Trunc(ClientWidth / asp);
+ end;
+end;
+
+procedure Tfsframe.MiUndockClick(Sender: TObject);
+begin
+ ParentWindow := 0;
+ Borders(True);
+end;
+
+procedure Tfsframe.NewButton(const receivename: String; const x,
+ y: Integer; const buttoncaption: String);
+var
+ p: TPanel;
+ b: TFSSpeedButton;
+begin
+ p := TPanel.Create(Self);
+ b := TFSSpeedButton.Create(Self);
+
+ b.Width := LabelFoo.Canvas.TextWidth(buttoncaption)+12;
+ b.Height := 18;
+ b.Parent := p;
+ b.Left := 0;
+ b.Top := 0;
+ b.Flat := True;
+ b.Caption := buttoncaption;
+ b.Receivename := receivename;
+ p.AutoSize := True;
+ p.Left := x;
+ p.Top := y;
+ p.BevelOuter := bvNone;
+ p.Parent := d1;
+end;
+
+end.
+
diff --git a/Source/fsinfounit.dfm b/Source/fsinfounit.dfm
new file mode 100644
index 0000000..3079d24
--- /dev/null
+++ b/Source/fsinfounit.dfm
@@ -0,0 +1,16 @@
+object fsinfo: Tfsinfo
+ Left = 242
+ Top = 103
+ Width = 356
+ Height = 122
+ Caption = 'fsinfo'
+ Color = clBtnFace
+ Font.Charset = DEFAULT_CHARSET
+ Font.Color = clWindowText
+ Font.Height = -11
+ Font.Name = 'MS Sans Serif'
+ Font.Style = []
+ OldCreateOrder = False
+ PixelsPerInch = 96
+ TextHeight = 13
+end
diff --git a/Source/fsinfounit.pas b/Source/fsinfounit.pas
new file mode 100644
index 0000000..d8de65d
--- /dev/null
+++ b/Source/fsinfounit.pas
@@ -0,0 +1,53 @@
+unit fsinfounit;
+
+interface
+
+uses
+ Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
+ fsformunit;
+
+type
+ Tfsinfo = class(TFsForm)
+ private
+ { Private declarations }
+ public
+ { Public declarations }
+ procedure Parse(const S: String); override;
+ end;
+
+var
+ fsinfo: Tfsinfo;
+
+implementation
+
+uses
+ mainunit, fsframeunit,
+ Strz;
+
+{$R *.DFM}
+
+{ Tfsinfo }
+
+procedure Tfsinfo.Parse(const S: String);
+var
+ s1: String;
+ f: TFsFrame;
+begin
+ if (S='') or
+ (WordCount(S, [' '])<5) or
+ (not main.cstoPd.Active) then Exit;
+
+ s1 := ExtractWord(1, S, [' ']);
+ f := FindFrame(s1);
+ if f=nil then Exit;
+
+ main.SendReturnValues(
+ ExtractWord(5, S, [' '])+'='+IntToStr(f.Avi.FrameRate)+';'+
+ ExtractWord(4, S, [' '])+'='+IntToStr(f.Avi.FrameCount)+';'+
+ ExtractWord(3, S, [' '])+'='+IntToStr(f.d1.Surface.Height)+';'+
+ ExtractWord(2, S, [' '])+'='+IntToStr(f.d1.Surface.Width)
+ );
+end;
+
+end.
+
diff --git a/Source/fsspeedbutton.pas b/Source/fsspeedbutton.pas
new file mode 100644
index 0000000..da3d53a
--- /dev/null
+++ b/Source/fsspeedbutton.pas
@@ -0,0 +1,48 @@
+unit fsspeedbutton;
+
+interface
+
+uses
+ Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
+ Buttons;
+
+type
+ TFSSpeedButton = class(TSpeedButton)
+ private
+ { Private declarations }
+ procedure MyOnClick(Sender: TObject);
+ protected
+ { Protected declarations }
+ public
+ { Public declarations }
+ Receivename: String;
+ constructor Create(AOwner: TComponent); override;
+ published
+ { Published declarations }
+ end;
+
+procedure Register;
+
+implementation
+
+uses
+ mainunit;
+
+procedure Register;
+begin
+end;
+
+{ TFSSpeedButton }
+
+constructor TFSSpeedButton.Create(AOwner: TComponent);
+begin
+ inherited;
+ OnClick := MyOnClick;
+end;
+
+procedure TFSSpeedButton.MyOnClick(Sender: TObject);
+begin
+ main.SendReturnValues(Receivename+'=1');
+end;
+
+end.
diff --git a/Source/fstextunit.dfm b/Source/fstextunit.dfm
new file mode 100644
index 0000000..c8ff138
--- /dev/null
+++ b/Source/fstextunit.dfm
@@ -0,0 +1,18 @@
+object fstext: Tfstext
+ Left = 231
+ Top = 103
+ Width = 236
+ Height = 79
+ Caption = 'fstext'
+ Color = clBtnFace
+ Font.Charset = DEFAULT_CHARSET
+ Font.Color = clWindowText
+ Font.Height = -11
+ Font.Name = 'MS Sans Serif'
+ Font.Style = []
+ OldCreateOrder = False
+ WindowState = wsMinimized
+ OnCreate = FormCreate
+ PixelsPerInch = 96
+ TextHeight = 13
+end
diff --git a/Source/fstextunit.pas b/Source/fstextunit.pas
new file mode 100644
index 0000000..92230db
--- /dev/null
+++ b/Source/fstextunit.pas
@@ -0,0 +1,148 @@
+{ Copyright (C) 2001 Juha Vehviläinen
+ 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.}
+
+unit fstextunit;
+
+interface
+
+uses
+ Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
+ mainunit, fsformunit, fsframeunit;
+
+type
+ Tfstext = class(TFsForm)
+ procedure FormCreate(Sender: TObject);
+ private
+ { Private declarations }
+ dest: TFsFrame;
+ x, y: Integer;
+ public
+ { Public declarations }
+ procedure Parse(const S: String); override;
+ end;
+
+var
+ fstext: Tfstext;
+
+function ParsePenProperties(const Canvas: TCanvas; const S: String): Boolean;
+
+implementation
+
+{$R *.DFM}
+
+uses
+ Strz;
+
+function ParsePenProperties(const Canvas: TCanvas; const S: String): Boolean;
+var
+ s1: String;
+ r, g, b: Integer;
+begin
+ Result := False;
+ s1 := UpperCase(ExtractWord(1, S, [' ']));
+ if s1='PEN' then begin
+ if WordCount(S, [' '])<4 then
+ main.Post('Usage: PEN <r> <g> <b>')
+ else begin
+ r := MyStrToInt(ExtractWord(2, S, [' ']));
+ g := MyStrToInt(ExtractWord(3, S, [' ']));
+ b := MyStrToInt(ExtractWord(4, S, [' ']));
+ Canvas.Pen.Color := RGB(r, g, b);
+ end;
+ Result := True;
+ end else
+ if s1='BRUSH' then begin
+ if WordCount(S, [' '])<4 then
+ main.Post('Usage: BRUSH <r> <g> <b>')
+ else begin
+ r := MyStrToInt(ExtractWord(2, S, [' ']));
+ g := MyStrToInt(ExtractWord(3, S, [' ']));
+ b := MyStrToInt(ExtractWord(4, S, [' ']));
+ Canvas.Brush.Color := RGB(r, g, b);
+ end;
+ Result := True;
+ end else
+ if s1='COLOR' then begin
+ if WordCount(S, [' '])<4 then
+ main.Post('Usage: COLOR <r> <g> <b>')
+ else begin
+ r := MyStrToInt(ExtractWord(2, S, [' ']));
+ g := MyStrToInt(ExtractWord(3, S, [' ']));
+ b := MyStrToInt(ExtractWord(4, S, [' ']));
+ Canvas.Font.Color := RGB(r, g, b);
+ end;
+ Result := True;
+ end else
+ if s1='SIZE' then begin
+ Canvas.Font.Size := MyStrToInt(ExtractWord(2, S, [' ']));
+ Result := True;
+ end else
+ if s1='FONT' then begin
+ Canvas.Font.Name := Copy(S, Length(s1)+2, 255);
+ Result := True;
+ end else
+end;
+
+{ Tfstext }
+
+procedure Tfstext.Parse(const S: String);
+const
+ y: Integer = 0;
+var
+ s1, sa: String;
+ b: Boolean;
+begin
+ if (S='') then Exit;
+
+ s1 := ExtractWord(WordCount(S, [' ']), S, [' ']);
+ dest := FindFrame(s1);
+ if (dest=nil) or (dest.d1=nil) then Exit;
+
+ sa := Copy(S, 1, Pos(s1, S)-2);
+
+ b := ParsePenProperties(dest.d1.Surface.Canvas, UpperCase(sa));
+ dest.d1.Surface.Canvas.Release;
+ if b then Exit;
+
+ s1 := UpperCase(ExtractWord(1, sa, [' ']));
+ if s1='POS' then begin
+ self.x := MyStrToInt(ExtractWord(2, sa, [' ']));
+ self.y := MyStrToInt(ExtractWord(3, sa, [' ']));
+ Exit;
+ end;
+
+ with dest.d1.Surface.Canvas do begin
+ Brush.Style := bsClear;
+
+ if (self.x>-1) and (self.y>-1) then
+ TextOut(self.x, self.y, sa)
+ else begin
+ TextOut(0, y, sa);
+
+ Inc(Y, TextHeight(S));
+ if y>dest.d1.Surface.Height then
+ y := 0;
+ end;
+ end;
+ dest.d1.Surface.Canvas.Release;
+
+ dest.FlipRequest;
+end;
+
+procedure Tfstext.FormCreate(Sender: TObject);
+begin
+ dest := nil;
+ x := -1;
+ y := -1;
+end;
+
+end.
+
diff --git a/Source/logunit.dfm b/Source/logunit.dfm
new file mode 100644
index 0000000..bd8c429
--- /dev/null
+++ b/Source/logunit.dfm
@@ -0,0 +1,100 @@
+object log: Tlog
+ Left = 239
+ Top = 39
+ Width = 603
+ Height = 666
+ BorderStyle = bsSizeToolWin
+ Caption = 'Console / Log'
+ Color = clBtnFace
+ Font.Charset = DEFAULT_CHARSET
+ Font.Color = clWindowText
+ Font.Height = -11
+ Font.Name = 'MS Sans Serif'
+ Font.Style = []
+ OldCreateOrder = False
+ Position = poDesktopCenter
+ OnCreate = FormCreate
+ PixelsPerInch = 96
+ TextHeight = 13
+ object PanelLog: TPanel
+ Left = 0
+ Top = 221
+ Width = 595
+ Height = 418
+ Align = alClient
+ BevelOuter = bvNone
+ TabOrder = 0
+ object Panel2: TPanel
+ Left = 0
+ Top = 400
+ Width = 595
+ Height = 18
+ Align = alBottom
+ AutoSize = True
+ BevelOuter = bvNone
+ TabOrder = 0
+ object ButtonClear: TButton
+ Left = 75
+ Top = 0
+ Width = 75
+ Height = 18
+ Caption = 'Clear'
+ TabOrder = 1
+ OnClick = ButtonClearClick
+ end
+ object ButtonClose: TButton
+ Left = 0
+ Top = 0
+ Width = 75
+ Height = 18
+ Caption = 'Close'
+ Default = True
+ TabOrder = 0
+ OnClick = ButtonCloseClick
+ end
+ end
+ object RELog: TRichEdit
+ Left = 0
+ Top = 0
+ Width = 595
+ Height = 400
+ Align = alClient
+ BorderStyle = bsNone
+ Ctl3D = True
+ ParentCtl3D = False
+ PlainText = True
+ ScrollBars = ssVertical
+ TabOrder = 1
+ WordWrap = False
+ end
+ end
+ object Panel1: TPanel
+ Left = 0
+ Top = 203
+ Width = 595
+ Height = 18
+ Align = alTop
+ BevelOuter = bvLowered
+ Caption = 'Log'
+ TabOrder = 2
+ end
+ object PanelConsole: TPanel
+ Left = 0
+ Top = 18
+ Width = 595
+ Height = 185
+ Align = alTop
+ BevelOuter = bvNone
+ TabOrder = 1
+ end
+ object Panel3: TPanel
+ Left = 0
+ Top = 0
+ Width = 595
+ Height = 18
+ Align = alTop
+ BevelOuter = bvLowered
+ Caption = 'Console'
+ TabOrder = 3
+ end
+end
diff --git a/Source/logunit.pas b/Source/logunit.pas
new file mode 100644
index 0000000..187684f
--- /dev/null
+++ b/Source/logunit.pas
@@ -0,0 +1,60 @@
+unit logunit;
+
+interface
+
+uses
+ Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
+ StdCtrls, ComCtrls, ExtCtrls;
+
+type
+ Tlog = class(TForm)
+ PanelLog: TPanel;
+ Panel2: TPanel;
+ ButtonClear: TButton;
+ RELog: TRichEdit;
+ PanelConsole: TPanel;
+ Panel1: TPanel;
+ Panel3: TPanel;
+ ButtonClose: TButton;
+ procedure ButtonClearClick(Sender: TObject);
+ procedure FormCreate(Sender: TObject);
+ procedure ButtonCloseClick(Sender: TObject);
+ private
+ { Private declarations }
+ public
+ { Public declarations }
+ procedure add(const s: String);
+ end;
+
+var
+ log: Tlog;
+
+implementation
+
+uses mainunit;
+
+{$R *.DFM}
+
+procedure Tlog.add(const s: String);
+begin
+ RELog.Lines.Add(s);
+end;
+
+procedure Tlog.ButtonCloseClick(Sender: TObject);
+begin
+ main.MiLog.Click;
+end;
+
+procedure Tlog.ButtonClearClick(Sender: TObject);
+begin
+ main.REConsole.Lines.Clear;
+ RELog.Lines.Clear;
+end;
+
+procedure Tlog.FormCreate(Sender: TObject);
+begin
+ main.REConsole.Parent := PanelConsole;
+ main.REConsole.Align := alClient;
+end;
+
+end.
diff --git a/Source/mainunit.dfm b/Source/mainunit.dfm
new file mode 100644
index 0000000..46a9252
--- /dev/null
+++ b/Source/mainunit.dfm
@@ -0,0 +1,3547 @@
+object main: Tmain
+ Left = 16
+ Top = 497
+ Width = 239
+ Height = 223
+ Caption = 'Framestein'
+ Color = clBtnFace
+ Font.Charset = DEFAULT_CHARSET
+ Font.Color = clWindowText
+ Font.Height = -11
+ Font.Name = 'MS Sans Serif'
+ Font.Style = []
+ OldCreateOrder = False
+ OnClose = FormClose
+ OnCreate = FormCreate
+ OnDestroy = FormDestroy
+ PixelsPerInch = 96
+ TextHeight = 13
+ object ImageLogo: TImage
+ Left = 0
+ Top = 0
+ Width = 231
+ Height = 196
+ Align = alClient
+ Picture.Data = {
+ 07544269746D617086AE0100424D86AE0100000000003600000028000000D700
+ 0000AA000000010018000000000050AE0100120B0000120B0000000000000000
+ 00005C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C0000005C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C0000005C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C0000005C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ 00005C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C0000005C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C0000005C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C0000005C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ 00005C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C0000005C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C0000005C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C0000005C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ 00005C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C0000005C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C0000005C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C0000005C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF
+ 00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2
+ FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF
+ 00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2
+ FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00
+ D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ 00005C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF
+ 00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2
+ FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF
+ 00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2
+ FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00
+ D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C0000005C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF
+ 00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2
+ FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00
+ D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF
+ 00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2
+ FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF
+ 00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2
+ FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00
+ D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C0000005C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF
+ 00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2
+ FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF
+ 00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2
+ FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00
+ D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF
+ 00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2
+ FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C0000005C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF
+ 00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2
+ FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF
+ 00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2
+ FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00
+ D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ 00005C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C0000005C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C0000005C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C0000005C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ 00005C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C0000005C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF
+ 00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2
+ FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00
+ D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C0000005C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF
+ 00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2
+ FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00
+ D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF
+ 00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2
+ FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C0000005C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF
+ 00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2
+ FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ 00005C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C0000005C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF
+ 00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2
+ FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00
+ D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C0000005C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2
+ FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00
+ D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2
+ FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C0000005C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF
+ 00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2
+ FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ 00005C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C0000005C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00
+ D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C0000005C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2
+ FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00
+ D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2
+ FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C0000005C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF
+ 00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2
+ FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF
+ 00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2
+ FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00
+ D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ 00005C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF
+ 00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2
+ FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF
+ 00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2
+ FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00
+ D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C0000005C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF
+ 00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2
+ FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00
+ D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF
+ 00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2
+ FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF
+ 00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2
+ FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00
+ D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C0000005C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF
+ 00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2
+ FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF
+ 00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2
+ FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00
+ D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF
+ 00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2
+ FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C0000005C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF
+ 00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2
+ FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF
+ 00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2
+ FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00
+ D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ 00005C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C0000005C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C0000005C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C0000005C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ 00005C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C0000005C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF
+ 00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2
+ FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00
+ D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF
+ 00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2
+ FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF
+ 00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2
+ FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C0000005C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF
+ 00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2
+ FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF
+ 00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2
+ FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00
+ D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF
+ 00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C0000005C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF
+ 00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2
+ FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF
+ 00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2
+ FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00
+ D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ 00005C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF
+ 00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2
+ FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF
+ 00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2
+ FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00
+ D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C0000005C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF
+ 00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2
+ FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00
+ D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF
+ 00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2
+ FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF
+ 00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2
+ FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C0000005C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2
+ FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00
+ D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2
+ FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C0000005C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF
+ 00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2
+ FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ 00005C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C0000005C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00
+ D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C0000005C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2
+ FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00
+ D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2
+ FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C0000005C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF
+ 00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2
+ FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ 00005C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF
+ 00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2
+ FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C0000005C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF
+ 00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF
+ 00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2
+ FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C0000005C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF
+ 00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2
+ FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF
+ 00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C0000005C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF
+ 00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2
+ FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ 00005C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF
+ 00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2
+ FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF
+ 00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2
+ FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00
+ D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C0000005C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF
+ 00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2
+ FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C0000005C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2
+ FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C0000005C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2
+ FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF
+ 00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF
+ 00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2
+ FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ 00005C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF
+ 00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2
+ FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF
+ 00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2
+ FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00
+ D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C0000005C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF
+ 00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2
+ FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00
+ D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF
+ 00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2
+ FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF
+ 00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2
+ FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00
+ D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C0000005C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF
+ 00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2
+ FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF
+ 00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2
+ FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00
+ D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF
+ 00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2
+ FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C0000005C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF
+ 00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2
+ FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF
+ 00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2
+ FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00
+ D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ 00005C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF
+ 00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2
+ FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF
+ 00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2
+ FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00
+ D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C0000005C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF
+ 00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2
+ FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00
+ D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF
+ 00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2
+ FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF
+ 00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2
+ FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00
+ D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C0000005C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF
+ 00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2
+ FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF
+ 00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2
+ FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00
+ D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF
+ 00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2
+ FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C0000005C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF
+ 00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2
+ FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF
+ 00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2
+ FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00
+ D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ 00005C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF
+ 00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2
+ FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF
+ 00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2
+ FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00
+ D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C0000005C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF
+ 00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2
+ FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00
+ D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF
+ 00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2
+ FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF
+ 00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2
+ FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00
+ D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C0000005C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF
+ 00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2
+ FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF
+ 00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2
+ FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00
+ D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF
+ 00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2
+ FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C0000005C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ 00005C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C0000005C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C0000005C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C0000005C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ 00005C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C0000005C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2
+ FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00
+ D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C0000005C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF
+ 00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2
+ FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00
+ D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF
+ 00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2
+ FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C0000005C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF
+ 00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2
+ FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ 00005C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C0000005C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00
+ D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C0000005C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2
+ FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00
+ D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2
+ FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C0000005C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF
+ 00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2
+ FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ 00005C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C0000005C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00
+ D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C0000005C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF
+ 00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2
+ FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2
+ FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C0000005C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF
+ 00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF
+ 00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2
+ FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ 00005C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00
+ D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF
+ 00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C0000005C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00
+ D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C0000005C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF
+ 00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2
+ FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2
+ FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C0000005C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2
+ FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF
+ 00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF
+ 00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2
+ FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5CED
+ EB325C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF
+ 00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2
+ FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF
+ 00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2
+ FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00
+ D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5CBDADAF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF
+ 00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2
+ FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C6D05BB5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2
+ FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5CF56EED5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2
+ FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF
+ 00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF
+ 00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2
+ FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C2F
+ E8ED5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C4D6FF85C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C0000005C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C0000005C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ 00005C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C0000005C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00
+ D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C0000005C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF
+ 00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2
+ FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00
+ D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2
+ FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C0000005C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF
+ 00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2
+ FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ 00005C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C0000005C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00
+ D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C0000005C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF
+ 00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2
+ FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF
+ 00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2
+ FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00
+ D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF
+ 00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2
+ FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C0000005C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF
+ 00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2
+ FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF
+ 00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2
+ FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00
+ D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ 00005C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF
+ 00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2
+ FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF
+ 00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2
+ FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00
+ D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C0000005C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF
+ 00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2
+ FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00
+ D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF
+ 00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2
+ FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF
+ 00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2
+ FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00
+ D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C0000005C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF
+ 00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2
+ FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF
+ 00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2
+ FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00
+ D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF
+ 00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2
+ FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C0000005C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF
+ 00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2
+ FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2
+ FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ 00005C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF
+ 00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C0000005C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00
+ D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2
+ FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00
+ D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C0000005C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2
+ FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF
+ 00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2
+ FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00
+ D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF
+ 00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2
+ FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C0000005C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF
+ 00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2
+ FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2
+ FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ 00005C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF
+ 00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2
+ FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF
+ 00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2
+ FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00
+ D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C0000005C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF
+ 00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2
+ FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00
+ D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF
+ 00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2
+ FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF
+ 00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2
+ FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00
+ D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C0000005C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF
+ 00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2
+ FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF
+ 00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2
+ FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00
+ D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF
+ 00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2
+ FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C0000005C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF
+ 00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2
+ FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF
+ 00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2
+ FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00
+ D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ 00005C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF
+ 00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2
+ FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF
+ 00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2
+ FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00
+ D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C0000005C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C0000005C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C0000005C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ 00005C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C0000005C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C0000005C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF
+ 00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2
+ FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00
+ D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF
+ 00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2
+ FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF
+ 00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2
+ FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C0000005C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00
+ D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF
+ 00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ 00005C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF
+ 00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C0000005C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF
+ 00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00
+ D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2
+ FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00
+ D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF
+ 00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2
+ FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00
+ D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C0000005C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF
+ 00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2
+ FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00
+ D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF
+ 00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2
+ FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF
+ 00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2
+ FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C0000005C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ 00005C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C0000005C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C0000005C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C0000005C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ 00005C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF
+ 00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2
+ FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF
+ 00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2
+ FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00
+ D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C0000005C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF
+ 00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2
+ FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00
+ D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF
+ 00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2
+ FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF
+ 00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2
+ FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00
+ D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C0000005C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF
+ 00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2
+ FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF
+ 00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2
+ FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00
+ D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF
+ 00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2
+ FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C0000005C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF
+ 00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2
+ FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF
+ 00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2
+ FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00
+ D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ 00005C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF
+ 00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2
+ FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF
+ 00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2
+ FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00
+ D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C0000005C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C0000005C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C0000005C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ 00005C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C0000005C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C0000005C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF
+ 00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2
+ FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF
+ 00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2
+ FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00
+ D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF
+ 00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2
+ FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C0000005C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF
+ 00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2
+ FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF
+ 00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2
+ FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00
+ D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ 00005C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF
+ 00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2
+ FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF
+ 00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2
+ FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00
+ D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C0000005C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF
+ 00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2
+ FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00
+ D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF
+ 00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2
+ FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF
+ 00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2
+ FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00
+ D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C0000005C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF
+ 00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2
+ FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF
+ 00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2
+ FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00
+ D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF
+ 00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2
+ FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C0000005C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ 00005C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C0000005C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C0000005C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C0000005C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ 00005C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C0000005C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C0000005C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C0000005C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00
+ 00005C5C5C5C5C5C5C5C5C5C5C5C5C5C5C00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2
+ FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00
+ D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF
+ 00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF00D2FF5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5CEDEB325C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5CBDADAF5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C6D05BB5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5CF5
+ 6EED5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C2FE8ED5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C
+ 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C4D6FF8}
+ PopupMenu = PopupMenu1
+ Stretch = True
+ OnDblClick = ImageLogoDblClick
+ end
+ object REConsole: TRichEdit
+ Left = 136
+ Top = 104
+ Width = 81
+ Height = 73
+ BorderStyle = bsNone
+ ReadOnly = True
+ ScrollBars = ssVertical
+ TabOrder = 0
+ end
+ object ss1: TServerSocket
+ Active = False
+ Port = 6001
+ ServerType = stNonBlocking
+ OnClientConnect = ss1ClientConnect
+ OnClientDisconnect = ss1ClientDisconnect
+ OnClientRead = ss1ClientRead
+ OnClientError = ss1ClientError
+ end
+ object PopupMenu1: TPopupMenu
+ Left = 64
+ object MiConfig: TMenuItem
+ Caption = 'Configure'
+ OnClick = MiConfigClick
+ end
+ object MiReset: TMenuItem
+ Caption = 'Reset'
+ OnClick = MiResetClick
+ end
+ object MiReloadPlugins: TMenuItem
+ Caption = 'Reload plugins'
+ OnClick = MiReloadPluginsClick
+ end
+ object MiLog: TMenuItem
+ Caption = 'Show debug'
+ OnClick = MiLogClick
+ end
+ object MiExit: TMenuItem
+ Caption = 'E&xit'
+ OnClick = MiExitClick
+ end
+ end
+ object ssfs: TServerSocket
+ Active = False
+ Port = 6002
+ ServerType = stNonBlocking
+ OnClientConnect = ssfsClientConnect
+ OnClientDisconnect = ssfsClientDisconnect
+ OnClientRead = ssfsClientRead
+ OnClientError = ssfsClientError
+ Top = 56
+ end
+ object csfs: TClientSocket
+ Active = False
+ ClientType = ctNonBlocking
+ Port = 6010
+ OnConnect = csfsConnect
+ OnDisconnect = csfsDisconnect
+ OnError = csfsError
+ Left = 32
+ Top = 56
+ end
+ object csToPd: TClientSocket
+ Active = False
+ ClientType = ctNonBlocking
+ Host = 'localhost'
+ Port = 6002
+ OnConnect = csToPdConnect
+ OnDisconnect = csToPdDisconnect
+ OnError = csToPdError
+ Left = 32
+ end
+end
diff --git a/Source/mainunit.pas b/Source/mainunit.pas
new file mode 100644
index 0000000..ebf3f46
--- /dev/null
+++ b/Source/mainunit.pas
@@ -0,0 +1,903 @@
+{ Copyright (C) 2001-2002 Juha Vehviläinen
+ 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.}
+
+unit mainunit;
+
+interface
+
+uses
+ Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
+ StdCtrls, ScktComp,
+ pluginunit, fsformunit, fsframeunit,
+ FastDIB,
+ ExtCtrls, Menus, C2PhotoShopHost, Filez, ComCtrls;
+
+type
+ Tmain = class(TFsForm)
+ ss1: TServerSocket;
+ ImageLogo: TImage;
+ PopupMenu1: TPopupMenu;
+ MiConfig: TMenuItem;
+ MiReset: TMenuItem;
+ MiReloadPlugins: TMenuItem;
+ ssfs: TServerSocket;
+ csfs: TClientSocket;
+ MiLog: TMenuItem;
+ csToPd: TClientSocket;
+ MiExit: TMenuItem;
+ REConsole: TRichEdit;
+ procedure ss1ClientRead(Sender: TObject; Socket: TCustomWinSocket);
+ procedure FormCreate(Sender: TObject);
+ procedure ss1ClientError(Sender: TObject; Socket: TCustomWinSocket;
+ ErrorEvent: TErrorEvent; var ErrorCode: Integer);
+ procedure ss1ClientDisconnect(Sender: TObject;
+ Socket: TCustomWinSocket);
+ procedure MiConfigClick(Sender: TObject);
+ procedure ss1ClientConnect(Sender: TObject; Socket: TCustomWinSocket);
+ procedure MiResetClick(Sender: TObject);
+ procedure FormDestroy(Sender: TObject);
+ procedure MiReloadPluginsClick(Sender: TObject);
+ procedure ssfsClientRead(Sender: TObject; Socket: TCustomWinSocket);
+ procedure csfsError(Sender: TObject; Socket: TCustomWinSocket;
+ ErrorEvent: TErrorEvent; var ErrorCode: Integer);
+ procedure csfsDisconnect(Sender: TObject; Socket: TCustomWinSocket);
+ procedure ssfsClientError(Sender: TObject; Socket: TCustomWinSocket;
+ ErrorEvent: TErrorEvent; var ErrorCode: Integer);
+ procedure csfsConnect(Sender: TObject; Socket: TCustomWinSocket);
+ procedure ssfsClientConnect(Sender: TObject; Socket: TCustomWinSocket);
+ procedure ssfsClientDisconnect(Sender: TObject;
+ Socket: TCustomWinSocket);
+ procedure MiLogClick(Sender: TObject);
+ procedure csToPdError(Sender: TObject; Socket: TCustomWinSocket;
+ ErrorEvent: TErrorEvent; var ErrorCode: Integer);
+ procedure csToPdConnect(Sender: TObject; Socket: TCustomWinSocket);
+ procedure csToPdDisconnect(Sender: TObject; Socket: TCustomWinSocket);
+ procedure MiExitClick(Sender: TObject);
+ procedure ImageLogoDblClick(Sender: TObject);
+ procedure FormClose(Sender: TObject; var Action: TCloseAction);
+ private
+ { Private declarations }
+ SocketMem: Pointer;
+ fbmp: TFastDIB;
+ procedure LoadRegSettings;
+ procedure ParsePrim(const S: String);
+ procedure FreeIfCompExists(const S: String);
+ function GetFrameByTag(const tag: String): TFsFrame;
+ function ItemCount( const ClassName: String ): Integer;
+ procedure Reset;
+ procedure minimizeall;
+ procedure ExceptionHandler(Sender: TObject; E: Exception);
+ procedure DropFileHandler(const h: HWND; const DroppedFileName: String);
+ procedure AppMessage(var Msg: Tmsg; var Handled: Boolean);
+ public
+ { Public declarations }
+ RunConfig: Boolean;
+ PdHost: String; // Host running PD
+ PDReceivePort: Integer; // data from PD
+ PDSendPort: Integer; // data to PD
+ FSPort: Integer; // Framestein connections
+ EnableFSConns: Boolean;
+ DockMain: Boolean;
+ logstate: Boolean;
+ Plugins: TPlugins;
+ SearchPath: TStringList;
+
+ function CompName(const S: String): String;
+ procedure Parse(const S: String); override;
+ procedure Post(const S: String);
+ procedure SendFrame(const f: TFsFrame;
+ const NameTag: String; const bmp: TFastDIB;
+ const quality: Integer; const sendjpg: Boolean );
+ procedure SendReturnValues(const S: String);
+ procedure SendReturnValuesString(
+ const PdName: String; const S: String);
+ function FileExistsInSearchPath(var S: String): Boolean; // modifying S allowed!
+ end;
+
+const
+ STARTMSG = 'Framestein 0.30 running...';
+ MCAPTION = 'Framestein 0.30';
+ SocketBufferSize = 100000;
+
+var
+ main: Tmain;
+ DockTitle: String;
+ DockHandle: HWND;
+
+function WinEnumerator(h: HWND; i: LongInt): BOOL; stdcall;
+function WinEnumerator_Exact(h: HWND; i: LongInt): BOOL; stdcall;
+function WinEnumerator_SubStr(h: HWND; i: LongInt): BOOL; stdcall;
+
+implementation
+
+{$R *.DFM}
+
+uses
+ Registry, DirectX, DxDraws, ShellApi,
+ fscopyunit, fstextunit, fsdrawunit, fsbrowserunit,
+ fsinfounit, fsaviunit,
+ fastfiles,
+ Strz, logunit, configureunit;
+
+function WinEnumerator(h: HWND; i: LongInt): BOOL; stdcall;
+var
+ Title: array[0..255] of Char;
+begin
+ Result := True;
+ if GetWindowText(h, Title, SizeOf(Title))>0 then begin
+ if UpperCase(DockTitle)=
+ Copy(UpperCase(StrPas(@Title)), 1, Length(DockTitle)) then begin
+ DockHandle := h;
+ Result := False; // stop enumerating
+ end;
+ end;
+end;
+
+function WinEnumerator_SubStr(h: HWND; i: LongInt): BOOL; stdcall;
+var
+ Title: array[0..255] of Char;
+begin
+ Result := True;
+ if GetWindowText(h, Title, SizeOf(Title))>0 then begin
+ if Pos(UpperCase(DockTitle), UpperCase(StrPas(@Title)))>0 then begin
+ DockHandle := h;
+ Result := False; // stop enumerating
+ end;
+ end;
+end;
+
+function WinEnumerator_Exact(h: HWND; i: LongInt): BOOL; stdcall;
+var
+ Title: array[0..255] of Char;
+begin
+ Result := True;
+ if GetWindowText(h, Title, SizeOf(Title))>0 then begin
+ if UpperCase(DockTitle)=
+ UpperCase(StrPas(@Title)) then begin
+ DockHandle := h;
+ Result := False; // stop enumerating
+ end;
+ end;
+end;
+
+{ TForm1 }
+
+function Tmain.ItemCount( const ClassName: String ): Integer;
+var
+ i, count: Integer;
+begin
+ count:=0;
+ if ComponentCount>0 then
+ for i:=1 to ComponentCount-1 do
+ if UpperCase(Components[i].ClassName)=UpperCase(ClassName) then
+ Inc(count);
+ Result := count;
+end;
+
+function Tmain.CompName(const S: String): String;
+var
+ St: String;
+ a: Integer;
+begin
+ St := S;
+ if Length(St)>0 then
+ for a:=Length(St) downto 1 do
+ if St[a] in ['-','.',',',#10,#13] then
+ Delete(St, a, 1);
+
+ if Length(St)>0 then
+ for a:=1 to Length(St) do
+ if St[a] in ['0'..'9'] then
+ St[a] := Char(Ord('A')+(Ord(St[a])-Ord('0')));
+
+ Result := St;
+end;
+
+procedure Tmain.ParsePrim(const S: String);
+var
+ s1, s2, s_args: String;
+ i: Integer;
+ fsframe: TFsFrame;
+ fscopy: TFsCopy;
+ fstext: TFsText;
+ fsdraw: TFsDraw;
+ fsbrowser: TFsBrowser;
+ fsinfo: TFsInfo;
+ fsavi: TFsAvi;
+ f: TFsForm;
+begin
+ if logstate then
+ log.add(s);
+
+ s1 := UpperCase(ExtractWord(1, S, [' ']));
+ s_args := Copy(S, Length(s1)+2, 255);
+
+ f := TFsForm(FindComponent(CompName(s1)));
+ if f<>nil then begin
+ f.Parse(s_args);
+ Exit;
+ end;
+
+ s2 := ExtractWord(2, S, [' ']);
+
+ if S1='RESET' then begin
+ Reset;
+ end else
+ if S1='FRAME' then begin
+ FreeIfCompExists(CompName(s2));
+ fsframe := TFsFrame.Create(Self);
+ fsframe.PdName := s2;
+ fsframe.Name := CompName(s2);
+ fsframe.Caption := s2;
+ i := ItemCount('TFsFrame')-1;
+ fsframe.Left := fsframe.Width*(i div 4);
+ fsframe.Top := fsframe.Height*(i mod 4);
+ fsframe.Show;
+ end else
+ if S1='COPY' then begin
+ FreeIfCompExists(CompName(s2));
+ fscopy := TFsCopy.Create(Self);
+ fscopy.Name := CompName(s2);
+ fscopy.Caption := s2;
+ end else
+ if S1='TEXT' then begin
+ FreeIfCompExists(CompName(s2));
+ fstext := TFsText.Create(Self);
+ fstext.Name := CompName(s2);
+ fstext.Caption := s2;
+ end else
+ if S1='DRAW' then begin
+ FreeIfCompExists(CompName(s2));
+ fsdraw := TFsDraw.Create(Self);
+ fsdraw.Name := CompName(s2);
+ fsdraw.Caption := s2;
+ end else
+ if S1='BROWSER' then begin
+ FreeIfCompExists(CompName(s2));
+ fsbrowser := TFsBrowser.Create(Self);
+ fsbrowser.PdName := s2;
+ fsbrowser.Name := CompName(s2);
+ fsbrowser.Caption := s2;
+ i := ItemCount('TFsBrowser')-1;
+ fsbrowser.Left := fsbrowser.Width*(i div 4);
+ fsbrowser.Top := fsbrowser.Height*(i mod 4);
+ fsbrowser.Show;
+ end else
+ if S1='INFO' then begin
+ FreeIfCompExists(CompName(s2));
+ fsinfo := TFsInfo.Create(Self);
+ fsinfo.Name := CompName(s2);
+ fsinfo.Caption := s2;
+ end else
+ if S1='AVI' then begin
+ FreeIfCompExists(CompName(s2));
+ fsavi := TFsAvi.Create(Self);
+ fsavi.PdName := s2;
+ fsavi.Name := CompName(s2);
+ fsavi.Caption := s2;
+ end else
+ if S1='MINIMIZEALL' then begin
+ minimizeall;
+ end else
+ if s1='PATH' then begin
+ SearchPath.Add(Copy(S, Length(s1)+2, 255));
+ end else
+end;
+
+procedure Tmain.Parse(const S: String);
+
+ function ComponentCreator(const Str: String): Boolean;
+ var
+ s1: String;
+ begin
+ s1 := UpperCase(ExtractWord(1, Str, [' ']));
+ Result :=
+ (s1='RESET') or
+ (s1='FRAME') or
+ (s1='COPY') or
+ (s1='TEXT') or
+ (s1='DRAW') or
+ (s1='BROWSER') or
+ (s1='INFO') or
+ (s1='AVI');
+ end;
+
+var
+ i, c: Integer;
+ Str: String;
+begin
+ if Pos(';', S)=0 then
+ ParsePrim(S)
+ else begin
+ c := WordCount(S, [';']);
+ // first commands that create fs.* objects
+ for i:=1 to c do begin
+ Str := ExtractWord(i, S, [';']);
+ if ComponentCreator(Str) then
+ ParsePrim(Str);
+ end;
+ // all the rest
+ for i:=1 to c do begin
+ Str := ExtractWord(i, S, [';']);
+ if not ComponentCreator(Str) then
+ ParsePrim(Str);
+ end;
+ end;
+end;
+
+procedure Tmain.ss1ClientRead(Sender: TObject; Socket: TCustomWinSocket);
+var
+ S: String;
+begin
+ S := socket.ReceiveText;
+ while Pos(#10, S)>0 do
+ Delete(S, Pos(#10, S), 1);
+ Parse(S);
+end;
+
+procedure Tmain.FreeIfCompExists(const S: String);
+var
+ c: TComponent;
+begin
+ c := FindComponent(S);
+ if c<>nil then
+ c.Free;
+end;
+
+procedure Tmain.FormCreate(Sender: TObject);
+begin
+ Randomize;
+ RunConfig:=False;
+ PdHost := 'localhost';
+ PDReceivePort := 6001;
+ PDSendPort := 6002;
+ FSPort := 6010;
+ EnableFSConns := False;
+ DockMain := True;
+ LoadRegSettings;
+ if not RunConfig then begin
+ ss1.Port := PDReceivePort;
+ ss1.Active := True;
+ csToPd.Host := PdHost;
+ csToPd.Port := PdSendPort;
+ csToPd.Active := True;
+ ssfs.Port := FSPort;
+ ssfs.Active := EnableFSConns;
+ end;
+
+ main.Post(STARTMSG);
+ Caption := MCAPTION;
+
+ Plugins := TPlugins.Create(Self);
+ Plugins.Load;
+
+ SocketMem := AllocMem(SocketBufferSize);
+ fBmp := TFastDIB.Create;
+ logstate := False;
+
+ SearchPath := TStringList.Create;
+ SearchPath.Add(ExtractFilePath(Application.ExeName));
+
+ Application.OnException := ExceptionHandler;
+ Application.OnMessage := AppMessage;
+end;
+
+procedure Tmain.FormDestroy(Sender: TObject);
+begin
+ Plugins.Free;
+ SearchPath.Free;
+ FreeMem(SocketMem);
+ fBmp.Free;
+end;
+
+procedure Tmain.ss1ClientConnect(Sender: TObject;
+ Socket: TCustomWinSocket);
+begin
+ Post('Connected on port '+IntToStr(PDReceivePort));
+ if not csToPd.Active then
+ csToPd.Active := True;
+
+// just a crazy idea
+ if DockMain then begin
+ DockTitle := 'pd';
+ DockHandle:=0;
+ EnumWindows(@WinEnumerator_Exact, 0);
+ if DockHandle>0 then begin
+ ParentWindow := DockHandle;
+ BorderStyle := bsNone;
+ Left := 4;
+ Top := 120;
+ Width := 40;
+ Height := 40;
+ BringToFront;
+ end;
+ end;
+end;
+
+procedure Tmain.ss1ClientDisconnect(Sender: TObject;
+ Socket: TCustomWinSocket);
+begin
+ Post('Disconnected');
+ csToPd.Active := False;
+ Reset;
+end;
+
+procedure Tmain.csToPdConnect(Sender: TObject; Socket: TCustomWinSocket);
+begin
+ Post('Connected on port '+IntToStr(PDSendPort));
+end;
+
+procedure Tmain.csToPdDisconnect(Sender: TObject;
+ Socket: TCustomWinSocket);
+begin
+ Post('Disconnected');
+end;
+
+procedure Tmain.ss1ClientError(Sender: TObject; Socket: TCustomWinSocket;
+ ErrorEvent: TErrorEvent; var ErrorCode: Integer);
+begin
+ Post('Disconnected');
+ ErrorCode := 0;
+end;
+
+procedure Tmain.LoadRegSettings;
+var
+ Reg: TRegistry;
+begin
+ Reg := TRegistry.Create;
+ try
+ Reg.RootKey := HKEY_CURRENT_USER;
+ if Reg.OpenKey('\Software\Framestein', True) then begin
+ PdHost := Reg.ReadString('PdHost');
+ PDReceivePort := Reg.ReadInteger('PDReceivePort');
+ PDSendPort := Reg.ReadInteger('PDSendPort');
+ FSPort := Reg.ReadInteger('FSPort');
+ EnableFSConns := Reg.ReadBool('EnableFSConns');
+ DockMain := Reg.ReadBool('DockMain');
+ end;
+ except
+ RunConfig := True;
+ end;
+ Reg.CloseKey;
+ Reg.Free;
+end;
+
+procedure Tmain.MiConfigClick(Sender: TObject);
+begin
+ configure.Execute;
+end;
+
+procedure Tmain.Post(const S: String);
+begin
+// Writeln(TimeToStr(Time), ' ', S);
+ REConsole.Lines.Add(TimeToStr(Time)+' '+S);
+end;
+
+procedure Tmain.Reset;
+var
+ i: Integer;
+begin
+ if ComponentCount=0 then Exit;
+ for i:=ComponentCount-1 downto 0 do
+ if Components[i] is TfsForm then
+ Components[i].Free;
+end;
+
+procedure Tmain.MiResetClick(Sender: TObject);
+begin
+ Reset;
+end;
+
+procedure Tmain.MiReloadPluginsClick(Sender: TObject);
+begin
+ Plugins.Reload;
+end;
+
+function Tmain.GetFrameByTag(const tag: String): TFsFrame;
+var
+ i: Integer;
+ fsframe: TFsFrame;
+
+ function makenew: TfsFrame;
+ begin
+ FreeIfCompExists(CompName(tag));
+ fsframe := TFsFrame.Create(Self);
+ fsframe.Name := CompName(tag);
+ fsframe.Caption := tag;
+ fsframe.NameTag := tag;
+ fsframe.Show;
+ Result := fsframe;
+ end;
+
+begin
+ if ComponentCount=0 then begin
+ Result := makenew;
+ Exit;
+ end;
+ for i:=ComponentCount-1 downto 0 do
+ if Components[i] is TfsFrame then begin
+ fsframe := Components[i] as TfsFrame;
+ if fsframe.NameTag = tag then begin
+ Result := fsframe;
+ Exit;
+ end;
+ end;
+ Result := makenew;
+end;
+
+const
+ fsframeHeader = '!FS';
+ fsframeHeaderLen = 27;
+
+procedure Tmain.SendFrame(const F: TFsFrame;
+ const NameTag: String; const bmp: TFastDIB;
+ const quality: Integer; const sendjpg: Boolean );
+
+ function Header(const _size: Integer): String;
+ var
+ s, s2: String;
+ begin
+ s2 := Copy(IntToStr(f.d1.Surface.Width), 1, 4);
+ while Length(s2)<4 do s2:='0'+s2;
+ s := fsframeHeader+s2;
+ s2 := Copy(IntToStr(f.d1.Surface.Height), 1, 4);
+ while Length(s2)<4 do s2:='0'+s2;
+ s := s+s2;
+ s2 := Copy(IntToStr(_size), 1, 7);
+ while Length(s2)<7 do s2:='0'+s2;
+ s := s+s2;
+ s2 := Copy(NameTag, 1, 8);
+ while Length(s2)<8 do s2:=s2+' ';
+ s := s+s2;
+ if sendjpg then s:=s+'1' else s:=s+'0';
+ Result := s;
+ end;
+
+var
+ sd: TDDSurfaceDesc;
+ jSize, dSize: Integer;
+ JP: Pointer;
+begin
+ if not csfs.Active then begin
+ Post('send: not connected');
+ Exit;
+ end;
+ if sendjpg then begin
+ JP := AllocMem(bmp.Size);
+ jSize := SaveJPGMem(bmp, JP, bmp.Size, quality);
+ while csfs.Socket.SendText(Header(jSize))=-1 do
+ Application.HandleMessage;
+ while csfs.Socket.SendBuf(JP^, jSize)=-1 do
+ Application.HandleMessage;
+ FreeMem(JP);
+ end else begin
+ f.d1.Surface.Lock(sd);
+ dSize := sd.lPitch*f.d1.Surface.Height+f.d1.Surface.Width;
+ while csfs.Socket.SendText(Header(dSize))=-1 do
+ Application.HandleMessage;
+ while csfs.Socket.SendBuf(sd.lpSurface^, dSize)=-1 do
+ Application.HandleMessage;
+ f.d1.Surface.UnLock;
+ end;
+end;
+
+// TODO: this procedure is more confusing than it needs to be
+procedure Tmain.ssfsClientRead(Sender: TObject; Socket: TCustomWinSocket);
+const
+ Receiving: Boolean = False;
+ Recd: Integer = 0;
+ fWidth: Integer = 0;
+ fHeight: Integer = 0;
+ fSize: Integer = 0;
+ fJpg: Boolean = True;
+ nametag: String = '';
+ Buf: Pointer = nil;
+ BufPos: Integer = 0;
+var
+ read: Integer;
+ tp: Pointer;
+ s: String;
+ f: TFsFrame;
+ sd: TDDSurfaceDesc;
+ temp: array[0..255] of Char;
+
+ // header was received, extract data about incoming frame
+ procedure GetHeader;
+ var
+ i: Integer;
+ begin
+ S := StrPas(StrLCopy(tp, PChar(SocketMem), fsframeHeaderLen));
+ fWidth := MyStrToInt(Copy(S, 4, 4));
+ fHeight := MyStrToInt(Copy(S, 8, 4));
+ fSize := MyStrToInt(Copy(S, 12, 7));
+ nametag := Trim(Copy(S, 19, 8));
+ fJpg := Boolean(S[27]='1');
+{ Post('Width: '+IntToStr(fWidth)+' Height: '+
+ IntToStr(fHeight)+' Size: '+IntToStr(fSize)+
+ ' nametag: '+nametag+' jpg: '+IntToStr(Integer(fJpg)));
+}
+ Receiving := True;
+ Recd := 0;
+ Buf := AllocMem(fSize);
+ BufPos := 0;
+ if read>fsframeHeaderLen then begin
+ i := read-fsframeHeaderLen;
+ if fSize<i then
+ i := fSize;
+ Move(Pointer(Integer(SocketMem)+fsframeHeaderLen)^,
+ Pointer(Integer(Buf)+BufPos)^, i);
+ Inc(BufPos, read-fsframeHeaderLen);
+ Inc(Recd, read-fsframeHeaderLen);
+ end;
+ end;
+
+ // frame is complete, display it
+ function DoFrame: Boolean;
+ var
+ offset: Integer;
+ begin
+ Result := False;
+ f := GetFrameByTag(nametag);
+ if (f.d1.Surface.Width<>fWidth) or (f.d1.Surface.Height<>fHeight) then
+ f.d1.SetSize(fWidth, fHeight);
+
+ if fJpg then begin
+ LoadJPGMem(fBmp, Buf, fSize, False);
+ fBmp.Draw(f.d1.Surface.Canvas.Handle, 0, 0);
+ f.d1.Surface.Canvas.Release;
+ end else begin
+ f.d1.Surface.Lock(sd);
+ Move(Buf^, sd.lpSurface^, fSize);
+ f.d1.Surface.UnLock;
+ end;
+ f.FlipRequest;
+ FreeMem(Buf);
+ Receiving := False;
+
+ if BufPos>fSize then begin
+ // read: bytes read from socket
+ // bufpos: amount of total data from this and previous reads
+ // fsize: bytes needed for this frame
+ // bufpos - fsize: bytes read belonging to next frame
+ // read - (bufpos - fsize): offset for the next frame
+ offset := read - (BufPos - fSize);
+ read := (BufPos - fSize);
+ Move(Pointer(Integer(SocketMem)+offset)^, SocketMem^, read);
+ Result := True;
+ end;
+ end;
+
+begin
+ tp := @temp;
+ read := Socket.ReceiveBuf(SocketMem^, 100000);
+
+ while True do begin
+// Post('read '+IntToStr(read));
+ if Receiving then begin
+ Inc(Recd, read);
+
+ if BufPos+read > fSize then
+ Move(SocketMem^, Pointer(Integer(Buf)+BufPos)^, fSize-BufPos)
+ else
+ Move(SocketMem^, Pointer(Integer(Buf)+BufPos)^, read);
+
+ Inc(BufPos, read);
+
+ if Recd>=fSize then
+ if DoFrame then
+ Continue;
+ Exit;
+ end;
+ if (StrLComp(PChar(SocketMem), fsframeHeader, Length(fsframeHeader))=0) then begin
+ GetHeader;
+ if Recd>=fSize then
+ if DoFrame then
+ Continue;
+ end;
+ Break;
+ end;
+end;
+
+procedure Tmain.csfsError(Sender: TObject; Socket: TCustomWinSocket;
+ ErrorEvent: TErrorEvent; var ErrorCode: Integer);
+begin
+ ErrorCode := 0;
+end;
+
+procedure Tmain.ssfsClientError(Sender: TObject; Socket: TCustomWinSocket;
+ ErrorEvent: TErrorEvent; var ErrorCode: Integer);
+begin
+ ErrorCode := 0;
+end;
+
+procedure Tmain.csToPdError(Sender: TObject; Socket: TCustomWinSocket;
+ ErrorEvent: TErrorEvent; var ErrorCode: Integer);
+begin
+ ErrorCode := 0;
+end;
+
+procedure Tmain.csfsConnect(Sender: TObject; Socket: TCustomWinSocket);
+begin
+ Post('connected '+csfs.Host+' '+IntToStr(csfs.Port));
+end;
+
+procedure Tmain.csfsDisconnect(Sender: TObject; Socket: TCustomWinSocket);
+begin
+ Post('disconnected '+csfs.Host+' '+IntToStr(csfs.Port));
+end;
+
+procedure Tmain.ssfsClientConnect(Sender: TObject;
+ Socket: TCustomWinSocket);
+begin
+ Post('Connection from '+Socket.RemoteAddress);
+end;
+
+procedure Tmain.ssfsClientDisconnect(Sender: TObject;
+ Socket: TCustomWinSocket);
+begin
+ Post('Disconnected '+Socket.RemoteAddress);
+end;
+
+procedure Tmain.MiLogClick(Sender: TObject);
+begin
+ MiLog.Checked := not MiLog.Checked;
+ log.Visible := MiLog.Checked;
+ logstate := log.Visible;
+end;
+
+procedure Tmain.SendReturnValues(const S: String);
+var
+ i, c: Integer;
+ s2: String;
+begin
+ if not csToPd.Active then Exit;
+ c := WordCount(S, [';']);
+ for i:=1 to c do begin
+ s2 := ExtractWord(i, S, [';']);
+ if Pos('=', s2)>0 then begin
+ csToPd.Socket.SendText(
+ ExtractWord(1, s2, ['='])+' '+
+ ExtractWord(2, s2, ['='])+';'
+ );
+ end;
+ end;
+end;
+
+procedure Tmain.SendReturnValuesString(
+ const PdName: String; const S: String);
+var
+ St: String;
+ i: Integer;
+begin
+ St := S;
+ for i:=1 to Length(St) do begin
+ if St[i]='\' then St[i]:='/';
+ SendReturnValues(PdName+'='+Long2Str(Ord(St[i])));
+ end;
+ SendReturnValues(PdName+'=0');
+end;
+
+procedure Tmain.ExceptionHandler(Sender: TObject; E: Exception);
+var
+ i: Integer;
+ f: TFsFrame;
+begin
+ if Pos('1400', E.Message)>0 then begin // invalid window handle
+ // check any fs.frames with invalid window handles
+ // (due to closing a patch with docked fs.frames)
+ if ComponentCount=0 then Exit;
+ for i:=ComponentCount-1 downto 0 do
+ if Components[i] is TFsFrame then begin
+ f := Components[i] as TFsFrame;
+ if (f.ParentWindow>0) and
+ not IsWindow(f.ParentWindow) then begin
+// Q: close or undock fs.frame?
+// A: this will not happed immediately when a patch is closed,
+// so closing the frame is more intuitive than popping it up
+// after a while.
+ f.Free;
+{ f.ParentWindow := 0;
+ f.Borders(True);}
+ end;
+ end else
+ end else
+ ShowMessage(E.Message);
+end;
+
+procedure Tmain.DropFileHandler(const h: HWND; const DroppedFileName: String);
+var
+ i: Integer;
+ f: TFsFrame;
+begin
+ if ComponentCount=0 then Exit;
+ for i:=ComponentCount-1 downto 0 do
+ if Components[i] is TFsFrame then begin
+ f := Components[i] as TFsFrame;
+ if f.Handle=h then begin
+ f.HandleDroppedFile(DroppedFileName);
+ Break;
+ end;
+ end;
+end;
+
+procedure Tmain.AppMessage(var Msg: Tmsg; var Handled: Boolean);
+const
+ BufferLength : word = 255;
+var
+ DroppedFilename : string;
+ FileIndex : Longword;
+ QtyDroppedFiles : word;
+ pDroppedFilename : array [0..255] of Char;
+// DroppedFileLength : word;
+begin
+ if Msg.Message = WM_DROPFILES then begin
+ FileIndex := $FFFFFFFF;
+ QtyDroppedFiles := DragQueryFile(Msg.WParam, FileIndex,
+ pDroppedFilename, BufferLength);
+ for FileIndex := 0 to (QtyDroppedFiles - 1) do begin
+// DroppedFileLength :=
+ DragQueryFile(Msg.WParam, FileIndex,
+ pDroppedFilename, BufferLength);
+ DroppedFilename := StrPas(pDroppedFilename);
+ DropFileHandler(msg.HWND, DroppedFilename);
+ end;
+ DragFinish(Msg.WParam);
+ Handled := True;
+ end;
+end;
+
+procedure Tmain.minimizeall;
+var
+ i: Integer;
+begin
+ if ComponentCount=0 then Exit;
+ for i:=ComponentCount-1 downto 0 do
+ if Components[i] is TfsForm then
+ TForm(Components[i]).WindowState := wsMinimized;
+end;
+
+procedure Tmain.MiExitClick(Sender: TObject);
+begin
+ Application.Terminate;
+end;
+
+function Tmain.FileExistsInSearchPath(var S: String): Boolean;
+var
+ i: Integer;
+ filestr: String;
+begin
+ Result := FileExists(S);
+ if not Result and (SearchPath.Count>0) then begin
+ filestr := ExtractFileName(S);
+ for i:=0 to SearchPath.Count-1 do begin
+ if FileExists(SearchPath.Strings[i]+'\'+filestr) then begin
+ S := SearchPath.Strings[i]+'\'+filestr;
+ Result := True;
+ Exit;
+ end;
+ end;
+ end;
+end;
+
+procedure Tmain.ImageLogoDblClick(Sender: TObject);
+begin
+ Reset;
+end;
+
+procedure Tmain.FormClose(Sender: TObject; var Action: TCloseAction);
+begin
+ if main.ParentWindow<>0 then begin
+ main.ParentWindow:=0;
+ end;
+end;
+
+end.
+
diff --git a/Source/pluginunit.pas b/Source/pluginunit.pas
new file mode 100644
index 0000000..d4fd51e
--- /dev/null
+++ b/Source/pluginunit.pas
@@ -0,0 +1,227 @@
+{ Copyright (C) 2001 Juha Vehviläinen
+ 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.}
+
+unit pluginunit;
+
+interface
+
+uses
+ Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
+ DirectX, DXDraws;
+
+type
+ TEffectProc = procedure(const Bits: Pointer;
+ const lPitch, Width, Height, BitCount: Integer;
+ const args: PChar;
+ const ret: PChar); cdecl;
+
+ TCopyProc = procedure(
+ const Bits1: Pointer;
+ const lPitch1, Width1, Height1, BitCount1: Integer;
+ const Bits2: Pointer;
+ const lPitch2, Width2, Height2, BitCount2: Integer;
+ const args: PChar;
+ const ret: PChar
+ ); cdecl;
+
+ TPointerList = TList;
+ TLibraryList = TList;
+
+ TPlugins = class(TComponent)
+ private
+ Names: TStringList;
+ EffectProcs: TPointerList;
+ CopyProcs: TPointerList;
+ Libs: TLibraryList;
+ procedure LoadHandleFile(const SearchRec: TSearchRec;
+ const FullPath: String);
+ public
+ constructor Create(AOwner: TComponent); override;
+ destructor Destroy; override;
+ procedure Load;
+ procedure Reload;
+ procedure Clear;
+ function IsPlugin(const s: String): Boolean;
+ function CallEffect(const d: TDirectDrawSurface;
+ const procname: String; const args: String): Boolean;
+ function CallCopy(const d1: TDirectDrawSurface;
+ const d2: TDirectDrawSurface;
+ const procname: String; const args: String): Boolean;
+ end;
+
+implementation
+
+uses
+ mainunit,
+ Filez;
+
+type
+ THandlePtr = ^THandle;
+
+const
+ EffectProcName = 'perform_effect';
+ CopyProcName = 'perform_copy';
+
+{ TPlugins }
+
+constructor TPlugins.Create(AOwner: TComponent);
+begin
+ inherited;
+ Names := TStringList.Create;
+ EffectProcs := TPointerList.Create;
+ CopyProcs := TPointerList.Create;
+ Libs := TLibraryList.Create;
+end;
+
+destructor TPlugins.Destroy;
+begin
+ Clear;
+ Names.Free;
+ EffectProcs.Free;
+ CopyProcs.Free;
+ Libs.Free;
+ inherited;
+end;
+
+procedure TPlugins.Clear;
+var
+ hp: THandlePtr;
+begin
+ while Names.Count>0 do Names.Delete(0);
+ while EffectProcs.Count>0 do EffectProcs.Delete(0);
+ while CopyProcs.Count>0 do CopyProcs.Delete(0);
+ while Libs.Count>0 do begin
+ hp := Libs[0];
+ FreeLibrary(hp^);
+ Libs.Delete(0);
+ end;
+end;
+
+procedure TPlugins.LoadHandleFile(const SearchRec: TSearchRec;
+ const FullPath: String);
+var
+ h: THandle;
+ p: PChar;
+ b: array[0..255] of Char;
+ EffectProc: TEffectProc;
+ CopyProc: TCopyProc;
+ s: String;
+ i: Integer;
+begin
+ p:=@b;
+ if UpperCase(ExtractFileExt(FullPath))='.DLL' then begin
+ h := LoadLibrary(StrPCopy(p, FullPath));
+ if h<>0 then begin
+ @EffectProc := GetProcAddress(h, EffectProcName);
+ @CopyProc := GetProcAddress(h, CopyProcName);
+ s := ExtractFileName(FullPath);
+ i := Pos('.DLL', UpperCase(s));
+ if i>0 then Delete(s, i, 255);
+ Names.Add(s);
+ EffectProcs.Add(@EffectProc);
+ CopyProcs.Add(@CopyProc);
+ Libs.Add(@h);
+ end;
+ end;
+end;
+
+procedure TPlugins.Load;
+var
+ sd: TScanDir;
+ s: String;
+ i: Integer;
+begin
+ sd := TScanDir.Create(Self);
+ sd.OnHandleFile := LoadHandleFile;
+ sd.Scan(ExtractFilePath(Application.ExeName)+'\Plugins');
+ sd.Free;
+ if Names.Count>0 then begin
+ s := '';
+ for i:=0 to Names.Count-1 do begin
+ if s<>'' then s:=s+' ';
+ s:=s+Names[i];
+ end;
+ main.Post('Plugins: '+s);
+ end;
+end;
+
+procedure TPlugins.Reload;
+begin
+ Clear;
+ Load;
+end;
+
+function TPlugins.IsPlugin(const s: String): Boolean;
+begin
+ Result := Names.IndexOf(s)<>-1;
+end;
+
+var
+ argsBuf: array[0..255] of Char;
+
+function TPlugins.CallEffect(const d: TDirectDrawSurface;
+ const procname: String; const args: String): Boolean;
+var
+ i: Integer;
+ Proc: TEffectProc;
+ sd: TDDSurfaceDesc;
+ P: PChar;
+begin
+ Result := False;
+ if (Names.Count=0) or (d.Width=0) or (d.Height=0) then Exit;
+ i := Names.IndexOf(procname);
+ if (i=-1) or (i>=EffectProcs.Count) then Exit;
+ @Proc := EffectProcs[i];
+ if @Proc=nil then Exit;
+ P:=@argsBuf;
+ P[0]:=#0;
+ d.Lock(sd);
+ Proc(sd.lpSurface, sd.lPitch, d.Width, d.Height, d.BitCount,
+ PChar(args), P);
+ d.UnLock;
+ if P[0]<>#0 then
+ main.SendReturnValues(StrPas(P));
+ Result := True;
+end;
+
+function TPlugins.CallCopy(const d1, d2: TDirectDrawSurface;
+ const procname: String; const args: String): Boolean;
+var
+ i: Integer;
+ Proc: TCopyProc;
+ sd1: TDDSurfaceDesc;
+ sd2: TDDSurfaceDesc;
+ P: PChar;
+begin
+ Result := False;
+ if (Names.Count=0) or
+ (d1.Width=0) or (d1.Height=0) or
+ (d2.Width=0) or (d2.Height=0) then Exit;
+ i := Names.IndexOf(procname);
+ if (i=-1) or (i>=CopyProcs.Count) then Exit;
+ @Proc := CopyProcs[i];
+ if @Proc=nil then Exit;
+ P:=@argsBuf;
+ P[0]:=#0;
+ d1.Lock(sd1);
+ d2.Lock(sd2);
+ Proc(sd1.lpSurface, sd1.lPitch, d1.Width, d1.Height, d1.BitCount,
+ sd2.lpSurface, sd2.lPitch, d2.Width, d2.Height, d2.BitCount,
+ PChar(args), P);
+ d1.UnLock;
+ d2.UnLock;
+ if P[0]<>#0 then
+ main.SendReturnValues(StrPas(P));
+ Result := True;
+end;
+
+end.
+
diff --git a/Source/pshostunit.pas b/Source/pshostunit.pas
new file mode 100644
index 0000000..42868c3
--- /dev/null
+++ b/Source/pshostunit.pas
@@ -0,0 +1,145 @@
+unit pshostunit;
+
+interface
+
+uses
+ Forms, SysUtils, DirectX, DxDraws,
+ fsframeunit, C2PhotoShopHost;
+
+function IsFilter(const S: String): Boolean;
+
+function Filter_effect(const psh: TC2PhotoShopHost;
+ const d: TDirectDrawSurface;
+ const procname: String; const args: String): Boolean;
+
+function Filter_copy(const psh: TC2PhotoShopHost;
+ const d1, d2: TDirectDrawSurface;
+ const procname: String; const args: String): Boolean;
+
+implementation
+
+uses
+ Windows, Graphics, DIB,
+ mainunit;
+
+var
+ FilterPath: String;
+
+function FullFilterPath(const S: String): String;
+begin
+ Result := FilterPath+'\'+S;
+ if Uppercase(ExtractFileExt(S))<>'.8BF' then
+ Result := Result+'.8BF';
+end;
+
+function IsFilter(const S: String): Boolean;
+begin
+ Result := FileExists(FullFilterPath(S));
+end;
+
+function Filter_effect(const psh: TC2PhotoShopHost;
+ const d: TDirectDrawSurface;
+ const procname: String; const args: String): Boolean;
+const
+ Active: Boolean = False;
+var
+ sd: TDDSurfaceDesc;
+ dib: TDxDib;
+begin
+ Result := False;
+ if Active then Exit; // disable recursion
+ Active := True;
+ if not psh.LoadFilterDLL(FullFilterPath(procname)) then begin
+ main.Post('Filter load error: '+procname+'. Requires Adobe''s Plugin.dll?');
+ Active := False;
+ Exit;
+ end;
+
+ d.Lock(sd);
+ psh.Surface := @sd;
+
+ if d.BitCount=24 then begin
+ psh.SrcPtr := sd.lpSurface;
+ psh.DstPtr := sd.lpSurface;
+ end else begin
+ // DIB will ensure we're @ 24 bits per pixel...
+ dib := TDxDib.Create(main);
+ dib.DIB.Assign(d);
+
+ psh.DIB := dib;
+ psh.SrcPtr := dib.DIB.PBits;
+ psh.DstPtr := dib.DIB.PBits;
+ end;
+
+ psh.CallDialog := (args='');
+ psh.args := args;
+ psh.RunFilter;
+
+ d.UnLock;
+
+ if d.BitCount<>24 then begin
+ d.Assign(dib.DIB);
+ dib.Free;
+ end;
+ Result := True;
+ Active := False;
+end;
+
+function Filter_copy(const psh: TC2PhotoShopHost;
+ const d1, d2: TDirectDrawSurface;
+ const procname: String; const args: String): Boolean;
+const
+ Active: Boolean = False;
+var
+ sd1, sd2: TDDSurfaceDesc;
+ dib1, dib2: TDxDib;
+begin
+ Result := False;
+ if Active then Exit; // disable recursion
+ Active := True;
+ if not psh.LoadFilterDLL(FullFilterPath(procname)) then begin
+ main.Post('Filter load error: '+procname+'. Requires Adobe''s Plugin.dll?');
+ Active := False;
+ Exit;
+ end;
+
+ d1.Lock(sd1);
+ d2.Lock(sd2);
+
+ psh.Surface := @sd1;
+
+ if d1.BitCount=24 then begin
+ psh.SrcPtr := sd1.lpSurface;
+ psh.DstPtr := sd2.lpSurface;
+ end else begin
+ // DIB will ensure we're @ 24 bits per pixel...
+ dib1 := TDxDib.Create(main);
+ dib2 := TDxDib.Create(main);
+ dib1.DIB.Assign(d1);
+ dib2.DIB.SetSize(dib1.DIB.Width, dib1.DIB.Height, 24);
+
+ psh.DIB := dib1;
+ psh.SrcPtr := dib1.DIB.PBits;
+ psh.DstPtr := dib2.DIB.PBits;
+ end;
+
+ psh.CallDialog := (args='');
+ psh.args := args;
+ psh.RunFilter;
+
+ d1.UnLock;
+ d2.UnLock;
+
+ if d1.BitCount<>24 then begin
+ d2.Assign(dib2.DIB);
+ dib1.Free;
+ dib2.Free;
+ end;
+ Result := True;
+ Active := False;
+end;
+
+begin
+ FilterPath := ExtractFilePath(Application.ExeName)+'\Filters'
+end.
+