From f5827282e79d09a3a5534aa7deb235e5e03bb9cc Mon Sep 17 00:00:00 2001 From: 4DBug <4DBug@github.com> Date: Wed, 7 Oct 2026 14:47:12 -0500 Subject: [PATCH] roblox --- imgui/backend/imgui_impl_roblox.lua | 587 ++++++++++++++++ imgui/backend/imgui_impl_roblox_fonts.lua | 775 ++++++++++++++++++++++ imgui/imgui.lua | 2 +- imgui/init.lua | 16 +- main.lua | 48 +- main_love.lua | 79 +++ 6 files changed, 1479 insertions(+), 28 deletions(-) create mode 100644 imgui/backend/imgui_impl_roblox.lua create mode 100644 imgui/backend/imgui_impl_roblox_fonts.lua create mode 100755 main_love.lua diff --git a/imgui/backend/imgui_impl_roblox.lua b/imgui/backend/imgui_impl_roblox.lua new file mode 100644 index 0000000..03490d7 --- /dev/null +++ b/imgui/backend/imgui_impl_roblox.lua @@ -0,0 +1,587 @@ +if _G.__IMGUI_ENV then setfenv(1, _G.__IMGUI_ENV) end -- [Roblox] shared env, see init.lua +--- ImGui Backend for Roblox +--- Structurally mirrors imgui_impl_love.lua +--- - Renderer: software rasterizer drawing into a CanvasDraw canvas (EditableImage). CanvasDraw's own shape +--- functions can't do per-vertex colours, texture tinting or clip rects, so triangles are rasterized straight +--- into `Canvas.Buffer` (same RGBA8 layout as ImU32) and pushed with `Canvas:Render()`. +--- - Platform: UserInputService +--- - Files: an in-memory file system (VFS), pre-filled with the fonts from imgui_impl_roblox_fonts.lua +--- +--- Usage (LocalScript): +--- local G = require(ReplicatedStorage.imgui) +--- G.ImGui.CreateContext() +--- G.ImGui_ImplRoblox.Init(require(ReplicatedStorage.CanvasDraw)) + +local UserInputService = game:GetService("UserInputService") +local Players = game:GetService("Players") + +local floor, ceil, min, max = math.floor, math.ceil, math.min, math.max +local readu8, writeu8, writeu32 = buffer.readu8, buffer.writeu8, buffer.writeu32 + +-- EditableImage size limit. Bigger screens get a downscaled canvas that is stretched to fit. +-- Lower it to trade sharpness for speed. +local MAX_CANVAS_SIZE = 1024 + +local ImGui_ImplRoblox_GetBackendData +local ImGui_ImplRoblox_UpdateTexture +local ImGui_ImplRoblox_RenderDrawData +local ImGui_ImplRoblox_Shutdown + +local KEY_MAP = {} -- Enum.KeyCode -> ImGuiKey +do + local names = { + Return = "Enter", Escape = "Escape", Backspace = "Backspace", Tab = "Tab", Space = "Space", KeypadEnter = "KeypadEnter", + Up = "UpArrow", Down = "DownArrow", Left = "LeftArrow", Right = "RightArrow", + Home = "Home", End = "End", PageUp = "PageUp", PageDown = "PageDown", Insert = "Insert", Delete = "Delete", + LeftControl = "LeftCtrl", RightControl = "RightCtrl", LeftShift = "LeftShift", RightShift = "RightShift", + LeftAlt = "LeftAlt", RightAlt = "RightAlt", LeftSuper = "LeftSuper", RightSuper = "RightSuper", + Quote = "Apostrophe", Comma = "Comma", Minus = "Minus", Period = "Period", Slash = "Slash", Semicolon = "Semicolon", + Equals = "Equal", LeftBracket = "LeftBracket", BackSlash = "Backslash", RightBracket = "RightBracket", Backquote = "GraveAccent", + CapsLock = "CapsLock", + KeypadPeriod = "KeypadDecimal", KeypadDivide = "KeypadDivide", KeypadMultiply = "KeypadMultiply", + KeypadMinus = "KeypadSubtract", KeypadPlus = "KeypadAdd", KeypadEquals = "KeypadEqual", + } + local digits = { "Zero", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine" } + for i = 0, 9 do + names[digits[i + 1]] = "K" .. i + names["Keypad" .. digits[i + 1]] = "Keypad" .. i + end + for i = 1, 12 do names["F" .. i] = "F" .. i end + for c in ("ABCDEFGHIJKLMNOPQRSTUVWXYZ"):gmatch(".") do names[c] = c end + + for rbx_name, imgui_name in pairs(names) do + KEY_MAP[Enum.KeyCode[rbx_name]] = ImGuiKey[imgui_name] + end +end + +-- Roblox has no "text input" event, so characters come from KeyCode.Value (ASCII for printable keys) + a US layout shift table. +local SHIFTED = { + ["1"] = "!", ["2"] = "@", ["3"] = "#", ["4"] = "$", ["5"] = "%", ["6"] = "^", ["7"] = "&", ["8"] = "*", ["9"] = "(", ["0"] = ")", + ["-"] = "_", ["="] = "+", ["["] = "{", ["]"] = "}", ["\\"] = "|", [";"] = ":", ["'"] = "\"", [","] = "<", ["."] = ">", ["/"] = "?", ["`"] = "~", +} + +local MOUSE_BUTTONS = { + [Enum.UserInputType.MouseButton1] = 0, -- ImGuiMouseButton.Left + [Enum.UserInputType.MouseButton2] = 1, -- ImGuiMouseButton.Right + [Enum.UserInputType.MouseButton3] = 2, -- ImGuiMouseButton.Middle +} + +--- @return boolean ctrl, boolean shift, boolean alt +local function ImGui_ImplRoblox_UpdateKeyModifiers() + local io = ImGui.GetIO() + local K = Enum.KeyCode + local ctrl = UserInputService:IsKeyDown(K.LeftControl) or UserInputService:IsKeyDown(K.RightControl) + local shift = UserInputService:IsKeyDown(K.LeftShift) or UserInputService:IsKeyDown(K.RightShift) + local alt = UserInputService:IsKeyDown(K.LeftAlt) or UserInputService:IsKeyDown(K.RightAlt) + io:AddKeyEvent(ImGuiMod_Ctrl, ctrl) + io:AddKeyEvent(ImGuiMod_Shift, shift) + io:AddKeyEvent(ImGuiMod_Alt, alt) + io:AddKeyEvent(ImGuiMod_Super, UserInputService:IsKeyDown(K.LeftSuper) or UserInputService:IsKeyDown(K.RightSuper)) + return ctrl, shift, alt +end + +--- @return table? +function ImGui_ImplRoblox_GetBackendData() + return ImGui.GetCurrentContext() and ImGui.GetIO().BackendPlatformUserData or nil +end + +local function ImGui_ImplRoblox_UpdateMonitors(w, h) + local platform_io = ImGui.GetPlatformIO() + platform_io.Monitors:resize(0) + + local imgui_monitor = ImGuiPlatformMonitor() + ImVec2_Copy(imgui_monitor.MainSize, ImVec2(w, h)) + ImVec2_Copy(imgui_monitor.WorkSize, ImVec2(w, h)) + + platform_io.Monitors:push_back(imgui_monitor) +end + +--------------------------------------------------------- +-- PLATFORM DATA & CALLBACKS +--------------------------------------------------------- + +-- Games can't touch the OS clipboard, so copy/paste only works inside ImGui +local clipboard = "" +local function ImGui_ImplRoblox_PlatformSetClipboardText(ctx, text) clipboard = text end +local function ImGui_ImplRoblox_PlatformGetClipboardText(ctx) return clipboard end + +--------------------------------------------------------- +-- FILE SYSTEM (in-memory, Roblox has no file access) +--------------------------------------------------------- + +local VFS = {} -- path -> string of raw bytes + +--- Registers a file so ImGui can load it, e.g. ImGui_ImplRoblox.AddFile("fonts/MyFont.ttf", bytes) +--- then io.Fonts:AddFontFromFileTTF("fonts/MyFont.ttf", 16) +local function ImGui_ImplRoblox_AddFile(path, bytes) VFS[path] = bytes end + +for path, hex in pairs(IM_INCLUDE("imgui_impl_roblox_fonts.lua")) do + VFS[path] = hex:gsub("%s", ""):gsub("%x%x", function(h) return string.char(tonumber(h, 16)) end) +end + +function ImStd.ImFileOpen(filename, mode) + local data = VFS[filename] + return data and { Data = data, Pos = 0 } or nil +end + +function ImStd.ImFileClose(f) end + +function ImStd.ImFileGetSize(f) return #f.Data end + +function ImStd.ImFileRead(f, data, count) + local s, pos = f.Data, f.Pos + count = min(count, #s - pos) + for i = 1, count do data[i] = string.byte(s, pos + i) end + f.Pos = pos + count + return count +end + +function ImStd.ImFileLoadToMemory(filename, mode) + local f = ImStd.ImFileOpen(filename, mode) + if not f or #f.Data == 0 then return end + local file_data = {} + local size = ImStd.ImFileRead(f, file_data, #f.Data) + return file_data, size +end + +--------------------------------------------------------- +-- TEXTURE MANAGEMENT +--------------------------------------------------------- + +-- Copies a region of ImTextureData pixels (1-based byte table) into our RGBA8 buffer +local function CopyTexturePixels(tex, dst, x, y, w, h) + local bpp, tex_w = tex.BytesPerPixel, tex.Width + for row = 0, h - 1 do + local src, src_base = tex:GetPixelsAt(x, y + row) + local dst_off = ((y + row) * tex_w + x) * 4 + if bpp == 4 then + for i = 0, w - 1 do + local s = src_base + i * 4 + writeu32(dst, dst_off + i * 4, src[s] + src[s + 1] * 256 + src[s + 2] * 65536 + src[s + 3] * 16777216) + end + else -- Alpha8: white with alpha + for i = 0, w - 1 do + writeu32(dst, dst_off + i * 4, 16777215 + src[src_base + i] * 16777216) + end + end + end +end + +function ImGui_ImplRoblox_UpdateTexture(tex) + local bd = ImGui_ImplRoblox_GetBackendData() + if tex.Status == ImTextureStatus.WantCreate then + local t = { Buffer = buffer.create(tex.Width * tex.Height * 4), Width = tex.Width, Height = tex.Height } + CopyTexturePixels(tex, t.Buffer, 0, 0, tex.Width, tex.Height) + + bd.TextureCount = bd.TextureCount + 1 + bd.Textures[bd.TextureCount] = t + tex.BackendUserData = bd.TextureCount + tex:SetTexID(bd.TextureCount) + tex:SetStatus(ImTextureStatus.OK) + elseif tex.Status == ImTextureStatus.WantUpdates then + local t = bd.Textures[tex.BackendUserData] + IM_ASSERT(t ~= nil) + for _, r in tex.Updates:iter() do + CopyTexturePixels(tex, t.Buffer, r.x, r.y, r.w, r.h) + end + tex:SetStatus(ImTextureStatus.OK) + elseif tex.Status == ImTextureStatus.WantDestroy then + if tex.BackendUserData then + bd.Textures[tex.BackendUserData] = nil + tex.BackendUserData = nil + end + tex:SetTexID(ImTextureID_Invalid) + tex:SetStatus(ImTextureStatus.Destroyed) + end +end + +--------------------------------------------------------- +-- RENDERING (software rasterizer into the canvas buffer) +--------------------------------------------------------- +-- Buffer layout: 4 bytes per pixel, R G B A, row-major, 0-based offsets. ImU32 colours are already R | G<<8 | B<<16 | A<<24. +-- Blending is non-premultiplied "over" with a transparent (alpha 0) background, so the game stays visible behind ImGui. + +local buf, buf_w -- current canvas buffer/width, set at the start of RenderDrawData + +-- Blends one pixel (r, g, b, a are 0..255) +local function BlendPixel(o, r, g, b, a) + if a >= 255 then + writeu32(buf, o, floor(r + 0.5) + floor(g + 0.5) * 256 + floor(b + 0.5) * 65536 + 4278190080) + return + end + if a <= 0 then return end + local da = readu8(buf, o + 3) + if da == 0 then + writeu32(buf, o, floor(r + 0.5) + floor(g + 0.5) * 256 + floor(b + 0.5) * 65536 + floor(a + 0.5) * 16777216) + elseif da == 255 then + local sa = a / 255 + local dr, dg, db = readu8(buf, o), readu8(buf, o + 1), readu8(buf, o + 2) + writeu8(buf, o, dr + (r - dr) * sa + 0.5) + writeu8(buf, o + 1, dg + (g - dg) * sa + 0.5) + writeu8(buf, o + 2, db + (b - db) * sa + 0.5) + else + local sa = a / 255 + local k = (da / 255) * (1 - sa) + local oa = sa + k + writeu8(buf, o, (r * sa + readu8(buf, o) * k) / oa + 0.5) + writeu8(buf, o + 1, (g * sa + readu8(buf, o + 1) * k) / oa + 0.5) + writeu8(buf, o + 2, (b * sa + readu8(buf, o + 2) * k) / oa + 0.5) + writeu8(buf, o + 3, oa * 255 + 0.5) + end +end + +-- Fills pixels [x0, x1) of row y with one colour +local function FillSpan(y, x0, x1, r, g, b, a) + if a <= 0 then return end + local o = (y * buf_w + x0) * 4 + if a >= 255 then + local packed = floor(r + 0.5) + floor(g + 0.5) * 256 + floor(b + 0.5) * 65536 + 4278190080 + for x = 0, x1 - x0 - 1 do writeu32(buf, o + x * 4, packed) end + else + for x = 0, x1 - x0 - 1 do BlendPixel(o + x * 4, r, g, b, a) end + end +end + +local function UnpackColor(col) + return col % 256, floor(col / 256) % 256, floor(col / 65536) % 256, floor(col / 16777216) % 256 +end + +-- Nearest texel at (u, v) as r, g, b, a (0..255) +local function SampleTexture(t, u, v) + local tw, th = t.Width, t.Height + local tx, ty = floor(u * tw), floor(v * th) + if tx < 0 then tx = 0 elseif tx >= tw then tx = tw - 1 end + if ty < 0 then ty = 0 elseif ty >= th then ty = th - 1 end + local o = (ty * tw + tx) * 4 + local tb = t.Buffer + return readu8(tb, o), readu8(tb, o + 1), readu8(tb, o + 2), readu8(tb, o + 3) +end + +-- Axis aligned, single colour quad (rects, glyphs, images). Pixel centers inside [x0, x1) x [y0, y1) are drawn. +local function DrawRect(x0, y0, x1, y1, u0, v0, u1, v1, col, t, cx0, cy0, cx1, cy1) + local r, g, b, a = UnpackColor(col) + if a == 0 then return end + local px0, py0 = max(ceil(x0 - 0.5), cx0), max(ceil(y0 - 0.5), cy0) + local px1, py1 = min(ceil(x1 - 0.5), cx1), min(ceil(y1 - 0.5), cy1) + if px0 >= px1 or py0 >= py1 then return end + + if not t or (u0 == u1 and v0 == v1) then + if t then + local tr, tg, tb, ta = SampleTexture(t, u0, v0) + r, g, b, a = r * tr / 255, g * tg / 255, b * tb / 255, a * ta / 255 + end + for y = py0, py1 - 1 do FillSpan(y, px0, px1, r, g, b, a) end + return + end + + local du, dv = (u1 - u0) / (x1 - x0), (v1 - v0) / (y1 - y0) + local tw, th, tbuf = t.Width, t.Height, t.Buffer + local r255, g255, b255, a255 = r / 255, g / 255, b / 255, a / 255 + for y = py0, py1 - 1 do + local ty = floor((v0 + (y + 0.5 - y0) * dv) * th) + if ty < 0 then ty = 0 elseif ty >= th then ty = th - 1 end + local trow = ty * tw + local o = (y * buf_w + px0) * 4 + for x = px0, px1 - 1 do + local tx = floor((u0 + (x + 0.5 - x0) * du) * tw) + if tx < 0 then tx = 0 elseif tx >= tw then tx = tw - 1 end + local to = (trow + tx) * 4 + local ta = readu8(tbuf, to + 3) + if ta > 0 then + BlendPixel(o, readu8(tbuf, to) * r255, readu8(tbuf, to + 1) * g255, readu8(tbuf, to + 2) * b255, ta * a255) + end + o = o + 4 + end + end +end + +-- Generic triangle: per-vertex colour + uv, top-left fill rule, clipped to [cx0, cx1) x [cy0, cy1) +local function DrawTriangle(va, vb, vc, t, cx0, cy0, cx1, cy1, ox, oy) + local x0, y0 = va[1][1] - ox, va[1][2] - oy + local x1, y1 = vb[1][1] - ox, vb[1][2] - oy + local x2, y2 = vc[1][1] - ox, vc[1][2] - oy + local area = (x1 - x0) * (y2 - y0) - (y1 - y0) * (x2 - x0) + if area == 0 then return end + if area < 0 then -- make the winding consistent so "inside" means all edge functions >= 0 + vb, vc = vc, vb + x1, y1, x2, y2 = x2, y2, x1, y1 + area = -area + end + + local minx, maxx = max(floor(min(x0, x1, x2)), cx0), min(ceil(max(x0, x1, x2)), cx1 - 1) + local miny, maxy = max(floor(min(y0, y1, y2)), cy0), min(ceil(max(y0, y1, y2)), cy1 - 1) + if minx > maxx or miny > maxy then return end + + -- Edge functions E(p) = A*px + B*py + C, w0 is opposite va, w1 opposite vb, w2 opposite vc + local A0, B0 = y1 - y2, x2 - x1; local C0 = -(A0 * x1 + B0 * y1) + local A1, B1 = y2 - y0, x0 - x2; local C1 = -(A1 * x2 + B1 * y2) + local A2, B2 = y0 - y1, x1 - x0; local C2 = -(A2 * x0 + B2 * y0) + local tl0 = A0 > 0 or (A0 == 0 and B0 > 0) + local tl1 = A1 > 0 or (A1 == 0 and B1 > 0) + local tl2 = A2 > 0 or (A2 == 0 and B2 > 0) + + local inv = 1 / area + local ra, ga, ba, aa = UnpackColor(va[3]) + local rb, gb, bb, ab = UnpackColor(vb[3]) + local rc, gc, bc, ac = UnpackColor(vc[3]) + local ua, vva, ub, vvb, uc, vvc = va[2][1], va[2][2], vb[2][1], vb[2][2], vc[2][1], vc[2][2] + + local textured = t and not (ua == ub and ua == uc and vva == vvb and vva == vvc) + if t and not textured then -- constant uv (e.g. the atlas white pixel): fold the texel into the vertex colours + local tr, tg, tb, ta = SampleTexture(t, ua, vva) + ra, ga, ba, aa = ra * tr / 255, ga * tg / 255, ba * tb / 255, aa * ta / 255 + rb, gb, bb, ab = rb * tr / 255, gb * tg / 255, bb * tb / 255, ab * ta / 255 + rc, gc, bc, ac = rc * tr / 255, gc * tg / 255, bc * tb / 255, ac * ta / 255 + end + local flat = not textured and ra == rb and ra == rc and ga == gb and ga == gc and ba == bb and ba == bc and aa == ab and aa == ac + if flat and aa <= 0 then return end + + for y = miny, maxy do + local py = y + 0.5 + -- Narrow the x range of this row using the edges (expanded by one pixel, exact test below) + local xl, xr = minx, maxx + local e0, e1, e2 = B0 * py + C0, B1 * py + C1, B2 * py + C2 + if A0 ~= 0 then local xe = -e0 / A0 - 0.5; if A0 > 0 then xl = max(xl, floor(xe)) else xr = min(xr, ceil(xe)) end end + if A1 ~= 0 then local xe = -e1 / A1 - 0.5; if A1 > 0 then xl = max(xl, floor(xe)) else xr = min(xr, ceil(xe)) end end + if A2 ~= 0 then local xe = -e2 / A2 - 0.5; if A2 > 0 then xl = max(xl, floor(xe)) else xr = min(xr, ceil(xe)) end end + + local row = y * buf_w + for x = xl, xr do + local px = x + 0.5 + local w0, w1, w2 = A0 * px + e0, A1 * px + e1, A2 * px + e2 + if (w0 > 0 or (w0 == 0 and tl0)) and (w1 > 0 or (w1 == 0 and tl1)) and (w2 > 0 or (w2 == 0 and tl2)) then + local o = (row + x) * 4 + if flat then + BlendPixel(o, ra, ga, ba, aa) + else + w0, w1, w2 = w0 * inv, w1 * inv, w2 * inv + local r = w0 * ra + w1 * rb + w2 * rc + local g = w0 * ga + w1 * gb + w2 * gc + local b = w0 * ba + w1 * bb + w2 * bc + local a = w0 * aa + w1 * ab + w2 * ac + if textured then + local tr, tg, tb, ta = SampleTexture(t, w0 * ua + w1 * ub + w2 * uc, w0 * vva + w1 * vvb + w2 * vvc) + r, g, b, a = r * tr / 255, g * tg / 255, b * tb / 255, a * ta / 255 + end + BlendPixel(o, r, g, b, a) + end + end + end + end +end + +-- Quads emitted by PrimRect/PrimRectUV/RenderText use indices (a, b, c, a, c, d) with a=TL, b=TR, c=BR, d=BL. +-- When such a quad is axis aligned with one colour it is drawn with the much cheaper DrawRect. +local function TryDrawRect(va, vb, vc, vd, t, cx0, cy0, cx1, cy1, ox, oy) + local pa, pb, pc, pd = va[1], vb[1], vc[1], vd[1] + if not (pa[2] == pb[2] and pb[1] == pc[1] and pc[2] == pd[2] and pd[1] == pa[1] and pa[1] < pb[1] and pa[2] < pd[2]) then return false end + local col = va[3] + if vb[3] ~= col or vc[3] ~= col or vd[3] ~= col then return false end + local ta, tb, tc, td = va[2], vb[2], vc[2], vd[2] + if not (tb[1] == tc[1] and tb[2] == ta[2] and td[1] == ta[1] and td[2] == tc[2]) then return false end + DrawRect(pa[1] - ox, pa[2] - oy, pc[1] - ox, pc[2] - oy, ta[1], ta[2], tc[1], tc[2], col, t, cx0, cy0, cx1, cy1) + return true +end + +function ImGui_ImplRoblox_RenderDrawData(draw_data) + local bd = ImGui_ImplRoblox_GetBackendData() + local canvas = bd.Canvas + + if draw_data.Textures ~= nil then + for _, tex in draw_data.Textures:iter() do + if tex.Status ~= ImTextureStatus.OK then + ImGui_ImplRoblox_UpdateTexture(tex) + end + end + end + + canvas:Clear() + buf, buf_w = canvas.Buffer, canvas.CurrentResX + local buf_h = canvas.CurrentResY + local ox, oy = draw_data.DisplayPos.x, draw_data.DisplayPos.y + + if draw_data.DisplaySize.x > 0.0 and draw_data.DisplaySize.y > 0.0 then + for _, draw_list in draw_data.CmdLists:iter() do + local vtx, idx = draw_list.VtxBuffer.Data, draw_list.IdxBuffer.Data + for _, pcmd in draw_list.CmdBuffer:iter() do + if pcmd.UserCallback ~= nil then + pcmd.UserCallback(draw_list, pcmd) + elseif pcmd.ElemCount > 0 then + local clip = pcmd.ClipRect + local cx0, cy0 = max(floor(clip.x - ox), 0), max(floor(clip.y - oy), 0) + local cx1, cy1 = min(floor(clip.z - ox), buf_w), min(floor(clip.w - oy), buf_h) + if cx1 > cx0 and cy1 > cy0 then + local t = bd.Textures[pcmd:GetTexID()] + local vo = pcmd.VtxOffset + local i, last = pcmd.IdxOffset + 1, pcmd.IdxOffset + pcmd.ElemCount + while i <= last do + local ia, ic = idx[i], idx[i + 2] + local va, vb, vc = vtx[vo + ia], vtx[vo + idx[i + 1]], vtx[vo + ic] + if i + 5 <= last and idx[i + 3] == ia and idx[i + 4] == ic + and TryDrawRect(va, vb, vc, vtx[vo + idx[i + 5]], t, cx0, cy0, cx1, cy1, ox, oy) then + i = i + 6 + else + DrawTriangle(va, vb, vc, t, cx0, cy0, cx1, cy1, ox, oy) + i = i + 3 + end + end + end + end + end + end + end + + canvas:Render() +end + +--------------------------------------------------------- +-- CORE LIFECYCLE +--------------------------------------------------------- + +-- Canvas resolution for a given screen size (capped by MAX_CANVAS_SIZE, aspect ratio kept) +local function GetCanvasSize(screen) + local scale = max(1, screen.X / MAX_CANVAS_SIZE, screen.Y / MAX_CANVAS_SIZE) + return max(1, floor(screen.X / scale)), max(1, floor(screen.Y / scale)) +end + +--- @param CanvasDraw table # require(path.to.CanvasDraw) +--- @param parent Instance? # where the ScreenGui goes, defaults to the local player's PlayerGui +function ImGui_ImplRoblox_Init(CanvasDraw, parent) + assert(CanvasDraw, "ImGui_ImplRoblox.Init: pass the CanvasDraw module, e.g. Init(require(ReplicatedStorage.CanvasDraw))") + local io = ImGui.GetIO() + + local gui = Instance.new("ScreenGui") + gui.Name = "ImGui" + gui.IgnoreGuiInset = true -- so GetMouseLocation() and the canvas share the same origin + gui.ResetOnSpawn = false + gui.DisplayOrder = 1000 + gui.Parent = parent or Players.LocalPlayer:WaitForChild("PlayerGui") + + local frame = Instance.new("Frame") + frame.Size = UDim2.fromScale(1, 1) + frame.BackgroundTransparency = 1 + frame.Parent = gui + + local screen = gui.AbsoluteSize + if screen.X < 1 or screen.Y < 1 then screen = workspace.CurrentCamera.ViewportSize end + local w, h = GetCanvasSize(screen) + + local canvas = CanvasDraw.new(frame, Vector2.new(w, h), Color3.new(0, 0, 0)) + canvas.AutoRender = false + canvas:SetStretchToFit(true) + canvas:SetClearRGBA(0, 0, 0, 0) + canvas:Clear() + + local bd = { + Time = os.clock(), Gui = gui, Canvas = canvas, Connections = {}, + Textures = {}, TextureCount = 0, MouseX = -1, MouseY = -1, + } + io.BackendPlatformUserData = bd + + io.BackendFlags = bit32.bor(io.BackendFlags, ImGuiBackendFlags.RendererHasTextures, ImGuiBackendFlags.RendererHasVtxOffset) + + local platform_io = ImGui.GetPlatformIO() + platform_io.Platform_SetClipboardTextFn = ImGui_ImplRoblox_PlatformSetClipboardText + platform_io.Platform_GetClipboardTextFn = ImGui_ImplRoblox_PlatformGetClipboardText + + ImGui_ImplRoblox_UpdateMonitors(w, h) + + local function connect(signal, fn) table.insert(bd.Connections, signal:Connect(fn)) end + + connect(UserInputService.InputBegan, function(input, game_processed) + local io = ImGui.GetIO() + local button = MOUSE_BUTTONS[input.UserInputType] + if button then + io:AddMouseSourceEvent(ImGuiMouseSource.Mouse) + io:AddMouseButtonEvent(button, true) + elseif input.UserInputType == Enum.UserInputType.Keyboard and not game_processed then + local ctrl, shift, alt = ImGui_ImplRoblox_UpdateKeyModifiers() + local key = KEY_MAP[input.KeyCode] + if key then io:AddKeyEvent(key, true) end + + -- Text: printable ASCII keys, skipped while Ctrl/Alt are held (shortcuts) + local v = input.KeyCode.Value + if v >= 32 and v < 127 and not (ctrl or alt) then + local c = string.char(v) + if shift then c = SHIFTED[c] or c:upper() end + io:AddInputCharacter(string.byte(c)) + end + end + end) + + connect(UserInputService.InputEnded, function(input, game_processed) + local io = ImGui.GetIO() + local button = MOUSE_BUTTONS[input.UserInputType] + if button then + io:AddMouseButtonEvent(button, false) + elseif input.UserInputType == Enum.UserInputType.Keyboard then + ImGui_ImplRoblox_UpdateKeyModifiers() + local key = KEY_MAP[input.KeyCode] + if key then io:AddKeyEvent(key, false) end + end + end) + + connect(UserInputService.InputChanged, function(input, game_processed) + if input.UserInputType == Enum.UserInputType.MouseWheel then + ImGui.GetIO():AddMouseWheelEvent(0, input.Position.Z) + end + end) + + connect(UserInputService.WindowFocused, function() ImGui.GetIO():AddFocusEvent(true) end) + connect(UserInputService.WindowFocusReleased, function() ImGui.GetIO():AddFocusEvent(false) end) +end + +function ImGui_ImplRoblox_Shutdown() + local io = ImGui.GetIO() + local bd = ImGui_ImplRoblox_GetBackendData() + for _, c in ipairs(bd.Connections) do c:Disconnect() end + bd.Canvas:Destroy() + bd.Gui:Destroy() + + io.BackendPlatformUserData = nil + io.BackendFlags = bit32.band(io.BackendFlags, bit32.bnot(bit32.bor( + ImGuiBackendFlags.RendererHasTextures, + ImGuiBackendFlags.RendererHasVtxOffset + ))) +end + +function ImGui_ImplRoblox_NewFrame() + local io = ImGui.GetIO() + local bd = ImGui_ImplRoblox_GetBackendData() + local canvas = bd.Canvas + + -- Follow screen size changes + local screen = bd.Gui.AbsoluteSize + if screen.X >= 1 and screen.Y >= 1 then + local w, h = GetCanvasSize(screen) + if w ~= canvas.CurrentResX or h ~= canvas.CurrentResY then + canvas:Resize(Vector2.new(w, h)) + ImGui_ImplRoblox_UpdateMonitors(w, h) + end + end + local w, h = canvas.CurrentResX, canvas.CurrentResY + ImVec2_CopyV(io.DisplaySize, w, h) + + local current_time = os.clock() + io.DeltaTime = (current_time > bd.Time) and (current_time - bd.Time) or (1.0 / 60.0) + bd.Time = current_time + + -- Mouse position: screen pixels -> canvas pixels (the canvas is stretched over the whole screen) + local m = UserInputService:GetMouseLocation() + local mx, my = m.X * w / max(screen.X, 1), m.Y * h / max(screen.Y, 1) + if mx ~= bd.MouseX or my ~= bd.MouseY then + bd.MouseX, bd.MouseY = mx, my + io:AddMouseSourceEvent(ImGuiMouseSource.Mouse) + io:AddMousePosEvent(mx, my) + end +end + +ImGui_ImplRoblox = { + Init = ImGui_ImplRoblox_Init, + Shutdown = ImGui_ImplRoblox_Shutdown, + NewFrame = ImGui_ImplRoblox_NewFrame, + RenderDrawData = ImGui_ImplRoblox_RenderDrawData, + AddFile = ImGui_ImplRoblox_AddFile, +} + +return true -- [Roblox] ModuleScripts must return exactly one value diff --git a/imgui/backend/imgui_impl_roblox_fonts.lua b/imgui/backend/imgui_impl_roblox_fonts.lua new file mode 100644 index 0000000..844ec2c --- /dev/null +++ b/imgui/backend/imgui_impl_roblox_fonts.lua @@ -0,0 +1,775 @@ +-- [Roblox] Embedded copies of resource/fonts/*.ttf (Roblox can't read files). Generated: hex encoded bytes. +-- Add your own fonts the same way, or at runtime with ImGui_ImplRoblox.AddFile(path, bytes). +return { + ["resource/fonts/ProggyClean.ttf"] = [[ +00010000000c0080000300404f532f3288eb7490000001480000004e636d617002122375000003a0000001526376742000000000000004fc00000002676c796612af8956000007040000928068656164 +d79166d3000000cc0000003668686561084201c30000010400000024686d74788a007e8000000198000002066c6f63618c73b0d800000500000002046d61787001ae00da00000128000000206e616d65 +2559bb96000099840000019e706f7374a6ac83ef00009b24000005d27072657069020112000004f40000000800010000000100003c55e9d55f0f3cf50003080000000000b767778400000000bd92a6d7 +0000fe80038005000000000300020000000000000001000004c0fe40000003800000000003800001000000000000000000000000000000020001000001010090002400000000000200080040000a0000 +00760008000000000000038001900005000002bc028a0000008f02bc028a000001c50032020000000000040900000000000000000000000000000000000000000000416c74730040000020ac08000000 +0000050001800000038000000380038003800380038003800380038003800380038003800380038003800380038003800380038003800380038003800380038003800380038003800380038003800380 +0180010000000080000000800180010001000080008000800080010000800080008000800080008000800080008000800080018000800000008000800080000000800080008000800080008000800080 +0100008000800080000000800080008000800080008000000080000000000080000000800100008001000080000001000080008000800080008000800080008001000080008001000000008000800080 +0080008000800100008000800000008000800080008001800080000003800080038001000080010000800080008000800080008000800000038000800380038001800100010000800080008000000080 +0000008000800000038000800000038001800080008000000000018000800100000000800080008003800000000000800080008000800180000000800100018000800080008000800080000000800080 +0080008000800080008000000080008000800080008001000100010001000000008000800080008000800080008000800080008000800080000000800000008000800080008000800080000000800080 +00800080008001000100010001000080008000800080008000800080008000800080008000800080008000800080000000000003000000000000001c000100000000004c000300010000001c00040030 +00000008000800020000007f00ff20acffff00000000008120acffff00010001dfd500010000000000000000000001060000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000810000000000000000000000000000000000000000000000000000000000000000000000000000b100018db801ff8500000000 +000000c600c600c600c600c600c600c600c600c600c600c600c600c600c600c600c600c600c600c600c600c600c600c600c600c600c600c600c600c600c600c600c600c600c600f4011c019e02140288 +02fc03140358039c03de041404320450046204a20516056605bc0612067406d60738077e07ec084e086c089608d00910094a09880a160a800b040b560bc80c2e0c820cea0d5e0da40dea0e500e960f28 +0fb01012107410e0115211b61204126e12c4134c13ac13f6145814ae14ea1540158015a615b81612167e16c61734178e17e0185618ba18ee1936199619d41a481a9c1af01b5c1bc81c041c4c1c961cea +1d2a1d921dd21e401e8e1ee01f241f761fa61fa620102010202e208a20b220c821142174219821ee22622286230c230c238023802380239823b023d82400244a2468249024ae25062560258225f825f8 +265826aa26aa26d82740279a280a286828a8290e292029b829f82a362a602a602b022b2a2b5e2bac2be62c202c342c9a2d282d5c2d782daa2de82e262ea62f262fb62ff4305e30c8313e31b4321e329e +331e338233ee345c34ce353a358635d43626367236e6377637d8383a38a63912397439ae3a2e3a9a3b063b7c3be83c3a3c963d223d863dec3e563ec63f2a3f9a4012406a40d0413641a242084240427a +42b842f0436243cc442a448a44ee455845b645e2465446b44714477a47da485448c6494000240000fe800380050000030007000b000f00130017001b001f00230027002b002f00330037003b003f0043 +0047004b004f00530057005b005f00630067006b006f00730077007b007f00830087008b008f000011353315313533153135331531353315313533153135331531353315053533152135331505353315 +2135331505353315213533150535331521353315053533152135331505353315213533150535331521353315053533152135331505353315213533150535331521353315053533152135331505353315 +31353315313533153135331531353315313533153135331580808080808080fc8080028080fc8080028080fc8080028080fc8080028080fc8080028080fc8080028080fc8080028080fc8080028080fc +8080028080fc8080028080fc8080028080fc8080808080808080048080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080 +80808080808080808080808080808080808080808080808080808080808080800007018000000200040000030007000b000f00130017001b000001353315073533150735331507353315073533150735 +33150335331501808080808080808080808080808003808080808080808080808080808080808080ff0080800006010003000280048000030007000b000f001300170000013533153335331505353315 +3335331505353315333533150100808080fe80808080fe8080808004008080808080808080808080808080000018000000000380040000030007000b000f00130017001b001f00230027002b002f0033 +0037003b003f00430047004b004f00530057005b005f00000135331533353315053533153335331505353315313533153135331531353315313533153135331505353315333533150535331533353315 +053533153135331531353315313533153135331531353315053533153335331505353315333533150180808080fe80808080fd80808080808080fd80808080fe80808080fd80808080808080fd808080 +80fe808080800380808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080800000150080ff800300040000030007000b +000f00130017001b001f00230027002b002f00330037003b003f00430047004b004f00530000013533150535331531353315313533153135331505353315333533150535331533353315053533153135 +331531353315053533153335331505353315333533150535331531353315313533153135331505353315018080ff0080808080fd80808080fe80808080ff00808080ff00808080fe80808080fd808080 +8080ff0080038080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080800000000014000000000380040000030007000b000f0013 +0017001b001f00230027002b002f00330037003b003f00430047004b004f0000133533152135331505353315333533153335331505353315333533153335331505353315333533150735331533353315 +05353315333533153335331505353315333533153335331505353315213533158080018080fd008080808080fd808080808080fe0080808080808080fe008080808080fd808080808080fd0080018080 +038080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080800000000014008000000380040000030007000b000f00130017001b001f0023 +0027002b002f00330037003b003f00430047004b004f00000135331531353315053533152135331505353315213533150535331531353315213533150535331521353315333533150535331521353315 +05353315213533150535331531353315313533153335331501008080fe8080010080fe0080010080fe808080010080fd00800100808080fd0080018080fd8080018080fe008080808080038080808080 +80808080808080808080808080808080808080808080808080808080808080808080808080808080808080000003018003000200048000030007000b0000013533150735331507353315018080808080 +800400808080808080808000000b0100ff000280048000030007000b000f00130017001b001f00230027002b0000013533150535331507353315053533150735331507353315073533150735331d0135 +33150735331d01353315020080ff00808080ff00808080808080808080808080800400808080808080808080808080808080808080808080808080808080808080808000000b0100ff00028004800003 +0007000b000f00130017001b001f00230027002b00000135331d013533150735331d01353315073533150735331507353315073533150535331507353315053533150100808080808080808080808080 +80ff00808080ff00800400808080808080808080808080808080808080808080808080808080808080808000000b008000800300030000030007000b000f00130017001b001f00230027002b00000135 +331505353315333533153335331505353315313533153135331505353315333533153335331505353315018080fe808080808080fe00808080fe008080808080fe808002808080808080808080808080 +808080808080808080808080808080000009008000800300030000030007000b000f00130017001b001f0023000001353315073533150535331531353315313533153135331531353315053533150735 +33150180808080fe808080808080fe808080800280808080808080808080808080808080808080808080800000040080ff000180010000030007000b000f000025353315073533150735331505353315 +01008080808080ff008080808080808080808080808000000005008001800300020000030007000b000f0013000013353315313533153135331531353315313533158080808080800180808080808080 +80808080000201000000018001000003000700002535331507353315010080808080808080808000000a0080ff800300048000030007000b000f00130017001b001f0023002700000135331507353315 +05353315073533150535331507353315053533150735331505353315073533150280808080ff00808080ff00808080ff00808080ff008080800400808080808080808080808080808080808080808080 +80808080808080800014008000000300040000030007000b000f00130017001b001f00230027002b002f00330037003b003f00430047004b004f00000135331531353315313533150535331521353315 +0535331521353315053533153335331533353315053533153335331533353315053533152135331505353315213533150535331531353315313533150100808080fe0080018080fd8080018080fd8080 +80808080fd808080808080fd8080018080fd8080018080fe0080808003808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080000000 +000e008000000300040000030007000b000f00130017001b001f00230027002b002f00330037000001353315053533153135331505353315333533150735331507353315073533150735331505353315 +31353315313533153135331531353315018080ff008080fe808080808080808080808080fe80808080808003808080808080808080808080808080808080808080808080808080808080808080808080 +000f008000000300040000030007000b000f00130017001b001f00230027002b002f00330037003b00000135331531353315313533150535331521353315073533150535331505353315053533150535 +331507353315313533153135331531353315313533150100808080fe00800180808080ff0080ff0080ff0080ff0080808080808080038080808080808080808080808080808080808080808080808080 +808080808080808080808080000f008000000300040000030007000b000f00130017001b001f00230027002b002f00330037003b00000135331531353315313533150535331521353315073533150535 +33153135331d013533150735331505353315213533150535331531353315313533150100808080fe00800180808080fe808080808080fd8080018080fe00808080038080808080808080808080808080 +8080808080808080808080808080808080808080808080800011008000000380040000030007000b000f00130017001b001f00230027002b002f00330037003b003f0043000001353315053533153135 +33150535331533353315053533152135331505353315213533150535331531353315313533153135331531353315313533150535331507353315028080ff008080fe80808080fe0080010080fd808001 +8080fd80808080808080ff008080800380808080808080808080808080808080808080808080808080808080808080808080808080808080808000000012008000000300040000030007000b000f0013 +0017001b001f00230027002b002f00330037003b003f004300470000133533153135331531353315313533153135331505353315073533150735331531353315313533153135331d0135331507353315 +0535331521353315053533153135331531353315808080808080fd808080808080808080808080fd8080018080fe00808080038080808080808080808080808080808080808080808080808080808080 +808080808080808080808080808080000011008000000300040000030007000b000f00130017001b001f00230027002b002f00330037003b003f00430000013533153135331505353315053533150735 +331531353315313533153135331505353315213533150535331521353315053533152135331505353315313533153135331501808080fe8080ff00808080808080fe0080018080fd8080018080fd8080 +018080fe008080800380808080808080808080808080808080808080808080808080808080808080808080808080808080808000000c008000000300040000030007000b000f00130017001b001f0023 +0027002b002f00001335331531353315313533153135331531353315073533150535331507353315053533150735331505353315073533158080808080808080ff00808080ff00808080ff0080808003 +80808080808080808080808080808080808080808080808080808080808080800013008000000300040000030007000b000f00130017001b001f00230027002b002f00330037003b003f00430047004b +0000013533153135331531353315053533152135331505353315213533150535331531353315313533150535331521353315053533152135331505353315213533150535331531353315313533150100 +808080fe0080018080fd8080018080fe00808080fe0080018080fd8080018080fd8080018080fe0080808003808080808080808080808080808080808080808080808080808080808080808080808080 +8080808080808080808000000011008000000300040000030007000b000f00130017001b001f00230027002b002f00330037003b003f0043000001353315313533153135331505353315213533150535 +331521353315053533152135331505353315313533153135331531353315073533150535331505353315313533150100808080fe0080018080fd8080018080fd8080018080fe00808080808080ff0080 +fe80808003808080808080808080808080808080808080808080808080808080808080808080808080808080808080000004018000000200030000030007000b000f0000013533150735331503353315 +0735331501808080808080808002808080808080fe8080808080800000060080ff000180030000030007000b000f00130017000001353315073533150335331507353315073533150535331501008080 +80808080808080ff008002808080808080fe8080808080808080808080800000000a000000800300030000030007000b000f00130017001b001f00230027000001353315313533150535331531353315 +053533153135331d013533153135331d013533153135331502008080fe008080fe0080808080808002808080808080808080808080808080808080808080808080800000000c00800100038002800003 +0007000b000f00130017001b001f00230027002b002f000013353315313533153135331531353315313533153135331501353315313533153135331531353315313533153135331580808080808080fd +008080808080800200808080808080808080808080ff0080808080808080808080808000000a008000800380030000030007000b000f00130017001b001f002300270000133533153135331d01353315 +3135331d01353315313533150535331531353315053533153135331580808080808080fe008080fe0080800280808080808080808080808080808080808080808080808080000000000a008000000300 +040000030007000b000f00130017001b001f002300270000013533153135331531353315053533152135331507353315053533150535331507353315033533150100808080fe00800180808080ff0080 +ff00808080808003808080808080808080808080808080808080808080808080ff008080001a000000000380040000030007000b000f00130017001b001f00230027002b002f00330037003b003f0043 +0047004b004f00530057005b005f006300670000013533153135331531353315053533152135331505353315213533153135331533353315053533153335331533353315333533150535331533353315 +3335331533353315053533152135331531353315313533150535331d013533153135331531353315313533150100808080fe0080018080fd0080010080808080fc8080808080808080fc808080808080 +8080fc80800100808080fd808080808080038080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080800000 +0012008000000380040000030007000b000f00130017001b001f00230027002b002f00330037003b003f0043004700000135331531353315053533153135331505353315213533150535331521353315 +0535331531353315313533153135331505353315213533150535331521353315053533152135331501808080ff008080fe8080010080fe0080010080fe0080808080fd8080020080fd0080020080fd00 +800200800380808080808080808080808080808080808080808080808080808080808080808080808080808080808080800000000018008000000380040000030007000b000f00130017001b001f0023 +0027002b002f00330037003b003f00430047004b004f00530057005b005f0000133533153135331531353315313533150535331521353315053533152135331505353315313533153135331531353315 +3135331505353315213533150535331521353315053533152135331505353315313533153135331531353315313533158080808080fe0080018080fd8080018080fd808080808080fd8080020080fd00 +80020080fd0080020080fd0080808080800380808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080800000000e0080 +00000380040000030007000b000f00130017001b001f00230027002b002f00330037000001353315313533153135331505353315213533150535331507353315073533150735331d0135331521353315 +0535331531353315313533150180808080fe0080018080fd008080808080808080018080fe00808080038080808080808080808080808080808080808080808080808080808080808080808080800000 +0014008000000380040000030007000b000f00130017001b001f00230027002b002f00330037003b003f00430047004b004f000013353315313533153135331531353315053533152135331505353315 +213533150535331521353315053533152135331505353315213533150535331521353315053533153135331531353315313533158080808080fe0080018080fd8080020080fd0080020080fd00800200 +80fd0080020080fd0080018080fd808080808003808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080001300800000030004000003 +0007000b000f00130017001b001f00230027002b002f00330037003b003f00430047004b0000133533153135331531353315313533153135331505353315073533150735331531353315313533153135 +33150535331507353315073533150735331531353315313533153135331531353315808080808080fd808080808080808080fe0080808080808080808080800380808080808080808080808080808080 +8080808080808080808080808080808080808080808080808080808080800000000f008000000300040000030007000b000f00130017001b001f00230027002b002f00330037003b0000133533153135 +331531353315313533153135331505353315073533150735331531353315313533153135331505353315073533150735331507353315808080808080fd808080808080808080fe008080808080808003 +808080808080808080808080808080808080808080808080808080808080808080808080808000000012008000000380040000030007000b000f00130017001b001f00230027002b002f00330037003b +003f004300470000013533153135331531353315053533152135331505353315073533150735331521353315313533153135331505353315213533150535331521353315053533153135331531353315 +0180808080fe0080018080fd0080808080800100808080fd0080020080fd8080018080fe0080808003808080808080808080808080808080808080808080808080808080808080808080808080808080 +80808080800000000014008000000380040000030007000b000f00130017001b001f00230027002b002f00330037003b003f00430047004b004f00001335331521353315053533152135331505353315 +2135331505353315313533153135331531353315313533153135331505353315213533150535331521353315053533152135331505353315213533158080020080fd0080020080fd0080020080fd0080 +8080808080fd0080020080fd0080020080fd0080020080fd0080020080038080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080800000 +000c010000000280040000030007000b000f00130017001b001f00230027002b002f00000135331531353315313533150535331507353315073533150735331507353315073533150535331531353315 +313533150100808080ff008080808080808080808080ff00808080038080808080808080808080808080808080808080808080808080808080808080000c008000000280040000030007000b000f0013 +0017001b001f00230027002b002f000001353315313533153135331507353315073533150735331507353315073533150735331505353315313533153135331501008080808080808080808080808080 +80fe00808080038080808080808080808080808080808080808080808080808080808080808080000011008000000380040000030007000b000f00130017001b001f00230027002b002f00330037003b +003f0043000013353315213533150535331521353315053533152135331505353315333533150535331531353315313533150535331521353315053533152135331505353315213533158080020080fd +0080018080fd8080010080fe00808080fe80808080fe8080010080fe0080018080fd80800200800380808080808080808080808080808080808080808080808080808080808080808080808080808080 +80800000000c008000000300040000030007000b000f00130017001b001f00230027002b002f000013353315073533150735331507353315073533150735331507353315073533153135331531353315 +31353315313533158080808080808080808080808080808080808080038080808080808080808080808080808080808080808080808080808080808080000000001a000000000380040000030007000b +000f00130017001b001f00230027002b002f00330037003b003f00430047004b004f00530057005b005f0063006700001135331531353315213533153135331505353315313533152135331531353315 +053533153335331533353315333533150535331533353315333533153335331505353315213533152135331505353315213533152135331505353315213533150535331521353315808001808080fc80 +808001808080fc8080808080808080fc8080808080808080fc8080010080010080fc8080010080010080fc8080028080fc80800280800380808080808080808080808080808080808080808080808080 +8080808080808080808080808080808080808080808080808080808080808080808080000018008000000380040000030007000b000f00130017001b001f00230027002b002f00330037003b003f0043 +0047004b004f00530057005b005f000013353315313533152135331505353315313533152135331505353315333533152135331505353315333533152135331505353315213533153335331505353315 +2135331533353315053533152135331531353315053533152135331531353315808080018080fd008080018080fd00808080010080fd00808080010080fd00800100808080fd00800100808080fd0080 +01808080fd008001808080038080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080001000800000038004000003 +0007000b000f00130017001b001f00230027002b002f00330037003b003f0000013533153135331505353315213533150535331521353315053533152135331505353315213533150535331521353315 +0535331521353315053533153135331501808080fe8080010080fd8080020080fd0080020080fd0080020080fd0080020080fd8080010080fe8080800380808080808080808080808080808080808080 +8080808080808080808080808080808080808080800000000011008000000300040000030007000b000f00130017001b001f00230027002b002f00330037003b003f0043000013353315313533153135 +331531353315053533152135331505353315213533150535331521353315053533153135331531353315313533150535331507353315073533158080808080fe0080018080fd8080018080fd80800180 +80fd8080808080fe0080808080800380808080808080808080808080808080808080808080808080808080808080808080808080808080808000000000120080ff800380040000030007000b000f0013 +0017001b001f00230027002b002f00330037003b003f00430047000001353315313533150535331521353315053533152135331505353315213533150535331521353315053533152135331505353315 +213533150535331531353315333533150735331501808080fe8080010080fd8080020080fd0080020080fd0080020080fd0080020080fd8080010080fe80808080808080038080808080808080808080 +8080808080808080808080808080808080808080808080808080808080808080808000000014008000000380040000030007000b000f00130017001b001f00230027002b002f00330037003b003f0043 +0047004b004f0000133533153135331531353315313533150535331521353315053533152135331505353315213533150535331531353315313533153135331505353315213533150535331521353315 +05353315213533158080808080fe0080018080fd8080018080fd8080018080fd8080808080fe0080010080fe0080018080fd808002008003808080808080808080808080808080808080808080808080 +8080808080808080808080808080808080808080808080800012008000000380040000030007000b000f00130017001b001f00230027002b002f00330037003b003f0043004700000135331531353315 +313533153135331505353315213533150535331d013533153135331d013533153135331d01353315053533152135331505353315313533153135331531353315010080808080fd8080020080fd008080 +80808080fd0080020080fd8080808080038080808080808080808080808080808080808080808080808080808080808080808080808080808080808080000000000e000000000380040000030007000b +000f00130017001b001f00230027002b002f0033003700001135331531353315313533153135331531353315313533153135331505353315073533150735331507353315073533150735331507353315 +80808080808080fe008080808080808080808080808003808080808080808080808080808080808080808080808080808080808080808080808080000012008000000380040000030007000b000f0013 +0017001b001f00230027002b002f00330037003b003f00430047000013353315213533150535331521353315053533152135331505353315213533150535331521353315053533152135331505353315 +21353315053533153135331531353315313533158080020080fd0080020080fd0080020080fd0080020080fd0080020080fd0080020080fd0080020080fd808080808003808080808080808080808080 +8080808080808080808080808080808080808080808080808080808080808080000e000000000380040000030007000b000f00130017001b001f00230027002b002f0033003700001135331521353315 +05353315213533150535331521353315053533152135331505353315333533150535331533353315053533150735331580028080fc8080028080fd0080018080fd8080018080fe00808080fe80808080 +ff008080800380808080808080808080808080808080808080808080808080808080808080808080808000000018000000000380040000030007000b000f00130017001b001f00230027002b002f0033 +0037003b003f00430047004b004f00530057005b005f00001135331521353315053533152135331521353315053533152135331521353315053533153335331533353315333533150535331533353315 +3335331533353315053533153135331533353315313533150535331521353315053533152135331580028080fc8080010080010080fc8080010080010080fc8080808080808080fc8080808080808080 +fd008080808080fd8080018080fd808001808003808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808000100080 +00000380040000030007000b000f00130017001b001f00230027002b002f00330037003b003f000013353315213533150535331521353315053533152135331505353315313533150535331531353315 +0535331521353315053533152135331505353315213533158080020080fd0080020080fd8080010080fe808080ff008080fe8080010080fd8080020080fd008002008003808080808080808080808080 +80808080808080808080808080808080808080808080808080808080000c000000000380040000030007000b000f00130017001b001f00230027002b002f000011353315213533150535331521353315 +053533152135331505353315333533150535331507353315073533150735331580028080fc8080028080fd0080018080fe00808080ff0080808080808080038080808080808080808080808080808080 +808080808080808080808080808080000012008000000380040000030007000b000f00130017001b001f00230027002b002f00330037003b003f00430047000013353315313533153135331531353315 +3135331531353315073533150535331505353315053533150535331505353315073533153135331531353315313533153135331531353315808080808080808080ff0080ff0080ff0080ff0080ff0080 +80808080808080038080808080808080808080808080808080808080808080808080808080808080808080808080808080808080000f0100ff000280048000030007000b000f00130017001b001f0023 +0027002b002f00330037003b00000135331531353315313533150535331507353315073533150735331507353315073533150735331507353315073533150735331531353315313533150100808080fe +80808080808080808080808080808080808080808080040080808080808080808080808080808080808080808080808080808080808080808080808080808080000a0080ff800300048000030007000b +000f00130017001b001f002300270000133533150735331d013533150735331d013533150735331d013533150735331d0135331507353315808080808080808080808080808080800400808080808080 +808080808080808080808080808080808080808080808000000f0100ff000280048000030007000b000f00130017001b001f00230027002b002f00330037003b00000135331531353315313533150735 +331507353315073533150735331507353315073533150735331507353315073533150535331531353315313533150100808080808080808080808080808080808080808080fe80808080040080808080 +808080808080808080808080808080808080808080808080808080808080808080808080000a008001800300048000030007000b000f00130017001b001f002300270000013533150735331505353315 +333533150535331533353315053533152135331505353315213533150180808080ff00808080fe80808080fe0080018080fd808001808004008080808080808080808080808080808080808080808080 +8080000000070000ff800380000000030007000b000f00130017001b00001535331531353315313533153135331531353315313533153135331580808080808080808080808080808080808080808080 +000201000380020004800003000700000135331d013533150100808004008080808080000010008000000300030000030007000b000f00130017001b001f00230027002b002f00330037003b003f0000 +01353315313533153135331d01353315053533153135331531353315313533150535331521353315053533152135331505353315313533153135331531353315010080808080fe0080808080fd808001 +8080fd8080018080fe00808080800280808080808080808080808080808080808080808080808080808080808080808080808080800000000013008000000300048000030007000b000f00130017001b +001f00230027002b002f00330037003b003f00430047004b0000133533150735331507353315073533153135331531353315313533150535331521353315053533152135331505353315213533150535 +331521353315053533153135331531353315313533158080808080808080808080fe0080018080fd8080018080fd8080018080fd8080018080fd80808080800400808080808080808080808080808080 +8080808080808080808080808080808080808080808080808080808080808000000c008000000300030000030007000b000f00130017001b001f00230027002b002f0000013533153135331531353315 +0535331521353315053533150735331507353315213533150535331531353315313533150100808080fe0080018080fd808080808080018080fe00808080028080808080808080808080808080808080 +808080808080808080808080800000000013008000000300048000030007000b000f00130017001b001f00230027002b002f00330037003b003f00430047004b00000135331507353315073533150535 +331531353315313533153135331505353315213533150535331521353315053533152135331505353315213533150535331531353315313533153135331502808080808080fe0080808080fd80800180 +80fd8080018080fd8080018080fd8080018080fe008080808004008080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808000000000100080 +00000300030000030007000b000f00130017001b001f00230027002b002f00330037003b003f000001353315313533153135331505353315213533150535331531353315313533153135331531353315 +0535331507353315213533150535331531353315313533150100808080fe0080018080fd808080808080fd80808080018080fe0080808002808080808080808080808080808080808080808080808080 +80808080808080808080808080800000000e008000000300048000030007000b000f00130017001b001f00230027002b002f003300370000013533153135331531353315053533150735331505353315 +31353315313533153135331505353315073533150735331507353315073533150180808080fe00808080ff0080808080fe80808080808080808080040080808080808080808080808080808080808080 +808080808080808080808080808080808000000000150080fe800300030000030007000b000f00130017001b001f00230027002b002f00330037003b003f00430047004b004f00530000013533153135 +3315313533153135331505353315213533150535331521353315053533152135331505353315213533150535331531353315313533153135331507353315073533150535331531353315313533150100 +80808080fd8080018080fd8080018080fd8080018080fd8080018080fe008080808080808080fe0080808002808080808080808080808080808080808080808080808080808080808080808080808080 +808080808080808080808080808080000011008000000300048000030007000b000f00130017001b001f00230027002b002f00330037003b003f00430000133533150735331507353315073533153135 +33153135331531353315053533152135331505353315213533150535331521353315053533152135331505353315213533158080808080808080808080fe0080018080fd8080018080fd8080018080fd +8080018080fd80800180800400808080808080808080808080808080808080808080808080808080808080808080808080808080808080000008010000000200048000030007000b000f00130017001b +001f00000135331501353315313533150735331507353315073533150735331507353315018080ff0080808080808080808080808004008080fe80808080808080808080808080808080808080800000 +000c0080ff000280048000030007000b000f00130017001b001f00230027002b002f00000135331501353315313533150735331507353315073533150735331507353315073533150535331531353315 +31353315020080ff008080808080808080808080808080fe0080808004008080fe808080808080808080808080808080808080808080808080808080808080000010008000000300048000030007000b +000f00130017001b001f00230027002b002f00330037003b003f000013353315073533150735331507353315213533150535331521353315053533153335331505353315313533153135331505353315 +2135331505353315213533158080808080808080018080fd8080010080fe00808080fe80808080fe8080010080fe00800180800400808080808080808080808080808080808080808080808080808080 +80808080808080808080808080000000000a010000000200048000030007000b000f00130017001b001f0023002700000135331531353315073533150735331507353315073533150735331507353315 +0735331507353315010080808080808080808080808080808080808004008080808080808080808080808080808080808080808080808080808000000014000000000380030000030007000b000f0013 +0017001b001f00230027002b002f00330037003b003f00430047004b004f0000113533153135331531353315333533153135331505353315213533152135331505353315213533152135331505353315 +2135331521353315053533152135331521353315053533152135331521353315808080808080fd0080010080010080fc8080010080010080fc8080010080010080fc8080010080010080fc8080010080 +01008002808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080800000000e008000000300030000030007000b000f00130017001b001f0023 +0027002b002f00330037000013353315313533153135331531353315053533152135331505353315213533150535331521353315053533152135331505353315213533158080808080fe0080018080fd +8080018080fd8080018080fd8080018080fd808001808002808080808080808080808080808080808080808080808080808080808080808080800000000e008000000300030000030007000b000f0013 +0017001b001f00230027002b002f003300370000013533153135331531353315053533152135331505353315213533150535331521353315053533152135331505353315313533153135331501008080 +80fe0080018080fd8080018080fd8080018080fd8080018080fe00808080028080808080808080808080808080808080808080808080808080808080808080808000000000130080fe80030003000003 +0007000b000f00130017001b001f00230027002b002f00330037003b003f00430047004b0000133533153135331531353315313533150535331521353315053533152135331505353315213533150535 +331521353315053533153135331531353315313533150535331507353315073533158080808080fe0080018080fd8080018080fd8080018080fd8080018080fd8080808080fe00808080808002808080 +808080808080808080808080808080808080808080808080808080808080808080808080808080808080808000130080fe800300030000030007000b000f00130017001b001f00230027002b002f0033 +0037003b003f00430047004b0000013533153135331531353315313533150535331521353315053533152135331505353315213533150535331521353315053533153135331531353315313533150735 +33150735331507353315010080808080fd8080018080fd8080018080fd8080018080fd8080018080fe008080808080808080808002808080808080808080808080808080808080808080808080808080 +8080808080808080808080808080808080808080000a008000000300030000030007000b000f00130017001b001f00230027000013353315333533153135331505353315313533152135331505353315 +0735331507353315073533158080808080fe008080010080fd8080808080808080028080808080808080808080808080808080808080808080808080000d008000000300030000030007000b000f0013 +0017001b001f00230027002b002f00330000013533153135331531353315313533150535331d013533153135331d0135331d0135331505353315313533153135331531353315010080808080fd808080 +808080fd80808080800280808080808080808080808080808080808080808080808080808080808080800000000d010000000300040000030007000b000f00130017001b001f00230027002b002f0033 +00000135331507353315073533153135331531353315313533150535331507353315073533150735331d01353315313533153135331501008080808080808080fe008080808080808080808003808080 +8080808080808080808080808080808080808080808080808080808080808000000e008000000300030000030007000b000f00130017001b001f00230027002b002f0033003700001335331521353315 +0535331521353315053533152135331505353315213533150535331521353315053533153135331531353315313533158080018080fd8080018080fd8080018080fd8080018080fd8080018080fe0080 +80808002808080808080808080808080808080808080808080808080808080808080808080800000000a008000000300030000030007000b000f00130017001b001f0023002700001335331521353315 +05353315213533150535331533353315053533153335331505353315073533158080018080fd8080018080fe00808080fe80808080ff0080808002808080808080808080808080808080808080808080 +80808080800000000012000000000380030000030007000b000f00130017001b001f00230027002b002f00330037003b003f004300470000113533152135331505353315213533152135331505353315 +21353315213533150535331533353315333533153335331505353315313533153335331531353315053533152135331580028080fc8080010080010080fc8080010080010080fc8080808080808080fd +008080808080fd80800180800280808080808080808080808080808080808080808080808080808080808080808080808080808080808000000a008000000300030000030007000b000f00130017001b +001f002300270000133533152135331505353315333533150535331507353315053533153335331505353315213533158080018080fe00808080ff00808080ff00808080fe0080018080028080808080 +80808080808080808080808080808080808080808000000000130080fe800300030000030007000b000f00130017001b001f00230027002b002f00330037003b003f00430047004b0000133533152135 +331505353315213533150535331521353315053533152135331505353315213533150535331531353315313533153135331507353315073533150535331531353315313533158080018080fd80800180 +80fd8080018080fd8080018080fd8080018080fe008080808080808080fe0080808002808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080 +80800000000e008000000300030000030007000b000f00130017001b001f00230027002b002f003300370000133533153135331531353315313533153135331507353315053533150535331505353315 +05353315313533153135331531353315313533158080808080808080ff0080ff0080ff0080ff008080808080028080808080808080808080808080808080808080808080808080808080808080808000 +000e0080ff000300048000030007000b000f00130017001b001f00230027002b002f003300370000013533153135331505353315073533150735331507353315053533153135331d0135331507353315 +073533150735331d013533153135331502008080fe8080808080808080fe8080808080808080808080800400808080808080808080808080808080808080808080808080808080808080808080808080 +80800000000b0180ff000200048000030007000b000f00130017001b001f00230027002b0000013533150735331507353315073533150735331507353315073533150735331507353315073533150735 +331501808080808080808080808080808080808080808080800400808080808080808080808080808080808080808080808080808080808080808000000e0080ff000300048000030007000b000f0013 +0017001b001f00230027002b002f003300370000133533153135331d0135331507353315073533150735331d013533153135331505353315073533150735331507353315053533153135331580808080 +8080808080808080fe8080808080808080fe808080040080808080808080808080808080808080808080808080808080808080808080808080808080800000000008000001800380028000030007000b +000f00130017001b001f0000133533153135331531353315213533150535331521353315313533153135331580808080010080fc80800100808080020080808080808080808080808080808080800000 +0013008000000380038000030007000b000f00130017001b001f00230027002b002f00330037003b003f00430047004b0000013533153135331531353315053533152135331505353315313533153135 +331531353315053533150535331531353315313533153135331505353315213533150535331531353315313533150180808080fe0080018080fd0080808080fe8080ff0080808080fe8080018080fe00 +8080800300808080808080808080808080808080808080808080808080808080808080808080808080808080808080808000000000040100ff000200010000030007000b000f00002535331507353315 +073533150535331501808080808080ff0080808080808080808080808080000000100080ff000300048000030007000b000f00130017001b001f00230027002b002f00330037003b003f000001353315 +31353315053533150735331505353315313533153135331531353315053533150735331507353315073533150735331507353315053533153135331502008080fe80808080ff0080808080fe80808080 +8080808080808080fe808080040080808080808080808080808080808080808080808080808080808080808080808080808080808080808000060100ff800280010000030007000b000f001300170000 +2535331533353315053533153335331505353315333533150100808080fe80808080fe8080808080808080808080808080808080808000000003008000000300008000030007000b0000333533153335 +3315333533158080808080808080808080800000000d008000000300048000030007000b000f00130017001b001f00230027002b002f0033000001353315073533150535331531353315313533153135 +3315313533150535331507353315073533150735331507353315073533150180808080fe808080808080fe80808080808080808080808004008080808080808080808080808080808080808080808080 +8080808080808080808080000011008000000300048000030007000b000f00130017001b001f00230027002b002f00330037003b003f0043000001353315073533150535331531353315313533153135 +331531353315053533150535331531353315313533153135331531353315053533150735331507353315073533150180808080fe808080808080fe8080fe808080808080fe8080808080808080040080 +80808080808080808080808080808080808080808080808080808080808080808080808080808080800000000005008003000300048000030007000b000f001300000135331505353315333533150535 +331521353315018080ff00808080fe008001808004008080808080808080808080800000000e008000000380040000030007000b000f00130017001b001f00230027002b002f00330037000001353315 +05353315213533150535331533353315073533150535331507353315333533153335331505353315213533153335331505353315020080fe0080010080fe008080808080ff0080808080808080fd0080 +0100808080fd0080038080808080808080808080808080808080808080808080808080808080808080808080800000000015008000000380050000030007000b000f00130017001b001f00230027002b +002f00330037003b003f00430047004b004f005300000135331533353315053533150535331531353315313533153135331505353315213533150535331d013533153135331d013533153135331d0135 +33150535331521353315053533153135331531353315313533150100808080ff0080ff0080808080fd8080020080fd00808080808080fd0080020080fd80808080800480808080808080808080808080 +808080808080808080808080808080808080808080808080808080808080808080808080808080000005008000800200030000030007000b000f0013000001353315053533150535331d0135331d0135 +3315018080ff0080ff00808080028080808080808080808080808080800000000018000000000380040000030007000b000f00130017001b001f00230027002b002f00330037003b003f00430047004b +004f00530057005b005f00001335331531353315333533153135331531353315053533152135331505353315213533150535331521353315313533153135331505353315213533150535331521353315 +0535331521353315053533153135331533353315313533153135331580808080808080fc8080010080fe0080010080fe00800100808080fd0080010080fe0080010080fe0080010080fe808080808080 +8003808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808000000015008000000380050000030007000b000f0013 +0017001b001f00230027002b002f00330037003b003f00430047004b004f0053000001353315333533150535331505353315313533153135331531353315313533153135331507353315053533150535 +33150535331505353315053533150735331531353315313533153135331531353315313533150100808080ff0080fe808080808080808080ff0080ff0080ff0080ff0080ff0080808080808080800480 +808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080000003018003000280048000030007000b0000013533150735331d0135 +33150180808080800400808080808080808000000003010003000200048000030007000b00000135331507353315053533150180808080ff008004008080808080808080000601000300030004800003 +0007000b000f0013001700000135331533353315053533153335331505353315333533150100808080fe80808080ff008080800400808080808080808080808080808000000600800300028004800003 +0007000b000f0013001700000135331533353315053533153335331505353315333533150100808080fe80808080fe008080800400808080808080808080808080808000000d00800080030003000003 +0007000b000f00130017001b001f00230027002b002f00330000013533150535331531353315313533150535331531353315313533153135331531353315053533153135331531353315053533150180 +80ff00808080fe008080808080fe00808080ff008002808080808080808080808080808080808080808080808080808080808080800000000005008001800300020000030007000b000f001300001335 +3315313533153135331531353315313533158080808080800180808080808080808080800007000001800380020000030007000b000f00130017001b0000113533153135331531353315313533153135 +3315313533153135331580808080808080018080808080808080808080808080800000000004008003000280040000030007000b000f0000013533153335331505353315333533150100808080fe0080 +808003808080808080808080800000000010000002000380040000030007000b000f00130017001b001f00230027002b002f00330037003b003f00001135331531353315313533153335331531353315 +313533150535331521353315313533153135331505353315213533153335331505353315213533153335331580808080808080fd00800100808080fd00800100808080fd008001008080800380808080 +80808080808080808080808080808080808080808080808080808080808080800010008000000300048000030007000b000f00130017001b001f00230027002b002f00330037003b003f000001353315 +3335331505353315013533153135331531353315313533150535331d013533153135331d0135331d01353315053533153135331531353315313533150100808080ff0080ff0080808080fd8080808080 +80fd8080808080040080808080808080ff00808080808080808080808080808080808080808080808080808080808080800000000005008000800200030000030007000b000f001300001335331d0135 +331d01353315053533150535331580808080ff0080ff0080028080808080808080808080808080800015000000000380030000030007000b000f00130017001b001f00230027002b002f00330037003b +003f00430047004b004f00530000133533153135331533353315313533150535331521353315213533150535331521353315313533153135331531353315053533152135331505353315213533152135 +331505353315313533153335331531353315808080808080fd0080010080010080fc8080010080808080fc8080010080fe0080010080010080fd00808080808002808080808080808080808080808080 +8080808080808080808080808080808080808080808080808080808080808080800000000011008000000300048000030007000b000f00130017001b001f00230027002b002f00330037003b003f0043 +000001353315333533150535331501353315313533153135331531353315313533150735331505353315053533150535331505353315313533153135331531353315313533150100808080ff0080fe80 +80808080808080ff0080ff0080ff0080ff008080808080040080808080808080ff0080808080808080808080808080808080808080808080808080808080808080808000000d00000000038004800003 +0007000b000f00130017001b001f00230027002b002f00330000013533153335331501353315213533150535331521353315053533152135331505353315333533150535331507353315073533150100 +808080fd8080028080fc8080028080fd0080018080fe00808080ff008080808080040080808080ff00808080808080808080808080808080808080808080808080808080800000000007018000000200 +040000030007000b000f00130017001b00000135331503353315073533150735331507353315073533150735331501808080808080808080808080808003808080ff0080808080808080808080808080 +8080808000120080ff800300038000030007000b000f00130017001b001f00230027002b002f00330037003b003f00430047000001353315053533153135331531353315053533153335331533353315 +0535331533353315053533153335331505353315333533153335331505353315313533153135331505353315018080ff00808080fe008080808080fd80808080fe80808080fe808080808080fe008080 +80ff00800300808080808080808080808080808080808080808080808080808080808080808080808080808080808080800000000010008000000300040000030007000b000f00130017001b001f0023 +0027002b002f00330037003b003f000001353315313533150535331507353315053533153135331531353315313533150535331507353315053533150735331531353315313533153135331531353315 +01808080fe80808080ff0080808080fe80808080ff0080808080808080038080808080808080808080808080808080808080808080808080808080808080808080808080808000000014000000000380 +038000030007000b000f00130017001b001f00230027002b002f00330037003b003f00430047004b004f0000113533152135331505353315313533153135331531353315313533150535331521353315 +053533152135331505353315213533150535331531353315313533153135331531353315053533152135331580028080fd008080808080fd8080018080fd8080018080fd8080018080fd808080808080 +fd008002808003008080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808000000010000000000380040000030007000b000f00130017001b +001f00230027002b002f00330037003b003f0000113533152135331505353315213533150535331521353315053533153335331505353315053533153135331531353315313533153135331505353315 +0735331580028080fc8080028080fd0080018080fe00808080ff0080fe808080808080fe8080808003808080808080808080808080808080808080808080808080808080808080808080808080808080 +80000000000a0180ff000200048000030007000b000f00130017001b001f0023002700000135331507353315073533150735331507353315033533150735331507353315073533150735331501808080 +808080808080808080808080808080808004008080808080808080808080808080ff0080808080808080808080808080800000000012008000000300048000030007000b000f00130017001b001f0023 +0027002b002f00330037003b003f00430047000001353315313533153135331505353315213533150535331d01353315313533150535331533353315053533153135331d013533150535331521353315 +0535331531353315313533150100808080fe0080018080fd80808080ff00808080ff00808080fd8080018080fe0080808004008080808080808080808080808080808080808080808080808080808080 +80808080808080808080808080808000000201000400028004800003000700000135331533353315010080808004008080808000001c000000000380040000030007000b000f00130017001b001f0023 +0027002b002f00330037003b003f00430047004b004f00530057005b005f00630067006b006f000013353315313533153135331531353315313533150535331521353315053533152135331531353315 +333533150535331533353315213533150535331533353315213533150535331521353315313533153335331505353315213533150535331531353315313533153135331531353315808080808080fd00 +80028080fc8080010080808080fc80808080018080fc80808080018080fc8080010080808080fc8080028080fd0080808080800380808080808080808080808080808080808080808080808080808080 +808080808080808080808080808080808080808080808080808080808080808080808080000b008001800280040000030007000b000f00130017001b001f00230027002b0000013533153135331d0135 +331505353315313533153135331505353315213533150535331531353315313533150100808080fe80808080fe0080010080fe8080808003808080808080808080808080808080808080808080808080 +80808000000a008000800300030000030007000b000f00130017001b001f0023002700000135331533353315053533153335331505353315333533150535331533353315053533153335331501808080 +80fe00808080fe00808080ff00808080ff008080800280808080808080808080808080808080808080808080808080000007008000000280020000030007000b000f00130017001b0000133533153135 +33153135331531353315073533150735331507353315808080808080808080808001808080808080808080808080808080808080001e000000000380040000030007000b000f00130017001b001f0023 +0027002b002f00330037003b003f00430047004b004f00530057005b005f00630067006b006f007300770000133533153135331531353315313533153135331505353315213533150535331533353315 +3135331521353315053533153335331533353315333533150535331533353315313533152135331505353315333533153335331533353315053533152135331505353315313533153135331531353315 +31353315808080808080fd0080028080fc8080808080010080fc8080808080808080fc8080808080010080fc8080808080808080fc8080028080fd008080808080038080808080808080808080808080 +80808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808000000007000004800380050000030007000b000f00130017001b +00001135331531353315313533153135331531353315313533153135331580808080808080048080808080808080808080808080800000000008008002800280048000030007000b000f00130017001b +001f0000013533153135331505353315213533150535331521353315053533153135331501008080fe8080010080fe0080010080fe808080040080808080808080808080808080808080808080000000 +000e008000000300038000030007000b000f00130017001b001f00230027002b002f00330037000001353315073533150535331531353315313533153135331531353315053533150735331501353315 +313533153135331531353315313533150180808080fe808080808080fe80808080fe808080808080030080808080808080808080808080808080808080808080ff0080808080808080808080000a0080 +02000280048000030007000b000f00130017001b001f00230027000013353315313533153135331d013533150535331505353315053533153135331531353315313533158080808080ff0080ff0080ff +0080808080040080808080808080808080808080808080808080808080808000000a008002000280048000030007000b000f00130017001b001f00230027000013353315313533153135331d01353315 +053533153135331d013533150535331531353315313533158080808080fe80808080fe008080800400808080808080808080808080808080808080808080808080000000000201800380028004800003 +000700000135331505353315020080ff00800400808080808000000000110000ff000380030000030007000b000f00130017001b001f00230027002b002f00330037003b003f00430000133533152135 +33150535331521353315053533152135331505353315213533150535331531353315213533150535331533353315313533153335331505353315053533158080018080fd8080018080fd8080018080fd +8080018080fd808080010080fd80808080808080fd0080ff008002808080808080808080808080808080808080808080808080808080808080808080808080808080808080000000001a0080ff800380 +040000030007000b000f00130017001b001f00230027002b002f00330037003b003f00430047004b004f00530057005b005f006300670000013533153135331531353315313533153135331505353315 +3135331531353315333533150535331531353315313533153335331505353315313533153335331505353315333533150535331533353315053533153335331505353315333533150535331533353315 +01008080808080fd008080808080fd808080808080fe0080808080fe80808080fe80808080fe80808080fe80808080fe8080808003808080808080808080808080808080808080808080808080808080 +8080808080808080808080808080808080808080808080808080808080808080808000000009010001000280028000030007000b000f00130017001b001f002300000135331531353315313533150535 +331531353315313533150535331531353315313533150100808080fe80808080fe80808080020080808080808080808080808080808080808080800000040180fe800280000000030007000b000f0000 +05353315313533150735331505353315018080808080ff008080808080808080808080800008008002000200048000030007000b000f00130017001b001f000001353315053533153135331507353315 +07353315053533153135331531353315010080ff00808080808080ff00808080040080808080808080808080808080808080808080800000000a008002000280048000030007000b000f00130017001b +001f0023002700000135331531353315053533152135331505353315213533150535331521353315053533153135331501008080fe8080010080fe0080010080fe0080010080fe808080040080808080 +8080808080808080808080808080808080808080000a008000800300030000030007000b000f00130017001b001f00230027000013353315333533150535331533353315053533153335331505353315 +33353315053533153335331580808080ff00808080ff00808080fe00808080fe00808080028080808080808080808080808080808080808080808080808000000016008000000380050000030007000b +000f00130017001b001f00230027002b002f00330037003b003f00430047004b004f00530057000001353315053533152135331505353315213533150535331521353315053533153335331507353315 +053533152135331505353315333533153135331505353315333533153135331531353315313533150535331521353315028080fd8080018080fd8080010080fe0080010080fe008080808080ff008001 +0080fe0080808080fd80808080808080fd008001808004808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080000000 +0016008000000380050000030007000b000f00130017001b001f00230027002b002f00330037003b003f00430047004b004f005300570000013533150535331521353315053533152135331505353315 +21353315053533153335331507353315313533153135331505353315213533150535331521353315053533152135331505353315213533153135331531353315028080fd8080018080fd8080010080fe +0080010080fe0080808080808080fe0080018080fd8080010080fd8080010080fe0080010080808004808080808080808080808080808080808080808080808080808080808080808080808080808080 +80808080808080808080808080808000001a000000000380050000030007000b000f00130017001b001f00230027002b002f00330037003b003f00430047004b004f00530057005b005f006300670000 +0135331505353315313533152135331505353315333533150535331531353315333533150535331531353315053533153135331533353315053533152135331505353315333533153135331505353315 +333533153135331531353315313533150535331521353315028080fd008080018080fe00808080fe0080808080fe808080fe0080808080ff0080010080fe0080808080fd80808080808080fd00800180 +80048080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080000a008000000300040000030007000b +000f00130017001b001f0023002700000135331503353315073533150535331505353315073533152135331505353315313533153135331501808080808080ff0080ff00808080018080fe0080808003 +808080ff0080808080808080808080808080808080808080808080800012008000000380050000030007000b000f00130017001b001f00230027002b002f00330037003b003f0043004700000135331d +013533150135331531353315053533152135331505353315213533150535331531353315313533153135331505353315213533150535331521353315053533152135331501808080ff008080fe808001 +0080fe0080010080fe0080808080fd8080020080fd0080020080fd008002008004808080808080ff00808080808080808080808080808080808080808080808080808080808080808080808080808000 +0012008000000380050000030007000b000f00130017001b001f00230027002b002f00330037003b003f0043004700000135331505353315033533153135331505353315213533150535331521353315 +05353315313533153135331531353315053533152135331505353315213533150535331521353315020080ff0080808080fe8080010080fe0080010080fe0080808080fd8080020080fd0080020080fd +008002008004808080808080ff0080808080808080808080808080808080808080808080808080808080808080808080808080800014008000000380050000030007000b000f00130017001b001f0023 +0027002b002f00330037003b003f00430047004b004f00000135331531353315053533152135331501353315313533150535331521353315053533152135331505353315313533153135331531353315 +05353315213533150535331521353315053533152135331501808080fe8080010080fe808080fe8080010080fe0080010080fe0080808080fd8080020080fd0080020080fd0080020080048080808080 +8080808080ff0080808080808080808080808080808080808080808080808080808080808080808080808080800000000014008000000380050000030007000b000f00130017001b001f00230027002b +002f00330037003b003f00430047004b004f0000013533153335331505353315333533150135331531353315053533152135331505353315213533150535331531353315313533153135331505353315 +21353315053533152135331505353315213533150180808080fe00808080ff008080fe8080010080fe0080010080fe0080808080fd8080020080fd0080020080fd008002008004808080808080808080 +80ff0080808080808080808080808080808080808080808080808080808080808080808080808080800000000012008000000380048000030007000b000f00130017001b001f00230027002b002f0033 +0037003b003f0043004700000135331521353315013533153135331505353315213533150535331521353315053533153135331531353315313533150535331521353315053533152135331505353315 +21353315010080010080fe808080fe8080010080fe0080010080fe0080808080fd8080020080fd0080020080fd0080020080040080808080ff0080808080808080808080808080808080808080808080 +808080808080808080808080808080800016008000000380050000030007000b000f00130017001b001f00230027002b002f00330037003b003f00430047004b004f0053005700000135331531353315 +0535331521353315053533152135331505353315313533150535331521353315053533152135331505353315313533153135331531353315053533152135331505353315213533150535331521353315 +01808080fe8080010080fe0080010080fe808080fe8080010080fe0080010080fe0080808080fd8080020080fd0080020080fd0080020080048080808080808080808080808080808080808080808080 +80808080808080808080808080808080808080808080808080808080808080000017000000000380040000030007000b000f00130017001b001f00230027002b002f00330037003b003f00430047004b +004f00530057005b000001353315313533153135331531353315053533153335331505353315333533150535331521353315313533150535331531353315313533153135331505353315213533150535 +33152135331505353315213533153135331531353315018080808080fd80808080fe80808080fe008001008080fd8080808080fd8080018080fd8080018080fd80800180808080038080808080808080 +80808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080000000110080fe800380040000030007000b000f00130017001b001f00230027002b +002f00330037003b003f0043000001353315313533153135331505353315213533150535331507353315073533150735331d013533152135331505353315313533153135331505353315073533150535 +33150180808080fe0080018080fd008080808080808080018080fe00808080ff00808080ff00800380808080808080808080808080808080808080808080808080808080808080808080808080808080 +80808080800000000014008000000300050000030007000b000f00130017001b001f00230027002b002f00330037003b003f00430047004b004f00000135331d01353315013533153135331531353315 +31353315313533150535331507353315073533153135331531353315313533150535331507353315073533153135331531353315313533153135331501008080fe808080808080fd8080808080808080 +80fe0080808080808080808004808080808080ff00808080808080808080808080808080808080808080808080808080808080808080808080808080808080000014008000000300050000030007000b +000f00130017001b001f00230027002b002f00330037003b003f00430047004b004f00000135331505353315013533153135331531353315313533153135331505353315073533150735331531353315 +313533153135331505353315073533150735331531353315313533153135331531353315020080ff0080fe808080808080fd808080808080808080fe0080808080808080808004808080808080ff0080 +80808080808080808080808080808080808080808080808080808080808080808080808080808080800000000015008000000300050000030007000b000f00130017001b001f00230027002b002f0033 +0037003b003f00430047004b004f005300000135331505353315333533150135331531353315313533153135331531353315053533150735331507353315313533153135331531353315053533150735 +33150735331531353315313533153135331531353315018080ff00808080fe008080808080fd808080808080808080fe00808080808080808080048080808080808080ff008080808080808080808080 +80808080808080808080808080808080808080808080808080808080808080000014008000000300048000030007000b000f00130017001b001f00230027002b002f00330037003b003f00430047004b +004f000001353315333533150135331531353315313533153135331531353315053533150735331507353315313533153135331531353315053533150735331507353315313533153135331531353315 +313533150100808080fe008080808080fd808080808080808080fe00808080808080808080040080808080ff008080808080808080808080808080808080808080808080808080808080808080808080 +8080808080808000000d010000000280050000030007000b000f00130017001b001f00230027002b002f003300000135331d013533150135331531353315313533150535331507353315073533150735 +33150735331505353315313533153135331501808080fe80808080ff00808080808080808080ff0080808004808080808080ff0080808080808080808080808080808080808080808080808080808080 +000d010000000280050000030007000b000f00130017001b001f00230027002b002f00330000013533150535331501353315313533153135331505353315073533150735331507353315073533150535 +33153135331531353315020080ff0080ff00808080ff00808080808080808080ff0080808004808080808080ff00808080808080808080808080808080808080808080808080808080800000000e0100 +00000280050000030007000b000f00130017001b001f00230027002b002f0033003700000135331505353315333533150135331531353315313533150535331507353315073533150735331507353315 +053533153135331531353315018080ff00808080fe80808080ff00808080808080808080ff00808080048080808080808080ff0080808080808080808080808080808080808080808080808080808080 +000d010000000280048000030007000b000f00130017001b001f00230027002b002f00330000013533153335331501353315313533153135331505353315073533150735331507353315073533150535 +331531353315313533150100808080fe80808080ff00808080808080808080ff00808080040080808080ff00808080808080808080808080808080808080808080808080808080800015000000000380 +038000030007000b000f00130017001b001f00230027002b002f00330037003b003f00430047004b004f0053000013353315313533153135331531353315053533152135331505353315213533150535 +33153135331531353315313533152135331505353315213533150535331521353315053533153135331531353315313533158080808080fe0080018080fd8080020080fc8080808080010080fd008002 +0080fd0080018080fd808080808003008080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080800019008000000380050000030007000b +000f00130017001b001f00230027002b002f00330037003b003f00430047004b004f00530057005b005f0063000001353315333533150535331533353315013533153135331521353315053533153335 +3315213533150535331533353315213533150535331521353315333533150535331521353315333533150535331521353315313533150535331521353315313533150180808080fe00808080fe008080 +018080fd00808080010080fd00808080010080fd00800100808080fd00800100808080fd008001808080fd0080018080800480808080808080808080ff00808080808080808080808080808080808080 +80808080808080808080808080808080808080808080808080808080808000000010008000000380050000030007000b000f00130017001b001f00230027002b002f00330037003b003f00000135331d +01353315013533153135331505353315213533150535331521353315053533152135331505353315213533150535331521353315053533153135331501808080ff008080fe8080010080fd8080020080 +fd0080020080fd0080020080fd8080010080fe80808004808080808080ff0080808080808080808080808080808080808080808080808080808080808080808080000000001000800000038005000003 +0007000b000f00130017001b001f00230027002b002f00330037003b003f0000013533150535331503353315313533150535331521353315053533152135331505353315213533150535331521353315 +05353315213533150535331531353315020080ff0080808080fe8080010080fd8080020080fd0080020080fd0080020080fd8080010080fe80808004808080808080ff00808080808080808080808080 +8080808080808080808080808080808080808080808000000012008000000380050000030007000b000f00130017001b001f00230027002b002f00330037003b003f0043004700000135331531353315 +0535331521353315013533153135331505353315213533150535331521353315053533152135331505353315213533150535331521353315053533153135331501808080fe8080010080fe808080fe80 +80010080fd8080020080fd0080020080fd0080020080fd8080010080fe8080800480808080808080808080ff008080808080808080808080808080808080808080808080808080808080808080808000 +0012008000000380050000030007000b000f00130017001b001f00230027002b002f00330037003b003f0043004700000135331533353315053533153335331501353315313533150535331521353315 +053533152135331505353315213533150535331521353315053533152135331505353315313533150180808080fe00808080ff008080fe8080010080fd8080020080fd0080020080fd0080020080fd80 +80010080fe8080800480808080808080808080ff0080808080808080808080808080808080808080808080808080808080808080808080000010008000000380048000030007000b000f00130017001b +001f00230027002b002f00330037003b003f0000013533152135331501353315313533150535331521353315053533152135331505353315213533150535331521353315053533152135331505353315 +31353315010080010080fe808080fe8080010080fd8080020080fd0080020080fd0080020080fd8080010080fe808080040080808080ff00808080808080808080808080808080808080808080808080 +8080808080808080808000000009008000800300030000030007000b000f00130017001b001f002300001335331521353315053533153335331505353315053533153335331505353315213533158080 +018080fe00808080ff0080ff00808080fe008001808002808080808080808080808080808080808080808080808000000016008000000380040000030007000b000f00130017001b001f00230027002b +002f00330037003b003f00430047004b004f0053005700000135331531353315333533150535331521353315053533152135331533353315053533152135331533353315053533153335331521353315 +0535331533353315213533150535331521353315053533153335331531353315018080808080fd8080010080fd80800100808080fd00800100808080fd00808080010080fd00808080010080fd808001 +0080fd808080808003808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080800000000012008000000380050000030007000b +000f00130017001b001f00230027002b002f00330037003b003f0043004700000135331d0135331501353315213533150535331521353315053533152135331505353315213533150535331521353315 +05353315213533150535331531353315313533153135331501808080fe0080020080fd0080020080fd0080020080fd0080020080fd0080020080fd0080020080fd808080808004808080808080ff0080 +808080808080808080808080808080808080808080808080808080808080808080808080800000000012008000000380050000030007000b000f00130017001b001f00230027002b002f00330037003b +003f004300470000013533150535331501353315213533150535331521353315053533152135331505353315213533150535331521353315053533152135331505353315313533153135331531353315 +020080ff0080fe8080020080fd0080020080fd0080020080fd0080020080fd0080020080fd0080020080fd808080808004808080808080ff008080808080808080808080808080808080808080808080 +808080808080808080808080808080000014008000000380050000030007000b000f00130017001b001f00230027002b002f00330037003b003f00430047004b004f0000013533153135331505353315 +213533150135331521353315053533152135331505353315213533150535331521353315053533152135331505353315213533150535331531353315313533153135331501808080fe8080010080fd80 +80020080fd0080020080fd0080020080fd0080020080fd0080020080fd0080020080fd80808080800480808080808080808080ff00808080808080808080808080808080808080808080808080808080 +8080808080808080808080000012008000000380048000030007000b000f00130017001b001f00230027002b002f00330037003b003f0043004700000135331521353315013533152135331505353315 +21353315053533152135331505353315213533150535331521353315053533152135331505353315313533153135331531353315010080010080fd8080020080fd0080020080fd0080020080fd008002 +0080fd0080020080fd0080020080fd8080808080040080808080ff0080808080808080808080808080808080808080808080808080808080808080808080808080800000000d00000000038005000003 +0007000b000f00130017001b001f00230027002b002f00330000013533150535331501353315213533150535331521353315053533152135331505353315333533150535331507353315073533150200 +80ff0080fe0080028080fc8080028080fd0080018080fe00808080ff00808080808004808080808080ff0080808080808080808080808080808080808080808080808080808080000010008000000300 +040000030007000b000f00130017001b001f00230027002b002f00330037003b003f00001335331507353315073533153135331531353315313533150535331521353315053533152135331505353315 +3135331531353315313533150535331507353315808080808080808080fe0080018080fd8080018080fd8080808080fe0080808003808080808080808080808080808080808080808080808080808080 +8080808080808080808080808000000000190000ff800380048000030007000b000f00130017001b001f00230027002b002f00330037003b003f00430047004b004f00530057005b005f006300000135 +3315313533153135331505353315213533150535331521353315053533153135331531353315313533150535331521353315053533152135331505353315213533150535331521353315053533153135 +3315313533153135331531353315053533150100808080fe0080018080fd8080018080fd8080808080fe0080018080fd8080020080fd0080020080fd0080020080fd008080808080fd00800400808080 +80808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080800012008000000300048000030007000b000f00130017001b +001f00230027002b002f00330037003b003f0043004700000135331d0135331501353315313533153135331d013533150535331531353315313533153135331505353315213533150535331521353315 +0535331531353315313533153135331501808080fe8080808080fe0080808080fd8080018080fd8080018080fe008080808004008080808080ff00808080808080808080808080808080808080808080 +808080808080808080808080808080800012008000000300048000030007000b000f00130017001b001f00230027002b002f00330037003b003f00430047000001353315053533150135331531353315 +3135331d01353315053533153135331531353315313533150535331521353315053533152135331505353315313533153135331531353315020080ff0080ff0080808080fe0080808080fd8080018080 +fd8080018080fe008080808004008080808080ff008080808080808080808080808080808080808080808080808080808080808080808080808000000013008000000300048000030007000b000f0013 +0017001b001f00230027002b002f00330037003b003f00430047004b000001353315053533153335331501353315313533153135331d0135331505353315313533153135331531353315053533152135 +3315053533152135331505353315313533153135331531353315018080ff00808080fe8080808080fe0080808080fd8080018080fd8080018080fe0080808080040080808080808080ff008080808080 +80808080808080808080808080808080808080808080808080808080808080800014008000000300048000030007000b000f00130017001b001f00230027002b002f00330037003b003f00430047004b +004f00000135331533353315053533153335331501353315313533153135331d013533150535331531353315313533153135331505353315213533150535331521353315053533153135331531353315 +313533150180808080fe00808080fe8080808080fe0080808080fd8080018080fd8080018080fe00808080800400808080808080808080ff008080808080808080808080808080808080808080808080 +808080808080808080808080808000000012008000000300040000030007000b000f00130017001b001f00230027002b002f00330037003b003f00430047000001353315333533150135331531353315 +3135331d013533150535331531353315313533153135331505353315213533150535331521353315053533153135331531353315313533150100808080fe8080808080fe0080808080fd8080018080fd +8080018080fe0080808080038080808080ff00808080808080808080808080808080808080808080808080808080808080808080808080800014008000000300050000030007000b000f00130017001b +001f00230027002b002f00330037003b003f00430047004b004f00000135331505353315333533150535331501353315313533153135331d013533150535331531353315313533153135331505353315 +21353315053533152135331505353315313533153135331531353315018080ff00808080ff0080ff0080808080fe0080808080fd8080018080fd8080018080fe00808080800480808080808080808080 +80ff00808080808080808080808080808080808080808080808080808080808080808080808080800016000000000380030000030007000b000f00130017001b001f00230027002b002f00330037003b +003f00430047004b004f00530057000013353315313533153335331531353315053533152135331505353315313533153135331531353315313533153135331505353315213533150535331521353315 +213533150535331531353315313533153135331531353315808080808080fe8080010080fd00808080808080fc8080010080fe0080010080010080fd0080808080800280808080808080808080808080 +80808080808080808080808080808080808080808080808080808080808080808080808080000000000f0080fe800300030000030007000b000f00130017001b001f00230027002b002f00330037003b +00000135331531353315313533150535331521353315053533150735331507353315213533150535331531353315313533150535331507353315053533150100808080fe0080018080fd808080808080 +018080fe00808080ff00808080ff0080028080808080808080808080808080808080808080808080808080808080808080808080808080800012008000000300048000030007000b000f00130017001b +001f00230027002b002f00330037003b003f0043004700000135331d01353315013533153135331531353315053533152135331505353315313533153135331531353315313533150535331507353315 +2135331505353315313533153135331501008080ff00808080fe0080018080fd808080808080fd80808080018080fe0080808004008080808080ff008080808080808080808080808080808080808080 +80808080808080808080808080808080800000000012008000000300048000030007000b000f00130017001b001f00230027002b002f00330037003b003f004300470000013533150535331503353315 +313533153135331505353315213533150535331531353315313533153135331531353315053533150735331521353315053533153135331531353315018080ff008080808080fe0080018080fd808080 +808080fd80808080018080fe0080808004008080808080ff008080808080808080808080808080808080808080808080808080808080808080808080808000000013008000000300048000030007000b +000f00130017001b001f00230027002b002f00330037003b003f00430047004b000001353315053533153335331501353315313533153135331505353315213533150535331531353315313533153135 +331531353315053533150735331521353315053533153135331531353315018080ff00808080fe80808080fe0080018080fd808080808080fd80808080018080fe00808080040080808080808080ff00 +808080808080808080808080808080808080808080808080808080808080808080808080800000000012008000000300040000030007000b000f00130017001b001f00230027002b002f00330037003b +003f004300470000013533153335331501353315313533153135331505353315213533150535331531353315313533153135331531353315053533150735331521353315053533153135331531353315 +0100808080fe80808080fe0080018080fd808080808080fd80808080018080fe00808080038080808080ff00808080808080808080808080808080808080808080808080808080808080808080808080 +800000000009010000000200048000030007000b000f00130017001b001f002300000135331d013533150135331531353315073533150735331507353315073533150735331501008080ff0080808080 +808080808080808004008080808080ff00808080808080808080808080808080808080800009010000000200048000030007000b000f00130017001b001f002300000135331505353315033533153135 +33150735331507353315073533150735331507353315018080ff00808080808080808080808080808004008080808080ff0080808080808080808080808080808080808080000000000a010000000280 +048000030007000b000f00130017001b001f00230027000001353315053533153335331501353315313533150735331507353315073533150735331507353315018080ff00808080fe80808080808080 +808080808080040080808080808080ff00808080808080808080808080808080808080800009010000000280048000030007000b000f00130017001b001f002300000135331533353315013533153135 +331507353315073533150735331507353315073533150100808080fe80808080808080808080808080040080808080fe8080808080808080808080808080808080808080001400800000030004800003 +0007000b000f00130017001b001f00230027002b002f00330037003b003f00430047004b004f000001353315313533153335331505353315053533153335331507353315053533153135331531353315 +31353315053533152135331505353315213533150535331521353315053533153135331531353315010080808080ff0080ff008080808080fe0080808080fd8080018080fd8080018080fd8080018080 +fe008080800400808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080000012008000000300048000030007000b000f00130017001b +001f00230027002b002f00330037003b003f0043004700000135331533353315053533153335331501353315313533153135331531353315053533152135331505353315213533150535331521353315 +053533152135331505353315213533150100808080fe00808080fe8080808080fe0080018080fd8080018080fd8080018080fd8080018080fd80800180800400808080808080808080ff008080808080 +808080808080808080808080808080808080808080808080808080800010008000000300048000030007000b000f00130017001b001f00230027002b002f00330037003b003f00000135331d01353315 +013533153135331531353315053533152135331505353315213533150535331521353315053533152135331505353315313533153135331501008080ff00808080fe0080018080fd8080018080fd8080 +018080fd8080018080fe0080808004008080808080ff008080808080808080808080808080808080808080808080808080808080808080800010008000000300048000030007000b000f00130017001b +001f00230027002b002f00330037003b003f0000013533150535331501353315313533153135331505353315213533150535331521353315053533152135331505353315213533150535331531353315 +31353315020080ff0080ff00808080fe0080018080fd8080018080fd8080018080fd8080018080fe0080808004008080808080ff00808080808080808080808080808080808080808080808080808080 +80808080808000000011008000000300048000030007000b000f00130017001b001f00230027002b002f00330037003b003f004300000135331505353315333533150135331531353315313533150535 +331521353315053533152135331505353315213533150535331521353315053533153135331531353315018080ff00808080fe80808080fe0080018080fd8080018080fd8080018080fd8080018080fe +00808080040080808080808080ff008080808080808080808080808080808080808080808080808080808080808080800012008000000300048000030007000b000f00130017001b001f00230027002b +002f00330037003b003f00430047000001353315333533150535331533353315013533153135331531353315053533152135331505353315213533150535331521353315053533152135331505353315 +31353315313533150180808080fe00808080fe80808080fe0080018080fd8080018080fd8080018080fd8080018080fe008080800400808080808080808080ff00808080808080808080808080808080 +80808080808080808080808080808080808000000010008000000300040000030007000b000f00130017001b001f00230027002b002f00330037003b003f000001353315333533150135331531353315 +3135331505353315213533150535331521353315053533152135331505353315213533150535331531353315313533150100808080fe80808080fe0080018080fd8080018080fd8080018080fd808001 +8080fe00808080038080808080ff008080808080808080808080808080808080808080808080808080808080808080800007008000800300030000030007000b000f00130017001b0000013533150135 +33153135331531353315313533153135331501353315018080fe808080808080fe808002808080ff0080808080808080808080ff0080800000140080ff800300038000030007000b000f00130017001b +001f00230027002b002f00330037003b003f00430047004b004f000001353315053533153135331531353315053533152135331531353315053533153335331533353315053533153335331533353315 +05353315313533152135331505353315313533153135331505353315028080fe00808080fe008001008080fd808080808080fd808080808080fd808080010080fe00808080fe00800300808080808080 +80808080808080808080808080808080808080808080808080808080808080808080808080808080800000000010008000000300048000030007000b000f00130017001b001f00230027002b002f0033 +0037003b003f00000135331d01353315013533152135331505353315213533150535331521353315053533152135331505353315213533150535331531353315313533153135331501008080fe808001 +8080fd8080018080fd8080018080fd8080018080fd8080018080fe008080808004008080808080ff00808080808080808080808080808080808080808080808080808080808080808080000000100080 +00000300048000030007000b000f00130017001b001f00230027002b002f00330037003b003f000001353315053533150135331521353315053533152135331505353315213533150535331521353315 +053533152135331505353315313533153135331531353315018080ff0080ff0080018080fd8080018080fd8080018080fd8080018080fd8080018080fe008080808004008080808080ff008080808080 +808080808080808080808080808080808080808080808080808080800011008000000300048000030007000b000f00130017001b001f00230027002b002f00330037003b003f00430000013533150535 +3315333533150135331521353315053533152135331505353315213533150535331521353315053533152135331505353315313533153135331531353315018080ff00808080fe0080018080fd808001 +8080fd8080018080fd8080018080fd8080018080fe0080808080040080808080808080ff0080808080808080808080808080808080808080808080808080808080808080808000000010008000000300 +040000030007000b000f00130017001b001f00230027002b002f00330037003b003f00000135331533353315013533152135331505353315213533150535331521353315053533152135331505353315 +21353315053533153135331531353315313533150100808080fe0080018080fd8080018080fd8080018080fd8080018080fd8080018080fe0080808080038080808080ff008080808080808080808080 +80808080808080808080808080808080808080808080000000150080fe800300048000030007000b000f00130017001b001f00230027002b002f00330037003b003f00430047004b004f005300000135 +3315053533150135331521353315053533152135331505353315213533150535331521353315053533152135331505353315313533153135331531353315073533150735331505353315313533153135 +3315020080ff0080fe8080018080fd8080018080fd8080018080fd8080018080fd8080018080fe008080808080808080fe0080808004008080808080ff00808080808080808080808080808080808080 +8080808080808080808080808080808080808080808080808080808000140080ff000300040000030007000b000f00130017001b001f00230027002b002f00330037003b003f00430047004b004f0000 +1335331507353315073533153135331531353315313533150535331521353315053533152135331505353315213533150535331521353315053533153135331531353315313533150535331507353315 +808080808080808080fe0080018080fd8080018080fd8080018080fd8080018080fd8080808080fe00808080038080808080808080808080808080808080808080808080808080808080808080808080 +8080808080808080808080808080800000150080fe800300040000030007000b000f00130017001b001f00230027002b002f00330037003b003f00430047004b004f0053000001353315333533150135 +33152135331505353315213533150535331521353315053533152135331505353315213533150535331531353315313533153135331507353315073533150535331531353315313533150100808080fe +0080018080fd8080018080fd8080018080fd8080018080fd8080018080fe008080808080808080fe00808080038080808080ff0080808080808080808080808080808080808080808080808080808080 +80808080808080808080808080808080808000000000001501020000000000000000002400480000000000000001001a00820000000000000002000e006c0000000000000003001a0082000000000000 +0004001a00820000000000000005001400000000000000000006001a00820001000000000000001200140001000000000001000d003100010000000000020007002600010000000000030011002d0001 +000000000004000d00310001000000000005000a003e0001000000000006000d00310003000104090000002400480003000104090001001a00820003000104090002000e006c00030001040900030022 +007a0003000104090004001a00820003000104090005001400000003000104090006001a00820032003000300034002f00300034002f003100356279205472697374616e204772696d6d657252656775 +6c61725454582050726f676779436c65616e5454323030342f30342f3135006200790020005400720069007300740061006e0020004700720069006d006d006500720052006500670075006c00610072 +005400540058002000500072006f0067006700790043006c00650061006e0054005400000002000000000000000000140000000100000000000000000000000000000000010100000001010201030104 +01050106010701080109010a010b010c010d010e010f0110011101120113011401150116011701180119011a011b011c011d011e011f01200003000400050006000700080009000a000b000c000d000e +000f0010001100120013001400150016001700180019001a001b001c001d001e001f0020002100220023002400250026002700280029002a002b002c002d002e002f0030003100320033003400350036 +003700380039003a003b003c003d003e003f0040004100420043004400450046004700480049004a004b004c004d004e004f0050005100520053005400550056005700580059005a005b005c005d005e +005f00600061012101220123012401250126012701280129012a012b012c012d012e012f0130013101320133013401350136013701380139013a013b013c013d013e013f0140014100ac00a300840085 +00bd009600e80086008e008b009d00a900a400ef008a00da0083009300f200f3008d0097008800c300de00f1009e00aa00f500f400f600a200ad00c900c700ae006200630090006400cb006500c800ca +00cf00cc00cd00ce00e9006600d300d000d100af006700f0009100d600d400d5006800eb00ed0089006a0069006b006d006c006e00a0006f0071007000720073007500740076007700ea0078007a0079 +007b007d007c00b800a1007f007e0080008100ec00ee00ba0e756e69636f6465233078303030310e756e69636f6465233078303030320e756e69636f6465233078303030330e756e69636f6465233078 +303030340e756e69636f6465233078303030350e756e69636f6465233078303030360e756e69636f6465233078303030370e756e69636f6465233078303030380e756e69636f6465233078303030390e +756e69636f6465233078303030610e756e69636f6465233078303030620e756e69636f6465233078303030630e756e69636f6465233078303030640e756e69636f6465233078303030650e756e69636f +6465233078303030660e756e69636f6465233078303031300e756e69636f6465233078303031310e756e69636f6465233078303031320e756e69636f6465233078303031330e756e69636f6465233078 +303031340e756e69636f6465233078303031350e756e69636f6465233078303031360e756e69636f6465233078303031370e756e69636f6465233078303031380e756e69636f6465233078303031390e +756e69636f6465233078303031610e756e69636f6465233078303031620e756e69636f6465233078303031630e756e69636f6465233078303031640e756e69636f6465233078303031650e756e69636f +6465233078303031660664656c657465044575726f0e756e69636f6465233078303038310e756e69636f6465233078303038320e756e69636f6465233078303038330e756e69636f6465233078303038 +340e756e69636f6465233078303038350e756e69636f6465233078303038360e756e69636f6465233078303038370e756e69636f6465233078303038380e756e69636f6465233078303038390e756e69 +636f6465233078303038610e756e69636f6465233078303038620e756e69636f6465233078303038630e756e69636f6465233078303038640e756e69636f6465233078303038650e756e69636f646523 +3078303038660e756e69636f6465233078303039300e756e69636f6465233078303039310e756e69636f6465233078303039320e756e69636f6465233078303039330e756e69636f6465233078303039 +340e756e69636f6465233078303039350e756e69636f6465233078303039360e756e69636f6465233078303039370e756e69636f6465233078303039380e756e69636f6465233078303039390e756e69 +636f6465233078303039610e756e69636f6465233078303039620e756e69636f6465233078303039630e756e69636f6465233078303039640e756e69636f6465233078303039650e756e69636f646523 +3078303039660000 +]], + ["resource/fonts/ProggyForever.ttf"] = [[ +00010000000d0080000300504646544db071471100004e180000001c474445460027001800004df8000000204f532f326861dc280000015800000060636d61709393e3be000003440000018a67617370 +ffff000300004df000000008676c7966789d738700000658000041a8686561642c3ad262000000dc0000003668686561043e00e60000011400000024686d747817821441000001b80000018c6c6f6361 +99df8a52000004d0000001866d617870010900e400000138000000206e616d65b5c86e22000048000000041a706f7374a844032500004c1c000001d10001000000010000e47302ad5f0f3cf5000b03e8 +00000000e5afbb4200000000e5b3d43bffe1ff4401d702bc000000080002000000000000000100000283ff47000001b8ffe1ffe201d70001000000000000000000000000000000040001000000c200e1 +000500000000000200000001000100000040000000000000000401b8019000050000028a02bb0000008c028a02bb000001df003101020000000000000000000000008000000710000002000000000000 +00005858585800400020e9120283ff47000002af00bb00000003000000000185020600000020000101b800060000000001b8000001b8000000a60074fff900310005000400b900870087001b0016009a +003500a600270029004f0032002d001600310029002e0027002900a6008f001800180018002fffe100050026002f00270034003a0023002a0042004100130031001300290023002c000d0026002a0009 +0025000dfffa0000000500210068002700680025fff2007c00300032003b0032002500280032003e008b0064002900850014003e002a003200320045004500570036001dfff90014002f0040003f00bc +003f0016009f003f00280037000500bc0040006dfff9005c0032fff9006d006500180073006d008300250030009f008f00720053003200130013001200490005000500050005000500050002002f0034 +00340034003400420042004200420011002a0023002300230023002e0001002e002e002e002f0005002a002a0026002600260026002600260005003b00250025002500250033004400440044002a003e +002b002b002b002b002b0018000c003d003d003d003d001a0032001a00260015001e001800000003000000030000001c0001000000000084000300010000001c0004006800000016001000030006007e +00ab00d200d300ff01010178202620ace912ffff0000002000a100ae00d300d401010178202620ace912ffffffe3ffc1ffbfff5fffbeffbdfec4e099e01417af00010000000000000000000000000000 +00000000000000000000010600000100000000000000010200000002000000000000000000000000000000010000030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f2021222324 +25262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f6061008384868890949a9f9ea0a2a1a3a5a7a6a8a9 +abaaacadafb1b0b2b4b3b8b7b9ba006f63646800759d6d6a00736900859600700000667400000000006b7900a4b67e6200000000006c7abf007f82930000000000000000b500bd3c00c0000000000076 +0000008189808a878c8d8e8b329200919899970000006e0000007700000000000000002800280028002800440056008600d4010e016a0176019601b601d601ea02080216022802380266027c02ae02ea +030603400378038a03d80410042c0456046a047e049204d4052e0548058405ac05c805e005f40628063c0654066e0686069606b006c606f00750078207aa07f60808082e0840085c0874088808a008b2 +08c208d408e608f409020950098009a209d209fa0a1a0a540a720a900ab60ace0ade0b0e0b2e0b4c0b7c0bac0bce0c0a0c260c480c5c0c780c900d0c0d260d5e0d6a0da20dd60df20e220e4a0e800ea6 +0eba0f260f480f800fd20fee10321040105e107a10a210dc10ea1120113e1150116a117e11a411c011ee122c127e12b812d812f8131c1350138413ba13de141814361456147814aa14c814e61508153a +156e15a015d016041648168c16a616e6170a172e1756178e17aa17cc1812186818be1918198819f21a581b161b4e1b7c1bac1bde1c221c401c601c821cb41cfc1d3c1d621d881db21df01e2a1e5e1e96 +1ec21eee1f1c1f5c1f881fae1fee2044208420c420d4000000050006000001b202bc000300060009000c000f0000132111211b020b01111303210313110601acfe541cbabac6b4c0b80172aeb602bcfd +4402a8fecb0135feb6012cfda70118fecc0149fed1025d00000200a6fffe011202230005000d00003723033733150232161406222634fb3b0e0153402c20202c20c401045b5bfea11f2c20202c000000 +000200740146014402070003000700001323353317233533b541418e40400146c0c0c0000002fff8000301bf0203001b001f000001230733152307233723072337233533372335333733073337330733 +0737230701bf681f5c6a263b265c263a26606e1f6270263b265c263a265ac11e5c1e013c73368f8f8f8f36733690909090a9737300030031fff1018702160028002d00340000131e031514071523352e +012f01351e0217352e03353436373533151e011f0115262715322735061514173e0135342627fe16282e1c8d3c24430f0f061545251f2c2b164b413c19370f0f2b43023e4884202924250121040f1c32 +21720f2c2b010e06063f040b1603a2060f1a2a1d3543092d2a020b05053e1d04960c870c3d2cee07251f1e200a00000000050005000b01b201fa0007000f0017001f0023000012140622263436320614 +1632363426221632161406222634163236342622061413330123d13c543b3b545c1e291d1d29cb543c3c543b51291e1e291d2f47fede4701c14f38384f384c271b1b271bfd384f38384f561b271b1b27 +01a1fe1500030004fff601b3021500220035003f000025163123262706232226353436372e0235343633321615140e0207161736353714011c021e05173e013534262322061332372e01270615141601 +7043480d153c594868342c16130f3f3c3d330f201918593a243dfec301020306080c0725251f171823603425196e1841504f4f0f18316042324a21191928182945373114242214116b454148016c010d +01070307050a090d1009192818151920fe6c241c831c363b303e0000000100b9014600ff02080003000013233533fe44440147c100010087ffc10131023e00110000010e01141617232e04343e023f01 +01312b37372b3c040f261d181720210b0b023d3cb1a1b13c061544466761664b3d10100000010087ffc10131023e00110000131e04140e020f01233e01342627c3040f261d181720210b0b3c2b37372b +023d061644476761654b3c10103cb1a1b13c00000001001b0045019d01c700110000010717072715233507273727371735331537019d83832180408120838320814080014d474732468e8e4632474732 +468e8e4600010016004a01a201b9000b0000133315231523352335333533fba6a63ea6a63e011f3b9a9a3b9a0001009aff81011e006b0010000036321615140e020f012736372e013534d12d1f151f1e +0b0b1a370a11196b2016203d28200707253029011f1516000001003500e30183012000030000252135210183feb2014ee43c0000000100a6ffff01120069000700003632161406222634c62c20202c20 +691f2c1f1f2c000000010027ffde0190022700030000090123010190fedd4501220227fdb802480000030029fff7018f020e00050010001b000013321023221017220e03151417372603323e03353427 +0716dcb2b2b2b2111c1f140e04bd1a39111c1e150e04be1b020efdea02163a081a2c4e352721e534fe5f071a2c4e352822e634000001004f000001680207000a0000132737331133152137331151016a +4469fee901690167514efe373d3d017a000100320000018602110020000013273e0233321e0215140607063121152135343736373e01353426232206073701081d5125304824112c3b930101fead0d01 +a525283a2d1a4b18019f4105101b1e302e15284e3a923d2e0e0c01a5265021212f1b0d000001002dfff6018b02100029000001161514062322262f01351e023332363534262b01353332363534262322 +060f013536333216151406011a706b55224e1617071950293941413140402e38372d214814144a444e623301161e6d41540d070645040c1333312e343a2d26252b0e070740174a3b3237000000020016 +000001a20207000a000d00002533152315233523351333031103014a585843f1d0643ab3b53a7b7b490142feaf0112feee00000000010031fff601870207002800001311211523153633321e0315140e +022322262f01351e0233323e0235342e0223220607480121dd18291930332618233d43262b460e0e07184c261527271717282c191c380e010201043b7f0b0a19263f28314826120b060547040b130b19 +30212130190c0d0700020029fff8018f0208001b0025000013321e0215140623222635343e023332161f011526232206153613323534232206151416ea1f38311d5b525762243f4f30182e0b0a1f3b45 +59244e6565293b3b01571428442b5a597288496e3f1f08040342195f6248fed9777939403f3800000001002e0000018a020700060000133521150323132e015bc54ebe01cb3b1dfe1701ca0000030027 +fff6019102110014002400340000011e0115140623222635343726353436333216151426220e02141e02323e02342e0102323e02342e02220e02141e01012c3034684c4d6863545f47466093251d1d10 +111d1c241c1e10101d442a2020121221202820211212200115104834454e4d466b211e5b3e45463d5aa606112535251006061025352511fe5907142a3f2a130707132a3f2a140000000200290000018f +0210001b0025000037222e0235343633321615140e022322262f013516333236350603221514333236353426cd1e39301d5b52566324404f2f182e0b0b203b4459234f64642a3b3cb11427442c595a72 +88496e3f1f08030441185f62480127787838404038000000000200a60051011201ab0007000f000036321614062226343622263436321614c62c20202c204c2c20202c20bb1f2c1f1f2ca51f2c1f1f2c +0002008fffd1011201ab00100018000036321615140e020f012736372e0135343622263436321614c62c20161e1f0b0a1b370a11194d2d1f1f2d1fbb2016213c291f0707253029011f1516a61f2c1f1f +2c00000000010018005401a001b0000600001325150d011525180187fec80138fe79011e913e6f703e910000000200180098019f01720003000700000121352115213521019ffe790187fe7901870137 +3bd93b0000010018005401a001b00006000013051505352d01180187fe790138fec801b09139913e6f7000000002002f00000187021f0007002e0000363216140622263413321615140e031d01233534 +3e0435342623220e020f012e03173e04c22d1f1f2d1f3f53521d2a2a1d461521262116342b192d1d160405030c170f01020a22263d6a1f2c1f1f2c01d444341c2f211e2111292916271c1d171f101e21 +10171708080207100a01040e231a16000002ffe1ffe901d702200039004100002535170e0423222e0335343633321615140e02071523350623222634363332161f013235342623220615141e0233323e +0237263236342622061401b026020b262b47253f67432e148d6969800f18150a37242b374f50371c310a0b2d54465176273d4b272340281e07d33c2b2b3c2b67012e040b1b151121374a4f2a78a34e43 +1823110701c6131f5d835e1a0d0d1c22397c683557371e0d14140747384f39394f00000000020005000001b202070007000a000001132327230723130333030109a94d29c1284da9229e4f0206fdfa88 +880206feba010900000300260000019202070015001e00270000011e0415140e022b011133321e021514062715163736353426231332363534262b011501210c172219121e32391fc2b12b3e200f31d2 +472754312a0841343e2d7901160307141b301f2639200e0205192b2e182a37b29c0102044c2a21fe6d2f342f2bbd00000001002ffff801890212001a000025150623222e02353436333217152623220e +0215141e0133320188314f3856321870684d33334d2639200f1a42324d5d491c2a4a5f3a759720472d213b4a2e3e5b3b000200270000019002070007000e00001332111023063111133235342b0111c7 +c9c8a09f7d7d540206fefdfefe010206fe34cac9fe6d000000010034000001830207000b000013211521173315231521152135014dfefd01e3e40104feb202063b993bbc3b0000000001003a0000017e +020700090000132115231f01152315233a0143f901b5b64a02063b9e013bf10000010023fff801940212002400002527233533150e0423222e02353436333217152623220e0215141e0133323637014e +0163aa02071b20361e3855331870684e32334d2639200e1942321b2907438d3adf0207120d0b2a4a5f3a759720472d213b4a2e3e5b3b0a050001002a0000018d0207000b000033113315333533112335 +23152b4bcc4b4bcc0206d4d4fdfaf7f600010042000001750207000b00001335211523113315053537114301327474fece7301cb3b3bfe703a0139010191000000010041fff901760207000e00001333 +111406230631353332363511239ed8424ea49330258c0206fe9e505a0139303a012f000000010013000001a50207000b0000331133153733071323030715134be955d4dd5ab4390206e6e6d4fece0104 +39ca00000001003100000187020700050000371133112115314b010a010205fe353a000000010013000001a40207000c0000331133173733110711032303111464636564416b396a0206fefefdfb0101 +c5feef0113fe3a00000100290000018e020700090000330333131133112303112d0362ba485fba0206fe5a01a6fdfa01a6fe5a0000020023fffa0195021200050019000013321023221012323e03342e +03220e03141e02dcb8b8b8a7221b1e140d0d141e1b221b1e140e0e141f0211fdea0216fe25081a2b4e6a4e2c1a08081a2c4e6a4e2b1a00000002002cffff018b02070010008100001332161514062b01 +1c011e011c0131231117323e0235342e022b0115390a3339023339013331333133313331333133313b02313b41db555b55546c01014ba1202e160a0a152a1e5d01010101010101010101010101010101 +0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010102065046475905153730321d0206fc131f1f11 +111f1f12c30000000002000dffb801ab020f000c002000001332111407171523270623221012323e03342e03220e03141e02c6b828543052283ab8a7221a1f140d0d141e1b221b1e140e0e141e020efe +f57b43612c5b1b0216fe25081a2b4e6a4e2c1a08081a2c4e6a4e2b1a00020026000001910207000d00170000370723113332161514060717232737231516373e01353426720348b34f53392c7a4f6f02 +634427223335dbda020559452d4510e5d9f3b80102022e2d2b2f00000001002afff6018d02110036000001152e0223220615141e07171e031514062322262f01351e02333236353426272e0335343633 +321e0217016d061543233e3d060e0b190c1f092101172a301d65592b4e1212071b562d2d423d4522302f1867571228201b0801f547040d1529300b120f0b0a05070305010411213a274e4a1009084905 +101b2e2d2e250e06111f3222485205080902000000010009000001af02070007000013352115231107110a01a4ac4b01cb3b3bfe360101cb00010025fff6019302070018000037113311141e02333236 +35113311140e03222e03254c06132b2043304b061626445f46261607a60160fe991a2322123643015ffead21303521161520322c0001000d000001ab0207000600003303331b013303aea149868648a1 +0206fe3a01c6fdfa0001fff9000001be0207000c00003303331b01331b013303230b014b513f3a3f53403940514948490206fe63019dfe62019efdfa01b8fe480001ffff000001b90207000b00001327 +33173733071323270723b8a050797b51a5b1508d8d500113f3c3c3f3feeddada00010005000001b2020700080000370333173733031523b6b04f878650b14bea011ce4e4fee3e9000001002100000197 +02070009000013352115012115053501290166fee00128fe8a011801cb3b35fe6a3a01380193000000010068ffbd01500249000700000127113315231133014fa2a2e7e7021201fde238028c00010027 +ffde0190022700030000130123016d012346fede0227fdb80248000000010068ffbd0150024900070000133311233533110768e7e7a3a30249fd7438021e010000010025013f01930207000600001317 +2327072337fc9652646552960206c68d8dc600000001fff1ffbe01c7fff7000300000521352101c6fe2c01d4423800000001007c01a0013c02390003000013172327cf6c526d02399999000000020030 +fff60188018f0026003800001315321e02150631233627062322263534373e011f01303c012e0623063135323613323e03352223260e04151416d6263a341d013d02022663404f6817551e1f02030709 +0f121a107a123a182030170d020a15182d2720160d33018f010c21412ff1191b3d3f3e5d1d060501010e07110a100a0c0705023602fe9d1a21311b110102030a121c14252300000000020032fff70186 +02310014001e00001332161514062322262f0107231133153e0402323635342622061514e84757583b203e100f073d44010512172b247032336e34018e6665626a1d0f0f31022fdd030814100cfe9f52 +44435353434400000001003bfff7017d018f00140000012206151416333237150623222634363332171526010d414848413e312f4e556e6e554e2f3101594a4c4c4a2b41206ac46a20412b0000020032 +fff7018602310016001e000001331123270e0423222635343633321e021f0102323534262206150142443e0603081a1b29143b585746192a18110304c8c83068300230fdd1310307150f0d6a6265660c +11110607feda96435353430000020025fff70193018f0014001a00003714163332363715062322263534363332161514312722061533346c3e432a3e2e4652596d694f5b5aaf2f45e0b4384f1215401d +6d5f5d6e614930a54430740000010028000301900224001300000122061d013315231123112335333534363b01150128231f7d7d447a7a41406c01ed19254b39fed9012739344e3e3700000000020032 +ff460186018f001d0027000001331114062b013533323e023d010e04232226353436333216170332353423220615141601483d5a5182881c2a170a010512182a19475b5b3c30341c6b63633533330185 +fe6e56563a162425123b0206100c0a65646265141dfed78e965244414d0000000001003e0001017a0231001200001332161511233534262322061d012311331536fd35484428252f3844442501924e43 +ff00fa2d303d3bdf022fda3c0002008b0001012d021e0005001100001335331123113723223d01343b01321d01148ba1443b380a0a3809014b3bfe7b014a7f0a400909400a00000000020064ff460154 +021e000b001800000123223d01343b01321d011407353311142b01353332363511014a380a0a3809aeae7f70691d2501ca0a400909400a7e3afe62a13b34320164000000000100290002018e021e000b +0000371723270715231133113733d2bc519a334646b550f5f3c92d9c021bfec9a1000000000100850001013302080005000013331123112385ad45680207fdfa01ca000000010014fffe01a4018f001e +000001321615112311342322060711231134232206071123113315363332173e0101442b343d341a1a033d341a1a033e3e1f2a341a0d30018f4535feea0105542225feee0105542124feec0185121d31 +161b00000001003e0001017a0193001200001332161511233534262322061d012311331736fd35484428252f384440042501924e43ff00fa2d303d3bdf0185303c0000000002002afff7018d01900007 +0011000012321615142035341632363534262206151489a65efe9e835c3a3b5a3b01906666cdcd66fe4850504646505000020032ff4e018601880016001e000013321615140623222e022f0115231133 +173e040232363534221514eb42595747192918120303443d070106141929236730c70188696365670c12110606dd023031020814100dfe9e524394944300000000020032ff4e018601880016001e0000 +01331123350e0423222635343633321e021f01023236353422151401483e44010512182a194657594217291a130404a26830c8017efdd0dd0208150f0d676563690c12110606fed95243949443000000 +0001004500000173018e001300000132161f01152e022322061d01231133073e01010c1d340b0b0410381f38474444021145018e0f070841050c143c23f50185351b230000010045fffe017301970029 +0000371e011514062322262f01351e02333e013534272e0135343e023332161f01152e022322151416e8464558491f461414081c491d2e315b53390e20412c213e0e0f06133f215a24ea0b2e3739420c +060641040c1501241a310f0f352c162624140b06063e040b1139191d00010057000601610204001200003732311523222e03351133153315231514d8887d192129181044a2a2413a030f1a3222017c76 +3acc460000010036fff601820185001600003735331514333236353631331323350e042322263644562c3e03440140010311172d1b4f4991f4f1663527fbfe7c2a0207130d0c4a000001001d0000019b +0185000600000133032303331301544694569347780185fe7b0185feba0000000001fff8ffff01c00185000c000001330323270723033313373317017c43613f444141614444354c3c0185fe7bd7d701 +85fed0c0c000000000010014ffff01a30185000b00002517232707233727331737330101a24e7a784ea2954c6e6d4ccbcb9b9bccb98d8d000001002fff440189018600ae0000011215140e022b013533 +323e04353435390323390223390123312331233123312331233123312b01312b02312b6d222635123133151416331631030186030c182f20c3b010170d08030101010101010101010101010101010101 +0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +0101010101010101010101010101010101010101010101010101010a474801441d2989010185fe8730112f34243b0c181622110e04024e310106e5313201014900010040ffff01770186000e00003733 +1721353e0327223135211589ed01feca0f32694501e5012d34343b113a7a5201323c00000001003fffb201780254002a000001151407161d0114163b01152223222e033d0134262b01353332363d0134 +3e0333323115232206010b4848262a1d1f0d26361b0e03262b33332b26030e1b36262c1d2a2601d7645f11116063221d3e141a2c1e17562b2042202a57171e2c1a133e1d000100bcffc800fc023f0003 +000017231133fc40403702750001003fffb201780254002a0000133534262b01353233321e031d0114163b01152322061d01140e03232231353332363d01343726ac252a1d1e0e25361b0f02262c3333 +2c26020f1b36252c1d2a254848017364211d3e131a2c1e17572a2042202b56181d2c1a143e1d2164601110000001001600b101a1015d0021000001170e0423222e03070e010f01273e0433321e03373e +013701673a050511152819192b1e1c1f10141903033a050511152819192b1e1c1f1014190301420d15152d18141a23241502032d15150d15162c18151a24231603032d140002009fffeb011902090005 +000d00001333170723351222263436321614c42e1d01654c3223233223014bc49b9b010a23312323310000000002003fff93017901f20016001c0000011136371506071523352e013534363735331516 +17152603110e011514011939272d33264e666450263d23285e323a0158fed702193b15036465066b5c5f6804616205143c19fede012606494386000000010028ffff01900210001b0000373315213533 +352335333534363332161f0115262322061d01331523cac5fe99574949524f2134090a302a323288883b3b3ba1325258580a0505401e353f5832000000020037003f0180017d0017001f000000140717 +072706222707273726343727371736321737170706323634262206140159163c223e1f491f3e223c16163c223e1f491f3e223c88412e2e412e0103491e39233c13133c23391e491e39233c13133c2339 +8d2c3d2b2b3d000000010005000001b20207001800000107331523071533152315233523353335272335332733173701b2785b732194944b949421735b774f87860206c227350b27b6b6270b3527c2e4 +e4000000000200bcffce00fc02390003000700001323113311231133fc4040404001320107fd95010800000000020040ffbc01770210003b004b0000251e011514062322262f01351633323635342627 +26272e04353436372e013534363332161f0115262322061514161716171e04151406273e013534262726270e011514161716013019154548193910103a33242a252f08031c1927110e26211915444a18 +360e0e33332528242f08031d1827110e2647151c302e1916161b302d19751222172c420a0505391a2019141e1a0402100e1c1722131c32101222182b3b0a0505391b1a19141e1a04020f0f1c1721141c +32090c230f1a2c190e0d0c240f1a2c190e0000000002006d01d4014b021b000b001700001323223d01343b01321d01143323223d01343b01321d0114b03a09093a088a3a09093a0901d5093409093409 +09340909340900000003fff8002801c001da0014001c0024000036343633321715262322061514163332371506232202321614062226341232363426220614544e3e391e2b222f34342f2e1f24333d25 +bc8585bc86969c6f6f9c6fc37e420f26153031312f122411015b7fb37f7fb3fef4699369699300000003005c00a2015b021200280037003b00003722263534373e011f013c012e022322060f01353e06 +333216151431232e031506372223220e0415141633323617233533c72f3b4d113d1615080f20161a320b0c021207110c11120939492d01020302282805081918251314082416312935f7f7f22c2b4314 +05030101080a160e0b0b06062c0106020602030139409f0208110c012d8e0103060b120d18183db62b000000000200320031018601700006000d00001307171527353733150717152735df6f6fadada7 +7070ae012d5d5d42911c92435d5d42911c0000000004fff8002801c001da0007000f0023002d0000123216140622263412323634262206143716171631232627262322311523353332151406273e0135 +34262b0115167ebc8585bc86969c6f6f9c6fe6111a2a341e1115181b2f5c67223d131b1d15311f01da7fb37f7fb3fef469936969933e0726412c1a2167f24a15201201141313144f010000000001006d +01b7014b01eb0003000001233533014adcdc01b733000000000200650132015202100007000f000012321614062226341632363426220614ab6245456245583b2a2a3b29020f415b41415b7027372727 +3700000000020018ffff019f01970003000f000005213521273315231523352335333533019ffe790187a4a4a43ea5a53e013bea3b73733b72000000000100730185014502ad00190000133315233536 +37363534262322060f0135363332161514060706ad98d24d202a251c112a0c0d2733393a1b245601ac2726481d282412190b06062914331c162d224d0001006d0182014b02b000270000011406232226 +2f0135163332363534262b01353332363534262322060f0135363332161514060716014b443715310f0e322a1a302b1f1f1f1d241e1b152c0c0c2f2c313f211e4701d6252f0704042a121a19191b2616 +1512160804042a0d2a211c1d070d00000001008301b5013502390003000013330723eb49783802398300000000010025ff6b01920184002500002532363f0115062322262f010e042322262715231133 +151416333236353631331015140178070c04031b1d131a0403010410162a1b1a2f0b3c402d252b3b034131040202340f1a0d0d0207120e0b1c1ac00218f130353526fbfee2181d0000010030ffb90188 +020700100000133311231123101506222f011122263436d8af3446011a0d0d4563630206fdb60220fde5050201010127557955000001009f00c60119013f000700001232161406222634c33223233223 +013f2332232332000001008fff7701290001000e0000211615142322262f013516333227300100285b0e1f0808181b5b4929253b0402022e0b5e0000000100720184014602a7000a0000133315233533 +3507353733fa4bcc4c53553301ab2626d40e280d0003005300a2016502100007001100150000242035343632161526220615141632363534132335330164feef497f4966452e2d472d2af9f9f38f4747 +4747652f363631313636feeb2b000000000200320031018601700006000d00001317150735372717150735372735d8aeae707007ad6f6f0170921c91425d5d4f1c91425d5d43000000040013ffa201a5 +0240000a00150018001c000013073537331533152335331715331523152335233537073335371705277b5257304bcb4bf72b2b3290865d665c09fe7809021a0e270dfc272780bc2541412ab7bb909625 +5b25000000030013ffa201a50240000a0024002800001307353733153315233533130631331523353637363534262322060f012736333216151406371705277c5257304bcb4be05698d24d202a251c11 +290d0c012733393b1c1b09fe7809021a0e270dfc2727fed24d2727471e272413190c06062a13331b172df7255b25000000040012ffa201a50246002600310034003800000114062322262f0135163332 +3634262b01353332363534262322060f0135363332161514060716171533152315233523353707332737170527010c483715300d0d292e242a2622211e1f252119182d0a0a2e2c323e211e48692b2b31 +91865c66015909fe7809016c242f07040429121d2f1c25171514140804042a0c29201d1d080ee9bc2541412ab7bb9096255b250000020049fff7016f021b00070026000000222634363216140332363f +01150e0223222635343e043d013315140e0315141601092c20202c203e1d42121307184522524e131d221d13471a25261a2f01b11f2c1f1f2cfe60180b0c41050c154136182b1e1e181f11453d1e3022 +1f27151f2400000000030005000001b302830007000a000e00000113232723072313033303372327330109a94d29c1284da9229e4f2d3854440206fdfa87870206feb9010a5d5c0000030005000001b3 +02830007000a000e00000113232723072313033303370723370109a94d28c1294da9229e4f5f5438480206fdfa87870206feb9010ab95c5c00030005ffff01b302830007000a00110000011323272307 +2313033303350723373317230109a94d28c1294da9229e4f3d334e454e330205fdfa87870206feb9010a9d3e5c5c000000030005fffe01b3027b0007000a001f00000113232723072313033303272206 +1523343633321633323635373314062322260109a94d28c1294da9229e4f330c0c2f24221a3e0f0b0d012e22241c3a0205fdfa87870206feb9010a891310212b221109081933230000040005ffff01b3 +0283000b0017001f002200001323223d01343b01321d01143323223d01343b01321d01140713232723072313033303b03a09093a09893a09093a0942a94d28c1294da9229e4f023d0934090934090934 +0909340938fdfa87870206feb9010a0000030005fffe01b30295000f001c001f0000011323272307231326353436321615142733141617333e01353426220603330301139f4d28c1294d9f2f3c543c9f +0112102c1013212f22169e4f01e6fe19878701e71c33283737283334111a06061a11151f1ffe73010a00000000020002ffff01b60207000f001300002515331523352307231325072317370f01112303 +013580ca7f2544960117017a016f01b9254bf6bc3b86850205023d99013c38010dfef4000001002fff77018902100028000001220e0215141e0133323715060716151406232227351633323534272e03 +353436333217152601082639200e1942324d332538212d262d19181f2e1a3651301770684d333301d5203c4a2e3e5b3b2e49150524201f1e092d0b1f1620032a4a5d38759720472d0002003400030184 +02870003000f00000123273303211521112115231f011523010d395444450104feb20147fd01f1f2022a5dfdb83b02063b99013b000200340004018402870003000f0000010723370321152111211523 +1f011523012c543848690104feb20147fd01f1f202875d5dfdb93b02063b99013b000000000200340004018402880006001200001307233733172303211521112115231f011523d53d344e464e349301 +04feb20147fd01f1f202693e5d5dfe153b02063b99013b0000030034000001840285000b0017002300003721152111211523173315231323223d01343b01321d01143323223d01343b01321d01147f01 +04feb20147fd01f1f2313a09093a09893a09093a093b3b02063b993b0148083409093408083409093408000000020042fffe017602830003000f000001232733172311171521353311233521010b3854 +44b27373fece7474013202265cb8fe6f01393b01903b0000000200420003017602870003000f0000010723371723113315213533112735210139543848807474fece7373013202875d5db8fe703b3901 +91013b000002004200030176028800060012000013072337331723172311331521353311273521e13d344e464e34577474fece7373013202693e5d5d5cfe703b390191013b00000000030042fffe0176 +0283000b0017002300000123113315213537112335212723223d01343b01321d01143323223d01343b01321d011401757474fece73730132c53a09093a09893a09093a0901cafe703b390101913b3809 +34090934090934090934090000020011000401a7020b00120024000013321e03140e03232231352335333513323e03342e032b011533152315c91f383d2d1d1d2d3d381e8b2e2e8913242a1e14141e2a +24133e6363020b0c23375f7d6036230bf535dcfe33091b2a4b624b2a1b08a235bc0000000002002a0000018e02820009001e000001331123031123033313032206152334363332163332363537331406 +2322260146485fba470462ba9d0c0c2f24221a3e0f0b0d012e22241c3a0206fdfa01a6fe5a0206fe5a01f81310212b22110908193323000000030023fffa0195028700030009001d0000012327331732 +1023221012323e03342e03220e03141e02011239544413b8b8b8a8211b1e140d0d141d1c221b1e140d0d141f022a5d76fdea0216fe25081a2b4e6a4e2c1a08081a2c4e6a4e2b1a0000030023fffa0195 +02880006000c002000001307233733172307321023221012323e03342e03220e03141e02dc3d344e464e343db8b8b8a8211b1e140d0d141d1c221b1e140d0d141f02693e5d5d1afdea0216fe25081a2b +4e6a4e2c1a08081a2c4e6a4e2b1a000000030023fffb0195028100050019002e000013321023221012323e03342e03220e03141e02032206152334363332163332363735331406232226dcb8b8b8a821 +1b1e140d0d141d1c221b1e140d0d141f080b0d2f2423193e0f0b0d012e22231d3a0211fdea0216fe25081a2c4e694e2c1b07071b2c4e694e2c1a02191310212b221109081933230000040023fffa0195 +0288000b0017001d003100001323223d01343b01321d01143323223d01343b01321d011407321023221012323e03342e03220e03141e02b03a09093a09893a09093a096fb8b8b8a8211b1e140d0d141d +1c221b1e140d0d141f024209340909340909340909340931fdea0216fe25081a2b4e6a4e2c1a08081a2c4e6a4e2b1a000001002e004101890189000b0000010717072707273727371737018981812d80 +812d81812d8180015e79792a79792a79792a797900030001ffea01b702220011001c00270000010716151023222707273726351033321737011417372623220e0313323e03353427071601b7411eb853 +2e3624411eb8532e36fede07b91a3b111b1e140d6b111b1e140d07b81a0208584169fef5384819584169010b3848fee5382af93a081a2c4efefb081a2b4e35382af83a000002002efff6018a02830003 +001500000123273317331114232235113311141633323e02350113395445734baab04b273d1e28130702265c7cfea0b0bd0153fea0433412212419000002002efff6018a028300030015000001072337 +17331114232235113311141633323e02350132543948514baab04b273d1e28130702825c5c7cfea0b0bd0153fea04334122124190002002efff6018a0283000600180000130723373317231733111423 +2235113311141633323e0235dc3d344e464e34254baab04b273d1e28130702653e5c5c21fea0b0bd0153fea043341122241900000003002ffff6018a0283000b0017002900001323223d01343b01321d +01143323223d01343b01321d011407331114232235113311141633323e0235b13a09093a09893a09093a090e4cabb04b283d1e271307023d09340909340909340909340937fea0b0bd0153fea0433411 +2224190000020005ffff01b302820003000c00000107233717330315233703331701365439497050b14b01b14f8702825c5c7cfee3e9ea011ce500000002002affff018e0206000b0014000013321615 +142b0115231133151732363534262b0115dc535fb2674b4b5d313d3f2f5d01aa4b4a967f02065cf02b302f2ab40000000001002afff2018e021c0030000013141e0315140e012627351633323635342e +0335343e023f0126362e022322061511231134363332152206ea22303021334e58263133292d212f2f211823220c0c01030a0e261b2e294449529b2f48013214211b2035232b391405103815241d1825 +191b2d1e1c2c180f0202010f1716103032fe7b01854d4a982c00000000030026fff501920245002b003a003e0000251514161f012326270e012322263534363332313c022e052322060f01353e063332 +03323e0227302a01230e0115141613232733017e0a0505440907154c2641505b5b5c0206080f141e122647101103190b1811181a0da8c124341a0a01242f0b3c34336f397648e27419370f0f16252025 +403c3e46010f09120d100b0a05120a093f01090308030402fe9b1d2f321a02202c2624019783000000030026fff501920245002b003a003e0000251514161f012326270e012322263534363332313c02 +2e052322060f01353e06333203323e02272a02230e0115141613072337017e0a0505440907154c2641505b5b5c0206080f141e122647101103190b1811181a0da8c225341a0a0101232f0b3c3433b776 +3967e27419370f0f16252025403c3e46010f09120d100b0a05120a093f01090308030402fe9b1d2f321a02202c2624021a83830000030026fff501920245002b003a00410000251514161f012326270e +012322263534363332313c022e052322060f01353e06333203323e0227302a01230e0115141613072337331723017e0a0505440907154c2641505b5b5c0206080f141e122647101103190b1811181a0d +a8c124341a0a01242f0b3c34333f42345a385a34e27419370f0f16252025403c3f45010f09120d100b0a05120a093f01090308030402fe9b1d2f321a02202c262401ef588383000000030026fff50192 +0233002b003a00540000251514161f012326270e012322263534363332313c022e052322060f01353e06333203323e0227302a01230e011514161333221523343633321e013332363d0133140e022322 +2e02017e0a0505440907154c2641505b5b5c0206080f141e122647101103190b1811181a0da8c124341a0a01242f0b3c343309011a2d242515221e0d0c0d2e050d1e15151f1116e27419370f0f162520 +25403c3e46010f09120d100b0a05120a093f01090308030402fe9b1d2f321a02202c262401dc362b371b1a1a0d0e0f1d211511141100000000040026fff50192021d002b003a00460052000025151416 +1f012326270e012322263534363332313c022e052322060f01353e06333203323e02272a02230e011514161323223d01343b01321d01143323223d01343b01321d0114017e0a0505440907154c264150 +5b5b5c0206080f141e122647101103190b1811181a0da8c225341a0a0101232f0b3c3433103a09093a09893a09093a09e27419370f0f16252025403c3e46010f09120d100b0a05120a093f0109030803 +0402fe9b1d2f321a02202c262401ab0934090934090934090934090000040026fff501920272002b003a0042004a0000251514161f012326270e012322263534363332313c022e052322060f01353e06 +333203323e02272a02230e0115141612222634363216142622061416323634017e0a0505440907154c2641505b5b5c0206080f141e122647101103190b1811181a0da8c225341a0a0101232f0b3c3433 +66543c3c543c4f2e21212e21e27419370f0f16252025403c3e46010f09120d100b0a05120a093f01090308030402fe9b1d2f321a02202c2624018638503838505d1f2c1f1f2c000000030005fff501b3 +018f00ca00d600e000002515303901233901233123312b7b1c021e053316363f01150e0223222e022f010e042322263534363b013534262322060f01353633321e021f013e04333216171e0115073631 +2322061514163332363714313336272e01232201b20101010101010101010101010101010101010101010101010101010101010102010101010101010101020101010102010101020101010201010201 +01020101020102010102010201020102010201020102010201020102010202010201020201020201020201020201020202010202020102020201020202020102020202090204060a0e150c2234090a05 +0f3019192a16100203010410152416393c4644322a1e132e0d0e2c41131e120c020201030e1324163a30080201f4011c352c2517231b41790102031b1f39b301011c0a1c0d170b0e060111090a3c030a +100b111006050207130f0c3c3839411c32270e08073a18090d0d040502060f0b0a3b4c122a0c42362026231f24b01b17162326000001003bff77017d018e00250000012206151416333237150e010f01 +16151406232227351633323534272e013534363332171526010d414848413e310e2b0f0f212d262d19181f2e1a526a6e554e2f3101584a4c4c4a2b410b0f020224201f1e082e0c20161f036960626a20 +412b000000030025fff7019302450014001a001e0000371416333236371506232226353436333216151631272206153334272327336c3e432a3e2e4652596d694f5c5901b02e46e03c397648b4384f12 +15401d6d5f5d6e614930a5443074698300030025fff7019302450014001a001e0000371416333236371506232226353436333216151631272206153334370723376c3e432a3e2e4652596d694f5c5901 +b02e46e00e773866b4384f1215401d6d5f5d6e614930a5443074ec838300000000030025fff7019302450014001a00210000371416333236371506232226353436333216151631272206153334270723 +373317236c3e432a3e2e4652596d694f5c5901b02e46e06e43345a395a34b4384f1215401d6d5f5d6e614930a5443074c158838300040025fff70193021d0014001a0026003200003714163332363715 +062322263534363332161516312722061533342723223d01343b01321d01143323223d01343b01321d01146c3e432a3e2e4652596d694f5c5901b02e46e09c3a09093a09893909093909b4384f121540 +1d6d5f5d6e614930a54430747d09340909340909340909340900000000020033fffc0175023b0003001200001323273313153315222322263d012335331514e3397749a950184736415a9e01b883fdf9 +01364e3fc932fb5600020044fffc0174023b0003001200000107233713153315222322263d012335331514014c773967224f174835425a9e023b8383fdf901364e3fc932fb56000000020044fffc0174 +0245000e0015000025153315222322263d0123353315140307233733172301254f174835425a9e2842345a385a333401364e3fc932fb5601e658838300030044fffc0174021a000d0019002500002533 +15222322263d0123353315140323223d01343b01321d01143323223d01343b01321d011401254f174835425a9e48390909390989390909390933364e3fc932fb5701a109340909340909340909340900 +0002002afff4018e021b0020002f000001141e06151406232226353436172e012f01072737273317371707160332363534262f01262322061514160140140613080d0605595858596b64051b0a0b670c +5843512f6a0d5d24492d3c140a0a12322b3b3c0183011b0a1d13211d2613566b6b5e5d6608081f0c0b1f221b453120221c22fe81464726430f0e0945494945000002003e0000017a02200019002d0000 +1333221523343633321e013332363d0133140e0223222e02172332161511233534262322061d012311331736a9011a2d242514231e0d0c0d2e050e1d15151f1116490135484427262f384440042501f4 +362c361b1a1a0e0d0f1d2115111411634e43ff00fa2d303d3bdf01842f3c00000003002bfff4018d024500070011001500001232161514203534163236353426220615141323273389a65efe9e835c3a +3b5a3b9b387749018d6666cccc66fd475050464650500151830000000003002bfff4018d024500070011001500001232161514203534163236353426220615141307233789a65efe9e835c3a3b5a3be2 +763967018d6666cccc66fd4750504646505001d4838300000003002bfff4018d024500070011001800001232161514203534163236353426220615141307233733172389a65efe9e835c3a3b5a3b6842 +345a385a34018d6666cccc66fd4750504646505001a95883830000000003002bfff4018d022000070011002a000012321615142035341632363534262206151413221523343633321e013332363d0133 +140e0223222e0289a65efe9e835c3a3b5a3b35192e242614231d0e0c0d2e050e1e1514201016018d6666cccc66fd475050464650500183362c361b1a1a0e0d0f1d211511141100000004002bfff4018d +021a00070011001d002900001232161514203534163236353426220615141323223d01343b01321d01143323223d01343b01321d011489a65efe9e835c3a3b5a3b3c3a09093a09893a09093a09018d66 +66cccc66fd4750504646505001630934090934090934090934090000000300180031019f0188000f001f00230000372322263d0134363b0132161d011406032322263d0134363b0132161d0114061721 +3521fe460407070446050606054604070704460506069cfe7901873206053f040707043f0506010106053f050606053f0506733b0003000cffde01ac01a60012001a0022000001071615142322270727 +3726353436333217370514173726232206173236353427071601ac3d21b24b2c39223e1d5e53472e37feec09a81b2e2d3b682f390aa91b018b443451cc283f1a4632516666273fe32a1fbd2146e74850 +2a20bd250002003dfff6017b023b0017001b000001331123270e042322263d01331514163332363536272327330136443f060205141726154d3d43262b2c3503293977490185fe7c39020a17120e4852 +f4f034343b32eb33830000000002003dfff6017b023b0017001b000001331123270e042322263d01331514163332363536370723370136443f060205141726154d3d43262b2c35031d7738660185fe7c +39020a17120e4852f4f034343b32ebb6838300000002003dfff6017b02450017001e0000011123270e042322263d013315141633323635363127072337331723017a3f060205141726154d3d43262a2d +35025942345a385a340185fe7c39020a17120e4852f4f034343b32eb955883830003003dfff6017b021b00170023002f000001331123270e042322263d013315141633323635362723223d01343b0132 +1d01143323223d01343b01321d01140136443f060205141726154d3d43262a2d3503893a09093a09893a08083a090185fe7c39020a17120e4852f4f034343b32eb500934090934090934090934090000 +0002001aff6b019e023b0003001a000001072337173302070e032b01353033323e02373631033313014677386659488c270e20241912362e0f17120a060ca0487b023b8383b6feaf62232c1205360c18 +13101d017ffed00000020032ff6b01860220000d00170000133216151423222715231133153612323635342622061514da505bab432044441f185937395638018d6666cc41ca02b4d03dfe9d47505046 +465050000003001aff6b019e0211000b0017002e00001323223d01343b01321d01143323223d01343b01321d0114173302070e032b01353033323e02373631033313af3a09093a098939090939090c48 +8c270e20241912362e0f17120a060ca0487b01cb09340909340909340909340946feaf62232c1205360c1813101d017ffed0000000030026fff501920208002b003a003e0000251514161f012326270e +012322263534363332313c022e052322060f01353e06333203323e02272a02230e0115141613233533017e0a0505440907154c2641505b5b5c0206080f141e122647101103190b1811181a0da8c22534 +1a0a0101232f0b3c3433aadddde27419370f0f16252025403c3e46010f09120d100b0a05120a093f01090308030402fe9b1d2f321a02202c262401a93400000000030015000001a3006a000f001f002f +00002532161d0114062b0122263d013436332332161d0114062b0122263d013436332332161d0114062b0122263d01343633019605070705460507070551050707054605070705510507070547040808 +04690705510507070551050707055105070705510507070551050707055105070001001efff901990214002b0000012207330723061514153307231e0333323637150623222627233733263437233733 +3e01333217152e01012c6e14b212a30184116f061b262517143d1b2f3d58670e41122c02023e122f0e675341301c3d01dc90241e04110f252c3c1d0a1318471c685f251d091c245f691d481815000000 +00010018008101a0012c00050000011523352135019f3efeb7012cab703b000000000016010e0001000000000000004700900001000000000001000d00f4000100000000000200070112000100000000 +0003001a01500001000000000004000d01870001000000000005002301dd00010000000000060014022b000100000000000900210284000100000000000d000b02be0001000000000010000d02e60001 +000000000011000703040003000104090000008e00000003000104090001001a00d80003000104090002000e010200030001040900030034011a0003000104090004001a016b00030001040900050046 +0195000300010409000600280201000300010409000900420240000300010409000d001602a60003000104090010001a02ca0003000104090011000e02f40043006f0070007900720069006700680074 +00200028006300290020003200300032003600200044006900730063006f002000480065006c006c006f002c00200043006f007000790072006900670068007400200028006300290020003200300031 +0039002c00320030003200330020005400720069007300740061006e0020004700720069006d006d006500720000436f7079726967687420286329203230323620446973636f2048656c6c6f2c20436f +707972696768742028632920323031392c32303233205472697374616e204772696d6d65720000500072006f0067006700790046006f00720065007600650072000050726f676779466f726576657200 +0052006500670075006c006100720000526567756c6172000031002e003000310032003b00500072006f0067006700790046006f007200650076006500720052006500670075006c006100720000312e +3031323b50726f676779466f7265766572526567756c61720000500072006f0067006700790046006f00720065007600650072000050726f676779466f72657665720000560065007200730069006f00 +6e00200031002e003000310032003b0046006f006e007400730065006c00660020004d0061006b0065007200200033002e0035002e00310037000056657273696f6e20312e3031323b466f6e7473656c +66204d616b657220332e352e31370000500072006f0067006700790046006f007200650076006500720052006500670075006c00610072000050726f676779466f7265766572526567756c6172000054 +00720069007300740061006e0020004700720069006d006d00650072002c00200054006800690065006200610075006c007400200043006f00750072006f007400005472697374616e204772696d6d65 +722c20546869656261756c7420436f75726f7400004d004900540020004c006900630065006e0073006500004d4954204c6963656e73650000500072006f0067006700790046006f0072006500760065 +0072000050726f676779466f7265766572000052006500670075006c006100720000526567756c6172000000000200000000000000000000000000010000000000000000000000000000000000c20000 +000100020003000400050006000700080009000a000b000c000d000e000f0010001100120013001400150016001700180019001a001b001c001d001e001f002000210022002300240025002600270028 +0029002a002b002c002d002e002f0030003100320033003400350036003700380039003a003b003c003d003e003f0040004100420043004400450046004700480049004a004b004c004d004e004f0050 +005100520053005400550056005700580059005a005b005c005d005e01020060006100a30084008500bd009600e80086008e008b009d00a9008a01030083009300f200f3008d0097008800c300de00f1 +009e00aa00f500f400f600a200ad00c900c700ae006200630090006400cb006500c800ca00cf00cc00cd00ce00e9006600d300d100af006700f0009100d600d400d5006800eb00ed0089006a0069006b +006d006c006e00a0006f0071007000720073007500740076007700ea0078007a0079007b007d007c00b800a1007f007e0080008100ec00ee00ba010400ab010501060b766572746963616c626172096f +76657273636f726507616d6163726f6e044575726f07756e696539313200000000000001ffff000200010000000c00000010001800020000000400000002000000010000000100000000000100000000 +e50db79300000000e5afbb4200000000e5b3d43b +]], +} diff --git a/imgui/imgui.lua b/imgui/imgui.lua index dd0588d..cd4f837 100644 --- a/imgui/imgui.lua +++ b/imgui/imgui.lua @@ -59,7 +59,7 @@ function ImGui._GetTypeFunc() upvalue_name, type = debug.getupvalue(_G.type, 1) assert(upvalue_name == "C_type") else - type = _G.type + type = getfenv(0).type or _G.type -- [Roblox] _G is not the global table there end return type end diff --git a/imgui/init.lua b/imgui/init.lua index b46e91e..961a080 100644 --- a/imgui/init.lua +++ b/imgui/init.lua @@ -1,3 +1,17 @@ +-- [Roblox] `imgui` is a ModuleScript (this file) whose descendants are the other files as ModuleScripts +-- (what Rojo produces from this folder). ModuleScripts don't share globals, so every imgui file runs inside +-- one shared environment table (_G.__IMGUI_ENV). require() of this module returns that environment. +if game and script then + local env = setmetatable({}, { __index = getfenv(1) }) + env.IMGUI_ROOT = script + _G.__IMGUI_ENV = env + require(script:FindFirstChild("imgui")) + require(script:FindFirstChild("imgui_impl_roblox", true)) + require(script:FindFirstChild("imgui_demo")) + return env +end + +-- LOVE / LuaJIT require("imgui.imgui") require("imgui.backend.imgui_impl_love") -require("imgui.imgui_demo") \ No newline at end of file +require("imgui.imgui_demo") diff --git a/main.lua b/main.lua index bda24fb..fb86815 100755 --- a/main.lua +++ b/main.lua @@ -1,34 +1,46 @@ -require("imgui") +-- Roblox version (LocalScript). The LOVE version lives in main_love.lua. +if not game then require("main_love") return end -- running under LOVE: use the LOVE entry point -local RunService = Instance.new("RunService") +local ReplicatedStorage = game:GetService("ReplicatedStorage") +local RunService = game:GetService("RunService") + +-- `imgui` and CanvasDraw (https://create.roblox.com/store/asset/8314640895/CanvasDraw) are ModuleScripts in ReplicatedStorage +local G = require(ReplicatedStorage:WaitForChild("imgui")) -- the shared imgui environment +local CanvasDraw = require(ReplicatedStorage:WaitForChild("CanvasDraw")) + +local ImGui, ImVec4, ImGuiConfigFlags, ImGui_ImplRoblox = G.ImGui, G.ImVec4, G.ImGuiConfigFlags, G.ImGui_ImplRoblox local main_scale = 1.0 local clear_color = ImVec4(0.45, 0.55, 0.60, 1.00) +local show_demo_window = true +local show_another_window = false local f = 0.0 local counter = 0 ImGui.CreateContext() local io = ImGui.GetIO() -io.ConfigFlags = bit.bor(io.ConfigFlags, ImGuiConfigFlags.NavEnableKeyboard) ---io.ConfigFlags = bit.bor(io.ConfigFlags, ImGuiConfigFlags.ViewportsEnable) +io.ConfigFlags = bit32.bor(io.ConfigFlags, ImGuiConfigFlags.NavEnableKeyboard) local style = ImGui.GetStyle() style:ScaleAllSizes(main_scale) style.FontScaleDpi = main_scale -ImGui_ImplLove.Init() +ImGui_ImplRoblox.Init(CanvasDraw) -RunService.Stepped:Connect(function(dt) - ImGui_ImplLove.NewFrame() +RunService.Stepped:Connect(function() + ImGui_ImplRoblox.NewFrame() ImGui.NewFrame() - ImGui.ShowDemoWindow() + if show_demo_window then + ImGui.ShowDemoWindow() + end do ImGui.Begin("Hello, world!") ImGui.Text("This is some useful text.") + local _ _, show_demo_window = ImGui.Checkbox("Demo Window", show_demo_window) _, show_another_window = ImGui.Checkbox("Another Window", show_another_window) @@ -58,22 +70,6 @@ RunService.Stepped:Connect(function(dt) end ImGui.EndFrame() - return ImGui.Render() + ImGui.Render() + ImGui_ImplRoblox.RenderDrawData(ImGui.GetDrawData()) end) - -RunService.PreAnimation:Connect(function() - ImGui_ImplLove.RenderDrawData(ImGui.GetDrawData()) - - if bit.band(io.ConfigFlags, ImGuiConfigFlags.ViewportsEnable) ~= 0 then - ImGui.UpdatePlatformWindows() - ImGui.RenderPlatformWindowsDefault() - end -end) - -function love.keypressed(k) ImGui_ImplLove.KeyPressed(k) end -function love.keyreleased(k) ImGui_ImplLove.KeyReleased(k) end -function love.mousepressed(x, y, b) ImGui_ImplLove.MousePressed(x, y, b) end -function love.mousereleased(x, y, b) ImGui_ImplLove.MouseReleased(x, y, b) end -function love.wheelmoved(x, y) ImGui_ImplLove.WheelMoved(x, y) end -function love.textinput(t) ImGui_ImplLove.TextInput(t) end -function love.mousemoved(x, y) ImGui_ImplLove.MouseMoved(x, y) end diff --git a/main_love.lua b/main_love.lua new file mode 100755 index 0000000..8c9f315 --- /dev/null +++ b/main_love.lua @@ -0,0 +1,79 @@ +require("imgui") + +local RunService = Instance.new("RunService") + +local main_scale = 1.0 +local clear_color = ImVec4(0.45, 0.55, 0.60, 1.00) +local f = 0.0 +local counter = 0 + +ImGui.CreateContext() + +local io = ImGui.GetIO() +io.ConfigFlags = bit32.bor(io.ConfigFlags, ImGuiConfigFlags.NavEnableKeyboard) +--io.ConfigFlags = bit32.bor(io.ConfigFlags, ImGuiConfigFlags.ViewportsEnable) + +local style = ImGui.GetStyle() +style:ScaleAllSizes(main_scale) +style.FontScaleDpi = main_scale + +ImGui_ImplLove.Init() + +RunService.Stepped:Connect(function(dt) + ImGui_ImplLove.NewFrame() + ImGui.NewFrame() + + ImGui.ShowDemoWindow() + + do + ImGui.Begin("Hello, world!") + + ImGui.Text("This is some useful text.") + _, show_demo_window = ImGui.Checkbox("Demo Window", show_demo_window) + _, show_another_window = ImGui.Checkbox("Another Window", show_another_window) + + f = ImGui.SliderFloat("float", f, 0.0, 1.0) + ImGui.ColorEdit3("clear color", clear_color) + + if ImGui.Button("Button") then + counter = counter + 1 + end + ImGui.SameLine() + ImGui.Text("counter = %d", counter) + + ImGui.Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0 / io.Framerate, io.Framerate) + + ImGui.End() + end + + if show_another_window then + show_another_window = ImGui.Begin("Another Window", show_another_window) + + ImGui.Text("Hello from another window!") + if ImGui.Button("Close Me") then + show_another_window = false + end + + ImGui.End() + end + + ImGui.EndFrame() + return ImGui.Render() +end) + +RunService.PreAnimation:Connect(function() + ImGui_ImplLove.RenderDrawData(ImGui.GetDrawData()) + + if bit32.band(io.ConfigFlags, ImGuiConfigFlags.ViewportsEnable) ~= 0 then + ImGui.UpdatePlatformWindows() + ImGui.RenderPlatformWindowsDefault() + end +end) + +function love.keypressed(k) ImGui_ImplLove.KeyPressed(k) end +function love.keyreleased(k) ImGui_ImplLove.KeyReleased(k) end +function love.mousepressed(x, y, b) ImGui_ImplLove.MousePressed(x, y, b) end +function love.mousereleased(x, y, b) ImGui_ImplLove.MouseReleased(x, y, b) end +function love.wheelmoved(x, y) ImGui_ImplLove.WheelMoved(x, y) end +function love.textinput(t) ImGui_ImplLove.TextInput(t) end +function love.mousemoved(x, y) ImGui_ImplLove.MouseMoved(x, y) end