diff --git a/eRINA_STM32F7/src/rina/debug.adb b/eRINA_STM32F7/src/rina/debug.adb new file mode 100644 index 0000000..e600c38 --- /dev/null +++ b/eRINA_STM32F7/src/rina/debug.adb @@ -0,0 +1,88 @@ +with Bitmapped_Drawing; +with STM32.Board; +with GUI; + +package body Debug is + + -- Probably a cleaner way to do this + procedure Print (Debug_Level : in Debug; Msg : in String) is + currentLine : constant Natural := + (CURRENT_CONSOLE_POSITION.Y - 100) / FONT_HEIGHT; -- zero indexed + Foreground : HAL.Bitmap.Bitmap_Color; + Background : HAL.Bitmap.Bitmap_Color; + begin + + Foreground := + (case Debug_Level is when Info | Error => HAL.Bitmap.White, + when Warning => HAL.Bitmap.Black); + + Background := + (case Debug_Level is when Info => HAL.Bitmap.Blue, + when Warning => HAL.Bitmap.Yellow, when Error => HAL.Bitmap.Red); + + if currentLine > MAX_LINES then + -- Shift console lines up + for I in 1 .. MAX_LINES loop + CopyLine (I, I - 1, I = MAX_LINES); + end loop; + + -- Adjust Y position to overwrite the last line + CURRENT_CONSOLE_POSITION.Y := + CURRENT_CONSOLE_POSITION.Y - FONT_HEIGHT - LINE_PADDING; + end if; + + -- Draw debug prefix + Bitmapped_Drawing.Draw_String + (Buffer => GUI.ScreenBuffer.all, + Start => + GUI.Scale + ((CURRENT_CONSOLE_POSITION.X, CURRENT_CONSOLE_POSITION.Y)), + Msg => Debug_Level'Image, Font => BMP_Fonts.Font8x8, + Foreground => Foreground, Background => Background); + + -- Draw actual message text + Bitmapped_Drawing.Draw_String + (Buffer => GUI.ScreenBuffer.all, + Start => + GUI.Scale + ((CURRENT_CONSOLE_POSITION.X + + GUI.MeasureText (Debug_Level'Image, BMP_Fonts.Font8x8).Width + + LINE_PADDING, + CURRENT_CONSOLE_POSITION.Y)), + Msg => Msg, Font => BMP_Fonts.Font8x8, Foreground => HAL.Bitmap.White, + Background => HAL.Bitmap.Black); + + -- Move the Y position down for the next message + CURRENT_CONSOLE_POSITION.Y := + CURRENT_CONSOLE_POSITION.Y + FONT_HEIGHT + LINE_PADDING; + + STM32.Board.Display.Update_Layer (1, True); + end Print; + + procedure CopyLine + (SrcLineNumber : in Natural; DstLineNumer : in Natural; + DeleteSrc : in Boolean) + is + -- TODO: Cleanup later... + srcToPoint : constant HAL.Bitmap.Point := + (0, (CONSOLE_STARTING_POINT.Y + (FONT_HEIGHT * SrcLineNumber))); + dstToPoint : constant HAL.Bitmap.Point := + (0, (CONSOLE_STARTING_POINT.Y + (FONT_HEIGHT * DstLineNumer))); + srcRect : constant HAL.Bitmap.Rect := + (Position => srcToPoint, Width => GUI.Board_Resolution.Width, + Height => FONT_HEIGHT); + begin + HAL.Bitmap.Copy_Rect + (Src_Buffer => GUI.ScreenBuffer.all, + Src_Pt => srcToPoint, + Dst_Buffer => GUI.ScreenBuffer.all, + Dst_Pt => dstToPoint, Width => GUI.Board_Resolution.Width, + Height => FONT_HEIGHT, Synchronous => True); + if DeleteSrc then + HAL.Bitmap.Fill_Rect + (Buffer => GUI.ScreenBuffer.all, + Area => srcRect); + end if; + STM32.Board.Display.Update_Layer (1, True); + end CopyLine; +end Debug; diff --git a/eRINA_STM32F7/src/rina/debug.ads b/eRINA_STM32F7/src/rina/debug.ads new file mode 100644 index 0000000..ed49745 --- /dev/null +++ b/eRINA_STM32F7/src/rina/debug.ads @@ -0,0 +1,18 @@ +with HAL.Bitmap; +with BMP_Fonts; + +package Debug is + type Debug is (Error, Warning, Info); + + CONSOLE_STARTING_POINT : HAL.Bitmap.Point := (0, 100); + CURRENT_CONSOLE_POSITION : HAL.Bitmap.Point := (0, 100); + FONT_HEIGHT : constant Natural := + BMP_Fonts.Char_Height (Font => BMP_Fonts.Font8x8); + MAX_LINES : constant Natural := 20; + LINE_PADDING : constant Natural := 2; + + procedure Print (Debug_Level : in Debug; Msg : in String); + procedure CopyLine + (SrcLineNumber : in Natural; DstLineNumer : in Natural; + DeleteSrc : in Boolean); +end Debug; diff --git a/eRINA_STM32F7/src/rina/demo.adb b/eRINA_STM32F7/src/rina/demo.adb index 60b4b2c..83b329d 100644 --- a/eRINA_STM32F7/src/rina/demo.adb +++ b/eRINA_STM32F7/src/rina/demo.adb @@ -1,21 +1,24 @@ -with Demos; --- with CDAP; --- with EFCP; -with IPCP_Manager; use IPCP_Manager; +with GUI; +with Debug; +with Textures; +with Textures.PSU; procedure Demo is - - procedure Header is - begin - Demos.Put (0, 0, "eRINA Debug"); - end Header; - - procedure Initialize is new Demos.Initialize_Blank (Header); + Counter : Natural := 0; begin - Initialize; + GUI.Initialize ("eRINA Debug"); + Textures.Print (Textures.PSU.Bitmap, (5, 10)); -- Keep board from immediately terminating loop - null; + Debug.Print (Debug.Info, "Message " & Counter'Image); + Counter := Counter + 1; + delay 0.5; + Debug.Print (Debug.Warning, "Message " & Counter'Image); + Counter := Counter + 1; + delay 0.5; + Debug.Print (Debug.Error, "Message " & Counter'Image); + Counter := Counter + 1; + delay 0.5; end loop; end Demo; \ No newline at end of file diff --git a/eRINA_STM32F7/src/rina/gui.adb b/eRINA_STM32F7/src/rina/gui.adb index da15c8e..d9fbcf7 100644 --- a/eRINA_STM32F7/src/rina/gui.adb +++ b/eRINA_STM32F7/src/rina/gui.adb @@ -1,84 +1,51 @@ with Bitmapped_Drawing; -with HAL.Bitmap; with STM32.Board; with STM32.RNG.Interrupts; - package body GUI is - pragma Warnings (Off); - - CONSOLE_STARTING_POINT : HAL.Bitmap.Point := (0, 100); - CURRENT_CONSOLE_POSITION : HAL.Bitmap.Point := (0, 100); - FONT_HEIGHT : Natural := BMP_Fonts.Char_Height(Font => Large_Font); - - - function Scale (Point : in HAL.Bitmap.Point) return HAL.Bitmap.Point; - function Scale (Point : in HAL.Bitmap.Point) return HAL.Bitmap.Point is - begin - if STM32.Board.LCD_Natural_Width > 480 then - return (Point.X * 800 / 480, Point.Y * 480 / 272); - else - return Point; + function ScreenBuffer return HAL.Bitmap.Any_Bitmap_Buffer is + begin + return STM32.Board.Display.Hidden_Buffer (1); + end ScreenBuffer; + + function Scale (Point : in HAL.Bitmap.Point) return HAL.Bitmap.Point is + begin + if STM32.Board.LCD_Natural_Width > Board_Resolution.Width then + return (Point.X * 800 / Board_Resolution.Width, Point.Y * Board_Resolution.Width / Board_Resolution.Width); + else + return Point; end if; - end Scale; - - procedure Print (X : in Natural; Y : in Natural; Msg : in String) is - begin - Bitmapped_Drawing.Draw_String (Buffer => STM32.Board.Display.Hidden_Buffer (1).all, - Start => Scale ((X,Y)), - Msg => Msg, - Font => Large_Font, - Foreground => Foreground, - Background => Background); - end Print; - - procedure Initialize (Title : in String) is - begin - STM32.RNG.Interrupts.Initialize_RNG; - STM32.Board.Display.Initialize; - STM32.Board.Display.Initialize_Layer (1, HAL.Bitmap.ARGB_1555); - Print(0, 0, Title); - end Initialize; - - -- Probably a cleaner way to do this - procedure PrintToConsole(Msg : in String) is - currentLine : Natural := (CURRENT_CONSOLE_POSITION.Y - 100) / FONT_HEIGHT; -- zero indexed - begin - if currentLine = 14 then --make dynamic - declare - iterator : Integer := 1; - begin - while iterator < 13 loop --make dynamic - CopyLine(iterator, iterator - 1, false); - iterator := iterator + 1; - end loop; - CopyLine(13, 12, True); --make dynamic - end; - CURRENT_CONSOLE_POSITION.Y := CURRENT_CONSOLE_POSITION.Y - FONT_HEIGHT; - Print(CURRENT_CONSOLE_POSITION.X, CURRENT_CONSOLE_POSITION.Y, Msg); - CURRENT_CONSOLE_POSITION.Y := CURRENT_CONSOLE_POSITION.Y + FONT_HEIGHT; - - else - Print(CURRENT_CONSOLE_POSITION.X, CURRENT_CONSOLE_POSITION.Y, Msg); - CURRENT_CONSOLE_POSITION.Y := CURRENT_CONSOLE_POSITION.Y + FONT_HEIGHT; - end if; - - STM32.Board.Display.Update_Layer(1, True); - end PrintToConsole; - - - procedure CopyLine(SrcLineNumber : in Natural; DstLineNumer : in Natural; DeleteSrc : in Boolean) is - srcToPoint : HAL.Bitmap.Point := (0, (CONSOLE_STARTING_POINT.Y + (FONT_HEIGHT * SrcLineNumber))); - dstToPoint : HAL.Bitmap.Point := (0, (CONSOLE_STARTING_POINT.Y + (FONT_HEIGHT * DstLineNumer))); - srcRect : HAL.Bitmap.Rect := (Position => srcToPoint, Width => 480, Height => FONT_HEIGHT); -- dont hardcode 480 - begin - HAL.Bitmap.Copy_Rect(Src_Buffer => STM32.Board.Display.Hidden_Buffer (1).all, Src_Pt => srcToPoint, Dst_Buffer => STM32.Board.Display.Hidden_Buffer (1).all, Dst_Pt => dstToPoint, Width => 480, Height => FONT_HEIGHT, Synchronous => True); - if DeleteSrc then - HAL.Bitmap.Fill_Rect(Buffer => STM32.Board.Display.Hidden_Buffer (1).all, Area => srcRect); - end if; - STM32.Board.Display.Update_Layer(1, True); - end CopyLine; - - -end GUI; \ No newline at end of file + end Scale; + + procedure Print (Msg : in String; Pos : in HAL.Bitmap.Point) is + begin + Bitmapped_Drawing.Draw_String + (Buffer => ScreenBuffer.all, + Start => Scale ((Pos.X, Pos.Y)), + Msg => Msg, + Font => BMP_Fonts.Font8x8, + Foreground => Foreground, + Background => Background); + + STM32.Board.Display.Update_Layer (1, True); + end Print; + + procedure Initialize (Title : in String) is + Title_Location : constant HAL.Bitmap.Point := (80, 10); + begin + STM32.RNG.Interrupts.Initialize_RNG; + STM32.Board.Display.Initialize; + STM32.Board.Display.Initialize_Layer (1, HAL.Bitmap.ARGB_1555); + Print (Title, Title_Location); + end Initialize; + + function MeasureText + (Text : in String; Font : in BMP_Fonts.BMP_Font) return Size + is + begin + return + (Text'Length * BMP_Fonts.Char_Width (Font), + BMP_Fonts.Char_Height (Font)); + end MeasureText; +end GUI; diff --git a/eRINA_STM32F7/src/rina/gui.ads b/eRINA_STM32F7/src/rina/gui.ads index 3071295..8212081 100644 --- a/eRINA_STM32F7/src/rina/gui.ads +++ b/eRINA_STM32F7/src/rina/gui.ads @@ -1,17 +1,25 @@ with BMP_Fonts; with HAL.Bitmap; -package GUI is - pragma Warnings(Off); - Large_Font : BMP_Fonts.BMP_Font := BMP_Fonts.Font12x12; - Foreground : HAL.Bitmap.Bitmap_Color := HAL.Bitmap.White; - Background : HAL.Bitmap.Bitmap_Color := HAL.Bitmap.Black; +package GUI is + pragma Warnings (Off); - procedure Print (X : in Natural; Y : in Natural; Msg : in String); + Large_Font : BMP_Fonts.BMP_Font := BMP_Fonts.Font12x12; + Foreground : HAL.Bitmap.Bitmap_Color := HAL.Bitmap.White; + Background : HAL.Bitmap.Bitmap_Color := HAL.Bitmap.Black; - procedure Initialize (Title : in String); + type Size is record + Width : Natural; + Height : Natural; + end record; - procedure PrintToConsole(Msg : in String); + Board_Resolution : Size := (480, 272); - procedure CopyLine(SrcLineNumber : in Natural; DstLineNumer : in Natural; DeleteSrc : in Boolean); + function ScreenBuffer return HAL.Bitmap.Any_Bitmap_Buffer; + procedure Initialize (Title : in String); + procedure Print (Msg : in String; Pos : in HAL.Bitmap.Point); + + function MeasureText + (Text : in String; Font : in BMP_Fonts.BMP_Font) return Size; + function Scale (Point : in HAL.Bitmap.Point) return HAL.Bitmap.Point; end GUI; \ No newline at end of file diff --git a/eRINA_STM32F7/src/rina/textures-psu.ads b/eRINA_STM32F7/src/rina/textures-psu.ads new file mode 100644 index 0000000..2ddea04 --- /dev/null +++ b/eRINA_STM32F7/src/rina/textures-psu.ads @@ -0,0 +1,560 @@ +package Textures.PSU is + + Bitmap : aliased constant Texture := + ((16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, + 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, + 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, + 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, + 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, + 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, + 16#0#, 16#0#, 16#0#, 16#0#), + (16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, + 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, + 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, + 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, + 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, + 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, + 16#0#, 16#0#, 16#0#, 16#0#), + (16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, + 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, + 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, + 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, + 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, + 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, + 16#0#, 16#0#, 16#0#, 16#0#), + (16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, + 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, + 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, + 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, + 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, + 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, + 16#0#, 16#0#, 16#0#, 16#0#), + (16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#ffff#, 16#ffff#, 16#ffff#, + 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, + 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, + 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, + 16#ffff#, 16#ffff#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, + 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, + 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, + 16#0#, 16#0#, 16#0#, 16#0#, 16#0#), + (16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#ffff#, 16#ffff#, 16#ffff#, + 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, + 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, + 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, + 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, + 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, + 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, + 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#), + (16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#ffff#, 16#ffff#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#ffff#, 16#ffff#, 16#ffff#, + 16#ffff#, 16#ffff#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, + 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, + 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#), + (16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#ffff#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#ffff#, 16#ffff#, 16#ffff#, 16#0#, 16#0#, 16#0#, 16#0#, + 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, + 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#), + (16#0#, 16#0#, 16#0#, 16#0#, 16#ffff#, 16#ffff#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#ffff#, 16#ffff#, 16#ffff#, 16#0#, + 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, + 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, + 16#0#), + (16#0#, 16#0#, 16#0#, 16#0#, 16#ffff#, 16#ffff#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#ffff#, 16#ffff#, 16#ffff#, + 16#ffff#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, + 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, + 16#0#), + (16#0#, 16#0#, 16#0#, 16#0#, 16#ffff#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, + 16#ffff#, 16#ffff#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, + 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, + 16#0#, 16#0#), + (16#0#, 16#0#, 16#0#, 16#ffff#, 16#ffff#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#ffff#, 16#ffff#, + 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, + 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, + 16#ffff#, 16#ffff#, 16#ffff#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, + 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, + 16#0#, 16#0#), + (16#0#, 16#0#, 16#0#, 16#ffff#, 16#ffff#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, + 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, + 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, + 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#0#, 16#0#, 16#0#, + 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, + 16#0#, 16#0#, 16#0#), + (16#0#, 16#0#, 16#0#, 16#ffff#, 16#ffff#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, + 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, + 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, + 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#0#, + 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, + 16#0#, 16#0#, 16#0#, 16#0#), + (16#0#, 16#0#, 16#0#, 16#ffff#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, + 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, + 16#ffff#, 16#c2fd#, 16#c2fd#, 16#c2fd#, 16#ffff#, 16#ffff#, 16#ffff#, + 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, + 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, + 16#0#, 16#0#, 16#0#, 16#0#), + (16#0#, 16#0#, 16#0#, 16#ffff#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#ffff#, + 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, + 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#c2fd#, + 16#c2fd#, 16#c2fd#, 16#c2fd#, 16#c2fd#, 16#c2fd#, 16#c2fd#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#ffff#, 16#ffff#, 16#ffff#, + 16#ffff#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, + 16#0#, 16#0#, 16#0#, 16#0#), + (16#0#, 16#0#, 16#ffff#, 16#ffff#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#ffff#, 16#ffff#, + 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, + 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#c2fd#, + 16#c2fd#, 16#c2fd#, 16#c2fd#, 16#c2fd#, 16#c2fd#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#ffff#, 16#ffff#, 16#ffff#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, + 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#), + (16#0#, 16#0#, 16#ffff#, 16#ffff#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#b1f2#, + 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#80ef#, 16#80ef#, 16#ffff#, + 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, + 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#c2fd#, 16#c2fd#, 16#c2fd#, + 16#c2fd#, 16#c2fd#, 16#c2fd#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#eb5b#, 16#ffff#, 16#ffff#, 16#0#, 16#0#, 16#0#, 16#0#, + 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#), + (16#0#, 16#0#, 16#ffff#, 16#ffff#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#ffff#, 16#ffff#, + 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, + 16#ffff#, 16#ffff#, 16#ffff#, 16#c2fd#, 16#c2fd#, 16#c2fd#, 16#c2fd#, + 16#c2fd#, 16#c2fd#, 16#c2fd#, 16#c2fd#, 16#c2fd#, 16#c2fd#, 16#c2fd#, + 16#c2fd#, 16#baba#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#ffff#, 16#ffff#, 16#ffff#, 16#0#, 16#0#, 16#0#, + 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#), + (16#0#, 16#0#, 16#ffff#, 16#df1a#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#ffff#, 16#ffff#, 16#80f0#, + 16#80f0#, 16#80f0#, 16#80f0#, 16#80f0#, 16#80f0#, 16#ffff#, 16#ffff#, + 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#c2fd#, 16#c2fd#, 16#c2fd#, + 16#c2fd#, 16#c2fd#, 16#c2fd#, 16#c2fd#, 16#beba#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#ffff#, 16#ffff#, 16#0#, 16#0#, 16#0#, + 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#), + (16#0#, 16#0#, 16#ffff#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#ffff#, 16#ffff#, 16#80f0#, 16#80f0#, + 16#80f0#, 16#80f0#, 16#80f0#, 16#80f0#, 16#80f0#, 16#80f0#, 16#ffff#, + 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, + 16#c2fd#, 16#c2fd#, 16#c2fd#, 16#c2fd#, 16#c2fd#, 16#c2fd#, 16#c2fd#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#ffff#, 16#ffff#, 16#0#, + 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#), + (16#0#, 16#0#, 16#ffff#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#ffff#, 16#ffff#, 16#ffff#, 16#80f0#, + 16#80f0#, 16#80f0#, 16#80f0#, 16#80f0#, 16#80f0#, 16#80f0#, 16#ffff#, + 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, + 16#ffff#, 16#c2fd#, 16#c2fd#, 16#c2fd#, 16#c2fd#, 16#c2fd#, 16#c2fd#, + 16#c2fd#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#ffff#, 16#ffff#, + 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#), + (16#0#, 16#0#, 16#ffff#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#ffff#, 16#ffff#, 16#ffff#, + 16#ffff#, 16#80f0#, 16#80f0#, 16#80f0#, 16#80f0#, 16#ffff#, 16#ffff#, + 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, + 16#ffff#, 16#c2fd#, 16#c2fd#, 16#c2fd#, 16#c2fd#, 16#c2fd#, 16#c2fd#, + 16#c2fd#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#ffff#, + 16#ffff#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#), + (16#0#, 16#ffff#, 16#ffff#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#ffff#, 16#ffff#, + 16#ffff#, 16#ffff#, 16#ffff#, 16#80f0#, 16#ffff#, 16#ffff#, 16#ffff#, + 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, + 16#ffff#, 16#c2fd#, 16#c2fd#, 16#c2fd#, 16#c2fd#, 16#c2fd#, 16#c2fd#, + 16#c2fd#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#9d6f#, + 16#ffff#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#), + (16#0#, 16#ffff#, 16#ffff#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, + 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, + 16#ffff#, 16#c2fd#, 16#c2fd#, 16#c2fd#, 16#c2fd#, 16#c2fd#, 16#c2fd#, + 16#c2fd#, 16#c2fd#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#ffff#, 16#ffff#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#), + (16#0#, 16#ffff#, 16#ffff#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, + 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, + 16#ffff#, 16#ffff#, 16#c2fd#, 16#c2fd#, 16#c2fd#, 16#c2fd#, 16#c2fd#, + 16#c2fd#, 16#c2fd#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#ffff#, 16#ffff#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#), + (16#0#, 16#ffff#, 16#ffff#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, + 16#ffff#, 16#ffff#, 16#8110#, 16#8110#, 16#8110#, 16#ffff#, 16#ffff#, + 16#ffff#, 16#ffff#, 16#c2fd#, 16#c2fd#, 16#c2fd#, 16#c2fd#, 16#c2fd#, + 16#c2fd#, 16#c2fd#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#ffff#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#), + (16#0#, 16#ffff#, 16#ffff#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, + 16#ffff#, 16#8110#, 16#8110#, 16#8110#, 16#ffff#, 16#ffff#, 16#ffff#, + 16#ffff#, 16#ffff#, 16#c2fd#, 16#c2fd#, 16#c2fd#, 16#c2fd#, 16#c2fd#, + 16#c2fd#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#ffff#, 16#ffff#, 16#0#, 16#0#, 16#0#, 16#0#), + (16#0#, 16#ffff#, 16#ffff#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, + 16#8110#, 16#8110#, 16#8110#, 16#8110#, 16#8110#, 16#ffff#, 16#ffff#, + 16#ffff#, 16#ffff#, 16#c2fd#, 16#c2fd#, 16#c2fd#, 16#c2fd#, 16#c2fd#, + 16#b678#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#ffff#, 16#ffff#, 16#0#, 16#0#, 16#0#), + (16#0#, 16#ffff#, 16#ffff#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, + 16#8110#, 16#8110#, 16#ffff#, 16#ffff#, 16#8110#, 16#ffff#, 16#ffff#, + 16#ffff#, 16#ffff#, 16#c2fd#, 16#c2fd#, 16#c2fd#, 16#c2fd#, 16#c2fd#, + 16#c2fd#, 16#c2fd#, 16#c2fd#, 16#c2fd#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#ffff#, 16#0#, 16#0#, 16#0#), + (16#0#, 16#ffff#, 16#ffff#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#8d0e#, + 16#8110#, 16#8110#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, + 16#ffff#, 16#ffff#, 16#c2fd#, 16#c2fd#, 16#c2fd#, 16#c2fd#, 16#c2fd#, + 16#c2fd#, 16#c2fd#, 16#c2fd#, 16#c2fd#, 16#c2fd#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#ffff#, 16#ffff#, 16#0#, + 16#0#), + (16#0#, 16#ffff#, 16#ffff#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#952e#, + 16#8110#, 16#8110#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, + 16#ffff#, 16#ffff#, 16#ffff#, 16#c2fd#, 16#c2fd#, 16#c2fd#, 16#c2fd#, + 16#c2fd#, 16#c2fd#, 16#c2fd#, 16#c2fd#, 16#c2fd#, 16#c2fd#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#ffff#, 16#ffff#, + 16#0#), + (16#0#, 16#ffff#, 16#ffff#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, + 16#8110#, 16#8110#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, + 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#c2fd#, + 16#c2fd#, 16#c2fd#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#c2fd#, + 16#c2fd#, 16#c2fd#, 16#c2fd#, 16#c2fd#, 16#ffff#, 16#ffff#, 16#0#, + 16#0#), + (16#0#, 16#ffff#, 16#ffff#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, + 16#8110#, 16#8110#, 16#8110#, 16#ffff#, 16#8110#, 16#ffff#, 16#ffff#, + 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, + 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#80ef#, + 16#80ef#, 16#ffff#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#c2fd#, 16#c2fd#, + 16#c2fd#, 16#c2fd#, 16#c2fd#, 16#c2fd#, 16#ffff#, 16#ffff#, 16#0#, + 16#0#), + (16#0#, 16#ffff#, 16#ffff#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, + 16#ffff#, 16#8110#, 16#8110#, 16#8110#, 16#c2fd#, 16#ffff#, 16#ffff#, + 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, + 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#80ef#, + 16#ffff#, 16#ffff#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#c2fd#, 16#c2fd#, 16#c2fd#, + 16#c2fd#, 16#c2fd#, 16#c2fd#, 16#ffff#, 16#ffff#, 16#0#, 16#0#, 16#0#), + (16#0#, 16#ffff#, 16#ffff#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, + 16#ffff#, 16#ffff#, 16#c2fd#, 16#c2fd#, 16#c2fd#, 16#c2fd#, 16#c2fd#, + 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, + 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#80ef#, + 16#ffff#, 16#ffff#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#c2fd#, 16#c2fd#, 16#c2fd#, 16#c2fd#, + 16#c2fd#, 16#c2fd#, 16#c2fd#, 16#ffff#, 16#0#, 16#0#, 16#0#, 16#0#), + (16#0#, 16#ffff#, 16#ffff#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, + 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#c2fd#, 16#c2fd#, 16#c2fd#, + 16#c2fd#, 16#c2fd#, 16#c2fd#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, + 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#80ef#, + 16#ffff#, 16#ffff#, 16#ffff#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#c2fd#, 16#c2fd#, 16#c2fd#, 16#c2fd#, 16#c2fd#, + 16#c2fd#, 16#c2fd#, 16#ffff#, 16#ffff#, 16#0#, 16#0#, 16#0#, 16#0#), + (16#0#, 16#ffff#, 16#ffff#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, + 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, + 16#c2fd#, 16#c2fd#, 16#c2fd#, 16#c2fd#, 16#c2fd#, 16#8110#, 16#ffff#, + 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#80ef#, 16#add1#, + 16#ffff#, 16#ffff#, 16#ffff#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#c2fd#, 16#c2fd#, 16#c2fd#, 16#c2fd#, 16#c2fd#, 16#c2fd#, + 16#c2fd#, 16#ffff#, 16#ffff#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#), + (16#0#, 16#ffff#, 16#ffff#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, + 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, + 16#ffff#, 16#ffff#, 16#c2fd#, 16#c2fd#, 16#80ee#, 16#8110#, 16#ffff#, + 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#80ef#, 16#ffff#, + 16#ffff#, 16#ffff#, 16#ffff#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, + 16#ffff#, 16#ffff#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#), + (16#0#, 16#ffff#, 16#ffff#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, + 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, + 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#8110#, 16#8110#, 16#e75b#, + 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#80ef#, 16#80ef#, 16#ffff#, + 16#ffff#, 16#ffff#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#ffff#, 16#ffff#, + 16#ffff#, 16#ffff#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#), + (16#0#, 16#ffff#, 16#ffff#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, + 16#ffff#, 16#80ef#, 16#80ef#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, + 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#8110#, 16#8110#, 16#8110#, + 16#ffff#, 16#8110#, 16#ffff#, 16#80ef#, 16#80ef#, 16#80ef#, 16#ffff#, + 16#ffff#, 16#ffff#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#ffff#, 16#ffff#, + 16#ffff#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#), + (16#0#, 16#0#, 16#ffff#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#ffff#, + 16#ffff#, 16#ffff#, 16#ffff#, 16#8110#, 16#ffff#, 16#ffff#, 16#ffff#, + 16#80ef#, 16#80ef#, 16#ffff#, 16#80ef#, 16#80ef#, 16#ffff#, 16#ffff#, + 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#8110#, 16#8110#, 16#8110#, + 16#8110#, 16#84ee#, 16#ffff#, 16#ffff#, 16#ffff#, 16#80ef#, 16#80ef#, + 16#ffff#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#ffff#, 16#ffff#, + 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#), + (16#0#, 16#0#, 16#ffff#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#ffff#, + 16#ffff#, 16#ffff#, 16#8110#, 16#8110#, 16#80ef#, 16#ffff#, 16#ffff#, + 16#80ef#, 16#80ef#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, + 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#8110#, 16#8110#, 16#8110#, + 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#ffff#, 16#ffff#, + 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#), + (16#0#, 16#0#, 16#ffff#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#ffff#, + 16#ffff#, 16#8110#, 16#8110#, 16#8110#, 16#8110#, 16#ffff#, 16#ffff#, + 16#80ef#, 16#80ef#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, + 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#8110#, 16#8110#, 16#ffff#, + 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#ffff#, 16#ffff#, 16#0#, + 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#), + (16#0#, 16#0#, 16#ffff#, 16#ffff#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#994f#, + 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, + 16#ffff#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#ffff#, 16#ffff#, + 16#ffff#, 16#c2fc#, 16#c2fc#, 16#c2fc#, 16#ffff#, 16#8110#, 16#ffff#, + 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#ffff#, 16#ffff#, 16#0#, 16#0#, 16#0#, + 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#), + (16#0#, 16#0#, 16#ffff#, 16#ffff#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#ffff#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#d6f8#, 16#ffff#, 16#ffff#, 16#80ef#, 16#80ef#, 16#ffff#, 16#ffff#, + 16#c2fc#, 16#c2fc#, 16#c2fc#, 16#c2fc#, 16#c2fc#, 16#ffff#, 16#ffff#, + 16#ffff#, 16#ffff#, 16#ffff#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#ffff#, 16#ffff#, 16#0#, 16#0#, 16#0#, 16#0#, + 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#), + (16#0#, 16#0#, 16#ffff#, 16#ffff#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#ffff#, 16#ffff#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, + 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#), + (16#0#, 16#0#, 16#ffff#, 16#ffff#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#ffff#, 16#ffff#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, + 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#), + (16#0#, 16#0#, 16#0#, 16#ffff#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#ffff#, 16#ffff#, + 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, + 16#0#, 16#0#, 16#0#, 16#0#), + (16#0#, 16#0#, 16#0#, 16#ffff#, 16#c675#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#ffff#, 16#ffff#, 16#0#, + 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, + 16#0#, 16#0#, 16#0#, 16#0#), + (16#0#, 16#0#, 16#0#, 16#ffff#, 16#ffff#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#ffff#, 16#ffff#, 16#0#, 16#0#, 16#0#, + 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, + 16#0#, 16#0#, 16#0#), + (16#0#, 16#0#, 16#0#, 16#ffff#, 16#ffff#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#ffff#, 16#ffff#, 16#0#, 16#0#, 16#0#, 16#0#, + 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, + 16#0#, 16#0#, 16#0#), + (16#0#, 16#0#, 16#0#, 16#0#, 16#ffff#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#ffff#, 16#ffff#, 16#ffff#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, + 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, + 16#0#, 16#0#), + (16#0#, 16#0#, 16#0#, 16#0#, 16#ffff#, 16#ffff#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#ffff#, + 16#ffff#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, + 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, + 16#0#), + (16#0#, 16#0#, 16#0#, 16#0#, 16#ffff#, 16#ffff#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#ffff#, 16#ffff#, 16#ffff#, + 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, + 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, + 16#0#), + (16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#ffff#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#ffff#, 16#ffff#, 16#ffff#, 16#0#, 16#0#, 16#0#, + 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, + 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#), + (16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#ffff#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#ffff#, + 16#ffff#, 16#ffff#, 16#ffff#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, + 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, + 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#), + (16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#ffff#, 16#ffff#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, 16#80ef#, + 16#80ef#, 16#80ef#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, + 16#ffff#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, + 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, + 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#), + (16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#ffff#, 16#ffff#, 16#ffff#, + 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, + 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, + 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, + 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#0#, 16#0#, 16#0#, 16#0#, + 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, + 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, + 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#), + (16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#ffff#, 16#ffff#, 16#ffff#, + 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, + 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, + 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#ffff#, 16#0#, 16#0#, 16#0#, + 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, + 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, + 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, + 16#0#, 16#0#, 16#0#), + (16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, + 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, + 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, + 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, + 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, + 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, + 16#0#, 16#0#, 16#0#, 16#0#), + (16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, + 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, + 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, + 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, + 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, + 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, + 16#0#, 16#0#, 16#0#, 16#0#), + (16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, + 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, + 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, + 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, + 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, + 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, + 16#0#, 16#0#, 16#0#, 16#0#), + (16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, + 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, + 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, + 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, + 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, + 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, 16#0#, + 16#0#, 16#0#, 16#0#, 16#0#)); + +end Textures.PSU; diff --git a/eRINA_STM32F7/src/rina/textures.adb b/eRINA_STM32F7/src/rina/textures.adb new file mode 100644 index 0000000..217483b --- /dev/null +++ b/eRINA_STM32F7/src/rina/textures.adb @@ -0,0 +1,17 @@ +with Bitmap_Color_Conversion; +with GUI; + +package body Textures is + procedure Print (T : in Texture; Pos : in HAL.Bitmap.Point) is + begin + for Row in 0 .. Textures.Texture_Height - 1 loop + for Column in 0 .. Textures.Texture_Width - 1 loop + GUI.ScreenBuffer.Set_Source + (Bitmap_Color_Conversion.Word_To_Bitmap_Color + (HAL.Bitmap.ARGB_1555, HAL.UInt32 (T (Row) (Column)))); + GUI.ScreenBuffer.Set_Pixel + ((Pos.X + Row, Pos.Y + Column)); + end loop; + end loop; + end Print; +end Textures; diff --git a/eRINA_STM32F7/src/rina/textures.ads b/eRINA_STM32F7/src/rina/textures.ads new file mode 100644 index 0000000..1801ee8 --- /dev/null +++ b/eRINA_STM32F7/src/rina/textures.ads @@ -0,0 +1,21 @@ +with HAL; use HAL; +with HAL.Bitmap; + +package Textures is + + Texture_Width : constant := 64; + Texture_Height : constant := 64; + + type Texture_Column is array (0 .. Texture_Width - 1) of UInt16 with + Component_Size => 16; + + type Texture is + array (0 .. Texture_Height - 1) of aliased Texture_Column with + Pack; + + type Texture_Column_Access is access constant Texture_Column; + + type Texture_Access is access constant Texture; + + procedure Print (T : in Texture; Pos : in HAL.Bitmap.Point); +end Textures; diff --git a/eRINA_STM32F7/src/utils/demos.adb b/eRINA_STM32F7/src/utils/demos.adb index e3290df..970126f 100644 --- a/eRINA_STM32F7/src/utils/demos.adb +++ b/eRINA_STM32F7/src/utils/demos.adb @@ -136,14 +136,24 @@ package body Demos is STM32.RNG.Interrupts.Initialize_RNG; STM32.Board.Display.Initialize; STM32.Board.Display.Initialize_Layer (1, HAL.Bitmap.ARGB_1555); - + Current_Font := BMP_Fonts.Font16x24; Header; Current_Font := Default_Font; - + STM32.Board.Display.Update_Layer (1); + + -- STMicroelectronics OUI = 00 81 E1 + Ifnet.Mac := (0, 16#81#, 16#E1#, 5, 5, 1); + + -- Setup some receive buffers and initialize the Ethernet driver. + Net.Buffers.Add_Region + (STM32.SDRAM.Reserve (Amount => HAL.UInt32 (NET_BUFFER_SIZE)), + NET_BUFFER_SIZE); + Ifnet.Initialize; + Receiver.Start; end Initialize_Blank; - + -- ------------------------------ -- Initialize the board and the interface. -- ------------------------------ @@ -195,26 +205,6 @@ package body Demos is STM32.Board.Display.Hidden_Buffer (1).Set_Source (HAL.Bitmap.Blue); STM32.Board.Display.Hidden_Buffer (1).Draw_Horizontal_Line (Pt => (X => 0, Y => 84), Width => STM32.Board.LCD_Natural_Width); - - Current_Font := BMP_Fonts.Font16x24; - Background := HAL.Bitmap.Blue; - Foreground := HAL.Bitmap.White; - Put (32, STM32.Board.LCD_Natural_Height - 35, "Menu"); - - STM32.Board.Display.Hidden_Buffer (1).Set_Source (HAL.Bitmap.Blue); - STM32.Board.Display.Hidden_Buffer (1).Fill_Rect - ((Position => - (STM32.Board.LCD_Natural_Width - 175 - 16, - STM32.Board.LCD_Natural_Height - 40), - Width => 175, Height => 20)); - - Current_Font := Default_Font; - Put - (STM32.Board.LCD_Natural_Width - 150 - 37, - STM32.Board.LCD_Natural_Height - 35, "Broadcast RINA Packet"); - - Background := HAL.Bitmap.Black; - STM32.Board.Display.Update_Layer (1); end loop; end Initialize; diff --git a/eRINA_STM32F7/src/utils/receiver.adb b/eRINA_STM32F7/src/utils/receiver.adb index 8b9e9f5..d982aaf 100644 --- a/eRINA_STM32F7/src/utils/receiver.adb +++ b/eRINA_STM32F7/src/utils/receiver.adb @@ -76,6 +76,10 @@ package body Receiver is Net.Headers.To_Network (Net.Protos.ETHERTYPE_ARP) then Net.Protos.Arp.Receive (Demos.Ifnet, Packet); + elsif Ether.Ether_Type = + Net.Headers.To_Network (Net.Protos.ETHERTYPE_IP) + then + Net.Protos.Dispatchers.Receive (Demos.Ifnet, Packet); end if; -- For our case, we ignore IP packets