diff --git a/demos/kfest-2022/demo-2/App.Main.s b/demos/kfest-2022/demo-2/App.Main.s
new file mode 100644
index 0000000..90a9d38
--- /dev/null
+++ b/demos/kfest-2022/demo-2/App.Main.s
@@ -0,0 +1,245 @@
+; Test driver to exercise graphics routines.
+
+ REL
+ DSK MAINSEG
+
+ use Locator.Macs
+ use Load.Macs
+ use Mem.Macs
+ use Misc.Macs
+ use Util.Macs
+ use EDS.GSOS.Macs
+ use GTE.Macs
+
+ mx %00
+
+tiledata EXT ; tileset buffer
+TileSetPalette EXT
+
+; Keycodes
+LEFT_ARROW equ $08
+RIGHT_ARROW equ $15
+UP_ARROW equ $0B
+DOWN_ARROW equ $0A
+
+; Direct page space
+MyUserId equ 0
+BankLoad equ 2
+StartX equ 4
+StartY equ 6
+TileMapWidth equ 8
+TileMapHeight equ 10
+ScreenWidth equ 12
+ScreenHeight equ 14
+MaxGlobalX equ 16
+MaxGlobalY equ 18
+MaxBG0X equ 20
+MaxBG0Y equ 22
+OldOneSecondCounter equ 26
+appTmp0 equ 28
+
+ phk
+ plb
+
+ sta MyUserId ; GS/OS passes the memory manager user ID for the application into the program
+ tdc
+ sta MyDirectPage ; Keep a copy for the overlay callback
+
+ _MTStartUp ; GTE requires the miscellaneous toolset to be running
+
+ lda #ENGINE_MODE_DYN_TILES ; Engine in Fast Mode
+ jsr GTEStartUp ; Load and install the GTE User Tool
+
+; Initialize local variables
+
+ stz StartX
+ stz StartY
+ stz frameCount
+
+; Initialize the graphics screen playfield
+
+ pea #320
+ pea #200
+ _GTESetScreenMode
+
+; Load a tileset
+
+ pea #^tiledata
+ pea #tiledata
+ _GTELoadTileSet
+
+ pea $0000
+ pea #^TileSetPalette
+ pea #TileSetPalette
+ _GTESetPalette
+
+; Set up our level data
+
+ jsr BG0SetUp
+ jsr TileAnimInit
+ jsr SetLimits
+
+ jsr InitOverlay ; Initialize the status bar
+ pha
+ _GTEGetSeconds
+ pla
+ sta OldOneSecondCounter
+ jsr UdtOverlay
+
+; Set up a very specific test. First, we draw a sprite into the sprite plane, and then
+; leave it alone. We are just testing the ability to merge sprite plane data into
+; the play field tiles.
+EvtLoop
+ pha
+ _GTEReadControl
+ pla
+
+ jsr HandleKeys ; Do the generic key handlers
+ bcs :do_more
+ brl :do_render
+
+:do_more
+ cmp #'d'
+ bne :not_d
+ lda StartX
+ cmp MaxBG0X
+ bcc *+5
+ brl :do_render
+ inc StartX
+ pei StartX
+ pei StartY
+ _GTESetBG0Origin
+ brl :do_render
+:not_d
+
+ cmp #'a'
+ bne :not_a
+ lda StartX
+ bne *+5
+ brl :do_render
+ dec StartX
+ pei StartX
+ pei StartY
+ _GTESetBG0Origin
+ brl :do_render
+:not_a
+
+ cmp #'s'
+ bne :not_s
+ lda StartY
+ cmp MaxBG0Y
+ bcs :do_render
+ inc StartY
+ pei StartX
+ pei StartY
+ _GTESetBG0Origin
+ bra :do_render
+:not_s
+
+ cmp #'w'
+ bne :not_w
+ lda StartY
+ beq :do_render
+ dec StartY
+ pei StartX
+ pei StartY
+ _GTESetBG0Origin
+ bra :do_render
+:not_w
+
+:do_render
+ _GTERender
+
+; Update the performance counters
+
+ inc frameCount
+ pha
+ _GTEGetSeconds
+ pla
+ cmp OldOneSecondCounter
+ beq :noudt
+ sta OldOneSecondCounter
+ jsr UdtOverlay
+ stz frameCount
+:noudt
+ brl EvtLoop
+
+; Exit code
+Exit
+ _GTEShutDown
+Quit
+ _QuitGS qtRec
+
+ bcs Fatal
+Fatal brk $00
+
+qtRec adrl $0000
+ da $00
+
+; Color palette
+MyDirectPage ds 2
+
+SetLimits
+ pha ; Allocate space for width (in tiles), height (in tiles), pointer
+ pha
+ pha
+ pha
+ _GTEGetBG0TileMapInfo
+ pla
+ sta TileMapWidth
+ pla
+ sta TileMapHeight
+ pla
+ pla ; discard the pointer
+
+ pha ; Allocate space for x, y, width, height
+ pha
+ pha
+ pha
+ _GTEGetScreenInfo
+ pla
+ pla ; Discard screen corner
+ pla
+ sta ScreenWidth
+ pla
+ sta ScreenHeight
+
+ lda TileMapWidth
+ asl
+ asl
+ sta MaxGlobalX
+ sec
+ sbc ScreenWidth
+ sta MaxBG0X
+
+ lda TileMapHeight
+ asl
+ asl
+ asl
+ sta MaxGlobalY
+ sec
+ sbc ScreenHeight
+ sta MaxBG0Y
+
+; Check if the current StartX and StartY are out of bounds
+ lda StartX
+ cmp MaxBG0X
+ bcc :x_ok
+ lda MaxBG0X
+:x_ok pha
+
+ lda StartY
+ cmp MaxBG0Y
+ bcc :y_ok
+ lda MaxBG0Y
+:y_ok pha
+ _GTESetBG0Origin
+
+ rts
+
+frameCount equ 24
+
+ PUT ../StartUp.s
+ PUT ../../shell/Overlay.s
+ PUT gen/App.TileMapBG0.s
+ PUT gen/App.TileSetAnim.s
diff --git a/demos/kfest-2022/demo-2/App.s b/demos/kfest-2022/demo-2/App.s
new file mode 100644
index 0000000..86058e2
--- /dev/null
+++ b/demos/kfest-2022/demo-2/App.s
@@ -0,0 +1,15 @@
+; KFest 2022: Demo #1
+
+ TYP $B3 ; S16 file
+ DSK GTEDemo2
+ XPL
+
+; Segment #1 -- Main execution block
+
+ ASM App.Main.s
+ SNA Main
+
+; Segment #2 -- Tileset
+
+ ASM gen\App.TileSet.s
+ SNA TSET
\ No newline at end of file
diff --git a/demos/kfest-2022/demo-2/assets/tiled/Overworld.tsx b/demos/kfest-2022/demo-2/assets/tiled/Overworld.tsx
new file mode 100644
index 0000000..4753af2
--- /dev/null
+++ b/demos/kfest-2022/demo-2/assets/tiled/Overworld.tsx
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/demos/kfest-2022/demo-2/assets/tiled/world_1-1.json b/demos/kfest-2022/demo-2/assets/tiled/world_1-1.json
new file mode 100644
index 0000000..b4f1a51
--- /dev/null
+++ b/demos/kfest-2022/demo-2/assets/tiled/world_1-1.json
@@ -0,0 +1,32 @@
+{ "compressionlevel":-1,
+ "height":30,
+ "infinite":false,
+ "layers":[
+ {
+ "data":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 153, 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 153, 154, 153, 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 153, 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 153, 154, 153, 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 153, 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 153, 154, 153, 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 153, 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 153, 154, 153, 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 185, 186, 186, 187, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 185, 186, 186, 186, 186, 187, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 185, 186, 186, 187, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 185, 186, 186, 186, 186, 187, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 185, 186, 186, 187, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 185, 186, 186, 186, 186, 187, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 185, 186, 186, 187, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 185, 186, 186, 186, 186, 187, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 59, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 153, 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 155, 156, 157, 158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 153, 154, 153, 154, 153, 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 155, 156, 157, 156, 157, 158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 153, 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 155, 156, 157, 158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 153, 154, 153, 154, 153, 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 155, 156, 157, 156, 157, 158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 153, 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 155, 156, 157, 158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 153, 154, 153, 154, 153, 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 155, 156, 157, 156, 157, 158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 153, 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 155, 156, 157, 158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 153, 154, 153, 154, 153, 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 155, 156, 157, 156, 157, 158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 56, 10, 0, 0, 0, 0, 0, 153, 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 185, 186, 186, 187, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 185, 186, 186, 186, 186, 186, 186, 187, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 185, 186, 186, 187, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 185, 186, 186, 186, 186, 186, 186, 187, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 185, 186, 186, 187, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 185, 186, 186, 186, 186, 186, 186, 187, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 185, 186, 186, 187, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 185, 186, 186, 186, 186, 186, 186, 187, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 10, 0, 0, 0, 0, 185, 186, 186, 187, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 155, 156, 157, 158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 138, 0, 0, 0, 0, 0, 0, 0, 0, 0, 155, 156, 157, 156, 157, 156, 157, 158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 155, 156, 157, 158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 155, 156, 157, 156, 157, 156, 157, 158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 155, 156, 157, 158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 155, 156, 157, 156, 157, 156, 157, 158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 155, 156, 157, 158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 155, 156, 157, 156, 157, 156, 157, 158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 10, 0, 0, 0, 0, 155, 156, 157, 158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 169, 170, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 159, 160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 0, 0, 0, 0, 0, 0, 188, 188, 188, 188, 188, 188, 159, 160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 159, 160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 188, 188, 188, 188, 188, 188, 0, 0, 0, 0, 0, 0, 0, 0, 188, 188, 159, 160, 159, 160, 188, 188, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 6, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 191, 192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 191, 192, 191, 192, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 6, 5, 6, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 7, 8, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 6, 5, 6, 5, 6, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 7, 8, 7, 8, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 138, 0, 0, 0, 0, 0, 137, 138, 137, 138, 137, 138, 137, 138, 137, 138, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 169, 170, 0, 0, 0, 0, 0, 169, 170, 169, 170, 169, 170, 169, 170, 169, 170, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 7, 8, 7, 8, 7, 8, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 10, 0, 0, 0, 0, 0, 0, 0, 0, 31, 32, 31, 32, 31, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 159, 160, 0, 0, 0, 0, 0, 188, 188, 159, 160, 188, 188, 159, 160, 188, 188, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 138, 137, 138, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 12, 13, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 12, 13, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 188, 188, 159, 160, 188, 188, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 188, 188, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 188, 188, 188, 188, 0, 0, 0, 0, 0, 0, 0, 0, 159, 160, 0, 0, 0, 0, 159, 160, 0, 0, 0, 0, 159, 160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 188, 188, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 188, 188, 188, 188, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 6, 0, 0, 0, 0, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 6, 5, 6, 0, 0, 0, 0, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 188, 188, 188, 188, 159, 160, 188, 188, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 10, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 192, 0, 0, 0, 0, 0, 26, 26, 191, 192, 26, 26, 191, 192, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 169, 170, 169, 170, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 16, 17, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 16, 17, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 191, 192, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 191, 192, 0, 0, 0, 0, 191, 192, 0, 0, 0, 0, 191, 192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 0, 0, 0, 0, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 7, 8, 0, 0, 0, 0, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 191, 192, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 7, 8, 7, 8, 7, 8, 7, 8, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 10, 0, 0, 0, 0, 0, 0, 0, 0, 26, 64, 26, 26, 64, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 138, 137, 138, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 12, 13, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 20, 21, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 20, 21, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 6, 5, 6, 0, 0, 0, 0, 5, 6, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 6, 5, 6, 5, 6, 0, 0, 0, 0, 5, 6, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 10, 0, 0, 0, 0, 0, 0, 0, 0, 26, 64, 26, 26, 64, 26, 0, 0, 0, 0, 0, 0, 0, 0, 49, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 169, 170, 169, 170, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 16, 17, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 20, 21, 22, 0, 0, 0, 0, 49, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 20, 21, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 7, 8, 0, 0, 0, 0, 7, 8, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 49, 50, 0, 0, 0, 0, 0, 0, 7, 8, 7, 8, 7, 8, 0, 0, 0, 0, 7, 8, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 7, 8, 7, 8, 7, 8, 7, 8, 7, 8, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 49, 50, 0, 0, 0, 0, 0, 0, 9, 10, 0, 0, 0, 0, 0, 0, 31, 32, 24, 25, 24, 25, 24, 25, 31, 32, 0, 0, 0, 0, 0, 48, 21, 54, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 12, 13, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 20, 21, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 20, 21, 22, 0, 0, 0, 48, 21, 54, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 20, 21, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 21, 54, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 6, 5, 6, 5, 6, 0, 0, 0, 0, 5, 6, 5, 6, 5, 6, 0, 0, 0, 0, 0, 48, 21, 54, 51, 0, 0, 0, 5, 6, 5, 6, 5, 6, 5, 6, 0, 0, 0, 0, 5, 6, 5, 6, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 12, 13, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 12, 13, 14, 0, 0, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 0, 0, 0, 0, 0, 0, 0, 48, 21, 54, 51, 0, 0, 0, 0, 0, 9, 10, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 57, 58, 26, 26, 26, 26, 0, 0, 0, 0, 48, 21, 21, 21, 21, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 2147483697, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 16, 17, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 20, 21, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 20, 21, 22, 0, 0, 48, 21, 21, 21, 21, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 20, 21, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 2147483697, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 21, 21, 21, 21, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 2147483697, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 7, 8, 7, 8, 0, 0, 0, 0, 7, 8, 7, 8, 7, 8, 0, 0, 0, 0, 48, 21, 21, 21, 21, 51, 0, 0, 7, 8, 7, 8, 7, 8, 7, 8, 0, 0, 0, 0, 7, 8, 7, 8, 7, 8, 0, 0, 0, 0, 0, 0, 49, 2147483697, 0, 0, 15, 16, 17, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 16, 17, 18, 0, 0, 7, 8, 7, 8, 7, 8, 7, 8, 7, 8, 7, 8, 7, 8, 7, 8, 0, 0, 0, 0, 0, 0, 48, 21, 21, 21, 21, 51, 0, 0, 0, 0, 9, 10, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 64, 64, 26, 26, 26, 26, 0, 0, 0, 48, 21, 54, 21, 21, 54, 21, 51, 0, 137, 138, 137, 138, 137, 138, 137, 138, 137, 138, 137, 138, 0, 0, 34, 35, 34, 35, 34, 35, 0, 0, 0, 48, 21, 54, 2147483696, 0, 137, 138, 137, 138, 137, 138, 137, 138, 0, 0, 34, 35, 0, 0, 137, 138, 137, 138, 19, 20, 21, 22, 137, 138, 137, 138, 137, 138, 137, 138, 137, 138, 137, 138, 137, 138, 137, 138, 19, 20, 21, 22, 137, 138, 0, 0, 34, 35, 34, 35, 0, 0, 0, 0, 19, 20, 21, 22, 0, 48, 21, 54, 21, 21, 54, 21, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 20, 21, 22, 0, 0, 34, 35, 34, 35, 34, 35, 0, 0, 0, 48, 21, 54, 2147483696, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 35, 34, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 21, 54, 21, 21, 54, 21, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 35, 34, 35, 34, 35, 0, 0, 0, 48, 21, 54, 2147483696, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 6, 5, 6, 5, 6, 5, 6, 34, 35, 34, 35, 5, 6, 5, 6, 5, 6, 5, 6, 0, 48, 21, 54, 21, 21, 54, 21, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 0, 0, 0, 0, 5, 6, 5, 6, 5, 6, 5, 6, 0, 0, 0, 48, 21, 54, 2147483696, 0, 19, 20, 21, 22, 0, 0, 0, 0, 0, 0, 34, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 20, 21, 22, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 0, 0, 0, 0, 0, 48, 21, 54, 21, 21, 54, 21, 51, 0, 0, 0, 5, 6, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 64, 64, 26, 26, 26, 26, 0, 0, 48, 21, 21, 21, 21, 21, 21, 21, 21, 51, 169, 170, 169, 170, 169, 170, 169, 170, 169, 170, 169, 170, 0, 36, 37, 37, 37, 37, 37, 37, 38, 0, 48, 21, 21, 21, 21, 2147483696, 169, 170, 169, 170, 169, 170, 169, 170, 0, 36, 37, 37, 38, 0, 169, 170, 169, 170, 19, 20, 21, 22, 169, 170, 169, 170, 169, 170, 169, 170, 169, 170, 169, 170, 169, 170, 169, 170, 19, 20, 21, 22, 169, 170, 0, 36, 37, 37, 37, 37, 38, 0, 0, 0, 19, 20, 21, 22, 48, 21, 21, 21, 21, 21, 21, 21, 21, 51, 0, 0, 0, 0, 0, 0, 0, 0, 19, 20, 21, 22, 0, 36, 37, 37, 37, 37, 37, 37, 38, 0, 48, 21, 21, 21, 21, 2147483696, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 37, 37, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 37, 37, 37, 37, 38, 0, 0, 0, 0, 0, 0, 0, 48, 21, 21, 21, 21, 21, 21, 21, 21, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 37, 37, 37, 37, 37, 37, 38, 0, 48, 21, 21, 21, 21, 2147483696, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 37, 37, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 7, 8, 7, 8, 7, 8, 37, 37, 37, 37, 7, 8, 7, 8, 7, 8, 7, 8, 48, 21, 21, 21, 21, 21, 21, 21, 7, 8, 7, 8, 7, 8, 7, 8, 7, 8, 0, 0, 0, 0, 7, 8, 7, 8, 7, 8, 7, 8, 38, 0, 48, 21, 21, 21, 21, 2147483696, 19, 20, 21, 22, 0, 0, 0, 0, 0, 36, 37, 37, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 20, 21, 22, 7, 8, 7, 8, 7, 8, 7, 8, 7, 8, 7, 8, 7, 8, 7, 8, 7, 8, 0, 0, 0, 0, 48, 21, 21, 21, 21, 21, 21, 21, 21, 51, 0, 0, 7, 8, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 64, 64, 26, 26, 26, 26, 0, 0, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 0, 0, 0, 0, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 0, 0, 0, 0, 0, 0, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 0, 0, 0, 0, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 0, 0, 0, 0, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 0, 0, 0, 0, 0, 0, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 0, 0, 0, 0, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 0, 0, 0, 0, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 0, 0, 0, 0, 0, 0, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 0, 0, 0, 0, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 0, 0, 0, 0, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 0, 0, 0, 0, 0, 0, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 0, 0, 0, 0, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4],
+ "height":30,
+ "id":1,
+ "name":"App.TileMapBG0",
+ "opacity":1,
+ "type":"tilelayer",
+ "visible":true,
+ "width":416,
+ "x":0,
+ "y":0
+ }],
+ "nextlayerid":4,
+ "nextobjectid":2,
+ "orientation":"orthogonal",
+ "renderorder":"right-down",
+ "tiledversion":"1.7.2",
+ "tileheight":8,
+ "tilesets":[
+ {
+ "firstgid":1,
+ "source":"Overworld.tsx"
+ }],
+ "tilewidth":8,
+ "type":"map",
+ "version":"1.6",
+ "width":416
+}
\ No newline at end of file
diff --git a/demos/kfest-2022/demo-2/assets/tiled/world_1-1.tmx b/demos/kfest-2022/demo-2/assets/tiled/world_1-1.tmx
new file mode 100644
index 0000000..8b0a90f
--- /dev/null
+++ b/demos/kfest-2022/demo-2/assets/tiled/world_1-1.tmx
@@ -0,0 +1,41 @@
+
+
diff --git a/demos/kfest-2022/demo-2/assets/tilesets/smb-256-128-4bpp.png b/demos/kfest-2022/demo-2/assets/tilesets/smb-256-128-4bpp.png
new file mode 100644
index 0000000..82de535
Binary files /dev/null and b/demos/kfest-2022/demo-2/assets/tilesets/smb-256-128-4bpp.png differ
diff --git a/demos/kfest-2022/demo-2/build-image.bat b/demos/kfest-2022/demo-2/build-image.bat
new file mode 100644
index 0000000..2c195f1
--- /dev/null
+++ b/demos/kfest-2022/demo-2/build-image.bat
@@ -0,0 +1,17 @@
+echo off
+
+REM Copy all of the assets into the ProDOS image for emulator testing
+REM
+REM Pass the path of the Cadius tool as the first argument (%1)
+
+set CADIUS="%1"
+set IMAGE="..\\..\\..\\emu\\Target.2mg"
+set FOLDER="/GTEDEV/KFestDemo02"
+
+REM Cadius does not overwrite files, so clear the root folder first
+%CADIUS% DELETEFOLDER %IMAGE% %FOLDER%
+%CADIUS% CREATEFOLDER %IMAGE% %FOLDER%
+
+REM Now copy files and folders as needed
+%CADIUS% ADDFILE %IMAGE% %FOLDER% .\GTEDemo2
+%CADIUS% ADDFILE %IMAGE% %FOLDER% ..\..\..\src\Tool160
diff --git a/demos/kfest-2022/demo-2/package.json b/demos/kfest-2022/demo-2/package.json
new file mode 100644
index 0000000..206ab8a
--- /dev/null
+++ b/demos/kfest-2022/demo-2/package.json
@@ -0,0 +1,44 @@
+{
+ "name": "kfest-demo-2",
+ "version": "1.0.0",
+ "description": "",
+ "main": "index.js",
+ "config": {
+ "merlin32": "C:\\Programs\\IIgsXDev\\bin\\Merlin32-1.1.10.exe",
+ "cadius": "C:\\Programs\\IIgsXDev\\bin\\Cadius.exe",
+ "gsport": "C:\\Programs\\gsport\\gsport_0.31\\GSPort.exe",
+ "macros": "../../../macros",
+ "crossrunner": "C:\\Programs\\Crossrunner\\Crossrunner.exe",
+ "png2iigs": "../../../tools/png2iigs.js",
+ "tiled2iigs": "../../../tools/tiled2iigs.js"
+ },
+ "scripts": {
+ "test": "npm run build && npm run build:image && npm run gsport",
+ "gsport": "%npm_package_config_gsport%",
+ "debug": "%npm_package_config_crossrunner% GTETestSprites -Source GTETestSprites_S02_MAINSEG_Output.txt -Debug -CompatibilityLayer",
+ "build:all": "npm run build:tiles && npm run build:map && npm run build:tool && npm run build:sys16 && npm run build:image",
+ "build:map": "node %npm_package_config_tiled2iigs% ./assets/tiled/world_1-1.json --empty-tile 33 --no-gen-tiles --output-dir ./gen",
+ "build:map:masked": "node %npm_package_config_tiled2iigs% ./assets/tiled/world_1-1.json --force-masked --empty-tile 33 --no-gen-tiles --output-dir ./gen",
+ "build:tiles": "node %npm_package_config_png2iigs% ./assets/tilesets/smb-256-128-4bpp.png --max-tiles 360 --as-tile-data --transparent-color FF00FF --background-color 6B8CFF --verbose > ./gen/App.TileSet.s",
+ "build:sys16": "%npm_package_config_merlin32% -V %npm_package_config_macros% App.s",
+ "build": "npm run build:tool && npm run build:sys16",
+ "build:tool": "%npm_package_config_merlin32% -V %npm_package_config_macros% ../../../src/Master.s",
+ "build:image": "build-image.bat %npm_package_config_cadius%"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/lscharen/iigs-game-engine.git"
+ },
+ "author": "Lucas Scharenbroich",
+ "license": "Apache-2.0",
+ "bugs": {
+ "url": "https://github.com/lscharen/iigs-game-engine/issues"
+ },
+ "homepage": "https://github.com/lscharen/iigs-game-engine#readme",
+ "devDependencies": {
+ "pngjs": "^6.0.0",
+ "string-builder": "^0.1.8",
+ "watch": "latest",
+ "xml2json": "^0.12.0"
+ }
+}
diff --git a/demos/kfest-2022/demo-3/App.Main.s b/demos/kfest-2022/demo-3/App.Main.s
new file mode 100644
index 0000000..a26dacd
--- /dev/null
+++ b/demos/kfest-2022/demo-3/App.Main.s
@@ -0,0 +1,368 @@
+; Test driver to exercise graphics routines.
+
+ REL
+ DSK MAINSEG
+
+ use Locator.Macs
+ use Load.Macs
+ use Mem.Macs
+ use Misc.Macs
+ use Util.Macs
+ use EDS.GSOS.Macs
+ use GTE.Macs
+
+ mx %00
+
+tiledata EXT ; tileset buffer
+TileSetPalette EXT
+
+; Keycodes
+LEFT_ARROW equ $08
+RIGHT_ARROW equ $15
+UP_ARROW equ $0B
+DOWN_ARROW equ $0A
+
+; Dynamic Tile Animations. Add 4 for each offset
+;
+; Tile IDs = 128,129,130,131
+; 160,161,162,163
+; 192,193,194,195
+; 224,225,226,227
+;
+; Direct page space
+MyUserId equ 0
+BankLoad equ 2
+StartX equ 4
+StartY equ 6
+TileMapWidth equ 8
+TileMapHeight equ 10
+ScreenWidth equ 12
+ScreenHeight equ 14
+MaxGlobalX equ 16
+MaxGlobalY equ 18
+MaxBG0X equ 20
+MaxBG0Y equ 22
+OldOneSecondCounter equ 26
+appTmp0 equ 28
+appTmp1 equ 30
+appTmp2 equ 32
+
+ phk
+ plb
+
+ sta MyUserId ; GS/OS passes the memory manager user ID for the application into the program
+ tdc
+ sta MyDirectPage ; Keep a copy for the overlay callback
+
+ _MTStartUp ; GTE requires the miscellaneous toolset to be running
+
+ lda #ENGINE_MODE_DYN_TILES ; Engine in Fast Mode
+ jsr GTEStartUp ; Load and install the GTE User Tool
+
+; Initialize local variables
+
+ stz StartX
+ stz StartY
+ stz frameCount
+
+; Initialize the graphics screen playfield
+
+ pea #320
+ pea #200
+ _GTESetScreenMode
+
+; Load a tileset
+
+ pea #^tiledata
+ pea #tiledata
+ _GTELoadTileSet
+
+ pea $0000
+ pea #^TileSetPalette
+ pea #TileSetPalette
+ _GTESetPalette
+
+; Set up our level data
+
+ jsr BG0SetUp
+ jsr SetLimits
+
+ jsr InitOverlay ; Initialize the status bar
+ pha
+ _GTEGetSeconds
+ pla
+ sta OldOneSecondCounter
+ jsr UdtOverlay
+
+; Set up a very specific test. First, we draw a sprite into the sprite plane, and then
+; leave it alone. We are just testing the ability to merge sprite plane data into
+; the play field tiles.
+EvtLoop
+ pha
+ _GTEReadControl
+ pla
+
+ jsr HandleKeys ; Do the generic key handlers
+ bcs :do_more
+ brl :do_render
+
+:do_more
+ cmp #'d'
+ bne :not_d
+ lda StartX
+ cmp MaxBG0X
+ bcc *+5
+ brl :do_render
+ inc StartX
+ pei StartX
+ pei StartY
+ _GTESetBG0Origin
+ brl :do_render
+:not_d
+
+ cmp #'a'
+ bne :not_a
+ lda StartX
+ bne *+5
+ brl :do_render
+ dec StartX
+ pei StartX
+ pei StartY
+ _GTESetBG0Origin
+ brl :do_render
+:not_a
+
+ cmp #'s'
+ bne :not_s
+ lda StartY
+ cmp MaxBG0Y
+ bcs :do_render
+ inc StartY
+ pei StartX
+ pei StartY
+ _GTESetBG0Origin
+ bra :do_render
+:not_s
+
+ cmp #'w'
+ bne :not_w
+ lda StartY
+ beq :do_render
+ dec StartY
+ pei StartX
+ pei StartY
+ _GTESetBG0Origin
+ bra :do_render
+:not_w
+
+:do_render
+ jsr SetDynTiles
+
+ _GTERender
+
+; Update the performance counters
+
+ inc frameCount
+ pha
+ _GTEGetSeconds
+ pla
+ cmp OldOneSecondCounter
+ beq :noudt
+ sta OldOneSecondCounter
+ jsr UdtOverlay
+ stz frameCount
+:noudt
+ brl EvtLoop
+
+; Exit code
+Exit
+ _GTEShutDown
+Quit
+ _QuitGS qtRec
+
+ bcs Fatal
+Fatal brk $00
+
+qtRec adrl $0000
+ da $00
+
+; Color palette
+MyDirectPage ds 2
+
+; Pick the correct shift for each of the 16 background tiles over 32 horizontal positions
+
+SetDynTiles
+ lda StartX
+ and #$001F
+ asl
+ sta appTmp0
+ stz appTmp1
+ stz appTmp2
+
+ jsr setDynRow
+
+ lda appTmp1
+ clc
+ adc #4
+ sta appTmp1
+
+ lda appTmp2
+ clc
+ adc #32
+ sta appTmp2
+
+ jsr setDynRow
+
+ lda appTmp1
+ clc
+ adc #4
+ sta appTmp1
+
+ lda appTmp2
+ clc
+ adc #32
+ sta appTmp2
+
+ jsr setDynRow
+
+ lda appTmp1
+ clc
+ adc #4
+ sta appTmp1
+
+ lda appTmp2
+ clc
+ adc #32
+ sta appTmp2
+
+ jmp setDynRow
+
+setDynRow
+ ldx appTmp0
+ lda tile128,x
+ clc
+ adc appTmp2
+ inc
+ pha
+ lda appTmp1
+ clc
+ adc #0
+ pha
+ _GTECopyTileToDynamic
+
+ ldx appTmp0
+ lda tile129,x
+ clc
+ adc appTmp2
+ inc
+ pha
+ lda appTmp1
+ clc
+ adc #1
+ pha
+ _GTECopyTileToDynamic
+
+ ldx appTmp0
+ lda tile130,x
+ clc
+ adc appTmp2
+ inc
+ pha
+ lda appTmp1
+ clc
+ adc #2
+ pha
+ _GTECopyTileToDynamic
+
+ ldx appTmp0
+ lda tile131,x
+ clc
+ adc appTmp2
+ inc
+ pha
+ lda appTmp1
+ clc
+ adc #3
+ pha
+ _GTECopyTileToDynamic
+
+ rts
+
+tile128 dw 128,132,136,140,144,148,152,156
+tile131 dw 131,135,139,143,147,151,155,159
+tile130 dw 130,134,138,142,146,150,154,158
+tile129 dw 129,133,137,141,145,149,153,157
+ dw 128,132,136,140,144,148,152,156
+ dw 131,135,139,143,147,151,155,159
+ dw 130,134,138,142,146,150,154,158
+
+;tile129 dw 129,133,137,141,145,149,153,157
+; dw 128,132,136,140,144,148,152,156
+; dw 131,135,138,143,147,151,155,159
+; dw 130,134,138,142,146,150,154,158
+
+
+
+SetLimits
+ pha ; Allocate space for width (in tiles), height (in tiles), pointer
+ pha
+ pha
+ pha
+ _GTEGetBG0TileMapInfo
+ pla
+ sta TileMapWidth
+ pla
+ sta TileMapHeight
+ pla
+ pla ; discard the pointer
+
+ pha ; Allocate space for x, y, width, height
+ pha
+ pha
+ pha
+ _GTEGetScreenInfo
+ pla
+ pla ; Discard screen corner
+ pla
+ sta ScreenWidth
+ pla
+ sta ScreenHeight
+
+ lda TileMapWidth
+ asl
+ asl
+ sta MaxGlobalX
+ sec
+ sbc ScreenWidth
+ sta MaxBG0X
+
+ lda TileMapHeight
+ asl
+ asl
+ asl
+ sta MaxGlobalY
+ sec
+ sbc ScreenHeight
+ sta MaxBG0Y
+
+; Check if the current StartX and StartY are out of bounds
+ lda StartX
+ cmp MaxBG0X
+ bcc :x_ok
+ lda MaxBG0X
+:x_ok pha
+
+ lda StartY
+ cmp MaxBG0Y
+ bcc :y_ok
+ lda MaxBG0Y
+:y_ok pha
+ _GTESetBG0Origin
+
+ rts
+
+frameCount equ 24
+
+ PUT ../StartUp.s
+ PUT ../../shell/Overlay.s
+ PUT gen/App.TileMapBG0.s
diff --git a/demos/kfest-2022/demo-3/App.s b/demos/kfest-2022/demo-3/App.s
new file mode 100644
index 0000000..c6a6d62
--- /dev/null
+++ b/demos/kfest-2022/demo-3/App.s
@@ -0,0 +1,15 @@
+; KFest 2022: Demo #1
+
+ TYP $B3 ; S16 file
+ DSK GTEDemo3
+ XPL
+
+; Segment #1 -- Main execution block
+
+ ASM App.Main.s
+ SNA Main
+
+; Segment #2 -- Tileset
+
+ ASM gen\App.TileSet.s
+ SNA TSET
\ No newline at end of file
diff --git a/demos/kfest-2022/demo-3/assets/tiled/MetalStore.tsx b/demos/kfest-2022/demo-3/assets/tiled/MetalStore.tsx
new file mode 100644
index 0000000..6030838
--- /dev/null
+++ b/demos/kfest-2022/demo-3/assets/tiled/MetalStore.tsx
@@ -0,0 +1,84 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/demos/kfest-2022/demo-3/assets/tiled/level-1.json b/demos/kfest-2022/demo-3/assets/tiled/level-1.json
new file mode 100644
index 0000000..093b1fc
--- /dev/null
+++ b/demos/kfest-2022/demo-3/assets/tiled/level-1.json
@@ -0,0 +1,32 @@
+{ "compressionlevel":-1,
+ "height":30,
+ "infinite":false,
+ "layers":[
+ {
+ "data":[1073741925, 1073741926, 1073741927, 1073741928, 1073741925, 1073741926, 1073741927, 1073741928, 1073741929, 1073741930, 1073741931, 1073741932, 1073741869, 1073741870, 1073741871, 1073741872, 1073741869, 1073741870, 1073741871, 1073741872, 1073741929, 1073741930, 1073741931, 1073741932, 1073741925, 1073741926, 1073741927, 1073741928, 1073741925, 1073741926, 1073741927, 1073741928, 1073741929, 1073741930, 1073741931, 1073741932, 1073741925, 1073741926, 1073741927, 1073741928, 1073741925, 1073741926, 1073741927, 1073741928, 1073741929, 1073741930, 1073741931, 1073741932, 1073741869, 1073741870, 1073741871, 1073741872, 1073741869, 1073741870, 1073741871, 1073741872, 1073741929, 1073741930, 1073741931, 1073741932, 1073741925, 1073741926, 1073741927, 1073741928, 1073741925, 1073741926, 1073741927, 1073741928, 1073741929, 1073741930, 1073741931, 1073741932, 1073741925, 1073741926, 1073741927, 1073741928, 1073741925, 1073741926, 1073741927, 1073741928, 1073741929, 1073741930, 1073741931, 1073741932, 1073741925, 1073741926, 1073741927, 1073741928, 1073741869, 1073741870, 1073741871, 1073741872, 1073741929, 1073741930, 1073741931, 1073741932, 1073741925, 1073741926, 1073741927, 1073741928, 1073741925, 1073741926, 1073741927, 1073741928, 1073741929, 1073741930, 1073741931, 1073741932, 1073741925, 1073741926, 1073741927, 1073741928, 1073741929, 1073741930, 1073741931, 1073741932, 1073741925, 1073741926, 1073741927, 1073741928, 1073741925, 1073741926, 1073741927, 1073741928, 1073741925, 1073741926, 1073741927, 1073741928, 1073741929, 1073741930, 1073741931, 1073741932, 1073741925, 1073741926, 1073741927, 1073741928, 1073741925, 1073741926, 1073741927, 1073741928, 1073741925, 1073741926, 1073741927, 1073741928, 1073741869, 1073741870, 1073741871, 1073741872, 1073741869, 1073741870, 1073741871, 1073741872, 1073741929, 1073741930, 1073741931, 1073741932, 1073741869, 1073741870, 1073741871, 1073741872, 1073741893, 1073741894, 1073741895, 1073741896, 1073741893, 1073741894, 1073741895, 1073741896, 1073741897, 1073741898, 1073741899, 1073741900, 1073741837, 1073741838, 1073741839, 1073741840, 1073741837, 1073741838, 1073741839, 1073741840, 1073741897, 1073741898, 1073741899, 1073741900, 1073741893, 1073741894, 1073741895, 1073741896, 1073741893, 1073741894, 1073741895, 1073741896, 1073741897, 1073741898, 1073741899, 1073741900, 1073741893, 1073741894, 1073741895, 1073741896, 1073741893, 1073741894, 1073741895, 1073741896, 1073741897, 1073741898, 1073741899, 1073741900, 1073741837, 1073741838, 1073741839, 1073741840, 1073741837, 1073741838, 1073741839, 1073741840, 1073741897, 1073741898, 1073741899, 1073741900, 1073741893, 1073741894, 1073741895, 1073741896, 1073741893, 1073741894, 1073741895, 1073741896, 1073741897, 1073741898, 1073741899, 1073741900, 1073741893, 1073741894, 1073741895, 1073741896, 1073741893, 1073741894, 1073741895, 1073741896, 1073741897, 1073741898, 1073741899, 1073741900, 1073741893, 1073741894, 1073741895, 1073741896, 1073741837, 1073741838, 1073741839, 1073741840, 1073741897, 1073741898, 1073741899, 1073741900, 1073741893, 1073741894, 1073741895, 1073741896, 1073741893, 1073741894, 1073741895, 1073741896, 1073741897, 1073741898, 1073741899, 1073741900, 1073741893, 1073741894, 1073741895, 1073741896, 1073741897, 1073741898, 1073741899, 1073741900, 1073741893, 1073741894, 1073741895, 1073741896, 1073741893, 1073741894, 1073741895, 1073741896, 1073741893, 1073741894, 1073741895, 1073741896, 1073741897, 1073741898, 1073741899, 1073741900, 1073741893, 1073741894, 1073741895, 1073741896, 1073741893, 1073741894, 1073741895, 1073741896, 1073741893, 1073741894, 1073741895, 1073741896, 1073741837, 1073741838, 1073741839, 1073741840, 1073741837, 1073741838, 1073741839, 1073741840, 1073741897, 1073741898, 1073741899, 1073741900, 1073741837, 1073741838, 1073741839, 1073741840, 1073741869, 1073741870, 1073741871, 1073741872, 1073741869, 1073741870, 1073741871, 1073741872, 1073741929, 1073741930, 1073741931, 1073741932, 1073741925, 1073741926, 1073741927, 1073741928, 1073741925, 1073741926, 1073741927, 1073741928, 1073741929, 1073741930, 1073741931, 1073741932, 1073741861, 1073741862, 1073741863, 1073741864, 1073741861, 1073741862, 1073741863, 1073741864, 1073741865, 1073741866, 1073741867, 1073741868, 1073741861, 1073741862, 1073741863, 1073741864, 1073741861, 1073741862, 1073741863, 1073741864, 1073741865, 1073741866, 1073741867, 1073741868, 1073741925, 1073741926, 1073741927, 1073741928, 1073741925, 1073741926, 1073741927, 1073741928, 1073741929, 1073741930, 1073741931, 1073741932, 1073741869, 1073741870, 1073741871, 1073741872, 1073741869, 1073741870, 1073741871, 1073741872, 1073741865, 1073741866, 1073741867, 1073741868, 1073741861, 1073741862, 1073741863, 1073741864, 1073741861, 1073741862, 1073741863, 1073741864, 1073741865, 1073741866, 1073741867, 1073741868, 1073741861, 1073741862, 1073741863, 1073741864, 1073741925, 1073741926, 1073741927, 1073741928, 1073741929, 1073741930, 1073741931, 1073741932, 1073741861, 1073741862, 1073741863, 1073741864, 1073741861, 1073741862, 1073741863, 1073741864, 1073741865, 1073741866, 1073741867, 1073741868, 1073741861, 1073741862, 1073741863, 1073741864, 1073741865, 1073741866, 1073741867, 1073741868, 1073741861, 1073741862, 1073741863, 1073741864, 1073741869, 1073741870, 1073741871, 1073741872, 1073741869, 1073741870, 1073741871, 1073741872, 1073741929, 1073741930, 1073741931, 1073741932, 1073741869, 1073741870, 1073741871, 1073741872, 1073741869, 1073741870, 1073741871, 1073741872, 1073741869, 1073741870, 1073741871, 1073741872, 1073741925, 1073741926, 1073741927, 1073741928, 1073741925, 1073741926, 1073741927, 1073741928, 1073741929, 1073741930, 1073741931, 1073741932, 1073741925, 1073741926, 1073741927, 1073741928, 1073741837, 1073741838, 1073741839, 1073741840, 1073741837, 1073741838, 1073741839, 1073741840, 1073741897, 1073741898, 1073741899, 1073741900, 1073741893, 1073741894, 1073741895, 1073741896, 1073741893, 1073741894, 1073741895, 1073741896, 1073741897, 1073741898, 1073741899, 1073741900, 1073741829, 1073741830, 1073741831, 1073741832, 1073741829, 1073741830, 1073741831, 1073741832, 1073741833, 1073741834, 1073741835, 1073741836, 1073741829, 1073741830, 1073741831, 1073741832, 1073741829, 1073741830, 1073741831, 1073741832, 1073741833, 1073741834, 1073741835, 1073741836, 1073741893, 1073741894, 1073741895, 1073741896, 1073741893, 1073741894, 1073741895, 1073741896, 1073741897, 1073741898, 1073741899, 1073741900, 1073741837, 1073741838, 1073741839, 1073741840, 1073741837, 1073741838, 1073741839, 1073741840, 1073741833, 1073741834, 1073741835, 1073741836, 1073741829, 1073741830, 1073741831, 1073741832, 1073741829, 1073741830, 1073741831, 1073741832, 1073741833, 1073741834, 1073741835, 1073741836, 1073741829, 1073741830, 1073741831, 1073741832, 1073741893, 1073741894, 1073741895, 1073741896, 1073741897, 1073741898, 1073741899, 1073741900, 1073741829, 1073741830, 1073741831, 1073741832, 1073741829, 1073741830, 1073741831, 1073741832, 1073741833, 1073741834, 1073741835, 1073741836, 1073741829, 1073741830, 1073741831, 1073741832, 1073741833, 1073741834, 1073741835, 1073741836, 1073741829, 1073741830, 1073741831, 1073741832, 1073741837, 1073741838, 1073741839, 1073741840, 1073741837, 1073741838, 1073741839, 1073741840, 1073741897, 1073741898, 1073741899, 1073741900, 1073741837, 1073741838, 1073741839, 1073741840, 1073741837, 1073741838, 1073741839, 1073741840, 1073741837, 1073741838, 1073741839, 1073741840, 1073741893, 1073741894, 1073741895, 1073741896, 1073741893, 1073741894, 1073741895, 1073741896, 1073741897, 1073741898, 1073741899, 1073741900, 1073741893, 1073741894, 1073741895, 1073741896, 1073741925, 1073741926, 1073741927, 1073741928, 1073741925, 1073741926, 1073741927, 1073741928, 1073741929, 1073741930, 1073741931, 1073741932, 1073741861, 1073741862, 1073741863, 1073741864, 1073741861, 1073741862, 1073741863, 1073741864, 1073741865, 1073741866, 1073741867, 1073741868, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 1073741861, 1073741862, 1073741863, 1073741864, 1073741861, 1073741862, 1073741863, 1073741864, 1073741865, 1073741866, 1073741867, 1073741868, 1073741925, 1073741926, 1073741927, 1073741928, 1073741925, 1073741926, 1073741927, 1073741928, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 17, 18, 19, 20, 1073741861, 1073741862, 1073741863, 1073741864, 1073741865, 1073741866, 1073741867, 1073741868, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 193, 194, 195, 196, 109, 109, 109, 109, 109, 109, 109, 109, 1073741925, 1073741926, 1073741927, 1073741928, 1073741925, 1073741926, 1073741927, 1073741928, 1073741929, 1073741930, 1073741931, 1073741932, 1073741925, 1073741926, 1073741927, 1073741928, 1073741925, 1073741926, 1073741927, 1073741928, 1073741925, 1073741926, 1073741927, 1073741928, 1073741861, 1073741862, 1073741863, 1073741864, 1073741861, 1073741862, 1073741863, 1073741864, 1073741865, 1073741866, 1073741867, 1073741868, 1073741861, 1073741862, 1073741863, 1073741864, 1073741893, 1073741894, 1073741895, 1073741896, 1073741893, 1073741894, 1073741895, 1073741896, 1073741897, 1073741898, 1073741899, 1073741900, 1073741829, 1073741830, 1073741831, 1073741832, 1073741829, 1073741830, 1073741831, 1073741832, 1073741833, 1073741834, 1073741835, 1073741836, 53, 54, 55, 56, 53, 54, 55, 56, 53, 54, 77, 77, 53, 54, 55, 56, 53, 54, 55, 56, 53, 54, 77, 77, 1073741829, 1073741830, 1073741831, 1073741832, 1073741829, 1073741830, 1073741831, 1073741832, 1073741833, 1073741834, 1073741835, 1073741836, 1073741893, 1073741894, 1073741895, 1073741896, 1073741893, 1073741894, 1073741895, 1073741896, 53, 54, 77, 77, 53, 54, 55, 56, 53, 54, 55, 56, 53, 54, 77, 77, 49, 50, 51, 52, 1073741829, 1073741830, 1073741831, 1073741832, 1073741833, 1073741834, 1073741835, 1073741836, 53, 54, 55, 56, 53, 54, 55, 56, 53, 54, 77, 77, 225, 226, 227, 228, 77, 77, 55, 56, 53, 54, 55, 56, 1073741893, 1073741894, 1073741895, 1073741896, 1073741893, 1073741894, 1073741895, 1073741896, 1073741897, 1073741898, 1073741899, 1073741900, 1073741893, 1073741894, 1073741895, 1073741896, 1073741893, 1073741894, 1073741895, 1073741896, 1073741893, 1073741894, 1073741895, 1073741896, 1073741829, 1073741830, 1073741831, 1073741832, 1073741829, 1073741830, 1073741831, 1073741832, 1073741833, 1073741834, 1073741835, 1073741836, 1073741829, 1073741830, 1073741831, 1073741832, 1073741861, 1073741862, 1073741863, 1073741864, 1073741861, 1073741862, 1073741863, 1073741864, 1073741865, 1073741866, 1073741867, 1073741868, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 85, 86, 87, 88, 85, 86, 87, 88, 85, 86, 77, 77, 85, 86, 87, 88, 85, 86, 87, 88, 85, 86, 77, 77, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 1073741862, 1073741863, 1073741864, 1073741861, 1073741862, 1073741863, 1073741864, 85, 86, 77, 77, 85, 86, 87, 88, 85, 86, 87, 88, 85, 86, 77, 77, 81, 82, 83, 84, 109, 109, 109, 109, 109, 109, 109, 109, 85, 86, 87, 88, 85, 86, 87, 88, 85, 86, 77, 77, 129, 130, 131, 132, 77, 77, 87, 88, 85, 86, 87, 88, 1073741861, 1073741862, 1073741863, 1073741864, 1073741869, 1073741870, 1073741871, 1073741872, 1073741929, 1073741930, 1073741931, 1073741932, 1073741861, 1073741862, 1073741863, 1073741864, 1073741861, 1073741862, 1073741863, 1073741864, 1073741861, 1073741862, 1073741863, 1073741864, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 1073741829, 1073741830, 1073741831, 1073741832, 1073741829, 1073741830, 1073741831, 1073741832, 1073741833, 1073741834, 1073741835, 1073741836, 117, 118, 119, 120, 117, 118, 119, 120, 117, 118, 77, 77, 117, 118, 119, 120, 117, 118, 119, 120, 117, 118, 77, 77, 117, 118, 119, 120, 117, 118, 119, 120, 117, 118, 77, 77, 117, 118, 119, 120, 117, 118, 119, 120, 117, 118, 77, 77, 1073741829, 1073741830, 1073741831, 1073741832, 1073741829, 1073741830, 1073741831, 1073741832, 117, 118, 77, 77, 117, 118, 119, 120, 117, 118, 119, 120, 117, 118, 77, 77, 113, 114, 115, 116, 117, 118, 119, 120, 117, 118, 77, 77, 117, 118, 119, 120, 117, 118, 119, 120, 117, 118, 77, 77, 161, 162, 163, 164, 77, 77, 119, 120, 117, 118, 119, 120, 1073741829, 1073741830, 1073741831, 1073741832, 1073741837, 1073741838, 1073741839, 1073741840, 1073741897, 1073741898, 1073741899, 1073741900, 1073741829, 1073741830, 1073741831, 1073741832, 1073741829, 1073741830, 1073741831, 1073741832, 1073741829, 1073741830, 1073741831, 1073741832, 117, 118, 119, 120, 117, 118, 119, 120, 117, 118, 77, 77, 117, 118, 119, 120, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 21, 22, 23, 24, 21, 22, 23, 24, 21, 22, 77, 77, 21, 22, 23, 24, 21, 22, 23, 24, 21, 22, 77, 77, 21, 22, 23, 24, 21, 22, 23, 24, 21, 22, 77, 77, 21, 22, 23, 24, 21, 22, 23, 24, 21, 22, 77, 77, 109, 109, 109, 109, 109, 109, 109, 109, 21, 22, 77, 77, 21, 22, 23, 24, 21, 22, 23, 24, 21, 22, 77, 77, 109, 109, 109, 109, 21, 22, 23, 24, 21, 22, 77, 77, 21, 22, 23, 24, 21, 22, 23, 24, 21, 22, 77, 77, 193, 194, 195, 196, 77, 77, 23, 24, 21, 22, 23, 24, 17, 18, 19, 20, 1073741925, 1073741926, 1073741927, 1073741928, 1073741929, 1073741930, 1073741931, 1073741932, 17, 18, 19, 20, 109, 109, 109, 109, 109, 109, 109, 109, 21, 22, 23, 24, 21, 22, 23, 24, 21, 22, 77, 77, 21, 22, 23, 24, 53, 54, 55, 56, 53, 54, 55, 56, 53, 54, 77, 77, 53, 54, 55, 56, 53, 54, 55, 56, 53, 54, 77, 77, 53, 54, 55, 56, 53, 54, 55, 56, 53, 54, 77, 77, 53, 54, 55, 56, 53, 54, 55, 56, 53, 54, 77, 77, 53, 54, 55, 56, 53, 54, 55, 56, 53, 54, 77, 77, 53, 54, 55, 56, 53, 54, 55, 56, 53, 54, 77, 77, 53, 54, 55, 56, 53, 54, 55, 56, 53, 54, 77, 77, 53, 54, 55, 56, 53, 54, 55, 56, 53, 54, 77, 77, 53, 54, 55, 56, 53, 54, 55, 56, 53, 54, 77, 77, 225, 226, 227, 228, 77, 77, 55, 56, 53, 54, 55, 56, 49, 50, 51, 52, 1073741893, 1073741894, 1073741895, 1073741896, 1073741897, 1073741898, 1073741899, 1073741900, 49, 50, 51, 52, 53, 54, 55, 56, 53, 54, 55, 56, 53, 54, 55, 56, 53, 54, 55, 56, 53, 54, 77, 77, 53, 54, 55, 56, 85, 86, 87, 88, 85, 86, 87, 88, 85, 86, 77, 77, 85, 86, 87, 88, 85, 86, 87, 88, 85, 86, 77, 77, 85, 86, 87, 88, 85, 86, 87, 88, 85, 86, 77, 77, 85, 86, 87, 88, 85, 86, 87, 88, 85, 86, 77, 77, 85, 86, 87, 88, 85, 86, 87, 88, 85, 86, 77, 77, 85, 86, 87, 88, 85, 86, 87, 88, 85, 86, 77, 77, 85, 86, 87, 88, 85, 86, 87, 88, 85, 86, 77, 77, 85, 86, 87, 88, 85, 86, 87, 88, 85, 86, 77, 77, 85, 86, 87, 88, 85, 86, 87, 88, 85, 86, 77, 77, 129, 130, 131, 132, 77, 77, 87, 88, 85, 86, 87, 88, 81, 82, 83, 84, 1073741861, 1073741862, 1073741863, 1073741864, 1073741865, 1073741866, 1073741867, 1073741868, 81, 82, 83, 84, 85, 86, 87, 88, 85, 86, 87, 88, 85, 86, 87, 88, 85, 86, 87, 88, 85, 86, 77, 77, 85, 86, 87, 88, 117, 118, 119, 120, 117, 118, 119, 120, 117, 118, 77, 77, 117, 118, 119, 120, 117, 118, 119, 120, 117, 118, 77, 77, 117, 118, 119, 120, 117, 118, 119, 120, 117, 118, 77, 77, 117, 118, 119, 120, 117, 118, 119, 120, 117, 118, 77, 77, 117, 118, 119, 120, 117, 118, 119, 120, 117, 118, 77, 77, 117, 118, 119, 120, 117, 118, 119, 120, 117, 118, 77, 77, 117, 118, 119, 120, 117, 118, 119, 120, 117, 118, 77, 77, 117, 118, 119, 120, 117, 118, 119, 120, 117, 118, 77, 77, 117, 118, 119, 120, 117, 118, 119, 120, 117, 118, 77, 77, 161, 162, 163, 164, 77, 77, 119, 120, 117, 118, 119, 120, 113, 114, 115, 116, 1073741829, 1073741830, 1073741831, 1073741832, 1073741833, 1073741834, 1073741835, 1073741836, 113, 114, 115, 116, 117, 118, 119, 120, 117, 118, 119, 120, 117, 118, 119, 120, 117, 118, 119, 120, 117, 118, 77, 77, 117, 118, 119, 120, 21, 22, 23, 24, 21, 22, 23, 24, 21, 22, 77, 77, 21, 22, 23, 24, 21, 22, 23, 24, 21, 22, 77, 77, 21, 22, 23, 24, 21, 22, 23, 24, 21, 22, 77, 77, 21, 22, 23, 24, 21, 22, 23, 24, 21, 22, 77, 77, 21, 22, 23, 24, 21, 22, 23, 24, 21, 22, 77, 77, 21, 22, 23, 24, 21, 22, 23, 24, 21, 22, 77, 77, 21, 22, 23, 24, 21, 22, 23, 24, 21, 22, 77, 77, 21, 22, 23, 24, 21, 22, 23, 24, 21, 22, 77, 77, 21, 22, 23, 24, 21, 22, 23, 24, 21, 22, 77, 77, 193, 194, 195, 196, 77, 77, 23, 24, 21, 22, 23, 24, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 21, 22, 23, 24, 21, 22, 23, 24, 21, 22, 23, 24, 21, 22, 23, 24, 17, 18, 19, 20, 17, 18, 19, 20, 53, 54, 55, 56, 53, 54, 55, 56, 53, 54, 77, 77, 53, 54, 55, 56, 53, 54, 55, 56, 53, 54, 77, 77, 53, 54, 55, 56, 53, 54, 55, 56, 53, 54, 77, 77, 53, 54, 55, 56, 53, 54, 55, 56, 53, 54, 77, 77, 53, 54, 55, 56, 53, 54, 55, 56, 53, 54, 77, 77, 53, 54, 55, 56, 53, 54, 55, 56, 53, 54, 77, 77, 53, 54, 55, 56, 53, 54, 55, 56, 53, 54, 77, 77, 53, 54, 55, 56, 53, 54, 55, 56, 53, 54, 77, 77, 53, 54, 55, 56, 53, 54, 55, 56, 53, 54, 77, 77, 225, 226, 227, 228, 77, 77, 55, 56, 53, 54, 55, 56, 53, 54, 55, 56, 53, 54, 55, 56, 53, 54, 55, 56, 53, 54, 55, 56, 53, 54, 55, 56, 53, 54, 55, 56, 53, 54, 55, 56, 53, 54, 55, 56, 49, 50, 51, 52, 49, 50, 51, 52, 85, 86, 87, 88, 85, 86, 87, 88, 85, 86, 77, 77, 85, 86, 87, 88, 85, 86, 87, 88, 85, 86, 77, 77, 85, 86, 87, 88, 85, 86, 87, 88, 85, 86, 77, 77, 85, 86, 87, 88, 85, 86, 87, 88, 85, 86, 77, 77, 85, 86, 87, 88, 85, 86, 87, 88, 85, 86, 77, 77, 85, 86, 87, 88, 85, 86, 87, 88, 85, 86, 77, 77, 85, 86, 87, 88, 85, 86, 87, 88, 85, 86, 77, 77, 85, 86, 87, 88, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 85, 86, 77, 77, 129, 130, 131, 132, 77, 77, 87, 88, 85, 86, 87, 88, 85, 86, 87, 88, 85, 86, 87, 88, 85, 86, 87, 88, 85, 86, 87, 88, 85, 86, 87, 88, 85, 86, 87, 88, 85, 86, 87, 88, 85, 86, 87, 88, 81, 82, 83, 84, 81, 82, 83, 84, 117, 118, 119, 120, 117, 118, 119, 120, 117, 118, 77, 77, 117, 118, 119, 120, 117, 118, 119, 120, 117, 118, 77, 77, 117, 118, 119, 120, 117, 118, 119, 120, 117, 118, 77, 77, 117, 118, 119, 120, 117, 118, 119, 120, 117, 118, 77, 77, 117, 118, 119, 120, 117, 118, 119, 120, 117, 118, 77, 77, 117, 118, 119, 120, 117, 118, 119, 120, 117, 118, 77, 77, 117, 118, 119, 120, 117, 118, 119, 120, 117, 118, 77, 77, 117, 118, 119, 120, 33, 34, 35, 36, 33, 34, 35, 36, 33, 34, 35, 36, 33, 34, 35, 36, 117, 118, 77, 77, 161, 162, 163, 164, 77, 77, 119, 120, 117, 118, 119, 120, 117, 118, 119, 120, 117, 118, 119, 120, 117, 118, 119, 120, 117, 118, 119, 120, 117, 118, 119, 120, 117, 118, 119, 120, 117, 118, 119, 120, 117, 118, 119, 120, 113, 114, 115, 116, 113, 114, 115, 116, 21, 22, 23, 24, 21, 22, 23, 24, 21, 22, 77, 77, 21, 22, 23, 24, 21, 22, 23, 24, 21, 22, 77, 77, 21, 22, 23, 24, 21, 22, 23, 24, 21, 22, 77, 77, 21, 22, 23, 24, 21, 22, 23, 24, 21, 22, 77, 77, 21, 22, 23, 24, 21, 22, 23, 24, 21, 22, 77, 77, 21, 22, 23, 24, 21, 22, 23, 24, 21, 22, 77, 77, 21, 22, 23, 24, 21, 22, 23, 24, 21, 22, 77, 77, 21, 22, 23, 24, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 21, 22, 77, 77, 193, 194, 195, 196, 77, 77, 23, 24, 21, 22, 23, 24, 21, 22, 23, 24, 21, 22, 23, 24, 21, 22, 23, 24, 21, 22, 23, 24, 21, 22, 23, 24, 21, 22, 23, 24, 21, 22, 23, 24, 21, 22, 23, 24, 109, 109, 109, 109, 109, 109, 109, 109, 53, 54, 55, 56, 53, 54, 55, 56, 53, 54, 77, 77, 53, 54, 55, 56, 53, 54, 55, 56, 53, 54, 77, 77, 53, 54, 55, 56, 53, 54, 55, 56, 53, 54, 77, 77, 53, 54, 55, 56, 53, 54, 55, 56, 53, 54, 77, 77, 53, 54, 55, 56, 53, 54, 55, 56, 53, 54, 77, 77, 53, 54, 55, 56, 53, 54, 55, 56, 53, 54, 77, 77, 53, 54, 55, 56, 53, 54, 55, 56, 53, 54, 77, 77, 53, 54, 55, 56, 53, 54, 55, 56, 53, 54, 77, 77, 53, 54, 55, 56, 53, 54, 55, 56, 53, 54, 77, 77, 225, 226, 227, 228, 77, 77, 55, 56, 53, 54, 55, 56, 53, 54, 55, 56, 53, 54, 55, 56, 53, 54, 55, 56, 53, 54, 55, 56, 53, 54, 55, 56, 53, 54, 55, 56, 53, 54, 55, 56, 53, 54, 55, 56, 53, 54, 77, 77, 53, 54, 55, 56, 85, 86, 87, 88, 85, 86, 87, 88, 85, 86, 77, 77, 85, 86, 87, 88, 85, 86, 87, 88, 85, 86, 77, 77, 85, 86, 87, 88, 85, 86, 87, 88, 85, 86, 77, 77, 85, 86, 87, 88, 85, 86, 87, 88, 85, 86, 77, 77, 5, 6, 7, 8, 5, 6, 7, 8, 9, 10, 11, 12, 85, 86, 87, 88, 85, 86, 87, 88, 85, 86, 77, 77, 85, 86, 87, 88, 85, 86, 87, 88, 85, 86, 77, 77, 85, 86, 87, 88, 85, 86, 87, 88, 85, 86, 77, 77, 85, 86, 87, 88, 85, 86, 87, 88, 85, 86, 77, 77, 129, 130, 131, 132, 9, 10, 11, 12, 5, 6, 7, 8, 5, 6, 7, 8, 85, 86, 87, 88, 85, 86, 87, 88, 85, 86, 87, 88, 85, 86, 87, 88, 85, 86, 87, 88, 85, 86, 87, 88, 85, 86, 87, 88, 85, 86, 77, 77, 85, 86, 87, 88, 117, 118, 119, 120, 117, 118, 119, 120, 117, 118, 77, 77, 117, 118, 119, 120, 117, 118, 119, 120, 117, 118, 77, 77, 117, 118, 119, 120, 117, 118, 119, 120, 117, 118, 77, 77, 117, 118, 119, 120, 117, 118, 119, 120, 117, 118, 77, 77, 37, 38, 39, 40, 37, 38, 39, 40, 41, 42, 43, 44, 117, 118, 119, 120, 117, 118, 119, 120, 117, 118, 77, 77, 117, 118, 119, 120, 117, 118, 119, 120, 117, 118, 77, 77, 117, 118, 119, 120, 117, 118, 119, 120, 117, 118, 77, 77, 117, 118, 119, 120, 117, 118, 119, 120, 117, 118, 77, 77, 161, 162, 163, 164, 41, 42, 43, 44, 37, 38, 39, 40, 37, 38, 39, 40, 117, 118, 119, 120, 117, 118, 119, 120, 117, 118, 119, 120, 117, 118, 119, 120, 117, 118, 119, 120, 117, 118, 119, 120, 117, 118, 119, 120, 117, 118, 77, 77, 117, 118, 119, 120, 21, 22, 23, 24, 21, 22, 23, 24, 21, 22, 77, 77, 21, 22, 23, 24, 21, 22, 23, 24, 21, 22, 77, 77, 21, 22, 23, 24, 21, 22, 23, 24, 21, 22, 77, 77, 21, 22, 23, 24, 17, 18, 19, 20, 9, 10, 11, 12, 69, 70, 71, 72, 69, 70, 71, 72, 73, 74, 75, 76, 5, 6, 7, 8, 21, 22, 23, 24, 21, 22, 77, 77, 21, 22, 23, 24, 21, 22, 23, 24, 21, 22, 77, 77, 21, 22, 23, 24, 21, 22, 23, 24, 21, 22, 77, 77, 21, 22, 23, 24, 21, 22, 23, 24, 21, 22, 77, 77, 193, 194, 195, 196, 73, 74, 75, 76, 69, 70, 71, 72, 69, 70, 71, 72, 21, 22, 23, 24, 21, 22, 23, 24, 21, 22, 23, 24, 21, 22, 23, 24, 21, 22, 23, 24, 21, 22, 23, 24, 21, 22, 23, 24, 21, 22, 77, 77, 21, 22, 23, 24, 53, 54, 55, 56, 53, 54, 55, 56, 53, 54, 77, 77, 53, 54, 55, 56, 53, 54, 55, 56, 53, 54, 77, 77, 53, 54, 55, 56, 53, 54, 55, 56, 53, 54, 77, 77, 53, 54, 55, 56, 49, 50, 51, 52, 41, 42, 43, 44, 101, 102, 103, 104, 101, 102, 103, 104, 105, 106, 107, 108, 37, 38, 39, 40, 53, 54, 55, 56, 53, 54, 77, 77, 53, 54, 55, 56, 53, 54, 55, 56, 53, 54, 77, 77, 53, 54, 55, 56, 53, 54, 55, 56, 53, 54, 77, 77, 53, 54, 55, 56, 53, 54, 55, 56, 53, 54, 77, 77, 225, 226, 227, 228, 105, 106, 107, 108, 101, 102, 103, 104, 101, 102, 103, 104, 53, 54, 55, 56, 53, 54, 55, 56, 53, 54, 55, 56, 53, 54, 55, 56, 53, 54, 55, 56, 53, 54, 55, 56, 53, 54, 55, 56, 53, 54, 77, 77, 53, 54, 55, 56, 5, 6, 7, 8, 5, 6, 7, 8, 9, 10, 11, 12, 5, 6, 7, 8, 5, 6, 7, 8, 9, 10, 11, 12, 85, 86, 87, 88, 85, 86, 87, 88, 85, 86, 77, 77, 85, 86, 87, 88, 81, 82, 83, 84, 73, 74, 75, 76, 13, 14, 15, 16, 13, 14, 15, 16, 73, 74, 75, 76, 69, 70, 71, 72, 5, 6, 7, 8, 9, 10, 11, 12, 5, 6, 7, 8, 85, 86, 87, 88, 85, 86, 77, 77, 85, 86, 87, 88, 85, 86, 87, 88, 9, 10, 11, 12, 5, 6, 7, 8, 5, 6, 7, 8, 9, 10, 11, 12, 5, 6, 7, 8, 73, 74, 75, 76, 13, 14, 15, 16, 13, 14, 15, 16, 5, 6, 7, 8, 9, 10, 11, 12, 5, 6, 7, 8, 5, 6, 7, 8, 85, 86, 87, 88, 85, 86, 87, 88, 85, 86, 87, 88, 85, 86, 77, 77, 85, 86, 87, 88, 37, 38, 39, 40, 37, 38, 39, 40, 41, 42, 43, 44, 37, 38, 39, 40, 37, 38, 39, 40, 41, 42, 43, 44, 117, 118, 119, 120, 117, 118, 119, 120, 117, 118, 77, 77, 117, 118, 119, 120, 113, 114, 115, 116, 105, 106, 107, 108, 45, 46, 47, 48, 45, 46, 47, 48, 105, 106, 107, 108, 101, 102, 103, 104, 37, 38, 39, 40, 41, 42, 43, 44, 37, 38, 39, 40, 117, 118, 119, 120, 117, 118, 77, 77, 117, 118, 119, 120, 117, 118, 119, 120, 41, 42, 43, 44, 37, 38, 39, 40, 37, 38, 39, 40, 41, 42, 43, 44, 37, 38, 39, 40, 105, 106, 107, 108, 45, 46, 47, 48, 45, 46, 47, 48, 37, 38, 39, 40, 41, 42, 43, 44, 37, 38, 39, 40, 37, 38, 39, 40, 117, 118, 119, 120, 117, 118, 119, 120, 117, 118, 119, 120, 117, 118, 77, 77, 117, 118, 119, 120, 69, 70, 71, 72, 69, 70, 71, 72, 73, 74, 75, 76, 69, 70, 71, 72, 69, 70, 71, 72, 73, 74, 75, 76, 5, 6, 7, 8, 5, 6, 7, 8, 9, 10, 11, 12, 5, 6, 7, 8, 5, 6, 7, 8, 73, 74, 75, 76, 69, 70, 71, 72, 69, 70, 71, 72, 73, 74, 75, 76, 13, 14, 15, 16, 69, 70, 71, 72, 73, 74, 75, 76, 69, 70, 71, 72, 21, 22, 23, 24, 21, 22, 77, 77, 21, 22, 23, 24, 21, 22, 23, 24, 73, 74, 75, 76, 69, 70, 71, 72, 69, 70, 71, 72, 73, 74, 75, 76, 69, 70, 71, 72, 73, 74, 75, 76, 69, 70, 71, 72, 69, 70, 71, 72, 69, 70, 71, 72, 73, 74, 75, 76, 69, 70, 71, 72, 69, 70, 71, 72, 21, 22, 23, 24, 21, 22, 23, 24, 21, 22, 23, 24, 9, 10, 11, 12, 5, 6, 7, 8, 101, 102, 103, 104, 101, 102, 103, 104, 105, 106, 107, 108, 101, 102, 103, 104, 101, 102, 103, 104, 105, 106, 107, 108, 37, 38, 39, 40, 37, 38, 39, 40, 41, 42, 43, 44, 37, 38, 39, 40, 37, 38, 39, 40, 105, 106, 107, 108, 101, 102, 103, 104, 101, 102, 103, 104, 105, 106, 107, 108, 45, 46, 47, 48, 101, 102, 103, 104, 105, 106, 107, 108, 101, 102, 103, 104, 53, 54, 55, 56, 53, 54, 77, 77, 53, 54, 55, 56, 53, 54, 55, 56, 105, 106, 107, 108, 101, 102, 103, 104, 101, 102, 103, 104, 105, 106, 107, 108, 101, 102, 103, 104, 105, 106, 107, 108, 101, 102, 103, 104, 101, 102, 103, 104, 101, 102, 103, 104, 105, 106, 107, 108, 101, 102, 103, 104, 101, 102, 103, 104, 53, 54, 55, 56, 53, 54, 55, 56, 53, 54, 55, 56, 41, 42, 43, 44, 37, 38, 39, 40, 13, 14, 15, 16, 13, 14, 15, 16, 73, 74, 75, 76, 13, 14, 15, 16, 13, 14, 15, 16, 73, 74, 75, 76, 69, 70, 71, 72, 69, 70, 71, 72, 73, 74, 75, 76, 69, 70, 71, 72, 69, 70, 71, 72, 73, 74, 75, 76, 13, 14, 15, 16, 13, 14, 15, 16, 73, 74, 75, 76, 69, 70, 71, 72, 13, 14, 15, 16, 73, 74, 75, 76, 13, 14, 15, 16, 5, 6, 7, 8, 9, 10, 11, 12, 5, 6, 7, 8, 5, 6, 7, 8, 73, 74, 75, 76, 13, 14, 15, 16, 13, 14, 15, 16, 73, 74, 75, 76, 13, 14, 15, 16, 73, 74, 75, 76, 13, 14, 15, 16, 13, 14, 15, 16, 13, 14, 15, 16, 73, 74, 75, 76, 13, 14, 15, 16, 13, 14, 15, 16, 5, 6, 7, 8, 5, 6, 7, 8, 5, 6, 7, 8, 73, 74, 75, 76, 69, 70, 71, 72, 45, 46, 47, 48, 45, 46, 47, 48, 105, 106, 107, 108, 45, 46, 47, 48, 45, 46, 47, 48, 105, 106, 107, 108, 101, 102, 103, 104, 101, 102, 103, 104, 105, 106, 107, 108, 101, 102, 103, 104, 101, 102, 103, 104, 105, 106, 107, 108, 45, 46, 47, 48, 45, 46, 47, 48, 105, 106, 107, 108, 101, 102, 103, 104, 45, 46, 47, 48, 105, 106, 107, 108, 45, 46, 47, 48, 37, 38, 39, 40, 41, 42, 43, 44, 37, 38, 39, 40, 37, 38, 39, 40, 105, 106, 107, 108, 45, 46, 47, 48, 45, 46, 47, 48, 105, 106, 107, 108, 45, 46, 47, 48, 105, 106, 107, 108, 45, 46, 47, 48, 45, 46, 47, 48, 45, 46, 47, 48, 105, 106, 107, 108, 45, 46, 47, 48, 45, 46, 47, 48, 37, 38, 39, 40, 37, 38, 39, 40, 37, 38, 39, 40, 105, 106, 107, 108, 101, 102, 103, 104, 69, 70, 71, 72, 69, 70, 71, 72, 73, 74, 75, 76, 69, 70, 71, 72, 69, 70, 71, 72, 73, 74, 75, 76, 13, 14, 15, 16, 13, 14, 15, 16, 73, 74, 75, 76, 13, 14, 15, 16, 13, 14, 15, 16, 73, 74, 75, 76, 69, 70, 71, 72, 69, 70, 71, 72, 73, 74, 75, 76, 13, 14, 15, 16, 69, 70, 71, 72, 73, 74, 75, 76, 69, 70, 71, 72, 69, 70, 71, 72, 73, 74, 75, 76, 69, 70, 71, 72, 69, 70, 71, 72, 73, 74, 75, 76, 69, 70, 71, 72, 69, 70, 71, 72, 73, 74, 75, 76, 69, 70, 71, 72, 73, 74, 75, 76, 69, 70, 71, 72, 69, 70, 71, 72, 69, 70, 71, 72, 73, 74, 75, 76, 69, 70, 71, 72, 69, 70, 71, 72, 69, 70, 71, 72, 69, 70, 71, 72, 69, 70, 71, 72, 73, 74, 75, 76, 13, 14, 15, 16, 101, 102, 103, 104, 101, 102, 103, 104, 105, 106, 107, 108, 101, 102, 103, 104, 101, 102, 103, 104, 105, 106, 107, 108, 45, 46, 47, 48, 45, 46, 47, 48, 105, 106, 107, 108, 45, 46, 47, 48, 45, 46, 47, 48, 105, 106, 107, 108, 101, 102, 103, 104, 101, 102, 103, 104, 105, 106, 107, 108, 45, 46, 47, 48, 101, 102, 103, 104, 105, 106, 107, 108, 101, 102, 103, 104, 101, 102, 103, 104, 105, 106, 107, 108, 101, 102, 103, 104, 101, 102, 103, 104, 105, 106, 107, 108, 101, 102, 103, 104, 101, 102, 103, 104, 105, 106, 107, 108, 101, 102, 103, 104, 105, 106, 107, 108, 101, 102, 103, 104, 101, 102, 103, 104, 101, 102, 103, 104, 105, 106, 107, 108, 101, 102, 103, 104, 101, 102, 103, 104, 101, 102, 103, 104, 101, 102, 103, 104, 101, 102, 103, 104, 105, 106, 107, 108, 45, 46, 47, 48],
+ "height":30,
+ "id":1,
+ "name":"App.TileMapBG0",
+ "opacity":1,
+ "type":"tilelayer",
+ "visible":true,
+ "width":160,
+ "x":0,
+ "y":0
+ }],
+ "nextlayerid":2,
+ "nextobjectid":1,
+ "orientation":"orthogonal",
+ "renderorder":"right-down",
+ "tiledversion":"1.7.2",
+ "tileheight":8,
+ "tilesets":[
+ {
+ "firstgid":1,
+ "source":"MetalStore.tsx"
+ }],
+ "tilewidth":8,
+ "type":"map",
+ "version":"1.6",
+ "width":160
+}
\ No newline at end of file
diff --git a/demos/kfest-2022/demo-3/assets/tiled/level-1.tmx b/demos/kfest-2022/demo-3/assets/tiled/level-1.tmx
new file mode 100644
index 0000000..db2ca2c
--- /dev/null
+++ b/demos/kfest-2022/demo-3/assets/tiled/level-1.tmx
@@ -0,0 +1,41 @@
+
+
diff --git a/demos/kfest-2022/demo-3/assets/tilesets/tile-sheet.png b/demos/kfest-2022/demo-3/assets/tilesets/tile-sheet.png
new file mode 100644
index 0000000..dcab087
Binary files /dev/null and b/demos/kfest-2022/demo-3/assets/tilesets/tile-sheet.png differ
diff --git a/demos/kfest-2022/demo-3/build-image.bat b/demos/kfest-2022/demo-3/build-image.bat
new file mode 100644
index 0000000..45da371
--- /dev/null
+++ b/demos/kfest-2022/demo-3/build-image.bat
@@ -0,0 +1,17 @@
+echo off
+
+REM Copy all of the assets into the ProDOS image for emulator testing
+REM
+REM Pass the path of the Cadius tool as the first argument (%1)
+
+set CADIUS="%1"
+set IMAGE="..\\..\\..\\emu\\Target.2mg"
+set FOLDER="/GTEDEV/KFestDemo03"
+
+REM Cadius does not overwrite files, so clear the root folder first
+%CADIUS% DELETEFOLDER %IMAGE% %FOLDER%
+%CADIUS% CREATEFOLDER %IMAGE% %FOLDER%
+
+REM Now copy files and folders as needed
+%CADIUS% ADDFILE %IMAGE% %FOLDER% .\GTEDemo3
+%CADIUS% ADDFILE %IMAGE% %FOLDER% ..\..\..\src\Tool160
diff --git a/demos/kfest-2022/demo-3/package.json b/demos/kfest-2022/demo-3/package.json
new file mode 100644
index 0000000..72ed8d4
--- /dev/null
+++ b/demos/kfest-2022/demo-3/package.json
@@ -0,0 +1,43 @@
+{
+ "name": "kfest-demo-3",
+ "version": "1.0.0",
+ "description": "",
+ "main": "index.js",
+ "config": {
+ "merlin32": "C:\\Programs\\IIgsXDev\\bin\\Merlin32-1.1.10.exe",
+ "cadius": "C:\\Programs\\IIgsXDev\\bin\\Cadius.exe",
+ "gsport": "C:\\Programs\\gsport\\gsport_0.31\\GSPort.exe",
+ "macros": "../../../macros",
+ "crossrunner": "C:\\Programs\\Crossrunner\\Crossrunner.exe",
+ "png2iigs": "../../../tools/png2iigs.js",
+ "tiled2iigs": "../../../tools/tiled2iigs.js"
+ },
+ "scripts": {
+ "test": "npm run build && npm run build:image && npm run gsport",
+ "gsport": "%npm_package_config_gsport%",
+ "debug": "%npm_package_config_crossrunner% GTETestSprites -Source GTETestSprites_S02_MAINSEG_Output.txt -Debug -CompatibilityLayer",
+ "build:all": "npm run build:tiles && npm run build:map && npm run build:tool && npm run build:sys16 && npm run build:image",
+ "build:map": "node %npm_package_config_tiled2iigs% ./assets/tiled/level-1.json --no-gen-tiles --output-dir ./gen",
+ "build:tiles": "node %npm_package_config_png2iigs% ./assets/tilesets/tile-sheet.png --max-tiles 360 --as-tile-data --verbose > ./gen/App.TileSet.s",
+ "build:sys16": "%npm_package_config_merlin32% -V %npm_package_config_macros% App.s",
+ "build": "npm run build:tool && npm run build:sys16",
+ "build:tool": "%npm_package_config_merlin32% -V %npm_package_config_macros% ../../../src/Master.s",
+ "build:image": "build-image.bat %npm_package_config_cadius%"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/lscharen/iigs-game-engine.git"
+ },
+ "author": "Lucas Scharenbroich",
+ "license": "Apache-2.0",
+ "bugs": {
+ "url": "https://github.com/lscharen/iigs-game-engine/issues"
+ },
+ "homepage": "https://github.com/lscharen/iigs-game-engine#readme",
+ "devDependencies": {
+ "pngjs": "^6.0.0",
+ "string-builder": "^0.1.8",
+ "watch": "latest",
+ "xml2json": "^0.12.0"
+ }
+}
diff --git a/tools/tiled2iigs.js b/tools/tiled2iigs.js
index 393d43d..3a63e76 100644
--- a/tools/tiled2iigs.js
+++ b/tools/tiled2iigs.js
@@ -99,16 +99,16 @@ function writeTileAnimations(filename, animations) {
// First step is some initialization code that copies the first animated
// tile data into the dynamic tile space
const initLabel = 'TileAnimInit';
- init.appendLine(`${initLabel} ENT`);
+ init.appendLine(`${initLabel}`);
init.appendLine();
for (const animation of animations) {
// Get the first tile of the animation
const firstTileId = animation.frames[0].tileId;
// Create code to copy it into the dynamic tile index location
- init.appendLine(' ldx #' + firstTileId);
- init.appendLine(' ldy #' + animation.dynTileId);
- init.appendLine(' jsl CopyTileToDyn');
+ init.appendLine(' pea ' + firstTileId);
+ init.appendLine(' pea ' + animation.dynTileId);
+ init.appendLine(' _GTECopyTileToDynamic');
}
// Next, create the scripts to change the tile data based on the configured ticks delays.
@@ -123,10 +123,10 @@ function writeTileAnimations(filename, animations) {
}
const label = `TileAnim_${animation.tileId}`;
- init.appendLine(` lda #${label}`);
- init.appendLine(` ldx #^${label}`);
- init.appendLine(` ldy #${numTicks}`);
- init.appendLine(` jsl StartScript`);
+ init.appendLine(` pea ${numTicks}`);
+ init.appendLine(` pea ^${label}`);
+ init.appendLine(` pea ${label}`);
+ init.appendLine(` _GTEStartScript`);
// bit 15 = 1 if the end of a sequence
// bit 14 = 0 proceed to next action, 1 jump
@@ -175,8 +175,13 @@ function findAnimatedTiles(tileset) {
continue;
}
+ console.log(tile);
const tileId = parseInt(tile.id, 10);
- const frames = tile.animation.frame.map(f => {
+ let frame = tile.animation.frame;
+ if (!frame.length) {
+ frame = [frame];
+ }
+ const frames = frame.map(f => {
const millis = parseInt(f.duration, 10);
const ticksPerMillis = 60. / 1000.;
return {
@@ -474,7 +479,7 @@ function convertTileID(tileId, tileset) {
// the tile ID
if (tileset[tileIndex - 1].animation) {
const animation = tileset[tileIndex - 1].animation;
- tileId = animation.dynTileId;
+ tileId = animation.dynTileId * 4; // pre-map the ID -> byte offset
control_bits = GTE_DYN_BIT;
console.warn('Dyanmic animation tile found!');