diff --git a/NeutTower.dsk b/NeutTower.dsk index abf5934..4798263 100644 Binary files a/NeutTower.dsk and b/NeutTower.dsk differ diff --git a/asm/asm.fnl b/asm/asm.fnl index 51b8760..f25b3c9 100644 --- a/asm/asm.fnl +++ b/asm/asm.fnl @@ -120,9 +120,13 @@ (fn parse-dats [block dats] (each [_ dat (ipairs dats)] (if (= (type dat) "string") - (do (tset block.symbols dat (+ (length block.pdats) 1)) - (when (= (dat:sub 1 2) "G-") - (tset block.globals dat true))) + (do (tset block.symbols dat (+ (length block.pdats) 1)) + (when (= (dat:sub 1 2) "G-") + (tset block.globals dat true))) + + (not= (type dat) :table) + (error (.. "Invalid operation " dat)) + (let [opcode (. dat 1) parser (. dat-parser opcode) pdat diff --git a/asm/prodos.fnl b/asm/prodos.fnl index c46560b..67e641a 100644 --- a/asm/prodos.fnl +++ b/asm/prodos.fnl @@ -6,7 +6,9 @@ (local lume (require :lib.lume)) (local prodos-mli :0xbf00) +(fn Prodos.str [str] [:block [:db (length str)] [:bytes str]]) (fn Prodos.install-words [vm] + (fn vm.pstr [self str] (self:anon (Prodos.str str))) (fn prodos-call [cmd param-addr crash-on-fail] [:block [:jsr prodos-mli] diff --git a/asm/vm.fnl b/asm/vm.fnl index 066b064..12da712 100644 --- a/asm/vm.fnl +++ b/asm/vm.fnl @@ -53,8 +53,9 @@ (error (.. "VM can't parse " (fv bytecode))))) block)) -(fn mk-vm [prg options] - (local code1 (prg:org 0x4000)) +(fn mk-vm [prg ?options] + (local options (or ?options {})) + (local code1 (prg:org (or options.org 0x4000))) (install-vm-parser prg) (local vm { :IP :0x60 diff --git a/editor/brushedit.fnl b/editor/brushedit.fnl new file mode 100644 index 0000000..5dfb8c3 --- /dev/null +++ b/editor/brushedit.fnl @@ -0,0 +1,17 @@ +(local TileView (require :editor.tileedit)) +(local tiledraw (require :editor.tiledraw)) +(local tiles (require :game.tiles)) +(local style (require :core.style)) + +(local BrushEditView (TileView:extend)) + +(fn BrushEditView.spritegen [self] tiledraw.char-to-sprite) +(fn BrushEditView.tilesize [self] (values 8 8)) +(fn BrushEditView.tilekeys [self] [:gfx :mask]) +(fn BrushEditView.map-bitxy [self x y] (values y x)) +(fn BrushEditView.filename [self] "editor/brushes.json") +(fn BrushEditView.get_name [self] "Brush Editor") +(fn BrushEditView.draw-tile-flags [self x y]) + +BrushEditView + diff --git a/editor/brushes.json b/editor/brushes.json new file mode 100644 index 0000000..8a62058 --- /dev/null +++ b/editor/brushes.json @@ -0,0 +1 @@ +[{"mask":"FFFFFFFFFFFFFFFF","gfx":"D5D5D5D5D5D5D5D5","flags":[]},{"mask":"00008F8F8F000000","gfx":"00000A0A0A000000","flags":[]},{"mask":"00008F8F8F000000","gfx":"00008A8A8A000000","flags":[]},{"mask":"0000BCBCBC000000","gfx":"0000141414000000","flags":[]},{"mask":"0000BCBCBC000000","gfx":"0000949494000000","flags":[]},{"mask":"0000000C0C000000","gfx":"0000000C0C000000","flags":[]},{"mask":"00000C1E1E0C0000","flags":[],"gfx":"0000000000000000"},{"mask":"3E7F7F7F7F7F7F3E","gfx":"3E7F7F7F7F7F7F3E","flags":[]}] \ No newline at end of file diff --git a/editor/gfxedit.fnl b/editor/gfxedit.fnl index a7336db..3febe48 100644 --- a/editor/gfxedit.fnl +++ b/editor/gfxedit.fnl @@ -16,6 +16,7 @@ (attach-imstate self)) (fn GraphicsEditView.spritegen [self] tiledraw.tile-to-sprite) (fn GraphicsEditView.tilesize [self] (values 16 16)) +(fn GraphicsEditView.tilebytelen [self] (let [(w h) (self:tilesize)] (/ (* w h) 8))) (fn GraphicsEditView.filename [self] tiles.fn-tiles) (fn GraphicsEditView.reload [self] (self.tilecache:load (tiles.loadgfx (self:filename)))) diff --git a/editor/init.fnl b/editor/init.fnl index 12f47d9..e392731 100644 --- a/editor/init.fnl +++ b/editor/init.fnl @@ -2,6 +2,7 @@ (local util (require :lib.util)) (local TileView (require :editor.tileedit)) (local MapEditView (require :editor.mapedit)) +(local ScreenEditView (require :editor.screenedit)) (local PortraitView (require :editor.portraitedit)) (local {: cmd-predicate} (util.require :editor.imstate)) (local core (require :core)) @@ -10,26 +11,30 @@ (local common (require :core.common)) (let [commands {}] - (each [_ name (ipairs [:tile :portrait :font])] + (each [_ name (ipairs [:tile :portrait :font :brush])] (local cls (require (.. "editor." name "edit"))) (tset commands (.. "honeylisp:" name "-editor") (fn [] (local node (core.root_view:get_active_node)) (node:add_view (cls))))) (command.add nil commands)) -(command.add nil { - "honeylisp:map-editor" (fn [] - (core.command_view:enter "Open Map" - (fn [text item] - (local node (core.root_view:get_active_node)) - (node:add_view (MapEditView (or (and item item.text) text)))) - (fn [text] - (local files []) - (each [_ item (pairs core.project_files)] - (when (and (= item.type :file) (item.filename:find "^game/map%d+%.json")) - (table.insert files item.filename))) - (common.fuzzy_match files text)))) -}) +(local fileeditors + {:map {:view MapEditView :filefilter "^game/map%d+%.json"} + :screen {:view ScreenEditView :filefilter "^game/.*%.screen"}}) + +(each [type {: view : filefilter} (pairs fileeditors)] + (command.add nil + {(.. "honeylisp:" type "-editor") (fn [] + (core.command_view:enter (.. "Open " type) + (fn [text item] + (local node (core.root_view:get_active_node)) + (node:add_view (view (or (and item item.text) text)))) + (fn [text] + (local files []) + (each [_ item (pairs core.project_files)] + (when (and (= item.type :file) (item.filename:find filefilter)) + (table.insert files item.filename))) + (common.fuzzy_match files text))))})) (command.add (cmd-predicate :editor.gfxedit) { "graphics-editor:save" (fn [] (core.active_view:save) (core.log "Saved")) @@ -41,7 +46,7 @@ "tileedit:copy" #(system.set_clipboard (: (core.active_view:tile) :tohex)) "tileedit:paste" - #(when (= (length (system.get_clipboard)) 64) + #(when (= (length (system.get_clipboard)) (* (core.active_view:tilebytelen) 2)) (core.active_view:update-tile (: (system.get_clipboard) :fromhex))) }) (keymap.add { diff --git a/editor/screenedit.fnl b/editor/screenedit.fnl new file mode 100644 index 0000000..d4afc8e --- /dev/null +++ b/editor/screenedit.fnl @@ -0,0 +1,96 @@ +(local GraphicsEditView (require :editor.gfxedit)) +(local util (require :lib.util)) +(local lume (require :lib.lume)) +(local style (require :core.style)) +(local {: char-to-sprite : scanline-to-sprite : screen-y-to-offset} (util.require :editor.tiledraw)) +(local {: mouse-inside : activate : active? : checkbox : textfield : textbutton} (util.require :editor.imstate)) + +(local ScreenEditView (GraphicsEditView:extend)) +(local screen-scale 4) +(local screenw 280) +(local screenh 192) + +(fn ScreenEditView.new [self filename] + (ScreenEditView.super.new self) + (set self.screenfilename filename) + (set self.scanlines []) + (self:reload)) + +(fn gfxshift [byte offset] + (local pixels (bit.band (string.byte byte) 0x7f)) + (local color (bit.band (string.byte byte) 0x80)) + (bit.bor color + (if (> offset 0) (bit.band (bit.lshift pixels offset) 0x7f) + (bit.rshift pixels (- offset))))) + +(fn brush-mask-at [brush xoffset y] + (values (gfxshift (brush.gfx:sub y y) xoffset) (gfxshift (brush.mask:sub y y) xoffset))) + +(fn paint-byte [src brush mask] + (if (not= (bit.band mask 0x7f) 0) + (-> src + (bit.band (bit.bxor 0xff mask)) + (bit.bor brush)) + src)) + +(fn paint-byte-at [screen brush y xbyte xoffset yoffset] + (if (and (>= xbyte 0) (< xbyte 40) (>= y 0) (< y screenh)) + (let [ibyte (+ (screen-y-to-offset y) xbyte) + srcbyte (screen:sub (+ ibyte 1) (+ ibyte 1)) + painted (paint-byte (string.byte srcbyte) (brush-mask-at brush xoffset yoffset))] + (util.splice screen ibyte (string.char painted))) + screen)) + +(fn paint [screen brush x y] + (var result screen) + (for [row y (+ y 7)] + (local xbyte (math.floor (/ x 7))) + (local xoffset-left (% x 7)) + (local xoffset-right (- xoffset-left 7)) + (local yoffset (+ (- row y) 1)) + (set result (paint-byte-at result brush row xbyte xoffset-left yoffset)) + (set result (paint-byte-at result brush row (+ xbyte 1) xoffset-right yoffset))) + result) + +(fn ScreenEditView.draw-screen-editor [self x y] + (local (w h) (values (* screenw screen-scale) (* screenh screen-scale))) + (activate self :screen x y w h) + (var screen self.screen) + (when (and self.itile (mouse-inside x y w h)) + (local mx (math.floor (/ (- (love.mouse.getX) x) screen-scale))) + (local my (math.floor (/ (- (love.mouse.getY) y) screen-scale))) + (set screen (paint screen (. self.tilecache.tiles self.itile) (bit.band (- mx 3) 0xfffe) (- my 4))) + (when (active? self :screen) (set self.screen screen))) + + (for [scany 0 (- screenh 1)] + (local scanline (or (. self.scanlines scany) {})) + (local ibyte (screen-y-to-offset scany)) + (local linehash (screen:sub (+ ibyte 1) (+ ibyte 40))) + (when (not= scanline.linehash linehash) + (set scanline.linehash linehash) + (set scanline.sprite (scanline-to-sprite screen scany)) + (tset self.scanlines scany scanline)) + (love.graphics.draw scanline.sprite x (+ y (* scany screen-scale)) 0 screen-scale screen-scale))) + +(fn ScreenEditView.reload [self] + (ScreenEditView.super.reload self) + (local (loaded screen) (pcall #(util.readjson self.screenfilename))) + (set self.screen + (if (not loaded) (string.rep "\0" 0x2000) + (screen:fromhex)))) + +(fn ScreenEditView.save [self] + (util.writejson self.screenfilename (self.screen:tohex))) + +(fn ScreenEditView.draw [self] + (self:draw_background style.background) + (love.graphics.setColor 1 1 1 1) + (self:draw-screen-editor (+ self.position.x 10) (+ self.position.y 10)) + (self:draw-tile-selector (+ self.position.x 10) (+ self.position.y 20 (* screenh screen-scale)) (- self.size.x 20))) + +(fn ScreenEditView.filename [self] "editor/brushes.json") +(fn ScreenEditView.spritegen [self] char-to-sprite) +(fn ScreenEditView.tilesize [self] (values 8 8)) +(fn ScreenEditView.get_name [self] (.. "Screen: " self.screenfilename)) + +ScreenEditView diff --git a/editor/tiledraw.fnl b/editor/tiledraw.fnl index 660d79f..0705d39 100644 --- a/editor/tiledraw.fnl +++ b/editor/tiledraw.fnl @@ -70,6 +70,28 @@ (fn tile-to-sprite [tile] (if tile (tilestrip-to-sprite [tile]) (make-canvas 14 16 #nil))) +(fn screen-y-to-offset [y] + (var offset (* (% y 8) 0x400)) + (local ybox (math.floor (/ y 8))) + (local ysection (match (math.floor (/ ybox 8)) + 0 0x0000 + 1 0x0028 + 2 0x0050)) + (+ offset ysection (* (% ybox 8) 0x80))) + +(fn draw-scanline [screen y ydest] + (local ibyte (+ 1 (screen-y-to-offset y))) + (var state nil) (var prevpal nil) + (for [x 0 39] + (set (state prevpal) (draw-byte screen (+ ibyte x) (* x 7) ydest state prevpal)))) + +(fn scanline-to-sprite [screen y] + (make-canvas 280 1 (fn [canvas] (draw-scanline screen y 0)))) + +(fn screen-to-sprite [screen] + (make-canvas 280 192 (fn [canvas] + (for [y 0 191] (draw-scanline screen y y))))) + (fn portrait-to-sprite [gfx] (local top (tilestrip-to-sprite [(gfx:sub 1 32) (gfx:sub 65 96)])) (local bottom (tilestrip-to-sprite [(gfx:sub 33 64) (gfx:sub 97 128)])) @@ -79,8 +101,9 @@ (fn char-to-sprite [gfx] (make-canvas 7 8 (fn [canvas] - (for [y 0 7] - (draw-byte gfx (+ y 1) 0 y))))) + (when gfx + (for [y 0 7] + (draw-byte gfx (+ y 1) 0 y)))))) (fn TileCache [tiles ?spritegen] {: tiles @@ -108,5 +131,6 @@ (tset self.tilesprites key (self.spritegen (. self.tiles itile (or ?key :gfx))))) (. self.tilesprites key))}) -{: tile-to-sprite : tilestrip-to-sprite : portrait-to-sprite : char-to-sprite : pal-from-bit : pal-from-byte : TileCache} +{: tile-to-sprite : tilestrip-to-sprite : portrait-to-sprite : char-to-sprite : scanline-to-sprite + : screen-y-to-offset : pal-from-bit : pal-from-byte : TileCache : make-canvas : draw-byte} diff --git a/editor/tileedit.fnl b/editor/tileedit.fnl index 06596a4..e6820e8 100644 --- a/editor/tileedit.fnl +++ b/editor/tileedit.fnl @@ -87,9 +87,6 @@ (fn TileView.save [self] (tiles.savegfx (self:filename) self.tilecache.tiles)) -(fn TileView.draw-neut-tile-selector [self x y] - (self:draw-tile-selector x (- self.size.x 20) :neut)) - (fn TileView.draw [self] (self:draw_background style.background) (local (x y) (values (+ self.position.x 10) (+ self.position.y 10))) diff --git a/game/disk.fnl b/game/disk.fnl index 8675eb8..4f9a027 100644 --- a/game/disk.fnl +++ b/game/disk.fnl @@ -1,4 +1,5 @@ (local asm (require :asm.asm)) +(local VM (require :asm.vm)) (local Prodos (require :asm.prodos)) (local util (require :lib.util)) (local {: lo : hi} util) @@ -30,8 +31,12 @@ [:bne :ld-src] :done]) -(fn prg-loader [org game] +(fn create-sys-loader [disk filename game] (local blocks []) + (local prg (asm.new game)) + (local org (prg:org 0x2000)) + (org:append :loader-main) + (set prg.start-symbol :loader-main) (each [_ block (pairs game.org-to-block)] (table.insert blocks block)) (table.sort blocks #(< $1.addr $2.addr)) @@ -39,19 +44,48 @@ (org:append (org-loader block))) (org:append [:jmp game.start-symbol]) (each [_ block (ipairs blocks)] - (org:append (.. :loader- block.addr) [:bytes block.bytes]))) + (org:append (.. :loader- block.addr) [:bytes block.bytes])) + (prg:assemble) + (disk:add-file (.. filename ".SYSTEM") Prodos.file-type.SYS 0x2000 org.block.bytes)) -(local game (util.reload :game)) -(local prg (asm.new game)) -(local org (prg:org 0x2000)) +(fn create-loader [disk game] + (local boot (asm.new game)) + (set boot.start-symbol :boot) + (local vm (VM.new boot {:org 0xc00})) + (disk.install-words vm) + (vm:def :hires + [:sta :0xc050] + [:sta :0xc057] + [:sta :0xc052] + [:sta :0xc054]) + (vm:word :loadfile ; length addr filename -- + 0xbb00 :open :read :drop :close) -(org:append :loader-main) -(set prg.start-symbol :loader-main) -(prg-loader org game) -(prg:assemble) + (disk:add-file "TITLE.SCREEN" Prodos.file-type.BIN 0x2000 (: (util.readjson "game/title.screen") :fromhex)) + (vm.code:append + :boot + [:jsr :reset] + [:jsr :interpret] + [:vm :hires + 0x2000 0x2000 (vm:pstr "TITLE.SCREEN") :loadfile]) + (local files []) + (each [_ block (pairs game.org-to-block)] + (local filename (.. "STUFF." (length files))) + (table.insert files filename) + (disk:add-file filename Prodos.file-type.BIN block.addr block.bytes) + (vm.code:append [:vm (length block.bytes) block.addr :lit (.. :filename (length files)) :loadfile])) + (vm.code:append + [:vm :native] + [:jmp game.start-symbol]) + (each [i filename (ipairs files)] + (vm.code:append (.. :filename i) (disk.str filename))) + (boot:assemble) + boot) (local disk (Prodos "ProDOS_Blank.dsk")) -(disk:add-file "NEUT.SYSTEM" Prodos.file-type.SYS 0x2000 org.block.bytes) +(local game (util.reload :game)) +(local loader (create-loader disk game)) +(create-sys-loader disk :NEUT loader) (disk:update-volume-header {:name "NEUT.TOWER"}) (disk:write "NeutTower.dsk") diff --git a/game/tiles.fnl b/game/tiles.fnl index ef91e7c..bd7aa73 100644 --- a/game/tiles.fnl +++ b/game/tiles.fnl @@ -6,7 +6,7 @@ (each [iflag flag (ipairs flags)] (tset flag-to-bit flag (bit.lshift 1 (- iflag 1)))) -(local encoded-tile-fields [:gfx :neut]) +(local encoded-tile-fields [:gfx :neut :mask]) (fn convert [tile field method] (local oldval (. tile field)) (when oldval diff --git a/game/title.screen b/game/title.screen new file mode 100644 index 0000000..06b3de7 --- /dev/null +++ b/game/title.screen @@ -0,0 +1 @@ +"D5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD52A552A552A552A552AD5AAD5AAD5AAD5AAD5AA552A552AD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AA85FEFFFFFFFFFFFFFFFFFFFF9FFCFFFFFFFFFFFFD5AAFF83D5AAD5FFFFBFD5AA0000000000000000D5AAD5AAD5AAD5AAD5AAD5AA552A55AA552A550AFFAFD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAF5FFDFFAD5F0D7AAF5EAFFAFD5AAD5FF9FFCFFAAD5FEFFABFDEBFF80D5AAF5AFD5AAD5AA0000000000000000D5AAD5AAD5AAD52A552A552A552A157E3F7E052E552A552A552A552A552A552A552A55AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5EAFFFFFFFFFFFFD7C2FFAAD5AAFFBFD5FAD5FF9FFCD7AAD7FEFFABD7EA9FA8D5AAD5AAD5AAD5AA0000000000000000D5AAD5AAD52A5534552A292D252B292B5578453F552A552A552A552A5A526A522A2D55AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AA80F0FFFFFFFFFFFFBF808080808080AAD5AAD5AAD5AAD5AAD5FEFFFFFFFFFFFFD58AF8AFD5AAFFFFD5AAD5FF9FFCDFAAD5FEFFABF5FF9FA8D5AAD5AAD5AAD5AA0000000000000000D5AAD5AA5554555255525534252B252D5578153E552A25552A53552A5A346A4A562A552A552A552AD5AAD5AAD5AAD5AAD5AAD5AA9580C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9FC0AAD5AAD5AAD5AAD5FEFFFFFFFFFFAFD5AAE1FFFFFFFFFFFFFFFFFF9FFCDFFAFFFFFFFFFFFF87AAD5AAD5AAD5AAD5AA0000000000000000552A552A55546A4A5A526A2A152D152D55621778552A252B2553294D5A34254B5A2A55AAD5AAD5AAD5AAD5AAD5AAD5AAD5AA80E0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF80F0BFD0AAD5AAD5AADFAAD5FEFFAFD5AAD5AAD5AA85FEFFFFFFFFFFFFFFFFBFF0FFFFFFFFFFFFFFFF87AAD5AAD5AAD5AAD5AA0000000000000000552A552A555216555A4A2A5556542A355562577855625F2A552A5A2A552A552A552AD5AAD5AAD5AAD5AAD5AAD5AAD58A8080FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF81C0FFFFFFFF8FD4AAD5AAFDFFFFAAD5AAD5AAD5AAD5AAD5AAD5F0FFFFFFFFFFFFFFFFFFF0FFFFFFFFFFBFD5FAC1AAD5AAD5AAD5AAD5AA0000000000000000D5AAD5AA552A5A2A552A552A552A550A707F15787F2A552A552A552A552A552AD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAE1FFFFFFFFFFFFFFFFFF8380B880F0FFFFFFFFFFFFFFFF8FD4AAF5FFFFFFFFAAD5AAD5AAD5AAD5AAD5AAD582DEAAD5FADFAAD5FAFFC3FFAFD5FAFFABF5FAC0AAD5AAD5AAD5AAD5AA0000000000000000D5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD52A552A552A552AD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AA85FCFFFFFFFFFFFFFFFFFFFF9FFCFFFFFFFFFFAFD5AAFF83D5AAFDFFFFAFD5AA0000000000000000D5AAD5AAD5AAD5AAD5AAD5AA552A552A552A55627FABD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAFDFFDFFED7F0D7AAF5EAFFAFD5AAD5FF9FFCDFAAD5FEFFABFDEBFF80D5AAD5AAD5AAD5AA0000000000000000D5AAD5AAD5AA552A552A552A552A157E1F7E452F552A552A552A552A552A552A552A55AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AA8180D0A8D5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5EAFFFFFFFFFFFFD782FFAAD5AAFFBFD5BAD5FF9FFCD7EAD7FEFFABD5EA9FA8D5AAD5AAD5AAD5AA0000000000000000D5AAD5AAD52A5534552A2A35252B292B5578053E552A552A552A552A5A526A522A2D55AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD58280F8FFFFFFFFFFFFFFFF808080808080D4AAD5AAD5AAD5AAD5FEFFFFFFFFFFFFD58AF8AFD5AAFFFFD5AAD5FF9FFCDFAAD5FEFFABFFFF9FA8D5AAD5AAD5AAD5AA0000000000000000D5AAD5AA5554555256521535252B252D5578153E552A25552953552A5A346A4A562A552A552A552AD5AAD5AAD5AAD5AAD5AAD5AA8180F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8FC0AAD5AAD5AAD5AAD5FEFFFFF7FFFFABD5AAE1FFFFFFFFFFFFFFFFFF9FFCFFFFFFFFFFFFFFFF87AAD5AAD5AAD5AAD5AA0000000000000000552A552A55526A4A5A526A2A152D252D55621778552A252B2553294D5A34252B5A2A55AAD5AAD5AAD5AAD5AAD5AAD5AAD58280FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8380FFBFD0AAD5AAD5EADFAAD5EAFFAFD5AAD5AAD5AA85FCFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFF83AAD5AAD5AAD5AAD5AA0000000000000000D52A552A555256545A4A2A5556546A2A55625778157E5F2A552A552A552A552A55AAD5AAD5AAD5AAD5AAD5AAD5AAD58A8080C0FFFFFFFFFFFFFFFFFFFFFFFFFFBF80FCFFFFFFFF8FD4AAD5AAFDFFFFAAD5AAD5AAD5AAD5AAD5AAD5F0FFFFFFFFFFFFFFFFFFF0FFFFFFFFFFABD5FAC1AAD5AAD5AAD5AAD5AA0000000000000000D5AAD5AA552A5A2A552A552A552A550A7C3F55785F2A552A552A552A552A552AD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAE1FFFFFFFFFFFFFFFFFFFF878080FCFFFFFFFFFFFFFFFF8FD4AAF5FFFFFFFFAAD5AAD5AAD5AAD5AAD5AAD582DEAAD5FADFAAD5EAFFC3FFAAD5FAFFABF5BAC0AAD5AAD5AAD5AAD5AA0000000000000000D5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD58AD7AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD52A552A55AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AA85FCDFFEF5FFFFFFFFFFFFFF9FFCFFFFFFFFFFABD5AAFF83D5AAFDFFF7AAD5AA0000000000000000D5AAD5AAD5AAD5AAD5AA552A552A552A552A55785FAAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAFFFFFFFED7E0DFAAF5EAFFAFD5AAD5FF9FFCD7AAD5FEFFABFDEAFFA0D5AAD5AAD5AAD5AA0000000000000000D5AAD5AAD5AA5534552A552A552A153E5778452F552A552A552A552A552A552A552A55AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AA8080808080AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5FAFFFFFFFFFFFFD582FEABD5AAFFBFD5AAD5FF9FFCD7EAD7FEFFABD5EA9FA8D5AAD5AAD5AAD5AA0000000000000000D5AAD5AAD52A5534552A2A35252B292B5578053E552A552A552A552A5A526A522A2D552AD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD58280FEFFFFFFFFFFFFFFFFFF8180808080D0AAD5AAD5AAD5AAD5FEFFFFFFFFFFBFD5AAF0AFD5EAFFFFD5AAD5FF9FFCDFAAD5FEFFEBFFFF9FA8D5AAD5AAD5AAD5AA0000000000000000D5AAD5AA5554555256521535252B252D5578153E552A252B2553252B5A545A4A562A552A552A552AD5AAD5AAD5AAD5AAD5AAD5AA8080FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF87C0AAD5AAD5AAD5AAD5FEFFFFF7FFFFAAD5AAC1FFFFFFFFFFFFFFFFFF9FFCFFFFFFFFFFFFFFFF87AAD5AAD5AAD5AAD5AA0000000000000000552A552A5552294B5A525A2A152D252D55621778552A252D29532A555654292B552A55AAD5AAD5AAD5AAD5AAD5AAD5AAD580F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80F8FFBFD0AAD5AAD5EAFFAAD5EAFFABD5AAD5AAD5AA85FCFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFF81AAD5AAD5AAD5AAD5AA0000000000000000D5AAD52A554A5A545A2A2A5555525A2A55625778457F5F2A552A552A552A552A55AAD5AAD5AAD5AAD5AAD5AAD5AAD58A8080808080FEFFFFFFFFFFFFFFFFFF9F8C80FFFFFFFFFF8FD4AAD5AAFFFFFFAAD5AAD5AAD5AAD5AAD5AAD5E0FFFFFFFFFFFFFFFFFFF0FFFFFFFFFFABD5FAC1AAD5AAD5AAD5AAD5AA0000000000000000D5AAD5AA552A5A2A552A552A552A550A7C2F5538572A552A552A552A552A552AD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAE1FFFFFFFFFFFFFFFFFFFFFF87F8FFFFFFFFFFFFFFFFFF87D4AAF5FFFFFFFFAAD5AAD5AAD5AAD5AAD5AAD58ADCAAFDFADFAAD5EBFFC3FFAAD5FAFFABF5BEC0AAD5AAD5AAD5AAD5AA0000000000000000D5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5F8D7AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AA95FCDFAAD5FEFFFFFFFFFFFF9FFCFFFFFFFFFFABD5EAFF83D5AAFDFFD5AAD5AA0000000000000000D5AAD5AAD5AAD5AAD52A552A552A552A5538157E572AD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAFFFFFFFFD7C0DFAAF5EAFFAFD5AAD5FF9FFCD7AAD5FEFFABFDEAFFA0D5AAD5AAD5AAD5AA0000000000000000D5AAD5AAD5AA5534552A552A552A153E5578452F552A552A552A552A552A552A552A55AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD58A808080808080D0AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5FAFFFFFFFFFFFFD582FEABD5AAFFBFD5AAD5FF9FFCD7EAD7FEFFABD5EA9FA8D5AAD5AAD5AAD5AA0000000000000000D5AAD5AA552A5554552A5A34252B292B5578053E552A552A5552552A5A52694A6A2A552AD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD580F0FFFFFFFFFFFFFFFFFFFFFFFFFF8080C0AAD5AAD5AAD5AAD5FEFFFFFFFFFFBFD5AAE0BFF5FFFFFFD5AAD5FF9FFCDFAAD5FEFFFFFFFF8FA8D5AAD5AAD5AAD5AA0000000000000000D5AAD52A555456525652152D252B152D5578153E552A252B2553252B5A545A4A562A552A552A552AD5AAD5AAD5AAD5AAD5AAD58A80F8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF81C0AAD5AAD5AAD5AAD5FEFFFFD7FFFFAAD5AA81FFFFFFFFFFFFFFFFFF9FFCFFFFFFFFFFFFFFFF87AAD5AAD5AAD5AAD5AA0000000000000000552A552A5552294B5A52552A152D252D55625778552A252D29532A5556542A2B552AD5AAD5AAD5AAD5AAD5AAD5AAD58AD580FCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8780FEFFBFD0AAD5AAD5EAFFAAD5AAF5ABD5AAD5AAD5AA95FCFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFC1AAD5AAD5AAD5AAD5AA0000000000000000D5AAD52A554A5A545A2A2A2D552A552A15605778757F572A552A552A552A552A55AAD5AAD5AAD5AAD5AAD5AAD5AAD58AF88780808080C0FFFFFFFFFFFFFFBF8080E0FFFFFFFFFF8FD4AAD5FAFFFFFFAAD5AAD5AAD5AAD5AAD5AAD5C0FFFFFFFFFFFFFFFFFFF0FFFFFFFFFFABD5FAC1AAD5AAD5AAD5AAD5AA0000000000000000D5AAD5AA552A5A2A552A552A552A55627F2A550A572A552A552A552A552A55AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAC1FFFFFFFFFFFFFFFFFFFFFF87FCFFFFFFFFFFFFFFABFF83D4AAF5FFFFFFFFAAD5AAD5AAD5AAD5AAD5AAD58AD8AAFDEADFAAD5EBFFC3FFAAD5FAFFABF5FEC0AAD5AAD5AAD5AAD5AA0000000000000000D5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AA95FED7AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AA95F8D7AAD5FEFFFFFFFFFFFF9FFCFFFFDFFEFFABF5EAFF83D5AAFDFFD5AAD5AA0000000000000000D5AAD5AAD5AAD5AA552A552A552A552A457F157E552A552A552A55AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5EAFFFFFFFFD7C0DFAAD5EAFFAFD5AAD7FF9FFCD7AAD5FEFFABFDEAFFA0D5AAD5AAD5AAD5AA0000000000000000D5AAD5AAD5AA5534552A552A552A552A5578452F552A552A552A552A552A552A552A55AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5808080808080808082D4AAD5AAD5AAD5AAD5AAD5AAD5AAD5FAFFFFFFFFFFFFD58AFEABD5AAFFBFD5AAD5FF9FFCD7EAD5FEFFABD5EA9FA8D5AAD5AAD5AAD5AA0000000000000000D5AAD5AA552A5554554A5A34252B252B5578153E552A55545652552A5A54694A5A2A552AD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AA8580FCFFFFFFFFFFFFFFFFFFFFFFFFFFBF80C0AAD5AAD5AAD5AAD5FEFFFFFFFFFFBFD5AAE0FFFFFFFFFFD5AAD5FF9FFCDFAAF5FFFFFFFFFF87A8D5AAD5AAD5AAD5AA0000000000000000D5AAD52A55545A525652252D252B152D5578153E552A252B2553252B5A54564A562A552A552A552AD5AAD5AAD5AAD5AAD5AAD580C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F80C0AAD5AAD5AAD5AAD5FEFFFFD5FAFFAAD5AA81FFFFFFFFFFFFFFFFFF9FFCFFFFFFFFFFFFFFFF87AAD5AAD5AAD5AAD5AA0000000000000000552A552A5552264D5A52552A152D252D55625778552A25356A4A2A5556522A2B552AD5AAD5AAD5AAD5AAD5AAD5AAD58A8080FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF80C0FFFFBFD0AAD5AAD5FAFFAAD5AAD5AAD5AAD5AAD5AA95FCFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFDFFAC1AAD5AAD5AAD5AAD5AA0000000000000000D5AAD52A554A5A4A5A2A552A552A552A156017787F7F552A552A552A552A552A55AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAF8FF8080808080808080FCFFFFFF838080FEFFFFFFFFFF8FD4AAD5FAFFFFDFAAD5AAD5AAD5AAD5AAD5AAD5C0FFFFFFFFFFFFFFFFFFF0FFFFFFFFFFABF5FAC1AAD5AAD5AAD5AAD5AA0000000000000000D5AAD5AA552A552A552A552A552A55625F2A552A552A552A552A552A552A55AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AA81FFFFFFFFFFFFFFFFFFFFFF87FEFFFFFFFFFFFFFFAAFF83D4AAF5FFFFFFDFAAD5AAD5AAD5AAD5AAD5AAD58AF8AADDEADFAAD5EBFFC3FFAAF5FAFFABD5FEC0AAD5AAD5AAD5AAD5AA0000000000000000D5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AA85FED7AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5BED5AA95F0D7AAD5FAFFAFD5EAFFFF9FFCFFFFD5FEFFABF5EBFF83D5AAF5FFD5AAD5AA0000000000000000D5AAD5AAD5AAD5AA552A552A552A552A7C7F153E552A552A552A552A552A552A55AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAF5EFFFFFFFFFD7C2DFAAD5EAFFAFD5AAD7FF9FFCD7AAD5FEFFABD7EAFFA0D5AAD5AAD5AAD5AA0000000000000000D5AAD5AAD5AA5534552A552A552A552A5578452F552A552A552A552A552A552A552A55AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AA9580F09F808080808080C0AAD5AAD5AAD5AAD5AAD5AAD5AAD5FEFFFFFFFFFFFFD58AFEABD5AAFFBFD5AAD5FF9FFCD7EAD5FEFFABD5EA9FA8D5AAD5AAD5AAD5AA0000000000000000D5AAD5AA55345552554A5634252B252B5578153E552A15555A52552A5A54694A5A2A552A55AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AA81E0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8780AAD5AAD5AAD5AAD5FEFFFFFFFFFFBFD5AAE0FFFFFFFFFFFFAAD5FF9FFCDFAAF5FFFFFFFFFF87A8D5AAD5AAD5AAD5AA0000000000000000D5AAD52A55545A525652252D252D152D5562153E552A252B2553252B5A54554A5A2A552A552A552AD5AAD5AAD5AAD5AAD5AA9580E0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80A0C0AAD5AAD5AAD5AAD5FEFFFFD5EAD7AAD5AA81FFFFFFFFFFFFFFFFFF9FFCFFFFFFFFFFFFFFFF87AAD5AAD5AAD5AAD5AA0000000000000000552A552A555226555A52564A1635252D5562177E552A15556A4A6A54564A2A2B552AD5AAD5AAD5AAD5AAD5AAD5AAD58A80E0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8380FCFFFF9FD0AAD5AAD5FAFFAAD5AAD5AAD5AAD5AAD5AA95F8FFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFDFFAC1AAD5AAD5AAD5AAD5AA0000000000000000D5AAD52A554A5A4A5A2A552A552A552A056017787F2F552A552A552A552A552A55AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAF0FFBF8080808080808080E0FFFF8080CCFFFFFFFFFFFF8FD4AAD5FEFFFFDFABD5AAD5AAD5AAD5AAD5AAD5C2FFFFFFFFDFAAD5FEFFE0FFFFFFFAFFABF5FAC1AAD5AAD5AAD5AAD5AA0000000000000000D5AAD5AA552A552A552A552A552A5562DFAA552A552A552A552A552A552AD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AA81FFFFFFFFFFFFFFFFFFFFFF87FCFFFFFFFFFFFFFFAAFF83D5AAF5FFFFFFD7AAD5AAD5AAD5AAD5AAD5AAD5AAF8AADDEADFAAD5EAFFC3FFAAF5FAFFABD5BEC0AAD5AAD5AAD5AAD5AA0000000000000000D5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAF1FFD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAF5FFD5AA95F0D7AAD5FAFFAFD5AAFFFF9FFCFFBFD5FEFFABF5EBFF83D5AAF5BFD5AAD5AA0000000000000000D5AAD5AAD5AAD52A552A552A552A550A7F7F153E552A552A552A552A552A552A552AD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAFDEFFFFFFFFFD7C2DFAAD5EAFFAFD5AAD7FF9FFCD7AADDFEFFABD7EABFA0D5AAD5AAD5AAD5AA0000000000000000D5AAD5AAD52A5534552A552A552A552A5578452F552A552A552A552A552A554A162D55AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AA9580FCFFBFF8808080808080D5AAD5AAD5AAD5AAD5AAD5AAD5FEFFFFFFFFFFFFD58AFCABD5AAFFFFD5AAD5FF9FFCD7EAD5FEFFABD5FA9FA8D5AAD5AAD5AAD5AA0000000000000000D5AAD5AA5534555255525634252B252B5578153E552A15555A52552A5A34694A562A552A552A552AD5AAD5AAD5AAD5AAD5AAD5AAD58A80F8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F80AAD5AAD5AAD5AAD5FEFFFFFFFFFFBFD5AAE0FFFFFFFFFFFFAFD5FF9FFCDFAAFDFFFFFFFFFF87AAD5AAD5AAD5AAD5AA0000000000000000D5AA552A55545A525652292B252D152D5562177E552A252B2553252B5A34554A5A2A552A552A552AD5AAD5AAD5AAD5AAD5AA8580F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8780B8D0AAD5AAD5AAD5AAD5FEFFBFD5AAD5AAD5AA85FFFFFFFFFFFFFFFFFF9FFCFFFFFFFFFFFFFFFF87AAD5AAD5AAD5AAD5AA0000000000000000552A552A555226555A52564A1635293555621778552A55545A4A6A54562A552A552AD5AAD5AAD5AAD5AAD5AAD5AAD58A80F8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8080FFFFFF8FD0AAD5AAD5FAFFAAD5AAD5AAD5AAD5AAD5AA95F0FFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFD7FAC1AAD5AAD5AAD5AAD5AA0000000000000000D5AAD52A552A5A2A552A552A552A552A017817787F2F552A552A552A552A552A55AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAE0FFFFFFFF81808080808080FC8780E0FFFFFFFFFFFFFF8FD4AAD5FFFFFFDFABD5AAD5AAD5AAD5AAD5AAD5C2FFABF5FFDFAAD5FAFFC0FFFFDFFAFFABF5FAC1AAD5AAD5AAD5AAD5AA0000000000000000D5AAD5AA552A552A552A552A552A55E2D7AAD52A552A552A552A552A552AD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AA81FFFFFFFFFFFFFFFFFFFFFF8FFCFFFFFFFFFFFFDFAAFF83D5AAF5FFFFFFD7AAD5AAD5AAD5AAD5AAD5AAD5AAF8AADDEADFAAD5EAFFC3FFAAF5FEFFABD5BEC0AAD5AAD5AAD5AAD5AA0000000000000000D5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAFCBFD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAF5FFD7FA95F0D7AAD5FAFFAFD5AAD5FF9FFCFFABD5FEFFABF5EBFF81D5AAF5AFD5AAD5AA0000000000000000D5AAD5AAD5AAD52A552A552A552A55787F7F153E552A552A552A552A552A552A552AD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAFFFFFFFFFFFFD7C2FFAAD5AAFFBFD5EAD7FF9FFCD7AADFFEFFABD7EA9FA0D5AAD5AAD5AAD5AA0000000000000000D5AAD5AAD52A5534552A292B552A292B5578452F552A552A552A552A554A5A52262D55AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AA81E0FFFFFFFFFFFF80808080808080AAD5AAD5AAD5AAD5AAD5FEFFFFFFFFFFFFD58AF8ABD5AAFFFFD5AAD5FF9FFCDFAAD5FEFFABD5FF9FA8D5AAD5AAD5AAD5AA0000000000000000D5AAD5AA5534555255525634252B252D5578153E552A25556A52552A5A34694A562A552A552A552AD5AAD5AAD5AAD5AAD5AAD5AAD58080FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0AAD5AAD5AAD5AAD5FEFFFFFFFFFFAFD5AAE1FFFFFFFFFFFFFFD7FF9FFCDFAAFFFFFFFFFFFF87AAD5AAD5AAD5AAD5AA0000000000000000D5AA552A55545A525A522A2B152D152D55621778552A252B2553292D5A34554A5A2A552A552A552AD5AAD5AAD5AAD5AAD5AA8180FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8180BED0AAD5AAD5AAD5AAD5FEFFBFD5AAD5AAD5AA85FFFFFFFFFFFFFFFFFF9FF8FFFFFFFFFFFFFFFF87AAD5AAD5AAD5AAD5AA0000000000000000552A552A555216555A4A5652563429355562177855625752564A6A54552A552A552AD5AAD5AAD5AAD5AAD5AAD5AAD58A80E0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F80F8FFFFFF8FD0AAD5AAF5FFFFAAD5AAD5AAD5AAD5AAD5AA95F0FFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFD5FAC1AAD5AAD5AAD5AAD5AA0000000000000000D5AAD52A552A5A2A552A552A552A552A407917787F2B552A552A552A552A552A55AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAE1FFFFFFFFFFBF8080808080F88180FEFFFFFFFFFFFFFF8FD4AAF5FFFFFFFFAAD5AAD5AAD5AAD5AAD5AAD582FFAAD5FADFAAD5FAFFC1FFBFD5FAFFABF5FAC1AAD5AAD5AAD5AAD5AA0000000000000000D5AAD5AAD52A552A552A552A552AD5AAD5AAD5AAD52A552A552A552A55AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AAD5AA85FEFFFFFFFFFFFFFFFFFFFF9FFCFFFFFFFFFFFFD5AAFF83D5AAF5FFFFFFD5AAD5AAD5AAD5AAD5AAD5AAD5AAF8AADDEAFFAAD5EAFFE7FFAAF5FEFFAFD5BED0AAD5AAD5AAD5AAD5AA0000000000000000" \ No newline at end of file