From 357a7237a498cc3dd68ea0c5d4aeed30b870da61 Mon Sep 17 00:00:00 2001 From: fysx Date: Fri, 3 Jul 2015 19:09:18 +0200 Subject: [PATCH] =?UTF-8?q?Using=20latest=20android=20branch=20of=20L?= =?UTF-8?q?=C3=96VE=20(6d14516b05c9)=20that=20now=20syncs=20with=20default?= =?UTF-8?q?=20(woooo!)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jni/love/Android.mk | 1 + jni/love/src/common/Exception.cpp | 6 +- jni/love/src/common/Exception.h | 2 +- jni/love/src/common/Matrix.cpp | 168 +- jni/love/src/common/Matrix.h | 115 +- jni/love/src/common/OSX.h | 63 + jni/love/src/common/OSX.mm | 95 + jni/love/src/common/Object.cpp | 19 +- jni/love/src/common/Object.h | 14 +- jni/love/src/common/Variant.cpp | 11 +- jni/love/src/common/Variant.h | 1 - jni/love/src/common/Vector.h | 8 +- jni/love/src/common/config.h | 27 +- jni/love/src/common/iOS.h | 66 + jni/love/src/common/iOS.mm | 327 ++ jni/love/src/common/int.h | 2 - jni/love/src/common/runtime.cpp | 234 +- jni/love/src/common/runtime.h | 108 +- jni/love/src/common/types.cpp | 219 + jni/love/src/common/types.h | 91 +- jni/love/src/common/version.h | 14 +- jni/love/src/common/wrap_Data.cpp | 4 +- jni/love/src/libraries/enet/enet.cpp | 60 +- jni/love/src/libraries/glad/glad.cpp | 3275 +++++------- jni/love/src/libraries/glad/glad.hpp | 4571 +++++----------- jni/love/src/libraries/glad/gladfuncs.hpp | 1230 ++--- jni/love/src/libraries/lodepng/lodepng.cpp | 1459 +++--- jni/love/src/libraries/lodepng/lodepng.h | 170 +- .../libraries/luasocket/libluasocket/except.c | 4 +- .../libraries/luasocket/libluasocket/inet.c | 4 +- .../luasocket/libluasocket/luasocket.c | 6 +- .../libraries/luasocket/libluasocket/mime.c | 6 +- .../libraries/luasocket/libluasocket/select.c | 4 +- .../libraries/luasocket/libluasocket/tcp.c | 4 +- .../luasocket/libluasocket/timeout.c | 4 +- .../libraries/luasocket/libluasocket/udp.c | 4 +- .../libraries/luasocket/libluasocket/unix.c | 13 +- jni/love/src/libraries/luautf8/lutf8lib.c | 28 +- jni/love/src/libraries/lz4/lz4.c | 1516 ++++++ jni/love/src/libraries/lz4/lz4.h | 360 ++ jni/love/src/libraries/lz4/lz4hc.c | 730 +++ jni/love/src/libraries/lz4/lz4hc.h | 189 + .../src/libraries/noise1234/noise1234.cpp | 528 ++ jni/love/src/libraries/noise1234/noise1234.h | 57 + .../libraries/noise1234/simplexnoise1234.cpp | 266 +- .../libraries/noise1234/simplexnoise1234.h | 17 +- jni/love/src/libraries/stb/stb_image.h | 3022 ++++++++--- jni/love/src/love.cpp | 47 +- jni/love/src/modules/audio/Audio.cpp | 6 +- jni/love/src/modules/audio/Source.cpp | 5 + jni/love/src/modules/audio/Source.h | 3 +- jni/love/src/modules/audio/null/Source.cpp | 5 - jni/love/src/modules/audio/null/Source.h | 1 - jni/love/src/modules/audio/openal/Audio.h | 7 +- jni/love/src/modules/audio/openal/Pool.cpp | 5 +- jni/love/src/modules/audio/openal/Pool.h | 9 +- jni/love/src/modules/audio/openal/Source.cpp | 152 +- jni/love/src/modules/audio/openal/Source.h | 20 +- jni/love/src/modules/audio/wrap_Audio.cpp | 20 +- jni/love/src/modules/audio/wrap_Source.cpp | 64 +- jni/love/src/modules/audio/wrap_Source.h | 2 +- jni/love/src/modules/event/Event.h | 7 +- jni/love/src/modules/event/sdl/Event.cpp | 314 +- jni/love/src/modules/event/sdl/Event.h | 5 - .../modules/event/{sdl => }/wrap_Event.cpp | 20 +- .../src/modules/event/{sdl => }/wrap_Event.h | 9 +- .../src/modules/filesystem/DroppedFile.cpp | 256 + jni/love/src/modules/filesystem/DroppedFile.h | 83 + jni/love/src/modules/filesystem/File.cpp | 70 +- jni/love/src/modules/filesystem/File.h | 20 +- .../src/modules/filesystem/Filesystem.cpp | 105 + jni/love/src/modules/filesystem/Filesystem.h | 265 + .../src/modules/filesystem/physfs/File.cpp | 131 +- jni/love/src/modules/filesystem/physfs/File.h | 35 +- .../modules/filesystem/physfs/Filesystem.cpp | 244 +- .../modules/filesystem/physfs/Filesystem.h | 194 +- .../modules/filesystem/wrap_DroppedFile.cpp | 62 + .../src/modules/filesystem/wrap_DroppedFile.h | 39 + jni/love/src/modules/filesystem/wrap_File.cpp | 146 +- jni/love/src/modules/filesystem/wrap_File.h | 5 +- .../src/modules/filesystem/wrap_FileData.cpp | 4 +- .../modules/filesystem/wrap_Filesystem.cpp | 157 +- .../src/modules/filesystem/wrap_Filesystem.h | 4 +- .../src/modules/font/BMFontRasterizer.cpp | 338 ++ jni/love/src/modules/font/BMFontRasterizer.h | 90 + jni/love/src/modules/font/Font.cpp | 105 + jni/love/src/modules/font/Font.h | 29 +- jni/love/src/modules/font/GlyphData.cpp | 2 +- jni/love/src/modules/font/ImageRasterizer.cpp | 22 +- jni/love/src/modules/font/ImageRasterizer.h | 18 +- jni/love/src/modules/font/Rasterizer.cpp | 5 + jni/love/src/modules/font/Rasterizer.h | 5 + .../src/modules/font/TrueTypeRasterizer.cpp | 49 + .../src/modules/font/TrueTypeRasterizer.h | 62 + jni/love/src/modules/font/freetype/Font.cpp | 76 +- jni/love/src/modules/font/freetype/Font.h | 17 +- .../font/freetype/TrueTypeRasterizer.cpp | 56 +- .../font/freetype/TrueTypeRasterizer.h | 25 +- .../src/modules/font/freetype/wrap_Font.cpp | 132 - jni/love/src/modules/font/wrap_Font.cpp | 235 + .../modules/font/{freetype => }/wrap_Font.h | 12 +- jni/love/src/modules/font/wrap_GlyphData.cpp | 6 +- jni/love/src/modules/font/wrap_Rasterizer.cpp | 6 +- jni/love/src/modules/graphics/Graphics.cpp | 115 +- jni/love/src/modules/graphics/Graphics.h | 62 +- jni/love/src/modules/graphics/Quad.cpp | 21 +- jni/love/src/modules/graphics/Quad.h | 4 +- jni/love/src/modules/graphics/Texture.cpp | 32 +- jni/love/src/modules/graphics/Texture.h | 18 +- .../src/modules/graphics/opengl/Canvas.cpp | 1108 ++-- jni/love/src/modules/graphics/opengl/Canvas.h | 51 +- jni/love/src/modules/graphics/opengl/Font.cpp | 745 ++- jni/love/src/modules/graphics/opengl/Font.h | 136 +- .../src/modules/graphics/opengl/GLBuffer.cpp | 343 ++ .../src/modules/graphics/opengl/GLBuffer.h | 398 ++ .../src/modules/graphics/opengl/Graphics.cpp | 805 +-- .../src/modules/graphics/opengl/Graphics.h | 116 +- .../src/modules/graphics/opengl/Image.cpp | 958 ++-- jni/love/src/modules/graphics/opengl/Image.h | 113 +- jni/love/src/modules/graphics/opengl/Mesh.cpp | 714 ++- jni/love/src/modules/graphics/opengl/Mesh.h | 198 +- .../src/modules/graphics/opengl/OpenGL.cpp | 476 +- jni/love/src/modules/graphics/opengl/OpenGL.h | 211 +- .../graphics/opengl/ParticleSystem.cpp | 79 +- .../modules/graphics/opengl/ParticleSystem.h | 14 +- .../src/modules/graphics/opengl/Polyline.cpp | 146 +- .../src/modules/graphics/opengl/Polyline.h | 37 +- .../src/modules/graphics/opengl/Shader.cpp | 462 +- jni/love/src/modules/graphics/opengl/Shader.h | 53 +- .../modules/graphics/opengl/SpriteBatch.cpp | 110 +- .../src/modules/graphics/opengl/SpriteBatch.h | 31 +- jni/love/src/modules/graphics/opengl/Text.cpp | 279 + jni/love/src/modules/graphics/opengl/Text.h | 103 + .../modules/graphics/opengl/VertexBuffer.cpp | 486 -- .../modules/graphics/opengl/VertexBuffer.h | 533 -- .../modules/graphics/opengl/wrap_Canvas.cpp | 78 +- .../src/modules/graphics/opengl/wrap_Canvas.h | 6 +- .../src/modules/graphics/opengl/wrap_Font.cpp | 45 +- .../src/modules/graphics/opengl/wrap_Font.h | 1 + .../modules/graphics/opengl/wrap_Graphics.cpp | 774 ++- .../modules/graphics/opengl/wrap_Graphics.h | 22 +- .../modules/graphics/opengl/wrap_Graphics.lua | 266 + .../modules/graphics/opengl/wrap_Image.cpp | 56 +- .../src/modules/graphics/opengl/wrap_Image.h | 3 +- .../src/modules/graphics/opengl/wrap_Mesh.cpp | 401 +- .../src/modules/graphics/opengl/wrap_Mesh.h | 14 +- .../graphics/opengl/wrap_ParticleSystem.cpp | 45 +- .../modules/graphics/opengl/wrap_Shader.cpp | 37 +- .../graphics/opengl/wrap_SpriteBatch.cpp | 49 +- .../graphics/opengl/wrap_SpriteBatch.h | 3 - .../src/modules/graphics/opengl/wrap_Text.cpp | 189 + .../Mouse.cpp => graphics/opengl/wrap_Text.h} | 49 +- .../graphics/{opengl => }/wrap_Quad.cpp | 7 +- .../modules/graphics/{opengl => }/wrap_Quad.h | 11 +- .../graphics/{opengl => }/wrap_Texture.cpp | 6 +- .../graphics/{opengl => }/wrap_Texture.h | 9 +- jni/love/src/modules/image/CompressedData.cpp | 127 - .../src/modules/image/CompressedImageData.cpp | 139 + ...CompressedData.h => CompressedImageData.h} | 30 +- jni/love/src/modules/image/Image.h | 8 +- jni/love/src/modules/image/ImageData.cpp | 51 +- jni/love/src/modules/image/ImageData.h | 34 +- .../image/magpie/CompressedFormatHandler.h | 12 +- ...ressedData.cpp => CompressedImageData.cpp} | 52 +- ...CompressedData.h => CompressedImageData.h} | 23 +- .../src/modules/image/magpie/DevilHandler.cpp | 232 - .../modules/image/magpie/FormatHandler.cpp | 4 +- .../src/modules/image/magpie/FormatHandler.h | 17 +- jni/love/src/modules/image/magpie/Image.cpp | 16 +- jni/love/src/modules/image/magpie/Image.h | 4 +- .../src/modules/image/magpie/ImageData.cpp | 9 +- jni/love/src/modules/image/magpie/ImageData.h | 2 +- .../src/modules/image/magpie/JPEGHandler.cpp | 166 - .../src/modules/image/magpie/KTXHandler.cpp | 56 +- .../src/modules/image/magpie/KTXHandler.h | 2 +- .../src/modules/image/magpie/PKMHandler.cpp | 30 +- .../src/modules/image/magpie/PKMHandler.h | 2 +- .../src/modules/image/magpie/PNGHandler.cpp | 22 +- .../src/modules/image/magpie/PNGHandler.h | 4 +- .../src/modules/image/magpie/PVRHandler.cpp | 29 +- .../src/modules/image/magpie/PVRHandler.h | 2 +- .../src/modules/image/magpie/STBHandler.cpp | 32 +- .../src/modules/image/magpie/STBHandler.h | 13 +- .../src/modules/image/magpie/ddsHandler.cpp | 44 +- .../src/modules/image/magpie/ddsHandler.h | 6 +- ...dData.cpp => wrap_CompressedImageData.cpp} | 50 +- ...ilHandler.h => wrap_CompressedImageData.h} | 50 +- jni/love/src/modules/image/wrap_Image.cpp | 37 +- jni/love/src/modules/image/wrap_Image.h | 2 +- jni/love/src/modules/image/wrap_ImageData.cpp | 142 +- jni/love/src/modules/image/wrap_ImageData.lua | 189 + .../src/modules/joystick/sdl/Joystick.cpp | 14 +- jni/love/src/modules/joystick/sdl/Joystick.h | 2 +- .../modules/joystick/sdl/JoystickModule.cpp | 8 +- .../src/modules/joystick/wrap_Joystick.cpp | 10 +- .../modules/joystick/wrap_JoystickModule.cpp | 10 +- jni/love/src/modules/keyboard/Keyboard.cpp | 7 +- jni/love/src/modules/keyboard/Keyboard.h | 35 +- .../src/modules/keyboard/sdl/Keyboard.cpp | 58 +- jni/love/src/modules/keyboard/sdl/Keyboard.h | 8 +- .../src/modules/keyboard/wrap_Keyboard.cpp | 42 +- jni/love/src/modules/keyboard/wrap_Keyboard.h | 3 +- jni/love/src/modules/love/love.cpp | 61 +- jni/love/src/modules/love/love.h | 1 + jni/love/src/modules/math/BezierCurve.cpp | 102 +- jni/love/src/modules/math/BezierCurve.h | 26 +- jni/love/src/modules/math/CompressedData.cpp | 78 + .../Texture.h => math/CompressedData.h} | 64 +- jni/love/src/modules/math/Compressor.cpp | 292 ++ jni/love/src/modules/math/Compressor.h | 101 + jni/love/src/modules/math/MathModule.cpp | 59 + jni/love/src/modules/math/MathModule.h | 52 +- jni/love/src/modules/math/RandomGenerator.cpp | 67 +- .../src/modules/math/wrap_BezierCurve.cpp | 65 +- jni/love/src/modules/math/wrap_BezierCurve.h | 3 + .../src/modules/math/wrap_CompressedData.cpp | 65 + .../{image => math}/wrap_CompressedData.h | 14 +- jni/love/src/modules/math/wrap_Math.cpp | 96 +- jni/love/src/modules/math/wrap_Math.h | 2 + .../src/modules/math/wrap_RandomGenerator.cpp | 10 +- jni/love/src/modules/mouse/Mouse.h | 39 +- jni/love/src/modules/mouse/sdl/Mouse.cpp | 86 +- jni/love/src/modules/mouse/sdl/Mouse.h | 42 +- jni/love/src/modules/mouse/wrap_Cursor.cpp | 4 +- jni/love/src/modules/mouse/wrap_Mouse.cpp | 48 +- jni/love/src/modules/physics/box2d/Body.cpp | 6 +- .../src/modules/physics/box2d/ChainShape.cpp | 8 +- .../src/modules/physics/box2d/ChainShape.h | 5 - .../src/modules/physics/box2d/Fixture.cpp | 4 +- jni/love/src/modules/physics/box2d/Joint.cpp | 2 +- .../src/modules/physics/box2d/MotorJoint.h | 2 +- .../src/modules/physics/box2d/Physics.cpp | 14 +- jni/love/src/modules/physics/box2d/Shape.cpp | 4 +- jni/love/src/modules/physics/box2d/World.cpp | 125 +- .../src/modules/physics/box2d/wrap_Body.cpp | 8 +- .../modules/physics/box2d/wrap_ChainShape.cpp | 18 +- .../modules/physics/box2d/wrap_ChainShape.h | 1 - .../physics/box2d/wrap_CircleShape.cpp | 4 +- .../modules/physics/box2d/wrap_Contact.cpp | 10 +- .../physics/box2d/wrap_DistanceJoint.cpp | 4 +- .../modules/physics/box2d/wrap_EdgeShape.cpp | 4 +- .../modules/physics/box2d/wrap_Fixture.cpp | 26 +- .../physics/box2d/wrap_FrictionJoint.cpp | 4 +- .../modules/physics/box2d/wrap_GearJoint.cpp | 4 +- .../src/modules/physics/box2d/wrap_Joint.cpp | 32 +- .../modules/physics/box2d/wrap_MotorJoint.cpp | 4 +- .../modules/physics/box2d/wrap_MouseJoint.cpp | 4 +- .../modules/physics/box2d/wrap_Physics.cpp | 86 +- .../physics/box2d/wrap_PolygonShape.cpp | 4 +- .../physics/box2d/wrap_PrismaticJoint.cpp | 4 +- .../physics/box2d/wrap_PulleyJoint.cpp | 4 +- .../physics/box2d/wrap_RevoluteJoint.cpp | 4 +- .../modules/physics/box2d/wrap_RopeJoint.cpp | 4 +- .../src/modules/physics/box2d/wrap_Shape.cpp | 4 +- .../modules/physics/box2d/wrap_WeldJoint.cpp | 4 +- .../modules/physics/box2d/wrap_WheelJoint.cpp | 4 +- .../src/modules/physics/box2d/wrap_World.cpp | 6 +- jni/love/src/modules/sound/SoundData.cpp | 7 +- .../sound/lullaby/CoreAudioDecoder.cpp | 274 + .../lullaby/CoreAudioDecoder.h} | 66 +- .../src/modules/sound/lullaby/GmeDecoder.h | 2 +- .../modules/sound/lullaby/ModPlugDecoder.cpp | 9 +- .../modules/sound/lullaby/ModPlugDecoder.h | 6 + .../src/modules/sound/lullaby/Mpg123Decoder.h | 2 +- jni/love/src/modules/sound/lullaby/Sound.cpp | 14 +- .../modules/sound/lullaby/VorbisDecoder.cpp | 12 +- .../src/modules/sound/lullaby/VorbisDecoder.h | 2 +- .../src/modules/sound/lullaby/WaveDecoder.cpp | 6 +- jni/love/src/modules/sound/wrap_Decoder.cpp | 4 +- jni/love/src/modules/sound/wrap_Sound.cpp | 20 +- jni/love/src/modules/sound/wrap_SoundData.cpp | 29 +- jni/love/src/modules/sound/wrap_SoundData.lua | 123 + jni/love/src/modules/system/System.cpp | 9 +- jni/love/src/modules/system/wrap_System.cpp | 2 +- jni/love/src/modules/thread/Channel.cpp | 2 +- jni/love/src/modules/thread/Channel.h | 1 + jni/love/src/modules/thread/LuaThread.cpp | 38 +- jni/love/src/modules/thread/Thread.h | 3 +- jni/love/src/modules/thread/wrap_Channel.cpp | 38 +- jni/love/src/modules/thread/wrap_Channel.h | 1 + .../src/modules/thread/wrap_LuaThread.cpp | 4 +- .../src/modules/thread/wrap_ThreadModule.cpp | 16 +- jni/love/src/modules/timer/Timer.cpp | 147 + jni/love/src/modules/timer/Timer.h | 37 +- jni/love/src/modules/timer/sdl/Timer.cpp | 120 +- jni/love/src/modules/timer/sdl/Timer.h | 45 +- jni/love/src/modules/timer/wrap_Timer.cpp | 2 +- jni/love/src/modules/touch/Touch.h | 24 +- jni/love/src/modules/touch/sdl/Touch.cpp | 46 +- jni/love/src/modules/touch/sdl/Touch.h | 9 +- jni/love/src/modules/touch/wrap_Touch.cpp | 60 +- jni/love/src/modules/touch/wrap_Touch.h | 7 +- jni/love/src/modules/window/Window.cpp | 35 +- jni/love/src/modules/window/Window.h | 66 +- jni/love/src/modules/window/sdl/Window.cpp | 714 +-- jni/love/src/modules/window/sdl/Window.h | 41 +- jni/love/src/modules/window/wrap_Window.cpp | 121 +- jni/love/src/modules/window/wrap_Window.h | 5 +- jni/love/src/scripts/boot.lua | 1151 +---- jni/love/src/scripts/boot.lua.h | 4584 +---------------- jni/love/src/scripts/graphics.lua | 308 -- jni/love/src/scripts/graphics.lua.h | 618 --- jni/love/src/scripts/nogame.lua | 1006 ++++ jni/love/src/scripts/nogame.lua.h | 4332 ++++++++++++++++ 304 files changed, 28694 insertions(+), 23064 deletions(-) create mode 100644 jni/love/src/common/OSX.h create mode 100644 jni/love/src/common/OSX.mm create mode 100644 jni/love/src/common/iOS.h create mode 100644 jni/love/src/common/iOS.mm create mode 100644 jni/love/src/common/types.cpp create mode 100755 jni/love/src/libraries/lz4/lz4.c create mode 100755 jni/love/src/libraries/lz4/lz4.h create mode 100755 jni/love/src/libraries/lz4/lz4hc.c create mode 100755 jni/love/src/libraries/lz4/lz4hc.h create mode 100644 jni/love/src/libraries/noise1234/noise1234.cpp create mode 100644 jni/love/src/libraries/noise1234/noise1234.h rename jni/love/src/modules/event/{sdl => }/wrap_Event.cpp (90%) rename jni/love/src/modules/event/{sdl => }/wrap_Event.h (90%) create mode 100644 jni/love/src/modules/filesystem/DroppedFile.cpp create mode 100644 jni/love/src/modules/filesystem/DroppedFile.h create mode 100644 jni/love/src/modules/filesystem/Filesystem.cpp create mode 100644 jni/love/src/modules/filesystem/Filesystem.h create mode 100644 jni/love/src/modules/filesystem/wrap_DroppedFile.cpp create mode 100644 jni/love/src/modules/filesystem/wrap_DroppedFile.h create mode 100644 jni/love/src/modules/font/BMFontRasterizer.cpp create mode 100644 jni/love/src/modules/font/BMFontRasterizer.h create mode 100644 jni/love/src/modules/font/Font.cpp create mode 100644 jni/love/src/modules/font/TrueTypeRasterizer.cpp create mode 100644 jni/love/src/modules/font/TrueTypeRasterizer.h delete mode 100644 jni/love/src/modules/font/freetype/wrap_Font.cpp create mode 100644 jni/love/src/modules/font/wrap_Font.cpp rename jni/love/src/modules/font/{freetype => }/wrap_Font.h (84%) create mode 100644 jni/love/src/modules/graphics/opengl/GLBuffer.cpp create mode 100644 jni/love/src/modules/graphics/opengl/GLBuffer.h create mode 100644 jni/love/src/modules/graphics/opengl/Text.cpp create mode 100644 jni/love/src/modules/graphics/opengl/Text.h delete mode 100644 jni/love/src/modules/graphics/opengl/VertexBuffer.cpp delete mode 100644 jni/love/src/modules/graphics/opengl/VertexBuffer.h create mode 100644 jni/love/src/modules/graphics/opengl/wrap_Graphics.lua create mode 100644 jni/love/src/modules/graphics/opengl/wrap_Text.cpp rename jni/love/src/modules/{mouse/Mouse.cpp => graphics/opengl/wrap_Text.h} (60%) rename jni/love/src/modules/graphics/{opengl => }/wrap_Quad.cpp (93%) rename jni/love/src/modules/graphics/{opengl => }/wrap_Quad.h (86%) rename jni/love/src/modules/graphics/{opengl => }/wrap_Texture.cpp (96%) rename jni/love/src/modules/graphics/{opengl => }/wrap_Texture.h (89%) delete mode 100644 jni/love/src/modules/image/CompressedData.cpp create mode 100644 jni/love/src/modules/image/CompressedImageData.cpp rename jni/love/src/modules/image/{CompressedData.h => CompressedImageData.h} (83%) rename jni/love/src/modules/image/magpie/{CompressedData.cpp => CompressedImageData.cpp} (58%) rename jni/love/src/modules/image/magpie/{CompressedData.h => CompressedImageData.h} (67%) delete mode 100644 jni/love/src/modules/image/magpie/DevilHandler.cpp delete mode 100644 jni/love/src/modules/image/magpie/JPEGHandler.cpp rename jni/love/src/modules/image/{wrap_CompressedData.cpp => wrap_CompressedImageData.cpp} (56%) rename jni/love/src/modules/image/{magpie/DevilHandler.h => wrap_CompressedImageData.h} (55%) create mode 100644 jni/love/src/modules/image/wrap_ImageData.lua create mode 100644 jni/love/src/modules/math/CompressedData.cpp rename jni/love/src/modules/{graphics/opengl/Texture.h => math/CompressedData.h} (51%) create mode 100644 jni/love/src/modules/math/Compressor.cpp create mode 100644 jni/love/src/modules/math/Compressor.h create mode 100644 jni/love/src/modules/math/wrap_CompressedData.cpp rename jni/love/src/modules/{image => math}/wrap_CompressedData.h (77%) create mode 100644 jni/love/src/modules/sound/lullaby/CoreAudioDecoder.cpp rename jni/love/src/modules/{image/magpie/JPEGHandler.h => sound/lullaby/CoreAudioDecoder.h} (50%) create mode 100644 jni/love/src/modules/sound/wrap_SoundData.lua create mode 100644 jni/love/src/modules/timer/Timer.cpp delete mode 100644 jni/love/src/scripts/graphics.lua delete mode 100644 jni/love/src/scripts/graphics.lua.h create mode 100644 jni/love/src/scripts/nogame.lua create mode 100644 jni/love/src/scripts/nogame.lua.h diff --git a/jni/love/Android.mk b/jni/love/Android.mk index b1ecc629..633c7b42 100644 --- a/jni/love/Android.mk +++ b/jni/love/Android.mk @@ -93,6 +93,7 @@ LOCAL_SRC_FILES := \ $(wildcard ${LOCAL_PATH}/src/libraries/noise1234/*.cpp) \ $(wildcard ${LOCAL_PATH}/src/libraries/Wuff/*.c) \ $(wildcard ${LOCAL_PATH}/src/libraries/lodepng/*.cpp) \ + $(wildcard ${LOCAL_PATH}/src/libraries/lz4/*.c) \ )) LOCAL_CXXFLAGS := -std=c++0x diff --git a/jni/love/src/common/Exception.cpp b/jni/love/src/common/Exception.cpp index 69a9639a..d41ce5aa 100644 --- a/jni/love/src/common/Exception.cpp +++ b/jni/love/src/common/Exception.cpp @@ -18,8 +18,8 @@ * 3. This notice may not be removed or altered from any source distribution. **/ -#include "Exception.h" #include "common/config.h" +#include "Exception.h" #include @@ -60,4 +60,8 @@ Exception::Exception(const char *fmt, ...) delete[] buffer; } +Exception::~Exception() throw() +{ +} + } diff --git a/jni/love/src/common/Exception.h b/jni/love/src/common/Exception.h index 84685b9a..53ef0c3d 100644 --- a/jni/love/src/common/Exception.h +++ b/jni/love/src/common/Exception.h @@ -45,7 +45,7 @@ public: * @param fmt The format string (see printf). **/ Exception(const char *fmt, ...); - virtual ~Exception() throw() {} + virtual ~Exception() throw(); /** * Returns a string containing reason for the exception. diff --git a/jni/love/src/common/Matrix.cpp b/jni/love/src/common/Matrix.cpp index d2307ee7..61b2b44e 100644 --- a/jni/love/src/common/Matrix.cpp +++ b/jni/love/src/common/Matrix.cpp @@ -32,17 +32,17 @@ namespace love // | e2 e6 e10 e14 | // | e3 e7 e11 e15 | -Matrix::Matrix() +Matrix4::Matrix4() { setIdentity(); } -Matrix::Matrix(float x, float y, float angle, float sx, float sy, float ox, float oy, float kx, float ky) +Matrix4::Matrix4(float x, float y, float angle, float sx, float sy, float ox, float oy, float kx, float ky) { setTransformation(x, y, angle, sx, sy, ox, oy, kx, ky); } -Matrix::~Matrix() +Matrix4::~Matrix4() { } @@ -55,9 +55,9 @@ Matrix::~Matrix() // | e2 e6 e10 e14 | // | e3 e7 e11 e15 | -Matrix Matrix::operator * (const Matrix &m) const +Matrix4 Matrix4::operator * (const Matrix4 &m) const { - Matrix t; + Matrix4 t; t.e[0] = (e[0]*m.e[0]) + (e[4]*m.e[1]) + (e[8]*m.e[2]) + (e[12]*m.e[3]); t.e[4] = (e[0]*m.e[4]) + (e[4]*m.e[5]) + (e[8]*m.e[6]) + (e[12]*m.e[7]); @@ -82,31 +82,31 @@ Matrix Matrix::operator * (const Matrix &m) const return t; } -void Matrix::operator *= (const Matrix &m) +void Matrix4::operator *= (const Matrix4 &m) { - Matrix t = (*this) * m; - memcpy((void *)this->e, (void *)t.e, sizeof(float)*16); + Matrix4 t = (*this) * m; + memcpy(this->e, t.e, sizeof(float)*16); } -const float *Matrix::getElements() const +const float *Matrix4::getElements() const { return e; } -void Matrix::setIdentity() +void Matrix4::setIdentity() { memset(e, 0, sizeof(float)*16); e[0] = e[5] = e[10] = e[15] = 1; } -void Matrix::setTranslation(float x, float y) +void Matrix4::setTranslation(float x, float y) { setIdentity(); e[12] = x; e[13] = y; } -void Matrix::setRotation(float rad) +void Matrix4::setRotation(float rad) { setIdentity(); float c = cosf(rad), s = sinf(rad); @@ -116,21 +116,21 @@ void Matrix::setRotation(float rad) e[5] = c; } -void Matrix::setScale(float sx, float sy) +void Matrix4::setScale(float sx, float sy) { setIdentity(); e[0] = sx; e[5] = sy; } -void Matrix::setShear(float kx, float ky) +void Matrix4::setShear(float kx, float ky) { setIdentity(); e[1] = ky; e[4] = kx; } -void Matrix::setTransformation(float x, float y, float angle, float sx, float sy, float ox, float oy, float kx, float ky) +void Matrix4::setTransformation(float x, float y, float angle, float sx, float sy, float ox, float oy, float kx, float ky) { memset(e, 0, sizeof(float)*16); // zero out matrix float c = cosf(angle), s = sinf(angle); @@ -149,59 +149,37 @@ void Matrix::setTransformation(float x, float y, float angle, float sx, float sy e[13] = y - ox * e[1] - oy * e[5]; } -void Matrix::translate(float x, float y) +void Matrix4::translate(float x, float y) { - Matrix t; + Matrix4 t; t.setTranslation(x, y); this->operator *=(t); } -void Matrix::rotate(float rad) +void Matrix4::rotate(float rad) { - Matrix t; + Matrix4 t; t.setRotation(rad); this->operator *=(t); } -void Matrix::scale(float sx, float sy) +void Matrix4::scale(float sx, float sy) { - Matrix t; + Matrix4 t; t.setScale(sx, sy); this->operator *=(t); } -void Matrix::shear(float kx, float ky) +void Matrix4::shear(float kx, float ky) { - Matrix t; + Matrix4 t; t.setShear(kx,ky); this->operator *=(t); } -// | x | -// | y | -// | 0 | -// | 1 | -// | e0 e4 e8 e12 | -// | e1 e5 e9 e13 | -// | e2 e6 e10 e14 | -// | e3 e7 e11 e15 | - -void Matrix::transform(Vertex *dst, const Vertex *src, int size) const +Matrix4 Matrix4::ortho(float left, float right, float bottom, float top) { - for (int i = 0; i + void transform(V *dst, const V *src, int size) const; /** * Creates a new orthographic projection matrix with depth in the range of * [-1, 1]. **/ - static Matrix ortho(float left, float right, float bottom, float top); + static Matrix4 ortho(float left, float right, float bottom, float top); private: @@ -171,7 +172,97 @@ private: **/ float e[16]; -}; // Matrix +}; // Matrix4 + +class Matrix3 +{ +public: + + Matrix3(); + + /** + * Constructs a 3x3 matrix from the upper left section of a 4x4 matrix. + **/ + Matrix3(const Matrix4 &mat4); + + ~Matrix3(); + + /** + * Resets this matrix to the identity matrix. + **/ + void setIdentity(); + + Matrix3 operator * (const Matrix3 &m) const; + void operator *= (const Matrix3 &m); + + /** + * Gets a pointer to the 9 array elements. + **/ + const float *getElements() const; + + /** + * Calculates the inverse of the transpose of this matrix. + **/ + Matrix3 transposedInverse() const; + + /** + * Transforms an array of vertices by this matrix. + **/ + template + void transform(V *dst, const V *src, int size) const; + +private: + + /** + * | e0 e3 e6 + * | e1 e4 e7 + * | e2 e5 e8 + **/ + float e[9]; + +}; // Matrix3 + +// | x | +// | y | +// | 0 | +// | 1 | +// | e0 e4 e8 e12 | +// | e1 e5 e9 e13 | +// | e2 e6 e10 e14 | +// | e3 e7 e11 e15 | + +template +void Matrix4::transform(V *dst, const V *src, int size) const +{ + for (int i = 0; i < size; i++) + { + // Store in temp variables in case src = dst + float x = (e[0]*src[i].x) + (e[4]*src[i].y) + (0) + (e[12]); + float y = (e[1]*src[i].x) + (e[5]*src[i].y) + (0) + (e[13]); + + dst[i].x = x; + dst[i].y = y; + } +} + +// | x | +// | y | +// | 1 | +// | e0 e3 e6 | +// | e1 e4 e7 | +// | e2 e5 e8 | +template +void Matrix3::transform(V *dst, const V *src, int size) const +{ + for (int i = 0; i < size; i++) + { + float x = (e[0]*src[i].x) + (e[3]*src[i].y) + (e[6]); + float y = (e[1]*src[i].x) + (e[4]*src[i].y) + (e[7]); + + dst[i].x = x; + dst[i].y = y; + } +} } //love diff --git a/jni/love/src/common/OSX.h b/jni/love/src/common/OSX.h new file mode 100644 index 00000000..69664679 --- /dev/null +++ b/jni/love/src/common/OSX.h @@ -0,0 +1,63 @@ +/** + * Copyright (c) 2006-2015 LOVE Development Team + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. + **/ + +#ifndef LOVE_OSX_H +#define LOVE_OSX_H + +#include "config.h" + +#ifdef LOVE_MACOSX + +#include + +namespace love +{ +namespace osx +{ + +/** + * Returns the filepath of the first detected love file in the Resources folder + * in the main bundle (love.app.) + * Returns an empty string if no love file is found. + **/ +std::string getLoveInResources(); + +/** + * Checks for drop-file events. Returns the filepath if an event occurred, or + * an empty string otherwise. + **/ +std::string checkDropEvents(); + +/** + * Returns the full path to the executable. + **/ +std::string getExecutablePath(); + +/** + * Bounce the dock icon, if the app isn't in the foreground. + **/ +void requestAttention(bool continuous); + +} // osx +} // love + +#endif // LOVE_MACOSX + +#endif // LOVE_OSX_H diff --git a/jni/love/src/common/OSX.mm b/jni/love/src/common/OSX.mm new file mode 100644 index 00000000..e5112b24 --- /dev/null +++ b/jni/love/src/common/OSX.mm @@ -0,0 +1,95 @@ +/** + * Copyright (c) 2006-2015 LOVE Development Team + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. + **/ + +#include "OSX.h" + +#ifdef LOVE_MACOSX + +#import +#import + +#include + +namespace love +{ +namespace osx +{ + +std::string getLoveInResources() +{ + std::string path; + + @autoreleasepool + { + // Check to see if there are any .love files in Resources. + NSString *lovepath = [[NSBundle mainBundle] pathForResource:nil ofType:@"love"]; + + if (lovepath != nil) + path = lovepath.UTF8String; + } + + return path; +} + +std::string checkDropEvents() +{ + std::string dropstr; + SDL_Event event; + + SDL_InitSubSystem(SDL_INIT_VIDEO); + + SDL_PumpEvents(); + if (SDL_PeepEvents(&event, 1, SDL_GETEVENT, SDL_DROPFILE, SDL_DROPFILE) > 0) + { + if (event.type == SDL_DROPFILE) + { + dropstr = std::string(event.drop.file); + SDL_free(event.drop.file); + } + } + + SDL_QuitSubSystem(SDL_INIT_VIDEO); + + return dropstr; +} + +std::string getExecutablePath() +{ + @autoreleasepool + { + return std::string([NSBundle mainBundle].executablePath.UTF8String); + } +} + +void requestAttention(bool continuous) +{ + @autoreleasepool + { + if (continuous) + [NSApp requestUserAttention:NSCriticalRequest]; + else + [NSApp requestUserAttention:NSInformationalRequest]; + } +} + +} // osx +} // love + +#endif // LOVE_MACOSX diff --git a/jni/love/src/common/Object.cpp b/jni/love/src/common/Object.cpp index 291ae1d7..c381a8dc 100644 --- a/jni/love/src/common/Object.cpp +++ b/jni/love/src/common/Object.cpp @@ -25,28 +25,37 @@ namespace love { Object::Object() + : count(1) +{ +} + +Object::Object(const Object & /*other*/) + : count(1) // Always start with a reference count of 1. { - count.value = 1; } Object::~Object() { } -int Object::getReferenceCount() +int Object::getReferenceCount() const { - return SDL_AtomicGet(&count); + return count; } void Object::retain() { - SDL_AtomicIncRef(&count); + count.fetch_add(1, std::memory_order_relaxed); } void Object::release() { - if (SDL_AtomicDecRef(&count)) + // http://www.boost.org/doc/libs/1_56_0/doc/html/atomic/usage_examples.html + if (count.fetch_sub(1, std::memory_order_release) == 1) + { + std::atomic_thread_fence(std::memory_order_acquire); delete this; + } } } // love diff --git a/jni/love/src/common/Object.h b/jni/love/src/common/Object.h index e916c9fd..624957a9 100644 --- a/jni/love/src/common/Object.h +++ b/jni/love/src/common/Object.h @@ -21,12 +21,7 @@ #ifndef LOVE_OBJECT_H #define LOVE_OBJECT_H -/** - * NOTE: the fact that an SDL header is included in such a widely used header - * file is only temporary - in the LOVE 0.10+ codebase we use atomics from - * C++11's standard library. - **/ -#include +#include namespace love { @@ -47,6 +42,7 @@ public: * Constructor. Sets reference count to one. **/ Object(); + Object(const Object &other); /** * Destructor. @@ -57,7 +53,7 @@ public: * Gets the reference count of this Object. * @returns The reference count. **/ - int getReferenceCount(); + int getReferenceCount() const; /** * Retains the Object, i.e. increases the @@ -75,7 +71,7 @@ public: private: // The reference count. - SDL_atomic_t count; + std::atomic count; }; // Object @@ -136,7 +132,7 @@ public: private: T *object; - + }; // StrongRef } // love diff --git a/jni/love/src/common/Variant.cpp b/jni/love/src/common/Variant.cpp index 8a55274f..743a5b62 100644 --- a/jni/love/src/common/Variant.cpp +++ b/jni/love/src/common/Variant.cpp @@ -101,9 +101,8 @@ Variant::Variant(love::Type udatatype, void *userdata) if (udatatype != INVALID_ID) { Proxy *p = (Proxy *) userdata; - flags = p->flags; - data.userdata = p->data; - ((love::Object *) data.userdata)->retain(); + data.userdata = p->object; + p->object->retain(); } else data.userdata = userdata; @@ -223,11 +222,7 @@ void Variant::toLua(lua_State *L) break; case FUSERDATA: if (udatatype != INVALID_ID) - { - const char *name = NULL; - love::types.find(udatatype, name); - luax_pushtype(L, name, flags, (love::Object *) data.userdata); - } + luax_pushtype(L, udatatype, (love::Object *) data.userdata); else lua_pushlightuserdata(L, data.userdata); // I know this is not the same diff --git a/jni/love/src/common/Variant.h b/jni/love/src/common/Variant.h index d52e510f..1a578686 100644 --- a/jni/love/src/common/Variant.h +++ b/jni/love/src/common/Variant.h @@ -76,7 +76,6 @@ public: private: love::Type udatatype; - bits flags; }; // Variant } // love diff --git a/jni/love/src/common/Vector.h b/jni/love/src/common/Vector.h index 3aeb9fdb..76520e8d 100644 --- a/jni/love/src/common/Vector.h +++ b/jni/love/src/common/Vector.h @@ -216,15 +216,15 @@ inline float Vector::normalize(float length) **/ inline Vector::Vector() + : x(0.0f) + , y(0.0f) { - x = 1; - y = 1; } inline Vector::Vector(float x, float y) + : x(x) + , y(y) { - this->x = x; - this->y = y; } inline Vector Vector::operator + (const Vector &v) const diff --git a/jni/love/src/common/config.h b/jni/love/src/common/config.h index 3ec8d7f2..4e13a1bc 100644 --- a/jni/love/src/common/config.h +++ b/jni/love/src/common/config.h @@ -32,16 +32,23 @@ # define LOVE_ANDROID 1 #endif #if defined(__APPLE__) -# define LOVE_MACOSX 1 -# include +# include +# if TARGET_OS_IPHONE +# define LOVE_IOS 1 +# elif TARGET_OS_MAC +# define LOVE_MACOSX 1 +# endif +#endif +#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) +// I know it's not linux, but it seems most "linux-only" code is bsd-compatible +# define LOVE_LINUX 1 #endif // Endianness. -#if defined(__i386__) || defined(__i386) -# define LOVE_LITTLE_ENDIAN 1 -#endif #if defined(__ppc__) || defined(__ppc) || defined(__powerpc__) || defined(__powerpc) # define LOVE_BIG_ENDIAN 1 +#else +# define LOVE_LITTLE_ENDIAN 1 #endif // Warnings. @@ -74,7 +81,7 @@ # define NOMINMAX #endif -#if defined(LOVE_MACOSX) +#if defined(LOVE_MACOSX) || defined(LOVE_IOS) # define LOVE_LEGENDARY_APP_ARGV_HACK #endif @@ -139,4 +146,12 @@ # define LOVE_ENABLE_WUFF #endif +// Check we have a sane configuration +#if !defined(LOVE_WINDOWS) && !defined(LOVE_LINUX) && !defined(LOVE_IOS) && !defined(LOVE_MACOSX) +# error Could not detect target platform +#endif +#if !defined(LOVE_LITTLE_ENDIAN) && !defined(LOVE_BIG_ENDIAN) +# error Could not detect endianness +#endif + #endif // LOVE_CONFIG_H diff --git a/jni/love/src/common/iOS.h b/jni/love/src/common/iOS.h new file mode 100644 index 00000000..84c1e271 --- /dev/null +++ b/jni/love/src/common/iOS.h @@ -0,0 +1,66 @@ +/** + * Copyright (c) 2006-2015 LOVE Development Team + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. + **/ + +#ifndef LOVE_IOS_H +#define LOVE_IOS_H + +#include "config.h" + +#ifdef LOVE_IOS + +#include + +namespace love +{ +namespace ios +{ + +/** + * Gets the filepath of the first detected love file. The main .app Bundle is + * searched first, and then the app's Documents folder. + **/ +std::string getLoveInResources(bool &fused); + +/** + * Gets the directory path where files should be stored. + **/ +std::string getAppdataDirectory(); + +/** + * Get the home directory (on iOS, this really means the app's sandbox dir.) + **/ +std::string getHomeDirectory(); + +/** + * Opens the specified URL with the default program associated with the URL's + * scheme. + **/ +bool openURL(const std::string &url); + +/** + * Returns the full path to the executable. + **/ +std::string getExecutablePath(); + +} // ios +} // love + +#endif // LOVE_IOS +#endif // LOVE_IOS_H diff --git a/jni/love/src/common/iOS.mm b/jni/love/src/common/iOS.mm new file mode 100644 index 00000000..297f463b --- /dev/null +++ b/jni/love/src/common/iOS.mm @@ -0,0 +1,327 @@ +/** + * Copyright (c) 2006-2015 LOVE Development Team + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. + **/ + +#include "iOS.h" + +#ifdef LOVE_IOS + +#import +#import + +#include + +#include + +static NSArray *getLovesInDocuments(); +static bool deleteFileInDocuments(NSString *filename); + +@interface LOVETableViewController : UITableViewController + +- (instancetype)initWithGameList:(NSArray *)list; + +@property (nonatomic) NSMutableArray *gameList; +@property (nonatomic, readonly, copy) NSString *selectedGame; + +@end + +@implementation LOVETableViewController + +- (instancetype)initWithGameList:(NSArray *)list +{ + if ((self = [super init])) + { + _gameList = [[NSMutableArray alloc] initWithArray:list copyItems:YES]; + + self.title = @"LÖVE Games"; + self.navigationItem.rightBarButtonItem = self.editButtonItem; + } + + return self; +} + +- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section +{ + #pragma unused(tableView) + #pragma unused(section) + // We want to list all games plus the no-game screen. + return self.gameList.count + 1; +} + +- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath +{ + static NSString *cellIdentifier = @"LOVETableCell"; + + UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; + if (cell == nil) + cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier]; + + if (indexPath.row < (NSInteger) self.gameList.count) + cell.textLabel.text = self.gameList[indexPath.row]; + else + cell.textLabel.text = @"No-game screen"; + + return cell; +} + +- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath +{ + #pragma unused(tableView) + if (indexPath.row < (NSInteger) self.gameList.count) + _selectedGame = [(NSString *)(self.gameList[indexPath.row]) copy]; + else + { + // We test against nil to check if a game has been selected, so we'll + // just use an empty string instead to represent the no-game screen. + _selectedGame = @""; + } +} + +- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath +{ + if (editingStyle != UITableViewCellEditingStyleDelete) + return; + + if (indexPath.row >= (NSInteger) self.gameList.count) + return; + + NSString *filename = self.gameList[indexPath.row]; + + // Delete the file. + if (deleteFileInDocuments(filename)) + { + [self.gameList removeObjectAtIndex:indexPath.row]; + [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade]; + } +} + +- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath; +{ + #pragma unused(tableView) + // The no-game screen isn't removable. + return indexPath.row < (NSInteger) self.gameList.count; +} + +@end + +static NSString *getDocumentsDirectory() +{ + NSArray *docdirs = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); + return docdirs[0]; +} + +static NSArray *getLovesInDocuments() +{ + NSString *documents = getDocumentsDirectory(); + NSArray *filepaths = [[NSFileManager defaultManager] subpathsOfDirectoryAtPath:documents error:nil]; + return [filepaths pathsMatchingExtensions:@[@"love"]]; +} + +static bool deleteFileInDocuments(NSString *filename) +{ + NSString *documents = getDocumentsDirectory(); + + NSString *file = [documents stringByAppendingPathComponent:filename]; + bool success = [[NSFileManager defaultManager] removeItemAtPath:file error:nil]; + + if (success) + NSLog(@"Deleted file %@ in Documents folder.", filename); + + return success; +} + +static int dropFileEventFilter(void *userdata, SDL_Event *event) +{ + @autoreleasepool + { + if (event->type != SDL_DROPFILE) + return 1; + + NSString *fname = @(event->drop.file); + NSFileManager *fmanager = [NSFileManager defaultManager]; + + if ([fmanager fileExistsAtPath:fname] && [fname.pathExtension isEqual:@"love"]) + { + NSString *documents = getDocumentsDirectory(); + + documents = documents.stringByStandardizingPath.stringByResolvingSymlinksInPath; + fname = fname.stringByStandardizingPath.stringByResolvingSymlinksInPath; + + // Is the file inside the Documents directory? + if ([fname hasPrefix:documents]) + { + LOVETableViewController *vc = (__bridge LOVETableViewController *) userdata; + + // Update the game list. + NSArray *games = getLovesInDocuments(); + vc.gameList = [[NSMutableArray alloc] initWithArray:games copyItems:YES]; + [vc.tableView reloadData]; + + SDL_free(event->drop.file); + return 0; + } + } + + return 1; + } +} + +namespace love +{ +namespace ios +{ + +/** + * Displays a full-screen list of available LOVE games for the user to choose. + * Returns the index of the selected game from the list. The list of games + * includes the no-game screen, and the function will return an index outside + * of the array's range if that is selected. + **/ +static NSString *showGameList(NSArray *filenames) +{ + // Game list view controller. + LOVETableViewController *tablecontroller = [[LOVETableViewController alloc] initWithGameList:filenames]; + + // Navigation view controller (only used for the header bar right now.) + // Contains the game list view/controller. + UINavigationController *navcontroller = [[UINavigationController alloc] initWithRootViewController:tablecontroller]; + + UIWindow *window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; + window.rootViewController = navcontroller; + + SDL_EventFilter oldfilter = nullptr; + void *oldudata = nullptr; + SDL_GetEventFilter(&oldfilter, &oldudata); + + // Manually retain the table VC and use it for the event filter userdata. + // We need to set a custom event filter to update the table when .love files + // are opened by the user. + void *tableudata = (void *) CFBridgingRetain(tablecontroller); + SDL_SetEventFilter(dropFileEventFilter, tableudata); + + [window makeKeyAndVisible]; + + // Process events until a game in the list is selected. + NSRunLoop *runloop = [NSRunLoop currentRunLoop]; + while (tablecontroller.selectedGame == nil) + { + [runloop runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantPast]]; + [runloop runMode:UITrackingRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:1.0/60.0]]; + } + + // The window will get released and cleaned up once we go out of scope. + window.hidden = YES; + + SDL_SetEventFilter(oldfilter, oldudata); + CFBridgingRelease(tableudata); + + return tablecontroller.selectedGame; +} + +std::string getLoveInResources(bool &fused) +{ + fused = false; + std::string path; + + @autoreleasepool + { + // Start by looking in the main bundle (.app) folder for .love files. + NSArray *bundlepaths = [[NSBundle mainBundle] pathsForResourcesOfType:@"love" inDirectory:nil]; + + if (bundlepaths.count > 0) + { + // The game should be fused if we have something here. + fused = true; + return [bundlepaths[0] UTF8String]; + } + + // Otherwise look in the app's Documents directory. The game won't be + // fused. + NSArray *filepaths = getLovesInDocuments(); + + // Let the user select a game from the un-fused list. + NSString *selectedfile = showGameList(filepaths); + + // The string length might be 0 if the no-game screen was selected. + if (selectedfile != nil && selectedfile.length > 0) + { + NSString *documents = getDocumentsDirectory(); + path = [documents stringByAppendingPathComponent:selectedfile].UTF8String; + } + } + + return path; +} + +std::string getAppdataDirectory() +{ + NSSearchPathDirectory searchdir = NSApplicationSupportDirectory; + std::string path; + + @autoreleasepool + { + NSArray *dirs = NSSearchPathForDirectoriesInDomains(searchdir, NSUserDomainMask, YES); + + if (dirs.count > 0) + path = [dirs[0] UTF8String]; + } + + return path; +} + +std::string getHomeDirectory() +{ + std::string path; + + @autoreleasepool + { + path = [NSHomeDirectory() UTF8String]; + } + + return path; +} + +bool openURL(const std::string &url) +{ + bool success = false; + + @autoreleasepool + { + UIApplication *app = [UIApplication sharedApplication]; + NSURL *nsurl = [NSURL URLWithString:@(url.c_str())]; + + if ([app canOpenURL:nsurl]) + success = [app openURL:nsurl]; + } + + return success; +} + +std::string getExecutablePath() +{ + @autoreleasepool + { + return std::string([NSBundle mainBundle].executablePath.UTF8String); + } +} + +} // ios +} // love + +#endif // LOVE_IOS diff --git a/jni/love/src/common/int.h b/jni/love/src/common/int.h index 56a7a9a2..72f60f8b 100644 --- a/jni/love/src/common/int.h +++ b/jni/love/src/common/int.h @@ -31,8 +31,6 @@ #endif // C standard sized integer types. -// This header was added to Visual studio in VS 2012, which is LOVE's current -// minimum supported VS version (as of this comment's commit date.) #include #define LOVE_INT8_MAX 0x7F diff --git a/jni/love/src/common/runtime.cpp b/jni/love/src/common/runtime.cpp index 5c37baba..e7ba8bd9 100644 --- a/jni/love/src/common/runtime.cpp +++ b/jni/love/src/common/runtime.cpp @@ -26,7 +26,6 @@ #include "Object.h" #include "Reference.h" #include "StringMap.h" -#include // C++ #include @@ -36,24 +35,14 @@ namespace love { -static thread::Mutex *gcmutex = nullptr; - /** * Called when an object is collected. The object is released * once in this function, possibly deleting it. **/ static int w__gc(lua_State *L) { - if (!gcmutex) - gcmutex = thread::newMutex(); - Proxy *p = (Proxy *) lua_touserdata(L, 1); - Object *object = (Object *) p->data; - - thread::Lock lock(gcmutex); - - object->release(); - + p->object->release(); return 0; } @@ -67,7 +56,7 @@ static int w__typeOf(lua_State *L) { Proxy *p = (Proxy *)lua_touserdata(L, 1); Type t = luax_type(L, 2); - luax_pushboolean(L, p->flags[t]); + luax_pushboolean(L, typeFlags[p->type][t]); return 1; } @@ -75,13 +64,13 @@ static int w__eq(lua_State *L) { Proxy *p1 = (Proxy *)lua_touserdata(L, 1); Proxy *p2 = (Proxy *)lua_touserdata(L, 2); - luax_pushboolean(L, p1->data == p2->data); + luax_pushboolean(L, p1->object == p2->object); return 1; } Reference *luax_refif(lua_State *L, int type) { - Reference *r = 0; + Reference *r = nullptr; // Create a reference only if the test succeeds. if (lua_type(L, -1) == type) @@ -95,9 +84,7 @@ Reference *luax_refif(lua_State *L, int type) void luax_printstack(lua_State *L) { for (int i = 1; i<=lua_gettop(L); i++) - { std::cout << i << " - " << luaL_typename(L, i) << std::endl; - } } bool luax_toboolean(lua_State *L, int idx) @@ -144,7 +131,7 @@ bool luax_boolflag(lua_State *L, int table_index, const char *key, bool defaultV if (lua_isnoneornil(L, -1)) retval = defaultValue; else - retval = lua_toboolean(L, -1); + retval = lua_toboolean(L, -1) != 0; lua_pop(L, 1); return retval; @@ -201,24 +188,32 @@ int luax_assert_nilerror(lua_State *L, int idx) void luax_setfuncs(lua_State *L, const luaL_Reg *l) { - if (l == 0) + if (l == nullptr) return; - for (; l->name != 0; l++) + for (; l->name != nullptr; l++) { lua_pushcfunction(L, l->func); lua_setfield(L, -2, l->name); } } +int luax_require(lua_State *L, const char *name) +{ + lua_getglobal(L, "require"); + lua_pushstring(L, name); + lua_call(L, 1, 1); + return 1; +} + int luax_register_module(lua_State *L, const WrappedModule &m) { // Put a reference to the C++ module in Lua. luax_insistregistry(L, REGISTRY_MODULES); Proxy *p = (Proxy *)lua_newuserdata(L, sizeof(Proxy)); - p->data = m.module; - p->flags = m.flags; + p->object = m.module; + p->type = m.type; luaL_newmetatable(L, m.module->getName()); lua_pushvalue(L, -1); @@ -237,13 +232,15 @@ int luax_register_module(lua_State *L, const WrappedModule &m) lua_newtable(L); // Register all the functions. - if (m.functions != 0) + if (m.functions != nullptr) luax_setfuncs(L, m.functions); // Register types. - if (m.types != 0) - for (const lua_CFunction *t = m.types; *t != 0; t++) + if (m.types != nullptr) + { + for (const lua_CFunction *t = m.types; *t != nullptr; t++) (*t)(L); + } lua_pushvalue(L, -1); lua_setfield(L, -3, m.name); // love.graphics = table @@ -265,17 +262,17 @@ int luax_preload(lua_State *L, lua_CFunction f, const char *name) return 0; } -int luax_register_type(lua_State *L, const char *tname, const luaL_Reg *f) +int luax_register_type(lua_State *L, love::Type type, const luaL_Reg *f, bool pushmetatable) { // Verify that this type name has a matching Type ID and type name mapping. - love::Type ltype; - if (!love::getType(tname, ltype)) - printf("Missing type entry for type name: %s\n", tname); + const char *tname = "Invalid"; + if (!love::getType(type, tname)) + printf("Missing type name entry for type ID %d\n", type); // Get the place for storing and re-using instantiated love types. - luax_getregistry(L, REGISTRY_TYPES); + luax_getregistry(L, REGISTRY_OBJECTS); - // Create registry._lovetypes if it doesn't exist yet. + // Create registry._loveobjects if it doesn't exist yet. if (!lua_istable(L, -1)) { lua_newtable(L); @@ -291,8 +288,8 @@ int luax_register_type(lua_State *L, const char *tname, const luaL_Reg *f) // setmetatable(newtable, metatable) lua_setmetatable(L, -2); - // registry._lovetypes = newtable - lua_setfield(L, LUA_REGISTRYINDEX, "_lovetypes"); + // registry._loveobjects = newtable + lua_setfield(L, LUA_REGISTRYINDEX, "_loveobjects"); } else lua_pop(L, 1); @@ -325,9 +322,12 @@ int luax_register_type(lua_State *L, const char *tname, const luaL_Reg *f) lua_pushcfunction(L, w__typeOf); lua_setfield(L, -2, "typeOf"); - if (f != 0) + if (f != nullptr) luax_setfuncs(L, f); + if (pushmetatable) + return 1; // leave the metatable on the stack. + lua_pop(L, 1); // Pops metatable. return 0; } @@ -338,19 +338,22 @@ int luax_table_insert(lua_State *L, int tindex, int vindex, int pos) tindex = lua_gettop(L)+1+tindex; if (vindex < 0) vindex = lua_gettop(L)+1+vindex; + if (pos == -1) { lua_pushvalue(L, vindex); - lua_rawseti(L, tindex, lua_objlen(L, tindex)+1); + lua_rawseti(L, tindex, (int) luax_objlen(L, tindex)+1); return 0; } else if (pos < 0) - pos = lua_objlen(L, tindex)+1+pos; - for (int i = lua_objlen(L, tindex)+1; i > pos; i--) + pos = (int) luax_objlen(L, tindex)+1+pos; + + for (int i = (int) luax_objlen(L, tindex)+1; i > pos; i--) { lua_rawgeti(L, tindex, i-1); lua_rawseti(L, tindex, i); } + lua_pushvalue(L, vindex); lua_rawseti(L, tindex, pos); return 0; @@ -382,20 +385,23 @@ int luax_register_searcher(lua_State *L, lua_CFunction f, int pos) return 0; } -void luax_rawnewtype(lua_State *L, const char *name, bits flags, love::Object *object) +void luax_rawnewtype(lua_State *L, love::Type type, love::Object *object) { Proxy *u = (Proxy *)lua_newuserdata(L, sizeof(Proxy)); object->retain(); - u->data = (void *) object; - u->flags = flags; + u->object = object; + u->type = type; + + const char *name = "Invalid"; + getType(type, name); luaL_newmetatable(L, name); lua_setmetatable(L, -2); } -void luax_pushtype(lua_State *L, const char *name, bits flags, love::Object *object) +void luax_pushtype(lua_State *L, love::Type type, love::Object *object) { if (object == nullptr) { @@ -403,18 +409,18 @@ void luax_pushtype(lua_State *L, const char *name, bits flags, love::Object *obj return; } - // Fetch the registry table of instantiated types. - luax_getregistry(L, REGISTRY_TYPES); + // Fetch the registry table of instantiated objects. + luax_getregistry(L, REGISTRY_OBJECTS); // The table might not exist - it should be insisted in luax_register_type. if (!lua_istable(L, -1)) { lua_pop(L, 1); - return luax_rawnewtype(L, name, flags, object); + return luax_rawnewtype(L, type, object); } - // Get the value of lovetypes[object] on the stack. - lua_pushlightuserdata(L, (void *) object); + // Get the value of loveobjects[object] on the stack. + lua_pushlightuserdata(L, object); lua_gettable(L, -2); // If the Proxy userdata isn't in the instantiated types table yet, add it. @@ -422,27 +428,28 @@ void luax_pushtype(lua_State *L, const char *name, bits flags, love::Object *obj { lua_pop(L, 1); - luax_rawnewtype(L, name, flags, object); + luax_rawnewtype(L, type, object); - lua_pushlightuserdata(L, (void *) object); + lua_pushlightuserdata(L, object); lua_pushvalue(L, -2); - // lovetypes[object] = Proxy. + // loveobjects[object] = Proxy. lua_settable(L, -4); } - // Remove the lovetypes table from the stack. + // Remove the loveobjects table from the stack. lua_remove(L, -2); // Keep the Proxy userdata on the stack. } -bool luax_istype(lua_State *L, int idx, love::bits type) +bool luax_istype(lua_State *L, int idx, love::Type type) { if (lua_type(L, idx) != LUA_TUSERDATA) return false; - return ((((Proxy *)lua_touserdata(L, idx))->flags & type) == type); + Proxy *p = (Proxy *) lua_touserdata(L, idx); + return typeFlags[p->type][type]; } int luax_getfunction(lua_State *L, const char *mod, const char *fn) @@ -485,7 +492,8 @@ int luax_convobj(lua_State *L, int idxs[], int n, const char *mod, const char *f lua_call(L, n, 2); // Call the function, n args, one return value (plus optional errstring.) luax_assert_nilerror(L, -2); // Make sure the function returned something. lua_pop(L, 1); // Pop the second return value now that we don't need it. - lua_replace(L, idxs[0]); // Replace the initial argument with the new object. + if (n > 0) + lua_replace(L, idxs[0]); // Replace the initial argument with the new object. return 0; } @@ -548,6 +556,11 @@ int luax_insistglobal(lua_State *L, const char *k) return 1; } +int luax_c_insistglobal(lua_State *L, const char *k) +{ + return luax_insistglobal(L, k); +} + int luax_insistlove(lua_State *L, const char *k) { luax_insistglobal(L, "love"); @@ -581,8 +594,8 @@ int luax_insistregistry(lua_State *L, Registry r) return luax_insistlove(L, "_gc"); case REGISTRY_MODULES: return luax_insistlove(L, "_modules"); - case REGISTRY_TYPES: - return luax_insist(L, LUA_REGISTRYINDEX, "_lovetypes"); + case REGISTRY_OBJECTS: + return luax_insist(L, LUA_REGISTRYINDEX, "_loveobjects"); default: return luaL_error(L, "Attempted to use invalid registry."); } @@ -596,8 +609,8 @@ int luax_getregistry(lua_State *L, Registry r) return luax_getlove(L, "_gc"); case REGISTRY_MODULES: return luax_getlove(L, "_modules"); - case REGISTRY_TYPES: - lua_getfield(L, LUA_REGISTRYINDEX, "_lovetypes"); + case REGISTRY_OBJECTS: + lua_getfield(L, LUA_REGISTRYINDEX, "_loveobjects"); return 1; default: return luaL_error(L, "Attempted to use invalid registry."); @@ -632,105 +645,32 @@ extern "C" int luax_typerror(lua_State *L, int narg, const char *tname) return luaL_argerror(L, narg, msg); } -StringMap::Entry typeEntries[] = +size_t luax_objlen(lua_State *L, int ndx) { - {"Invalid", INVALID_ID}, - - {"Object", OBJECT_ID}, - {"Data", DATA_ID}, - {"Module", MODULE_ID}, - - // Filesystem - {"File", FILESYSTEM_FILE_ID}, - {"FileData", FILESYSTEM_FILE_DATA_ID}, - - // Font - {"GlyphData", FONT_GLYPH_DATA_ID}, - {"Rasterizer", FONT_RASTERIZER_ID}, - - // Graphics - {"Drawable", GRAPHICS_DRAWABLE_ID}, - {"Texture", GRAPHICS_TEXTURE_ID}, - {"Image", GRAPHICS_IMAGE_ID}, - {"Quad", GRAPHICS_QUAD_ID}, - {"Font", GRAPHICS_FONT_ID}, - {"ParticleSystem", GRAPHICS_PARTICLE_SYSTEM_ID}, - {"SpriteBatch", GRAPHICS_SPRITE_BATCH_ID}, - {"Canvas", GRAPHICS_CANVAS_ID}, - {"Shader", GRAPHICS_SHADER_ID}, - {"Mesh", GRAPHICS_MESH_ID}, - - // Image - {"ImageData", IMAGE_IMAGE_DATA_ID}, - {"CompressedData", IMAGE_COMPRESSED_DATA_ID}, - - // Joystick - {"Joystick", JOYSTICK_JOYSTICK_ID}, - - // Math - {"RandomGenerator", MATH_RANDOM_GENERATOR_ID}, - {"BezierCurve", MATH_BEZIER_CURVE_ID}, - - // Audio - {"Source", AUDIO_SOURCE_ID}, - - // Sound - {"SoundData", SOUND_SOUND_DATA_ID}, - {"Decoder", SOUND_DECODER_ID}, - - // Mouse - {"Cursor", MOUSE_CURSOR_ID}, - - // Physics - {"World", PHYSICS_WORLD_ID}, - {"Contact", PHYSICS_CONTACT_ID}, - {"Body", PHYSICS_BODY_ID}, - {"Fixture", PHYSICS_FIXTURE_ID}, - {"Shape", PHYSICS_SHAPE_ID}, - {"CircleShape", PHYSICS_CIRCLE_SHAPE_ID}, - {"PolygonShape", PHYSICS_POLYGON_SHAPE_ID}, - {"EdgeShape", PHYSICS_EDGE_SHAPE_ID}, - {"ChainShape", PHYSICS_CHAIN_SHAPE_ID}, - {"Joint", PHYSICS_JOINT_ID}, - {"MouseJoint", PHYSICS_MOUSE_JOINT_ID}, - {"DistanceJoint", PHYSICS_DISTANCE_JOINT_ID}, - {"PrismaticJoint", PHYSICS_PRISMATIC_JOINT_ID}, - {"RevoluteJoint", PHYSICS_REVOLUTE_JOINT_ID}, - {"PulleyJoint", PHYSICS_PULLEY_JOINT_ID}, - {"GearJoint", PHYSICS_GEAR_JOINT_ID}, - {"FrictionJoint", PHYSICS_FRICTION_JOINT_ID}, - {"WeldJoint", PHYSICS_WELD_JOINT_ID}, - {"RopeJoint", PHYSICS_ROPE_JOINT_ID}, - {"WheelJoint", PHYSICS_WHEEL_JOINT_ID}, - {"MotorJoint", PHYSICS_MOTOR_JOINT_ID}, - - // Thread - {"Thread", THREAD_THREAD_ID}, - {"Channel", THREAD_CHANNEL_ID}, - - // The modules themselves. Only add abstracted modules here. - {"filesystem", MODULE_FILESYSTEM_ID}, - {"graphics", MODULE_GRAPHICS_ID}, - {"image", MODULE_IMAGE_ID}, - {"sound", MODULE_SOUND_ID}, -}; - -StringMap types(typeEntries, sizeof(typeEntries)); - -bool getType(const char *in, love::Type &out) -{ - return types.find(in, out); +#if LUA_VERSION_NUM == 501 + return lua_objlen(L, ndx); +#else + return lua_rawlen(L, ndx); +#endif } -bool getType(love::Type in, const char *&out) +void luax_register(lua_State *L, const char *name, const luaL_Reg *l) { - return types.find(in, out); + if (name) + lua_newtable(L); + + luax_setfuncs(L, l); + if (name) + { + lua_pushvalue(L, -1); + lua_setglobal(L, name); + } } Type luax_type(lua_State *L, int idx) { Type t = INVALID_ID; - types.find(luaL_checkstring(L, idx), t); + getType(luaL_checkstring(L, idx), t); return t; } diff --git a/jni/love/src/common/runtime.h b/jni/love/src/common/runtime.h index b4da0b67..f0facdee 100644 --- a/jni/love/src/common/runtime.h +++ b/jni/love/src/common/runtime.h @@ -51,7 +51,7 @@ enum Registry { REGISTRY_GC, REGISTRY_MODULES, - REGISTRY_TYPES + REGISTRY_OBJECTS }; /** @@ -63,10 +63,10 @@ enum Registry struct Proxy { // Holds type information (see types.h). - bits flags; + Type type; - // The light userdata (pointer to the love::Object). - void *data; + // Pointer to the actual object. + Object *object; }; /** @@ -80,15 +80,14 @@ struct WrappedModule // The name for the table to put the functions in, without the 'love'-prefix. const char *name; - // The type flags of this module. - love::bits flags; + // The type of this module. + love::Type type; // The functions of the module (last element {0,0}). const luaL_Reg *functions; // A list of functions which expose the types of the modules (last element 0). const lua_CFunction *types; - }; /** @@ -223,6 +222,13 @@ int luax_assert_nilerror(lua_State *L, int idx); **/ void luax_setfuncs(lua_State *L, const luaL_Reg *l); +/** + * Loads a Lua module using the 'require' function. Leaves the return result on + * the stack. + * @param name The name of the module to require. + **/ +int luax_require(lua_State *L, const char *name); + /** * Register a module in the love table. The love table will be created if it does not exist. * NOTE: The module-object is expected to have a +1 reference count before calling @@ -241,11 +247,11 @@ int luax_preload(lua_State *L, lua_CFunction f, const char *name); /** * Register a new type. - * @param tname The name of the type. This must not conflict with other type names, - * even from other modules. + * @param type The type. * @param f The list of member functions for the type. + * @param pushmetatable Whether to push the type's metatable to the stack. **/ -int luax_register_type(lua_State *L, const char *tname, const luaL_Reg *f = 0); +int luax_register_type(lua_State *L, love::Type type, const luaL_Reg *f = nullptr, bool pushmetatable = false); /** * Do a table.insert from C @@ -270,11 +276,10 @@ int luax_register_searcher(lua_State *L, lua_CFunction f, int pos = -1); * storing the Lua representation in a weak table if it doesn't exist yet. * NOTE: The object will be retained by Lua and released upon garbage collection. * @param L The Lua state. - * @param name The name of the type. This must match the name used with luax_register_type. - * @param flags The type information of the object. + * @param type The type information of the object. * @param object The pointer to the actual object. **/ -void luax_pushtype(lua_State *L, const char *name, bits flags, love::Object *object); +void luax_pushtype(lua_State *L, const love::Type type, love::Object *object); /** * Creates a new Lua representation of the given object *without* checking if it @@ -284,11 +289,10 @@ void luax_pushtype(lua_State *L, const char *name, bits flags, love::Object *obj * Lua-side objects from working in some cases when used as keys in tables. * NOTE: The object will be retained by Lua and released upon garbage collection. * @param L The Lua state. - * @param name The name of the type. This must match the name used with luax_register_type. - * @param flags The type information of the object. + * @param type The type information of the object. * @param object The pointer to the actual object. **/ -void luax_rawnewtype(lua_State *L, const char *name, bits flags, love::Object *object); +void luax_rawnewtype(lua_State *L, love::Type type, love::Object *object); /** * Checks whether the value at idx is a certain type. @@ -297,7 +301,7 @@ void luax_rawnewtype(lua_State *L, const char *name, bits flags, love::Object *o * @param type The type to check for. * @return True if the value is Proxy of the specified type, false otherwise. **/ -bool luax_istype(lua_State *L, int idx, love::bits type); +bool luax_istype(lua_State *L, int idx, love::Type type); /** * Gets the function love.module.function and puts it on top of the stack (alone). If the @@ -390,52 +394,75 @@ extern "C" { // Also called from luasocket int luax_typerror(lua_State *L, int narg, const char *tname); } +/** + * Calls luax_objlen/lua_rawlen depending on version + **/ +size_t luax_objlen(lua_State *L, int ndx); + +extern "C" { // Called by enet and luasocket + void luax_register(lua_State *L, const char *name, const luaL_Reg *l); + int luax_c_insistglobal(lua_State *L, const char *k); +} + /** * Like luax_totype, but causes an error if the value at idx is not Proxy, * or is not the specified type. * @param L The Lua state. * @param idx The index on the stack. - * @param name The name of the type. * @param type The type bit. **/ template -T *luax_checktype(lua_State *L, int idx, const char *name, love::bits type) +T *luax_checktype(lua_State *L, int idx, love::Type type) { if (lua_type(L, idx) != LUA_TUSERDATA) + { + const char *name = "Invalid"; + getType(type, name); luax_typerror(L, idx, name); + } Proxy *u = (Proxy *)lua_touserdata(L, idx); - if ((u->flags & type) != type) + if (!typeFlags[u->type][type]) + { + const char *name = "Invalid"; + getType(type, name); luax_typerror(L, idx, name); + } - return (T *)u->data; + return (T *)u->object; } template -T *luax_getmodule(lua_State *L, const char *k, love::bits type) +T *luax_getmodule(lua_State *L, love::Type type) { + const char *name = "Invalid"; + getType(type, name); + luax_insistregistry(L, REGISTRY_MODULES); - lua_getfield(L, -1, k); + lua_getfield(L, -1, name); if (!lua_isuserdata(L, -1)) - luaL_error(L, "Tried to get nonexistant module %s.", k); + luaL_error(L, "Tried to get nonexistant module %s.", name); Proxy *u = (Proxy *)lua_touserdata(L, -1); - if ((u->flags & type) != type) - luaL_error(L, "Incorrect module %s", k); + if (!typeFlags[u->type][type]) + luaL_error(L, "Incorrect module %s", name); lua_pop(L, 2); - return (T *)u->data; + return (T *)u->object; } template -T *luax_optmodule(lua_State *L, const char *k, love::bits type) +T *luax_optmodule(lua_State *L, love::Type type) { + const char *name = "Invalid"; + getType(type, name); + luax_insistregistry(L, REGISTRY_MODULES); - lua_getfield(L, -1, k); + lua_getfield(L, -1, name); if (!lua_isuserdata(L, -1)) { @@ -445,12 +472,12 @@ T *luax_optmodule(lua_State *L, const char *k, love::bits type) Proxy *u = (Proxy *)lua_touserdata(L, -1); - if ((u->flags & type) != type) - luaL_error(L, "Incorrect module %s", k); - + if (!typeFlags[u->type][type]) + luaL_error(L, "Incorrect module %s", name); + lua_pop(L, 2); - - return (T *) u->data; + + return (T *) u->object; } /** @@ -459,13 +486,12 @@ T *luax_optmodule(lua_State *L, const char *k, love::bits type) * luax_istype, then this can be safely used. Otherwise, use luax_checktype. * @param L The Lua state. * @param idx The index on the stack. - * @param name The name of the type. - * @param type The type bit. + * @param type The type of the object. **/ template -T *luax_totype(lua_State *L, int idx, const char * /* name */, love::bits /* type */) +T *luax_totype(lua_State *L, int idx, love::Type /*type*/) { - return (T *)(((Proxy *)lua_touserdata(L, idx))->data); + return (T *)(((Proxy *)lua_touserdata(L, idx))->object); } Type luax_type(lua_State *L, int idx); @@ -495,7 +521,6 @@ int luax_catchexcept(lua_State *L, const T& func) return luaL_error(L, "%s", lua_tostring(L, -1)); return 0; - } template @@ -513,13 +538,12 @@ int luax_catchexcept(lua_State *L, const T& func, const F& finallyfunc) lua_pushstring(L, e.what()); } - finallyfunc(); + finallyfunc(should_error); if (should_error) return luaL_error(L, "%s", lua_tostring(L, -1)); - + return 0; - } } // love diff --git a/jni/love/src/common/types.cpp b/jni/love/src/common/types.cpp new file mode 100644 index 00000000..7fdf0f01 --- /dev/null +++ b/jni/love/src/common/types.cpp @@ -0,0 +1,219 @@ +/** + * Copyright (c) 2006-2015 LOVE Development Team + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. + **/ + +#include "types.h" +#include "StringMap.h" + +namespace love +{ + +static const TypeBits *createTypeFlags() +{ + static TypeBits b[TYPE_MAX_ENUM]; + TypeBits one = TypeBits(1); + + b[INVALID_ID] = one << INVALID_ID; + + b[OBJECT_ID] = one << OBJECT_ID; + b[DATA_ID] = (one << DATA_ID) | b[OBJECT_ID]; + b[MODULE_ID] = (one << MODULE_ID) | b[OBJECT_ID]; + + // Filesystem. + b[FILESYSTEM_FILE_ID] = (one << FILESYSTEM_FILE_ID) | b[OBJECT_ID]; + b[FILESYSTEM_DROPPED_FILE_ID] = (one << FILESYSTEM_DROPPED_FILE_ID) | b[FILESYSTEM_FILE_ID]; + b[FILESYSTEM_FILE_DATA_ID] = (one << FILESYSTEM_FILE_DATA_ID) | b[DATA_ID]; + + b[FONT_GLYPH_DATA_ID] = (one << FONT_GLYPH_DATA_ID) | b[DATA_ID]; + b[FONT_RASTERIZER_ID] = (one << FONT_RASTERIZER_ID) | b[OBJECT_ID]; + + // Graphics. + b[GRAPHICS_DRAWABLE_ID] = (one << GRAPHICS_DRAWABLE_ID) | b[OBJECT_ID]; + b[GRAPHICS_TEXTURE_ID] = (one << GRAPHICS_TEXTURE_ID) | b[GRAPHICS_DRAWABLE_ID]; + b[GRAPHICS_IMAGE_ID] = (one << GRAPHICS_IMAGE_ID) | b[GRAPHICS_TEXTURE_ID]; + b[GRAPHICS_QUAD_ID] = (one << GRAPHICS_QUAD_ID) | b[OBJECT_ID]; + b[GRAPHICS_FONT_ID] = (one << GRAPHICS_FONT_ID) | b[OBJECT_ID]; + b[GRAPHICS_PARTICLE_SYSTEM_ID] = (one << GRAPHICS_PARTICLE_SYSTEM_ID) | b[GRAPHICS_DRAWABLE_ID]; + b[GRAPHICS_SPRITE_BATCH_ID] = (one << GRAPHICS_SPRITE_BATCH_ID) | b[GRAPHICS_DRAWABLE_ID]; + b[GRAPHICS_CANVAS_ID] = (one << GRAPHICS_CANVAS_ID) | b[GRAPHICS_TEXTURE_ID]; + b[GRAPHICS_SHADER_ID] = (one << GRAPHICS_SHADER_ID) | b[OBJECT_ID]; + b[GRAPHICS_MESH_ID] = (one << GRAPHICS_MESH_ID) | b[GRAPHICS_DRAWABLE_ID]; + b[GRAPHICS_TEXT_ID] = (one << GRAPHICS_TEXT_ID) | b[GRAPHICS_DRAWABLE_ID]; + + // Image. + b[IMAGE_IMAGE_DATA_ID] = (one << IMAGE_IMAGE_DATA_ID) | b[DATA_ID]; + b[IMAGE_COMPRESSED_IMAGE_DATA_ID] = (one << IMAGE_COMPRESSED_IMAGE_DATA_ID) | b[DATA_ID]; + + // Joystick. + b[JOYSTICK_JOYSTICK_ID] = (one << JOYSTICK_JOYSTICK_ID) | b[OBJECT_ID]; + + // Math. + b[MATH_RANDOM_GENERATOR_ID] = (one << MATH_RANDOM_GENERATOR_ID) | b[OBJECT_ID]; + b[MATH_BEZIER_CURVE_ID] = (one << MATH_BEZIER_CURVE_ID) | b[OBJECT_ID]; + b[MATH_COMPRESSED_DATA_ID] = (one <::Entry typeEntries[] = +{ + {"Invalid", INVALID_ID}, + + {"Object", OBJECT_ID}, + {"Data", DATA_ID}, + {"Module", MODULE_ID}, + + // Filesystem + {"File", FILESYSTEM_FILE_ID}, + {"DroppedFile", FILESYSTEM_DROPPED_FILE_ID}, + {"FileData", FILESYSTEM_FILE_DATA_ID}, + + // Font + {"GlyphData", FONT_GLYPH_DATA_ID}, + {"Rasterizer", FONT_RASTERIZER_ID}, + + // Graphics + {"Drawable", GRAPHICS_DRAWABLE_ID}, + {"Texture", GRAPHICS_TEXTURE_ID}, + {"Image", GRAPHICS_IMAGE_ID}, + {"Quad", GRAPHICS_QUAD_ID}, + {"Font", GRAPHICS_FONT_ID}, + {"ParticleSystem", GRAPHICS_PARTICLE_SYSTEM_ID}, + {"SpriteBatch", GRAPHICS_SPRITE_BATCH_ID}, + {"Canvas", GRAPHICS_CANVAS_ID}, + {"Shader", GRAPHICS_SHADER_ID}, + {"Mesh", GRAPHICS_MESH_ID}, + {"Text", GRAPHICS_TEXT_ID}, + + // Image + {"ImageData", IMAGE_IMAGE_DATA_ID}, + {"CompressedImageData", IMAGE_COMPRESSED_IMAGE_DATA_ID}, + + // Joystick + {"Joystick", JOYSTICK_JOYSTICK_ID}, + + // Math + {"RandomGenerator", MATH_RANDOM_GENERATOR_ID}, + {"BezierCurve", MATH_BEZIER_CURVE_ID}, + {"CompressedData", MATH_COMPRESSED_DATA_ID}, + + // Audio + {"Source", AUDIO_SOURCE_ID}, + + // Sound + {"SoundData", SOUND_SOUND_DATA_ID}, + {"Decoder", SOUND_DECODER_ID}, + + // Mouse + {"Cursor", MOUSE_CURSOR_ID}, + + // Physics + {"World", PHYSICS_WORLD_ID}, + {"Contact", PHYSICS_CONTACT_ID}, + {"Body", PHYSICS_BODY_ID}, + {"Fixture", PHYSICS_FIXTURE_ID}, + {"Shape", PHYSICS_SHAPE_ID}, + {"CircleShape", PHYSICS_CIRCLE_SHAPE_ID}, + {"PolygonShape", PHYSICS_POLYGON_SHAPE_ID}, + {"EdgeShape", PHYSICS_EDGE_SHAPE_ID}, + {"ChainShape", PHYSICS_CHAIN_SHAPE_ID}, + {"Joint", PHYSICS_JOINT_ID}, + {"MouseJoint", PHYSICS_MOUSE_JOINT_ID}, + {"DistanceJoint", PHYSICS_DISTANCE_JOINT_ID}, + {"PrismaticJoint", PHYSICS_PRISMATIC_JOINT_ID}, + {"RevoluteJoint", PHYSICS_REVOLUTE_JOINT_ID}, + {"PulleyJoint", PHYSICS_PULLEY_JOINT_ID}, + {"GearJoint", PHYSICS_GEAR_JOINT_ID}, + {"FrictionJoint", PHYSICS_FRICTION_JOINT_ID}, + {"WeldJoint", PHYSICS_WELD_JOINT_ID}, + {"RopeJoint", PHYSICS_ROPE_JOINT_ID}, + {"WheelJoint", PHYSICS_WHEEL_JOINT_ID}, + {"MotorJoint", PHYSICS_MOTOR_JOINT_ID}, + + // Thread + {"Thread", THREAD_THREAD_ID}, + {"Channel", THREAD_CHANNEL_ID}, + + // The modules themselves. Only add abstracted modules here. + {"filesystem", MODULE_FILESYSTEM_ID}, + {"graphics", MODULE_GRAPHICS_ID}, + {"image", MODULE_IMAGE_ID}, + {"sound", MODULE_SOUND_ID}, +}; + +StringMap types(typeEntries, sizeof(typeEntries)); + +static_assert((sizeof(typeEntries) / sizeof(typeEntries[0])) == TYPE_MAX_ENUM, "Type name array size doesn't match the total number of type IDs!"); + +bool getType(const char *in, love::Type &out) +{ + return types.find(in, out); +} + +bool getType(love::Type in, const char *&out) +{ + return types.find(in, out); +} + +} // love diff --git a/jni/love/src/common/types.h b/jni/love/src/common/types.h index 4d71ec03..0e801bdd 100644 --- a/jni/love/src/common/types.h +++ b/jni/love/src/common/types.h @@ -37,6 +37,7 @@ enum Type // Filesystem. FILESYSTEM_FILE_ID, + FILESYSTEM_DROPPED_FILE_ID, FILESYSTEM_FILE_DATA_ID, // Font @@ -54,10 +55,11 @@ enum Type GRAPHICS_CANVAS_ID, GRAPHICS_SHADER_ID, GRAPHICS_MESH_ID, + GRAPHICS_TEXT_ID, // Image IMAGE_IMAGE_DATA_ID, - IMAGE_COMPRESSED_DATA_ID, + IMAGE_COMPRESSED_IMAGE_DATA_ID, // Joystick JOYSTICK_JOYSTICK_ID, @@ -65,6 +67,7 @@ enum Type // Math MATH_RANDOM_GENERATOR_ID, MATH_BEZIER_CURVE_ID, + MATH_COMPRESSED_DATA_ID, // Audio AUDIO_SOURCE_ID, @@ -113,89 +116,15 @@ enum Type TYPE_MAX_ENUM }; -typedef std::bitset bits; +typedef std::bitset TypeBits; -const bits INVALID_T = bits(1) << INVALID_ID; - -const bits OBJECT_T = bits(1) << OBJECT_ID; -const bits DATA_T = (bits(1) << DATA_ID) | OBJECT_T; -const bits MODULE_T = (bits(1) << MODULE_ID) | OBJECT_T; - -// Filesystem. -const bits FILESYSTEM_FILE_T = (bits(1) << FILESYSTEM_FILE_ID) | OBJECT_T; -const bits FILESYSTEM_FILE_DATA_T = (bits(1) << FILESYSTEM_FILE_DATA_ID) | DATA_T; - -const bits FONT_GLYPH_DATA_T = (bits(1) << FONT_GLYPH_DATA_ID) | DATA_T; -const bits FONT_RASTERIZER_T = (bits(1) << FONT_RASTERIZER_ID) | OBJECT_T; - -// Graphics. -const bits GRAPHICS_DRAWABLE_T = (bits(1) << GRAPHICS_DRAWABLE_ID) | OBJECT_T; -const bits GRAPHICS_TEXTURE_T = (bits(1) << GRAPHICS_TEXTURE_ID) | GRAPHICS_DRAWABLE_T; -const bits GRAPHICS_IMAGE_T = (bits(1) << GRAPHICS_IMAGE_ID) | GRAPHICS_TEXTURE_T; -const bits GRAPHICS_QUAD_T = (bits(1) << GRAPHICS_QUAD_ID) | OBJECT_T; -const bits GRAPHICS_FONT_T = (bits(1) << GRAPHICS_FONT_ID) | OBJECT_T; -const bits GRAPHICS_PARTICLE_SYSTEM_T = (bits(1) << GRAPHICS_PARTICLE_SYSTEM_ID) | GRAPHICS_DRAWABLE_T; -const bits GRAPHICS_SPRITE_BATCH_T = (bits(1) << GRAPHICS_SPRITE_BATCH_ID) | GRAPHICS_DRAWABLE_T; -const bits GRAPHICS_CANVAS_T = (bits(1) << GRAPHICS_CANVAS_ID) | GRAPHICS_TEXTURE_T; -const bits GRAPHICS_SHADER_T = (bits(1) << GRAPHICS_SHADER_ID) | OBJECT_T; -const bits GRAPHICS_MESH_T = (bits(1) << GRAPHICS_MESH_ID) | GRAPHICS_DRAWABLE_T; - -// Image. -const bits IMAGE_IMAGE_DATA_T = (bits(1) << IMAGE_IMAGE_DATA_ID) | DATA_T; -const bits IMAGE_COMPRESSED_DATA_T = (bits(1) << IMAGE_COMPRESSED_DATA_ID) | DATA_T; - -// Joystick. -const bits JOYSTICK_JOYSTICK_T = (bits(1) << JOYSTICK_JOYSTICK_ID) | OBJECT_T; - -// Math. -const bits MATH_RANDOM_GENERATOR_T = (bits(1) << MATH_RANDOM_GENERATOR_ID) | OBJECT_T; -const bits MATH_BEZIER_CURVE_T = (bits(1) << MATH_BEZIER_CURVE_ID) | OBJECT_T; - -// Audio. -const bits AUDIO_SOURCE_T = (bits(1) << AUDIO_SOURCE_ID) | OBJECT_T; - -// Sound. -const bits SOUND_SOUND_DATA_T = (bits(1) << SOUND_SOUND_DATA_ID) | DATA_T; -const bits SOUND_DECODER_T = bits(1) << SOUND_DECODER_ID; - -// Mouse. -const bits MOUSE_CURSOR_T = (bits(1) << MOUSE_CURSOR_ID) | OBJECT_T; - -// Physics. -const bits PHYSICS_WORLD_T = (bits(1) << PHYSICS_WORLD_ID) | OBJECT_T; -const bits PHYSICS_CONTACT_T = (bits(1) << PHYSICS_CONTACT_ID) | OBJECT_T; -const bits PHYSICS_BODY_T = (bits(1) << PHYSICS_BODY_ID) | OBJECT_T; -const bits PHYSICS_FIXTURE_T = (bits(1) << PHYSICS_FIXTURE_ID) | OBJECT_T; -const bits PHYSICS_SHAPE_T = (bits(1) << PHYSICS_SHAPE_ID) | OBJECT_T; -const bits PHYSICS_CIRCLE_SHAPE_T = (bits(1) << PHYSICS_CIRCLE_SHAPE_ID) | PHYSICS_SHAPE_T; -const bits PHYSICS_POLYGON_SHAPE_T = (bits(1) << PHYSICS_POLYGON_SHAPE_ID) | PHYSICS_SHAPE_T; -const bits PHYSICS_EDGE_SHAPE_T = (bits(1) << PHYSICS_EDGE_SHAPE_ID) | PHYSICS_SHAPE_T; -const bits PHYSICS_CHAIN_SHAPE_T = (bits(1) << PHYSICS_CHAIN_SHAPE_ID) | PHYSICS_SHAPE_T; -const bits PHYSICS_JOINT_T = (bits(1) << PHYSICS_JOINT_ID) | OBJECT_T; -const bits PHYSICS_MOUSE_JOINT_T = (bits(1) << PHYSICS_MOUSE_JOINT_ID) | PHYSICS_JOINT_T; -const bits PHYSICS_DISTANCE_JOINT_T = (bits(1) << PHYSICS_DISTANCE_JOINT_ID) | PHYSICS_JOINT_T; -const bits PHYSICS_PRISMATIC_JOINT_T = (bits(1) << PHYSICS_PRISMATIC_JOINT_ID) | PHYSICS_JOINT_T; -const bits PHYSICS_REVOLUTE_JOINT_T = (bits(1) << PHYSICS_REVOLUTE_JOINT_ID) | PHYSICS_JOINT_T; -const bits PHYSICS_PULLEY_JOINT_T = (bits(1) << PHYSICS_PULLEY_JOINT_ID) | PHYSICS_JOINT_T; -const bits PHYSICS_GEAR_JOINT_T = (bits(1) << PHYSICS_GEAR_JOINT_ID) | PHYSICS_JOINT_T; -const bits PHYSICS_FRICTION_JOINT_T = (bits(1) << PHYSICS_FRICTION_JOINT_ID) | PHYSICS_JOINT_T; -const bits PHYSICS_WELD_JOINT_T = (bits(1) << PHYSICS_WELD_JOINT_ID) | PHYSICS_JOINT_T; -const bits PHYSICS_ROPE_JOINT_T = (bits(1) << PHYSICS_ROPE_JOINT_ID) | PHYSICS_JOINT_T; -const bits PHYSICS_WHEEL_JOINT_T = (bits(1) << PHYSICS_WHEEL_JOINT_ID) | PHYSICS_JOINT_T; -const bits PHYSICS_MOTOR_JOINT_T = (bits(1) << PHYSICS_MOTOR_JOINT_ID) | PHYSICS_JOINT_T; - -// Thread. -const bits THREAD_THREAD_T = (bits(1) << THREAD_THREAD_ID) | OBJECT_T; -const bits THREAD_CHANNEL_T = (bits(1) << THREAD_CHANNEL_ID) | OBJECT_T; - -// Modules. -const bits MODULE_FILESYSTEM_T = (bits(1) << MODULE_FILESYSTEM_ID) | MODULE_T; -const bits MODULE_GRAPHICS_T = (bits(1) << MODULE_GRAPHICS_ID) | MODULE_T; -const bits MODULE_IMAGE_T = (bits(1) << MODULE_IMAGE_ID) | MODULE_T; -const bits MODULE_SOUND_T = (bits(1) << MODULE_SOUND_ID) | MODULE_T; +/** + * Array of length TYPE_MAX_ENUM containing the flags for each love Type. + **/ +extern const TypeBits *typeFlags; bool getType(const char *in, Type &out); -bool getType(Type in, const char *&out); +bool getType(Type in, const char *&out); } // love diff --git a/jni/love/src/common/version.h b/jni/love/src/common/version.h index f96c42d1..54bdc191 100644 --- a/jni/love/src/common/version.h +++ b/jni/love/src/common/version.h @@ -25,13 +25,13 @@ namespace love { // Version stuff. -#define LOVE_VERSION_STRING "0.9.2" -const int VERSION_MAJOR = 0; -const int VERSION_MINOR = 9; -const int VERSION_REV = 2; -const char *VERSION = LOVE_VERSION_STRING; -const char *VERSION_COMPATIBILITY[] = { VERSION, "0.9.1", "0.9.0", 0 }; -const char *VERSION_CODENAME = "Baby Inspector"; +#define LOVE_VERSION_STRING "0.10.0" +static const int VERSION_MAJOR = 0; +static const int VERSION_MINOR = 10; +static const int VERSION_REV = 0; +static const char *VERSION = LOVE_VERSION_STRING; +static const char *VERSION_COMPATIBILITY[] = { VERSION, 0 }; +static const char *VERSION_CODENAME = ""; } // love diff --git a/jni/love/src/common/wrap_Data.cpp b/jni/love/src/common/wrap_Data.cpp index 1485326b..646d09b7 100644 --- a/jni/love/src/common/wrap_Data.cpp +++ b/jni/love/src/common/wrap_Data.cpp @@ -25,7 +25,7 @@ namespace love Data *luax_checkdata(lua_State *L, int idx) { - return luax_checktype(L, idx, "Data", DATA_T); + return luax_checktype(L, idx, DATA_ID); } int w_Data_getString(lua_State *L) @@ -59,7 +59,7 @@ const luaL_Reg w_Data_functions[] = int w_Data_open(lua_State *L) { - luax_register_type(L, "Data", w_Data_functions); + luax_register_type(L, DATA_ID, w_Data_functions); return 0; } diff --git a/jni/love/src/libraries/enet/enet.cpp b/jni/love/src/libraries/enet/enet.cpp index 04b3b4a4..510a4ea9 100644 --- a/jni/love/src/libraries/enet/enet.cpp +++ b/jni/love/src/libraries/enet/enet.cpp @@ -190,7 +190,7 @@ static ENetPacket *read_packet(lua_State *l, int idx, enet_uint8 *channel_id) { } if (argc >= idx+1 && !lua_isnil(l, idx+1)) { - *channel_id = luaL_checkint(l, idx+1); + *channel_id = (int) luaL_checknumber(l, idx+1); } packet = enet_packet_create(data, size, flags); @@ -226,13 +226,13 @@ static int host_create(lua_State *l) { switch (lua_gettop(l)) { case 5: - if (!lua_isnil(l, 5)) out_bandwidth = luaL_checkint(l, 5); + if (!lua_isnil(l, 5)) out_bandwidth = (int) luaL_checknumber(l, 5); case 4: - if (!lua_isnil(l, 4)) in_bandwidth = luaL_checkint(l, 4); + if (!lua_isnil(l, 4)) in_bandwidth = (int) luaL_checknumber(l, 4); case 3: - if (!lua_isnil(l, 3)) channel_count = luaL_checkint(l, 3); + if (!lua_isnil(l, 3)) channel_count = (int) luaL_checknumber(l, 3); case 2: - if (!lua_isnil(l, 2)) peer_count = luaL_checkint(l, 2); + if (!lua_isnil(l, 2)) peer_count = (int) luaL_checknumber(l, 2); } // printf("host create, peers=%d, channels=%d, in=%d, out=%d\n", @@ -279,7 +279,7 @@ static int host_service(lua_State *l) { int timeout = 0, out; if (lua_gettop(l) > 1) - timeout = luaL_checkint(l, 2); + timeout = (int) luaL_checknumber(l, 2); out = enet_host_service(host, &event, timeout); if (out == 0) return 0; @@ -348,9 +348,9 @@ static int host_connect(lua_State *l) { switch (lua_gettop(l)) { case 4: - if (!lua_isnil(l, 4)) data = luaL_checkint(l, 4); + if (!lua_isnil(l, 4)) data = (int) luaL_checknumber(l, 4); case 3: - if (!lua_isnil(l, 3)) channel_count = luaL_checkint(l, 3); + if (!lua_isnil(l, 3)) channel_count = (int) luaL_checknumber(l, 3); } // printf("host connect, channels=%d, data=%d\n", channel_count, data); @@ -392,7 +392,7 @@ static int host_channel_limit(lua_State *l) { if (!host) { return luaL_error(l, "Tried to index a nil host!"); } - int limit = luaL_checkint(l, 2); + int limit = (int) luaL_checknumber(l, 2); enet_host_channel_limit(host, limit); return 0; } @@ -402,8 +402,8 @@ static int host_bandwidth_limit(lua_State *l) { if (!host) { return luaL_error(l, "Tried to index a nil host!"); } - enet_uint32 in_bandwidth = luaL_checkint(l, 2); - enet_uint32 out_bandwidth = luaL_checkint(l, 2); + enet_uint32 in_bandwidth = (int) luaL_checknumber(l, 2); + enet_uint32 out_bandwidth = (int) luaL_checknumber(l, 2); enet_host_bandwidth_limit(host, in_bandwidth, out_bandwidth); return 0; } @@ -473,7 +473,7 @@ static int host_get_peer(lua_State *l) { return luaL_error(l, "Tried to index a nil host!"); } - int peer_index = luaL_checkint(l, 2) - 1; + int peer_index = (int) luaL_checknumber(l, 2) - 1; if (peer_index < 0 || ((size_t) peer_index) >= host->peerCount) { luaL_argerror (l, 2, "Invalid peer index"); @@ -517,9 +517,9 @@ static int peer_ping(lua_State *l) { static int peer_throttle_configure(lua_State *l) { ENetPeer *peer = check_peer(l, 1); - enet_uint32 interval = luaL_checkint(l, 2); - enet_uint32 acceleration = luaL_checkint(l, 3); - enet_uint32 deceleration = luaL_checkint(l, 4); + enet_uint32 interval = (int) luaL_checknumber(l, 2); + enet_uint32 acceleration = (int) luaL_checknumber(l, 3); + enet_uint32 deceleration = (int) luaL_checknumber(l, 4); enet_peer_throttle_configure(peer, interval, acceleration, deceleration); return 0; @@ -529,7 +529,7 @@ static int peer_round_trip_time(lua_State *l) { ENetPeer *peer = check_peer(l, 1); if (lua_gettop(l) > 1) { - enet_uint32 round_trip_time = luaL_checkint(l, 2); + enet_uint32 round_trip_time = (int) luaL_checknumber(l, 2); peer->roundTripTime = round_trip_time; } @@ -542,7 +542,7 @@ static int peer_last_round_trip_time(lua_State *l) { ENetPeer *peer = check_peer(l, 1); if (lua_gettop(l) > 1) { - enet_uint32 round_trip_time = luaL_checkint(l, 2); + enet_uint32 round_trip_time = (int) luaL_checknumber(l, 2); peer->lastRoundTripTime = round_trip_time; } lua_pushinteger (l, peer->lastRoundTripTime); @@ -554,7 +554,7 @@ static int peer_ping_interval(lua_State *l) { ENetPeer *peer = check_peer(l, 1); if (lua_gettop(l) > 1) { - enet_uint32 interval = luaL_checkint(l, 2); + enet_uint32 interval = (int) luaL_checknumber(l, 2); enet_peer_ping_interval (peer, interval); } @@ -572,11 +572,11 @@ static int peer_timeout(lua_State *l) { switch (lua_gettop(l)) { case 4: - if (!lua_isnil(l, 4)) timeout_maximum = luaL_checkint(l, 4); + if (!lua_isnil(l, 4)) timeout_maximum = (int) luaL_checknumber(l, 4); case 3: - if (!lua_isnil(l, 3)) timeout_minimum = luaL_checkint(l, 3); + if (!lua_isnil(l, 3)) timeout_minimum = (int) luaL_checknumber(l, 3); case 2: - if (!lua_isnil(l, 2)) timeout_limit = luaL_checkint(l, 2); + if (!lua_isnil(l, 2)) timeout_limit = (int) luaL_checknumber(l, 2); } enet_peer_timeout (peer, timeout_limit, timeout_minimum, timeout_maximum); @@ -591,7 +591,7 @@ static int peer_timeout(lua_State *l) { static int peer_disconnect(lua_State *l) { ENetPeer *peer = check_peer(l, 1); - enet_uint32 data = lua_gettop(l) > 1 ? luaL_checkint(l, 2) : 0; + enet_uint32 data = lua_gettop(l) > 1 ? (int) luaL_checknumber(l, 2) : 0; enet_peer_disconnect(peer, data); return 0; } @@ -599,7 +599,7 @@ static int peer_disconnect(lua_State *l) { static int peer_disconnect_now(lua_State *l) { ENetPeer *peer = check_peer(l, 1); - enet_uint32 data = lua_gettop(l) > 1 ? luaL_checkint(l, 2) : 0; + enet_uint32 data = lua_gettop(l) > 1 ? (int) luaL_checknumber(l, 2) : 0; enet_peer_disconnect_now(peer, data); return 0; } @@ -607,7 +607,7 @@ static int peer_disconnect_now(lua_State *l) { static int peer_disconnect_later(lua_State *l) { ENetPeer *peer = check_peer(l, 1); - enet_uint32 data = lua_gettop(l) > 1 ? luaL_checkint(l, 2) : 0; + enet_uint32 data = lua_gettop(l) > 1 ? (int) luaL_checknumber(l, 2) : 0; enet_peer_disconnect_later(peer, data); return 0; } @@ -683,7 +683,7 @@ static int peer_receive(lua_State *l) { enet_uint8 channel_id = 0; if (lua_gettop(l) > 1) { - channel_id = luaL_checkint(l, 2); + channel_id = (int) luaL_checknumber(l, 2); } packet = enet_peer_receive(peer, &channel_id); @@ -770,6 +770,10 @@ static const struct luaL_Reg enet_peer_funcs [] = { {NULL, NULL} }; +extern "C" { + void luax_register(lua_State *L, const char *name, const luaL_Reg *l); +} + int luaopen_enet(lua_State *l) { enet_initialize(); atexit(enet_deinitialize); @@ -777,14 +781,14 @@ int luaopen_enet(lua_State *l) { // create metatables luaL_newmetatable(l, "enet_host"); lua_newtable(l); // index - luaL_register(l, NULL, enet_host_funcs); + luax_register(l, NULL, enet_host_funcs); lua_setfield(l, -2, "__index"); lua_pushcfunction(l, host_gc); lua_setfield(l, -2, "__gc"); luaL_newmetatable(l, "enet_peer"); lua_newtable(l); - luaL_register(l, NULL, enet_peer_funcs); + luax_register(l, NULL, enet_peer_funcs); lua_setfield(l, -2, "__index"); lua_pushcfunction(l, peer_tostring); lua_setfield(l, -2, "__tostring"); @@ -799,7 +803,7 @@ int luaopen_enet(lua_State *l) { lua_setfield(l, LUA_REGISTRYINDEX, "enet_peers"); - luaL_register(l, "enet", enet_funcs); + luax_register(l, "enet", enet_funcs); // return the enet table created with luaL_register return 1; diff --git a/jni/love/src/libraries/glad/glad.cpp b/jni/love/src/libraries/glad/glad.cpp index 9bd7acb3..ac4ff046 100644 --- a/jni/love/src/libraries/glad/glad.cpp +++ b/jni/love/src/libraries/glad/glad.cpp @@ -11,6 +11,9 @@ namespace glad { #if !SDL_VERSION_ATLEAST(2,0,0) #error SDL 2 is required! #endif +#else +#include +#endif void* LoaderDlsymOrSDLGetProc (const char* name) { void* proc = dlsym(RTLD_DEFAULT, name); @@ -20,10 +23,6 @@ void* LoaderDlsymOrSDLGetProc (const char* name) { return proc; } -#else -#include -#endif - bool gladLoadGL(void) { #ifdef GLAD_USE_SDL return gladLoadGLLoader(LoaderDlsymOrSDLGetProc); @@ -81,8 +80,12 @@ static bool has_ext(const char *ext) { } pfn_glCopyTexImage1D fp_glCopyTexImage1D; +pfn_glTextureParameterf fp_glTextureParameterf; pfn_glVertexAttribI3ui fp_glVertexAttribI3ui; +pfn_glVertexArrayElementBuffer fp_glVertexArrayElementBuffer; pfn_glWindowPos2s fp_glWindowPos2s; +pfn_glTextureStorage3DMultisample fp_glTextureStorage3DMultisample; +pfn_glTextureParameterfv fp_glTextureParameterfv; pfn_glWindowPos2i fp_glWindowPos2i; pfn_glWindowPos2f fp_glWindowPos2f; pfn_glWindowPos2d fp_glWindowPos2d; @@ -109,6 +112,8 @@ pfn_glGetTransformFeedbackVarying fp_glGetTransformFeedbackVarying; pfn_glWindowPos2iv fp_glWindowPos2iv; pfn_glDrawTransformFeedbackStreamInstanced fp_glDrawTransformFeedbackStreamInstanced; pfn_glIndexfv fp_glIndexfv; +pfn_glGetCompressedTextureImage fp_glGetCompressedTextureImage; +pfn_glGetnMapfv fp_glGetnMapfv; pfn_glFogiv fp_glFogiv; pfn_glStencilMaskSeparate fp_glStencilMaskSeparate; pfn_glRasterPos2fv fp_glRasterPos2fv; @@ -117,6 +122,8 @@ pfn_glDepthRangef fp_glDepthRangef; pfn_glColor4ui fp_glColor4ui; pfn_glSecondaryColor3fv fp_glSecondaryColor3fv; pfn_glMultiTexCoordP3ui fp_glMultiTexCoordP3ui; +pfn_glMemoryBarrierByRegion fp_glMemoryBarrierByRegion; +pfn_glGetNamedBufferParameteriv fp_glGetNamedBufferParameteriv; pfn_glFogfv fp_glFogfv; pfn_glVertexP4ui fp_glVertexP4ui; pfn_glDrawElementsInstancedBaseInstance fp_glDrawElementsInstancedBaseInstance; @@ -137,6 +144,8 @@ pfn_glVertexAttrib1f fp_glVertexAttrib1f; pfn_glBlendFuncSeparate fp_glBlendFuncSeparate; pfn_glVertex4fv fp_glVertex4fv; pfn_glMinSampleShading fp_glMinSampleShading; +pfn_glClearNamedFramebufferfi fp_glClearNamedFramebufferfi; +pfn_glGetQueryBufferObjectuiv fp_glGetQueryBufferObjectuiv; pfn_glBindTexture fp_glBindTexture; pfn_glVertexAttrib1s fp_glVertexAttrib1s; pfn_glTexCoord2fv fp_glTexCoord2fv; @@ -147,6 +156,7 @@ pfn_glTexCoord4fv fp_glTexCoord4fv; pfn_glUniformMatrix3x2fv fp_glUniformMatrix3x2fv; pfn_glDebugMessageControl fp_glDebugMessageControl; pfn_glPointSize fp_glPointSize; +pfn_glBindTextureUnit fp_glBindTextureUnit; pfn_glVertexAttrib2dv fp_glVertexAttrib2dv; pfn_glDeleteProgram fp_glDeleteProgram; pfn_glColor4bv fp_glColor4bv; @@ -163,6 +173,7 @@ pfn_glEdgeFlag fp_glEdgeFlag; pfn_glDeleteSamplers fp_glDeleteSamplers; pfn_glVertex3d fp_glVertex3d; pfn_glVertex3f fp_glVertex3f; +pfn_glGetnMapiv fp_glGetnMapiv; pfn_glVertex3i fp_glVertex3i; pfn_glColor3i fp_glColor3i; pfn_glUniform3d fp_glUniform3d; @@ -179,6 +190,8 @@ pfn_glBlitFramebuffer fp_glBlitFramebuffer; pfn_glPauseTransformFeedback fp_glPauseTransformFeedback; pfn_glMultiTexCoordP2ui fp_glMultiTexCoordP2ui; pfn_glProgramUniformMatrix3x2dv fp_glProgramUniformMatrix3x2dv; +pfn_glCopyNamedBufferSubData fp_glCopyNamedBufferSubData; +pfn_glNamedFramebufferTexture fp_glNamedFramebufferTexture; pfn_glProgramUniformMatrix3x2fv fp_glProgramUniformMatrix3x2fv; pfn_glGetSamplerParameterIiv fp_glGetSamplerParameterIiv; pfn_glGetFragDataIndex fp_glGetFragDataIndex; @@ -187,6 +200,7 @@ pfn_glBindImageTexture fp_glBindImageTexture; pfn_glVertexAttrib3f fp_glVertexAttrib3f; pfn_glProgramUniformMatrix4fv fp_glProgramUniformMatrix4fv; pfn_glVertex2iv fp_glVertex2iv; +pfn_glGetQueryBufferObjecti64v fp_glGetQueryBufferObjecti64v; pfn_glColor3sv fp_glColor3sv; pfn_glGetVertexAttribdv fp_glGetVertexAttribdv; pfn_glActiveShaderProgram fp_glActiveShaderProgram; @@ -195,6 +209,7 @@ pfn_glUniformMatrix3dv fp_glUniformMatrix3dv; pfn_glNormalPointer fp_glNormalPointer; pfn_glTexCoordP3uiv fp_glTexCoordP3uiv; pfn_glVertex4sv fp_glVertex4sv; +pfn_glVertexArrayAttribLFormat fp_glVertexArrayAttribLFormat; pfn_glInvalidateBufferSubData fp_glInvalidateBufferSubData; pfn_glPassThrough fp_glPassThrough; pfn_glMultiTexCoordP4ui fp_glMultiTexCoordP4ui; @@ -207,6 +222,7 @@ pfn_glSecondaryColor3uiv fp_glSecondaryColor3uiv; pfn_glDeleteFramebuffers fp_glDeleteFramebuffers; pfn_glDrawArrays fp_glDrawArrays; pfn_glUniform1ui fp_glUniform1ui; +pfn_glGetTransformFeedbackiv fp_glGetTransformFeedbackiv; pfn_glMultiTexCoord1d fp_glMultiTexCoord1d; pfn_glMultiTexCoord1f fp_glMultiTexCoord1f; pfn_glProgramParameteri fp_glProgramParameteri; @@ -217,6 +233,7 @@ pfn_glClear fp_glClear; pfn_glMultiTexCoord1i fp_glMultiTexCoord1i; pfn_glGetActiveUniformName fp_glGetActiveUniformName; pfn_glMemoryBarrier fp_glMemoryBarrier; +pfn_glGetGraphicsResetStatus fp_glGetGraphicsResetStatus; pfn_glMultiTexCoord1s fp_glMultiTexCoord1s; pfn_glIsEnabled fp_glIsEnabled; pfn_glStencilOp fp_glStencilOp; @@ -228,9 +245,12 @@ pfn_glVertexAttrib4Nub fp_glVertexAttrib4Nub; pfn_glTranslated fp_glTranslated; pfn_glTexCoord3sv fp_glTexCoord3sv; pfn_glGetFragDataLocation fp_glGetFragDataLocation; +pfn_glGetTextureParameterIiv fp_glGetTextureParameterIiv; pfn_glTexImage1D fp_glTexImage1D; +pfn_glCopyTextureSubImage3D fp_glCopyTextureSubImage3D; pfn_glVertexP3uiv fp_glVertexP3uiv; pfn_glTexParameteriv fp_glTexParameteriv; +pfn_glVertexArrayAttribIFormat fp_glVertexArrayAttribIFormat; pfn_glSecondaryColor3bv fp_glSecondaryColor3bv; pfn_glGetMaterialfv fp_glGetMaterialfv; pfn_glGetTexImage fp_glGetTexImage; @@ -239,6 +259,8 @@ pfn_glPixelMapuiv fp_glPixelMapuiv; pfn_glGetShaderInfoLog fp_glGetShaderInfoLog; pfn_glGetQueryObjecti64v fp_glGetQueryObjecti64v; pfn_glGenFramebuffers fp_glGenFramebuffers; +pfn_glCreateTextures fp_glCreateTextures; +pfn_glTransformFeedbackBufferBase fp_glTransformFeedbackBufferBase; pfn_glIndexsv fp_glIndexsv; pfn_glClearTexSubImage fp_glClearTexSubImage; pfn_glProgramUniformMatrix3x4dv fp_glProgramUniformMatrix3x4dv; @@ -254,7 +276,9 @@ pfn_glDisableVertexAttribArray fp_glDisableVertexAttribArray; pfn_glProgramUniform2iv fp_glProgramUniform2iv; pfn_glGetQueryiv fp_glGetQueryiv; pfn_glTexCoord4f fp_glTexCoord4f; +pfn_glBlitNamedFramebuffer fp_glBlitNamedFramebuffer; pfn_glTexCoord4d fp_glTexCoord4d; +pfn_glCreateQueries fp_glCreateQueries; pfn_glGetSamplerParameterfv fp_glGetSamplerParameterfv; pfn_glTexCoord4i fp_glTexCoord4i; pfn_glShaderStorageBlockBinding fp_glShaderStorageBlockBinding; @@ -268,10 +292,13 @@ pfn_glVertexAttribI4ubv fp_glVertexAttribI4ubv; pfn_glVertex3dv fp_glVertex3dv; pfn_glGetInteger64v fp_glGetInteger64v; pfn_glPointParameteriv fp_glPointParameteriv; +pfn_glGetnMinmax fp_glGetnMinmax; pfn_glEnable fp_glEnable; pfn_glGetActiveUniformsiv fp_glGetActiveUniformsiv; pfn_glColor4fv fp_glColor4fv; pfn_glTexCoord1fv fp_glTexCoord1fv; +pfn_glVertexArrayAttribBinding fp_glVertexArrayAttribBinding; +pfn_glTextureStorage1D fp_glTextureStorage1D; pfn_glPopDebugGroup fp_glPopDebugGroup; pfn_glBlendEquationi fp_glBlendEquationi; pfn_glTexCoord2sv fp_glTexCoord2sv; @@ -282,22 +309,29 @@ pfn_glMultiTexCoord2i fp_glMultiTexCoord2i; pfn_glTexCoord3fv fp_glTexCoord3fv; pfn_glSecondaryColor3usv fp_glSecondaryColor3usv; pfn_glTexGenf fp_glTexGenf; +pfn_glMapNamedBuffer fp_glMapNamedBuffer; pfn_glMultiTexCoordP3uiv fp_glMultiTexCoordP3uiv; pfn_glVertexAttribP3ui fp_glVertexAttribP3ui; pfn_glVertexAttribL1dv fp_glVertexAttribL1dv; +pfn_glTextureBufferRange fp_glTextureBufferRange; +pfn_glGetnUniformdv fp_glGetnUniformdv; pfn_glMultiTexCoordP1ui fp_glMultiTexCoordP1ui; pfn_glProgramUniform3ui fp_glProgramUniform3ui; +pfn_glTransformFeedbackBufferRange fp_glTransformFeedbackBufferRange; pfn_glGetPointerv fp_glGetPointerv; pfn_glVertexBindingDivisor fp_glVertexBindingDivisor; pfn_glPolygonOffset fp_glPolygonOffset; pfn_glGetUniformuiv fp_glGetUniformuiv; pfn_glNormal3fv fp_glNormal3fv; pfn_glSecondaryColor3s fp_glSecondaryColor3s; +pfn_glNamedFramebufferDrawBuffers fp_glNamedFramebufferDrawBuffers; pfn_glDepthRange fp_glDepthRange; pfn_glFrustum fp_glFrustum; pfn_glMultiTexCoord4sv fp_glMultiTexCoord4sv; +pfn_glVertexArrayBindingDivisor fp_glVertexArrayBindingDivisor; pfn_glDrawBuffer fp_glDrawBuffer; pfn_glPushMatrix fp_glPushMatrix; +pfn_glGetnPixelMapusv fp_glGetnPixelMapusv; pfn_glRasterPos3fv fp_glRasterPos3fv; pfn_glOrtho fp_glOrtho; pfn_glDrawElementsInstanced fp_glDrawElementsInstanced; @@ -315,6 +349,7 @@ pfn_glGetRenderbufferParameteriv fp_glGetRenderbufferParameteriv; pfn_glBeginQueryIndexed fp_glBeginQueryIndexed; pfn_glProgramUniform3iv fp_glProgramUniform3iv; pfn_glIndexiv fp_glIndexiv; +pfn_glNamedRenderbufferStorage fp_glNamedRenderbufferStorage; pfn_glRasterPos3sv fp_glRasterPos3sv; pfn_glGetVertexAttribPointerv fp_glGetVertexAttribPointerv; pfn_glPixelZoom fp_glPixelZoom; @@ -322,6 +357,7 @@ pfn_glFenceSync fp_glFenceSync; pfn_glDeleteVertexArrays fp_glDeleteVertexArrays; pfn_glColorP3ui fp_glColorP3ui; pfn_glDrawElementsInstancedBaseVertexBaseInstance fp_glDrawElementsInstancedBaseVertexBaseInstance; +pfn_glTextureStorage2DMultisample fp_glTextureStorage2DMultisample; pfn_glVertexAttrib3sv fp_glVertexAttrib3sv; pfn_glBeginConditionalRender fp_glBeginConditionalRender; pfn_glPushDebugGroup fp_glPushDebugGroup; @@ -331,16 +367,19 @@ pfn_glDrawElementsBaseVertex fp_glDrawElementsBaseVertex; pfn_glGetTexLevelParameteriv fp_glGetTexLevelParameteriv; pfn_glLighti fp_glLighti; pfn_glMultiTexCoordP4uiv fp_glMultiTexCoordP4uiv; +pfn_glVertexArrayVertexBuffer fp_glVertexArrayVertexBuffer; pfn_glLightf fp_glLightf; pfn_glBindVertexBuffers fp_glBindVertexBuffers; pfn_glGetAttribLocation fp_glGetAttribLocation; pfn_glTexStorage3DMultisample fp_glTexStorage3DMultisample; pfn_glStencilFuncSeparate fp_glStencilFuncSeparate; +pfn_glDisableVertexArrayAttrib fp_glDisableVertexArrayAttrib; pfn_glGenSamplers fp_glGenSamplers; pfn_glClampColor fp_glClampColor; pfn_glUniform4iv fp_glUniform4iv; pfn_glClearStencil fp_glClearStencil; pfn_glTexCoordP1uiv fp_glTexCoordP1uiv; +pfn_glGetNamedRenderbufferParameteriv fp_glGetNamedRenderbufferParameteriv; pfn_glDrawTransformFeedbackInstanced fp_glDrawTransformFeedbackInstanced; pfn_glMultiTexCoord3fv fp_glMultiTexCoord3fv; pfn_glGetPixelMapuiv fp_glGetPixelMapuiv; @@ -349,8 +388,12 @@ pfn_glTexCoord4iv fp_glTexCoord4iv; pfn_glDrawTransformFeedback fp_glDrawTransformFeedback; pfn_glUniform1dv fp_glUniform1dv; pfn_glGetTexParameterIuiv fp_glGetTexParameterIuiv; +pfn_glGetTransformFeedbacki_v fp_glGetTransformFeedbacki_v; pfn_glIndexPointer fp_glIndexPointer; +pfn_glGetnPolygonStipple fp_glGetnPolygonStipple; pfn_glVertexAttrib4Nbv fp_glVertexAttrib4Nbv; +pfn_glClearNamedFramebufferuiv fp_glClearNamedFramebufferuiv; +pfn_glGetVertexArrayIndexediv fp_glGetVertexArrayIndexediv; pfn_glIsSync fp_glIsSync; pfn_glVertex2f fp_glVertex2f; pfn_glVertex2d fp_glVertex2d; @@ -365,6 +408,7 @@ pfn_glProgramUniform1ui fp_glProgramUniform1ui; pfn_glFramebufferTextureLayer fp_glFramebufferTextureLayer; pfn_glVertex2s fp_glVertex2s; pfn_glGetObjectPtrLabel fp_glGetObjectPtrLabel; +pfn_glTextureParameteri fp_glTextureParameteri; pfn_glNormal3bv fp_glNormal3bv; pfn_glVertexAttrib4Nuiv fp_glVertexAttrib4Nuiv; pfn_glFlushMappedBufferRange fp_glFlushMappedBufferRange; @@ -398,10 +442,12 @@ pfn_glVertexAttrib1fv fp_glVertexAttrib1fv; pfn_glGetInternalformativ fp_glGetInternalformativ; pfn_glUniform4uiv fp_glUniform4uiv; pfn_glMatrixMode fp_glMatrixMode; +pfn_glGetTextureImage fp_glGetTextureImage; pfn_glFeedbackBuffer fp_glFeedbackBuffer; pfn_glProgramUniform2dv fp_glProgramUniform2dv; pfn_glEndQueryIndexed fp_glEndQueryIndexed; pfn_glGetMapiv fp_glGetMapiv; +pfn_glTextureSubImage3D fp_glTextureSubImage3D; pfn_glFramebufferTexture1D fp_glFramebufferTexture1D; pfn_glUniform4d fp_glUniform4d; pfn_glGetShaderiv fp_glGetShaderiv; @@ -412,6 +458,7 @@ pfn_glObjectPtrLabel fp_glObjectPtrLabel; pfn_glInvalidateFramebuffer fp_glInvalidateFramebuffer; pfn_glBindTextures fp_glBindTextures; pfn_glBindFragDataLocation fp_glBindFragDataLocation; +pfn_glNamedBufferStorage fp_glNamedBufferStorage; pfn_glScissorArrayv fp_glScissorArrayv; pfn_glPrioritizeTextures fp_glPrioritizeTextures; pfn_glCallList fp_glCallList; @@ -425,6 +472,8 @@ pfn_glLightModelf fp_glLightModelf; pfn_glGetUniformiv fp_glGetUniformiv; pfn_glInvalidateBufferData fp_glInvalidateBufferData; pfn_glVertex2sv fp_glVertex2sv; +pfn_glVertexArrayVertexBuffers fp_glVertexArrayVertexBuffers; +pfn_glCompressedTextureSubImage1D fp_glCompressedTextureSubImage1D; pfn_glLightModeli fp_glLightModeli; pfn_glWindowPos3iv fp_glWindowPos3iv; pfn_glMultiTexCoordP1uiv fp_glMultiTexCoordP1uiv; @@ -446,6 +495,7 @@ pfn_glCompressedTexImage3D fp_glCompressedTexImage3D; pfn_glTexCoord3f fp_glTexCoord3f; pfn_glDeleteSync fp_glDeleteSync; pfn_glTexCoord3d fp_glTexCoord3d; +pfn_glGetTransformFeedbacki64_v fp_glGetTransformFeedbacki64_v; pfn_glUniformMatrix4dv fp_glUniformMatrix4dv; pfn_glTexImage2DMultisample fp_glTexImage2DMultisample; pfn_glGetVertexAttribiv fp_glGetVertexAttribiv; @@ -457,6 +507,7 @@ pfn_glUniform3iv fp_glUniform3iv; pfn_glRasterPos3s fp_glRasterPos3s; pfn_glPolygonMode fp_glPolygonMode; pfn_glDrawBuffers fp_glDrawBuffers; +pfn_glGetnHistogram fp_glGetnHistogram; pfn_glGetActiveUniformBlockiv fp_glGetActiveUniformBlockiv; pfn_glAreTexturesResident fp_glAreTexturesResident; pfn_glProgramUniform2d fp_glProgramUniform2d; @@ -485,6 +536,8 @@ pfn_glSamplerParameterIiv fp_glSamplerParameterIiv; pfn_glMultiDrawElementsBaseVertex fp_glMultiDrawElementsBaseVertex; pfn_glVertexAttribLFormat fp_glVertexAttribLFormat; pfn_glRasterPos3iv fp_glRasterPos3iv; +pfn_glTextureStorage2D fp_glTextureStorage2D; +pfn_glGenerateTextureMipmap fp_glGenerateTextureMipmap; pfn_glVertex2dv fp_glVertex2dv; pfn_glTexCoord4sv fp_glTexCoord4sv; pfn_glUniform2uiv fp_glUniform2uiv; @@ -496,9 +549,11 @@ pfn_glDeleteShader fp_glDeleteShader; pfn_glDrawElements fp_glDrawElements; pfn_glGetInternalformati64v fp_glGetInternalformati64v; pfn_glRasterPos2s fp_glRasterPos2s; +pfn_glCopyTextureSubImage1D fp_glCopyTextureSubImage1D; pfn_glGetMapdv fp_glGetMapdv; pfn_glVertexAttrib4Nsv fp_glVertexAttrib4Nsv; pfn_glMaterialfv fp_glMaterialfv; +pfn_glTextureParameterIuiv fp_glTextureParameterIuiv; pfn_glViewport fp_glViewport; pfn_glUniform1uiv fp_glUniform1uiv; pfn_glTransformFeedbackVaryings fp_glTransformFeedbackVaryings; @@ -516,6 +571,8 @@ pfn_glVertexAttribBinding fp_glVertexAttribBinding; pfn_glTexParameteri fp_glTexParameteri; pfn_glGetActiveSubroutineUniformiv fp_glGetActiveSubroutineUniformiv; pfn_glGetShaderSource fp_glGetShaderSource; +pfn_glCreateTransformFeedbacks fp_glCreateTransformFeedbacks; +pfn_glGetnTexImage fp_glGetnTexImage; pfn_glTexBuffer fp_glTexBuffer; pfn_glPopName fp_glPopName; pfn_glValidateProgram fp_glValidateProgram; @@ -563,6 +620,7 @@ pfn_glPopAttrib fp_glPopAttrib; pfn_glDeleteTextures fp_glDeleteTextures; pfn_glGetActiveAtomicCounterBufferiv fp_glGetActiveAtomicCounterBufferiv; pfn_glStencilOpSeparate fp_glStencilOpSeparate; +pfn_glGetTextureParameteriv fp_glGetTextureParameteriv; pfn_glDeleteQueries fp_glDeleteQueries; pfn_glNormalP3uiv fp_glNormalP3uiv; pfn_glVertexAttrib4f fp_glVertexAttrib4f; @@ -574,6 +632,7 @@ pfn_glColor3dv fp_glColor3dv; pfn_glVertexAttribI1i fp_glVertexAttribI1i; pfn_glGetTexParameteriv fp_glGetTexParameteriv; pfn_glWaitSync fp_glWaitSync; +pfn_glCreateVertexArrays fp_glCreateVertexArrays; pfn_glProgramUniform1dv fp_glProgramUniform1dv; pfn_glVertexAttrib4s fp_glVertexAttrib4s; pfn_glColorMaterial fp_glColorMaterial; @@ -587,6 +646,7 @@ pfn_glGetVertexAttribfv fp_glGetVertexAttribfv; pfn_glUniform1d fp_glUniform1d; pfn_glRenderMode fp_glRenderMode; pfn_glGetCompressedTexImage fp_glGetCompressedTexImage; +pfn_glGetnCompressedTexImage fp_glGetnCompressedTexImage; pfn_glWindowPos2dv fp_glWindowPos2dv; pfn_glUniform1i fp_glUniform1i; pfn_glGetActiveAttrib fp_glGetActiveAttrib; @@ -601,19 +661,24 @@ pfn_glSecondaryColor3i fp_glSecondaryColor3i; pfn_glProgramUniform4uiv fp_glProgramUniform4uiv; pfn_glUniform4ui fp_glUniform4ui; pfn_glColor3f fp_glColor3f; +pfn_glNamedFramebufferReadBuffer fp_glNamedFramebufferReadBuffer; pfn_glBindFramebuffer fp_glBindFramebuffer; pfn_glGetTexEnvfv fp_glGetTexEnvfv; pfn_glRectfv fp_glRectfv; pfn_glCullFace fp_glCullFace; pfn_glGetLightfv fp_glGetLightfv; +pfn_glGetnUniformiv fp_glGetnUniformiv; pfn_glColor3d fp_glColor3d; pfn_glProgramUniform4i fp_glProgramUniform4i; pfn_glTexGend fp_glTexGend; pfn_glProgramUniform4f fp_glProgramUniform4f; pfn_glTexGeni fp_glTexGeni; pfn_glProgramUniform4d fp_glProgramUniform4d; +pfn_glTextureParameterIiv fp_glTextureParameterIiv; pfn_glMultiTexCoord3s fp_glMultiTexCoord3s; pfn_glGetStringi fp_glGetStringi; +pfn_glGetTextureParameterfv fp_glGetTextureParameterfv; +pfn_glTextureSubImage2D fp_glTextureSubImage2D; pfn_glMultiTexCoord3i fp_glMultiTexCoord3i; pfn_glMultiTexCoord3f fp_glMultiTexCoord3f; pfn_glDrawTransformFeedbackStream fp_glDrawTransformFeedbackStream; @@ -627,12 +692,16 @@ pfn_glFogCoordPointer fp_glFogCoordPointer; pfn_glProgramUniformMatrix3dv fp_glProgramUniformMatrix3dv; pfn_glProvokingVertex fp_glProvokingVertex; pfn_glShaderBinary fp_glShaderBinary; +pfn_glUnmapNamedBuffer fp_glUnmapNamedBuffer; +pfn_glGetnColorTable fp_glGetnColorTable; pfn_glFramebufferTexture3D fp_glFramebufferTexture3D; pfn_glTexGeniv fp_glTexGeniv; pfn_glRasterPos2dv fp_glRasterPos2dv; pfn_glSecondaryColor3dv fp_glSecondaryColor3dv; pfn_glClientActiveTexture fp_glClientActiveTexture; +pfn_glNamedRenderbufferStorageMultisample fp_glNamedRenderbufferStorageMultisample; pfn_glVertexAttribI4sv fp_glVertexAttribI4sv; +pfn_glClearNamedBufferData fp_glClearNamedBufferData; pfn_glSecondaryColor3us fp_glSecondaryColor3us; pfn_glNormalP3ui fp_glNormalP3ui; pfn_glTexEnvfv fp_glTexEnvfv; @@ -641,6 +710,7 @@ pfn_glViewportArrayv fp_glViewportArrayv; pfn_glTexParameterIuiv fp_glTexParameterIuiv; pfn_glDrawArraysInstanced fp_glDrawArraysInstanced; pfn_glGenerateMipmap fp_glGenerateMipmap; +pfn_glCompressedTextureSubImage2D fp_glCompressedTextureSubImage2D; pfn_glProgramUniformMatrix2fv fp_glProgramUniformMatrix2fv; pfn_glWindowPos3fv fp_glWindowPos3fv; pfn_glUniformMatrix3x4dv fp_glUniformMatrix3x4dv; @@ -654,11 +724,14 @@ pfn_glPopMatrix fp_glPopMatrix; pfn_glTexCoord2f fp_glTexCoord2f; pfn_glColor4iv fp_glColor4iv; pfn_glIndexubv fp_glIndexubv; +pfn_glCheckNamedFramebufferStatus fp_glCheckNamedFramebufferStatus; pfn_glUnmapBuffer fp_glUnmapBuffer; pfn_glTexCoord2i fp_glTexCoord2i; pfn_glRasterPos4d fp_glRasterPos4d; pfn_glRasterPos4f fp_glRasterPos4f; pfn_glProgramUniform1iv fp_glProgramUniform1iv; +pfn_glGetVertexArrayiv fp_glGetVertexArrayiv; +pfn_glCopyTextureSubImage2D fp_glCopyTextureSubImage2D; pfn_glVertexAttrib3s fp_glVertexAttrib3s; pfn_glTexCoord2s fp_glTexCoord2s; pfn_glBindRenderbuffer fp_glBindRenderbuffer; @@ -686,6 +759,7 @@ pfn_glVertexAttribI3iv fp_glVertexAttribI3iv; pfn_glLoadName fp_glLoadName; pfn_glUniform4f fp_glUniform4f; pfn_glRenderbufferStorageMultisample fp_glRenderbufferStorageMultisample; +pfn_glCreateProgramPipelines fp_glCreateProgramPipelines; pfn_glGenVertexArrays fp_glGenVertexArrays; pfn_glShadeModel fp_glShadeModel; pfn_glMapGrid1d fp_glMapGrid1d; @@ -695,9 +769,11 @@ pfn_glSamplerParameterfv fp_glSamplerParameterfv; pfn_glVertexAttribLPointer fp_glVertexAttribLPointer; pfn_glDisableClientState fp_glDisableClientState; pfn_glMultiTexCoord3sv fp_glMultiTexCoord3sv; +pfn_glGetnUniformfv fp_glGetnUniformfv; pfn_glDrawElementsInstancedBaseVertex fp_glDrawElementsInstancedBaseVertex; pfn_glVertexAttribL2dv fp_glVertexAttribL2dv; pfn_glMultiDrawElementsIndirect fp_glMultiDrawElementsIndirect; +pfn_glEnableVertexArrayAttrib fp_glEnableVertexArrayAttrib; pfn_glSecondaryColorPointer fp_glSecondaryColorPointer; pfn_glAlphaFunc fp_glAlphaFunc; pfn_glUniform1iv fp_glUniform1iv; @@ -707,6 +783,7 @@ pfn_glMultiTexCoord4iv fp_glMultiTexCoord4iv; pfn_glVertexAttribL2d fp_glVertexAttribL2d; pfn_glGetQueryObjectiv fp_glGetQueryObjectiv; pfn_glStencilFunc fp_glStencilFunc; +pfn_glInvalidateNamedFramebufferData fp_glInvalidateNamedFramebufferData; pfn_glMultiTexCoord1fv fp_glMultiTexCoord1fv; pfn_glUniformBlockBinding fp_glUniformBlockBinding; pfn_glColor4uiv fp_glColor4uiv; @@ -724,15 +801,19 @@ pfn_glVertexAttribI4iv fp_glVertexAttribI4iv; pfn_glGetProgramPipelineiv fp_glGetProgramPipelineiv; pfn_glTexStorage3D fp_glTexStorage3D; pfn_glEvalCoord2fv fp_glEvalCoord2fv; +pfn_glNamedFramebufferDrawBuffer fp_glNamedFramebufferDrawBuffer; pfn_glGetQueryIndexediv fp_glGetQueryIndexediv; pfn_glColor4ubv fp_glColor4ubv; pfn_glLoadTransposeMatrixd fp_glLoadTransposeMatrixd; pfn_glLoadTransposeMatrixf fp_glLoadTransposeMatrixf; +pfn_glTextureParameteriv fp_glTextureParameteriv; pfn_glObjectLabel fp_glObjectLabel; pfn_glVertexAttribI4i fp_glVertexAttribI4i; pfn_glRasterPos2iv fp_glRasterPos2iv; pfn_glGetBufferSubData fp_glGetBufferSubData; pfn_glGetVertexAttribLdv fp_glGetVertexAttribLdv; +pfn_glGetnUniformuiv fp_glGetnUniformuiv; +pfn_glGetQueryBufferObjectiv fp_glGetQueryBufferObjectiv; pfn_glTexEnviv fp_glTexEnviv; pfn_glBlendEquationSeparate fp_glBlendEquationSeparate; pfn_glVertexAttribI1ui fp_glVertexAttribI1ui; @@ -745,12 +826,19 @@ pfn_glPushAttrib fp_glPushAttrib; pfn_glVertexAttribIPointer fp_glVertexAttribIPointer; pfn_glBlendFunc fp_glBlendFunc; pfn_glCreateProgram fp_glCreateProgram; +pfn_glNamedBufferSubData fp_glNamedBufferSubData; pfn_glTexImage3D fp_glTexImage3D; pfn_glIsFramebuffer fp_glIsFramebuffer; +pfn_glClearNamedFramebufferfv fp_glClearNamedFramebufferfv; pfn_glLightiv fp_glLightiv; +pfn_glGetNamedBufferSubData fp_glGetNamedBufferSubData; +pfn_glCompressedTextureSubImage3D fp_glCompressedTextureSubImage3D; pfn_glPrimitiveRestartIndex fp_glPrimitiveRestartIndex; +pfn_glFlushMappedNamedBufferRange fp_glFlushMappedNamedBufferRange; pfn_glInvalidateTexSubImage fp_glInvalidateTexSubImage; pfn_glTexGenfv fp_glTexGenfv; +pfn_glGetTextureParameterIuiv fp_glGetTextureParameterIuiv; +pfn_glGetnConvolutionFilter fp_glGetnConvolutionFilter; pfn_glBindImageTextures fp_glBindImageTextures; pfn_glEnd fp_glEnd; pfn_glDeleteBuffers fp_glDeleteBuffers; @@ -761,6 +849,8 @@ pfn_glClipPlane fp_glClipPlane; pfn_glPushName fp_glPushName; pfn_glTexGendv fp_glTexGendv; pfn_glIndexub fp_glIndexub; +pfn_glGetNamedFramebufferAttachmentParameteriv fp_glGetNamedFramebufferAttachmentParameteriv; +pfn_glNamedFramebufferRenderbuffer fp_glNamedFramebufferRenderbuffer; pfn_glVertexP2uiv fp_glVertexP2uiv; pfn_glSecondaryColor3iv fp_glSecondaryColor3iv; pfn_glRasterPos4i fp_glRasterPos4i; @@ -775,9 +865,12 @@ pfn_glPointParameteri fp_glPointParameteri; pfn_glProgramUniform4dv fp_glProgramUniform4dv; pfn_glColorP4uiv fp_glColorP4uiv; pfn_glBlendColor fp_glBlendColor; +pfn_glGetnPixelMapuiv fp_glGetnPixelMapuiv; +pfn_glGetTextureLevelParameteriv fp_glGetTextureLevelParameteriv; pfn_glWindowPos3d fp_glWindowPos3d; pfn_glProgramUniform3fv fp_glProgramUniform3fv; pfn_glVertexAttribI2uiv fp_glVertexAttribI2uiv; +pfn_glGetNamedFramebufferParameteriv fp_glGetNamedFramebufferParameteriv; pfn_glSamplerParameterIuiv fp_glSamplerParameterIuiv; pfn_glUniform3ui fp_glUniform3ui; pfn_glProgramUniform3uiv fp_glProgramUniform3uiv; @@ -790,12 +883,16 @@ pfn_glGetActiveSubroutineUniformName fp_glGetActiveSubroutineUniformName; pfn_glGetProgramResourceIndex fp_glGetProgramResourceIndex; pfn_glSecondaryColor3ub fp_glSecondaryColor3ub; pfn_glDrawElementsIndirect fp_glDrawElementsIndirect; +pfn_glGetTextureLevelParameterfv fp_glGetTextureLevelParameterfv; pfn_glSecondaryColor3ui fp_glSecondaryColor3ui; pfn_glTexCoord3dv fp_glTexCoord3dv; +pfn_glGetNamedBufferPointerv fp_glGetNamedBufferPointerv; pfn_glDispatchComputeIndirect fp_glDispatchComputeIndirect; +pfn_glInvalidateNamedFramebufferSubData fp_glInvalidateNamedFramebufferSubData; pfn_glGetSamplerParameterIuiv fp_glGetSamplerParameterIuiv; pfn_glBindBufferRange fp_glBindBufferRange; pfn_glNormal3iv fp_glNormal3iv; +pfn_glTextureSubImage1D fp_glTextureSubImage1D; pfn_glVertexAttribL3dv fp_glVertexAttribL3dv; pfn_glGetUniformdv fp_glGetUniformdv; pfn_glWindowPos3s fp_glWindowPos3s; @@ -804,6 +901,7 @@ pfn_glClearDepthf fp_glClearDepthf; pfn_glGetVertexAttribIuiv fp_glGetVertexAttribIuiv; pfn_glWindowPos3i fp_glWindowPos3i; pfn_glMultiTexCoord4s fp_glMultiTexCoord4s; +pfn_glGetTextureSubImage fp_glGetTextureSubImage; pfn_glWindowPos3f fp_glWindowPos3f; pfn_glGenTransformFeedbacks fp_glGenTransformFeedbacks; pfn_glColor3us fp_glColor3us; @@ -829,10 +927,13 @@ pfn_glVertexAttribI4ui fp_glVertexAttribI4ui; pfn_glGetFloati_v fp_glGetFloati_v; pfn_glMultiTexCoord4dv fp_glMultiTexCoord4dv; pfn_glColorMask fp_glColorMask; +pfn_glTextureBuffer fp_glTextureBuffer; pfn_glTexParameterIiv fp_glTexParameterIiv; pfn_glBlendEquation fp_glBlendEquation; pfn_glGetUniformLocation fp_glGetUniformLocation; pfn_glGetSamplerParameteriv fp_glGetSamplerParameteriv; +pfn_glVertexArrayAttribFormat fp_glVertexArrayAttribFormat; +pfn_glReadnPixels fp_glReadnPixels; pfn_glRasterPos4s fp_glRasterPos4s; pfn_glEndTransformFeedback fp_glEndTransformFeedback; pfn_glVertexAttrib4usv fp_glVertexAttrib4usv; @@ -841,6 +942,7 @@ pfn_glMultiTexCoord3dv fp_glMultiTexCoord3dv; pfn_glBindVertexBuffer fp_glBindVertexBuffer; pfn_glColor4sv fp_glColor4sv; pfn_glDebugMessageInsert fp_glDebugMessageInsert; +pfn_glCreateSamplers fp_glCreateSamplers; pfn_glPopClientAttrib fp_glPopClientAttrib; pfn_glClearBufferData fp_glClearBufferData; pfn_glBeginTransformFeedback fp_glBeginTransformFeedback; @@ -859,6 +961,7 @@ pfn_glTexCoord1i fp_glTexCoord1i; pfn_glCheckFramebufferStatus fp_glCheckFramebufferStatus; pfn_glTexCoord1d fp_glTexCoord1d; pfn_glTexCoord1f fp_glTexCoord1f; +pfn_glTextureStorage3D fp_glTextureStorage3D; pfn_glEndConditionalRender fp_glEndConditionalRender; pfn_glEnableClientState fp_glEnableClientState; pfn_glBindAttribLocation fp_glBindAttribLocation; @@ -880,31 +983,38 @@ pfn_glBlendFuncSeparatei fp_glBlendFuncSeparatei; pfn_glProgramUniformMatrix4x2fv fp_glProgramUniformMatrix4x2fv; pfn_glVertexAttribL1d fp_glVertexAttribL1d; pfn_glGetTexGendv fp_glGetTexGendv; +pfn_glClearNamedFramebufferiv fp_glClearNamedFramebufferiv; pfn_glMultiDrawArrays fp_glMultiDrawArrays; pfn_glEndList fp_glEndList; pfn_glScissorIndexed fp_glScissorIndexed; pfn_glVertexP4uiv fp_glVertexP4uiv; pfn_glUniform2ui fp_glUniform2ui; pfn_glVertexAttribI2iv fp_glVertexAttribI2iv; +pfn_glGetnMapdv fp_glGetnMapdv; pfn_glColor3usv fp_glColor3usv; pfn_glWindowPos2fv fp_glWindowPos2fv; pfn_glTextureView fp_glTextureView; pfn_glDisablei fp_glDisablei; pfn_glProgramUniformMatrix2x4fv fp_glProgramUniformMatrix2x4fv; +pfn_glCreateRenderbuffers fp_glCreateRenderbuffers; pfn_glIndexMask fp_glIndexMask; pfn_glPushClientAttrib fp_glPushClientAttrib; pfn_glShaderSource fp_glShaderSource; +pfn_glGetnSeparableFilter fp_glGetnSeparableFilter; pfn_glGetActiveUniformBlockName fp_glGetActiveUniformBlockName; pfn_glVertexAttribI3uiv fp_glVertexAttribI3uiv; pfn_glReleaseShaderCompiler fp_glReleaseShaderCompiler; pfn_glVertexAttribIFormat fp_glVertexAttribIFormat; +pfn_glCreateFramebuffers fp_glCreateFramebuffers; pfn_glClearAccum fp_glClearAccum; pfn_glGetSynciv fp_glGetSynciv; pfn_glProgramUniform2uiv fp_glProgramUniform2uiv; +pfn_glGetnPixelMapfv fp_glGetnPixelMapfv; pfn_glTexCoordP2uiv fp_glTexCoordP2uiv; pfn_glPatchParameteri fp_glPatchParameteri; pfn_glProgramUniform2i fp_glProgramUniform2i; pfn_glUniform2f fp_glUniform2f; +pfn_glGetNamedBufferParameteri64v fp_glGetNamedBufferParameteri64v; pfn_glBeginQuery fp_glBeginQuery; pfn_glGetUniformBlockIndex fp_glGetUniformBlockIndex; pfn_glBindBuffer fp_glBindBuffer; @@ -918,6 +1028,7 @@ pfn_glTexCoord1sv fp_glTexCoord1sv; pfn_glBufferData fp_glBufferData; pfn_glEvalPoint1 fp_glEvalPoint1; pfn_glGetTexParameterIiv fp_glGetTexParameterIiv; +pfn_glGetQueryBufferObjectui64v fp_glGetQueryBufferObjectui64v; pfn_glTexCoord1dv fp_glTexCoord1dv; pfn_glTexCoordP1ui fp_glTexCoordP1ui; pfn_glGetError fp_glGetError; @@ -938,11 +1049,13 @@ pfn_glGetPixelMapusv fp_glGetPixelMapusv; pfn_glSecondaryColorP3uiv fp_glSecondaryColorP3uiv; pfn_glGetIntegerv fp_glGetIntegerv; pfn_glAccum fp_glAccum; +pfn_glGetVertexArrayIndexed64iv fp_glGetVertexArrayIndexed64iv; pfn_glGetBufferPointerv fp_glGetBufferPointerv; pfn_glGetVertexAttribIiv fp_glGetVertexAttribIiv; pfn_glRasterPos4dv fp_glRasterPos4dv; pfn_glProgramUniform4fv fp_glProgramUniform4fv; pfn_glTexCoord2iv fp_glTexCoord2iv; +pfn_glTextureBarrier fp_glTextureBarrier; pfn_glIsQuery fp_glIsQuery; pfn_glProgramUniform2ui fp_glProgramUniform2ui; pfn_glProgramUniform4ui fp_glProgramUniform4ui; @@ -955,10 +1068,14 @@ pfn_glMultMatrixd fp_glMultMatrixd; pfn_glMultMatrixf fp_glMultMatrixf; pfn_glIsTexture fp_glIsTexture; pfn_glGetMaterialiv fp_glGetMaterialiv; +pfn_glNamedBufferData fp_glNamedBufferData; pfn_glUniform1fv fp_glUniform1fv; pfn_glLoadMatrixf fp_glLoadMatrixf; pfn_glTexStorage2D fp_glTexStorage2D; pfn_glLoadMatrixd fp_glLoadMatrixd; +pfn_glClearNamedBufferSubData fp_glClearNamedBufferSubData; +pfn_glMapNamedBufferRange fp_glMapNamedBufferRange; +pfn_glNamedFramebufferTextureLayer fp_glNamedFramebufferTextureLayer; pfn_glTexParameterfv fp_glTexParameterfv; pfn_glUniformMatrix3fv fp_glUniformMatrix3fv; pfn_glVertex4f fp_glVertex4f; @@ -978,6 +1095,7 @@ pfn_glGetFramebufferParameteriv fp_glGetFramebufferParameteriv; pfn_glPixelMapusv fp_glPixelMapusv; pfn_glGetTexGeniv fp_glGetTexGeniv; pfn_glArrayElement fp_glArrayElement; +pfn_glGetCompressedTextureSubImage fp_glGetCompressedTextureSubImage; pfn_glCopyBufferSubData fp_glCopyBufferSubData; pfn_glVertexAttribI1uiv fp_glVertexAttribI1uiv; pfn_glVertexAttrib2d fp_glVertexAttrib2d; @@ -996,12 +1114,16 @@ pfn_glGetActiveUniform fp_glGetActiveUniform; pfn_glColorPointer fp_glColorPointer; pfn_glFrontFace fp_glFrontFace; pfn_glTexBufferRange fp_glTexBufferRange; +pfn_glCreateBuffers fp_glCreateBuffers; +pfn_glNamedFramebufferParameteri fp_glNamedFramebufferParameteri; pfn_glDrawArraysInstancedBaseInstance fp_glDrawArraysInstancedBaseInstance; pfn_glGetBooleani_v fp_glGetBooleani_v; pfn_glVertexAttribL3d fp_glVertexAttribL3d; pfn_glDeleteProgramPipelines fp_glDeleteProgramPipelines; pfn_glClearBufferuiv fp_glClearBufferuiv; +pfn_glClipControl fp_glClipControl; pfn_glGetProgramResourceiv fp_glGetProgramResourceiv; +pfn_glBlendBarrierKHR fp_glBlendBarrierKHR; pfn_glDebugMessageControlKHR fp_glDebugMessageControlKHR; pfn_glDebugMessageInsertKHR fp_glDebugMessageInsertKHR; pfn_glDebugMessageCallbackKHR fp_glDebugMessageCallbackKHR; @@ -1013,6 +1135,11 @@ pfn_glGetObjectLabelKHR fp_glGetObjectLabelKHR; pfn_glObjectPtrLabelKHR fp_glObjectPtrLabelKHR; pfn_glGetObjectPtrLabelKHR fp_glGetObjectPtrLabelKHR; pfn_glGetPointervKHR fp_glGetPointervKHR; +pfn_glGetGraphicsResetStatusKHR fp_glGetGraphicsResetStatusKHR; +pfn_glReadnPixelsKHR fp_glReadnPixelsKHR; +pfn_glGetnUniformfvKHR fp_glGetnUniformfvKHR; +pfn_glGetnUniformivKHR fp_glGetnUniformivKHR; +pfn_glGetnUniformuivKHR fp_glGetnUniformuivKHR; pfn_glGetTextureHandleARB fp_glGetTextureHandleARB; pfn_glGetTextureSamplerHandleARB fp_glGetTextureSamplerHandleARB; pfn_glMakeTextureHandleResidentARB fp_glMakeTextureHandleResidentARB; @@ -1036,32 +1163,12 @@ pfn_glDebugMessageControlARB fp_glDebugMessageControlARB; pfn_glDebugMessageInsertARB fp_glDebugMessageInsertARB; pfn_glDebugMessageCallbackARB fp_glDebugMessageCallbackARB; pfn_glGetDebugMessageLogARB fp_glGetDebugMessageLogARB; -pfn_glDrawBuffersARB fp_glDrawBuffersARB; pfn_glBlendEquationiARB fp_glBlendEquationiARB; pfn_glBlendEquationSeparateiARB fp_glBlendEquationSeparateiARB; pfn_glBlendFunciARB fp_glBlendFunciARB; pfn_glBlendFuncSeparateiARB fp_glBlendFuncSeparateiARB; pfn_glDrawArraysInstancedARB fp_glDrawArraysInstancedARB; pfn_glDrawElementsInstancedARB fp_glDrawElementsInstancedARB; -pfn_glProgramStringARB fp_glProgramStringARB; -pfn_glBindProgramARB fp_glBindProgramARB; -pfn_glDeleteProgramsARB fp_glDeleteProgramsARB; -pfn_glGenProgramsARB fp_glGenProgramsARB; -pfn_glProgramEnvParameter4dARB fp_glProgramEnvParameter4dARB; -pfn_glProgramEnvParameter4dvARB fp_glProgramEnvParameter4dvARB; -pfn_glProgramEnvParameter4fARB fp_glProgramEnvParameter4fARB; -pfn_glProgramEnvParameter4fvARB fp_glProgramEnvParameter4fvARB; -pfn_glProgramLocalParameter4dARB fp_glProgramLocalParameter4dARB; -pfn_glProgramLocalParameter4dvARB fp_glProgramLocalParameter4dvARB; -pfn_glProgramLocalParameter4fARB fp_glProgramLocalParameter4fARB; -pfn_glProgramLocalParameter4fvARB fp_glProgramLocalParameter4fvARB; -pfn_glGetProgramEnvParameterdvARB fp_glGetProgramEnvParameterdvARB; -pfn_glGetProgramEnvParameterfvARB fp_glGetProgramEnvParameterfvARB; -pfn_glGetProgramLocalParameterdvARB fp_glGetProgramLocalParameterdvARB; -pfn_glGetProgramLocalParameterfvARB fp_glGetProgramLocalParameterfvARB; -pfn_glGetProgramivARB fp_glGetProgramivARB; -pfn_glGetProgramStringARB fp_glGetProgramStringARB; -pfn_glIsProgramARB fp_glIsProgramARB; pfn_glProgramParameteriARB fp_glProgramParameteriARB; pfn_glFramebufferTextureARB fp_glFramebufferTextureARB; pfn_glFramebufferTextureLayerARB fp_glFramebufferTextureLayerARB; @@ -1069,56 +1176,6 @@ pfn_glFramebufferTextureFaceARB fp_glFramebufferTextureFaceARB; pfn_glMultiDrawArraysIndirectCountARB fp_glMultiDrawArraysIndirectCountARB; pfn_glMultiDrawElementsIndirectCountARB fp_glMultiDrawElementsIndirectCountARB; pfn_glVertexAttribDivisorARB fp_glVertexAttribDivisorARB; -pfn_glCurrentPaletteMatrixARB fp_glCurrentPaletteMatrixARB; -pfn_glMatrixIndexubvARB fp_glMatrixIndexubvARB; -pfn_glMatrixIndexusvARB fp_glMatrixIndexusvARB; -pfn_glMatrixIndexuivARB fp_glMatrixIndexuivARB; -pfn_glMatrixIndexPointerARB fp_glMatrixIndexPointerARB; -pfn_glSampleCoverageARB fp_glSampleCoverageARB; -pfn_glActiveTextureARB fp_glActiveTextureARB; -pfn_glClientActiveTextureARB fp_glClientActiveTextureARB; -pfn_glMultiTexCoord1dARB fp_glMultiTexCoord1dARB; -pfn_glMultiTexCoord1dvARB fp_glMultiTexCoord1dvARB; -pfn_glMultiTexCoord1fARB fp_glMultiTexCoord1fARB; -pfn_glMultiTexCoord1fvARB fp_glMultiTexCoord1fvARB; -pfn_glMultiTexCoord1iARB fp_glMultiTexCoord1iARB; -pfn_glMultiTexCoord1ivARB fp_glMultiTexCoord1ivARB; -pfn_glMultiTexCoord1sARB fp_glMultiTexCoord1sARB; -pfn_glMultiTexCoord1svARB fp_glMultiTexCoord1svARB; -pfn_glMultiTexCoord2dARB fp_glMultiTexCoord2dARB; -pfn_glMultiTexCoord2dvARB fp_glMultiTexCoord2dvARB; -pfn_glMultiTexCoord2fARB fp_glMultiTexCoord2fARB; -pfn_glMultiTexCoord2fvARB fp_glMultiTexCoord2fvARB; -pfn_glMultiTexCoord2iARB fp_glMultiTexCoord2iARB; -pfn_glMultiTexCoord2ivARB fp_glMultiTexCoord2ivARB; -pfn_glMultiTexCoord2sARB fp_glMultiTexCoord2sARB; -pfn_glMultiTexCoord2svARB fp_glMultiTexCoord2svARB; -pfn_glMultiTexCoord3dARB fp_glMultiTexCoord3dARB; -pfn_glMultiTexCoord3dvARB fp_glMultiTexCoord3dvARB; -pfn_glMultiTexCoord3fARB fp_glMultiTexCoord3fARB; -pfn_glMultiTexCoord3fvARB fp_glMultiTexCoord3fvARB; -pfn_glMultiTexCoord3iARB fp_glMultiTexCoord3iARB; -pfn_glMultiTexCoord3ivARB fp_glMultiTexCoord3ivARB; -pfn_glMultiTexCoord3sARB fp_glMultiTexCoord3sARB; -pfn_glMultiTexCoord3svARB fp_glMultiTexCoord3svARB; -pfn_glMultiTexCoord4dARB fp_glMultiTexCoord4dARB; -pfn_glMultiTexCoord4dvARB fp_glMultiTexCoord4dvARB; -pfn_glMultiTexCoord4fARB fp_glMultiTexCoord4fARB; -pfn_glMultiTexCoord4fvARB fp_glMultiTexCoord4fvARB; -pfn_glMultiTexCoord4iARB fp_glMultiTexCoord4iARB; -pfn_glMultiTexCoord4ivARB fp_glMultiTexCoord4ivARB; -pfn_glMultiTexCoord4sARB fp_glMultiTexCoord4sARB; -pfn_glMultiTexCoord4svARB fp_glMultiTexCoord4svARB; -pfn_glGenQueriesARB fp_glGenQueriesARB; -pfn_glDeleteQueriesARB fp_glDeleteQueriesARB; -pfn_glIsQueryARB fp_glIsQueryARB; -pfn_glBeginQueryARB fp_glBeginQueryARB; -pfn_glEndQueryARB fp_glEndQueryARB; -pfn_glGetQueryivARB fp_glGetQueryivARB; -pfn_glGetQueryObjectivARB fp_glGetQueryObjectivARB; -pfn_glGetQueryObjectuivARB fp_glGetQueryObjectuivARB; -pfn_glPointParameterfARB fp_glPointParameterfARB; -pfn_glPointParameterfvARB fp_glPointParameterfvARB; pfn_glGetGraphicsResetStatusARB fp_glGetGraphicsResetStatusARB; pfn_glGetnTexImageARB fp_glGetnTexImageARB; pfn_glReadnPixelsARB fp_glReadnPixelsARB; @@ -1140,201 +1197,29 @@ pfn_glGetnSeparableFilterARB fp_glGetnSeparableFilterARB; pfn_glGetnHistogramARB fp_glGetnHistogramARB; pfn_glGetnMinmaxARB fp_glGetnMinmaxARB; pfn_glMinSampleShadingARB fp_glMinSampleShadingARB; -pfn_glDeleteObjectARB fp_glDeleteObjectARB; -pfn_glGetHandleARB fp_glGetHandleARB; -pfn_glDetachObjectARB fp_glDetachObjectARB; -pfn_glCreateShaderObjectARB fp_glCreateShaderObjectARB; -pfn_glShaderSourceARB fp_glShaderSourceARB; -pfn_glCompileShaderARB fp_glCompileShaderARB; -pfn_glCreateProgramObjectARB fp_glCreateProgramObjectARB; -pfn_glAttachObjectARB fp_glAttachObjectARB; -pfn_glLinkProgramARB fp_glLinkProgramARB; -pfn_glUseProgramObjectARB fp_glUseProgramObjectARB; -pfn_glValidateProgramARB fp_glValidateProgramARB; -pfn_glUniform1fARB fp_glUniform1fARB; -pfn_glUniform2fARB fp_glUniform2fARB; -pfn_glUniform3fARB fp_glUniform3fARB; -pfn_glUniform4fARB fp_glUniform4fARB; -pfn_glUniform1iARB fp_glUniform1iARB; -pfn_glUniform2iARB fp_glUniform2iARB; -pfn_glUniform3iARB fp_glUniform3iARB; -pfn_glUniform4iARB fp_glUniform4iARB; -pfn_glUniform1fvARB fp_glUniform1fvARB; -pfn_glUniform2fvARB fp_glUniform2fvARB; -pfn_glUniform3fvARB fp_glUniform3fvARB; -pfn_glUniform4fvARB fp_glUniform4fvARB; -pfn_glUniform1ivARB fp_glUniform1ivARB; -pfn_glUniform2ivARB fp_glUniform2ivARB; -pfn_glUniform3ivARB fp_glUniform3ivARB; -pfn_glUniform4ivARB fp_glUniform4ivARB; -pfn_glUniformMatrix2fvARB fp_glUniformMatrix2fvARB; -pfn_glUniformMatrix3fvARB fp_glUniformMatrix3fvARB; -pfn_glUniformMatrix4fvARB fp_glUniformMatrix4fvARB; -pfn_glGetObjectParameterfvARB fp_glGetObjectParameterfvARB; -pfn_glGetObjectParameterivARB fp_glGetObjectParameterivARB; -pfn_glGetInfoLogARB fp_glGetInfoLogARB; -pfn_glGetAttachedObjectsARB fp_glGetAttachedObjectsARB; -pfn_glGetUniformLocationARB fp_glGetUniformLocationARB; -pfn_glGetActiveUniformARB fp_glGetActiveUniformARB; -pfn_glGetUniformfvARB fp_glGetUniformfvARB; -pfn_glGetUniformivARB fp_glGetUniformivARB; -pfn_glGetShaderSourceARB fp_glGetShaderSourceARB; pfn_glNamedStringARB fp_glNamedStringARB; pfn_glDeleteNamedStringARB fp_glDeleteNamedStringARB; pfn_glCompileShaderIncludeARB fp_glCompileShaderIncludeARB; pfn_glIsNamedStringARB fp_glIsNamedStringARB; pfn_glGetNamedStringARB fp_glGetNamedStringARB; pfn_glGetNamedStringivARB fp_glGetNamedStringivARB; +pfn_glBufferPageCommitmentARB fp_glBufferPageCommitmentARB; +pfn_glNamedBufferPageCommitmentEXT fp_glNamedBufferPageCommitmentEXT; +pfn_glNamedBufferPageCommitmentARB fp_glNamedBufferPageCommitmentARB; pfn_glTexPageCommitmentARB fp_glTexPageCommitmentARB; pfn_glTexBufferARB fp_glTexBufferARB; -pfn_glCompressedTexImage3DARB fp_glCompressedTexImage3DARB; -pfn_glCompressedTexImage2DARB fp_glCompressedTexImage2DARB; -pfn_glCompressedTexImage1DARB fp_glCompressedTexImage1DARB; -pfn_glCompressedTexSubImage3DARB fp_glCompressedTexSubImage3DARB; -pfn_glCompressedTexSubImage2DARB fp_glCompressedTexSubImage2DARB; -pfn_glCompressedTexSubImage1DARB fp_glCompressedTexSubImage1DARB; -pfn_glGetCompressedTexImageARB fp_glGetCompressedTexImageARB; -pfn_glLoadTransposeMatrixfARB fp_glLoadTransposeMatrixfARB; -pfn_glLoadTransposeMatrixdARB fp_glLoadTransposeMatrixdARB; -pfn_glMultTransposeMatrixfARB fp_glMultTransposeMatrixfARB; -pfn_glMultTransposeMatrixdARB fp_glMultTransposeMatrixdARB; -pfn_glWeightbvARB fp_glWeightbvARB; -pfn_glWeightsvARB fp_glWeightsvARB; -pfn_glWeightivARB fp_glWeightivARB; -pfn_glWeightfvARB fp_glWeightfvARB; -pfn_glWeightdvARB fp_glWeightdvARB; -pfn_glWeightubvARB fp_glWeightubvARB; -pfn_glWeightusvARB fp_glWeightusvARB; -pfn_glWeightuivARB fp_glWeightuivARB; -pfn_glWeightPointerARB fp_glWeightPointerARB; -pfn_glVertexBlendARB fp_glVertexBlendARB; -pfn_glBindBufferARB fp_glBindBufferARB; -pfn_glDeleteBuffersARB fp_glDeleteBuffersARB; -pfn_glGenBuffersARB fp_glGenBuffersARB; -pfn_glIsBufferARB fp_glIsBufferARB; -pfn_glBufferDataARB fp_glBufferDataARB; -pfn_glBufferSubDataARB fp_glBufferSubDataARB; -pfn_glGetBufferSubDataARB fp_glGetBufferSubDataARB; -pfn_glMapBufferARB fp_glMapBufferARB; -pfn_glUnmapBufferARB fp_glUnmapBufferARB; -pfn_glGetBufferParameterivARB fp_glGetBufferParameterivARB; -pfn_glGetBufferPointervARB fp_glGetBufferPointervARB; -pfn_glVertexAttrib1dARB fp_glVertexAttrib1dARB; -pfn_glVertexAttrib1dvARB fp_glVertexAttrib1dvARB; -pfn_glVertexAttrib1fARB fp_glVertexAttrib1fARB; -pfn_glVertexAttrib1fvARB fp_glVertexAttrib1fvARB; -pfn_glVertexAttrib1sARB fp_glVertexAttrib1sARB; -pfn_glVertexAttrib1svARB fp_glVertexAttrib1svARB; -pfn_glVertexAttrib2dARB fp_glVertexAttrib2dARB; -pfn_glVertexAttrib2dvARB fp_glVertexAttrib2dvARB; -pfn_glVertexAttrib2fARB fp_glVertexAttrib2fARB; -pfn_glVertexAttrib2fvARB fp_glVertexAttrib2fvARB; -pfn_glVertexAttrib2sARB fp_glVertexAttrib2sARB; -pfn_glVertexAttrib2svARB fp_glVertexAttrib2svARB; -pfn_glVertexAttrib3dARB fp_glVertexAttrib3dARB; -pfn_glVertexAttrib3dvARB fp_glVertexAttrib3dvARB; -pfn_glVertexAttrib3fARB fp_glVertexAttrib3fARB; -pfn_glVertexAttrib3fvARB fp_glVertexAttrib3fvARB; -pfn_glVertexAttrib3sARB fp_glVertexAttrib3sARB; -pfn_glVertexAttrib3svARB fp_glVertexAttrib3svARB; -pfn_glVertexAttrib4NbvARB fp_glVertexAttrib4NbvARB; -pfn_glVertexAttrib4NivARB fp_glVertexAttrib4NivARB; -pfn_glVertexAttrib4NsvARB fp_glVertexAttrib4NsvARB; -pfn_glVertexAttrib4NubARB fp_glVertexAttrib4NubARB; -pfn_glVertexAttrib4NubvARB fp_glVertexAttrib4NubvARB; -pfn_glVertexAttrib4NuivARB fp_glVertexAttrib4NuivARB; -pfn_glVertexAttrib4NusvARB fp_glVertexAttrib4NusvARB; -pfn_glVertexAttrib4bvARB fp_glVertexAttrib4bvARB; -pfn_glVertexAttrib4dARB fp_glVertexAttrib4dARB; -pfn_glVertexAttrib4dvARB fp_glVertexAttrib4dvARB; -pfn_glVertexAttrib4fARB fp_glVertexAttrib4fARB; -pfn_glVertexAttrib4fvARB fp_glVertexAttrib4fvARB; -pfn_glVertexAttrib4ivARB fp_glVertexAttrib4ivARB; -pfn_glVertexAttrib4sARB fp_glVertexAttrib4sARB; -pfn_glVertexAttrib4svARB fp_glVertexAttrib4svARB; -pfn_glVertexAttrib4ubvARB fp_glVertexAttrib4ubvARB; -pfn_glVertexAttrib4uivARB fp_glVertexAttrib4uivARB; -pfn_glVertexAttrib4usvARB fp_glVertexAttrib4usvARB; -pfn_glVertexAttribPointerARB fp_glVertexAttribPointerARB; -pfn_glEnableVertexAttribArrayARB fp_glEnableVertexAttribArrayARB; -pfn_glDisableVertexAttribArrayARB fp_glDisableVertexAttribArrayARB; -pfn_glGetVertexAttribdvARB fp_glGetVertexAttribdvARB; -pfn_glGetVertexAttribfvARB fp_glGetVertexAttribfvARB; -pfn_glGetVertexAttribivARB fp_glGetVertexAttribivARB; -pfn_glGetVertexAttribPointervARB fp_glGetVertexAttribPointervARB; -pfn_glBindAttribLocationARB fp_glBindAttribLocationARB; -pfn_glGetActiveAttribARB fp_glGetActiveAttribARB; -pfn_glGetAttribLocationARB fp_glGetAttribLocationARB; -pfn_glWindowPos2dARB fp_glWindowPos2dARB; -pfn_glWindowPos2dvARB fp_glWindowPos2dvARB; -pfn_glWindowPos2fARB fp_glWindowPos2fARB; -pfn_glWindowPos2fvARB fp_glWindowPos2fvARB; -pfn_glWindowPos2iARB fp_glWindowPos2iARB; -pfn_glWindowPos2ivARB fp_glWindowPos2ivARB; -pfn_glWindowPos2sARB fp_glWindowPos2sARB; -pfn_glWindowPos2svARB fp_glWindowPos2svARB; -pfn_glWindowPos3dARB fp_glWindowPos3dARB; -pfn_glWindowPos3dvARB fp_glWindowPos3dvARB; -pfn_glWindowPos3fARB fp_glWindowPos3fARB; -pfn_glWindowPos3fvARB fp_glWindowPos3fvARB; -pfn_glWindowPos3iARB fp_glWindowPos3iARB; -pfn_glWindowPos3ivARB fp_glWindowPos3ivARB; -pfn_glWindowPos3sARB fp_glWindowPos3sARB; -pfn_glWindowPos3svARB fp_glWindowPos3svARB; +pfn_glDrawArraysInstancedBaseInstanceEXT fp_glDrawArraysInstancedBaseInstanceEXT; +pfn_glDrawElementsInstancedBaseInstanceEXT fp_glDrawElementsInstancedBaseInstanceEXT; +pfn_glDrawElementsInstancedBaseVertexBaseInstanceEXT fp_glDrawElementsInstancedBaseVertexBaseInstanceEXT; pfn_glUniformBufferEXT fp_glUniformBufferEXT; pfn_glGetUniformBufferSizeEXT fp_glGetUniformBufferSizeEXT; pfn_glGetUniformOffsetEXT fp_glGetUniformOffsetEXT; -pfn_glBlendColorEXT fp_glBlendColorEXT; -pfn_glBlendEquationSeparateEXT fp_glBlendEquationSeparateEXT; -pfn_glBlendFuncSeparateEXT fp_glBlendFuncSeparateEXT; -pfn_glBlendEquationEXT fp_glBlendEquationEXT; -pfn_glColorSubTableEXT fp_glColorSubTableEXT; -pfn_glCopyColorSubTableEXT fp_glCopyColorSubTableEXT; -pfn_glLockArraysEXT fp_glLockArraysEXT; -pfn_glUnlockArraysEXT fp_glUnlockArraysEXT; -pfn_glConvolutionFilter1DEXT fp_glConvolutionFilter1DEXT; -pfn_glConvolutionFilter2DEXT fp_glConvolutionFilter2DEXT; -pfn_glConvolutionParameterfEXT fp_glConvolutionParameterfEXT; -pfn_glConvolutionParameterfvEXT fp_glConvolutionParameterfvEXT; -pfn_glConvolutionParameteriEXT fp_glConvolutionParameteriEXT; -pfn_glConvolutionParameterivEXT fp_glConvolutionParameterivEXT; -pfn_glCopyConvolutionFilter1DEXT fp_glCopyConvolutionFilter1DEXT; -pfn_glCopyConvolutionFilter2DEXT fp_glCopyConvolutionFilter2DEXT; -pfn_glGetConvolutionFilterEXT fp_glGetConvolutionFilterEXT; -pfn_glGetConvolutionParameterfvEXT fp_glGetConvolutionParameterfvEXT; -pfn_glGetConvolutionParameterivEXT fp_glGetConvolutionParameterivEXT; -pfn_glGetSeparableFilterEXT fp_glGetSeparableFilterEXT; -pfn_glSeparableFilter2DEXT fp_glSeparableFilter2DEXT; -pfn_glTangent3bEXT fp_glTangent3bEXT; -pfn_glTangent3bvEXT fp_glTangent3bvEXT; -pfn_glTangent3dEXT fp_glTangent3dEXT; -pfn_glTangent3dvEXT fp_glTangent3dvEXT; -pfn_glTangent3fEXT fp_glTangent3fEXT; -pfn_glTangent3fvEXT fp_glTangent3fvEXT; -pfn_glTangent3iEXT fp_glTangent3iEXT; -pfn_glTangent3ivEXT fp_glTangent3ivEXT; -pfn_glTangent3sEXT fp_glTangent3sEXT; -pfn_glTangent3svEXT fp_glTangent3svEXT; -pfn_glBinormal3bEXT fp_glBinormal3bEXT; -pfn_glBinormal3bvEXT fp_glBinormal3bvEXT; -pfn_glBinormal3dEXT fp_glBinormal3dEXT; -pfn_glBinormal3dvEXT fp_glBinormal3dvEXT; -pfn_glBinormal3fEXT fp_glBinormal3fEXT; -pfn_glBinormal3fvEXT fp_glBinormal3fvEXT; -pfn_glBinormal3iEXT fp_glBinormal3iEXT; -pfn_glBinormal3ivEXT fp_glBinormal3ivEXT; -pfn_glBinormal3sEXT fp_glBinormal3sEXT; -pfn_glBinormal3svEXT fp_glBinormal3svEXT; -pfn_glTangentPointerEXT fp_glTangentPointerEXT; -pfn_glBinormalPointerEXT fp_glBinormalPointerEXT; -pfn_glCullParameterdvEXT fp_glCullParameterdvEXT; -pfn_glCullParameterfvEXT fp_glCullParameterfvEXT; +pfn_glCopyImageSubDataEXT fp_glCopyImageSubDataEXT; pfn_glLabelObjectEXT fp_glLabelObjectEXT; pfn_glGetObjectLabelEXT fp_glGetObjectLabelEXT; pfn_glInsertEventMarkerEXT fp_glInsertEventMarkerEXT; pfn_glPushGroupMarkerEXT fp_glPushGroupMarkerEXT; pfn_glPopGroupMarkerEXT fp_glPopGroupMarkerEXT; -pfn_glDepthBoundsEXT fp_glDepthBoundsEXT; pfn_glMatrixLoadfEXT fp_glMatrixLoadfEXT; pfn_glMatrixLoaddEXT fp_glMatrixLoaddEXT; pfn_glMatrixMultfEXT fp_glMatrixMultfEXT; @@ -1604,13 +1489,20 @@ pfn_glGetQueryObjecti64vEXT fp_glGetQueryObjecti64vEXT; pfn_glGetQueryObjectui64vEXT fp_glGetQueryObjectui64vEXT; pfn_glDrawBuffersEXT fp_glDrawBuffersEXT; pfn_glColorMaskIndexedEXT fp_glColorMaskIndexedEXT; +pfn_glEnableiEXT fp_glEnableiEXT; +pfn_glDisableiEXT fp_glDisableiEXT; +pfn_glBlendEquationiEXT fp_glBlendEquationiEXT; +pfn_glBlendEquationSeparateiEXT fp_glBlendEquationSeparateiEXT; +pfn_glBlendFunciEXT fp_glBlendFunciEXT; +pfn_glBlendFuncSeparateiEXT fp_glBlendFuncSeparateiEXT; +pfn_glColorMaskiEXT fp_glColorMaskiEXT; +pfn_glIsEnablediEXT fp_glIsEnablediEXT; +pfn_glDrawElementsBaseVertexEXT fp_glDrawElementsBaseVertexEXT; +pfn_glDrawRangeElementsBaseVertexEXT fp_glDrawRangeElementsBaseVertexEXT; +pfn_glDrawElementsInstancedBaseVertexEXT fp_glDrawElementsInstancedBaseVertexEXT; +pfn_glMultiDrawElementsBaseVertexEXT fp_glMultiDrawElementsBaseVertexEXT; pfn_glDrawArraysInstancedEXT fp_glDrawArraysInstancedEXT; pfn_glDrawElementsInstancedEXT fp_glDrawElementsInstancedEXT; -pfn_glFogCoordfEXT fp_glFogCoordfEXT; -pfn_glFogCoordfvEXT fp_glFogCoordfvEXT; -pfn_glFogCoorddEXT fp_glFogCoorddEXT; -pfn_glFogCoorddvEXT fp_glFogCoorddvEXT; -pfn_glFogCoordPointerEXT fp_glFogCoordPointerEXT; pfn_glBlitFramebufferEXT fp_glBlitFramebufferEXT; pfn_glRenderbufferStorageMultisampleEXT fp_glRenderbufferStorageMultisampleEXT; pfn_glIsRenderbufferEXT fp_glIsRenderbufferEXT; @@ -1630,6 +1522,7 @@ pfn_glFramebufferTexture3DEXT fp_glFramebufferTexture3DEXT; pfn_glFramebufferRenderbufferEXT fp_glFramebufferRenderbufferEXT; pfn_glGetFramebufferAttachmentParameterivEXT fp_glGetFramebufferAttachmentParameterivEXT; pfn_glGenerateMipmapEXT fp_glGenerateMipmapEXT; +pfn_glFramebufferTextureEXT fp_glFramebufferTextureEXT; pfn_glProgramParameteriEXT fp_glProgramParameteriEXT; pfn_glProgramEnvParameters4fvEXT fp_glProgramEnvParameters4fvEXT; pfn_glProgramLocalParameters4fvEXT fp_glProgramLocalParameters4fvEXT; @@ -1644,66 +1537,23 @@ pfn_glUniform1uivEXT fp_glUniform1uivEXT; pfn_glUniform2uivEXT fp_glUniform2uivEXT; pfn_glUniform3uivEXT fp_glUniform3uivEXT; pfn_glUniform4uivEXT fp_glUniform4uivEXT; -pfn_glGetHistogramEXT fp_glGetHistogramEXT; -pfn_glGetHistogramParameterfvEXT fp_glGetHistogramParameterfvEXT; -pfn_glGetHistogramParameterivEXT fp_glGetHistogramParameterivEXT; -pfn_glGetMinmaxEXT fp_glGetMinmaxEXT; -pfn_glGetMinmaxParameterfvEXT fp_glGetMinmaxParameterfvEXT; -pfn_glGetMinmaxParameterivEXT fp_glGetMinmaxParameterivEXT; -pfn_glHistogramEXT fp_glHistogramEXT; -pfn_glMinmaxEXT fp_glMinmaxEXT; -pfn_glResetHistogramEXT fp_glResetHistogramEXT; -pfn_glResetMinmaxEXT fp_glResetMinmaxEXT; -pfn_glIndexFuncEXT fp_glIndexFuncEXT; -pfn_glIndexMaterialEXT fp_glIndexMaterialEXT; pfn_glVertexAttribDivisorEXT fp_glVertexAttribDivisorEXT; -pfn_glApplyTextureEXT fp_glApplyTextureEXT; -pfn_glTextureLightEXT fp_glTextureLightEXT; -pfn_glTextureMaterialEXT fp_glTextureMaterialEXT; pfn_glMapBufferRangeEXT fp_glMapBufferRangeEXT; pfn_glFlushMappedBufferRangeEXT fp_glFlushMappedBufferRangeEXT; -pfn_glMultiDrawArraysEXT fp_glMultiDrawArraysEXT; -pfn_glMultiDrawElementsEXT fp_glMultiDrawElementsEXT; -pfn_glSampleMaskEXT fp_glSampleMaskEXT; -pfn_glSamplePatternEXT fp_glSamplePatternEXT; +pfn_glMultiDrawArraysIndirectEXT fp_glMultiDrawArraysIndirectEXT; +pfn_glMultiDrawElementsIndirectEXT fp_glMultiDrawElementsIndirectEXT; pfn_glFramebufferTexture2DMultisampleEXT fp_glFramebufferTexture2DMultisampleEXT; pfn_glReadBufferIndexedEXT fp_glReadBufferIndexedEXT; pfn_glDrawBuffersIndexedEXT fp_glDrawBuffersIndexedEXT; pfn_glGetIntegeri_vEXT fp_glGetIntegeri_vEXT; -pfn_glColorTableEXT fp_glColorTableEXT; -pfn_glGetColorTableEXT fp_glGetColorTableEXT; -pfn_glGetColorTableParameterivEXT fp_glGetColorTableParameterivEXT; -pfn_glGetColorTableParameterfvEXT fp_glGetColorTableParameterfvEXT; -pfn_glPixelTransformParameteriEXT fp_glPixelTransformParameteriEXT; -pfn_glPixelTransformParameterfEXT fp_glPixelTransformParameterfEXT; -pfn_glPixelTransformParameterivEXT fp_glPixelTransformParameterivEXT; -pfn_glPixelTransformParameterfvEXT fp_glPixelTransformParameterfvEXT; -pfn_glGetPixelTransformParameterivEXT fp_glGetPixelTransformParameterivEXT; -pfn_glGetPixelTransformParameterfvEXT fp_glGetPixelTransformParameterfvEXT; -pfn_glPointParameterfEXT fp_glPointParameterfEXT; -pfn_glPointParameterfvEXT fp_glPointParameterfvEXT; +pfn_glPolygonOffsetClampEXT fp_glPolygonOffsetClampEXT; +pfn_glPrimitiveBoundingBoxEXT fp_glPrimitiveBoundingBoxEXT; pfn_glProvokingVertexEXT fp_glProvokingVertexEXT; +pfn_glRasterSamplesEXT fp_glRasterSamplesEXT; pfn_glGetGraphicsResetStatusEXT fp_glGetGraphicsResetStatusEXT; pfn_glReadnPixelsEXT fp_glReadnPixelsEXT; pfn_glGetnUniformfvEXT fp_glGetnUniformfvEXT; pfn_glGetnUniformivEXT fp_glGetnUniformivEXT; -pfn_glSecondaryColor3bEXT fp_glSecondaryColor3bEXT; -pfn_glSecondaryColor3bvEXT fp_glSecondaryColor3bvEXT; -pfn_glSecondaryColor3dEXT fp_glSecondaryColor3dEXT; -pfn_glSecondaryColor3dvEXT fp_glSecondaryColor3dvEXT; -pfn_glSecondaryColor3fEXT fp_glSecondaryColor3fEXT; -pfn_glSecondaryColor3fvEXT fp_glSecondaryColor3fvEXT; -pfn_glSecondaryColor3iEXT fp_glSecondaryColor3iEXT; -pfn_glSecondaryColor3ivEXT fp_glSecondaryColor3ivEXT; -pfn_glSecondaryColor3sEXT fp_glSecondaryColor3sEXT; -pfn_glSecondaryColor3svEXT fp_glSecondaryColor3svEXT; -pfn_glSecondaryColor3ubEXT fp_glSecondaryColor3ubEXT; -pfn_glSecondaryColor3ubvEXT fp_glSecondaryColor3ubvEXT; -pfn_glSecondaryColor3uiEXT fp_glSecondaryColor3uiEXT; -pfn_glSecondaryColor3uivEXT fp_glSecondaryColor3uivEXT; -pfn_glSecondaryColor3usEXT fp_glSecondaryColor3usEXT; -pfn_glSecondaryColor3usvEXT fp_glSecondaryColor3usvEXT; -pfn_glSecondaryColorPointerEXT fp_glSecondaryColorPointerEXT; pfn_glUseShaderProgramEXT fp_glUseShaderProgramEXT; pfn_glActiveProgramEXT fp_glActiveProgramEXT; pfn_glCreateShaderProgramEXT fp_glCreateShaderProgramEXT; @@ -1720,18 +1570,24 @@ pfn_glValidateProgramPipelineEXT fp_glValidateProgramPipelineEXT; pfn_glBindImageTextureEXT fp_glBindImageTextureEXT; pfn_glMemoryBarrierEXT fp_glMemoryBarrierEXT; pfn_glStencilClearTagEXT fp_glStencilClearTagEXT; -pfn_glActiveStencilFaceEXT fp_glActiveStencilFaceEXT; -pfn_glTexBufferEXT fp_glTexBufferEXT; +pfn_glPatchParameteriEXT fp_glPatchParameteriEXT; +pfn_glFramebufferTextureLayerEXT fp_glFramebufferTextureLayerEXT; pfn_glTexParameterIivEXT fp_glTexParameterIivEXT; pfn_glTexParameterIuivEXT fp_glTexParameterIuivEXT; pfn_glGetTexParameterIivEXT fp_glGetTexParameterIivEXT; pfn_glGetTexParameterIuivEXT fp_glGetTexParameterIuivEXT; +pfn_glSamplerParameterIivEXT fp_glSamplerParameterIivEXT; +pfn_glSamplerParameterIuivEXT fp_glSamplerParameterIuivEXT; +pfn_glGetSamplerParameterIivEXT fp_glGetSamplerParameterIivEXT; +pfn_glGetSamplerParameterIuivEXT fp_glGetSamplerParameterIuivEXT; +pfn_glTexBufferEXT fp_glTexBufferEXT; +pfn_glTexBufferRangeEXT fp_glTexBufferRangeEXT; pfn_glClearColorIiEXT fp_glClearColorIiEXT; pfn_glClearColorIuiEXT fp_glClearColorIuiEXT; -pfn_glTextureNormalEXT fp_glTextureNormalEXT; pfn_glTexStorage1DEXT fp_glTexStorage1DEXT; pfn_glTexStorage2DEXT fp_glTexStorage2DEXT; pfn_glTexStorage3DEXT fp_glTexStorage3DEXT; +pfn_glTextureViewEXT fp_glTextureViewEXT; pfn_glBeginTransformFeedbackEXT fp_glBeginTransformFeedbackEXT; pfn_glEndTransformFeedbackEXT fp_glEndTransformFeedbackEXT; pfn_glBindBufferRangeEXT fp_glBindBufferRangeEXT; @@ -1749,202 +1605,49 @@ pfn_glVertexAttribL3dvEXT fp_glVertexAttribL3dvEXT; pfn_glVertexAttribL4dvEXT fp_glVertexAttribL4dvEXT; pfn_glVertexAttribLPointerEXT fp_glVertexAttribLPointerEXT; pfn_glGetVertexAttribLdvEXT fp_glGetVertexAttribLdvEXT; -pfn_glBeginVertexShaderEXT fp_glBeginVertexShaderEXT; -pfn_glEndVertexShaderEXT fp_glEndVertexShaderEXT; -pfn_glBindVertexShaderEXT fp_glBindVertexShaderEXT; -pfn_glGenVertexShadersEXT fp_glGenVertexShadersEXT; -pfn_glDeleteVertexShaderEXT fp_glDeleteVertexShaderEXT; -pfn_glShaderOp1EXT fp_glShaderOp1EXT; -pfn_glShaderOp2EXT fp_glShaderOp2EXT; -pfn_glShaderOp3EXT fp_glShaderOp3EXT; -pfn_glSwizzleEXT fp_glSwizzleEXT; -pfn_glWriteMaskEXT fp_glWriteMaskEXT; -pfn_glInsertComponentEXT fp_glInsertComponentEXT; -pfn_glExtractComponentEXT fp_glExtractComponentEXT; -pfn_glGenSymbolsEXT fp_glGenSymbolsEXT; -pfn_glSetInvariantEXT fp_glSetInvariantEXT; -pfn_glSetLocalConstantEXT fp_glSetLocalConstantEXT; -pfn_glVariantbvEXT fp_glVariantbvEXT; -pfn_glVariantsvEXT fp_glVariantsvEXT; -pfn_glVariantivEXT fp_glVariantivEXT; -pfn_glVariantfvEXT fp_glVariantfvEXT; -pfn_glVariantdvEXT fp_glVariantdvEXT; -pfn_glVariantubvEXT fp_glVariantubvEXT; -pfn_glVariantusvEXT fp_glVariantusvEXT; -pfn_glVariantuivEXT fp_glVariantuivEXT; -pfn_glVariantPointerEXT fp_glVariantPointerEXT; -pfn_glEnableVariantClientStateEXT fp_glEnableVariantClientStateEXT; -pfn_glDisableVariantClientStateEXT fp_glDisableVariantClientStateEXT; -pfn_glBindLightParameterEXT fp_glBindLightParameterEXT; -pfn_glBindMaterialParameterEXT fp_glBindMaterialParameterEXT; -pfn_glBindTexGenParameterEXT fp_glBindTexGenParameterEXT; -pfn_glBindTextureUnitParameterEXT fp_glBindTextureUnitParameterEXT; -pfn_glBindParameterEXT fp_glBindParameterEXT; -pfn_glIsVariantEnabledEXT fp_glIsVariantEnabledEXT; -pfn_glGetVariantBooleanvEXT fp_glGetVariantBooleanvEXT; -pfn_glGetVariantIntegervEXT fp_glGetVariantIntegervEXT; -pfn_glGetVariantFloatvEXT fp_glGetVariantFloatvEXT; -pfn_glGetVariantPointervEXT fp_glGetVariantPointervEXT; -pfn_glGetInvariantBooleanvEXT fp_glGetInvariantBooleanvEXT; -pfn_glGetInvariantIntegervEXT fp_glGetInvariantIntegervEXT; -pfn_glGetInvariantFloatvEXT fp_glGetInvariantFloatvEXT; -pfn_glGetLocalConstantBooleanvEXT fp_glGetLocalConstantBooleanvEXT; -pfn_glGetLocalConstantIntegervEXT fp_glGetLocalConstantIntegervEXT; -pfn_glGetLocalConstantFloatvEXT fp_glGetLocalConstantFloatvEXT; -pfn_glVertexWeightfEXT fp_glVertexWeightfEXT; -pfn_glVertexWeightfvEXT fp_glVertexWeightfvEXT; -pfn_glVertexWeightPointerEXT fp_glVertexWeightPointerEXT; pfn_glImportSyncEXT fp_glImportSyncEXT; -pfn_glMultiTexCoord1bOES fp_glMultiTexCoord1bOES; -pfn_glMultiTexCoord1bvOES fp_glMultiTexCoord1bvOES; -pfn_glMultiTexCoord2bOES fp_glMultiTexCoord2bOES; -pfn_glMultiTexCoord2bvOES fp_glMultiTexCoord2bvOES; -pfn_glMultiTexCoord3bOES fp_glMultiTexCoord3bOES; -pfn_glMultiTexCoord3bvOES fp_glMultiTexCoord3bvOES; -pfn_glMultiTexCoord4bOES fp_glMultiTexCoord4bOES; -pfn_glMultiTexCoord4bvOES fp_glMultiTexCoord4bvOES; -pfn_glTexCoord1bOES fp_glTexCoord1bOES; -pfn_glTexCoord1bvOES fp_glTexCoord1bvOES; -pfn_glTexCoord2bOES fp_glTexCoord2bOES; -pfn_glTexCoord2bvOES fp_glTexCoord2bvOES; -pfn_glTexCoord3bOES fp_glTexCoord3bOES; -pfn_glTexCoord3bvOES fp_glTexCoord3bvOES; -pfn_glTexCoord4bOES fp_glTexCoord4bOES; -pfn_glTexCoord4bvOES fp_glTexCoord4bvOES; -pfn_glVertex2bOES fp_glVertex2bOES; -pfn_glVertex2bvOES fp_glVertex2bvOES; -pfn_glVertex3bOES fp_glVertex3bOES; -pfn_glVertex3bvOES fp_glVertex3bvOES; -pfn_glVertex4bOES fp_glVertex4bOES; -pfn_glVertex4bvOES fp_glVertex4bvOES; +pfn_glCopyImageSubDataOES fp_glCopyImageSubDataOES; +pfn_glEnableiOES fp_glEnableiOES; +pfn_glDisableiOES fp_glDisableiOES; +pfn_glBlendEquationiOES fp_glBlendEquationiOES; +pfn_glBlendEquationSeparateiOES fp_glBlendEquationSeparateiOES; +pfn_glBlendFunciOES fp_glBlendFunciOES; +pfn_glBlendFuncSeparateiOES fp_glBlendFuncSeparateiOES; +pfn_glColorMaskiOES fp_glColorMaskiOES; +pfn_glIsEnablediOES fp_glIsEnablediOES; +pfn_glDrawElementsBaseVertexOES fp_glDrawElementsBaseVertexOES; +pfn_glDrawRangeElementsBaseVertexOES fp_glDrawRangeElementsBaseVertexOES; +pfn_glDrawElementsInstancedBaseVertexOES fp_glDrawElementsInstancedBaseVertexOES; +pfn_glMultiDrawElementsBaseVertexOES fp_glMultiDrawElementsBaseVertexOES; pfn_glEGLImageTargetTexture2DOES fp_glEGLImageTargetTexture2DOES; pfn_glEGLImageTargetRenderbufferStorageOES fp_glEGLImageTargetRenderbufferStorageOES; -pfn_glAlphaFuncxOES fp_glAlphaFuncxOES; -pfn_glClearColorxOES fp_glClearColorxOES; -pfn_glClearDepthxOES fp_glClearDepthxOES; -pfn_glClipPlanexOES fp_glClipPlanexOES; -pfn_glColor4xOES fp_glColor4xOES; -pfn_glDepthRangexOES fp_glDepthRangexOES; -pfn_glFogxOES fp_glFogxOES; -pfn_glFogxvOES fp_glFogxvOES; -pfn_glFrustumxOES fp_glFrustumxOES; -pfn_glGetClipPlanexOES fp_glGetClipPlanexOES; -pfn_glGetFixedvOES fp_glGetFixedvOES; -pfn_glGetTexEnvxvOES fp_glGetTexEnvxvOES; -pfn_glGetTexParameterxvOES fp_glGetTexParameterxvOES; -pfn_glLightModelxOES fp_glLightModelxOES; -pfn_glLightModelxvOES fp_glLightModelxvOES; -pfn_glLightxOES fp_glLightxOES; -pfn_glLightxvOES fp_glLightxvOES; -pfn_glLineWidthxOES fp_glLineWidthxOES; -pfn_glLoadMatrixxOES fp_glLoadMatrixxOES; -pfn_glMaterialxOES fp_glMaterialxOES; -pfn_glMaterialxvOES fp_glMaterialxvOES; -pfn_glMultMatrixxOES fp_glMultMatrixxOES; -pfn_glMultiTexCoord4xOES fp_glMultiTexCoord4xOES; -pfn_glNormal3xOES fp_glNormal3xOES; -pfn_glOrthoxOES fp_glOrthoxOES; -pfn_glPointParameterxvOES fp_glPointParameterxvOES; -pfn_glPointSizexOES fp_glPointSizexOES; -pfn_glPolygonOffsetxOES fp_glPolygonOffsetxOES; -pfn_glRotatexOES fp_glRotatexOES; -pfn_glSampleCoverageOES fp_glSampleCoverageOES; -pfn_glScalexOES fp_glScalexOES; -pfn_glTexEnvxOES fp_glTexEnvxOES; -pfn_glTexEnvxvOES fp_glTexEnvxvOES; -pfn_glTexParameterxOES fp_glTexParameterxOES; -pfn_glTexParameterxvOES fp_glTexParameterxvOES; -pfn_glTranslatexOES fp_glTranslatexOES; -pfn_glGetLightxvOES fp_glGetLightxvOES; -pfn_glGetMaterialxvOES fp_glGetMaterialxvOES; -pfn_glPointParameterxOES fp_glPointParameterxOES; -pfn_glSampleCoveragexOES fp_glSampleCoveragexOES; -pfn_glAccumxOES fp_glAccumxOES; -pfn_glBitmapxOES fp_glBitmapxOES; -pfn_glBlendColorxOES fp_glBlendColorxOES; -pfn_glClearAccumxOES fp_glClearAccumxOES; -pfn_glColor3xOES fp_glColor3xOES; -pfn_glColor3xvOES fp_glColor3xvOES; -pfn_glColor4xvOES fp_glColor4xvOES; -pfn_glConvolutionParameterxOES fp_glConvolutionParameterxOES; -pfn_glConvolutionParameterxvOES fp_glConvolutionParameterxvOES; -pfn_glEvalCoord1xOES fp_glEvalCoord1xOES; -pfn_glEvalCoord1xvOES fp_glEvalCoord1xvOES; -pfn_glEvalCoord2xOES fp_glEvalCoord2xOES; -pfn_glEvalCoord2xvOES fp_glEvalCoord2xvOES; -pfn_glFeedbackBufferxOES fp_glFeedbackBufferxOES; -pfn_glGetConvolutionParameterxvOES fp_glGetConvolutionParameterxvOES; -pfn_glGetHistogramParameterxvOES fp_glGetHistogramParameterxvOES; -pfn_glGetLightxOES fp_glGetLightxOES; -pfn_glGetMapxvOES fp_glGetMapxvOES; -pfn_glGetMaterialxOES fp_glGetMaterialxOES; -pfn_glGetPixelMapxv fp_glGetPixelMapxv; -pfn_glGetTexGenxvOES fp_glGetTexGenxvOES; -pfn_glGetTexLevelParameterxvOES fp_glGetTexLevelParameterxvOES; -pfn_glIndexxOES fp_glIndexxOES; -pfn_glIndexxvOES fp_glIndexxvOES; -pfn_glLoadTransposeMatrixxOES fp_glLoadTransposeMatrixxOES; -pfn_glMap1xOES fp_glMap1xOES; -pfn_glMap2xOES fp_glMap2xOES; -pfn_glMapGrid1xOES fp_glMapGrid1xOES; -pfn_glMapGrid2xOES fp_glMapGrid2xOES; -pfn_glMultTransposeMatrixxOES fp_glMultTransposeMatrixxOES; -pfn_glMultiTexCoord1xOES fp_glMultiTexCoord1xOES; -pfn_glMultiTexCoord1xvOES fp_glMultiTexCoord1xvOES; -pfn_glMultiTexCoord2xOES fp_glMultiTexCoord2xOES; -pfn_glMultiTexCoord2xvOES fp_glMultiTexCoord2xvOES; -pfn_glMultiTexCoord3xOES fp_glMultiTexCoord3xOES; -pfn_glMultiTexCoord3xvOES fp_glMultiTexCoord3xvOES; -pfn_glMultiTexCoord4xvOES fp_glMultiTexCoord4xvOES; -pfn_glNormal3xvOES fp_glNormal3xvOES; -pfn_glPassThroughxOES fp_glPassThroughxOES; -pfn_glPixelMapx fp_glPixelMapx; -pfn_glPixelStorex fp_glPixelStorex; -pfn_glPixelTransferxOES fp_glPixelTransferxOES; -pfn_glPixelZoomxOES fp_glPixelZoomxOES; -pfn_glPrioritizeTexturesxOES fp_glPrioritizeTexturesxOES; -pfn_glRasterPos2xOES fp_glRasterPos2xOES; -pfn_glRasterPos2xvOES fp_glRasterPos2xvOES; -pfn_glRasterPos3xOES fp_glRasterPos3xOES; -pfn_glRasterPos3xvOES fp_glRasterPos3xvOES; -pfn_glRasterPos4xOES fp_glRasterPos4xOES; -pfn_glRasterPos4xvOES fp_glRasterPos4xvOES; -pfn_glRectxOES fp_glRectxOES; -pfn_glRectxvOES fp_glRectxvOES; -pfn_glTexCoord1xOES fp_glTexCoord1xOES; -pfn_glTexCoord1xvOES fp_glTexCoord1xvOES; -pfn_glTexCoord2xOES fp_glTexCoord2xOES; -pfn_glTexCoord2xvOES fp_glTexCoord2xvOES; -pfn_glTexCoord3xOES fp_glTexCoord3xOES; -pfn_glTexCoord3xvOES fp_glTexCoord3xvOES; -pfn_glTexCoord4xOES fp_glTexCoord4xOES; -pfn_glTexCoord4xvOES fp_glTexCoord4xvOES; -pfn_glTexGenxOES fp_glTexGenxOES; -pfn_glTexGenxvOES fp_glTexGenxvOES; -pfn_glVertex2xOES fp_glVertex2xOES; -pfn_glVertex2xvOES fp_glVertex2xvOES; -pfn_glVertex3xOES fp_glVertex3xOES; -pfn_glVertex3xvOES fp_glVertex3xvOES; -pfn_glVertex4xOES fp_glVertex4xOES; -pfn_glVertex4xvOES fp_glVertex4xvOES; +pfn_glFramebufferTextureOES fp_glFramebufferTextureOES; pfn_glGetProgramBinaryOES fp_glGetProgramBinaryOES; pfn_glProgramBinaryOES fp_glProgramBinaryOES; pfn_glMapBufferOES fp_glMapBufferOES; pfn_glUnmapBufferOES fp_glUnmapBufferOES; pfn_glGetBufferPointervOES fp_glGetBufferPointervOES; -pfn_glQueryMatrixxOES fp_glQueryMatrixxOES; -pfn_glClearDepthfOES fp_glClearDepthfOES; -pfn_glClipPlanefOES fp_glClipPlanefOES; -pfn_glDepthRangefOES fp_glDepthRangefOES; -pfn_glFrustumfOES fp_glFrustumfOES; -pfn_glGetClipPlanefOES fp_glGetClipPlanefOES; -pfn_glOrthofOES fp_glOrthofOES; +pfn_glPrimitiveBoundingBoxOES fp_glPrimitiveBoundingBoxOES; +pfn_glMinSampleShadingOES fp_glMinSampleShadingOES; +pfn_glPatchParameteriOES fp_glPatchParameteriOES; pfn_glTexImage3DOES fp_glTexImage3DOES; pfn_glTexSubImage3DOES fp_glTexSubImage3DOES; pfn_glCopyTexSubImage3DOES fp_glCopyTexSubImage3DOES; pfn_glCompressedTexImage3DOES fp_glCompressedTexImage3DOES; pfn_glCompressedTexSubImage3DOES fp_glCompressedTexSubImage3DOES; pfn_glFramebufferTexture3DOES fp_glFramebufferTexture3DOES; +pfn_glTexParameterIivOES fp_glTexParameterIivOES; +pfn_glTexParameterIuivOES fp_glTexParameterIuivOES; +pfn_glGetTexParameterIivOES fp_glGetTexParameterIivOES; +pfn_glGetTexParameterIuivOES fp_glGetTexParameterIuivOES; +pfn_glSamplerParameterIivOES fp_glSamplerParameterIivOES; +pfn_glSamplerParameterIuivOES fp_glSamplerParameterIuivOES; +pfn_glGetSamplerParameterIivOES fp_glGetSamplerParameterIivOES; +pfn_glGetSamplerParameterIuivOES fp_glGetSamplerParameterIuivOES; +pfn_glTexBufferOES fp_glTexBufferOES; +pfn_glTexBufferRangeOES fp_glTexBufferRangeOES; +pfn_glTexStorage3DMultisampleOES fp_glTexStorage3DMultisampleOES; +pfn_glTextureViewOES fp_glTextureViewOES; pfn_glBindVertexArrayOES fp_glBindVertexArrayOES; pfn_glDeleteVertexArraysOES fp_glDeleteVertexArraysOES; pfn_glGenVertexArraysOES fp_glGenVertexArraysOES; @@ -1957,12 +1660,47 @@ pfn_glBlendFuncIndexedAMD fp_glBlendFuncIndexedAMD; pfn_glBlendFuncSeparateIndexedAMD fp_glBlendFuncSeparateIndexedAMD; pfn_glBlendEquationIndexedAMD fp_glBlendEquationIndexedAMD; pfn_glBlendEquationSeparateIndexedAMD fp_glBlendEquationSeparateIndexedAMD; +pfn_glUniform1i64NV fp_glUniform1i64NV; +pfn_glUniform2i64NV fp_glUniform2i64NV; +pfn_glUniform3i64NV fp_glUniform3i64NV; +pfn_glUniform4i64NV fp_glUniform4i64NV; +pfn_glUniform1i64vNV fp_glUniform1i64vNV; +pfn_glUniform2i64vNV fp_glUniform2i64vNV; +pfn_glUniform3i64vNV fp_glUniform3i64vNV; +pfn_glUniform4i64vNV fp_glUniform4i64vNV; +pfn_glUniform1ui64NV fp_glUniform1ui64NV; +pfn_glUniform2ui64NV fp_glUniform2ui64NV; +pfn_glUniform3ui64NV fp_glUniform3ui64NV; +pfn_glUniform4ui64NV fp_glUniform4ui64NV; +pfn_glUniform1ui64vNV fp_glUniform1ui64vNV; +pfn_glUniform2ui64vNV fp_glUniform2ui64vNV; +pfn_glUniform3ui64vNV fp_glUniform3ui64vNV; +pfn_glUniform4ui64vNV fp_glUniform4ui64vNV; +pfn_glGetUniformi64vNV fp_glGetUniformi64vNV; +pfn_glGetUniformui64vNV fp_glGetUniformui64vNV; +pfn_glProgramUniform1i64NV fp_glProgramUniform1i64NV; +pfn_glProgramUniform2i64NV fp_glProgramUniform2i64NV; +pfn_glProgramUniform3i64NV fp_glProgramUniform3i64NV; +pfn_glProgramUniform4i64NV fp_glProgramUniform4i64NV; +pfn_glProgramUniform1i64vNV fp_glProgramUniform1i64vNV; +pfn_glProgramUniform2i64vNV fp_glProgramUniform2i64vNV; +pfn_glProgramUniform3i64vNV fp_glProgramUniform3i64vNV; +pfn_glProgramUniform4i64vNV fp_glProgramUniform4i64vNV; +pfn_glProgramUniform1ui64NV fp_glProgramUniform1ui64NV; +pfn_glProgramUniform2ui64NV fp_glProgramUniform2ui64NV; +pfn_glProgramUniform3ui64NV fp_glProgramUniform3ui64NV; +pfn_glProgramUniform4ui64NV fp_glProgramUniform4ui64NV; +pfn_glProgramUniform1ui64vNV fp_glProgramUniform1ui64vNV; +pfn_glProgramUniform2ui64vNV fp_glProgramUniform2ui64vNV; +pfn_glProgramUniform3ui64vNV fp_glProgramUniform3ui64vNV; +pfn_glProgramUniform4ui64vNV fp_glProgramUniform4ui64vNV; pfn_glVertexAttribParameteriAMD fp_glVertexAttribParameteriAMD; pfn_glMultiDrawArraysIndirectAMD fp_glMultiDrawArraysIndirectAMD; pfn_glMultiDrawElementsIndirectAMD fp_glMultiDrawElementsIndirectAMD; pfn_glGenNamesAMD fp_glGenNamesAMD; pfn_glDeleteNamesAMD fp_glDeleteNamesAMD; pfn_glIsNameAMD fp_glIsNameAMD; +pfn_glQueryObjectParameteruiAMD fp_glQueryObjectParameteruiAMD; pfn_glGetPerfMonitorGroupsAMD fp_glGetPerfMonitorGroupsAMD; pfn_glGetPerfMonitorCountersAMD fp_glGetPerfMonitorCountersAMD; pfn_glGetPerfMonitorGroupStringAMD fp_glGetPerfMonitorGroupStringAMD; @@ -2030,94 +1768,6 @@ pfn_glMapVertexAttrib1dAPPLE fp_glMapVertexAttrib1dAPPLE; pfn_glMapVertexAttrib1fAPPLE fp_glMapVertexAttrib1fAPPLE; pfn_glMapVertexAttrib2dAPPLE fp_glMapVertexAttrib2dAPPLE; pfn_glMapVertexAttrib2fAPPLE fp_glMapVertexAttrib2fAPPLE; -pfn_glDrawBuffersATI fp_glDrawBuffersATI; -pfn_glElementPointerATI fp_glElementPointerATI; -pfn_glDrawElementArrayATI fp_glDrawElementArrayATI; -pfn_glDrawRangeElementArrayATI fp_glDrawRangeElementArrayATI; -pfn_glTexBumpParameterivATI fp_glTexBumpParameterivATI; -pfn_glTexBumpParameterfvATI fp_glTexBumpParameterfvATI; -pfn_glGetTexBumpParameterivATI fp_glGetTexBumpParameterivATI; -pfn_glGetTexBumpParameterfvATI fp_glGetTexBumpParameterfvATI; -pfn_glGenFragmentShadersATI fp_glGenFragmentShadersATI; -pfn_glBindFragmentShaderATI fp_glBindFragmentShaderATI; -pfn_glDeleteFragmentShaderATI fp_glDeleteFragmentShaderATI; -pfn_glBeginFragmentShaderATI fp_glBeginFragmentShaderATI; -pfn_glEndFragmentShaderATI fp_glEndFragmentShaderATI; -pfn_glPassTexCoordATI fp_glPassTexCoordATI; -pfn_glSampleMapATI fp_glSampleMapATI; -pfn_glColorFragmentOp1ATI fp_glColorFragmentOp1ATI; -pfn_glColorFragmentOp2ATI fp_glColorFragmentOp2ATI; -pfn_glColorFragmentOp3ATI fp_glColorFragmentOp3ATI; -pfn_glAlphaFragmentOp1ATI fp_glAlphaFragmentOp1ATI; -pfn_glAlphaFragmentOp2ATI fp_glAlphaFragmentOp2ATI; -pfn_glAlphaFragmentOp3ATI fp_glAlphaFragmentOp3ATI; -pfn_glSetFragmentShaderConstantATI fp_glSetFragmentShaderConstantATI; -pfn_glMapObjectBufferATI fp_glMapObjectBufferATI; -pfn_glUnmapObjectBufferATI fp_glUnmapObjectBufferATI; -pfn_glPNTrianglesiATI fp_glPNTrianglesiATI; -pfn_glPNTrianglesfATI fp_glPNTrianglesfATI; -pfn_glStencilOpSeparateATI fp_glStencilOpSeparateATI; -pfn_glStencilFuncSeparateATI fp_glStencilFuncSeparateATI; -pfn_glNewObjectBufferATI fp_glNewObjectBufferATI; -pfn_glIsObjectBufferATI fp_glIsObjectBufferATI; -pfn_glUpdateObjectBufferATI fp_glUpdateObjectBufferATI; -pfn_glGetObjectBufferfvATI fp_glGetObjectBufferfvATI; -pfn_glGetObjectBufferivATI fp_glGetObjectBufferivATI; -pfn_glFreeObjectBufferATI fp_glFreeObjectBufferATI; -pfn_glArrayObjectATI fp_glArrayObjectATI; -pfn_glGetArrayObjectfvATI fp_glGetArrayObjectfvATI; -pfn_glGetArrayObjectivATI fp_glGetArrayObjectivATI; -pfn_glVariantArrayObjectATI fp_glVariantArrayObjectATI; -pfn_glGetVariantArrayObjectfvATI fp_glGetVariantArrayObjectfvATI; -pfn_glGetVariantArrayObjectivATI fp_glGetVariantArrayObjectivATI; -pfn_glVertexAttribArrayObjectATI fp_glVertexAttribArrayObjectATI; -pfn_glGetVertexAttribArrayObjectfvATI fp_glGetVertexAttribArrayObjectfvATI; -pfn_glGetVertexAttribArrayObjectivATI fp_glGetVertexAttribArrayObjectivATI; -pfn_glVertexStream1sATI fp_glVertexStream1sATI; -pfn_glVertexStream1svATI fp_glVertexStream1svATI; -pfn_glVertexStream1iATI fp_glVertexStream1iATI; -pfn_glVertexStream1ivATI fp_glVertexStream1ivATI; -pfn_glVertexStream1fATI fp_glVertexStream1fATI; -pfn_glVertexStream1fvATI fp_glVertexStream1fvATI; -pfn_glVertexStream1dATI fp_glVertexStream1dATI; -pfn_glVertexStream1dvATI fp_glVertexStream1dvATI; -pfn_glVertexStream2sATI fp_glVertexStream2sATI; -pfn_glVertexStream2svATI fp_glVertexStream2svATI; -pfn_glVertexStream2iATI fp_glVertexStream2iATI; -pfn_glVertexStream2ivATI fp_glVertexStream2ivATI; -pfn_glVertexStream2fATI fp_glVertexStream2fATI; -pfn_glVertexStream2fvATI fp_glVertexStream2fvATI; -pfn_glVertexStream2dATI fp_glVertexStream2dATI; -pfn_glVertexStream2dvATI fp_glVertexStream2dvATI; -pfn_glVertexStream3sATI fp_glVertexStream3sATI; -pfn_glVertexStream3svATI fp_glVertexStream3svATI; -pfn_glVertexStream3iATI fp_glVertexStream3iATI; -pfn_glVertexStream3ivATI fp_glVertexStream3ivATI; -pfn_glVertexStream3fATI fp_glVertexStream3fATI; -pfn_glVertexStream3fvATI fp_glVertexStream3fvATI; -pfn_glVertexStream3dATI fp_glVertexStream3dATI; -pfn_glVertexStream3dvATI fp_glVertexStream3dvATI; -pfn_glVertexStream4sATI fp_glVertexStream4sATI; -pfn_glVertexStream4svATI fp_glVertexStream4svATI; -pfn_glVertexStream4iATI fp_glVertexStream4iATI; -pfn_glVertexStream4ivATI fp_glVertexStream4ivATI; -pfn_glVertexStream4fATI fp_glVertexStream4fATI; -pfn_glVertexStream4fvATI fp_glVertexStream4fvATI; -pfn_glVertexStream4dATI fp_glVertexStream4dATI; -pfn_glVertexStream4dvATI fp_glVertexStream4dvATI; -pfn_glNormalStream3bATI fp_glNormalStream3bATI; -pfn_glNormalStream3bvATI fp_glNormalStream3bvATI; -pfn_glNormalStream3sATI fp_glNormalStream3sATI; -pfn_glNormalStream3svATI fp_glNormalStream3svATI; -pfn_glNormalStream3iATI fp_glNormalStream3iATI; -pfn_glNormalStream3ivATI fp_glNormalStream3ivATI; -pfn_glNormalStream3fATI fp_glNormalStream3fATI; -pfn_glNormalStream3fvATI fp_glNormalStream3fvATI; -pfn_glNormalStream3dATI fp_glNormalStream3dATI; -pfn_glNormalStream3dvATI fp_glNormalStream3dvATI; -pfn_glClientActiveVertexStreamATI fp_glClientActiveVertexStreamATI; -pfn_glVertexBlendEnviATI fp_glVertexBlendEnviATI; -pfn_glVertexBlendEnvfATI fp_glVertexBlendEnvfATI; pfn_glFrameTerminatorGREMEDY fp_glFrameTerminatorGREMEDY; pfn_glStringMarkerGREMEDY fp_glStringMarkerGREMEDY; pfn_glRenderbufferStorageMultisampleIMG fp_glRenderbufferStorageMultisampleIMG; @@ -2126,37 +1776,20 @@ pfn_glBlendFuncSeparateINGR fp_glBlendFuncSeparateINGR; pfn_glSyncTextureINTEL fp_glSyncTextureINTEL; pfn_glUnmapTexture2DINTEL fp_glUnmapTexture2DINTEL; pfn_glMapTexture2DINTEL fp_glMapTexture2DINTEL; -pfn_glVertexPointervINTEL fp_glVertexPointervINTEL; -pfn_glNormalPointervINTEL fp_glNormalPointervINTEL; -pfn_glColorPointervINTEL fp_glColorPointervINTEL; -pfn_glTexCoordPointervINTEL fp_glTexCoordPointervINTEL; -pfn_glResizeBuffersMESA fp_glResizeBuffersMESA; -pfn_glWindowPos2dMESA fp_glWindowPos2dMESA; -pfn_glWindowPos2dvMESA fp_glWindowPos2dvMESA; -pfn_glWindowPos2fMESA fp_glWindowPos2fMESA; -pfn_glWindowPos2fvMESA fp_glWindowPos2fvMESA; -pfn_glWindowPos2iMESA fp_glWindowPos2iMESA; -pfn_glWindowPos2ivMESA fp_glWindowPos2ivMESA; -pfn_glWindowPos2sMESA fp_glWindowPos2sMESA; -pfn_glWindowPos2svMESA fp_glWindowPos2svMESA; -pfn_glWindowPos3dMESA fp_glWindowPos3dMESA; -pfn_glWindowPos3dvMESA fp_glWindowPos3dvMESA; -pfn_glWindowPos3fMESA fp_glWindowPos3fMESA; -pfn_glWindowPos3fvMESA fp_glWindowPos3fvMESA; -pfn_glWindowPos3iMESA fp_glWindowPos3iMESA; -pfn_glWindowPos3ivMESA fp_glWindowPos3ivMESA; -pfn_glWindowPos3sMESA fp_glWindowPos3sMESA; -pfn_glWindowPos3svMESA fp_glWindowPos3svMESA; -pfn_glWindowPos4dMESA fp_glWindowPos4dMESA; -pfn_glWindowPos4dvMESA fp_glWindowPos4dvMESA; -pfn_glWindowPos4fMESA fp_glWindowPos4fMESA; -pfn_glWindowPos4fvMESA fp_glWindowPos4fvMESA; -pfn_glWindowPos4iMESA fp_glWindowPos4iMESA; -pfn_glWindowPos4ivMESA fp_glWindowPos4ivMESA; -pfn_glWindowPos4sMESA fp_glWindowPos4sMESA; -pfn_glWindowPos4svMESA fp_glWindowPos4svMESA; +pfn_glBeginPerfQueryINTEL fp_glBeginPerfQueryINTEL; +pfn_glCreatePerfQueryINTEL fp_glCreatePerfQueryINTEL; +pfn_glDeletePerfQueryINTEL fp_glDeletePerfQueryINTEL; +pfn_glEndPerfQueryINTEL fp_glEndPerfQueryINTEL; +pfn_glGetFirstPerfQueryIdINTEL fp_glGetFirstPerfQueryIdINTEL; +pfn_glGetNextPerfQueryIdINTEL fp_glGetNextPerfQueryIdINTEL; +pfn_glGetPerfCounterInfoINTEL fp_glGetPerfCounterInfoINTEL; +pfn_glGetPerfQueryDataINTEL fp_glGetPerfQueryDataINTEL; +pfn_glGetPerfQueryIdByNameINTEL fp_glGetPerfQueryIdByNameINTEL; +pfn_glGetPerfQueryInfoINTEL fp_glGetPerfQueryInfoINTEL; pfn_glMultiDrawArraysIndirectBindlessNV fp_glMultiDrawArraysIndirectBindlessNV; pfn_glMultiDrawElementsIndirectBindlessNV fp_glMultiDrawElementsIndirectBindlessNV; +pfn_glMultiDrawArraysIndirectBindlessCountNV fp_glMultiDrawArraysIndirectBindlessCountNV; +pfn_glMultiDrawElementsIndirectBindlessCountNV fp_glMultiDrawElementsIndirectBindlessCountNV; pfn_glGetTextureHandleNV fp_glGetTextureHandleNV; pfn_glGetTextureSamplerHandleNV fp_glGetTextureSamplerHandleNV; pfn_glMakeTextureHandleResidentNV fp_glMakeTextureHandleResidentNV; @@ -2174,6 +1807,7 @@ pfn_glBlendParameteriNV fp_glBlendParameteriNV; pfn_glBlendBarrierNV fp_glBlendBarrierNV; pfn_glBeginConditionalRenderNV fp_glBeginConditionalRenderNV; pfn_glEndConditionalRenderNV fp_glEndConditionalRenderNV; +pfn_glSubpixelPrecisionBiasNV fp_glSubpixelPrecisionBiasNV; pfn_glCopyBufferSubDataNV fp_glCopyBufferSubDataNV; pfn_glCopyImageSubDataNV fp_glCopyImageSubDataNV; pfn_glCoverageMaskNV fp_glCoverageMaskNV; @@ -2185,15 +1819,6 @@ pfn_glDrawBuffersNV fp_glDrawBuffersNV; pfn_glDrawArraysInstancedNV fp_glDrawArraysInstancedNV; pfn_glDrawElementsInstancedNV fp_glDrawElementsInstancedNV; pfn_glDrawTextureNV fp_glDrawTextureNV; -pfn_glMapControlPointsNV fp_glMapControlPointsNV; -pfn_glMapParameterivNV fp_glMapParameterivNV; -pfn_glMapParameterfvNV fp_glMapParameterfvNV; -pfn_glGetMapControlPointsNV fp_glGetMapControlPointsNV; -pfn_glGetMapParameterivNV fp_glGetMapParameterivNV; -pfn_glGetMapParameterfvNV fp_glGetMapParameterfvNV; -pfn_glGetMapAttribParameterivNV fp_glGetMapAttribParameterivNV; -pfn_glGetMapAttribParameterfvNV fp_glGetMapAttribParameterfvNV; -pfn_glEvalMapsNV fp_glEvalMapsNV; pfn_glGetMultisamplefvNV fp_glGetMultisamplefvNV; pfn_glSampleMaskIndexedNV fp_glSampleMaskIndexedNV; pfn_glTexRenderbufferNV fp_glTexRenderbufferNV; @@ -2204,18 +1829,14 @@ pfn_glTestFenceNV fp_glTestFenceNV; pfn_glGetFenceivNV fp_glGetFenceivNV; pfn_glFinishFenceNV fp_glFinishFenceNV; pfn_glSetFenceNV fp_glSetFenceNV; -pfn_glProgramNamedParameter4fNV fp_glProgramNamedParameter4fNV; -pfn_glProgramNamedParameter4fvNV fp_glProgramNamedParameter4fvNV; -pfn_glProgramNamedParameter4dNV fp_glProgramNamedParameter4dNV; -pfn_glProgramNamedParameter4dvNV fp_glProgramNamedParameter4dvNV; -pfn_glGetProgramNamedParameterfvNV fp_glGetProgramNamedParameterfvNV; -pfn_glGetProgramNamedParameterdvNV fp_glGetProgramNamedParameterdvNV; +pfn_glFragmentCoverageColorNV fp_glFragmentCoverageColorNV; pfn_glBlitFramebufferNV fp_glBlitFramebufferNV; +pfn_glCoverageModulationTableNV fp_glCoverageModulationTableNV; +pfn_glGetCoverageModulationTableNV fp_glGetCoverageModulationTableNV; +pfn_glCoverageModulationNV fp_glCoverageModulationNV; pfn_glRenderbufferStorageMultisampleNV fp_glRenderbufferStorageMultisampleNV; pfn_glRenderbufferStorageMultisampleCoverageNV fp_glRenderbufferStorageMultisampleCoverageNV; pfn_glProgramVertexLimitNV fp_glProgramVertexLimitNV; -pfn_glFramebufferTextureEXT fp_glFramebufferTextureEXT; -pfn_glFramebufferTextureLayerEXT fp_glFramebufferTextureLayerEXT; pfn_glFramebufferTextureFaceEXT fp_glFramebufferTextureFaceEXT; pfn_glProgramLocalParameterI4iNV fp_glProgramLocalParameterI4iNV; pfn_glProgramLocalParameterI4ivNV fp_glProgramLocalParameterI4ivNV; @@ -2235,39 +1856,6 @@ pfn_glGetProgramEnvParameterIivNV fp_glGetProgramEnvParameterIivNV; pfn_glGetProgramEnvParameterIuivNV fp_glGetProgramEnvParameterIuivNV; pfn_glProgramSubroutineParametersuivNV fp_glProgramSubroutineParametersuivNV; pfn_glGetProgramSubroutineParameteruivNV fp_glGetProgramSubroutineParameteruivNV; -pfn_glUniform1i64NV fp_glUniform1i64NV; -pfn_glUniform2i64NV fp_glUniform2i64NV; -pfn_glUniform3i64NV fp_glUniform3i64NV; -pfn_glUniform4i64NV fp_glUniform4i64NV; -pfn_glUniform1i64vNV fp_glUniform1i64vNV; -pfn_glUniform2i64vNV fp_glUniform2i64vNV; -pfn_glUniform3i64vNV fp_glUniform3i64vNV; -pfn_glUniform4i64vNV fp_glUniform4i64vNV; -pfn_glUniform1ui64NV fp_glUniform1ui64NV; -pfn_glUniform2ui64NV fp_glUniform2ui64NV; -pfn_glUniform3ui64NV fp_glUniform3ui64NV; -pfn_glUniform4ui64NV fp_glUniform4ui64NV; -pfn_glUniform1ui64vNV fp_glUniform1ui64vNV; -pfn_glUniform2ui64vNV fp_glUniform2ui64vNV; -pfn_glUniform3ui64vNV fp_glUniform3ui64vNV; -pfn_glUniform4ui64vNV fp_glUniform4ui64vNV; -pfn_glGetUniformi64vNV fp_glGetUniformi64vNV; -pfn_glProgramUniform1i64NV fp_glProgramUniform1i64NV; -pfn_glProgramUniform2i64NV fp_glProgramUniform2i64NV; -pfn_glProgramUniform3i64NV fp_glProgramUniform3i64NV; -pfn_glProgramUniform4i64NV fp_glProgramUniform4i64NV; -pfn_glProgramUniform1i64vNV fp_glProgramUniform1i64vNV; -pfn_glProgramUniform2i64vNV fp_glProgramUniform2i64vNV; -pfn_glProgramUniform3i64vNV fp_glProgramUniform3i64vNV; -pfn_glProgramUniform4i64vNV fp_glProgramUniform4i64vNV; -pfn_glProgramUniform1ui64NV fp_glProgramUniform1ui64NV; -pfn_glProgramUniform2ui64NV fp_glProgramUniform2ui64NV; -pfn_glProgramUniform3ui64NV fp_glProgramUniform3ui64NV; -pfn_glProgramUniform4ui64NV fp_glProgramUniform4ui64NV; -pfn_glProgramUniform1ui64vNV fp_glProgramUniform1ui64vNV; -pfn_glProgramUniform2ui64vNV fp_glProgramUniform2ui64vNV; -pfn_glProgramUniform3ui64vNV fp_glProgramUniform3ui64vNV; -pfn_glProgramUniform4ui64vNV fp_glProgramUniform4ui64vNV; pfn_glVertex2hNV fp_glVertex2hNV; pfn_glVertex2hvNV fp_glVertex2hvNV; pfn_glVertex3hNV fp_glVertex3hNV; @@ -2315,6 +1903,7 @@ pfn_glVertexAttribs2hvNV fp_glVertexAttribs2hvNV; pfn_glVertexAttribs3hvNV fp_glVertexAttribs3hvNV; pfn_glVertexAttribs4hvNV fp_glVertexAttribs4hvNV; pfn_glVertexAttribDivisorNV fp_glVertexAttribDivisorNV; +pfn_glGetInternalformatSampleivNV fp_glGetInternalformatSampleivNV; pfn_glUniformMatrix2x3fvNV fp_glUniformMatrix2x3fvNV; pfn_glUniformMatrix3x2fvNV fp_glUniformMatrix3x2fvNV; pfn_glUniformMatrix2x4fvNV fp_glUniformMatrix2x4fvNV; @@ -2357,9 +1946,6 @@ pfn_glStencilStrokePathNV fp_glStencilStrokePathNV; pfn_glStencilFillPathInstancedNV fp_glStencilFillPathInstancedNV; pfn_glStencilStrokePathInstancedNV fp_glStencilStrokePathInstancedNV; pfn_glPathCoverDepthFuncNV fp_glPathCoverDepthFuncNV; -pfn_glPathColorGenNV fp_glPathColorGenNV; -pfn_glPathTexGenNV fp_glPathTexGenNV; -pfn_glPathFogGenNV fp_glPathFogGenNV; pfn_glCoverFillPathNV fp_glCoverFillPathNV; pfn_glCoverStrokePathNV fp_glCoverStrokePathNV; pfn_glCoverFillPathInstancedNV fp_glCoverFillPathInstancedNV; @@ -2372,18 +1958,32 @@ pfn_glGetPathDashArrayNV fp_glGetPathDashArrayNV; pfn_glGetPathMetricsNV fp_glGetPathMetricsNV; pfn_glGetPathMetricRangeNV fp_glGetPathMetricRangeNV; pfn_glGetPathSpacingNV fp_glGetPathSpacingNV; -pfn_glGetPathColorGenivNV fp_glGetPathColorGenivNV; -pfn_glGetPathColorGenfvNV fp_glGetPathColorGenfvNV; -pfn_glGetPathTexGenivNV fp_glGetPathTexGenivNV; -pfn_glGetPathTexGenfvNV fp_glGetPathTexGenfvNV; pfn_glIsPointInFillPathNV fp_glIsPointInFillPathNV; pfn_glIsPointInStrokePathNV fp_glIsPointInStrokePathNV; pfn_glGetPathLengthNV fp_glGetPathLengthNV; pfn_glPointAlongPathNV fp_glPointAlongPathNV; -pfn_glPixelDataRangeNV fp_glPixelDataRangeNV; -pfn_glFlushPixelDataRangeNV fp_glFlushPixelDataRangeNV; -pfn_glPointParameteriNV fp_glPointParameteriNV; -pfn_glPointParameterivNV fp_glPointParameterivNV; +pfn_glMatrixLoad3x2fNV fp_glMatrixLoad3x2fNV; +pfn_glMatrixLoad3x3fNV fp_glMatrixLoad3x3fNV; +pfn_glMatrixLoadTranspose3x3fNV fp_glMatrixLoadTranspose3x3fNV; +pfn_glMatrixMult3x2fNV fp_glMatrixMult3x2fNV; +pfn_glMatrixMult3x3fNV fp_glMatrixMult3x3fNV; +pfn_glMatrixMultTranspose3x3fNV fp_glMatrixMultTranspose3x3fNV; +pfn_glStencilThenCoverFillPathNV fp_glStencilThenCoverFillPathNV; +pfn_glStencilThenCoverStrokePathNV fp_glStencilThenCoverStrokePathNV; +pfn_glStencilThenCoverFillPathInstancedNV fp_glStencilThenCoverFillPathInstancedNV; +pfn_glStencilThenCoverStrokePathInstancedNV fp_glStencilThenCoverStrokePathInstancedNV; +pfn_glPathGlyphIndexRangeNV fp_glPathGlyphIndexRangeNV; +pfn_glPathGlyphIndexArrayNV fp_glPathGlyphIndexArrayNV; +pfn_glPathMemoryGlyphIndexArrayNV fp_glPathMemoryGlyphIndexArrayNV; +pfn_glProgramPathFragmentInputGenNV fp_glProgramPathFragmentInputGenNV; +pfn_glGetProgramResourcefvNV fp_glGetProgramResourcefvNV; +pfn_glPathColorGenNV fp_glPathColorGenNV; +pfn_glPathTexGenNV fp_glPathTexGenNV; +pfn_glPathFogGenNV fp_glPathFogGenNV; +pfn_glGetPathColorGenivNV fp_glGetPathColorGenivNV; +pfn_glGetPathColorGenfvNV fp_glGetPathColorGenfvNV; +pfn_glGetPathTexGenivNV fp_glGetPathTexGenivNV; +pfn_glGetPathTexGenfvNV fp_glGetPathTexGenfvNV; pfn_glPresentFrameKeyedNV fp_glPresentFrameKeyedNV; pfn_glPresentFrameDualFillNV fp_glPresentFrameDualFillNV; pfn_glGetVideoivNV fp_glGetVideoivNV; @@ -2393,21 +1993,9 @@ pfn_glGetVideoui64vNV fp_glGetVideoui64vNV; pfn_glPrimitiveRestartNV fp_glPrimitiveRestartNV; pfn_glPrimitiveRestartIndexNV fp_glPrimitiveRestartIndexNV; pfn_glReadBufferNV fp_glReadBufferNV; -pfn_glCombinerParameterfvNV fp_glCombinerParameterfvNV; -pfn_glCombinerParameterfNV fp_glCombinerParameterfNV; -pfn_glCombinerParameterivNV fp_glCombinerParameterivNV; -pfn_glCombinerParameteriNV fp_glCombinerParameteriNV; -pfn_glCombinerInputNV fp_glCombinerInputNV; -pfn_glCombinerOutputNV fp_glCombinerOutputNV; -pfn_glFinalCombinerInputNV fp_glFinalCombinerInputNV; -pfn_glGetCombinerInputParameterfvNV fp_glGetCombinerInputParameterfvNV; -pfn_glGetCombinerInputParameterivNV fp_glGetCombinerInputParameterivNV; -pfn_glGetCombinerOutputParameterfvNV fp_glGetCombinerOutputParameterfvNV; -pfn_glGetCombinerOutputParameterivNV fp_glGetCombinerOutputParameterivNV; -pfn_glGetFinalCombinerInputParameterfvNV fp_glGetFinalCombinerInputParameterfvNV; -pfn_glGetFinalCombinerInputParameterivNV fp_glGetFinalCombinerInputParameterivNV; -pfn_glCombinerStageParameterfvNV fp_glCombinerStageParameterfvNV; -pfn_glGetCombinerStageParameterfvNV fp_glGetCombinerStageParameterfvNV; +pfn_glFramebufferSampleLocationsfvNV fp_glFramebufferSampleLocationsfvNV; +pfn_glNamedFramebufferSampleLocationsfvNV fp_glNamedFramebufferSampleLocationsfvNV; +pfn_glResolveDepthValuesNV fp_glResolveDepthValuesNV; pfn_glMakeBufferResidentNV fp_glMakeBufferResidentNV; pfn_glMakeBufferNonResidentNV fp_glMakeBufferNonResidentNV; pfn_glIsBufferResidentNV fp_glIsBufferResidentNV; @@ -2419,7 +2007,6 @@ pfn_glGetNamedBufferParameterui64vNV fp_glGetNamedBufferParameterui64vNV; pfn_glGetIntegerui64vNV fp_glGetIntegerui64vNV; pfn_glUniformui64NV fp_glUniformui64NV; pfn_glUniformui64vNV fp_glUniformui64vNV; -pfn_glGetUniformui64vNV fp_glGetUniformui64vNV; pfn_glProgramUniformui64NV fp_glProgramUniformui64NV; pfn_glProgramUniformui64vNV fp_glProgramUniformui64vNV; pfn_glTextureBarrierNV fp_glTextureBarrierNV; @@ -2458,8 +2045,6 @@ pfn_glVDPAUGetSurfaceivNV fp_glVDPAUGetSurfaceivNV; pfn_glVDPAUSurfaceAccessNV fp_glVDPAUSurfaceAccessNV; pfn_glVDPAUMapSurfacesNV fp_glVDPAUMapSurfacesNV; pfn_glVDPAUUnmapSurfacesNV fp_glVDPAUUnmapSurfacesNV; -pfn_glFlushVertexArrayRangeNV fp_glFlushVertexArrayRangeNV; -pfn_glVertexArrayRangeNV fp_glVertexArrayRangeNV; pfn_glVertexAttribL1i64NV fp_glVertexAttribL1i64NV; pfn_glVertexAttribL2i64NV fp_glVertexAttribL2i64NV; pfn_glVertexAttribL3i64NV fp_glVertexAttribL3i64NV; @@ -2491,70 +2076,6 @@ pfn_glFogCoordFormatNV fp_glFogCoordFormatNV; pfn_glVertexAttribFormatNV fp_glVertexAttribFormatNV; pfn_glVertexAttribIFormatNV fp_glVertexAttribIFormatNV; pfn_glGetIntegerui64i_vNV fp_glGetIntegerui64i_vNV; -pfn_glAreProgramsResidentNV fp_glAreProgramsResidentNV; -pfn_glBindProgramNV fp_glBindProgramNV; -pfn_glDeleteProgramsNV fp_glDeleteProgramsNV; -pfn_glExecuteProgramNV fp_glExecuteProgramNV; -pfn_glGenProgramsNV fp_glGenProgramsNV; -pfn_glGetProgramParameterdvNV fp_glGetProgramParameterdvNV; -pfn_glGetProgramParameterfvNV fp_glGetProgramParameterfvNV; -pfn_glGetProgramivNV fp_glGetProgramivNV; -pfn_glGetProgramStringNV fp_glGetProgramStringNV; -pfn_glGetTrackMatrixivNV fp_glGetTrackMatrixivNV; -pfn_glGetVertexAttribdvNV fp_glGetVertexAttribdvNV; -pfn_glGetVertexAttribfvNV fp_glGetVertexAttribfvNV; -pfn_glGetVertexAttribivNV fp_glGetVertexAttribivNV; -pfn_glGetVertexAttribPointervNV fp_glGetVertexAttribPointervNV; -pfn_glIsProgramNV fp_glIsProgramNV; -pfn_glLoadProgramNV fp_glLoadProgramNV; -pfn_glProgramParameter4dNV fp_glProgramParameter4dNV; -pfn_glProgramParameter4dvNV fp_glProgramParameter4dvNV; -pfn_glProgramParameter4fNV fp_glProgramParameter4fNV; -pfn_glProgramParameter4fvNV fp_glProgramParameter4fvNV; -pfn_glProgramParameters4dvNV fp_glProgramParameters4dvNV; -pfn_glProgramParameters4fvNV fp_glProgramParameters4fvNV; -pfn_glRequestResidentProgramsNV fp_glRequestResidentProgramsNV; -pfn_glTrackMatrixNV fp_glTrackMatrixNV; -pfn_glVertexAttribPointerNV fp_glVertexAttribPointerNV; -pfn_glVertexAttrib1dNV fp_glVertexAttrib1dNV; -pfn_glVertexAttrib1dvNV fp_glVertexAttrib1dvNV; -pfn_glVertexAttrib1fNV fp_glVertexAttrib1fNV; -pfn_glVertexAttrib1fvNV fp_glVertexAttrib1fvNV; -pfn_glVertexAttrib1sNV fp_glVertexAttrib1sNV; -pfn_glVertexAttrib1svNV fp_glVertexAttrib1svNV; -pfn_glVertexAttrib2dNV fp_glVertexAttrib2dNV; -pfn_glVertexAttrib2dvNV fp_glVertexAttrib2dvNV; -pfn_glVertexAttrib2fNV fp_glVertexAttrib2fNV; -pfn_glVertexAttrib2fvNV fp_glVertexAttrib2fvNV; -pfn_glVertexAttrib2sNV fp_glVertexAttrib2sNV; -pfn_glVertexAttrib2svNV fp_glVertexAttrib2svNV; -pfn_glVertexAttrib3dNV fp_glVertexAttrib3dNV; -pfn_glVertexAttrib3dvNV fp_glVertexAttrib3dvNV; -pfn_glVertexAttrib3fNV fp_glVertexAttrib3fNV; -pfn_glVertexAttrib3fvNV fp_glVertexAttrib3fvNV; -pfn_glVertexAttrib3sNV fp_glVertexAttrib3sNV; -pfn_glVertexAttrib3svNV fp_glVertexAttrib3svNV; -pfn_glVertexAttrib4dNV fp_glVertexAttrib4dNV; -pfn_glVertexAttrib4dvNV fp_glVertexAttrib4dvNV; -pfn_glVertexAttrib4fNV fp_glVertexAttrib4fNV; -pfn_glVertexAttrib4fvNV fp_glVertexAttrib4fvNV; -pfn_glVertexAttrib4sNV fp_glVertexAttrib4sNV; -pfn_glVertexAttrib4svNV fp_glVertexAttrib4svNV; -pfn_glVertexAttrib4ubNV fp_glVertexAttrib4ubNV; -pfn_glVertexAttrib4ubvNV fp_glVertexAttrib4ubvNV; -pfn_glVertexAttribs1dvNV fp_glVertexAttribs1dvNV; -pfn_glVertexAttribs1fvNV fp_glVertexAttribs1fvNV; -pfn_glVertexAttribs1svNV fp_glVertexAttribs1svNV; -pfn_glVertexAttribs2dvNV fp_glVertexAttribs2dvNV; -pfn_glVertexAttribs2fvNV fp_glVertexAttribs2fvNV; -pfn_glVertexAttribs2svNV fp_glVertexAttribs2svNV; -pfn_glVertexAttribs3dvNV fp_glVertexAttribs3dvNV; -pfn_glVertexAttribs3fvNV fp_glVertexAttribs3fvNV; -pfn_glVertexAttribs3svNV fp_glVertexAttribs3svNV; -pfn_glVertexAttribs4dvNV fp_glVertexAttribs4dvNV; -pfn_glVertexAttribs4fvNV fp_glVertexAttribs4fvNV; -pfn_glVertexAttribs4svNV fp_glVertexAttribs4svNV; -pfn_glVertexAttribs4ubvNV fp_glVertexAttribs4ubvNV; pfn_glVertexAttribI1iEXT fp_glVertexAttribI1iEXT; pfn_glVertexAttribI2iEXT fp_glVertexAttribI2iEXT; pfn_glVertexAttribI3iEXT fp_glVertexAttribI3iEXT; @@ -2590,9 +2111,20 @@ pfn_glVideoCaptureNV fp_glVideoCaptureNV; pfn_glVideoCaptureStreamParameterivNV fp_glVideoCaptureStreamParameterivNV; pfn_glVideoCaptureStreamParameterfvNV fp_glVideoCaptureStreamParameterfvNV; pfn_glVideoCaptureStreamParameterdvNV fp_glVideoCaptureStreamParameterdvNV; +pfn_glViewportArrayvNV fp_glViewportArrayvNV; +pfn_glViewportIndexedfNV fp_glViewportIndexedfNV; +pfn_glViewportIndexedfvNV fp_glViewportIndexedfvNV; +pfn_glScissorArrayvNV fp_glScissorArrayvNV; +pfn_glScissorIndexedNV fp_glScissorIndexedNV; +pfn_glScissorIndexedvNV fp_glScissorIndexedvNV; +pfn_glDepthRangeArrayfvNV fp_glDepthRangeArrayfvNV; +pfn_glDepthRangeIndexedfNV fp_glDepthRangeIndexedfNV; +pfn_glGetFloati_vNV fp_glGetFloati_vNV; +pfn_glEnableiNV fp_glEnableiNV; +pfn_glDisableiNV fp_glDisableiNV; +pfn_glIsEnablediNV fp_glIsEnablediNV; pfn_glBeginConditionalRenderNVX fp_glBeginConditionalRenderNVX; pfn_glEndConditionalRenderNVX fp_glEndConditionalRenderNVX; -pfn_glHintPGI fp_glHintPGI; pfn_glAlphaFuncQCOM fp_glAlphaFuncQCOM; pfn_glGetDriverControlsQCOM fp_glGetDriverControlsQCOM; pfn_glGetDriverControlStringQCOM fp_glGetDriverControlStringQCOM; @@ -3622,6 +3154,133 @@ static void load_GL_VERSION_4_4(LOADER load) { fp_glBindVertexBuffers = (pfn_glBindVertexBuffers)load("glBindVertexBuffers"); } +GLboolean GLAD_VERSION_4_5 = GL_FALSE; +static void load_GL_VERSION_4_5(LOADER load) { + if(!GLAD_VERSION_4_5) return; + fp_glClipControl = (pfn_glClipControl)load("glClipControl"); + fp_glCreateTransformFeedbacks = (pfn_glCreateTransformFeedbacks)load("glCreateTransformFeedbacks"); + fp_glTransformFeedbackBufferBase = (pfn_glTransformFeedbackBufferBase)load("glTransformFeedbackBufferBase"); + fp_glTransformFeedbackBufferRange = (pfn_glTransformFeedbackBufferRange)load("glTransformFeedbackBufferRange"); + fp_glGetTransformFeedbackiv = (pfn_glGetTransformFeedbackiv)load("glGetTransformFeedbackiv"); + fp_glGetTransformFeedbacki_v = (pfn_glGetTransformFeedbacki_v)load("glGetTransformFeedbacki_v"); + fp_glGetTransformFeedbacki64_v = (pfn_glGetTransformFeedbacki64_v)load("glGetTransformFeedbacki64_v"); + fp_glCreateBuffers = (pfn_glCreateBuffers)load("glCreateBuffers"); + fp_glNamedBufferStorage = (pfn_glNamedBufferStorage)load("glNamedBufferStorage"); + fp_glNamedBufferData = (pfn_glNamedBufferData)load("glNamedBufferData"); + fp_glNamedBufferSubData = (pfn_glNamedBufferSubData)load("glNamedBufferSubData"); + fp_glCopyNamedBufferSubData = (pfn_glCopyNamedBufferSubData)load("glCopyNamedBufferSubData"); + fp_glClearNamedBufferData = (pfn_glClearNamedBufferData)load("glClearNamedBufferData"); + fp_glClearNamedBufferSubData = (pfn_glClearNamedBufferSubData)load("glClearNamedBufferSubData"); + fp_glMapNamedBuffer = (pfn_glMapNamedBuffer)load("glMapNamedBuffer"); + fp_glMapNamedBufferRange = (pfn_glMapNamedBufferRange)load("glMapNamedBufferRange"); + fp_glUnmapNamedBuffer = (pfn_glUnmapNamedBuffer)load("glUnmapNamedBuffer"); + fp_glFlushMappedNamedBufferRange = (pfn_glFlushMappedNamedBufferRange)load("glFlushMappedNamedBufferRange"); + fp_glGetNamedBufferParameteriv = (pfn_glGetNamedBufferParameteriv)load("glGetNamedBufferParameteriv"); + fp_glGetNamedBufferParameteri64v = (pfn_glGetNamedBufferParameteri64v)load("glGetNamedBufferParameteri64v"); + fp_glGetNamedBufferPointerv = (pfn_glGetNamedBufferPointerv)load("glGetNamedBufferPointerv"); + fp_glGetNamedBufferSubData = (pfn_glGetNamedBufferSubData)load("glGetNamedBufferSubData"); + fp_glCreateFramebuffers = (pfn_glCreateFramebuffers)load("glCreateFramebuffers"); + fp_glNamedFramebufferRenderbuffer = (pfn_glNamedFramebufferRenderbuffer)load("glNamedFramebufferRenderbuffer"); + fp_glNamedFramebufferParameteri = (pfn_glNamedFramebufferParameteri)load("glNamedFramebufferParameteri"); + fp_glNamedFramebufferTexture = (pfn_glNamedFramebufferTexture)load("glNamedFramebufferTexture"); + fp_glNamedFramebufferTextureLayer = (pfn_glNamedFramebufferTextureLayer)load("glNamedFramebufferTextureLayer"); + fp_glNamedFramebufferDrawBuffer = (pfn_glNamedFramebufferDrawBuffer)load("glNamedFramebufferDrawBuffer"); + fp_glNamedFramebufferDrawBuffers = (pfn_glNamedFramebufferDrawBuffers)load("glNamedFramebufferDrawBuffers"); + fp_glNamedFramebufferReadBuffer = (pfn_glNamedFramebufferReadBuffer)load("glNamedFramebufferReadBuffer"); + fp_glInvalidateNamedFramebufferData = (pfn_glInvalidateNamedFramebufferData)load("glInvalidateNamedFramebufferData"); + fp_glInvalidateNamedFramebufferSubData = (pfn_glInvalidateNamedFramebufferSubData)load("glInvalidateNamedFramebufferSubData"); + fp_glClearNamedFramebufferiv = (pfn_glClearNamedFramebufferiv)load("glClearNamedFramebufferiv"); + fp_glClearNamedFramebufferuiv = (pfn_glClearNamedFramebufferuiv)load("glClearNamedFramebufferuiv"); + fp_glClearNamedFramebufferfv = (pfn_glClearNamedFramebufferfv)load("glClearNamedFramebufferfv"); + fp_glClearNamedFramebufferfi = (pfn_glClearNamedFramebufferfi)load("glClearNamedFramebufferfi"); + fp_glBlitNamedFramebuffer = (pfn_glBlitNamedFramebuffer)load("glBlitNamedFramebuffer"); + fp_glCheckNamedFramebufferStatus = (pfn_glCheckNamedFramebufferStatus)load("glCheckNamedFramebufferStatus"); + fp_glGetNamedFramebufferParameteriv = (pfn_glGetNamedFramebufferParameteriv)load("glGetNamedFramebufferParameteriv"); + fp_glGetNamedFramebufferAttachmentParameteriv = (pfn_glGetNamedFramebufferAttachmentParameteriv)load("glGetNamedFramebufferAttachmentParameteriv"); + fp_glCreateRenderbuffers = (pfn_glCreateRenderbuffers)load("glCreateRenderbuffers"); + fp_glNamedRenderbufferStorage = (pfn_glNamedRenderbufferStorage)load("glNamedRenderbufferStorage"); + fp_glNamedRenderbufferStorageMultisample = (pfn_glNamedRenderbufferStorageMultisample)load("glNamedRenderbufferStorageMultisample"); + fp_glGetNamedRenderbufferParameteriv = (pfn_glGetNamedRenderbufferParameteriv)load("glGetNamedRenderbufferParameteriv"); + fp_glCreateTextures = (pfn_glCreateTextures)load("glCreateTextures"); + fp_glTextureBuffer = (pfn_glTextureBuffer)load("glTextureBuffer"); + fp_glTextureBufferRange = (pfn_glTextureBufferRange)load("glTextureBufferRange"); + fp_glTextureStorage1D = (pfn_glTextureStorage1D)load("glTextureStorage1D"); + fp_glTextureStorage2D = (pfn_glTextureStorage2D)load("glTextureStorage2D"); + fp_glTextureStorage3D = (pfn_glTextureStorage3D)load("glTextureStorage3D"); + fp_glTextureStorage2DMultisample = (pfn_glTextureStorage2DMultisample)load("glTextureStorage2DMultisample"); + fp_glTextureStorage3DMultisample = (pfn_glTextureStorage3DMultisample)load("glTextureStorage3DMultisample"); + fp_glTextureSubImage1D = (pfn_glTextureSubImage1D)load("glTextureSubImage1D"); + fp_glTextureSubImage2D = (pfn_glTextureSubImage2D)load("glTextureSubImage2D"); + fp_glTextureSubImage3D = (pfn_glTextureSubImage3D)load("glTextureSubImage3D"); + fp_glCompressedTextureSubImage1D = (pfn_glCompressedTextureSubImage1D)load("glCompressedTextureSubImage1D"); + fp_glCompressedTextureSubImage2D = (pfn_glCompressedTextureSubImage2D)load("glCompressedTextureSubImage2D"); + fp_glCompressedTextureSubImage3D = (pfn_glCompressedTextureSubImage3D)load("glCompressedTextureSubImage3D"); + fp_glCopyTextureSubImage1D = (pfn_glCopyTextureSubImage1D)load("glCopyTextureSubImage1D"); + fp_glCopyTextureSubImage2D = (pfn_glCopyTextureSubImage2D)load("glCopyTextureSubImage2D"); + fp_glCopyTextureSubImage3D = (pfn_glCopyTextureSubImage3D)load("glCopyTextureSubImage3D"); + fp_glTextureParameterf = (pfn_glTextureParameterf)load("glTextureParameterf"); + fp_glTextureParameterfv = (pfn_glTextureParameterfv)load("glTextureParameterfv"); + fp_glTextureParameteri = (pfn_glTextureParameteri)load("glTextureParameteri"); + fp_glTextureParameterIiv = (pfn_glTextureParameterIiv)load("glTextureParameterIiv"); + fp_glTextureParameterIuiv = (pfn_glTextureParameterIuiv)load("glTextureParameterIuiv"); + fp_glTextureParameteriv = (pfn_glTextureParameteriv)load("glTextureParameteriv"); + fp_glGenerateTextureMipmap = (pfn_glGenerateTextureMipmap)load("glGenerateTextureMipmap"); + fp_glBindTextureUnit = (pfn_glBindTextureUnit)load("glBindTextureUnit"); + fp_glGetTextureImage = (pfn_glGetTextureImage)load("glGetTextureImage"); + fp_glGetCompressedTextureImage = (pfn_glGetCompressedTextureImage)load("glGetCompressedTextureImage"); + fp_glGetTextureLevelParameterfv = (pfn_glGetTextureLevelParameterfv)load("glGetTextureLevelParameterfv"); + fp_glGetTextureLevelParameteriv = (pfn_glGetTextureLevelParameteriv)load("glGetTextureLevelParameteriv"); + fp_glGetTextureParameterfv = (pfn_glGetTextureParameterfv)load("glGetTextureParameterfv"); + fp_glGetTextureParameterIiv = (pfn_glGetTextureParameterIiv)load("glGetTextureParameterIiv"); + fp_glGetTextureParameterIuiv = (pfn_glGetTextureParameterIuiv)load("glGetTextureParameterIuiv"); + fp_glGetTextureParameteriv = (pfn_glGetTextureParameteriv)load("glGetTextureParameteriv"); + fp_glCreateVertexArrays = (pfn_glCreateVertexArrays)load("glCreateVertexArrays"); + fp_glDisableVertexArrayAttrib = (pfn_glDisableVertexArrayAttrib)load("glDisableVertexArrayAttrib"); + fp_glEnableVertexArrayAttrib = (pfn_glEnableVertexArrayAttrib)load("glEnableVertexArrayAttrib"); + fp_glVertexArrayElementBuffer = (pfn_glVertexArrayElementBuffer)load("glVertexArrayElementBuffer"); + fp_glVertexArrayVertexBuffer = (pfn_glVertexArrayVertexBuffer)load("glVertexArrayVertexBuffer"); + fp_glVertexArrayVertexBuffers = (pfn_glVertexArrayVertexBuffers)load("glVertexArrayVertexBuffers"); + fp_glVertexArrayAttribBinding = (pfn_glVertexArrayAttribBinding)load("glVertexArrayAttribBinding"); + fp_glVertexArrayAttribFormat = (pfn_glVertexArrayAttribFormat)load("glVertexArrayAttribFormat"); + fp_glVertexArrayAttribIFormat = (pfn_glVertexArrayAttribIFormat)load("glVertexArrayAttribIFormat"); + fp_glVertexArrayAttribLFormat = (pfn_glVertexArrayAttribLFormat)load("glVertexArrayAttribLFormat"); + fp_glVertexArrayBindingDivisor = (pfn_glVertexArrayBindingDivisor)load("glVertexArrayBindingDivisor"); + fp_glGetVertexArrayiv = (pfn_glGetVertexArrayiv)load("glGetVertexArrayiv"); + fp_glGetVertexArrayIndexediv = (pfn_glGetVertexArrayIndexediv)load("glGetVertexArrayIndexediv"); + fp_glGetVertexArrayIndexed64iv = (pfn_glGetVertexArrayIndexed64iv)load("glGetVertexArrayIndexed64iv"); + fp_glCreateSamplers = (pfn_glCreateSamplers)load("glCreateSamplers"); + fp_glCreateProgramPipelines = (pfn_glCreateProgramPipelines)load("glCreateProgramPipelines"); + fp_glCreateQueries = (pfn_glCreateQueries)load("glCreateQueries"); + fp_glGetQueryBufferObjecti64v = (pfn_glGetQueryBufferObjecti64v)load("glGetQueryBufferObjecti64v"); + fp_glGetQueryBufferObjectiv = (pfn_glGetQueryBufferObjectiv)load("glGetQueryBufferObjectiv"); + fp_glGetQueryBufferObjectui64v = (pfn_glGetQueryBufferObjectui64v)load("glGetQueryBufferObjectui64v"); + fp_glGetQueryBufferObjectuiv = (pfn_glGetQueryBufferObjectuiv)load("glGetQueryBufferObjectuiv"); + fp_glMemoryBarrierByRegion = (pfn_glMemoryBarrierByRegion)load("glMemoryBarrierByRegion"); + fp_glGetTextureSubImage = (pfn_glGetTextureSubImage)load("glGetTextureSubImage"); + fp_glGetCompressedTextureSubImage = (pfn_glGetCompressedTextureSubImage)load("glGetCompressedTextureSubImage"); + fp_glGetGraphicsResetStatus = (pfn_glGetGraphicsResetStatus)load("glGetGraphicsResetStatus"); + fp_glGetnCompressedTexImage = (pfn_glGetnCompressedTexImage)load("glGetnCompressedTexImage"); + fp_glGetnTexImage = (pfn_glGetnTexImage)load("glGetnTexImage"); + fp_glGetnUniformdv = (pfn_glGetnUniformdv)load("glGetnUniformdv"); + fp_glGetnUniformfv = (pfn_glGetnUniformfv)load("glGetnUniformfv"); + fp_glGetnUniformiv = (pfn_glGetnUniformiv)load("glGetnUniformiv"); + fp_glGetnUniformuiv = (pfn_glGetnUniformuiv)load("glGetnUniformuiv"); + fp_glReadnPixels = (pfn_glReadnPixels)load("glReadnPixels"); + fp_glGetnMapdv = (pfn_glGetnMapdv)load("glGetnMapdv"); + fp_glGetnMapfv = (pfn_glGetnMapfv)load("glGetnMapfv"); + fp_glGetnMapiv = (pfn_glGetnMapiv)load("glGetnMapiv"); + fp_glGetnPixelMapfv = (pfn_glGetnPixelMapfv)load("glGetnPixelMapfv"); + fp_glGetnPixelMapuiv = (pfn_glGetnPixelMapuiv)load("glGetnPixelMapuiv"); + fp_glGetnPixelMapusv = (pfn_glGetnPixelMapusv)load("glGetnPixelMapusv"); + fp_glGetnPolygonStipple = (pfn_glGetnPolygonStipple)load("glGetnPolygonStipple"); + fp_glGetnColorTable = (pfn_glGetnColorTable)load("glGetnColorTable"); + fp_glGetnConvolutionFilter = (pfn_glGetnConvolutionFilter)load("glGetnConvolutionFilter"); + fp_glGetnSeparableFilter = (pfn_glGetnSeparableFilter)load("glGetnSeparableFilter"); + fp_glGetnHistogram = (pfn_glGetnHistogram)load("glGetnHistogram"); + fp_glGetnMinmax = (pfn_glGetnMinmax)load("glGetnMinmax"); + fp_glTextureBarrier = (pfn_glTextureBarrier)load("glTextureBarrier"); +} + GLboolean GLAD_ES_VERSION_2_0 = GL_FALSE; static void load_GL_ES_VERSION_2_0(LOADER load) { if(!GLAD_ES_VERSION_2_0) return; @@ -3878,6 +3537,87 @@ static void load_GL_ES_VERSION_3_0(LOADER load) { fp_glGetInternalformativ = (pfn_glGetInternalformativ)load("glGetInternalformativ"); } +GLboolean GLAD_ES_VERSION_3_1 = GL_FALSE; +static void load_GL_ES_VERSION_3_1(LOADER load) { + if(!GLAD_ES_VERSION_3_1) return; + fp_glDispatchCompute = (pfn_glDispatchCompute)load("glDispatchCompute"); + fp_glDispatchComputeIndirect = (pfn_glDispatchComputeIndirect)load("glDispatchComputeIndirect"); + fp_glDrawArraysIndirect = (pfn_glDrawArraysIndirect)load("glDrawArraysIndirect"); + fp_glDrawElementsIndirect = (pfn_glDrawElementsIndirect)load("glDrawElementsIndirect"); + fp_glFramebufferParameteri = (pfn_glFramebufferParameteri)load("glFramebufferParameteri"); + fp_glGetFramebufferParameteriv = (pfn_glGetFramebufferParameteriv)load("glGetFramebufferParameteriv"); + fp_glGetProgramInterfaceiv = (pfn_glGetProgramInterfaceiv)load("glGetProgramInterfaceiv"); + fp_glGetProgramResourceIndex = (pfn_glGetProgramResourceIndex)load("glGetProgramResourceIndex"); + fp_glGetProgramResourceName = (pfn_glGetProgramResourceName)load("glGetProgramResourceName"); + fp_glGetProgramResourceiv = (pfn_glGetProgramResourceiv)load("glGetProgramResourceiv"); + fp_glGetProgramResourceLocation = (pfn_glGetProgramResourceLocation)load("glGetProgramResourceLocation"); + fp_glUseProgramStages = (pfn_glUseProgramStages)load("glUseProgramStages"); + fp_glActiveShaderProgram = (pfn_glActiveShaderProgram)load("glActiveShaderProgram"); + fp_glCreateShaderProgramv = (pfn_glCreateShaderProgramv)load("glCreateShaderProgramv"); + fp_glBindProgramPipeline = (pfn_glBindProgramPipeline)load("glBindProgramPipeline"); + fp_glDeleteProgramPipelines = (pfn_glDeleteProgramPipelines)load("glDeleteProgramPipelines"); + fp_glGenProgramPipelines = (pfn_glGenProgramPipelines)load("glGenProgramPipelines"); + fp_glIsProgramPipeline = (pfn_glIsProgramPipeline)load("glIsProgramPipeline"); + fp_glGetProgramPipelineiv = (pfn_glGetProgramPipelineiv)load("glGetProgramPipelineiv"); + fp_glProgramUniform1i = (pfn_glProgramUniform1i)load("glProgramUniform1i"); + fp_glProgramUniform2i = (pfn_glProgramUniform2i)load("glProgramUniform2i"); + fp_glProgramUniform3i = (pfn_glProgramUniform3i)load("glProgramUniform3i"); + fp_glProgramUniform4i = (pfn_glProgramUniform4i)load("glProgramUniform4i"); + fp_glProgramUniform1ui = (pfn_glProgramUniform1ui)load("glProgramUniform1ui"); + fp_glProgramUniform2ui = (pfn_glProgramUniform2ui)load("glProgramUniform2ui"); + fp_glProgramUniform3ui = (pfn_glProgramUniform3ui)load("glProgramUniform3ui"); + fp_glProgramUniform4ui = (pfn_glProgramUniform4ui)load("glProgramUniform4ui"); + fp_glProgramUniform1f = (pfn_glProgramUniform1f)load("glProgramUniform1f"); + fp_glProgramUniform2f = (pfn_glProgramUniform2f)load("glProgramUniform2f"); + fp_glProgramUniform3f = (pfn_glProgramUniform3f)load("glProgramUniform3f"); + fp_glProgramUniform4f = (pfn_glProgramUniform4f)load("glProgramUniform4f"); + fp_glProgramUniform1iv = (pfn_glProgramUniform1iv)load("glProgramUniform1iv"); + fp_glProgramUniform2iv = (pfn_glProgramUniform2iv)load("glProgramUniform2iv"); + fp_glProgramUniform3iv = (pfn_glProgramUniform3iv)load("glProgramUniform3iv"); + fp_glProgramUniform4iv = (pfn_glProgramUniform4iv)load("glProgramUniform4iv"); + fp_glProgramUniform1uiv = (pfn_glProgramUniform1uiv)load("glProgramUniform1uiv"); + fp_glProgramUniform2uiv = (pfn_glProgramUniform2uiv)load("glProgramUniform2uiv"); + fp_glProgramUniform3uiv = (pfn_glProgramUniform3uiv)load("glProgramUniform3uiv"); + fp_glProgramUniform4uiv = (pfn_glProgramUniform4uiv)load("glProgramUniform4uiv"); + fp_glProgramUniform1fv = (pfn_glProgramUniform1fv)load("glProgramUniform1fv"); + fp_glProgramUniform2fv = (pfn_glProgramUniform2fv)load("glProgramUniform2fv"); + fp_glProgramUniform3fv = (pfn_glProgramUniform3fv)load("glProgramUniform3fv"); + fp_glProgramUniform4fv = (pfn_glProgramUniform4fv)load("glProgramUniform4fv"); + fp_glProgramUniformMatrix2fv = (pfn_glProgramUniformMatrix2fv)load("glProgramUniformMatrix2fv"); + fp_glProgramUniformMatrix3fv = (pfn_glProgramUniformMatrix3fv)load("glProgramUniformMatrix3fv"); + fp_glProgramUniformMatrix4fv = (pfn_glProgramUniformMatrix4fv)load("glProgramUniformMatrix4fv"); + fp_glProgramUniformMatrix2x3fv = (pfn_glProgramUniformMatrix2x3fv)load("glProgramUniformMatrix2x3fv"); + fp_glProgramUniformMatrix3x2fv = (pfn_glProgramUniformMatrix3x2fv)load("glProgramUniformMatrix3x2fv"); + fp_glProgramUniformMatrix2x4fv = (pfn_glProgramUniformMatrix2x4fv)load("glProgramUniformMatrix2x4fv"); + fp_glProgramUniformMatrix4x2fv = (pfn_glProgramUniformMatrix4x2fv)load("glProgramUniformMatrix4x2fv"); + fp_glProgramUniformMatrix3x4fv = (pfn_glProgramUniformMatrix3x4fv)load("glProgramUniformMatrix3x4fv"); + fp_glProgramUniformMatrix4x3fv = (pfn_glProgramUniformMatrix4x3fv)load("glProgramUniformMatrix4x3fv"); + fp_glValidateProgramPipeline = (pfn_glValidateProgramPipeline)load("glValidateProgramPipeline"); + fp_glGetProgramPipelineInfoLog = (pfn_glGetProgramPipelineInfoLog)load("glGetProgramPipelineInfoLog"); + fp_glBindImageTexture = (pfn_glBindImageTexture)load("glBindImageTexture"); + fp_glGetBooleani_v = (pfn_glGetBooleani_v)load("glGetBooleani_v"); + fp_glMemoryBarrier = (pfn_glMemoryBarrier)load("glMemoryBarrier"); + fp_glMemoryBarrierByRegion = (pfn_glMemoryBarrierByRegion)load("glMemoryBarrierByRegion"); + fp_glTexStorage2DMultisample = (pfn_glTexStorage2DMultisample)load("glTexStorage2DMultisample"); + fp_glGetMultisamplefv = (pfn_glGetMultisamplefv)load("glGetMultisamplefv"); + fp_glSampleMaski = (pfn_glSampleMaski)load("glSampleMaski"); + fp_glGetTexLevelParameteriv = (pfn_glGetTexLevelParameteriv)load("glGetTexLevelParameteriv"); + fp_glGetTexLevelParameterfv = (pfn_glGetTexLevelParameterfv)load("glGetTexLevelParameterfv"); + fp_glBindVertexBuffer = (pfn_glBindVertexBuffer)load("glBindVertexBuffer"); + fp_glVertexAttribFormat = (pfn_glVertexAttribFormat)load("glVertexAttribFormat"); + fp_glVertexAttribIFormat = (pfn_glVertexAttribIFormat)load("glVertexAttribIFormat"); + fp_glVertexAttribBinding = (pfn_glVertexAttribBinding)load("glVertexAttribBinding"); + fp_glVertexBindingDivisor = (pfn_glVertexBindingDivisor)load("glVertexBindingDivisor"); +} + +GLboolean GLAD_KHR_blend_equation_advanced = GL_FALSE; +static void load_GL_KHR_blend_equation_advanced(LOADER load) { + if(!GLAD_KHR_blend_equation_advanced) return; + fp_glBlendBarrierKHR = (pfn_glBlendBarrierKHR)load("glBlendBarrierKHR"); +} + +GLboolean GLAD_KHR_blend_equation_advanced_coherent = GL_FALSE; +GLboolean GLAD_KHR_context_flush_control = GL_FALSE; GLboolean GLAD_KHR_debug = GL_FALSE; static void load_GL_KHR_debug(LOADER load) { if(!GLAD_KHR_debug) return; @@ -3905,6 +3645,22 @@ static void load_GL_KHR_debug(LOADER load) { fp_glGetPointervKHR = (pfn_glGetPointervKHR)load("glGetPointervKHR"); } +GLboolean GLAD_KHR_robust_buffer_access_behavior = GL_FALSE; +GLboolean GLAD_KHR_robustness = GL_FALSE; +static void load_GL_KHR_robustness(LOADER load) { + if(!GLAD_KHR_robustness) return; + fp_glGetGraphicsResetStatus = (pfn_glGetGraphicsResetStatus)load("glGetGraphicsResetStatus"); + fp_glReadnPixels = (pfn_glReadnPixels)load("glReadnPixels"); + fp_glGetnUniformfv = (pfn_glGetnUniformfv)load("glGetnUniformfv"); + fp_glGetnUniformiv = (pfn_glGetnUniformiv)load("glGetnUniformiv"); + fp_glGetnUniformuiv = (pfn_glGetnUniformuiv)load("glGetnUniformuiv"); + fp_glGetGraphicsResetStatusKHR = (pfn_glGetGraphicsResetStatusKHR)load("glGetGraphicsResetStatusKHR"); + fp_glReadnPixelsKHR = (pfn_glReadnPixelsKHR)load("glReadnPixelsKHR"); + fp_glGetnUniformfvKHR = (pfn_glGetnUniformfvKHR)load("glGetnUniformfvKHR"); + fp_glGetnUniformivKHR = (pfn_glGetnUniformivKHR)load("glGetnUniformivKHR"); + fp_glGetnUniformuivKHR = (pfn_glGetnUniformuivKHR)load("glGetnUniformuivKHR"); +} + GLboolean GLAD_KHR_texture_compression_astc_hdr = GL_FALSE; GLboolean GLAD_KHR_texture_compression_astc_ldr = GL_FALSE; GLboolean GLAD_ARB_arrays_of_arrays = GL_FALSE; @@ -3970,6 +3726,12 @@ static void load_GL_ARB_clear_texture(LOADER load) { fp_glClearTexSubImage = (pfn_glClearTexSubImage)load("glClearTexSubImage"); } +GLboolean GLAD_ARB_clip_control = GL_FALSE; +static void load_GL_ARB_clip_control(LOADER load) { + if(!GLAD_ARB_clip_control) return; + fp_glClipControl = (pfn_glClipControl)load("glClipControl"); +} + GLboolean GLAD_ARB_color_buffer_float = GL_FALSE; static void load_GL_ARB_color_buffer_float(LOADER load) { if(!GLAD_ARB_color_buffer_float) return; @@ -3991,6 +3753,7 @@ static void load_GL_ARB_compute_variable_group_size(LOADER load) { fp_glDispatchComputeGroupSizeARB = (pfn_glDispatchComputeGroupSizeARB)load("glDispatchComputeGroupSizeARB"); } +GLboolean GLAD_ARB_conditional_render_inverted = GL_FALSE; GLboolean GLAD_ARB_conservative_depth = GL_FALSE; GLboolean GLAD_ARB_copy_buffer = GL_FALSE; static void load_GL_ARB_copy_buffer(LOADER load) { @@ -4004,6 +3767,7 @@ static void load_GL_ARB_copy_image(LOADER load) { fp_glCopyImageSubData = (pfn_glCopyImageSubData)load("glCopyImageSubData"); } +GLboolean GLAD_ARB_cull_distance = GL_FALSE; GLboolean GLAD_ARB_debug_output = GL_FALSE; static void load_GL_ARB_debug_output(LOADER load) { if(!GLAD_ARB_debug_output) return; @@ -4015,11 +3779,107 @@ static void load_GL_ARB_debug_output(LOADER load) { GLboolean GLAD_ARB_depth_buffer_float = GL_FALSE; GLboolean GLAD_ARB_depth_clamp = GL_FALSE; -GLboolean GLAD_ARB_depth_texture = GL_FALSE; -GLboolean GLAD_ARB_draw_buffers = GL_FALSE; -static void load_GL_ARB_draw_buffers(LOADER load) { - if(!GLAD_ARB_draw_buffers) return; - fp_glDrawBuffersARB = (pfn_glDrawBuffersARB)load("glDrawBuffersARB"); +GLboolean GLAD_ARB_derivative_control = GL_FALSE; +GLboolean GLAD_ARB_direct_state_access = GL_FALSE; +static void load_GL_ARB_direct_state_access(LOADER load) { + if(!GLAD_ARB_direct_state_access) return; + fp_glCreateTransformFeedbacks = (pfn_glCreateTransformFeedbacks)load("glCreateTransformFeedbacks"); + fp_glTransformFeedbackBufferBase = (pfn_glTransformFeedbackBufferBase)load("glTransformFeedbackBufferBase"); + fp_glTransformFeedbackBufferRange = (pfn_glTransformFeedbackBufferRange)load("glTransformFeedbackBufferRange"); + fp_glGetTransformFeedbackiv = (pfn_glGetTransformFeedbackiv)load("glGetTransformFeedbackiv"); + fp_glGetTransformFeedbacki_v = (pfn_glGetTransformFeedbacki_v)load("glGetTransformFeedbacki_v"); + fp_glGetTransformFeedbacki64_v = (pfn_glGetTransformFeedbacki64_v)load("glGetTransformFeedbacki64_v"); + fp_glCreateBuffers = (pfn_glCreateBuffers)load("glCreateBuffers"); + fp_glNamedBufferStorage = (pfn_glNamedBufferStorage)load("glNamedBufferStorage"); + fp_glNamedBufferData = (pfn_glNamedBufferData)load("glNamedBufferData"); + fp_glNamedBufferSubData = (pfn_glNamedBufferSubData)load("glNamedBufferSubData"); + fp_glCopyNamedBufferSubData = (pfn_glCopyNamedBufferSubData)load("glCopyNamedBufferSubData"); + fp_glClearNamedBufferData = (pfn_glClearNamedBufferData)load("glClearNamedBufferData"); + fp_glClearNamedBufferSubData = (pfn_glClearNamedBufferSubData)load("glClearNamedBufferSubData"); + fp_glMapNamedBuffer = (pfn_glMapNamedBuffer)load("glMapNamedBuffer"); + fp_glMapNamedBufferRange = (pfn_glMapNamedBufferRange)load("glMapNamedBufferRange"); + fp_glUnmapNamedBuffer = (pfn_glUnmapNamedBuffer)load("glUnmapNamedBuffer"); + fp_glFlushMappedNamedBufferRange = (pfn_glFlushMappedNamedBufferRange)load("glFlushMappedNamedBufferRange"); + fp_glGetNamedBufferParameteriv = (pfn_glGetNamedBufferParameteriv)load("glGetNamedBufferParameteriv"); + fp_glGetNamedBufferParameteri64v = (pfn_glGetNamedBufferParameteri64v)load("glGetNamedBufferParameteri64v"); + fp_glGetNamedBufferPointerv = (pfn_glGetNamedBufferPointerv)load("glGetNamedBufferPointerv"); + fp_glGetNamedBufferSubData = (pfn_glGetNamedBufferSubData)load("glGetNamedBufferSubData"); + fp_glCreateFramebuffers = (pfn_glCreateFramebuffers)load("glCreateFramebuffers"); + fp_glNamedFramebufferRenderbuffer = (pfn_glNamedFramebufferRenderbuffer)load("glNamedFramebufferRenderbuffer"); + fp_glNamedFramebufferParameteri = (pfn_glNamedFramebufferParameteri)load("glNamedFramebufferParameteri"); + fp_glNamedFramebufferTexture = (pfn_glNamedFramebufferTexture)load("glNamedFramebufferTexture"); + fp_glNamedFramebufferTextureLayer = (pfn_glNamedFramebufferTextureLayer)load("glNamedFramebufferTextureLayer"); + fp_glNamedFramebufferDrawBuffer = (pfn_glNamedFramebufferDrawBuffer)load("glNamedFramebufferDrawBuffer"); + fp_glNamedFramebufferDrawBuffers = (pfn_glNamedFramebufferDrawBuffers)load("glNamedFramebufferDrawBuffers"); + fp_glNamedFramebufferReadBuffer = (pfn_glNamedFramebufferReadBuffer)load("glNamedFramebufferReadBuffer"); + fp_glInvalidateNamedFramebufferData = (pfn_glInvalidateNamedFramebufferData)load("glInvalidateNamedFramebufferData"); + fp_glInvalidateNamedFramebufferSubData = (pfn_glInvalidateNamedFramebufferSubData)load("glInvalidateNamedFramebufferSubData"); + fp_glClearNamedFramebufferiv = (pfn_glClearNamedFramebufferiv)load("glClearNamedFramebufferiv"); + fp_glClearNamedFramebufferuiv = (pfn_glClearNamedFramebufferuiv)load("glClearNamedFramebufferuiv"); + fp_glClearNamedFramebufferfv = (pfn_glClearNamedFramebufferfv)load("glClearNamedFramebufferfv"); + fp_glClearNamedFramebufferfi = (pfn_glClearNamedFramebufferfi)load("glClearNamedFramebufferfi"); + fp_glBlitNamedFramebuffer = (pfn_glBlitNamedFramebuffer)load("glBlitNamedFramebuffer"); + fp_glCheckNamedFramebufferStatus = (pfn_glCheckNamedFramebufferStatus)load("glCheckNamedFramebufferStatus"); + fp_glGetNamedFramebufferParameteriv = (pfn_glGetNamedFramebufferParameteriv)load("glGetNamedFramebufferParameteriv"); + fp_glGetNamedFramebufferAttachmentParameteriv = (pfn_glGetNamedFramebufferAttachmentParameteriv)load("glGetNamedFramebufferAttachmentParameteriv"); + fp_glCreateRenderbuffers = (pfn_glCreateRenderbuffers)load("glCreateRenderbuffers"); + fp_glNamedRenderbufferStorage = (pfn_glNamedRenderbufferStorage)load("glNamedRenderbufferStorage"); + fp_glNamedRenderbufferStorageMultisample = (pfn_glNamedRenderbufferStorageMultisample)load("glNamedRenderbufferStorageMultisample"); + fp_glGetNamedRenderbufferParameteriv = (pfn_glGetNamedRenderbufferParameteriv)load("glGetNamedRenderbufferParameteriv"); + fp_glCreateTextures = (pfn_glCreateTextures)load("glCreateTextures"); + fp_glTextureBuffer = (pfn_glTextureBuffer)load("glTextureBuffer"); + fp_glTextureBufferRange = (pfn_glTextureBufferRange)load("glTextureBufferRange"); + fp_glTextureStorage1D = (pfn_glTextureStorage1D)load("glTextureStorage1D"); + fp_glTextureStorage2D = (pfn_glTextureStorage2D)load("glTextureStorage2D"); + fp_glTextureStorage3D = (pfn_glTextureStorage3D)load("glTextureStorage3D"); + fp_glTextureStorage2DMultisample = (pfn_glTextureStorage2DMultisample)load("glTextureStorage2DMultisample"); + fp_glTextureStorage3DMultisample = (pfn_glTextureStorage3DMultisample)load("glTextureStorage3DMultisample"); + fp_glTextureSubImage1D = (pfn_glTextureSubImage1D)load("glTextureSubImage1D"); + fp_glTextureSubImage2D = (pfn_glTextureSubImage2D)load("glTextureSubImage2D"); + fp_glTextureSubImage3D = (pfn_glTextureSubImage3D)load("glTextureSubImage3D"); + fp_glCompressedTextureSubImage1D = (pfn_glCompressedTextureSubImage1D)load("glCompressedTextureSubImage1D"); + fp_glCompressedTextureSubImage2D = (pfn_glCompressedTextureSubImage2D)load("glCompressedTextureSubImage2D"); + fp_glCompressedTextureSubImage3D = (pfn_glCompressedTextureSubImage3D)load("glCompressedTextureSubImage3D"); + fp_glCopyTextureSubImage1D = (pfn_glCopyTextureSubImage1D)load("glCopyTextureSubImage1D"); + fp_glCopyTextureSubImage2D = (pfn_glCopyTextureSubImage2D)load("glCopyTextureSubImage2D"); + fp_glCopyTextureSubImage3D = (pfn_glCopyTextureSubImage3D)load("glCopyTextureSubImage3D"); + fp_glTextureParameterf = (pfn_glTextureParameterf)load("glTextureParameterf"); + fp_glTextureParameterfv = (pfn_glTextureParameterfv)load("glTextureParameterfv"); + fp_glTextureParameteri = (pfn_glTextureParameteri)load("glTextureParameteri"); + fp_glTextureParameterIiv = (pfn_glTextureParameterIiv)load("glTextureParameterIiv"); + fp_glTextureParameterIuiv = (pfn_glTextureParameterIuiv)load("glTextureParameterIuiv"); + fp_glTextureParameteriv = (pfn_glTextureParameteriv)load("glTextureParameteriv"); + fp_glGenerateTextureMipmap = (pfn_glGenerateTextureMipmap)load("glGenerateTextureMipmap"); + fp_glBindTextureUnit = (pfn_glBindTextureUnit)load("glBindTextureUnit"); + fp_glGetTextureImage = (pfn_glGetTextureImage)load("glGetTextureImage"); + fp_glGetCompressedTextureImage = (pfn_glGetCompressedTextureImage)load("glGetCompressedTextureImage"); + fp_glGetTextureLevelParameterfv = (pfn_glGetTextureLevelParameterfv)load("glGetTextureLevelParameterfv"); + fp_glGetTextureLevelParameteriv = (pfn_glGetTextureLevelParameteriv)load("glGetTextureLevelParameteriv"); + fp_glGetTextureParameterfv = (pfn_glGetTextureParameterfv)load("glGetTextureParameterfv"); + fp_glGetTextureParameterIiv = (pfn_glGetTextureParameterIiv)load("glGetTextureParameterIiv"); + fp_glGetTextureParameterIuiv = (pfn_glGetTextureParameterIuiv)load("glGetTextureParameterIuiv"); + fp_glGetTextureParameteriv = (pfn_glGetTextureParameteriv)load("glGetTextureParameteriv"); + fp_glCreateVertexArrays = (pfn_glCreateVertexArrays)load("glCreateVertexArrays"); + fp_glDisableVertexArrayAttrib = (pfn_glDisableVertexArrayAttrib)load("glDisableVertexArrayAttrib"); + fp_glEnableVertexArrayAttrib = (pfn_glEnableVertexArrayAttrib)load("glEnableVertexArrayAttrib"); + fp_glVertexArrayElementBuffer = (pfn_glVertexArrayElementBuffer)load("glVertexArrayElementBuffer"); + fp_glVertexArrayVertexBuffer = (pfn_glVertexArrayVertexBuffer)load("glVertexArrayVertexBuffer"); + fp_glVertexArrayVertexBuffers = (pfn_glVertexArrayVertexBuffers)load("glVertexArrayVertexBuffers"); + fp_glVertexArrayAttribBinding = (pfn_glVertexArrayAttribBinding)load("glVertexArrayAttribBinding"); + fp_glVertexArrayAttribFormat = (pfn_glVertexArrayAttribFormat)load("glVertexArrayAttribFormat"); + fp_glVertexArrayAttribIFormat = (pfn_glVertexArrayAttribIFormat)load("glVertexArrayAttribIFormat"); + fp_glVertexArrayAttribLFormat = (pfn_glVertexArrayAttribLFormat)load("glVertexArrayAttribLFormat"); + fp_glVertexArrayBindingDivisor = (pfn_glVertexArrayBindingDivisor)load("glVertexArrayBindingDivisor"); + fp_glGetVertexArrayiv = (pfn_glGetVertexArrayiv)load("glGetVertexArrayiv"); + fp_glGetVertexArrayIndexediv = (pfn_glGetVertexArrayIndexediv)load("glGetVertexArrayIndexediv"); + fp_glGetVertexArrayIndexed64iv = (pfn_glGetVertexArrayIndexed64iv)load("glGetVertexArrayIndexed64iv"); + fp_glCreateSamplers = (pfn_glCreateSamplers)load("glCreateSamplers"); + fp_glCreateProgramPipelines = (pfn_glCreateProgramPipelines)load("glCreateProgramPipelines"); + fp_glCreateQueries = (pfn_glCreateQueries)load("glCreateQueries"); + fp_glGetQueryBufferObjecti64v = (pfn_glGetQueryBufferObjecti64v)load("glGetQueryBufferObjecti64v"); + fp_glGetQueryBufferObjectiv = (pfn_glGetQueryBufferObjectiv)load("glGetQueryBufferObjectiv"); + fp_glGetQueryBufferObjectui64v = (pfn_glGetQueryBufferObjectui64v)load("glGetQueryBufferObjectui64v"); + fp_glGetQueryBufferObjectuiv = (pfn_glGetQueryBufferObjectuiv)load("glGetQueryBufferObjectuiv"); } GLboolean GLAD_ARB_draw_buffers_blend = GL_FALSE; @@ -4065,37 +3925,17 @@ static void load_GL_ARB_ES2_compatibility(LOADER load) { fp_glClearDepthf = (pfn_glClearDepthf)load("glClearDepthf"); } +GLboolean GLAD_ARB_ES3_1_compatibility = GL_FALSE; +static void load_GL_ARB_ES3_1_compatibility(LOADER load) { + if(!GLAD_ARB_ES3_1_compatibility) return; + fp_glMemoryBarrierByRegion = (pfn_glMemoryBarrierByRegion)load("glMemoryBarrierByRegion"); +} + GLboolean GLAD_ARB_ES3_compatibility = GL_FALSE; GLboolean GLAD_ARB_explicit_attrib_location = GL_FALSE; GLboolean GLAD_ARB_explicit_uniform_location = GL_FALSE; GLboolean GLAD_ARB_fragment_coord_conventions = GL_FALSE; GLboolean GLAD_ARB_fragment_layer_viewport = GL_FALSE; -GLboolean GLAD_ARB_fragment_program = GL_FALSE; -static void load_GL_ARB_fragment_program(LOADER load) { - if(!GLAD_ARB_fragment_program) return; - fp_glProgramStringARB = (pfn_glProgramStringARB)load("glProgramStringARB"); - fp_glBindProgramARB = (pfn_glBindProgramARB)load("glBindProgramARB"); - fp_glDeleteProgramsARB = (pfn_glDeleteProgramsARB)load("glDeleteProgramsARB"); - fp_glGenProgramsARB = (pfn_glGenProgramsARB)load("glGenProgramsARB"); - fp_glProgramEnvParameter4dARB = (pfn_glProgramEnvParameter4dARB)load("glProgramEnvParameter4dARB"); - fp_glProgramEnvParameter4dvARB = (pfn_glProgramEnvParameter4dvARB)load("glProgramEnvParameter4dvARB"); - fp_glProgramEnvParameter4fARB = (pfn_glProgramEnvParameter4fARB)load("glProgramEnvParameter4fARB"); - fp_glProgramEnvParameter4fvARB = (pfn_glProgramEnvParameter4fvARB)load("glProgramEnvParameter4fvARB"); - fp_glProgramLocalParameter4dARB = (pfn_glProgramLocalParameter4dARB)load("glProgramLocalParameter4dARB"); - fp_glProgramLocalParameter4dvARB = (pfn_glProgramLocalParameter4dvARB)load("glProgramLocalParameter4dvARB"); - fp_glProgramLocalParameter4fARB = (pfn_glProgramLocalParameter4fARB)load("glProgramLocalParameter4fARB"); - fp_glProgramLocalParameter4fvARB = (pfn_glProgramLocalParameter4fvARB)load("glProgramLocalParameter4fvARB"); - fp_glGetProgramEnvParameterdvARB = (pfn_glGetProgramEnvParameterdvARB)load("glGetProgramEnvParameterdvARB"); - fp_glGetProgramEnvParameterfvARB = (pfn_glGetProgramEnvParameterfvARB)load("glGetProgramEnvParameterfvARB"); - fp_glGetProgramLocalParameterdvARB = (pfn_glGetProgramLocalParameterdvARB)load("glGetProgramLocalParameterdvARB"); - fp_glGetProgramLocalParameterfvARB = (pfn_glGetProgramLocalParameterfvARB)load("glGetProgramLocalParameterfvARB"); - fp_glGetProgramivARB = (pfn_glGetProgramivARB)load("glGetProgramivARB"); - fp_glGetProgramStringARB = (pfn_glGetProgramStringARB)load("glGetProgramStringARB"); - fp_glIsProgramARB = (pfn_glIsProgramARB)load("glIsProgramARB"); -} - -GLboolean GLAD_ARB_fragment_program_shadow = GL_FALSE; -GLboolean GLAD_ARB_fragment_shader = GL_FALSE; GLboolean GLAD_ARB_framebuffer_no_attachments = GL_FALSE; static void load_GL_ARB_framebuffer_no_attachments(LOADER load) { if(!GLAD_ARB_framebuffer_no_attachments) return; @@ -4146,6 +3986,13 @@ static void load_GL_ARB_get_program_binary(LOADER load) { fp_glProgramParameteri = (pfn_glProgramParameteri)load("glProgramParameteri"); } +GLboolean GLAD_ARB_get_texture_sub_image = GL_FALSE; +static void load_GL_ARB_get_texture_sub_image(LOADER load) { + if(!GLAD_ARB_get_texture_sub_image) return; + fp_glGetTextureSubImage = (pfn_glGetTextureSubImage)load("glGetTextureSubImage"); + fp_glGetCompressedTextureSubImage = (pfn_glGetCompressedTextureSubImage)load("glGetCompressedTextureSubImage"); +} + GLboolean GLAD_ARB_gpu_shader5 = GL_FALSE; GLboolean GLAD_ARB_gpu_shader_fp64 = GL_FALSE; static void load_GL_ARB_gpu_shader_fp64(LOADER load) { @@ -4216,16 +4063,6 @@ static void load_GL_ARB_map_buffer_range(LOADER load) { fp_glFlushMappedBufferRange = (pfn_glFlushMappedBufferRange)load("glFlushMappedBufferRange"); } -GLboolean GLAD_ARB_matrix_palette = GL_FALSE; -static void load_GL_ARB_matrix_palette(LOADER load) { - if(!GLAD_ARB_matrix_palette) return; - fp_glCurrentPaletteMatrixARB = (pfn_glCurrentPaletteMatrixARB)load("glCurrentPaletteMatrixARB"); - fp_glMatrixIndexubvARB = (pfn_glMatrixIndexubvARB)load("glMatrixIndexubvARB"); - fp_glMatrixIndexusvARB = (pfn_glMatrixIndexusvARB)load("glMatrixIndexusvARB"); - fp_glMatrixIndexuivARB = (pfn_glMatrixIndexuivARB)load("glMatrixIndexuivARB"); - fp_glMatrixIndexPointerARB = (pfn_glMatrixIndexPointerARB)load("glMatrixIndexPointerARB"); -} - GLboolean GLAD_ARB_multi_bind = GL_FALSE; static void load_GL_ARB_multi_bind(LOADER load) { if(!GLAD_ARB_multi_bind) return; @@ -4244,74 +4081,9 @@ static void load_GL_ARB_multi_draw_indirect(LOADER load) { fp_glMultiDrawElementsIndirect = (pfn_glMultiDrawElementsIndirect)load("glMultiDrawElementsIndirect"); } -GLboolean GLAD_ARB_multisample = GL_FALSE; -static void load_GL_ARB_multisample(LOADER load) { - if(!GLAD_ARB_multisample) return; - fp_glSampleCoverageARB = (pfn_glSampleCoverageARB)load("glSampleCoverageARB"); -} - -GLboolean GLAD_ARB_multitexture = GL_FALSE; -static void load_GL_ARB_multitexture(LOADER load) { - if(!GLAD_ARB_multitexture) return; - fp_glActiveTextureARB = (pfn_glActiveTextureARB)load("glActiveTextureARB"); - fp_glClientActiveTextureARB = (pfn_glClientActiveTextureARB)load("glClientActiveTextureARB"); - fp_glMultiTexCoord1dARB = (pfn_glMultiTexCoord1dARB)load("glMultiTexCoord1dARB"); - fp_glMultiTexCoord1dvARB = (pfn_glMultiTexCoord1dvARB)load("glMultiTexCoord1dvARB"); - fp_glMultiTexCoord1fARB = (pfn_glMultiTexCoord1fARB)load("glMultiTexCoord1fARB"); - fp_glMultiTexCoord1fvARB = (pfn_glMultiTexCoord1fvARB)load("glMultiTexCoord1fvARB"); - fp_glMultiTexCoord1iARB = (pfn_glMultiTexCoord1iARB)load("glMultiTexCoord1iARB"); - fp_glMultiTexCoord1ivARB = (pfn_glMultiTexCoord1ivARB)load("glMultiTexCoord1ivARB"); - fp_glMultiTexCoord1sARB = (pfn_glMultiTexCoord1sARB)load("glMultiTexCoord1sARB"); - fp_glMultiTexCoord1svARB = (pfn_glMultiTexCoord1svARB)load("glMultiTexCoord1svARB"); - fp_glMultiTexCoord2dARB = (pfn_glMultiTexCoord2dARB)load("glMultiTexCoord2dARB"); - fp_glMultiTexCoord2dvARB = (pfn_glMultiTexCoord2dvARB)load("glMultiTexCoord2dvARB"); - fp_glMultiTexCoord2fARB = (pfn_glMultiTexCoord2fARB)load("glMultiTexCoord2fARB"); - fp_glMultiTexCoord2fvARB = (pfn_glMultiTexCoord2fvARB)load("glMultiTexCoord2fvARB"); - fp_glMultiTexCoord2iARB = (pfn_glMultiTexCoord2iARB)load("glMultiTexCoord2iARB"); - fp_glMultiTexCoord2ivARB = (pfn_glMultiTexCoord2ivARB)load("glMultiTexCoord2ivARB"); - fp_glMultiTexCoord2sARB = (pfn_glMultiTexCoord2sARB)load("glMultiTexCoord2sARB"); - fp_glMultiTexCoord2svARB = (pfn_glMultiTexCoord2svARB)load("glMultiTexCoord2svARB"); - fp_glMultiTexCoord3dARB = (pfn_glMultiTexCoord3dARB)load("glMultiTexCoord3dARB"); - fp_glMultiTexCoord3dvARB = (pfn_glMultiTexCoord3dvARB)load("glMultiTexCoord3dvARB"); - fp_glMultiTexCoord3fARB = (pfn_glMultiTexCoord3fARB)load("glMultiTexCoord3fARB"); - fp_glMultiTexCoord3fvARB = (pfn_glMultiTexCoord3fvARB)load("glMultiTexCoord3fvARB"); - fp_glMultiTexCoord3iARB = (pfn_glMultiTexCoord3iARB)load("glMultiTexCoord3iARB"); - fp_glMultiTexCoord3ivARB = (pfn_glMultiTexCoord3ivARB)load("glMultiTexCoord3ivARB"); - fp_glMultiTexCoord3sARB = (pfn_glMultiTexCoord3sARB)load("glMultiTexCoord3sARB"); - fp_glMultiTexCoord3svARB = (pfn_glMultiTexCoord3svARB)load("glMultiTexCoord3svARB"); - fp_glMultiTexCoord4dARB = (pfn_glMultiTexCoord4dARB)load("glMultiTexCoord4dARB"); - fp_glMultiTexCoord4dvARB = (pfn_glMultiTexCoord4dvARB)load("glMultiTexCoord4dvARB"); - fp_glMultiTexCoord4fARB = (pfn_glMultiTexCoord4fARB)load("glMultiTexCoord4fARB"); - fp_glMultiTexCoord4fvARB = (pfn_glMultiTexCoord4fvARB)load("glMultiTexCoord4fvARB"); - fp_glMultiTexCoord4iARB = (pfn_glMultiTexCoord4iARB)load("glMultiTexCoord4iARB"); - fp_glMultiTexCoord4ivARB = (pfn_glMultiTexCoord4ivARB)load("glMultiTexCoord4ivARB"); - fp_glMultiTexCoord4sARB = (pfn_glMultiTexCoord4sARB)load("glMultiTexCoord4sARB"); - fp_glMultiTexCoord4svARB = (pfn_glMultiTexCoord4svARB)load("glMultiTexCoord4svARB"); -} - -GLboolean GLAD_ARB_occlusion_query = GL_FALSE; -static void load_GL_ARB_occlusion_query(LOADER load) { - if(!GLAD_ARB_occlusion_query) return; - fp_glGenQueriesARB = (pfn_glGenQueriesARB)load("glGenQueriesARB"); - fp_glDeleteQueriesARB = (pfn_glDeleteQueriesARB)load("glDeleteQueriesARB"); - fp_glIsQueryARB = (pfn_glIsQueryARB)load("glIsQueryARB"); - fp_glBeginQueryARB = (pfn_glBeginQueryARB)load("glBeginQueryARB"); - fp_glEndQueryARB = (pfn_glEndQueryARB)load("glEndQueryARB"); - fp_glGetQueryivARB = (pfn_glGetQueryivARB)load("glGetQueryivARB"); - fp_glGetQueryObjectivARB = (pfn_glGetQueryObjectivARB)load("glGetQueryObjectivARB"); - fp_glGetQueryObjectuivARB = (pfn_glGetQueryObjectuivARB)load("glGetQueryObjectuivARB"); -} - GLboolean GLAD_ARB_occlusion_query2 = GL_FALSE; +GLboolean GLAD_ARB_pipeline_statistics_query = GL_FALSE; GLboolean GLAD_ARB_pixel_buffer_object = GL_FALSE; -GLboolean GLAD_ARB_point_parameters = GL_FALSE; -static void load_GL_ARB_point_parameters(LOADER load) { - if(!GLAD_ARB_point_parameters) return; - fp_glPointParameterfARB = (pfn_glPointParameterfARB)load("glPointParameterfARB"); - fp_glPointParameterfvARB = (pfn_glPointParameterfvARB)load("glPointParameterfvARB"); -} - -GLboolean GLAD_ARB_point_sprite = GL_FALSE; GLboolean GLAD_ARB_program_interface_query = GL_FALSE; static void load_GL_ARB_program_interface_query(LOADER load) { if(!GLAD_ARB_program_interface_query) return; @@ -4466,50 +4238,6 @@ static void load_GL_ARB_shader_image_load_store(LOADER load) { } GLboolean GLAD_ARB_shader_image_size = GL_FALSE; -GLboolean GLAD_ARB_shader_objects = GL_FALSE; -static void load_GL_ARB_shader_objects(LOADER load) { - if(!GLAD_ARB_shader_objects) return; - fp_glDeleteObjectARB = (pfn_glDeleteObjectARB)load("glDeleteObjectARB"); - fp_glGetHandleARB = (pfn_glGetHandleARB)load("glGetHandleARB"); - fp_glDetachObjectARB = (pfn_glDetachObjectARB)load("glDetachObjectARB"); - fp_glCreateShaderObjectARB = (pfn_glCreateShaderObjectARB)load("glCreateShaderObjectARB"); - fp_glShaderSourceARB = (pfn_glShaderSourceARB)load("glShaderSourceARB"); - fp_glCompileShaderARB = (pfn_glCompileShaderARB)load("glCompileShaderARB"); - fp_glCreateProgramObjectARB = (pfn_glCreateProgramObjectARB)load("glCreateProgramObjectARB"); - fp_glAttachObjectARB = (pfn_glAttachObjectARB)load("glAttachObjectARB"); - fp_glLinkProgramARB = (pfn_glLinkProgramARB)load("glLinkProgramARB"); - fp_glUseProgramObjectARB = (pfn_glUseProgramObjectARB)load("glUseProgramObjectARB"); - fp_glValidateProgramARB = (pfn_glValidateProgramARB)load("glValidateProgramARB"); - fp_glUniform1fARB = (pfn_glUniform1fARB)load("glUniform1fARB"); - fp_glUniform2fARB = (pfn_glUniform2fARB)load("glUniform2fARB"); - fp_glUniform3fARB = (pfn_glUniform3fARB)load("glUniform3fARB"); - fp_glUniform4fARB = (pfn_glUniform4fARB)load("glUniform4fARB"); - fp_glUniform1iARB = (pfn_glUniform1iARB)load("glUniform1iARB"); - fp_glUniform2iARB = (pfn_glUniform2iARB)load("glUniform2iARB"); - fp_glUniform3iARB = (pfn_glUniform3iARB)load("glUniform3iARB"); - fp_glUniform4iARB = (pfn_glUniform4iARB)load("glUniform4iARB"); - fp_glUniform1fvARB = (pfn_glUniform1fvARB)load("glUniform1fvARB"); - fp_glUniform2fvARB = (pfn_glUniform2fvARB)load("glUniform2fvARB"); - fp_glUniform3fvARB = (pfn_glUniform3fvARB)load("glUniform3fvARB"); - fp_glUniform4fvARB = (pfn_glUniform4fvARB)load("glUniform4fvARB"); - fp_glUniform1ivARB = (pfn_glUniform1ivARB)load("glUniform1ivARB"); - fp_glUniform2ivARB = (pfn_glUniform2ivARB)load("glUniform2ivARB"); - fp_glUniform3ivARB = (pfn_glUniform3ivARB)load("glUniform3ivARB"); - fp_glUniform4ivARB = (pfn_glUniform4ivARB)load("glUniform4ivARB"); - fp_glUniformMatrix2fvARB = (pfn_glUniformMatrix2fvARB)load("glUniformMatrix2fvARB"); - fp_glUniformMatrix3fvARB = (pfn_glUniformMatrix3fvARB)load("glUniformMatrix3fvARB"); - fp_glUniformMatrix4fvARB = (pfn_glUniformMatrix4fvARB)load("glUniformMatrix4fvARB"); - fp_glGetObjectParameterfvARB = (pfn_glGetObjectParameterfvARB)load("glGetObjectParameterfvARB"); - fp_glGetObjectParameterivARB = (pfn_glGetObjectParameterivARB)load("glGetObjectParameterivARB"); - fp_glGetInfoLogARB = (pfn_glGetInfoLogARB)load("glGetInfoLogARB"); - fp_glGetAttachedObjectsARB = (pfn_glGetAttachedObjectsARB)load("glGetAttachedObjectsARB"); - fp_glGetUniformLocationARB = (pfn_glGetUniformLocationARB)load("glGetUniformLocationARB"); - fp_glGetActiveUniformARB = (pfn_glGetActiveUniformARB)load("glGetActiveUniformARB"); - fp_glGetUniformfvARB = (pfn_glGetUniformfvARB)load("glGetUniformfvARB"); - fp_glGetUniformivARB = (pfn_glGetUniformivARB)load("glGetUniformivARB"); - fp_glGetShaderSourceARB = (pfn_glGetShaderSourceARB)load("glGetShaderSourceARB"); -} - GLboolean GLAD_ARB_shader_precision = GL_FALSE; GLboolean GLAD_ARB_shader_stencil_export = GL_FALSE; GLboolean GLAD_ARB_shader_storage_buffer_object = GL_FALSE; @@ -4531,8 +4259,8 @@ static void load_GL_ARB_shader_subroutine(LOADER load) { fp_glGetProgramStageiv = (pfn_glGetProgramStageiv)load("glGetProgramStageiv"); } +GLboolean GLAD_ARB_shader_texture_image_samples = GL_FALSE; GLboolean GLAD_ARB_shader_texture_lod = GL_FALSE; -GLboolean GLAD_ARB_shading_language_100 = GL_FALSE; GLboolean GLAD_ARB_shading_language_420pack = GL_FALSE; GLboolean GLAD_ARB_shading_language_include = GL_FALSE; static void load_GL_ARB_shading_language_include(LOADER load) { @@ -4546,8 +4274,14 @@ static void load_GL_ARB_shading_language_include(LOADER load) { } GLboolean GLAD_ARB_shading_language_packing = GL_FALSE; -GLboolean GLAD_ARB_shadow = GL_FALSE; -GLboolean GLAD_ARB_shadow_ambient = GL_FALSE; +GLboolean GLAD_ARB_sparse_buffer = GL_FALSE; +static void load_GL_ARB_sparse_buffer(LOADER load) { + if(!GLAD_ARB_sparse_buffer) return; + fp_glBufferPageCommitmentARB = (pfn_glBufferPageCommitmentARB)load("glBufferPageCommitmentARB"); + fp_glNamedBufferPageCommitmentEXT = (pfn_glNamedBufferPageCommitmentEXT)load("glNamedBufferPageCommitmentEXT"); + fp_glNamedBufferPageCommitmentARB = (pfn_glNamedBufferPageCommitmentARB)load("glNamedBufferPageCommitmentARB"); +} + GLboolean GLAD_ARB_sparse_texture = GL_FALSE; static void load_GL_ARB_sparse_texture(LOADER load) { if(!GLAD_ARB_sparse_texture) return; @@ -4574,7 +4308,12 @@ static void load_GL_ARB_tessellation_shader(LOADER load) { fp_glPatchParameterfv = (pfn_glPatchParameterfv)load("glPatchParameterfv"); } -GLboolean GLAD_ARB_texture_border_clamp = GL_FALSE; +GLboolean GLAD_ARB_texture_barrier = GL_FALSE; +static void load_GL_ARB_texture_barrier(LOADER load) { + if(!GLAD_ARB_texture_barrier) return; + fp_glTextureBarrier = (pfn_glTextureBarrier)load("glTextureBarrier"); +} + GLboolean GLAD_ARB_texture_buffer_object = GL_FALSE; static void load_GL_ARB_texture_buffer_object(LOADER load) { if(!GLAD_ARB_texture_buffer_object) return; @@ -4588,30 +4327,12 @@ static void load_GL_ARB_texture_buffer_range(LOADER load) { fp_glTexBufferRange = (pfn_glTexBufferRange)load("glTexBufferRange"); } -GLboolean GLAD_ARB_texture_compression = GL_FALSE; -static void load_GL_ARB_texture_compression(LOADER load) { - if(!GLAD_ARB_texture_compression) return; - fp_glCompressedTexImage3DARB = (pfn_glCompressedTexImage3DARB)load("glCompressedTexImage3DARB"); - fp_glCompressedTexImage2DARB = (pfn_glCompressedTexImage2DARB)load("glCompressedTexImage2DARB"); - fp_glCompressedTexImage1DARB = (pfn_glCompressedTexImage1DARB)load("glCompressedTexImage1DARB"); - fp_glCompressedTexSubImage3DARB = (pfn_glCompressedTexSubImage3DARB)load("glCompressedTexSubImage3DARB"); - fp_glCompressedTexSubImage2DARB = (pfn_glCompressedTexSubImage2DARB)load("glCompressedTexSubImage2DARB"); - fp_glCompressedTexSubImage1DARB = (pfn_glCompressedTexSubImage1DARB)load("glCompressedTexSubImage1DARB"); - fp_glGetCompressedTexImageARB = (pfn_glGetCompressedTexImageARB)load("glGetCompressedTexImageARB"); -} - GLboolean GLAD_ARB_texture_compression_bptc = GL_FALSE; GLboolean GLAD_ARB_texture_compression_rgtc = GL_FALSE; -GLboolean GLAD_ARB_texture_cube_map = GL_FALSE; GLboolean GLAD_ARB_texture_cube_map_array = GL_FALSE; -GLboolean GLAD_ARB_texture_env_add = GL_FALSE; -GLboolean GLAD_ARB_texture_env_combine = GL_FALSE; -GLboolean GLAD_ARB_texture_env_crossbar = GL_FALSE; -GLboolean GLAD_ARB_texture_env_dot3 = GL_FALSE; GLboolean GLAD_ARB_texture_float = GL_FALSE; GLboolean GLAD_ARB_texture_gather = GL_FALSE; GLboolean GLAD_ARB_texture_mirror_clamp_to_edge = GL_FALSE; -GLboolean GLAD_ARB_texture_mirrored_repeat = GL_FALSE; GLboolean GLAD_ARB_texture_multisample = GL_FALSE; static void load_GL_ARB_texture_multisample(LOADER load) { if(!GLAD_ARB_texture_multisample) return; @@ -4621,7 +4342,6 @@ static void load_GL_ARB_texture_multisample(LOADER load) { fp_glSampleMaski = (pfn_glSampleMaski)load("glSampleMaski"); } -GLboolean GLAD_ARB_texture_non_power_of_two = GL_FALSE; GLboolean GLAD_ARB_texture_query_levels = GL_FALSE; GLboolean GLAD_ARB_texture_query_lod = GL_FALSE; GLboolean GLAD_ARB_texture_rectangle = GL_FALSE; @@ -4686,15 +4406,7 @@ static void load_GL_ARB_transform_feedback_instanced(LOADER load) { fp_glDrawTransformFeedbackStreamInstanced = (pfn_glDrawTransformFeedbackStreamInstanced)load("glDrawTransformFeedbackStreamInstanced"); } -GLboolean GLAD_ARB_transpose_matrix = GL_FALSE; -static void load_GL_ARB_transpose_matrix(LOADER load) { - if(!GLAD_ARB_transpose_matrix) return; - fp_glLoadTransposeMatrixfARB = (pfn_glLoadTransposeMatrixfARB)load("glLoadTransposeMatrixfARB"); - fp_glLoadTransposeMatrixdARB = (pfn_glLoadTransposeMatrixdARB)load("glLoadTransposeMatrixdARB"); - fp_glMultTransposeMatrixfARB = (pfn_glMultTransposeMatrixfARB)load("glMultTransposeMatrixfARB"); - fp_glMultTransposeMatrixdARB = (pfn_glMultTransposeMatrixdARB)load("glMultTransposeMatrixdARB"); -} - +GLboolean GLAD_ARB_transform_feedback_overflow_query = GL_FALSE; GLboolean GLAD_ARB_uniform_buffer_object = GL_FALSE; static void load_GL_ARB_uniform_buffer_object(LOADER load) { if(!GLAD_ARB_uniform_buffer_object) return; @@ -4743,155 +4455,6 @@ static void load_GL_ARB_vertex_attrib_binding(LOADER load) { fp_glVertexBindingDivisor = (pfn_glVertexBindingDivisor)load("glVertexBindingDivisor"); } -GLboolean GLAD_ARB_vertex_blend = GL_FALSE; -static void load_GL_ARB_vertex_blend(LOADER load) { - if(!GLAD_ARB_vertex_blend) return; - fp_glWeightbvARB = (pfn_glWeightbvARB)load("glWeightbvARB"); - fp_glWeightsvARB = (pfn_glWeightsvARB)load("glWeightsvARB"); - fp_glWeightivARB = (pfn_glWeightivARB)load("glWeightivARB"); - fp_glWeightfvARB = (pfn_glWeightfvARB)load("glWeightfvARB"); - fp_glWeightdvARB = (pfn_glWeightdvARB)load("glWeightdvARB"); - fp_glWeightubvARB = (pfn_glWeightubvARB)load("glWeightubvARB"); - fp_glWeightusvARB = (pfn_glWeightusvARB)load("glWeightusvARB"); - fp_glWeightuivARB = (pfn_glWeightuivARB)load("glWeightuivARB"); - fp_glWeightPointerARB = (pfn_glWeightPointerARB)load("glWeightPointerARB"); - fp_glVertexBlendARB = (pfn_glVertexBlendARB)load("glVertexBlendARB"); -} - -GLboolean GLAD_ARB_vertex_buffer_object = GL_FALSE; -static void load_GL_ARB_vertex_buffer_object(LOADER load) { - if(!GLAD_ARB_vertex_buffer_object) return; - fp_glBindBufferARB = (pfn_glBindBufferARB)load("glBindBufferARB"); - fp_glDeleteBuffersARB = (pfn_glDeleteBuffersARB)load("glDeleteBuffersARB"); - fp_glGenBuffersARB = (pfn_glGenBuffersARB)load("glGenBuffersARB"); - fp_glIsBufferARB = (pfn_glIsBufferARB)load("glIsBufferARB"); - fp_glBufferDataARB = (pfn_glBufferDataARB)load("glBufferDataARB"); - fp_glBufferSubDataARB = (pfn_glBufferSubDataARB)load("glBufferSubDataARB"); - fp_glGetBufferSubDataARB = (pfn_glGetBufferSubDataARB)load("glGetBufferSubDataARB"); - fp_glMapBufferARB = (pfn_glMapBufferARB)load("glMapBufferARB"); - fp_glUnmapBufferARB = (pfn_glUnmapBufferARB)load("glUnmapBufferARB"); - fp_glGetBufferParameterivARB = (pfn_glGetBufferParameterivARB)load("glGetBufferParameterivARB"); - fp_glGetBufferPointervARB = (pfn_glGetBufferPointervARB)load("glGetBufferPointervARB"); -} - -GLboolean GLAD_ARB_vertex_program = GL_FALSE; -static void load_GL_ARB_vertex_program(LOADER load) { - if(!GLAD_ARB_vertex_program) return; - fp_glVertexAttrib1dARB = (pfn_glVertexAttrib1dARB)load("glVertexAttrib1dARB"); - fp_glVertexAttrib1dvARB = (pfn_glVertexAttrib1dvARB)load("glVertexAttrib1dvARB"); - fp_glVertexAttrib1fARB = (pfn_glVertexAttrib1fARB)load("glVertexAttrib1fARB"); - fp_glVertexAttrib1fvARB = (pfn_glVertexAttrib1fvARB)load("glVertexAttrib1fvARB"); - fp_glVertexAttrib1sARB = (pfn_glVertexAttrib1sARB)load("glVertexAttrib1sARB"); - fp_glVertexAttrib1svARB = (pfn_glVertexAttrib1svARB)load("glVertexAttrib1svARB"); - fp_glVertexAttrib2dARB = (pfn_glVertexAttrib2dARB)load("glVertexAttrib2dARB"); - fp_glVertexAttrib2dvARB = (pfn_glVertexAttrib2dvARB)load("glVertexAttrib2dvARB"); - fp_glVertexAttrib2fARB = (pfn_glVertexAttrib2fARB)load("glVertexAttrib2fARB"); - fp_glVertexAttrib2fvARB = (pfn_glVertexAttrib2fvARB)load("glVertexAttrib2fvARB"); - fp_glVertexAttrib2sARB = (pfn_glVertexAttrib2sARB)load("glVertexAttrib2sARB"); - fp_glVertexAttrib2svARB = (pfn_glVertexAttrib2svARB)load("glVertexAttrib2svARB"); - fp_glVertexAttrib3dARB = (pfn_glVertexAttrib3dARB)load("glVertexAttrib3dARB"); - fp_glVertexAttrib3dvARB = (pfn_glVertexAttrib3dvARB)load("glVertexAttrib3dvARB"); - fp_glVertexAttrib3fARB = (pfn_glVertexAttrib3fARB)load("glVertexAttrib3fARB"); - fp_glVertexAttrib3fvARB = (pfn_glVertexAttrib3fvARB)load("glVertexAttrib3fvARB"); - fp_glVertexAttrib3sARB = (pfn_glVertexAttrib3sARB)load("glVertexAttrib3sARB"); - fp_glVertexAttrib3svARB = (pfn_glVertexAttrib3svARB)load("glVertexAttrib3svARB"); - fp_glVertexAttrib4NbvARB = (pfn_glVertexAttrib4NbvARB)load("glVertexAttrib4NbvARB"); - fp_glVertexAttrib4NivARB = (pfn_glVertexAttrib4NivARB)load("glVertexAttrib4NivARB"); - fp_glVertexAttrib4NsvARB = (pfn_glVertexAttrib4NsvARB)load("glVertexAttrib4NsvARB"); - fp_glVertexAttrib4NubARB = (pfn_glVertexAttrib4NubARB)load("glVertexAttrib4NubARB"); - fp_glVertexAttrib4NubvARB = (pfn_glVertexAttrib4NubvARB)load("glVertexAttrib4NubvARB"); - fp_glVertexAttrib4NuivARB = (pfn_glVertexAttrib4NuivARB)load("glVertexAttrib4NuivARB"); - fp_glVertexAttrib4NusvARB = (pfn_glVertexAttrib4NusvARB)load("glVertexAttrib4NusvARB"); - fp_glVertexAttrib4bvARB = (pfn_glVertexAttrib4bvARB)load("glVertexAttrib4bvARB"); - fp_glVertexAttrib4dARB = (pfn_glVertexAttrib4dARB)load("glVertexAttrib4dARB"); - fp_glVertexAttrib4dvARB = (pfn_glVertexAttrib4dvARB)load("glVertexAttrib4dvARB"); - fp_glVertexAttrib4fARB = (pfn_glVertexAttrib4fARB)load("glVertexAttrib4fARB"); - fp_glVertexAttrib4fvARB = (pfn_glVertexAttrib4fvARB)load("glVertexAttrib4fvARB"); - fp_glVertexAttrib4ivARB = (pfn_glVertexAttrib4ivARB)load("glVertexAttrib4ivARB"); - fp_glVertexAttrib4sARB = (pfn_glVertexAttrib4sARB)load("glVertexAttrib4sARB"); - fp_glVertexAttrib4svARB = (pfn_glVertexAttrib4svARB)load("glVertexAttrib4svARB"); - fp_glVertexAttrib4ubvARB = (pfn_glVertexAttrib4ubvARB)load("glVertexAttrib4ubvARB"); - fp_glVertexAttrib4uivARB = (pfn_glVertexAttrib4uivARB)load("glVertexAttrib4uivARB"); - fp_glVertexAttrib4usvARB = (pfn_glVertexAttrib4usvARB)load("glVertexAttrib4usvARB"); - fp_glVertexAttribPointerARB = (pfn_glVertexAttribPointerARB)load("glVertexAttribPointerARB"); - fp_glEnableVertexAttribArrayARB = (pfn_glEnableVertexAttribArrayARB)load("glEnableVertexAttribArrayARB"); - fp_glDisableVertexAttribArrayARB = (pfn_glDisableVertexAttribArrayARB)load("glDisableVertexAttribArrayARB"); - fp_glProgramStringARB = (pfn_glProgramStringARB)load("glProgramStringARB"); - fp_glBindProgramARB = (pfn_glBindProgramARB)load("glBindProgramARB"); - fp_glDeleteProgramsARB = (pfn_glDeleteProgramsARB)load("glDeleteProgramsARB"); - fp_glGenProgramsARB = (pfn_glGenProgramsARB)load("glGenProgramsARB"); - fp_glProgramEnvParameter4dARB = (pfn_glProgramEnvParameter4dARB)load("glProgramEnvParameter4dARB"); - fp_glProgramEnvParameter4dvARB = (pfn_glProgramEnvParameter4dvARB)load("glProgramEnvParameter4dvARB"); - fp_glProgramEnvParameter4fARB = (pfn_glProgramEnvParameter4fARB)load("glProgramEnvParameter4fARB"); - fp_glProgramEnvParameter4fvARB = (pfn_glProgramEnvParameter4fvARB)load("glProgramEnvParameter4fvARB"); - fp_glProgramLocalParameter4dARB = (pfn_glProgramLocalParameter4dARB)load("glProgramLocalParameter4dARB"); - fp_glProgramLocalParameter4dvARB = (pfn_glProgramLocalParameter4dvARB)load("glProgramLocalParameter4dvARB"); - fp_glProgramLocalParameter4fARB = (pfn_glProgramLocalParameter4fARB)load("glProgramLocalParameter4fARB"); - fp_glProgramLocalParameter4fvARB = (pfn_glProgramLocalParameter4fvARB)load("glProgramLocalParameter4fvARB"); - fp_glGetProgramEnvParameterdvARB = (pfn_glGetProgramEnvParameterdvARB)load("glGetProgramEnvParameterdvARB"); - fp_glGetProgramEnvParameterfvARB = (pfn_glGetProgramEnvParameterfvARB)load("glGetProgramEnvParameterfvARB"); - fp_glGetProgramLocalParameterdvARB = (pfn_glGetProgramLocalParameterdvARB)load("glGetProgramLocalParameterdvARB"); - fp_glGetProgramLocalParameterfvARB = (pfn_glGetProgramLocalParameterfvARB)load("glGetProgramLocalParameterfvARB"); - fp_glGetProgramivARB = (pfn_glGetProgramivARB)load("glGetProgramivARB"); - fp_glGetProgramStringARB = (pfn_glGetProgramStringARB)load("glGetProgramStringARB"); - fp_glGetVertexAttribdvARB = (pfn_glGetVertexAttribdvARB)load("glGetVertexAttribdvARB"); - fp_glGetVertexAttribfvARB = (pfn_glGetVertexAttribfvARB)load("glGetVertexAttribfvARB"); - fp_glGetVertexAttribivARB = (pfn_glGetVertexAttribivARB)load("glGetVertexAttribivARB"); - fp_glGetVertexAttribPointervARB = (pfn_glGetVertexAttribPointervARB)load("glGetVertexAttribPointervARB"); - fp_glIsProgramARB = (pfn_glIsProgramARB)load("glIsProgramARB"); -} - -GLboolean GLAD_ARB_vertex_shader = GL_FALSE; -static void load_GL_ARB_vertex_shader(LOADER load) { - if(!GLAD_ARB_vertex_shader) return; - fp_glVertexAttrib1fARB = (pfn_glVertexAttrib1fARB)load("glVertexAttrib1fARB"); - fp_glVertexAttrib1sARB = (pfn_glVertexAttrib1sARB)load("glVertexAttrib1sARB"); - fp_glVertexAttrib1dARB = (pfn_glVertexAttrib1dARB)load("glVertexAttrib1dARB"); - fp_glVertexAttrib2fARB = (pfn_glVertexAttrib2fARB)load("glVertexAttrib2fARB"); - fp_glVertexAttrib2sARB = (pfn_glVertexAttrib2sARB)load("glVertexAttrib2sARB"); - fp_glVertexAttrib2dARB = (pfn_glVertexAttrib2dARB)load("glVertexAttrib2dARB"); - fp_glVertexAttrib3fARB = (pfn_glVertexAttrib3fARB)load("glVertexAttrib3fARB"); - fp_glVertexAttrib3sARB = (pfn_glVertexAttrib3sARB)load("glVertexAttrib3sARB"); - fp_glVertexAttrib3dARB = (pfn_glVertexAttrib3dARB)load("glVertexAttrib3dARB"); - fp_glVertexAttrib4fARB = (pfn_glVertexAttrib4fARB)load("glVertexAttrib4fARB"); - fp_glVertexAttrib4sARB = (pfn_glVertexAttrib4sARB)load("glVertexAttrib4sARB"); - fp_glVertexAttrib4dARB = (pfn_glVertexAttrib4dARB)load("glVertexAttrib4dARB"); - fp_glVertexAttrib4NubARB = (pfn_glVertexAttrib4NubARB)load("glVertexAttrib4NubARB"); - fp_glVertexAttrib1fvARB = (pfn_glVertexAttrib1fvARB)load("glVertexAttrib1fvARB"); - fp_glVertexAttrib1svARB = (pfn_glVertexAttrib1svARB)load("glVertexAttrib1svARB"); - fp_glVertexAttrib1dvARB = (pfn_glVertexAttrib1dvARB)load("glVertexAttrib1dvARB"); - fp_glVertexAttrib2fvARB = (pfn_glVertexAttrib2fvARB)load("glVertexAttrib2fvARB"); - fp_glVertexAttrib2svARB = (pfn_glVertexAttrib2svARB)load("glVertexAttrib2svARB"); - fp_glVertexAttrib2dvARB = (pfn_glVertexAttrib2dvARB)load("glVertexAttrib2dvARB"); - fp_glVertexAttrib3fvARB = (pfn_glVertexAttrib3fvARB)load("glVertexAttrib3fvARB"); - fp_glVertexAttrib3svARB = (pfn_glVertexAttrib3svARB)load("glVertexAttrib3svARB"); - fp_glVertexAttrib3dvARB = (pfn_glVertexAttrib3dvARB)load("glVertexAttrib3dvARB"); - fp_glVertexAttrib4fvARB = (pfn_glVertexAttrib4fvARB)load("glVertexAttrib4fvARB"); - fp_glVertexAttrib4svARB = (pfn_glVertexAttrib4svARB)load("glVertexAttrib4svARB"); - fp_glVertexAttrib4dvARB = (pfn_glVertexAttrib4dvARB)load("glVertexAttrib4dvARB"); - fp_glVertexAttrib4ivARB = (pfn_glVertexAttrib4ivARB)load("glVertexAttrib4ivARB"); - fp_glVertexAttrib4bvARB = (pfn_glVertexAttrib4bvARB)load("glVertexAttrib4bvARB"); - fp_glVertexAttrib4ubvARB = (pfn_glVertexAttrib4ubvARB)load("glVertexAttrib4ubvARB"); - fp_glVertexAttrib4usvARB = (pfn_glVertexAttrib4usvARB)load("glVertexAttrib4usvARB"); - fp_glVertexAttrib4uivARB = (pfn_glVertexAttrib4uivARB)load("glVertexAttrib4uivARB"); - fp_glVertexAttrib4NbvARB = (pfn_glVertexAttrib4NbvARB)load("glVertexAttrib4NbvARB"); - fp_glVertexAttrib4NsvARB = (pfn_glVertexAttrib4NsvARB)load("glVertexAttrib4NsvARB"); - fp_glVertexAttrib4NivARB = (pfn_glVertexAttrib4NivARB)load("glVertexAttrib4NivARB"); - fp_glVertexAttrib4NubvARB = (pfn_glVertexAttrib4NubvARB)load("glVertexAttrib4NubvARB"); - fp_glVertexAttrib4NusvARB = (pfn_glVertexAttrib4NusvARB)load("glVertexAttrib4NusvARB"); - fp_glVertexAttrib4NuivARB = (pfn_glVertexAttrib4NuivARB)load("glVertexAttrib4NuivARB"); - fp_glVertexAttribPointerARB = (pfn_glVertexAttribPointerARB)load("glVertexAttribPointerARB"); - fp_glEnableVertexAttribArrayARB = (pfn_glEnableVertexAttribArrayARB)load("glEnableVertexAttribArrayARB"); - fp_glDisableVertexAttribArrayARB = (pfn_glDisableVertexAttribArrayARB)load("glDisableVertexAttribArrayARB"); - fp_glBindAttribLocationARB = (pfn_glBindAttribLocationARB)load("glBindAttribLocationARB"); - fp_glGetActiveAttribARB = (pfn_glGetActiveAttribARB)load("glGetActiveAttribARB"); - fp_glGetAttribLocationARB = (pfn_glGetAttribLocationARB)load("glGetAttribLocationARB"); - fp_glGetVertexAttribdvARB = (pfn_glGetVertexAttribdvARB)load("glGetVertexAttribdvARB"); - fp_glGetVertexAttribfvARB = (pfn_glGetVertexAttribfvARB)load("glGetVertexAttribfvARB"); - fp_glGetVertexAttribivARB = (pfn_glGetVertexAttribivARB)load("glGetVertexAttribivARB"); - fp_glGetVertexAttribPointervARB = (pfn_glGetVertexAttribPointervARB)load("glGetVertexAttribPointervARB"); -} - GLboolean GLAD_ARB_vertex_type_10f_11f_11f_rev = GL_FALSE; GLboolean GLAD_ARB_vertex_type_2_10_10_10_rev = GL_FALSE; static void load_GL_ARB_vertex_type_2_10_10_10_rev(LOADER load) { @@ -4951,29 +4514,15 @@ static void load_GL_ARB_viewport_array(LOADER load) { fp_glGetDoublei_v = (pfn_glGetDoublei_v)load("glGetDoublei_v"); } -GLboolean GLAD_ARB_window_pos = GL_FALSE; -static void load_GL_ARB_window_pos(LOADER load) { - if(!GLAD_ARB_window_pos) return; - fp_glWindowPos2dARB = (pfn_glWindowPos2dARB)load("glWindowPos2dARB"); - fp_glWindowPos2dvARB = (pfn_glWindowPos2dvARB)load("glWindowPos2dvARB"); - fp_glWindowPos2fARB = (pfn_glWindowPos2fARB)load("glWindowPos2fARB"); - fp_glWindowPos2fvARB = (pfn_glWindowPos2fvARB)load("glWindowPos2fvARB"); - fp_glWindowPos2iARB = (pfn_glWindowPos2iARB)load("glWindowPos2iARB"); - fp_glWindowPos2ivARB = (pfn_glWindowPos2ivARB)load("glWindowPos2ivARB"); - fp_glWindowPos2sARB = (pfn_glWindowPos2sARB)load("glWindowPos2sARB"); - fp_glWindowPos2svARB = (pfn_glWindowPos2svARB)load("glWindowPos2svARB"); - fp_glWindowPos3dARB = (pfn_glWindowPos3dARB)load("glWindowPos3dARB"); - fp_glWindowPos3dvARB = (pfn_glWindowPos3dvARB)load("glWindowPos3dvARB"); - fp_glWindowPos3fARB = (pfn_glWindowPos3fARB)load("glWindowPos3fARB"); - fp_glWindowPos3fvARB = (pfn_glWindowPos3fvARB)load("glWindowPos3fvARB"); - fp_glWindowPos3iARB = (pfn_glWindowPos3iARB)load("glWindowPos3iARB"); - fp_glWindowPos3ivARB = (pfn_glWindowPos3ivARB)load("glWindowPos3ivARB"); - fp_glWindowPos3sARB = (pfn_glWindowPos3sARB)load("glWindowPos3sARB"); - fp_glWindowPos3svARB = (pfn_glWindowPos3svARB)load("glWindowPos3svARB"); +GLboolean GLAD_EXT_base_instance = GL_FALSE; +static void load_GL_EXT_base_instance(LOADER load) { + if(!GLAD_EXT_base_instance) return; + fp_glDrawArraysInstancedBaseInstanceEXT = (pfn_glDrawArraysInstancedBaseInstanceEXT)load("glDrawArraysInstancedBaseInstanceEXT"); + fp_glDrawElementsInstancedBaseInstanceEXT = (pfn_glDrawElementsInstancedBaseInstanceEXT)load("glDrawElementsInstancedBaseInstanceEXT"); + fp_glDrawElementsInstancedBaseVertexBaseInstanceEXT = (pfn_glDrawElementsInstancedBaseVertexBaseInstanceEXT)load("glDrawElementsInstancedBaseVertexBaseInstanceEXT"); } -GLboolean GLAD_EXT_422_pixels = GL_FALSE; -GLboolean GLAD_EXT_abgr = GL_FALSE; +GLboolean GLAD_EXT_bgra = GL_FALSE; GLboolean GLAD_EXT_bindable_uniform = GL_FALSE; static void load_GL_EXT_bindable_uniform(LOADER load) { if(!GLAD_EXT_bindable_uniform) return; @@ -4982,98 +4531,11 @@ static void load_GL_EXT_bindable_uniform(LOADER load) { fp_glGetUniformOffsetEXT = (pfn_glGetUniformOffsetEXT)load("glGetUniformOffsetEXT"); } -GLboolean GLAD_EXT_blend_color = GL_FALSE; -static void load_GL_EXT_blend_color(LOADER load) { - if(!GLAD_EXT_blend_color) return; - fp_glBlendColorEXT = (pfn_glBlendColorEXT)load("glBlendColorEXT"); -} - -GLboolean GLAD_EXT_blend_equation_separate = GL_FALSE; -static void load_GL_EXT_blend_equation_separate(LOADER load) { - if(!GLAD_EXT_blend_equation_separate) return; - fp_glBlendEquationSeparateEXT = (pfn_glBlendEquationSeparateEXT)load("glBlendEquationSeparateEXT"); -} - -GLboolean GLAD_EXT_blend_func_separate = GL_FALSE; -static void load_GL_EXT_blend_func_separate(LOADER load) { - if(!GLAD_EXT_blend_func_separate) return; - fp_glBlendFuncSeparateEXT = (pfn_glBlendFuncSeparateEXT)load("glBlendFuncSeparateEXT"); -} - -GLboolean GLAD_EXT_blend_minmax = GL_FALSE; -static void load_GL_EXT_blend_minmax(LOADER load) { - if(!GLAD_EXT_blend_minmax) return; - fp_glBlendEquationEXT = (pfn_glBlendEquationEXT)load("glBlendEquationEXT"); -} - -GLboolean GLAD_EXT_blend_subtract = GL_FALSE; -GLboolean GLAD_EXT_clip_volume_hint = GL_FALSE; -GLboolean GLAD_EXT_cmyka = GL_FALSE; GLboolean GLAD_EXT_color_buffer_half_float = GL_FALSE; -GLboolean GLAD_EXT_color_subtable = GL_FALSE; -static void load_GL_EXT_color_subtable(LOADER load) { - if(!GLAD_EXT_color_subtable) return; - fp_glColorSubTableEXT = (pfn_glColorSubTableEXT)load("glColorSubTableEXT"); - fp_glCopyColorSubTableEXT = (pfn_glCopyColorSubTableEXT)load("glCopyColorSubTableEXT"); -} - -GLboolean GLAD_EXT_compiled_vertex_array = GL_FALSE; -static void load_GL_EXT_compiled_vertex_array(LOADER load) { - if(!GLAD_EXT_compiled_vertex_array) return; - fp_glLockArraysEXT = (pfn_glLockArraysEXT)load("glLockArraysEXT"); - fp_glUnlockArraysEXT = (pfn_glUnlockArraysEXT)load("glUnlockArraysEXT"); -} - -GLboolean GLAD_EXT_convolution = GL_FALSE; -static void load_GL_EXT_convolution(LOADER load) { - if(!GLAD_EXT_convolution) return; - fp_glConvolutionFilter1DEXT = (pfn_glConvolutionFilter1DEXT)load("glConvolutionFilter1DEXT"); - fp_glConvolutionFilter2DEXT = (pfn_glConvolutionFilter2DEXT)load("glConvolutionFilter2DEXT"); - fp_glConvolutionParameterfEXT = (pfn_glConvolutionParameterfEXT)load("glConvolutionParameterfEXT"); - fp_glConvolutionParameterfvEXT = (pfn_glConvolutionParameterfvEXT)load("glConvolutionParameterfvEXT"); - fp_glConvolutionParameteriEXT = (pfn_glConvolutionParameteriEXT)load("glConvolutionParameteriEXT"); - fp_glConvolutionParameterivEXT = (pfn_glConvolutionParameterivEXT)load("glConvolutionParameterivEXT"); - fp_glCopyConvolutionFilter1DEXT = (pfn_glCopyConvolutionFilter1DEXT)load("glCopyConvolutionFilter1DEXT"); - fp_glCopyConvolutionFilter2DEXT = (pfn_glCopyConvolutionFilter2DEXT)load("glCopyConvolutionFilter2DEXT"); - fp_glGetConvolutionFilterEXT = (pfn_glGetConvolutionFilterEXT)load("glGetConvolutionFilterEXT"); - fp_glGetConvolutionParameterfvEXT = (pfn_glGetConvolutionParameterfvEXT)load("glGetConvolutionParameterfvEXT"); - fp_glGetConvolutionParameterivEXT = (pfn_glGetConvolutionParameterivEXT)load("glGetConvolutionParameterivEXT"); - fp_glGetSeparableFilterEXT = (pfn_glGetSeparableFilterEXT)load("glGetSeparableFilterEXT"); - fp_glSeparableFilter2DEXT = (pfn_glSeparableFilter2DEXT)load("glSeparableFilter2DEXT"); -} - -GLboolean GLAD_EXT_coordinate_frame = GL_FALSE; -static void load_GL_EXT_coordinate_frame(LOADER load) { - if(!GLAD_EXT_coordinate_frame) return; - fp_glTangent3bEXT = (pfn_glTangent3bEXT)load("glTangent3bEXT"); - fp_glTangent3bvEXT = (pfn_glTangent3bvEXT)load("glTangent3bvEXT"); - fp_glTangent3dEXT = (pfn_glTangent3dEXT)load("glTangent3dEXT"); - fp_glTangent3dvEXT = (pfn_glTangent3dvEXT)load("glTangent3dvEXT"); - fp_glTangent3fEXT = (pfn_glTangent3fEXT)load("glTangent3fEXT"); - fp_glTangent3fvEXT = (pfn_glTangent3fvEXT)load("glTangent3fvEXT"); - fp_glTangent3iEXT = (pfn_glTangent3iEXT)load("glTangent3iEXT"); - fp_glTangent3ivEXT = (pfn_glTangent3ivEXT)load("glTangent3ivEXT"); - fp_glTangent3sEXT = (pfn_glTangent3sEXT)load("glTangent3sEXT"); - fp_glTangent3svEXT = (pfn_glTangent3svEXT)load("glTangent3svEXT"); - fp_glBinormal3bEXT = (pfn_glBinormal3bEXT)load("glBinormal3bEXT"); - fp_glBinormal3bvEXT = (pfn_glBinormal3bvEXT)load("glBinormal3bvEXT"); - fp_glBinormal3dEXT = (pfn_glBinormal3dEXT)load("glBinormal3dEXT"); - fp_glBinormal3dvEXT = (pfn_glBinormal3dvEXT)load("glBinormal3dvEXT"); - fp_glBinormal3fEXT = (pfn_glBinormal3fEXT)load("glBinormal3fEXT"); - fp_glBinormal3fvEXT = (pfn_glBinormal3fvEXT)load("glBinormal3fvEXT"); - fp_glBinormal3iEXT = (pfn_glBinormal3iEXT)load("glBinormal3iEXT"); - fp_glBinormal3ivEXT = (pfn_glBinormal3ivEXT)load("glBinormal3ivEXT"); - fp_glBinormal3sEXT = (pfn_glBinormal3sEXT)load("glBinormal3sEXT"); - fp_glBinormal3svEXT = (pfn_glBinormal3svEXT)load("glBinormal3svEXT"); - fp_glTangentPointerEXT = (pfn_glTangentPointerEXT)load("glTangentPointerEXT"); - fp_glBinormalPointerEXT = (pfn_glBinormalPointerEXT)load("glBinormalPointerEXT"); -} - -GLboolean GLAD_EXT_cull_vertex = GL_FALSE; -static void load_GL_EXT_cull_vertex(LOADER load) { - if(!GLAD_EXT_cull_vertex) return; - fp_glCullParameterdvEXT = (pfn_glCullParameterdvEXT)load("glCullParameterdvEXT"); - fp_glCullParameterfvEXT = (pfn_glCullParameterfvEXT)load("glCullParameterfvEXT"); +GLboolean GLAD_EXT_copy_image = GL_FALSE; +static void load_GL_EXT_copy_image(LOADER load) { + if(!GLAD_EXT_copy_image) return; + fp_glCopyImageSubDataEXT = (pfn_glCopyImageSubDataEXT)load("glCopyImageSubDataEXT"); } GLboolean GLAD_EXT_debug_label = GL_FALSE; @@ -5091,12 +4553,6 @@ static void load_GL_EXT_debug_marker(LOADER load) { fp_glPopGroupMarkerEXT = (pfn_glPopGroupMarkerEXT)load("glPopGroupMarkerEXT"); } -GLboolean GLAD_EXT_depth_bounds_test = GL_FALSE; -static void load_GL_EXT_depth_bounds_test(LOADER load) { - if(!GLAD_EXT_depth_bounds_test) return; - fp_glDepthBoundsEXT = (pfn_glDepthBoundsEXT)load("glDepthBoundsEXT"); -} - GLboolean GLAD_EXT_direct_state_access = GL_FALSE; static void load_GL_EXT_direct_state_access(LOADER load) { if(!GLAD_EXT_direct_state_access) return; @@ -5396,6 +4852,28 @@ static void load_GL_EXT_draw_buffers2(LOADER load) { fp_glIsEnabledIndexedEXT = (pfn_glIsEnabledIndexedEXT)load("glIsEnabledIndexedEXT"); } +GLboolean GLAD_EXT_draw_buffers_indexed = GL_FALSE; +static void load_GL_EXT_draw_buffers_indexed(LOADER load) { + if(!GLAD_EXT_draw_buffers_indexed) return; + fp_glEnableiEXT = (pfn_glEnableiEXT)load("glEnableiEXT"); + fp_glDisableiEXT = (pfn_glDisableiEXT)load("glDisableiEXT"); + fp_glBlendEquationiEXT = (pfn_glBlendEquationiEXT)load("glBlendEquationiEXT"); + fp_glBlendEquationSeparateiEXT = (pfn_glBlendEquationSeparateiEXT)load("glBlendEquationSeparateiEXT"); + fp_glBlendFunciEXT = (pfn_glBlendFunciEXT)load("glBlendFunciEXT"); + fp_glBlendFuncSeparateiEXT = (pfn_glBlendFuncSeparateiEXT)load("glBlendFuncSeparateiEXT"); + fp_glColorMaskiEXT = (pfn_glColorMaskiEXT)load("glColorMaskiEXT"); + fp_glIsEnablediEXT = (pfn_glIsEnablediEXT)load("glIsEnablediEXT"); +} + +GLboolean GLAD_EXT_draw_elements_base_vertex = GL_FALSE; +static void load_GL_EXT_draw_elements_base_vertex(LOADER load) { + if(!GLAD_EXT_draw_elements_base_vertex) return; + fp_glDrawElementsBaseVertexEXT = (pfn_glDrawElementsBaseVertexEXT)load("glDrawElementsBaseVertexEXT"); + fp_glDrawRangeElementsBaseVertexEXT = (pfn_glDrawRangeElementsBaseVertexEXT)load("glDrawRangeElementsBaseVertexEXT"); + fp_glDrawElementsInstancedBaseVertexEXT = (pfn_glDrawElementsInstancedBaseVertexEXT)load("glDrawElementsInstancedBaseVertexEXT"); + fp_glMultiDrawElementsBaseVertexEXT = (pfn_glMultiDrawElementsBaseVertexEXT)load("glMultiDrawElementsBaseVertexEXT"); +} + GLboolean GLAD_EXT_draw_instanced = GL_FALSE; static void load_GL_EXT_draw_instanced(LOADER load) { if(!GLAD_EXT_draw_instanced) return; @@ -5403,16 +4881,6 @@ static void load_GL_EXT_draw_instanced(LOADER load) { fp_glDrawElementsInstancedEXT = (pfn_glDrawElementsInstancedEXT)load("glDrawElementsInstancedEXT"); } -GLboolean GLAD_EXT_fog_coord = GL_FALSE; -static void load_GL_EXT_fog_coord(LOADER load) { - if(!GLAD_EXT_fog_coord) return; - fp_glFogCoordfEXT = (pfn_glFogCoordfEXT)load("glFogCoordfEXT"); - fp_glFogCoordfvEXT = (pfn_glFogCoordfvEXT)load("glFogCoordfvEXT"); - fp_glFogCoorddEXT = (pfn_glFogCoorddEXT)load("glFogCoorddEXT"); - fp_glFogCoorddvEXT = (pfn_glFogCoorddvEXT)load("glFogCoorddvEXT"); - fp_glFogCoordPointerEXT = (pfn_glFogCoordPointerEXT)load("glFogCoordPointerEXT"); -} - GLboolean GLAD_EXT_framebuffer_blit = GL_FALSE; static void load_GL_EXT_framebuffer_blit(LOADER load) { if(!GLAD_EXT_framebuffer_blit) return; @@ -5449,6 +4917,13 @@ static void load_GL_EXT_framebuffer_object(LOADER load) { } GLboolean GLAD_EXT_framebuffer_sRGB = GL_FALSE; +GLboolean GLAD_EXT_geometry_point_size = GL_FALSE; +GLboolean GLAD_EXT_geometry_shader = GL_FALSE; +static void load_GL_EXT_geometry_shader(LOADER load) { + if(!GLAD_EXT_geometry_shader) return; + fp_glFramebufferTextureEXT = (pfn_glFramebufferTextureEXT)load("glFramebufferTextureEXT"); +} + GLboolean GLAD_EXT_geometry_shader4 = GL_FALSE; static void load_GL_EXT_geometry_shader4(LOADER load) { if(!GLAD_EXT_geometry_shader4) return; @@ -5478,35 +4953,7 @@ static void load_GL_EXT_gpu_shader4(LOADER load) { fp_glUniform4uivEXT = (pfn_glUniform4uivEXT)load("glUniform4uivEXT"); } -GLboolean GLAD_EXT_histogram = GL_FALSE; -static void load_GL_EXT_histogram(LOADER load) { - if(!GLAD_EXT_histogram) return; - fp_glGetHistogramEXT = (pfn_glGetHistogramEXT)load("glGetHistogramEXT"); - fp_glGetHistogramParameterfvEXT = (pfn_glGetHistogramParameterfvEXT)load("glGetHistogramParameterfvEXT"); - fp_glGetHistogramParameterivEXT = (pfn_glGetHistogramParameterivEXT)load("glGetHistogramParameterivEXT"); - fp_glGetMinmaxEXT = (pfn_glGetMinmaxEXT)load("glGetMinmaxEXT"); - fp_glGetMinmaxParameterfvEXT = (pfn_glGetMinmaxParameterfvEXT)load("glGetMinmaxParameterfvEXT"); - fp_glGetMinmaxParameterivEXT = (pfn_glGetMinmaxParameterivEXT)load("glGetMinmaxParameterivEXT"); - fp_glHistogramEXT = (pfn_glHistogramEXT)load("glHistogramEXT"); - fp_glMinmaxEXT = (pfn_glMinmaxEXT)load("glMinmaxEXT"); - fp_glResetHistogramEXT = (pfn_glResetHistogramEXT)load("glResetHistogramEXT"); - fp_glResetMinmaxEXT = (pfn_glResetMinmaxEXT)load("glResetMinmaxEXT"); -} - -GLboolean GLAD_EXT_index_array_formats = GL_FALSE; -GLboolean GLAD_EXT_index_func = GL_FALSE; -static void load_GL_EXT_index_func(LOADER load) { - if(!GLAD_EXT_index_func) return; - fp_glIndexFuncEXT = (pfn_glIndexFuncEXT)load("glIndexFuncEXT"); -} - -GLboolean GLAD_EXT_index_material = GL_FALSE; -static void load_GL_EXT_index_material(LOADER load) { - if(!GLAD_EXT_index_material) return; - fp_glIndexMaterialEXT = (pfn_glIndexMaterialEXT)load("glIndexMaterialEXT"); -} - -GLboolean GLAD_EXT_index_texture = GL_FALSE; +GLboolean GLAD_EXT_gpu_shader5 = GL_FALSE; GLboolean GLAD_EXT_instanced_arrays = GL_FALSE; static void load_GL_EXT_instanced_arrays(LOADER load) { if(!GLAD_EXT_instanced_arrays) return; @@ -5515,14 +4962,6 @@ static void load_GL_EXT_instanced_arrays(LOADER load) { fp_glVertexAttribDivisorEXT = (pfn_glVertexAttribDivisorEXT)load("glVertexAttribDivisorEXT"); } -GLboolean GLAD_EXT_light_texture = GL_FALSE; -static void load_GL_EXT_light_texture(LOADER load) { - if(!GLAD_EXT_light_texture) return; - fp_glApplyTextureEXT = (pfn_glApplyTextureEXT)load("glApplyTextureEXT"); - fp_glTextureLightEXT = (pfn_glTextureLightEXT)load("glTextureLightEXT"); - fp_glTextureMaterialEXT = (pfn_glTextureMaterialEXT)load("glTextureMaterialEXT"); -} - GLboolean GLAD_EXT_map_buffer_range = GL_FALSE; static void load_GL_EXT_map_buffer_range(LOADER load) { if(!GLAD_EXT_map_buffer_range) return; @@ -5530,19 +4969,11 @@ static void load_GL_EXT_map_buffer_range(LOADER load) { fp_glFlushMappedBufferRangeEXT = (pfn_glFlushMappedBufferRangeEXT)load("glFlushMappedBufferRangeEXT"); } -GLboolean GLAD_EXT_misc_attribute = GL_FALSE; -GLboolean GLAD_EXT_multi_draw_arrays = GL_FALSE; -static void load_GL_EXT_multi_draw_arrays(LOADER load) { - if(!GLAD_EXT_multi_draw_arrays) return; - fp_glMultiDrawArraysEXT = (pfn_glMultiDrawArraysEXT)load("glMultiDrawArraysEXT"); - fp_glMultiDrawElementsEXT = (pfn_glMultiDrawElementsEXT)load("glMultiDrawElementsEXT"); -} - -GLboolean GLAD_EXT_multisample = GL_FALSE; -static void load_GL_EXT_multisample(LOADER load) { - if(!GLAD_EXT_multisample) return; - fp_glSampleMaskEXT = (pfn_glSampleMaskEXT)load("glSampleMaskEXT"); - fp_glSamplePatternEXT = (pfn_glSamplePatternEXT)load("glSamplePatternEXT"); +GLboolean GLAD_EXT_multi_draw_indirect = GL_FALSE; +static void load_GL_EXT_multi_draw_indirect(LOADER load) { + if(!GLAD_EXT_multi_draw_indirect) return; + fp_glMultiDrawArraysIndirectEXT = (pfn_glMultiDrawArraysIndirectEXT)load("glMultiDrawArraysIndirectEXT"); + fp_glMultiDrawElementsIndirectEXT = (pfn_glMultiDrawElementsIndirectEXT)load("glMultiDrawElementsIndirectEXT"); } GLboolean GLAD_EXT_multisampled_render_to_texture = GL_FALSE; @@ -5574,33 +5005,18 @@ static void load_GL_EXT_occlusion_query_boolean(LOADER load) { GLboolean GLAD_EXT_packed_depth_stencil = GL_FALSE; GLboolean GLAD_EXT_packed_float = GL_FALSE; -GLboolean GLAD_EXT_paletted_texture = GL_FALSE; -static void load_GL_EXT_paletted_texture(LOADER load) { - if(!GLAD_EXT_paletted_texture) return; - fp_glColorTableEXT = (pfn_glColorTableEXT)load("glColorTableEXT"); - fp_glGetColorTableEXT = (pfn_glGetColorTableEXT)load("glGetColorTableEXT"); - fp_glGetColorTableParameterivEXT = (pfn_glGetColorTableParameterivEXT)load("glGetColorTableParameterivEXT"); - fp_glGetColorTableParameterfvEXT = (pfn_glGetColorTableParameterfvEXT)load("glGetColorTableParameterfvEXT"); -} - GLboolean GLAD_EXT_pixel_buffer_object = GL_FALSE; -GLboolean GLAD_EXT_pixel_transform = GL_FALSE; -static void load_GL_EXT_pixel_transform(LOADER load) { - if(!GLAD_EXT_pixel_transform) return; - fp_glPixelTransformParameteriEXT = (pfn_glPixelTransformParameteriEXT)load("glPixelTransformParameteriEXT"); - fp_glPixelTransformParameterfEXT = (pfn_glPixelTransformParameterfEXT)load("glPixelTransformParameterfEXT"); - fp_glPixelTransformParameterivEXT = (pfn_glPixelTransformParameterivEXT)load("glPixelTransformParameterivEXT"); - fp_glPixelTransformParameterfvEXT = (pfn_glPixelTransformParameterfvEXT)load("glPixelTransformParameterfvEXT"); - fp_glGetPixelTransformParameterivEXT = (pfn_glGetPixelTransformParameterivEXT)load("glGetPixelTransformParameterivEXT"); - fp_glGetPixelTransformParameterfvEXT = (pfn_glGetPixelTransformParameterfvEXT)load("glGetPixelTransformParameterfvEXT"); +GLboolean GLAD_EXT_polygon_offset_clamp = GL_FALSE; +static void load_GL_EXT_polygon_offset_clamp(LOADER load) { + if(!GLAD_EXT_polygon_offset_clamp) return; + fp_glPolygonOffsetClampEXT = (pfn_glPolygonOffsetClampEXT)load("glPolygonOffsetClampEXT"); } -GLboolean GLAD_EXT_pixel_transform_color_table = GL_FALSE; -GLboolean GLAD_EXT_point_parameters = GL_FALSE; -static void load_GL_EXT_point_parameters(LOADER load) { - if(!GLAD_EXT_point_parameters) return; - fp_glPointParameterfEXT = (pfn_glPointParameterfEXT)load("glPointParameterfEXT"); - fp_glPointParameterfvEXT = (pfn_glPointParameterfvEXT)load("glPointParameterfvEXT"); +GLboolean GLAD_EXT_post_depth_coverage = GL_FALSE; +GLboolean GLAD_EXT_primitive_bounding_box = GL_FALSE; +static void load_GL_EXT_primitive_bounding_box(LOADER load) { + if(!GLAD_EXT_primitive_bounding_box) return; + fp_glPrimitiveBoundingBoxEXT = (pfn_glPrimitiveBoundingBoxEXT)load("glPrimitiveBoundingBoxEXT"); } GLboolean GLAD_EXT_provoking_vertex = GL_FALSE; @@ -5610,7 +5026,14 @@ static void load_GL_EXT_provoking_vertex(LOADER load) { } GLboolean GLAD_EXT_pvrtc_sRGB = GL_FALSE; +GLboolean GLAD_EXT_raster_multisample = GL_FALSE; +static void load_GL_EXT_raster_multisample(LOADER load) { + if(!GLAD_EXT_raster_multisample) return; + fp_glRasterSamplesEXT = (pfn_glRasterSamplesEXT)load("glRasterSamplesEXT"); +} + GLboolean GLAD_EXT_read_format_bgra = GL_FALSE; +GLboolean GLAD_EXT_render_snorm = GL_FALSE; GLboolean GLAD_EXT_robustness = GL_FALSE; static void load_GL_EXT_robustness(LOADER load) { if(!GLAD_EXT_robustness) return; @@ -5620,28 +5043,6 @@ static void load_GL_EXT_robustness(LOADER load) { fp_glGetnUniformivEXT = (pfn_glGetnUniformivEXT)load("glGetnUniformivEXT"); } -GLboolean GLAD_EXT_secondary_color = GL_FALSE; -static void load_GL_EXT_secondary_color(LOADER load) { - if(!GLAD_EXT_secondary_color) return; - fp_glSecondaryColor3bEXT = (pfn_glSecondaryColor3bEXT)load("glSecondaryColor3bEXT"); - fp_glSecondaryColor3bvEXT = (pfn_glSecondaryColor3bvEXT)load("glSecondaryColor3bvEXT"); - fp_glSecondaryColor3dEXT = (pfn_glSecondaryColor3dEXT)load("glSecondaryColor3dEXT"); - fp_glSecondaryColor3dvEXT = (pfn_glSecondaryColor3dvEXT)load("glSecondaryColor3dvEXT"); - fp_glSecondaryColor3fEXT = (pfn_glSecondaryColor3fEXT)load("glSecondaryColor3fEXT"); - fp_glSecondaryColor3fvEXT = (pfn_glSecondaryColor3fvEXT)load("glSecondaryColor3fvEXT"); - fp_glSecondaryColor3iEXT = (pfn_glSecondaryColor3iEXT)load("glSecondaryColor3iEXT"); - fp_glSecondaryColor3ivEXT = (pfn_glSecondaryColor3ivEXT)load("glSecondaryColor3ivEXT"); - fp_glSecondaryColor3sEXT = (pfn_glSecondaryColor3sEXT)load("glSecondaryColor3sEXT"); - fp_glSecondaryColor3svEXT = (pfn_glSecondaryColor3svEXT)load("glSecondaryColor3svEXT"); - fp_glSecondaryColor3ubEXT = (pfn_glSecondaryColor3ubEXT)load("glSecondaryColor3ubEXT"); - fp_glSecondaryColor3ubvEXT = (pfn_glSecondaryColor3ubvEXT)load("glSecondaryColor3ubvEXT"); - fp_glSecondaryColor3uiEXT = (pfn_glSecondaryColor3uiEXT)load("glSecondaryColor3uiEXT"); - fp_glSecondaryColor3uivEXT = (pfn_glSecondaryColor3uivEXT)load("glSecondaryColor3uivEXT"); - fp_glSecondaryColor3usEXT = (pfn_glSecondaryColor3usEXT)load("glSecondaryColor3usEXT"); - fp_glSecondaryColor3usvEXT = (pfn_glSecondaryColor3usvEXT)load("glSecondaryColor3usvEXT"); - fp_glSecondaryColorPointerEXT = (pfn_glSecondaryColorPointerEXT)load("glSecondaryColorPointerEXT"); -} - GLboolean GLAD_EXT_separate_shader_objects = GL_FALSE; static void load_GL_EXT_separate_shader_objects(LOADER load) { if(!GLAD_EXT_separate_shader_objects) return; @@ -5696,6 +5097,7 @@ static void load_GL_EXT_separate_shader_objects(LOADER load) { } GLboolean GLAD_EXT_shader_framebuffer_fetch = GL_FALSE; +GLboolean GLAD_EXT_shader_image_load_formatted = GL_FALSE; GLboolean GLAD_EXT_shader_image_load_store = GL_FALSE; static void load_GL_EXT_shader_image_load_store(LOADER load) { if(!GLAD_EXT_shader_image_load_store) return; @@ -5703,11 +5105,13 @@ static void load_GL_EXT_shader_image_load_store(LOADER load) { fp_glMemoryBarrierEXT = (pfn_glMemoryBarrierEXT)load("glMemoryBarrierEXT"); } +GLboolean GLAD_EXT_shader_implicit_conversions = GL_FALSE; GLboolean GLAD_EXT_shader_integer_mix = GL_FALSE; +GLboolean GLAD_EXT_shader_io_blocks = GL_FALSE; +GLboolean GLAD_EXT_shader_pixel_local_storage = GL_FALSE; GLboolean GLAD_EXT_shader_texture_lod = GL_FALSE; -GLboolean GLAD_EXT_shadow_funcs = GL_FALSE; GLboolean GLAD_EXT_shadow_samplers = GL_FALSE; -GLboolean GLAD_EXT_shared_texture_palette = GL_FALSE; +GLboolean GLAD_EXT_sparse_texture2 = GL_FALSE; GLboolean GLAD_EXT_sRGB = GL_FALSE; GLboolean GLAD_EXT_sRGB_write_control = GL_FALSE; GLboolean GLAD_EXT_stencil_clear_tag = GL_FALSE; @@ -5716,14 +5120,39 @@ static void load_GL_EXT_stencil_clear_tag(LOADER load) { fp_glStencilClearTagEXT = (pfn_glStencilClearTagEXT)load("glStencilClearTagEXT"); } -GLboolean GLAD_EXT_stencil_two_side = GL_FALSE; -static void load_GL_EXT_stencil_two_side(LOADER load) { - if(!GLAD_EXT_stencil_two_side) return; - fp_glActiveStencilFaceEXT = (pfn_glActiveStencilFaceEXT)load("glActiveStencilFaceEXT"); +GLboolean GLAD_EXT_tessellation_point_size = GL_FALSE; +GLboolean GLAD_EXT_tessellation_shader = GL_FALSE; +static void load_GL_EXT_tessellation_shader(LOADER load) { + if(!GLAD_EXT_tessellation_shader) return; + fp_glPatchParameteriEXT = (pfn_glPatchParameteriEXT)load("glPatchParameteriEXT"); } -GLboolean GLAD_EXT_stencil_wrap = GL_FALSE; GLboolean GLAD_EXT_texture_array = GL_FALSE; +static void load_GL_EXT_texture_array(LOADER load) { + if(!GLAD_EXT_texture_array) return; + fp_glFramebufferTextureLayerEXT = (pfn_glFramebufferTextureLayerEXT)load("glFramebufferTextureLayerEXT"); +} + +GLboolean GLAD_EXT_texture_border_clamp = GL_FALSE; +static void load_GL_EXT_texture_border_clamp(LOADER load) { + if(!GLAD_EXT_texture_border_clamp) return; + fp_glTexParameterIivEXT = (pfn_glTexParameterIivEXT)load("glTexParameterIivEXT"); + fp_glTexParameterIuivEXT = (pfn_glTexParameterIuivEXT)load("glTexParameterIuivEXT"); + fp_glGetTexParameterIivEXT = (pfn_glGetTexParameterIivEXT)load("glGetTexParameterIivEXT"); + fp_glGetTexParameterIuivEXT = (pfn_glGetTexParameterIuivEXT)load("glGetTexParameterIuivEXT"); + fp_glSamplerParameterIivEXT = (pfn_glSamplerParameterIivEXT)load("glSamplerParameterIivEXT"); + fp_glSamplerParameterIuivEXT = (pfn_glSamplerParameterIuivEXT)load("glSamplerParameterIuivEXT"); + fp_glGetSamplerParameterIivEXT = (pfn_glGetSamplerParameterIivEXT)load("glGetSamplerParameterIivEXT"); + fp_glGetSamplerParameterIuivEXT = (pfn_glGetSamplerParameterIuivEXT)load("glGetSamplerParameterIuivEXT"); +} + +GLboolean GLAD_EXT_texture_buffer = GL_FALSE; +static void load_GL_EXT_texture_buffer(LOADER load) { + if(!GLAD_EXT_texture_buffer) return; + fp_glTexBufferEXT = (pfn_glTexBufferEXT)load("glTexBufferEXT"); + fp_glTexBufferRangeEXT = (pfn_glTexBufferRangeEXT)load("glTexBufferRangeEXT"); +} + GLboolean GLAD_EXT_texture_buffer_object = GL_FALSE; static void load_GL_EXT_texture_buffer_object(LOADER load) { if(!GLAD_EXT_texture_buffer_object) return; @@ -5735,10 +5164,14 @@ GLboolean GLAD_EXT_texture_compression_latc = GL_FALSE; GLboolean GLAD_EXT_texture_compression_rgtc = GL_FALSE; GLboolean GLAD_EXT_texture_compression_s3tc = GL_FALSE; GLboolean GLAD_EXT_texture_cube_map = GL_FALSE; -GLboolean GLAD_EXT_texture_env_add = GL_FALSE; -GLboolean GLAD_EXT_texture_env_combine = GL_FALSE; -GLboolean GLAD_EXT_texture_env_dot3 = GL_FALSE; +GLboolean GLAD_EXT_texture_cube_map_array = GL_FALSE; GLboolean GLAD_EXT_texture_filter_anisotropic = GL_FALSE; +GLboolean GLAD_EXT_texture_filter_minmax = GL_FALSE; +static void load_GL_EXT_texture_filter_minmax(LOADER load) { + if(!GLAD_EXT_texture_filter_minmax) return; + fp_glRasterSamplesEXT = (pfn_glRasterSamplesEXT)load("glRasterSamplesEXT"); +} + GLboolean GLAD_EXT_texture_format_BGRA8888 = GL_FALSE; GLboolean GLAD_EXT_texture_integer = GL_FALSE; static void load_GL_EXT_texture_integer(LOADER load) { @@ -5751,19 +5184,14 @@ static void load_GL_EXT_texture_integer(LOADER load) { fp_glClearColorIuiEXT = (pfn_glClearColorIuiEXT)load("glClearColorIuiEXT"); } -GLboolean GLAD_EXT_texture_lod_bias = GL_FALSE; -GLboolean GLAD_EXT_texture_mirror_clamp = GL_FALSE; -GLboolean GLAD_EXT_texture_perturb_normal = GL_FALSE; -static void load_GL_EXT_texture_perturb_normal(LOADER load) { - if(!GLAD_EXT_texture_perturb_normal) return; - fp_glTextureNormalEXT = (pfn_glTextureNormalEXT)load("glTextureNormalEXT"); -} - +GLboolean GLAD_EXT_texture_norm16 = GL_FALSE; GLboolean GLAD_EXT_texture_rg = GL_FALSE; GLboolean GLAD_EXT_texture_shared_exponent = GL_FALSE; GLboolean GLAD_EXT_texture_snorm = GL_FALSE; GLboolean GLAD_EXT_texture_sRGB = GL_FALSE; GLboolean GLAD_EXT_texture_sRGB_decode = GL_FALSE; +GLboolean GLAD_EXT_texture_sRGB_R8 = GL_FALSE; +GLboolean GLAD_EXT_texture_sRGB_RG8 = GL_FALSE; GLboolean GLAD_EXT_texture_storage = GL_FALSE; static void load_GL_EXT_texture_storage(LOADER load) { if(!GLAD_EXT_texture_storage) return; @@ -5777,6 +5205,12 @@ static void load_GL_EXT_texture_storage(LOADER load) { GLboolean GLAD_EXT_texture_swizzle = GL_FALSE; GLboolean GLAD_EXT_texture_type_2_10_10_10_REV = GL_FALSE; +GLboolean GLAD_EXT_texture_view = GL_FALSE; +static void load_GL_EXT_texture_view(LOADER load) { + if(!GLAD_EXT_texture_view) return; + fp_glTextureViewEXT = (pfn_glTextureViewEXT)load("glTextureViewEXT"); +} + GLboolean GLAD_EXT_timer_query = GL_FALSE; static void load_GL_EXT_timer_query(LOADER load) { if(!GLAD_EXT_timer_query) return; @@ -5813,99 +5247,46 @@ static void load_GL_EXT_vertex_attrib_64bit(LOADER load) { fp_glGetVertexAttribLdvEXT = (pfn_glGetVertexAttribLdvEXT)load("glGetVertexAttribLdvEXT"); } -GLboolean GLAD_EXT_vertex_shader = GL_FALSE; -static void load_GL_EXT_vertex_shader(LOADER load) { - if(!GLAD_EXT_vertex_shader) return; - fp_glBeginVertexShaderEXT = (pfn_glBeginVertexShaderEXT)load("glBeginVertexShaderEXT"); - fp_glEndVertexShaderEXT = (pfn_glEndVertexShaderEXT)load("glEndVertexShaderEXT"); - fp_glBindVertexShaderEXT = (pfn_glBindVertexShaderEXT)load("glBindVertexShaderEXT"); - fp_glGenVertexShadersEXT = (pfn_glGenVertexShadersEXT)load("glGenVertexShadersEXT"); - fp_glDeleteVertexShaderEXT = (pfn_glDeleteVertexShaderEXT)load("glDeleteVertexShaderEXT"); - fp_glShaderOp1EXT = (pfn_glShaderOp1EXT)load("glShaderOp1EXT"); - fp_glShaderOp2EXT = (pfn_glShaderOp2EXT)load("glShaderOp2EXT"); - fp_glShaderOp3EXT = (pfn_glShaderOp3EXT)load("glShaderOp3EXT"); - fp_glSwizzleEXT = (pfn_glSwizzleEXT)load("glSwizzleEXT"); - fp_glWriteMaskEXT = (pfn_glWriteMaskEXT)load("glWriteMaskEXT"); - fp_glInsertComponentEXT = (pfn_glInsertComponentEXT)load("glInsertComponentEXT"); - fp_glExtractComponentEXT = (pfn_glExtractComponentEXT)load("glExtractComponentEXT"); - fp_glGenSymbolsEXT = (pfn_glGenSymbolsEXT)load("glGenSymbolsEXT"); - fp_glSetInvariantEXT = (pfn_glSetInvariantEXT)load("glSetInvariantEXT"); - fp_glSetLocalConstantEXT = (pfn_glSetLocalConstantEXT)load("glSetLocalConstantEXT"); - fp_glVariantbvEXT = (pfn_glVariantbvEXT)load("glVariantbvEXT"); - fp_glVariantsvEXT = (pfn_glVariantsvEXT)load("glVariantsvEXT"); - fp_glVariantivEXT = (pfn_glVariantivEXT)load("glVariantivEXT"); - fp_glVariantfvEXT = (pfn_glVariantfvEXT)load("glVariantfvEXT"); - fp_glVariantdvEXT = (pfn_glVariantdvEXT)load("glVariantdvEXT"); - fp_glVariantubvEXT = (pfn_glVariantubvEXT)load("glVariantubvEXT"); - fp_glVariantusvEXT = (pfn_glVariantusvEXT)load("glVariantusvEXT"); - fp_glVariantuivEXT = (pfn_glVariantuivEXT)load("glVariantuivEXT"); - fp_glVariantPointerEXT = (pfn_glVariantPointerEXT)load("glVariantPointerEXT"); - fp_glEnableVariantClientStateEXT = (pfn_glEnableVariantClientStateEXT)load("glEnableVariantClientStateEXT"); - fp_glDisableVariantClientStateEXT = (pfn_glDisableVariantClientStateEXT)load("glDisableVariantClientStateEXT"); - fp_glBindLightParameterEXT = (pfn_glBindLightParameterEXT)load("glBindLightParameterEXT"); - fp_glBindMaterialParameterEXT = (pfn_glBindMaterialParameterEXT)load("glBindMaterialParameterEXT"); - fp_glBindTexGenParameterEXT = (pfn_glBindTexGenParameterEXT)load("glBindTexGenParameterEXT"); - fp_glBindTextureUnitParameterEXT = (pfn_glBindTextureUnitParameterEXT)load("glBindTextureUnitParameterEXT"); - fp_glBindParameterEXT = (pfn_glBindParameterEXT)load("glBindParameterEXT"); - fp_glIsVariantEnabledEXT = (pfn_glIsVariantEnabledEXT)load("glIsVariantEnabledEXT"); - fp_glGetVariantBooleanvEXT = (pfn_glGetVariantBooleanvEXT)load("glGetVariantBooleanvEXT"); - fp_glGetVariantIntegervEXT = (pfn_glGetVariantIntegervEXT)load("glGetVariantIntegervEXT"); - fp_glGetVariantFloatvEXT = (pfn_glGetVariantFloatvEXT)load("glGetVariantFloatvEXT"); - fp_glGetVariantPointervEXT = (pfn_glGetVariantPointervEXT)load("glGetVariantPointervEXT"); - fp_glGetInvariantBooleanvEXT = (pfn_glGetInvariantBooleanvEXT)load("glGetInvariantBooleanvEXT"); - fp_glGetInvariantIntegervEXT = (pfn_glGetInvariantIntegervEXT)load("glGetInvariantIntegervEXT"); - fp_glGetInvariantFloatvEXT = (pfn_glGetInvariantFloatvEXT)load("glGetInvariantFloatvEXT"); - fp_glGetLocalConstantBooleanvEXT = (pfn_glGetLocalConstantBooleanvEXT)load("glGetLocalConstantBooleanvEXT"); - fp_glGetLocalConstantIntegervEXT = (pfn_glGetLocalConstantIntegervEXT)load("glGetLocalConstantIntegervEXT"); - fp_glGetLocalConstantFloatvEXT = (pfn_glGetLocalConstantFloatvEXT)load("glGetLocalConstantFloatvEXT"); -} - -GLboolean GLAD_EXT_vertex_weighting = GL_FALSE; -static void load_GL_EXT_vertex_weighting(LOADER load) { - if(!GLAD_EXT_vertex_weighting) return; - fp_glVertexWeightfEXT = (pfn_glVertexWeightfEXT)load("glVertexWeightfEXT"); - fp_glVertexWeightfvEXT = (pfn_glVertexWeightfvEXT)load("glVertexWeightfvEXT"); - fp_glVertexWeightPointerEXT = (pfn_glVertexWeightPointerEXT)load("glVertexWeightPointerEXT"); -} - GLboolean GLAD_EXT_x11_sync_object = GL_FALSE; static void load_GL_EXT_x11_sync_object(LOADER load) { if(!GLAD_EXT_x11_sync_object) return; fp_glImportSyncEXT = (pfn_glImportSyncEXT)load("glImportSyncEXT"); } -GLboolean GLAD_OES_byte_coordinates = GL_FALSE; -static void load_GL_OES_byte_coordinates(LOADER load) { - if(!GLAD_OES_byte_coordinates) return; - fp_glMultiTexCoord1bOES = (pfn_glMultiTexCoord1bOES)load("glMultiTexCoord1bOES"); - fp_glMultiTexCoord1bvOES = (pfn_glMultiTexCoord1bvOES)load("glMultiTexCoord1bvOES"); - fp_glMultiTexCoord2bOES = (pfn_glMultiTexCoord2bOES)load("glMultiTexCoord2bOES"); - fp_glMultiTexCoord2bvOES = (pfn_glMultiTexCoord2bvOES)load("glMultiTexCoord2bvOES"); - fp_glMultiTexCoord3bOES = (pfn_glMultiTexCoord3bOES)load("glMultiTexCoord3bOES"); - fp_glMultiTexCoord3bvOES = (pfn_glMultiTexCoord3bvOES)load("glMultiTexCoord3bvOES"); - fp_glMultiTexCoord4bOES = (pfn_glMultiTexCoord4bOES)load("glMultiTexCoord4bOES"); - fp_glMultiTexCoord4bvOES = (pfn_glMultiTexCoord4bvOES)load("glMultiTexCoord4bvOES"); - fp_glTexCoord1bOES = (pfn_glTexCoord1bOES)load("glTexCoord1bOES"); - fp_glTexCoord1bvOES = (pfn_glTexCoord1bvOES)load("glTexCoord1bvOES"); - fp_glTexCoord2bOES = (pfn_glTexCoord2bOES)load("glTexCoord2bOES"); - fp_glTexCoord2bvOES = (pfn_glTexCoord2bvOES)load("glTexCoord2bvOES"); - fp_glTexCoord3bOES = (pfn_glTexCoord3bOES)load("glTexCoord3bOES"); - fp_glTexCoord3bvOES = (pfn_glTexCoord3bvOES)load("glTexCoord3bvOES"); - fp_glTexCoord4bOES = (pfn_glTexCoord4bOES)load("glTexCoord4bOES"); - fp_glTexCoord4bvOES = (pfn_glTexCoord4bvOES)load("glTexCoord4bvOES"); - fp_glVertex2bOES = (pfn_glVertex2bOES)load("glVertex2bOES"); - fp_glVertex2bvOES = (pfn_glVertex2bvOES)load("glVertex2bvOES"); - fp_glVertex3bOES = (pfn_glVertex3bOES)load("glVertex3bOES"); - fp_glVertex3bvOES = (pfn_glVertex3bvOES)load("glVertex3bvOES"); - fp_glVertex4bOES = (pfn_glVertex4bOES)load("glVertex4bOES"); - fp_glVertex4bvOES = (pfn_glVertex4bvOES)load("glVertex4bvOES"); +GLboolean GLAD_EXT_YUV_target = GL_FALSE; +GLboolean GLAD_OES_compressed_ETC1_RGB8_sub_texture = GL_FALSE; +GLboolean GLAD_OES_compressed_ETC1_RGB8_texture = GL_FALSE; +GLboolean GLAD_OES_copy_image = GL_FALSE; +static void load_GL_OES_copy_image(LOADER load) { + if(!GLAD_OES_copy_image) return; + fp_glCopyImageSubDataOES = (pfn_glCopyImageSubDataOES)load("glCopyImageSubDataOES"); } -GLboolean GLAD_OES_compressed_ETC1_RGB8_texture = GL_FALSE; -GLboolean GLAD_OES_compressed_paletted_texture = GL_FALSE; GLboolean GLAD_OES_depth24 = GL_FALSE; GLboolean GLAD_OES_depth32 = GL_FALSE; GLboolean GLAD_OES_depth_texture = GL_FALSE; +GLboolean GLAD_OES_draw_buffers_indexed = GL_FALSE; +static void load_GL_OES_draw_buffers_indexed(LOADER load) { + if(!GLAD_OES_draw_buffers_indexed) return; + fp_glEnableiOES = (pfn_glEnableiOES)load("glEnableiOES"); + fp_glDisableiOES = (pfn_glDisableiOES)load("glDisableiOES"); + fp_glBlendEquationiOES = (pfn_glBlendEquationiOES)load("glBlendEquationiOES"); + fp_glBlendEquationSeparateiOES = (pfn_glBlendEquationSeparateiOES)load("glBlendEquationSeparateiOES"); + fp_glBlendFunciOES = (pfn_glBlendFunciOES)load("glBlendFunciOES"); + fp_glBlendFuncSeparateiOES = (pfn_glBlendFuncSeparateiOES)load("glBlendFuncSeparateiOES"); + fp_glColorMaskiOES = (pfn_glColorMaskiOES)load("glColorMaskiOES"); + fp_glIsEnablediOES = (pfn_glIsEnablediOES)load("glIsEnablediOES"); +} + +GLboolean GLAD_OES_draw_elements_base_vertex = GL_FALSE; +static void load_GL_OES_draw_elements_base_vertex(LOADER load) { + if(!GLAD_OES_draw_elements_base_vertex) return; + fp_glDrawElementsBaseVertexOES = (pfn_glDrawElementsBaseVertexOES)load("glDrawElementsBaseVertexOES"); + fp_glDrawRangeElementsBaseVertexOES = (pfn_glDrawRangeElementsBaseVertexOES)load("glDrawRangeElementsBaseVertexOES"); + fp_glDrawElementsInstancedBaseVertexOES = (pfn_glDrawElementsInstancedBaseVertexOES)load("glDrawElementsInstancedBaseVertexOES"); + fp_glMultiDrawElementsBaseVertexOES = (pfn_glMultiDrawElementsBaseVertexOES)load("glMultiDrawElementsBaseVertexOES"); +} + GLboolean GLAD_OES_EGL_image = GL_FALSE; static void load_GL_OES_EGL_image(LOADER load) { if(!GLAD_OES_EGL_image) return; @@ -5914,122 +5295,17 @@ static void load_GL_OES_EGL_image(LOADER load) { } GLboolean GLAD_OES_EGL_image_external = GL_FALSE; +GLboolean GLAD_OES_EGL_image_external_essl3 = GL_FALSE; GLboolean GLAD_OES_element_index_uint = GL_FALSE; GLboolean GLAD_OES_fbo_render_mipmap = GL_FALSE; -GLboolean GLAD_OES_fixed_point = GL_FALSE; -static void load_GL_OES_fixed_point(LOADER load) { - if(!GLAD_OES_fixed_point) return; - fp_glAlphaFuncxOES = (pfn_glAlphaFuncxOES)load("glAlphaFuncxOES"); - fp_glClearColorxOES = (pfn_glClearColorxOES)load("glClearColorxOES"); - fp_glClearDepthxOES = (pfn_glClearDepthxOES)load("glClearDepthxOES"); - fp_glClipPlanexOES = (pfn_glClipPlanexOES)load("glClipPlanexOES"); - fp_glColor4xOES = (pfn_glColor4xOES)load("glColor4xOES"); - fp_glDepthRangexOES = (pfn_glDepthRangexOES)load("glDepthRangexOES"); - fp_glFogxOES = (pfn_glFogxOES)load("glFogxOES"); - fp_glFogxvOES = (pfn_glFogxvOES)load("glFogxvOES"); - fp_glFrustumxOES = (pfn_glFrustumxOES)load("glFrustumxOES"); - fp_glGetClipPlanexOES = (pfn_glGetClipPlanexOES)load("glGetClipPlanexOES"); - fp_glGetFixedvOES = (pfn_glGetFixedvOES)load("glGetFixedvOES"); - fp_glGetTexEnvxvOES = (pfn_glGetTexEnvxvOES)load("glGetTexEnvxvOES"); - fp_glGetTexParameterxvOES = (pfn_glGetTexParameterxvOES)load("glGetTexParameterxvOES"); - fp_glLightModelxOES = (pfn_glLightModelxOES)load("glLightModelxOES"); - fp_glLightModelxvOES = (pfn_glLightModelxvOES)load("glLightModelxvOES"); - fp_glLightxOES = (pfn_glLightxOES)load("glLightxOES"); - fp_glLightxvOES = (pfn_glLightxvOES)load("glLightxvOES"); - fp_glLineWidthxOES = (pfn_glLineWidthxOES)load("glLineWidthxOES"); - fp_glLoadMatrixxOES = (pfn_glLoadMatrixxOES)load("glLoadMatrixxOES"); - fp_glMaterialxOES = (pfn_glMaterialxOES)load("glMaterialxOES"); - fp_glMaterialxvOES = (pfn_glMaterialxvOES)load("glMaterialxvOES"); - fp_glMultMatrixxOES = (pfn_glMultMatrixxOES)load("glMultMatrixxOES"); - fp_glMultiTexCoord4xOES = (pfn_glMultiTexCoord4xOES)load("glMultiTexCoord4xOES"); - fp_glNormal3xOES = (pfn_glNormal3xOES)load("glNormal3xOES"); - fp_glOrthoxOES = (pfn_glOrthoxOES)load("glOrthoxOES"); - fp_glPointParameterxvOES = (pfn_glPointParameterxvOES)load("glPointParameterxvOES"); - fp_glPointSizexOES = (pfn_glPointSizexOES)load("glPointSizexOES"); - fp_glPolygonOffsetxOES = (pfn_glPolygonOffsetxOES)load("glPolygonOffsetxOES"); - fp_glRotatexOES = (pfn_glRotatexOES)load("glRotatexOES"); - fp_glSampleCoverageOES = (pfn_glSampleCoverageOES)load("glSampleCoverageOES"); - fp_glScalexOES = (pfn_glScalexOES)load("glScalexOES"); - fp_glTexEnvxOES = (pfn_glTexEnvxOES)load("glTexEnvxOES"); - fp_glTexEnvxvOES = (pfn_glTexEnvxvOES)load("glTexEnvxvOES"); - fp_glTexParameterxOES = (pfn_glTexParameterxOES)load("glTexParameterxOES"); - fp_glTexParameterxvOES = (pfn_glTexParameterxvOES)load("glTexParameterxvOES"); - fp_glTranslatexOES = (pfn_glTranslatexOES)load("glTranslatexOES"); - fp_glGetLightxvOES = (pfn_glGetLightxvOES)load("glGetLightxvOES"); - fp_glGetMaterialxvOES = (pfn_glGetMaterialxvOES)load("glGetMaterialxvOES"); - fp_glPointParameterxOES = (pfn_glPointParameterxOES)load("glPointParameterxOES"); - fp_glSampleCoveragexOES = (pfn_glSampleCoveragexOES)load("glSampleCoveragexOES"); - fp_glAccumxOES = (pfn_glAccumxOES)load("glAccumxOES"); - fp_glBitmapxOES = (pfn_glBitmapxOES)load("glBitmapxOES"); - fp_glBlendColorxOES = (pfn_glBlendColorxOES)load("glBlendColorxOES"); - fp_glClearAccumxOES = (pfn_glClearAccumxOES)load("glClearAccumxOES"); - fp_glColor3xOES = (pfn_glColor3xOES)load("glColor3xOES"); - fp_glColor3xvOES = (pfn_glColor3xvOES)load("glColor3xvOES"); - fp_glColor4xvOES = (pfn_glColor4xvOES)load("glColor4xvOES"); - fp_glConvolutionParameterxOES = (pfn_glConvolutionParameterxOES)load("glConvolutionParameterxOES"); - fp_glConvolutionParameterxvOES = (pfn_glConvolutionParameterxvOES)load("glConvolutionParameterxvOES"); - fp_glEvalCoord1xOES = (pfn_glEvalCoord1xOES)load("glEvalCoord1xOES"); - fp_glEvalCoord1xvOES = (pfn_glEvalCoord1xvOES)load("glEvalCoord1xvOES"); - fp_glEvalCoord2xOES = (pfn_glEvalCoord2xOES)load("glEvalCoord2xOES"); - fp_glEvalCoord2xvOES = (pfn_glEvalCoord2xvOES)load("glEvalCoord2xvOES"); - fp_glFeedbackBufferxOES = (pfn_glFeedbackBufferxOES)load("glFeedbackBufferxOES"); - fp_glGetConvolutionParameterxvOES = (pfn_glGetConvolutionParameterxvOES)load("glGetConvolutionParameterxvOES"); - fp_glGetHistogramParameterxvOES = (pfn_glGetHistogramParameterxvOES)load("glGetHistogramParameterxvOES"); - fp_glGetLightxOES = (pfn_glGetLightxOES)load("glGetLightxOES"); - fp_glGetMapxvOES = (pfn_glGetMapxvOES)load("glGetMapxvOES"); - fp_glGetMaterialxOES = (pfn_glGetMaterialxOES)load("glGetMaterialxOES"); - fp_glGetPixelMapxv = (pfn_glGetPixelMapxv)load("glGetPixelMapxv"); - fp_glGetTexGenxvOES = (pfn_glGetTexGenxvOES)load("glGetTexGenxvOES"); - fp_glGetTexLevelParameterxvOES = (pfn_glGetTexLevelParameterxvOES)load("glGetTexLevelParameterxvOES"); - fp_glIndexxOES = (pfn_glIndexxOES)load("glIndexxOES"); - fp_glIndexxvOES = (pfn_glIndexxvOES)load("glIndexxvOES"); - fp_glLoadTransposeMatrixxOES = (pfn_glLoadTransposeMatrixxOES)load("glLoadTransposeMatrixxOES"); - fp_glMap1xOES = (pfn_glMap1xOES)load("glMap1xOES"); - fp_glMap2xOES = (pfn_glMap2xOES)load("glMap2xOES"); - fp_glMapGrid1xOES = (pfn_glMapGrid1xOES)load("glMapGrid1xOES"); - fp_glMapGrid2xOES = (pfn_glMapGrid2xOES)load("glMapGrid2xOES"); - fp_glMultTransposeMatrixxOES = (pfn_glMultTransposeMatrixxOES)load("glMultTransposeMatrixxOES"); - fp_glMultiTexCoord1xOES = (pfn_glMultiTexCoord1xOES)load("glMultiTexCoord1xOES"); - fp_glMultiTexCoord1xvOES = (pfn_glMultiTexCoord1xvOES)load("glMultiTexCoord1xvOES"); - fp_glMultiTexCoord2xOES = (pfn_glMultiTexCoord2xOES)load("glMultiTexCoord2xOES"); - fp_glMultiTexCoord2xvOES = (pfn_glMultiTexCoord2xvOES)load("glMultiTexCoord2xvOES"); - fp_glMultiTexCoord3xOES = (pfn_glMultiTexCoord3xOES)load("glMultiTexCoord3xOES"); - fp_glMultiTexCoord3xvOES = (pfn_glMultiTexCoord3xvOES)load("glMultiTexCoord3xvOES"); - fp_glMultiTexCoord4xvOES = (pfn_glMultiTexCoord4xvOES)load("glMultiTexCoord4xvOES"); - fp_glNormal3xvOES = (pfn_glNormal3xvOES)load("glNormal3xvOES"); - fp_glPassThroughxOES = (pfn_glPassThroughxOES)load("glPassThroughxOES"); - fp_glPixelMapx = (pfn_glPixelMapx)load("glPixelMapx"); - fp_glPixelStorex = (pfn_glPixelStorex)load("glPixelStorex"); - fp_glPixelTransferxOES = (pfn_glPixelTransferxOES)load("glPixelTransferxOES"); - fp_glPixelZoomxOES = (pfn_glPixelZoomxOES)load("glPixelZoomxOES"); - fp_glPrioritizeTexturesxOES = (pfn_glPrioritizeTexturesxOES)load("glPrioritizeTexturesxOES"); - fp_glRasterPos2xOES = (pfn_glRasterPos2xOES)load("glRasterPos2xOES"); - fp_glRasterPos2xvOES = (pfn_glRasterPos2xvOES)load("glRasterPos2xvOES"); - fp_glRasterPos3xOES = (pfn_glRasterPos3xOES)load("glRasterPos3xOES"); - fp_glRasterPos3xvOES = (pfn_glRasterPos3xvOES)load("glRasterPos3xvOES"); - fp_glRasterPos4xOES = (pfn_glRasterPos4xOES)load("glRasterPos4xOES"); - fp_glRasterPos4xvOES = (pfn_glRasterPos4xvOES)load("glRasterPos4xvOES"); - fp_glRectxOES = (pfn_glRectxOES)load("glRectxOES"); - fp_glRectxvOES = (pfn_glRectxvOES)load("glRectxvOES"); - fp_glTexCoord1xOES = (pfn_glTexCoord1xOES)load("glTexCoord1xOES"); - fp_glTexCoord1xvOES = (pfn_glTexCoord1xvOES)load("glTexCoord1xvOES"); - fp_glTexCoord2xOES = (pfn_glTexCoord2xOES)load("glTexCoord2xOES"); - fp_glTexCoord2xvOES = (pfn_glTexCoord2xvOES)load("glTexCoord2xvOES"); - fp_glTexCoord3xOES = (pfn_glTexCoord3xOES)load("glTexCoord3xOES"); - fp_glTexCoord3xvOES = (pfn_glTexCoord3xvOES)load("glTexCoord3xvOES"); - fp_glTexCoord4xOES = (pfn_glTexCoord4xOES)load("glTexCoord4xOES"); - fp_glTexCoord4xvOES = (pfn_glTexCoord4xvOES)load("glTexCoord4xvOES"); - fp_glTexGenxOES = (pfn_glTexGenxOES)load("glTexGenxOES"); - fp_glTexGenxvOES = (pfn_glTexGenxvOES)load("glTexGenxvOES"); - fp_glVertex2xOES = (pfn_glVertex2xOES)load("glVertex2xOES"); - fp_glVertex2xvOES = (pfn_glVertex2xvOES)load("glVertex2xvOES"); - fp_glVertex3xOES = (pfn_glVertex3xOES)load("glVertex3xOES"); - fp_glVertex3xvOES = (pfn_glVertex3xvOES)load("glVertex3xvOES"); - fp_glVertex4xOES = (pfn_glVertex4xOES)load("glVertex4xOES"); - fp_glVertex4xvOES = (pfn_glVertex4xvOES)load("glVertex4xvOES"); +GLboolean GLAD_OES_fragment_precision_high = GL_FALSE; +GLboolean GLAD_OES_geometry_point_size = GL_FALSE; +GLboolean GLAD_OES_geometry_shader = GL_FALSE; +static void load_GL_OES_geometry_shader(LOADER load) { + if(!GLAD_OES_geometry_shader) return; + fp_glFramebufferTextureOES = (pfn_glFramebufferTextureOES)load("glFramebufferTextureOES"); } -GLboolean GLAD_OES_fragment_precision_high = GL_FALSE; GLboolean GLAD_OES_get_program_binary = GL_FALSE; static void load_GL_OES_get_program_binary(LOADER load) { if(!GLAD_OES_get_program_binary) return; @@ -6037,6 +5313,7 @@ static void load_GL_OES_get_program_binary(LOADER load) { fp_glProgramBinaryOES = (pfn_glProgramBinaryOES)load("glProgramBinaryOES"); } +GLboolean GLAD_OES_gpu_shader5 = GL_FALSE; GLboolean GLAD_OES_mapbuffer = GL_FALSE; static void load_GL_OES_mapbuffer(LOADER load) { if(!GLAD_OES_mapbuffer) return; @@ -6046,30 +5323,35 @@ static void load_GL_OES_mapbuffer(LOADER load) { } GLboolean GLAD_OES_packed_depth_stencil = GL_FALSE; -GLboolean GLAD_OES_query_matrix = GL_FALSE; -static void load_GL_OES_query_matrix(LOADER load) { - if(!GLAD_OES_query_matrix) return; - fp_glQueryMatrixxOES = (pfn_glQueryMatrixxOES)load("glQueryMatrixxOES"); +GLboolean GLAD_OES_primitive_bounding_box = GL_FALSE; +static void load_GL_OES_primitive_bounding_box(LOADER load) { + if(!GLAD_OES_primitive_bounding_box) return; + fp_glPrimitiveBoundingBoxOES = (pfn_glPrimitiveBoundingBoxOES)load("glPrimitiveBoundingBoxOES"); } -GLboolean GLAD_OES_read_format = GL_FALSE; GLboolean GLAD_OES_required_internalformat = GL_FALSE; GLboolean GLAD_OES_rgb8_rgba8 = GL_FALSE; -GLboolean GLAD_OES_single_precision = GL_FALSE; -static void load_GL_OES_single_precision(LOADER load) { - if(!GLAD_OES_single_precision) return; - fp_glClearDepthfOES = (pfn_glClearDepthfOES)load("glClearDepthfOES"); - fp_glClipPlanefOES = (pfn_glClipPlanefOES)load("glClipPlanefOES"); - fp_glDepthRangefOES = (pfn_glDepthRangefOES)load("glDepthRangefOES"); - fp_glFrustumfOES = (pfn_glFrustumfOES)load("glFrustumfOES"); - fp_glGetClipPlanefOES = (pfn_glGetClipPlanefOES)load("glGetClipPlanefOES"); - fp_glOrthofOES = (pfn_glOrthofOES)load("glOrthofOES"); +GLboolean GLAD_OES_sample_shading = GL_FALSE; +static void load_GL_OES_sample_shading(LOADER load) { + if(!GLAD_OES_sample_shading) return; + fp_glMinSampleShadingOES = (pfn_glMinSampleShadingOES)load("glMinSampleShadingOES"); } +GLboolean GLAD_OES_sample_variables = GL_FALSE; +GLboolean GLAD_OES_shader_image_atomic = GL_FALSE; +GLboolean GLAD_OES_shader_io_blocks = GL_FALSE; +GLboolean GLAD_OES_shader_multisample_interpolation = GL_FALSE; GLboolean GLAD_OES_standard_derivatives = GL_FALSE; GLboolean GLAD_OES_stencil1 = GL_FALSE; GLboolean GLAD_OES_stencil4 = GL_FALSE; GLboolean GLAD_OES_surfaceless_context = GL_FALSE; +GLboolean GLAD_OES_tessellation_point_size = GL_FALSE; +GLboolean GLAD_OES_tessellation_shader = GL_FALSE; +static void load_GL_OES_tessellation_shader(LOADER load) { + if(!GLAD_OES_tessellation_shader) return; + fp_glPatchParameteriOES = (pfn_glPatchParameteriOES)load("glPatchParameteriOES"); +} + GLboolean GLAD_OES_texture_3D = GL_FALSE; static void load_GL_OES_texture_3D(LOADER load) { if(!GLAD_OES_texture_3D) return; @@ -6081,12 +5363,46 @@ static void load_GL_OES_texture_3D(LOADER load) { fp_glFramebufferTexture3DOES = (pfn_glFramebufferTexture3DOES)load("glFramebufferTexture3DOES"); } +GLboolean GLAD_OES_texture_border_clamp = GL_FALSE; +static void load_GL_OES_texture_border_clamp(LOADER load) { + if(!GLAD_OES_texture_border_clamp) return; + fp_glTexParameterIivOES = (pfn_glTexParameterIivOES)load("glTexParameterIivOES"); + fp_glTexParameterIuivOES = (pfn_glTexParameterIuivOES)load("glTexParameterIuivOES"); + fp_glGetTexParameterIivOES = (pfn_glGetTexParameterIivOES)load("glGetTexParameterIivOES"); + fp_glGetTexParameterIuivOES = (pfn_glGetTexParameterIuivOES)load("glGetTexParameterIuivOES"); + fp_glSamplerParameterIivOES = (pfn_glSamplerParameterIivOES)load("glSamplerParameterIivOES"); + fp_glSamplerParameterIuivOES = (pfn_glSamplerParameterIuivOES)load("glSamplerParameterIuivOES"); + fp_glGetSamplerParameterIivOES = (pfn_glGetSamplerParameterIivOES)load("glGetSamplerParameterIivOES"); + fp_glGetSamplerParameterIuivOES = (pfn_glGetSamplerParameterIuivOES)load("glGetSamplerParameterIuivOES"); +} + +GLboolean GLAD_OES_texture_buffer = GL_FALSE; +static void load_GL_OES_texture_buffer(LOADER load) { + if(!GLAD_OES_texture_buffer) return; + fp_glTexBufferOES = (pfn_glTexBufferOES)load("glTexBufferOES"); + fp_glTexBufferRangeOES = (pfn_glTexBufferRangeOES)load("glTexBufferRangeOES"); +} + GLboolean GLAD_OES_texture_compression_astc = GL_FALSE; +GLboolean GLAD_OES_texture_cube_map_array = GL_FALSE; GLboolean GLAD_OES_texture_float = GL_FALSE; GLboolean GLAD_OES_texture_float_linear = GL_FALSE; GLboolean GLAD_OES_texture_half_float = GL_FALSE; GLboolean GLAD_OES_texture_half_float_linear = GL_FALSE; GLboolean GLAD_OES_texture_npot = GL_FALSE; +GLboolean GLAD_OES_texture_stencil8 = GL_FALSE; +GLboolean GLAD_OES_texture_storage_multisample_2d_array = GL_FALSE; +static void load_GL_OES_texture_storage_multisample_2d_array(LOADER load) { + if(!GLAD_OES_texture_storage_multisample_2d_array) return; + fp_glTexStorage3DMultisampleOES = (pfn_glTexStorage3DMultisampleOES)load("glTexStorage3DMultisampleOES"); +} + +GLboolean GLAD_OES_texture_view = GL_FALSE; +static void load_GL_OES_texture_view(LOADER load) { + if(!GLAD_OES_texture_view) return; + fp_glTextureViewOES = (pfn_glTextureViewOES)load("glTextureViewOES"); +} + GLboolean GLAD_OES_vertex_array_object = GL_FALSE; static void load_GL_OES_vertex_array_object(LOADER load) { if(!GLAD_OES_vertex_array_object) return; @@ -6121,6 +5437,46 @@ static void load_GL_AMD_draw_buffers_blend(LOADER load) { fp_glBlendEquationSeparateIndexedAMD = (pfn_glBlendEquationSeparateIndexedAMD)load("glBlendEquationSeparateIndexedAMD"); } +GLboolean GLAD_AMD_gcn_shader = GL_FALSE; +GLboolean GLAD_AMD_gpu_shader_int64 = GL_FALSE; +static void load_GL_AMD_gpu_shader_int64(LOADER load) { + if(!GLAD_AMD_gpu_shader_int64) return; + fp_glUniform1i64NV = (pfn_glUniform1i64NV)load("glUniform1i64NV"); + fp_glUniform2i64NV = (pfn_glUniform2i64NV)load("glUniform2i64NV"); + fp_glUniform3i64NV = (pfn_glUniform3i64NV)load("glUniform3i64NV"); + fp_glUniform4i64NV = (pfn_glUniform4i64NV)load("glUniform4i64NV"); + fp_glUniform1i64vNV = (pfn_glUniform1i64vNV)load("glUniform1i64vNV"); + fp_glUniform2i64vNV = (pfn_glUniform2i64vNV)load("glUniform2i64vNV"); + fp_glUniform3i64vNV = (pfn_glUniform3i64vNV)load("glUniform3i64vNV"); + fp_glUniform4i64vNV = (pfn_glUniform4i64vNV)load("glUniform4i64vNV"); + fp_glUniform1ui64NV = (pfn_glUniform1ui64NV)load("glUniform1ui64NV"); + fp_glUniform2ui64NV = (pfn_glUniform2ui64NV)load("glUniform2ui64NV"); + fp_glUniform3ui64NV = (pfn_glUniform3ui64NV)load("glUniform3ui64NV"); + fp_glUniform4ui64NV = (pfn_glUniform4ui64NV)load("glUniform4ui64NV"); + fp_glUniform1ui64vNV = (pfn_glUniform1ui64vNV)load("glUniform1ui64vNV"); + fp_glUniform2ui64vNV = (pfn_glUniform2ui64vNV)load("glUniform2ui64vNV"); + fp_glUniform3ui64vNV = (pfn_glUniform3ui64vNV)load("glUniform3ui64vNV"); + fp_glUniform4ui64vNV = (pfn_glUniform4ui64vNV)load("glUniform4ui64vNV"); + fp_glGetUniformi64vNV = (pfn_glGetUniformi64vNV)load("glGetUniformi64vNV"); + fp_glGetUniformui64vNV = (pfn_glGetUniformui64vNV)load("glGetUniformui64vNV"); + fp_glProgramUniform1i64NV = (pfn_glProgramUniform1i64NV)load("glProgramUniform1i64NV"); + fp_glProgramUniform2i64NV = (pfn_glProgramUniform2i64NV)load("glProgramUniform2i64NV"); + fp_glProgramUniform3i64NV = (pfn_glProgramUniform3i64NV)load("glProgramUniform3i64NV"); + fp_glProgramUniform4i64NV = (pfn_glProgramUniform4i64NV)load("glProgramUniform4i64NV"); + fp_glProgramUniform1i64vNV = (pfn_glProgramUniform1i64vNV)load("glProgramUniform1i64vNV"); + fp_glProgramUniform2i64vNV = (pfn_glProgramUniform2i64vNV)load("glProgramUniform2i64vNV"); + fp_glProgramUniform3i64vNV = (pfn_glProgramUniform3i64vNV)load("glProgramUniform3i64vNV"); + fp_glProgramUniform4i64vNV = (pfn_glProgramUniform4i64vNV)load("glProgramUniform4i64vNV"); + fp_glProgramUniform1ui64NV = (pfn_glProgramUniform1ui64NV)load("glProgramUniform1ui64NV"); + fp_glProgramUniform2ui64NV = (pfn_glProgramUniform2ui64NV)load("glProgramUniform2ui64NV"); + fp_glProgramUniform3ui64NV = (pfn_glProgramUniform3ui64NV)load("glProgramUniform3ui64NV"); + fp_glProgramUniform4ui64NV = (pfn_glProgramUniform4ui64NV)load("glProgramUniform4ui64NV"); + fp_glProgramUniform1ui64vNV = (pfn_glProgramUniform1ui64vNV)load("glProgramUniform1ui64vNV"); + fp_glProgramUniform2ui64vNV = (pfn_glProgramUniform2ui64vNV)load("glProgramUniform2ui64vNV"); + fp_glProgramUniform3ui64vNV = (pfn_glProgramUniform3ui64vNV)load("glProgramUniform3ui64vNV"); + fp_glProgramUniform4ui64vNV = (pfn_glProgramUniform4ui64vNV)load("glProgramUniform4ui64vNV"); +} + GLboolean GLAD_AMD_interleaved_elements = GL_FALSE; static void load_GL_AMD_interleaved_elements(LOADER load) { if(!GLAD_AMD_interleaved_elements) return; @@ -6142,6 +5498,12 @@ static void load_GL_AMD_name_gen_delete(LOADER load) { fp_glIsNameAMD = (pfn_glIsNameAMD)load("glIsNameAMD"); } +GLboolean GLAD_AMD_occlusion_query_event = GL_FALSE; +static void load_GL_AMD_occlusion_query_event(LOADER load) { + if(!GLAD_AMD_occlusion_query_event) return; + fp_glQueryObjectParameteruiAMD = (pfn_glQueryObjectParameteruiAMD)load("glQueryObjectParameteruiAMD"); +} + GLboolean GLAD_AMD_performance_monitor = GL_FALSE; static void load_GL_AMD_performance_monitor(LOADER load) { if(!GLAD_AMD_performance_monitor) return; @@ -6186,6 +5548,7 @@ static void load_GL_AMD_stencil_operation_extended(LOADER load) { GLboolean GLAD_AMD_texture_texture4 = GL_FALSE; GLboolean GLAD_AMD_transform_feedback3_lines_triangles = GL_FALSE; +GLboolean GLAD_AMD_transform_feedback4 = GL_FALSE; GLboolean GLAD_AMD_vertex_shader_layer = GL_FALSE; GLboolean GLAD_AMD_vertex_shader_tessellator = GL_FALSE; static void load_GL_AMD_vertex_shader_tessellator(LOADER load) { @@ -6195,6 +5558,7 @@ static void load_GL_AMD_vertex_shader_tessellator(LOADER load) { } GLboolean GLAD_AMD_vertex_shader_viewport_index = GL_FALSE; +GLboolean GLAD_ANDROID_extension_pack_es31a = GL_FALSE; GLboolean GLAD_ANGLE_depth_texture = GL_FALSE; GLboolean GLAD_ANGLE_framebuffer_blit = GL_FALSE; static void load_GL_ANGLE_framebuffer_blit(LOADER load) { @@ -6229,6 +5593,8 @@ static void load_GL_ANGLE_translated_shader_source(LOADER load) { GLboolean GLAD_APPLE_aux_depth_stencil = GL_FALSE; GLboolean GLAD_APPLE_client_storage = GL_FALSE; +GLboolean GLAD_APPLE_clip_distance = GL_FALSE; +GLboolean GLAD_APPLE_color_buffer_packed_float = GL_FALSE; GLboolean GLAD_APPLE_copy_texture_levels = GL_FALSE; static void load_GL_APPLE_copy_texture_levels(LOADER load) { if(!GLAD_APPLE_copy_texture_levels) return; @@ -6283,7 +5649,6 @@ static void load_GL_APPLE_object_purgeable(LOADER load) { GLboolean GLAD_APPLE_rgb_422 = GL_FALSE; GLboolean GLAD_APPLE_row_bytes = GL_FALSE; -GLboolean GLAD_APPLE_specular_vector = GL_FALSE; GLboolean GLAD_APPLE_sync = GL_FALSE; static void load_GL_APPLE_sync(LOADER load) { if(!GLAD_APPLE_sync) return; @@ -6298,6 +5663,7 @@ static void load_GL_APPLE_sync(LOADER load) { GLboolean GLAD_APPLE_texture_format_BGRA8888 = GL_FALSE; GLboolean GLAD_APPLE_texture_max_level = GL_FALSE; +GLboolean GLAD_APPLE_texture_packed_float = GL_FALSE; GLboolean GLAD_APPLE_texture_range = GL_FALSE; static void load_GL_APPLE_texture_range(LOADER load) { if(!GLAD_APPLE_texture_range) return; @@ -6305,7 +5671,6 @@ static void load_GL_APPLE_texture_range(LOADER load) { fp_glGetTexParameterPointervAPPLE = (pfn_glGetTexParameterPointervAPPLE)load("glGetTexParameterPointervAPPLE"); } -GLboolean GLAD_APPLE_transform_hint = GL_FALSE; GLboolean GLAD_APPLE_vertex_array_object = GL_FALSE; static void load_GL_APPLE_vertex_array_object(LOADER load) { if(!GLAD_APPLE_vertex_array_object) return; @@ -6339,150 +5704,11 @@ GLboolean GLAD_APPLE_ycbcr_422 = GL_FALSE; GLboolean GLAD_ARM_mali_program_binary = GL_FALSE; GLboolean GLAD_ARM_mali_shader_binary = GL_FALSE; GLboolean GLAD_ARM_rgba8 = GL_FALSE; -GLboolean GLAD_ATI_draw_buffers = GL_FALSE; -static void load_GL_ATI_draw_buffers(LOADER load) { - if(!GLAD_ATI_draw_buffers) return; - fp_glDrawBuffersATI = (pfn_glDrawBuffersATI)load("glDrawBuffersATI"); -} - -GLboolean GLAD_ATI_element_array = GL_FALSE; -static void load_GL_ATI_element_array(LOADER load) { - if(!GLAD_ATI_element_array) return; - fp_glElementPointerATI = (pfn_glElementPointerATI)load("glElementPointerATI"); - fp_glDrawElementArrayATI = (pfn_glDrawElementArrayATI)load("glDrawElementArrayATI"); - fp_glDrawRangeElementArrayATI = (pfn_glDrawRangeElementArrayATI)load("glDrawRangeElementArrayATI"); -} - -GLboolean GLAD_ATI_envmap_bumpmap = GL_FALSE; -static void load_GL_ATI_envmap_bumpmap(LOADER load) { - if(!GLAD_ATI_envmap_bumpmap) return; - fp_glTexBumpParameterivATI = (pfn_glTexBumpParameterivATI)load("glTexBumpParameterivATI"); - fp_glTexBumpParameterfvATI = (pfn_glTexBumpParameterfvATI)load("glTexBumpParameterfvATI"); - fp_glGetTexBumpParameterivATI = (pfn_glGetTexBumpParameterivATI)load("glGetTexBumpParameterivATI"); - fp_glGetTexBumpParameterfvATI = (pfn_glGetTexBumpParameterfvATI)load("glGetTexBumpParameterfvATI"); -} - -GLboolean GLAD_ATI_fragment_shader = GL_FALSE; -static void load_GL_ATI_fragment_shader(LOADER load) { - if(!GLAD_ATI_fragment_shader) return; - fp_glGenFragmentShadersATI = (pfn_glGenFragmentShadersATI)load("glGenFragmentShadersATI"); - fp_glBindFragmentShaderATI = (pfn_glBindFragmentShaderATI)load("glBindFragmentShaderATI"); - fp_glDeleteFragmentShaderATI = (pfn_glDeleteFragmentShaderATI)load("glDeleteFragmentShaderATI"); - fp_glBeginFragmentShaderATI = (pfn_glBeginFragmentShaderATI)load("glBeginFragmentShaderATI"); - fp_glEndFragmentShaderATI = (pfn_glEndFragmentShaderATI)load("glEndFragmentShaderATI"); - fp_glPassTexCoordATI = (pfn_glPassTexCoordATI)load("glPassTexCoordATI"); - fp_glSampleMapATI = (pfn_glSampleMapATI)load("glSampleMapATI"); - fp_glColorFragmentOp1ATI = (pfn_glColorFragmentOp1ATI)load("glColorFragmentOp1ATI"); - fp_glColorFragmentOp2ATI = (pfn_glColorFragmentOp2ATI)load("glColorFragmentOp2ATI"); - fp_glColorFragmentOp3ATI = (pfn_glColorFragmentOp3ATI)load("glColorFragmentOp3ATI"); - fp_glAlphaFragmentOp1ATI = (pfn_glAlphaFragmentOp1ATI)load("glAlphaFragmentOp1ATI"); - fp_glAlphaFragmentOp2ATI = (pfn_glAlphaFragmentOp2ATI)load("glAlphaFragmentOp2ATI"); - fp_glAlphaFragmentOp3ATI = (pfn_glAlphaFragmentOp3ATI)load("glAlphaFragmentOp3ATI"); - fp_glSetFragmentShaderConstantATI = (pfn_glSetFragmentShaderConstantATI)load("glSetFragmentShaderConstantATI"); -} - -GLboolean GLAD_ATI_map_object_buffer = GL_FALSE; -static void load_GL_ATI_map_object_buffer(LOADER load) { - if(!GLAD_ATI_map_object_buffer) return; - fp_glMapObjectBufferATI = (pfn_glMapObjectBufferATI)load("glMapObjectBufferATI"); - fp_glUnmapObjectBufferATI = (pfn_glUnmapObjectBufferATI)load("glUnmapObjectBufferATI"); -} - +GLboolean GLAD_ARM_shader_framebuffer_fetch = GL_FALSE; +GLboolean GLAD_ARM_shader_framebuffer_fetch_depth_stencil = GL_FALSE; GLboolean GLAD_ATI_meminfo = GL_FALSE; GLboolean GLAD_ATI_pixel_format_float = GL_FALSE; -GLboolean GLAD_ATI_pn_triangles = GL_FALSE; -static void load_GL_ATI_pn_triangles(LOADER load) { - if(!GLAD_ATI_pn_triangles) return; - fp_glPNTrianglesiATI = (pfn_glPNTrianglesiATI)load("glPNTrianglesiATI"); - fp_glPNTrianglesfATI = (pfn_glPNTrianglesfATI)load("glPNTrianglesfATI"); -} - -GLboolean GLAD_ATI_separate_stencil = GL_FALSE; -static void load_GL_ATI_separate_stencil(LOADER load) { - if(!GLAD_ATI_separate_stencil) return; - fp_glStencilOpSeparateATI = (pfn_glStencilOpSeparateATI)load("glStencilOpSeparateATI"); - fp_glStencilFuncSeparateATI = (pfn_glStencilFuncSeparateATI)load("glStencilFuncSeparateATI"); -} - -GLboolean GLAD_ATI_text_fragment_shader = GL_FALSE; -GLboolean GLAD_ATI_texture_env_combine3 = GL_FALSE; -GLboolean GLAD_ATI_texture_float = GL_FALSE; -GLboolean GLAD_ATI_texture_mirror_once = GL_FALSE; -GLboolean GLAD_ATI_vertex_array_object = GL_FALSE; -static void load_GL_ATI_vertex_array_object(LOADER load) { - if(!GLAD_ATI_vertex_array_object) return; - fp_glNewObjectBufferATI = (pfn_glNewObjectBufferATI)load("glNewObjectBufferATI"); - fp_glIsObjectBufferATI = (pfn_glIsObjectBufferATI)load("glIsObjectBufferATI"); - fp_glUpdateObjectBufferATI = (pfn_glUpdateObjectBufferATI)load("glUpdateObjectBufferATI"); - fp_glGetObjectBufferfvATI = (pfn_glGetObjectBufferfvATI)load("glGetObjectBufferfvATI"); - fp_glGetObjectBufferivATI = (pfn_glGetObjectBufferivATI)load("glGetObjectBufferivATI"); - fp_glFreeObjectBufferATI = (pfn_glFreeObjectBufferATI)load("glFreeObjectBufferATI"); - fp_glArrayObjectATI = (pfn_glArrayObjectATI)load("glArrayObjectATI"); - fp_glGetArrayObjectfvATI = (pfn_glGetArrayObjectfvATI)load("glGetArrayObjectfvATI"); - fp_glGetArrayObjectivATI = (pfn_glGetArrayObjectivATI)load("glGetArrayObjectivATI"); - fp_glVariantArrayObjectATI = (pfn_glVariantArrayObjectATI)load("glVariantArrayObjectATI"); - fp_glGetVariantArrayObjectfvATI = (pfn_glGetVariantArrayObjectfvATI)load("glGetVariantArrayObjectfvATI"); - fp_glGetVariantArrayObjectivATI = (pfn_glGetVariantArrayObjectivATI)load("glGetVariantArrayObjectivATI"); -} - -GLboolean GLAD_ATI_vertex_attrib_array_object = GL_FALSE; -static void load_GL_ATI_vertex_attrib_array_object(LOADER load) { - if(!GLAD_ATI_vertex_attrib_array_object) return; - fp_glVertexAttribArrayObjectATI = (pfn_glVertexAttribArrayObjectATI)load("glVertexAttribArrayObjectATI"); - fp_glGetVertexAttribArrayObjectfvATI = (pfn_glGetVertexAttribArrayObjectfvATI)load("glGetVertexAttribArrayObjectfvATI"); - fp_glGetVertexAttribArrayObjectivATI = (pfn_glGetVertexAttribArrayObjectivATI)load("glGetVertexAttribArrayObjectivATI"); -} - -GLboolean GLAD_ATI_vertex_streams = GL_FALSE; -static void load_GL_ATI_vertex_streams(LOADER load) { - if(!GLAD_ATI_vertex_streams) return; - fp_glVertexStream1sATI = (pfn_glVertexStream1sATI)load("glVertexStream1sATI"); - fp_glVertexStream1svATI = (pfn_glVertexStream1svATI)load("glVertexStream1svATI"); - fp_glVertexStream1iATI = (pfn_glVertexStream1iATI)load("glVertexStream1iATI"); - fp_glVertexStream1ivATI = (pfn_glVertexStream1ivATI)load("glVertexStream1ivATI"); - fp_glVertexStream1fATI = (pfn_glVertexStream1fATI)load("glVertexStream1fATI"); - fp_glVertexStream1fvATI = (pfn_glVertexStream1fvATI)load("glVertexStream1fvATI"); - fp_glVertexStream1dATI = (pfn_glVertexStream1dATI)load("glVertexStream1dATI"); - fp_glVertexStream1dvATI = (pfn_glVertexStream1dvATI)load("glVertexStream1dvATI"); - fp_glVertexStream2sATI = (pfn_glVertexStream2sATI)load("glVertexStream2sATI"); - fp_glVertexStream2svATI = (pfn_glVertexStream2svATI)load("glVertexStream2svATI"); - fp_glVertexStream2iATI = (pfn_glVertexStream2iATI)load("glVertexStream2iATI"); - fp_glVertexStream2ivATI = (pfn_glVertexStream2ivATI)load("glVertexStream2ivATI"); - fp_glVertexStream2fATI = (pfn_glVertexStream2fATI)load("glVertexStream2fATI"); - fp_glVertexStream2fvATI = (pfn_glVertexStream2fvATI)load("glVertexStream2fvATI"); - fp_glVertexStream2dATI = (pfn_glVertexStream2dATI)load("glVertexStream2dATI"); - fp_glVertexStream2dvATI = (pfn_glVertexStream2dvATI)load("glVertexStream2dvATI"); - fp_glVertexStream3sATI = (pfn_glVertexStream3sATI)load("glVertexStream3sATI"); - fp_glVertexStream3svATI = (pfn_glVertexStream3svATI)load("glVertexStream3svATI"); - fp_glVertexStream3iATI = (pfn_glVertexStream3iATI)load("glVertexStream3iATI"); - fp_glVertexStream3ivATI = (pfn_glVertexStream3ivATI)load("glVertexStream3ivATI"); - fp_glVertexStream3fATI = (pfn_glVertexStream3fATI)load("glVertexStream3fATI"); - fp_glVertexStream3fvATI = (pfn_glVertexStream3fvATI)load("glVertexStream3fvATI"); - fp_glVertexStream3dATI = (pfn_glVertexStream3dATI)load("glVertexStream3dATI"); - fp_glVertexStream3dvATI = (pfn_glVertexStream3dvATI)load("glVertexStream3dvATI"); - fp_glVertexStream4sATI = (pfn_glVertexStream4sATI)load("glVertexStream4sATI"); - fp_glVertexStream4svATI = (pfn_glVertexStream4svATI)load("glVertexStream4svATI"); - fp_glVertexStream4iATI = (pfn_glVertexStream4iATI)load("glVertexStream4iATI"); - fp_glVertexStream4ivATI = (pfn_glVertexStream4ivATI)load("glVertexStream4ivATI"); - fp_glVertexStream4fATI = (pfn_glVertexStream4fATI)load("glVertexStream4fATI"); - fp_glVertexStream4fvATI = (pfn_glVertexStream4fvATI)load("glVertexStream4fvATI"); - fp_glVertexStream4dATI = (pfn_glVertexStream4dATI)load("glVertexStream4dATI"); - fp_glVertexStream4dvATI = (pfn_glVertexStream4dvATI)load("glVertexStream4dvATI"); - fp_glNormalStream3bATI = (pfn_glNormalStream3bATI)load("glNormalStream3bATI"); - fp_glNormalStream3bvATI = (pfn_glNormalStream3bvATI)load("glNormalStream3bvATI"); - fp_glNormalStream3sATI = (pfn_glNormalStream3sATI)load("glNormalStream3sATI"); - fp_glNormalStream3svATI = (pfn_glNormalStream3svATI)load("glNormalStream3svATI"); - fp_glNormalStream3iATI = (pfn_glNormalStream3iATI)load("glNormalStream3iATI"); - fp_glNormalStream3ivATI = (pfn_glNormalStream3ivATI)load("glNormalStream3ivATI"); - fp_glNormalStream3fATI = (pfn_glNormalStream3fATI)load("glNormalStream3fATI"); - fp_glNormalStream3fvATI = (pfn_glNormalStream3fvATI)load("glNormalStream3fvATI"); - fp_glNormalStream3dATI = (pfn_glNormalStream3dATI)load("glNormalStream3dATI"); - fp_glNormalStream3dvATI = (pfn_glNormalStream3dvATI)load("glNormalStream3dvATI"); - fp_glClientActiveVertexStreamATI = (pfn_glClientActiveVertexStreamATI)load("glClientActiveVertexStreamATI"); - fp_glVertexBlendEnviATI = (pfn_glVertexBlendEnviATI)load("glVertexBlendEnviATI"); - fp_glVertexBlendEnvfATI = (pfn_glVertexBlendEnvfATI)load("glVertexBlendEnvfATI"); -} - +GLboolean GLAD_DMP_program_binary = GL_FALSE; GLboolean GLAD_DMP_shader_binary = GL_FALSE; GLboolean GLAD_FJ_shader_binary_GCCSO = GL_FALSE; GLboolean GLAD_GREMEDY_frame_terminator = GL_FALSE; @@ -6497,7 +5723,6 @@ static void load_GL_GREMEDY_string_marker(LOADER load) { fp_glStringMarkerGREMEDY = (pfn_glStringMarkerGREMEDY)load("glStringMarkerGREMEDY"); } -GLboolean GLAD_IBM_rasterpos_clip = GL_FALSE; GLboolean GLAD_IMG_multisampled_render_to_texture = GL_FALSE; static void load_GL_IMG_multisampled_render_to_texture(LOADER load) { if(!GLAD_IMG_multisampled_render_to_texture) return; @@ -6525,51 +5750,22 @@ static void load_GL_INTEL_map_texture(LOADER load) { fp_glMapTexture2DINTEL = (pfn_glMapTexture2DINTEL)load("glMapTexture2DINTEL"); } -GLboolean GLAD_INTEL_parallel_arrays = GL_FALSE; -static void load_GL_INTEL_parallel_arrays(LOADER load) { - if(!GLAD_INTEL_parallel_arrays) return; - fp_glVertexPointervINTEL = (pfn_glVertexPointervINTEL)load("glVertexPointervINTEL"); - fp_glNormalPointervINTEL = (pfn_glNormalPointervINTEL)load("glNormalPointervINTEL"); - fp_glColorPointervINTEL = (pfn_glColorPointervINTEL)load("glColorPointervINTEL"); - fp_glTexCoordPointervINTEL = (pfn_glTexCoordPointervINTEL)load("glTexCoordPointervINTEL"); +GLboolean GLAD_INTEL_performance_query = GL_FALSE; +static void load_GL_INTEL_performance_query(LOADER load) { + if(!GLAD_INTEL_performance_query) return; + fp_glBeginPerfQueryINTEL = (pfn_glBeginPerfQueryINTEL)load("glBeginPerfQueryINTEL"); + fp_glCreatePerfQueryINTEL = (pfn_glCreatePerfQueryINTEL)load("glCreatePerfQueryINTEL"); + fp_glDeletePerfQueryINTEL = (pfn_glDeletePerfQueryINTEL)load("glDeletePerfQueryINTEL"); + fp_glEndPerfQueryINTEL = (pfn_glEndPerfQueryINTEL)load("glEndPerfQueryINTEL"); + fp_glGetFirstPerfQueryIdINTEL = (pfn_glGetFirstPerfQueryIdINTEL)load("glGetFirstPerfQueryIdINTEL"); + fp_glGetNextPerfQueryIdINTEL = (pfn_glGetNextPerfQueryIdINTEL)load("glGetNextPerfQueryIdINTEL"); + fp_glGetPerfCounterInfoINTEL = (pfn_glGetPerfCounterInfoINTEL)load("glGetPerfCounterInfoINTEL"); + fp_glGetPerfQueryDataINTEL = (pfn_glGetPerfQueryDataINTEL)load("glGetPerfQueryDataINTEL"); + fp_glGetPerfQueryIdByNameINTEL = (pfn_glGetPerfQueryIdByNameINTEL)load("glGetPerfQueryIdByNameINTEL"); + fp_glGetPerfQueryInfoINTEL = (pfn_glGetPerfQueryInfoINTEL)load("glGetPerfQueryInfoINTEL"); } GLboolean GLAD_MESA_pack_invert = GL_FALSE; -GLboolean GLAD_MESA_resize_buffers = GL_FALSE; -static void load_GL_MESA_resize_buffers(LOADER load) { - if(!GLAD_MESA_resize_buffers) return; - fp_glResizeBuffersMESA = (pfn_glResizeBuffersMESA)load("glResizeBuffersMESA"); -} - -GLboolean GLAD_MESA_window_pos = GL_FALSE; -static void load_GL_MESA_window_pos(LOADER load) { - if(!GLAD_MESA_window_pos) return; - fp_glWindowPos2dMESA = (pfn_glWindowPos2dMESA)load("glWindowPos2dMESA"); - fp_glWindowPos2dvMESA = (pfn_glWindowPos2dvMESA)load("glWindowPos2dvMESA"); - fp_glWindowPos2fMESA = (pfn_glWindowPos2fMESA)load("glWindowPos2fMESA"); - fp_glWindowPos2fvMESA = (pfn_glWindowPos2fvMESA)load("glWindowPos2fvMESA"); - fp_glWindowPos2iMESA = (pfn_glWindowPos2iMESA)load("glWindowPos2iMESA"); - fp_glWindowPos2ivMESA = (pfn_glWindowPos2ivMESA)load("glWindowPos2ivMESA"); - fp_glWindowPos2sMESA = (pfn_glWindowPos2sMESA)load("glWindowPos2sMESA"); - fp_glWindowPos2svMESA = (pfn_glWindowPos2svMESA)load("glWindowPos2svMESA"); - fp_glWindowPos3dMESA = (pfn_glWindowPos3dMESA)load("glWindowPos3dMESA"); - fp_glWindowPos3dvMESA = (pfn_glWindowPos3dvMESA)load("glWindowPos3dvMESA"); - fp_glWindowPos3fMESA = (pfn_glWindowPos3fMESA)load("glWindowPos3fMESA"); - fp_glWindowPos3fvMESA = (pfn_glWindowPos3fvMESA)load("glWindowPos3fvMESA"); - fp_glWindowPos3iMESA = (pfn_glWindowPos3iMESA)load("glWindowPos3iMESA"); - fp_glWindowPos3ivMESA = (pfn_glWindowPos3ivMESA)load("glWindowPos3ivMESA"); - fp_glWindowPos3sMESA = (pfn_glWindowPos3sMESA)load("glWindowPos3sMESA"); - fp_glWindowPos3svMESA = (pfn_glWindowPos3svMESA)load("glWindowPos3svMESA"); - fp_glWindowPos4dMESA = (pfn_glWindowPos4dMESA)load("glWindowPos4dMESA"); - fp_glWindowPos4dvMESA = (pfn_glWindowPos4dvMESA)load("glWindowPos4dvMESA"); - fp_glWindowPos4fMESA = (pfn_glWindowPos4fMESA)load("glWindowPos4fMESA"); - fp_glWindowPos4fvMESA = (pfn_glWindowPos4fvMESA)load("glWindowPos4fvMESA"); - fp_glWindowPos4iMESA = (pfn_glWindowPos4iMESA)load("glWindowPos4iMESA"); - fp_glWindowPos4ivMESA = (pfn_glWindowPos4ivMESA)load("glWindowPos4ivMESA"); - fp_glWindowPos4sMESA = (pfn_glWindowPos4sMESA)load("glWindowPos4sMESA"); - fp_glWindowPos4svMESA = (pfn_glWindowPos4svMESA)load("glWindowPos4svMESA"); -} - GLboolean GLAD_MESA_ycbcr_texture = GL_FALSE; GLboolean GLAD_MESAX_texture_stack = GL_FALSE; GLboolean GLAD_NV_bindless_multi_draw_indirect = GL_FALSE; @@ -6579,6 +5775,13 @@ static void load_GL_NV_bindless_multi_draw_indirect(LOADER load) { fp_glMultiDrawElementsIndirectBindlessNV = (pfn_glMultiDrawElementsIndirectBindlessNV)load("glMultiDrawElementsIndirectBindlessNV"); } +GLboolean GLAD_NV_bindless_multi_draw_indirect_count = GL_FALSE; +static void load_GL_NV_bindless_multi_draw_indirect_count(LOADER load) { + if(!GLAD_NV_bindless_multi_draw_indirect_count) return; + fp_glMultiDrawArraysIndirectBindlessCountNV = (pfn_glMultiDrawArraysIndirectBindlessCountNV)load("glMultiDrawArraysIndirectBindlessCountNV"); + fp_glMultiDrawElementsIndirectBindlessCountNV = (pfn_glMultiDrawElementsIndirectBindlessCountNV)load("glMultiDrawElementsIndirectBindlessCountNV"); +} + GLboolean GLAD_NV_bindless_texture = GL_FALSE; static void load_GL_NV_bindless_texture(LOADER load) { if(!GLAD_NV_bindless_texture) return; @@ -6605,7 +5808,6 @@ static void load_GL_NV_blend_equation_advanced(LOADER load) { } GLboolean GLAD_NV_blend_equation_advanced_coherent = GL_FALSE; -GLboolean GLAD_NV_blend_square = GL_FALSE; GLboolean GLAD_NV_compute_program5 = GL_FALSE; GLboolean GLAD_NV_conditional_render = GL_FALSE; static void load_GL_NV_conditional_render(LOADER load) { @@ -6614,13 +5816,18 @@ static void load_GL_NV_conditional_render(LOADER load) { fp_glEndConditionalRenderNV = (pfn_glEndConditionalRenderNV)load("glEndConditionalRenderNV"); } +GLboolean GLAD_NV_conservative_raster = GL_FALSE; +static void load_GL_NV_conservative_raster(LOADER load) { + if(!GLAD_NV_conservative_raster) return; + fp_glSubpixelPrecisionBiasNV = (pfn_glSubpixelPrecisionBiasNV)load("glSubpixelPrecisionBiasNV"); +} + GLboolean GLAD_NV_copy_buffer = GL_FALSE; static void load_GL_NV_copy_buffer(LOADER load) { if(!GLAD_NV_copy_buffer) return; fp_glCopyBufferSubDataNV = (pfn_glCopyBufferSubDataNV)load("glCopyBufferSubDataNV"); } -GLboolean GLAD_NV_copy_depth_to_color = GL_FALSE; GLboolean GLAD_NV_copy_image = GL_FALSE; static void load_GL_NV_copy_image(LOADER load) { if(!GLAD_NV_copy_image) return; @@ -6664,20 +5871,6 @@ static void load_GL_NV_draw_texture(LOADER load) { fp_glDrawTextureNV = (pfn_glDrawTextureNV)load("glDrawTextureNV"); } -GLboolean GLAD_NV_evaluators = GL_FALSE; -static void load_GL_NV_evaluators(LOADER load) { - if(!GLAD_NV_evaluators) return; - fp_glMapControlPointsNV = (pfn_glMapControlPointsNV)load("glMapControlPointsNV"); - fp_glMapParameterivNV = (pfn_glMapParameterivNV)load("glMapParameterivNV"); - fp_glMapParameterfvNV = (pfn_glMapParameterfvNV)load("glMapParameterfvNV"); - fp_glGetMapControlPointsNV = (pfn_glGetMapControlPointsNV)load("glGetMapControlPointsNV"); - fp_glGetMapParameterivNV = (pfn_glGetMapParameterivNV)load("glGetMapParameterivNV"); - fp_glGetMapParameterfvNV = (pfn_glGetMapParameterfvNV)load("glGetMapParameterfvNV"); - fp_glGetMapAttribParameterivNV = (pfn_glGetMapAttribParameterivNV)load("glGetMapAttribParameterivNV"); - fp_glGetMapAttribParameterfvNV = (pfn_glGetMapAttribParameterfvNV)load("glGetMapAttribParameterfvNV"); - fp_glEvalMapsNV = (pfn_glEvalMapsNV)load("glEvalMapsNV"); -} - GLboolean GLAD_NV_explicit_attrib_location = GL_FALSE; GLboolean GLAD_NV_explicit_multisample = GL_FALSE; static void load_GL_NV_explicit_multisample(LOADER load) { @@ -6700,28 +5893,31 @@ static void load_GL_NV_fence(LOADER load) { fp_glSetFenceNV = (pfn_glSetFenceNV)load("glSetFenceNV"); } +GLboolean GLAD_NV_fill_rectangle = GL_FALSE; GLboolean GLAD_NV_float_buffer = GL_FALSE; -GLboolean GLAD_NV_fog_distance = GL_FALSE; -GLboolean GLAD_NV_fragment_program = GL_FALSE; -static void load_GL_NV_fragment_program(LOADER load) { - if(!GLAD_NV_fragment_program) return; - fp_glProgramNamedParameter4fNV = (pfn_glProgramNamedParameter4fNV)load("glProgramNamedParameter4fNV"); - fp_glProgramNamedParameter4fvNV = (pfn_glProgramNamedParameter4fvNV)load("glProgramNamedParameter4fvNV"); - fp_glProgramNamedParameter4dNV = (pfn_glProgramNamedParameter4dNV)load("glProgramNamedParameter4dNV"); - fp_glProgramNamedParameter4dvNV = (pfn_glProgramNamedParameter4dvNV)load("glProgramNamedParameter4dvNV"); - fp_glGetProgramNamedParameterfvNV = (pfn_glGetProgramNamedParameterfvNV)load("glGetProgramNamedParameterfvNV"); - fp_glGetProgramNamedParameterdvNV = (pfn_glGetProgramNamedParameterdvNV)load("glGetProgramNamedParameterdvNV"); +GLboolean GLAD_NV_fragment_coverage_to_color = GL_FALSE; +static void load_GL_NV_fragment_coverage_to_color(LOADER load) { + if(!GLAD_NV_fragment_coverage_to_color) return; + fp_glFragmentCoverageColorNV = (pfn_glFragmentCoverageColorNV)load("glFragmentCoverageColorNV"); } -GLboolean GLAD_NV_fragment_program2 = GL_FALSE; GLboolean GLAD_NV_fragment_program4 = GL_FALSE; -GLboolean GLAD_NV_fragment_program_option = GL_FALSE; +GLboolean GLAD_NV_fragment_shader_interlock = GL_FALSE; GLboolean GLAD_NV_framebuffer_blit = GL_FALSE; static void load_GL_NV_framebuffer_blit(LOADER load) { if(!GLAD_NV_framebuffer_blit) return; fp_glBlitFramebufferNV = (pfn_glBlitFramebufferNV)load("glBlitFramebufferNV"); } +GLboolean GLAD_NV_framebuffer_mixed_samples = GL_FALSE; +static void load_GL_NV_framebuffer_mixed_samples(LOADER load) { + if(!GLAD_NV_framebuffer_mixed_samples) return; + fp_glRasterSamplesEXT = (pfn_glRasterSamplesEXT)load("glRasterSamplesEXT"); + fp_glCoverageModulationTableNV = (pfn_glCoverageModulationTableNV)load("glCoverageModulationTableNV"); + fp_glGetCoverageModulationTableNV = (pfn_glGetCoverageModulationTableNV)load("glGetCoverageModulationTableNV"); + fp_glCoverageModulationNV = (pfn_glCoverageModulationNV)load("glCoverageModulationNV"); +} + GLboolean GLAD_NV_framebuffer_multisample = GL_FALSE; static void load_GL_NV_framebuffer_multisample(LOADER load) { if(!GLAD_NV_framebuffer_multisample) return; @@ -6745,6 +5941,7 @@ static void load_GL_NV_geometry_program4(LOADER load) { } GLboolean GLAD_NV_geometry_shader4 = GL_FALSE; +GLboolean GLAD_NV_geometry_shader_passthrough = GL_FALSE; GLboolean GLAD_NV_gpu_program4 = GL_FALSE; static void load_GL_NV_gpu_program4(LOADER load) { if(!GLAD_NV_gpu_program4) return; @@ -6863,15 +6060,20 @@ static void load_GL_NV_half_float(LOADER load) { fp_glVertexAttribs4hvNV = (pfn_glVertexAttribs4hvNV)load("glVertexAttribs4hvNV"); } +GLboolean GLAD_NV_image_formats = GL_FALSE; GLboolean GLAD_NV_instanced_arrays = GL_FALSE; static void load_GL_NV_instanced_arrays(LOADER load) { if(!GLAD_NV_instanced_arrays) return; fp_glVertexAttribDivisorNV = (pfn_glVertexAttribDivisorNV)load("glVertexAttribDivisorNV"); } -GLboolean GLAD_NV_light_max_exponent = GL_FALSE; +GLboolean GLAD_NV_internalformat_sample_query = GL_FALSE; +static void load_GL_NV_internalformat_sample_query(LOADER load) { + if(!GLAD_NV_internalformat_sample_query) return; + fp_glGetInternalformatSampleivNV = (pfn_glGetInternalformatSampleivNV)load("glGetInternalformatSampleivNV"); +} + GLboolean GLAD_NV_multisample_coverage = GL_FALSE; -GLboolean GLAD_NV_multisample_filter_hint = GL_FALSE; GLboolean GLAD_NV_non_square_matrices = GL_FALSE; static void load_GL_NV_non_square_matrices(LOADER load) { if(!GLAD_NV_non_square_matrices) return; @@ -6895,7 +6097,6 @@ static void load_GL_NV_occlusion_query(LOADER load) { fp_glGetOcclusionQueryuivNV = (pfn_glGetOcclusionQueryuivNV)load("glGetOcclusionQueryuivNV"); } -GLboolean GLAD_NV_packed_depth_stencil = GL_FALSE; GLboolean GLAD_NV_parameter_buffer_object = GL_FALSE; static void load_GL_NV_parameter_buffer_object(LOADER load) { if(!GLAD_NV_parameter_buffer_object) return; @@ -6934,9 +6135,6 @@ static void load_GL_NV_path_rendering(LOADER load) { fp_glStencilFillPathInstancedNV = (pfn_glStencilFillPathInstancedNV)load("glStencilFillPathInstancedNV"); fp_glStencilStrokePathInstancedNV = (pfn_glStencilStrokePathInstancedNV)load("glStencilStrokePathInstancedNV"); fp_glPathCoverDepthFuncNV = (pfn_glPathCoverDepthFuncNV)load("glPathCoverDepthFuncNV"); - fp_glPathColorGenNV = (pfn_glPathColorGenNV)load("glPathColorGenNV"); - fp_glPathTexGenNV = (pfn_glPathTexGenNV)load("glPathTexGenNV"); - fp_glPathFogGenNV = (pfn_glPathFogGenNV)load("glPathFogGenNV"); fp_glCoverFillPathNV = (pfn_glCoverFillPathNV)load("glCoverFillPathNV"); fp_glCoverStrokePathNV = (pfn_glCoverStrokePathNV)load("glCoverStrokePathNV"); fp_glCoverFillPathInstancedNV = (pfn_glCoverFillPathInstancedNV)load("glCoverFillPathInstancedNV"); @@ -6949,30 +6147,35 @@ static void load_GL_NV_path_rendering(LOADER load) { fp_glGetPathMetricsNV = (pfn_glGetPathMetricsNV)load("glGetPathMetricsNV"); fp_glGetPathMetricRangeNV = (pfn_glGetPathMetricRangeNV)load("glGetPathMetricRangeNV"); fp_glGetPathSpacingNV = (pfn_glGetPathSpacingNV)load("glGetPathSpacingNV"); - fp_glGetPathColorGenivNV = (pfn_glGetPathColorGenivNV)load("glGetPathColorGenivNV"); - fp_glGetPathColorGenfvNV = (pfn_glGetPathColorGenfvNV)load("glGetPathColorGenfvNV"); - fp_glGetPathTexGenivNV = (pfn_glGetPathTexGenivNV)load("glGetPathTexGenivNV"); - fp_glGetPathTexGenfvNV = (pfn_glGetPathTexGenfvNV)load("glGetPathTexGenfvNV"); fp_glIsPointInFillPathNV = (pfn_glIsPointInFillPathNV)load("glIsPointInFillPathNV"); fp_glIsPointInStrokePathNV = (pfn_glIsPointInStrokePathNV)load("glIsPointInStrokePathNV"); fp_glGetPathLengthNV = (pfn_glGetPathLengthNV)load("glGetPathLengthNV"); fp_glPointAlongPathNV = (pfn_glPointAlongPathNV)load("glPointAlongPathNV"); + fp_glMatrixLoad3x2fNV = (pfn_glMatrixLoad3x2fNV)load("glMatrixLoad3x2fNV"); + fp_glMatrixLoad3x3fNV = (pfn_glMatrixLoad3x3fNV)load("glMatrixLoad3x3fNV"); + fp_glMatrixLoadTranspose3x3fNV = (pfn_glMatrixLoadTranspose3x3fNV)load("glMatrixLoadTranspose3x3fNV"); + fp_glMatrixMult3x2fNV = (pfn_glMatrixMult3x2fNV)load("glMatrixMult3x2fNV"); + fp_glMatrixMult3x3fNV = (pfn_glMatrixMult3x3fNV)load("glMatrixMult3x3fNV"); + fp_glMatrixMultTranspose3x3fNV = (pfn_glMatrixMultTranspose3x3fNV)load("glMatrixMultTranspose3x3fNV"); + fp_glStencilThenCoverFillPathNV = (pfn_glStencilThenCoverFillPathNV)load("glStencilThenCoverFillPathNV"); + fp_glStencilThenCoverStrokePathNV = (pfn_glStencilThenCoverStrokePathNV)load("glStencilThenCoverStrokePathNV"); + fp_glStencilThenCoverFillPathInstancedNV = (pfn_glStencilThenCoverFillPathInstancedNV)load("glStencilThenCoverFillPathInstancedNV"); + fp_glStencilThenCoverStrokePathInstancedNV = (pfn_glStencilThenCoverStrokePathInstancedNV)load("glStencilThenCoverStrokePathInstancedNV"); + fp_glPathGlyphIndexRangeNV = (pfn_glPathGlyphIndexRangeNV)load("glPathGlyphIndexRangeNV"); + fp_glPathGlyphIndexArrayNV = (pfn_glPathGlyphIndexArrayNV)load("glPathGlyphIndexArrayNV"); + fp_glPathMemoryGlyphIndexArrayNV = (pfn_glPathMemoryGlyphIndexArrayNV)load("glPathMemoryGlyphIndexArrayNV"); + fp_glProgramPathFragmentInputGenNV = (pfn_glProgramPathFragmentInputGenNV)load("glProgramPathFragmentInputGenNV"); + fp_glGetProgramResourcefvNV = (pfn_glGetProgramResourcefvNV)load("glGetProgramResourcefvNV"); + fp_glPathColorGenNV = (pfn_glPathColorGenNV)load("glPathColorGenNV"); + fp_glPathTexGenNV = (pfn_glPathTexGenNV)load("glPathTexGenNV"); + fp_glPathFogGenNV = (pfn_glPathFogGenNV)load("glPathFogGenNV"); + fp_glGetPathColorGenivNV = (pfn_glGetPathColorGenivNV)load("glGetPathColorGenivNV"); + fp_glGetPathColorGenfvNV = (pfn_glGetPathColorGenfvNV)load("glGetPathColorGenfvNV"); + fp_glGetPathTexGenivNV = (pfn_glGetPathTexGenivNV)load("glGetPathTexGenivNV"); + fp_glGetPathTexGenfvNV = (pfn_glGetPathTexGenfvNV)load("glGetPathTexGenfvNV"); } -GLboolean GLAD_NV_pixel_data_range = GL_FALSE; -static void load_GL_NV_pixel_data_range(LOADER load) { - if(!GLAD_NV_pixel_data_range) return; - fp_glPixelDataRangeNV = (pfn_glPixelDataRangeNV)load("glPixelDataRangeNV"); - fp_glFlushPixelDataRangeNV = (pfn_glFlushPixelDataRangeNV)load("glFlushPixelDataRangeNV"); -} - -GLboolean GLAD_NV_point_sprite = GL_FALSE; -static void load_GL_NV_point_sprite(LOADER load) { - if(!GLAD_NV_point_sprite) return; - fp_glPointParameteriNV = (pfn_glPointParameteriNV)load("glPointParameteriNV"); - fp_glPointParameterivNV = (pfn_glPointParameterivNV)load("glPointParameterivNV"); -} - +GLboolean GLAD_NV_path_rendering_shared_edge = GL_FALSE; GLboolean GLAD_NV_present_video = GL_FALSE; static void load_GL_NV_present_video(LOADER load) { if(!GLAD_NV_present_video) return; @@ -7001,33 +6204,19 @@ GLboolean GLAD_NV_read_buffer_front = GL_FALSE; GLboolean GLAD_NV_read_depth = GL_FALSE; GLboolean GLAD_NV_read_depth_stencil = GL_FALSE; GLboolean GLAD_NV_read_stencil = GL_FALSE; -GLboolean GLAD_NV_register_combiners = GL_FALSE; -static void load_GL_NV_register_combiners(LOADER load) { - if(!GLAD_NV_register_combiners) return; - fp_glCombinerParameterfvNV = (pfn_glCombinerParameterfvNV)load("glCombinerParameterfvNV"); - fp_glCombinerParameterfNV = (pfn_glCombinerParameterfNV)load("glCombinerParameterfNV"); - fp_glCombinerParameterivNV = (pfn_glCombinerParameterivNV)load("glCombinerParameterivNV"); - fp_glCombinerParameteriNV = (pfn_glCombinerParameteriNV)load("glCombinerParameteriNV"); - fp_glCombinerInputNV = (pfn_glCombinerInputNV)load("glCombinerInputNV"); - fp_glCombinerOutputNV = (pfn_glCombinerOutputNV)load("glCombinerOutputNV"); - fp_glFinalCombinerInputNV = (pfn_glFinalCombinerInputNV)load("glFinalCombinerInputNV"); - fp_glGetCombinerInputParameterfvNV = (pfn_glGetCombinerInputParameterfvNV)load("glGetCombinerInputParameterfvNV"); - fp_glGetCombinerInputParameterivNV = (pfn_glGetCombinerInputParameterivNV)load("glGetCombinerInputParameterivNV"); - fp_glGetCombinerOutputParameterfvNV = (pfn_glGetCombinerOutputParameterfvNV)load("glGetCombinerOutputParameterfvNV"); - fp_glGetCombinerOutputParameterivNV = (pfn_glGetCombinerOutputParameterivNV)load("glGetCombinerOutputParameterivNV"); - fp_glGetFinalCombinerInputParameterfvNV = (pfn_glGetFinalCombinerInputParameterfvNV)load("glGetFinalCombinerInputParameterfvNV"); - fp_glGetFinalCombinerInputParameterivNV = (pfn_glGetFinalCombinerInputParameterivNV)load("glGetFinalCombinerInputParameterivNV"); -} - -GLboolean GLAD_NV_register_combiners2 = GL_FALSE; -static void load_GL_NV_register_combiners2(LOADER load) { - if(!GLAD_NV_register_combiners2) return; - fp_glCombinerStageParameterfvNV = (pfn_glCombinerStageParameterfvNV)load("glCombinerStageParameterfvNV"); - fp_glGetCombinerStageParameterfvNV = (pfn_glGetCombinerStageParameterfvNV)load("glGetCombinerStageParameterfvNV"); +GLboolean GLAD_NV_sample_locations = GL_FALSE; +static void load_GL_NV_sample_locations(LOADER load) { + if(!GLAD_NV_sample_locations) return; + fp_glFramebufferSampleLocationsfvNV = (pfn_glFramebufferSampleLocationsfvNV)load("glFramebufferSampleLocationsfvNV"); + fp_glNamedFramebufferSampleLocationsfvNV = (pfn_glNamedFramebufferSampleLocationsfvNV)load("glNamedFramebufferSampleLocationsfvNV"); + fp_glResolveDepthValuesNV = (pfn_glResolveDepthValuesNV)load("glResolveDepthValuesNV"); } +GLboolean GLAD_NV_sample_mask_override_coverage = GL_FALSE; GLboolean GLAD_NV_shader_atomic_counters = GL_FALSE; GLboolean GLAD_NV_shader_atomic_float = GL_FALSE; +GLboolean GLAD_NV_shader_atomic_fp16_vector = GL_FALSE; +GLboolean GLAD_NV_shader_atomic_int64 = GL_FALSE; GLboolean GLAD_NV_shader_buffer_load = GL_FALSE; static void load_GL_NV_shader_buffer_load(LOADER load) { if(!GLAD_NV_shader_buffer_load) return; @@ -7048,13 +6237,14 @@ static void load_GL_NV_shader_buffer_load(LOADER load) { } GLboolean GLAD_NV_shader_buffer_store = GL_FALSE; +GLboolean GLAD_NV_shader_noperspective_interpolation = GL_FALSE; GLboolean GLAD_NV_shader_storage_buffer_object = GL_FALSE; +GLboolean GLAD_NV_shader_thread_group = GL_FALSE; +GLboolean GLAD_NV_shader_thread_shuffle = GL_FALSE; GLboolean GLAD_NV_shadow_samplers_array = GL_FALSE; GLboolean GLAD_NV_shadow_samplers_cube = GL_FALSE; GLboolean GLAD_NV_sRGB_formats = GL_FALSE; GLboolean GLAD_NV_tessellation_program5 = GL_FALSE; -GLboolean GLAD_NV_texgen_emboss = GL_FALSE; -GLboolean GLAD_NV_texgen_reflection = GL_FALSE; GLboolean GLAD_NV_texture_barrier = GL_FALSE; static void load_GL_NV_texture_barrier(LOADER load) { if(!GLAD_NV_texture_barrier) return; @@ -7063,9 +6253,6 @@ static void load_GL_NV_texture_barrier(LOADER load) { GLboolean GLAD_NV_texture_border_clamp = GL_FALSE; GLboolean GLAD_NV_texture_compression_s3tc_update = GL_FALSE; -GLboolean GLAD_NV_texture_compression_vtc = GL_FALSE; -GLboolean GLAD_NV_texture_env_combine4 = GL_FALSE; -GLboolean GLAD_NV_texture_expand_normal = GL_FALSE; GLboolean GLAD_NV_texture_multisample = GL_FALSE; static void load_GL_NV_texture_multisample(LOADER load) { if(!GLAD_NV_texture_multisample) return; @@ -7078,10 +6265,6 @@ static void load_GL_NV_texture_multisample(LOADER load) { } GLboolean GLAD_NV_texture_npot_2D_mipmap = GL_FALSE; -GLboolean GLAD_NV_texture_rectangle = GL_FALSE; -GLboolean GLAD_NV_texture_shader = GL_FALSE; -GLboolean GLAD_NV_texture_shader2 = GL_FALSE; -GLboolean GLAD_NV_texture_shader3 = GL_FALSE; GLboolean GLAD_NV_transform_feedback = GL_FALSE; static void load_GL_NV_transform_feedback(LOADER load) { if(!GLAD_NV_transform_feedback) return; @@ -7111,6 +6294,7 @@ static void load_GL_NV_transform_feedback2(LOADER load) { fp_glDrawTransformFeedbackNV = (pfn_glDrawTransformFeedbackNV)load("glDrawTransformFeedbackNV"); } +GLboolean GLAD_NV_uniform_buffer_unified_memory = GL_FALSE; GLboolean GLAD_NV_vdpau_interop = GL_FALSE; static void load_GL_NV_vdpau_interop(LOADER load) { if(!GLAD_NV_vdpau_interop) return; @@ -7126,14 +6310,6 @@ static void load_GL_NV_vdpau_interop(LOADER load) { fp_glVDPAUUnmapSurfacesNV = (pfn_glVDPAUUnmapSurfacesNV)load("glVDPAUUnmapSurfacesNV"); } -GLboolean GLAD_NV_vertex_array_range = GL_FALSE; -static void load_GL_NV_vertex_array_range(LOADER load) { - if(!GLAD_NV_vertex_array_range) return; - fp_glFlushVertexArrayRangeNV = (pfn_glFlushVertexArrayRangeNV)load("glFlushVertexArrayRangeNV"); - fp_glVertexArrayRangeNV = (pfn_glVertexArrayRangeNV)load("glVertexArrayRangeNV"); -} - -GLboolean GLAD_NV_vertex_array_range2 = GL_FALSE; GLboolean GLAD_NV_vertex_attrib_integer_64bit = GL_FALSE; static void load_GL_NV_vertex_attrib_integer_64bit(LOADER load) { if(!GLAD_NV_vertex_attrib_integer_64bit) return; @@ -7175,79 +6351,6 @@ static void load_GL_NV_vertex_buffer_unified_memory(LOADER load) { fp_glGetIntegerui64i_vNV = (pfn_glGetIntegerui64i_vNV)load("glGetIntegerui64i_vNV"); } -GLboolean GLAD_NV_vertex_program = GL_FALSE; -static void load_GL_NV_vertex_program(LOADER load) { - if(!GLAD_NV_vertex_program) return; - fp_glAreProgramsResidentNV = (pfn_glAreProgramsResidentNV)load("glAreProgramsResidentNV"); - fp_glBindProgramNV = (pfn_glBindProgramNV)load("glBindProgramNV"); - fp_glDeleteProgramsNV = (pfn_glDeleteProgramsNV)load("glDeleteProgramsNV"); - fp_glExecuteProgramNV = (pfn_glExecuteProgramNV)load("glExecuteProgramNV"); - fp_glGenProgramsNV = (pfn_glGenProgramsNV)load("glGenProgramsNV"); - fp_glGetProgramParameterdvNV = (pfn_glGetProgramParameterdvNV)load("glGetProgramParameterdvNV"); - fp_glGetProgramParameterfvNV = (pfn_glGetProgramParameterfvNV)load("glGetProgramParameterfvNV"); - fp_glGetProgramivNV = (pfn_glGetProgramivNV)load("glGetProgramivNV"); - fp_glGetProgramStringNV = (pfn_glGetProgramStringNV)load("glGetProgramStringNV"); - fp_glGetTrackMatrixivNV = (pfn_glGetTrackMatrixivNV)load("glGetTrackMatrixivNV"); - fp_glGetVertexAttribdvNV = (pfn_glGetVertexAttribdvNV)load("glGetVertexAttribdvNV"); - fp_glGetVertexAttribfvNV = (pfn_glGetVertexAttribfvNV)load("glGetVertexAttribfvNV"); - fp_glGetVertexAttribivNV = (pfn_glGetVertexAttribivNV)load("glGetVertexAttribivNV"); - fp_glGetVertexAttribPointervNV = (pfn_glGetVertexAttribPointervNV)load("glGetVertexAttribPointervNV"); - fp_glIsProgramNV = (pfn_glIsProgramNV)load("glIsProgramNV"); - fp_glLoadProgramNV = (pfn_glLoadProgramNV)load("glLoadProgramNV"); - fp_glProgramParameter4dNV = (pfn_glProgramParameter4dNV)load("glProgramParameter4dNV"); - fp_glProgramParameter4dvNV = (pfn_glProgramParameter4dvNV)load("glProgramParameter4dvNV"); - fp_glProgramParameter4fNV = (pfn_glProgramParameter4fNV)load("glProgramParameter4fNV"); - fp_glProgramParameter4fvNV = (pfn_glProgramParameter4fvNV)load("glProgramParameter4fvNV"); - fp_glProgramParameters4dvNV = (pfn_glProgramParameters4dvNV)load("glProgramParameters4dvNV"); - fp_glProgramParameters4fvNV = (pfn_glProgramParameters4fvNV)load("glProgramParameters4fvNV"); - fp_glRequestResidentProgramsNV = (pfn_glRequestResidentProgramsNV)load("glRequestResidentProgramsNV"); - fp_glTrackMatrixNV = (pfn_glTrackMatrixNV)load("glTrackMatrixNV"); - fp_glVertexAttribPointerNV = (pfn_glVertexAttribPointerNV)load("glVertexAttribPointerNV"); - fp_glVertexAttrib1dNV = (pfn_glVertexAttrib1dNV)load("glVertexAttrib1dNV"); - fp_glVertexAttrib1dvNV = (pfn_glVertexAttrib1dvNV)load("glVertexAttrib1dvNV"); - fp_glVertexAttrib1fNV = (pfn_glVertexAttrib1fNV)load("glVertexAttrib1fNV"); - fp_glVertexAttrib1fvNV = (pfn_glVertexAttrib1fvNV)load("glVertexAttrib1fvNV"); - fp_glVertexAttrib1sNV = (pfn_glVertexAttrib1sNV)load("glVertexAttrib1sNV"); - fp_glVertexAttrib1svNV = (pfn_glVertexAttrib1svNV)load("glVertexAttrib1svNV"); - fp_glVertexAttrib2dNV = (pfn_glVertexAttrib2dNV)load("glVertexAttrib2dNV"); - fp_glVertexAttrib2dvNV = (pfn_glVertexAttrib2dvNV)load("glVertexAttrib2dvNV"); - fp_glVertexAttrib2fNV = (pfn_glVertexAttrib2fNV)load("glVertexAttrib2fNV"); - fp_glVertexAttrib2fvNV = (pfn_glVertexAttrib2fvNV)load("glVertexAttrib2fvNV"); - fp_glVertexAttrib2sNV = (pfn_glVertexAttrib2sNV)load("glVertexAttrib2sNV"); - fp_glVertexAttrib2svNV = (pfn_glVertexAttrib2svNV)load("glVertexAttrib2svNV"); - fp_glVertexAttrib3dNV = (pfn_glVertexAttrib3dNV)load("glVertexAttrib3dNV"); - fp_glVertexAttrib3dvNV = (pfn_glVertexAttrib3dvNV)load("glVertexAttrib3dvNV"); - fp_glVertexAttrib3fNV = (pfn_glVertexAttrib3fNV)load("glVertexAttrib3fNV"); - fp_glVertexAttrib3fvNV = (pfn_glVertexAttrib3fvNV)load("glVertexAttrib3fvNV"); - fp_glVertexAttrib3sNV = (pfn_glVertexAttrib3sNV)load("glVertexAttrib3sNV"); - fp_glVertexAttrib3svNV = (pfn_glVertexAttrib3svNV)load("glVertexAttrib3svNV"); - fp_glVertexAttrib4dNV = (pfn_glVertexAttrib4dNV)load("glVertexAttrib4dNV"); - fp_glVertexAttrib4dvNV = (pfn_glVertexAttrib4dvNV)load("glVertexAttrib4dvNV"); - fp_glVertexAttrib4fNV = (pfn_glVertexAttrib4fNV)load("glVertexAttrib4fNV"); - fp_glVertexAttrib4fvNV = (pfn_glVertexAttrib4fvNV)load("glVertexAttrib4fvNV"); - fp_glVertexAttrib4sNV = (pfn_glVertexAttrib4sNV)load("glVertexAttrib4sNV"); - fp_glVertexAttrib4svNV = (pfn_glVertexAttrib4svNV)load("glVertexAttrib4svNV"); - fp_glVertexAttrib4ubNV = (pfn_glVertexAttrib4ubNV)load("glVertexAttrib4ubNV"); - fp_glVertexAttrib4ubvNV = (pfn_glVertexAttrib4ubvNV)load("glVertexAttrib4ubvNV"); - fp_glVertexAttribs1dvNV = (pfn_glVertexAttribs1dvNV)load("glVertexAttribs1dvNV"); - fp_glVertexAttribs1fvNV = (pfn_glVertexAttribs1fvNV)load("glVertexAttribs1fvNV"); - fp_glVertexAttribs1svNV = (pfn_glVertexAttribs1svNV)load("glVertexAttribs1svNV"); - fp_glVertexAttribs2dvNV = (pfn_glVertexAttribs2dvNV)load("glVertexAttribs2dvNV"); - fp_glVertexAttribs2fvNV = (pfn_glVertexAttribs2fvNV)load("glVertexAttribs2fvNV"); - fp_glVertexAttribs2svNV = (pfn_glVertexAttribs2svNV)load("glVertexAttribs2svNV"); - fp_glVertexAttribs3dvNV = (pfn_glVertexAttribs3dvNV)load("glVertexAttribs3dvNV"); - fp_glVertexAttribs3fvNV = (pfn_glVertexAttribs3fvNV)load("glVertexAttribs3fvNV"); - fp_glVertexAttribs3svNV = (pfn_glVertexAttribs3svNV)load("glVertexAttribs3svNV"); - fp_glVertexAttribs4dvNV = (pfn_glVertexAttribs4dvNV)load("glVertexAttribs4dvNV"); - fp_glVertexAttribs4fvNV = (pfn_glVertexAttribs4fvNV)load("glVertexAttribs4fvNV"); - fp_glVertexAttribs4svNV = (pfn_glVertexAttribs4svNV)load("glVertexAttribs4svNV"); - fp_glVertexAttribs4ubvNV = (pfn_glVertexAttribs4ubvNV)load("glVertexAttribs4ubvNV"); -} - -GLboolean GLAD_NV_vertex_program1_1 = GL_FALSE; -GLboolean GLAD_NV_vertex_program2 = GL_FALSE; -GLboolean GLAD_NV_vertex_program2_option = GL_FALSE; -GLboolean GLAD_NV_vertex_program3 = GL_FALSE; GLboolean GLAD_NV_vertex_program4 = GL_FALSE; static void load_GL_NV_vertex_program4(LOADER load) { if(!GLAD_NV_vertex_program4) return; @@ -7293,6 +6396,24 @@ static void load_GL_NV_video_capture(LOADER load) { fp_glVideoCaptureStreamParameterdvNV = (pfn_glVideoCaptureStreamParameterdvNV)load("glVideoCaptureStreamParameterdvNV"); } +GLboolean GLAD_NV_viewport_array = GL_FALSE; +static void load_GL_NV_viewport_array(LOADER load) { + if(!GLAD_NV_viewport_array) return; + fp_glViewportArrayvNV = (pfn_glViewportArrayvNV)load("glViewportArrayvNV"); + fp_glViewportIndexedfNV = (pfn_glViewportIndexedfNV)load("glViewportIndexedfNV"); + fp_glViewportIndexedfvNV = (pfn_glViewportIndexedfvNV)load("glViewportIndexedfvNV"); + fp_glScissorArrayvNV = (pfn_glScissorArrayvNV)load("glScissorArrayvNV"); + fp_glScissorIndexedNV = (pfn_glScissorIndexedNV)load("glScissorIndexedNV"); + fp_glScissorIndexedvNV = (pfn_glScissorIndexedvNV)load("glScissorIndexedvNV"); + fp_glDepthRangeArrayfvNV = (pfn_glDepthRangeArrayfvNV)load("glDepthRangeArrayfvNV"); + fp_glDepthRangeIndexedfNV = (pfn_glDepthRangeIndexedfNV)load("glDepthRangeIndexedfNV"); + fp_glGetFloati_vNV = (pfn_glGetFloati_vNV)load("glGetFloati_vNV"); + fp_glEnableiNV = (pfn_glEnableiNV)load("glEnableiNV"); + fp_glDisableiNV = (pfn_glDisableiNV)load("glDisableiNV"); + fp_glIsEnablediNV = (pfn_glIsEnablediNV)load("glIsEnablediNV"); +} + +GLboolean GLAD_NV_viewport_array2 = GL_FALSE; GLboolean GLAD_NVX_conditional_render = GL_FALSE; static void load_GL_NVX_conditional_render(LOADER load) { if(!GLAD_NVX_conditional_render) return; @@ -7300,16 +6421,7 @@ static void load_GL_NVX_conditional_render(LOADER load) { fp_glEndConditionalRenderNVX = (pfn_glEndConditionalRenderNVX)load("glEndConditionalRenderNVX"); } -GLboolean GLAD_OML_interlace = GL_FALSE; -GLboolean GLAD_OML_resample = GL_FALSE; -GLboolean GLAD_OML_subsample = GL_FALSE; -GLboolean GLAD_PGI_misc_hints = GL_FALSE; -static void load_GL_PGI_misc_hints(LOADER load) { - if(!GLAD_PGI_misc_hints) return; - fp_glHintPGI = (pfn_glHintPGI)load("glHintPGI"); -} - -GLboolean GLAD_PGI_vertex_hints = GL_FALSE; +GLboolean GLAD_NVX_gpu_memory_info = GL_FALSE; GLboolean GLAD_QCOM_alpha_test = GL_FALSE; static void load_GL_QCOM_alpha_test(LOADER load) { if(!GLAD_QCOM_alpha_test) return; @@ -7357,13 +6469,21 @@ static void load_GL_QCOM_tiled_rendering(LOADER load) { } GLboolean GLAD_QCOM_writeonly_rendering = GL_FALSE; -GLboolean GLAD_REND_screen_coordinates = GL_FALSE; -GLboolean GLAD_S3_s3tc = GL_FALSE; -GLboolean GLAD_SGIS_generate_mipmap = GL_FALSE; -GLboolean GLAD_SGIX_texture_lod_bias = GL_FALSE; +GLboolean GLAD_SGIX_calligraphic_fragment = GL_FALSE; +GLboolean GLAD_SGIX_depth_pass_instrument = GL_FALSE; +GLboolean GLAD_SGIX_pixel_tiles = GL_FALSE; +GLboolean GLAD_SGIX_scalebias_hint = GL_FALSE; +GLboolean GLAD_SGIX_subsample = GL_FALSE; +GLboolean GLAD_SGIX_ycrcb_subsample = GL_FALSE; +GLboolean GLAD_SGIX_ycrcba = GL_FALSE; GLboolean GLAD_VIV_shader_binary = GL_FALSE; static void find_extensions(void) { + GLAD_KHR_blend_equation_advanced = has_ext("GL_KHR_blend_equation_advanced"); + GLAD_KHR_blend_equation_advanced_coherent = has_ext("GL_KHR_blend_equation_advanced_coherent"); + GLAD_KHR_context_flush_control = has_ext("GL_KHR_context_flush_control"); GLAD_KHR_debug = has_ext("GL_KHR_debug"); + GLAD_KHR_robust_buffer_access_behavior = has_ext("GL_KHR_robust_buffer_access_behavior"); + GLAD_KHR_robustness = has_ext("GL_KHR_robustness"); GLAD_KHR_texture_compression_astc_hdr = has_ext("GL_KHR_texture_compression_astc_hdr"); GLAD_KHR_texture_compression_astc_ldr = has_ext("GL_KHR_texture_compression_astc_ldr"); GLAD_ARB_arrays_of_arrays = has_ext("GL_ARB_arrays_of_arrays"); @@ -7374,38 +6494,40 @@ static void find_extensions(void) { GLAD_ARB_cl_event = has_ext("GL_ARB_cl_event"); GLAD_ARB_clear_buffer_object = has_ext("GL_ARB_clear_buffer_object"); GLAD_ARB_clear_texture = has_ext("GL_ARB_clear_texture"); + GLAD_ARB_clip_control = has_ext("GL_ARB_clip_control"); GLAD_ARB_color_buffer_float = has_ext("GL_ARB_color_buffer_float"); GLAD_ARB_compatibility = has_ext("GL_ARB_compatibility"); GLAD_ARB_compressed_texture_pixel_storage = has_ext("GL_ARB_compressed_texture_pixel_storage"); GLAD_ARB_compute_shader = has_ext("GL_ARB_compute_shader"); GLAD_ARB_compute_variable_group_size = has_ext("GL_ARB_compute_variable_group_size"); + GLAD_ARB_conditional_render_inverted = has_ext("GL_ARB_conditional_render_inverted"); GLAD_ARB_conservative_depth = has_ext("GL_ARB_conservative_depth"); GLAD_ARB_copy_buffer = has_ext("GL_ARB_copy_buffer"); GLAD_ARB_copy_image = has_ext("GL_ARB_copy_image"); + GLAD_ARB_cull_distance = has_ext("GL_ARB_cull_distance"); GLAD_ARB_debug_output = has_ext("GL_ARB_debug_output"); GLAD_ARB_depth_buffer_float = has_ext("GL_ARB_depth_buffer_float"); GLAD_ARB_depth_clamp = has_ext("GL_ARB_depth_clamp"); - GLAD_ARB_depth_texture = has_ext("GL_ARB_depth_texture"); - GLAD_ARB_draw_buffers = has_ext("GL_ARB_draw_buffers"); + GLAD_ARB_derivative_control = has_ext("GL_ARB_derivative_control"); + GLAD_ARB_direct_state_access = has_ext("GL_ARB_direct_state_access"); GLAD_ARB_draw_buffers_blend = has_ext("GL_ARB_draw_buffers_blend"); GLAD_ARB_draw_elements_base_vertex = has_ext("GL_ARB_draw_elements_base_vertex"); GLAD_ARB_draw_indirect = has_ext("GL_ARB_draw_indirect"); GLAD_ARB_draw_instanced = has_ext("GL_ARB_draw_instanced"); GLAD_ARB_enhanced_layouts = has_ext("GL_ARB_enhanced_layouts"); GLAD_ARB_ES2_compatibility = has_ext("GL_ARB_ES2_compatibility"); + GLAD_ARB_ES3_1_compatibility = has_ext("GL_ARB_ES3_1_compatibility"); GLAD_ARB_ES3_compatibility = has_ext("GL_ARB_ES3_compatibility"); GLAD_ARB_explicit_attrib_location = has_ext("GL_ARB_explicit_attrib_location"); GLAD_ARB_explicit_uniform_location = has_ext("GL_ARB_explicit_uniform_location"); GLAD_ARB_fragment_coord_conventions = has_ext("GL_ARB_fragment_coord_conventions"); GLAD_ARB_fragment_layer_viewport = has_ext("GL_ARB_fragment_layer_viewport"); - GLAD_ARB_fragment_program = has_ext("GL_ARB_fragment_program"); - GLAD_ARB_fragment_program_shadow = has_ext("GL_ARB_fragment_program_shadow"); - GLAD_ARB_fragment_shader = has_ext("GL_ARB_fragment_shader"); GLAD_ARB_framebuffer_no_attachments = has_ext("GL_ARB_framebuffer_no_attachments"); GLAD_ARB_framebuffer_object = has_ext("GL_ARB_framebuffer_object"); GLAD_ARB_framebuffer_sRGB = has_ext("GL_ARB_framebuffer_sRGB"); GLAD_ARB_geometry_shader4 = has_ext("GL_ARB_geometry_shader4"); GLAD_ARB_get_program_binary = has_ext("GL_ARB_get_program_binary"); + GLAD_ARB_get_texture_sub_image = has_ext("GL_ARB_get_texture_sub_image"); GLAD_ARB_gpu_shader5 = has_ext("GL_ARB_gpu_shader5"); GLAD_ARB_gpu_shader_fp64 = has_ext("GL_ARB_gpu_shader_fp64"); GLAD_ARB_half_float_pixel = has_ext("GL_ARB_half_float_pixel"); @@ -7417,16 +6539,11 @@ static void find_extensions(void) { GLAD_ARB_invalidate_subdata = has_ext("GL_ARB_invalidate_subdata"); GLAD_ARB_map_buffer_alignment = has_ext("GL_ARB_map_buffer_alignment"); GLAD_ARB_map_buffer_range = has_ext("GL_ARB_map_buffer_range"); - GLAD_ARB_matrix_palette = has_ext("GL_ARB_matrix_palette"); GLAD_ARB_multi_bind = has_ext("GL_ARB_multi_bind"); GLAD_ARB_multi_draw_indirect = has_ext("GL_ARB_multi_draw_indirect"); - GLAD_ARB_multisample = has_ext("GL_ARB_multisample"); - GLAD_ARB_multitexture = has_ext("GL_ARB_multitexture"); - GLAD_ARB_occlusion_query = has_ext("GL_ARB_occlusion_query"); GLAD_ARB_occlusion_query2 = has_ext("GL_ARB_occlusion_query2"); + GLAD_ARB_pipeline_statistics_query = has_ext("GL_ARB_pipeline_statistics_query"); GLAD_ARB_pixel_buffer_object = has_ext("GL_ARB_pixel_buffer_object"); - GLAD_ARB_point_parameters = has_ext("GL_ARB_point_parameters"); - GLAD_ARB_point_sprite = has_ext("GL_ARB_point_sprite"); GLAD_ARB_program_interface_query = has_ext("GL_ARB_program_interface_query"); GLAD_ARB_provoking_vertex = has_ext("GL_ARB_provoking_vertex"); GLAD_ARB_query_buffer_object = has_ext("GL_ARB_query_buffer_object"); @@ -7444,41 +6561,31 @@ static void find_extensions(void) { GLAD_ARB_shader_group_vote = has_ext("GL_ARB_shader_group_vote"); GLAD_ARB_shader_image_load_store = has_ext("GL_ARB_shader_image_load_store"); GLAD_ARB_shader_image_size = has_ext("GL_ARB_shader_image_size"); - GLAD_ARB_shader_objects = has_ext("GL_ARB_shader_objects"); GLAD_ARB_shader_precision = has_ext("GL_ARB_shader_precision"); GLAD_ARB_shader_stencil_export = has_ext("GL_ARB_shader_stencil_export"); GLAD_ARB_shader_storage_buffer_object = has_ext("GL_ARB_shader_storage_buffer_object"); GLAD_ARB_shader_subroutine = has_ext("GL_ARB_shader_subroutine"); + GLAD_ARB_shader_texture_image_samples = has_ext("GL_ARB_shader_texture_image_samples"); GLAD_ARB_shader_texture_lod = has_ext("GL_ARB_shader_texture_lod"); - GLAD_ARB_shading_language_100 = has_ext("GL_ARB_shading_language_100"); GLAD_ARB_shading_language_420pack = has_ext("GL_ARB_shading_language_420pack"); GLAD_ARB_shading_language_include = has_ext("GL_ARB_shading_language_include"); GLAD_ARB_shading_language_packing = has_ext("GL_ARB_shading_language_packing"); - GLAD_ARB_shadow = has_ext("GL_ARB_shadow"); - GLAD_ARB_shadow_ambient = has_ext("GL_ARB_shadow_ambient"); + GLAD_ARB_sparse_buffer = has_ext("GL_ARB_sparse_buffer"); GLAD_ARB_sparse_texture = has_ext("GL_ARB_sparse_texture"); GLAD_ARB_stencil_texturing = has_ext("GL_ARB_stencil_texturing"); GLAD_ARB_sync = has_ext("GL_ARB_sync"); GLAD_ARB_tessellation_shader = has_ext("GL_ARB_tessellation_shader"); - GLAD_ARB_texture_border_clamp = has_ext("GL_ARB_texture_border_clamp"); + GLAD_ARB_texture_barrier = has_ext("GL_ARB_texture_barrier"); GLAD_ARB_texture_buffer_object = has_ext("GL_ARB_texture_buffer_object"); GLAD_ARB_texture_buffer_object_rgb32 = has_ext("GL_ARB_texture_buffer_object_rgb32"); GLAD_ARB_texture_buffer_range = has_ext("GL_ARB_texture_buffer_range"); - GLAD_ARB_texture_compression = has_ext("GL_ARB_texture_compression"); GLAD_ARB_texture_compression_bptc = has_ext("GL_ARB_texture_compression_bptc"); GLAD_ARB_texture_compression_rgtc = has_ext("GL_ARB_texture_compression_rgtc"); - GLAD_ARB_texture_cube_map = has_ext("GL_ARB_texture_cube_map"); GLAD_ARB_texture_cube_map_array = has_ext("GL_ARB_texture_cube_map_array"); - GLAD_ARB_texture_env_add = has_ext("GL_ARB_texture_env_add"); - GLAD_ARB_texture_env_combine = has_ext("GL_ARB_texture_env_combine"); - GLAD_ARB_texture_env_crossbar = has_ext("GL_ARB_texture_env_crossbar"); - GLAD_ARB_texture_env_dot3 = has_ext("GL_ARB_texture_env_dot3"); GLAD_ARB_texture_float = has_ext("GL_ARB_texture_float"); GLAD_ARB_texture_gather = has_ext("GL_ARB_texture_gather"); GLAD_ARB_texture_mirror_clamp_to_edge = has_ext("GL_ARB_texture_mirror_clamp_to_edge"); - GLAD_ARB_texture_mirrored_repeat = has_ext("GL_ARB_texture_mirrored_repeat"); GLAD_ARB_texture_multisample = has_ext("GL_ARB_texture_multisample"); - GLAD_ARB_texture_non_power_of_two = has_ext("GL_ARB_texture_non_power_of_two"); GLAD_ARB_texture_query_levels = has_ext("GL_ARB_texture_query_levels"); GLAD_ARB_texture_query_lod = has_ext("GL_ARB_texture_query_lod"); GLAD_ARB_texture_rectangle = has_ext("GL_ARB_texture_rectangle"); @@ -7493,156 +6600,155 @@ static void find_extensions(void) { GLAD_ARB_transform_feedback2 = has_ext("GL_ARB_transform_feedback2"); GLAD_ARB_transform_feedback3 = has_ext("GL_ARB_transform_feedback3"); GLAD_ARB_transform_feedback_instanced = has_ext("GL_ARB_transform_feedback_instanced"); - GLAD_ARB_transpose_matrix = has_ext("GL_ARB_transpose_matrix"); + GLAD_ARB_transform_feedback_overflow_query = has_ext("GL_ARB_transform_feedback_overflow_query"); GLAD_ARB_uniform_buffer_object = has_ext("GL_ARB_uniform_buffer_object"); GLAD_ARB_vertex_array_bgra = has_ext("GL_ARB_vertex_array_bgra"); GLAD_ARB_vertex_array_object = has_ext("GL_ARB_vertex_array_object"); GLAD_ARB_vertex_attrib_64bit = has_ext("GL_ARB_vertex_attrib_64bit"); GLAD_ARB_vertex_attrib_binding = has_ext("GL_ARB_vertex_attrib_binding"); - GLAD_ARB_vertex_blend = has_ext("GL_ARB_vertex_blend"); - GLAD_ARB_vertex_buffer_object = has_ext("GL_ARB_vertex_buffer_object"); - GLAD_ARB_vertex_program = has_ext("GL_ARB_vertex_program"); - GLAD_ARB_vertex_shader = has_ext("GL_ARB_vertex_shader"); GLAD_ARB_vertex_type_10f_11f_11f_rev = has_ext("GL_ARB_vertex_type_10f_11f_11f_rev"); GLAD_ARB_vertex_type_2_10_10_10_rev = has_ext("GL_ARB_vertex_type_2_10_10_10_rev"); GLAD_ARB_viewport_array = has_ext("GL_ARB_viewport_array"); - GLAD_ARB_window_pos = has_ext("GL_ARB_window_pos"); - GLAD_EXT_422_pixels = has_ext("GL_EXT_422_pixels"); - GLAD_EXT_abgr = has_ext("GL_EXT_abgr"); + GLAD_EXT_base_instance = has_ext("GL_EXT_base_instance"); + GLAD_EXT_bgra = has_ext("GL_EXT_bgra"); GLAD_EXT_bindable_uniform = has_ext("GL_EXT_bindable_uniform"); - GLAD_EXT_blend_color = has_ext("GL_EXT_blend_color"); - GLAD_EXT_blend_equation_separate = has_ext("GL_EXT_blend_equation_separate"); - GLAD_EXT_blend_func_separate = has_ext("GL_EXT_blend_func_separate"); - GLAD_EXT_blend_minmax = has_ext("GL_EXT_blend_minmax"); - GLAD_EXT_blend_subtract = has_ext("GL_EXT_blend_subtract"); - GLAD_EXT_clip_volume_hint = has_ext("GL_EXT_clip_volume_hint"); - GLAD_EXT_cmyka = has_ext("GL_EXT_cmyka"); GLAD_EXT_color_buffer_half_float = has_ext("GL_EXT_color_buffer_half_float"); - GLAD_EXT_color_subtable = has_ext("GL_EXT_color_subtable"); - GLAD_EXT_compiled_vertex_array = has_ext("GL_EXT_compiled_vertex_array"); - GLAD_EXT_convolution = has_ext("GL_EXT_convolution"); - GLAD_EXT_coordinate_frame = has_ext("GL_EXT_coordinate_frame"); - GLAD_EXT_cull_vertex = has_ext("GL_EXT_cull_vertex"); + GLAD_EXT_copy_image = has_ext("GL_EXT_copy_image"); GLAD_EXT_debug_label = has_ext("GL_EXT_debug_label"); GLAD_EXT_debug_marker = has_ext("GL_EXT_debug_marker"); - GLAD_EXT_depth_bounds_test = has_ext("GL_EXT_depth_bounds_test"); GLAD_EXT_direct_state_access = has_ext("GL_EXT_direct_state_access"); GLAD_EXT_discard_framebuffer = has_ext("GL_EXT_discard_framebuffer"); GLAD_EXT_disjoint_timer_query = has_ext("GL_EXT_disjoint_timer_query"); GLAD_EXT_draw_buffers = has_ext("GL_EXT_draw_buffers"); GLAD_EXT_draw_buffers2 = has_ext("GL_EXT_draw_buffers2"); + GLAD_EXT_draw_buffers_indexed = has_ext("GL_EXT_draw_buffers_indexed"); + GLAD_EXT_draw_elements_base_vertex = has_ext("GL_EXT_draw_elements_base_vertex"); GLAD_EXT_draw_instanced = has_ext("GL_EXT_draw_instanced"); - GLAD_EXT_fog_coord = has_ext("GL_EXT_fog_coord"); GLAD_EXT_framebuffer_blit = has_ext("GL_EXT_framebuffer_blit"); GLAD_EXT_framebuffer_multisample = has_ext("GL_EXT_framebuffer_multisample"); GLAD_EXT_framebuffer_multisample_blit_scaled = has_ext("GL_EXT_framebuffer_multisample_blit_scaled"); GLAD_EXT_framebuffer_object = has_ext("GL_EXT_framebuffer_object"); GLAD_EXT_framebuffer_sRGB = has_ext("GL_EXT_framebuffer_sRGB"); + GLAD_EXT_geometry_point_size = has_ext("GL_EXT_geometry_point_size"); + GLAD_EXT_geometry_shader = has_ext("GL_EXT_geometry_shader"); GLAD_EXT_geometry_shader4 = has_ext("GL_EXT_geometry_shader4"); GLAD_EXT_gpu_program_parameters = has_ext("GL_EXT_gpu_program_parameters"); GLAD_EXT_gpu_shader4 = has_ext("GL_EXT_gpu_shader4"); - GLAD_EXT_histogram = has_ext("GL_EXT_histogram"); - GLAD_EXT_index_array_formats = has_ext("GL_EXT_index_array_formats"); - GLAD_EXT_index_func = has_ext("GL_EXT_index_func"); - GLAD_EXT_index_material = has_ext("GL_EXT_index_material"); - GLAD_EXT_index_texture = has_ext("GL_EXT_index_texture"); + GLAD_EXT_gpu_shader5 = has_ext("GL_EXT_gpu_shader5"); GLAD_EXT_instanced_arrays = has_ext("GL_EXT_instanced_arrays"); - GLAD_EXT_light_texture = has_ext("GL_EXT_light_texture"); GLAD_EXT_map_buffer_range = has_ext("GL_EXT_map_buffer_range"); - GLAD_EXT_misc_attribute = has_ext("GL_EXT_misc_attribute"); - GLAD_EXT_multi_draw_arrays = has_ext("GL_EXT_multi_draw_arrays"); - GLAD_EXT_multisample = has_ext("GL_EXT_multisample"); + GLAD_EXT_multi_draw_indirect = has_ext("GL_EXT_multi_draw_indirect"); GLAD_EXT_multisampled_render_to_texture = has_ext("GL_EXT_multisampled_render_to_texture"); GLAD_EXT_multiview_draw_buffers = has_ext("GL_EXT_multiview_draw_buffers"); GLAD_EXT_occlusion_query_boolean = has_ext("GL_EXT_occlusion_query_boolean"); GLAD_EXT_packed_depth_stencil = has_ext("GL_EXT_packed_depth_stencil"); GLAD_EXT_packed_float = has_ext("GL_EXT_packed_float"); - GLAD_EXT_paletted_texture = has_ext("GL_EXT_paletted_texture"); GLAD_EXT_pixel_buffer_object = has_ext("GL_EXT_pixel_buffer_object"); - GLAD_EXT_pixel_transform = has_ext("GL_EXT_pixel_transform"); - GLAD_EXT_pixel_transform_color_table = has_ext("GL_EXT_pixel_transform_color_table"); - GLAD_EXT_point_parameters = has_ext("GL_EXT_point_parameters"); + GLAD_EXT_polygon_offset_clamp = has_ext("GL_EXT_polygon_offset_clamp"); + GLAD_EXT_post_depth_coverage = has_ext("GL_EXT_post_depth_coverage"); + GLAD_EXT_primitive_bounding_box = has_ext("GL_EXT_primitive_bounding_box"); GLAD_EXT_provoking_vertex = has_ext("GL_EXT_provoking_vertex"); GLAD_EXT_pvrtc_sRGB = has_ext("GL_EXT_pvrtc_sRGB"); + GLAD_EXT_raster_multisample = has_ext("GL_EXT_raster_multisample"); GLAD_EXT_read_format_bgra = has_ext("GL_EXT_read_format_bgra"); + GLAD_EXT_render_snorm = has_ext("GL_EXT_render_snorm"); GLAD_EXT_robustness = has_ext("GL_EXT_robustness"); - GLAD_EXT_secondary_color = has_ext("GL_EXT_secondary_color"); GLAD_EXT_separate_shader_objects = has_ext("GL_EXT_separate_shader_objects"); GLAD_EXT_shader_framebuffer_fetch = has_ext("GL_EXT_shader_framebuffer_fetch"); + GLAD_EXT_shader_image_load_formatted = has_ext("GL_EXT_shader_image_load_formatted"); GLAD_EXT_shader_image_load_store = has_ext("GL_EXT_shader_image_load_store"); + GLAD_EXT_shader_implicit_conversions = has_ext("GL_EXT_shader_implicit_conversions"); GLAD_EXT_shader_integer_mix = has_ext("GL_EXT_shader_integer_mix"); + GLAD_EXT_shader_io_blocks = has_ext("GL_EXT_shader_io_blocks"); + GLAD_EXT_shader_pixel_local_storage = has_ext("GL_EXT_shader_pixel_local_storage"); GLAD_EXT_shader_texture_lod = has_ext("GL_EXT_shader_texture_lod"); - GLAD_EXT_shadow_funcs = has_ext("GL_EXT_shadow_funcs"); GLAD_EXT_shadow_samplers = has_ext("GL_EXT_shadow_samplers"); - GLAD_EXT_shared_texture_palette = has_ext("GL_EXT_shared_texture_palette"); + GLAD_EXT_sparse_texture2 = has_ext("GL_EXT_sparse_texture2"); GLAD_EXT_sRGB = has_ext("GL_EXT_sRGB"); GLAD_EXT_sRGB_write_control = has_ext("GL_EXT_sRGB_write_control"); GLAD_EXT_stencil_clear_tag = has_ext("GL_EXT_stencil_clear_tag"); - GLAD_EXT_stencil_two_side = has_ext("GL_EXT_stencil_two_side"); - GLAD_EXT_stencil_wrap = has_ext("GL_EXT_stencil_wrap"); + GLAD_EXT_tessellation_point_size = has_ext("GL_EXT_tessellation_point_size"); + GLAD_EXT_tessellation_shader = has_ext("GL_EXT_tessellation_shader"); GLAD_EXT_texture_array = has_ext("GL_EXT_texture_array"); + GLAD_EXT_texture_border_clamp = has_ext("GL_EXT_texture_border_clamp"); + GLAD_EXT_texture_buffer = has_ext("GL_EXT_texture_buffer"); GLAD_EXT_texture_buffer_object = has_ext("GL_EXT_texture_buffer_object"); GLAD_EXT_texture_compression_dxt1 = has_ext("GL_EXT_texture_compression_dxt1"); GLAD_EXT_texture_compression_latc = has_ext("GL_EXT_texture_compression_latc"); GLAD_EXT_texture_compression_rgtc = has_ext("GL_EXT_texture_compression_rgtc"); GLAD_EXT_texture_compression_s3tc = has_ext("GL_EXT_texture_compression_s3tc"); GLAD_EXT_texture_cube_map = has_ext("GL_EXT_texture_cube_map"); - GLAD_EXT_texture_env_add = has_ext("GL_EXT_texture_env_add"); - GLAD_EXT_texture_env_combine = has_ext("GL_EXT_texture_env_combine"); - GLAD_EXT_texture_env_dot3 = has_ext("GL_EXT_texture_env_dot3"); + GLAD_EXT_texture_cube_map_array = has_ext("GL_EXT_texture_cube_map_array"); GLAD_EXT_texture_filter_anisotropic = has_ext("GL_EXT_texture_filter_anisotropic"); + GLAD_EXT_texture_filter_minmax = has_ext("GL_EXT_texture_filter_minmax"); GLAD_EXT_texture_format_BGRA8888 = has_ext("GL_EXT_texture_format_BGRA8888"); GLAD_EXT_texture_integer = has_ext("GL_EXT_texture_integer"); - GLAD_EXT_texture_lod_bias = has_ext("GL_EXT_texture_lod_bias"); - GLAD_EXT_texture_mirror_clamp = has_ext("GL_EXT_texture_mirror_clamp"); - GLAD_EXT_texture_perturb_normal = has_ext("GL_EXT_texture_perturb_normal"); + GLAD_EXT_texture_norm16 = has_ext("GL_EXT_texture_norm16"); GLAD_EXT_texture_rg = has_ext("GL_EXT_texture_rg"); GLAD_EXT_texture_shared_exponent = has_ext("GL_EXT_texture_shared_exponent"); GLAD_EXT_texture_snorm = has_ext("GL_EXT_texture_snorm"); GLAD_EXT_texture_sRGB = has_ext("GL_EXT_texture_sRGB"); GLAD_EXT_texture_sRGB_decode = has_ext("GL_EXT_texture_sRGB_decode"); + GLAD_EXT_texture_sRGB_R8 = has_ext("GL_EXT_texture_sRGB_R8"); + GLAD_EXT_texture_sRGB_RG8 = has_ext("GL_EXT_texture_sRGB_RG8"); GLAD_EXT_texture_storage = has_ext("GL_EXT_texture_storage"); GLAD_EXT_texture_swizzle = has_ext("GL_EXT_texture_swizzle"); GLAD_EXT_texture_type_2_10_10_10_REV = has_ext("GL_EXT_texture_type_2_10_10_10_REV"); + GLAD_EXT_texture_view = has_ext("GL_EXT_texture_view"); GLAD_EXT_timer_query = has_ext("GL_EXT_timer_query"); GLAD_EXT_transform_feedback = has_ext("GL_EXT_transform_feedback"); GLAD_EXT_unpack_subimage = has_ext("GL_EXT_unpack_subimage"); GLAD_EXT_vertex_array_bgra = has_ext("GL_EXT_vertex_array_bgra"); GLAD_EXT_vertex_attrib_64bit = has_ext("GL_EXT_vertex_attrib_64bit"); - GLAD_EXT_vertex_shader = has_ext("GL_EXT_vertex_shader"); - GLAD_EXT_vertex_weighting = has_ext("GL_EXT_vertex_weighting"); GLAD_EXT_x11_sync_object = has_ext("GL_EXT_x11_sync_object"); - GLAD_OES_byte_coordinates = has_ext("GL_OES_byte_coordinates"); + GLAD_EXT_YUV_target = has_ext("GL_EXT_YUV_target"); + GLAD_OES_compressed_ETC1_RGB8_sub_texture = has_ext("GL_OES_compressed_ETC1_RGB8_sub_texture"); GLAD_OES_compressed_ETC1_RGB8_texture = has_ext("GL_OES_compressed_ETC1_RGB8_texture"); - GLAD_OES_compressed_paletted_texture = has_ext("GL_OES_compressed_paletted_texture"); + GLAD_OES_copy_image = has_ext("GL_OES_copy_image"); GLAD_OES_depth24 = has_ext("GL_OES_depth24"); GLAD_OES_depth32 = has_ext("GL_OES_depth32"); GLAD_OES_depth_texture = has_ext("GL_OES_depth_texture"); + GLAD_OES_draw_buffers_indexed = has_ext("GL_OES_draw_buffers_indexed"); + GLAD_OES_draw_elements_base_vertex = has_ext("GL_OES_draw_elements_base_vertex"); GLAD_OES_EGL_image = has_ext("GL_OES_EGL_image"); GLAD_OES_EGL_image_external = has_ext("GL_OES_EGL_image_external"); + GLAD_OES_EGL_image_external_essl3 = has_ext("GL_OES_EGL_image_external_essl3"); GLAD_OES_element_index_uint = has_ext("GL_OES_element_index_uint"); GLAD_OES_fbo_render_mipmap = has_ext("GL_OES_fbo_render_mipmap"); - GLAD_OES_fixed_point = has_ext("GL_OES_fixed_point"); GLAD_OES_fragment_precision_high = has_ext("GL_OES_fragment_precision_high"); + GLAD_OES_geometry_point_size = has_ext("GL_OES_geometry_point_size"); + GLAD_OES_geometry_shader = has_ext("GL_OES_geometry_shader"); GLAD_OES_get_program_binary = has_ext("GL_OES_get_program_binary"); + GLAD_OES_gpu_shader5 = has_ext("GL_OES_gpu_shader5"); GLAD_OES_mapbuffer = has_ext("GL_OES_mapbuffer"); GLAD_OES_packed_depth_stencil = has_ext("GL_OES_packed_depth_stencil"); - GLAD_OES_query_matrix = has_ext("GL_OES_query_matrix"); - GLAD_OES_read_format = has_ext("GL_OES_read_format"); + GLAD_OES_primitive_bounding_box = has_ext("GL_OES_primitive_bounding_box"); GLAD_OES_required_internalformat = has_ext("GL_OES_required_internalformat"); GLAD_OES_rgb8_rgba8 = has_ext("GL_OES_rgb8_rgba8"); - GLAD_OES_single_precision = has_ext("GL_OES_single_precision"); + GLAD_OES_sample_shading = has_ext("GL_OES_sample_shading"); + GLAD_OES_sample_variables = has_ext("GL_OES_sample_variables"); + GLAD_OES_shader_image_atomic = has_ext("GL_OES_shader_image_atomic"); + GLAD_OES_shader_io_blocks = has_ext("GL_OES_shader_io_blocks"); + GLAD_OES_shader_multisample_interpolation = has_ext("GL_OES_shader_multisample_interpolation"); GLAD_OES_standard_derivatives = has_ext("GL_OES_standard_derivatives"); GLAD_OES_stencil1 = has_ext("GL_OES_stencil1"); GLAD_OES_stencil4 = has_ext("GL_OES_stencil4"); GLAD_OES_surfaceless_context = has_ext("GL_OES_surfaceless_context"); + GLAD_OES_tessellation_point_size = has_ext("GL_OES_tessellation_point_size"); + GLAD_OES_tessellation_shader = has_ext("GL_OES_tessellation_shader"); GLAD_OES_texture_3D = has_ext("GL_OES_texture_3D"); + GLAD_OES_texture_border_clamp = has_ext("GL_OES_texture_border_clamp"); + GLAD_OES_texture_buffer = has_ext("GL_OES_texture_buffer"); GLAD_OES_texture_compression_astc = has_ext("GL_OES_texture_compression_astc"); + GLAD_OES_texture_cube_map_array = has_ext("GL_OES_texture_cube_map_array"); GLAD_OES_texture_float = has_ext("GL_OES_texture_float"); GLAD_OES_texture_float_linear = has_ext("GL_OES_texture_float_linear"); GLAD_OES_texture_half_float = has_ext("GL_OES_texture_half_float"); GLAD_OES_texture_half_float_linear = has_ext("GL_OES_texture_half_float_linear"); GLAD_OES_texture_npot = has_ext("GL_OES_texture_npot"); + GLAD_OES_texture_stencil8 = has_ext("GL_OES_texture_stencil8"); + GLAD_OES_texture_storage_multisample_2d_array = has_ext("GL_OES_texture_storage_multisample_2d_array"); + GLAD_OES_texture_view = has_ext("GL_OES_texture_view"); GLAD_OES_vertex_array_object = has_ext("GL_OES_vertex_array_object"); GLAD_OES_vertex_half_float = has_ext("GL_OES_vertex_half_float"); GLAD_OES_vertex_type_10_10_10_2 = has_ext("GL_OES_vertex_type_10_10_10_2"); @@ -7653,9 +6759,12 @@ static void find_extensions(void) { GLAD_AMD_debug_output = has_ext("GL_AMD_debug_output"); GLAD_AMD_depth_clamp_separate = has_ext("GL_AMD_depth_clamp_separate"); GLAD_AMD_draw_buffers_blend = has_ext("GL_AMD_draw_buffers_blend"); + GLAD_AMD_gcn_shader = has_ext("GL_AMD_gcn_shader"); + GLAD_AMD_gpu_shader_int64 = has_ext("GL_AMD_gpu_shader_int64"); GLAD_AMD_interleaved_elements = has_ext("GL_AMD_interleaved_elements"); GLAD_AMD_multi_draw_indirect = has_ext("GL_AMD_multi_draw_indirect"); GLAD_AMD_name_gen_delete = has_ext("GL_AMD_name_gen_delete"); + GLAD_AMD_occlusion_query_event = has_ext("GL_AMD_occlusion_query_event"); GLAD_AMD_performance_monitor = has_ext("GL_AMD_performance_monitor"); GLAD_AMD_pinned_memory = has_ext("GL_AMD_pinned_memory"); GLAD_AMD_program_binary_Z400 = has_ext("GL_AMD_program_binary_Z400"); @@ -7669,9 +6778,11 @@ static void find_extensions(void) { GLAD_AMD_stencil_operation_extended = has_ext("GL_AMD_stencil_operation_extended"); GLAD_AMD_texture_texture4 = has_ext("GL_AMD_texture_texture4"); GLAD_AMD_transform_feedback3_lines_triangles = has_ext("GL_AMD_transform_feedback3_lines_triangles"); + GLAD_AMD_transform_feedback4 = has_ext("GL_AMD_transform_feedback4"); GLAD_AMD_vertex_shader_layer = has_ext("GL_AMD_vertex_shader_layer"); GLAD_AMD_vertex_shader_tessellator = has_ext("GL_AMD_vertex_shader_tessellator"); GLAD_AMD_vertex_shader_viewport_index = has_ext("GL_AMD_vertex_shader_viewport_index"); + GLAD_ANDROID_extension_pack_es31a = has_ext("GL_ANDROID_extension_pack_es31a"); GLAD_ANGLE_depth_texture = has_ext("GL_ANGLE_depth_texture"); GLAD_ANGLE_framebuffer_blit = has_ext("GL_ANGLE_framebuffer_blit"); GLAD_ANGLE_framebuffer_multisample = has_ext("GL_ANGLE_framebuffer_multisample"); @@ -7684,6 +6795,8 @@ static void find_extensions(void) { GLAD_ANGLE_translated_shader_source = has_ext("GL_ANGLE_translated_shader_source"); GLAD_APPLE_aux_depth_stencil = has_ext("GL_APPLE_aux_depth_stencil"); GLAD_APPLE_client_storage = has_ext("GL_APPLE_client_storage"); + GLAD_APPLE_clip_distance = has_ext("GL_APPLE_clip_distance"); + GLAD_APPLE_color_buffer_packed_float = has_ext("GL_APPLE_color_buffer_packed_float"); GLAD_APPLE_copy_texture_levels = has_ext("GL_APPLE_copy_texture_levels"); GLAD_APPLE_element_array = has_ext("GL_APPLE_element_array"); GLAD_APPLE_fence = has_ext("GL_APPLE_fence"); @@ -7693,12 +6806,11 @@ static void find_extensions(void) { GLAD_APPLE_object_purgeable = has_ext("GL_APPLE_object_purgeable"); GLAD_APPLE_rgb_422 = has_ext("GL_APPLE_rgb_422"); GLAD_APPLE_row_bytes = has_ext("GL_APPLE_row_bytes"); - GLAD_APPLE_specular_vector = has_ext("GL_APPLE_specular_vector"); GLAD_APPLE_sync = has_ext("GL_APPLE_sync"); GLAD_APPLE_texture_format_BGRA8888 = has_ext("GL_APPLE_texture_format_BGRA8888"); GLAD_APPLE_texture_max_level = has_ext("GL_APPLE_texture_max_level"); + GLAD_APPLE_texture_packed_float = has_ext("GL_APPLE_texture_packed_float"); GLAD_APPLE_texture_range = has_ext("GL_APPLE_texture_range"); - GLAD_APPLE_transform_hint = has_ext("GL_APPLE_transform_hint"); GLAD_APPLE_vertex_array_object = has_ext("GL_APPLE_vertex_array_object"); GLAD_APPLE_vertex_array_range = has_ext("GL_APPLE_vertex_array_range"); GLAD_APPLE_vertex_program_evaluators = has_ext("GL_APPLE_vertex_program_evaluators"); @@ -7706,27 +6818,15 @@ static void find_extensions(void) { GLAD_ARM_mali_program_binary = has_ext("GL_ARM_mali_program_binary"); GLAD_ARM_mali_shader_binary = has_ext("GL_ARM_mali_shader_binary"); GLAD_ARM_rgba8 = has_ext("GL_ARM_rgba8"); - GLAD_ATI_draw_buffers = has_ext("GL_ATI_draw_buffers"); - GLAD_ATI_element_array = has_ext("GL_ATI_element_array"); - GLAD_ATI_envmap_bumpmap = has_ext("GL_ATI_envmap_bumpmap"); - GLAD_ATI_fragment_shader = has_ext("GL_ATI_fragment_shader"); - GLAD_ATI_map_object_buffer = has_ext("GL_ATI_map_object_buffer"); + GLAD_ARM_shader_framebuffer_fetch = has_ext("GL_ARM_shader_framebuffer_fetch"); + GLAD_ARM_shader_framebuffer_fetch_depth_stencil = has_ext("GL_ARM_shader_framebuffer_fetch_depth_stencil"); GLAD_ATI_meminfo = has_ext("GL_ATI_meminfo"); GLAD_ATI_pixel_format_float = has_ext("GL_ATI_pixel_format_float"); - GLAD_ATI_pn_triangles = has_ext("GL_ATI_pn_triangles"); - GLAD_ATI_separate_stencil = has_ext("GL_ATI_separate_stencil"); - GLAD_ATI_text_fragment_shader = has_ext("GL_ATI_text_fragment_shader"); - GLAD_ATI_texture_env_combine3 = has_ext("GL_ATI_texture_env_combine3"); - GLAD_ATI_texture_float = has_ext("GL_ATI_texture_float"); - GLAD_ATI_texture_mirror_once = has_ext("GL_ATI_texture_mirror_once"); - GLAD_ATI_vertex_array_object = has_ext("GL_ATI_vertex_array_object"); - GLAD_ATI_vertex_attrib_array_object = has_ext("GL_ATI_vertex_attrib_array_object"); - GLAD_ATI_vertex_streams = has_ext("GL_ATI_vertex_streams"); + GLAD_DMP_program_binary = has_ext("GL_DMP_program_binary"); GLAD_DMP_shader_binary = has_ext("GL_DMP_shader_binary"); GLAD_FJ_shader_binary_GCCSO = has_ext("GL_FJ_shader_binary_GCCSO"); GLAD_GREMEDY_frame_terminator = has_ext("GL_GREMEDY_frame_terminator"); GLAD_GREMEDY_string_marker = has_ext("GL_GREMEDY_string_marker"); - GLAD_IBM_rasterpos_clip = has_ext("GL_IBM_rasterpos_clip"); GLAD_IMG_multisampled_render_to_texture = has_ext("GL_IMG_multisampled_render_to_texture"); GLAD_IMG_program_binary = has_ext("GL_IMG_program_binary"); GLAD_IMG_read_format = has_ext("GL_IMG_read_format"); @@ -7736,21 +6836,19 @@ static void find_extensions(void) { GLAD_INGR_blend_func_separate = has_ext("GL_INGR_blend_func_separate"); GLAD_INTEL_fragment_shader_ordering = has_ext("GL_INTEL_fragment_shader_ordering"); GLAD_INTEL_map_texture = has_ext("GL_INTEL_map_texture"); - GLAD_INTEL_parallel_arrays = has_ext("GL_INTEL_parallel_arrays"); + GLAD_INTEL_performance_query = has_ext("GL_INTEL_performance_query"); GLAD_MESA_pack_invert = has_ext("GL_MESA_pack_invert"); - GLAD_MESA_resize_buffers = has_ext("GL_MESA_resize_buffers"); - GLAD_MESA_window_pos = has_ext("GL_MESA_window_pos"); GLAD_MESA_ycbcr_texture = has_ext("GL_MESA_ycbcr_texture"); GLAD_MESAX_texture_stack = has_ext("GL_MESAX_texture_stack"); GLAD_NV_bindless_multi_draw_indirect = has_ext("GL_NV_bindless_multi_draw_indirect"); + GLAD_NV_bindless_multi_draw_indirect_count = has_ext("GL_NV_bindless_multi_draw_indirect_count"); GLAD_NV_bindless_texture = has_ext("GL_NV_bindless_texture"); GLAD_NV_blend_equation_advanced = has_ext("GL_NV_blend_equation_advanced"); GLAD_NV_blend_equation_advanced_coherent = has_ext("GL_NV_blend_equation_advanced_coherent"); - GLAD_NV_blend_square = has_ext("GL_NV_blend_square"); GLAD_NV_compute_program5 = has_ext("GL_NV_compute_program5"); GLAD_NV_conditional_render = has_ext("GL_NV_conditional_render"); + GLAD_NV_conservative_raster = has_ext("GL_NV_conservative_raster"); GLAD_NV_copy_buffer = has_ext("GL_NV_copy_buffer"); - GLAD_NV_copy_depth_to_color = has_ext("GL_NV_copy_depth_to_color"); GLAD_NV_copy_image = has_ext("GL_NV_copy_image"); GLAD_NV_coverage_sample = has_ext("GL_NV_coverage_sample"); GLAD_NV_deep_texture3D = has_ext("GL_NV_deep_texture3D"); @@ -7760,40 +6858,38 @@ static void find_extensions(void) { GLAD_NV_draw_buffers = has_ext("GL_NV_draw_buffers"); GLAD_NV_draw_instanced = has_ext("GL_NV_draw_instanced"); GLAD_NV_draw_texture = has_ext("GL_NV_draw_texture"); - GLAD_NV_evaluators = has_ext("GL_NV_evaluators"); GLAD_NV_explicit_attrib_location = has_ext("GL_NV_explicit_attrib_location"); GLAD_NV_explicit_multisample = has_ext("GL_NV_explicit_multisample"); GLAD_NV_fbo_color_attachments = has_ext("GL_NV_fbo_color_attachments"); GLAD_NV_fence = has_ext("GL_NV_fence"); + GLAD_NV_fill_rectangle = has_ext("GL_NV_fill_rectangle"); GLAD_NV_float_buffer = has_ext("GL_NV_float_buffer"); - GLAD_NV_fog_distance = has_ext("GL_NV_fog_distance"); - GLAD_NV_fragment_program = has_ext("GL_NV_fragment_program"); - GLAD_NV_fragment_program2 = has_ext("GL_NV_fragment_program2"); + GLAD_NV_fragment_coverage_to_color = has_ext("GL_NV_fragment_coverage_to_color"); GLAD_NV_fragment_program4 = has_ext("GL_NV_fragment_program4"); - GLAD_NV_fragment_program_option = has_ext("GL_NV_fragment_program_option"); + GLAD_NV_fragment_shader_interlock = has_ext("GL_NV_fragment_shader_interlock"); GLAD_NV_framebuffer_blit = has_ext("GL_NV_framebuffer_blit"); + GLAD_NV_framebuffer_mixed_samples = has_ext("GL_NV_framebuffer_mixed_samples"); GLAD_NV_framebuffer_multisample = has_ext("GL_NV_framebuffer_multisample"); GLAD_NV_framebuffer_multisample_coverage = has_ext("GL_NV_framebuffer_multisample_coverage"); GLAD_NV_generate_mipmap_sRGB = has_ext("GL_NV_generate_mipmap_sRGB"); GLAD_NV_geometry_program4 = has_ext("GL_NV_geometry_program4"); GLAD_NV_geometry_shader4 = has_ext("GL_NV_geometry_shader4"); + GLAD_NV_geometry_shader_passthrough = has_ext("GL_NV_geometry_shader_passthrough"); GLAD_NV_gpu_program4 = has_ext("GL_NV_gpu_program4"); GLAD_NV_gpu_program5 = has_ext("GL_NV_gpu_program5"); GLAD_NV_gpu_program5_mem_extended = has_ext("GL_NV_gpu_program5_mem_extended"); GLAD_NV_gpu_shader5 = has_ext("GL_NV_gpu_shader5"); GLAD_NV_half_float = has_ext("GL_NV_half_float"); + GLAD_NV_image_formats = has_ext("GL_NV_image_formats"); GLAD_NV_instanced_arrays = has_ext("GL_NV_instanced_arrays"); - GLAD_NV_light_max_exponent = has_ext("GL_NV_light_max_exponent"); + GLAD_NV_internalformat_sample_query = has_ext("GL_NV_internalformat_sample_query"); GLAD_NV_multisample_coverage = has_ext("GL_NV_multisample_coverage"); - GLAD_NV_multisample_filter_hint = has_ext("GL_NV_multisample_filter_hint"); GLAD_NV_non_square_matrices = has_ext("GL_NV_non_square_matrices"); GLAD_NV_occlusion_query = has_ext("GL_NV_occlusion_query"); - GLAD_NV_packed_depth_stencil = has_ext("GL_NV_packed_depth_stencil"); GLAD_NV_parameter_buffer_object = has_ext("GL_NV_parameter_buffer_object"); GLAD_NV_parameter_buffer_object2 = has_ext("GL_NV_parameter_buffer_object2"); GLAD_NV_path_rendering = has_ext("GL_NV_path_rendering"); - GLAD_NV_pixel_data_range = has_ext("GL_NV_pixel_data_range"); - GLAD_NV_point_sprite = has_ext("GL_NV_point_sprite"); + GLAD_NV_path_rendering_shared_edge = has_ext("GL_NV_path_rendering_shared_edge"); GLAD_NV_present_video = has_ext("GL_NV_present_video"); GLAD_NV_primitive_restart = has_ext("GL_NV_primitive_restart"); GLAD_NV_read_buffer = has_ext("GL_NV_read_buffer"); @@ -7801,51 +6897,39 @@ static void find_extensions(void) { GLAD_NV_read_depth = has_ext("GL_NV_read_depth"); GLAD_NV_read_depth_stencil = has_ext("GL_NV_read_depth_stencil"); GLAD_NV_read_stencil = has_ext("GL_NV_read_stencil"); - GLAD_NV_register_combiners = has_ext("GL_NV_register_combiners"); - GLAD_NV_register_combiners2 = has_ext("GL_NV_register_combiners2"); + GLAD_NV_sample_locations = has_ext("GL_NV_sample_locations"); + GLAD_NV_sample_mask_override_coverage = has_ext("GL_NV_sample_mask_override_coverage"); GLAD_NV_shader_atomic_counters = has_ext("GL_NV_shader_atomic_counters"); GLAD_NV_shader_atomic_float = has_ext("GL_NV_shader_atomic_float"); + GLAD_NV_shader_atomic_fp16_vector = has_ext("GL_NV_shader_atomic_fp16_vector"); + GLAD_NV_shader_atomic_int64 = has_ext("GL_NV_shader_atomic_int64"); GLAD_NV_shader_buffer_load = has_ext("GL_NV_shader_buffer_load"); GLAD_NV_shader_buffer_store = has_ext("GL_NV_shader_buffer_store"); + GLAD_NV_shader_noperspective_interpolation = has_ext("GL_NV_shader_noperspective_interpolation"); GLAD_NV_shader_storage_buffer_object = has_ext("GL_NV_shader_storage_buffer_object"); + GLAD_NV_shader_thread_group = has_ext("GL_NV_shader_thread_group"); + GLAD_NV_shader_thread_shuffle = has_ext("GL_NV_shader_thread_shuffle"); GLAD_NV_shadow_samplers_array = has_ext("GL_NV_shadow_samplers_array"); GLAD_NV_shadow_samplers_cube = has_ext("GL_NV_shadow_samplers_cube"); GLAD_NV_sRGB_formats = has_ext("GL_NV_sRGB_formats"); GLAD_NV_tessellation_program5 = has_ext("GL_NV_tessellation_program5"); - GLAD_NV_texgen_emboss = has_ext("GL_NV_texgen_emboss"); - GLAD_NV_texgen_reflection = has_ext("GL_NV_texgen_reflection"); GLAD_NV_texture_barrier = has_ext("GL_NV_texture_barrier"); GLAD_NV_texture_border_clamp = has_ext("GL_NV_texture_border_clamp"); GLAD_NV_texture_compression_s3tc_update = has_ext("GL_NV_texture_compression_s3tc_update"); - GLAD_NV_texture_compression_vtc = has_ext("GL_NV_texture_compression_vtc"); - GLAD_NV_texture_env_combine4 = has_ext("GL_NV_texture_env_combine4"); - GLAD_NV_texture_expand_normal = has_ext("GL_NV_texture_expand_normal"); GLAD_NV_texture_multisample = has_ext("GL_NV_texture_multisample"); GLAD_NV_texture_npot_2D_mipmap = has_ext("GL_NV_texture_npot_2D_mipmap"); - GLAD_NV_texture_rectangle = has_ext("GL_NV_texture_rectangle"); - GLAD_NV_texture_shader = has_ext("GL_NV_texture_shader"); - GLAD_NV_texture_shader2 = has_ext("GL_NV_texture_shader2"); - GLAD_NV_texture_shader3 = has_ext("GL_NV_texture_shader3"); GLAD_NV_transform_feedback = has_ext("GL_NV_transform_feedback"); GLAD_NV_transform_feedback2 = has_ext("GL_NV_transform_feedback2"); + GLAD_NV_uniform_buffer_unified_memory = has_ext("GL_NV_uniform_buffer_unified_memory"); GLAD_NV_vdpau_interop = has_ext("GL_NV_vdpau_interop"); - GLAD_NV_vertex_array_range = has_ext("GL_NV_vertex_array_range"); - GLAD_NV_vertex_array_range2 = has_ext("GL_NV_vertex_array_range2"); GLAD_NV_vertex_attrib_integer_64bit = has_ext("GL_NV_vertex_attrib_integer_64bit"); GLAD_NV_vertex_buffer_unified_memory = has_ext("GL_NV_vertex_buffer_unified_memory"); - GLAD_NV_vertex_program = has_ext("GL_NV_vertex_program"); - GLAD_NV_vertex_program1_1 = has_ext("GL_NV_vertex_program1_1"); - GLAD_NV_vertex_program2 = has_ext("GL_NV_vertex_program2"); - GLAD_NV_vertex_program2_option = has_ext("GL_NV_vertex_program2_option"); - GLAD_NV_vertex_program3 = has_ext("GL_NV_vertex_program3"); GLAD_NV_vertex_program4 = has_ext("GL_NV_vertex_program4"); GLAD_NV_video_capture = has_ext("GL_NV_video_capture"); + GLAD_NV_viewport_array = has_ext("GL_NV_viewport_array"); + GLAD_NV_viewport_array2 = has_ext("GL_NV_viewport_array2"); GLAD_NVX_conditional_render = has_ext("GL_NVX_conditional_render"); - GLAD_OML_interlace = has_ext("GL_OML_interlace"); - GLAD_OML_resample = has_ext("GL_OML_resample"); - GLAD_OML_subsample = has_ext("GL_OML_subsample"); - GLAD_PGI_misc_hints = has_ext("GL_PGI_misc_hints"); - GLAD_PGI_vertex_hints = has_ext("GL_PGI_vertex_hints"); + GLAD_NVX_gpu_memory_info = has_ext("GL_NVX_gpu_memory_info"); GLAD_QCOM_alpha_test = has_ext("GL_QCOM_alpha_test"); GLAD_QCOM_binning_control = has_ext("GL_QCOM_binning_control"); GLAD_QCOM_driver_control = has_ext("GL_QCOM_driver_control"); @@ -7854,10 +6938,13 @@ static void find_extensions(void) { GLAD_QCOM_perfmon_global_mode = has_ext("GL_QCOM_perfmon_global_mode"); GLAD_QCOM_tiled_rendering = has_ext("GL_QCOM_tiled_rendering"); GLAD_QCOM_writeonly_rendering = has_ext("GL_QCOM_writeonly_rendering"); - GLAD_REND_screen_coordinates = has_ext("GL_REND_screen_coordinates"); - GLAD_S3_s3tc = has_ext("GL_S3_s3tc"); - GLAD_SGIS_generate_mipmap = has_ext("GL_SGIS_generate_mipmap"); - GLAD_SGIX_texture_lod_bias = has_ext("GL_SGIX_texture_lod_bias"); + GLAD_SGIX_calligraphic_fragment = has_ext("GL_SGIX_calligraphic_fragment"); + GLAD_SGIX_depth_pass_instrument = has_ext("GL_SGIX_depth_pass_instrument"); + GLAD_SGIX_pixel_tiles = has_ext("GL_SGIX_pixel_tiles"); + GLAD_SGIX_scalebias_hint = has_ext("GL_SGIX_scalebias_hint"); + GLAD_SGIX_subsample = has_ext("GL_SGIX_subsample"); + GLAD_SGIX_ycrcb_subsample = has_ext("GL_SGIX_ycrcb_subsample"); + GLAD_SGIX_ycrcba = has_ext("GL_SGIX_ycrcba"); GLAD_VIV_shader_binary = has_ext("GL_VIV_shader_binary"); } @@ -7886,8 +6973,10 @@ static void find_core(void) { GLAD_VERSION_4_2 = gles == 0 && ((major == 4 && minor >= 2) || major > 4); GLAD_VERSION_4_3 = gles == 0 && ((major == 4 && minor >= 3) || major > 4); GLAD_VERSION_4_4 = gles == 0 && ((major == 4 && minor >= 4) || major > 4); + GLAD_VERSION_4_5 = gles == 0 && ((major == 4 && minor >= 5) || major > 4); GLAD_ES_VERSION_2_0 = gles == 1 && ((major == 2 && minor >= 0) || major > 2); GLAD_ES_VERSION_3_0 = gles == 1 && ((major == 3 && minor >= 0) || major > 3); + GLAD_ES_VERSION_3_1 = gles == 1 && ((major == 3 && minor >= 1) || major > 3); } bool gladLoadGLLoader(LOADER load) { @@ -7912,11 +7001,15 @@ bool gladLoadGLLoader(LOADER load) { load_GL_VERSION_4_2(load); load_GL_VERSION_4_3(load); load_GL_VERSION_4_4(load); + load_GL_VERSION_4_5(load); load_GL_ES_VERSION_2_0(load); load_GL_ES_VERSION_3_0(load); + load_GL_ES_VERSION_3_1(load); find_extensions(); + load_GL_KHR_blend_equation_advanced(load); load_GL_KHR_debug(load); + load_GL_KHR_robustness(load); load_GL_ARB_base_instance(load); load_GL_ARB_bindless_texture(load); load_GL_ARB_blend_func_extended(load); @@ -7924,23 +7017,25 @@ bool gladLoadGLLoader(LOADER load) { load_GL_ARB_cl_event(load); load_GL_ARB_clear_buffer_object(load); load_GL_ARB_clear_texture(load); + load_GL_ARB_clip_control(load); load_GL_ARB_color_buffer_float(load); load_GL_ARB_compute_shader(load); load_GL_ARB_compute_variable_group_size(load); load_GL_ARB_copy_buffer(load); load_GL_ARB_copy_image(load); load_GL_ARB_debug_output(load); - load_GL_ARB_draw_buffers(load); + load_GL_ARB_direct_state_access(load); load_GL_ARB_draw_buffers_blend(load); load_GL_ARB_draw_elements_base_vertex(load); load_GL_ARB_draw_indirect(load); load_GL_ARB_draw_instanced(load); load_GL_ARB_ES2_compatibility(load); - load_GL_ARB_fragment_program(load); + load_GL_ARB_ES3_1_compatibility(load); load_GL_ARB_framebuffer_no_attachments(load); load_GL_ARB_framebuffer_object(load); load_GL_ARB_geometry_shader4(load); load_GL_ARB_get_program_binary(load); + load_GL_ARB_get_texture_sub_image(load); load_GL_ARB_gpu_shader_fp64(load); load_GL_ARB_indirect_parameters(load); load_GL_ARB_instanced_arrays(load); @@ -7948,13 +7043,8 @@ bool gladLoadGLLoader(LOADER load) { load_GL_ARB_internalformat_query2(load); load_GL_ARB_invalidate_subdata(load); load_GL_ARB_map_buffer_range(load); - load_GL_ARB_matrix_palette(load); load_GL_ARB_multi_bind(load); load_GL_ARB_multi_draw_indirect(load); - load_GL_ARB_multisample(load); - load_GL_ARB_multitexture(load); - load_GL_ARB_occlusion_query(load); - load_GL_ARB_point_parameters(load); load_GL_ARB_program_interface_query(load); load_GL_ARB_provoking_vertex(load); load_GL_ARB_robustness(load); @@ -7963,16 +7053,16 @@ bool gladLoadGLLoader(LOADER load) { load_GL_ARB_separate_shader_objects(load); load_GL_ARB_shader_atomic_counters(load); load_GL_ARB_shader_image_load_store(load); - load_GL_ARB_shader_objects(load); load_GL_ARB_shader_storage_buffer_object(load); load_GL_ARB_shader_subroutine(load); load_GL_ARB_shading_language_include(load); + load_GL_ARB_sparse_buffer(load); load_GL_ARB_sparse_texture(load); load_GL_ARB_sync(load); load_GL_ARB_tessellation_shader(load); + load_GL_ARB_texture_barrier(load); load_GL_ARB_texture_buffer_object(load); load_GL_ARB_texture_buffer_range(load); - load_GL_ARB_texture_compression(load); load_GL_ARB_texture_multisample(load); load_GL_ARB_texture_storage(load); load_GL_ARB_texture_storage_multisample(load); @@ -7981,89 +7071,82 @@ bool gladLoadGLLoader(LOADER load) { load_GL_ARB_transform_feedback2(load); load_GL_ARB_transform_feedback3(load); load_GL_ARB_transform_feedback_instanced(load); - load_GL_ARB_transpose_matrix(load); load_GL_ARB_uniform_buffer_object(load); load_GL_ARB_vertex_array_object(load); load_GL_ARB_vertex_attrib_64bit(load); load_GL_ARB_vertex_attrib_binding(load); - load_GL_ARB_vertex_blend(load); - load_GL_ARB_vertex_buffer_object(load); - load_GL_ARB_vertex_program(load); - load_GL_ARB_vertex_shader(load); load_GL_ARB_vertex_type_2_10_10_10_rev(load); load_GL_ARB_viewport_array(load); - load_GL_ARB_window_pos(load); + load_GL_EXT_base_instance(load); load_GL_EXT_bindable_uniform(load); - load_GL_EXT_blend_color(load); - load_GL_EXT_blend_equation_separate(load); - load_GL_EXT_blend_func_separate(load); - load_GL_EXT_blend_minmax(load); - load_GL_EXT_color_subtable(load); - load_GL_EXT_compiled_vertex_array(load); - load_GL_EXT_convolution(load); - load_GL_EXT_coordinate_frame(load); - load_GL_EXT_cull_vertex(load); + load_GL_EXT_copy_image(load); load_GL_EXT_debug_label(load); load_GL_EXT_debug_marker(load); - load_GL_EXT_depth_bounds_test(load); load_GL_EXT_direct_state_access(load); load_GL_EXT_discard_framebuffer(load); load_GL_EXT_disjoint_timer_query(load); load_GL_EXT_draw_buffers(load); load_GL_EXT_draw_buffers2(load); + load_GL_EXT_draw_buffers_indexed(load); + load_GL_EXT_draw_elements_base_vertex(load); load_GL_EXT_draw_instanced(load); - load_GL_EXT_fog_coord(load); load_GL_EXT_framebuffer_blit(load); load_GL_EXT_framebuffer_multisample(load); load_GL_EXT_framebuffer_object(load); + load_GL_EXT_geometry_shader(load); load_GL_EXT_geometry_shader4(load); load_GL_EXT_gpu_program_parameters(load); load_GL_EXT_gpu_shader4(load); - load_GL_EXT_histogram(load); - load_GL_EXT_index_func(load); - load_GL_EXT_index_material(load); load_GL_EXT_instanced_arrays(load); - load_GL_EXT_light_texture(load); load_GL_EXT_map_buffer_range(load); - load_GL_EXT_multi_draw_arrays(load); - load_GL_EXT_multisample(load); + load_GL_EXT_multi_draw_indirect(load); load_GL_EXT_multisampled_render_to_texture(load); load_GL_EXT_multiview_draw_buffers(load); load_GL_EXT_occlusion_query_boolean(load); - load_GL_EXT_paletted_texture(load); - load_GL_EXT_pixel_transform(load); - load_GL_EXT_point_parameters(load); + load_GL_EXT_polygon_offset_clamp(load); + load_GL_EXT_primitive_bounding_box(load); load_GL_EXT_provoking_vertex(load); + load_GL_EXT_raster_multisample(load); load_GL_EXT_robustness(load); - load_GL_EXT_secondary_color(load); load_GL_EXT_separate_shader_objects(load); load_GL_EXT_shader_image_load_store(load); load_GL_EXT_stencil_clear_tag(load); - load_GL_EXT_stencil_two_side(load); + load_GL_EXT_tessellation_shader(load); + load_GL_EXT_texture_array(load); + load_GL_EXT_texture_border_clamp(load); + load_GL_EXT_texture_buffer(load); load_GL_EXT_texture_buffer_object(load); + load_GL_EXT_texture_filter_minmax(load); load_GL_EXT_texture_integer(load); - load_GL_EXT_texture_perturb_normal(load); load_GL_EXT_texture_storage(load); + load_GL_EXT_texture_view(load); load_GL_EXT_timer_query(load); load_GL_EXT_transform_feedback(load); load_GL_EXT_vertex_attrib_64bit(load); - load_GL_EXT_vertex_shader(load); - load_GL_EXT_vertex_weighting(load); load_GL_EXT_x11_sync_object(load); - load_GL_OES_byte_coordinates(load); + load_GL_OES_copy_image(load); + load_GL_OES_draw_buffers_indexed(load); + load_GL_OES_draw_elements_base_vertex(load); load_GL_OES_EGL_image(load); - load_GL_OES_fixed_point(load); + load_GL_OES_geometry_shader(load); load_GL_OES_get_program_binary(load); load_GL_OES_mapbuffer(load); - load_GL_OES_query_matrix(load); - load_GL_OES_single_precision(load); + load_GL_OES_primitive_bounding_box(load); + load_GL_OES_sample_shading(load); + load_GL_OES_tessellation_shader(load); load_GL_OES_texture_3D(load); + load_GL_OES_texture_border_clamp(load); + load_GL_OES_texture_buffer(load); + load_GL_OES_texture_storage_multisample_2d_array(load); + load_GL_OES_texture_view(load); load_GL_OES_vertex_array_object(load); load_GL_AMD_debug_output(load); load_GL_AMD_draw_buffers_blend(load); + load_GL_AMD_gpu_shader_int64(load); load_GL_AMD_interleaved_elements(load); load_GL_AMD_multi_draw_indirect(load); load_GL_AMD_name_gen_delete(load); + load_GL_AMD_occlusion_query_event(load); load_GL_AMD_performance_monitor(load); load_GL_AMD_sample_positions(load); load_GL_AMD_sparse_texture(load); @@ -8084,28 +7167,18 @@ bool gladLoadGLLoader(LOADER load) { load_GL_APPLE_vertex_array_object(load); load_GL_APPLE_vertex_array_range(load); load_GL_APPLE_vertex_program_evaluators(load); - load_GL_ATI_draw_buffers(load); - load_GL_ATI_element_array(load); - load_GL_ATI_envmap_bumpmap(load); - load_GL_ATI_fragment_shader(load); - load_GL_ATI_map_object_buffer(load); - load_GL_ATI_pn_triangles(load); - load_GL_ATI_separate_stencil(load); - load_GL_ATI_vertex_array_object(load); - load_GL_ATI_vertex_attrib_array_object(load); - load_GL_ATI_vertex_streams(load); load_GL_GREMEDY_frame_terminator(load); load_GL_GREMEDY_string_marker(load); load_GL_IMG_multisampled_render_to_texture(load); load_GL_INGR_blend_func_separate(load); load_GL_INTEL_map_texture(load); - load_GL_INTEL_parallel_arrays(load); - load_GL_MESA_resize_buffers(load); - load_GL_MESA_window_pos(load); + load_GL_INTEL_performance_query(load); load_GL_NV_bindless_multi_draw_indirect(load); + load_GL_NV_bindless_multi_draw_indirect_count(load); load_GL_NV_bindless_texture(load); load_GL_NV_blend_equation_advanced(load); load_GL_NV_conditional_render(load); + load_GL_NV_conservative_raster(load); load_GL_NV_copy_buffer(load); load_GL_NV_copy_image(load); load_GL_NV_coverage_sample(load); @@ -8113,11 +7186,11 @@ bool gladLoadGLLoader(LOADER load) { load_GL_NV_draw_buffers(load); load_GL_NV_draw_instanced(load); load_GL_NV_draw_texture(load); - load_GL_NV_evaluators(load); load_GL_NV_explicit_multisample(load); load_GL_NV_fence(load); - load_GL_NV_fragment_program(load); + load_GL_NV_fragment_coverage_to_color(load); load_GL_NV_framebuffer_blit(load); + load_GL_NV_framebuffer_mixed_samples(load); load_GL_NV_framebuffer_multisample(load); load_GL_NV_framebuffer_multisample_coverage(load); load_GL_NV_geometry_program4(load); @@ -8126,31 +7199,27 @@ bool gladLoadGLLoader(LOADER load) { load_GL_NV_gpu_shader5(load); load_GL_NV_half_float(load); load_GL_NV_instanced_arrays(load); + load_GL_NV_internalformat_sample_query(load); load_GL_NV_non_square_matrices(load); load_GL_NV_occlusion_query(load); load_GL_NV_parameter_buffer_object(load); load_GL_NV_path_rendering(load); - load_GL_NV_pixel_data_range(load); - load_GL_NV_point_sprite(load); load_GL_NV_present_video(load); load_GL_NV_primitive_restart(load); load_GL_NV_read_buffer(load); - load_GL_NV_register_combiners(load); - load_GL_NV_register_combiners2(load); + load_GL_NV_sample_locations(load); load_GL_NV_shader_buffer_load(load); load_GL_NV_texture_barrier(load); load_GL_NV_texture_multisample(load); load_GL_NV_transform_feedback(load); load_GL_NV_transform_feedback2(load); load_GL_NV_vdpau_interop(load); - load_GL_NV_vertex_array_range(load); load_GL_NV_vertex_attrib_integer_64bit(load); load_GL_NV_vertex_buffer_unified_memory(load); - load_GL_NV_vertex_program(load); load_GL_NV_vertex_program4(load); load_GL_NV_video_capture(load); + load_GL_NV_viewport_array(load); load_GL_NVX_conditional_render(load); - load_GL_PGI_misc_hints(load); load_GL_QCOM_alpha_test(load); load_GL_QCOM_driver_control(load); load_GL_QCOM_extended_get(load); diff --git a/jni/love/src/libraries/glad/glad.hpp b/jni/love/src/libraries/glad/glad.hpp index 2608bc86..aafdfc64 100644 --- a/jni/love/src/libraries/glad/glad.hpp +++ b/jni/love/src/libraries/glad/glad.hpp @@ -37,6 +37,7 @@ #ifndef WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN 1 #endif + #include #ifdef near @@ -59,6 +60,9 @@ #define GLAPI extern #endif +/* Moved here from inside the namespace to prevent some compilation issues. */ +#include + namespace glad { bool gladLoadGL(void); @@ -67,7 +71,6 @@ typedef void* (* LOADER)(const char *name); bool gladLoadGLLoader(LOADER); -#include #ifndef GLEXT_64_TYPES_DEFINED /* This code block is duplicated in glxext.h, so must be protected */ #define GLEXT_64_TYPES_DEFINED @@ -2573,11 +2576,13 @@ extern GLboolean GLAD_VERSION_3_1; #define GL_UNIFORM_BUFFER_START 0x8A29 #define GL_UNIFORM_BUFFER_SIZE 0x8A2A #define GL_MAX_VERTEX_UNIFORM_BLOCKS 0x8A2B +#define GL_MAX_GEOMETRY_UNIFORM_BLOCKS 0x8A2C #define GL_MAX_FRAGMENT_UNIFORM_BLOCKS 0x8A2D #define GL_MAX_COMBINED_UNIFORM_BLOCKS 0x8A2E #define GL_MAX_UNIFORM_BUFFER_BINDINGS 0x8A2F #define GL_MAX_UNIFORM_BLOCK_SIZE 0x8A30 #define GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS 0x8A31 +#define GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS 0x8A32 #define GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS 0x8A33 #define GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT 0x8A34 #define GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH 0x8A35 @@ -2596,6 +2601,7 @@ extern GLboolean GLAD_VERSION_3_1; #define GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS 0x8A42 #define GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES 0x8A43 #define GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER 0x8A44 +#define GL_UNIFORM_BLOCK_REFERENCED_BY_GEOMETRY_SHADER 0x8A45 #define GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER 0x8A46 #define GL_INVALID_INDEX 0xFFFFFFFF typedef void (APIENTRYP pfn_glDrawArraysInstanced) (GLenum, GLint, GLsizei, GLsizei); @@ -3251,6 +3257,10 @@ extern pfn_glGetDoublei_v fp_glGetDoublei_v; /* GL_VERSION_4_2 */ extern GLboolean GLAD_VERSION_4_2; +#define GL_COPY_READ_BUFFER_BINDING 0x8F36 +#define GL_COPY_WRITE_BUFFER_BINDING 0x8F37 +#define GL_TRANSFORM_FEEDBACK_ACTIVE 0x8E24 +#define GL_TRANSFORM_FEEDBACK_PAUSED 0x8E23 #define GL_UNPACK_COMPRESSED_BLOCK_WIDTH 0x9127 #define GL_UNPACK_COMPRESSED_BLOCK_HEIGHT 0x9128 #define GL_UNPACK_COMPRESSED_BLOCK_DEPTH 0x9129 @@ -3354,6 +3364,10 @@ extern GLboolean GLAD_VERSION_4_2; #define GL_MAX_GEOMETRY_IMAGE_UNIFORMS 0x90CD #define GL_MAX_FRAGMENT_IMAGE_UNIFORMS 0x90CE #define GL_MAX_COMBINED_IMAGE_UNIFORMS 0x90CF +#define GL_COMPRESSED_RGBA_BPTC_UNORM 0x8E8C +#define GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM 0x8E8D +#define GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT 0x8E8E +#define GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT 0x8E8F #define GL_TEXTURE_IMMUTABLE_FORMAT 0x912F typedef void (APIENTRYP pfn_glDrawArraysInstancedBaseInstance) (GLenum, GLint, GLsizei, GLsizei, GLuint); extern pfn_glDrawArraysInstancedBaseInstance fp_glDrawArraysInstancedBaseInstance; @@ -3414,6 +3428,7 @@ extern GLboolean GLAD_VERSION_4_3; #define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_COMPUTE_SHADER 0x90ED #define GL_DISPATCH_INDIRECT_BUFFER 0x90EE #define GL_DISPATCH_INDIRECT_BUFFER_BINDING 0x90EF +#define GL_COMPUTE_SHADER_BIT 0x00000020 #define GL_DEBUG_OUTPUT_SYNCHRONOUS 0x8242 #define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH 0x8243 #define GL_DEBUG_CALLBACK_FUNCTION 0x8244 @@ -3638,6 +3653,7 @@ extern GLboolean GLAD_VERSION_4_3; #define GL_VERTEX_BINDING_STRIDE 0x82D8 #define GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET 0x82D9 #define GL_MAX_VERTEX_ATTRIB_BINDINGS 0x82DA +#define GL_VERTEX_BINDING_BUFFER 0x8F4F #define GL_DISPLAY_LIST 0x82E7 typedef void (APIENTRYP pfn_glClearBufferData) (GLenum, GLenum, GLenum, GLenum, const void*); extern pfn_glClearBufferData fp_glClearBufferData; @@ -3766,6 +3782,275 @@ extern pfn_glBindImageTextures fp_glBindImageTextures; typedef void (APIENTRYP pfn_glBindVertexBuffers) (GLuint, GLsizei, const GLuint*, const GLintptr*, const GLsizei*); extern pfn_glBindVertexBuffers fp_glBindVertexBuffers; + /* GL_VERSION_4_5 */ +extern GLboolean GLAD_VERSION_4_5; +#define GL_CONTEXT_LOST 0x0507 +#define GL_NEGATIVE_ONE_TO_ONE 0x935E +#define GL_ZERO_TO_ONE 0x935F +#define GL_CLIP_ORIGIN 0x935C +#define GL_CLIP_DEPTH_MODE 0x935D +#define GL_QUERY_WAIT_INVERTED 0x8E17 +#define GL_QUERY_NO_WAIT_INVERTED 0x8E18 +#define GL_QUERY_BY_REGION_WAIT_INVERTED 0x8E19 +#define GL_QUERY_BY_REGION_NO_WAIT_INVERTED 0x8E1A +#define GL_MAX_CULL_DISTANCES 0x82F9 +#define GL_MAX_COMBINED_CLIP_AND_CULL_DISTANCES 0x82FA +#define GL_TEXTURE_TARGET 0x1006 +#define GL_QUERY_TARGET 0x82EA +#define GL_GUILTY_CONTEXT_RESET 0x8253 +#define GL_INNOCENT_CONTEXT_RESET 0x8254 +#define GL_UNKNOWN_CONTEXT_RESET 0x8255 +#define GL_RESET_NOTIFICATION_STRATEGY 0x8256 +#define GL_LOSE_CONTEXT_ON_RESET 0x8252 +#define GL_NO_RESET_NOTIFICATION 0x8261 +#define GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT 0x00000004 +#define GL_CONTEXT_RELEASE_BEHAVIOR 0x82FB +#define GL_CONTEXT_RELEASE_BEHAVIOR_FLUSH 0x82FC +typedef void (APIENTRYP pfn_glClipControl) (GLenum, GLenum); +extern pfn_glClipControl fp_glClipControl; +typedef void (APIENTRYP pfn_glCreateTransformFeedbacks) (GLsizei, GLuint*); +extern pfn_glCreateTransformFeedbacks fp_glCreateTransformFeedbacks; +typedef void (APIENTRYP pfn_glTransformFeedbackBufferBase) (GLuint, GLuint, GLuint); +extern pfn_glTransformFeedbackBufferBase fp_glTransformFeedbackBufferBase; +typedef void (APIENTRYP pfn_glTransformFeedbackBufferRange) (GLuint, GLuint, GLuint, GLintptr, GLsizeiptr); +extern pfn_glTransformFeedbackBufferRange fp_glTransformFeedbackBufferRange; +typedef void (APIENTRYP pfn_glGetTransformFeedbackiv) (GLuint, GLenum, GLint*); +extern pfn_glGetTransformFeedbackiv fp_glGetTransformFeedbackiv; +typedef void (APIENTRYP pfn_glGetTransformFeedbacki_v) (GLuint, GLenum, GLuint, GLint*); +extern pfn_glGetTransformFeedbacki_v fp_glGetTransformFeedbacki_v; +typedef void (APIENTRYP pfn_glGetTransformFeedbacki64_v) (GLuint, GLenum, GLuint, GLint64*); +extern pfn_glGetTransformFeedbacki64_v fp_glGetTransformFeedbacki64_v; +typedef void (APIENTRYP pfn_glCreateBuffers) (GLsizei, GLuint*); +extern pfn_glCreateBuffers fp_glCreateBuffers; +typedef void (APIENTRYP pfn_glNamedBufferStorage) (GLuint, GLsizeiptr, const void*, GLbitfield); +extern pfn_glNamedBufferStorage fp_glNamedBufferStorage; +typedef void (APIENTRYP pfn_glNamedBufferData) (GLuint, GLsizeiptr, const void*, GLenum); +extern pfn_glNamedBufferData fp_glNamedBufferData; +typedef void (APIENTRYP pfn_glNamedBufferSubData) (GLuint, GLintptr, GLsizeiptr, const void*); +extern pfn_glNamedBufferSubData fp_glNamedBufferSubData; +typedef void (APIENTRYP pfn_glCopyNamedBufferSubData) (GLuint, GLuint, GLintptr, GLintptr, GLsizeiptr); +extern pfn_glCopyNamedBufferSubData fp_glCopyNamedBufferSubData; +typedef void (APIENTRYP pfn_glClearNamedBufferData) (GLuint, GLenum, GLenum, GLenum, const void*); +extern pfn_glClearNamedBufferData fp_glClearNamedBufferData; +typedef void (APIENTRYP pfn_glClearNamedBufferSubData) (GLuint, GLenum, GLintptr, GLsizeiptr, GLenum, GLenum, const void*); +extern pfn_glClearNamedBufferSubData fp_glClearNamedBufferSubData; +typedef void* (APIENTRYP pfn_glMapNamedBuffer) (GLuint, GLenum); +extern pfn_glMapNamedBuffer fp_glMapNamedBuffer; +typedef void* (APIENTRYP pfn_glMapNamedBufferRange) (GLuint, GLintptr, GLsizeiptr, GLbitfield); +extern pfn_glMapNamedBufferRange fp_glMapNamedBufferRange; +typedef GLboolean (APIENTRYP pfn_glUnmapNamedBuffer) (GLuint); +extern pfn_glUnmapNamedBuffer fp_glUnmapNamedBuffer; +typedef void (APIENTRYP pfn_glFlushMappedNamedBufferRange) (GLuint, GLintptr, GLsizeiptr); +extern pfn_glFlushMappedNamedBufferRange fp_glFlushMappedNamedBufferRange; +typedef void (APIENTRYP pfn_glGetNamedBufferParameteriv) (GLuint, GLenum, GLint*); +extern pfn_glGetNamedBufferParameteriv fp_glGetNamedBufferParameteriv; +typedef void (APIENTRYP pfn_glGetNamedBufferParameteri64v) (GLuint, GLenum, GLint64*); +extern pfn_glGetNamedBufferParameteri64v fp_glGetNamedBufferParameteri64v; +typedef void (APIENTRYP pfn_glGetNamedBufferPointerv) (GLuint, GLenum, void**); +extern pfn_glGetNamedBufferPointerv fp_glGetNamedBufferPointerv; +typedef void (APIENTRYP pfn_glGetNamedBufferSubData) (GLuint, GLintptr, GLsizeiptr, void*); +extern pfn_glGetNamedBufferSubData fp_glGetNamedBufferSubData; +typedef void (APIENTRYP pfn_glCreateFramebuffers) (GLsizei, GLuint*); +extern pfn_glCreateFramebuffers fp_glCreateFramebuffers; +typedef void (APIENTRYP pfn_glNamedFramebufferRenderbuffer) (GLuint, GLenum, GLenum, GLuint); +extern pfn_glNamedFramebufferRenderbuffer fp_glNamedFramebufferRenderbuffer; +typedef void (APIENTRYP pfn_glNamedFramebufferParameteri) (GLuint, GLenum, GLint); +extern pfn_glNamedFramebufferParameteri fp_glNamedFramebufferParameteri; +typedef void (APIENTRYP pfn_glNamedFramebufferTexture) (GLuint, GLenum, GLuint, GLint); +extern pfn_glNamedFramebufferTexture fp_glNamedFramebufferTexture; +typedef void (APIENTRYP pfn_glNamedFramebufferTextureLayer) (GLuint, GLenum, GLuint, GLint, GLint); +extern pfn_glNamedFramebufferTextureLayer fp_glNamedFramebufferTextureLayer; +typedef void (APIENTRYP pfn_glNamedFramebufferDrawBuffer) (GLuint, GLenum); +extern pfn_glNamedFramebufferDrawBuffer fp_glNamedFramebufferDrawBuffer; +typedef void (APIENTRYP pfn_glNamedFramebufferDrawBuffers) (GLuint, GLsizei, const GLenum*); +extern pfn_glNamedFramebufferDrawBuffers fp_glNamedFramebufferDrawBuffers; +typedef void (APIENTRYP pfn_glNamedFramebufferReadBuffer) (GLuint, GLenum); +extern pfn_glNamedFramebufferReadBuffer fp_glNamedFramebufferReadBuffer; +typedef void (APIENTRYP pfn_glInvalidateNamedFramebufferData) (GLuint, GLsizei, const GLenum*); +extern pfn_glInvalidateNamedFramebufferData fp_glInvalidateNamedFramebufferData; +typedef void (APIENTRYP pfn_glInvalidateNamedFramebufferSubData) (GLuint, GLsizei, const GLenum*, GLint, GLint, GLsizei, GLsizei); +extern pfn_glInvalidateNamedFramebufferSubData fp_glInvalidateNamedFramebufferSubData; +typedef void (APIENTRYP pfn_glClearNamedFramebufferiv) (GLuint, GLenum, GLint, const GLint*); +extern pfn_glClearNamedFramebufferiv fp_glClearNamedFramebufferiv; +typedef void (APIENTRYP pfn_glClearNamedFramebufferuiv) (GLuint, GLenum, GLint, const GLuint*); +extern pfn_glClearNamedFramebufferuiv fp_glClearNamedFramebufferuiv; +typedef void (APIENTRYP pfn_glClearNamedFramebufferfv) (GLuint, GLenum, GLint, const GLfloat*); +extern pfn_glClearNamedFramebufferfv fp_glClearNamedFramebufferfv; +typedef void (APIENTRYP pfn_glClearNamedFramebufferfi) (GLuint, GLenum, const GLfloat, GLint); +extern pfn_glClearNamedFramebufferfi fp_glClearNamedFramebufferfi; +typedef void (APIENTRYP pfn_glBlitNamedFramebuffer) (GLuint, GLuint, GLint, GLint, GLint, GLint, GLint, GLint, GLint, GLint, GLbitfield, GLenum); +extern pfn_glBlitNamedFramebuffer fp_glBlitNamedFramebuffer; +typedef GLenum (APIENTRYP pfn_glCheckNamedFramebufferStatus) (GLuint, GLenum); +extern pfn_glCheckNamedFramebufferStatus fp_glCheckNamedFramebufferStatus; +typedef void (APIENTRYP pfn_glGetNamedFramebufferParameteriv) (GLuint, GLenum, GLint*); +extern pfn_glGetNamedFramebufferParameteriv fp_glGetNamedFramebufferParameteriv; +typedef void (APIENTRYP pfn_glGetNamedFramebufferAttachmentParameteriv) (GLuint, GLenum, GLenum, GLint*); +extern pfn_glGetNamedFramebufferAttachmentParameteriv fp_glGetNamedFramebufferAttachmentParameteriv; +typedef void (APIENTRYP pfn_glCreateRenderbuffers) (GLsizei, GLuint*); +extern pfn_glCreateRenderbuffers fp_glCreateRenderbuffers; +typedef void (APIENTRYP pfn_glNamedRenderbufferStorage) (GLuint, GLenum, GLsizei, GLsizei); +extern pfn_glNamedRenderbufferStorage fp_glNamedRenderbufferStorage; +typedef void (APIENTRYP pfn_glNamedRenderbufferStorageMultisample) (GLuint, GLsizei, GLenum, GLsizei, GLsizei); +extern pfn_glNamedRenderbufferStorageMultisample fp_glNamedRenderbufferStorageMultisample; +typedef void (APIENTRYP pfn_glGetNamedRenderbufferParameteriv) (GLuint, GLenum, GLint*); +extern pfn_glGetNamedRenderbufferParameteriv fp_glGetNamedRenderbufferParameteriv; +typedef void (APIENTRYP pfn_glCreateTextures) (GLenum, GLsizei, GLuint*); +extern pfn_glCreateTextures fp_glCreateTextures; +typedef void (APIENTRYP pfn_glTextureBuffer) (GLuint, GLenum, GLuint); +extern pfn_glTextureBuffer fp_glTextureBuffer; +typedef void (APIENTRYP pfn_glTextureBufferRange) (GLuint, GLenum, GLuint, GLintptr, GLsizeiptr); +extern pfn_glTextureBufferRange fp_glTextureBufferRange; +typedef void (APIENTRYP pfn_glTextureStorage1D) (GLuint, GLsizei, GLenum, GLsizei); +extern pfn_glTextureStorage1D fp_glTextureStorage1D; +typedef void (APIENTRYP pfn_glTextureStorage2D) (GLuint, GLsizei, GLenum, GLsizei, GLsizei); +extern pfn_glTextureStorage2D fp_glTextureStorage2D; +typedef void (APIENTRYP pfn_glTextureStorage3D) (GLuint, GLsizei, GLenum, GLsizei, GLsizei, GLsizei); +extern pfn_glTextureStorage3D fp_glTextureStorage3D; +typedef void (APIENTRYP pfn_glTextureStorage2DMultisample) (GLuint, GLsizei, GLenum, GLsizei, GLsizei, GLboolean); +extern pfn_glTextureStorage2DMultisample fp_glTextureStorage2DMultisample; +typedef void (APIENTRYP pfn_glTextureStorage3DMultisample) (GLuint, GLsizei, GLenum, GLsizei, GLsizei, GLsizei, GLboolean); +extern pfn_glTextureStorage3DMultisample fp_glTextureStorage3DMultisample; +typedef void (APIENTRYP pfn_glTextureSubImage1D) (GLuint, GLint, GLint, GLsizei, GLenum, GLenum, const void*); +extern pfn_glTextureSubImage1D fp_glTextureSubImage1D; +typedef void (APIENTRYP pfn_glTextureSubImage2D) (GLuint, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, const void*); +extern pfn_glTextureSubImage2D fp_glTextureSubImage2D; +typedef void (APIENTRYP pfn_glTextureSubImage3D) (GLuint, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLenum, const void*); +extern pfn_glTextureSubImage3D fp_glTextureSubImage3D; +typedef void (APIENTRYP pfn_glCompressedTextureSubImage1D) (GLuint, GLint, GLint, GLsizei, GLenum, GLsizei, const void*); +extern pfn_glCompressedTextureSubImage1D fp_glCompressedTextureSubImage1D; +typedef void (APIENTRYP pfn_glCompressedTextureSubImage2D) (GLuint, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLsizei, const void*); +extern pfn_glCompressedTextureSubImage2D fp_glCompressedTextureSubImage2D; +typedef void (APIENTRYP pfn_glCompressedTextureSubImage3D) (GLuint, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLsizei, const void*); +extern pfn_glCompressedTextureSubImage3D fp_glCompressedTextureSubImage3D; +typedef void (APIENTRYP pfn_glCopyTextureSubImage1D) (GLuint, GLint, GLint, GLint, GLint, GLsizei); +extern pfn_glCopyTextureSubImage1D fp_glCopyTextureSubImage1D; +typedef void (APIENTRYP pfn_glCopyTextureSubImage2D) (GLuint, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei); +extern pfn_glCopyTextureSubImage2D fp_glCopyTextureSubImage2D; +typedef void (APIENTRYP pfn_glCopyTextureSubImage3D) (GLuint, GLint, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei); +extern pfn_glCopyTextureSubImage3D fp_glCopyTextureSubImage3D; +typedef void (APIENTRYP pfn_glTextureParameterf) (GLuint, GLenum, GLfloat); +extern pfn_glTextureParameterf fp_glTextureParameterf; +typedef void (APIENTRYP pfn_glTextureParameterfv) (GLuint, GLenum, const GLfloat*); +extern pfn_glTextureParameterfv fp_glTextureParameterfv; +typedef void (APIENTRYP pfn_glTextureParameteri) (GLuint, GLenum, GLint); +extern pfn_glTextureParameteri fp_glTextureParameteri; +typedef void (APIENTRYP pfn_glTextureParameterIiv) (GLuint, GLenum, const GLint*); +extern pfn_glTextureParameterIiv fp_glTextureParameterIiv; +typedef void (APIENTRYP pfn_glTextureParameterIuiv) (GLuint, GLenum, const GLuint*); +extern pfn_glTextureParameterIuiv fp_glTextureParameterIuiv; +typedef void (APIENTRYP pfn_glTextureParameteriv) (GLuint, GLenum, const GLint*); +extern pfn_glTextureParameteriv fp_glTextureParameteriv; +typedef void (APIENTRYP pfn_glGenerateTextureMipmap) (GLuint); +extern pfn_glGenerateTextureMipmap fp_glGenerateTextureMipmap; +typedef void (APIENTRYP pfn_glBindTextureUnit) (GLuint, GLuint); +extern pfn_glBindTextureUnit fp_glBindTextureUnit; +typedef void (APIENTRYP pfn_glGetTextureImage) (GLuint, GLint, GLenum, GLenum, GLsizei, void*); +extern pfn_glGetTextureImage fp_glGetTextureImage; +typedef void (APIENTRYP pfn_glGetCompressedTextureImage) (GLuint, GLint, GLsizei, void*); +extern pfn_glGetCompressedTextureImage fp_glGetCompressedTextureImage; +typedef void (APIENTRYP pfn_glGetTextureLevelParameterfv) (GLuint, GLint, GLenum, GLfloat*); +extern pfn_glGetTextureLevelParameterfv fp_glGetTextureLevelParameterfv; +typedef void (APIENTRYP pfn_glGetTextureLevelParameteriv) (GLuint, GLint, GLenum, GLint*); +extern pfn_glGetTextureLevelParameteriv fp_glGetTextureLevelParameteriv; +typedef void (APIENTRYP pfn_glGetTextureParameterfv) (GLuint, GLenum, GLfloat*); +extern pfn_glGetTextureParameterfv fp_glGetTextureParameterfv; +typedef void (APIENTRYP pfn_glGetTextureParameterIiv) (GLuint, GLenum, GLint*); +extern pfn_glGetTextureParameterIiv fp_glGetTextureParameterIiv; +typedef void (APIENTRYP pfn_glGetTextureParameterIuiv) (GLuint, GLenum, GLuint*); +extern pfn_glGetTextureParameterIuiv fp_glGetTextureParameterIuiv; +typedef void (APIENTRYP pfn_glGetTextureParameteriv) (GLuint, GLenum, GLint*); +extern pfn_glGetTextureParameteriv fp_glGetTextureParameteriv; +typedef void (APIENTRYP pfn_glCreateVertexArrays) (GLsizei, GLuint*); +extern pfn_glCreateVertexArrays fp_glCreateVertexArrays; +typedef void (APIENTRYP pfn_glDisableVertexArrayAttrib) (GLuint, GLuint); +extern pfn_glDisableVertexArrayAttrib fp_glDisableVertexArrayAttrib; +typedef void (APIENTRYP pfn_glEnableVertexArrayAttrib) (GLuint, GLuint); +extern pfn_glEnableVertexArrayAttrib fp_glEnableVertexArrayAttrib; +typedef void (APIENTRYP pfn_glVertexArrayElementBuffer) (GLuint, GLuint); +extern pfn_glVertexArrayElementBuffer fp_glVertexArrayElementBuffer; +typedef void (APIENTRYP pfn_glVertexArrayVertexBuffer) (GLuint, GLuint, GLuint, GLintptr, GLsizei); +extern pfn_glVertexArrayVertexBuffer fp_glVertexArrayVertexBuffer; +typedef void (APIENTRYP pfn_glVertexArrayVertexBuffers) (GLuint, GLuint, GLsizei, const GLuint*, const GLintptr*, const GLsizei*); +extern pfn_glVertexArrayVertexBuffers fp_glVertexArrayVertexBuffers; +typedef void (APIENTRYP pfn_glVertexArrayAttribBinding) (GLuint, GLuint, GLuint); +extern pfn_glVertexArrayAttribBinding fp_glVertexArrayAttribBinding; +typedef void (APIENTRYP pfn_glVertexArrayAttribFormat) (GLuint, GLuint, GLint, GLenum, GLboolean, GLuint); +extern pfn_glVertexArrayAttribFormat fp_glVertexArrayAttribFormat; +typedef void (APIENTRYP pfn_glVertexArrayAttribIFormat) (GLuint, GLuint, GLint, GLenum, GLuint); +extern pfn_glVertexArrayAttribIFormat fp_glVertexArrayAttribIFormat; +typedef void (APIENTRYP pfn_glVertexArrayAttribLFormat) (GLuint, GLuint, GLint, GLenum, GLuint); +extern pfn_glVertexArrayAttribLFormat fp_glVertexArrayAttribLFormat; +typedef void (APIENTRYP pfn_glVertexArrayBindingDivisor) (GLuint, GLuint, GLuint); +extern pfn_glVertexArrayBindingDivisor fp_glVertexArrayBindingDivisor; +typedef void (APIENTRYP pfn_glGetVertexArrayiv) (GLuint, GLenum, GLint*); +extern pfn_glGetVertexArrayiv fp_glGetVertexArrayiv; +typedef void (APIENTRYP pfn_glGetVertexArrayIndexediv) (GLuint, GLuint, GLenum, GLint*); +extern pfn_glGetVertexArrayIndexediv fp_glGetVertexArrayIndexediv; +typedef void (APIENTRYP pfn_glGetVertexArrayIndexed64iv) (GLuint, GLuint, GLenum, GLint64*); +extern pfn_glGetVertexArrayIndexed64iv fp_glGetVertexArrayIndexed64iv; +typedef void (APIENTRYP pfn_glCreateSamplers) (GLsizei, GLuint*); +extern pfn_glCreateSamplers fp_glCreateSamplers; +typedef void (APIENTRYP pfn_glCreateProgramPipelines) (GLsizei, GLuint*); +extern pfn_glCreateProgramPipelines fp_glCreateProgramPipelines; +typedef void (APIENTRYP pfn_glCreateQueries) (GLenum, GLsizei, GLuint*); +extern pfn_glCreateQueries fp_glCreateQueries; +typedef void (APIENTRYP pfn_glGetQueryBufferObjecti64v) (GLuint, GLuint, GLenum, GLintptr); +extern pfn_glGetQueryBufferObjecti64v fp_glGetQueryBufferObjecti64v; +typedef void (APIENTRYP pfn_glGetQueryBufferObjectiv) (GLuint, GLuint, GLenum, GLintptr); +extern pfn_glGetQueryBufferObjectiv fp_glGetQueryBufferObjectiv; +typedef void (APIENTRYP pfn_glGetQueryBufferObjectui64v) (GLuint, GLuint, GLenum, GLintptr); +extern pfn_glGetQueryBufferObjectui64v fp_glGetQueryBufferObjectui64v; +typedef void (APIENTRYP pfn_glGetQueryBufferObjectuiv) (GLuint, GLuint, GLenum, GLintptr); +extern pfn_glGetQueryBufferObjectuiv fp_glGetQueryBufferObjectuiv; +typedef void (APIENTRYP pfn_glMemoryBarrierByRegion) (GLbitfield); +extern pfn_glMemoryBarrierByRegion fp_glMemoryBarrierByRegion; +typedef void (APIENTRYP pfn_glGetTextureSubImage) (GLuint, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLenum, GLsizei, void*); +extern pfn_glGetTextureSubImage fp_glGetTextureSubImage; +typedef void (APIENTRYP pfn_glGetCompressedTextureSubImage) (GLuint, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLsizei, void*); +extern pfn_glGetCompressedTextureSubImage fp_glGetCompressedTextureSubImage; +typedef GLenum (APIENTRYP pfn_glGetGraphicsResetStatus) (); +extern pfn_glGetGraphicsResetStatus fp_glGetGraphicsResetStatus; +typedef void (APIENTRYP pfn_glGetnCompressedTexImage) (GLenum, GLint, GLsizei, void*); +extern pfn_glGetnCompressedTexImage fp_glGetnCompressedTexImage; +typedef void (APIENTRYP pfn_glGetnTexImage) (GLenum, GLint, GLenum, GLenum, GLsizei, void*); +extern pfn_glGetnTexImage fp_glGetnTexImage; +typedef void (APIENTRYP pfn_glGetnUniformdv) (GLuint, GLint, GLsizei, GLdouble*); +extern pfn_glGetnUniformdv fp_glGetnUniformdv; +typedef void (APIENTRYP pfn_glGetnUniformfv) (GLuint, GLint, GLsizei, GLfloat*); +extern pfn_glGetnUniformfv fp_glGetnUniformfv; +typedef void (APIENTRYP pfn_glGetnUniformiv) (GLuint, GLint, GLsizei, GLint*); +extern pfn_glGetnUniformiv fp_glGetnUniformiv; +typedef void (APIENTRYP pfn_glGetnUniformuiv) (GLuint, GLint, GLsizei, GLuint*); +extern pfn_glGetnUniformuiv fp_glGetnUniformuiv; +typedef void (APIENTRYP pfn_glReadnPixels) (GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, GLsizei, void*); +extern pfn_glReadnPixels fp_glReadnPixels; +typedef void (APIENTRYP pfn_glGetnMapdv) (GLenum, GLenum, GLsizei, GLdouble*); +extern pfn_glGetnMapdv fp_glGetnMapdv; +typedef void (APIENTRYP pfn_glGetnMapfv) (GLenum, GLenum, GLsizei, GLfloat*); +extern pfn_glGetnMapfv fp_glGetnMapfv; +typedef void (APIENTRYP pfn_glGetnMapiv) (GLenum, GLenum, GLsizei, GLint*); +extern pfn_glGetnMapiv fp_glGetnMapiv; +typedef void (APIENTRYP pfn_glGetnPixelMapfv) (GLenum, GLsizei, GLfloat*); +extern pfn_glGetnPixelMapfv fp_glGetnPixelMapfv; +typedef void (APIENTRYP pfn_glGetnPixelMapuiv) (GLenum, GLsizei, GLuint*); +extern pfn_glGetnPixelMapuiv fp_glGetnPixelMapuiv; +typedef void (APIENTRYP pfn_glGetnPixelMapusv) (GLenum, GLsizei, GLushort*); +extern pfn_glGetnPixelMapusv fp_glGetnPixelMapusv; +typedef void (APIENTRYP pfn_glGetnPolygonStipple) (GLsizei, GLubyte*); +extern pfn_glGetnPolygonStipple fp_glGetnPolygonStipple; +typedef void (APIENTRYP pfn_glGetnColorTable) (GLenum, GLenum, GLenum, GLsizei, void*); +extern pfn_glGetnColorTable fp_glGetnColorTable; +typedef void (APIENTRYP pfn_glGetnConvolutionFilter) (GLenum, GLenum, GLenum, GLsizei, void*); +extern pfn_glGetnConvolutionFilter fp_glGetnConvolutionFilter; +typedef void (APIENTRYP pfn_glGetnSeparableFilter) (GLenum, GLenum, GLenum, GLsizei, void*, GLsizei, void*, void*); +extern pfn_glGetnSeparableFilter fp_glGetnSeparableFilter; +typedef void (APIENTRYP pfn_glGetnHistogram) (GLenum, GLboolean, GLenum, GLenum, GLsizei, void*); +extern pfn_glGetnHistogram fp_glGetnHistogram; +typedef void (APIENTRYP pfn_glGetnMinmax) (GLenum, GLboolean, GLenum, GLenum, GLsizei, void*); +extern pfn_glGetnMinmax fp_glGetnMinmax; +typedef void (APIENTRYP pfn_glTextureBarrier) (); +extern pfn_glTextureBarrier fp_glTextureBarrier; + /* GL_ES_VERSION_2_0 */ extern GLboolean GLAD_ES_VERSION_2_0; #define GL_BLEND_EQUATION 0x8009 @@ -3774,10 +4059,38 @@ extern GLboolean GLAD_ES_VERSION_2_0; /* GL_ES_VERSION_3_0 */ extern GLboolean GLAD_ES_VERSION_3_0; -#define GL_COPY_READ_BUFFER_BINDING 0x8F36 -#define GL_COPY_WRITE_BUFFER_BINDING 0x8F37 -#define GL_TRANSFORM_FEEDBACK_PAUSED 0x8E23 -#define GL_TRANSFORM_FEEDBACK_ACTIVE 0x8E24 + + /* GL_ES_VERSION_3_1 */ +extern GLboolean GLAD_ES_VERSION_3_1; + + /* GL_KHR_blend_equation_advanced */ +extern GLboolean GLAD_KHR_blend_equation_advanced; +#define GL_MULTIPLY_KHR 0x9294 +#define GL_SCREEN_KHR 0x9295 +#define GL_OVERLAY_KHR 0x9296 +#define GL_DARKEN_KHR 0x9297 +#define GL_LIGHTEN_KHR 0x9298 +#define GL_COLORDODGE_KHR 0x9299 +#define GL_COLORBURN_KHR 0x929A +#define GL_HARDLIGHT_KHR 0x929B +#define GL_SOFTLIGHT_KHR 0x929C +#define GL_DIFFERENCE_KHR 0x929E +#define GL_EXCLUSION_KHR 0x92A0 +#define GL_HSL_HUE_KHR 0x92AD +#define GL_HSL_SATURATION_KHR 0x92AE +#define GL_HSL_COLOR_KHR 0x92AF +#define GL_HSL_LUMINOSITY_KHR 0x92B0 +typedef void (APIENTRYP pfn_glBlendBarrierKHR) (); +extern pfn_glBlendBarrierKHR fp_glBlendBarrierKHR; + + /* GL_KHR_blend_equation_advanced_coherent */ +extern GLboolean GLAD_KHR_blend_equation_advanced_coherent; +#define GL_BLEND_ADVANCED_COHERENT_KHR 0x9285 + + /* GL_KHR_context_flush_control */ +extern GLboolean GLAD_KHR_context_flush_control; +#define GL_CONTEXT_RELEASE_BEHAVIOR_KHR 0x82FB +#define GL_CONTEXT_RELEASE_BEHAVIOR_FLUSH_KHR 0x82FC /* GL_KHR_debug */ extern GLboolean GLAD_KHR_debug; @@ -3808,6 +4121,7 @@ extern GLboolean GLAD_KHR_debug; #define GL_PROGRAM_KHR 0x82E2 #define GL_VERTEX_ARRAY_KHR 0x8074 #define GL_QUERY_KHR 0x82E3 +#define GL_PROGRAM_PIPELINE_KHR 0x82E4 #define GL_SAMPLER_KHR 0x82E6 #define GL_MAX_LABEL_LENGTH_KHR 0x82E8 #define GL_MAX_DEBUG_MESSAGE_LENGTH_KHR 0x9143 @@ -3843,6 +4157,31 @@ extern pfn_glGetObjectPtrLabelKHR fp_glGetObjectPtrLabelKHR; typedef void (APIENTRYP pfn_glGetPointervKHR) (GLenum, void**); extern pfn_glGetPointervKHR fp_glGetPointervKHR; + /* GL_KHR_robust_buffer_access_behavior */ +extern GLboolean GLAD_KHR_robust_buffer_access_behavior; + + /* GL_KHR_robustness */ +extern GLboolean GLAD_KHR_robustness; +#define GL_CONTEXT_ROBUST_ACCESS 0x90F3 +#define GL_CONTEXT_ROBUST_ACCESS_KHR 0x90F3 +#define GL_LOSE_CONTEXT_ON_RESET_KHR 0x8252 +#define GL_GUILTY_CONTEXT_RESET_KHR 0x8253 +#define GL_INNOCENT_CONTEXT_RESET_KHR 0x8254 +#define GL_UNKNOWN_CONTEXT_RESET_KHR 0x8255 +#define GL_RESET_NOTIFICATION_STRATEGY_KHR 0x8256 +#define GL_NO_RESET_NOTIFICATION_KHR 0x8261 +#define GL_CONTEXT_LOST_KHR 0x0507 +typedef GLenum (APIENTRYP pfn_glGetGraphicsResetStatusKHR) (); +extern pfn_glGetGraphicsResetStatusKHR fp_glGetGraphicsResetStatusKHR; +typedef void (APIENTRYP pfn_glReadnPixelsKHR) (GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, GLsizei, void*); +extern pfn_glReadnPixelsKHR fp_glReadnPixelsKHR; +typedef void (APIENTRYP pfn_glGetnUniformfvKHR) (GLuint, GLint, GLsizei, GLfloat*); +extern pfn_glGetnUniformfvKHR fp_glGetnUniformfvKHR; +typedef void (APIENTRYP pfn_glGetnUniformivKHR) (GLuint, GLint, GLsizei, GLint*); +extern pfn_glGetnUniformivKHR fp_glGetnUniformivKHR; +typedef void (APIENTRYP pfn_glGetnUniformuivKHR) (GLuint, GLint, GLsizei, GLuint*); +extern pfn_glGetnUniformuivKHR fp_glGetnUniformuivKHR; + /* GL_KHR_texture_compression_astc_hdr */ extern GLboolean GLAD_KHR_texture_compression_astc_hdr; #define GL_COMPRESSED_RGBA_ASTC_4x4_KHR 0x93B0 @@ -3938,6 +4277,9 @@ extern GLboolean GLAD_ARB_clear_buffer_object; /* GL_ARB_clear_texture */ extern GLboolean GLAD_ARB_clear_texture; + /* GL_ARB_clip_control */ +extern GLboolean GLAD_ARB_clip_control; + /* GL_ARB_color_buffer_float */ extern GLboolean GLAD_ARB_color_buffer_float; #define GL_RGBA_FLOAT_MODE_ARB 0x8820 @@ -3956,7 +4298,6 @@ extern GLboolean GLAD_ARB_compressed_texture_pixel_storage; /* GL_ARB_compute_shader */ extern GLboolean GLAD_ARB_compute_shader; -#define GL_COMPUTE_SHADER_BIT 0x00000020 /* GL_ARB_compute_variable_group_size */ extern GLboolean GLAD_ARB_compute_variable_group_size; @@ -3967,6 +4308,9 @@ extern GLboolean GLAD_ARB_compute_variable_group_size; typedef void (APIENTRYP pfn_glDispatchComputeGroupSizeARB) (GLuint, GLuint, GLuint, GLuint, GLuint, GLuint); extern pfn_glDispatchComputeGroupSizeARB fp_glDispatchComputeGroupSizeARB; + /* GL_ARB_conditional_render_inverted */ +extern GLboolean GLAD_ARB_conditional_render_inverted; + /* GL_ARB_conservative_depth */ extern GLboolean GLAD_ARB_conservative_depth; @@ -3976,6 +4320,9 @@ extern GLboolean GLAD_ARB_copy_buffer; /* GL_ARB_copy_image */ extern GLboolean GLAD_ARB_copy_image; + /* GL_ARB_cull_distance */ +extern GLboolean GLAD_ARB_cull_distance; + /* GL_ARB_debug_output */ extern GLboolean GLAD_ARB_debug_output; #define GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB 0x8242 @@ -4015,35 +4362,11 @@ extern GLboolean GLAD_ARB_depth_buffer_float; /* GL_ARB_depth_clamp */ extern GLboolean GLAD_ARB_depth_clamp; - /* GL_ARB_depth_texture */ -extern GLboolean GLAD_ARB_depth_texture; -#define GL_DEPTH_COMPONENT16_ARB 0x81A5 -#define GL_DEPTH_COMPONENT24_ARB 0x81A6 -#define GL_DEPTH_COMPONENT32_ARB 0x81A7 -#define GL_TEXTURE_DEPTH_SIZE_ARB 0x884A -#define GL_DEPTH_TEXTURE_MODE_ARB 0x884B + /* GL_ARB_derivative_control */ +extern GLboolean GLAD_ARB_derivative_control; - /* GL_ARB_draw_buffers */ -extern GLboolean GLAD_ARB_draw_buffers; -#define GL_MAX_DRAW_BUFFERS_ARB 0x8824 -#define GL_DRAW_BUFFER0_ARB 0x8825 -#define GL_DRAW_BUFFER1_ARB 0x8826 -#define GL_DRAW_BUFFER2_ARB 0x8827 -#define GL_DRAW_BUFFER3_ARB 0x8828 -#define GL_DRAW_BUFFER4_ARB 0x8829 -#define GL_DRAW_BUFFER5_ARB 0x882A -#define GL_DRAW_BUFFER6_ARB 0x882B -#define GL_DRAW_BUFFER7_ARB 0x882C -#define GL_DRAW_BUFFER8_ARB 0x882D -#define GL_DRAW_BUFFER9_ARB 0x882E -#define GL_DRAW_BUFFER10_ARB 0x882F -#define GL_DRAW_BUFFER11_ARB 0x8830 -#define GL_DRAW_BUFFER12_ARB 0x8831 -#define GL_DRAW_BUFFER13_ARB 0x8832 -#define GL_DRAW_BUFFER14_ARB 0x8833 -#define GL_DRAW_BUFFER15_ARB 0x8834 -typedef void (APIENTRYP pfn_glDrawBuffersARB) (GLsizei, const GLenum*); -extern pfn_glDrawBuffersARB fp_glDrawBuffersARB; + /* GL_ARB_direct_state_access */ +extern GLboolean GLAD_ARB_direct_state_access; /* GL_ARB_draw_buffers_blend */ extern GLboolean GLAD_ARB_draw_buffers_blend; @@ -4075,6 +4398,9 @@ extern GLboolean GLAD_ARB_enhanced_layouts; /* GL_ARB_ES2_compatibility */ extern GLboolean GLAD_ARB_ES2_compatibility; + /* GL_ARB_ES3_1_compatibility */ +extern GLboolean GLAD_ARB_ES3_1_compatibility; + /* GL_ARB_ES3_compatibility */ extern GLboolean GLAD_ARB_ES3_compatibility; @@ -4090,134 +4416,6 @@ extern GLboolean GLAD_ARB_fragment_coord_conventions; /* GL_ARB_fragment_layer_viewport */ extern GLboolean GLAD_ARB_fragment_layer_viewport; - /* GL_ARB_fragment_program */ -extern GLboolean GLAD_ARB_fragment_program; -#define GL_FRAGMENT_PROGRAM_ARB 0x8804 -#define GL_PROGRAM_FORMAT_ASCII_ARB 0x8875 -#define GL_PROGRAM_LENGTH_ARB 0x8627 -#define GL_PROGRAM_FORMAT_ARB 0x8876 -#define GL_PROGRAM_BINDING_ARB 0x8677 -#define GL_PROGRAM_INSTRUCTIONS_ARB 0x88A0 -#define GL_MAX_PROGRAM_INSTRUCTIONS_ARB 0x88A1 -#define GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A2 -#define GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A3 -#define GL_PROGRAM_TEMPORARIES_ARB 0x88A4 -#define GL_MAX_PROGRAM_TEMPORARIES_ARB 0x88A5 -#define GL_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A6 -#define GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A7 -#define GL_PROGRAM_PARAMETERS_ARB 0x88A8 -#define GL_MAX_PROGRAM_PARAMETERS_ARB 0x88A9 -#define GL_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AA -#define GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AB -#define GL_PROGRAM_ATTRIBS_ARB 0x88AC -#define GL_MAX_PROGRAM_ATTRIBS_ARB 0x88AD -#define GL_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AE -#define GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AF -#define GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB 0x88B4 -#define GL_MAX_PROGRAM_ENV_PARAMETERS_ARB 0x88B5 -#define GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB 0x88B6 -#define GL_PROGRAM_ALU_INSTRUCTIONS_ARB 0x8805 -#define GL_PROGRAM_TEX_INSTRUCTIONS_ARB 0x8806 -#define GL_PROGRAM_TEX_INDIRECTIONS_ARB 0x8807 -#define GL_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x8808 -#define GL_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x8809 -#define GL_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x880A -#define GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB 0x880B -#define GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB 0x880C -#define GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB 0x880D -#define GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x880E -#define GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x880F -#define GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x8810 -#define GL_PROGRAM_STRING_ARB 0x8628 -#define GL_PROGRAM_ERROR_POSITION_ARB 0x864B -#define GL_CURRENT_MATRIX_ARB 0x8641 -#define GL_TRANSPOSE_CURRENT_MATRIX_ARB 0x88B7 -#define GL_CURRENT_MATRIX_STACK_DEPTH_ARB 0x8640 -#define GL_MAX_PROGRAM_MATRICES_ARB 0x862F -#define GL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB 0x862E -#define GL_MAX_TEXTURE_COORDS_ARB 0x8871 -#define GL_MAX_TEXTURE_IMAGE_UNITS_ARB 0x8872 -#define GL_PROGRAM_ERROR_STRING_ARB 0x8874 -#define GL_MATRIX0_ARB 0x88C0 -#define GL_MATRIX1_ARB 0x88C1 -#define GL_MATRIX2_ARB 0x88C2 -#define GL_MATRIX3_ARB 0x88C3 -#define GL_MATRIX4_ARB 0x88C4 -#define GL_MATRIX5_ARB 0x88C5 -#define GL_MATRIX6_ARB 0x88C6 -#define GL_MATRIX7_ARB 0x88C7 -#define GL_MATRIX8_ARB 0x88C8 -#define GL_MATRIX9_ARB 0x88C9 -#define GL_MATRIX10_ARB 0x88CA -#define GL_MATRIX11_ARB 0x88CB -#define GL_MATRIX12_ARB 0x88CC -#define GL_MATRIX13_ARB 0x88CD -#define GL_MATRIX14_ARB 0x88CE -#define GL_MATRIX15_ARB 0x88CF -#define GL_MATRIX16_ARB 0x88D0 -#define GL_MATRIX17_ARB 0x88D1 -#define GL_MATRIX18_ARB 0x88D2 -#define GL_MATRIX19_ARB 0x88D3 -#define GL_MATRIX20_ARB 0x88D4 -#define GL_MATRIX21_ARB 0x88D5 -#define GL_MATRIX22_ARB 0x88D6 -#define GL_MATRIX23_ARB 0x88D7 -#define GL_MATRIX24_ARB 0x88D8 -#define GL_MATRIX25_ARB 0x88D9 -#define GL_MATRIX26_ARB 0x88DA -#define GL_MATRIX27_ARB 0x88DB -#define GL_MATRIX28_ARB 0x88DC -#define GL_MATRIX29_ARB 0x88DD -#define GL_MATRIX30_ARB 0x88DE -#define GL_MATRIX31_ARB 0x88DF -typedef void (APIENTRYP pfn_glProgramStringARB) (GLenum, GLenum, GLsizei, const void*); -extern pfn_glProgramStringARB fp_glProgramStringARB; -typedef void (APIENTRYP pfn_glBindProgramARB) (GLenum, GLuint); -extern pfn_glBindProgramARB fp_glBindProgramARB; -typedef void (APIENTRYP pfn_glDeleteProgramsARB) (GLsizei, const GLuint*); -extern pfn_glDeleteProgramsARB fp_glDeleteProgramsARB; -typedef void (APIENTRYP pfn_glGenProgramsARB) (GLsizei, GLuint*); -extern pfn_glGenProgramsARB fp_glGenProgramsARB; -typedef void (APIENTRYP pfn_glProgramEnvParameter4dARB) (GLenum, GLuint, GLdouble, GLdouble, GLdouble, GLdouble); -extern pfn_glProgramEnvParameter4dARB fp_glProgramEnvParameter4dARB; -typedef void (APIENTRYP pfn_glProgramEnvParameter4dvARB) (GLenum, GLuint, const GLdouble*); -extern pfn_glProgramEnvParameter4dvARB fp_glProgramEnvParameter4dvARB; -typedef void (APIENTRYP pfn_glProgramEnvParameter4fARB) (GLenum, GLuint, GLfloat, GLfloat, GLfloat, GLfloat); -extern pfn_glProgramEnvParameter4fARB fp_glProgramEnvParameter4fARB; -typedef void (APIENTRYP pfn_glProgramEnvParameter4fvARB) (GLenum, GLuint, const GLfloat*); -extern pfn_glProgramEnvParameter4fvARB fp_glProgramEnvParameter4fvARB; -typedef void (APIENTRYP pfn_glProgramLocalParameter4dARB) (GLenum, GLuint, GLdouble, GLdouble, GLdouble, GLdouble); -extern pfn_glProgramLocalParameter4dARB fp_glProgramLocalParameter4dARB; -typedef void (APIENTRYP pfn_glProgramLocalParameter4dvARB) (GLenum, GLuint, const GLdouble*); -extern pfn_glProgramLocalParameter4dvARB fp_glProgramLocalParameter4dvARB; -typedef void (APIENTRYP pfn_glProgramLocalParameter4fARB) (GLenum, GLuint, GLfloat, GLfloat, GLfloat, GLfloat); -extern pfn_glProgramLocalParameter4fARB fp_glProgramLocalParameter4fARB; -typedef void (APIENTRYP pfn_glProgramLocalParameter4fvARB) (GLenum, GLuint, const GLfloat*); -extern pfn_glProgramLocalParameter4fvARB fp_glProgramLocalParameter4fvARB; -typedef void (APIENTRYP pfn_glGetProgramEnvParameterdvARB) (GLenum, GLuint, GLdouble*); -extern pfn_glGetProgramEnvParameterdvARB fp_glGetProgramEnvParameterdvARB; -typedef void (APIENTRYP pfn_glGetProgramEnvParameterfvARB) (GLenum, GLuint, GLfloat*); -extern pfn_glGetProgramEnvParameterfvARB fp_glGetProgramEnvParameterfvARB; -typedef void (APIENTRYP pfn_glGetProgramLocalParameterdvARB) (GLenum, GLuint, GLdouble*); -extern pfn_glGetProgramLocalParameterdvARB fp_glGetProgramLocalParameterdvARB; -typedef void (APIENTRYP pfn_glGetProgramLocalParameterfvARB) (GLenum, GLuint, GLfloat*); -extern pfn_glGetProgramLocalParameterfvARB fp_glGetProgramLocalParameterfvARB; -typedef void (APIENTRYP pfn_glGetProgramivARB) (GLenum, GLenum, GLint*); -extern pfn_glGetProgramivARB fp_glGetProgramivARB; -typedef void (APIENTRYP pfn_glGetProgramStringARB) (GLenum, GLenum, void*); -extern pfn_glGetProgramStringARB fp_glGetProgramStringARB; -typedef GLboolean (APIENTRYP pfn_glIsProgramARB) (GLuint); -extern pfn_glIsProgramARB fp_glIsProgramARB; - - /* GL_ARB_fragment_program_shadow */ -extern GLboolean GLAD_ARB_fragment_program_shadow; - - /* GL_ARB_fragment_shader */ -extern GLboolean GLAD_ARB_fragment_shader; -#define GL_FRAGMENT_SHADER_ARB 0x8B30 -#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB 0x8B49 -#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT_ARB 0x8B8B - /* GL_ARB_framebuffer_no_attachments */ extern GLboolean GLAD_ARB_framebuffer_no_attachments; @@ -4259,6 +4457,9 @@ extern pfn_glFramebufferTextureFaceARB fp_glFramebufferTextureFaceARB; /* GL_ARB_get_program_binary */ extern GLboolean GLAD_ARB_get_program_binary; + /* GL_ARB_get_texture_sub_image */ +extern GLboolean GLAD_ARB_get_texture_sub_image; + /* GL_ARB_gpu_shader5 */ extern GLboolean GLAD_ARB_gpu_shader5; @@ -4303,182 +4504,28 @@ extern GLboolean GLAD_ARB_map_buffer_alignment; /* GL_ARB_map_buffer_range */ extern GLboolean GLAD_ARB_map_buffer_range; - /* GL_ARB_matrix_palette */ -extern GLboolean GLAD_ARB_matrix_palette; -#define GL_MATRIX_PALETTE_ARB 0x8840 -#define GL_MAX_MATRIX_PALETTE_STACK_DEPTH_ARB 0x8841 -#define GL_MAX_PALETTE_MATRICES_ARB 0x8842 -#define GL_CURRENT_PALETTE_MATRIX_ARB 0x8843 -#define GL_MATRIX_INDEX_ARRAY_ARB 0x8844 -#define GL_CURRENT_MATRIX_INDEX_ARB 0x8845 -#define GL_MATRIX_INDEX_ARRAY_SIZE_ARB 0x8846 -#define GL_MATRIX_INDEX_ARRAY_TYPE_ARB 0x8847 -#define GL_MATRIX_INDEX_ARRAY_STRIDE_ARB 0x8848 -#define GL_MATRIX_INDEX_ARRAY_POINTER_ARB 0x8849 -typedef void (APIENTRYP pfn_glCurrentPaletteMatrixARB) (GLint); -extern pfn_glCurrentPaletteMatrixARB fp_glCurrentPaletteMatrixARB; -typedef void (APIENTRYP pfn_glMatrixIndexubvARB) (GLint, const GLubyte*); -extern pfn_glMatrixIndexubvARB fp_glMatrixIndexubvARB; -typedef void (APIENTRYP pfn_glMatrixIndexusvARB) (GLint, const GLushort*); -extern pfn_glMatrixIndexusvARB fp_glMatrixIndexusvARB; -typedef void (APIENTRYP pfn_glMatrixIndexuivARB) (GLint, const GLuint*); -extern pfn_glMatrixIndexuivARB fp_glMatrixIndexuivARB; -typedef void (APIENTRYP pfn_glMatrixIndexPointerARB) (GLint, GLenum, GLsizei, const void*); -extern pfn_glMatrixIndexPointerARB fp_glMatrixIndexPointerARB; - /* GL_ARB_multi_bind */ extern GLboolean GLAD_ARB_multi_bind; /* GL_ARB_multi_draw_indirect */ extern GLboolean GLAD_ARB_multi_draw_indirect; - /* GL_ARB_multisample */ -extern GLboolean GLAD_ARB_multisample; -#define GL_MULTISAMPLE_ARB 0x809D -#define GL_SAMPLE_ALPHA_TO_COVERAGE_ARB 0x809E -#define GL_SAMPLE_ALPHA_TO_ONE_ARB 0x809F -#define GL_SAMPLE_COVERAGE_ARB 0x80A0 -#define GL_SAMPLE_BUFFERS_ARB 0x80A8 -#define GL_SAMPLES_ARB 0x80A9 -#define GL_SAMPLE_COVERAGE_VALUE_ARB 0x80AA -#define GL_SAMPLE_COVERAGE_INVERT_ARB 0x80AB -#define GL_MULTISAMPLE_BIT_ARB 0x20000000 -typedef void (APIENTRYP pfn_glSampleCoverageARB) (GLfloat, GLboolean); -extern pfn_glSampleCoverageARB fp_glSampleCoverageARB; - - /* GL_ARB_multitexture */ -extern GLboolean GLAD_ARB_multitexture; -#define GL_TEXTURE0_ARB 0x84C0 -#define GL_TEXTURE1_ARB 0x84C1 -#define GL_TEXTURE2_ARB 0x84C2 -#define GL_TEXTURE3_ARB 0x84C3 -#define GL_TEXTURE4_ARB 0x84C4 -#define GL_TEXTURE5_ARB 0x84C5 -#define GL_TEXTURE6_ARB 0x84C6 -#define GL_TEXTURE7_ARB 0x84C7 -#define GL_TEXTURE8_ARB 0x84C8 -#define GL_TEXTURE9_ARB 0x84C9 -#define GL_TEXTURE10_ARB 0x84CA -#define GL_TEXTURE11_ARB 0x84CB -#define GL_TEXTURE12_ARB 0x84CC -#define GL_TEXTURE13_ARB 0x84CD -#define GL_TEXTURE14_ARB 0x84CE -#define GL_TEXTURE15_ARB 0x84CF -#define GL_TEXTURE16_ARB 0x84D0 -#define GL_TEXTURE17_ARB 0x84D1 -#define GL_TEXTURE18_ARB 0x84D2 -#define GL_TEXTURE19_ARB 0x84D3 -#define GL_TEXTURE20_ARB 0x84D4 -#define GL_TEXTURE21_ARB 0x84D5 -#define GL_TEXTURE22_ARB 0x84D6 -#define GL_TEXTURE23_ARB 0x84D7 -#define GL_TEXTURE24_ARB 0x84D8 -#define GL_TEXTURE25_ARB 0x84D9 -#define GL_TEXTURE26_ARB 0x84DA -#define GL_TEXTURE27_ARB 0x84DB -#define GL_TEXTURE28_ARB 0x84DC -#define GL_TEXTURE29_ARB 0x84DD -#define GL_TEXTURE30_ARB 0x84DE -#define GL_TEXTURE31_ARB 0x84DF -#define GL_ACTIVE_TEXTURE_ARB 0x84E0 -#define GL_CLIENT_ACTIVE_TEXTURE_ARB 0x84E1 -#define GL_MAX_TEXTURE_UNITS_ARB 0x84E2 -typedef void (APIENTRYP pfn_glActiveTextureARB) (GLenum); -extern pfn_glActiveTextureARB fp_glActiveTextureARB; -typedef void (APIENTRYP pfn_glClientActiveTextureARB) (GLenum); -extern pfn_glClientActiveTextureARB fp_glClientActiveTextureARB; -typedef void (APIENTRYP pfn_glMultiTexCoord1dARB) (GLenum, GLdouble); -extern pfn_glMultiTexCoord1dARB fp_glMultiTexCoord1dARB; -typedef void (APIENTRYP pfn_glMultiTexCoord1dvARB) (GLenum, const GLdouble*); -extern pfn_glMultiTexCoord1dvARB fp_glMultiTexCoord1dvARB; -typedef void (APIENTRYP pfn_glMultiTexCoord1fARB) (GLenum, GLfloat); -extern pfn_glMultiTexCoord1fARB fp_glMultiTexCoord1fARB; -typedef void (APIENTRYP pfn_glMultiTexCoord1fvARB) (GLenum, const GLfloat*); -extern pfn_glMultiTexCoord1fvARB fp_glMultiTexCoord1fvARB; -typedef void (APIENTRYP pfn_glMultiTexCoord1iARB) (GLenum, GLint); -extern pfn_glMultiTexCoord1iARB fp_glMultiTexCoord1iARB; -typedef void (APIENTRYP pfn_glMultiTexCoord1ivARB) (GLenum, const GLint*); -extern pfn_glMultiTexCoord1ivARB fp_glMultiTexCoord1ivARB; -typedef void (APIENTRYP pfn_glMultiTexCoord1sARB) (GLenum, GLshort); -extern pfn_glMultiTexCoord1sARB fp_glMultiTexCoord1sARB; -typedef void (APIENTRYP pfn_glMultiTexCoord1svARB) (GLenum, const GLshort*); -extern pfn_glMultiTexCoord1svARB fp_glMultiTexCoord1svARB; -typedef void (APIENTRYP pfn_glMultiTexCoord2dARB) (GLenum, GLdouble, GLdouble); -extern pfn_glMultiTexCoord2dARB fp_glMultiTexCoord2dARB; -typedef void (APIENTRYP pfn_glMultiTexCoord2dvARB) (GLenum, const GLdouble*); -extern pfn_glMultiTexCoord2dvARB fp_glMultiTexCoord2dvARB; -typedef void (APIENTRYP pfn_glMultiTexCoord2fARB) (GLenum, GLfloat, GLfloat); -extern pfn_glMultiTexCoord2fARB fp_glMultiTexCoord2fARB; -typedef void (APIENTRYP pfn_glMultiTexCoord2fvARB) (GLenum, const GLfloat*); -extern pfn_glMultiTexCoord2fvARB fp_glMultiTexCoord2fvARB; -typedef void (APIENTRYP pfn_glMultiTexCoord2iARB) (GLenum, GLint, GLint); -extern pfn_glMultiTexCoord2iARB fp_glMultiTexCoord2iARB; -typedef void (APIENTRYP pfn_glMultiTexCoord2ivARB) (GLenum, const GLint*); -extern pfn_glMultiTexCoord2ivARB fp_glMultiTexCoord2ivARB; -typedef void (APIENTRYP pfn_glMultiTexCoord2sARB) (GLenum, GLshort, GLshort); -extern pfn_glMultiTexCoord2sARB fp_glMultiTexCoord2sARB; -typedef void (APIENTRYP pfn_glMultiTexCoord2svARB) (GLenum, const GLshort*); -extern pfn_glMultiTexCoord2svARB fp_glMultiTexCoord2svARB; -typedef void (APIENTRYP pfn_glMultiTexCoord3dARB) (GLenum, GLdouble, GLdouble, GLdouble); -extern pfn_glMultiTexCoord3dARB fp_glMultiTexCoord3dARB; -typedef void (APIENTRYP pfn_glMultiTexCoord3dvARB) (GLenum, const GLdouble*); -extern pfn_glMultiTexCoord3dvARB fp_glMultiTexCoord3dvARB; -typedef void (APIENTRYP pfn_glMultiTexCoord3fARB) (GLenum, GLfloat, GLfloat, GLfloat); -extern pfn_glMultiTexCoord3fARB fp_glMultiTexCoord3fARB; -typedef void (APIENTRYP pfn_glMultiTexCoord3fvARB) (GLenum, const GLfloat*); -extern pfn_glMultiTexCoord3fvARB fp_glMultiTexCoord3fvARB; -typedef void (APIENTRYP pfn_glMultiTexCoord3iARB) (GLenum, GLint, GLint, GLint); -extern pfn_glMultiTexCoord3iARB fp_glMultiTexCoord3iARB; -typedef void (APIENTRYP pfn_glMultiTexCoord3ivARB) (GLenum, const GLint*); -extern pfn_glMultiTexCoord3ivARB fp_glMultiTexCoord3ivARB; -typedef void (APIENTRYP pfn_glMultiTexCoord3sARB) (GLenum, GLshort, GLshort, GLshort); -extern pfn_glMultiTexCoord3sARB fp_glMultiTexCoord3sARB; -typedef void (APIENTRYP pfn_glMultiTexCoord3svARB) (GLenum, const GLshort*); -extern pfn_glMultiTexCoord3svARB fp_glMultiTexCoord3svARB; -typedef void (APIENTRYP pfn_glMultiTexCoord4dARB) (GLenum, GLdouble, GLdouble, GLdouble, GLdouble); -extern pfn_glMultiTexCoord4dARB fp_glMultiTexCoord4dARB; -typedef void (APIENTRYP pfn_glMultiTexCoord4dvARB) (GLenum, const GLdouble*); -extern pfn_glMultiTexCoord4dvARB fp_glMultiTexCoord4dvARB; -typedef void (APIENTRYP pfn_glMultiTexCoord4fARB) (GLenum, GLfloat, GLfloat, GLfloat, GLfloat); -extern pfn_glMultiTexCoord4fARB fp_glMultiTexCoord4fARB; -typedef void (APIENTRYP pfn_glMultiTexCoord4fvARB) (GLenum, const GLfloat*); -extern pfn_glMultiTexCoord4fvARB fp_glMultiTexCoord4fvARB; -typedef void (APIENTRYP pfn_glMultiTexCoord4iARB) (GLenum, GLint, GLint, GLint, GLint); -extern pfn_glMultiTexCoord4iARB fp_glMultiTexCoord4iARB; -typedef void (APIENTRYP pfn_glMultiTexCoord4ivARB) (GLenum, const GLint*); -extern pfn_glMultiTexCoord4ivARB fp_glMultiTexCoord4ivARB; -typedef void (APIENTRYP pfn_glMultiTexCoord4sARB) (GLenum, GLshort, GLshort, GLshort, GLshort); -extern pfn_glMultiTexCoord4sARB fp_glMultiTexCoord4sARB; -typedef void (APIENTRYP pfn_glMultiTexCoord4svARB) (GLenum, const GLshort*); -extern pfn_glMultiTexCoord4svARB fp_glMultiTexCoord4svARB; - - /* GL_ARB_occlusion_query */ -extern GLboolean GLAD_ARB_occlusion_query; -#define GL_QUERY_COUNTER_BITS_ARB 0x8864 -#define GL_CURRENT_QUERY_ARB 0x8865 -#define GL_QUERY_RESULT_ARB 0x8866 -#define GL_QUERY_RESULT_AVAILABLE_ARB 0x8867 -#define GL_SAMPLES_PASSED_ARB 0x8914 -typedef void (APIENTRYP pfn_glGenQueriesARB) (GLsizei, GLuint*); -extern pfn_glGenQueriesARB fp_glGenQueriesARB; -typedef void (APIENTRYP pfn_glDeleteQueriesARB) (GLsizei, const GLuint*); -extern pfn_glDeleteQueriesARB fp_glDeleteQueriesARB; -typedef GLboolean (APIENTRYP pfn_glIsQueryARB) (GLuint); -extern pfn_glIsQueryARB fp_glIsQueryARB; -typedef void (APIENTRYP pfn_glBeginQueryARB) (GLenum, GLuint); -extern pfn_glBeginQueryARB fp_glBeginQueryARB; -typedef void (APIENTRYP pfn_glEndQueryARB) (GLenum); -extern pfn_glEndQueryARB fp_glEndQueryARB; -typedef void (APIENTRYP pfn_glGetQueryivARB) (GLenum, GLenum, GLint*); -extern pfn_glGetQueryivARB fp_glGetQueryivARB; -typedef void (APIENTRYP pfn_glGetQueryObjectivARB) (GLuint, GLenum, GLint*); -extern pfn_glGetQueryObjectivARB fp_glGetQueryObjectivARB; -typedef void (APIENTRYP pfn_glGetQueryObjectuivARB) (GLuint, GLenum, GLuint*); -extern pfn_glGetQueryObjectuivARB fp_glGetQueryObjectuivARB; - /* GL_ARB_occlusion_query2 */ extern GLboolean GLAD_ARB_occlusion_query2; + /* GL_ARB_pipeline_statistics_query */ +extern GLboolean GLAD_ARB_pipeline_statistics_query; +#define GL_VERTICES_SUBMITTED_ARB 0x82EE +#define GL_PRIMITIVES_SUBMITTED_ARB 0x82EF +#define GL_VERTEX_SHADER_INVOCATIONS_ARB 0x82F0 +#define GL_TESS_CONTROL_SHADER_PATCHES_ARB 0x82F1 +#define GL_TESS_EVALUATION_SHADER_INVOCATIONS_ARB 0x82F2 +#define GL_GEOMETRY_SHADER_PRIMITIVES_EMITTED_ARB 0x82F3 +#define GL_FRAGMENT_SHADER_INVOCATIONS_ARB 0x82F4 +#define GL_COMPUTE_SHADER_INVOCATIONS_ARB 0x82F5 +#define GL_CLIPPING_INPUT_PRIMITIVES_ARB 0x82F6 +#define GL_CLIPPING_OUTPUT_PRIMITIVES_ARB 0x82F7 + /* GL_ARB_pixel_buffer_object */ extern GLboolean GLAD_ARB_pixel_buffer_object; #define GL_PIXEL_PACK_BUFFER_ARB 0x88EB @@ -4486,22 +4533,6 @@ extern GLboolean GLAD_ARB_pixel_buffer_object; #define GL_PIXEL_PACK_BUFFER_BINDING_ARB 0x88ED #define GL_PIXEL_UNPACK_BUFFER_BINDING_ARB 0x88EF - /* GL_ARB_point_parameters */ -extern GLboolean GLAD_ARB_point_parameters; -#define GL_POINT_SIZE_MIN_ARB 0x8126 -#define GL_POINT_SIZE_MAX_ARB 0x8127 -#define GL_POINT_FADE_THRESHOLD_SIZE_ARB 0x8128 -#define GL_POINT_DISTANCE_ATTENUATION_ARB 0x8129 -typedef void (APIENTRYP pfn_glPointParameterfARB) (GLenum, GLfloat); -extern pfn_glPointParameterfARB fp_glPointParameterfARB; -typedef void (APIENTRYP pfn_glPointParameterfvARB) (GLenum, const GLfloat*); -extern pfn_glPointParameterfvARB fp_glPointParameterfvARB; - - /* GL_ARB_point_sprite */ -extern GLboolean GLAD_ARB_point_sprite; -#define GL_POINT_SPRITE_ARB 0x8861 -#define GL_COORD_REPLACE_ARB 0x8862 - /* GL_ARB_program_interface_query */ extern GLboolean GLAD_ARB_program_interface_query; @@ -4604,121 +4635,6 @@ extern GLboolean GLAD_ARB_shader_image_load_store; /* GL_ARB_shader_image_size */ extern GLboolean GLAD_ARB_shader_image_size; - /* GL_ARB_shader_objects */ -extern GLboolean GLAD_ARB_shader_objects; -#define GL_PROGRAM_OBJECT_ARB 0x8B40 -#define GL_SHADER_OBJECT_ARB 0x8B48 -#define GL_OBJECT_TYPE_ARB 0x8B4E -#define GL_OBJECT_SUBTYPE_ARB 0x8B4F -#define GL_FLOAT_VEC2_ARB 0x8B50 -#define GL_FLOAT_VEC3_ARB 0x8B51 -#define GL_FLOAT_VEC4_ARB 0x8B52 -#define GL_INT_VEC2_ARB 0x8B53 -#define GL_INT_VEC3_ARB 0x8B54 -#define GL_INT_VEC4_ARB 0x8B55 -#define GL_BOOL_ARB 0x8B56 -#define GL_BOOL_VEC2_ARB 0x8B57 -#define GL_BOOL_VEC3_ARB 0x8B58 -#define GL_BOOL_VEC4_ARB 0x8B59 -#define GL_FLOAT_MAT2_ARB 0x8B5A -#define GL_FLOAT_MAT3_ARB 0x8B5B -#define GL_FLOAT_MAT4_ARB 0x8B5C -#define GL_SAMPLER_1D_ARB 0x8B5D -#define GL_SAMPLER_2D_ARB 0x8B5E -#define GL_SAMPLER_3D_ARB 0x8B5F -#define GL_SAMPLER_CUBE_ARB 0x8B60 -#define GL_SAMPLER_1D_SHADOW_ARB 0x8B61 -#define GL_SAMPLER_2D_SHADOW_ARB 0x8B62 -#define GL_SAMPLER_2D_RECT_ARB 0x8B63 -#define GL_SAMPLER_2D_RECT_SHADOW_ARB 0x8B64 -#define GL_OBJECT_DELETE_STATUS_ARB 0x8B80 -#define GL_OBJECT_COMPILE_STATUS_ARB 0x8B81 -#define GL_OBJECT_LINK_STATUS_ARB 0x8B82 -#define GL_OBJECT_VALIDATE_STATUS_ARB 0x8B83 -#define GL_OBJECT_INFO_LOG_LENGTH_ARB 0x8B84 -#define GL_OBJECT_ATTACHED_OBJECTS_ARB 0x8B85 -#define GL_OBJECT_ACTIVE_UNIFORMS_ARB 0x8B86 -#define GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB 0x8B87 -#define GL_OBJECT_SHADER_SOURCE_LENGTH_ARB 0x8B88 -typedef void (APIENTRYP pfn_glDeleteObjectARB) (GLhandleARB); -extern pfn_glDeleteObjectARB fp_glDeleteObjectARB; -typedef GLhandleARB (APIENTRYP pfn_glGetHandleARB) (GLenum); -extern pfn_glGetHandleARB fp_glGetHandleARB; -typedef void (APIENTRYP pfn_glDetachObjectARB) (GLhandleARB, GLhandleARB); -extern pfn_glDetachObjectARB fp_glDetachObjectARB; -typedef GLhandleARB (APIENTRYP pfn_glCreateShaderObjectARB) (GLenum); -extern pfn_glCreateShaderObjectARB fp_glCreateShaderObjectARB; -typedef void (APIENTRYP pfn_glShaderSourceARB) (GLhandleARB, GLsizei, const GLcharARB**, const GLint*); -extern pfn_glShaderSourceARB fp_glShaderSourceARB; -typedef void (APIENTRYP pfn_glCompileShaderARB) (GLhandleARB); -extern pfn_glCompileShaderARB fp_glCompileShaderARB; -typedef GLhandleARB (APIENTRYP pfn_glCreateProgramObjectARB) (); -extern pfn_glCreateProgramObjectARB fp_glCreateProgramObjectARB; -typedef void (APIENTRYP pfn_glAttachObjectARB) (GLhandleARB, GLhandleARB); -extern pfn_glAttachObjectARB fp_glAttachObjectARB; -typedef void (APIENTRYP pfn_glLinkProgramARB) (GLhandleARB); -extern pfn_glLinkProgramARB fp_glLinkProgramARB; -typedef void (APIENTRYP pfn_glUseProgramObjectARB) (GLhandleARB); -extern pfn_glUseProgramObjectARB fp_glUseProgramObjectARB; -typedef void (APIENTRYP pfn_glValidateProgramARB) (GLhandleARB); -extern pfn_glValidateProgramARB fp_glValidateProgramARB; -typedef void (APIENTRYP pfn_glUniform1fARB) (GLint, GLfloat); -extern pfn_glUniform1fARB fp_glUniform1fARB; -typedef void (APIENTRYP pfn_glUniform2fARB) (GLint, GLfloat, GLfloat); -extern pfn_glUniform2fARB fp_glUniform2fARB; -typedef void (APIENTRYP pfn_glUniform3fARB) (GLint, GLfloat, GLfloat, GLfloat); -extern pfn_glUniform3fARB fp_glUniform3fARB; -typedef void (APIENTRYP pfn_glUniform4fARB) (GLint, GLfloat, GLfloat, GLfloat, GLfloat); -extern pfn_glUniform4fARB fp_glUniform4fARB; -typedef void (APIENTRYP pfn_glUniform1iARB) (GLint, GLint); -extern pfn_glUniform1iARB fp_glUniform1iARB; -typedef void (APIENTRYP pfn_glUniform2iARB) (GLint, GLint, GLint); -extern pfn_glUniform2iARB fp_glUniform2iARB; -typedef void (APIENTRYP pfn_glUniform3iARB) (GLint, GLint, GLint, GLint); -extern pfn_glUniform3iARB fp_glUniform3iARB; -typedef void (APIENTRYP pfn_glUniform4iARB) (GLint, GLint, GLint, GLint, GLint); -extern pfn_glUniform4iARB fp_glUniform4iARB; -typedef void (APIENTRYP pfn_glUniform1fvARB) (GLint, GLsizei, const GLfloat*); -extern pfn_glUniform1fvARB fp_glUniform1fvARB; -typedef void (APIENTRYP pfn_glUniform2fvARB) (GLint, GLsizei, const GLfloat*); -extern pfn_glUniform2fvARB fp_glUniform2fvARB; -typedef void (APIENTRYP pfn_glUniform3fvARB) (GLint, GLsizei, const GLfloat*); -extern pfn_glUniform3fvARB fp_glUniform3fvARB; -typedef void (APIENTRYP pfn_glUniform4fvARB) (GLint, GLsizei, const GLfloat*); -extern pfn_glUniform4fvARB fp_glUniform4fvARB; -typedef void (APIENTRYP pfn_glUniform1ivARB) (GLint, GLsizei, const GLint*); -extern pfn_glUniform1ivARB fp_glUniform1ivARB; -typedef void (APIENTRYP pfn_glUniform2ivARB) (GLint, GLsizei, const GLint*); -extern pfn_glUniform2ivARB fp_glUniform2ivARB; -typedef void (APIENTRYP pfn_glUniform3ivARB) (GLint, GLsizei, const GLint*); -extern pfn_glUniform3ivARB fp_glUniform3ivARB; -typedef void (APIENTRYP pfn_glUniform4ivARB) (GLint, GLsizei, const GLint*); -extern pfn_glUniform4ivARB fp_glUniform4ivARB; -typedef void (APIENTRYP pfn_glUniformMatrix2fvARB) (GLint, GLsizei, GLboolean, const GLfloat*); -extern pfn_glUniformMatrix2fvARB fp_glUniformMatrix2fvARB; -typedef void (APIENTRYP pfn_glUniformMatrix3fvARB) (GLint, GLsizei, GLboolean, const GLfloat*); -extern pfn_glUniformMatrix3fvARB fp_glUniformMatrix3fvARB; -typedef void (APIENTRYP pfn_glUniformMatrix4fvARB) (GLint, GLsizei, GLboolean, const GLfloat*); -extern pfn_glUniformMatrix4fvARB fp_glUniformMatrix4fvARB; -typedef void (APIENTRYP pfn_glGetObjectParameterfvARB) (GLhandleARB, GLenum, GLfloat*); -extern pfn_glGetObjectParameterfvARB fp_glGetObjectParameterfvARB; -typedef void (APIENTRYP pfn_glGetObjectParameterivARB) (GLhandleARB, GLenum, GLint*); -extern pfn_glGetObjectParameterivARB fp_glGetObjectParameterivARB; -typedef void (APIENTRYP pfn_glGetInfoLogARB) (GLhandleARB, GLsizei, GLsizei*, GLcharARB*); -extern pfn_glGetInfoLogARB fp_glGetInfoLogARB; -typedef void (APIENTRYP pfn_glGetAttachedObjectsARB) (GLhandleARB, GLsizei, GLsizei*, GLhandleARB*); -extern pfn_glGetAttachedObjectsARB fp_glGetAttachedObjectsARB; -typedef GLint (APIENTRYP pfn_glGetUniformLocationARB) (GLhandleARB, const GLcharARB*); -extern pfn_glGetUniformLocationARB fp_glGetUniformLocationARB; -typedef void (APIENTRYP pfn_glGetActiveUniformARB) (GLhandleARB, GLuint, GLsizei, GLsizei*, GLint*, GLenum*, GLcharARB*); -extern pfn_glGetActiveUniformARB fp_glGetActiveUniformARB; -typedef void (APIENTRYP pfn_glGetUniformfvARB) (GLhandleARB, GLint, GLfloat*); -extern pfn_glGetUniformfvARB fp_glGetUniformfvARB; -typedef void (APIENTRYP pfn_glGetUniformivARB) (GLhandleARB, GLint, GLint*); -extern pfn_glGetUniformivARB fp_glGetUniformivARB; -typedef void (APIENTRYP pfn_glGetShaderSourceARB) (GLhandleARB, GLsizei, GLsizei*, GLcharARB*); -extern pfn_glGetShaderSourceARB fp_glGetShaderSourceARB; - /* GL_ARB_shader_precision */ extern GLboolean GLAD_ARB_shader_precision; @@ -4731,13 +4647,12 @@ extern GLboolean GLAD_ARB_shader_storage_buffer_object; /* GL_ARB_shader_subroutine */ extern GLboolean GLAD_ARB_shader_subroutine; + /* GL_ARB_shader_texture_image_samples */ +extern GLboolean GLAD_ARB_shader_texture_image_samples; + /* GL_ARB_shader_texture_lod */ extern GLboolean GLAD_ARB_shader_texture_lod; - /* GL_ARB_shading_language_100 */ -extern GLboolean GLAD_ARB_shading_language_100; -#define GL_SHADING_LANGUAGE_VERSION_ARB 0x8B8C - /* GL_ARB_shading_language_420pack */ extern GLboolean GLAD_ARB_shading_language_420pack; @@ -4762,21 +4677,22 @@ extern pfn_glGetNamedStringivARB fp_glGetNamedStringivARB; /* GL_ARB_shading_language_packing */ extern GLboolean GLAD_ARB_shading_language_packing; - /* GL_ARB_shadow */ -extern GLboolean GLAD_ARB_shadow; -#define GL_TEXTURE_COMPARE_MODE_ARB 0x884C -#define GL_TEXTURE_COMPARE_FUNC_ARB 0x884D -#define GL_COMPARE_R_TO_TEXTURE_ARB 0x884E - - /* GL_ARB_shadow_ambient */ -extern GLboolean GLAD_ARB_shadow_ambient; -#define GL_TEXTURE_COMPARE_FAIL_VALUE_ARB 0x80BF + /* GL_ARB_sparse_buffer */ +extern GLboolean GLAD_ARB_sparse_buffer; +#define GL_SPARSE_STORAGE_BIT_ARB 0x0400 +#define GL_SPARSE_BUFFER_PAGE_SIZE_ARB 0x82F8 +typedef void (APIENTRYP pfn_glBufferPageCommitmentARB) (GLenum, GLintptr, GLsizeiptr, GLboolean); +extern pfn_glBufferPageCommitmentARB fp_glBufferPageCommitmentARB; +typedef void (APIENTRYP pfn_glNamedBufferPageCommitmentEXT) (GLuint, GLintptr, GLsizeiptr, GLboolean); +extern pfn_glNamedBufferPageCommitmentEXT fp_glNamedBufferPageCommitmentEXT; +typedef void (APIENTRYP pfn_glNamedBufferPageCommitmentARB) (GLuint, GLintptr, GLsizeiptr, GLboolean); +extern pfn_glNamedBufferPageCommitmentARB fp_glNamedBufferPageCommitmentARB; /* GL_ARB_sparse_texture */ extern GLboolean GLAD_ARB_sparse_texture; #define GL_TEXTURE_SPARSE_ARB 0x91A6 #define GL_VIRTUAL_PAGE_SIZE_INDEX_ARB 0x91A7 -#define GL_MIN_SPARSE_LEVEL_ARB 0x919B +#define GL_NUM_SPARSE_LEVELS_ARB 0x91AA #define GL_NUM_VIRTUAL_PAGE_SIZES_ARB 0x91A8 #define GL_VIRTUAL_PAGE_SIZE_X_ARB 0x9195 #define GL_VIRTUAL_PAGE_SIZE_Y_ARB 0x9196 @@ -4797,9 +4713,8 @@ extern GLboolean GLAD_ARB_sync; /* GL_ARB_tessellation_shader */ extern GLboolean GLAD_ARB_tessellation_shader; - /* GL_ARB_texture_border_clamp */ -extern GLboolean GLAD_ARB_texture_border_clamp; -#define GL_CLAMP_TO_BORDER_ARB 0x812D + /* GL_ARB_texture_barrier */ +extern GLboolean GLAD_ARB_texture_barrier; /* GL_ARB_texture_buffer_object */ extern GLboolean GLAD_ARB_texture_buffer_object; @@ -4817,34 +4732,6 @@ extern GLboolean GLAD_ARB_texture_buffer_object_rgb32; /* GL_ARB_texture_buffer_range */ extern GLboolean GLAD_ARB_texture_buffer_range; - /* GL_ARB_texture_compression */ -extern GLboolean GLAD_ARB_texture_compression; -#define GL_COMPRESSED_ALPHA_ARB 0x84E9 -#define GL_COMPRESSED_LUMINANCE_ARB 0x84EA -#define GL_COMPRESSED_LUMINANCE_ALPHA_ARB 0x84EB -#define GL_COMPRESSED_INTENSITY_ARB 0x84EC -#define GL_COMPRESSED_RGB_ARB 0x84ED -#define GL_COMPRESSED_RGBA_ARB 0x84EE -#define GL_TEXTURE_COMPRESSION_HINT_ARB 0x84EF -#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE_ARB 0x86A0 -#define GL_TEXTURE_COMPRESSED_ARB 0x86A1 -#define GL_NUM_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A2 -#define GL_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A3 -typedef void (APIENTRYP pfn_glCompressedTexImage3DARB) (GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, GLint, GLsizei, const void*); -extern pfn_glCompressedTexImage3DARB fp_glCompressedTexImage3DARB; -typedef void (APIENTRYP pfn_glCompressedTexImage2DARB) (GLenum, GLint, GLenum, GLsizei, GLsizei, GLint, GLsizei, const void*); -extern pfn_glCompressedTexImage2DARB fp_glCompressedTexImage2DARB; -typedef void (APIENTRYP pfn_glCompressedTexImage1DARB) (GLenum, GLint, GLenum, GLsizei, GLint, GLsizei, const void*); -extern pfn_glCompressedTexImage1DARB fp_glCompressedTexImage1DARB; -typedef void (APIENTRYP pfn_glCompressedTexSubImage3DARB) (GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLsizei, const void*); -extern pfn_glCompressedTexSubImage3DARB fp_glCompressedTexSubImage3DARB; -typedef void (APIENTRYP pfn_glCompressedTexSubImage2DARB) (GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLsizei, const void*); -extern pfn_glCompressedTexSubImage2DARB fp_glCompressedTexSubImage2DARB; -typedef void (APIENTRYP pfn_glCompressedTexSubImage1DARB) (GLenum, GLint, GLint, GLsizei, GLenum, GLsizei, const void*); -extern pfn_glCompressedTexSubImage1DARB fp_glCompressedTexSubImage1DARB; -typedef void (APIENTRYP pfn_glGetCompressedTexImageARB) (GLenum, GLint, void*); -extern pfn_glGetCompressedTexImageARB fp_glGetCompressedTexImageARB; - /* GL_ARB_texture_compression_bptc */ extern GLboolean GLAD_ARB_texture_compression_bptc; #define GL_COMPRESSED_RGBA_BPTC_UNORM_ARB 0x8E8C @@ -4855,21 +4742,6 @@ extern GLboolean GLAD_ARB_texture_compression_bptc; /* GL_ARB_texture_compression_rgtc */ extern GLboolean GLAD_ARB_texture_compression_rgtc; - /* GL_ARB_texture_cube_map */ -extern GLboolean GLAD_ARB_texture_cube_map; -#define GL_NORMAL_MAP_ARB 0x8511 -#define GL_REFLECTION_MAP_ARB 0x8512 -#define GL_TEXTURE_CUBE_MAP_ARB 0x8513 -#define GL_TEXTURE_BINDING_CUBE_MAP_ARB 0x8514 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB 0x8515 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB 0x8516 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB 0x8517 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB 0x8518 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB 0x8519 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB 0x851A -#define GL_PROXY_TEXTURE_CUBE_MAP_ARB 0x851B -#define GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB 0x851C - /* GL_ARB_texture_cube_map_array */ extern GLboolean GLAD_ARB_texture_cube_map_array; #define GL_TEXTURE_CUBE_MAP_ARRAY_ARB 0x9009 @@ -4880,42 +4752,6 @@ extern GLboolean GLAD_ARB_texture_cube_map_array; #define GL_INT_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900E #define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900F - /* GL_ARB_texture_env_add */ -extern GLboolean GLAD_ARB_texture_env_add; - - /* GL_ARB_texture_env_combine */ -extern GLboolean GLAD_ARB_texture_env_combine; -#define GL_COMBINE_ARB 0x8570 -#define GL_COMBINE_RGB_ARB 0x8571 -#define GL_COMBINE_ALPHA_ARB 0x8572 -#define GL_SOURCE0_RGB_ARB 0x8580 -#define GL_SOURCE1_RGB_ARB 0x8581 -#define GL_SOURCE2_RGB_ARB 0x8582 -#define GL_SOURCE0_ALPHA_ARB 0x8588 -#define GL_SOURCE1_ALPHA_ARB 0x8589 -#define GL_SOURCE2_ALPHA_ARB 0x858A -#define GL_OPERAND0_RGB_ARB 0x8590 -#define GL_OPERAND1_RGB_ARB 0x8591 -#define GL_OPERAND2_RGB_ARB 0x8592 -#define GL_OPERAND0_ALPHA_ARB 0x8598 -#define GL_OPERAND1_ALPHA_ARB 0x8599 -#define GL_OPERAND2_ALPHA_ARB 0x859A -#define GL_RGB_SCALE_ARB 0x8573 -#define GL_ADD_SIGNED_ARB 0x8574 -#define GL_INTERPOLATE_ARB 0x8575 -#define GL_SUBTRACT_ARB 0x84E7 -#define GL_CONSTANT_ARB 0x8576 -#define GL_PRIMARY_COLOR_ARB 0x8577 -#define GL_PREVIOUS_ARB 0x8578 - - /* GL_ARB_texture_env_crossbar */ -extern GLboolean GLAD_ARB_texture_env_crossbar; - - /* GL_ARB_texture_env_dot3 */ -extern GLboolean GLAD_ARB_texture_env_dot3; -#define GL_DOT3_RGB_ARB 0x86AE -#define GL_DOT3_RGBA_ARB 0x86AF - /* GL_ARB_texture_float */ extern GLboolean GLAD_ARB_texture_float; #define GL_TEXTURE_RED_TYPE_ARB 0x8C10 @@ -4948,16 +4784,9 @@ extern GLboolean GLAD_ARB_texture_gather; /* GL_ARB_texture_mirror_clamp_to_edge */ extern GLboolean GLAD_ARB_texture_mirror_clamp_to_edge; - /* GL_ARB_texture_mirrored_repeat */ -extern GLboolean GLAD_ARB_texture_mirrored_repeat; -#define GL_MIRRORED_REPEAT_ARB 0x8370 - /* GL_ARB_texture_multisample */ extern GLboolean GLAD_ARB_texture_multisample; - /* GL_ARB_texture_non_power_of_two */ -extern GLboolean GLAD_ARB_texture_non_power_of_two; - /* GL_ARB_texture_query_levels */ extern GLboolean GLAD_ARB_texture_query_levels; @@ -5004,26 +4833,13 @@ extern GLboolean GLAD_ARB_transform_feedback3; /* GL_ARB_transform_feedback_instanced */ extern GLboolean GLAD_ARB_transform_feedback_instanced; - /* GL_ARB_transpose_matrix */ -extern GLboolean GLAD_ARB_transpose_matrix; -#define GL_TRANSPOSE_MODELVIEW_MATRIX_ARB 0x84E3 -#define GL_TRANSPOSE_PROJECTION_MATRIX_ARB 0x84E4 -#define GL_TRANSPOSE_TEXTURE_MATRIX_ARB 0x84E5 -#define GL_TRANSPOSE_COLOR_MATRIX_ARB 0x84E6 -typedef void (APIENTRYP pfn_glLoadTransposeMatrixfARB) (const GLfloat*); -extern pfn_glLoadTransposeMatrixfARB fp_glLoadTransposeMatrixfARB; -typedef void (APIENTRYP pfn_glLoadTransposeMatrixdARB) (const GLdouble*); -extern pfn_glLoadTransposeMatrixdARB fp_glLoadTransposeMatrixdARB; -typedef void (APIENTRYP pfn_glMultTransposeMatrixfARB) (const GLfloat*); -extern pfn_glMultTransposeMatrixfARB fp_glMultTransposeMatrixfARB; -typedef void (APIENTRYP pfn_glMultTransposeMatrixdARB) (const GLdouble*); -extern pfn_glMultTransposeMatrixdARB fp_glMultTransposeMatrixdARB; + /* GL_ARB_transform_feedback_overflow_query */ +extern GLboolean GLAD_ARB_transform_feedback_overflow_query; +#define GL_TRANSFORM_FEEDBACK_OVERFLOW_ARB 0x82EC +#define GL_TRANSFORM_FEEDBACK_STREAM_OVERFLOW_ARB 0x82ED /* GL_ARB_uniform_buffer_object */ extern GLboolean GLAD_ARB_uniform_buffer_object; -#define GL_MAX_GEOMETRY_UNIFORM_BLOCKS 0x8A2C -#define GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS 0x8A32 -#define GL_UNIFORM_BLOCK_REFERENCED_BY_GEOMETRY_SHADER 0x8A45 /* GL_ARB_vertex_array_bgra */ extern GLboolean GLAD_ARB_vertex_array_bgra; @@ -5037,248 +4853,6 @@ extern GLboolean GLAD_ARB_vertex_attrib_64bit; /* GL_ARB_vertex_attrib_binding */ extern GLboolean GLAD_ARB_vertex_attrib_binding; - /* GL_ARB_vertex_blend */ -extern GLboolean GLAD_ARB_vertex_blend; -#define GL_MAX_VERTEX_UNITS_ARB 0x86A4 -#define GL_ACTIVE_VERTEX_UNITS_ARB 0x86A5 -#define GL_WEIGHT_SUM_UNITY_ARB 0x86A6 -#define GL_VERTEX_BLEND_ARB 0x86A7 -#define GL_CURRENT_WEIGHT_ARB 0x86A8 -#define GL_WEIGHT_ARRAY_TYPE_ARB 0x86A9 -#define GL_WEIGHT_ARRAY_STRIDE_ARB 0x86AA -#define GL_WEIGHT_ARRAY_SIZE_ARB 0x86AB -#define GL_WEIGHT_ARRAY_POINTER_ARB 0x86AC -#define GL_WEIGHT_ARRAY_ARB 0x86AD -#define GL_MODELVIEW0_ARB 0x1700 -#define GL_MODELVIEW1_ARB 0x850A -#define GL_MODELVIEW2_ARB 0x8722 -#define GL_MODELVIEW3_ARB 0x8723 -#define GL_MODELVIEW4_ARB 0x8724 -#define GL_MODELVIEW5_ARB 0x8725 -#define GL_MODELVIEW6_ARB 0x8726 -#define GL_MODELVIEW7_ARB 0x8727 -#define GL_MODELVIEW8_ARB 0x8728 -#define GL_MODELVIEW9_ARB 0x8729 -#define GL_MODELVIEW10_ARB 0x872A -#define GL_MODELVIEW11_ARB 0x872B -#define GL_MODELVIEW12_ARB 0x872C -#define GL_MODELVIEW13_ARB 0x872D -#define GL_MODELVIEW14_ARB 0x872E -#define GL_MODELVIEW15_ARB 0x872F -#define GL_MODELVIEW16_ARB 0x8730 -#define GL_MODELVIEW17_ARB 0x8731 -#define GL_MODELVIEW18_ARB 0x8732 -#define GL_MODELVIEW19_ARB 0x8733 -#define GL_MODELVIEW20_ARB 0x8734 -#define GL_MODELVIEW21_ARB 0x8735 -#define GL_MODELVIEW22_ARB 0x8736 -#define GL_MODELVIEW23_ARB 0x8737 -#define GL_MODELVIEW24_ARB 0x8738 -#define GL_MODELVIEW25_ARB 0x8739 -#define GL_MODELVIEW26_ARB 0x873A -#define GL_MODELVIEW27_ARB 0x873B -#define GL_MODELVIEW28_ARB 0x873C -#define GL_MODELVIEW29_ARB 0x873D -#define GL_MODELVIEW30_ARB 0x873E -#define GL_MODELVIEW31_ARB 0x873F -typedef void (APIENTRYP pfn_glWeightbvARB) (GLint, const GLbyte*); -extern pfn_glWeightbvARB fp_glWeightbvARB; -typedef void (APIENTRYP pfn_glWeightsvARB) (GLint, const GLshort*); -extern pfn_glWeightsvARB fp_glWeightsvARB; -typedef void (APIENTRYP pfn_glWeightivARB) (GLint, const GLint*); -extern pfn_glWeightivARB fp_glWeightivARB; -typedef void (APIENTRYP pfn_glWeightfvARB) (GLint, const GLfloat*); -extern pfn_glWeightfvARB fp_glWeightfvARB; -typedef void (APIENTRYP pfn_glWeightdvARB) (GLint, const GLdouble*); -extern pfn_glWeightdvARB fp_glWeightdvARB; -typedef void (APIENTRYP pfn_glWeightubvARB) (GLint, const GLubyte*); -extern pfn_glWeightubvARB fp_glWeightubvARB; -typedef void (APIENTRYP pfn_glWeightusvARB) (GLint, const GLushort*); -extern pfn_glWeightusvARB fp_glWeightusvARB; -typedef void (APIENTRYP pfn_glWeightuivARB) (GLint, const GLuint*); -extern pfn_glWeightuivARB fp_glWeightuivARB; -typedef void (APIENTRYP pfn_glWeightPointerARB) (GLint, GLenum, GLsizei, const void*); -extern pfn_glWeightPointerARB fp_glWeightPointerARB; -typedef void (APIENTRYP pfn_glVertexBlendARB) (GLint); -extern pfn_glVertexBlendARB fp_glVertexBlendARB; - - /* GL_ARB_vertex_buffer_object */ -extern GLboolean GLAD_ARB_vertex_buffer_object; -#define GL_BUFFER_SIZE_ARB 0x8764 -#define GL_BUFFER_USAGE_ARB 0x8765 -#define GL_ARRAY_BUFFER_ARB 0x8892 -#define GL_ELEMENT_ARRAY_BUFFER_ARB 0x8893 -#define GL_ARRAY_BUFFER_BINDING_ARB 0x8894 -#define GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB 0x8895 -#define GL_VERTEX_ARRAY_BUFFER_BINDING_ARB 0x8896 -#define GL_NORMAL_ARRAY_BUFFER_BINDING_ARB 0x8897 -#define GL_COLOR_ARRAY_BUFFER_BINDING_ARB 0x8898 -#define GL_INDEX_ARRAY_BUFFER_BINDING_ARB 0x8899 -#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING_ARB 0x889A -#define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING_ARB 0x889B -#define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING_ARB 0x889C -#define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING_ARB 0x889D -#define GL_WEIGHT_ARRAY_BUFFER_BINDING_ARB 0x889E -#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB 0x889F -#define GL_READ_ONLY_ARB 0x88B8 -#define GL_WRITE_ONLY_ARB 0x88B9 -#define GL_READ_WRITE_ARB 0x88BA -#define GL_BUFFER_ACCESS_ARB 0x88BB -#define GL_BUFFER_MAPPED_ARB 0x88BC -#define GL_BUFFER_MAP_POINTER_ARB 0x88BD -#define GL_STREAM_DRAW_ARB 0x88E0 -#define GL_STREAM_READ_ARB 0x88E1 -#define GL_STREAM_COPY_ARB 0x88E2 -#define GL_STATIC_DRAW_ARB 0x88E4 -#define GL_STATIC_READ_ARB 0x88E5 -#define GL_STATIC_COPY_ARB 0x88E6 -#define GL_DYNAMIC_DRAW_ARB 0x88E8 -#define GL_DYNAMIC_READ_ARB 0x88E9 -#define GL_DYNAMIC_COPY_ARB 0x88EA -typedef void (APIENTRYP pfn_glBindBufferARB) (GLenum, GLuint); -extern pfn_glBindBufferARB fp_glBindBufferARB; -typedef void (APIENTRYP pfn_glDeleteBuffersARB) (GLsizei, const GLuint*); -extern pfn_glDeleteBuffersARB fp_glDeleteBuffersARB; -typedef void (APIENTRYP pfn_glGenBuffersARB) (GLsizei, GLuint*); -extern pfn_glGenBuffersARB fp_glGenBuffersARB; -typedef GLboolean (APIENTRYP pfn_glIsBufferARB) (GLuint); -extern pfn_glIsBufferARB fp_glIsBufferARB; -typedef void (APIENTRYP pfn_glBufferDataARB) (GLenum, GLsizeiptrARB, const void*, GLenum); -extern pfn_glBufferDataARB fp_glBufferDataARB; -typedef void (APIENTRYP pfn_glBufferSubDataARB) (GLenum, GLintptrARB, GLsizeiptrARB, const void*); -extern pfn_glBufferSubDataARB fp_glBufferSubDataARB; -typedef void (APIENTRYP pfn_glGetBufferSubDataARB) (GLenum, GLintptrARB, GLsizeiptrARB, void*); -extern pfn_glGetBufferSubDataARB fp_glGetBufferSubDataARB; -typedef void* (APIENTRYP pfn_glMapBufferARB) (GLenum, GLenum); -extern pfn_glMapBufferARB fp_glMapBufferARB; -typedef GLboolean (APIENTRYP pfn_glUnmapBufferARB) (GLenum); -extern pfn_glUnmapBufferARB fp_glUnmapBufferARB; -typedef void (APIENTRYP pfn_glGetBufferParameterivARB) (GLenum, GLenum, GLint*); -extern pfn_glGetBufferParameterivARB fp_glGetBufferParameterivARB; -typedef void (APIENTRYP pfn_glGetBufferPointervARB) (GLenum, GLenum, void**); -extern pfn_glGetBufferPointervARB fp_glGetBufferPointervARB; - - /* GL_ARB_vertex_program */ -extern GLboolean GLAD_ARB_vertex_program; -#define GL_COLOR_SUM_ARB 0x8458 -#define GL_VERTEX_PROGRAM_ARB 0x8620 -#define GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB 0x8622 -#define GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB 0x8623 -#define GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB 0x8624 -#define GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB 0x8625 -#define GL_CURRENT_VERTEX_ATTRIB_ARB 0x8626 -#define GL_VERTEX_PROGRAM_POINT_SIZE_ARB 0x8642 -#define GL_VERTEX_PROGRAM_TWO_SIDE_ARB 0x8643 -#define GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB 0x8645 -#define GL_MAX_VERTEX_ATTRIBS_ARB 0x8869 -#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB 0x886A -#define GL_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B0 -#define GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B1 -#define GL_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B2 -#define GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B3 -typedef void (APIENTRYP pfn_glVertexAttrib1dARB) (GLuint, GLdouble); -extern pfn_glVertexAttrib1dARB fp_glVertexAttrib1dARB; -typedef void (APIENTRYP pfn_glVertexAttrib1dvARB) (GLuint, const GLdouble*); -extern pfn_glVertexAttrib1dvARB fp_glVertexAttrib1dvARB; -typedef void (APIENTRYP pfn_glVertexAttrib1fARB) (GLuint, GLfloat); -extern pfn_glVertexAttrib1fARB fp_glVertexAttrib1fARB; -typedef void (APIENTRYP pfn_glVertexAttrib1fvARB) (GLuint, const GLfloat*); -extern pfn_glVertexAttrib1fvARB fp_glVertexAttrib1fvARB; -typedef void (APIENTRYP pfn_glVertexAttrib1sARB) (GLuint, GLshort); -extern pfn_glVertexAttrib1sARB fp_glVertexAttrib1sARB; -typedef void (APIENTRYP pfn_glVertexAttrib1svARB) (GLuint, const GLshort*); -extern pfn_glVertexAttrib1svARB fp_glVertexAttrib1svARB; -typedef void (APIENTRYP pfn_glVertexAttrib2dARB) (GLuint, GLdouble, GLdouble); -extern pfn_glVertexAttrib2dARB fp_glVertexAttrib2dARB; -typedef void (APIENTRYP pfn_glVertexAttrib2dvARB) (GLuint, const GLdouble*); -extern pfn_glVertexAttrib2dvARB fp_glVertexAttrib2dvARB; -typedef void (APIENTRYP pfn_glVertexAttrib2fARB) (GLuint, GLfloat, GLfloat); -extern pfn_glVertexAttrib2fARB fp_glVertexAttrib2fARB; -typedef void (APIENTRYP pfn_glVertexAttrib2fvARB) (GLuint, const GLfloat*); -extern pfn_glVertexAttrib2fvARB fp_glVertexAttrib2fvARB; -typedef void (APIENTRYP pfn_glVertexAttrib2sARB) (GLuint, GLshort, GLshort); -extern pfn_glVertexAttrib2sARB fp_glVertexAttrib2sARB; -typedef void (APIENTRYP pfn_glVertexAttrib2svARB) (GLuint, const GLshort*); -extern pfn_glVertexAttrib2svARB fp_glVertexAttrib2svARB; -typedef void (APIENTRYP pfn_glVertexAttrib3dARB) (GLuint, GLdouble, GLdouble, GLdouble); -extern pfn_glVertexAttrib3dARB fp_glVertexAttrib3dARB; -typedef void (APIENTRYP pfn_glVertexAttrib3dvARB) (GLuint, const GLdouble*); -extern pfn_glVertexAttrib3dvARB fp_glVertexAttrib3dvARB; -typedef void (APIENTRYP pfn_glVertexAttrib3fARB) (GLuint, GLfloat, GLfloat, GLfloat); -extern pfn_glVertexAttrib3fARB fp_glVertexAttrib3fARB; -typedef void (APIENTRYP pfn_glVertexAttrib3fvARB) (GLuint, const GLfloat*); -extern pfn_glVertexAttrib3fvARB fp_glVertexAttrib3fvARB; -typedef void (APIENTRYP pfn_glVertexAttrib3sARB) (GLuint, GLshort, GLshort, GLshort); -extern pfn_glVertexAttrib3sARB fp_glVertexAttrib3sARB; -typedef void (APIENTRYP pfn_glVertexAttrib3svARB) (GLuint, const GLshort*); -extern pfn_glVertexAttrib3svARB fp_glVertexAttrib3svARB; -typedef void (APIENTRYP pfn_glVertexAttrib4NbvARB) (GLuint, const GLbyte*); -extern pfn_glVertexAttrib4NbvARB fp_glVertexAttrib4NbvARB; -typedef void (APIENTRYP pfn_glVertexAttrib4NivARB) (GLuint, const GLint*); -extern pfn_glVertexAttrib4NivARB fp_glVertexAttrib4NivARB; -typedef void (APIENTRYP pfn_glVertexAttrib4NsvARB) (GLuint, const GLshort*); -extern pfn_glVertexAttrib4NsvARB fp_glVertexAttrib4NsvARB; -typedef void (APIENTRYP pfn_glVertexAttrib4NubARB) (GLuint, GLubyte, GLubyte, GLubyte, GLubyte); -extern pfn_glVertexAttrib4NubARB fp_glVertexAttrib4NubARB; -typedef void (APIENTRYP pfn_glVertexAttrib4NubvARB) (GLuint, const GLubyte*); -extern pfn_glVertexAttrib4NubvARB fp_glVertexAttrib4NubvARB; -typedef void (APIENTRYP pfn_glVertexAttrib4NuivARB) (GLuint, const GLuint*); -extern pfn_glVertexAttrib4NuivARB fp_glVertexAttrib4NuivARB; -typedef void (APIENTRYP pfn_glVertexAttrib4NusvARB) (GLuint, const GLushort*); -extern pfn_glVertexAttrib4NusvARB fp_glVertexAttrib4NusvARB; -typedef void (APIENTRYP pfn_glVertexAttrib4bvARB) (GLuint, const GLbyte*); -extern pfn_glVertexAttrib4bvARB fp_glVertexAttrib4bvARB; -typedef void (APIENTRYP pfn_glVertexAttrib4dARB) (GLuint, GLdouble, GLdouble, GLdouble, GLdouble); -extern pfn_glVertexAttrib4dARB fp_glVertexAttrib4dARB; -typedef void (APIENTRYP pfn_glVertexAttrib4dvARB) (GLuint, const GLdouble*); -extern pfn_glVertexAttrib4dvARB fp_glVertexAttrib4dvARB; -typedef void (APIENTRYP pfn_glVertexAttrib4fARB) (GLuint, GLfloat, GLfloat, GLfloat, GLfloat); -extern pfn_glVertexAttrib4fARB fp_glVertexAttrib4fARB; -typedef void (APIENTRYP pfn_glVertexAttrib4fvARB) (GLuint, const GLfloat*); -extern pfn_glVertexAttrib4fvARB fp_glVertexAttrib4fvARB; -typedef void (APIENTRYP pfn_glVertexAttrib4ivARB) (GLuint, const GLint*); -extern pfn_glVertexAttrib4ivARB fp_glVertexAttrib4ivARB; -typedef void (APIENTRYP pfn_glVertexAttrib4sARB) (GLuint, GLshort, GLshort, GLshort, GLshort); -extern pfn_glVertexAttrib4sARB fp_glVertexAttrib4sARB; -typedef void (APIENTRYP pfn_glVertexAttrib4svARB) (GLuint, const GLshort*); -extern pfn_glVertexAttrib4svARB fp_glVertexAttrib4svARB; -typedef void (APIENTRYP pfn_glVertexAttrib4ubvARB) (GLuint, const GLubyte*); -extern pfn_glVertexAttrib4ubvARB fp_glVertexAttrib4ubvARB; -typedef void (APIENTRYP pfn_glVertexAttrib4uivARB) (GLuint, const GLuint*); -extern pfn_glVertexAttrib4uivARB fp_glVertexAttrib4uivARB; -typedef void (APIENTRYP pfn_glVertexAttrib4usvARB) (GLuint, const GLushort*); -extern pfn_glVertexAttrib4usvARB fp_glVertexAttrib4usvARB; -typedef void (APIENTRYP pfn_glVertexAttribPointerARB) (GLuint, GLint, GLenum, GLboolean, GLsizei, const void*); -extern pfn_glVertexAttribPointerARB fp_glVertexAttribPointerARB; -typedef void (APIENTRYP pfn_glEnableVertexAttribArrayARB) (GLuint); -extern pfn_glEnableVertexAttribArrayARB fp_glEnableVertexAttribArrayARB; -typedef void (APIENTRYP pfn_glDisableVertexAttribArrayARB) (GLuint); -extern pfn_glDisableVertexAttribArrayARB fp_glDisableVertexAttribArrayARB; -typedef void (APIENTRYP pfn_glGetVertexAttribdvARB) (GLuint, GLenum, GLdouble*); -extern pfn_glGetVertexAttribdvARB fp_glGetVertexAttribdvARB; -typedef void (APIENTRYP pfn_glGetVertexAttribfvARB) (GLuint, GLenum, GLfloat*); -extern pfn_glGetVertexAttribfvARB fp_glGetVertexAttribfvARB; -typedef void (APIENTRYP pfn_glGetVertexAttribivARB) (GLuint, GLenum, GLint*); -extern pfn_glGetVertexAttribivARB fp_glGetVertexAttribivARB; -typedef void (APIENTRYP pfn_glGetVertexAttribPointervARB) (GLuint, GLenum, void**); -extern pfn_glGetVertexAttribPointervARB fp_glGetVertexAttribPointervARB; - - /* GL_ARB_vertex_shader */ -extern GLboolean GLAD_ARB_vertex_shader; -#define GL_VERTEX_SHADER_ARB 0x8B31 -#define GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB 0x8B4A -#define GL_MAX_VARYING_FLOATS_ARB 0x8B4B -#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB 0x8B4C -#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB 0x8B4D -#define GL_OBJECT_ACTIVE_ATTRIBUTES_ARB 0x8B89 -#define GL_OBJECT_ACTIVE_ATTRIBUTE_MAX_LENGTH_ARB 0x8B8A -typedef void (APIENTRYP pfn_glBindAttribLocationARB) (GLhandleARB, GLuint, const GLcharARB*); -extern pfn_glBindAttribLocationARB fp_glBindAttribLocationARB; -typedef void (APIENTRYP pfn_glGetActiveAttribARB) (GLhandleARB, GLuint, GLsizei, GLsizei*, GLint*, GLenum*, GLcharARB*); -extern pfn_glGetActiveAttribARB fp_glGetActiveAttribARB; -typedef GLint (APIENTRYP pfn_glGetAttribLocationARB) (GLhandleARB, const GLcharARB*); -extern pfn_glGetAttribLocationARB fp_glGetAttribLocationARB; - /* GL_ARB_vertex_type_10f_11f_11f_rev */ extern GLboolean GLAD_ARB_vertex_type_10f_11f_11f_rev; @@ -5288,51 +4862,19 @@ extern GLboolean GLAD_ARB_vertex_type_2_10_10_10_rev; /* GL_ARB_viewport_array */ extern GLboolean GLAD_ARB_viewport_array; - /* GL_ARB_window_pos */ -extern GLboolean GLAD_ARB_window_pos; -typedef void (APIENTRYP pfn_glWindowPos2dARB) (GLdouble, GLdouble); -extern pfn_glWindowPos2dARB fp_glWindowPos2dARB; -typedef void (APIENTRYP pfn_glWindowPos2dvARB) (const GLdouble*); -extern pfn_glWindowPos2dvARB fp_glWindowPos2dvARB; -typedef void (APIENTRYP pfn_glWindowPos2fARB) (GLfloat, GLfloat); -extern pfn_glWindowPos2fARB fp_glWindowPos2fARB; -typedef void (APIENTRYP pfn_glWindowPos2fvARB) (const GLfloat*); -extern pfn_glWindowPos2fvARB fp_glWindowPos2fvARB; -typedef void (APIENTRYP pfn_glWindowPos2iARB) (GLint, GLint); -extern pfn_glWindowPos2iARB fp_glWindowPos2iARB; -typedef void (APIENTRYP pfn_glWindowPos2ivARB) (const GLint*); -extern pfn_glWindowPos2ivARB fp_glWindowPos2ivARB; -typedef void (APIENTRYP pfn_glWindowPos2sARB) (GLshort, GLshort); -extern pfn_glWindowPos2sARB fp_glWindowPos2sARB; -typedef void (APIENTRYP pfn_glWindowPos2svARB) (const GLshort*); -extern pfn_glWindowPos2svARB fp_glWindowPos2svARB; -typedef void (APIENTRYP pfn_glWindowPos3dARB) (GLdouble, GLdouble, GLdouble); -extern pfn_glWindowPos3dARB fp_glWindowPos3dARB; -typedef void (APIENTRYP pfn_glWindowPos3dvARB) (const GLdouble*); -extern pfn_glWindowPos3dvARB fp_glWindowPos3dvARB; -typedef void (APIENTRYP pfn_glWindowPos3fARB) (GLfloat, GLfloat, GLfloat); -extern pfn_glWindowPos3fARB fp_glWindowPos3fARB; -typedef void (APIENTRYP pfn_glWindowPos3fvARB) (const GLfloat*); -extern pfn_glWindowPos3fvARB fp_glWindowPos3fvARB; -typedef void (APIENTRYP pfn_glWindowPos3iARB) (GLint, GLint, GLint); -extern pfn_glWindowPos3iARB fp_glWindowPos3iARB; -typedef void (APIENTRYP pfn_glWindowPos3ivARB) (const GLint*); -extern pfn_glWindowPos3ivARB fp_glWindowPos3ivARB; -typedef void (APIENTRYP pfn_glWindowPos3sARB) (GLshort, GLshort, GLshort); -extern pfn_glWindowPos3sARB fp_glWindowPos3sARB; -typedef void (APIENTRYP pfn_glWindowPos3svARB) (const GLshort*); -extern pfn_glWindowPos3svARB fp_glWindowPos3svARB; + /* GL_EXT_base_instance */ +extern GLboolean GLAD_EXT_base_instance; +typedef void (APIENTRYP pfn_glDrawArraysInstancedBaseInstanceEXT) (GLenum, GLint, GLsizei, GLsizei, GLuint); +extern pfn_glDrawArraysInstancedBaseInstanceEXT fp_glDrawArraysInstancedBaseInstanceEXT; +typedef void (APIENTRYP pfn_glDrawElementsInstancedBaseInstanceEXT) (GLenum, GLsizei, GLenum, const void*, GLsizei, GLuint); +extern pfn_glDrawElementsInstancedBaseInstanceEXT fp_glDrawElementsInstancedBaseInstanceEXT; +typedef void (APIENTRYP pfn_glDrawElementsInstancedBaseVertexBaseInstanceEXT) (GLenum, GLsizei, GLenum, const void*, GLsizei, GLint, GLuint); +extern pfn_glDrawElementsInstancedBaseVertexBaseInstanceEXT fp_glDrawElementsInstancedBaseVertexBaseInstanceEXT; - /* GL_EXT_422_pixels */ -extern GLboolean GLAD_EXT_422_pixels; -#define GL_422_EXT 0x80CC -#define GL_422_REV_EXT 0x80CD -#define GL_422_AVERAGE_EXT 0x80CE -#define GL_422_REV_AVERAGE_EXT 0x80CF - - /* GL_EXT_abgr */ -extern GLboolean GLAD_EXT_abgr; -#define GL_ABGR_EXT 0x8000 + /* GL_EXT_bgra */ +extern GLboolean GLAD_EXT_bgra; +#define GL_BGR_EXT 0x80E0 +#define GL_BGRA_EXT 0x80E1 /* GL_EXT_bindable_uniform */ extern GLboolean GLAD_EXT_bindable_uniform; @@ -5349,57 +4891,6 @@ extern pfn_glGetUniformBufferSizeEXT fp_glGetUniformBufferSizeEXT; typedef GLintptr (APIENTRYP pfn_glGetUniformOffsetEXT) (GLuint, GLint); extern pfn_glGetUniformOffsetEXT fp_glGetUniformOffsetEXT; - /* GL_EXT_blend_color */ -extern GLboolean GLAD_EXT_blend_color; -#define GL_CONSTANT_COLOR_EXT 0x8001 -#define GL_ONE_MINUS_CONSTANT_COLOR_EXT 0x8002 -#define GL_CONSTANT_ALPHA_EXT 0x8003 -#define GL_ONE_MINUS_CONSTANT_ALPHA_EXT 0x8004 -#define GL_BLEND_COLOR_EXT 0x8005 -typedef void (APIENTRYP pfn_glBlendColorEXT) (GLfloat, GLfloat, GLfloat, GLfloat); -extern pfn_glBlendColorEXT fp_glBlendColorEXT; - - /* GL_EXT_blend_equation_separate */ -extern GLboolean GLAD_EXT_blend_equation_separate; -#define GL_BLEND_EQUATION_RGB_EXT 0x8009 -#define GL_BLEND_EQUATION_ALPHA_EXT 0x883D -typedef void (APIENTRYP pfn_glBlendEquationSeparateEXT) (GLenum, GLenum); -extern pfn_glBlendEquationSeparateEXT fp_glBlendEquationSeparateEXT; - - /* GL_EXT_blend_func_separate */ -extern GLboolean GLAD_EXT_blend_func_separate; -#define GL_BLEND_DST_RGB_EXT 0x80C8 -#define GL_BLEND_SRC_RGB_EXT 0x80C9 -#define GL_BLEND_DST_ALPHA_EXT 0x80CA -#define GL_BLEND_SRC_ALPHA_EXT 0x80CB -typedef void (APIENTRYP pfn_glBlendFuncSeparateEXT) (GLenum, GLenum, GLenum, GLenum); -extern pfn_glBlendFuncSeparateEXT fp_glBlendFuncSeparateEXT; - - /* GL_EXT_blend_minmax */ -extern GLboolean GLAD_EXT_blend_minmax; -#define GL_MIN_EXT 0x8007 -#define GL_MAX_EXT 0x8008 -#define GL_FUNC_ADD_EXT 0x8006 -#define GL_BLEND_EQUATION_EXT 0x8009 -typedef void (APIENTRYP pfn_glBlendEquationEXT) (GLenum); -extern pfn_glBlendEquationEXT fp_glBlendEquationEXT; - - /* GL_EXT_blend_subtract */ -extern GLboolean GLAD_EXT_blend_subtract; -#define GL_FUNC_SUBTRACT_EXT 0x800A -#define GL_FUNC_REVERSE_SUBTRACT_EXT 0x800B - - /* GL_EXT_clip_volume_hint */ -extern GLboolean GLAD_EXT_clip_volume_hint; -#define GL_CLIP_VOLUME_CLIPPING_HINT_EXT 0x80F0 - - /* GL_EXT_cmyka */ -extern GLboolean GLAD_EXT_cmyka; -#define GL_CMYK_EXT 0x800C -#define GL_CMYKA_EXT 0x800D -#define GL_PACK_CMYK_HINT_EXT 0x800E -#define GL_UNPACK_CMYK_HINT_EXT 0x800F - /* GL_EXT_color_buffer_half_float */ extern GLboolean GLAD_EXT_color_buffer_half_float; #define GL_RGBA16F_EXT 0x881A @@ -5409,141 +4900,10 @@ extern GLboolean GLAD_EXT_color_buffer_half_float; #define GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE_EXT 0x8211 #define GL_UNSIGNED_NORMALIZED_EXT 0x8C17 - /* GL_EXT_color_subtable */ -extern GLboolean GLAD_EXT_color_subtable; -typedef void (APIENTRYP pfn_glColorSubTableEXT) (GLenum, GLsizei, GLsizei, GLenum, GLenum, const void*); -extern pfn_glColorSubTableEXT fp_glColorSubTableEXT; -typedef void (APIENTRYP pfn_glCopyColorSubTableEXT) (GLenum, GLsizei, GLint, GLint, GLsizei); -extern pfn_glCopyColorSubTableEXT fp_glCopyColorSubTableEXT; - - /* GL_EXT_compiled_vertex_array */ -extern GLboolean GLAD_EXT_compiled_vertex_array; -#define GL_ARRAY_ELEMENT_LOCK_FIRST_EXT 0x81A8 -#define GL_ARRAY_ELEMENT_LOCK_COUNT_EXT 0x81A9 -typedef void (APIENTRYP pfn_glLockArraysEXT) (GLint, GLsizei); -extern pfn_glLockArraysEXT fp_glLockArraysEXT; -typedef void (APIENTRYP pfn_glUnlockArraysEXT) (); -extern pfn_glUnlockArraysEXT fp_glUnlockArraysEXT; - - /* GL_EXT_convolution */ -extern GLboolean GLAD_EXT_convolution; -#define GL_CONVOLUTION_1D_EXT 0x8010 -#define GL_CONVOLUTION_2D_EXT 0x8011 -#define GL_SEPARABLE_2D_EXT 0x8012 -#define GL_CONVOLUTION_BORDER_MODE_EXT 0x8013 -#define GL_CONVOLUTION_FILTER_SCALE_EXT 0x8014 -#define GL_CONVOLUTION_FILTER_BIAS_EXT 0x8015 -#define GL_REDUCE_EXT 0x8016 -#define GL_CONVOLUTION_FORMAT_EXT 0x8017 -#define GL_CONVOLUTION_WIDTH_EXT 0x8018 -#define GL_CONVOLUTION_HEIGHT_EXT 0x8019 -#define GL_MAX_CONVOLUTION_WIDTH_EXT 0x801A -#define GL_MAX_CONVOLUTION_HEIGHT_EXT 0x801B -#define GL_POST_CONVOLUTION_RED_SCALE_EXT 0x801C -#define GL_POST_CONVOLUTION_GREEN_SCALE_EXT 0x801D -#define GL_POST_CONVOLUTION_BLUE_SCALE_EXT 0x801E -#define GL_POST_CONVOLUTION_ALPHA_SCALE_EXT 0x801F -#define GL_POST_CONVOLUTION_RED_BIAS_EXT 0x8020 -#define GL_POST_CONVOLUTION_GREEN_BIAS_EXT 0x8021 -#define GL_POST_CONVOLUTION_BLUE_BIAS_EXT 0x8022 -#define GL_POST_CONVOLUTION_ALPHA_BIAS_EXT 0x8023 -typedef void (APIENTRYP pfn_glConvolutionFilter1DEXT) (GLenum, GLenum, GLsizei, GLenum, GLenum, const void*); -extern pfn_glConvolutionFilter1DEXT fp_glConvolutionFilter1DEXT; -typedef void (APIENTRYP pfn_glConvolutionFilter2DEXT) (GLenum, GLenum, GLsizei, GLsizei, GLenum, GLenum, const void*); -extern pfn_glConvolutionFilter2DEXT fp_glConvolutionFilter2DEXT; -typedef void (APIENTRYP pfn_glConvolutionParameterfEXT) (GLenum, GLenum, GLfloat); -extern pfn_glConvolutionParameterfEXT fp_glConvolutionParameterfEXT; -typedef void (APIENTRYP pfn_glConvolutionParameterfvEXT) (GLenum, GLenum, const GLfloat*); -extern pfn_glConvolutionParameterfvEXT fp_glConvolutionParameterfvEXT; -typedef void (APIENTRYP pfn_glConvolutionParameteriEXT) (GLenum, GLenum, GLint); -extern pfn_glConvolutionParameteriEXT fp_glConvolutionParameteriEXT; -typedef void (APIENTRYP pfn_glConvolutionParameterivEXT) (GLenum, GLenum, const GLint*); -extern pfn_glConvolutionParameterivEXT fp_glConvolutionParameterivEXT; -typedef void (APIENTRYP pfn_glCopyConvolutionFilter1DEXT) (GLenum, GLenum, GLint, GLint, GLsizei); -extern pfn_glCopyConvolutionFilter1DEXT fp_glCopyConvolutionFilter1DEXT; -typedef void (APIENTRYP pfn_glCopyConvolutionFilter2DEXT) (GLenum, GLenum, GLint, GLint, GLsizei, GLsizei); -extern pfn_glCopyConvolutionFilter2DEXT fp_glCopyConvolutionFilter2DEXT; -typedef void (APIENTRYP pfn_glGetConvolutionFilterEXT) (GLenum, GLenum, GLenum, void*); -extern pfn_glGetConvolutionFilterEXT fp_glGetConvolutionFilterEXT; -typedef void (APIENTRYP pfn_glGetConvolutionParameterfvEXT) (GLenum, GLenum, GLfloat*); -extern pfn_glGetConvolutionParameterfvEXT fp_glGetConvolutionParameterfvEXT; -typedef void (APIENTRYP pfn_glGetConvolutionParameterivEXT) (GLenum, GLenum, GLint*); -extern pfn_glGetConvolutionParameterivEXT fp_glGetConvolutionParameterivEXT; -typedef void (APIENTRYP pfn_glGetSeparableFilterEXT) (GLenum, GLenum, GLenum, void*, void*, void*); -extern pfn_glGetSeparableFilterEXT fp_glGetSeparableFilterEXT; -typedef void (APIENTRYP pfn_glSeparableFilter2DEXT) (GLenum, GLenum, GLsizei, GLsizei, GLenum, GLenum, const void*, const void*); -extern pfn_glSeparableFilter2DEXT fp_glSeparableFilter2DEXT; - - /* GL_EXT_coordinate_frame */ -extern GLboolean GLAD_EXT_coordinate_frame; -#define GL_TANGENT_ARRAY_EXT 0x8439 -#define GL_BINORMAL_ARRAY_EXT 0x843A -#define GL_CURRENT_TANGENT_EXT 0x843B -#define GL_CURRENT_BINORMAL_EXT 0x843C -#define GL_TANGENT_ARRAY_TYPE_EXT 0x843E -#define GL_TANGENT_ARRAY_STRIDE_EXT 0x843F -#define GL_BINORMAL_ARRAY_TYPE_EXT 0x8440 -#define GL_BINORMAL_ARRAY_STRIDE_EXT 0x8441 -#define GL_TANGENT_ARRAY_POINTER_EXT 0x8442 -#define GL_BINORMAL_ARRAY_POINTER_EXT 0x8443 -#define GL_MAP1_TANGENT_EXT 0x8444 -#define GL_MAP2_TANGENT_EXT 0x8445 -#define GL_MAP1_BINORMAL_EXT 0x8446 -#define GL_MAP2_BINORMAL_EXT 0x8447 -typedef void (APIENTRYP pfn_glTangent3bEXT) (GLbyte, GLbyte, GLbyte); -extern pfn_glTangent3bEXT fp_glTangent3bEXT; -typedef void (APIENTRYP pfn_glTangent3bvEXT) (const GLbyte*); -extern pfn_glTangent3bvEXT fp_glTangent3bvEXT; -typedef void (APIENTRYP pfn_glTangent3dEXT) (GLdouble, GLdouble, GLdouble); -extern pfn_glTangent3dEXT fp_glTangent3dEXT; -typedef void (APIENTRYP pfn_glTangent3dvEXT) (const GLdouble*); -extern pfn_glTangent3dvEXT fp_glTangent3dvEXT; -typedef void (APIENTRYP pfn_glTangent3fEXT) (GLfloat, GLfloat, GLfloat); -extern pfn_glTangent3fEXT fp_glTangent3fEXT; -typedef void (APIENTRYP pfn_glTangent3fvEXT) (const GLfloat*); -extern pfn_glTangent3fvEXT fp_glTangent3fvEXT; -typedef void (APIENTRYP pfn_glTangent3iEXT) (GLint, GLint, GLint); -extern pfn_glTangent3iEXT fp_glTangent3iEXT; -typedef void (APIENTRYP pfn_glTangent3ivEXT) (const GLint*); -extern pfn_glTangent3ivEXT fp_glTangent3ivEXT; -typedef void (APIENTRYP pfn_glTangent3sEXT) (GLshort, GLshort, GLshort); -extern pfn_glTangent3sEXT fp_glTangent3sEXT; -typedef void (APIENTRYP pfn_glTangent3svEXT) (const GLshort*); -extern pfn_glTangent3svEXT fp_glTangent3svEXT; -typedef void (APIENTRYP pfn_glBinormal3bEXT) (GLbyte, GLbyte, GLbyte); -extern pfn_glBinormal3bEXT fp_glBinormal3bEXT; -typedef void (APIENTRYP pfn_glBinormal3bvEXT) (const GLbyte*); -extern pfn_glBinormal3bvEXT fp_glBinormal3bvEXT; -typedef void (APIENTRYP pfn_glBinormal3dEXT) (GLdouble, GLdouble, GLdouble); -extern pfn_glBinormal3dEXT fp_glBinormal3dEXT; -typedef void (APIENTRYP pfn_glBinormal3dvEXT) (const GLdouble*); -extern pfn_glBinormal3dvEXT fp_glBinormal3dvEXT; -typedef void (APIENTRYP pfn_glBinormal3fEXT) (GLfloat, GLfloat, GLfloat); -extern pfn_glBinormal3fEXT fp_glBinormal3fEXT; -typedef void (APIENTRYP pfn_glBinormal3fvEXT) (const GLfloat*); -extern pfn_glBinormal3fvEXT fp_glBinormal3fvEXT; -typedef void (APIENTRYP pfn_glBinormal3iEXT) (GLint, GLint, GLint); -extern pfn_glBinormal3iEXT fp_glBinormal3iEXT; -typedef void (APIENTRYP pfn_glBinormal3ivEXT) (const GLint*); -extern pfn_glBinormal3ivEXT fp_glBinormal3ivEXT; -typedef void (APIENTRYP pfn_glBinormal3sEXT) (GLshort, GLshort, GLshort); -extern pfn_glBinormal3sEXT fp_glBinormal3sEXT; -typedef void (APIENTRYP pfn_glBinormal3svEXT) (const GLshort*); -extern pfn_glBinormal3svEXT fp_glBinormal3svEXT; -typedef void (APIENTRYP pfn_glTangentPointerEXT) (GLenum, GLsizei, const void*); -extern pfn_glTangentPointerEXT fp_glTangentPointerEXT; -typedef void (APIENTRYP pfn_glBinormalPointerEXT) (GLenum, GLsizei, const void*); -extern pfn_glBinormalPointerEXT fp_glBinormalPointerEXT; - - /* GL_EXT_cull_vertex */ -extern GLboolean GLAD_EXT_cull_vertex; -#define GL_CULL_VERTEX_EXT 0x81AA -#define GL_CULL_VERTEX_EYE_POSITION_EXT 0x81AB -#define GL_CULL_VERTEX_OBJECT_POSITION_EXT 0x81AC -typedef void (APIENTRYP pfn_glCullParameterdvEXT) (GLenum, GLdouble*); -extern pfn_glCullParameterdvEXT fp_glCullParameterdvEXT; -typedef void (APIENTRYP pfn_glCullParameterfvEXT) (GLenum, GLfloat*); -extern pfn_glCullParameterfvEXT fp_glCullParameterfvEXT; + /* GL_EXT_copy_image */ +extern GLboolean GLAD_EXT_copy_image; +typedef void (APIENTRYP pfn_glCopyImageSubDataEXT) (GLuint, GLenum, GLint, GLint, GLint, GLint, GLuint, GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei); +extern pfn_glCopyImageSubDataEXT fp_glCopyImageSubDataEXT; /* GL_EXT_debug_label */ extern GLboolean GLAD_EXT_debug_label; @@ -5567,13 +4927,6 @@ extern pfn_glPushGroupMarkerEXT fp_glPushGroupMarkerEXT; typedef void (APIENTRYP pfn_glPopGroupMarkerEXT) (); extern pfn_glPopGroupMarkerEXT fp_glPopGroupMarkerEXT; - /* GL_EXT_depth_bounds_test */ -extern GLboolean GLAD_EXT_depth_bounds_test; -#define GL_DEPTH_BOUNDS_TEST_EXT 0x8890 -#define GL_DEPTH_BOUNDS_EXT 0x8891 -typedef void (APIENTRYP pfn_glDepthBoundsEXT) (GLclampd, GLclampd); -extern pfn_glDepthBoundsEXT fp_glDepthBoundsEXT; - /* GL_EXT_direct_state_access */ extern GLboolean GLAD_EXT_direct_state_access; #define GL_PROGRAM_MATRIX_EXT 0x8E2D @@ -6019,7 +5372,7 @@ typedef void (APIENTRYP pfn_glNamedBufferStorageEXT) (GLuint, GLsizeiptr, const extern pfn_glNamedBufferStorageEXT fp_glNamedBufferStorageEXT; typedef void (APIENTRYP pfn_glClearNamedBufferDataEXT) (GLuint, GLenum, GLenum, GLenum, const void*); extern pfn_glClearNamedBufferDataEXT fp_glClearNamedBufferDataEXT; -typedef void (APIENTRYP pfn_glClearNamedBufferSubDataEXT) (GLuint, GLenum, GLenum, GLenum, GLsizeiptr, GLsizeiptr, const void*); +typedef void (APIENTRYP pfn_glClearNamedBufferSubDataEXT) (GLuint, GLenum, GLsizeiptr, GLsizeiptr, GLenum, GLenum, const void*); extern pfn_glClearNamedBufferSubDataEXT fp_glClearNamedBufferSubDataEXT; typedef void (APIENTRYP pfn_glNamedFramebufferParameteriEXT) (GLuint, GLenum, GLint); extern pfn_glNamedFramebufferParameteriEXT fp_glNamedFramebufferParameteriEXT; @@ -6174,6 +5527,36 @@ extern GLboolean GLAD_EXT_draw_buffers2; typedef void (APIENTRYP pfn_glColorMaskIndexedEXT) (GLuint, GLboolean, GLboolean, GLboolean, GLboolean); extern pfn_glColorMaskIndexedEXT fp_glColorMaskIndexedEXT; + /* GL_EXT_draw_buffers_indexed */ +extern GLboolean GLAD_EXT_draw_buffers_indexed; +typedef void (APIENTRYP pfn_glEnableiEXT) (GLenum, GLuint); +extern pfn_glEnableiEXT fp_glEnableiEXT; +typedef void (APIENTRYP pfn_glDisableiEXT) (GLenum, GLuint); +extern pfn_glDisableiEXT fp_glDisableiEXT; +typedef void (APIENTRYP pfn_glBlendEquationiEXT) (GLuint, GLenum); +extern pfn_glBlendEquationiEXT fp_glBlendEquationiEXT; +typedef void (APIENTRYP pfn_glBlendEquationSeparateiEXT) (GLuint, GLenum, GLenum); +extern pfn_glBlendEquationSeparateiEXT fp_glBlendEquationSeparateiEXT; +typedef void (APIENTRYP pfn_glBlendFunciEXT) (GLuint, GLenum, GLenum); +extern pfn_glBlendFunciEXT fp_glBlendFunciEXT; +typedef void (APIENTRYP pfn_glBlendFuncSeparateiEXT) (GLuint, GLenum, GLenum, GLenum, GLenum); +extern pfn_glBlendFuncSeparateiEXT fp_glBlendFuncSeparateiEXT; +typedef void (APIENTRYP pfn_glColorMaskiEXT) (GLuint, GLboolean, GLboolean, GLboolean, GLboolean); +extern pfn_glColorMaskiEXT fp_glColorMaskiEXT; +typedef GLboolean (APIENTRYP pfn_glIsEnablediEXT) (GLenum, GLuint); +extern pfn_glIsEnablediEXT fp_glIsEnablediEXT; + + /* GL_EXT_draw_elements_base_vertex */ +extern GLboolean GLAD_EXT_draw_elements_base_vertex; +typedef void (APIENTRYP pfn_glDrawElementsBaseVertexEXT) (GLenum, GLsizei, GLenum, const void*, GLint); +extern pfn_glDrawElementsBaseVertexEXT fp_glDrawElementsBaseVertexEXT; +typedef void (APIENTRYP pfn_glDrawRangeElementsBaseVertexEXT) (GLenum, GLuint, GLuint, GLsizei, GLenum, const void*, GLint); +extern pfn_glDrawRangeElementsBaseVertexEXT fp_glDrawRangeElementsBaseVertexEXT; +typedef void (APIENTRYP pfn_glDrawElementsInstancedBaseVertexEXT) (GLenum, GLsizei, GLenum, const void*, GLsizei, GLint); +extern pfn_glDrawElementsInstancedBaseVertexEXT fp_glDrawElementsInstancedBaseVertexEXT; +typedef void (APIENTRYP pfn_glMultiDrawElementsBaseVertexEXT) (GLenum, const GLsizei*, GLenum, const void**, GLsizei, const GLint*); +extern pfn_glMultiDrawElementsBaseVertexEXT fp_glMultiDrawElementsBaseVertexEXT; + /* GL_EXT_draw_instanced */ extern GLboolean GLAD_EXT_draw_instanced; typedef void (APIENTRYP pfn_glDrawArraysInstancedEXT) (GLenum, GLint, GLsizei, GLsizei); @@ -6181,27 +5564,6 @@ extern pfn_glDrawArraysInstancedEXT fp_glDrawArraysInstancedEXT; typedef void (APIENTRYP pfn_glDrawElementsInstancedEXT) (GLenum, GLsizei, GLenum, const void*, GLsizei); extern pfn_glDrawElementsInstancedEXT fp_glDrawElementsInstancedEXT; - /* GL_EXT_fog_coord */ -extern GLboolean GLAD_EXT_fog_coord; -#define GL_FOG_COORDINATE_SOURCE_EXT 0x8450 -#define GL_FOG_COORDINATE_EXT 0x8451 -#define GL_FRAGMENT_DEPTH_EXT 0x8452 -#define GL_CURRENT_FOG_COORDINATE_EXT 0x8453 -#define GL_FOG_COORDINATE_ARRAY_TYPE_EXT 0x8454 -#define GL_FOG_COORDINATE_ARRAY_STRIDE_EXT 0x8455 -#define GL_FOG_COORDINATE_ARRAY_POINTER_EXT 0x8456 -#define GL_FOG_COORDINATE_ARRAY_EXT 0x8457 -typedef void (APIENTRYP pfn_glFogCoordfEXT) (GLfloat); -extern pfn_glFogCoordfEXT fp_glFogCoordfEXT; -typedef void (APIENTRYP pfn_glFogCoordfvEXT) (const GLfloat*); -extern pfn_glFogCoordfvEXT fp_glFogCoordfvEXT; -typedef void (APIENTRYP pfn_glFogCoorddEXT) (GLdouble); -extern pfn_glFogCoorddEXT fp_glFogCoorddEXT; -typedef void (APIENTRYP pfn_glFogCoorddvEXT) (const GLdouble*); -extern pfn_glFogCoorddvEXT fp_glFogCoorddvEXT; -typedef void (APIENTRYP pfn_glFogCoordPointerEXT) (GLenum, GLsizei, const void*); -extern pfn_glFogCoordPointerEXT fp_glFogCoordPointerEXT; - /* GL_EXT_framebuffer_blit */ extern GLboolean GLAD_EXT_framebuffer_blit; #define GL_READ_FRAMEBUFFER_EXT 0x8CA8 @@ -6300,26 +5662,56 @@ extern GLboolean GLAD_EXT_framebuffer_sRGB; #define GL_FRAMEBUFFER_SRGB_EXT 0x8DB9 #define GL_FRAMEBUFFER_SRGB_CAPABLE_EXT 0x8DBA - /* GL_EXT_geometry_shader4 */ -extern GLboolean GLAD_EXT_geometry_shader4; + /* GL_EXT_geometry_point_size */ +extern GLboolean GLAD_EXT_geometry_point_size; + + /* GL_EXT_geometry_shader */ +extern GLboolean GLAD_EXT_geometry_shader; #define GL_GEOMETRY_SHADER_EXT 0x8DD9 -#define GL_GEOMETRY_VERTICES_OUT_EXT 0x8DDA -#define GL_GEOMETRY_INPUT_TYPE_EXT 0x8DDB -#define GL_GEOMETRY_OUTPUT_TYPE_EXT 0x8DDC -#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT 0x8C29 -#define GL_MAX_GEOMETRY_VARYING_COMPONENTS_EXT 0x8DDD -#define GL_MAX_VERTEX_VARYING_COMPONENTS_EXT 0x8DDE -#define GL_MAX_VARYING_COMPONENTS_EXT 0x8B4B -#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT 0x8DDF -#define GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT 0x8DE0 -#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT 0x8DE1 +#define GL_GEOMETRY_SHADER_BIT_EXT 0x00000004 +#define GL_GEOMETRY_LINKED_VERTICES_OUT_EXT 0x8916 +#define GL_GEOMETRY_LINKED_INPUT_TYPE_EXT 0x8917 +#define GL_GEOMETRY_LINKED_OUTPUT_TYPE_EXT 0x8918 +#define GL_GEOMETRY_SHADER_INVOCATIONS_EXT 0x887F +#define GL_LAYER_PROVOKING_VERTEX_EXT 0x825E #define GL_LINES_ADJACENCY_EXT 0x000A #define GL_LINE_STRIP_ADJACENCY_EXT 0x000B #define GL_TRIANGLES_ADJACENCY_EXT 0x000C #define GL_TRIANGLE_STRIP_ADJACENCY_EXT 0x000D +#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT 0x8DDF +#define GL_MAX_GEOMETRY_UNIFORM_BLOCKS_EXT 0x8A2C +#define GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_EXT 0x8A32 +#define GL_MAX_GEOMETRY_INPUT_COMPONENTS_EXT 0x9123 +#define GL_MAX_GEOMETRY_OUTPUT_COMPONENTS_EXT 0x9124 +#define GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT 0x8DE0 +#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT 0x8DE1 +#define GL_MAX_GEOMETRY_SHADER_INVOCATIONS_EXT 0x8E5A +#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT 0x8C29 +#define GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_EXT 0x92CF +#define GL_MAX_GEOMETRY_ATOMIC_COUNTERS_EXT 0x92D5 +#define GL_MAX_GEOMETRY_IMAGE_UNIFORMS_EXT 0x90CD +#define GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_EXT 0x90D7 +#define GL_FIRST_VERTEX_CONVENTION_EXT 0x8E4D +#define GL_LAST_VERTEX_CONVENTION_EXT 0x8E4E +#define GL_UNDEFINED_VERTEX_EXT 0x8260 +#define GL_PRIMITIVES_GENERATED_EXT 0x8C87 +#define GL_FRAMEBUFFER_DEFAULT_LAYERS_EXT 0x9312 +#define GL_MAX_FRAMEBUFFER_LAYERS_EXT 0x9317 #define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT 0x8DA8 -#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_EXT 0x8DA9 #define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_EXT 0x8DA7 +#define GL_REFERENCED_BY_GEOMETRY_SHADER_EXT 0x9309 +typedef void (APIENTRYP pfn_glFramebufferTextureEXT) (GLenum, GLenum, GLuint, GLint); +extern pfn_glFramebufferTextureEXT fp_glFramebufferTextureEXT; + + /* GL_EXT_geometry_shader4 */ +extern GLboolean GLAD_EXT_geometry_shader4; +#define GL_GEOMETRY_VERTICES_OUT_EXT 0x8DDA +#define GL_GEOMETRY_INPUT_TYPE_EXT 0x8DDB +#define GL_GEOMETRY_OUTPUT_TYPE_EXT 0x8DDC +#define GL_MAX_GEOMETRY_VARYING_COMPONENTS_EXT 0x8DDD +#define GL_MAX_VERTEX_VARYING_COMPONENTS_EXT 0x8DDE +#define GL_MAX_VARYING_COMPONENTS_EXT 0x8B4B +#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_EXT 0x8DA9 #define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_EXT 0x8CD4 #define GL_PROGRAM_POINT_SIZE_EXT 0x8642 typedef void (APIENTRYP pfn_glProgramParameteriEXT) (GLuint, GLenum, GLint); @@ -6385,72 +5777,8 @@ extern pfn_glUniform3uivEXT fp_glUniform3uivEXT; typedef void (APIENTRYP pfn_glUniform4uivEXT) (GLint, GLsizei, const GLuint*); extern pfn_glUniform4uivEXT fp_glUniform4uivEXT; - /* GL_EXT_histogram */ -extern GLboolean GLAD_EXT_histogram; -#define GL_HISTOGRAM_EXT 0x8024 -#define GL_PROXY_HISTOGRAM_EXT 0x8025 -#define GL_HISTOGRAM_WIDTH_EXT 0x8026 -#define GL_HISTOGRAM_FORMAT_EXT 0x8027 -#define GL_HISTOGRAM_RED_SIZE_EXT 0x8028 -#define GL_HISTOGRAM_GREEN_SIZE_EXT 0x8029 -#define GL_HISTOGRAM_BLUE_SIZE_EXT 0x802A -#define GL_HISTOGRAM_ALPHA_SIZE_EXT 0x802B -#define GL_HISTOGRAM_LUMINANCE_SIZE_EXT 0x802C -#define GL_HISTOGRAM_SINK_EXT 0x802D -#define GL_MINMAX_EXT 0x802E -#define GL_MINMAX_FORMAT_EXT 0x802F -#define GL_MINMAX_SINK_EXT 0x8030 -#define GL_TABLE_TOO_LARGE_EXT 0x8031 -typedef void (APIENTRYP pfn_glGetHistogramEXT) (GLenum, GLboolean, GLenum, GLenum, void*); -extern pfn_glGetHistogramEXT fp_glGetHistogramEXT; -typedef void (APIENTRYP pfn_glGetHistogramParameterfvEXT) (GLenum, GLenum, GLfloat*); -extern pfn_glGetHistogramParameterfvEXT fp_glGetHistogramParameterfvEXT; -typedef void (APIENTRYP pfn_glGetHistogramParameterivEXT) (GLenum, GLenum, GLint*); -extern pfn_glGetHistogramParameterivEXT fp_glGetHistogramParameterivEXT; -typedef void (APIENTRYP pfn_glGetMinmaxEXT) (GLenum, GLboolean, GLenum, GLenum, void*); -extern pfn_glGetMinmaxEXT fp_glGetMinmaxEXT; -typedef void (APIENTRYP pfn_glGetMinmaxParameterfvEXT) (GLenum, GLenum, GLfloat*); -extern pfn_glGetMinmaxParameterfvEXT fp_glGetMinmaxParameterfvEXT; -typedef void (APIENTRYP pfn_glGetMinmaxParameterivEXT) (GLenum, GLenum, GLint*); -extern pfn_glGetMinmaxParameterivEXT fp_glGetMinmaxParameterivEXT; -typedef void (APIENTRYP pfn_glHistogramEXT) (GLenum, GLsizei, GLenum, GLboolean); -extern pfn_glHistogramEXT fp_glHistogramEXT; -typedef void (APIENTRYP pfn_glMinmaxEXT) (GLenum, GLenum, GLboolean); -extern pfn_glMinmaxEXT fp_glMinmaxEXT; -typedef void (APIENTRYP pfn_glResetHistogramEXT) (GLenum); -extern pfn_glResetHistogramEXT fp_glResetHistogramEXT; -typedef void (APIENTRYP pfn_glResetMinmaxEXT) (GLenum); -extern pfn_glResetMinmaxEXT fp_glResetMinmaxEXT; - - /* GL_EXT_index_array_formats */ -extern GLboolean GLAD_EXT_index_array_formats; -#define GL_IUI_V2F_EXT 0x81AD -#define GL_IUI_V3F_EXT 0x81AE -#define GL_IUI_N3F_V2F_EXT 0x81AF -#define GL_IUI_N3F_V3F_EXT 0x81B0 -#define GL_T2F_IUI_V2F_EXT 0x81B1 -#define GL_T2F_IUI_V3F_EXT 0x81B2 -#define GL_T2F_IUI_N3F_V2F_EXT 0x81B3 -#define GL_T2F_IUI_N3F_V3F_EXT 0x81B4 - - /* GL_EXT_index_func */ -extern GLboolean GLAD_EXT_index_func; -#define GL_INDEX_TEST_EXT 0x81B5 -#define GL_INDEX_TEST_FUNC_EXT 0x81B6 -#define GL_INDEX_TEST_REF_EXT 0x81B7 -typedef void (APIENTRYP pfn_glIndexFuncEXT) (GLenum, GLclampf); -extern pfn_glIndexFuncEXT fp_glIndexFuncEXT; - - /* GL_EXT_index_material */ -extern GLboolean GLAD_EXT_index_material; -#define GL_INDEX_MATERIAL_EXT 0x81B8 -#define GL_INDEX_MATERIAL_PARAMETER_EXT 0x81B9 -#define GL_INDEX_MATERIAL_FACE_EXT 0x81BA -typedef void (APIENTRYP pfn_glIndexMaterialEXT) (GLenum, GLenum); -extern pfn_glIndexMaterialEXT fp_glIndexMaterialEXT; - - /* GL_EXT_index_texture */ -extern GLboolean GLAD_EXT_index_texture; + /* GL_EXT_gpu_shader5 */ +extern GLboolean GLAD_EXT_gpu_shader5; /* GL_EXT_instanced_arrays */ extern GLboolean GLAD_EXT_instanced_arrays; @@ -6458,24 +5786,6 @@ extern GLboolean GLAD_EXT_instanced_arrays; typedef void (APIENTRYP pfn_glVertexAttribDivisorEXT) (GLuint, GLuint); extern pfn_glVertexAttribDivisorEXT fp_glVertexAttribDivisorEXT; - /* GL_EXT_light_texture */ -extern GLboolean GLAD_EXT_light_texture; -#define GL_FRAGMENT_MATERIAL_EXT 0x8349 -#define GL_FRAGMENT_NORMAL_EXT 0x834A -#define GL_FRAGMENT_COLOR_EXT 0x834C -#define GL_ATTENUATION_EXT 0x834D -#define GL_SHADOW_ATTENUATION_EXT 0x834E -#define GL_TEXTURE_APPLICATION_MODE_EXT 0x834F -#define GL_TEXTURE_LIGHT_EXT 0x8350 -#define GL_TEXTURE_MATERIAL_FACE_EXT 0x8351 -#define GL_TEXTURE_MATERIAL_PARAMETER_EXT 0x8352 -typedef void (APIENTRYP pfn_glApplyTextureEXT) (GLenum); -extern pfn_glApplyTextureEXT fp_glApplyTextureEXT; -typedef void (APIENTRYP pfn_glTextureLightEXT) (GLenum); -extern pfn_glTextureLightEXT fp_glTextureLightEXT; -typedef void (APIENTRYP pfn_glTextureMaterialEXT) (GLenum, GLenum); -extern pfn_glTextureMaterialEXT fp_glTextureMaterialEXT; - /* GL_EXT_map_buffer_range */ extern GLboolean GLAD_EXT_map_buffer_range; #define GL_MAP_READ_BIT_EXT 0x0001 @@ -6489,39 +5799,12 @@ extern pfn_glMapBufferRangeEXT fp_glMapBufferRangeEXT; typedef void (APIENTRYP pfn_glFlushMappedBufferRangeEXT) (GLenum, GLintptr, GLsizeiptr); extern pfn_glFlushMappedBufferRangeEXT fp_glFlushMappedBufferRangeEXT; - /* GL_EXT_misc_attribute */ -extern GLboolean GLAD_EXT_misc_attribute; - - /* GL_EXT_multi_draw_arrays */ -extern GLboolean GLAD_EXT_multi_draw_arrays; -typedef void (APIENTRYP pfn_glMultiDrawArraysEXT) (GLenum, const GLint*, const GLsizei*, GLsizei); -extern pfn_glMultiDrawArraysEXT fp_glMultiDrawArraysEXT; -typedef void (APIENTRYP pfn_glMultiDrawElementsEXT) (GLenum, const GLsizei*, GLenum, const void**, GLsizei); -extern pfn_glMultiDrawElementsEXT fp_glMultiDrawElementsEXT; - - /* GL_EXT_multisample */ -extern GLboolean GLAD_EXT_multisample; -#define GL_MULTISAMPLE_EXT 0x809D -#define GL_SAMPLE_ALPHA_TO_MASK_EXT 0x809E -#define GL_SAMPLE_ALPHA_TO_ONE_EXT 0x809F -#define GL_SAMPLE_MASK_EXT 0x80A0 -#define GL_1PASS_EXT 0x80A1 -#define GL_2PASS_0_EXT 0x80A2 -#define GL_2PASS_1_EXT 0x80A3 -#define GL_4PASS_0_EXT 0x80A4 -#define GL_4PASS_1_EXT 0x80A5 -#define GL_4PASS_2_EXT 0x80A6 -#define GL_4PASS_3_EXT 0x80A7 -#define GL_SAMPLE_BUFFERS_EXT 0x80A8 -#define GL_SAMPLES_EXT 0x80A9 -#define GL_SAMPLE_MASK_VALUE_EXT 0x80AA -#define GL_SAMPLE_MASK_INVERT_EXT 0x80AB -#define GL_SAMPLE_PATTERN_EXT 0x80AC -#define GL_MULTISAMPLE_BIT_EXT 0x20000000 -typedef void (APIENTRYP pfn_glSampleMaskEXT) (GLclampf, GLboolean); -extern pfn_glSampleMaskEXT fp_glSampleMaskEXT; -typedef void (APIENTRYP pfn_glSamplePatternEXT) (GLenum); -extern pfn_glSamplePatternEXT fp_glSamplePatternEXT; + /* GL_EXT_multi_draw_indirect */ +extern GLboolean GLAD_EXT_multi_draw_indirect; +typedef void (APIENTRYP pfn_glMultiDrawArraysIndirectEXT) (GLenum, const void*, GLsizei, GLsizei); +extern pfn_glMultiDrawArraysIndirectEXT fp_glMultiDrawArraysIndirectEXT; +typedef void (APIENTRYP pfn_glMultiDrawElementsIndirectEXT) (GLenum, GLenum, const void*, GLsizei, GLsizei); +extern pfn_glMultiDrawElementsIndirectEXT fp_glMultiDrawElementsIndirectEXT; /* GL_EXT_multisampled_render_to_texture */ extern GLboolean GLAD_EXT_multisampled_render_to_texture; @@ -6561,24 +5844,6 @@ extern GLboolean GLAD_EXT_packed_float; #define GL_UNSIGNED_INT_10F_11F_11F_REV_EXT 0x8C3B #define GL_RGBA_SIGNED_COMPONENTS_EXT 0x8C3C - /* GL_EXT_paletted_texture */ -extern GLboolean GLAD_EXT_paletted_texture; -#define GL_COLOR_INDEX1_EXT 0x80E2 -#define GL_COLOR_INDEX2_EXT 0x80E3 -#define GL_COLOR_INDEX4_EXT 0x80E4 -#define GL_COLOR_INDEX8_EXT 0x80E5 -#define GL_COLOR_INDEX12_EXT 0x80E6 -#define GL_COLOR_INDEX16_EXT 0x80E7 -#define GL_TEXTURE_INDEX_SIZE_EXT 0x80ED -typedef void (APIENTRYP pfn_glColorTableEXT) (GLenum, GLenum, GLsizei, GLenum, GLenum, const void*); -extern pfn_glColorTableEXT fp_glColorTableEXT; -typedef void (APIENTRYP pfn_glGetColorTableEXT) (GLenum, GLenum, GLenum, void*); -extern pfn_glGetColorTableEXT fp_glGetColorTableEXT; -typedef void (APIENTRYP pfn_glGetColorTableParameterivEXT) (GLenum, GLenum, GLint*); -extern pfn_glGetColorTableParameterivEXT fp_glGetColorTableParameterivEXT; -typedef void (APIENTRYP pfn_glGetColorTableParameterfvEXT) (GLenum, GLenum, GLfloat*); -extern pfn_glGetColorTableParameterfvEXT fp_glGetColorTableParameterfvEXT; - /* GL_EXT_pixel_buffer_object */ extern GLboolean GLAD_EXT_pixel_buffer_object; #define GL_PIXEL_PACK_BUFFER_EXT 0x88EB @@ -6586,49 +5851,24 @@ extern GLboolean GLAD_EXT_pixel_buffer_object; #define GL_PIXEL_PACK_BUFFER_BINDING_EXT 0x88ED #define GL_PIXEL_UNPACK_BUFFER_BINDING_EXT 0x88EF - /* GL_EXT_pixel_transform */ -extern GLboolean GLAD_EXT_pixel_transform; -#define GL_PIXEL_TRANSFORM_2D_EXT 0x8330 -#define GL_PIXEL_MAG_FILTER_EXT 0x8331 -#define GL_PIXEL_MIN_FILTER_EXT 0x8332 -#define GL_PIXEL_CUBIC_WEIGHT_EXT 0x8333 -#define GL_CUBIC_EXT 0x8334 -#define GL_AVERAGE_EXT 0x8335 -#define GL_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT 0x8336 -#define GL_MAX_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT 0x8337 -#define GL_PIXEL_TRANSFORM_2D_MATRIX_EXT 0x8338 -typedef void (APIENTRYP pfn_glPixelTransformParameteriEXT) (GLenum, GLenum, GLint); -extern pfn_glPixelTransformParameteriEXT fp_glPixelTransformParameteriEXT; -typedef void (APIENTRYP pfn_glPixelTransformParameterfEXT) (GLenum, GLenum, GLfloat); -extern pfn_glPixelTransformParameterfEXT fp_glPixelTransformParameterfEXT; -typedef void (APIENTRYP pfn_glPixelTransformParameterivEXT) (GLenum, GLenum, const GLint*); -extern pfn_glPixelTransformParameterivEXT fp_glPixelTransformParameterivEXT; -typedef void (APIENTRYP pfn_glPixelTransformParameterfvEXT) (GLenum, GLenum, const GLfloat*); -extern pfn_glPixelTransformParameterfvEXT fp_glPixelTransformParameterfvEXT; -typedef void (APIENTRYP pfn_glGetPixelTransformParameterivEXT) (GLenum, GLenum, GLint*); -extern pfn_glGetPixelTransformParameterivEXT fp_glGetPixelTransformParameterivEXT; -typedef void (APIENTRYP pfn_glGetPixelTransformParameterfvEXT) (GLenum, GLenum, GLfloat*); -extern pfn_glGetPixelTransformParameterfvEXT fp_glGetPixelTransformParameterfvEXT; + /* GL_EXT_polygon_offset_clamp */ +extern GLboolean GLAD_EXT_polygon_offset_clamp; +#define GL_POLYGON_OFFSET_CLAMP_EXT 0x8E1B +typedef void (APIENTRYP pfn_glPolygonOffsetClampEXT) (GLfloat, GLfloat, GLfloat); +extern pfn_glPolygonOffsetClampEXT fp_glPolygonOffsetClampEXT; - /* GL_EXT_pixel_transform_color_table */ -extern GLboolean GLAD_EXT_pixel_transform_color_table; + /* GL_EXT_post_depth_coverage */ +extern GLboolean GLAD_EXT_post_depth_coverage; - /* GL_EXT_point_parameters */ -extern GLboolean GLAD_EXT_point_parameters; -#define GL_POINT_SIZE_MIN_EXT 0x8126 -#define GL_POINT_SIZE_MAX_EXT 0x8127 -#define GL_POINT_FADE_THRESHOLD_SIZE_EXT 0x8128 -#define GL_DISTANCE_ATTENUATION_EXT 0x8129 -typedef void (APIENTRYP pfn_glPointParameterfEXT) (GLenum, GLfloat); -extern pfn_glPointParameterfEXT fp_glPointParameterfEXT; -typedef void (APIENTRYP pfn_glPointParameterfvEXT) (GLenum, const GLfloat*); -extern pfn_glPointParameterfvEXT fp_glPointParameterfvEXT; + /* GL_EXT_primitive_bounding_box */ +extern GLboolean GLAD_EXT_primitive_bounding_box; +#define GL_PRIMITIVE_BOUNDING_BOX_EXT 0x92BE +typedef void (APIENTRYP pfn_glPrimitiveBoundingBoxEXT) (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +extern pfn_glPrimitiveBoundingBoxEXT fp_glPrimitiveBoundingBoxEXT; /* GL_EXT_provoking_vertex */ extern GLboolean GLAD_EXT_provoking_vertex; #define GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION_EXT 0x8E4C -#define GL_FIRST_VERTEX_CONVENTION_EXT 0x8E4D -#define GL_LAST_VERTEX_CONVENTION_EXT 0x8E4E #define GL_PROVOKING_VERTEX_EXT 0x8E4F typedef void (APIENTRYP pfn_glProvokingVertexEXT) (GLenum); extern pfn_glProvokingVertexEXT fp_glProvokingVertexEXT; @@ -6639,13 +5879,31 @@ extern GLboolean GLAD_EXT_pvrtc_sRGB; #define GL_COMPRESSED_SRGB_PVRTC_4BPPV1_EXT 0x8A55 #define GL_COMPRESSED_SRGB_ALPHA_PVRTC_2BPPV1_EXT 0x8A56 #define GL_COMPRESSED_SRGB_ALPHA_PVRTC_4BPPV1_EXT 0x8A57 +#define GL_COMPRESSED_SRGB_ALPHA_PVRTC_2BPPV2_IMG 0x93F0 +#define GL_COMPRESSED_SRGB_ALPHA_PVRTC_4BPPV2_IMG 0x93F1 + + /* GL_EXT_raster_multisample */ +extern GLboolean GLAD_EXT_raster_multisample; +#define GL_RASTER_MULTISAMPLE_EXT 0x9327 +#define GL_RASTER_SAMPLES_EXT 0x9328 +#define GL_MAX_RASTER_SAMPLES_EXT 0x9329 +#define GL_RASTER_FIXED_SAMPLE_LOCATIONS_EXT 0x932A +#define GL_MULTISAMPLE_RASTERIZATION_ALLOWED_EXT 0x932B +#define GL_EFFECTIVE_RASTER_SAMPLES_EXT 0x932C +typedef void (APIENTRYP pfn_glRasterSamplesEXT) (GLuint, GLboolean); +extern pfn_glRasterSamplesEXT fp_glRasterSamplesEXT; /* GL_EXT_read_format_bgra */ extern GLboolean GLAD_EXT_read_format_bgra; -#define GL_BGRA_EXT 0x80E1 #define GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT 0x8365 #define GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT 0x8366 + /* GL_EXT_render_snorm */ +extern GLboolean GLAD_EXT_render_snorm; +#define GL_R16_SNORM_EXT 0x8F98 +#define GL_RG16_SNORM_EXT 0x8F99 +#define GL_RGBA16_SNORM_EXT 0x8F9B + /* GL_EXT_robustness */ extern GLboolean GLAD_EXT_robustness; #define GL_GUILTY_CONTEXT_RESET_EXT 0x8253 @@ -6664,50 +5922,6 @@ extern pfn_glGetnUniformfvEXT fp_glGetnUniformfvEXT; typedef void (APIENTRYP pfn_glGetnUniformivEXT) (GLuint, GLint, GLsizei, GLint*); extern pfn_glGetnUniformivEXT fp_glGetnUniformivEXT; - /* GL_EXT_secondary_color */ -extern GLboolean GLAD_EXT_secondary_color; -#define GL_COLOR_SUM_EXT 0x8458 -#define GL_CURRENT_SECONDARY_COLOR_EXT 0x8459 -#define GL_SECONDARY_COLOR_ARRAY_SIZE_EXT 0x845A -#define GL_SECONDARY_COLOR_ARRAY_TYPE_EXT 0x845B -#define GL_SECONDARY_COLOR_ARRAY_STRIDE_EXT 0x845C -#define GL_SECONDARY_COLOR_ARRAY_POINTER_EXT 0x845D -#define GL_SECONDARY_COLOR_ARRAY_EXT 0x845E -typedef void (APIENTRYP pfn_glSecondaryColor3bEXT) (GLbyte, GLbyte, GLbyte); -extern pfn_glSecondaryColor3bEXT fp_glSecondaryColor3bEXT; -typedef void (APIENTRYP pfn_glSecondaryColor3bvEXT) (const GLbyte*); -extern pfn_glSecondaryColor3bvEXT fp_glSecondaryColor3bvEXT; -typedef void (APIENTRYP pfn_glSecondaryColor3dEXT) (GLdouble, GLdouble, GLdouble); -extern pfn_glSecondaryColor3dEXT fp_glSecondaryColor3dEXT; -typedef void (APIENTRYP pfn_glSecondaryColor3dvEXT) (const GLdouble*); -extern pfn_glSecondaryColor3dvEXT fp_glSecondaryColor3dvEXT; -typedef void (APIENTRYP pfn_glSecondaryColor3fEXT) (GLfloat, GLfloat, GLfloat); -extern pfn_glSecondaryColor3fEXT fp_glSecondaryColor3fEXT; -typedef void (APIENTRYP pfn_glSecondaryColor3fvEXT) (const GLfloat*); -extern pfn_glSecondaryColor3fvEXT fp_glSecondaryColor3fvEXT; -typedef void (APIENTRYP pfn_glSecondaryColor3iEXT) (GLint, GLint, GLint); -extern pfn_glSecondaryColor3iEXT fp_glSecondaryColor3iEXT; -typedef void (APIENTRYP pfn_glSecondaryColor3ivEXT) (const GLint*); -extern pfn_glSecondaryColor3ivEXT fp_glSecondaryColor3ivEXT; -typedef void (APIENTRYP pfn_glSecondaryColor3sEXT) (GLshort, GLshort, GLshort); -extern pfn_glSecondaryColor3sEXT fp_glSecondaryColor3sEXT; -typedef void (APIENTRYP pfn_glSecondaryColor3svEXT) (const GLshort*); -extern pfn_glSecondaryColor3svEXT fp_glSecondaryColor3svEXT; -typedef void (APIENTRYP pfn_glSecondaryColor3ubEXT) (GLubyte, GLubyte, GLubyte); -extern pfn_glSecondaryColor3ubEXT fp_glSecondaryColor3ubEXT; -typedef void (APIENTRYP pfn_glSecondaryColor3ubvEXT) (const GLubyte*); -extern pfn_glSecondaryColor3ubvEXT fp_glSecondaryColor3ubvEXT; -typedef void (APIENTRYP pfn_glSecondaryColor3uiEXT) (GLuint, GLuint, GLuint); -extern pfn_glSecondaryColor3uiEXT fp_glSecondaryColor3uiEXT; -typedef void (APIENTRYP pfn_glSecondaryColor3uivEXT) (const GLuint*); -extern pfn_glSecondaryColor3uivEXT fp_glSecondaryColor3uivEXT; -typedef void (APIENTRYP pfn_glSecondaryColor3usEXT) (GLushort, GLushort, GLushort); -extern pfn_glSecondaryColor3usEXT fp_glSecondaryColor3usEXT; -typedef void (APIENTRYP pfn_glSecondaryColor3usvEXT) (const GLushort*); -extern pfn_glSecondaryColor3usvEXT fp_glSecondaryColor3usvEXT; -typedef void (APIENTRYP pfn_glSecondaryColorPointerEXT) (GLint, GLenum, GLsizei, const void*); -extern pfn_glSecondaryColorPointerEXT fp_glSecondaryColorPointerEXT; - /* GL_EXT_separate_shader_objects */ extern GLboolean GLAD_EXT_separate_shader_objects; #define GL_ACTIVE_PROGRAM_EXT 0x8B8D @@ -6747,6 +5961,9 @@ extern pfn_glValidateProgramPipelineEXT fp_glValidateProgramPipelineEXT; extern GLboolean GLAD_EXT_shader_framebuffer_fetch; #define GL_FRAGMENT_SHADER_DISCARDS_SAMPLES_EXT 0x8A52 + /* GL_EXT_shader_image_load_formatted */ +extern GLboolean GLAD_EXT_shader_image_load_formatted; + /* GL_EXT_shader_image_load_store */ extern GLboolean GLAD_EXT_shader_image_load_store; #define GL_MAX_IMAGE_UNITS_EXT 0x8F38 @@ -6809,15 +6026,24 @@ extern pfn_glBindImageTextureEXT fp_glBindImageTextureEXT; typedef void (APIENTRYP pfn_glMemoryBarrierEXT) (GLbitfield); extern pfn_glMemoryBarrierEXT fp_glMemoryBarrierEXT; + /* GL_EXT_shader_implicit_conversions */ +extern GLboolean GLAD_EXT_shader_implicit_conversions; + /* GL_EXT_shader_integer_mix */ extern GLboolean GLAD_EXT_shader_integer_mix; + /* GL_EXT_shader_io_blocks */ +extern GLboolean GLAD_EXT_shader_io_blocks; + + /* GL_EXT_shader_pixel_local_storage */ +extern GLboolean GLAD_EXT_shader_pixel_local_storage; +#define GL_MAX_SHADER_PIXEL_LOCAL_STORAGE_FAST_SIZE_EXT 0x8F63 +#define GL_MAX_SHADER_PIXEL_LOCAL_STORAGE_SIZE_EXT 0x8F67 +#define GL_SHADER_PIXEL_LOCAL_STORAGE_EXT 0x8F64 + /* GL_EXT_shader_texture_lod */ extern GLboolean GLAD_EXT_shader_texture_lod; - /* GL_EXT_shadow_funcs */ -extern GLboolean GLAD_EXT_shadow_funcs; - /* GL_EXT_shadow_samplers */ extern GLboolean GLAD_EXT_shadow_samplers; #define GL_TEXTURE_COMPARE_MODE_EXT 0x884C @@ -6825,9 +6051,8 @@ extern GLboolean GLAD_EXT_shadow_samplers; #define GL_COMPARE_REF_TO_TEXTURE_EXT 0x884E #define GL_SAMPLER_2D_SHADOW_EXT 0x8B62 - /* GL_EXT_shared_texture_palette */ -extern GLboolean GLAD_EXT_shared_texture_palette; -#define GL_SHARED_TEXTURE_PALETTE_EXT 0x81FB + /* GL_EXT_sparse_texture2 */ +extern GLboolean GLAD_EXT_sparse_texture2; /* GL_EXT_sRGB */ extern GLboolean GLAD_EXT_sRGB; @@ -6846,17 +6071,55 @@ extern GLboolean GLAD_EXT_stencil_clear_tag; typedef void (APIENTRYP pfn_glStencilClearTagEXT) (GLsizei, GLuint); extern pfn_glStencilClearTagEXT fp_glStencilClearTagEXT; - /* GL_EXT_stencil_two_side */ -extern GLboolean GLAD_EXT_stencil_two_side; -#define GL_STENCIL_TEST_TWO_SIDE_EXT 0x8910 -#define GL_ACTIVE_STENCIL_FACE_EXT 0x8911 -typedef void (APIENTRYP pfn_glActiveStencilFaceEXT) (GLenum); -extern pfn_glActiveStencilFaceEXT fp_glActiveStencilFaceEXT; + /* GL_EXT_tessellation_point_size */ +extern GLboolean GLAD_EXT_tessellation_point_size; - /* GL_EXT_stencil_wrap */ -extern GLboolean GLAD_EXT_stencil_wrap; -#define GL_INCR_WRAP_EXT 0x8507 -#define GL_DECR_WRAP_EXT 0x8508 + /* GL_EXT_tessellation_shader */ +extern GLboolean GLAD_EXT_tessellation_shader; +#define GL_PATCHES_EXT 0x000E +#define GL_PATCH_VERTICES_EXT 0x8E72 +#define GL_TESS_CONTROL_OUTPUT_VERTICES_EXT 0x8E75 +#define GL_TESS_GEN_MODE_EXT 0x8E76 +#define GL_TESS_GEN_SPACING_EXT 0x8E77 +#define GL_TESS_GEN_VERTEX_ORDER_EXT 0x8E78 +#define GL_TESS_GEN_POINT_MODE_EXT 0x8E79 +#define GL_ISOLINES_EXT 0x8E7A +#define GL_QUADS_EXT 0x0007 +#define GL_FRACTIONAL_ODD_EXT 0x8E7B +#define GL_FRACTIONAL_EVEN_EXT 0x8E7C +#define GL_MAX_PATCH_VERTICES_EXT 0x8E7D +#define GL_MAX_TESS_GEN_LEVEL_EXT 0x8E7E +#define GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS_EXT 0x8E7F +#define GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS_EXT 0x8E80 +#define GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS_EXT 0x8E81 +#define GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS_EXT 0x8E82 +#define GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS_EXT 0x8E83 +#define GL_MAX_TESS_PATCH_COMPONENTS_EXT 0x8E84 +#define GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS_EXT 0x8E85 +#define GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS_EXT 0x8E86 +#define GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS_EXT 0x8E89 +#define GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS_EXT 0x8E8A +#define GL_MAX_TESS_CONTROL_INPUT_COMPONENTS_EXT 0x886C +#define GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS_EXT 0x886D +#define GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS_EXT 0x8E1E +#define GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS_EXT 0x8E1F +#define GL_MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS_EXT 0x92CD +#define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS_EXT 0x92CE +#define GL_MAX_TESS_CONTROL_ATOMIC_COUNTERS_EXT 0x92D3 +#define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS_EXT 0x92D4 +#define GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS_EXT 0x90CB +#define GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS_EXT 0x90CC +#define GL_MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS_EXT 0x90D8 +#define GL_MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS_EXT 0x90D9 +#define GL_IS_PER_PATCH_EXT 0x92E7 +#define GL_REFERENCED_BY_TESS_CONTROL_SHADER_EXT 0x9307 +#define GL_REFERENCED_BY_TESS_EVALUATION_SHADER_EXT 0x9308 +#define GL_TESS_CONTROL_SHADER_EXT 0x8E88 +#define GL_TESS_EVALUATION_SHADER_EXT 0x8E87 +#define GL_TESS_CONTROL_SHADER_BIT_EXT 0x00000008 +#define GL_TESS_EVALUATION_SHADER_BIT_EXT 0x00000010 +typedef void (APIENTRYP pfn_glPatchParameteriEXT) (GLenum, GLint); +extern pfn_glPatchParameteriEXT fp_glPatchParameteriEXT; /* GL_EXT_texture_array */ extern GLboolean GLAD_EXT_texture_array; @@ -6868,16 +6131,48 @@ extern GLboolean GLAD_EXT_texture_array; #define GL_TEXTURE_BINDING_2D_ARRAY_EXT 0x8C1D #define GL_MAX_ARRAY_TEXTURE_LAYERS_EXT 0x88FF #define GL_COMPARE_REF_DEPTH_TO_TEXTURE_EXT 0x884E +typedef void (APIENTRYP pfn_glFramebufferTextureLayerEXT) (GLenum, GLenum, GLuint, GLint, GLint); +extern pfn_glFramebufferTextureLayerEXT fp_glFramebufferTextureLayerEXT; - /* GL_EXT_texture_buffer_object */ -extern GLboolean GLAD_EXT_texture_buffer_object; + /* GL_EXT_texture_border_clamp */ +extern GLboolean GLAD_EXT_texture_border_clamp; +#define GL_TEXTURE_BORDER_COLOR_EXT 0x1004 +#define GL_CLAMP_TO_BORDER_EXT 0x812D +typedef void (APIENTRYP pfn_glTexParameterIivEXT) (GLenum, GLenum, const GLint*); +extern pfn_glTexParameterIivEXT fp_glTexParameterIivEXT; +typedef void (APIENTRYP pfn_glTexParameterIuivEXT) (GLenum, GLenum, const GLuint*); +extern pfn_glTexParameterIuivEXT fp_glTexParameterIuivEXT; +typedef void (APIENTRYP pfn_glGetTexParameterIivEXT) (GLenum, GLenum, GLint*); +extern pfn_glGetTexParameterIivEXT fp_glGetTexParameterIivEXT; +typedef void (APIENTRYP pfn_glGetTexParameterIuivEXT) (GLenum, GLenum, GLuint*); +extern pfn_glGetTexParameterIuivEXT fp_glGetTexParameterIuivEXT; +typedef void (APIENTRYP pfn_glSamplerParameterIivEXT) (GLuint, GLenum, const GLint*); +extern pfn_glSamplerParameterIivEXT fp_glSamplerParameterIivEXT; +typedef void (APIENTRYP pfn_glSamplerParameterIuivEXT) (GLuint, GLenum, const GLuint*); +extern pfn_glSamplerParameterIuivEXT fp_glSamplerParameterIuivEXT; +typedef void (APIENTRYP pfn_glGetSamplerParameterIivEXT) (GLuint, GLenum, GLint*); +extern pfn_glGetSamplerParameterIivEXT fp_glGetSamplerParameterIivEXT; +typedef void (APIENTRYP pfn_glGetSamplerParameterIuivEXT) (GLuint, GLenum, GLuint*); +extern pfn_glGetSamplerParameterIuivEXT fp_glGetSamplerParameterIuivEXT; + + /* GL_EXT_texture_buffer */ +extern GLboolean GLAD_EXT_texture_buffer; #define GL_TEXTURE_BUFFER_EXT 0x8C2A +#define GL_TEXTURE_BUFFER_BINDING_EXT 0x8C2A #define GL_MAX_TEXTURE_BUFFER_SIZE_EXT 0x8C2B #define GL_TEXTURE_BINDING_BUFFER_EXT 0x8C2C #define GL_TEXTURE_BUFFER_DATA_STORE_BINDING_EXT 0x8C2D -#define GL_TEXTURE_BUFFER_FORMAT_EXT 0x8C2E +#define GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT_EXT 0x919F +#define GL_TEXTURE_BUFFER_OFFSET_EXT 0x919D +#define GL_TEXTURE_BUFFER_SIZE_EXT 0x919E typedef void (APIENTRYP pfn_glTexBufferEXT) (GLenum, GLenum, GLuint); extern pfn_glTexBufferEXT fp_glTexBufferEXT; +typedef void (APIENTRYP pfn_glTexBufferRangeEXT) (GLenum, GLenum, GLuint, GLintptr, GLsizeiptr); +extern pfn_glTexBufferRangeEXT fp_glTexBufferRangeEXT; + + /* GL_EXT_texture_buffer_object */ +extern GLboolean GLAD_EXT_texture_buffer_object; +#define GL_TEXTURE_BUFFER_FORMAT_EXT 0x8C2E /* GL_EXT_texture_compression_dxt1 */ extern GLboolean GLAD_EXT_texture_compression_dxt1; @@ -6918,43 +6213,23 @@ extern GLboolean GLAD_EXT_texture_cube_map; #define GL_PROXY_TEXTURE_CUBE_MAP_EXT 0x851B #define GL_MAX_CUBE_MAP_TEXTURE_SIZE_EXT 0x851C - /* GL_EXT_texture_env_add */ -extern GLboolean GLAD_EXT_texture_env_add; - - /* GL_EXT_texture_env_combine */ -extern GLboolean GLAD_EXT_texture_env_combine; -#define GL_COMBINE_EXT 0x8570 -#define GL_COMBINE_RGB_EXT 0x8571 -#define GL_COMBINE_ALPHA_EXT 0x8572 -#define GL_RGB_SCALE_EXT 0x8573 -#define GL_ADD_SIGNED_EXT 0x8574 -#define GL_INTERPOLATE_EXT 0x8575 -#define GL_CONSTANT_EXT 0x8576 -#define GL_PRIMARY_COLOR_EXT 0x8577 -#define GL_PREVIOUS_EXT 0x8578 -#define GL_SOURCE0_RGB_EXT 0x8580 -#define GL_SOURCE1_RGB_EXT 0x8581 -#define GL_SOURCE2_RGB_EXT 0x8582 -#define GL_SOURCE0_ALPHA_EXT 0x8588 -#define GL_SOURCE1_ALPHA_EXT 0x8589 -#define GL_SOURCE2_ALPHA_EXT 0x858A -#define GL_OPERAND0_RGB_EXT 0x8590 -#define GL_OPERAND1_RGB_EXT 0x8591 -#define GL_OPERAND2_RGB_EXT 0x8592 -#define GL_OPERAND0_ALPHA_EXT 0x8598 -#define GL_OPERAND1_ALPHA_EXT 0x8599 -#define GL_OPERAND2_ALPHA_EXT 0x859A - - /* GL_EXT_texture_env_dot3 */ -extern GLboolean GLAD_EXT_texture_env_dot3; -#define GL_DOT3_RGB_EXT 0x8740 -#define GL_DOT3_RGBA_EXT 0x8741 + /* GL_EXT_texture_cube_map_array */ +extern GLboolean GLAD_EXT_texture_cube_map_array; +#define GL_TEXTURE_CUBE_MAP_ARRAY_EXT 0x9009 +#define GL_TEXTURE_BINDING_CUBE_MAP_ARRAY_EXT 0x900A +#define GL_SAMPLER_CUBE_MAP_ARRAY_EXT 0x900C +#define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW_EXT 0x900D +#define GL_INT_SAMPLER_CUBE_MAP_ARRAY_EXT 0x900E +#define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY_EXT 0x900F /* GL_EXT_texture_filter_anisotropic */ extern GLboolean GLAD_EXT_texture_filter_anisotropic; #define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE #define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF + /* GL_EXT_texture_filter_minmax */ +extern GLboolean GLAD_EXT_texture_filter_minmax; + /* GL_EXT_texture_format_BGRA8888 */ extern GLboolean GLAD_EXT_texture_format_BGRA8888; @@ -7007,37 +6282,18 @@ extern GLboolean GLAD_EXT_texture_integer; #define GL_LUMINANCE_INTEGER_EXT 0x8D9C #define GL_LUMINANCE_ALPHA_INTEGER_EXT 0x8D9D #define GL_RGBA_INTEGER_MODE_EXT 0x8D9E -typedef void (APIENTRYP pfn_glTexParameterIivEXT) (GLenum, GLenum, const GLint*); -extern pfn_glTexParameterIivEXT fp_glTexParameterIivEXT; -typedef void (APIENTRYP pfn_glTexParameterIuivEXT) (GLenum, GLenum, const GLuint*); -extern pfn_glTexParameterIuivEXT fp_glTexParameterIuivEXT; -typedef void (APIENTRYP pfn_glGetTexParameterIivEXT) (GLenum, GLenum, GLint*); -extern pfn_glGetTexParameterIivEXT fp_glGetTexParameterIivEXT; -typedef void (APIENTRYP pfn_glGetTexParameterIuivEXT) (GLenum, GLenum, GLuint*); -extern pfn_glGetTexParameterIuivEXT fp_glGetTexParameterIuivEXT; typedef void (APIENTRYP pfn_glClearColorIiEXT) (GLint, GLint, GLint, GLint); extern pfn_glClearColorIiEXT fp_glClearColorIiEXT; typedef void (APIENTRYP pfn_glClearColorIuiEXT) (GLuint, GLuint, GLuint, GLuint); extern pfn_glClearColorIuiEXT fp_glClearColorIuiEXT; - /* GL_EXT_texture_lod_bias */ -extern GLboolean GLAD_EXT_texture_lod_bias; -#define GL_MAX_TEXTURE_LOD_BIAS_EXT 0x84FD -#define GL_TEXTURE_FILTER_CONTROL_EXT 0x8500 -#define GL_TEXTURE_LOD_BIAS_EXT 0x8501 - - /* GL_EXT_texture_mirror_clamp */ -extern GLboolean GLAD_EXT_texture_mirror_clamp; -#define GL_MIRROR_CLAMP_EXT 0x8742 -#define GL_MIRROR_CLAMP_TO_EDGE_EXT 0x8743 -#define GL_MIRROR_CLAMP_TO_BORDER_EXT 0x8912 - - /* GL_EXT_texture_perturb_normal */ -extern GLboolean GLAD_EXT_texture_perturb_normal; -#define GL_PERTURB_EXT 0x85AE -#define GL_TEXTURE_NORMAL_EXT 0x85AF -typedef void (APIENTRYP pfn_glTextureNormalEXT) (GLenum); -extern pfn_glTextureNormalEXT fp_glTextureNormalEXT; + /* GL_EXT_texture_norm16 */ +extern GLboolean GLAD_EXT_texture_norm16; +#define GL_R16_EXT 0x822A +#define GL_RG16_EXT 0x822C +#define GL_RGBA16_EXT 0x805B +#define GL_RGB16_EXT 0x8054 +#define GL_RGB16_SNORM_EXT 0x8F9A /* GL_EXT_texture_rg */ extern GLboolean GLAD_EXT_texture_rg; @@ -7093,6 +6349,14 @@ extern GLboolean GLAD_EXT_texture_sRGB_decode; #define GL_DECODE_EXT 0x8A49 #define GL_SKIP_DECODE_EXT 0x8A4A + /* GL_EXT_texture_sRGB_R8 */ +extern GLboolean GLAD_EXT_texture_sRGB_R8; +#define GL_SR8_EXT 0x8FBD + + /* GL_EXT_texture_sRGB_RG8 */ +extern GLboolean GLAD_EXT_texture_sRGB_RG8; +#define GL_SRG8_EXT 0x8FBE + /* GL_EXT_texture_storage */ extern GLboolean GLAD_EXT_texture_storage; #define GL_TEXTURE_IMMUTABLE_FORMAT_EXT 0x912F @@ -7131,6 +6395,15 @@ extern GLboolean GLAD_EXT_texture_swizzle; extern GLboolean GLAD_EXT_texture_type_2_10_10_10_REV; #define GL_UNSIGNED_INT_2_10_10_10_REV_EXT 0x8368 + /* GL_EXT_texture_view */ +extern GLboolean GLAD_EXT_texture_view; +#define GL_TEXTURE_VIEW_MIN_LEVEL_EXT 0x82DB +#define GL_TEXTURE_VIEW_NUM_LEVELS_EXT 0x82DC +#define GL_TEXTURE_VIEW_MIN_LAYER_EXT 0x82DD +#define GL_TEXTURE_VIEW_NUM_LAYERS_EXT 0x82DE +typedef void (APIENTRYP pfn_glTextureViewEXT) (GLuint, GLenum, GLuint, GLenum, GLuint, GLuint, GLuint, GLuint); +extern pfn_glTextureViewEXT fp_glTextureViewEXT; + /* GL_EXT_timer_query */ extern GLboolean GLAD_EXT_timer_query; @@ -7142,7 +6415,6 @@ extern GLboolean GLAD_EXT_transform_feedback; #define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING_EXT 0x8C8F #define GL_INTERLEAVED_ATTRIBS_EXT 0x8C8C #define GL_SEPARATE_ATTRIBS_EXT 0x8C8D -#define GL_PRIMITIVES_GENERATED_EXT 0x8C87 #define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_EXT 0x8C88 #define GL_RASTERIZER_DISCARD_EXT 0x8C89 #define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS_EXT 0x8C8A @@ -7210,294 +6482,30 @@ extern pfn_glVertexAttribLPointerEXT fp_glVertexAttribLPointerEXT; typedef void (APIENTRYP pfn_glGetVertexAttribLdvEXT) (GLuint, GLenum, GLdouble*); extern pfn_glGetVertexAttribLdvEXT fp_glGetVertexAttribLdvEXT; - /* GL_EXT_vertex_shader */ -extern GLboolean GLAD_EXT_vertex_shader; -#define GL_VERTEX_SHADER_EXT 0x8780 -#define GL_VERTEX_SHADER_BINDING_EXT 0x8781 -#define GL_OP_INDEX_EXT 0x8782 -#define GL_OP_NEGATE_EXT 0x8783 -#define GL_OP_DOT3_EXT 0x8784 -#define GL_OP_DOT4_EXT 0x8785 -#define GL_OP_MUL_EXT 0x8786 -#define GL_OP_ADD_EXT 0x8787 -#define GL_OP_MADD_EXT 0x8788 -#define GL_OP_FRAC_EXT 0x8789 -#define GL_OP_MAX_EXT 0x878A -#define GL_OP_MIN_EXT 0x878B -#define GL_OP_SET_GE_EXT 0x878C -#define GL_OP_SET_LT_EXT 0x878D -#define GL_OP_CLAMP_EXT 0x878E -#define GL_OP_FLOOR_EXT 0x878F -#define GL_OP_ROUND_EXT 0x8790 -#define GL_OP_EXP_BASE_2_EXT 0x8791 -#define GL_OP_LOG_BASE_2_EXT 0x8792 -#define GL_OP_POWER_EXT 0x8793 -#define GL_OP_RECIP_EXT 0x8794 -#define GL_OP_RECIP_SQRT_EXT 0x8795 -#define GL_OP_SUB_EXT 0x8796 -#define GL_OP_CROSS_PRODUCT_EXT 0x8797 -#define GL_OP_MULTIPLY_MATRIX_EXT 0x8798 -#define GL_OP_MOV_EXT 0x8799 -#define GL_OUTPUT_VERTEX_EXT 0x879A -#define GL_OUTPUT_COLOR0_EXT 0x879B -#define GL_OUTPUT_COLOR1_EXT 0x879C -#define GL_OUTPUT_TEXTURE_COORD0_EXT 0x879D -#define GL_OUTPUT_TEXTURE_COORD1_EXT 0x879E -#define GL_OUTPUT_TEXTURE_COORD2_EXT 0x879F -#define GL_OUTPUT_TEXTURE_COORD3_EXT 0x87A0 -#define GL_OUTPUT_TEXTURE_COORD4_EXT 0x87A1 -#define GL_OUTPUT_TEXTURE_COORD5_EXT 0x87A2 -#define GL_OUTPUT_TEXTURE_COORD6_EXT 0x87A3 -#define GL_OUTPUT_TEXTURE_COORD7_EXT 0x87A4 -#define GL_OUTPUT_TEXTURE_COORD8_EXT 0x87A5 -#define GL_OUTPUT_TEXTURE_COORD9_EXT 0x87A6 -#define GL_OUTPUT_TEXTURE_COORD10_EXT 0x87A7 -#define GL_OUTPUT_TEXTURE_COORD11_EXT 0x87A8 -#define GL_OUTPUT_TEXTURE_COORD12_EXT 0x87A9 -#define GL_OUTPUT_TEXTURE_COORD13_EXT 0x87AA -#define GL_OUTPUT_TEXTURE_COORD14_EXT 0x87AB -#define GL_OUTPUT_TEXTURE_COORD15_EXT 0x87AC -#define GL_OUTPUT_TEXTURE_COORD16_EXT 0x87AD -#define GL_OUTPUT_TEXTURE_COORD17_EXT 0x87AE -#define GL_OUTPUT_TEXTURE_COORD18_EXT 0x87AF -#define GL_OUTPUT_TEXTURE_COORD19_EXT 0x87B0 -#define GL_OUTPUT_TEXTURE_COORD20_EXT 0x87B1 -#define GL_OUTPUT_TEXTURE_COORD21_EXT 0x87B2 -#define GL_OUTPUT_TEXTURE_COORD22_EXT 0x87B3 -#define GL_OUTPUT_TEXTURE_COORD23_EXT 0x87B4 -#define GL_OUTPUT_TEXTURE_COORD24_EXT 0x87B5 -#define GL_OUTPUT_TEXTURE_COORD25_EXT 0x87B6 -#define GL_OUTPUT_TEXTURE_COORD26_EXT 0x87B7 -#define GL_OUTPUT_TEXTURE_COORD27_EXT 0x87B8 -#define GL_OUTPUT_TEXTURE_COORD28_EXT 0x87B9 -#define GL_OUTPUT_TEXTURE_COORD29_EXT 0x87BA -#define GL_OUTPUT_TEXTURE_COORD30_EXT 0x87BB -#define GL_OUTPUT_TEXTURE_COORD31_EXT 0x87BC -#define GL_OUTPUT_FOG_EXT 0x87BD -#define GL_SCALAR_EXT 0x87BE -#define GL_VECTOR_EXT 0x87BF -#define GL_MATRIX_EXT 0x87C0 -#define GL_VARIANT_EXT 0x87C1 -#define GL_INVARIANT_EXT 0x87C2 -#define GL_LOCAL_CONSTANT_EXT 0x87C3 -#define GL_LOCAL_EXT 0x87C4 -#define GL_MAX_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87C5 -#define GL_MAX_VERTEX_SHADER_VARIANTS_EXT 0x87C6 -#define GL_MAX_VERTEX_SHADER_INVARIANTS_EXT 0x87C7 -#define GL_MAX_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87C8 -#define GL_MAX_VERTEX_SHADER_LOCALS_EXT 0x87C9 -#define GL_MAX_OPTIMIZED_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87CA -#define GL_MAX_OPTIMIZED_VERTEX_SHADER_VARIANTS_EXT 0x87CB -#define GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87CC -#define GL_MAX_OPTIMIZED_VERTEX_SHADER_INVARIANTS_EXT 0x87CD -#define GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCALS_EXT 0x87CE -#define GL_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87CF -#define GL_VERTEX_SHADER_VARIANTS_EXT 0x87D0 -#define GL_VERTEX_SHADER_INVARIANTS_EXT 0x87D1 -#define GL_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87D2 -#define GL_VERTEX_SHADER_LOCALS_EXT 0x87D3 -#define GL_VERTEX_SHADER_OPTIMIZED_EXT 0x87D4 -#define GL_X_EXT 0x87D5 -#define GL_Y_EXT 0x87D6 -#define GL_Z_EXT 0x87D7 -#define GL_W_EXT 0x87D8 -#define GL_NEGATIVE_X_EXT 0x87D9 -#define GL_NEGATIVE_Y_EXT 0x87DA -#define GL_NEGATIVE_Z_EXT 0x87DB -#define GL_NEGATIVE_W_EXT 0x87DC -#define GL_ZERO_EXT 0x87DD -#define GL_ONE_EXT 0x87DE -#define GL_NEGATIVE_ONE_EXT 0x87DF -#define GL_NORMALIZED_RANGE_EXT 0x87E0 -#define GL_FULL_RANGE_EXT 0x87E1 -#define GL_CURRENT_VERTEX_EXT 0x87E2 -#define GL_MVP_MATRIX_EXT 0x87E3 -#define GL_VARIANT_VALUE_EXT 0x87E4 -#define GL_VARIANT_DATATYPE_EXT 0x87E5 -#define GL_VARIANT_ARRAY_STRIDE_EXT 0x87E6 -#define GL_VARIANT_ARRAY_TYPE_EXT 0x87E7 -#define GL_VARIANT_ARRAY_EXT 0x87E8 -#define GL_VARIANT_ARRAY_POINTER_EXT 0x87E9 -#define GL_INVARIANT_VALUE_EXT 0x87EA -#define GL_INVARIANT_DATATYPE_EXT 0x87EB -#define GL_LOCAL_CONSTANT_VALUE_EXT 0x87EC -#define GL_LOCAL_CONSTANT_DATATYPE_EXT 0x87ED -typedef void (APIENTRYP pfn_glBeginVertexShaderEXT) (); -extern pfn_glBeginVertexShaderEXT fp_glBeginVertexShaderEXT; -typedef void (APIENTRYP pfn_glEndVertexShaderEXT) (); -extern pfn_glEndVertexShaderEXT fp_glEndVertexShaderEXT; -typedef void (APIENTRYP pfn_glBindVertexShaderEXT) (GLuint); -extern pfn_glBindVertexShaderEXT fp_glBindVertexShaderEXT; -typedef GLuint (APIENTRYP pfn_glGenVertexShadersEXT) (GLuint); -extern pfn_glGenVertexShadersEXT fp_glGenVertexShadersEXT; -typedef void (APIENTRYP pfn_glDeleteVertexShaderEXT) (GLuint); -extern pfn_glDeleteVertexShaderEXT fp_glDeleteVertexShaderEXT; -typedef void (APIENTRYP pfn_glShaderOp1EXT) (GLenum, GLuint, GLuint); -extern pfn_glShaderOp1EXT fp_glShaderOp1EXT; -typedef void (APIENTRYP pfn_glShaderOp2EXT) (GLenum, GLuint, GLuint, GLuint); -extern pfn_glShaderOp2EXT fp_glShaderOp2EXT; -typedef void (APIENTRYP pfn_glShaderOp3EXT) (GLenum, GLuint, GLuint, GLuint, GLuint); -extern pfn_glShaderOp3EXT fp_glShaderOp3EXT; -typedef void (APIENTRYP pfn_glSwizzleEXT) (GLuint, GLuint, GLenum, GLenum, GLenum, GLenum); -extern pfn_glSwizzleEXT fp_glSwizzleEXT; -typedef void (APIENTRYP pfn_glWriteMaskEXT) (GLuint, GLuint, GLenum, GLenum, GLenum, GLenum); -extern pfn_glWriteMaskEXT fp_glWriteMaskEXT; -typedef void (APIENTRYP pfn_glInsertComponentEXT) (GLuint, GLuint, GLuint); -extern pfn_glInsertComponentEXT fp_glInsertComponentEXT; -typedef void (APIENTRYP pfn_glExtractComponentEXT) (GLuint, GLuint, GLuint); -extern pfn_glExtractComponentEXT fp_glExtractComponentEXT; -typedef GLuint (APIENTRYP pfn_glGenSymbolsEXT) (GLenum, GLenum, GLenum, GLuint); -extern pfn_glGenSymbolsEXT fp_glGenSymbolsEXT; -typedef void (APIENTRYP pfn_glSetInvariantEXT) (GLuint, GLenum, const void*); -extern pfn_glSetInvariantEXT fp_glSetInvariantEXT; -typedef void (APIENTRYP pfn_glSetLocalConstantEXT) (GLuint, GLenum, const void*); -extern pfn_glSetLocalConstantEXT fp_glSetLocalConstantEXT; -typedef void (APIENTRYP pfn_glVariantbvEXT) (GLuint, const GLbyte*); -extern pfn_glVariantbvEXT fp_glVariantbvEXT; -typedef void (APIENTRYP pfn_glVariantsvEXT) (GLuint, const GLshort*); -extern pfn_glVariantsvEXT fp_glVariantsvEXT; -typedef void (APIENTRYP pfn_glVariantivEXT) (GLuint, const GLint*); -extern pfn_glVariantivEXT fp_glVariantivEXT; -typedef void (APIENTRYP pfn_glVariantfvEXT) (GLuint, const GLfloat*); -extern pfn_glVariantfvEXT fp_glVariantfvEXT; -typedef void (APIENTRYP pfn_glVariantdvEXT) (GLuint, const GLdouble*); -extern pfn_glVariantdvEXT fp_glVariantdvEXT; -typedef void (APIENTRYP pfn_glVariantubvEXT) (GLuint, const GLubyte*); -extern pfn_glVariantubvEXT fp_glVariantubvEXT; -typedef void (APIENTRYP pfn_glVariantusvEXT) (GLuint, const GLushort*); -extern pfn_glVariantusvEXT fp_glVariantusvEXT; -typedef void (APIENTRYP pfn_glVariantuivEXT) (GLuint, const GLuint*); -extern pfn_glVariantuivEXT fp_glVariantuivEXT; -typedef void (APIENTRYP pfn_glVariantPointerEXT) (GLuint, GLenum, GLuint, const void*); -extern pfn_glVariantPointerEXT fp_glVariantPointerEXT; -typedef void (APIENTRYP pfn_glEnableVariantClientStateEXT) (GLuint); -extern pfn_glEnableVariantClientStateEXT fp_glEnableVariantClientStateEXT; -typedef void (APIENTRYP pfn_glDisableVariantClientStateEXT) (GLuint); -extern pfn_glDisableVariantClientStateEXT fp_glDisableVariantClientStateEXT; -typedef GLuint (APIENTRYP pfn_glBindLightParameterEXT) (GLenum, GLenum); -extern pfn_glBindLightParameterEXT fp_glBindLightParameterEXT; -typedef GLuint (APIENTRYP pfn_glBindMaterialParameterEXT) (GLenum, GLenum); -extern pfn_glBindMaterialParameterEXT fp_glBindMaterialParameterEXT; -typedef GLuint (APIENTRYP pfn_glBindTexGenParameterEXT) (GLenum, GLenum, GLenum); -extern pfn_glBindTexGenParameterEXT fp_glBindTexGenParameterEXT; -typedef GLuint (APIENTRYP pfn_glBindTextureUnitParameterEXT) (GLenum, GLenum); -extern pfn_glBindTextureUnitParameterEXT fp_glBindTextureUnitParameterEXT; -typedef GLuint (APIENTRYP pfn_glBindParameterEXT) (GLenum); -extern pfn_glBindParameterEXT fp_glBindParameterEXT; -typedef GLboolean (APIENTRYP pfn_glIsVariantEnabledEXT) (GLuint, GLenum); -extern pfn_glIsVariantEnabledEXT fp_glIsVariantEnabledEXT; -typedef void (APIENTRYP pfn_glGetVariantBooleanvEXT) (GLuint, GLenum, GLboolean*); -extern pfn_glGetVariantBooleanvEXT fp_glGetVariantBooleanvEXT; -typedef void (APIENTRYP pfn_glGetVariantIntegervEXT) (GLuint, GLenum, GLint*); -extern pfn_glGetVariantIntegervEXT fp_glGetVariantIntegervEXT; -typedef void (APIENTRYP pfn_glGetVariantFloatvEXT) (GLuint, GLenum, GLfloat*); -extern pfn_glGetVariantFloatvEXT fp_glGetVariantFloatvEXT; -typedef void (APIENTRYP pfn_glGetVariantPointervEXT) (GLuint, GLenum, void**); -extern pfn_glGetVariantPointervEXT fp_glGetVariantPointervEXT; -typedef void (APIENTRYP pfn_glGetInvariantBooleanvEXT) (GLuint, GLenum, GLboolean*); -extern pfn_glGetInvariantBooleanvEXT fp_glGetInvariantBooleanvEXT; -typedef void (APIENTRYP pfn_glGetInvariantIntegervEXT) (GLuint, GLenum, GLint*); -extern pfn_glGetInvariantIntegervEXT fp_glGetInvariantIntegervEXT; -typedef void (APIENTRYP pfn_glGetInvariantFloatvEXT) (GLuint, GLenum, GLfloat*); -extern pfn_glGetInvariantFloatvEXT fp_glGetInvariantFloatvEXT; -typedef void (APIENTRYP pfn_glGetLocalConstantBooleanvEXT) (GLuint, GLenum, GLboolean*); -extern pfn_glGetLocalConstantBooleanvEXT fp_glGetLocalConstantBooleanvEXT; -typedef void (APIENTRYP pfn_glGetLocalConstantIntegervEXT) (GLuint, GLenum, GLint*); -extern pfn_glGetLocalConstantIntegervEXT fp_glGetLocalConstantIntegervEXT; -typedef void (APIENTRYP pfn_glGetLocalConstantFloatvEXT) (GLuint, GLenum, GLfloat*); -extern pfn_glGetLocalConstantFloatvEXT fp_glGetLocalConstantFloatvEXT; - - /* GL_EXT_vertex_weighting */ -extern GLboolean GLAD_EXT_vertex_weighting; -#define GL_MODELVIEW0_STACK_DEPTH_EXT 0x0BA3 -#define GL_MODELVIEW1_STACK_DEPTH_EXT 0x8502 -#define GL_MODELVIEW0_MATRIX_EXT 0x0BA6 -#define GL_MODELVIEW1_MATRIX_EXT 0x8506 -#define GL_VERTEX_WEIGHTING_EXT 0x8509 -#define GL_MODELVIEW0_EXT 0x1700 -#define GL_MODELVIEW1_EXT 0x850A -#define GL_CURRENT_VERTEX_WEIGHT_EXT 0x850B -#define GL_VERTEX_WEIGHT_ARRAY_EXT 0x850C -#define GL_VERTEX_WEIGHT_ARRAY_SIZE_EXT 0x850D -#define GL_VERTEX_WEIGHT_ARRAY_TYPE_EXT 0x850E -#define GL_VERTEX_WEIGHT_ARRAY_STRIDE_EXT 0x850F -#define GL_VERTEX_WEIGHT_ARRAY_POINTER_EXT 0x8510 -typedef void (APIENTRYP pfn_glVertexWeightfEXT) (GLfloat); -extern pfn_glVertexWeightfEXT fp_glVertexWeightfEXT; -typedef void (APIENTRYP pfn_glVertexWeightfvEXT) (const GLfloat*); -extern pfn_glVertexWeightfvEXT fp_glVertexWeightfvEXT; -typedef void (APIENTRYP pfn_glVertexWeightPointerEXT) (GLint, GLenum, GLsizei, const void*); -extern pfn_glVertexWeightPointerEXT fp_glVertexWeightPointerEXT; - /* GL_EXT_x11_sync_object */ extern GLboolean GLAD_EXT_x11_sync_object; #define GL_SYNC_X11_FENCE_EXT 0x90E1 typedef GLsync (APIENTRYP pfn_glImportSyncEXT) (GLenum, GLintptr, GLbitfield); extern pfn_glImportSyncEXT fp_glImportSyncEXT; - /* GL_OES_byte_coordinates */ -extern GLboolean GLAD_OES_byte_coordinates; -typedef void (APIENTRYP pfn_glMultiTexCoord1bOES) (GLenum, GLbyte); -extern pfn_glMultiTexCoord1bOES fp_glMultiTexCoord1bOES; -typedef void (APIENTRYP pfn_glMultiTexCoord1bvOES) (GLenum, const GLbyte*); -extern pfn_glMultiTexCoord1bvOES fp_glMultiTexCoord1bvOES; -typedef void (APIENTRYP pfn_glMultiTexCoord2bOES) (GLenum, GLbyte, GLbyte); -extern pfn_glMultiTexCoord2bOES fp_glMultiTexCoord2bOES; -typedef void (APIENTRYP pfn_glMultiTexCoord2bvOES) (GLenum, const GLbyte*); -extern pfn_glMultiTexCoord2bvOES fp_glMultiTexCoord2bvOES; -typedef void (APIENTRYP pfn_glMultiTexCoord3bOES) (GLenum, GLbyte, GLbyte, GLbyte); -extern pfn_glMultiTexCoord3bOES fp_glMultiTexCoord3bOES; -typedef void (APIENTRYP pfn_glMultiTexCoord3bvOES) (GLenum, const GLbyte*); -extern pfn_glMultiTexCoord3bvOES fp_glMultiTexCoord3bvOES; -typedef void (APIENTRYP pfn_glMultiTexCoord4bOES) (GLenum, GLbyte, GLbyte, GLbyte, GLbyte); -extern pfn_glMultiTexCoord4bOES fp_glMultiTexCoord4bOES; -typedef void (APIENTRYP pfn_glMultiTexCoord4bvOES) (GLenum, const GLbyte*); -extern pfn_glMultiTexCoord4bvOES fp_glMultiTexCoord4bvOES; -typedef void (APIENTRYP pfn_glTexCoord1bOES) (GLbyte); -extern pfn_glTexCoord1bOES fp_glTexCoord1bOES; -typedef void (APIENTRYP pfn_glTexCoord1bvOES) (const GLbyte*); -extern pfn_glTexCoord1bvOES fp_glTexCoord1bvOES; -typedef void (APIENTRYP pfn_glTexCoord2bOES) (GLbyte, GLbyte); -extern pfn_glTexCoord2bOES fp_glTexCoord2bOES; -typedef void (APIENTRYP pfn_glTexCoord2bvOES) (const GLbyte*); -extern pfn_glTexCoord2bvOES fp_glTexCoord2bvOES; -typedef void (APIENTRYP pfn_glTexCoord3bOES) (GLbyte, GLbyte, GLbyte); -extern pfn_glTexCoord3bOES fp_glTexCoord3bOES; -typedef void (APIENTRYP pfn_glTexCoord3bvOES) (const GLbyte*); -extern pfn_glTexCoord3bvOES fp_glTexCoord3bvOES; -typedef void (APIENTRYP pfn_glTexCoord4bOES) (GLbyte, GLbyte, GLbyte, GLbyte); -extern pfn_glTexCoord4bOES fp_glTexCoord4bOES; -typedef void (APIENTRYP pfn_glTexCoord4bvOES) (const GLbyte*); -extern pfn_glTexCoord4bvOES fp_glTexCoord4bvOES; -typedef void (APIENTRYP pfn_glVertex2bOES) (GLbyte); -extern pfn_glVertex2bOES fp_glVertex2bOES; -typedef void (APIENTRYP pfn_glVertex2bvOES) (const GLbyte*); -extern pfn_glVertex2bvOES fp_glVertex2bvOES; -typedef void (APIENTRYP pfn_glVertex3bOES) (GLbyte, GLbyte); -extern pfn_glVertex3bOES fp_glVertex3bOES; -typedef void (APIENTRYP pfn_glVertex3bvOES) (const GLbyte*); -extern pfn_glVertex3bvOES fp_glVertex3bvOES; -typedef void (APIENTRYP pfn_glVertex4bOES) (GLbyte, GLbyte, GLbyte); -extern pfn_glVertex4bOES fp_glVertex4bOES; -typedef void (APIENTRYP pfn_glVertex4bvOES) (const GLbyte*); -extern pfn_glVertex4bvOES fp_glVertex4bvOES; + /* GL_EXT_YUV_target */ +extern GLboolean GLAD_EXT_YUV_target; +#define GL_SAMPLER_EXTERNAL_2D_Y2Y_EXT 0x8BE7 +#define GL_TEXTURE_EXTERNAL_OES 0x8D65 +#define GL_TEXTURE_BINDING_EXTERNAL_OES 0x8D67 +#define GL_REQUIRED_TEXTURE_IMAGE_UNITS_OES 0x8D68 + + /* GL_OES_compressed_ETC1_RGB8_sub_texture */ +extern GLboolean GLAD_OES_compressed_ETC1_RGB8_sub_texture; /* GL_OES_compressed_ETC1_RGB8_texture */ extern GLboolean GLAD_OES_compressed_ETC1_RGB8_texture; #define GL_ETC1_RGB8_OES 0x8D64 - /* GL_OES_compressed_paletted_texture */ -extern GLboolean GLAD_OES_compressed_paletted_texture; -#define GL_PALETTE4_RGB8_OES 0x8B90 -#define GL_PALETTE4_RGBA8_OES 0x8B91 -#define GL_PALETTE4_R5_G6_B5_OES 0x8B92 -#define GL_PALETTE4_RGBA4_OES 0x8B93 -#define GL_PALETTE4_RGB5_A1_OES 0x8B94 -#define GL_PALETTE8_RGB8_OES 0x8B95 -#define GL_PALETTE8_RGBA8_OES 0x8B96 -#define GL_PALETTE8_R5_G6_B5_OES 0x8B97 -#define GL_PALETTE8_RGBA4_OES 0x8B98 -#define GL_PALETTE8_RGB5_A1_OES 0x8B99 + /* GL_OES_copy_image */ +extern GLboolean GLAD_OES_copy_image; +typedef void (APIENTRYP pfn_glCopyImageSubDataOES) (GLuint, GLenum, GLint, GLint, GLint, GLint, GLuint, GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei); +extern pfn_glCopyImageSubDataOES fp_glCopyImageSubDataOES; /* GL_OES_depth24 */ extern GLboolean GLAD_OES_depth24; @@ -7510,6 +6518,36 @@ extern GLboolean GLAD_OES_depth32; /* GL_OES_depth_texture */ extern GLboolean GLAD_OES_depth_texture; + /* GL_OES_draw_buffers_indexed */ +extern GLboolean GLAD_OES_draw_buffers_indexed; +typedef void (APIENTRYP pfn_glEnableiOES) (GLenum, GLuint); +extern pfn_glEnableiOES fp_glEnableiOES; +typedef void (APIENTRYP pfn_glDisableiOES) (GLenum, GLuint); +extern pfn_glDisableiOES fp_glDisableiOES; +typedef void (APIENTRYP pfn_glBlendEquationiOES) (GLuint, GLenum); +extern pfn_glBlendEquationiOES fp_glBlendEquationiOES; +typedef void (APIENTRYP pfn_glBlendEquationSeparateiOES) (GLuint, GLenum, GLenum); +extern pfn_glBlendEquationSeparateiOES fp_glBlendEquationSeparateiOES; +typedef void (APIENTRYP pfn_glBlendFunciOES) (GLuint, GLenum, GLenum); +extern pfn_glBlendFunciOES fp_glBlendFunciOES; +typedef void (APIENTRYP pfn_glBlendFuncSeparateiOES) (GLuint, GLenum, GLenum, GLenum, GLenum); +extern pfn_glBlendFuncSeparateiOES fp_glBlendFuncSeparateiOES; +typedef void (APIENTRYP pfn_glColorMaskiOES) (GLuint, GLboolean, GLboolean, GLboolean, GLboolean); +extern pfn_glColorMaskiOES fp_glColorMaskiOES; +typedef GLboolean (APIENTRYP pfn_glIsEnablediOES) (GLenum, GLuint); +extern pfn_glIsEnablediOES fp_glIsEnablediOES; + + /* GL_OES_draw_elements_base_vertex */ +extern GLboolean GLAD_OES_draw_elements_base_vertex; +typedef void (APIENTRYP pfn_glDrawElementsBaseVertexOES) (GLenum, GLsizei, GLenum, const void*, GLint); +extern pfn_glDrawElementsBaseVertexOES fp_glDrawElementsBaseVertexOES; +typedef void (APIENTRYP pfn_glDrawRangeElementsBaseVertexOES) (GLenum, GLuint, GLuint, GLsizei, GLenum, const void*, GLint); +extern pfn_glDrawRangeElementsBaseVertexOES fp_glDrawRangeElementsBaseVertexOES; +typedef void (APIENTRYP pfn_glDrawElementsInstancedBaseVertexOES) (GLenum, GLsizei, GLenum, const void*, GLsizei, GLint); +extern pfn_glDrawElementsInstancedBaseVertexOES fp_glDrawElementsInstancedBaseVertexOES; +typedef void (APIENTRYP pfn_glMultiDrawElementsBaseVertexOES) (GLenum, const GLsizei*, GLenum, const void**, GLsizei, const GLint*); +extern pfn_glMultiDrawElementsBaseVertexOES fp_glMultiDrawElementsBaseVertexOES; + /* GL_OES_EGL_image */ extern GLboolean GLAD_OES_EGL_image; typedef void (APIENTRYP pfn_glEGLImageTargetTexture2DOES) (GLenum, GLeglImageOES); @@ -7519,240 +6557,61 @@ extern pfn_glEGLImageTargetRenderbufferStorageOES fp_glEGLImageTargetRenderbuffe /* GL_OES_EGL_image_external */ extern GLboolean GLAD_OES_EGL_image_external; -#define GL_TEXTURE_EXTERNAL_OES 0x8D65 -#define GL_TEXTURE_BINDING_EXTERNAL_OES 0x8D67 -#define GL_REQUIRED_TEXTURE_IMAGE_UNITS_OES 0x8D68 #define GL_SAMPLER_EXTERNAL_OES 0x8D66 + /* GL_OES_EGL_image_external_essl3 */ +extern GLboolean GLAD_OES_EGL_image_external_essl3; + /* GL_OES_element_index_uint */ extern GLboolean GLAD_OES_element_index_uint; /* GL_OES_fbo_render_mipmap */ extern GLboolean GLAD_OES_fbo_render_mipmap; - /* GL_OES_fixed_point */ -extern GLboolean GLAD_OES_fixed_point; -#define GL_FIXED_OES 0x140C -typedef void (APIENTRYP pfn_glAlphaFuncxOES) (GLenum, GLfixed); -extern pfn_glAlphaFuncxOES fp_glAlphaFuncxOES; -typedef void (APIENTRYP pfn_glClearColorxOES) (GLfixed, GLfixed, GLfixed, GLfixed); -extern pfn_glClearColorxOES fp_glClearColorxOES; -typedef void (APIENTRYP pfn_glClearDepthxOES) (GLfixed); -extern pfn_glClearDepthxOES fp_glClearDepthxOES; -typedef void (APIENTRYP pfn_glClipPlanexOES) (GLenum, const GLfixed*); -extern pfn_glClipPlanexOES fp_glClipPlanexOES; -typedef void (APIENTRYP pfn_glColor4xOES) (GLfixed, GLfixed, GLfixed, GLfixed); -extern pfn_glColor4xOES fp_glColor4xOES; -typedef void (APIENTRYP pfn_glDepthRangexOES) (GLfixed, GLfixed); -extern pfn_glDepthRangexOES fp_glDepthRangexOES; -typedef void (APIENTRYP pfn_glFogxOES) (GLenum, GLfixed); -extern pfn_glFogxOES fp_glFogxOES; -typedef void (APIENTRYP pfn_glFogxvOES) (GLenum, const GLfixed*); -extern pfn_glFogxvOES fp_glFogxvOES; -typedef void (APIENTRYP pfn_glFrustumxOES) (GLfixed, GLfixed, GLfixed, GLfixed, GLfixed, GLfixed); -extern pfn_glFrustumxOES fp_glFrustumxOES; -typedef void (APIENTRYP pfn_glGetClipPlanexOES) (GLenum, GLfixed*); -extern pfn_glGetClipPlanexOES fp_glGetClipPlanexOES; -typedef void (APIENTRYP pfn_glGetFixedvOES) (GLenum, GLfixed*); -extern pfn_glGetFixedvOES fp_glGetFixedvOES; -typedef void (APIENTRYP pfn_glGetTexEnvxvOES) (GLenum, GLenum, GLfixed*); -extern pfn_glGetTexEnvxvOES fp_glGetTexEnvxvOES; -typedef void (APIENTRYP pfn_glGetTexParameterxvOES) (GLenum, GLenum, GLfixed*); -extern pfn_glGetTexParameterxvOES fp_glGetTexParameterxvOES; -typedef void (APIENTRYP pfn_glLightModelxOES) (GLenum, GLfixed); -extern pfn_glLightModelxOES fp_glLightModelxOES; -typedef void (APIENTRYP pfn_glLightModelxvOES) (GLenum, const GLfixed*); -extern pfn_glLightModelxvOES fp_glLightModelxvOES; -typedef void (APIENTRYP pfn_glLightxOES) (GLenum, GLenum, GLfixed); -extern pfn_glLightxOES fp_glLightxOES; -typedef void (APIENTRYP pfn_glLightxvOES) (GLenum, GLenum, const GLfixed*); -extern pfn_glLightxvOES fp_glLightxvOES; -typedef void (APIENTRYP pfn_glLineWidthxOES) (GLfixed); -extern pfn_glLineWidthxOES fp_glLineWidthxOES; -typedef void (APIENTRYP pfn_glLoadMatrixxOES) (const GLfixed*); -extern pfn_glLoadMatrixxOES fp_glLoadMatrixxOES; -typedef void (APIENTRYP pfn_glMaterialxOES) (GLenum, GLenum, GLfixed); -extern pfn_glMaterialxOES fp_glMaterialxOES; -typedef void (APIENTRYP pfn_glMaterialxvOES) (GLenum, GLenum, const GLfixed*); -extern pfn_glMaterialxvOES fp_glMaterialxvOES; -typedef void (APIENTRYP pfn_glMultMatrixxOES) (const GLfixed*); -extern pfn_glMultMatrixxOES fp_glMultMatrixxOES; -typedef void (APIENTRYP pfn_glMultiTexCoord4xOES) (GLenum, GLfixed, GLfixed, GLfixed, GLfixed); -extern pfn_glMultiTexCoord4xOES fp_glMultiTexCoord4xOES; -typedef void (APIENTRYP pfn_glNormal3xOES) (GLfixed, GLfixed, GLfixed); -extern pfn_glNormal3xOES fp_glNormal3xOES; -typedef void (APIENTRYP pfn_glOrthoxOES) (GLfixed, GLfixed, GLfixed, GLfixed, GLfixed, GLfixed); -extern pfn_glOrthoxOES fp_glOrthoxOES; -typedef void (APIENTRYP pfn_glPointParameterxvOES) (GLenum, const GLfixed*); -extern pfn_glPointParameterxvOES fp_glPointParameterxvOES; -typedef void (APIENTRYP pfn_glPointSizexOES) (GLfixed); -extern pfn_glPointSizexOES fp_glPointSizexOES; -typedef void (APIENTRYP pfn_glPolygonOffsetxOES) (GLfixed, GLfixed); -extern pfn_glPolygonOffsetxOES fp_glPolygonOffsetxOES; -typedef void (APIENTRYP pfn_glRotatexOES) (GLfixed, GLfixed, GLfixed, GLfixed); -extern pfn_glRotatexOES fp_glRotatexOES; -typedef void (APIENTRYP pfn_glSampleCoverageOES) (GLfixed, GLboolean); -extern pfn_glSampleCoverageOES fp_glSampleCoverageOES; -typedef void (APIENTRYP pfn_glScalexOES) (GLfixed, GLfixed, GLfixed); -extern pfn_glScalexOES fp_glScalexOES; -typedef void (APIENTRYP pfn_glTexEnvxOES) (GLenum, GLenum, GLfixed); -extern pfn_glTexEnvxOES fp_glTexEnvxOES; -typedef void (APIENTRYP pfn_glTexEnvxvOES) (GLenum, GLenum, const GLfixed*); -extern pfn_glTexEnvxvOES fp_glTexEnvxvOES; -typedef void (APIENTRYP pfn_glTexParameterxOES) (GLenum, GLenum, GLfixed); -extern pfn_glTexParameterxOES fp_glTexParameterxOES; -typedef void (APIENTRYP pfn_glTexParameterxvOES) (GLenum, GLenum, const GLfixed*); -extern pfn_glTexParameterxvOES fp_glTexParameterxvOES; -typedef void (APIENTRYP pfn_glTranslatexOES) (GLfixed, GLfixed, GLfixed); -extern pfn_glTranslatexOES fp_glTranslatexOES; -typedef void (APIENTRYP pfn_glGetLightxvOES) (GLenum, GLenum, GLfixed*); -extern pfn_glGetLightxvOES fp_glGetLightxvOES; -typedef void (APIENTRYP pfn_glGetMaterialxvOES) (GLenum, GLenum, GLfixed*); -extern pfn_glGetMaterialxvOES fp_glGetMaterialxvOES; -typedef void (APIENTRYP pfn_glPointParameterxOES) (GLenum, GLfixed); -extern pfn_glPointParameterxOES fp_glPointParameterxOES; -typedef void (APIENTRYP pfn_glSampleCoveragexOES) (GLclampx, GLboolean); -extern pfn_glSampleCoveragexOES fp_glSampleCoveragexOES; -typedef void (APIENTRYP pfn_glAccumxOES) (GLenum, GLfixed); -extern pfn_glAccumxOES fp_glAccumxOES; -typedef void (APIENTRYP pfn_glBitmapxOES) (GLsizei, GLsizei, GLfixed, GLfixed, GLfixed, GLfixed, const GLubyte*); -extern pfn_glBitmapxOES fp_glBitmapxOES; -typedef void (APIENTRYP pfn_glBlendColorxOES) (GLfixed, GLfixed, GLfixed, GLfixed); -extern pfn_glBlendColorxOES fp_glBlendColorxOES; -typedef void (APIENTRYP pfn_glClearAccumxOES) (GLfixed, GLfixed, GLfixed, GLfixed); -extern pfn_glClearAccumxOES fp_glClearAccumxOES; -typedef void (APIENTRYP pfn_glColor3xOES) (GLfixed, GLfixed, GLfixed); -extern pfn_glColor3xOES fp_glColor3xOES; -typedef void (APIENTRYP pfn_glColor3xvOES) (const GLfixed*); -extern pfn_glColor3xvOES fp_glColor3xvOES; -typedef void (APIENTRYP pfn_glColor4xvOES) (const GLfixed*); -extern pfn_glColor4xvOES fp_glColor4xvOES; -typedef void (APIENTRYP pfn_glConvolutionParameterxOES) (GLenum, GLenum, GLfixed); -extern pfn_glConvolutionParameterxOES fp_glConvolutionParameterxOES; -typedef void (APIENTRYP pfn_glConvolutionParameterxvOES) (GLenum, GLenum, const GLfixed*); -extern pfn_glConvolutionParameterxvOES fp_glConvolutionParameterxvOES; -typedef void (APIENTRYP pfn_glEvalCoord1xOES) (GLfixed); -extern pfn_glEvalCoord1xOES fp_glEvalCoord1xOES; -typedef void (APIENTRYP pfn_glEvalCoord1xvOES) (const GLfixed*); -extern pfn_glEvalCoord1xvOES fp_glEvalCoord1xvOES; -typedef void (APIENTRYP pfn_glEvalCoord2xOES) (GLfixed, GLfixed); -extern pfn_glEvalCoord2xOES fp_glEvalCoord2xOES; -typedef void (APIENTRYP pfn_glEvalCoord2xvOES) (const GLfixed*); -extern pfn_glEvalCoord2xvOES fp_glEvalCoord2xvOES; -typedef void (APIENTRYP pfn_glFeedbackBufferxOES) (GLsizei, GLenum, const GLfixed*); -extern pfn_glFeedbackBufferxOES fp_glFeedbackBufferxOES; -typedef void (APIENTRYP pfn_glGetConvolutionParameterxvOES) (GLenum, GLenum, GLfixed*); -extern pfn_glGetConvolutionParameterxvOES fp_glGetConvolutionParameterxvOES; -typedef void (APIENTRYP pfn_glGetHistogramParameterxvOES) (GLenum, GLenum, GLfixed*); -extern pfn_glGetHistogramParameterxvOES fp_glGetHistogramParameterxvOES; -typedef void (APIENTRYP pfn_glGetLightxOES) (GLenum, GLenum, GLfixed*); -extern pfn_glGetLightxOES fp_glGetLightxOES; -typedef void (APIENTRYP pfn_glGetMapxvOES) (GLenum, GLenum, GLfixed*); -extern pfn_glGetMapxvOES fp_glGetMapxvOES; -typedef void (APIENTRYP pfn_glGetMaterialxOES) (GLenum, GLenum, GLfixed); -extern pfn_glGetMaterialxOES fp_glGetMaterialxOES; -typedef void (APIENTRYP pfn_glGetPixelMapxv) (GLenum, GLint, GLfixed*); -extern pfn_glGetPixelMapxv fp_glGetPixelMapxv; -typedef void (APIENTRYP pfn_glGetTexGenxvOES) (GLenum, GLenum, GLfixed*); -extern pfn_glGetTexGenxvOES fp_glGetTexGenxvOES; -typedef void (APIENTRYP pfn_glGetTexLevelParameterxvOES) (GLenum, GLint, GLenum, GLfixed*); -extern pfn_glGetTexLevelParameterxvOES fp_glGetTexLevelParameterxvOES; -typedef void (APIENTRYP pfn_glIndexxOES) (GLfixed); -extern pfn_glIndexxOES fp_glIndexxOES; -typedef void (APIENTRYP pfn_glIndexxvOES) (const GLfixed*); -extern pfn_glIndexxvOES fp_glIndexxvOES; -typedef void (APIENTRYP pfn_glLoadTransposeMatrixxOES) (const GLfixed*); -extern pfn_glLoadTransposeMatrixxOES fp_glLoadTransposeMatrixxOES; -typedef void (APIENTRYP pfn_glMap1xOES) (GLenum, GLfixed, GLfixed, GLint, GLint, GLfixed); -extern pfn_glMap1xOES fp_glMap1xOES; -typedef void (APIENTRYP pfn_glMap2xOES) (GLenum, GLfixed, GLfixed, GLint, GLint, GLfixed, GLfixed, GLint, GLint, GLfixed); -extern pfn_glMap2xOES fp_glMap2xOES; -typedef void (APIENTRYP pfn_glMapGrid1xOES) (GLint, GLfixed, GLfixed); -extern pfn_glMapGrid1xOES fp_glMapGrid1xOES; -typedef void (APIENTRYP pfn_glMapGrid2xOES) (GLint, GLfixed, GLfixed, GLfixed, GLfixed); -extern pfn_glMapGrid2xOES fp_glMapGrid2xOES; -typedef void (APIENTRYP pfn_glMultTransposeMatrixxOES) (const GLfixed*); -extern pfn_glMultTransposeMatrixxOES fp_glMultTransposeMatrixxOES; -typedef void (APIENTRYP pfn_glMultiTexCoord1xOES) (GLenum, GLfixed); -extern pfn_glMultiTexCoord1xOES fp_glMultiTexCoord1xOES; -typedef void (APIENTRYP pfn_glMultiTexCoord1xvOES) (GLenum, const GLfixed*); -extern pfn_glMultiTexCoord1xvOES fp_glMultiTexCoord1xvOES; -typedef void (APIENTRYP pfn_glMultiTexCoord2xOES) (GLenum, GLfixed, GLfixed); -extern pfn_glMultiTexCoord2xOES fp_glMultiTexCoord2xOES; -typedef void (APIENTRYP pfn_glMultiTexCoord2xvOES) (GLenum, const GLfixed*); -extern pfn_glMultiTexCoord2xvOES fp_glMultiTexCoord2xvOES; -typedef void (APIENTRYP pfn_glMultiTexCoord3xOES) (GLenum, GLfixed, GLfixed, GLfixed); -extern pfn_glMultiTexCoord3xOES fp_glMultiTexCoord3xOES; -typedef void (APIENTRYP pfn_glMultiTexCoord3xvOES) (GLenum, const GLfixed*); -extern pfn_glMultiTexCoord3xvOES fp_glMultiTexCoord3xvOES; -typedef void (APIENTRYP pfn_glMultiTexCoord4xvOES) (GLenum, const GLfixed*); -extern pfn_glMultiTexCoord4xvOES fp_glMultiTexCoord4xvOES; -typedef void (APIENTRYP pfn_glNormal3xvOES) (const GLfixed*); -extern pfn_glNormal3xvOES fp_glNormal3xvOES; -typedef void (APIENTRYP pfn_glPassThroughxOES) (GLfixed); -extern pfn_glPassThroughxOES fp_glPassThroughxOES; -typedef void (APIENTRYP pfn_glPixelMapx) (GLenum, GLint, const GLfixed*); -extern pfn_glPixelMapx fp_glPixelMapx; -typedef void (APIENTRYP pfn_glPixelStorex) (GLenum, GLfixed); -extern pfn_glPixelStorex fp_glPixelStorex; -typedef void (APIENTRYP pfn_glPixelTransferxOES) (GLenum, GLfixed); -extern pfn_glPixelTransferxOES fp_glPixelTransferxOES; -typedef void (APIENTRYP pfn_glPixelZoomxOES) (GLfixed, GLfixed); -extern pfn_glPixelZoomxOES fp_glPixelZoomxOES; -typedef void (APIENTRYP pfn_glPrioritizeTexturesxOES) (GLsizei, const GLuint*, const GLfixed*); -extern pfn_glPrioritizeTexturesxOES fp_glPrioritizeTexturesxOES; -typedef void (APIENTRYP pfn_glRasterPos2xOES) (GLfixed, GLfixed); -extern pfn_glRasterPos2xOES fp_glRasterPos2xOES; -typedef void (APIENTRYP pfn_glRasterPos2xvOES) (const GLfixed*); -extern pfn_glRasterPos2xvOES fp_glRasterPos2xvOES; -typedef void (APIENTRYP pfn_glRasterPos3xOES) (GLfixed, GLfixed, GLfixed); -extern pfn_glRasterPos3xOES fp_glRasterPos3xOES; -typedef void (APIENTRYP pfn_glRasterPos3xvOES) (const GLfixed*); -extern pfn_glRasterPos3xvOES fp_glRasterPos3xvOES; -typedef void (APIENTRYP pfn_glRasterPos4xOES) (GLfixed, GLfixed, GLfixed, GLfixed); -extern pfn_glRasterPos4xOES fp_glRasterPos4xOES; -typedef void (APIENTRYP pfn_glRasterPos4xvOES) (const GLfixed*); -extern pfn_glRasterPos4xvOES fp_glRasterPos4xvOES; -typedef void (APIENTRYP pfn_glRectxOES) (GLfixed, GLfixed, GLfixed, GLfixed); -extern pfn_glRectxOES fp_glRectxOES; -typedef void (APIENTRYP pfn_glRectxvOES) (const GLfixed*, const GLfixed*); -extern pfn_glRectxvOES fp_glRectxvOES; -typedef void (APIENTRYP pfn_glTexCoord1xOES) (GLfixed); -extern pfn_glTexCoord1xOES fp_glTexCoord1xOES; -typedef void (APIENTRYP pfn_glTexCoord1xvOES) (const GLfixed*); -extern pfn_glTexCoord1xvOES fp_glTexCoord1xvOES; -typedef void (APIENTRYP pfn_glTexCoord2xOES) (GLfixed, GLfixed); -extern pfn_glTexCoord2xOES fp_glTexCoord2xOES; -typedef void (APIENTRYP pfn_glTexCoord2xvOES) (const GLfixed*); -extern pfn_glTexCoord2xvOES fp_glTexCoord2xvOES; -typedef void (APIENTRYP pfn_glTexCoord3xOES) (GLfixed, GLfixed, GLfixed); -extern pfn_glTexCoord3xOES fp_glTexCoord3xOES; -typedef void (APIENTRYP pfn_glTexCoord3xvOES) (const GLfixed*); -extern pfn_glTexCoord3xvOES fp_glTexCoord3xvOES; -typedef void (APIENTRYP pfn_glTexCoord4xOES) (GLfixed, GLfixed, GLfixed, GLfixed); -extern pfn_glTexCoord4xOES fp_glTexCoord4xOES; -typedef void (APIENTRYP pfn_glTexCoord4xvOES) (const GLfixed*); -extern pfn_glTexCoord4xvOES fp_glTexCoord4xvOES; -typedef void (APIENTRYP pfn_glTexGenxOES) (GLenum, GLenum, GLfixed); -extern pfn_glTexGenxOES fp_glTexGenxOES; -typedef void (APIENTRYP pfn_glTexGenxvOES) (GLenum, GLenum, const GLfixed*); -extern pfn_glTexGenxvOES fp_glTexGenxvOES; -typedef void (APIENTRYP pfn_glVertex2xOES) (GLfixed); -extern pfn_glVertex2xOES fp_glVertex2xOES; -typedef void (APIENTRYP pfn_glVertex2xvOES) (const GLfixed*); -extern pfn_glVertex2xvOES fp_glVertex2xvOES; -typedef void (APIENTRYP pfn_glVertex3xOES) (GLfixed, GLfixed); -extern pfn_glVertex3xOES fp_glVertex3xOES; -typedef void (APIENTRYP pfn_glVertex3xvOES) (const GLfixed*); -extern pfn_glVertex3xvOES fp_glVertex3xvOES; -typedef void (APIENTRYP pfn_glVertex4xOES) (GLfixed, GLfixed, GLfixed); -extern pfn_glVertex4xOES fp_glVertex4xOES; -typedef void (APIENTRYP pfn_glVertex4xvOES) (const GLfixed*); -extern pfn_glVertex4xvOES fp_glVertex4xvOES; - /* GL_OES_fragment_precision_high */ extern GLboolean GLAD_OES_fragment_precision_high; + /* GL_OES_geometry_point_size */ +extern GLboolean GLAD_OES_geometry_point_size; + + /* GL_OES_geometry_shader */ +extern GLboolean GLAD_OES_geometry_shader; +#define GL_GEOMETRY_SHADER_OES 0x8DD9 +#define GL_GEOMETRY_SHADER_BIT_OES 0x00000004 +#define GL_GEOMETRY_LINKED_VERTICES_OUT_OES 0x8916 +#define GL_GEOMETRY_LINKED_INPUT_TYPE_OES 0x8917 +#define GL_GEOMETRY_LINKED_OUTPUT_TYPE_OES 0x8918 +#define GL_GEOMETRY_SHADER_INVOCATIONS_OES 0x887F +#define GL_LAYER_PROVOKING_VERTEX_OES 0x825E +#define GL_LINES_ADJACENCY_OES 0x000A +#define GL_LINE_STRIP_ADJACENCY_OES 0x000B +#define GL_TRIANGLES_ADJACENCY_OES 0x000C +#define GL_TRIANGLE_STRIP_ADJACENCY_OES 0x000D +#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_OES 0x8DDF +#define GL_MAX_GEOMETRY_UNIFORM_BLOCKS_OES 0x8A2C +#define GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_OES 0x8A32 +#define GL_MAX_GEOMETRY_INPUT_COMPONENTS_OES 0x9123 +#define GL_MAX_GEOMETRY_OUTPUT_COMPONENTS_OES 0x9124 +#define GL_MAX_GEOMETRY_OUTPUT_VERTICES_OES 0x8DE0 +#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_OES 0x8DE1 +#define GL_MAX_GEOMETRY_SHADER_INVOCATIONS_OES 0x8E5A +#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_OES 0x8C29 +#define GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_OES 0x92CF +#define GL_MAX_GEOMETRY_ATOMIC_COUNTERS_OES 0x92D5 +#define GL_MAX_GEOMETRY_IMAGE_UNIFORMS_OES 0x90CD +#define GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_OES 0x90D7 +#define GL_FIRST_VERTEX_CONVENTION_OES 0x8E4D +#define GL_LAST_VERTEX_CONVENTION_OES 0x8E4E +#define GL_UNDEFINED_VERTEX_OES 0x8260 +#define GL_PRIMITIVES_GENERATED_OES 0x8C87 +#define GL_FRAMEBUFFER_DEFAULT_LAYERS_OES 0x9312 +#define GL_MAX_FRAMEBUFFER_LAYERS_OES 0x9317 +#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_OES 0x8DA8 +#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_OES 0x8DA7 +#define GL_REFERENCED_BY_GEOMETRY_SHADER_OES 0x9309 +typedef void (APIENTRYP pfn_glFramebufferTextureOES) (GLenum, GLenum, GLuint, GLint); +extern pfn_glFramebufferTextureOES fp_glFramebufferTextureOES; + /* GL_OES_get_program_binary */ extern GLboolean GLAD_OES_get_program_binary; #define GL_PROGRAM_BINARY_LENGTH_OES 0x8741 @@ -7763,6 +6622,9 @@ extern pfn_glGetProgramBinaryOES fp_glGetProgramBinaryOES; typedef void (APIENTRYP pfn_glProgramBinaryOES) (GLuint, GLenum, const void*, GLint); extern pfn_glProgramBinaryOES fp_glProgramBinaryOES; + /* GL_OES_gpu_shader5 */ +extern GLboolean GLAD_OES_gpu_shader5; + /* GL_OES_mapbuffer */ extern GLboolean GLAD_OES_mapbuffer; #define GL_WRITE_ONLY_OES 0x88B9 @@ -7782,15 +6644,11 @@ extern GLboolean GLAD_OES_packed_depth_stencil; #define GL_UNSIGNED_INT_24_8_OES 0x84FA #define GL_DEPTH24_STENCIL8_OES 0x88F0 - /* GL_OES_query_matrix */ -extern GLboolean GLAD_OES_query_matrix; -typedef GLbitfield (APIENTRYP pfn_glQueryMatrixxOES) (GLfixed*, GLint*); -extern pfn_glQueryMatrixxOES fp_glQueryMatrixxOES; - - /* GL_OES_read_format */ -extern GLboolean GLAD_OES_read_format; -#define GL_IMPLEMENTATION_COLOR_READ_TYPE_OES 0x8B9A -#define GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES 0x8B9B + /* GL_OES_primitive_bounding_box */ +extern GLboolean GLAD_OES_primitive_bounding_box; +#define GL_PRIMITIVE_BOUNDING_BOX_OES 0x92BE +typedef void (APIENTRYP pfn_glPrimitiveBoundingBoxOES) (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +extern pfn_glPrimitiveBoundingBoxOES fp_glPrimitiveBoundingBoxOES; /* GL_OES_required_internalformat */ extern GLboolean GLAD_OES_required_internalformat; @@ -7808,20 +6666,27 @@ extern GLboolean GLAD_OES_required_internalformat; /* GL_OES_rgb8_rgba8 */ extern GLboolean GLAD_OES_rgb8_rgba8; - /* GL_OES_single_precision */ -extern GLboolean GLAD_OES_single_precision; -typedef void (APIENTRYP pfn_glClearDepthfOES) (GLclampf); -extern pfn_glClearDepthfOES fp_glClearDepthfOES; -typedef void (APIENTRYP pfn_glClipPlanefOES) (GLenum, const GLfloat*); -extern pfn_glClipPlanefOES fp_glClipPlanefOES; -typedef void (APIENTRYP pfn_glDepthRangefOES) (GLclampf, GLclampf); -extern pfn_glDepthRangefOES fp_glDepthRangefOES; -typedef void (APIENTRYP pfn_glFrustumfOES) (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -extern pfn_glFrustumfOES fp_glFrustumfOES; -typedef void (APIENTRYP pfn_glGetClipPlanefOES) (GLenum, GLfloat*); -extern pfn_glGetClipPlanefOES fp_glGetClipPlanefOES; -typedef void (APIENTRYP pfn_glOrthofOES) (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); -extern pfn_glOrthofOES fp_glOrthofOES; + /* GL_OES_sample_shading */ +extern GLboolean GLAD_OES_sample_shading; +#define GL_SAMPLE_SHADING_OES 0x8C36 +#define GL_MIN_SAMPLE_SHADING_VALUE_OES 0x8C37 +typedef void (APIENTRYP pfn_glMinSampleShadingOES) (GLfloat); +extern pfn_glMinSampleShadingOES fp_glMinSampleShadingOES; + + /* GL_OES_sample_variables */ +extern GLboolean GLAD_OES_sample_variables; + + /* GL_OES_shader_image_atomic */ +extern GLboolean GLAD_OES_shader_image_atomic; + + /* GL_OES_shader_io_blocks */ +extern GLboolean GLAD_OES_shader_io_blocks; + + /* GL_OES_shader_multisample_interpolation */ +extern GLboolean GLAD_OES_shader_multisample_interpolation; +#define GL_MIN_FRAGMENT_INTERPOLATION_OFFSET_OES 0x8E5B +#define GL_MAX_FRAGMENT_INTERPOLATION_OFFSET_OES 0x8E5C +#define GL_FRAGMENT_INTERPOLATION_OFFSET_BITS_OES 0x8E5D /* GL_OES_standard_derivatives */ extern GLboolean GLAD_OES_standard_derivatives; @@ -7839,6 +6704,57 @@ extern GLboolean GLAD_OES_stencil4; extern GLboolean GLAD_OES_surfaceless_context; #define GL_FRAMEBUFFER_UNDEFINED_OES 0x8219 + /* GL_OES_tessellation_point_size */ +extern GLboolean GLAD_OES_tessellation_point_size; + + /* GL_OES_tessellation_shader */ +extern GLboolean GLAD_OES_tessellation_shader; +#define GL_PATCHES_OES 0x000E +#define GL_PATCH_VERTICES_OES 0x8E72 +#define GL_TESS_CONTROL_OUTPUT_VERTICES_OES 0x8E75 +#define GL_TESS_GEN_MODE_OES 0x8E76 +#define GL_TESS_GEN_SPACING_OES 0x8E77 +#define GL_TESS_GEN_VERTEX_ORDER_OES 0x8E78 +#define GL_TESS_GEN_POINT_MODE_OES 0x8E79 +#define GL_ISOLINES_OES 0x8E7A +#define GL_QUADS_OES 0x0007 +#define GL_FRACTIONAL_ODD_OES 0x8E7B +#define GL_FRACTIONAL_EVEN_OES 0x8E7C +#define GL_MAX_PATCH_VERTICES_OES 0x8E7D +#define GL_MAX_TESS_GEN_LEVEL_OES 0x8E7E +#define GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS_OES 0x8E7F +#define GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS_OES 0x8E80 +#define GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS_OES 0x8E81 +#define GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS_OES 0x8E82 +#define GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS_OES 0x8E83 +#define GL_MAX_TESS_PATCH_COMPONENTS_OES 0x8E84 +#define GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS_OES 0x8E85 +#define GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS_OES 0x8E86 +#define GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS_OES 0x8E89 +#define GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS_OES 0x8E8A +#define GL_MAX_TESS_CONTROL_INPUT_COMPONENTS_OES 0x886C +#define GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS_OES 0x886D +#define GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS_OES 0x8E1E +#define GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS_OES 0x8E1F +#define GL_MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS_OES 0x92CD +#define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS_OES 0x92CE +#define GL_MAX_TESS_CONTROL_ATOMIC_COUNTERS_OES 0x92D3 +#define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS_OES 0x92D4 +#define GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS_OES 0x90CB +#define GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS_OES 0x90CC +#define GL_MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS_OES 0x90D8 +#define GL_MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS_OES 0x90D9 +#define GL_PRIMITIVE_RESTART_FOR_PATCHES_SUPPORTED_OES 0x8221 +#define GL_IS_PER_PATCH_OES 0x92E7 +#define GL_REFERENCED_BY_TESS_CONTROL_SHADER_OES 0x9307 +#define GL_REFERENCED_BY_TESS_EVALUATION_SHADER_OES 0x9308 +#define GL_TESS_CONTROL_SHADER_OES 0x8E88 +#define GL_TESS_EVALUATION_SHADER_OES 0x8E87 +#define GL_TESS_CONTROL_SHADER_BIT_OES 0x00000008 +#define GL_TESS_EVALUATION_SHADER_BIT_OES 0x00000010 +typedef void (APIENTRYP pfn_glPatchParameteriOES) (GLenum, GLint); +extern pfn_glPatchParameteriOES fp_glPatchParameteriOES; + /* GL_OES_texture_3D */ extern GLboolean GLAD_OES_texture_3D; #define GL_TEXTURE_WRAP_R_OES 0x8072 @@ -7860,8 +6776,82 @@ extern pfn_glCompressedTexSubImage3DOES fp_glCompressedTexSubImage3DOES; typedef void (APIENTRYP pfn_glFramebufferTexture3DOES) (GLenum, GLenum, GLenum, GLuint, GLint, GLint); extern pfn_glFramebufferTexture3DOES fp_glFramebufferTexture3DOES; + /* GL_OES_texture_border_clamp */ +extern GLboolean GLAD_OES_texture_border_clamp; +#define GL_TEXTURE_BORDER_COLOR_OES 0x1004 +#define GL_CLAMP_TO_BORDER_OES 0x812D +typedef void (APIENTRYP pfn_glTexParameterIivOES) (GLenum, GLenum, const GLint*); +extern pfn_glTexParameterIivOES fp_glTexParameterIivOES; +typedef void (APIENTRYP pfn_glTexParameterIuivOES) (GLenum, GLenum, const GLuint*); +extern pfn_glTexParameterIuivOES fp_glTexParameterIuivOES; +typedef void (APIENTRYP pfn_glGetTexParameterIivOES) (GLenum, GLenum, GLint*); +extern pfn_glGetTexParameterIivOES fp_glGetTexParameterIivOES; +typedef void (APIENTRYP pfn_glGetTexParameterIuivOES) (GLenum, GLenum, GLuint*); +extern pfn_glGetTexParameterIuivOES fp_glGetTexParameterIuivOES; +typedef void (APIENTRYP pfn_glSamplerParameterIivOES) (GLuint, GLenum, const GLint*); +extern pfn_glSamplerParameterIivOES fp_glSamplerParameterIivOES; +typedef void (APIENTRYP pfn_glSamplerParameterIuivOES) (GLuint, GLenum, const GLuint*); +extern pfn_glSamplerParameterIuivOES fp_glSamplerParameterIuivOES; +typedef void (APIENTRYP pfn_glGetSamplerParameterIivOES) (GLuint, GLenum, GLint*); +extern pfn_glGetSamplerParameterIivOES fp_glGetSamplerParameterIivOES; +typedef void (APIENTRYP pfn_glGetSamplerParameterIuivOES) (GLuint, GLenum, GLuint*); +extern pfn_glGetSamplerParameterIuivOES fp_glGetSamplerParameterIuivOES; + + /* GL_OES_texture_buffer */ +extern GLboolean GLAD_OES_texture_buffer; +#define GL_TEXTURE_BUFFER_OES 0x8C2A +#define GL_TEXTURE_BUFFER_BINDING_OES 0x8C2A +#define GL_MAX_TEXTURE_BUFFER_SIZE_OES 0x8C2B +#define GL_TEXTURE_BINDING_BUFFER_OES 0x8C2C +#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING_OES 0x8C2D +#define GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT_OES 0x919F +#define GL_SAMPLER_BUFFER_OES 0x8DC2 +#define GL_INT_SAMPLER_BUFFER_OES 0x8DD0 +#define GL_UNSIGNED_INT_SAMPLER_BUFFER_OES 0x8DD8 +#define GL_IMAGE_BUFFER_OES 0x9051 +#define GL_INT_IMAGE_BUFFER_OES 0x905C +#define GL_UNSIGNED_INT_IMAGE_BUFFER_OES 0x9067 +#define GL_TEXTURE_BUFFER_OFFSET_OES 0x919D +#define GL_TEXTURE_BUFFER_SIZE_OES 0x919E +typedef void (APIENTRYP pfn_glTexBufferOES) (GLenum, GLenum, GLuint); +extern pfn_glTexBufferOES fp_glTexBufferOES; +typedef void (APIENTRYP pfn_glTexBufferRangeOES) (GLenum, GLenum, GLuint, GLintptr, GLsizeiptr); +extern pfn_glTexBufferRangeOES fp_glTexBufferRangeOES; + /* GL_OES_texture_compression_astc */ extern GLboolean GLAD_OES_texture_compression_astc; +#define GL_COMPRESSED_RGBA_ASTC_3x3x3_OES 0x93C0 +#define GL_COMPRESSED_RGBA_ASTC_4x3x3_OES 0x93C1 +#define GL_COMPRESSED_RGBA_ASTC_4x4x3_OES 0x93C2 +#define GL_COMPRESSED_RGBA_ASTC_4x4x4_OES 0x93C3 +#define GL_COMPRESSED_RGBA_ASTC_5x4x4_OES 0x93C4 +#define GL_COMPRESSED_RGBA_ASTC_5x5x4_OES 0x93C5 +#define GL_COMPRESSED_RGBA_ASTC_5x5x5_OES 0x93C6 +#define GL_COMPRESSED_RGBA_ASTC_6x5x5_OES 0x93C7 +#define GL_COMPRESSED_RGBA_ASTC_6x6x5_OES 0x93C8 +#define GL_COMPRESSED_RGBA_ASTC_6x6x6_OES 0x93C9 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_3x3x3_OES 0x93E0 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x3x3_OES 0x93E1 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4x3_OES 0x93E2 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4x4_OES 0x93E3 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4x4_OES 0x93E4 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5x4_OES 0x93E5 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5x5_OES 0x93E6 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5x5_OES 0x93E7 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6x5_OES 0x93E8 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6x6_OES 0x93E9 + + /* GL_OES_texture_cube_map_array */ +extern GLboolean GLAD_OES_texture_cube_map_array; +#define GL_TEXTURE_CUBE_MAP_ARRAY_OES 0x9009 +#define GL_TEXTURE_BINDING_CUBE_MAP_ARRAY_OES 0x900A +#define GL_SAMPLER_CUBE_MAP_ARRAY_OES 0x900C +#define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW_OES 0x900D +#define GL_INT_SAMPLER_CUBE_MAP_ARRAY_OES 0x900E +#define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY_OES 0x900F +#define GL_IMAGE_CUBE_MAP_ARRAY_OES 0x9054 +#define GL_INT_IMAGE_CUBE_MAP_ARRAY_OES 0x905F +#define GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY_OES 0x906A /* GL_OES_texture_float */ extern GLboolean GLAD_OES_texture_float; @@ -7879,6 +6869,30 @@ extern GLboolean GLAD_OES_texture_half_float_linear; /* GL_OES_texture_npot */ extern GLboolean GLAD_OES_texture_npot; + /* GL_OES_texture_stencil8 */ +extern GLboolean GLAD_OES_texture_stencil8; +#define GL_STENCIL_INDEX_OES 0x1901 +#define GL_STENCIL_INDEX8_OES 0x8D48 + + /* GL_OES_texture_storage_multisample_2d_array */ +extern GLboolean GLAD_OES_texture_storage_multisample_2d_array; +#define GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES 0x9102 +#define GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY_OES 0x9105 +#define GL_SAMPLER_2D_MULTISAMPLE_ARRAY_OES 0x910B +#define GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY_OES 0x910C +#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY_OES 0x910D +typedef void (APIENTRYP pfn_glTexStorage3DMultisampleOES) (GLenum, GLsizei, GLenum, GLsizei, GLsizei, GLsizei, GLboolean); +extern pfn_glTexStorage3DMultisampleOES fp_glTexStorage3DMultisampleOES; + + /* GL_OES_texture_view */ +extern GLboolean GLAD_OES_texture_view; +#define GL_TEXTURE_VIEW_MIN_LEVEL_OES 0x82DB +#define GL_TEXTURE_VIEW_NUM_LEVELS_OES 0x82DC +#define GL_TEXTURE_VIEW_MIN_LAYER_OES 0x82DD +#define GL_TEXTURE_VIEW_NUM_LAYERS_OES 0x82DE +typedef void (APIENTRYP pfn_glTextureViewOES) (GLuint, GLenum, GLuint, GLenum, GLuint, GLuint, GLuint, GLuint); +extern pfn_glTextureViewOES fp_glTextureViewOES; + /* GL_OES_vertex_array_object */ extern GLboolean GLAD_OES_vertex_array_object; #define GL_VERTEX_ARRAY_BINDING_OES 0x85B5 @@ -7959,6 +6973,108 @@ extern pfn_glBlendEquationIndexedAMD fp_glBlendEquationIndexedAMD; typedef void (APIENTRYP pfn_glBlendEquationSeparateIndexedAMD) (GLuint, GLenum, GLenum); extern pfn_glBlendEquationSeparateIndexedAMD fp_glBlendEquationSeparateIndexedAMD; + /* GL_AMD_gcn_shader */ +extern GLboolean GLAD_AMD_gcn_shader; + + /* GL_AMD_gpu_shader_int64 */ +extern GLboolean GLAD_AMD_gpu_shader_int64; +#define GL_INT64_NV 0x140E +#define GL_UNSIGNED_INT64_NV 0x140F +#define GL_INT8_NV 0x8FE0 +#define GL_INT8_VEC2_NV 0x8FE1 +#define GL_INT8_VEC3_NV 0x8FE2 +#define GL_INT8_VEC4_NV 0x8FE3 +#define GL_INT16_NV 0x8FE4 +#define GL_INT16_VEC2_NV 0x8FE5 +#define GL_INT16_VEC3_NV 0x8FE6 +#define GL_INT16_VEC4_NV 0x8FE7 +#define GL_INT64_VEC2_NV 0x8FE9 +#define GL_INT64_VEC3_NV 0x8FEA +#define GL_INT64_VEC4_NV 0x8FEB +#define GL_UNSIGNED_INT8_NV 0x8FEC +#define GL_UNSIGNED_INT8_VEC2_NV 0x8FED +#define GL_UNSIGNED_INT8_VEC3_NV 0x8FEE +#define GL_UNSIGNED_INT8_VEC4_NV 0x8FEF +#define GL_UNSIGNED_INT16_NV 0x8FF0 +#define GL_UNSIGNED_INT16_VEC2_NV 0x8FF1 +#define GL_UNSIGNED_INT16_VEC3_NV 0x8FF2 +#define GL_UNSIGNED_INT16_VEC4_NV 0x8FF3 +#define GL_UNSIGNED_INT64_VEC2_NV 0x8FF5 +#define GL_UNSIGNED_INT64_VEC3_NV 0x8FF6 +#define GL_UNSIGNED_INT64_VEC4_NV 0x8FF7 +#define GL_FLOAT16_NV 0x8FF8 +#define GL_FLOAT16_VEC2_NV 0x8FF9 +#define GL_FLOAT16_VEC3_NV 0x8FFA +#define GL_FLOAT16_VEC4_NV 0x8FFB +typedef void (APIENTRYP pfn_glUniform1i64NV) (GLint, GLint64EXT); +extern pfn_glUniform1i64NV fp_glUniform1i64NV; +typedef void (APIENTRYP pfn_glUniform2i64NV) (GLint, GLint64EXT, GLint64EXT); +extern pfn_glUniform2i64NV fp_glUniform2i64NV; +typedef void (APIENTRYP pfn_glUniform3i64NV) (GLint, GLint64EXT, GLint64EXT, GLint64EXT); +extern pfn_glUniform3i64NV fp_glUniform3i64NV; +typedef void (APIENTRYP pfn_glUniform4i64NV) (GLint, GLint64EXT, GLint64EXT, GLint64EXT, GLint64EXT); +extern pfn_glUniform4i64NV fp_glUniform4i64NV; +typedef void (APIENTRYP pfn_glUniform1i64vNV) (GLint, GLsizei, const GLint64EXT*); +extern pfn_glUniform1i64vNV fp_glUniform1i64vNV; +typedef void (APIENTRYP pfn_glUniform2i64vNV) (GLint, GLsizei, const GLint64EXT*); +extern pfn_glUniform2i64vNV fp_glUniform2i64vNV; +typedef void (APIENTRYP pfn_glUniform3i64vNV) (GLint, GLsizei, const GLint64EXT*); +extern pfn_glUniform3i64vNV fp_glUniform3i64vNV; +typedef void (APIENTRYP pfn_glUniform4i64vNV) (GLint, GLsizei, const GLint64EXT*); +extern pfn_glUniform4i64vNV fp_glUniform4i64vNV; +typedef void (APIENTRYP pfn_glUniform1ui64NV) (GLint, GLuint64EXT); +extern pfn_glUniform1ui64NV fp_glUniform1ui64NV; +typedef void (APIENTRYP pfn_glUniform2ui64NV) (GLint, GLuint64EXT, GLuint64EXT); +extern pfn_glUniform2ui64NV fp_glUniform2ui64NV; +typedef void (APIENTRYP pfn_glUniform3ui64NV) (GLint, GLuint64EXT, GLuint64EXT, GLuint64EXT); +extern pfn_glUniform3ui64NV fp_glUniform3ui64NV; +typedef void (APIENTRYP pfn_glUniform4ui64NV) (GLint, GLuint64EXT, GLuint64EXT, GLuint64EXT, GLuint64EXT); +extern pfn_glUniform4ui64NV fp_glUniform4ui64NV; +typedef void (APIENTRYP pfn_glUniform1ui64vNV) (GLint, GLsizei, const GLuint64EXT*); +extern pfn_glUniform1ui64vNV fp_glUniform1ui64vNV; +typedef void (APIENTRYP pfn_glUniform2ui64vNV) (GLint, GLsizei, const GLuint64EXT*); +extern pfn_glUniform2ui64vNV fp_glUniform2ui64vNV; +typedef void (APIENTRYP pfn_glUniform3ui64vNV) (GLint, GLsizei, const GLuint64EXT*); +extern pfn_glUniform3ui64vNV fp_glUniform3ui64vNV; +typedef void (APIENTRYP pfn_glUniform4ui64vNV) (GLint, GLsizei, const GLuint64EXT*); +extern pfn_glUniform4ui64vNV fp_glUniform4ui64vNV; +typedef void (APIENTRYP pfn_glGetUniformi64vNV) (GLuint, GLint, GLint64EXT*); +extern pfn_glGetUniformi64vNV fp_glGetUniformi64vNV; +typedef void (APIENTRYP pfn_glGetUniformui64vNV) (GLuint, GLint, GLuint64EXT*); +extern pfn_glGetUniformui64vNV fp_glGetUniformui64vNV; +typedef void (APIENTRYP pfn_glProgramUniform1i64NV) (GLuint, GLint, GLint64EXT); +extern pfn_glProgramUniform1i64NV fp_glProgramUniform1i64NV; +typedef void (APIENTRYP pfn_glProgramUniform2i64NV) (GLuint, GLint, GLint64EXT, GLint64EXT); +extern pfn_glProgramUniform2i64NV fp_glProgramUniform2i64NV; +typedef void (APIENTRYP pfn_glProgramUniform3i64NV) (GLuint, GLint, GLint64EXT, GLint64EXT, GLint64EXT); +extern pfn_glProgramUniform3i64NV fp_glProgramUniform3i64NV; +typedef void (APIENTRYP pfn_glProgramUniform4i64NV) (GLuint, GLint, GLint64EXT, GLint64EXT, GLint64EXT, GLint64EXT); +extern pfn_glProgramUniform4i64NV fp_glProgramUniform4i64NV; +typedef void (APIENTRYP pfn_glProgramUniform1i64vNV) (GLuint, GLint, GLsizei, const GLint64EXT*); +extern pfn_glProgramUniform1i64vNV fp_glProgramUniform1i64vNV; +typedef void (APIENTRYP pfn_glProgramUniform2i64vNV) (GLuint, GLint, GLsizei, const GLint64EXT*); +extern pfn_glProgramUniform2i64vNV fp_glProgramUniform2i64vNV; +typedef void (APIENTRYP pfn_glProgramUniform3i64vNV) (GLuint, GLint, GLsizei, const GLint64EXT*); +extern pfn_glProgramUniform3i64vNV fp_glProgramUniform3i64vNV; +typedef void (APIENTRYP pfn_glProgramUniform4i64vNV) (GLuint, GLint, GLsizei, const GLint64EXT*); +extern pfn_glProgramUniform4i64vNV fp_glProgramUniform4i64vNV; +typedef void (APIENTRYP pfn_glProgramUniform1ui64NV) (GLuint, GLint, GLuint64EXT); +extern pfn_glProgramUniform1ui64NV fp_glProgramUniform1ui64NV; +typedef void (APIENTRYP pfn_glProgramUniform2ui64NV) (GLuint, GLint, GLuint64EXT, GLuint64EXT); +extern pfn_glProgramUniform2ui64NV fp_glProgramUniform2ui64NV; +typedef void (APIENTRYP pfn_glProgramUniform3ui64NV) (GLuint, GLint, GLuint64EXT, GLuint64EXT, GLuint64EXT); +extern pfn_glProgramUniform3ui64NV fp_glProgramUniform3ui64NV; +typedef void (APIENTRYP pfn_glProgramUniform4ui64NV) (GLuint, GLint, GLuint64EXT, GLuint64EXT, GLuint64EXT, GLuint64EXT); +extern pfn_glProgramUniform4ui64NV fp_glProgramUniform4ui64NV; +typedef void (APIENTRYP pfn_glProgramUniform1ui64vNV) (GLuint, GLint, GLsizei, const GLuint64EXT*); +extern pfn_glProgramUniform1ui64vNV fp_glProgramUniform1ui64vNV; +typedef void (APIENTRYP pfn_glProgramUniform2ui64vNV) (GLuint, GLint, GLsizei, const GLuint64EXT*); +extern pfn_glProgramUniform2ui64vNV fp_glProgramUniform2ui64vNV; +typedef void (APIENTRYP pfn_glProgramUniform3ui64vNV) (GLuint, GLint, GLsizei, const GLuint64EXT*); +extern pfn_glProgramUniform3ui64vNV fp_glProgramUniform3ui64vNV; +typedef void (APIENTRYP pfn_glProgramUniform4ui64vNV) (GLuint, GLint, GLsizei, const GLuint64EXT*); +extern pfn_glProgramUniform4ui64vNV fp_glProgramUniform4ui64vNV; + /* GL_AMD_interleaved_elements */ extern GLboolean GLAD_AMD_interleaved_elements; #define GL_VERTEX_ELEMENT_SWIZZLE_AMD 0x91A4 @@ -7987,6 +7103,17 @@ extern pfn_glDeleteNamesAMD fp_glDeleteNamesAMD; typedef GLboolean (APIENTRYP pfn_glIsNameAMD) (GLenum, GLuint); extern pfn_glIsNameAMD fp_glIsNameAMD; + /* GL_AMD_occlusion_query_event */ +extern GLboolean GLAD_AMD_occlusion_query_event; +#define GL_OCCLUSION_QUERY_EVENT_MASK_AMD 0x874F +#define GL_QUERY_DEPTH_PASS_EVENT_BIT_AMD 0x00000001 +#define GL_QUERY_DEPTH_FAIL_EVENT_BIT_AMD 0x00000002 +#define GL_QUERY_STENCIL_FAIL_EVENT_BIT_AMD 0x00000004 +#define GL_QUERY_DEPTH_BOUNDS_FAIL_EVENT_BIT_AMD 0x00000008 +#define GL_QUERY_ALL_EVENT_BITS_AMD 0xFFFFFFFF +typedef void (APIENTRYP pfn_glQueryObjectParameteruiAMD) (GLenum, GLuint, GLenum, GLuint); +extern pfn_glQueryObjectParameteruiAMD fp_glQueryObjectParameteruiAMD; + /* GL_AMD_performance_monitor */ extern GLboolean GLAD_AMD_performance_monitor; #define GL_COUNTER_TYPE_AMD 0x8BC0 @@ -8082,6 +7209,10 @@ extern GLboolean GLAD_AMD_texture_texture4; /* GL_AMD_transform_feedback3_lines_triangles */ extern GLboolean GLAD_AMD_transform_feedback3_lines_triangles; + /* GL_AMD_transform_feedback4 */ +extern GLboolean GLAD_AMD_transform_feedback4; +#define GL_STREAM_RASTERIZATION_AMD 0x91A0 + /* GL_AMD_vertex_shader_layer */ extern GLboolean GLAD_AMD_vertex_shader_layer; @@ -8102,6 +7233,9 @@ extern pfn_glTessellationModeAMD fp_glTessellationModeAMD; /* GL_AMD_vertex_shader_viewport_index */ extern GLboolean GLAD_AMD_vertex_shader_viewport_index; + /* GL_ANDROID_extension_pack_es31a */ +extern GLboolean GLAD_ANDROID_extension_pack_es31a; + /* GL_ANGLE_depth_texture */ extern GLboolean GLAD_ANGLE_depth_texture; @@ -8167,6 +7301,21 @@ extern GLboolean GLAD_APPLE_aux_depth_stencil; extern GLboolean GLAD_APPLE_client_storage; #define GL_UNPACK_CLIENT_STORAGE_APPLE 0x85B2 + /* GL_APPLE_clip_distance */ +extern GLboolean GLAD_APPLE_clip_distance; +#define GL_MAX_CLIP_DISTANCES_APPLE 0x0D32 +#define GL_CLIP_DISTANCE0_APPLE 0x3000 +#define GL_CLIP_DISTANCE1_APPLE 0x3001 +#define GL_CLIP_DISTANCE2_APPLE 0x3002 +#define GL_CLIP_DISTANCE3_APPLE 0x3003 +#define GL_CLIP_DISTANCE4_APPLE 0x3004 +#define GL_CLIP_DISTANCE5_APPLE 0x3005 +#define GL_CLIP_DISTANCE6_APPLE 0x3006 +#define GL_CLIP_DISTANCE7_APPLE 0x3007 + + /* GL_APPLE_color_buffer_packed_float */ +extern GLboolean GLAD_APPLE_color_buffer_packed_float; + /* GL_APPLE_copy_texture_levels */ extern GLboolean GLAD_APPLE_copy_texture_levels; typedef void (APIENTRYP pfn_glCopyTextureLevelsAPPLE) (GLuint, GLuint, GLint, GLsizei); @@ -8276,10 +7425,6 @@ extern GLboolean GLAD_APPLE_row_bytes; #define GL_PACK_ROW_BYTES_APPLE 0x8A15 #define GL_UNPACK_ROW_BYTES_APPLE 0x8A16 - /* GL_APPLE_specular_vector */ -extern GLboolean GLAD_APPLE_specular_vector; -#define GL_LIGHT_MODEL_SPECULAR_VECTOR_APPLE 0x85B0 - /* GL_APPLE_sync */ extern GLboolean GLAD_APPLE_sync; #define GL_SYNC_OBJECT_APPLE 0x8A53 @@ -8320,6 +7465,13 @@ extern GLboolean GLAD_APPLE_texture_format_BGRA8888; extern GLboolean GLAD_APPLE_texture_max_level; #define GL_TEXTURE_MAX_LEVEL_APPLE 0x813D + /* GL_APPLE_texture_packed_float */ +extern GLboolean GLAD_APPLE_texture_packed_float; +#define GL_UNSIGNED_INT_10F_11F_11F_REV_APPLE 0x8C3B +#define GL_UNSIGNED_INT_5_9_9_9_REV_APPLE 0x8C3E +#define GL_R11F_G11F_B10F_APPLE 0x8C3A +#define GL_RGB9_E5_APPLE 0x8C3D + /* GL_APPLE_texture_range */ extern GLboolean GLAD_APPLE_texture_range; #define GL_TEXTURE_RANGE_LENGTH_APPLE 0x85B7 @@ -8333,10 +7485,6 @@ extern pfn_glTextureRangeAPPLE fp_glTextureRangeAPPLE; typedef void (APIENTRYP pfn_glGetTexParameterPointervAPPLE) (GLenum, GLenum, void**); extern pfn_glGetTexParameterPointervAPPLE fp_glGetTexParameterPointervAPPLE; - /* GL_APPLE_transform_hint */ -extern GLboolean GLAD_APPLE_transform_hint; -#define GL_TRANSFORM_HINT_APPLE 0x85B1 - /* GL_APPLE_vertex_array_object */ extern GLboolean GLAD_APPLE_vertex_array_object; #define GL_VERTEX_ARRAY_BINDING_APPLE 0x85B5 @@ -8405,200 +7553,13 @@ extern GLboolean GLAD_ARM_mali_shader_binary; /* GL_ARM_rgba8 */ extern GLboolean GLAD_ARM_rgba8; - /* GL_ATI_draw_buffers */ -extern GLboolean GLAD_ATI_draw_buffers; -#define GL_MAX_DRAW_BUFFERS_ATI 0x8824 -#define GL_DRAW_BUFFER0_ATI 0x8825 -#define GL_DRAW_BUFFER1_ATI 0x8826 -#define GL_DRAW_BUFFER2_ATI 0x8827 -#define GL_DRAW_BUFFER3_ATI 0x8828 -#define GL_DRAW_BUFFER4_ATI 0x8829 -#define GL_DRAW_BUFFER5_ATI 0x882A -#define GL_DRAW_BUFFER6_ATI 0x882B -#define GL_DRAW_BUFFER7_ATI 0x882C -#define GL_DRAW_BUFFER8_ATI 0x882D -#define GL_DRAW_BUFFER9_ATI 0x882E -#define GL_DRAW_BUFFER10_ATI 0x882F -#define GL_DRAW_BUFFER11_ATI 0x8830 -#define GL_DRAW_BUFFER12_ATI 0x8831 -#define GL_DRAW_BUFFER13_ATI 0x8832 -#define GL_DRAW_BUFFER14_ATI 0x8833 -#define GL_DRAW_BUFFER15_ATI 0x8834 -typedef void (APIENTRYP pfn_glDrawBuffersATI) (GLsizei, const GLenum*); -extern pfn_glDrawBuffersATI fp_glDrawBuffersATI; + /* GL_ARM_shader_framebuffer_fetch */ +extern GLboolean GLAD_ARM_shader_framebuffer_fetch; +#define GL_FETCH_PER_SAMPLE_ARM 0x8F65 +#define GL_FRAGMENT_SHADER_FRAMEBUFFER_FETCH_MRT_ARM 0x8F66 - /* GL_ATI_element_array */ -extern GLboolean GLAD_ATI_element_array; -#define GL_ELEMENT_ARRAY_ATI 0x8768 -#define GL_ELEMENT_ARRAY_TYPE_ATI 0x8769 -#define GL_ELEMENT_ARRAY_POINTER_ATI 0x876A -typedef void (APIENTRYP pfn_glElementPointerATI) (GLenum, const void*); -extern pfn_glElementPointerATI fp_glElementPointerATI; -typedef void (APIENTRYP pfn_glDrawElementArrayATI) (GLenum, GLsizei); -extern pfn_glDrawElementArrayATI fp_glDrawElementArrayATI; -typedef void (APIENTRYP pfn_glDrawRangeElementArrayATI) (GLenum, GLuint, GLuint, GLsizei); -extern pfn_glDrawRangeElementArrayATI fp_glDrawRangeElementArrayATI; - - /* GL_ATI_envmap_bumpmap */ -extern GLboolean GLAD_ATI_envmap_bumpmap; -#define GL_BUMP_ROT_MATRIX_ATI 0x8775 -#define GL_BUMP_ROT_MATRIX_SIZE_ATI 0x8776 -#define GL_BUMP_NUM_TEX_UNITS_ATI 0x8777 -#define GL_BUMP_TEX_UNITS_ATI 0x8778 -#define GL_DUDV_ATI 0x8779 -#define GL_DU8DV8_ATI 0x877A -#define GL_BUMP_ENVMAP_ATI 0x877B -#define GL_BUMP_TARGET_ATI 0x877C -typedef void (APIENTRYP pfn_glTexBumpParameterivATI) (GLenum, const GLint*); -extern pfn_glTexBumpParameterivATI fp_glTexBumpParameterivATI; -typedef void (APIENTRYP pfn_glTexBumpParameterfvATI) (GLenum, const GLfloat*); -extern pfn_glTexBumpParameterfvATI fp_glTexBumpParameterfvATI; -typedef void (APIENTRYP pfn_glGetTexBumpParameterivATI) (GLenum, GLint*); -extern pfn_glGetTexBumpParameterivATI fp_glGetTexBumpParameterivATI; -typedef void (APIENTRYP pfn_glGetTexBumpParameterfvATI) (GLenum, GLfloat*); -extern pfn_glGetTexBumpParameterfvATI fp_glGetTexBumpParameterfvATI; - - /* GL_ATI_fragment_shader */ -extern GLboolean GLAD_ATI_fragment_shader; -#define GL_FRAGMENT_SHADER_ATI 0x8920 -#define GL_REG_0_ATI 0x8921 -#define GL_REG_1_ATI 0x8922 -#define GL_REG_2_ATI 0x8923 -#define GL_REG_3_ATI 0x8924 -#define GL_REG_4_ATI 0x8925 -#define GL_REG_5_ATI 0x8926 -#define GL_REG_6_ATI 0x8927 -#define GL_REG_7_ATI 0x8928 -#define GL_REG_8_ATI 0x8929 -#define GL_REG_9_ATI 0x892A -#define GL_REG_10_ATI 0x892B -#define GL_REG_11_ATI 0x892C -#define GL_REG_12_ATI 0x892D -#define GL_REG_13_ATI 0x892E -#define GL_REG_14_ATI 0x892F -#define GL_REG_15_ATI 0x8930 -#define GL_REG_16_ATI 0x8931 -#define GL_REG_17_ATI 0x8932 -#define GL_REG_18_ATI 0x8933 -#define GL_REG_19_ATI 0x8934 -#define GL_REG_20_ATI 0x8935 -#define GL_REG_21_ATI 0x8936 -#define GL_REG_22_ATI 0x8937 -#define GL_REG_23_ATI 0x8938 -#define GL_REG_24_ATI 0x8939 -#define GL_REG_25_ATI 0x893A -#define GL_REG_26_ATI 0x893B -#define GL_REG_27_ATI 0x893C -#define GL_REG_28_ATI 0x893D -#define GL_REG_29_ATI 0x893E -#define GL_REG_30_ATI 0x893F -#define GL_REG_31_ATI 0x8940 -#define GL_CON_0_ATI 0x8941 -#define GL_CON_1_ATI 0x8942 -#define GL_CON_2_ATI 0x8943 -#define GL_CON_3_ATI 0x8944 -#define GL_CON_4_ATI 0x8945 -#define GL_CON_5_ATI 0x8946 -#define GL_CON_6_ATI 0x8947 -#define GL_CON_7_ATI 0x8948 -#define GL_CON_8_ATI 0x8949 -#define GL_CON_9_ATI 0x894A -#define GL_CON_10_ATI 0x894B -#define GL_CON_11_ATI 0x894C -#define GL_CON_12_ATI 0x894D -#define GL_CON_13_ATI 0x894E -#define GL_CON_14_ATI 0x894F -#define GL_CON_15_ATI 0x8950 -#define GL_CON_16_ATI 0x8951 -#define GL_CON_17_ATI 0x8952 -#define GL_CON_18_ATI 0x8953 -#define GL_CON_19_ATI 0x8954 -#define GL_CON_20_ATI 0x8955 -#define GL_CON_21_ATI 0x8956 -#define GL_CON_22_ATI 0x8957 -#define GL_CON_23_ATI 0x8958 -#define GL_CON_24_ATI 0x8959 -#define GL_CON_25_ATI 0x895A -#define GL_CON_26_ATI 0x895B -#define GL_CON_27_ATI 0x895C -#define GL_CON_28_ATI 0x895D -#define GL_CON_29_ATI 0x895E -#define GL_CON_30_ATI 0x895F -#define GL_CON_31_ATI 0x8960 -#define GL_MOV_ATI 0x8961 -#define GL_ADD_ATI 0x8963 -#define GL_MUL_ATI 0x8964 -#define GL_SUB_ATI 0x8965 -#define GL_DOT3_ATI 0x8966 -#define GL_DOT4_ATI 0x8967 -#define GL_MAD_ATI 0x8968 -#define GL_LERP_ATI 0x8969 -#define GL_CND_ATI 0x896A -#define GL_CND0_ATI 0x896B -#define GL_DOT2_ADD_ATI 0x896C -#define GL_SECONDARY_INTERPOLATOR_ATI 0x896D -#define GL_NUM_FRAGMENT_REGISTERS_ATI 0x896E -#define GL_NUM_FRAGMENT_CONSTANTS_ATI 0x896F -#define GL_NUM_PASSES_ATI 0x8970 -#define GL_NUM_INSTRUCTIONS_PER_PASS_ATI 0x8971 -#define GL_NUM_INSTRUCTIONS_TOTAL_ATI 0x8972 -#define GL_NUM_INPUT_INTERPOLATOR_COMPONENTS_ATI 0x8973 -#define GL_NUM_LOOPBACK_COMPONENTS_ATI 0x8974 -#define GL_COLOR_ALPHA_PAIRING_ATI 0x8975 -#define GL_SWIZZLE_STR_ATI 0x8976 -#define GL_SWIZZLE_STQ_ATI 0x8977 -#define GL_SWIZZLE_STR_DR_ATI 0x8978 -#define GL_SWIZZLE_STQ_DQ_ATI 0x8979 -#define GL_SWIZZLE_STRQ_ATI 0x897A -#define GL_SWIZZLE_STRQ_DQ_ATI 0x897B -#define GL_RED_BIT_ATI 0x00000001 -#define GL_GREEN_BIT_ATI 0x00000002 -#define GL_BLUE_BIT_ATI 0x00000004 -#define GL_2X_BIT_ATI 0x00000001 -#define GL_4X_BIT_ATI 0x00000002 -#define GL_8X_BIT_ATI 0x00000004 -#define GL_HALF_BIT_ATI 0x00000008 -#define GL_QUARTER_BIT_ATI 0x00000010 -#define GL_EIGHTH_BIT_ATI 0x00000020 -#define GL_SATURATE_BIT_ATI 0x00000040 -#define GL_COMP_BIT_ATI 0x00000002 -#define GL_NEGATE_BIT_ATI 0x00000004 -#define GL_BIAS_BIT_ATI 0x00000008 -typedef GLuint (APIENTRYP pfn_glGenFragmentShadersATI) (GLuint); -extern pfn_glGenFragmentShadersATI fp_glGenFragmentShadersATI; -typedef void (APIENTRYP pfn_glBindFragmentShaderATI) (GLuint); -extern pfn_glBindFragmentShaderATI fp_glBindFragmentShaderATI; -typedef void (APIENTRYP pfn_glDeleteFragmentShaderATI) (GLuint); -extern pfn_glDeleteFragmentShaderATI fp_glDeleteFragmentShaderATI; -typedef void (APIENTRYP pfn_glBeginFragmentShaderATI) (); -extern pfn_glBeginFragmentShaderATI fp_glBeginFragmentShaderATI; -typedef void (APIENTRYP pfn_glEndFragmentShaderATI) (); -extern pfn_glEndFragmentShaderATI fp_glEndFragmentShaderATI; -typedef void (APIENTRYP pfn_glPassTexCoordATI) (GLuint, GLuint, GLenum); -extern pfn_glPassTexCoordATI fp_glPassTexCoordATI; -typedef void (APIENTRYP pfn_glSampleMapATI) (GLuint, GLuint, GLenum); -extern pfn_glSampleMapATI fp_glSampleMapATI; -typedef void (APIENTRYP pfn_glColorFragmentOp1ATI) (GLenum, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint); -extern pfn_glColorFragmentOp1ATI fp_glColorFragmentOp1ATI; -typedef void (APIENTRYP pfn_glColorFragmentOp2ATI) (GLenum, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint); -extern pfn_glColorFragmentOp2ATI fp_glColorFragmentOp2ATI; -typedef void (APIENTRYP pfn_glColorFragmentOp3ATI) (GLenum, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint); -extern pfn_glColorFragmentOp3ATI fp_glColorFragmentOp3ATI; -typedef void (APIENTRYP pfn_glAlphaFragmentOp1ATI) (GLenum, GLuint, GLuint, GLuint, GLuint, GLuint); -extern pfn_glAlphaFragmentOp1ATI fp_glAlphaFragmentOp1ATI; -typedef void (APIENTRYP pfn_glAlphaFragmentOp2ATI) (GLenum, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint); -extern pfn_glAlphaFragmentOp2ATI fp_glAlphaFragmentOp2ATI; -typedef void (APIENTRYP pfn_glAlphaFragmentOp3ATI) (GLenum, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint); -extern pfn_glAlphaFragmentOp3ATI fp_glAlphaFragmentOp3ATI; -typedef void (APIENTRYP pfn_glSetFragmentShaderConstantATI) (GLuint, const GLfloat*); -extern pfn_glSetFragmentShaderConstantATI fp_glSetFragmentShaderConstantATI; - - /* GL_ATI_map_object_buffer */ -extern GLboolean GLAD_ATI_map_object_buffer; -typedef void* (APIENTRYP pfn_glMapObjectBufferATI) (GLuint); -extern pfn_glMapObjectBufferATI fp_glMapObjectBufferATI; -typedef void (APIENTRYP pfn_glUnmapObjectBufferATI) (GLuint); -extern pfn_glUnmapObjectBufferATI fp_glUnmapObjectBufferATI; + /* GL_ARM_shader_framebuffer_fetch_depth_stencil */ +extern GLboolean GLAD_ARM_shader_framebuffer_fetch_depth_stencil; /* GL_ATI_meminfo */ extern GLboolean GLAD_ATI_meminfo; @@ -8611,209 +7572,11 @@ extern GLboolean GLAD_ATI_pixel_format_float; #define GL_RGBA_FLOAT_MODE_ATI 0x8820 #define GL_COLOR_CLEAR_UNCLAMPED_VALUE_ATI 0x8835 - /* GL_ATI_pn_triangles */ -extern GLboolean GLAD_ATI_pn_triangles; -#define GL_PN_TRIANGLES_ATI 0x87F0 -#define GL_MAX_PN_TRIANGLES_TESSELATION_LEVEL_ATI 0x87F1 -#define GL_PN_TRIANGLES_POINT_MODE_ATI 0x87F2 -#define GL_PN_TRIANGLES_NORMAL_MODE_ATI 0x87F3 -#define GL_PN_TRIANGLES_TESSELATION_LEVEL_ATI 0x87F4 -#define GL_PN_TRIANGLES_POINT_MODE_LINEAR_ATI 0x87F5 -#define GL_PN_TRIANGLES_POINT_MODE_CUBIC_ATI 0x87F6 -#define GL_PN_TRIANGLES_NORMAL_MODE_LINEAR_ATI 0x87F7 -#define GL_PN_TRIANGLES_NORMAL_MODE_QUADRATIC_ATI 0x87F8 -typedef void (APIENTRYP pfn_glPNTrianglesiATI) (GLenum, GLint); -extern pfn_glPNTrianglesiATI fp_glPNTrianglesiATI; -typedef void (APIENTRYP pfn_glPNTrianglesfATI) (GLenum, GLfloat); -extern pfn_glPNTrianglesfATI fp_glPNTrianglesfATI; - - /* GL_ATI_separate_stencil */ -extern GLboolean GLAD_ATI_separate_stencil; -#define GL_STENCIL_BACK_FUNC_ATI 0x8800 -#define GL_STENCIL_BACK_FAIL_ATI 0x8801 -#define GL_STENCIL_BACK_PASS_DEPTH_FAIL_ATI 0x8802 -#define GL_STENCIL_BACK_PASS_DEPTH_PASS_ATI 0x8803 -typedef void (APIENTRYP pfn_glStencilOpSeparateATI) (GLenum, GLenum, GLenum, GLenum); -extern pfn_glStencilOpSeparateATI fp_glStencilOpSeparateATI; -typedef void (APIENTRYP pfn_glStencilFuncSeparateATI) (GLenum, GLenum, GLint, GLuint); -extern pfn_glStencilFuncSeparateATI fp_glStencilFuncSeparateATI; - - /* GL_ATI_text_fragment_shader */ -extern GLboolean GLAD_ATI_text_fragment_shader; -#define GL_TEXT_FRAGMENT_SHADER_ATI 0x8200 - - /* GL_ATI_texture_env_combine3 */ -extern GLboolean GLAD_ATI_texture_env_combine3; -#define GL_MODULATE_ADD_ATI 0x8744 -#define GL_MODULATE_SIGNED_ADD_ATI 0x8745 -#define GL_MODULATE_SUBTRACT_ATI 0x8746 - - /* GL_ATI_texture_float */ -extern GLboolean GLAD_ATI_texture_float; -#define GL_RGBA_FLOAT32_ATI 0x8814 -#define GL_RGB_FLOAT32_ATI 0x8815 -#define GL_ALPHA_FLOAT32_ATI 0x8816 -#define GL_INTENSITY_FLOAT32_ATI 0x8817 -#define GL_LUMINANCE_FLOAT32_ATI 0x8818 -#define GL_LUMINANCE_ALPHA_FLOAT32_ATI 0x8819 -#define GL_RGBA_FLOAT16_ATI 0x881A -#define GL_RGB_FLOAT16_ATI 0x881B -#define GL_ALPHA_FLOAT16_ATI 0x881C -#define GL_INTENSITY_FLOAT16_ATI 0x881D -#define GL_LUMINANCE_FLOAT16_ATI 0x881E -#define GL_LUMINANCE_ALPHA_FLOAT16_ATI 0x881F - - /* GL_ATI_texture_mirror_once */ -extern GLboolean GLAD_ATI_texture_mirror_once; -#define GL_MIRROR_CLAMP_ATI 0x8742 -#define GL_MIRROR_CLAMP_TO_EDGE_ATI 0x8743 - - /* GL_ATI_vertex_array_object */ -extern GLboolean GLAD_ATI_vertex_array_object; -#define GL_STATIC_ATI 0x8760 -#define GL_DYNAMIC_ATI 0x8761 -#define GL_PRESERVE_ATI 0x8762 -#define GL_DISCARD_ATI 0x8763 -#define GL_OBJECT_BUFFER_SIZE_ATI 0x8764 -#define GL_OBJECT_BUFFER_USAGE_ATI 0x8765 -#define GL_ARRAY_OBJECT_BUFFER_ATI 0x8766 -#define GL_ARRAY_OBJECT_OFFSET_ATI 0x8767 -typedef GLuint (APIENTRYP pfn_glNewObjectBufferATI) (GLsizei, const void*, GLenum); -extern pfn_glNewObjectBufferATI fp_glNewObjectBufferATI; -typedef GLboolean (APIENTRYP pfn_glIsObjectBufferATI) (GLuint); -extern pfn_glIsObjectBufferATI fp_glIsObjectBufferATI; -typedef void (APIENTRYP pfn_glUpdateObjectBufferATI) (GLuint, GLuint, GLsizei, const void*, GLenum); -extern pfn_glUpdateObjectBufferATI fp_glUpdateObjectBufferATI; -typedef void (APIENTRYP pfn_glGetObjectBufferfvATI) (GLuint, GLenum, GLfloat*); -extern pfn_glGetObjectBufferfvATI fp_glGetObjectBufferfvATI; -typedef void (APIENTRYP pfn_glGetObjectBufferivATI) (GLuint, GLenum, GLint*); -extern pfn_glGetObjectBufferivATI fp_glGetObjectBufferivATI; -typedef void (APIENTRYP pfn_glFreeObjectBufferATI) (GLuint); -extern pfn_glFreeObjectBufferATI fp_glFreeObjectBufferATI; -typedef void (APIENTRYP pfn_glArrayObjectATI) (GLenum, GLint, GLenum, GLsizei, GLuint, GLuint); -extern pfn_glArrayObjectATI fp_glArrayObjectATI; -typedef void (APIENTRYP pfn_glGetArrayObjectfvATI) (GLenum, GLenum, GLfloat*); -extern pfn_glGetArrayObjectfvATI fp_glGetArrayObjectfvATI; -typedef void (APIENTRYP pfn_glGetArrayObjectivATI) (GLenum, GLenum, GLint*); -extern pfn_glGetArrayObjectivATI fp_glGetArrayObjectivATI; -typedef void (APIENTRYP pfn_glVariantArrayObjectATI) (GLuint, GLenum, GLsizei, GLuint, GLuint); -extern pfn_glVariantArrayObjectATI fp_glVariantArrayObjectATI; -typedef void (APIENTRYP pfn_glGetVariantArrayObjectfvATI) (GLuint, GLenum, GLfloat*); -extern pfn_glGetVariantArrayObjectfvATI fp_glGetVariantArrayObjectfvATI; -typedef void (APIENTRYP pfn_glGetVariantArrayObjectivATI) (GLuint, GLenum, GLint*); -extern pfn_glGetVariantArrayObjectivATI fp_glGetVariantArrayObjectivATI; - - /* GL_ATI_vertex_attrib_array_object */ -extern GLboolean GLAD_ATI_vertex_attrib_array_object; -typedef void (APIENTRYP pfn_glVertexAttribArrayObjectATI) (GLuint, GLint, GLenum, GLboolean, GLsizei, GLuint, GLuint); -extern pfn_glVertexAttribArrayObjectATI fp_glVertexAttribArrayObjectATI; -typedef void (APIENTRYP pfn_glGetVertexAttribArrayObjectfvATI) (GLuint, GLenum, GLfloat*); -extern pfn_glGetVertexAttribArrayObjectfvATI fp_glGetVertexAttribArrayObjectfvATI; -typedef void (APIENTRYP pfn_glGetVertexAttribArrayObjectivATI) (GLuint, GLenum, GLint*); -extern pfn_glGetVertexAttribArrayObjectivATI fp_glGetVertexAttribArrayObjectivATI; - - /* GL_ATI_vertex_streams */ -extern GLboolean GLAD_ATI_vertex_streams; -#define GL_MAX_VERTEX_STREAMS_ATI 0x876B -#define GL_VERTEX_STREAM0_ATI 0x876C -#define GL_VERTEX_STREAM1_ATI 0x876D -#define GL_VERTEX_STREAM2_ATI 0x876E -#define GL_VERTEX_STREAM3_ATI 0x876F -#define GL_VERTEX_STREAM4_ATI 0x8770 -#define GL_VERTEX_STREAM5_ATI 0x8771 -#define GL_VERTEX_STREAM6_ATI 0x8772 -#define GL_VERTEX_STREAM7_ATI 0x8773 -#define GL_VERTEX_SOURCE_ATI 0x8774 -typedef void (APIENTRYP pfn_glVertexStream1sATI) (GLenum, GLshort); -extern pfn_glVertexStream1sATI fp_glVertexStream1sATI; -typedef void (APIENTRYP pfn_glVertexStream1svATI) (GLenum, const GLshort*); -extern pfn_glVertexStream1svATI fp_glVertexStream1svATI; -typedef void (APIENTRYP pfn_glVertexStream1iATI) (GLenum, GLint); -extern pfn_glVertexStream1iATI fp_glVertexStream1iATI; -typedef void (APIENTRYP pfn_glVertexStream1ivATI) (GLenum, const GLint*); -extern pfn_glVertexStream1ivATI fp_glVertexStream1ivATI; -typedef void (APIENTRYP pfn_glVertexStream1fATI) (GLenum, GLfloat); -extern pfn_glVertexStream1fATI fp_glVertexStream1fATI; -typedef void (APIENTRYP pfn_glVertexStream1fvATI) (GLenum, const GLfloat*); -extern pfn_glVertexStream1fvATI fp_glVertexStream1fvATI; -typedef void (APIENTRYP pfn_glVertexStream1dATI) (GLenum, GLdouble); -extern pfn_glVertexStream1dATI fp_glVertexStream1dATI; -typedef void (APIENTRYP pfn_glVertexStream1dvATI) (GLenum, const GLdouble*); -extern pfn_glVertexStream1dvATI fp_glVertexStream1dvATI; -typedef void (APIENTRYP pfn_glVertexStream2sATI) (GLenum, GLshort, GLshort); -extern pfn_glVertexStream2sATI fp_glVertexStream2sATI; -typedef void (APIENTRYP pfn_glVertexStream2svATI) (GLenum, const GLshort*); -extern pfn_glVertexStream2svATI fp_glVertexStream2svATI; -typedef void (APIENTRYP pfn_glVertexStream2iATI) (GLenum, GLint, GLint); -extern pfn_glVertexStream2iATI fp_glVertexStream2iATI; -typedef void (APIENTRYP pfn_glVertexStream2ivATI) (GLenum, const GLint*); -extern pfn_glVertexStream2ivATI fp_glVertexStream2ivATI; -typedef void (APIENTRYP pfn_glVertexStream2fATI) (GLenum, GLfloat, GLfloat); -extern pfn_glVertexStream2fATI fp_glVertexStream2fATI; -typedef void (APIENTRYP pfn_glVertexStream2fvATI) (GLenum, const GLfloat*); -extern pfn_glVertexStream2fvATI fp_glVertexStream2fvATI; -typedef void (APIENTRYP pfn_glVertexStream2dATI) (GLenum, GLdouble, GLdouble); -extern pfn_glVertexStream2dATI fp_glVertexStream2dATI; -typedef void (APIENTRYP pfn_glVertexStream2dvATI) (GLenum, const GLdouble*); -extern pfn_glVertexStream2dvATI fp_glVertexStream2dvATI; -typedef void (APIENTRYP pfn_glVertexStream3sATI) (GLenum, GLshort, GLshort, GLshort); -extern pfn_glVertexStream3sATI fp_glVertexStream3sATI; -typedef void (APIENTRYP pfn_glVertexStream3svATI) (GLenum, const GLshort*); -extern pfn_glVertexStream3svATI fp_glVertexStream3svATI; -typedef void (APIENTRYP pfn_glVertexStream3iATI) (GLenum, GLint, GLint, GLint); -extern pfn_glVertexStream3iATI fp_glVertexStream3iATI; -typedef void (APIENTRYP pfn_glVertexStream3ivATI) (GLenum, const GLint*); -extern pfn_glVertexStream3ivATI fp_glVertexStream3ivATI; -typedef void (APIENTRYP pfn_glVertexStream3fATI) (GLenum, GLfloat, GLfloat, GLfloat); -extern pfn_glVertexStream3fATI fp_glVertexStream3fATI; -typedef void (APIENTRYP pfn_glVertexStream3fvATI) (GLenum, const GLfloat*); -extern pfn_glVertexStream3fvATI fp_glVertexStream3fvATI; -typedef void (APIENTRYP pfn_glVertexStream3dATI) (GLenum, GLdouble, GLdouble, GLdouble); -extern pfn_glVertexStream3dATI fp_glVertexStream3dATI; -typedef void (APIENTRYP pfn_glVertexStream3dvATI) (GLenum, const GLdouble*); -extern pfn_glVertexStream3dvATI fp_glVertexStream3dvATI; -typedef void (APIENTRYP pfn_glVertexStream4sATI) (GLenum, GLshort, GLshort, GLshort, GLshort); -extern pfn_glVertexStream4sATI fp_glVertexStream4sATI; -typedef void (APIENTRYP pfn_glVertexStream4svATI) (GLenum, const GLshort*); -extern pfn_glVertexStream4svATI fp_glVertexStream4svATI; -typedef void (APIENTRYP pfn_glVertexStream4iATI) (GLenum, GLint, GLint, GLint, GLint); -extern pfn_glVertexStream4iATI fp_glVertexStream4iATI; -typedef void (APIENTRYP pfn_glVertexStream4ivATI) (GLenum, const GLint*); -extern pfn_glVertexStream4ivATI fp_glVertexStream4ivATI; -typedef void (APIENTRYP pfn_glVertexStream4fATI) (GLenum, GLfloat, GLfloat, GLfloat, GLfloat); -extern pfn_glVertexStream4fATI fp_glVertexStream4fATI; -typedef void (APIENTRYP pfn_glVertexStream4fvATI) (GLenum, const GLfloat*); -extern pfn_glVertexStream4fvATI fp_glVertexStream4fvATI; -typedef void (APIENTRYP pfn_glVertexStream4dATI) (GLenum, GLdouble, GLdouble, GLdouble, GLdouble); -extern pfn_glVertexStream4dATI fp_glVertexStream4dATI; -typedef void (APIENTRYP pfn_glVertexStream4dvATI) (GLenum, const GLdouble*); -extern pfn_glVertexStream4dvATI fp_glVertexStream4dvATI; -typedef void (APIENTRYP pfn_glNormalStream3bATI) (GLenum, GLbyte, GLbyte, GLbyte); -extern pfn_glNormalStream3bATI fp_glNormalStream3bATI; -typedef void (APIENTRYP pfn_glNormalStream3bvATI) (GLenum, const GLbyte*); -extern pfn_glNormalStream3bvATI fp_glNormalStream3bvATI; -typedef void (APIENTRYP pfn_glNormalStream3sATI) (GLenum, GLshort, GLshort, GLshort); -extern pfn_glNormalStream3sATI fp_glNormalStream3sATI; -typedef void (APIENTRYP pfn_glNormalStream3svATI) (GLenum, const GLshort*); -extern pfn_glNormalStream3svATI fp_glNormalStream3svATI; -typedef void (APIENTRYP pfn_glNormalStream3iATI) (GLenum, GLint, GLint, GLint); -extern pfn_glNormalStream3iATI fp_glNormalStream3iATI; -typedef void (APIENTRYP pfn_glNormalStream3ivATI) (GLenum, const GLint*); -extern pfn_glNormalStream3ivATI fp_glNormalStream3ivATI; -typedef void (APIENTRYP pfn_glNormalStream3fATI) (GLenum, GLfloat, GLfloat, GLfloat); -extern pfn_glNormalStream3fATI fp_glNormalStream3fATI; -typedef void (APIENTRYP pfn_glNormalStream3fvATI) (GLenum, const GLfloat*); -extern pfn_glNormalStream3fvATI fp_glNormalStream3fvATI; -typedef void (APIENTRYP pfn_glNormalStream3dATI) (GLenum, GLdouble, GLdouble, GLdouble); -extern pfn_glNormalStream3dATI fp_glNormalStream3dATI; -typedef void (APIENTRYP pfn_glNormalStream3dvATI) (GLenum, const GLdouble*); -extern pfn_glNormalStream3dvATI fp_glNormalStream3dvATI; -typedef void (APIENTRYP pfn_glClientActiveVertexStreamATI) (GLenum); -extern pfn_glClientActiveVertexStreamATI fp_glClientActiveVertexStreamATI; -typedef void (APIENTRYP pfn_glVertexBlendEnviATI) (GLenum, GLint); -extern pfn_glVertexBlendEnviATI fp_glVertexBlendEnviATI; -typedef void (APIENTRYP pfn_glVertexBlendEnvfATI) (GLenum, GLfloat); -extern pfn_glVertexBlendEnvfATI fp_glVertexBlendEnvfATI; + /* GL_DMP_program_binary */ +extern GLboolean GLAD_DMP_program_binary; +#define GL_SMAPHS30_PROGRAM_BINARY_DMP 0x9251 +#define GL_SMAPHS_PROGRAM_BINARY_DMP 0x9252 +#define GL_DMP_PROGRAM_BINARY_DMP 0x9253 /* GL_DMP_shader_binary */ extern GLboolean GLAD_DMP_shader_binary; @@ -8833,10 +7596,6 @@ extern GLboolean GLAD_GREMEDY_string_marker; typedef void (APIENTRYP pfn_glStringMarkerGREMEDY) (GLsizei, const void*); extern pfn_glStringMarkerGREMEDY fp_glStringMarkerGREMEDY; - /* GL_IBM_rasterpos_clip */ -extern GLboolean GLAD_IBM_rasterpos_clip; -#define GL_RASTER_POSITION_UNCLIPPED_IBM 0x19262 - /* GL_IMG_multisampled_render_to_texture */ extern GLboolean GLAD_IMG_multisampled_render_to_texture; #define GL_RENDERBUFFER_SAMPLES_IMG 0x9133 @@ -8894,82 +7653,53 @@ extern pfn_glUnmapTexture2DINTEL fp_glUnmapTexture2DINTEL; typedef void* (APIENTRYP pfn_glMapTexture2DINTEL) (GLuint, GLint, GLbitfield, GLint*, GLenum*); extern pfn_glMapTexture2DINTEL fp_glMapTexture2DINTEL; - /* GL_INTEL_parallel_arrays */ -extern GLboolean GLAD_INTEL_parallel_arrays; -#define GL_PARALLEL_ARRAYS_INTEL 0x83F4 -#define GL_VERTEX_ARRAY_PARALLEL_POINTERS_INTEL 0x83F5 -#define GL_NORMAL_ARRAY_PARALLEL_POINTERS_INTEL 0x83F6 -#define GL_COLOR_ARRAY_PARALLEL_POINTERS_INTEL 0x83F7 -#define GL_TEXTURE_COORD_ARRAY_PARALLEL_POINTERS_INTEL 0x83F8 -typedef void (APIENTRYP pfn_glVertexPointervINTEL) (GLint, GLenum, const void**); -extern pfn_glVertexPointervINTEL fp_glVertexPointervINTEL; -typedef void (APIENTRYP pfn_glNormalPointervINTEL) (GLenum, const void**); -extern pfn_glNormalPointervINTEL fp_glNormalPointervINTEL; -typedef void (APIENTRYP pfn_glColorPointervINTEL) (GLint, GLenum, const void**); -extern pfn_glColorPointervINTEL fp_glColorPointervINTEL; -typedef void (APIENTRYP pfn_glTexCoordPointervINTEL) (GLint, GLenum, const void**); -extern pfn_glTexCoordPointervINTEL fp_glTexCoordPointervINTEL; + /* GL_INTEL_performance_query */ +extern GLboolean GLAD_INTEL_performance_query; +#define GL_PERFQUERY_SINGLE_CONTEXT_INTEL 0x00000000 +#define GL_PERFQUERY_GLOBAL_CONTEXT_INTEL 0x00000001 +#define GL_PERFQUERY_WAIT_INTEL 0x83FB +#define GL_PERFQUERY_FLUSH_INTEL 0x83FA +#define GL_PERFQUERY_DONOT_FLUSH_INTEL 0x83F9 +#define GL_PERFQUERY_COUNTER_EVENT_INTEL 0x94F0 +#define GL_PERFQUERY_COUNTER_DURATION_NORM_INTEL 0x94F1 +#define GL_PERFQUERY_COUNTER_DURATION_RAW_INTEL 0x94F2 +#define GL_PERFQUERY_COUNTER_THROUGHPUT_INTEL 0x94F3 +#define GL_PERFQUERY_COUNTER_RAW_INTEL 0x94F4 +#define GL_PERFQUERY_COUNTER_TIMESTAMP_INTEL 0x94F5 +#define GL_PERFQUERY_COUNTER_DATA_UINT32_INTEL 0x94F8 +#define GL_PERFQUERY_COUNTER_DATA_UINT64_INTEL 0x94F9 +#define GL_PERFQUERY_COUNTER_DATA_FLOAT_INTEL 0x94FA +#define GL_PERFQUERY_COUNTER_DATA_DOUBLE_INTEL 0x94FB +#define GL_PERFQUERY_COUNTER_DATA_BOOL32_INTEL 0x94FC +#define GL_PERFQUERY_QUERY_NAME_LENGTH_MAX_INTEL 0x94FD +#define GL_PERFQUERY_COUNTER_NAME_LENGTH_MAX_INTEL 0x94FE +#define GL_PERFQUERY_COUNTER_DESC_LENGTH_MAX_INTEL 0x94FF +#define GL_PERFQUERY_GPA_EXTENDED_COUNTERS_INTEL 0x9500 +typedef void (APIENTRYP pfn_glBeginPerfQueryINTEL) (GLuint); +extern pfn_glBeginPerfQueryINTEL fp_glBeginPerfQueryINTEL; +typedef void (APIENTRYP pfn_glCreatePerfQueryINTEL) (GLuint, GLuint*); +extern pfn_glCreatePerfQueryINTEL fp_glCreatePerfQueryINTEL; +typedef void (APIENTRYP pfn_glDeletePerfQueryINTEL) (GLuint); +extern pfn_glDeletePerfQueryINTEL fp_glDeletePerfQueryINTEL; +typedef void (APIENTRYP pfn_glEndPerfQueryINTEL) (GLuint); +extern pfn_glEndPerfQueryINTEL fp_glEndPerfQueryINTEL; +typedef void (APIENTRYP pfn_glGetFirstPerfQueryIdINTEL) (GLuint*); +extern pfn_glGetFirstPerfQueryIdINTEL fp_glGetFirstPerfQueryIdINTEL; +typedef void (APIENTRYP pfn_glGetNextPerfQueryIdINTEL) (GLuint, GLuint*); +extern pfn_glGetNextPerfQueryIdINTEL fp_glGetNextPerfQueryIdINTEL; +typedef void (APIENTRYP pfn_glGetPerfCounterInfoINTEL) (GLuint, GLuint, GLuint, GLchar*, GLuint, GLchar*, GLuint*, GLuint*, GLuint*, GLuint*, GLuint64*); +extern pfn_glGetPerfCounterInfoINTEL fp_glGetPerfCounterInfoINTEL; +typedef void (APIENTRYP pfn_glGetPerfQueryDataINTEL) (GLuint, GLuint, GLsizei, GLvoid*, GLuint*); +extern pfn_glGetPerfQueryDataINTEL fp_glGetPerfQueryDataINTEL; +typedef void (APIENTRYP pfn_glGetPerfQueryIdByNameINTEL) (GLchar*, GLuint*); +extern pfn_glGetPerfQueryIdByNameINTEL fp_glGetPerfQueryIdByNameINTEL; +typedef void (APIENTRYP pfn_glGetPerfQueryInfoINTEL) (GLuint, GLuint, GLchar*, GLuint*, GLuint*, GLuint*, GLuint*); +extern pfn_glGetPerfQueryInfoINTEL fp_glGetPerfQueryInfoINTEL; /* GL_MESA_pack_invert */ extern GLboolean GLAD_MESA_pack_invert; #define GL_PACK_INVERT_MESA 0x8758 - /* GL_MESA_resize_buffers */ -extern GLboolean GLAD_MESA_resize_buffers; -typedef void (APIENTRYP pfn_glResizeBuffersMESA) (); -extern pfn_glResizeBuffersMESA fp_glResizeBuffersMESA; - - /* GL_MESA_window_pos */ -extern GLboolean GLAD_MESA_window_pos; -typedef void (APIENTRYP pfn_glWindowPos2dMESA) (GLdouble, GLdouble); -extern pfn_glWindowPos2dMESA fp_glWindowPos2dMESA; -typedef void (APIENTRYP pfn_glWindowPos2dvMESA) (const GLdouble*); -extern pfn_glWindowPos2dvMESA fp_glWindowPos2dvMESA; -typedef void (APIENTRYP pfn_glWindowPos2fMESA) (GLfloat, GLfloat); -extern pfn_glWindowPos2fMESA fp_glWindowPos2fMESA; -typedef void (APIENTRYP pfn_glWindowPos2fvMESA) (const GLfloat*); -extern pfn_glWindowPos2fvMESA fp_glWindowPos2fvMESA; -typedef void (APIENTRYP pfn_glWindowPos2iMESA) (GLint, GLint); -extern pfn_glWindowPos2iMESA fp_glWindowPos2iMESA; -typedef void (APIENTRYP pfn_glWindowPos2ivMESA) (const GLint*); -extern pfn_glWindowPos2ivMESA fp_glWindowPos2ivMESA; -typedef void (APIENTRYP pfn_glWindowPos2sMESA) (GLshort, GLshort); -extern pfn_glWindowPos2sMESA fp_glWindowPos2sMESA; -typedef void (APIENTRYP pfn_glWindowPos2svMESA) (const GLshort*); -extern pfn_glWindowPos2svMESA fp_glWindowPos2svMESA; -typedef void (APIENTRYP pfn_glWindowPos3dMESA) (GLdouble, GLdouble, GLdouble); -extern pfn_glWindowPos3dMESA fp_glWindowPos3dMESA; -typedef void (APIENTRYP pfn_glWindowPos3dvMESA) (const GLdouble*); -extern pfn_glWindowPos3dvMESA fp_glWindowPos3dvMESA; -typedef void (APIENTRYP pfn_glWindowPos3fMESA) (GLfloat, GLfloat, GLfloat); -extern pfn_glWindowPos3fMESA fp_glWindowPos3fMESA; -typedef void (APIENTRYP pfn_glWindowPos3fvMESA) (const GLfloat*); -extern pfn_glWindowPos3fvMESA fp_glWindowPos3fvMESA; -typedef void (APIENTRYP pfn_glWindowPos3iMESA) (GLint, GLint, GLint); -extern pfn_glWindowPos3iMESA fp_glWindowPos3iMESA; -typedef void (APIENTRYP pfn_glWindowPos3ivMESA) (const GLint*); -extern pfn_glWindowPos3ivMESA fp_glWindowPos3ivMESA; -typedef void (APIENTRYP pfn_glWindowPos3sMESA) (GLshort, GLshort, GLshort); -extern pfn_glWindowPos3sMESA fp_glWindowPos3sMESA; -typedef void (APIENTRYP pfn_glWindowPos3svMESA) (const GLshort*); -extern pfn_glWindowPos3svMESA fp_glWindowPos3svMESA; -typedef void (APIENTRYP pfn_glWindowPos4dMESA) (GLdouble, GLdouble, GLdouble, GLdouble); -extern pfn_glWindowPos4dMESA fp_glWindowPos4dMESA; -typedef void (APIENTRYP pfn_glWindowPos4dvMESA) (const GLdouble*); -extern pfn_glWindowPos4dvMESA fp_glWindowPos4dvMESA; -typedef void (APIENTRYP pfn_glWindowPos4fMESA) (GLfloat, GLfloat, GLfloat, GLfloat); -extern pfn_glWindowPos4fMESA fp_glWindowPos4fMESA; -typedef void (APIENTRYP pfn_glWindowPos4fvMESA) (const GLfloat*); -extern pfn_glWindowPos4fvMESA fp_glWindowPos4fvMESA; -typedef void (APIENTRYP pfn_glWindowPos4iMESA) (GLint, GLint, GLint, GLint); -extern pfn_glWindowPos4iMESA fp_glWindowPos4iMESA; -typedef void (APIENTRYP pfn_glWindowPos4ivMESA) (const GLint*); -extern pfn_glWindowPos4ivMESA fp_glWindowPos4ivMESA; -typedef void (APIENTRYP pfn_glWindowPos4sMESA) (GLshort, GLshort, GLshort, GLshort); -extern pfn_glWindowPos4sMESA fp_glWindowPos4sMESA; -typedef void (APIENTRYP pfn_glWindowPos4svMESA) (const GLshort*); -extern pfn_glWindowPos4svMESA fp_glWindowPos4svMESA; - /* GL_MESA_ycbcr_texture */ extern GLboolean GLAD_MESA_ycbcr_texture; #define GL_UNSIGNED_SHORT_8_8_MESA 0x85BA @@ -8992,6 +7722,13 @@ extern pfn_glMultiDrawArraysIndirectBindlessNV fp_glMultiDrawArraysIndirectBindl typedef void (APIENTRYP pfn_glMultiDrawElementsIndirectBindlessNV) (GLenum, GLenum, const void*, GLsizei, GLsizei, GLint); extern pfn_glMultiDrawElementsIndirectBindlessNV fp_glMultiDrawElementsIndirectBindlessNV; + /* GL_NV_bindless_multi_draw_indirect_count */ +extern GLboolean GLAD_NV_bindless_multi_draw_indirect_count; +typedef void (APIENTRYP pfn_glMultiDrawArraysIndirectBindlessCountNV) (GLenum, const void*, GLsizei, GLsizei, GLsizei, GLint); +extern pfn_glMultiDrawArraysIndirectBindlessCountNV fp_glMultiDrawArraysIndirectBindlessCountNV; +typedef void (APIENTRYP pfn_glMultiDrawElementsIndirectBindlessCountNV) (GLenum, GLenum, const void*, GLsizei, GLsizei, GLsizei, GLint); +extern pfn_glMultiDrawElementsIndirectBindlessCountNV fp_glMultiDrawElementsIndirectBindlessCountNV; + /* GL_NV_bindless_texture */ extern GLboolean GLAD_NV_bindless_texture; typedef GLuint64 (APIENTRYP pfn_glGetTextureHandleNV) (GLuint); @@ -9023,12 +7760,9 @@ extern pfn_glIsImageHandleResidentNV fp_glIsImageHandleResidentNV; /* GL_NV_blend_equation_advanced */ extern GLboolean GLAD_NV_blend_equation_advanced; -#define GL_BLUE_NV 0x1905 -#define GL_GREEN_NV 0x1904 -#define GL_RED_NV 0x1903 -#define GL_XOR_NV 0x1506 #define GL_BLEND_OVERLAP_NV 0x9281 #define GL_BLEND_PREMULTIPLIED_SRC_NV 0x9280 +#define GL_BLUE_NV 0x1905 #define GL_COLORBURN_NV 0x929A #define GL_COLORDODGE_NV 0x9299 #define GL_CONJOINT_NV 0x9284 @@ -9042,6 +7776,7 @@ extern GLboolean GLAD_NV_blend_equation_advanced; #define GL_DST_OUT_NV 0x928D #define GL_DST_OVER_NV 0x9289 #define GL_EXCLUSION_NV 0x92A0 +#define GL_GREEN_NV 0x1904 #define GL_HARDLIGHT_NV 0x929B #define GL_HARDMIX_NV 0x92A9 #define GL_HSL_COLOR_NV 0x92AF @@ -9063,6 +7798,7 @@ extern GLboolean GLAD_NV_blend_equation_advanced; #define GL_PLUS_CLAMPED_NV 0x92B1 #define GL_PLUS_DARKER_NV 0x9292 #define GL_PLUS_NV 0x9291 +#define GL_RED_NV 0x1903 #define GL_SCREEN_NV 0x9295 #define GL_SOFTLIGHT_NV 0x929C #define GL_SRC_ATOP_NV 0x928E @@ -9072,6 +7808,7 @@ extern GLboolean GLAD_NV_blend_equation_advanced; #define GL_SRC_OVER_NV 0x9288 #define GL_UNCORRELATED_NV 0x9282 #define GL_VIVIDLIGHT_NV 0x92A6 +#define GL_XOR_NV 0x1506 typedef void (APIENTRYP pfn_glBlendParameteriNV) (GLenum, GLint); extern pfn_glBlendParameteriNV fp_glBlendParameteriNV; typedef void (APIENTRYP pfn_glBlendBarrierNV) (); @@ -9081,9 +7818,6 @@ extern pfn_glBlendBarrierNV fp_glBlendBarrierNV; extern GLboolean GLAD_NV_blend_equation_advanced_coherent; #define GL_BLEND_ADVANCED_COHERENT_NV 0x9285 - /* GL_NV_blend_square */ -extern GLboolean GLAD_NV_blend_square; - /* GL_NV_compute_program5 */ extern GLboolean GLAD_NV_compute_program5; #define GL_COMPUTE_PROGRAM_NV 0x90FB @@ -9100,6 +7834,15 @@ extern pfn_glBeginConditionalRenderNV fp_glBeginConditionalRenderNV; typedef void (APIENTRYP pfn_glEndConditionalRenderNV) (); extern pfn_glEndConditionalRenderNV fp_glEndConditionalRenderNV; + /* GL_NV_conservative_raster */ +extern GLboolean GLAD_NV_conservative_raster; +#define GL_CONSERVATIVE_RASTERIZATION_NV 0x9346 +#define GL_SUBPIXEL_PRECISION_BIAS_X_BITS_NV 0x9347 +#define GL_SUBPIXEL_PRECISION_BIAS_Y_BITS_NV 0x9348 +#define GL_MAX_SUBPIXEL_PRECISION_BIAS_BITS_NV 0x9349 +typedef void (APIENTRYP pfn_glSubpixelPrecisionBiasNV) (GLuint, GLuint); +extern pfn_glSubpixelPrecisionBiasNV fp_glSubpixelPrecisionBiasNV; + /* GL_NV_copy_buffer */ extern GLboolean GLAD_NV_copy_buffer; #define GL_COPY_READ_BUFFER_NV 0x8F36 @@ -9107,11 +7850,6 @@ extern GLboolean GLAD_NV_copy_buffer; typedef void (APIENTRYP pfn_glCopyBufferSubDataNV) (GLenum, GLenum, GLintptr, GLintptr, GLsizeiptr); extern pfn_glCopyBufferSubDataNV fp_glCopyBufferSubDataNV; - /* GL_NV_copy_depth_to_color */ -extern GLboolean GLAD_NV_copy_depth_to_color; -#define GL_DEPTH_STENCIL_TO_RGBA_NV 0x886E -#define GL_DEPTH_STENCIL_TO_BGRA_NV 0x886F - /* GL_NV_copy_image */ extern GLboolean GLAD_NV_copy_image; typedef void (APIENTRYP pfn_glCopyImageSubDataNV) (GLuint, GLenum, GLint, GLint, GLint, GLint, GLuint, GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei); @@ -9209,51 +7947,6 @@ extern GLboolean GLAD_NV_draw_texture; typedef void (APIENTRYP pfn_glDrawTextureNV) (GLuint, GLuint, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); extern pfn_glDrawTextureNV fp_glDrawTextureNV; - /* GL_NV_evaluators */ -extern GLboolean GLAD_NV_evaluators; -#define GL_EVAL_2D_NV 0x86C0 -#define GL_EVAL_TRIANGULAR_2D_NV 0x86C1 -#define GL_MAP_TESSELLATION_NV 0x86C2 -#define GL_MAP_ATTRIB_U_ORDER_NV 0x86C3 -#define GL_MAP_ATTRIB_V_ORDER_NV 0x86C4 -#define GL_EVAL_FRACTIONAL_TESSELLATION_NV 0x86C5 -#define GL_EVAL_VERTEX_ATTRIB0_NV 0x86C6 -#define GL_EVAL_VERTEX_ATTRIB1_NV 0x86C7 -#define GL_EVAL_VERTEX_ATTRIB2_NV 0x86C8 -#define GL_EVAL_VERTEX_ATTRIB3_NV 0x86C9 -#define GL_EVAL_VERTEX_ATTRIB4_NV 0x86CA -#define GL_EVAL_VERTEX_ATTRIB5_NV 0x86CB -#define GL_EVAL_VERTEX_ATTRIB6_NV 0x86CC -#define GL_EVAL_VERTEX_ATTRIB7_NV 0x86CD -#define GL_EVAL_VERTEX_ATTRIB8_NV 0x86CE -#define GL_EVAL_VERTEX_ATTRIB9_NV 0x86CF -#define GL_EVAL_VERTEX_ATTRIB10_NV 0x86D0 -#define GL_EVAL_VERTEX_ATTRIB11_NV 0x86D1 -#define GL_EVAL_VERTEX_ATTRIB12_NV 0x86D2 -#define GL_EVAL_VERTEX_ATTRIB13_NV 0x86D3 -#define GL_EVAL_VERTEX_ATTRIB14_NV 0x86D4 -#define GL_EVAL_VERTEX_ATTRIB15_NV 0x86D5 -#define GL_MAX_MAP_TESSELLATION_NV 0x86D6 -#define GL_MAX_RATIONAL_EVAL_ORDER_NV 0x86D7 -typedef void (APIENTRYP pfn_glMapControlPointsNV) (GLenum, GLuint, GLenum, GLsizei, GLsizei, GLint, GLint, GLboolean, const void*); -extern pfn_glMapControlPointsNV fp_glMapControlPointsNV; -typedef void (APIENTRYP pfn_glMapParameterivNV) (GLenum, GLenum, const GLint*); -extern pfn_glMapParameterivNV fp_glMapParameterivNV; -typedef void (APIENTRYP pfn_glMapParameterfvNV) (GLenum, GLenum, const GLfloat*); -extern pfn_glMapParameterfvNV fp_glMapParameterfvNV; -typedef void (APIENTRYP pfn_glGetMapControlPointsNV) (GLenum, GLuint, GLenum, GLsizei, GLsizei, GLboolean, void*); -extern pfn_glGetMapControlPointsNV fp_glGetMapControlPointsNV; -typedef void (APIENTRYP pfn_glGetMapParameterivNV) (GLenum, GLenum, GLint*); -extern pfn_glGetMapParameterivNV fp_glGetMapParameterivNV; -typedef void (APIENTRYP pfn_glGetMapParameterfvNV) (GLenum, GLenum, GLfloat*); -extern pfn_glGetMapParameterfvNV fp_glGetMapParameterfvNV; -typedef void (APIENTRYP pfn_glGetMapAttribParameterivNV) (GLenum, GLuint, GLenum, GLint*); -extern pfn_glGetMapAttribParameterivNV fp_glGetMapAttribParameterivNV; -typedef void (APIENTRYP pfn_glGetMapAttribParameterfvNV) (GLenum, GLuint, GLenum, GLfloat*); -extern pfn_glGetMapAttribParameterfvNV fp_glGetMapAttribParameterfvNV; -typedef void (APIENTRYP pfn_glEvalMapsNV) (GLenum, GLenum); -extern pfn_glEvalMapsNV fp_glEvalMapsNV; - /* GL_NV_explicit_attrib_location */ extern GLboolean GLAD_NV_explicit_attrib_location; @@ -9300,6 +7993,10 @@ extern pfn_glFinishFenceNV fp_glFinishFenceNV; typedef void (APIENTRYP pfn_glSetFenceNV) (GLuint, GLenum); extern pfn_glSetFenceNV fp_glSetFenceNV; + /* GL_NV_fill_rectangle */ +extern GLboolean GLAD_NV_fill_rectangle; +#define GL_FILL_RECTANGLE_NV 0x933C + /* GL_NV_float_buffer */ extern GLboolean GLAD_NV_float_buffer; #define GL_FLOAT_R_NV 0x8880 @@ -9318,46 +8015,18 @@ extern GLboolean GLAD_NV_float_buffer; #define GL_FLOAT_CLEAR_COLOR_VALUE_NV 0x888D #define GL_FLOAT_RGBA_MODE_NV 0x888E - /* GL_NV_fog_distance */ -extern GLboolean GLAD_NV_fog_distance; -#define GL_FOG_DISTANCE_MODE_NV 0x855A -#define GL_EYE_RADIAL_NV 0x855B -#define GL_EYE_PLANE_ABSOLUTE_NV 0x855C - - /* GL_NV_fragment_program */ -extern GLboolean GLAD_NV_fragment_program; -#define GL_MAX_FRAGMENT_PROGRAM_LOCAL_PARAMETERS_NV 0x8868 -#define GL_FRAGMENT_PROGRAM_NV 0x8870 -#define GL_MAX_TEXTURE_COORDS_NV 0x8871 -#define GL_MAX_TEXTURE_IMAGE_UNITS_NV 0x8872 -#define GL_FRAGMENT_PROGRAM_BINDING_NV 0x8873 -#define GL_PROGRAM_ERROR_STRING_NV 0x8874 -typedef void (APIENTRYP pfn_glProgramNamedParameter4fNV) (GLuint, GLsizei, const GLubyte*, GLfloat, GLfloat, GLfloat, GLfloat); -extern pfn_glProgramNamedParameter4fNV fp_glProgramNamedParameter4fNV; -typedef void (APIENTRYP pfn_glProgramNamedParameter4fvNV) (GLuint, GLsizei, const GLubyte*, const GLfloat*); -extern pfn_glProgramNamedParameter4fvNV fp_glProgramNamedParameter4fvNV; -typedef void (APIENTRYP pfn_glProgramNamedParameter4dNV) (GLuint, GLsizei, const GLubyte*, GLdouble, GLdouble, GLdouble, GLdouble); -extern pfn_glProgramNamedParameter4dNV fp_glProgramNamedParameter4dNV; -typedef void (APIENTRYP pfn_glProgramNamedParameter4dvNV) (GLuint, GLsizei, const GLubyte*, const GLdouble*); -extern pfn_glProgramNamedParameter4dvNV fp_glProgramNamedParameter4dvNV; -typedef void (APIENTRYP pfn_glGetProgramNamedParameterfvNV) (GLuint, GLsizei, const GLubyte*, GLfloat*); -extern pfn_glGetProgramNamedParameterfvNV fp_glGetProgramNamedParameterfvNV; -typedef void (APIENTRYP pfn_glGetProgramNamedParameterdvNV) (GLuint, GLsizei, const GLubyte*, GLdouble*); -extern pfn_glGetProgramNamedParameterdvNV fp_glGetProgramNamedParameterdvNV; - - /* GL_NV_fragment_program2 */ -extern GLboolean GLAD_NV_fragment_program2; -#define GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV 0x88F4 -#define GL_MAX_PROGRAM_CALL_DEPTH_NV 0x88F5 -#define GL_MAX_PROGRAM_IF_DEPTH_NV 0x88F6 -#define GL_MAX_PROGRAM_LOOP_DEPTH_NV 0x88F7 -#define GL_MAX_PROGRAM_LOOP_COUNT_NV 0x88F8 + /* GL_NV_fragment_coverage_to_color */ +extern GLboolean GLAD_NV_fragment_coverage_to_color; +#define GL_FRAGMENT_COVERAGE_TO_COLOR_NV 0x92DD +#define GL_FRAGMENT_COVERAGE_COLOR_NV 0x92DE +typedef void (APIENTRYP pfn_glFragmentCoverageColorNV) (GLuint); +extern pfn_glFragmentCoverageColorNV fp_glFragmentCoverageColorNV; /* GL_NV_fragment_program4 */ extern GLboolean GLAD_NV_fragment_program4; - /* GL_NV_fragment_program_option */ -extern GLboolean GLAD_NV_fragment_program_option; + /* GL_NV_fragment_shader_interlock */ +extern GLboolean GLAD_NV_fragment_shader_interlock; /* GL_NV_framebuffer_blit */ extern GLboolean GLAD_NV_framebuffer_blit; @@ -9368,6 +8037,23 @@ extern GLboolean GLAD_NV_framebuffer_blit; typedef void (APIENTRYP pfn_glBlitFramebufferNV) (GLint, GLint, GLint, GLint, GLint, GLint, GLint, GLint, GLbitfield, GLenum); extern pfn_glBlitFramebufferNV fp_glBlitFramebufferNV; + /* GL_NV_framebuffer_mixed_samples */ +extern GLboolean GLAD_NV_framebuffer_mixed_samples; +#define GL_COVERAGE_MODULATION_TABLE_NV 0x9331 +#define GL_COLOR_SAMPLES_NV 0x8E20 +#define GL_DEPTH_SAMPLES_NV 0x932D +#define GL_STENCIL_SAMPLES_NV 0x932E +#define GL_MIXED_DEPTH_SAMPLES_SUPPORTED_NV 0x932F +#define GL_MIXED_STENCIL_SAMPLES_SUPPORTED_NV 0x9330 +#define GL_COVERAGE_MODULATION_NV 0x9332 +#define GL_COVERAGE_MODULATION_TABLE_SIZE_NV 0x9333 +typedef void (APIENTRYP pfn_glCoverageModulationTableNV) (GLsizei, const GLfloat*); +extern pfn_glCoverageModulationTableNV fp_glCoverageModulationTableNV; +typedef void (APIENTRYP pfn_glGetCoverageModulationTableNV) (GLsizei, GLfloat*); +extern pfn_glGetCoverageModulationTableNV fp_glGetCoverageModulationTableNV; +typedef void (APIENTRYP pfn_glCoverageModulationNV) (GLenum); +extern pfn_glCoverageModulationNV fp_glCoverageModulationNV; + /* GL_NV_framebuffer_multisample */ extern GLboolean GLAD_NV_framebuffer_multisample; #define GL_RENDERBUFFER_SAMPLES_NV 0x8CAB @@ -9395,16 +8081,15 @@ extern GLboolean GLAD_NV_geometry_program4; #define GL_MAX_PROGRAM_TOTAL_OUTPUT_COMPONENTS_NV 0x8C28 typedef void (APIENTRYP pfn_glProgramVertexLimitNV) (GLenum, GLint); extern pfn_glProgramVertexLimitNV fp_glProgramVertexLimitNV; -typedef void (APIENTRYP pfn_glFramebufferTextureEXT) (GLenum, GLenum, GLuint, GLint); -extern pfn_glFramebufferTextureEXT fp_glFramebufferTextureEXT; -typedef void (APIENTRYP pfn_glFramebufferTextureLayerEXT) (GLenum, GLenum, GLuint, GLint, GLint); -extern pfn_glFramebufferTextureLayerEXT fp_glFramebufferTextureLayerEXT; typedef void (APIENTRYP pfn_glFramebufferTextureFaceEXT) (GLenum, GLenum, GLuint, GLint, GLenum); extern pfn_glFramebufferTextureFaceEXT fp_glFramebufferTextureFaceEXT; /* GL_NV_geometry_shader4 */ extern GLboolean GLAD_NV_geometry_shader4; + /* GL_NV_geometry_shader_passthrough */ +extern GLboolean GLAD_NV_geometry_shader_passthrough; + /* GL_NV_gpu_program4 */ extern GLboolean GLAD_NV_gpu_program4; #define GL_MIN_PROGRAM_TEXEL_OFFSET_NV 0x8904 @@ -9468,100 +8153,6 @@ extern GLboolean GLAD_NV_gpu_program5_mem_extended; /* GL_NV_gpu_shader5 */ extern GLboolean GLAD_NV_gpu_shader5; -#define GL_INT64_NV 0x140E -#define GL_UNSIGNED_INT64_NV 0x140F -#define GL_INT8_NV 0x8FE0 -#define GL_INT8_VEC2_NV 0x8FE1 -#define GL_INT8_VEC3_NV 0x8FE2 -#define GL_INT8_VEC4_NV 0x8FE3 -#define GL_INT16_NV 0x8FE4 -#define GL_INT16_VEC2_NV 0x8FE5 -#define GL_INT16_VEC3_NV 0x8FE6 -#define GL_INT16_VEC4_NV 0x8FE7 -#define GL_INT64_VEC2_NV 0x8FE9 -#define GL_INT64_VEC3_NV 0x8FEA -#define GL_INT64_VEC4_NV 0x8FEB -#define GL_UNSIGNED_INT8_NV 0x8FEC -#define GL_UNSIGNED_INT8_VEC2_NV 0x8FED -#define GL_UNSIGNED_INT8_VEC3_NV 0x8FEE -#define GL_UNSIGNED_INT8_VEC4_NV 0x8FEF -#define GL_UNSIGNED_INT16_NV 0x8FF0 -#define GL_UNSIGNED_INT16_VEC2_NV 0x8FF1 -#define GL_UNSIGNED_INT16_VEC3_NV 0x8FF2 -#define GL_UNSIGNED_INT16_VEC4_NV 0x8FF3 -#define GL_UNSIGNED_INT64_VEC2_NV 0x8FF5 -#define GL_UNSIGNED_INT64_VEC3_NV 0x8FF6 -#define GL_UNSIGNED_INT64_VEC4_NV 0x8FF7 -#define GL_FLOAT16_NV 0x8FF8 -#define GL_FLOAT16_VEC2_NV 0x8FF9 -#define GL_FLOAT16_VEC3_NV 0x8FFA -#define GL_FLOAT16_VEC4_NV 0x8FFB -typedef void (APIENTRYP pfn_glUniform1i64NV) (GLint, GLint64EXT); -extern pfn_glUniform1i64NV fp_glUniform1i64NV; -typedef void (APIENTRYP pfn_glUniform2i64NV) (GLint, GLint64EXT, GLint64EXT); -extern pfn_glUniform2i64NV fp_glUniform2i64NV; -typedef void (APIENTRYP pfn_glUniform3i64NV) (GLint, GLint64EXT, GLint64EXT, GLint64EXT); -extern pfn_glUniform3i64NV fp_glUniform3i64NV; -typedef void (APIENTRYP pfn_glUniform4i64NV) (GLint, GLint64EXT, GLint64EXT, GLint64EXT, GLint64EXT); -extern pfn_glUniform4i64NV fp_glUniform4i64NV; -typedef void (APIENTRYP pfn_glUniform1i64vNV) (GLint, GLsizei, const GLint64EXT*); -extern pfn_glUniform1i64vNV fp_glUniform1i64vNV; -typedef void (APIENTRYP pfn_glUniform2i64vNV) (GLint, GLsizei, const GLint64EXT*); -extern pfn_glUniform2i64vNV fp_glUniform2i64vNV; -typedef void (APIENTRYP pfn_glUniform3i64vNV) (GLint, GLsizei, const GLint64EXT*); -extern pfn_glUniform3i64vNV fp_glUniform3i64vNV; -typedef void (APIENTRYP pfn_glUniform4i64vNV) (GLint, GLsizei, const GLint64EXT*); -extern pfn_glUniform4i64vNV fp_glUniform4i64vNV; -typedef void (APIENTRYP pfn_glUniform1ui64NV) (GLint, GLuint64EXT); -extern pfn_glUniform1ui64NV fp_glUniform1ui64NV; -typedef void (APIENTRYP pfn_glUniform2ui64NV) (GLint, GLuint64EXT, GLuint64EXT); -extern pfn_glUniform2ui64NV fp_glUniform2ui64NV; -typedef void (APIENTRYP pfn_glUniform3ui64NV) (GLint, GLuint64EXT, GLuint64EXT, GLuint64EXT); -extern pfn_glUniform3ui64NV fp_glUniform3ui64NV; -typedef void (APIENTRYP pfn_glUniform4ui64NV) (GLint, GLuint64EXT, GLuint64EXT, GLuint64EXT, GLuint64EXT); -extern pfn_glUniform4ui64NV fp_glUniform4ui64NV; -typedef void (APIENTRYP pfn_glUniform1ui64vNV) (GLint, GLsizei, const GLuint64EXT*); -extern pfn_glUniform1ui64vNV fp_glUniform1ui64vNV; -typedef void (APIENTRYP pfn_glUniform2ui64vNV) (GLint, GLsizei, const GLuint64EXT*); -extern pfn_glUniform2ui64vNV fp_glUniform2ui64vNV; -typedef void (APIENTRYP pfn_glUniform3ui64vNV) (GLint, GLsizei, const GLuint64EXT*); -extern pfn_glUniform3ui64vNV fp_glUniform3ui64vNV; -typedef void (APIENTRYP pfn_glUniform4ui64vNV) (GLint, GLsizei, const GLuint64EXT*); -extern pfn_glUniform4ui64vNV fp_glUniform4ui64vNV; -typedef void (APIENTRYP pfn_glGetUniformi64vNV) (GLuint, GLint, GLint64EXT*); -extern pfn_glGetUniformi64vNV fp_glGetUniformi64vNV; -typedef void (APIENTRYP pfn_glProgramUniform1i64NV) (GLuint, GLint, GLint64EXT); -extern pfn_glProgramUniform1i64NV fp_glProgramUniform1i64NV; -typedef void (APIENTRYP pfn_glProgramUniform2i64NV) (GLuint, GLint, GLint64EXT, GLint64EXT); -extern pfn_glProgramUniform2i64NV fp_glProgramUniform2i64NV; -typedef void (APIENTRYP pfn_glProgramUniform3i64NV) (GLuint, GLint, GLint64EXT, GLint64EXT, GLint64EXT); -extern pfn_glProgramUniform3i64NV fp_glProgramUniform3i64NV; -typedef void (APIENTRYP pfn_glProgramUniform4i64NV) (GLuint, GLint, GLint64EXT, GLint64EXT, GLint64EXT, GLint64EXT); -extern pfn_glProgramUniform4i64NV fp_glProgramUniform4i64NV; -typedef void (APIENTRYP pfn_glProgramUniform1i64vNV) (GLuint, GLint, GLsizei, const GLint64EXT*); -extern pfn_glProgramUniform1i64vNV fp_glProgramUniform1i64vNV; -typedef void (APIENTRYP pfn_glProgramUniform2i64vNV) (GLuint, GLint, GLsizei, const GLint64EXT*); -extern pfn_glProgramUniform2i64vNV fp_glProgramUniform2i64vNV; -typedef void (APIENTRYP pfn_glProgramUniform3i64vNV) (GLuint, GLint, GLsizei, const GLint64EXT*); -extern pfn_glProgramUniform3i64vNV fp_glProgramUniform3i64vNV; -typedef void (APIENTRYP pfn_glProgramUniform4i64vNV) (GLuint, GLint, GLsizei, const GLint64EXT*); -extern pfn_glProgramUniform4i64vNV fp_glProgramUniform4i64vNV; -typedef void (APIENTRYP pfn_glProgramUniform1ui64NV) (GLuint, GLint, GLuint64EXT); -extern pfn_glProgramUniform1ui64NV fp_glProgramUniform1ui64NV; -typedef void (APIENTRYP pfn_glProgramUniform2ui64NV) (GLuint, GLint, GLuint64EXT, GLuint64EXT); -extern pfn_glProgramUniform2ui64NV fp_glProgramUniform2ui64NV; -typedef void (APIENTRYP pfn_glProgramUniform3ui64NV) (GLuint, GLint, GLuint64EXT, GLuint64EXT, GLuint64EXT); -extern pfn_glProgramUniform3ui64NV fp_glProgramUniform3ui64NV; -typedef void (APIENTRYP pfn_glProgramUniform4ui64NV) (GLuint, GLint, GLuint64EXT, GLuint64EXT, GLuint64EXT, GLuint64EXT); -extern pfn_glProgramUniform4ui64NV fp_glProgramUniform4ui64NV; -typedef void (APIENTRYP pfn_glProgramUniform1ui64vNV) (GLuint, GLint, GLsizei, const GLuint64EXT*); -extern pfn_glProgramUniform1ui64vNV fp_glProgramUniform1ui64vNV; -typedef void (APIENTRYP pfn_glProgramUniform2ui64vNV) (GLuint, GLint, GLsizei, const GLuint64EXT*); -extern pfn_glProgramUniform2ui64vNV fp_glProgramUniform2ui64vNV; -typedef void (APIENTRYP pfn_glProgramUniform3ui64vNV) (GLuint, GLint, GLsizei, const GLuint64EXT*); -extern pfn_glProgramUniform3ui64vNV fp_glProgramUniform3ui64vNV; -typedef void (APIENTRYP pfn_glProgramUniform4ui64vNV) (GLuint, GLint, GLsizei, const GLuint64EXT*); -extern pfn_glProgramUniform4ui64vNV fp_glProgramUniform4ui64vNV; /* GL_NV_half_float */ extern GLboolean GLAD_NV_half_float; @@ -9659,24 +8250,27 @@ extern pfn_glVertexAttribs3hvNV fp_glVertexAttribs3hvNV; typedef void (APIENTRYP pfn_glVertexAttribs4hvNV) (GLuint, GLsizei, const GLhalfNV*); extern pfn_glVertexAttribs4hvNV fp_glVertexAttribs4hvNV; + /* GL_NV_image_formats */ +extern GLboolean GLAD_NV_image_formats; + /* GL_NV_instanced_arrays */ extern GLboolean GLAD_NV_instanced_arrays; #define GL_VERTEX_ATTRIB_ARRAY_DIVISOR_NV 0x88FE typedef void (APIENTRYP pfn_glVertexAttribDivisorNV) (GLuint, GLuint); extern pfn_glVertexAttribDivisorNV fp_glVertexAttribDivisorNV; - /* GL_NV_light_max_exponent */ -extern GLboolean GLAD_NV_light_max_exponent; -#define GL_MAX_SHININESS_NV 0x8504 -#define GL_MAX_SPOT_EXPONENT_NV 0x8505 + /* GL_NV_internalformat_sample_query */ +extern GLboolean GLAD_NV_internalformat_sample_query; +#define GL_MULTISAMPLES_NV 0x9371 +#define GL_SUPERSAMPLE_SCALE_X_NV 0x9372 +#define GL_SUPERSAMPLE_SCALE_Y_NV 0x9373 +#define GL_CONFORMANT_NV 0x9374 +typedef void (APIENTRYP pfn_glGetInternalformatSampleivNV) (GLenum, GLenum, GLsizei, GLenum, GLsizei, GLint*); +extern pfn_glGetInternalformatSampleivNV fp_glGetInternalformatSampleivNV; /* GL_NV_multisample_coverage */ extern GLboolean GLAD_NV_multisample_coverage; -#define GL_COLOR_SAMPLES_NV 0x8E20 - - /* GL_NV_multisample_filter_hint */ -extern GLboolean GLAD_NV_multisample_filter_hint; -#define GL_MULTISAMPLE_FILTER_HINT_NV 0x8534 +#define GL_SAMPLES_ARB 0x80A9 /* GL_NV_non_square_matrices */ extern GLboolean GLAD_NV_non_square_matrices; @@ -9720,11 +8314,6 @@ extern pfn_glGetOcclusionQueryivNV fp_glGetOcclusionQueryivNV; typedef void (APIENTRYP pfn_glGetOcclusionQueryuivNV) (GLuint, GLenum, GLuint*); extern pfn_glGetOcclusionQueryuivNV fp_glGetOcclusionQueryuivNV; - /* GL_NV_packed_depth_stencil */ -extern GLboolean GLAD_NV_packed_depth_stencil; -#define GL_DEPTH_STENCIL_NV 0x84F9 -#define GL_UNSIGNED_INT_24_8_NV 0x84FA - /* GL_NV_parameter_buffer_object */ extern GLboolean GLAD_NV_parameter_buffer_object; #define GL_MAX_PROGRAM_PARAMETER_BUFFER_BINDINGS_NV 0x8DA0 @@ -9796,13 +8385,11 @@ extern GLboolean GLAD_NV_path_rendering; #define GL_SKIP_MISSING_GLYPH_NV 0x90A9 #define GL_USE_MISSING_GLYPH_NV 0x90AA #define GL_PATH_ERROR_POSITION_NV 0x90AB -#define GL_PATH_FOG_GEN_MODE_NV 0x90AC #define GL_ACCUM_ADJACENT_PAIRS_NV 0x90AD #define GL_ADJACENT_PAIRS_NV 0x90AE #define GL_FIRST_TO_REST_NV 0x90AF #define GL_PATH_GEN_MODE_NV 0x90B0 #define GL_PATH_GEN_COEFF_NV 0x90B1 -#define GL_PATH_GEN_COLOR_FORMAT_NV 0x90B2 #define GL_PATH_GEN_COMPONENTS_NV 0x90B3 #define GL_PATH_STENCIL_FUNC_NV 0x90B7 #define GL_PATH_STENCIL_REF_NV 0x90B8 @@ -9871,8 +8458,44 @@ extern GLboolean GLAD_NV_path_rendering; #define GL_FONT_UNDERLINE_POSITION_BIT_NV 0x04000000 #define GL_FONT_UNDERLINE_THICKNESS_BIT_NV 0x08000000 #define GL_FONT_HAS_KERNING_BIT_NV 0x10000000 +#define GL_ROUNDED_RECT_NV 0xE8 +#define GL_RELATIVE_ROUNDED_RECT_NV 0xE9 +#define GL_ROUNDED_RECT2_NV 0xEA +#define GL_RELATIVE_ROUNDED_RECT2_NV 0xEB +#define GL_ROUNDED_RECT4_NV 0xEC +#define GL_RELATIVE_ROUNDED_RECT4_NV 0xED +#define GL_ROUNDED_RECT8_NV 0xEE +#define GL_RELATIVE_ROUNDED_RECT8_NV 0xEF +#define GL_RELATIVE_RECT_NV 0xF7 +#define GL_FONT_GLYPHS_AVAILABLE_NV 0x9368 +#define GL_FONT_TARGET_UNAVAILABLE_NV 0x9369 +#define GL_FONT_UNAVAILABLE_NV 0x936A +#define GL_FONT_UNINTELLIGIBLE_NV 0x936B +#define GL_CONIC_CURVE_TO_NV 0x1A +#define GL_RELATIVE_CONIC_CURVE_TO_NV 0x1B +#define GL_FONT_NUM_GLYPH_INDICES_BIT_NV 0x20000000 +#define GL_STANDARD_FONT_FORMAT_NV 0x936C +#define GL_2_BYTES_NV 0x1407 +#define GL_3_BYTES_NV 0x1408 +#define GL_4_BYTES_NV 0x1409 +#define GL_EYE_LINEAR_NV 0x2400 +#define GL_OBJECT_LINEAR_NV 0x2401 +#define GL_CONSTANT_NV 0x8576 +#define GL_PATH_FOG_GEN_MODE_NV 0x90AC #define GL_PRIMARY_COLOR_NV 0x852C #define GL_SECONDARY_COLOR_NV 0x852D +#define GL_PATH_GEN_COLOR_FORMAT_NV 0x90B2 +#define GL_PATH_PROJECTION_NV 0x1701 +#define GL_PATH_MODELVIEW_NV 0x1700 +#define GL_PATH_MODELVIEW_STACK_DEPTH_NV 0x0BA3 +#define GL_PATH_MODELVIEW_MATRIX_NV 0x0BA6 +#define GL_PATH_MAX_MODELVIEW_STACK_DEPTH_NV 0x0D36 +#define GL_PATH_TRANSPOSE_MODELVIEW_MATRIX_NV 0x84E3 +#define GL_PATH_PROJECTION_STACK_DEPTH_NV 0x0BA4 +#define GL_PATH_PROJECTION_MATRIX_NV 0x0BA7 +#define GL_PATH_MAX_PROJECTION_STACK_DEPTH_NV 0x0D38 +#define GL_PATH_TRANSPOSE_PROJECTION_MATRIX_NV 0x84E4 +#define GL_FRAGMENT_INPUT_NV 0x936D typedef GLuint (APIENTRYP pfn_glGenPathsNV) (GLsizei); extern pfn_glGenPathsNV fp_glGenPathsNV; typedef void (APIENTRYP pfn_glDeletePathsNV) (GLuint, GLsizei); @@ -9925,12 +8548,6 @@ typedef void (APIENTRYP pfn_glStencilStrokePathInstancedNV) (GLsizei, GLenum, co extern pfn_glStencilStrokePathInstancedNV fp_glStencilStrokePathInstancedNV; typedef void (APIENTRYP pfn_glPathCoverDepthFuncNV) (GLenum); extern pfn_glPathCoverDepthFuncNV fp_glPathCoverDepthFuncNV; -typedef void (APIENTRYP pfn_glPathColorGenNV) (GLenum, GLenum, GLenum, const GLfloat*); -extern pfn_glPathColorGenNV fp_glPathColorGenNV; -typedef void (APIENTRYP pfn_glPathTexGenNV) (GLenum, GLenum, GLint, const GLfloat*); -extern pfn_glPathTexGenNV fp_glPathTexGenNV; -typedef void (APIENTRYP pfn_glPathFogGenNV) (GLenum); -extern pfn_glPathFogGenNV fp_glPathFogGenNV; typedef void (APIENTRYP pfn_glCoverFillPathNV) (GLuint, GLenum); extern pfn_glCoverFillPathNV fp_glCoverFillPathNV; typedef void (APIENTRYP pfn_glCoverStrokePathNV) (GLuint, GLenum); @@ -9955,14 +8572,6 @@ typedef void (APIENTRYP pfn_glGetPathMetricRangeNV) (GLbitfield, GLuint, GLsizei extern pfn_glGetPathMetricRangeNV fp_glGetPathMetricRangeNV; typedef void (APIENTRYP pfn_glGetPathSpacingNV) (GLenum, GLsizei, GLenum, const void*, GLuint, GLfloat, GLfloat, GLenum, GLfloat*); extern pfn_glGetPathSpacingNV fp_glGetPathSpacingNV; -typedef void (APIENTRYP pfn_glGetPathColorGenivNV) (GLenum, GLenum, GLint*); -extern pfn_glGetPathColorGenivNV fp_glGetPathColorGenivNV; -typedef void (APIENTRYP pfn_glGetPathColorGenfvNV) (GLenum, GLenum, GLfloat*); -extern pfn_glGetPathColorGenfvNV fp_glGetPathColorGenfvNV; -typedef void (APIENTRYP pfn_glGetPathTexGenivNV) (GLenum, GLenum, GLint*); -extern pfn_glGetPathTexGenivNV fp_glGetPathTexGenivNV; -typedef void (APIENTRYP pfn_glGetPathTexGenfvNV) (GLenum, GLenum, GLfloat*); -extern pfn_glGetPathTexGenfvNV fp_glGetPathTexGenfvNV; typedef GLboolean (APIENTRYP pfn_glIsPointInFillPathNV) (GLuint, GLuint, GLfloat, GLfloat); extern pfn_glIsPointInFillPathNV fp_glIsPointInFillPathNV; typedef GLboolean (APIENTRYP pfn_glIsPointInStrokePathNV) (GLuint, GLfloat, GLfloat); @@ -9971,29 +8580,54 @@ typedef GLfloat (APIENTRYP pfn_glGetPathLengthNV) (GLuint, GLsizei, GLsizei); extern pfn_glGetPathLengthNV fp_glGetPathLengthNV; typedef GLboolean (APIENTRYP pfn_glPointAlongPathNV) (GLuint, GLsizei, GLsizei, GLfloat, GLfloat*, GLfloat*, GLfloat*, GLfloat*); extern pfn_glPointAlongPathNV fp_glPointAlongPathNV; +typedef void (APIENTRYP pfn_glMatrixLoad3x2fNV) (GLenum, const GLfloat*); +extern pfn_glMatrixLoad3x2fNV fp_glMatrixLoad3x2fNV; +typedef void (APIENTRYP pfn_glMatrixLoad3x3fNV) (GLenum, const GLfloat*); +extern pfn_glMatrixLoad3x3fNV fp_glMatrixLoad3x3fNV; +typedef void (APIENTRYP pfn_glMatrixLoadTranspose3x3fNV) (GLenum, const GLfloat*); +extern pfn_glMatrixLoadTranspose3x3fNV fp_glMatrixLoadTranspose3x3fNV; +typedef void (APIENTRYP pfn_glMatrixMult3x2fNV) (GLenum, const GLfloat*); +extern pfn_glMatrixMult3x2fNV fp_glMatrixMult3x2fNV; +typedef void (APIENTRYP pfn_glMatrixMult3x3fNV) (GLenum, const GLfloat*); +extern pfn_glMatrixMult3x3fNV fp_glMatrixMult3x3fNV; +typedef void (APIENTRYP pfn_glMatrixMultTranspose3x3fNV) (GLenum, const GLfloat*); +extern pfn_glMatrixMultTranspose3x3fNV fp_glMatrixMultTranspose3x3fNV; +typedef void (APIENTRYP pfn_glStencilThenCoverFillPathNV) (GLuint, GLenum, GLuint, GLenum); +extern pfn_glStencilThenCoverFillPathNV fp_glStencilThenCoverFillPathNV; +typedef void (APIENTRYP pfn_glStencilThenCoverStrokePathNV) (GLuint, GLint, GLuint, GLenum); +extern pfn_glStencilThenCoverStrokePathNV fp_glStencilThenCoverStrokePathNV; +typedef void (APIENTRYP pfn_glStencilThenCoverFillPathInstancedNV) (GLsizei, GLenum, const void*, GLuint, GLenum, GLuint, GLenum, GLenum, const GLfloat*); +extern pfn_glStencilThenCoverFillPathInstancedNV fp_glStencilThenCoverFillPathInstancedNV; +typedef void (APIENTRYP pfn_glStencilThenCoverStrokePathInstancedNV) (GLsizei, GLenum, const void*, GLuint, GLint, GLuint, GLenum, GLenum, const GLfloat*); +extern pfn_glStencilThenCoverStrokePathInstancedNV fp_glStencilThenCoverStrokePathInstancedNV; +typedef GLenum (APIENTRYP pfn_glPathGlyphIndexRangeNV) (GLenum, const void*, GLbitfield, GLuint, GLfloat, GLuint); +extern pfn_glPathGlyphIndexRangeNV fp_glPathGlyphIndexRangeNV; +typedef GLenum (APIENTRYP pfn_glPathGlyphIndexArrayNV) (GLuint, GLenum, const void*, GLbitfield, GLuint, GLsizei, GLuint, GLfloat); +extern pfn_glPathGlyphIndexArrayNV fp_glPathGlyphIndexArrayNV; +typedef GLenum (APIENTRYP pfn_glPathMemoryGlyphIndexArrayNV) (GLuint, GLenum, GLsizeiptr, const void*, GLsizei, GLuint, GLsizei, GLuint, GLfloat); +extern pfn_glPathMemoryGlyphIndexArrayNV fp_glPathMemoryGlyphIndexArrayNV; +typedef void (APIENTRYP pfn_glProgramPathFragmentInputGenNV) (GLuint, GLint, GLenum, GLint, const GLfloat*); +extern pfn_glProgramPathFragmentInputGenNV fp_glProgramPathFragmentInputGenNV; +typedef void (APIENTRYP pfn_glGetProgramResourcefvNV) (GLuint, GLenum, GLuint, GLsizei, const GLenum*, GLsizei, GLsizei*, GLfloat*); +extern pfn_glGetProgramResourcefvNV fp_glGetProgramResourcefvNV; +typedef void (APIENTRYP pfn_glPathColorGenNV) (GLenum, GLenum, GLenum, const GLfloat*); +extern pfn_glPathColorGenNV fp_glPathColorGenNV; +typedef void (APIENTRYP pfn_glPathTexGenNV) (GLenum, GLenum, GLint, const GLfloat*); +extern pfn_glPathTexGenNV fp_glPathTexGenNV; +typedef void (APIENTRYP pfn_glPathFogGenNV) (GLenum); +extern pfn_glPathFogGenNV fp_glPathFogGenNV; +typedef void (APIENTRYP pfn_glGetPathColorGenivNV) (GLenum, GLenum, GLint*); +extern pfn_glGetPathColorGenivNV fp_glGetPathColorGenivNV; +typedef void (APIENTRYP pfn_glGetPathColorGenfvNV) (GLenum, GLenum, GLfloat*); +extern pfn_glGetPathColorGenfvNV fp_glGetPathColorGenfvNV; +typedef void (APIENTRYP pfn_glGetPathTexGenivNV) (GLenum, GLenum, GLint*); +extern pfn_glGetPathTexGenivNV fp_glGetPathTexGenivNV; +typedef void (APIENTRYP pfn_glGetPathTexGenfvNV) (GLenum, GLenum, GLfloat*); +extern pfn_glGetPathTexGenfvNV fp_glGetPathTexGenfvNV; - /* GL_NV_pixel_data_range */ -extern GLboolean GLAD_NV_pixel_data_range; -#define GL_WRITE_PIXEL_DATA_RANGE_NV 0x8878 -#define GL_READ_PIXEL_DATA_RANGE_NV 0x8879 -#define GL_WRITE_PIXEL_DATA_RANGE_LENGTH_NV 0x887A -#define GL_READ_PIXEL_DATA_RANGE_LENGTH_NV 0x887B -#define GL_WRITE_PIXEL_DATA_RANGE_POINTER_NV 0x887C -#define GL_READ_PIXEL_DATA_RANGE_POINTER_NV 0x887D -typedef void (APIENTRYP pfn_glPixelDataRangeNV) (GLenum, GLsizei, const void*); -extern pfn_glPixelDataRangeNV fp_glPixelDataRangeNV; -typedef void (APIENTRYP pfn_glFlushPixelDataRangeNV) (GLenum); -extern pfn_glFlushPixelDataRangeNV fp_glFlushPixelDataRangeNV; - - /* GL_NV_point_sprite */ -extern GLboolean GLAD_NV_point_sprite; -#define GL_POINT_SPRITE_NV 0x8861 -#define GL_COORD_REPLACE_NV 0x8862 -#define GL_POINT_SPRITE_R_MODE_NV 0x8863 -typedef void (APIENTRYP pfn_glPointParameteriNV) (GLenum, GLint); -extern pfn_glPointParameteriNV fp_glPointParameteriNV; -typedef void (APIENTRYP pfn_glPointParameterivNV) (GLenum, const GLint*); -extern pfn_glPointParameterivNV fp_glPointParameterivNV; + /* GL_NV_path_rendering_shared_edge */ +extern GLboolean GLAD_NV_path_rendering_shared_edge; +#define GL_SHARED_EDGE_NV 0xC0 /* GL_NV_present_video */ extern GLboolean GLAD_NV_present_video; @@ -10043,91 +8677,25 @@ extern GLboolean GLAD_NV_read_depth_stencil; /* GL_NV_read_stencil */ extern GLboolean GLAD_NV_read_stencil; - /* GL_NV_register_combiners */ -extern GLboolean GLAD_NV_register_combiners; -#define GL_REGISTER_COMBINERS_NV 0x8522 -#define GL_VARIABLE_A_NV 0x8523 -#define GL_VARIABLE_B_NV 0x8524 -#define GL_VARIABLE_C_NV 0x8525 -#define GL_VARIABLE_D_NV 0x8526 -#define GL_VARIABLE_E_NV 0x8527 -#define GL_VARIABLE_F_NV 0x8528 -#define GL_VARIABLE_G_NV 0x8529 -#define GL_CONSTANT_COLOR0_NV 0x852A -#define GL_CONSTANT_COLOR1_NV 0x852B -#define GL_SPARE0_NV 0x852E -#define GL_SPARE1_NV 0x852F -#define GL_DISCARD_NV 0x8530 -#define GL_E_TIMES_F_NV 0x8531 -#define GL_SPARE0_PLUS_SECONDARY_COLOR_NV 0x8532 -#define GL_UNSIGNED_IDENTITY_NV 0x8536 -#define GL_UNSIGNED_INVERT_NV 0x8537 -#define GL_EXPAND_NORMAL_NV 0x8538 -#define GL_EXPAND_NEGATE_NV 0x8539 -#define GL_HALF_BIAS_NORMAL_NV 0x853A -#define GL_HALF_BIAS_NEGATE_NV 0x853B -#define GL_SIGNED_IDENTITY_NV 0x853C -#define GL_SIGNED_NEGATE_NV 0x853D -#define GL_SCALE_BY_TWO_NV 0x853E -#define GL_SCALE_BY_FOUR_NV 0x853F -#define GL_SCALE_BY_ONE_HALF_NV 0x8540 -#define GL_BIAS_BY_NEGATIVE_ONE_HALF_NV 0x8541 -#define GL_COMBINER_INPUT_NV 0x8542 -#define GL_COMBINER_MAPPING_NV 0x8543 -#define GL_COMBINER_COMPONENT_USAGE_NV 0x8544 -#define GL_COMBINER_AB_DOT_PRODUCT_NV 0x8545 -#define GL_COMBINER_CD_DOT_PRODUCT_NV 0x8546 -#define GL_COMBINER_MUX_SUM_NV 0x8547 -#define GL_COMBINER_SCALE_NV 0x8548 -#define GL_COMBINER_BIAS_NV 0x8549 -#define GL_COMBINER_AB_OUTPUT_NV 0x854A -#define GL_COMBINER_CD_OUTPUT_NV 0x854B -#define GL_COMBINER_SUM_OUTPUT_NV 0x854C -#define GL_MAX_GENERAL_COMBINERS_NV 0x854D -#define GL_NUM_GENERAL_COMBINERS_NV 0x854E -#define GL_COLOR_SUM_CLAMP_NV 0x854F -#define GL_COMBINER0_NV 0x8550 -#define GL_COMBINER1_NV 0x8551 -#define GL_COMBINER2_NV 0x8552 -#define GL_COMBINER3_NV 0x8553 -#define GL_COMBINER4_NV 0x8554 -#define GL_COMBINER5_NV 0x8555 -#define GL_COMBINER6_NV 0x8556 -#define GL_COMBINER7_NV 0x8557 -typedef void (APIENTRYP pfn_glCombinerParameterfvNV) (GLenum, const GLfloat*); -extern pfn_glCombinerParameterfvNV fp_glCombinerParameterfvNV; -typedef void (APIENTRYP pfn_glCombinerParameterfNV) (GLenum, GLfloat); -extern pfn_glCombinerParameterfNV fp_glCombinerParameterfNV; -typedef void (APIENTRYP pfn_glCombinerParameterivNV) (GLenum, const GLint*); -extern pfn_glCombinerParameterivNV fp_glCombinerParameterivNV; -typedef void (APIENTRYP pfn_glCombinerParameteriNV) (GLenum, GLint); -extern pfn_glCombinerParameteriNV fp_glCombinerParameteriNV; -typedef void (APIENTRYP pfn_glCombinerInputNV) (GLenum, GLenum, GLenum, GLenum, GLenum, GLenum); -extern pfn_glCombinerInputNV fp_glCombinerInputNV; -typedef void (APIENTRYP pfn_glCombinerOutputNV) (GLenum, GLenum, GLenum, GLenum, GLenum, GLenum, GLenum, GLboolean, GLboolean, GLboolean); -extern pfn_glCombinerOutputNV fp_glCombinerOutputNV; -typedef void (APIENTRYP pfn_glFinalCombinerInputNV) (GLenum, GLenum, GLenum, GLenum); -extern pfn_glFinalCombinerInputNV fp_glFinalCombinerInputNV; -typedef void (APIENTRYP pfn_glGetCombinerInputParameterfvNV) (GLenum, GLenum, GLenum, GLenum, GLfloat*); -extern pfn_glGetCombinerInputParameterfvNV fp_glGetCombinerInputParameterfvNV; -typedef void (APIENTRYP pfn_glGetCombinerInputParameterivNV) (GLenum, GLenum, GLenum, GLenum, GLint*); -extern pfn_glGetCombinerInputParameterivNV fp_glGetCombinerInputParameterivNV; -typedef void (APIENTRYP pfn_glGetCombinerOutputParameterfvNV) (GLenum, GLenum, GLenum, GLfloat*); -extern pfn_glGetCombinerOutputParameterfvNV fp_glGetCombinerOutputParameterfvNV; -typedef void (APIENTRYP pfn_glGetCombinerOutputParameterivNV) (GLenum, GLenum, GLenum, GLint*); -extern pfn_glGetCombinerOutputParameterivNV fp_glGetCombinerOutputParameterivNV; -typedef void (APIENTRYP pfn_glGetFinalCombinerInputParameterfvNV) (GLenum, GLenum, GLfloat*); -extern pfn_glGetFinalCombinerInputParameterfvNV fp_glGetFinalCombinerInputParameterfvNV; -typedef void (APIENTRYP pfn_glGetFinalCombinerInputParameterivNV) (GLenum, GLenum, GLint*); -extern pfn_glGetFinalCombinerInputParameterivNV fp_glGetFinalCombinerInputParameterivNV; + /* GL_NV_sample_locations */ +extern GLboolean GLAD_NV_sample_locations; +#define GL_SAMPLE_LOCATION_SUBPIXEL_BITS_NV 0x933D +#define GL_SAMPLE_LOCATION_PIXEL_GRID_WIDTH_NV 0x933E +#define GL_SAMPLE_LOCATION_PIXEL_GRID_HEIGHT_NV 0x933F +#define GL_PROGRAMMABLE_SAMPLE_LOCATION_TABLE_SIZE_NV 0x9340 +#define GL_SAMPLE_LOCATION_NV 0x8E50 +#define GL_PROGRAMMABLE_SAMPLE_LOCATION_NV 0x9341 +#define GL_FRAMEBUFFER_PROGRAMMABLE_SAMPLE_LOCATIONS_NV 0x9342 +#define GL_FRAMEBUFFER_SAMPLE_LOCATION_PIXEL_GRID_NV 0x9343 +typedef void (APIENTRYP pfn_glFramebufferSampleLocationsfvNV) (GLenum, GLuint, GLsizei, const GLfloat*); +extern pfn_glFramebufferSampleLocationsfvNV fp_glFramebufferSampleLocationsfvNV; +typedef void (APIENTRYP pfn_glNamedFramebufferSampleLocationsfvNV) (GLuint, GLuint, GLsizei, const GLfloat*); +extern pfn_glNamedFramebufferSampleLocationsfvNV fp_glNamedFramebufferSampleLocationsfvNV; +typedef void (APIENTRYP pfn_glResolveDepthValuesNV) (); +extern pfn_glResolveDepthValuesNV fp_glResolveDepthValuesNV; - /* GL_NV_register_combiners2 */ -extern GLboolean GLAD_NV_register_combiners2; -#define GL_PER_STAGE_CONSTANTS_NV 0x8535 -typedef void (APIENTRYP pfn_glCombinerStageParameterfvNV) (GLenum, GLenum, const GLfloat*); -extern pfn_glCombinerStageParameterfvNV fp_glCombinerStageParameterfvNV; -typedef void (APIENTRYP pfn_glGetCombinerStageParameterfvNV) (GLenum, GLenum, GLfloat*); -extern pfn_glGetCombinerStageParameterfvNV fp_glGetCombinerStageParameterfvNV; + /* GL_NV_sample_mask_override_coverage */ +extern GLboolean GLAD_NV_sample_mask_override_coverage; /* GL_NV_shader_atomic_counters */ extern GLboolean GLAD_NV_shader_atomic_counters; @@ -10135,6 +8703,12 @@ extern GLboolean GLAD_NV_shader_atomic_counters; /* GL_NV_shader_atomic_float */ extern GLboolean GLAD_NV_shader_atomic_float; + /* GL_NV_shader_atomic_fp16_vector */ +extern GLboolean GLAD_NV_shader_atomic_fp16_vector; + + /* GL_NV_shader_atomic_int64 */ +extern GLboolean GLAD_NV_shader_atomic_int64; + /* GL_NV_shader_buffer_load */ extern GLboolean GLAD_NV_shader_buffer_load; #define GL_BUFFER_GPU_ADDRESS_NV 0x8F1D @@ -10162,8 +8736,6 @@ typedef void (APIENTRYP pfn_glUniformui64NV) (GLint, GLuint64EXT); extern pfn_glUniformui64NV fp_glUniformui64NV; typedef void (APIENTRYP pfn_glUniformui64vNV) (GLint, GLsizei, const GLuint64EXT*); extern pfn_glUniformui64vNV fp_glUniformui64vNV; -typedef void (APIENTRYP pfn_glGetUniformui64vNV) (GLuint, GLint, GLuint64EXT*); -extern pfn_glGetUniformui64vNV fp_glGetUniformui64vNV; typedef void (APIENTRYP pfn_glProgramUniformui64NV) (GLuint, GLint, GLuint64EXT); extern pfn_glProgramUniformui64NV fp_glProgramUniformui64NV; typedef void (APIENTRYP pfn_glProgramUniformui64vNV) (GLuint, GLint, GLsizei, const GLuint64EXT*); @@ -10173,9 +8745,21 @@ extern pfn_glProgramUniformui64vNV fp_glProgramUniformui64vNV; extern GLboolean GLAD_NV_shader_buffer_store; #define GL_SHADER_GLOBAL_ACCESS_BARRIER_BIT_NV 0x00000010 + /* GL_NV_shader_noperspective_interpolation */ +extern GLboolean GLAD_NV_shader_noperspective_interpolation; + /* GL_NV_shader_storage_buffer_object */ extern GLboolean GLAD_NV_shader_storage_buffer_object; + /* GL_NV_shader_thread_group */ +extern GLboolean GLAD_NV_shader_thread_group; +#define GL_WARP_SIZE_NV 0x9339 +#define GL_WARPS_PER_SM_NV 0x933A +#define GL_SM_COUNT_NV 0x933B + + /* GL_NV_shader_thread_shuffle */ +extern GLboolean GLAD_NV_shader_thread_shuffle; + /* GL_NV_shadow_samplers_array */ extern GLboolean GLAD_NV_shadow_samplers_array; #define GL_SAMPLER_2D_ARRAY_SHADOW_NV 0x8DC4 @@ -10205,17 +8789,6 @@ extern GLboolean GLAD_NV_tessellation_program5; #define GL_TESS_CONTROL_PROGRAM_PARAMETER_BUFFER_NV 0x8C74 #define GL_TESS_EVALUATION_PROGRAM_PARAMETER_BUFFER_NV 0x8C75 - /* GL_NV_texgen_emboss */ -extern GLboolean GLAD_NV_texgen_emboss; -#define GL_EMBOSS_LIGHT_NV 0x855D -#define GL_EMBOSS_CONSTANT_NV 0x855E -#define GL_EMBOSS_MAP_NV 0x855F - - /* GL_NV_texgen_reflection */ -extern GLboolean GLAD_NV_texgen_reflection; -#define GL_NORMAL_MAP_NV 0x8511 -#define GL_REFLECTION_MAP_NV 0x8512 - /* GL_NV_texture_barrier */ extern GLboolean GLAD_NV_texture_barrier; typedef void (APIENTRYP pfn_glTextureBarrierNV) (); @@ -10229,21 +8802,6 @@ extern GLboolean GLAD_NV_texture_border_clamp; /* GL_NV_texture_compression_s3tc_update */ extern GLboolean GLAD_NV_texture_compression_s3tc_update; - /* GL_NV_texture_compression_vtc */ -extern GLboolean GLAD_NV_texture_compression_vtc; - - /* GL_NV_texture_env_combine4 */ -extern GLboolean GLAD_NV_texture_env_combine4; -#define GL_COMBINE4_NV 0x8503 -#define GL_SOURCE3_RGB_NV 0x8583 -#define GL_SOURCE3_ALPHA_NV 0x858B -#define GL_OPERAND3_RGB_NV 0x8593 -#define GL_OPERAND3_ALPHA_NV 0x859B - - /* GL_NV_texture_expand_normal */ -extern GLboolean GLAD_NV_texture_expand_normal; -#define GL_TEXTURE_UNSIGNED_REMAP_MODE_NV 0x888F - /* GL_NV_texture_multisample */ extern GLboolean GLAD_NV_texture_multisample; #define GL_TEXTURE_COVERAGE_SAMPLES_NV 0x9045 @@ -10264,113 +8822,6 @@ extern pfn_glTextureImage3DMultisampleCoverageNV fp_glTextureImage3DMultisampleC /* GL_NV_texture_npot_2D_mipmap */ extern GLboolean GLAD_NV_texture_npot_2D_mipmap; - /* GL_NV_texture_rectangle */ -extern GLboolean GLAD_NV_texture_rectangle; -#define GL_TEXTURE_RECTANGLE_NV 0x84F5 -#define GL_TEXTURE_BINDING_RECTANGLE_NV 0x84F6 -#define GL_PROXY_TEXTURE_RECTANGLE_NV 0x84F7 -#define GL_MAX_RECTANGLE_TEXTURE_SIZE_NV 0x84F8 - - /* GL_NV_texture_shader */ -extern GLboolean GLAD_NV_texture_shader; -#define GL_OFFSET_TEXTURE_RECTANGLE_NV 0x864C -#define GL_OFFSET_TEXTURE_RECTANGLE_SCALE_NV 0x864D -#define GL_DOT_PRODUCT_TEXTURE_RECTANGLE_NV 0x864E -#define GL_RGBA_UNSIGNED_DOT_PRODUCT_MAPPING_NV 0x86D9 -#define GL_UNSIGNED_INT_S8_S8_8_8_NV 0x86DA -#define GL_UNSIGNED_INT_8_8_S8_S8_REV_NV 0x86DB -#define GL_DSDT_MAG_INTENSITY_NV 0x86DC -#define GL_SHADER_CONSISTENT_NV 0x86DD -#define GL_TEXTURE_SHADER_NV 0x86DE -#define GL_SHADER_OPERATION_NV 0x86DF -#define GL_CULL_MODES_NV 0x86E0 -#define GL_OFFSET_TEXTURE_MATRIX_NV 0x86E1 -#define GL_OFFSET_TEXTURE_SCALE_NV 0x86E2 -#define GL_OFFSET_TEXTURE_BIAS_NV 0x86E3 -#define GL_OFFSET_TEXTURE_2D_MATRIX_NV 0x86E1 -#define GL_OFFSET_TEXTURE_2D_SCALE_NV 0x86E2 -#define GL_OFFSET_TEXTURE_2D_BIAS_NV 0x86E3 -#define GL_PREVIOUS_TEXTURE_INPUT_NV 0x86E4 -#define GL_CONST_EYE_NV 0x86E5 -#define GL_PASS_THROUGH_NV 0x86E6 -#define GL_CULL_FRAGMENT_NV 0x86E7 -#define GL_OFFSET_TEXTURE_2D_NV 0x86E8 -#define GL_DEPENDENT_AR_TEXTURE_2D_NV 0x86E9 -#define GL_DEPENDENT_GB_TEXTURE_2D_NV 0x86EA -#define GL_DOT_PRODUCT_NV 0x86EC -#define GL_DOT_PRODUCT_DEPTH_REPLACE_NV 0x86ED -#define GL_DOT_PRODUCT_TEXTURE_2D_NV 0x86EE -#define GL_DOT_PRODUCT_TEXTURE_CUBE_MAP_NV 0x86F0 -#define GL_DOT_PRODUCT_DIFFUSE_CUBE_MAP_NV 0x86F1 -#define GL_DOT_PRODUCT_REFLECT_CUBE_MAP_NV 0x86F2 -#define GL_DOT_PRODUCT_CONST_EYE_REFLECT_CUBE_MAP_NV 0x86F3 -#define GL_HILO_NV 0x86F4 -#define GL_DSDT_NV 0x86F5 -#define GL_DSDT_MAG_NV 0x86F6 -#define GL_DSDT_MAG_VIB_NV 0x86F7 -#define GL_HILO16_NV 0x86F8 -#define GL_SIGNED_HILO_NV 0x86F9 -#define GL_SIGNED_HILO16_NV 0x86FA -#define GL_SIGNED_RGBA_NV 0x86FB -#define GL_SIGNED_RGBA8_NV 0x86FC -#define GL_SIGNED_RGB_NV 0x86FE -#define GL_SIGNED_RGB8_NV 0x86FF -#define GL_SIGNED_LUMINANCE_NV 0x8701 -#define GL_SIGNED_LUMINANCE8_NV 0x8702 -#define GL_SIGNED_LUMINANCE_ALPHA_NV 0x8703 -#define GL_SIGNED_LUMINANCE8_ALPHA8_NV 0x8704 -#define GL_SIGNED_ALPHA_NV 0x8705 -#define GL_SIGNED_ALPHA8_NV 0x8706 -#define GL_SIGNED_INTENSITY_NV 0x8707 -#define GL_SIGNED_INTENSITY8_NV 0x8708 -#define GL_DSDT8_NV 0x8709 -#define GL_DSDT8_MAG8_NV 0x870A -#define GL_DSDT8_MAG8_INTENSITY8_NV 0x870B -#define GL_SIGNED_RGB_UNSIGNED_ALPHA_NV 0x870C -#define GL_SIGNED_RGB8_UNSIGNED_ALPHA8_NV 0x870D -#define GL_HI_SCALE_NV 0x870E -#define GL_LO_SCALE_NV 0x870F -#define GL_DS_SCALE_NV 0x8710 -#define GL_DT_SCALE_NV 0x8711 -#define GL_MAGNITUDE_SCALE_NV 0x8712 -#define GL_VIBRANCE_SCALE_NV 0x8713 -#define GL_HI_BIAS_NV 0x8714 -#define GL_LO_BIAS_NV 0x8715 -#define GL_DS_BIAS_NV 0x8716 -#define GL_DT_BIAS_NV 0x8717 -#define GL_MAGNITUDE_BIAS_NV 0x8718 -#define GL_VIBRANCE_BIAS_NV 0x8719 -#define GL_TEXTURE_BORDER_VALUES_NV 0x871A -#define GL_TEXTURE_HI_SIZE_NV 0x871B -#define GL_TEXTURE_LO_SIZE_NV 0x871C -#define GL_TEXTURE_DS_SIZE_NV 0x871D -#define GL_TEXTURE_DT_SIZE_NV 0x871E -#define GL_TEXTURE_MAG_SIZE_NV 0x871F - - /* GL_NV_texture_shader2 */ -extern GLboolean GLAD_NV_texture_shader2; -#define GL_DOT_PRODUCT_TEXTURE_3D_NV 0x86EF - - /* GL_NV_texture_shader3 */ -extern GLboolean GLAD_NV_texture_shader3; -#define GL_OFFSET_PROJECTIVE_TEXTURE_2D_NV 0x8850 -#define GL_OFFSET_PROJECTIVE_TEXTURE_2D_SCALE_NV 0x8851 -#define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8852 -#define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_SCALE_NV 0x8853 -#define GL_OFFSET_HILO_TEXTURE_2D_NV 0x8854 -#define GL_OFFSET_HILO_TEXTURE_RECTANGLE_NV 0x8855 -#define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_2D_NV 0x8856 -#define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8857 -#define GL_DEPENDENT_HILO_TEXTURE_2D_NV 0x8858 -#define GL_DEPENDENT_RGB_TEXTURE_3D_NV 0x8859 -#define GL_DEPENDENT_RGB_TEXTURE_CUBE_MAP_NV 0x885A -#define GL_DOT_PRODUCT_PASS_THROUGH_NV 0x885B -#define GL_DOT_PRODUCT_TEXTURE_1D_NV 0x885C -#define GL_DOT_PRODUCT_AFFINE_DEPTH_REPLACE_NV 0x885D -#define GL_HILO8_NV 0x885E -#define GL_SIGNED_HILO8_NV 0x885F -#define GL_FORCE_BLUE_TO_ONE_NV 0x8860 - /* GL_NV_transform_feedback */ extern GLboolean GLAD_NV_transform_feedback; #define GL_BACK_PRIMARY_COLOR_NV 0x8C77 @@ -10408,7 +8859,7 @@ typedef void (APIENTRYP pfn_glBeginTransformFeedbackNV) (GLenum); extern pfn_glBeginTransformFeedbackNV fp_glBeginTransformFeedbackNV; typedef void (APIENTRYP pfn_glEndTransformFeedbackNV) (); extern pfn_glEndTransformFeedbackNV fp_glEndTransformFeedbackNV; -typedef void (APIENTRYP pfn_glTransformFeedbackAttribsNV) (GLuint, const GLint*, GLenum); +typedef void (APIENTRYP pfn_glTransformFeedbackAttribsNV) (GLsizei, const GLint*, GLenum); extern pfn_glTransformFeedbackAttribsNV fp_glTransformFeedbackAttribsNV; typedef void (APIENTRYP pfn_glBindBufferRangeNV) (GLenum, GLuint, GLuint, GLintptr, GLsizeiptr); extern pfn_glBindBufferRangeNV fp_glBindBufferRangeNV; @@ -10450,6 +8901,12 @@ extern pfn_glResumeTransformFeedbackNV fp_glResumeTransformFeedbackNV; typedef void (APIENTRYP pfn_glDrawTransformFeedbackNV) (GLenum, GLuint); extern pfn_glDrawTransformFeedbackNV fp_glDrawTransformFeedbackNV; + /* GL_NV_uniform_buffer_unified_memory */ +extern GLboolean GLAD_NV_uniform_buffer_unified_memory; +#define GL_UNIFORM_BUFFER_UNIFIED_NV 0x936E +#define GL_UNIFORM_BUFFER_ADDRESS_NV 0x936F +#define GL_UNIFORM_BUFFER_LENGTH_NV 0x9370 + /* GL_NV_vdpau_interop */ extern GLboolean GLAD_NV_vdpau_interop; #define GL_SURFACE_STATE_NV 0x86EB @@ -10464,7 +8921,7 @@ typedef GLvdpauSurfaceNV (APIENTRYP pfn_glVDPAURegisterVideoSurfaceNV) (const vo extern pfn_glVDPAURegisterVideoSurfaceNV fp_glVDPAURegisterVideoSurfaceNV; typedef GLvdpauSurfaceNV (APIENTRYP pfn_glVDPAURegisterOutputSurfaceNV) (const void*, GLenum, GLsizei, const GLuint*); extern pfn_glVDPAURegisterOutputSurfaceNV fp_glVDPAURegisterOutputSurfaceNV; -typedef void (APIENTRYP pfn_glVDPAUIsSurfaceNV) (GLvdpauSurfaceNV); +typedef GLboolean (APIENTRYP pfn_glVDPAUIsSurfaceNV) (GLvdpauSurfaceNV); extern pfn_glVDPAUIsSurfaceNV fp_glVDPAUIsSurfaceNV; typedef void (APIENTRYP pfn_glVDPAUUnregisterSurfaceNV) (GLvdpauSurfaceNV); extern pfn_glVDPAUUnregisterSurfaceNV fp_glVDPAUUnregisterSurfaceNV; @@ -10477,22 +8934,6 @@ extern pfn_glVDPAUMapSurfacesNV fp_glVDPAUMapSurfacesNV; typedef void (APIENTRYP pfn_glVDPAUUnmapSurfacesNV) (GLsizei, const GLvdpauSurfaceNV*); extern pfn_glVDPAUUnmapSurfacesNV fp_glVDPAUUnmapSurfacesNV; - /* GL_NV_vertex_array_range */ -extern GLboolean GLAD_NV_vertex_array_range; -#define GL_VERTEX_ARRAY_RANGE_NV 0x851D -#define GL_VERTEX_ARRAY_RANGE_LENGTH_NV 0x851E -#define GL_VERTEX_ARRAY_RANGE_VALID_NV 0x851F -#define GL_MAX_VERTEX_ARRAY_RANGE_ELEMENT_NV 0x8520 -#define GL_VERTEX_ARRAY_RANGE_POINTER_NV 0x8521 -typedef void (APIENTRYP pfn_glFlushVertexArrayRangeNV) (); -extern pfn_glFlushVertexArrayRangeNV fp_glFlushVertexArrayRangeNV; -typedef void (APIENTRYP pfn_glVertexArrayRangeNV) (GLsizei, const void*); -extern pfn_glVertexArrayRangeNV fp_glVertexArrayRangeNV; - - /* GL_NV_vertex_array_range2 */ -extern GLboolean GLAD_NV_vertex_array_range2; -#define GL_VERTEX_ARRAY_RANGE_WITHOUT_FLUSH_NV 0x8533 - /* GL_NV_vertex_attrib_integer_64bit */ extern GLboolean GLAD_NV_vertex_attrib_integer_64bit; typedef void (APIENTRYP pfn_glVertexAttribL1i64NV) (GLuint, GLint64EXT); @@ -10586,232 +9027,6 @@ extern pfn_glVertexAttribIFormatNV fp_glVertexAttribIFormatNV; typedef void (APIENTRYP pfn_glGetIntegerui64i_vNV) (GLenum, GLuint, GLuint64EXT*); extern pfn_glGetIntegerui64i_vNV fp_glGetIntegerui64i_vNV; - /* GL_NV_vertex_program */ -extern GLboolean GLAD_NV_vertex_program; -#define GL_VERTEX_PROGRAM_NV 0x8620 -#define GL_VERTEX_STATE_PROGRAM_NV 0x8621 -#define GL_ATTRIB_ARRAY_SIZE_NV 0x8623 -#define GL_ATTRIB_ARRAY_STRIDE_NV 0x8624 -#define GL_ATTRIB_ARRAY_TYPE_NV 0x8625 -#define GL_CURRENT_ATTRIB_NV 0x8626 -#define GL_PROGRAM_LENGTH_NV 0x8627 -#define GL_PROGRAM_STRING_NV 0x8628 -#define GL_MODELVIEW_PROJECTION_NV 0x8629 -#define GL_IDENTITY_NV 0x862A -#define GL_INVERSE_NV 0x862B -#define GL_TRANSPOSE_NV 0x862C -#define GL_INVERSE_TRANSPOSE_NV 0x862D -#define GL_MAX_TRACK_MATRIX_STACK_DEPTH_NV 0x862E -#define GL_MAX_TRACK_MATRICES_NV 0x862F -#define GL_MATRIX0_NV 0x8630 -#define GL_MATRIX1_NV 0x8631 -#define GL_MATRIX2_NV 0x8632 -#define GL_MATRIX3_NV 0x8633 -#define GL_MATRIX4_NV 0x8634 -#define GL_MATRIX5_NV 0x8635 -#define GL_MATRIX6_NV 0x8636 -#define GL_MATRIX7_NV 0x8637 -#define GL_CURRENT_MATRIX_STACK_DEPTH_NV 0x8640 -#define GL_CURRENT_MATRIX_NV 0x8641 -#define GL_VERTEX_PROGRAM_POINT_SIZE_NV 0x8642 -#define GL_VERTEX_PROGRAM_TWO_SIDE_NV 0x8643 -#define GL_PROGRAM_PARAMETER_NV 0x8644 -#define GL_ATTRIB_ARRAY_POINTER_NV 0x8645 -#define GL_PROGRAM_TARGET_NV 0x8646 -#define GL_PROGRAM_RESIDENT_NV 0x8647 -#define GL_TRACK_MATRIX_NV 0x8648 -#define GL_TRACK_MATRIX_TRANSFORM_NV 0x8649 -#define GL_VERTEX_PROGRAM_BINDING_NV 0x864A -#define GL_PROGRAM_ERROR_POSITION_NV 0x864B -#define GL_VERTEX_ATTRIB_ARRAY0_NV 0x8650 -#define GL_VERTEX_ATTRIB_ARRAY1_NV 0x8651 -#define GL_VERTEX_ATTRIB_ARRAY2_NV 0x8652 -#define GL_VERTEX_ATTRIB_ARRAY3_NV 0x8653 -#define GL_VERTEX_ATTRIB_ARRAY4_NV 0x8654 -#define GL_VERTEX_ATTRIB_ARRAY5_NV 0x8655 -#define GL_VERTEX_ATTRIB_ARRAY6_NV 0x8656 -#define GL_VERTEX_ATTRIB_ARRAY7_NV 0x8657 -#define GL_VERTEX_ATTRIB_ARRAY8_NV 0x8658 -#define GL_VERTEX_ATTRIB_ARRAY9_NV 0x8659 -#define GL_VERTEX_ATTRIB_ARRAY10_NV 0x865A -#define GL_VERTEX_ATTRIB_ARRAY11_NV 0x865B -#define GL_VERTEX_ATTRIB_ARRAY12_NV 0x865C -#define GL_VERTEX_ATTRIB_ARRAY13_NV 0x865D -#define GL_VERTEX_ATTRIB_ARRAY14_NV 0x865E -#define GL_VERTEX_ATTRIB_ARRAY15_NV 0x865F -#define GL_MAP1_VERTEX_ATTRIB0_4_NV 0x8660 -#define GL_MAP1_VERTEX_ATTRIB1_4_NV 0x8661 -#define GL_MAP1_VERTEX_ATTRIB2_4_NV 0x8662 -#define GL_MAP1_VERTEX_ATTRIB3_4_NV 0x8663 -#define GL_MAP1_VERTEX_ATTRIB4_4_NV 0x8664 -#define GL_MAP1_VERTEX_ATTRIB5_4_NV 0x8665 -#define GL_MAP1_VERTEX_ATTRIB6_4_NV 0x8666 -#define GL_MAP1_VERTEX_ATTRIB7_4_NV 0x8667 -#define GL_MAP1_VERTEX_ATTRIB8_4_NV 0x8668 -#define GL_MAP1_VERTEX_ATTRIB9_4_NV 0x8669 -#define GL_MAP1_VERTEX_ATTRIB10_4_NV 0x866A -#define GL_MAP1_VERTEX_ATTRIB11_4_NV 0x866B -#define GL_MAP1_VERTEX_ATTRIB12_4_NV 0x866C -#define GL_MAP1_VERTEX_ATTRIB13_4_NV 0x866D -#define GL_MAP1_VERTEX_ATTRIB14_4_NV 0x866E -#define GL_MAP1_VERTEX_ATTRIB15_4_NV 0x866F -#define GL_MAP2_VERTEX_ATTRIB0_4_NV 0x8670 -#define GL_MAP2_VERTEX_ATTRIB1_4_NV 0x8671 -#define GL_MAP2_VERTEX_ATTRIB2_4_NV 0x8672 -#define GL_MAP2_VERTEX_ATTRIB3_4_NV 0x8673 -#define GL_MAP2_VERTEX_ATTRIB4_4_NV 0x8674 -#define GL_MAP2_VERTEX_ATTRIB5_4_NV 0x8675 -#define GL_MAP2_VERTEX_ATTRIB6_4_NV 0x8676 -#define GL_MAP2_VERTEX_ATTRIB7_4_NV 0x8677 -#define GL_MAP2_VERTEX_ATTRIB8_4_NV 0x8678 -#define GL_MAP2_VERTEX_ATTRIB9_4_NV 0x8679 -#define GL_MAP2_VERTEX_ATTRIB10_4_NV 0x867A -#define GL_MAP2_VERTEX_ATTRIB11_4_NV 0x867B -#define GL_MAP2_VERTEX_ATTRIB12_4_NV 0x867C -#define GL_MAP2_VERTEX_ATTRIB13_4_NV 0x867D -#define GL_MAP2_VERTEX_ATTRIB14_4_NV 0x867E -#define GL_MAP2_VERTEX_ATTRIB15_4_NV 0x867F -typedef GLboolean (APIENTRYP pfn_glAreProgramsResidentNV) (GLsizei, const GLuint*, GLboolean*); -extern pfn_glAreProgramsResidentNV fp_glAreProgramsResidentNV; -typedef void (APIENTRYP pfn_glBindProgramNV) (GLenum, GLuint); -extern pfn_glBindProgramNV fp_glBindProgramNV; -typedef void (APIENTRYP pfn_glDeleteProgramsNV) (GLsizei, const GLuint*); -extern pfn_glDeleteProgramsNV fp_glDeleteProgramsNV; -typedef void (APIENTRYP pfn_glExecuteProgramNV) (GLenum, GLuint, const GLfloat*); -extern pfn_glExecuteProgramNV fp_glExecuteProgramNV; -typedef void (APIENTRYP pfn_glGenProgramsNV) (GLsizei, GLuint*); -extern pfn_glGenProgramsNV fp_glGenProgramsNV; -typedef void (APIENTRYP pfn_glGetProgramParameterdvNV) (GLenum, GLuint, GLenum, GLdouble*); -extern pfn_glGetProgramParameterdvNV fp_glGetProgramParameterdvNV; -typedef void (APIENTRYP pfn_glGetProgramParameterfvNV) (GLenum, GLuint, GLenum, GLfloat*); -extern pfn_glGetProgramParameterfvNV fp_glGetProgramParameterfvNV; -typedef void (APIENTRYP pfn_glGetProgramivNV) (GLuint, GLenum, GLint*); -extern pfn_glGetProgramivNV fp_glGetProgramivNV; -typedef void (APIENTRYP pfn_glGetProgramStringNV) (GLuint, GLenum, GLubyte*); -extern pfn_glGetProgramStringNV fp_glGetProgramStringNV; -typedef void (APIENTRYP pfn_glGetTrackMatrixivNV) (GLenum, GLuint, GLenum, GLint*); -extern pfn_glGetTrackMatrixivNV fp_glGetTrackMatrixivNV; -typedef void (APIENTRYP pfn_glGetVertexAttribdvNV) (GLuint, GLenum, GLdouble*); -extern pfn_glGetVertexAttribdvNV fp_glGetVertexAttribdvNV; -typedef void (APIENTRYP pfn_glGetVertexAttribfvNV) (GLuint, GLenum, GLfloat*); -extern pfn_glGetVertexAttribfvNV fp_glGetVertexAttribfvNV; -typedef void (APIENTRYP pfn_glGetVertexAttribivNV) (GLuint, GLenum, GLint*); -extern pfn_glGetVertexAttribivNV fp_glGetVertexAttribivNV; -typedef void (APIENTRYP pfn_glGetVertexAttribPointervNV) (GLuint, GLenum, void**); -extern pfn_glGetVertexAttribPointervNV fp_glGetVertexAttribPointervNV; -typedef GLboolean (APIENTRYP pfn_glIsProgramNV) (GLuint); -extern pfn_glIsProgramNV fp_glIsProgramNV; -typedef void (APIENTRYP pfn_glLoadProgramNV) (GLenum, GLuint, GLsizei, const GLubyte*); -extern pfn_glLoadProgramNV fp_glLoadProgramNV; -typedef void (APIENTRYP pfn_glProgramParameter4dNV) (GLenum, GLuint, GLdouble, GLdouble, GLdouble, GLdouble); -extern pfn_glProgramParameter4dNV fp_glProgramParameter4dNV; -typedef void (APIENTRYP pfn_glProgramParameter4dvNV) (GLenum, GLuint, const GLdouble*); -extern pfn_glProgramParameter4dvNV fp_glProgramParameter4dvNV; -typedef void (APIENTRYP pfn_glProgramParameter4fNV) (GLenum, GLuint, GLfloat, GLfloat, GLfloat, GLfloat); -extern pfn_glProgramParameter4fNV fp_glProgramParameter4fNV; -typedef void (APIENTRYP pfn_glProgramParameter4fvNV) (GLenum, GLuint, const GLfloat*); -extern pfn_glProgramParameter4fvNV fp_glProgramParameter4fvNV; -typedef void (APIENTRYP pfn_glProgramParameters4dvNV) (GLenum, GLuint, GLsizei, const GLdouble*); -extern pfn_glProgramParameters4dvNV fp_glProgramParameters4dvNV; -typedef void (APIENTRYP pfn_glProgramParameters4fvNV) (GLenum, GLuint, GLsizei, const GLfloat*); -extern pfn_glProgramParameters4fvNV fp_glProgramParameters4fvNV; -typedef void (APIENTRYP pfn_glRequestResidentProgramsNV) (GLsizei, const GLuint*); -extern pfn_glRequestResidentProgramsNV fp_glRequestResidentProgramsNV; -typedef void (APIENTRYP pfn_glTrackMatrixNV) (GLenum, GLuint, GLenum, GLenum); -extern pfn_glTrackMatrixNV fp_glTrackMatrixNV; -typedef void (APIENTRYP pfn_glVertexAttribPointerNV) (GLuint, GLint, GLenum, GLsizei, const void*); -extern pfn_glVertexAttribPointerNV fp_glVertexAttribPointerNV; -typedef void (APIENTRYP pfn_glVertexAttrib1dNV) (GLuint, GLdouble); -extern pfn_glVertexAttrib1dNV fp_glVertexAttrib1dNV; -typedef void (APIENTRYP pfn_glVertexAttrib1dvNV) (GLuint, const GLdouble*); -extern pfn_glVertexAttrib1dvNV fp_glVertexAttrib1dvNV; -typedef void (APIENTRYP pfn_glVertexAttrib1fNV) (GLuint, GLfloat); -extern pfn_glVertexAttrib1fNV fp_glVertexAttrib1fNV; -typedef void (APIENTRYP pfn_glVertexAttrib1fvNV) (GLuint, const GLfloat*); -extern pfn_glVertexAttrib1fvNV fp_glVertexAttrib1fvNV; -typedef void (APIENTRYP pfn_glVertexAttrib1sNV) (GLuint, GLshort); -extern pfn_glVertexAttrib1sNV fp_glVertexAttrib1sNV; -typedef void (APIENTRYP pfn_glVertexAttrib1svNV) (GLuint, const GLshort*); -extern pfn_glVertexAttrib1svNV fp_glVertexAttrib1svNV; -typedef void (APIENTRYP pfn_glVertexAttrib2dNV) (GLuint, GLdouble, GLdouble); -extern pfn_glVertexAttrib2dNV fp_glVertexAttrib2dNV; -typedef void (APIENTRYP pfn_glVertexAttrib2dvNV) (GLuint, const GLdouble*); -extern pfn_glVertexAttrib2dvNV fp_glVertexAttrib2dvNV; -typedef void (APIENTRYP pfn_glVertexAttrib2fNV) (GLuint, GLfloat, GLfloat); -extern pfn_glVertexAttrib2fNV fp_glVertexAttrib2fNV; -typedef void (APIENTRYP pfn_glVertexAttrib2fvNV) (GLuint, const GLfloat*); -extern pfn_glVertexAttrib2fvNV fp_glVertexAttrib2fvNV; -typedef void (APIENTRYP pfn_glVertexAttrib2sNV) (GLuint, GLshort, GLshort); -extern pfn_glVertexAttrib2sNV fp_glVertexAttrib2sNV; -typedef void (APIENTRYP pfn_glVertexAttrib2svNV) (GLuint, const GLshort*); -extern pfn_glVertexAttrib2svNV fp_glVertexAttrib2svNV; -typedef void (APIENTRYP pfn_glVertexAttrib3dNV) (GLuint, GLdouble, GLdouble, GLdouble); -extern pfn_glVertexAttrib3dNV fp_glVertexAttrib3dNV; -typedef void (APIENTRYP pfn_glVertexAttrib3dvNV) (GLuint, const GLdouble*); -extern pfn_glVertexAttrib3dvNV fp_glVertexAttrib3dvNV; -typedef void (APIENTRYP pfn_glVertexAttrib3fNV) (GLuint, GLfloat, GLfloat, GLfloat); -extern pfn_glVertexAttrib3fNV fp_glVertexAttrib3fNV; -typedef void (APIENTRYP pfn_glVertexAttrib3fvNV) (GLuint, const GLfloat*); -extern pfn_glVertexAttrib3fvNV fp_glVertexAttrib3fvNV; -typedef void (APIENTRYP pfn_glVertexAttrib3sNV) (GLuint, GLshort, GLshort, GLshort); -extern pfn_glVertexAttrib3sNV fp_glVertexAttrib3sNV; -typedef void (APIENTRYP pfn_glVertexAttrib3svNV) (GLuint, const GLshort*); -extern pfn_glVertexAttrib3svNV fp_glVertexAttrib3svNV; -typedef void (APIENTRYP pfn_glVertexAttrib4dNV) (GLuint, GLdouble, GLdouble, GLdouble, GLdouble); -extern pfn_glVertexAttrib4dNV fp_glVertexAttrib4dNV; -typedef void (APIENTRYP pfn_glVertexAttrib4dvNV) (GLuint, const GLdouble*); -extern pfn_glVertexAttrib4dvNV fp_glVertexAttrib4dvNV; -typedef void (APIENTRYP pfn_glVertexAttrib4fNV) (GLuint, GLfloat, GLfloat, GLfloat, GLfloat); -extern pfn_glVertexAttrib4fNV fp_glVertexAttrib4fNV; -typedef void (APIENTRYP pfn_glVertexAttrib4fvNV) (GLuint, const GLfloat*); -extern pfn_glVertexAttrib4fvNV fp_glVertexAttrib4fvNV; -typedef void (APIENTRYP pfn_glVertexAttrib4sNV) (GLuint, GLshort, GLshort, GLshort, GLshort); -extern pfn_glVertexAttrib4sNV fp_glVertexAttrib4sNV; -typedef void (APIENTRYP pfn_glVertexAttrib4svNV) (GLuint, const GLshort*); -extern pfn_glVertexAttrib4svNV fp_glVertexAttrib4svNV; -typedef void (APIENTRYP pfn_glVertexAttrib4ubNV) (GLuint, GLubyte, GLubyte, GLubyte, GLubyte); -extern pfn_glVertexAttrib4ubNV fp_glVertexAttrib4ubNV; -typedef void (APIENTRYP pfn_glVertexAttrib4ubvNV) (GLuint, const GLubyte*); -extern pfn_glVertexAttrib4ubvNV fp_glVertexAttrib4ubvNV; -typedef void (APIENTRYP pfn_glVertexAttribs1dvNV) (GLuint, GLsizei, const GLdouble*); -extern pfn_glVertexAttribs1dvNV fp_glVertexAttribs1dvNV; -typedef void (APIENTRYP pfn_glVertexAttribs1fvNV) (GLuint, GLsizei, const GLfloat*); -extern pfn_glVertexAttribs1fvNV fp_glVertexAttribs1fvNV; -typedef void (APIENTRYP pfn_glVertexAttribs1svNV) (GLuint, GLsizei, const GLshort*); -extern pfn_glVertexAttribs1svNV fp_glVertexAttribs1svNV; -typedef void (APIENTRYP pfn_glVertexAttribs2dvNV) (GLuint, GLsizei, const GLdouble*); -extern pfn_glVertexAttribs2dvNV fp_glVertexAttribs2dvNV; -typedef void (APIENTRYP pfn_glVertexAttribs2fvNV) (GLuint, GLsizei, const GLfloat*); -extern pfn_glVertexAttribs2fvNV fp_glVertexAttribs2fvNV; -typedef void (APIENTRYP pfn_glVertexAttribs2svNV) (GLuint, GLsizei, const GLshort*); -extern pfn_glVertexAttribs2svNV fp_glVertexAttribs2svNV; -typedef void (APIENTRYP pfn_glVertexAttribs3dvNV) (GLuint, GLsizei, const GLdouble*); -extern pfn_glVertexAttribs3dvNV fp_glVertexAttribs3dvNV; -typedef void (APIENTRYP pfn_glVertexAttribs3fvNV) (GLuint, GLsizei, const GLfloat*); -extern pfn_glVertexAttribs3fvNV fp_glVertexAttribs3fvNV; -typedef void (APIENTRYP pfn_glVertexAttribs3svNV) (GLuint, GLsizei, const GLshort*); -extern pfn_glVertexAttribs3svNV fp_glVertexAttribs3svNV; -typedef void (APIENTRYP pfn_glVertexAttribs4dvNV) (GLuint, GLsizei, const GLdouble*); -extern pfn_glVertexAttribs4dvNV fp_glVertexAttribs4dvNV; -typedef void (APIENTRYP pfn_glVertexAttribs4fvNV) (GLuint, GLsizei, const GLfloat*); -extern pfn_glVertexAttribs4fvNV fp_glVertexAttribs4fvNV; -typedef void (APIENTRYP pfn_glVertexAttribs4svNV) (GLuint, GLsizei, const GLshort*); -extern pfn_glVertexAttribs4svNV fp_glVertexAttribs4svNV; -typedef void (APIENTRYP pfn_glVertexAttribs4ubvNV) (GLuint, GLsizei, const GLubyte*); -extern pfn_glVertexAttribs4ubvNV fp_glVertexAttribs4ubvNV; - - /* GL_NV_vertex_program1_1 */ -extern GLboolean GLAD_NV_vertex_program1_1; - - /* GL_NV_vertex_program2 */ -extern GLboolean GLAD_NV_vertex_program2; - - /* GL_NV_vertex_program2_option */ -extern GLboolean GLAD_NV_vertex_program2_option; - - /* GL_NV_vertex_program3 */ -extern GLboolean GLAD_NV_vertex_program3; - /* GL_NV_vertex_program4 */ extern GLboolean GLAD_NV_vertex_program4; #define GL_VERTEX_ATTRIB_ARRAY_INTEGER_NV 0x88FD @@ -10918,6 +9133,40 @@ extern pfn_glVideoCaptureStreamParameterfvNV fp_glVideoCaptureStreamParameterfvN typedef void (APIENTRYP pfn_glVideoCaptureStreamParameterdvNV) (GLuint, GLuint, GLenum, const GLdouble*); extern pfn_glVideoCaptureStreamParameterdvNV fp_glVideoCaptureStreamParameterdvNV; + /* GL_NV_viewport_array */ +extern GLboolean GLAD_NV_viewport_array; +#define GL_MAX_VIEWPORTS_NV 0x825B +#define GL_VIEWPORT_SUBPIXEL_BITS_NV 0x825C +#define GL_VIEWPORT_BOUNDS_RANGE_NV 0x825D +#define GL_VIEWPORT_INDEX_PROVOKING_VERTEX_NV 0x825F +typedef void (APIENTRYP pfn_glViewportArrayvNV) (GLuint, GLsizei, const GLfloat*); +extern pfn_glViewportArrayvNV fp_glViewportArrayvNV; +typedef void (APIENTRYP pfn_glViewportIndexedfNV) (GLuint, GLfloat, GLfloat, GLfloat, GLfloat); +extern pfn_glViewportIndexedfNV fp_glViewportIndexedfNV; +typedef void (APIENTRYP pfn_glViewportIndexedfvNV) (GLuint, const GLfloat*); +extern pfn_glViewportIndexedfvNV fp_glViewportIndexedfvNV; +typedef void (APIENTRYP pfn_glScissorArrayvNV) (GLuint, GLsizei, const GLint*); +extern pfn_glScissorArrayvNV fp_glScissorArrayvNV; +typedef void (APIENTRYP pfn_glScissorIndexedNV) (GLuint, GLint, GLint, GLsizei, GLsizei); +extern pfn_glScissorIndexedNV fp_glScissorIndexedNV; +typedef void (APIENTRYP pfn_glScissorIndexedvNV) (GLuint, const GLint*); +extern pfn_glScissorIndexedvNV fp_glScissorIndexedvNV; +typedef void (APIENTRYP pfn_glDepthRangeArrayfvNV) (GLuint, GLsizei, const GLfloat*); +extern pfn_glDepthRangeArrayfvNV fp_glDepthRangeArrayfvNV; +typedef void (APIENTRYP pfn_glDepthRangeIndexedfNV) (GLuint, GLfloat, GLfloat); +extern pfn_glDepthRangeIndexedfNV fp_glDepthRangeIndexedfNV; +typedef void (APIENTRYP pfn_glGetFloati_vNV) (GLenum, GLuint, GLfloat*); +extern pfn_glGetFloati_vNV fp_glGetFloati_vNV; +typedef void (APIENTRYP pfn_glEnableiNV) (GLenum, GLuint); +extern pfn_glEnableiNV fp_glEnableiNV; +typedef void (APIENTRYP pfn_glDisableiNV) (GLenum, GLuint); +extern pfn_glDisableiNV fp_glDisableiNV; +typedef GLboolean (APIENTRYP pfn_glIsEnablediNV) (GLenum, GLuint); +extern pfn_glIsEnablediNV fp_glIsEnablediNV; + + /* GL_NV_viewport_array2 */ +extern GLboolean GLAD_NV_viewport_array2; + /* GL_NVX_conditional_render */ extern GLboolean GLAD_NVX_conditional_render; typedef void (APIENTRYP pfn_glBeginConditionalRenderNVX) (GLuint); @@ -10925,74 +9174,13 @@ extern pfn_glBeginConditionalRenderNVX fp_glBeginConditionalRenderNVX; typedef void (APIENTRYP pfn_glEndConditionalRenderNVX) (); extern pfn_glEndConditionalRenderNVX fp_glEndConditionalRenderNVX; - /* GL_OML_interlace */ -extern GLboolean GLAD_OML_interlace; -#define GL_INTERLACE_OML 0x8980 -#define GL_INTERLACE_READ_OML 0x8981 - - /* GL_OML_resample */ -extern GLboolean GLAD_OML_resample; -#define GL_PACK_RESAMPLE_OML 0x8984 -#define GL_UNPACK_RESAMPLE_OML 0x8985 -#define GL_RESAMPLE_REPLICATE_OML 0x8986 -#define GL_RESAMPLE_ZERO_FILL_OML 0x8987 -#define GL_RESAMPLE_AVERAGE_OML 0x8988 -#define GL_RESAMPLE_DECIMATE_OML 0x8989 - - /* GL_OML_subsample */ -extern GLboolean GLAD_OML_subsample; -#define GL_FORMAT_SUBSAMPLE_24_24_OML 0x8982 -#define GL_FORMAT_SUBSAMPLE_244_244_OML 0x8983 - - /* GL_PGI_misc_hints */ -extern GLboolean GLAD_PGI_misc_hints; -#define GL_PREFER_DOUBLEBUFFER_HINT_PGI 0x1A1F8 -#define GL_CONSERVE_MEMORY_HINT_PGI 0x1A1FD -#define GL_RECLAIM_MEMORY_HINT_PGI 0x1A1FE -#define GL_NATIVE_GRAPHICS_HANDLE_PGI 0x1A202 -#define GL_NATIVE_GRAPHICS_BEGIN_HINT_PGI 0x1A203 -#define GL_NATIVE_GRAPHICS_END_HINT_PGI 0x1A204 -#define GL_ALWAYS_FAST_HINT_PGI 0x1A20C -#define GL_ALWAYS_SOFT_HINT_PGI 0x1A20D -#define GL_ALLOW_DRAW_OBJ_HINT_PGI 0x1A20E -#define GL_ALLOW_DRAW_WIN_HINT_PGI 0x1A20F -#define GL_ALLOW_DRAW_FRG_HINT_PGI 0x1A210 -#define GL_ALLOW_DRAW_MEM_HINT_PGI 0x1A211 -#define GL_STRICT_DEPTHFUNC_HINT_PGI 0x1A216 -#define GL_STRICT_LIGHTING_HINT_PGI 0x1A217 -#define GL_STRICT_SCISSOR_HINT_PGI 0x1A218 -#define GL_FULL_STIPPLE_HINT_PGI 0x1A219 -#define GL_CLIP_NEAR_HINT_PGI 0x1A220 -#define GL_CLIP_FAR_HINT_PGI 0x1A221 -#define GL_WIDE_LINE_HINT_PGI 0x1A222 -#define GL_BACK_NORMALS_HINT_PGI 0x1A223 -typedef void (APIENTRYP pfn_glHintPGI) (GLenum, GLint); -extern pfn_glHintPGI fp_glHintPGI; - - /* GL_PGI_vertex_hints */ -extern GLboolean GLAD_PGI_vertex_hints; -#define GL_VERTEX_DATA_HINT_PGI 0x1A22A -#define GL_VERTEX_CONSISTENT_HINT_PGI 0x1A22B -#define GL_MATERIAL_SIDE_HINT_PGI 0x1A22C -#define GL_MAX_VERTEX_HINT_PGI 0x1A22D -#define GL_COLOR3_BIT_PGI 0x00010000 -#define GL_COLOR4_BIT_PGI 0x00020000 -#define GL_EDGEFLAG_BIT_PGI 0x00040000 -#define GL_INDEX_BIT_PGI 0x00080000 -#define GL_MAT_AMBIENT_BIT_PGI 0x00100000 -#define GL_MAT_AMBIENT_AND_DIFFUSE_BIT_PGI 0x00200000 -#define GL_MAT_DIFFUSE_BIT_PGI 0x00400000 -#define GL_MAT_EMISSION_BIT_PGI 0x00800000 -#define GL_MAT_COLOR_INDEXES_BIT_PGI 0x01000000 -#define GL_MAT_SHININESS_BIT_PGI 0x02000000 -#define GL_MAT_SPECULAR_BIT_PGI 0x04000000 -#define GL_NORMAL_BIT_PGI 0x08000000 -#define GL_TEXCOORD1_BIT_PGI 0x10000000 -#define GL_TEXCOORD2_BIT_PGI 0x20000000 -#define GL_TEXCOORD3_BIT_PGI 0x40000000 -#define GL_TEXCOORD4_BIT_PGI 0x80000000 -#define GL_VERTEX23_BIT_PGI 0x00000004 -#define GL_VERTEX4_BIT_PGI 0x00000008 + /* GL_NVX_gpu_memory_info */ +extern GLboolean GLAD_NVX_gpu_memory_info; +#define GL_GPU_MEMORY_INFO_DEDICATED_VIDMEM_NVX 0x9047 +#define GL_GPU_MEMORY_INFO_TOTAL_AVAILABLE_MEMORY_NVX 0x9048 +#define GL_GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX 0x9049 +#define GL_GPU_MEMORY_INFO_EVICTION_COUNT_NVX 0x904A +#define GL_GPU_MEMORY_INFO_EVICTED_MEMORY_NVX 0x904B /* GL_QCOM_alpha_test */ extern GLboolean GLAD_QCOM_alpha_test; @@ -11108,30 +9296,43 @@ extern pfn_glEndTilingQCOM fp_glEndTilingQCOM; extern GLboolean GLAD_QCOM_writeonly_rendering; #define GL_WRITEONLY_RENDERING_QCOM 0x8823 - /* GL_REND_screen_coordinates */ -extern GLboolean GLAD_REND_screen_coordinates; -#define GL_SCREEN_COORDINATES_REND 0x8490 -#define GL_INVERTED_SCREEN_W_REND 0x8491 + /* GL_SGIX_calligraphic_fragment */ +extern GLboolean GLAD_SGIX_calligraphic_fragment; +#define GL_CALLIGRAPHIC_FRAGMENT_SGIX 0x8183 - /* GL_S3_s3tc */ -extern GLboolean GLAD_S3_s3tc; -#define GL_RGB_S3TC 0x83A0 -#define GL_RGB4_S3TC 0x83A1 -#define GL_RGBA_S3TC 0x83A2 -#define GL_RGBA4_S3TC 0x83A3 -#define GL_RGBA_DXT5_S3TC 0x83A4 -#define GL_RGBA4_DXT5_S3TC 0x83A5 + /* GL_SGIX_depth_pass_instrument */ +extern GLboolean GLAD_SGIX_depth_pass_instrument; - /* GL_SGIS_generate_mipmap */ -extern GLboolean GLAD_SGIS_generate_mipmap; -#define GL_GENERATE_MIPMAP_SGIS 0x8191 -#define GL_GENERATE_MIPMAP_HINT_SGIS 0x8192 + /* GL_SGIX_pixel_tiles */ +extern GLboolean GLAD_SGIX_pixel_tiles; +#define GL_PIXEL_TILE_BEST_ALIGNMENT_SGIX 0x813E +#define GL_PIXEL_TILE_CACHE_INCREMENT_SGIX 0x813F +#define GL_PIXEL_TILE_WIDTH_SGIX 0x8140 +#define GL_PIXEL_TILE_HEIGHT_SGIX 0x8141 +#define GL_PIXEL_TILE_GRID_WIDTH_SGIX 0x8142 +#define GL_PIXEL_TILE_GRID_HEIGHT_SGIX 0x8143 +#define GL_PIXEL_TILE_GRID_DEPTH_SGIX 0x8144 +#define GL_PIXEL_TILE_CACHE_SIZE_SGIX 0x8145 - /* GL_SGIX_texture_lod_bias */ -extern GLboolean GLAD_SGIX_texture_lod_bias; -#define GL_TEXTURE_LOD_BIAS_S_SGIX 0x818E -#define GL_TEXTURE_LOD_BIAS_T_SGIX 0x818F -#define GL_TEXTURE_LOD_BIAS_R_SGIX 0x8190 + /* GL_SGIX_scalebias_hint */ +extern GLboolean GLAD_SGIX_scalebias_hint; +#define GL_SCALEBIAS_HINT_SGIX 0x8322 + + /* GL_SGIX_subsample */ +extern GLboolean GLAD_SGIX_subsample; +#define GL_PACK_SUBSAMPLE_RATE_SGIX 0x85A0 +#define GL_UNPACK_SUBSAMPLE_RATE_SGIX 0x85A1 +#define GL_PIXEL_SUBSAMPLE_4444_SGIX 0x85A2 +#define GL_PIXEL_SUBSAMPLE_2424_SGIX 0x85A3 +#define GL_PIXEL_SUBSAMPLE_4242_SGIX 0x85A4 + + /* GL_SGIX_ycrcb_subsample */ +extern GLboolean GLAD_SGIX_ycrcb_subsample; + + /* GL_SGIX_ycrcba */ +extern GLboolean GLAD_SGIX_ycrcba; +#define GL_YCRCB_SGIX 0x8318 +#define GL_YCRCBA_SGIX 0x8319 /* GL_VIV_shader_binary */ extern GLboolean GLAD_VIV_shader_binary; diff --git a/jni/love/src/libraries/glad/gladfuncs.hpp b/jni/love/src/libraries/glad/gladfuncs.hpp index 1b3d7ebe..f5ce0467 100644 --- a/jni/love/src/libraries/glad/gladfuncs.hpp +++ b/jni/love/src/libraries/glad/gladfuncs.hpp @@ -30,7 +30,6 @@ namespace glad { - /* GL_VERSION_1_0 */ inline void glCullFace(GLenum mode) { fp_glCullFace(mode); } inline void glFrontFace(GLenum mode) { fp_glFrontFace(mode); } @@ -45,7 +44,7 @@ inline void glTexParameteri(GLenum target, GLenum pname, GLint param) { fp_glTex inline void glTexParameteriv(GLenum target, GLenum pname, const GLint* params) { fp_glTexParameteriv(target, pname, params); } inline void glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void* pixels) { fp_glTexImage1D(target, level, internalformat, width, border, format, type, pixels); } inline void glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void* pixels) { fp_glTexImage2D(target, level, internalformat, width, height, border, format, type, pixels); } -inline void glDrawBuffer(GLenum mode) { fp_glDrawBuffer(mode); } +inline void glDrawBuffer(GLenum buf) { fp_glDrawBuffer(buf); } inline void glClear(GLbitfield mask) { fp_glClear(mask); } inline void glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha) { fp_glClearColor(red, green, blue, alpha); } inline void glClearStencil(GLint s) { fp_glClearStencil(s); } @@ -64,7 +63,7 @@ inline void glStencilOp(GLenum fail, GLenum zfail, GLenum zpass) { fp_glStencilO inline void glDepthFunc(GLenum func) { fp_glDepthFunc(func); } inline void glPixelStoref(GLenum pname, GLfloat param) { fp_glPixelStoref(pname, param); } inline void glPixelStorei(GLenum pname, GLint param) { fp_glPixelStorei(pname, param); } -inline void glReadBuffer(GLenum mode) { fp_glReadBuffer(mode); } +inline void glReadBuffer(GLenum src) { fp_glReadBuffer(src); } inline void glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void* pixels) { fp_glReadPixels(x, y, width, height, format, type, pixels); } inline void glGetBooleanv(GLenum pname, GLboolean* data) { fp_glGetBooleanv(pname, data); } inline void glGetDoublev(GLenum pname, GLdouble* data) { fp_glGetDoublev(pname, data); } @@ -717,7 +716,7 @@ inline void glFramebufferTexture(GLenum target, GLenum attachment, GLuint textur inline void glTexImage2DMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations) { fp_glTexImage2DMultisample(target, samples, internalformat, width, height, fixedsamplelocations); } inline void glTexImage3DMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations) { fp_glTexImage3DMultisample(target, samples, internalformat, width, height, depth, fixedsamplelocations); } inline void glGetMultisamplefv(GLenum pname, GLuint index, GLfloat* val) { fp_glGetMultisamplefv(pname, index, val); } -inline void glSampleMaski(GLuint index, GLbitfield mask) { fp_glSampleMaski(index, mask); } +inline void glSampleMaski(GLuint maskNumber, GLbitfield mask) { fp_glSampleMaski(maskNumber, mask); } /* GL_VERSION_3_3 */ inline void glBindFragDataLocationIndexed(GLuint program, GLuint colorNumber, GLuint index, const GLchar* name) { fp_glBindFragDataLocationIndexed(program, colorNumber, index, name); } @@ -987,6 +986,133 @@ inline void glBindSamplers(GLuint first, GLsizei count, const GLuint* samplers) inline void glBindImageTextures(GLuint first, GLsizei count, const GLuint* textures) { fp_glBindImageTextures(first, count, textures); } inline void glBindVertexBuffers(GLuint first, GLsizei count, const GLuint* buffers, const GLintptr* offsets, const GLsizei* strides) { fp_glBindVertexBuffers(first, count, buffers, offsets, strides); } +/* GL_VERSION_4_5 */ +inline void glClipControl(GLenum origin, GLenum depth) { fp_glClipControl(origin, depth); } +inline void glCreateTransformFeedbacks(GLsizei n, GLuint* ids) { fp_glCreateTransformFeedbacks(n, ids); } +inline void glTransformFeedbackBufferBase(GLuint xfb, GLuint index, GLuint buffer) { fp_glTransformFeedbackBufferBase(xfb, index, buffer); } +inline void glTransformFeedbackBufferRange(GLuint xfb, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size) { fp_glTransformFeedbackBufferRange(xfb, index, buffer, offset, size); } +inline void glGetTransformFeedbackiv(GLuint xfb, GLenum pname, GLint* param) { fp_glGetTransformFeedbackiv(xfb, pname, param); } +inline void glGetTransformFeedbacki_v(GLuint xfb, GLenum pname, GLuint index, GLint* param) { fp_glGetTransformFeedbacki_v(xfb, pname, index, param); } +inline void glGetTransformFeedbacki64_v(GLuint xfb, GLenum pname, GLuint index, GLint64* param) { fp_glGetTransformFeedbacki64_v(xfb, pname, index, param); } +inline void glCreateBuffers(GLsizei n, GLuint* buffers) { fp_glCreateBuffers(n, buffers); } +inline void glNamedBufferStorage(GLuint buffer, GLsizeiptr size, const void* data, GLbitfield flags) { fp_glNamedBufferStorage(buffer, size, data, flags); } +inline void glNamedBufferData(GLuint buffer, GLsizeiptr size, const void* data, GLenum usage) { fp_glNamedBufferData(buffer, size, data, usage); } +inline void glNamedBufferSubData(GLuint buffer, GLintptr offset, GLsizeiptr size, const void* data) { fp_glNamedBufferSubData(buffer, offset, size, data); } +inline void glCopyNamedBufferSubData(GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size) { fp_glCopyNamedBufferSubData(readBuffer, writeBuffer, readOffset, writeOffset, size); } +inline void glClearNamedBufferData(GLuint buffer, GLenum internalformat, GLenum format, GLenum type, const void* data) { fp_glClearNamedBufferData(buffer, internalformat, format, type, data); } +inline void glClearNamedBufferSubData(GLuint buffer, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void* data) { fp_glClearNamedBufferSubData(buffer, internalformat, offset, size, format, type, data); } +inline void* glMapNamedBuffer(GLuint buffer, GLenum access) { return fp_glMapNamedBuffer(buffer, access); } +inline void* glMapNamedBufferRange(GLuint buffer, GLintptr offset, GLsizeiptr length, GLbitfield access) { return fp_glMapNamedBufferRange(buffer, offset, length, access); } +inline GLboolean glUnmapNamedBuffer(GLuint buffer) { return fp_glUnmapNamedBuffer(buffer); } +inline void glFlushMappedNamedBufferRange(GLuint buffer, GLintptr offset, GLsizeiptr length) { fp_glFlushMappedNamedBufferRange(buffer, offset, length); } +inline void glGetNamedBufferParameteriv(GLuint buffer, GLenum pname, GLint* params) { fp_glGetNamedBufferParameteriv(buffer, pname, params); } +inline void glGetNamedBufferParameteri64v(GLuint buffer, GLenum pname, GLint64* params) { fp_glGetNamedBufferParameteri64v(buffer, pname, params); } +inline void glGetNamedBufferPointerv(GLuint buffer, GLenum pname, void** params) { fp_glGetNamedBufferPointerv(buffer, pname, params); } +inline void glGetNamedBufferSubData(GLuint buffer, GLintptr offset, GLsizeiptr size, void* data) { fp_glGetNamedBufferSubData(buffer, offset, size, data); } +inline void glCreateFramebuffers(GLsizei n, GLuint* framebuffers) { fp_glCreateFramebuffers(n, framebuffers); } +inline void glNamedFramebufferRenderbuffer(GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer) { fp_glNamedFramebufferRenderbuffer(framebuffer, attachment, renderbuffertarget, renderbuffer); } +inline void glNamedFramebufferParameteri(GLuint framebuffer, GLenum pname, GLint param) { fp_glNamedFramebufferParameteri(framebuffer, pname, param); } +inline void glNamedFramebufferTexture(GLuint framebuffer, GLenum attachment, GLuint texture, GLint level) { fp_glNamedFramebufferTexture(framebuffer, attachment, texture, level); } +inline void glNamedFramebufferTextureLayer(GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer) { fp_glNamedFramebufferTextureLayer(framebuffer, attachment, texture, level, layer); } +inline void glNamedFramebufferDrawBuffer(GLuint framebuffer, GLenum buf) { fp_glNamedFramebufferDrawBuffer(framebuffer, buf); } +inline void glNamedFramebufferDrawBuffers(GLuint framebuffer, GLsizei n, const GLenum* bufs) { fp_glNamedFramebufferDrawBuffers(framebuffer, n, bufs); } +inline void glNamedFramebufferReadBuffer(GLuint framebuffer, GLenum src) { fp_glNamedFramebufferReadBuffer(framebuffer, src); } +inline void glInvalidateNamedFramebufferData(GLuint framebuffer, GLsizei numAttachments, const GLenum* attachments) { fp_glInvalidateNamedFramebufferData(framebuffer, numAttachments, attachments); } +inline void glInvalidateNamedFramebufferSubData(GLuint framebuffer, GLsizei numAttachments, const GLenum* attachments, GLint x, GLint y, GLsizei width, GLsizei height) { fp_glInvalidateNamedFramebufferSubData(framebuffer, numAttachments, attachments, x, y, width, height); } +inline void glClearNamedFramebufferiv(GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLint* value) { fp_glClearNamedFramebufferiv(framebuffer, buffer, drawbuffer, value); } +inline void glClearNamedFramebufferuiv(GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLuint* value) { fp_glClearNamedFramebufferuiv(framebuffer, buffer, drawbuffer, value); } +inline void glClearNamedFramebufferfv(GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLfloat* value) { fp_glClearNamedFramebufferfv(framebuffer, buffer, drawbuffer, value); } +inline void glClearNamedFramebufferfi(GLuint framebuffer, GLenum buffer, const GLfloat depth, GLint stencil) { fp_glClearNamedFramebufferfi(framebuffer, buffer, depth, stencil); } +inline void glBlitNamedFramebuffer(GLuint readFramebuffer, GLuint drawFramebuffer, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter) { fp_glBlitNamedFramebuffer(readFramebuffer, drawFramebuffer, srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter); } +inline GLenum glCheckNamedFramebufferStatus(GLuint framebuffer, GLenum target) { return fp_glCheckNamedFramebufferStatus(framebuffer, target); } +inline void glGetNamedFramebufferParameteriv(GLuint framebuffer, GLenum pname, GLint* param) { fp_glGetNamedFramebufferParameteriv(framebuffer, pname, param); } +inline void glGetNamedFramebufferAttachmentParameteriv(GLuint framebuffer, GLenum attachment, GLenum pname, GLint* params) { fp_glGetNamedFramebufferAttachmentParameteriv(framebuffer, attachment, pname, params); } +inline void glCreateRenderbuffers(GLsizei n, GLuint* renderbuffers) { fp_glCreateRenderbuffers(n, renderbuffers); } +inline void glNamedRenderbufferStorage(GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height) { fp_glNamedRenderbufferStorage(renderbuffer, internalformat, width, height); } +inline void glNamedRenderbufferStorageMultisample(GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height) { fp_glNamedRenderbufferStorageMultisample(renderbuffer, samples, internalformat, width, height); } +inline void glGetNamedRenderbufferParameteriv(GLuint renderbuffer, GLenum pname, GLint* params) { fp_glGetNamedRenderbufferParameteriv(renderbuffer, pname, params); } +inline void glCreateTextures(GLenum target, GLsizei n, GLuint* textures) { fp_glCreateTextures(target, n, textures); } +inline void glTextureBuffer(GLuint texture, GLenum internalformat, GLuint buffer) { fp_glTextureBuffer(texture, internalformat, buffer); } +inline void glTextureBufferRange(GLuint texture, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size) { fp_glTextureBufferRange(texture, internalformat, buffer, offset, size); } +inline void glTextureStorage1D(GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width) { fp_glTextureStorage1D(texture, levels, internalformat, width); } +inline void glTextureStorage2D(GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height) { fp_glTextureStorage2D(texture, levels, internalformat, width, height); } +inline void glTextureStorage3D(GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth) { fp_glTextureStorage3D(texture, levels, internalformat, width, height, depth); } +inline void glTextureStorage2DMultisample(GLuint texture, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations) { fp_glTextureStorage2DMultisample(texture, samples, internalformat, width, height, fixedsamplelocations); } +inline void glTextureStorage3DMultisample(GLuint texture, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations) { fp_glTextureStorage3DMultisample(texture, samples, internalformat, width, height, depth, fixedsamplelocations); } +inline void glTextureSubImage1D(GLuint texture, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void* pixels) { fp_glTextureSubImage1D(texture, level, xoffset, width, format, type, pixels); } +inline void glTextureSubImage2D(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* pixels) { fp_glTextureSubImage2D(texture, level, xoffset, yoffset, width, height, format, type, pixels); } +inline void glTextureSubImage3D(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void* pixels) { fp_glTextureSubImage3D(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels); } +inline void glCompressedTextureSubImage1D(GLuint texture, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void* data) { fp_glCompressedTextureSubImage1D(texture, level, xoffset, width, format, imageSize, data); } +inline void glCompressedTextureSubImage2D(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void* data) { fp_glCompressedTextureSubImage2D(texture, level, xoffset, yoffset, width, height, format, imageSize, data); } +inline void glCompressedTextureSubImage3D(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void* data) { fp_glCompressedTextureSubImage3D(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data); } +inline void glCopyTextureSubImage1D(GLuint texture, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width) { fp_glCopyTextureSubImage1D(texture, level, xoffset, x, y, width); } +inline void glCopyTextureSubImage2D(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height) { fp_glCopyTextureSubImage2D(texture, level, xoffset, yoffset, x, y, width, height); } +inline void glCopyTextureSubImage3D(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height) { fp_glCopyTextureSubImage3D(texture, level, xoffset, yoffset, zoffset, x, y, width, height); } +inline void glTextureParameterf(GLuint texture, GLenum pname, GLfloat param) { fp_glTextureParameterf(texture, pname, param); } +inline void glTextureParameterfv(GLuint texture, GLenum pname, const GLfloat* param) { fp_glTextureParameterfv(texture, pname, param); } +inline void glTextureParameteri(GLuint texture, GLenum pname, GLint param) { fp_glTextureParameteri(texture, pname, param); } +inline void glTextureParameterIiv(GLuint texture, GLenum pname, const GLint* params) { fp_glTextureParameterIiv(texture, pname, params); } +inline void glTextureParameterIuiv(GLuint texture, GLenum pname, const GLuint* params) { fp_glTextureParameterIuiv(texture, pname, params); } +inline void glTextureParameteriv(GLuint texture, GLenum pname, const GLint* param) { fp_glTextureParameteriv(texture, pname, param); } +inline void glGenerateTextureMipmap(GLuint texture) { fp_glGenerateTextureMipmap(texture); } +inline void glBindTextureUnit(GLuint unit, GLuint texture) { fp_glBindTextureUnit(unit, texture); } +inline void glGetTextureImage(GLuint texture, GLint level, GLenum format, GLenum type, GLsizei bufSize, void* pixels) { fp_glGetTextureImage(texture, level, format, type, bufSize, pixels); } +inline void glGetCompressedTextureImage(GLuint texture, GLint level, GLsizei bufSize, void* pixels) { fp_glGetCompressedTextureImage(texture, level, bufSize, pixels); } +inline void glGetTextureLevelParameterfv(GLuint texture, GLint level, GLenum pname, GLfloat* params) { fp_glGetTextureLevelParameterfv(texture, level, pname, params); } +inline void glGetTextureLevelParameteriv(GLuint texture, GLint level, GLenum pname, GLint* params) { fp_glGetTextureLevelParameteriv(texture, level, pname, params); } +inline void glGetTextureParameterfv(GLuint texture, GLenum pname, GLfloat* params) { fp_glGetTextureParameterfv(texture, pname, params); } +inline void glGetTextureParameterIiv(GLuint texture, GLenum pname, GLint* params) { fp_glGetTextureParameterIiv(texture, pname, params); } +inline void glGetTextureParameterIuiv(GLuint texture, GLenum pname, GLuint* params) { fp_glGetTextureParameterIuiv(texture, pname, params); } +inline void glGetTextureParameteriv(GLuint texture, GLenum pname, GLint* params) { fp_glGetTextureParameteriv(texture, pname, params); } +inline void glCreateVertexArrays(GLsizei n, GLuint* arrays) { fp_glCreateVertexArrays(n, arrays); } +inline void glDisableVertexArrayAttrib(GLuint vaobj, GLuint index) { fp_glDisableVertexArrayAttrib(vaobj, index); } +inline void glEnableVertexArrayAttrib(GLuint vaobj, GLuint index) { fp_glEnableVertexArrayAttrib(vaobj, index); } +inline void glVertexArrayElementBuffer(GLuint vaobj, GLuint buffer) { fp_glVertexArrayElementBuffer(vaobj, buffer); } +inline void glVertexArrayVertexBuffer(GLuint vaobj, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride) { fp_glVertexArrayVertexBuffer(vaobj, bindingindex, buffer, offset, stride); } +inline void glVertexArrayVertexBuffers(GLuint vaobj, GLuint first, GLsizei count, const GLuint* buffers, const GLintptr* offsets, const GLsizei* strides) { fp_glVertexArrayVertexBuffers(vaobj, first, count, buffers, offsets, strides); } +inline void glVertexArrayAttribBinding(GLuint vaobj, GLuint attribindex, GLuint bindingindex) { fp_glVertexArrayAttribBinding(vaobj, attribindex, bindingindex); } +inline void glVertexArrayAttribFormat(GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset) { fp_glVertexArrayAttribFormat(vaobj, attribindex, size, type, normalized, relativeoffset); } +inline void glVertexArrayAttribIFormat(GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset) { fp_glVertexArrayAttribIFormat(vaobj, attribindex, size, type, relativeoffset); } +inline void glVertexArrayAttribLFormat(GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset) { fp_glVertexArrayAttribLFormat(vaobj, attribindex, size, type, relativeoffset); } +inline void glVertexArrayBindingDivisor(GLuint vaobj, GLuint bindingindex, GLuint divisor) { fp_glVertexArrayBindingDivisor(vaobj, bindingindex, divisor); } +inline void glGetVertexArrayiv(GLuint vaobj, GLenum pname, GLint* param) { fp_glGetVertexArrayiv(vaobj, pname, param); } +inline void glGetVertexArrayIndexediv(GLuint vaobj, GLuint index, GLenum pname, GLint* param) { fp_glGetVertexArrayIndexediv(vaobj, index, pname, param); } +inline void glGetVertexArrayIndexed64iv(GLuint vaobj, GLuint index, GLenum pname, GLint64* param) { fp_glGetVertexArrayIndexed64iv(vaobj, index, pname, param); } +inline void glCreateSamplers(GLsizei n, GLuint* samplers) { fp_glCreateSamplers(n, samplers); } +inline void glCreateProgramPipelines(GLsizei n, GLuint* pipelines) { fp_glCreateProgramPipelines(n, pipelines); } +inline void glCreateQueries(GLenum target, GLsizei n, GLuint* ids) { fp_glCreateQueries(target, n, ids); } +inline void glGetQueryBufferObjecti64v(GLuint id, GLuint buffer, GLenum pname, GLintptr offset) { fp_glGetQueryBufferObjecti64v(id, buffer, pname, offset); } +inline void glGetQueryBufferObjectiv(GLuint id, GLuint buffer, GLenum pname, GLintptr offset) { fp_glGetQueryBufferObjectiv(id, buffer, pname, offset); } +inline void glGetQueryBufferObjectui64v(GLuint id, GLuint buffer, GLenum pname, GLintptr offset) { fp_glGetQueryBufferObjectui64v(id, buffer, pname, offset); } +inline void glGetQueryBufferObjectuiv(GLuint id, GLuint buffer, GLenum pname, GLintptr offset) { fp_glGetQueryBufferObjectuiv(id, buffer, pname, offset); } +inline void glMemoryBarrierByRegion(GLbitfield barriers) { fp_glMemoryBarrierByRegion(barriers); } +inline void glGetTextureSubImage(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLsizei bufSize, void* pixels) { fp_glGetTextureSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, bufSize, pixels); } +inline void glGetCompressedTextureSubImage(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei bufSize, void* pixels) { fp_glGetCompressedTextureSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, bufSize, pixels); } +inline GLenum glGetGraphicsResetStatus() { return fp_glGetGraphicsResetStatus(); } +inline void glGetnCompressedTexImage(GLenum target, GLint lod, GLsizei bufSize, void* pixels) { fp_glGetnCompressedTexImage(target, lod, bufSize, pixels); } +inline void glGetnTexImage(GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, void* pixels) { fp_glGetnTexImage(target, level, format, type, bufSize, pixels); } +inline void glGetnUniformdv(GLuint program, GLint location, GLsizei bufSize, GLdouble* params) { fp_glGetnUniformdv(program, location, bufSize, params); } +inline void glGetnUniformfv(GLuint program, GLint location, GLsizei bufSize, GLfloat* params) { fp_glGetnUniformfv(program, location, bufSize, params); } +inline void glGetnUniformiv(GLuint program, GLint location, GLsizei bufSize, GLint* params) { fp_glGetnUniformiv(program, location, bufSize, params); } +inline void glGetnUniformuiv(GLuint program, GLint location, GLsizei bufSize, GLuint* params) { fp_glGetnUniformuiv(program, location, bufSize, params); } +inline void glReadnPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void* data) { fp_glReadnPixels(x, y, width, height, format, type, bufSize, data); } +inline void glGetnMapdv(GLenum target, GLenum query, GLsizei bufSize, GLdouble* v) { fp_glGetnMapdv(target, query, bufSize, v); } +inline void glGetnMapfv(GLenum target, GLenum query, GLsizei bufSize, GLfloat* v) { fp_glGetnMapfv(target, query, bufSize, v); } +inline void glGetnMapiv(GLenum target, GLenum query, GLsizei bufSize, GLint* v) { fp_glGetnMapiv(target, query, bufSize, v); } +inline void glGetnPixelMapfv(GLenum map, GLsizei bufSize, GLfloat* values) { fp_glGetnPixelMapfv(map, bufSize, values); } +inline void glGetnPixelMapuiv(GLenum map, GLsizei bufSize, GLuint* values) { fp_glGetnPixelMapuiv(map, bufSize, values); } +inline void glGetnPixelMapusv(GLenum map, GLsizei bufSize, GLushort* values) { fp_glGetnPixelMapusv(map, bufSize, values); } +inline void glGetnPolygonStipple(GLsizei bufSize, GLubyte* pattern) { fp_glGetnPolygonStipple(bufSize, pattern); } +inline void glGetnColorTable(GLenum target, GLenum format, GLenum type, GLsizei bufSize, void* table) { fp_glGetnColorTable(target, format, type, bufSize, table); } +inline void glGetnConvolutionFilter(GLenum target, GLenum format, GLenum type, GLsizei bufSize, void* image) { fp_glGetnConvolutionFilter(target, format, type, bufSize, image); } +inline void glGetnSeparableFilter(GLenum target, GLenum format, GLenum type, GLsizei rowBufSize, void* row, GLsizei columnBufSize, void* column, void* span) { fp_glGetnSeparableFilter(target, format, type, rowBufSize, row, columnBufSize, column, span); } +inline void glGetnHistogram(GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void* values) { fp_glGetnHistogram(target, reset, format, type, bufSize, values); } +inline void glGetnMinmax(GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void* values) { fp_glGetnMinmax(target, reset, format, type, bufSize, values); } +inline void glTextureBarrier() { fp_glTextureBarrier(); } + +/* GL_KHR_blend_equation_advanced */ +inline void glBlendBarrierKHR() { fp_glBlendBarrierKHR(); } + /* GL_KHR_debug */ inline void glDebugMessageControlKHR(GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint* ids, GLboolean enabled) { fp_glDebugMessageControlKHR(source, type, severity, count, ids, enabled); } inline void glDebugMessageInsertKHR(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* buf) { fp_glDebugMessageInsertKHR(source, type, id, severity, length, buf); } @@ -1000,6 +1126,13 @@ inline void glObjectPtrLabelKHR(const void* ptr, GLsizei length, const GLchar* l inline void glGetObjectPtrLabelKHR(const void* ptr, GLsizei bufSize, GLsizei* length, GLchar* label) { fp_glGetObjectPtrLabelKHR(ptr, bufSize, length, label); } inline void glGetPointervKHR(GLenum pname, void** params) { fp_glGetPointervKHR(pname, params); } +/* GL_KHR_robustness */ +inline GLenum glGetGraphicsResetStatusKHR() { return fp_glGetGraphicsResetStatusKHR(); } +inline void glReadnPixelsKHR(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void* data) { fp_glReadnPixelsKHR(x, y, width, height, format, type, bufSize, data); } +inline void glGetnUniformfvKHR(GLuint program, GLint location, GLsizei bufSize, GLfloat* params) { fp_glGetnUniformfvKHR(program, location, bufSize, params); } +inline void glGetnUniformivKHR(GLuint program, GLint location, GLsizei bufSize, GLint* params) { fp_glGetnUniformivKHR(program, location, bufSize, params); } +inline void glGetnUniformuivKHR(GLuint program, GLint location, GLsizei bufSize, GLuint* params) { fp_glGetnUniformuivKHR(program, location, bufSize, params); } + /* GL_ARB_bindless_texture */ inline GLuint64 glGetTextureHandleARB(GLuint texture) { return fp_glGetTextureHandleARB(texture); } inline GLuint64 glGetTextureSamplerHandleARB(GLuint texture, GLuint sampler) { return fp_glGetTextureSamplerHandleARB(texture, sampler); } @@ -1033,9 +1166,6 @@ inline void glDebugMessageInsertARB(GLenum source, GLenum type, GLuint id, GLenu inline void glDebugMessageCallbackARB(GLDEBUGPROCARB callback, const void* userParam) { fp_glDebugMessageCallbackARB(callback, userParam); } inline GLuint glGetDebugMessageLogARB(GLuint count, GLsizei bufSize, GLenum* sources, GLenum* types, GLuint* ids, GLenum* severities, GLsizei* lengths, GLchar* messageLog) { return fp_glGetDebugMessageLogARB(count, bufSize, sources, types, ids, severities, lengths, messageLog); } -/* GL_ARB_draw_buffers */ -inline void glDrawBuffersARB(GLsizei n, const GLenum* bufs) { fp_glDrawBuffersARB(n, bufs); } - /* GL_ARB_draw_buffers_blend */ inline void glBlendEquationiARB(GLuint buf, GLenum mode) { fp_glBlendEquationiARB(buf, mode); } inline void glBlendEquationSeparateiARB(GLuint buf, GLenum modeRGB, GLenum modeAlpha) { fp_glBlendEquationSeparateiARB(buf, modeRGB, modeAlpha); } @@ -1046,27 +1176,6 @@ inline void glBlendFuncSeparateiARB(GLuint buf, GLenum srcRGB, GLenum dstRGB, GL inline void glDrawArraysInstancedARB(GLenum mode, GLint first, GLsizei count, GLsizei primcount) { fp_glDrawArraysInstancedARB(mode, first, count, primcount); } inline void glDrawElementsInstancedARB(GLenum mode, GLsizei count, GLenum type, const void* indices, GLsizei primcount) { fp_glDrawElementsInstancedARB(mode, count, type, indices, primcount); } -/* GL_ARB_fragment_program */ -inline void glProgramStringARB(GLenum target, GLenum format, GLsizei len, const void* string) { fp_glProgramStringARB(target, format, len, string); } -inline void glBindProgramARB(GLenum target, GLuint program) { fp_glBindProgramARB(target, program); } -inline void glDeleteProgramsARB(GLsizei n, const GLuint* programs) { fp_glDeleteProgramsARB(n, programs); } -inline void glGenProgramsARB(GLsizei n, GLuint* programs) { fp_glGenProgramsARB(n, programs); } -inline void glProgramEnvParameter4dARB(GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w) { fp_glProgramEnvParameter4dARB(target, index, x, y, z, w); } -inline void glProgramEnvParameter4dvARB(GLenum target, GLuint index, const GLdouble* params) { fp_glProgramEnvParameter4dvARB(target, index, params); } -inline void glProgramEnvParameter4fARB(GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w) { fp_glProgramEnvParameter4fARB(target, index, x, y, z, w); } -inline void glProgramEnvParameter4fvARB(GLenum target, GLuint index, const GLfloat* params) { fp_glProgramEnvParameter4fvARB(target, index, params); } -inline void glProgramLocalParameter4dARB(GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w) { fp_glProgramLocalParameter4dARB(target, index, x, y, z, w); } -inline void glProgramLocalParameter4dvARB(GLenum target, GLuint index, const GLdouble* params) { fp_glProgramLocalParameter4dvARB(target, index, params); } -inline void glProgramLocalParameter4fARB(GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w) { fp_glProgramLocalParameter4fARB(target, index, x, y, z, w); } -inline void glProgramLocalParameter4fvARB(GLenum target, GLuint index, const GLfloat* params) { fp_glProgramLocalParameter4fvARB(target, index, params); } -inline void glGetProgramEnvParameterdvARB(GLenum target, GLuint index, GLdouble* params) { fp_glGetProgramEnvParameterdvARB(target, index, params); } -inline void glGetProgramEnvParameterfvARB(GLenum target, GLuint index, GLfloat* params) { fp_glGetProgramEnvParameterfvARB(target, index, params); } -inline void glGetProgramLocalParameterdvARB(GLenum target, GLuint index, GLdouble* params) { fp_glGetProgramLocalParameterdvARB(target, index, params); } -inline void glGetProgramLocalParameterfvARB(GLenum target, GLuint index, GLfloat* params) { fp_glGetProgramLocalParameterfvARB(target, index, params); } -inline void glGetProgramivARB(GLenum target, GLenum pname, GLint* params) { fp_glGetProgramivARB(target, pname, params); } -inline void glGetProgramStringARB(GLenum target, GLenum pname, void* string) { fp_glGetProgramStringARB(target, pname, string); } -inline GLboolean glIsProgramARB(GLuint program) { return fp_glIsProgramARB(program); } - /* GL_ARB_geometry_shader4 */ inline void glProgramParameteriARB(GLuint program, GLenum pname, GLint value) { fp_glProgramParameteriARB(program, pname, value); } inline void glFramebufferTextureARB(GLenum target, GLenum attachment, GLuint texture, GLint level) { fp_glFramebufferTextureARB(target, attachment, texture, level); } @@ -1080,66 +1189,6 @@ inline void glMultiDrawElementsIndirectCountARB(GLenum mode, GLenum type, GLintp /* GL_ARB_instanced_arrays */ inline void glVertexAttribDivisorARB(GLuint index, GLuint divisor) { fp_glVertexAttribDivisorARB(index, divisor); } -/* GL_ARB_matrix_palette */ -inline void glCurrentPaletteMatrixARB(GLint index) { fp_glCurrentPaletteMatrixARB(index); } -inline void glMatrixIndexubvARB(GLint size, const GLubyte* indices) { fp_glMatrixIndexubvARB(size, indices); } -inline void glMatrixIndexusvARB(GLint size, const GLushort* indices) { fp_glMatrixIndexusvARB(size, indices); } -inline void glMatrixIndexuivARB(GLint size, const GLuint* indices) { fp_glMatrixIndexuivARB(size, indices); } -inline void glMatrixIndexPointerARB(GLint size, GLenum type, GLsizei stride, const void* pointer) { fp_glMatrixIndexPointerARB(size, type, stride, pointer); } - -/* GL_ARB_multisample */ -inline void glSampleCoverageARB(GLfloat value, GLboolean invert) { fp_glSampleCoverageARB(value, invert); } - -/* GL_ARB_multitexture */ -inline void glActiveTextureARB(GLenum texture) { fp_glActiveTextureARB(texture); } -inline void glClientActiveTextureARB(GLenum texture) { fp_glClientActiveTextureARB(texture); } -inline void glMultiTexCoord1dARB(GLenum target, GLdouble s) { fp_glMultiTexCoord1dARB(target, s); } -inline void glMultiTexCoord1dvARB(GLenum target, const GLdouble* v) { fp_glMultiTexCoord1dvARB(target, v); } -inline void glMultiTexCoord1fARB(GLenum target, GLfloat s) { fp_glMultiTexCoord1fARB(target, s); } -inline void glMultiTexCoord1fvARB(GLenum target, const GLfloat* v) { fp_glMultiTexCoord1fvARB(target, v); } -inline void glMultiTexCoord1iARB(GLenum target, GLint s) { fp_glMultiTexCoord1iARB(target, s); } -inline void glMultiTexCoord1ivARB(GLenum target, const GLint* v) { fp_glMultiTexCoord1ivARB(target, v); } -inline void glMultiTexCoord1sARB(GLenum target, GLshort s) { fp_glMultiTexCoord1sARB(target, s); } -inline void glMultiTexCoord1svARB(GLenum target, const GLshort* v) { fp_glMultiTexCoord1svARB(target, v); } -inline void glMultiTexCoord2dARB(GLenum target, GLdouble s, GLdouble t) { fp_glMultiTexCoord2dARB(target, s, t); } -inline void glMultiTexCoord2dvARB(GLenum target, const GLdouble* v) { fp_glMultiTexCoord2dvARB(target, v); } -inline void glMultiTexCoord2fARB(GLenum target, GLfloat s, GLfloat t) { fp_glMultiTexCoord2fARB(target, s, t); } -inline void glMultiTexCoord2fvARB(GLenum target, const GLfloat* v) { fp_glMultiTexCoord2fvARB(target, v); } -inline void glMultiTexCoord2iARB(GLenum target, GLint s, GLint t) { fp_glMultiTexCoord2iARB(target, s, t); } -inline void glMultiTexCoord2ivARB(GLenum target, const GLint* v) { fp_glMultiTexCoord2ivARB(target, v); } -inline void glMultiTexCoord2sARB(GLenum target, GLshort s, GLshort t) { fp_glMultiTexCoord2sARB(target, s, t); } -inline void glMultiTexCoord2svARB(GLenum target, const GLshort* v) { fp_glMultiTexCoord2svARB(target, v); } -inline void glMultiTexCoord3dARB(GLenum target, GLdouble s, GLdouble t, GLdouble r) { fp_glMultiTexCoord3dARB(target, s, t, r); } -inline void glMultiTexCoord3dvARB(GLenum target, const GLdouble* v) { fp_glMultiTexCoord3dvARB(target, v); } -inline void glMultiTexCoord3fARB(GLenum target, GLfloat s, GLfloat t, GLfloat r) { fp_glMultiTexCoord3fARB(target, s, t, r); } -inline void glMultiTexCoord3fvARB(GLenum target, const GLfloat* v) { fp_glMultiTexCoord3fvARB(target, v); } -inline void glMultiTexCoord3iARB(GLenum target, GLint s, GLint t, GLint r) { fp_glMultiTexCoord3iARB(target, s, t, r); } -inline void glMultiTexCoord3ivARB(GLenum target, const GLint* v) { fp_glMultiTexCoord3ivARB(target, v); } -inline void glMultiTexCoord3sARB(GLenum target, GLshort s, GLshort t, GLshort r) { fp_glMultiTexCoord3sARB(target, s, t, r); } -inline void glMultiTexCoord3svARB(GLenum target, const GLshort* v) { fp_glMultiTexCoord3svARB(target, v); } -inline void glMultiTexCoord4dARB(GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q) { fp_glMultiTexCoord4dARB(target, s, t, r, q); } -inline void glMultiTexCoord4dvARB(GLenum target, const GLdouble* v) { fp_glMultiTexCoord4dvARB(target, v); } -inline void glMultiTexCoord4fARB(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q) { fp_glMultiTexCoord4fARB(target, s, t, r, q); } -inline void glMultiTexCoord4fvARB(GLenum target, const GLfloat* v) { fp_glMultiTexCoord4fvARB(target, v); } -inline void glMultiTexCoord4iARB(GLenum target, GLint s, GLint t, GLint r, GLint q) { fp_glMultiTexCoord4iARB(target, s, t, r, q); } -inline void glMultiTexCoord4ivARB(GLenum target, const GLint* v) { fp_glMultiTexCoord4ivARB(target, v); } -inline void glMultiTexCoord4sARB(GLenum target, GLshort s, GLshort t, GLshort r, GLshort q) { fp_glMultiTexCoord4sARB(target, s, t, r, q); } -inline void glMultiTexCoord4svARB(GLenum target, const GLshort* v) { fp_glMultiTexCoord4svARB(target, v); } - -/* GL_ARB_occlusion_query */ -inline void glGenQueriesARB(GLsizei n, GLuint* ids) { fp_glGenQueriesARB(n, ids); } -inline void glDeleteQueriesARB(GLsizei n, const GLuint* ids) { fp_glDeleteQueriesARB(n, ids); } -inline GLboolean glIsQueryARB(GLuint id) { return fp_glIsQueryARB(id); } -inline void glBeginQueryARB(GLenum target, GLuint id) { fp_glBeginQueryARB(target, id); } -inline void glEndQueryARB(GLenum target) { fp_glEndQueryARB(target); } -inline void glGetQueryivARB(GLenum target, GLenum pname, GLint* params) { fp_glGetQueryivARB(target, pname, params); } -inline void glGetQueryObjectivARB(GLuint id, GLenum pname, GLint* params) { fp_glGetQueryObjectivARB(id, pname, params); } -inline void glGetQueryObjectuivARB(GLuint id, GLenum pname, GLuint* params) { fp_glGetQueryObjectuivARB(id, pname, params); } - -/* GL_ARB_point_parameters */ -inline void glPointParameterfARB(GLenum pname, GLfloat param) { fp_glPointParameterfARB(pname, param); } -inline void glPointParameterfvARB(GLenum pname, const GLfloat* params) { fp_glPointParameterfvARB(pname, params); } - /* GL_ARB_robustness */ inline GLenum glGetGraphicsResetStatusARB() { return fp_glGetGraphicsResetStatusARB(); } inline void glGetnTexImageARB(GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, void* img) { fp_glGetnTexImageARB(target, level, format, type, bufSize, img); } @@ -1165,47 +1214,6 @@ inline void glGetnMinmaxARB(GLenum target, GLboolean reset, GLenum format, GLenu /* GL_ARB_sample_shading */ inline void glMinSampleShadingARB(GLfloat value) { fp_glMinSampleShadingARB(value); } -/* GL_ARB_shader_objects */ -inline void glDeleteObjectARB(GLhandleARB obj) { fp_glDeleteObjectARB(obj); } -inline GLhandleARB glGetHandleARB(GLenum pname) { return fp_glGetHandleARB(pname); } -inline void glDetachObjectARB(GLhandleARB containerObj, GLhandleARB attachedObj) { fp_glDetachObjectARB(containerObj, attachedObj); } -inline GLhandleARB glCreateShaderObjectARB(GLenum shaderType) { return fp_glCreateShaderObjectARB(shaderType); } -inline void glShaderSourceARB(GLhandleARB shaderObj, GLsizei count, const GLcharARB** string, const GLint* length) { fp_glShaderSourceARB(shaderObj, count, string, length); } -inline void glCompileShaderARB(GLhandleARB shaderObj) { fp_glCompileShaderARB(shaderObj); } -inline GLhandleARB glCreateProgramObjectARB() { return fp_glCreateProgramObjectARB(); } -inline void glAttachObjectARB(GLhandleARB containerObj, GLhandleARB obj) { fp_glAttachObjectARB(containerObj, obj); } -inline void glLinkProgramARB(GLhandleARB programObj) { fp_glLinkProgramARB(programObj); } -inline void glUseProgramObjectARB(GLhandleARB programObj) { fp_glUseProgramObjectARB(programObj); } -inline void glValidateProgramARB(GLhandleARB programObj) { fp_glValidateProgramARB(programObj); } -inline void glUniform1fARB(GLint location, GLfloat v0) { fp_glUniform1fARB(location, v0); } -inline void glUniform2fARB(GLint location, GLfloat v0, GLfloat v1) { fp_glUniform2fARB(location, v0, v1); } -inline void glUniform3fARB(GLint location, GLfloat v0, GLfloat v1, GLfloat v2) { fp_glUniform3fARB(location, v0, v1, v2); } -inline void glUniform4fARB(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3) { fp_glUniform4fARB(location, v0, v1, v2, v3); } -inline void glUniform1iARB(GLint location, GLint v0) { fp_glUniform1iARB(location, v0); } -inline void glUniform2iARB(GLint location, GLint v0, GLint v1) { fp_glUniform2iARB(location, v0, v1); } -inline void glUniform3iARB(GLint location, GLint v0, GLint v1, GLint v2) { fp_glUniform3iARB(location, v0, v1, v2); } -inline void glUniform4iARB(GLint location, GLint v0, GLint v1, GLint v2, GLint v3) { fp_glUniform4iARB(location, v0, v1, v2, v3); } -inline void glUniform1fvARB(GLint location, GLsizei count, const GLfloat* value) { fp_glUniform1fvARB(location, count, value); } -inline void glUniform2fvARB(GLint location, GLsizei count, const GLfloat* value) { fp_glUniform2fvARB(location, count, value); } -inline void glUniform3fvARB(GLint location, GLsizei count, const GLfloat* value) { fp_glUniform3fvARB(location, count, value); } -inline void glUniform4fvARB(GLint location, GLsizei count, const GLfloat* value) { fp_glUniform4fvARB(location, count, value); } -inline void glUniform1ivARB(GLint location, GLsizei count, const GLint* value) { fp_glUniform1ivARB(location, count, value); } -inline void glUniform2ivARB(GLint location, GLsizei count, const GLint* value) { fp_glUniform2ivARB(location, count, value); } -inline void glUniform3ivARB(GLint location, GLsizei count, const GLint* value) { fp_glUniform3ivARB(location, count, value); } -inline void glUniform4ivARB(GLint location, GLsizei count, const GLint* value) { fp_glUniform4ivARB(location, count, value); } -inline void glUniformMatrix2fvARB(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) { fp_glUniformMatrix2fvARB(location, count, transpose, value); } -inline void glUniformMatrix3fvARB(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) { fp_glUniformMatrix3fvARB(location, count, transpose, value); } -inline void glUniformMatrix4fvARB(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) { fp_glUniformMatrix4fvARB(location, count, transpose, value); } -inline void glGetObjectParameterfvARB(GLhandleARB obj, GLenum pname, GLfloat* params) { fp_glGetObjectParameterfvARB(obj, pname, params); } -inline void glGetObjectParameterivARB(GLhandleARB obj, GLenum pname, GLint* params) { fp_glGetObjectParameterivARB(obj, pname, params); } -inline void glGetInfoLogARB(GLhandleARB obj, GLsizei maxLength, GLsizei* length, GLcharARB* infoLog) { fp_glGetInfoLogARB(obj, maxLength, length, infoLog); } -inline void glGetAttachedObjectsARB(GLhandleARB containerObj, GLsizei maxCount, GLsizei* count, GLhandleARB* obj) { fp_glGetAttachedObjectsARB(containerObj, maxCount, count, obj); } -inline GLint glGetUniformLocationARB(GLhandleARB programObj, const GLcharARB* name) { return fp_glGetUniformLocationARB(programObj, name); } -inline void glGetActiveUniformARB(GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei* length, GLint* size, GLenum* type, GLcharARB* name) { fp_glGetActiveUniformARB(programObj, index, maxLength, length, size, type, name); } -inline void glGetUniformfvARB(GLhandleARB programObj, GLint location, GLfloat* params) { fp_glGetUniformfvARB(programObj, location, params); } -inline void glGetUniformivARB(GLhandleARB programObj, GLint location, GLint* params) { fp_glGetUniformivARB(programObj, location, params); } -inline void glGetShaderSourceARB(GLhandleARB obj, GLsizei maxLength, GLsizei* length, GLcharARB* source) { fp_glGetShaderSourceARB(obj, maxLength, length, source); } - /* GL_ARB_shading_language_include */ inline void glNamedStringARB(GLenum type, GLint namelen, const GLchar* name, GLint stringlen, const GLchar* string) { fp_glNamedStringARB(type, namelen, name, stringlen, string); } inline void glDeleteNamedStringARB(GLint namelen, const GLchar* name) { fp_glDeleteNamedStringARB(namelen, name); } @@ -1214,187 +1222,29 @@ inline GLboolean glIsNamedStringARB(GLint namelen, const GLchar* name) { return inline void glGetNamedStringARB(GLint namelen, const GLchar* name, GLsizei bufSize, GLint* stringlen, GLchar* string) { fp_glGetNamedStringARB(namelen, name, bufSize, stringlen, string); } inline void glGetNamedStringivARB(GLint namelen, const GLchar* name, GLenum pname, GLint* params) { fp_glGetNamedStringivARB(namelen, name, pname, params); } +/* GL_ARB_sparse_buffer */ +inline void glBufferPageCommitmentARB(GLenum target, GLintptr offset, GLsizeiptr size, GLboolean commit) { fp_glBufferPageCommitmentARB(target, offset, size, commit); } +inline void glNamedBufferPageCommitmentEXT(GLuint buffer, GLintptr offset, GLsizeiptr size, GLboolean commit) { fp_glNamedBufferPageCommitmentEXT(buffer, offset, size, commit); } +inline void glNamedBufferPageCommitmentARB(GLuint buffer, GLintptr offset, GLsizeiptr size, GLboolean commit) { fp_glNamedBufferPageCommitmentARB(buffer, offset, size, commit); } + /* GL_ARB_sparse_texture */ inline void glTexPageCommitmentARB(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLboolean resident) { fp_glTexPageCommitmentARB(target, level, xoffset, yoffset, zoffset, width, height, depth, resident); } /* GL_ARB_texture_buffer_object */ inline void glTexBufferARB(GLenum target, GLenum internalformat, GLuint buffer) { fp_glTexBufferARB(target, internalformat, buffer); } -/* GL_ARB_texture_compression */ -inline void glCompressedTexImage3DARB(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void* data) { fp_glCompressedTexImage3DARB(target, level, internalformat, width, height, depth, border, imageSize, data); } -inline void glCompressedTexImage2DARB(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void* data) { fp_glCompressedTexImage2DARB(target, level, internalformat, width, height, border, imageSize, data); } -inline void glCompressedTexImage1DARB(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void* data) { fp_glCompressedTexImage1DARB(target, level, internalformat, width, border, imageSize, data); } -inline void glCompressedTexSubImage3DARB(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void* data) { fp_glCompressedTexSubImage3DARB(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data); } -inline void glCompressedTexSubImage2DARB(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void* data) { fp_glCompressedTexSubImage2DARB(target, level, xoffset, yoffset, width, height, format, imageSize, data); } -inline void glCompressedTexSubImage1DARB(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void* data) { fp_glCompressedTexSubImage1DARB(target, level, xoffset, width, format, imageSize, data); } -inline void glGetCompressedTexImageARB(GLenum target, GLint level, void* img) { fp_glGetCompressedTexImageARB(target, level, img); } - -/* GL_ARB_transpose_matrix */ -inline void glLoadTransposeMatrixfARB(const GLfloat* m) { fp_glLoadTransposeMatrixfARB(m); } -inline void glLoadTransposeMatrixdARB(const GLdouble* m) { fp_glLoadTransposeMatrixdARB(m); } -inline void glMultTransposeMatrixfARB(const GLfloat* m) { fp_glMultTransposeMatrixfARB(m); } -inline void glMultTransposeMatrixdARB(const GLdouble* m) { fp_glMultTransposeMatrixdARB(m); } - -/* GL_ARB_vertex_blend */ -inline void glWeightbvARB(GLint size, const GLbyte* weights) { fp_glWeightbvARB(size, weights); } -inline void glWeightsvARB(GLint size, const GLshort* weights) { fp_glWeightsvARB(size, weights); } -inline void glWeightivARB(GLint size, const GLint* weights) { fp_glWeightivARB(size, weights); } -inline void glWeightfvARB(GLint size, const GLfloat* weights) { fp_glWeightfvARB(size, weights); } -inline void glWeightdvARB(GLint size, const GLdouble* weights) { fp_glWeightdvARB(size, weights); } -inline void glWeightubvARB(GLint size, const GLubyte* weights) { fp_glWeightubvARB(size, weights); } -inline void glWeightusvARB(GLint size, const GLushort* weights) { fp_glWeightusvARB(size, weights); } -inline void glWeightuivARB(GLint size, const GLuint* weights) { fp_glWeightuivARB(size, weights); } -inline void glWeightPointerARB(GLint size, GLenum type, GLsizei stride, const void* pointer) { fp_glWeightPointerARB(size, type, stride, pointer); } -inline void glVertexBlendARB(GLint count) { fp_glVertexBlendARB(count); } - -/* GL_ARB_vertex_buffer_object */ -inline void glBindBufferARB(GLenum target, GLuint buffer) { fp_glBindBufferARB(target, buffer); } -inline void glDeleteBuffersARB(GLsizei n, const GLuint* buffers) { fp_glDeleteBuffersARB(n, buffers); } -inline void glGenBuffersARB(GLsizei n, GLuint* buffers) { fp_glGenBuffersARB(n, buffers); } -inline GLboolean glIsBufferARB(GLuint buffer) { return fp_glIsBufferARB(buffer); } -inline void glBufferDataARB(GLenum target, GLsizeiptrARB size, const void* data, GLenum usage) { fp_glBufferDataARB(target, size, data, usage); } -inline void glBufferSubDataARB(GLenum target, GLintptrARB offset, GLsizeiptrARB size, const void* data) { fp_glBufferSubDataARB(target, offset, size, data); } -inline void glGetBufferSubDataARB(GLenum target, GLintptrARB offset, GLsizeiptrARB size, void* data) { fp_glGetBufferSubDataARB(target, offset, size, data); } -inline void* glMapBufferARB(GLenum target, GLenum access) { return fp_glMapBufferARB(target, access); } -inline GLboolean glUnmapBufferARB(GLenum target) { return fp_glUnmapBufferARB(target); } -inline void glGetBufferParameterivARB(GLenum target, GLenum pname, GLint* params) { fp_glGetBufferParameterivARB(target, pname, params); } -inline void glGetBufferPointervARB(GLenum target, GLenum pname, void** params) { fp_glGetBufferPointervARB(target, pname, params); } - -/* GL_ARB_vertex_program */ -inline void glVertexAttrib1dARB(GLuint index, GLdouble x) { fp_glVertexAttrib1dARB(index, x); } -inline void glVertexAttrib1dvARB(GLuint index, const GLdouble* v) { fp_glVertexAttrib1dvARB(index, v); } -inline void glVertexAttrib1fARB(GLuint index, GLfloat x) { fp_glVertexAttrib1fARB(index, x); } -inline void glVertexAttrib1fvARB(GLuint index, const GLfloat* v) { fp_glVertexAttrib1fvARB(index, v); } -inline void glVertexAttrib1sARB(GLuint index, GLshort x) { fp_glVertexAttrib1sARB(index, x); } -inline void glVertexAttrib1svARB(GLuint index, const GLshort* v) { fp_glVertexAttrib1svARB(index, v); } -inline void glVertexAttrib2dARB(GLuint index, GLdouble x, GLdouble y) { fp_glVertexAttrib2dARB(index, x, y); } -inline void glVertexAttrib2dvARB(GLuint index, const GLdouble* v) { fp_glVertexAttrib2dvARB(index, v); } -inline void glVertexAttrib2fARB(GLuint index, GLfloat x, GLfloat y) { fp_glVertexAttrib2fARB(index, x, y); } -inline void glVertexAttrib2fvARB(GLuint index, const GLfloat* v) { fp_glVertexAttrib2fvARB(index, v); } -inline void glVertexAttrib2sARB(GLuint index, GLshort x, GLshort y) { fp_glVertexAttrib2sARB(index, x, y); } -inline void glVertexAttrib2svARB(GLuint index, const GLshort* v) { fp_glVertexAttrib2svARB(index, v); } -inline void glVertexAttrib3dARB(GLuint index, GLdouble x, GLdouble y, GLdouble z) { fp_glVertexAttrib3dARB(index, x, y, z); } -inline void glVertexAttrib3dvARB(GLuint index, const GLdouble* v) { fp_glVertexAttrib3dvARB(index, v); } -inline void glVertexAttrib3fARB(GLuint index, GLfloat x, GLfloat y, GLfloat z) { fp_glVertexAttrib3fARB(index, x, y, z); } -inline void glVertexAttrib3fvARB(GLuint index, const GLfloat* v) { fp_glVertexAttrib3fvARB(index, v); } -inline void glVertexAttrib3sARB(GLuint index, GLshort x, GLshort y, GLshort z) { fp_glVertexAttrib3sARB(index, x, y, z); } -inline void glVertexAttrib3svARB(GLuint index, const GLshort* v) { fp_glVertexAttrib3svARB(index, v); } -inline void glVertexAttrib4NbvARB(GLuint index, const GLbyte* v) { fp_glVertexAttrib4NbvARB(index, v); } -inline void glVertexAttrib4NivARB(GLuint index, const GLint* v) { fp_glVertexAttrib4NivARB(index, v); } -inline void glVertexAttrib4NsvARB(GLuint index, const GLshort* v) { fp_glVertexAttrib4NsvARB(index, v); } -inline void glVertexAttrib4NubARB(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w) { fp_glVertexAttrib4NubARB(index, x, y, z, w); } -inline void glVertexAttrib4NubvARB(GLuint index, const GLubyte* v) { fp_glVertexAttrib4NubvARB(index, v); } -inline void glVertexAttrib4NuivARB(GLuint index, const GLuint* v) { fp_glVertexAttrib4NuivARB(index, v); } -inline void glVertexAttrib4NusvARB(GLuint index, const GLushort* v) { fp_glVertexAttrib4NusvARB(index, v); } -inline void glVertexAttrib4bvARB(GLuint index, const GLbyte* v) { fp_glVertexAttrib4bvARB(index, v); } -inline void glVertexAttrib4dARB(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w) { fp_glVertexAttrib4dARB(index, x, y, z, w); } -inline void glVertexAttrib4dvARB(GLuint index, const GLdouble* v) { fp_glVertexAttrib4dvARB(index, v); } -inline void glVertexAttrib4fARB(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w) { fp_glVertexAttrib4fARB(index, x, y, z, w); } -inline void glVertexAttrib4fvARB(GLuint index, const GLfloat* v) { fp_glVertexAttrib4fvARB(index, v); } -inline void glVertexAttrib4ivARB(GLuint index, const GLint* v) { fp_glVertexAttrib4ivARB(index, v); } -inline void glVertexAttrib4sARB(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w) { fp_glVertexAttrib4sARB(index, x, y, z, w); } -inline void glVertexAttrib4svARB(GLuint index, const GLshort* v) { fp_glVertexAttrib4svARB(index, v); } -inline void glVertexAttrib4ubvARB(GLuint index, const GLubyte* v) { fp_glVertexAttrib4ubvARB(index, v); } -inline void glVertexAttrib4uivARB(GLuint index, const GLuint* v) { fp_glVertexAttrib4uivARB(index, v); } -inline void glVertexAttrib4usvARB(GLuint index, const GLushort* v) { fp_glVertexAttrib4usvARB(index, v); } -inline void glVertexAttribPointerARB(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void* pointer) { fp_glVertexAttribPointerARB(index, size, type, normalized, stride, pointer); } -inline void glEnableVertexAttribArrayARB(GLuint index) { fp_glEnableVertexAttribArrayARB(index); } -inline void glDisableVertexAttribArrayARB(GLuint index) { fp_glDisableVertexAttribArrayARB(index); } -inline void glGetVertexAttribdvARB(GLuint index, GLenum pname, GLdouble* params) { fp_glGetVertexAttribdvARB(index, pname, params); } -inline void glGetVertexAttribfvARB(GLuint index, GLenum pname, GLfloat* params) { fp_glGetVertexAttribfvARB(index, pname, params); } -inline void glGetVertexAttribivARB(GLuint index, GLenum pname, GLint* params) { fp_glGetVertexAttribivARB(index, pname, params); } -inline void glGetVertexAttribPointervARB(GLuint index, GLenum pname, void** pointer) { fp_glGetVertexAttribPointervARB(index, pname, pointer); } - -/* GL_ARB_vertex_shader */ -inline void glBindAttribLocationARB(GLhandleARB programObj, GLuint index, const GLcharARB* name) { fp_glBindAttribLocationARB(programObj, index, name); } -inline void glGetActiveAttribARB(GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei* length, GLint* size, GLenum* type, GLcharARB* name) { fp_glGetActiveAttribARB(programObj, index, maxLength, length, size, type, name); } -inline GLint glGetAttribLocationARB(GLhandleARB programObj, const GLcharARB* name) { return fp_glGetAttribLocationARB(programObj, name); } - -/* GL_ARB_window_pos */ -inline void glWindowPos2dARB(GLdouble x, GLdouble y) { fp_glWindowPos2dARB(x, y); } -inline void glWindowPos2dvARB(const GLdouble* v) { fp_glWindowPos2dvARB(v); } -inline void glWindowPos2fARB(GLfloat x, GLfloat y) { fp_glWindowPos2fARB(x, y); } -inline void glWindowPos2fvARB(const GLfloat* v) { fp_glWindowPos2fvARB(v); } -inline void glWindowPos2iARB(GLint x, GLint y) { fp_glWindowPos2iARB(x, y); } -inline void glWindowPos2ivARB(const GLint* v) { fp_glWindowPos2ivARB(v); } -inline void glWindowPos2sARB(GLshort x, GLshort y) { fp_glWindowPos2sARB(x, y); } -inline void glWindowPos2svARB(const GLshort* v) { fp_glWindowPos2svARB(v); } -inline void glWindowPos3dARB(GLdouble x, GLdouble y, GLdouble z) { fp_glWindowPos3dARB(x, y, z); } -inline void glWindowPos3dvARB(const GLdouble* v) { fp_glWindowPos3dvARB(v); } -inline void glWindowPos3fARB(GLfloat x, GLfloat y, GLfloat z) { fp_glWindowPos3fARB(x, y, z); } -inline void glWindowPos3fvARB(const GLfloat* v) { fp_glWindowPos3fvARB(v); } -inline void glWindowPos3iARB(GLint x, GLint y, GLint z) { fp_glWindowPos3iARB(x, y, z); } -inline void glWindowPos3ivARB(const GLint* v) { fp_glWindowPos3ivARB(v); } -inline void glWindowPos3sARB(GLshort x, GLshort y, GLshort z) { fp_glWindowPos3sARB(x, y, z); } -inline void glWindowPos3svARB(const GLshort* v) { fp_glWindowPos3svARB(v); } +/* GL_EXT_base_instance */ +inline void glDrawArraysInstancedBaseInstanceEXT(GLenum mode, GLint first, GLsizei count, GLsizei instancecount, GLuint baseinstance) { fp_glDrawArraysInstancedBaseInstanceEXT(mode, first, count, instancecount, baseinstance); } +inline void glDrawElementsInstancedBaseInstanceEXT(GLenum mode, GLsizei count, GLenum type, const void* indices, GLsizei instancecount, GLuint baseinstance) { fp_glDrawElementsInstancedBaseInstanceEXT(mode, count, type, indices, instancecount, baseinstance); } +inline void glDrawElementsInstancedBaseVertexBaseInstanceEXT(GLenum mode, GLsizei count, GLenum type, const void* indices, GLsizei instancecount, GLint basevertex, GLuint baseinstance) { fp_glDrawElementsInstancedBaseVertexBaseInstanceEXT(mode, count, type, indices, instancecount, basevertex, baseinstance); } /* GL_EXT_bindable_uniform */ inline void glUniformBufferEXT(GLuint program, GLint location, GLuint buffer) { fp_glUniformBufferEXT(program, location, buffer); } inline GLint glGetUniformBufferSizeEXT(GLuint program, GLint location) { return fp_glGetUniformBufferSizeEXT(program, location); } inline GLintptr glGetUniformOffsetEXT(GLuint program, GLint location) { return fp_glGetUniformOffsetEXT(program, location); } -/* GL_EXT_blend_color */ -inline void glBlendColorEXT(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha) { fp_glBlendColorEXT(red, green, blue, alpha); } - -/* GL_EXT_blend_equation_separate */ -inline void glBlendEquationSeparateEXT(GLenum modeRGB, GLenum modeAlpha) { fp_glBlendEquationSeparateEXT(modeRGB, modeAlpha); } - -/* GL_EXT_blend_func_separate */ -inline void glBlendFuncSeparateEXT(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha) { fp_glBlendFuncSeparateEXT(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha); } - -/* GL_EXT_blend_minmax */ -inline void glBlendEquationEXT(GLenum mode) { fp_glBlendEquationEXT(mode); } - -/* GL_EXT_color_subtable */ -inline void glColorSubTableEXT(GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const void* data) { fp_glColorSubTableEXT(target, start, count, format, type, data); } -inline void glCopyColorSubTableEXT(GLenum target, GLsizei start, GLint x, GLint y, GLsizei width) { fp_glCopyColorSubTableEXT(target, start, x, y, width); } - -/* GL_EXT_compiled_vertex_array */ -inline void glLockArraysEXT(GLint first, GLsizei count) { fp_glLockArraysEXT(first, count); } -inline void glUnlockArraysEXT() { fp_glUnlockArraysEXT(); } - -/* GL_EXT_convolution */ -inline void glConvolutionFilter1DEXT(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void* image) { fp_glConvolutionFilter1DEXT(target, internalformat, width, format, type, image); } -inline void glConvolutionFilter2DEXT(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* image) { fp_glConvolutionFilter2DEXT(target, internalformat, width, height, format, type, image); } -inline void glConvolutionParameterfEXT(GLenum target, GLenum pname, GLfloat params) { fp_glConvolutionParameterfEXT(target, pname, params); } -inline void glConvolutionParameterfvEXT(GLenum target, GLenum pname, const GLfloat* params) { fp_glConvolutionParameterfvEXT(target, pname, params); } -inline void glConvolutionParameteriEXT(GLenum target, GLenum pname, GLint params) { fp_glConvolutionParameteriEXT(target, pname, params); } -inline void glConvolutionParameterivEXT(GLenum target, GLenum pname, const GLint* params) { fp_glConvolutionParameterivEXT(target, pname, params); } -inline void glCopyConvolutionFilter1DEXT(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width) { fp_glCopyConvolutionFilter1DEXT(target, internalformat, x, y, width); } -inline void glCopyConvolutionFilter2DEXT(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height) { fp_glCopyConvolutionFilter2DEXT(target, internalformat, x, y, width, height); } -inline void glGetConvolutionFilterEXT(GLenum target, GLenum format, GLenum type, void* image) { fp_glGetConvolutionFilterEXT(target, format, type, image); } -inline void glGetConvolutionParameterfvEXT(GLenum target, GLenum pname, GLfloat* params) { fp_glGetConvolutionParameterfvEXT(target, pname, params); } -inline void glGetConvolutionParameterivEXT(GLenum target, GLenum pname, GLint* params) { fp_glGetConvolutionParameterivEXT(target, pname, params); } -inline void glGetSeparableFilterEXT(GLenum target, GLenum format, GLenum type, void* row, void* column, void* span) { fp_glGetSeparableFilterEXT(target, format, type, row, column, span); } -inline void glSeparableFilter2DEXT(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* row, const void* column) { fp_glSeparableFilter2DEXT(target, internalformat, width, height, format, type, row, column); } - -/* GL_EXT_coordinate_frame */ -inline void glTangent3bEXT(GLbyte tx, GLbyte ty, GLbyte tz) { fp_glTangent3bEXT(tx, ty, tz); } -inline void glTangent3bvEXT(const GLbyte* v) { fp_glTangent3bvEXT(v); } -inline void glTangent3dEXT(GLdouble tx, GLdouble ty, GLdouble tz) { fp_glTangent3dEXT(tx, ty, tz); } -inline void glTangent3dvEXT(const GLdouble* v) { fp_glTangent3dvEXT(v); } -inline void glTangent3fEXT(GLfloat tx, GLfloat ty, GLfloat tz) { fp_glTangent3fEXT(tx, ty, tz); } -inline void glTangent3fvEXT(const GLfloat* v) { fp_glTangent3fvEXT(v); } -inline void glTangent3iEXT(GLint tx, GLint ty, GLint tz) { fp_glTangent3iEXT(tx, ty, tz); } -inline void glTangent3ivEXT(const GLint* v) { fp_glTangent3ivEXT(v); } -inline void glTangent3sEXT(GLshort tx, GLshort ty, GLshort tz) { fp_glTangent3sEXT(tx, ty, tz); } -inline void glTangent3svEXT(const GLshort* v) { fp_glTangent3svEXT(v); } -inline void glBinormal3bEXT(GLbyte bx, GLbyte by, GLbyte bz) { fp_glBinormal3bEXT(bx, by, bz); } -inline void glBinormal3bvEXT(const GLbyte* v) { fp_glBinormal3bvEXT(v); } -inline void glBinormal3dEXT(GLdouble bx, GLdouble by, GLdouble bz) { fp_glBinormal3dEXT(bx, by, bz); } -inline void glBinormal3dvEXT(const GLdouble* v) { fp_glBinormal3dvEXT(v); } -inline void glBinormal3fEXT(GLfloat bx, GLfloat by, GLfloat bz) { fp_glBinormal3fEXT(bx, by, bz); } -inline void glBinormal3fvEXT(const GLfloat* v) { fp_glBinormal3fvEXT(v); } -inline void glBinormal3iEXT(GLint bx, GLint by, GLint bz) { fp_glBinormal3iEXT(bx, by, bz); } -inline void glBinormal3ivEXT(const GLint* v) { fp_glBinormal3ivEXT(v); } -inline void glBinormal3sEXT(GLshort bx, GLshort by, GLshort bz) { fp_glBinormal3sEXT(bx, by, bz); } -inline void glBinormal3svEXT(const GLshort* v) { fp_glBinormal3svEXT(v); } -inline void glTangentPointerEXT(GLenum type, GLsizei stride, const void* pointer) { fp_glTangentPointerEXT(type, stride, pointer); } -inline void glBinormalPointerEXT(GLenum type, GLsizei stride, const void* pointer) { fp_glBinormalPointerEXT(type, stride, pointer); } - -/* GL_EXT_cull_vertex */ -inline void glCullParameterdvEXT(GLenum pname, GLdouble* params) { fp_glCullParameterdvEXT(pname, params); } -inline void glCullParameterfvEXT(GLenum pname, GLfloat* params) { fp_glCullParameterfvEXT(pname, params); } +/* GL_EXT_copy_image */ +inline void glCopyImageSubDataEXT(GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth) { fp_glCopyImageSubDataEXT(srcName, srcTarget, srcLevel, srcX, srcY, srcZ, dstName, dstTarget, dstLevel, dstX, dstY, dstZ, srcWidth, srcHeight, srcDepth); } /* GL_EXT_debug_label */ inline void glLabelObjectEXT(GLenum type, GLuint object, GLsizei length, const GLchar* label) { fp_glLabelObjectEXT(type, object, length, label); } @@ -1405,9 +1255,6 @@ inline void glInsertEventMarkerEXT(GLsizei length, const GLchar* marker) { fp_gl inline void glPushGroupMarkerEXT(GLsizei length, const GLchar* marker) { fp_glPushGroupMarkerEXT(length, marker); } inline void glPopGroupMarkerEXT() { fp_glPopGroupMarkerEXT(); } -/* GL_EXT_depth_bounds_test */ -inline void glDepthBoundsEXT(GLclampd zmin, GLclampd zmax) { fp_glDepthBoundsEXT(zmin, zmax); } - /* GL_EXT_direct_state_access */ inline void glMatrixLoadfEXT(GLenum mode, const GLfloat* m) { fp_glMatrixLoadfEXT(mode, m); } inline void glMatrixLoaddEXT(GLenum mode, const GLdouble* m) { fp_glMatrixLoaddEXT(mode, m); } @@ -1629,7 +1476,7 @@ inline void* glMapNamedBufferRangeEXT(GLuint buffer, GLintptr offset, GLsizeiptr inline void glFlushMappedNamedBufferRangeEXT(GLuint buffer, GLintptr offset, GLsizeiptr length) { fp_glFlushMappedNamedBufferRangeEXT(buffer, offset, length); } inline void glNamedBufferStorageEXT(GLuint buffer, GLsizeiptr size, const void* data, GLbitfield flags) { fp_glNamedBufferStorageEXT(buffer, size, data, flags); } inline void glClearNamedBufferDataEXT(GLuint buffer, GLenum internalformat, GLenum format, GLenum type, const void* data) { fp_glClearNamedBufferDataEXT(buffer, internalformat, format, type, data); } -inline void glClearNamedBufferSubDataEXT(GLuint buffer, GLenum internalformat, GLenum format, GLenum type, GLsizeiptr offset, GLsizeiptr size, const void* data) { fp_glClearNamedBufferSubDataEXT(buffer, internalformat, format, type, offset, size, data); } +inline void glClearNamedBufferSubDataEXT(GLuint buffer, GLenum internalformat, GLsizeiptr offset, GLsizeiptr size, GLenum format, GLenum type, const void* data) { fp_glClearNamedBufferSubDataEXT(buffer, internalformat, offset, size, format, type, data); } inline void glNamedFramebufferParameteriEXT(GLuint framebuffer, GLenum pname, GLint param) { fp_glNamedFramebufferParameteriEXT(framebuffer, pname, param); } inline void glGetNamedFramebufferParameterivEXT(GLuint framebuffer, GLenum pname, GLint* params) { fp_glGetNamedFramebufferParameterivEXT(framebuffer, pname, params); } inline void glProgramUniform1dEXT(GLuint program, GLint location, GLdouble x) { fp_glProgramUniform1dEXT(program, location, x); } @@ -1687,17 +1534,26 @@ inline void glDrawBuffersEXT(GLsizei n, const GLenum* bufs) { fp_glDrawBuffersEX /* GL_EXT_draw_buffers2 */ inline void glColorMaskIndexedEXT(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a) { fp_glColorMaskIndexedEXT(index, r, g, b, a); } +/* GL_EXT_draw_buffers_indexed */ +inline void glEnableiEXT(GLenum target, GLuint index) { fp_glEnableiEXT(target, index); } +inline void glDisableiEXT(GLenum target, GLuint index) { fp_glDisableiEXT(target, index); } +inline void glBlendEquationiEXT(GLuint buf, GLenum mode) { fp_glBlendEquationiEXT(buf, mode); } +inline void glBlendEquationSeparateiEXT(GLuint buf, GLenum modeRGB, GLenum modeAlpha) { fp_glBlendEquationSeparateiEXT(buf, modeRGB, modeAlpha); } +inline void glBlendFunciEXT(GLuint buf, GLenum src, GLenum dst) { fp_glBlendFunciEXT(buf, src, dst); } +inline void glBlendFuncSeparateiEXT(GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha) { fp_glBlendFuncSeparateiEXT(buf, srcRGB, dstRGB, srcAlpha, dstAlpha); } +inline void glColorMaskiEXT(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a) { fp_glColorMaskiEXT(index, r, g, b, a); } +inline GLboolean glIsEnablediEXT(GLenum target, GLuint index) { return fp_glIsEnablediEXT(target, index); } + +/* GL_EXT_draw_elements_base_vertex */ +inline void glDrawElementsBaseVertexEXT(GLenum mode, GLsizei count, GLenum type, const void* indices, GLint basevertex) { fp_glDrawElementsBaseVertexEXT(mode, count, type, indices, basevertex); } +inline void glDrawRangeElementsBaseVertexEXT(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void* indices, GLint basevertex) { fp_glDrawRangeElementsBaseVertexEXT(mode, start, end, count, type, indices, basevertex); } +inline void glDrawElementsInstancedBaseVertexEXT(GLenum mode, GLsizei count, GLenum type, const void* indices, GLsizei instancecount, GLint basevertex) { fp_glDrawElementsInstancedBaseVertexEXT(mode, count, type, indices, instancecount, basevertex); } +inline void glMultiDrawElementsBaseVertexEXT(GLenum mode, const GLsizei* count, GLenum type, const void** indices, GLsizei primcount, const GLint* basevertex) { fp_glMultiDrawElementsBaseVertexEXT(mode, count, type, indices, primcount, basevertex); } + /* GL_EXT_draw_instanced */ inline void glDrawArraysInstancedEXT(GLenum mode, GLint start, GLsizei count, GLsizei primcount) { fp_glDrawArraysInstancedEXT(mode, start, count, primcount); } inline void glDrawElementsInstancedEXT(GLenum mode, GLsizei count, GLenum type, const void* indices, GLsizei primcount) { fp_glDrawElementsInstancedEXT(mode, count, type, indices, primcount); } -/* GL_EXT_fog_coord */ -inline void glFogCoordfEXT(GLfloat coord) { fp_glFogCoordfEXT(coord); } -inline void glFogCoordfvEXT(const GLfloat* coord) { fp_glFogCoordfvEXT(coord); } -inline void glFogCoorddEXT(GLdouble coord) { fp_glFogCoorddEXT(coord); } -inline void glFogCoorddvEXT(const GLdouble* coord) { fp_glFogCoorddvEXT(coord); } -inline void glFogCoordPointerEXT(GLenum type, GLsizei stride, const void* pointer) { fp_glFogCoordPointerEXT(type, stride, pointer); } - /* GL_EXT_framebuffer_blit */ inline void glBlitFramebufferEXT(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter) { fp_glBlitFramebufferEXT(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter); } @@ -1723,6 +1579,9 @@ inline void glFramebufferRenderbufferEXT(GLenum target, GLenum attachment, GLenu inline void glGetFramebufferAttachmentParameterivEXT(GLenum target, GLenum attachment, GLenum pname, GLint* params) { fp_glGetFramebufferAttachmentParameterivEXT(target, attachment, pname, params); } inline void glGenerateMipmapEXT(GLenum target) { fp_glGenerateMipmapEXT(target); } +/* GL_EXT_geometry_shader */ +inline void glFramebufferTextureEXT(GLenum target, GLenum attachment, GLuint texture, GLint level) { fp_glFramebufferTextureEXT(target, attachment, texture, level); } + /* GL_EXT_geometry_shader4 */ inline void glProgramParameteriEXT(GLuint program, GLenum pname, GLint value) { fp_glProgramParameteriEXT(program, pname, value); } @@ -1743,43 +1602,16 @@ inline void glUniform2uivEXT(GLint location, GLsizei count, const GLuint* value) inline void glUniform3uivEXT(GLint location, GLsizei count, const GLuint* value) { fp_glUniform3uivEXT(location, count, value); } inline void glUniform4uivEXT(GLint location, GLsizei count, const GLuint* value) { fp_glUniform4uivEXT(location, count, value); } -/* GL_EXT_histogram */ -inline void glGetHistogramEXT(GLenum target, GLboolean reset, GLenum format, GLenum type, void* values) { fp_glGetHistogramEXT(target, reset, format, type, values); } -inline void glGetHistogramParameterfvEXT(GLenum target, GLenum pname, GLfloat* params) { fp_glGetHistogramParameterfvEXT(target, pname, params); } -inline void glGetHistogramParameterivEXT(GLenum target, GLenum pname, GLint* params) { fp_glGetHistogramParameterivEXT(target, pname, params); } -inline void glGetMinmaxEXT(GLenum target, GLboolean reset, GLenum format, GLenum type, void* values) { fp_glGetMinmaxEXT(target, reset, format, type, values); } -inline void glGetMinmaxParameterfvEXT(GLenum target, GLenum pname, GLfloat* params) { fp_glGetMinmaxParameterfvEXT(target, pname, params); } -inline void glGetMinmaxParameterivEXT(GLenum target, GLenum pname, GLint* params) { fp_glGetMinmaxParameterivEXT(target, pname, params); } -inline void glHistogramEXT(GLenum target, GLsizei width, GLenum internalformat, GLboolean sink) { fp_glHistogramEXT(target, width, internalformat, sink); } -inline void glMinmaxEXT(GLenum target, GLenum internalformat, GLboolean sink) { fp_glMinmaxEXT(target, internalformat, sink); } -inline void glResetHistogramEXT(GLenum target) { fp_glResetHistogramEXT(target); } -inline void glResetMinmaxEXT(GLenum target) { fp_glResetMinmaxEXT(target); } - -/* GL_EXT_index_func */ -inline void glIndexFuncEXT(GLenum func, GLclampf ref) { fp_glIndexFuncEXT(func, ref); } - -/* GL_EXT_index_material */ -inline void glIndexMaterialEXT(GLenum face, GLenum mode) { fp_glIndexMaterialEXT(face, mode); } - /* GL_EXT_instanced_arrays */ inline void glVertexAttribDivisorEXT(GLuint index, GLuint divisor) { fp_glVertexAttribDivisorEXT(index, divisor); } -/* GL_EXT_light_texture */ -inline void glApplyTextureEXT(GLenum mode) { fp_glApplyTextureEXT(mode); } -inline void glTextureLightEXT(GLenum pname) { fp_glTextureLightEXT(pname); } -inline void glTextureMaterialEXT(GLenum face, GLenum mode) { fp_glTextureMaterialEXT(face, mode); } - /* GL_EXT_map_buffer_range */ inline void* glMapBufferRangeEXT(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access) { return fp_glMapBufferRangeEXT(target, offset, length, access); } inline void glFlushMappedBufferRangeEXT(GLenum target, GLintptr offset, GLsizeiptr length) { fp_glFlushMappedBufferRangeEXT(target, offset, length); } -/* GL_EXT_multi_draw_arrays */ -inline void glMultiDrawArraysEXT(GLenum mode, const GLint* first, const GLsizei* count, GLsizei primcount) { fp_glMultiDrawArraysEXT(mode, first, count, primcount); } -inline void glMultiDrawElementsEXT(GLenum mode, const GLsizei* count, GLenum type, const void** indices, GLsizei primcount) { fp_glMultiDrawElementsEXT(mode, count, type, indices, primcount); } - -/* GL_EXT_multisample */ -inline void glSampleMaskEXT(GLclampf value, GLboolean invert) { fp_glSampleMaskEXT(value, invert); } -inline void glSamplePatternEXT(GLenum pattern) { fp_glSamplePatternEXT(pattern); } +/* GL_EXT_multi_draw_indirect */ +inline void glMultiDrawArraysIndirectEXT(GLenum mode, const void* indirect, GLsizei drawcount, GLsizei stride) { fp_glMultiDrawArraysIndirectEXT(mode, indirect, drawcount, stride); } +inline void glMultiDrawElementsIndirectEXT(GLenum mode, GLenum type, const void* indirect, GLsizei drawcount, GLsizei stride) { fp_glMultiDrawElementsIndirectEXT(mode, type, indirect, drawcount, stride); } /* GL_EXT_multisampled_render_to_texture */ inline void glFramebufferTexture2DMultisampleEXT(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLsizei samples) { fp_glFramebufferTexture2DMultisampleEXT(target, attachment, textarget, texture, level, samples); } @@ -1789,52 +1621,24 @@ inline void glReadBufferIndexedEXT(GLenum src, GLint index) { fp_glReadBufferInd inline void glDrawBuffersIndexedEXT(GLint n, const GLenum* location, const GLint* indices) { fp_glDrawBuffersIndexedEXT(n, location, indices); } inline void glGetIntegeri_vEXT(GLenum target, GLuint index, GLint* data) { fp_glGetIntegeri_vEXT(target, index, data); } -/* GL_EXT_paletted_texture */ -inline void glColorTableEXT(GLenum target, GLenum internalFormat, GLsizei width, GLenum format, GLenum type, const void* table) { fp_glColorTableEXT(target, internalFormat, width, format, type, table); } -inline void glGetColorTableEXT(GLenum target, GLenum format, GLenum type, void* data) { fp_glGetColorTableEXT(target, format, type, data); } -inline void glGetColorTableParameterivEXT(GLenum target, GLenum pname, GLint* params) { fp_glGetColorTableParameterivEXT(target, pname, params); } -inline void glGetColorTableParameterfvEXT(GLenum target, GLenum pname, GLfloat* params) { fp_glGetColorTableParameterfvEXT(target, pname, params); } +/* GL_EXT_polygon_offset_clamp */ +inline void glPolygonOffsetClampEXT(GLfloat factor, GLfloat units, GLfloat clamp) { fp_glPolygonOffsetClampEXT(factor, units, clamp); } -/* GL_EXT_pixel_transform */ -inline void glPixelTransformParameteriEXT(GLenum target, GLenum pname, GLint param) { fp_glPixelTransformParameteriEXT(target, pname, param); } -inline void glPixelTransformParameterfEXT(GLenum target, GLenum pname, GLfloat param) { fp_glPixelTransformParameterfEXT(target, pname, param); } -inline void glPixelTransformParameterivEXT(GLenum target, GLenum pname, const GLint* params) { fp_glPixelTransformParameterivEXT(target, pname, params); } -inline void glPixelTransformParameterfvEXT(GLenum target, GLenum pname, const GLfloat* params) { fp_glPixelTransformParameterfvEXT(target, pname, params); } -inline void glGetPixelTransformParameterivEXT(GLenum target, GLenum pname, GLint* params) { fp_glGetPixelTransformParameterivEXT(target, pname, params); } -inline void glGetPixelTransformParameterfvEXT(GLenum target, GLenum pname, GLfloat* params) { fp_glGetPixelTransformParameterfvEXT(target, pname, params); } - -/* GL_EXT_point_parameters */ -inline void glPointParameterfEXT(GLenum pname, GLfloat param) { fp_glPointParameterfEXT(pname, param); } -inline void glPointParameterfvEXT(GLenum pname, const GLfloat* params) { fp_glPointParameterfvEXT(pname, params); } +/* GL_EXT_primitive_bounding_box */ +inline void glPrimitiveBoundingBoxEXT(GLfloat minX, GLfloat minY, GLfloat minZ, GLfloat minW, GLfloat maxX, GLfloat maxY, GLfloat maxZ, GLfloat maxW) { fp_glPrimitiveBoundingBoxEXT(minX, minY, minZ, minW, maxX, maxY, maxZ, maxW); } /* GL_EXT_provoking_vertex */ inline void glProvokingVertexEXT(GLenum mode) { fp_glProvokingVertexEXT(mode); } +/* GL_EXT_raster_multisample */ +inline void glRasterSamplesEXT(GLuint samples, GLboolean fixedsamplelocations) { fp_glRasterSamplesEXT(samples, fixedsamplelocations); } + /* GL_EXT_robustness */ inline GLenum glGetGraphicsResetStatusEXT() { return fp_glGetGraphicsResetStatusEXT(); } inline void glReadnPixelsEXT(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void* data) { fp_glReadnPixelsEXT(x, y, width, height, format, type, bufSize, data); } inline void glGetnUniformfvEXT(GLuint program, GLint location, GLsizei bufSize, GLfloat* params) { fp_glGetnUniformfvEXT(program, location, bufSize, params); } inline void glGetnUniformivEXT(GLuint program, GLint location, GLsizei bufSize, GLint* params) { fp_glGetnUniformivEXT(program, location, bufSize, params); } -/* GL_EXT_secondary_color */ -inline void glSecondaryColor3bEXT(GLbyte red, GLbyte green, GLbyte blue) { fp_glSecondaryColor3bEXT(red, green, blue); } -inline void glSecondaryColor3bvEXT(const GLbyte* v) { fp_glSecondaryColor3bvEXT(v); } -inline void glSecondaryColor3dEXT(GLdouble red, GLdouble green, GLdouble blue) { fp_glSecondaryColor3dEXT(red, green, blue); } -inline void glSecondaryColor3dvEXT(const GLdouble* v) { fp_glSecondaryColor3dvEXT(v); } -inline void glSecondaryColor3fEXT(GLfloat red, GLfloat green, GLfloat blue) { fp_glSecondaryColor3fEXT(red, green, blue); } -inline void glSecondaryColor3fvEXT(const GLfloat* v) { fp_glSecondaryColor3fvEXT(v); } -inline void glSecondaryColor3iEXT(GLint red, GLint green, GLint blue) { fp_glSecondaryColor3iEXT(red, green, blue); } -inline void glSecondaryColor3ivEXT(const GLint* v) { fp_glSecondaryColor3ivEXT(v); } -inline void glSecondaryColor3sEXT(GLshort red, GLshort green, GLshort blue) { fp_glSecondaryColor3sEXT(red, green, blue); } -inline void glSecondaryColor3svEXT(const GLshort* v) { fp_glSecondaryColor3svEXT(v); } -inline void glSecondaryColor3ubEXT(GLubyte red, GLubyte green, GLubyte blue) { fp_glSecondaryColor3ubEXT(red, green, blue); } -inline void glSecondaryColor3ubvEXT(const GLubyte* v) { fp_glSecondaryColor3ubvEXT(v); } -inline void glSecondaryColor3uiEXT(GLuint red, GLuint green, GLuint blue) { fp_glSecondaryColor3uiEXT(red, green, blue); } -inline void glSecondaryColor3uivEXT(const GLuint* v) { fp_glSecondaryColor3uivEXT(v); } -inline void glSecondaryColor3usEXT(GLushort red, GLushort green, GLushort blue) { fp_glSecondaryColor3usEXT(red, green, blue); } -inline void glSecondaryColor3usvEXT(const GLushort* v) { fp_glSecondaryColor3usvEXT(v); } -inline void glSecondaryColorPointerEXT(GLint size, GLenum type, GLsizei stride, const void* pointer) { fp_glSecondaryColorPointerEXT(size, type, stride, pointer); } - /* GL_EXT_separate_shader_objects */ inline void glUseShaderProgramEXT(GLenum type, GLuint program) { fp_glUseShaderProgramEXT(type, program); } inline void glActiveProgramEXT(GLuint program) { fp_glActiveProgramEXT(program); } @@ -1857,28 +1661,38 @@ inline void glMemoryBarrierEXT(GLbitfield barriers) { fp_glMemoryBarrierEXT(barr /* GL_EXT_stencil_clear_tag */ inline void glStencilClearTagEXT(GLsizei stencilTagBits, GLuint stencilClearTag) { fp_glStencilClearTagEXT(stencilTagBits, stencilClearTag); } -/* GL_EXT_stencil_two_side */ -inline void glActiveStencilFaceEXT(GLenum face) { fp_glActiveStencilFaceEXT(face); } +/* GL_EXT_tessellation_shader */ +inline void glPatchParameteriEXT(GLenum pname, GLint value) { fp_glPatchParameteriEXT(pname, value); } -/* GL_EXT_texture_buffer_object */ -inline void glTexBufferEXT(GLenum target, GLenum internalformat, GLuint buffer) { fp_glTexBufferEXT(target, internalformat, buffer); } +/* GL_EXT_texture_array */ +inline void glFramebufferTextureLayerEXT(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer) { fp_glFramebufferTextureLayerEXT(target, attachment, texture, level, layer); } -/* GL_EXT_texture_integer */ +/* GL_EXT_texture_border_clamp */ inline void glTexParameterIivEXT(GLenum target, GLenum pname, const GLint* params) { fp_glTexParameterIivEXT(target, pname, params); } inline void glTexParameterIuivEXT(GLenum target, GLenum pname, const GLuint* params) { fp_glTexParameterIuivEXT(target, pname, params); } inline void glGetTexParameterIivEXT(GLenum target, GLenum pname, GLint* params) { fp_glGetTexParameterIivEXT(target, pname, params); } inline void glGetTexParameterIuivEXT(GLenum target, GLenum pname, GLuint* params) { fp_glGetTexParameterIuivEXT(target, pname, params); } +inline void glSamplerParameterIivEXT(GLuint sampler, GLenum pname, const GLint* param) { fp_glSamplerParameterIivEXT(sampler, pname, param); } +inline void glSamplerParameterIuivEXT(GLuint sampler, GLenum pname, const GLuint* param) { fp_glSamplerParameterIuivEXT(sampler, pname, param); } +inline void glGetSamplerParameterIivEXT(GLuint sampler, GLenum pname, GLint* params) { fp_glGetSamplerParameterIivEXT(sampler, pname, params); } +inline void glGetSamplerParameterIuivEXT(GLuint sampler, GLenum pname, GLuint* params) { fp_glGetSamplerParameterIuivEXT(sampler, pname, params); } + +/* GL_EXT_texture_buffer */ +inline void glTexBufferEXT(GLenum target, GLenum internalformat, GLuint buffer) { fp_glTexBufferEXT(target, internalformat, buffer); } +inline void glTexBufferRangeEXT(GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size) { fp_glTexBufferRangeEXT(target, internalformat, buffer, offset, size); } + +/* GL_EXT_texture_integer */ inline void glClearColorIiEXT(GLint red, GLint green, GLint blue, GLint alpha) { fp_glClearColorIiEXT(red, green, blue, alpha); } inline void glClearColorIuiEXT(GLuint red, GLuint green, GLuint blue, GLuint alpha) { fp_glClearColorIuiEXT(red, green, blue, alpha); } -/* GL_EXT_texture_perturb_normal */ -inline void glTextureNormalEXT(GLenum mode) { fp_glTextureNormalEXT(mode); } - /* GL_EXT_texture_storage */ inline void glTexStorage1DEXT(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width) { fp_glTexStorage1DEXT(target, levels, internalformat, width); } inline void glTexStorage2DEXT(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height) { fp_glTexStorage2DEXT(target, levels, internalformat, width, height); } inline void glTexStorage3DEXT(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth) { fp_glTexStorage3DEXT(target, levels, internalformat, width, height, depth); } +/* GL_EXT_texture_view */ +inline void glTextureViewEXT(GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers) { fp_glTextureViewEXT(texture, target, origtexture, internalformat, minlevel, numlevels, minlayer, numlayers); } + /* GL_EXT_transform_feedback */ inline void glBeginTransformFeedbackEXT(GLenum primitiveMode) { fp_glBeginTransformFeedbackEXT(primitiveMode); } inline void glEndTransformFeedbackEXT() { fp_glEndTransformFeedbackEXT(); } @@ -1900,195 +1714,34 @@ inline void glVertexAttribL4dvEXT(GLuint index, const GLdouble* v) { fp_glVertex inline void glVertexAttribLPointerEXT(GLuint index, GLint size, GLenum type, GLsizei stride, const void* pointer) { fp_glVertexAttribLPointerEXT(index, size, type, stride, pointer); } inline void glGetVertexAttribLdvEXT(GLuint index, GLenum pname, GLdouble* params) { fp_glGetVertexAttribLdvEXT(index, pname, params); } -/* GL_EXT_vertex_shader */ -inline void glBeginVertexShaderEXT() { fp_glBeginVertexShaderEXT(); } -inline void glEndVertexShaderEXT() { fp_glEndVertexShaderEXT(); } -inline void glBindVertexShaderEXT(GLuint id) { fp_glBindVertexShaderEXT(id); } -inline GLuint glGenVertexShadersEXT(GLuint range) { return fp_glGenVertexShadersEXT(range); } -inline void glDeleteVertexShaderEXT(GLuint id) { fp_glDeleteVertexShaderEXT(id); } -inline void glShaderOp1EXT(GLenum op, GLuint res, GLuint arg1) { fp_glShaderOp1EXT(op, res, arg1); } -inline void glShaderOp2EXT(GLenum op, GLuint res, GLuint arg1, GLuint arg2) { fp_glShaderOp2EXT(op, res, arg1, arg2); } -inline void glShaderOp3EXT(GLenum op, GLuint res, GLuint arg1, GLuint arg2, GLuint arg3) { fp_glShaderOp3EXT(op, res, arg1, arg2, arg3); } -inline void glSwizzleEXT(GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW) { fp_glSwizzleEXT(res, in, outX, outY, outZ, outW); } -inline void glWriteMaskEXT(GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW) { fp_glWriteMaskEXT(res, in, outX, outY, outZ, outW); } -inline void glInsertComponentEXT(GLuint res, GLuint src, GLuint num) { fp_glInsertComponentEXT(res, src, num); } -inline void glExtractComponentEXT(GLuint res, GLuint src, GLuint num) { fp_glExtractComponentEXT(res, src, num); } -inline GLuint glGenSymbolsEXT(GLenum datatype, GLenum storagetype, GLenum range, GLuint components) { return fp_glGenSymbolsEXT(datatype, storagetype, range, components); } -inline void glSetInvariantEXT(GLuint id, GLenum type, const void* addr) { fp_glSetInvariantEXT(id, type, addr); } -inline void glSetLocalConstantEXT(GLuint id, GLenum type, const void* addr) { fp_glSetLocalConstantEXT(id, type, addr); } -inline void glVariantbvEXT(GLuint id, const GLbyte* addr) { fp_glVariantbvEXT(id, addr); } -inline void glVariantsvEXT(GLuint id, const GLshort* addr) { fp_glVariantsvEXT(id, addr); } -inline void glVariantivEXT(GLuint id, const GLint* addr) { fp_glVariantivEXT(id, addr); } -inline void glVariantfvEXT(GLuint id, const GLfloat* addr) { fp_glVariantfvEXT(id, addr); } -inline void glVariantdvEXT(GLuint id, const GLdouble* addr) { fp_glVariantdvEXT(id, addr); } -inline void glVariantubvEXT(GLuint id, const GLubyte* addr) { fp_glVariantubvEXT(id, addr); } -inline void glVariantusvEXT(GLuint id, const GLushort* addr) { fp_glVariantusvEXT(id, addr); } -inline void glVariantuivEXT(GLuint id, const GLuint* addr) { fp_glVariantuivEXT(id, addr); } -inline void glVariantPointerEXT(GLuint id, GLenum type, GLuint stride, const void* addr) { fp_glVariantPointerEXT(id, type, stride, addr); } -inline void glEnableVariantClientStateEXT(GLuint id) { fp_glEnableVariantClientStateEXT(id); } -inline void glDisableVariantClientStateEXT(GLuint id) { fp_glDisableVariantClientStateEXT(id); } -inline GLuint glBindLightParameterEXT(GLenum light, GLenum value) { return fp_glBindLightParameterEXT(light, value); } -inline GLuint glBindMaterialParameterEXT(GLenum face, GLenum value) { return fp_glBindMaterialParameterEXT(face, value); } -inline GLuint glBindTexGenParameterEXT(GLenum unit, GLenum coord, GLenum value) { return fp_glBindTexGenParameterEXT(unit, coord, value); } -inline GLuint glBindTextureUnitParameterEXT(GLenum unit, GLenum value) { return fp_glBindTextureUnitParameterEXT(unit, value); } -inline GLuint glBindParameterEXT(GLenum value) { return fp_glBindParameterEXT(value); } -inline GLboolean glIsVariantEnabledEXT(GLuint id, GLenum cap) { return fp_glIsVariantEnabledEXT(id, cap); } -inline void glGetVariantBooleanvEXT(GLuint id, GLenum value, GLboolean* data) { fp_glGetVariantBooleanvEXT(id, value, data); } -inline void glGetVariantIntegervEXT(GLuint id, GLenum value, GLint* data) { fp_glGetVariantIntegervEXT(id, value, data); } -inline void glGetVariantFloatvEXT(GLuint id, GLenum value, GLfloat* data) { fp_glGetVariantFloatvEXT(id, value, data); } -inline void glGetVariantPointervEXT(GLuint id, GLenum value, void** data) { fp_glGetVariantPointervEXT(id, value, data); } -inline void glGetInvariantBooleanvEXT(GLuint id, GLenum value, GLboolean* data) { fp_glGetInvariantBooleanvEXT(id, value, data); } -inline void glGetInvariantIntegervEXT(GLuint id, GLenum value, GLint* data) { fp_glGetInvariantIntegervEXT(id, value, data); } -inline void glGetInvariantFloatvEXT(GLuint id, GLenum value, GLfloat* data) { fp_glGetInvariantFloatvEXT(id, value, data); } -inline void glGetLocalConstantBooleanvEXT(GLuint id, GLenum value, GLboolean* data) { fp_glGetLocalConstantBooleanvEXT(id, value, data); } -inline void glGetLocalConstantIntegervEXT(GLuint id, GLenum value, GLint* data) { fp_glGetLocalConstantIntegervEXT(id, value, data); } -inline void glGetLocalConstantFloatvEXT(GLuint id, GLenum value, GLfloat* data) { fp_glGetLocalConstantFloatvEXT(id, value, data); } - -/* GL_EXT_vertex_weighting */ -inline void glVertexWeightfEXT(GLfloat weight) { fp_glVertexWeightfEXT(weight); } -inline void glVertexWeightfvEXT(const GLfloat* weight) { fp_glVertexWeightfvEXT(weight); } -inline void glVertexWeightPointerEXT(GLint size, GLenum type, GLsizei stride, const void* pointer) { fp_glVertexWeightPointerEXT(size, type, stride, pointer); } - /* GL_EXT_x11_sync_object */ inline GLsync glImportSyncEXT(GLenum external_sync_type, GLintptr external_sync, GLbitfield flags) { return fp_glImportSyncEXT(external_sync_type, external_sync, flags); } -/* GL_OES_byte_coordinates */ -inline void glMultiTexCoord1bOES(GLenum texture, GLbyte s) { fp_glMultiTexCoord1bOES(texture, s); } -inline void glMultiTexCoord1bvOES(GLenum texture, const GLbyte* coords) { fp_glMultiTexCoord1bvOES(texture, coords); } -inline void glMultiTexCoord2bOES(GLenum texture, GLbyte s, GLbyte t) { fp_glMultiTexCoord2bOES(texture, s, t); } -inline void glMultiTexCoord2bvOES(GLenum texture, const GLbyte* coords) { fp_glMultiTexCoord2bvOES(texture, coords); } -inline void glMultiTexCoord3bOES(GLenum texture, GLbyte s, GLbyte t, GLbyte r) { fp_glMultiTexCoord3bOES(texture, s, t, r); } -inline void glMultiTexCoord3bvOES(GLenum texture, const GLbyte* coords) { fp_glMultiTexCoord3bvOES(texture, coords); } -inline void glMultiTexCoord4bOES(GLenum texture, GLbyte s, GLbyte t, GLbyte r, GLbyte q) { fp_glMultiTexCoord4bOES(texture, s, t, r, q); } -inline void glMultiTexCoord4bvOES(GLenum texture, const GLbyte* coords) { fp_glMultiTexCoord4bvOES(texture, coords); } -inline void glTexCoord1bOES(GLbyte s) { fp_glTexCoord1bOES(s); } -inline void glTexCoord1bvOES(const GLbyte* coords) { fp_glTexCoord1bvOES(coords); } -inline void glTexCoord2bOES(GLbyte s, GLbyte t) { fp_glTexCoord2bOES(s, t); } -inline void glTexCoord2bvOES(const GLbyte* coords) { fp_glTexCoord2bvOES(coords); } -inline void glTexCoord3bOES(GLbyte s, GLbyte t, GLbyte r) { fp_glTexCoord3bOES(s, t, r); } -inline void glTexCoord3bvOES(const GLbyte* coords) { fp_glTexCoord3bvOES(coords); } -inline void glTexCoord4bOES(GLbyte s, GLbyte t, GLbyte r, GLbyte q) { fp_glTexCoord4bOES(s, t, r, q); } -inline void glTexCoord4bvOES(const GLbyte* coords) { fp_glTexCoord4bvOES(coords); } -inline void glVertex2bOES(GLbyte x) { fp_glVertex2bOES(x); } -inline void glVertex2bvOES(const GLbyte* coords) { fp_glVertex2bvOES(coords); } -inline void glVertex3bOES(GLbyte x, GLbyte y) { fp_glVertex3bOES(x, y); } -inline void glVertex3bvOES(const GLbyte* coords) { fp_glVertex3bvOES(coords); } -inline void glVertex4bOES(GLbyte x, GLbyte y, GLbyte z) { fp_glVertex4bOES(x, y, z); } -inline void glVertex4bvOES(const GLbyte* coords) { fp_glVertex4bvOES(coords); } +/* GL_OES_copy_image */ +inline void glCopyImageSubDataOES(GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth) { fp_glCopyImageSubDataOES(srcName, srcTarget, srcLevel, srcX, srcY, srcZ, dstName, dstTarget, dstLevel, dstX, dstY, dstZ, srcWidth, srcHeight, srcDepth); } + +/* GL_OES_draw_buffers_indexed */ +inline void glEnableiOES(GLenum target, GLuint index) { fp_glEnableiOES(target, index); } +inline void glDisableiOES(GLenum target, GLuint index) { fp_glDisableiOES(target, index); } +inline void glBlendEquationiOES(GLuint buf, GLenum mode) { fp_glBlendEquationiOES(buf, mode); } +inline void glBlendEquationSeparateiOES(GLuint buf, GLenum modeRGB, GLenum modeAlpha) { fp_glBlendEquationSeparateiOES(buf, modeRGB, modeAlpha); } +inline void glBlendFunciOES(GLuint buf, GLenum src, GLenum dst) { fp_glBlendFunciOES(buf, src, dst); } +inline void glBlendFuncSeparateiOES(GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha) { fp_glBlendFuncSeparateiOES(buf, srcRGB, dstRGB, srcAlpha, dstAlpha); } +inline void glColorMaskiOES(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a) { fp_glColorMaskiOES(index, r, g, b, a); } +inline GLboolean glIsEnablediOES(GLenum target, GLuint index) { return fp_glIsEnablediOES(target, index); } + +/* GL_OES_draw_elements_base_vertex */ +inline void glDrawElementsBaseVertexOES(GLenum mode, GLsizei count, GLenum type, const void* indices, GLint basevertex) { fp_glDrawElementsBaseVertexOES(mode, count, type, indices, basevertex); } +inline void glDrawRangeElementsBaseVertexOES(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void* indices, GLint basevertex) { fp_glDrawRangeElementsBaseVertexOES(mode, start, end, count, type, indices, basevertex); } +inline void glDrawElementsInstancedBaseVertexOES(GLenum mode, GLsizei count, GLenum type, const void* indices, GLsizei instancecount, GLint basevertex) { fp_glDrawElementsInstancedBaseVertexOES(mode, count, type, indices, instancecount, basevertex); } +inline void glMultiDrawElementsBaseVertexOES(GLenum mode, const GLsizei* count, GLenum type, const void** indices, GLsizei primcount, const GLint* basevertex) { fp_glMultiDrawElementsBaseVertexOES(mode, count, type, indices, primcount, basevertex); } /* GL_OES_EGL_image */ inline void glEGLImageTargetTexture2DOES(GLenum target, GLeglImageOES image) { fp_glEGLImageTargetTexture2DOES(target, image); } inline void glEGLImageTargetRenderbufferStorageOES(GLenum target, GLeglImageOES image) { fp_glEGLImageTargetRenderbufferStorageOES(target, image); } -/* GL_OES_fixed_point */ -inline void glAlphaFuncxOES(GLenum func, GLfixed ref) { fp_glAlphaFuncxOES(func, ref); } -inline void glClearColorxOES(GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha) { fp_glClearColorxOES(red, green, blue, alpha); } -inline void glClearDepthxOES(GLfixed depth) { fp_glClearDepthxOES(depth); } -inline void glClipPlanexOES(GLenum plane, const GLfixed* equation) { fp_glClipPlanexOES(plane, equation); } -inline void glColor4xOES(GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha) { fp_glColor4xOES(red, green, blue, alpha); } -inline void glDepthRangexOES(GLfixed n, GLfixed f) { fp_glDepthRangexOES(n, f); } -inline void glFogxOES(GLenum pname, GLfixed param) { fp_glFogxOES(pname, param); } -inline void glFogxvOES(GLenum pname, const GLfixed* param) { fp_glFogxvOES(pname, param); } -inline void glFrustumxOES(GLfixed l, GLfixed r, GLfixed b, GLfixed t, GLfixed n, GLfixed f) { fp_glFrustumxOES(l, r, b, t, n, f); } -inline void glGetClipPlanexOES(GLenum plane, GLfixed* equation) { fp_glGetClipPlanexOES(plane, equation); } -inline void glGetFixedvOES(GLenum pname, GLfixed* params) { fp_glGetFixedvOES(pname, params); } -inline void glGetTexEnvxvOES(GLenum target, GLenum pname, GLfixed* params) { fp_glGetTexEnvxvOES(target, pname, params); } -inline void glGetTexParameterxvOES(GLenum target, GLenum pname, GLfixed* params) { fp_glGetTexParameterxvOES(target, pname, params); } -inline void glLightModelxOES(GLenum pname, GLfixed param) { fp_glLightModelxOES(pname, param); } -inline void glLightModelxvOES(GLenum pname, const GLfixed* param) { fp_glLightModelxvOES(pname, param); } -inline void glLightxOES(GLenum light, GLenum pname, GLfixed param) { fp_glLightxOES(light, pname, param); } -inline void glLightxvOES(GLenum light, GLenum pname, const GLfixed* params) { fp_glLightxvOES(light, pname, params); } -inline void glLineWidthxOES(GLfixed width) { fp_glLineWidthxOES(width); } -inline void glLoadMatrixxOES(const GLfixed* m) { fp_glLoadMatrixxOES(m); } -inline void glMaterialxOES(GLenum face, GLenum pname, GLfixed param) { fp_glMaterialxOES(face, pname, param); } -inline void glMaterialxvOES(GLenum face, GLenum pname, const GLfixed* param) { fp_glMaterialxvOES(face, pname, param); } -inline void glMultMatrixxOES(const GLfixed* m) { fp_glMultMatrixxOES(m); } -inline void glMultiTexCoord4xOES(GLenum texture, GLfixed s, GLfixed t, GLfixed r, GLfixed q) { fp_glMultiTexCoord4xOES(texture, s, t, r, q); } -inline void glNormal3xOES(GLfixed nx, GLfixed ny, GLfixed nz) { fp_glNormal3xOES(nx, ny, nz); } -inline void glOrthoxOES(GLfixed l, GLfixed r, GLfixed b, GLfixed t, GLfixed n, GLfixed f) { fp_glOrthoxOES(l, r, b, t, n, f); } -inline void glPointParameterxvOES(GLenum pname, const GLfixed* params) { fp_glPointParameterxvOES(pname, params); } -inline void glPointSizexOES(GLfixed size) { fp_glPointSizexOES(size); } -inline void glPolygonOffsetxOES(GLfixed factor, GLfixed units) { fp_glPolygonOffsetxOES(factor, units); } -inline void glRotatexOES(GLfixed angle, GLfixed x, GLfixed y, GLfixed z) { fp_glRotatexOES(angle, x, y, z); } -inline void glSampleCoverageOES(GLfixed value, GLboolean invert) { fp_glSampleCoverageOES(value, invert); } -inline void glScalexOES(GLfixed x, GLfixed y, GLfixed z) { fp_glScalexOES(x, y, z); } -inline void glTexEnvxOES(GLenum target, GLenum pname, GLfixed param) { fp_glTexEnvxOES(target, pname, param); } -inline void glTexEnvxvOES(GLenum target, GLenum pname, const GLfixed* params) { fp_glTexEnvxvOES(target, pname, params); } -inline void glTexParameterxOES(GLenum target, GLenum pname, GLfixed param) { fp_glTexParameterxOES(target, pname, param); } -inline void glTexParameterxvOES(GLenum target, GLenum pname, const GLfixed* params) { fp_glTexParameterxvOES(target, pname, params); } -inline void glTranslatexOES(GLfixed x, GLfixed y, GLfixed z) { fp_glTranslatexOES(x, y, z); } -inline void glGetLightxvOES(GLenum light, GLenum pname, GLfixed* params) { fp_glGetLightxvOES(light, pname, params); } -inline void glGetMaterialxvOES(GLenum face, GLenum pname, GLfixed* params) { fp_glGetMaterialxvOES(face, pname, params); } -inline void glPointParameterxOES(GLenum pname, GLfixed param) { fp_glPointParameterxOES(pname, param); } -inline void glSampleCoveragexOES(GLclampx value, GLboolean invert) { fp_glSampleCoveragexOES(value, invert); } -inline void glAccumxOES(GLenum op, GLfixed value) { fp_glAccumxOES(op, value); } -inline void glBitmapxOES(GLsizei width, GLsizei height, GLfixed xorig, GLfixed yorig, GLfixed xmove, GLfixed ymove, const GLubyte* bitmap) { fp_glBitmapxOES(width, height, xorig, yorig, xmove, ymove, bitmap); } -inline void glBlendColorxOES(GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha) { fp_glBlendColorxOES(red, green, blue, alpha); } -inline void glClearAccumxOES(GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha) { fp_glClearAccumxOES(red, green, blue, alpha); } -inline void glColor3xOES(GLfixed red, GLfixed green, GLfixed blue) { fp_glColor3xOES(red, green, blue); } -inline void glColor3xvOES(const GLfixed* components) { fp_glColor3xvOES(components); } -inline void glColor4xvOES(const GLfixed* components) { fp_glColor4xvOES(components); } -inline void glConvolutionParameterxOES(GLenum target, GLenum pname, GLfixed param) { fp_glConvolutionParameterxOES(target, pname, param); } -inline void glConvolutionParameterxvOES(GLenum target, GLenum pname, const GLfixed* params) { fp_glConvolutionParameterxvOES(target, pname, params); } -inline void glEvalCoord1xOES(GLfixed u) { fp_glEvalCoord1xOES(u); } -inline void glEvalCoord1xvOES(const GLfixed* coords) { fp_glEvalCoord1xvOES(coords); } -inline void glEvalCoord2xOES(GLfixed u, GLfixed v) { fp_glEvalCoord2xOES(u, v); } -inline void glEvalCoord2xvOES(const GLfixed* coords) { fp_glEvalCoord2xvOES(coords); } -inline void glFeedbackBufferxOES(GLsizei n, GLenum type, const GLfixed* buffer) { fp_glFeedbackBufferxOES(n, type, buffer); } -inline void glGetConvolutionParameterxvOES(GLenum target, GLenum pname, GLfixed* params) { fp_glGetConvolutionParameterxvOES(target, pname, params); } -inline void glGetHistogramParameterxvOES(GLenum target, GLenum pname, GLfixed* params) { fp_glGetHistogramParameterxvOES(target, pname, params); } -inline void glGetLightxOES(GLenum light, GLenum pname, GLfixed* params) { fp_glGetLightxOES(light, pname, params); } -inline void glGetMapxvOES(GLenum target, GLenum query, GLfixed* v) { fp_glGetMapxvOES(target, query, v); } -inline void glGetMaterialxOES(GLenum face, GLenum pname, GLfixed param) { fp_glGetMaterialxOES(face, pname, param); } -inline void glGetPixelMapxv(GLenum map, GLint size, GLfixed* values) { fp_glGetPixelMapxv(map, size, values); } -inline void glGetTexGenxvOES(GLenum coord, GLenum pname, GLfixed* params) { fp_glGetTexGenxvOES(coord, pname, params); } -inline void glGetTexLevelParameterxvOES(GLenum target, GLint level, GLenum pname, GLfixed* params) { fp_glGetTexLevelParameterxvOES(target, level, pname, params); } -inline void glIndexxOES(GLfixed component) { fp_glIndexxOES(component); } -inline void glIndexxvOES(const GLfixed* component) { fp_glIndexxvOES(component); } -inline void glLoadTransposeMatrixxOES(const GLfixed* m) { fp_glLoadTransposeMatrixxOES(m); } -inline void glMap1xOES(GLenum target, GLfixed u1, GLfixed u2, GLint stride, GLint order, GLfixed points) { fp_glMap1xOES(target, u1, u2, stride, order, points); } -inline void glMap2xOES(GLenum target, GLfixed u1, GLfixed u2, GLint ustride, GLint uorder, GLfixed v1, GLfixed v2, GLint vstride, GLint vorder, GLfixed points) { fp_glMap2xOES(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points); } -inline void glMapGrid1xOES(GLint n, GLfixed u1, GLfixed u2) { fp_glMapGrid1xOES(n, u1, u2); } -inline void glMapGrid2xOES(GLint n, GLfixed u1, GLfixed u2, GLfixed v1, GLfixed v2) { fp_glMapGrid2xOES(n, u1, u2, v1, v2); } -inline void glMultTransposeMatrixxOES(const GLfixed* m) { fp_glMultTransposeMatrixxOES(m); } -inline void glMultiTexCoord1xOES(GLenum texture, GLfixed s) { fp_glMultiTexCoord1xOES(texture, s); } -inline void glMultiTexCoord1xvOES(GLenum texture, const GLfixed* coords) { fp_glMultiTexCoord1xvOES(texture, coords); } -inline void glMultiTexCoord2xOES(GLenum texture, GLfixed s, GLfixed t) { fp_glMultiTexCoord2xOES(texture, s, t); } -inline void glMultiTexCoord2xvOES(GLenum texture, const GLfixed* coords) { fp_glMultiTexCoord2xvOES(texture, coords); } -inline void glMultiTexCoord3xOES(GLenum texture, GLfixed s, GLfixed t, GLfixed r) { fp_glMultiTexCoord3xOES(texture, s, t, r); } -inline void glMultiTexCoord3xvOES(GLenum texture, const GLfixed* coords) { fp_glMultiTexCoord3xvOES(texture, coords); } -inline void glMultiTexCoord4xvOES(GLenum texture, const GLfixed* coords) { fp_glMultiTexCoord4xvOES(texture, coords); } -inline void glNormal3xvOES(const GLfixed* coords) { fp_glNormal3xvOES(coords); } -inline void glPassThroughxOES(GLfixed token) { fp_glPassThroughxOES(token); } -inline void glPixelMapx(GLenum map, GLint size, const GLfixed* values) { fp_glPixelMapx(map, size, values); } -inline void glPixelStorex(GLenum pname, GLfixed param) { fp_glPixelStorex(pname, param); } -inline void glPixelTransferxOES(GLenum pname, GLfixed param) { fp_glPixelTransferxOES(pname, param); } -inline void glPixelZoomxOES(GLfixed xfactor, GLfixed yfactor) { fp_glPixelZoomxOES(xfactor, yfactor); } -inline void glPrioritizeTexturesxOES(GLsizei n, const GLuint* textures, const GLfixed* priorities) { fp_glPrioritizeTexturesxOES(n, textures, priorities); } -inline void glRasterPos2xOES(GLfixed x, GLfixed y) { fp_glRasterPos2xOES(x, y); } -inline void glRasterPos2xvOES(const GLfixed* coords) { fp_glRasterPos2xvOES(coords); } -inline void glRasterPos3xOES(GLfixed x, GLfixed y, GLfixed z) { fp_glRasterPos3xOES(x, y, z); } -inline void glRasterPos3xvOES(const GLfixed* coords) { fp_glRasterPos3xvOES(coords); } -inline void glRasterPos4xOES(GLfixed x, GLfixed y, GLfixed z, GLfixed w) { fp_glRasterPos4xOES(x, y, z, w); } -inline void glRasterPos4xvOES(const GLfixed* coords) { fp_glRasterPos4xvOES(coords); } -inline void glRectxOES(GLfixed x1, GLfixed y1, GLfixed x2, GLfixed y2) { fp_glRectxOES(x1, y1, x2, y2); } -inline void glRectxvOES(const GLfixed* v1, const GLfixed* v2) { fp_glRectxvOES(v1, v2); } -inline void glTexCoord1xOES(GLfixed s) { fp_glTexCoord1xOES(s); } -inline void glTexCoord1xvOES(const GLfixed* coords) { fp_glTexCoord1xvOES(coords); } -inline void glTexCoord2xOES(GLfixed s, GLfixed t) { fp_glTexCoord2xOES(s, t); } -inline void glTexCoord2xvOES(const GLfixed* coords) { fp_glTexCoord2xvOES(coords); } -inline void glTexCoord3xOES(GLfixed s, GLfixed t, GLfixed r) { fp_glTexCoord3xOES(s, t, r); } -inline void glTexCoord3xvOES(const GLfixed* coords) { fp_glTexCoord3xvOES(coords); } -inline void glTexCoord4xOES(GLfixed s, GLfixed t, GLfixed r, GLfixed q) { fp_glTexCoord4xOES(s, t, r, q); } -inline void glTexCoord4xvOES(const GLfixed* coords) { fp_glTexCoord4xvOES(coords); } -inline void glTexGenxOES(GLenum coord, GLenum pname, GLfixed param) { fp_glTexGenxOES(coord, pname, param); } -inline void glTexGenxvOES(GLenum coord, GLenum pname, const GLfixed* params) { fp_glTexGenxvOES(coord, pname, params); } -inline void glVertex2xOES(GLfixed x) { fp_glVertex2xOES(x); } -inline void glVertex2xvOES(const GLfixed* coords) { fp_glVertex2xvOES(coords); } -inline void glVertex3xOES(GLfixed x, GLfixed y) { fp_glVertex3xOES(x, y); } -inline void glVertex3xvOES(const GLfixed* coords) { fp_glVertex3xvOES(coords); } -inline void glVertex4xOES(GLfixed x, GLfixed y, GLfixed z) { fp_glVertex4xOES(x, y, z); } -inline void glVertex4xvOES(const GLfixed* coords) { fp_glVertex4xvOES(coords); } +/* GL_OES_geometry_shader */ +inline void glFramebufferTextureOES(GLenum target, GLenum attachment, GLuint texture, GLint level) { fp_glFramebufferTextureOES(target, attachment, texture, level); } /* GL_OES_get_program_binary */ inline void glGetProgramBinaryOES(GLuint program, GLsizei bufSize, GLsizei* length, GLenum* binaryFormat, void* binary) { fp_glGetProgramBinaryOES(program, bufSize, length, binaryFormat, binary); } @@ -2099,16 +1752,14 @@ inline void* glMapBufferOES(GLenum target, GLenum access) { return fp_glMapBuffe inline GLboolean glUnmapBufferOES(GLenum target) { return fp_glUnmapBufferOES(target); } inline void glGetBufferPointervOES(GLenum target, GLenum pname, void** params) { fp_glGetBufferPointervOES(target, pname, params); } -/* GL_OES_query_matrix */ -inline GLbitfield glQueryMatrixxOES(GLfixed* mantissa, GLint* exponent) { return fp_glQueryMatrixxOES(mantissa, exponent); } +/* GL_OES_primitive_bounding_box */ +inline void glPrimitiveBoundingBoxOES(GLfloat minX, GLfloat minY, GLfloat minZ, GLfloat minW, GLfloat maxX, GLfloat maxY, GLfloat maxZ, GLfloat maxW) { fp_glPrimitiveBoundingBoxOES(minX, minY, minZ, minW, maxX, maxY, maxZ, maxW); } -/* GL_OES_single_precision */ -inline void glClearDepthfOES(GLclampf depth) { fp_glClearDepthfOES(depth); } -inline void glClipPlanefOES(GLenum plane, const GLfloat* equation) { fp_glClipPlanefOES(plane, equation); } -inline void glDepthRangefOES(GLclampf n, GLclampf f) { fp_glDepthRangefOES(n, f); } -inline void glFrustumfOES(GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f) { fp_glFrustumfOES(l, r, b, t, n, f); } -inline void glGetClipPlanefOES(GLenum plane, GLfloat* equation) { fp_glGetClipPlanefOES(plane, equation); } -inline void glOrthofOES(GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f) { fp_glOrthofOES(l, r, b, t, n, f); } +/* GL_OES_sample_shading */ +inline void glMinSampleShadingOES(GLfloat value) { fp_glMinSampleShadingOES(value); } + +/* GL_OES_tessellation_shader */ +inline void glPatchParameteriOES(GLenum pname, GLint value) { fp_glPatchParameteriOES(pname, value); } /* GL_OES_texture_3D */ inline void glTexImage3DOES(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void* pixels) { fp_glTexImage3DOES(target, level, internalformat, width, height, depth, border, format, type, pixels); } @@ -2118,6 +1769,26 @@ inline void glCompressedTexImage3DOES(GLenum target, GLint level, GLenum interna inline void glCompressedTexSubImage3DOES(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void* data) { fp_glCompressedTexSubImage3DOES(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data); } inline void glFramebufferTexture3DOES(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset) { fp_glFramebufferTexture3DOES(target, attachment, textarget, texture, level, zoffset); } +/* GL_OES_texture_border_clamp */ +inline void glTexParameterIivOES(GLenum target, GLenum pname, const GLint* params) { fp_glTexParameterIivOES(target, pname, params); } +inline void glTexParameterIuivOES(GLenum target, GLenum pname, const GLuint* params) { fp_glTexParameterIuivOES(target, pname, params); } +inline void glGetTexParameterIivOES(GLenum target, GLenum pname, GLint* params) { fp_glGetTexParameterIivOES(target, pname, params); } +inline void glGetTexParameterIuivOES(GLenum target, GLenum pname, GLuint* params) { fp_glGetTexParameterIuivOES(target, pname, params); } +inline void glSamplerParameterIivOES(GLuint sampler, GLenum pname, const GLint* param) { fp_glSamplerParameterIivOES(sampler, pname, param); } +inline void glSamplerParameterIuivOES(GLuint sampler, GLenum pname, const GLuint* param) { fp_glSamplerParameterIuivOES(sampler, pname, param); } +inline void glGetSamplerParameterIivOES(GLuint sampler, GLenum pname, GLint* params) { fp_glGetSamplerParameterIivOES(sampler, pname, params); } +inline void glGetSamplerParameterIuivOES(GLuint sampler, GLenum pname, GLuint* params) { fp_glGetSamplerParameterIuivOES(sampler, pname, params); } + +/* GL_OES_texture_buffer */ +inline void glTexBufferOES(GLenum target, GLenum internalformat, GLuint buffer) { fp_glTexBufferOES(target, internalformat, buffer); } +inline void glTexBufferRangeOES(GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size) { fp_glTexBufferRangeOES(target, internalformat, buffer, offset, size); } + +/* GL_OES_texture_storage_multisample_2d_array */ +inline void glTexStorage3DMultisampleOES(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations) { fp_glTexStorage3DMultisampleOES(target, samples, internalformat, width, height, depth, fixedsamplelocations); } + +/* GL_OES_texture_view */ +inline void glTextureViewOES(GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers) { fp_glTextureViewOES(texture, target, origtexture, internalformat, minlevel, numlevels, minlayer, numlayers); } + /* GL_OES_vertex_array_object */ inline void glBindVertexArrayOES(GLuint array) { fp_glBindVertexArrayOES(array); } inline void glDeleteVertexArraysOES(GLsizei n, const GLuint* arrays) { fp_glDeleteVertexArraysOES(n, arrays); } @@ -2136,6 +1807,42 @@ inline void glBlendFuncSeparateIndexedAMD(GLuint buf, GLenum srcRGB, GLenum dstR inline void glBlendEquationIndexedAMD(GLuint buf, GLenum mode) { fp_glBlendEquationIndexedAMD(buf, mode); } inline void glBlendEquationSeparateIndexedAMD(GLuint buf, GLenum modeRGB, GLenum modeAlpha) { fp_glBlendEquationSeparateIndexedAMD(buf, modeRGB, modeAlpha); } +/* GL_AMD_gpu_shader_int64 */ +inline void glUniform1i64NV(GLint location, GLint64EXT x) { fp_glUniform1i64NV(location, x); } +inline void glUniform2i64NV(GLint location, GLint64EXT x, GLint64EXT y) { fp_glUniform2i64NV(location, x, y); } +inline void glUniform3i64NV(GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z) { fp_glUniform3i64NV(location, x, y, z); } +inline void glUniform4i64NV(GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w) { fp_glUniform4i64NV(location, x, y, z, w); } +inline void glUniform1i64vNV(GLint location, GLsizei count, const GLint64EXT* value) { fp_glUniform1i64vNV(location, count, value); } +inline void glUniform2i64vNV(GLint location, GLsizei count, const GLint64EXT* value) { fp_glUniform2i64vNV(location, count, value); } +inline void glUniform3i64vNV(GLint location, GLsizei count, const GLint64EXT* value) { fp_glUniform3i64vNV(location, count, value); } +inline void glUniform4i64vNV(GLint location, GLsizei count, const GLint64EXT* value) { fp_glUniform4i64vNV(location, count, value); } +inline void glUniform1ui64NV(GLint location, GLuint64EXT x) { fp_glUniform1ui64NV(location, x); } +inline void glUniform2ui64NV(GLint location, GLuint64EXT x, GLuint64EXT y) { fp_glUniform2ui64NV(location, x, y); } +inline void glUniform3ui64NV(GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z) { fp_glUniform3ui64NV(location, x, y, z); } +inline void glUniform4ui64NV(GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w) { fp_glUniform4ui64NV(location, x, y, z, w); } +inline void glUniform1ui64vNV(GLint location, GLsizei count, const GLuint64EXT* value) { fp_glUniform1ui64vNV(location, count, value); } +inline void glUniform2ui64vNV(GLint location, GLsizei count, const GLuint64EXT* value) { fp_glUniform2ui64vNV(location, count, value); } +inline void glUniform3ui64vNV(GLint location, GLsizei count, const GLuint64EXT* value) { fp_glUniform3ui64vNV(location, count, value); } +inline void glUniform4ui64vNV(GLint location, GLsizei count, const GLuint64EXT* value) { fp_glUniform4ui64vNV(location, count, value); } +inline void glGetUniformi64vNV(GLuint program, GLint location, GLint64EXT* params) { fp_glGetUniformi64vNV(program, location, params); } +inline void glGetUniformui64vNV(GLuint program, GLint location, GLuint64EXT* params) { fp_glGetUniformui64vNV(program, location, params); } +inline void glProgramUniform1i64NV(GLuint program, GLint location, GLint64EXT x) { fp_glProgramUniform1i64NV(program, location, x); } +inline void glProgramUniform2i64NV(GLuint program, GLint location, GLint64EXT x, GLint64EXT y) { fp_glProgramUniform2i64NV(program, location, x, y); } +inline void glProgramUniform3i64NV(GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z) { fp_glProgramUniform3i64NV(program, location, x, y, z); } +inline void glProgramUniform4i64NV(GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w) { fp_glProgramUniform4i64NV(program, location, x, y, z, w); } +inline void glProgramUniform1i64vNV(GLuint program, GLint location, GLsizei count, const GLint64EXT* value) { fp_glProgramUniform1i64vNV(program, location, count, value); } +inline void glProgramUniform2i64vNV(GLuint program, GLint location, GLsizei count, const GLint64EXT* value) { fp_glProgramUniform2i64vNV(program, location, count, value); } +inline void glProgramUniform3i64vNV(GLuint program, GLint location, GLsizei count, const GLint64EXT* value) { fp_glProgramUniform3i64vNV(program, location, count, value); } +inline void glProgramUniform4i64vNV(GLuint program, GLint location, GLsizei count, const GLint64EXT* value) { fp_glProgramUniform4i64vNV(program, location, count, value); } +inline void glProgramUniform1ui64NV(GLuint program, GLint location, GLuint64EXT x) { fp_glProgramUniform1ui64NV(program, location, x); } +inline void glProgramUniform2ui64NV(GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y) { fp_glProgramUniform2ui64NV(program, location, x, y); } +inline void glProgramUniform3ui64NV(GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z) { fp_glProgramUniform3ui64NV(program, location, x, y, z); } +inline void glProgramUniform4ui64NV(GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w) { fp_glProgramUniform4ui64NV(program, location, x, y, z, w); } +inline void glProgramUniform1ui64vNV(GLuint program, GLint location, GLsizei count, const GLuint64EXT* value) { fp_glProgramUniform1ui64vNV(program, location, count, value); } +inline void glProgramUniform2ui64vNV(GLuint program, GLint location, GLsizei count, const GLuint64EXT* value) { fp_glProgramUniform2ui64vNV(program, location, count, value); } +inline void glProgramUniform3ui64vNV(GLuint program, GLint location, GLsizei count, const GLuint64EXT* value) { fp_glProgramUniform3ui64vNV(program, location, count, value); } +inline void glProgramUniform4ui64vNV(GLuint program, GLint location, GLsizei count, const GLuint64EXT* value) { fp_glProgramUniform4ui64vNV(program, location, count, value); } + /* GL_AMD_interleaved_elements */ inline void glVertexAttribParameteriAMD(GLuint index, GLenum pname, GLint param) { fp_glVertexAttribParameteriAMD(index, pname, param); } @@ -2148,6 +1855,9 @@ inline void glGenNamesAMD(GLenum identifier, GLuint num, GLuint* names) { fp_glG inline void glDeleteNamesAMD(GLenum identifier, GLuint num, const GLuint* names) { fp_glDeleteNamesAMD(identifier, num, names); } inline GLboolean glIsNameAMD(GLenum identifier, GLuint name) { return fp_glIsNameAMD(identifier, name); } +/* GL_AMD_occlusion_query_event */ +inline void glQueryObjectParameteruiAMD(GLenum target, GLuint id, GLenum pname, GLuint param) { fp_glQueryObjectParameteruiAMD(target, id, pname, param); } + /* GL_AMD_performance_monitor */ inline void glGetPerfMonitorGroupsAMD(GLint* numGroups, GLsizei groupsSize, GLuint* groups) { fp_glGetPerfMonitorGroupsAMD(numGroups, groupsSize, groups); } inline void glGetPerfMonitorCountersAMD(GLuint group, GLint* numCounters, GLint* maxActiveCounters, GLsizei counterSize, GLuint* counters) { fp_glGetPerfMonitorCountersAMD(group, numCounters, maxActiveCounters, counterSize, counters); } @@ -2255,114 +1965,6 @@ inline void glMapVertexAttrib1fAPPLE(GLuint index, GLuint size, GLfloat u1, GLfl inline void glMapVertexAttrib2dAPPLE(GLuint index, GLuint size, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble* points) { fp_glMapVertexAttrib2dAPPLE(index, size, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points); } inline void glMapVertexAttrib2fAPPLE(GLuint index, GLuint size, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat* points) { fp_glMapVertexAttrib2fAPPLE(index, size, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points); } -/* GL_ATI_draw_buffers */ -inline void glDrawBuffersATI(GLsizei n, const GLenum* bufs) { fp_glDrawBuffersATI(n, bufs); } - -/* GL_ATI_element_array */ -inline void glElementPointerATI(GLenum type, const void* pointer) { fp_glElementPointerATI(type, pointer); } -inline void glDrawElementArrayATI(GLenum mode, GLsizei count) { fp_glDrawElementArrayATI(mode, count); } -inline void glDrawRangeElementArrayATI(GLenum mode, GLuint start, GLuint end, GLsizei count) { fp_glDrawRangeElementArrayATI(mode, start, end, count); } - -/* GL_ATI_envmap_bumpmap */ -inline void glTexBumpParameterivATI(GLenum pname, const GLint* param) { fp_glTexBumpParameterivATI(pname, param); } -inline void glTexBumpParameterfvATI(GLenum pname, const GLfloat* param) { fp_glTexBumpParameterfvATI(pname, param); } -inline void glGetTexBumpParameterivATI(GLenum pname, GLint* param) { fp_glGetTexBumpParameterivATI(pname, param); } -inline void glGetTexBumpParameterfvATI(GLenum pname, GLfloat* param) { fp_glGetTexBumpParameterfvATI(pname, param); } - -/* GL_ATI_fragment_shader */ -inline GLuint glGenFragmentShadersATI(GLuint range) { return fp_glGenFragmentShadersATI(range); } -inline void glBindFragmentShaderATI(GLuint id) { fp_glBindFragmentShaderATI(id); } -inline void glDeleteFragmentShaderATI(GLuint id) { fp_glDeleteFragmentShaderATI(id); } -inline void glBeginFragmentShaderATI() { fp_glBeginFragmentShaderATI(); } -inline void glEndFragmentShaderATI() { fp_glEndFragmentShaderATI(); } -inline void glPassTexCoordATI(GLuint dst, GLuint coord, GLenum swizzle) { fp_glPassTexCoordATI(dst, coord, swizzle); } -inline void glSampleMapATI(GLuint dst, GLuint interp, GLenum swizzle) { fp_glSampleMapATI(dst, interp, swizzle); } -inline void glColorFragmentOp1ATI(GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod) { fp_glColorFragmentOp1ATI(op, dst, dstMask, dstMod, arg1, arg1Rep, arg1Mod); } -inline void glColorFragmentOp2ATI(GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod) { fp_glColorFragmentOp2ATI(op, dst, dstMask, dstMod, arg1, arg1Rep, arg1Mod, arg2, arg2Rep, arg2Mod); } -inline void glColorFragmentOp3ATI(GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod) { fp_glColorFragmentOp3ATI(op, dst, dstMask, dstMod, arg1, arg1Rep, arg1Mod, arg2, arg2Rep, arg2Mod, arg3, arg3Rep, arg3Mod); } -inline void glAlphaFragmentOp1ATI(GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod) { fp_glAlphaFragmentOp1ATI(op, dst, dstMod, arg1, arg1Rep, arg1Mod); } -inline void glAlphaFragmentOp2ATI(GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod) { fp_glAlphaFragmentOp2ATI(op, dst, dstMod, arg1, arg1Rep, arg1Mod, arg2, arg2Rep, arg2Mod); } -inline void glAlphaFragmentOp3ATI(GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod) { fp_glAlphaFragmentOp3ATI(op, dst, dstMod, arg1, arg1Rep, arg1Mod, arg2, arg2Rep, arg2Mod, arg3, arg3Rep, arg3Mod); } -inline void glSetFragmentShaderConstantATI(GLuint dst, const GLfloat* value) { fp_glSetFragmentShaderConstantATI(dst, value); } - -/* GL_ATI_map_object_buffer */ -inline void* glMapObjectBufferATI(GLuint buffer) { return fp_glMapObjectBufferATI(buffer); } -inline void glUnmapObjectBufferATI(GLuint buffer) { fp_glUnmapObjectBufferATI(buffer); } - -/* GL_ATI_pn_triangles */ -inline void glPNTrianglesiATI(GLenum pname, GLint param) { fp_glPNTrianglesiATI(pname, param); } -inline void glPNTrianglesfATI(GLenum pname, GLfloat param) { fp_glPNTrianglesfATI(pname, param); } - -/* GL_ATI_separate_stencil */ -inline void glStencilOpSeparateATI(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass) { fp_glStencilOpSeparateATI(face, sfail, dpfail, dppass); } -inline void glStencilFuncSeparateATI(GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask) { fp_glStencilFuncSeparateATI(frontfunc, backfunc, ref, mask); } - -/* GL_ATI_vertex_array_object */ -inline GLuint glNewObjectBufferATI(GLsizei size, const void* pointer, GLenum usage) { return fp_glNewObjectBufferATI(size, pointer, usage); } -inline GLboolean glIsObjectBufferATI(GLuint buffer) { return fp_glIsObjectBufferATI(buffer); } -inline void glUpdateObjectBufferATI(GLuint buffer, GLuint offset, GLsizei size, const void* pointer, GLenum preserve) { fp_glUpdateObjectBufferATI(buffer, offset, size, pointer, preserve); } -inline void glGetObjectBufferfvATI(GLuint buffer, GLenum pname, GLfloat* params) { fp_glGetObjectBufferfvATI(buffer, pname, params); } -inline void glGetObjectBufferivATI(GLuint buffer, GLenum pname, GLint* params) { fp_glGetObjectBufferivATI(buffer, pname, params); } -inline void glFreeObjectBufferATI(GLuint buffer) { fp_glFreeObjectBufferATI(buffer); } -inline void glArrayObjectATI(GLenum array, GLint size, GLenum type, GLsizei stride, GLuint buffer, GLuint offset) { fp_glArrayObjectATI(array, size, type, stride, buffer, offset); } -inline void glGetArrayObjectfvATI(GLenum array, GLenum pname, GLfloat* params) { fp_glGetArrayObjectfvATI(array, pname, params); } -inline void glGetArrayObjectivATI(GLenum array, GLenum pname, GLint* params) { fp_glGetArrayObjectivATI(array, pname, params); } -inline void glVariantArrayObjectATI(GLuint id, GLenum type, GLsizei stride, GLuint buffer, GLuint offset) { fp_glVariantArrayObjectATI(id, type, stride, buffer, offset); } -inline void glGetVariantArrayObjectfvATI(GLuint id, GLenum pname, GLfloat* params) { fp_glGetVariantArrayObjectfvATI(id, pname, params); } -inline void glGetVariantArrayObjectivATI(GLuint id, GLenum pname, GLint* params) { fp_glGetVariantArrayObjectivATI(id, pname, params); } - -/* GL_ATI_vertex_attrib_array_object */ -inline void glVertexAttribArrayObjectATI(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLuint buffer, GLuint offset) { fp_glVertexAttribArrayObjectATI(index, size, type, normalized, stride, buffer, offset); } -inline void glGetVertexAttribArrayObjectfvATI(GLuint index, GLenum pname, GLfloat* params) { fp_glGetVertexAttribArrayObjectfvATI(index, pname, params); } -inline void glGetVertexAttribArrayObjectivATI(GLuint index, GLenum pname, GLint* params) { fp_glGetVertexAttribArrayObjectivATI(index, pname, params); } - -/* GL_ATI_vertex_streams */ -inline void glVertexStream1sATI(GLenum stream, GLshort x) { fp_glVertexStream1sATI(stream, x); } -inline void glVertexStream1svATI(GLenum stream, const GLshort* coords) { fp_glVertexStream1svATI(stream, coords); } -inline void glVertexStream1iATI(GLenum stream, GLint x) { fp_glVertexStream1iATI(stream, x); } -inline void glVertexStream1ivATI(GLenum stream, const GLint* coords) { fp_glVertexStream1ivATI(stream, coords); } -inline void glVertexStream1fATI(GLenum stream, GLfloat x) { fp_glVertexStream1fATI(stream, x); } -inline void glVertexStream1fvATI(GLenum stream, const GLfloat* coords) { fp_glVertexStream1fvATI(stream, coords); } -inline void glVertexStream1dATI(GLenum stream, GLdouble x) { fp_glVertexStream1dATI(stream, x); } -inline void glVertexStream1dvATI(GLenum stream, const GLdouble* coords) { fp_glVertexStream1dvATI(stream, coords); } -inline void glVertexStream2sATI(GLenum stream, GLshort x, GLshort y) { fp_glVertexStream2sATI(stream, x, y); } -inline void glVertexStream2svATI(GLenum stream, const GLshort* coords) { fp_glVertexStream2svATI(stream, coords); } -inline void glVertexStream2iATI(GLenum stream, GLint x, GLint y) { fp_glVertexStream2iATI(stream, x, y); } -inline void glVertexStream2ivATI(GLenum stream, const GLint* coords) { fp_glVertexStream2ivATI(stream, coords); } -inline void glVertexStream2fATI(GLenum stream, GLfloat x, GLfloat y) { fp_glVertexStream2fATI(stream, x, y); } -inline void glVertexStream2fvATI(GLenum stream, const GLfloat* coords) { fp_glVertexStream2fvATI(stream, coords); } -inline void glVertexStream2dATI(GLenum stream, GLdouble x, GLdouble y) { fp_glVertexStream2dATI(stream, x, y); } -inline void glVertexStream2dvATI(GLenum stream, const GLdouble* coords) { fp_glVertexStream2dvATI(stream, coords); } -inline void glVertexStream3sATI(GLenum stream, GLshort x, GLshort y, GLshort z) { fp_glVertexStream3sATI(stream, x, y, z); } -inline void glVertexStream3svATI(GLenum stream, const GLshort* coords) { fp_glVertexStream3svATI(stream, coords); } -inline void glVertexStream3iATI(GLenum stream, GLint x, GLint y, GLint z) { fp_glVertexStream3iATI(stream, x, y, z); } -inline void glVertexStream3ivATI(GLenum stream, const GLint* coords) { fp_glVertexStream3ivATI(stream, coords); } -inline void glVertexStream3fATI(GLenum stream, GLfloat x, GLfloat y, GLfloat z) { fp_glVertexStream3fATI(stream, x, y, z); } -inline void glVertexStream3fvATI(GLenum stream, const GLfloat* coords) { fp_glVertexStream3fvATI(stream, coords); } -inline void glVertexStream3dATI(GLenum stream, GLdouble x, GLdouble y, GLdouble z) { fp_glVertexStream3dATI(stream, x, y, z); } -inline void glVertexStream3dvATI(GLenum stream, const GLdouble* coords) { fp_glVertexStream3dvATI(stream, coords); } -inline void glVertexStream4sATI(GLenum stream, GLshort x, GLshort y, GLshort z, GLshort w) { fp_glVertexStream4sATI(stream, x, y, z, w); } -inline void glVertexStream4svATI(GLenum stream, const GLshort* coords) { fp_glVertexStream4svATI(stream, coords); } -inline void glVertexStream4iATI(GLenum stream, GLint x, GLint y, GLint z, GLint w) { fp_glVertexStream4iATI(stream, x, y, z, w); } -inline void glVertexStream4ivATI(GLenum stream, const GLint* coords) { fp_glVertexStream4ivATI(stream, coords); } -inline void glVertexStream4fATI(GLenum stream, GLfloat x, GLfloat y, GLfloat z, GLfloat w) { fp_glVertexStream4fATI(stream, x, y, z, w); } -inline void glVertexStream4fvATI(GLenum stream, const GLfloat* coords) { fp_glVertexStream4fvATI(stream, coords); } -inline void glVertexStream4dATI(GLenum stream, GLdouble x, GLdouble y, GLdouble z, GLdouble w) { fp_glVertexStream4dATI(stream, x, y, z, w); } -inline void glVertexStream4dvATI(GLenum stream, const GLdouble* coords) { fp_glVertexStream4dvATI(stream, coords); } -inline void glNormalStream3bATI(GLenum stream, GLbyte nx, GLbyte ny, GLbyte nz) { fp_glNormalStream3bATI(stream, nx, ny, nz); } -inline void glNormalStream3bvATI(GLenum stream, const GLbyte* coords) { fp_glNormalStream3bvATI(stream, coords); } -inline void glNormalStream3sATI(GLenum stream, GLshort nx, GLshort ny, GLshort nz) { fp_glNormalStream3sATI(stream, nx, ny, nz); } -inline void glNormalStream3svATI(GLenum stream, const GLshort* coords) { fp_glNormalStream3svATI(stream, coords); } -inline void glNormalStream3iATI(GLenum stream, GLint nx, GLint ny, GLint nz) { fp_glNormalStream3iATI(stream, nx, ny, nz); } -inline void glNormalStream3ivATI(GLenum stream, const GLint* coords) { fp_glNormalStream3ivATI(stream, coords); } -inline void glNormalStream3fATI(GLenum stream, GLfloat nx, GLfloat ny, GLfloat nz) { fp_glNormalStream3fATI(stream, nx, ny, nz); } -inline void glNormalStream3fvATI(GLenum stream, const GLfloat* coords) { fp_glNormalStream3fvATI(stream, coords); } -inline void glNormalStream3dATI(GLenum stream, GLdouble nx, GLdouble ny, GLdouble nz) { fp_glNormalStream3dATI(stream, nx, ny, nz); } -inline void glNormalStream3dvATI(GLenum stream, const GLdouble* coords) { fp_glNormalStream3dvATI(stream, coords); } -inline void glClientActiveVertexStreamATI(GLenum stream) { fp_glClientActiveVertexStreamATI(stream); } -inline void glVertexBlendEnviATI(GLenum pname, GLint param) { fp_glVertexBlendEnviATI(pname, param); } -inline void glVertexBlendEnvfATI(GLenum pname, GLfloat param) { fp_glVertexBlendEnvfATI(pname, param); } - /* GL_GREMEDY_frame_terminator */ inline void glFrameTerminatorGREMEDY() { fp_glFrameTerminatorGREMEDY(); } @@ -2381,45 +1983,26 @@ inline void glSyncTextureINTEL(GLuint texture) { fp_glSyncTextureINTEL(texture); inline void glUnmapTexture2DINTEL(GLuint texture, GLint level) { fp_glUnmapTexture2DINTEL(texture, level); } inline void* glMapTexture2DINTEL(GLuint texture, GLint level, GLbitfield access, GLint* stride, GLenum* layout) { return fp_glMapTexture2DINTEL(texture, level, access, stride, layout); } -/* GL_INTEL_parallel_arrays */ -inline void glVertexPointervINTEL(GLint size, GLenum type, const void** pointer) { fp_glVertexPointervINTEL(size, type, pointer); } -inline void glNormalPointervINTEL(GLenum type, const void** pointer) { fp_glNormalPointervINTEL(type, pointer); } -inline void glColorPointervINTEL(GLint size, GLenum type, const void** pointer) { fp_glColorPointervINTEL(size, type, pointer); } -inline void glTexCoordPointervINTEL(GLint size, GLenum type, const void** pointer) { fp_glTexCoordPointervINTEL(size, type, pointer); } - -/* GL_MESA_resize_buffers */ -inline void glResizeBuffersMESA() { fp_glResizeBuffersMESA(); } - -/* GL_MESA_window_pos */ -inline void glWindowPos2dMESA(GLdouble x, GLdouble y) { fp_glWindowPos2dMESA(x, y); } -inline void glWindowPos2dvMESA(const GLdouble* v) { fp_glWindowPos2dvMESA(v); } -inline void glWindowPos2fMESA(GLfloat x, GLfloat y) { fp_glWindowPos2fMESA(x, y); } -inline void glWindowPos2fvMESA(const GLfloat* v) { fp_glWindowPos2fvMESA(v); } -inline void glWindowPos2iMESA(GLint x, GLint y) { fp_glWindowPos2iMESA(x, y); } -inline void glWindowPos2ivMESA(const GLint* v) { fp_glWindowPos2ivMESA(v); } -inline void glWindowPos2sMESA(GLshort x, GLshort y) { fp_glWindowPos2sMESA(x, y); } -inline void glWindowPos2svMESA(const GLshort* v) { fp_glWindowPos2svMESA(v); } -inline void glWindowPos3dMESA(GLdouble x, GLdouble y, GLdouble z) { fp_glWindowPos3dMESA(x, y, z); } -inline void glWindowPos3dvMESA(const GLdouble* v) { fp_glWindowPos3dvMESA(v); } -inline void glWindowPos3fMESA(GLfloat x, GLfloat y, GLfloat z) { fp_glWindowPos3fMESA(x, y, z); } -inline void glWindowPos3fvMESA(const GLfloat* v) { fp_glWindowPos3fvMESA(v); } -inline void glWindowPos3iMESA(GLint x, GLint y, GLint z) { fp_glWindowPos3iMESA(x, y, z); } -inline void glWindowPos3ivMESA(const GLint* v) { fp_glWindowPos3ivMESA(v); } -inline void glWindowPos3sMESA(GLshort x, GLshort y, GLshort z) { fp_glWindowPos3sMESA(x, y, z); } -inline void glWindowPos3svMESA(const GLshort* v) { fp_glWindowPos3svMESA(v); } -inline void glWindowPos4dMESA(GLdouble x, GLdouble y, GLdouble z, GLdouble w) { fp_glWindowPos4dMESA(x, y, z, w); } -inline void glWindowPos4dvMESA(const GLdouble* v) { fp_glWindowPos4dvMESA(v); } -inline void glWindowPos4fMESA(GLfloat x, GLfloat y, GLfloat z, GLfloat w) { fp_glWindowPos4fMESA(x, y, z, w); } -inline void glWindowPos4fvMESA(const GLfloat* v) { fp_glWindowPos4fvMESA(v); } -inline void glWindowPos4iMESA(GLint x, GLint y, GLint z, GLint w) { fp_glWindowPos4iMESA(x, y, z, w); } -inline void glWindowPos4ivMESA(const GLint* v) { fp_glWindowPos4ivMESA(v); } -inline void glWindowPos4sMESA(GLshort x, GLshort y, GLshort z, GLshort w) { fp_glWindowPos4sMESA(x, y, z, w); } -inline void glWindowPos4svMESA(const GLshort* v) { fp_glWindowPos4svMESA(v); } +/* GL_INTEL_performance_query */ +inline void glBeginPerfQueryINTEL(GLuint queryHandle) { fp_glBeginPerfQueryINTEL(queryHandle); } +inline void glCreatePerfQueryINTEL(GLuint queryId, GLuint* queryHandle) { fp_glCreatePerfQueryINTEL(queryId, queryHandle); } +inline void glDeletePerfQueryINTEL(GLuint queryHandle) { fp_glDeletePerfQueryINTEL(queryHandle); } +inline void glEndPerfQueryINTEL(GLuint queryHandle) { fp_glEndPerfQueryINTEL(queryHandle); } +inline void glGetFirstPerfQueryIdINTEL(GLuint* queryId) { fp_glGetFirstPerfQueryIdINTEL(queryId); } +inline void glGetNextPerfQueryIdINTEL(GLuint queryId, GLuint* nextQueryId) { fp_glGetNextPerfQueryIdINTEL(queryId, nextQueryId); } +inline void glGetPerfCounterInfoINTEL(GLuint queryId, GLuint counterId, GLuint counterNameLength, GLchar* counterName, GLuint counterDescLength, GLchar* counterDesc, GLuint* counterOffset, GLuint* counterDataSize, GLuint* counterTypeEnum, GLuint* counterDataTypeEnum, GLuint64* rawCounterMaxValue) { fp_glGetPerfCounterInfoINTEL(queryId, counterId, counterNameLength, counterName, counterDescLength, counterDesc, counterOffset, counterDataSize, counterTypeEnum, counterDataTypeEnum, rawCounterMaxValue); } +inline void glGetPerfQueryDataINTEL(GLuint queryHandle, GLuint flags, GLsizei dataSize, GLvoid* data, GLuint* bytesWritten) { fp_glGetPerfQueryDataINTEL(queryHandle, flags, dataSize, data, bytesWritten); } +inline void glGetPerfQueryIdByNameINTEL(GLchar* queryName, GLuint* queryId) { fp_glGetPerfQueryIdByNameINTEL(queryName, queryId); } +inline void glGetPerfQueryInfoINTEL(GLuint queryId, GLuint queryNameLength, GLchar* queryName, GLuint* dataSize, GLuint* noCounters, GLuint* noInstances, GLuint* capsMask) { fp_glGetPerfQueryInfoINTEL(queryId, queryNameLength, queryName, dataSize, noCounters, noInstances, capsMask); } /* GL_NV_bindless_multi_draw_indirect */ inline void glMultiDrawArraysIndirectBindlessNV(GLenum mode, const void* indirect, GLsizei drawCount, GLsizei stride, GLint vertexBufferCount) { fp_glMultiDrawArraysIndirectBindlessNV(mode, indirect, drawCount, stride, vertexBufferCount); } inline void glMultiDrawElementsIndirectBindlessNV(GLenum mode, GLenum type, const void* indirect, GLsizei drawCount, GLsizei stride, GLint vertexBufferCount) { fp_glMultiDrawElementsIndirectBindlessNV(mode, type, indirect, drawCount, stride, vertexBufferCount); } +/* GL_NV_bindless_multi_draw_indirect_count */ +inline void glMultiDrawArraysIndirectBindlessCountNV(GLenum mode, const void* indirect, GLsizei drawCount, GLsizei maxDrawCount, GLsizei stride, GLint vertexBufferCount) { fp_glMultiDrawArraysIndirectBindlessCountNV(mode, indirect, drawCount, maxDrawCount, stride, vertexBufferCount); } +inline void glMultiDrawElementsIndirectBindlessCountNV(GLenum mode, GLenum type, const void* indirect, GLsizei drawCount, GLsizei maxDrawCount, GLsizei stride, GLint vertexBufferCount) { fp_glMultiDrawElementsIndirectBindlessCountNV(mode, type, indirect, drawCount, maxDrawCount, stride, vertexBufferCount); } + /* GL_NV_bindless_texture */ inline GLuint64 glGetTextureHandleNV(GLuint texture) { return fp_glGetTextureHandleNV(texture); } inline GLuint64 glGetTextureSamplerHandleNV(GLuint texture, GLuint sampler) { return fp_glGetTextureSamplerHandleNV(texture, sampler); } @@ -2443,6 +2026,9 @@ inline void glBlendBarrierNV() { fp_glBlendBarrierNV(); } inline void glBeginConditionalRenderNV(GLuint id, GLenum mode) { fp_glBeginConditionalRenderNV(id, mode); } inline void glEndConditionalRenderNV() { fp_glEndConditionalRenderNV(); } +/* GL_NV_conservative_raster */ +inline void glSubpixelPrecisionBiasNV(GLuint xbits, GLuint ybits) { fp_glSubpixelPrecisionBiasNV(xbits, ybits); } + /* GL_NV_copy_buffer */ inline void glCopyBufferSubDataNV(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size) { fp_glCopyBufferSubDataNV(readTarget, writeTarget, readOffset, writeOffset, size); } @@ -2468,17 +2054,6 @@ inline void glDrawElementsInstancedNV(GLenum mode, GLsizei count, GLenum type, c /* GL_NV_draw_texture */ inline void glDrawTextureNV(GLuint texture, GLuint sampler, GLfloat x0, GLfloat y0, GLfloat x1, GLfloat y1, GLfloat z, GLfloat s0, GLfloat t0, GLfloat s1, GLfloat t1) { fp_glDrawTextureNV(texture, sampler, x0, y0, x1, y1, z, s0, t0, s1, t1); } -/* GL_NV_evaluators */ -inline void glMapControlPointsNV(GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLint uorder, GLint vorder, GLboolean packed, const void* points) { fp_glMapControlPointsNV(target, index, type, ustride, vstride, uorder, vorder, packed, points); } -inline void glMapParameterivNV(GLenum target, GLenum pname, const GLint* params) { fp_glMapParameterivNV(target, pname, params); } -inline void glMapParameterfvNV(GLenum target, GLenum pname, const GLfloat* params) { fp_glMapParameterfvNV(target, pname, params); } -inline void glGetMapControlPointsNV(GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLboolean packed, void* points) { fp_glGetMapControlPointsNV(target, index, type, ustride, vstride, packed, points); } -inline void glGetMapParameterivNV(GLenum target, GLenum pname, GLint* params) { fp_glGetMapParameterivNV(target, pname, params); } -inline void glGetMapParameterfvNV(GLenum target, GLenum pname, GLfloat* params) { fp_glGetMapParameterfvNV(target, pname, params); } -inline void glGetMapAttribParameterivNV(GLenum target, GLuint index, GLenum pname, GLint* params) { fp_glGetMapAttribParameterivNV(target, index, pname, params); } -inline void glGetMapAttribParameterfvNV(GLenum target, GLuint index, GLenum pname, GLfloat* params) { fp_glGetMapAttribParameterfvNV(target, index, pname, params); } -inline void glEvalMapsNV(GLenum target, GLenum mode) { fp_glEvalMapsNV(target, mode); } - /* GL_NV_explicit_multisample */ inline void glGetMultisamplefvNV(GLenum pname, GLuint index, GLfloat* val) { fp_glGetMultisamplefvNV(pname, index, val); } inline void glSampleMaskIndexedNV(GLuint index, GLbitfield mask) { fp_glSampleMaskIndexedNV(index, mask); } @@ -2493,17 +2068,17 @@ inline void glGetFenceivNV(GLuint fence, GLenum pname, GLint* params) { fp_glGet inline void glFinishFenceNV(GLuint fence) { fp_glFinishFenceNV(fence); } inline void glSetFenceNV(GLuint fence, GLenum condition) { fp_glSetFenceNV(fence, condition); } -/* GL_NV_fragment_program */ -inline void glProgramNamedParameter4fNV(GLuint id, GLsizei len, const GLubyte* name, GLfloat x, GLfloat y, GLfloat z, GLfloat w) { fp_glProgramNamedParameter4fNV(id, len, name, x, y, z, w); } -inline void glProgramNamedParameter4fvNV(GLuint id, GLsizei len, const GLubyte* name, const GLfloat* v) { fp_glProgramNamedParameter4fvNV(id, len, name, v); } -inline void glProgramNamedParameter4dNV(GLuint id, GLsizei len, const GLubyte* name, GLdouble x, GLdouble y, GLdouble z, GLdouble w) { fp_glProgramNamedParameter4dNV(id, len, name, x, y, z, w); } -inline void glProgramNamedParameter4dvNV(GLuint id, GLsizei len, const GLubyte* name, const GLdouble* v) { fp_glProgramNamedParameter4dvNV(id, len, name, v); } -inline void glGetProgramNamedParameterfvNV(GLuint id, GLsizei len, const GLubyte* name, GLfloat* params) { fp_glGetProgramNamedParameterfvNV(id, len, name, params); } -inline void glGetProgramNamedParameterdvNV(GLuint id, GLsizei len, const GLubyte* name, GLdouble* params) { fp_glGetProgramNamedParameterdvNV(id, len, name, params); } +/* GL_NV_fragment_coverage_to_color */ +inline void glFragmentCoverageColorNV(GLuint color) { fp_glFragmentCoverageColorNV(color); } /* GL_NV_framebuffer_blit */ inline void glBlitFramebufferNV(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter) { fp_glBlitFramebufferNV(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter); } +/* GL_NV_framebuffer_mixed_samples */ +inline void glCoverageModulationTableNV(GLsizei n, const GLfloat* v) { fp_glCoverageModulationTableNV(n, v); } +inline void glGetCoverageModulationTableNV(GLsizei bufsize, GLfloat* v) { fp_glGetCoverageModulationTableNV(bufsize, v); } +inline void glCoverageModulationNV(GLenum components) { fp_glCoverageModulationNV(components); } + /* GL_NV_framebuffer_multisample */ inline void glRenderbufferStorageMultisampleNV(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height) { fp_glRenderbufferStorageMultisampleNV(target, samples, internalformat, width, height); } @@ -2512,8 +2087,6 @@ inline void glRenderbufferStorageMultisampleCoverageNV(GLenum target, GLsizei co /* GL_NV_geometry_program4 */ inline void glProgramVertexLimitNV(GLenum target, GLint limit) { fp_glProgramVertexLimitNV(target, limit); } -inline void glFramebufferTextureEXT(GLenum target, GLenum attachment, GLuint texture, GLint level) { fp_glFramebufferTextureEXT(target, attachment, texture, level); } -inline void glFramebufferTextureLayerEXT(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer) { fp_glFramebufferTextureLayerEXT(target, attachment, texture, level, layer); } inline void glFramebufferTextureFaceEXT(GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face) { fp_glFramebufferTextureFaceEXT(target, attachment, texture, level, face); } /* GL_NV_gpu_program4 */ @@ -2538,41 +2111,6 @@ inline void glGetProgramEnvParameterIuivNV(GLenum target, GLuint index, GLuint* inline void glProgramSubroutineParametersuivNV(GLenum target, GLsizei count, const GLuint* params) { fp_glProgramSubroutineParametersuivNV(target, count, params); } inline void glGetProgramSubroutineParameteruivNV(GLenum target, GLuint index, GLuint* param) { fp_glGetProgramSubroutineParameteruivNV(target, index, param); } -/* GL_NV_gpu_shader5 */ -inline void glUniform1i64NV(GLint location, GLint64EXT x) { fp_glUniform1i64NV(location, x); } -inline void glUniform2i64NV(GLint location, GLint64EXT x, GLint64EXT y) { fp_glUniform2i64NV(location, x, y); } -inline void glUniform3i64NV(GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z) { fp_glUniform3i64NV(location, x, y, z); } -inline void glUniform4i64NV(GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w) { fp_glUniform4i64NV(location, x, y, z, w); } -inline void glUniform1i64vNV(GLint location, GLsizei count, const GLint64EXT* value) { fp_glUniform1i64vNV(location, count, value); } -inline void glUniform2i64vNV(GLint location, GLsizei count, const GLint64EXT* value) { fp_glUniform2i64vNV(location, count, value); } -inline void glUniform3i64vNV(GLint location, GLsizei count, const GLint64EXT* value) { fp_glUniform3i64vNV(location, count, value); } -inline void glUniform4i64vNV(GLint location, GLsizei count, const GLint64EXT* value) { fp_glUniform4i64vNV(location, count, value); } -inline void glUniform1ui64NV(GLint location, GLuint64EXT x) { fp_glUniform1ui64NV(location, x); } -inline void glUniform2ui64NV(GLint location, GLuint64EXT x, GLuint64EXT y) { fp_glUniform2ui64NV(location, x, y); } -inline void glUniform3ui64NV(GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z) { fp_glUniform3ui64NV(location, x, y, z); } -inline void glUniform4ui64NV(GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w) { fp_glUniform4ui64NV(location, x, y, z, w); } -inline void glUniform1ui64vNV(GLint location, GLsizei count, const GLuint64EXT* value) { fp_glUniform1ui64vNV(location, count, value); } -inline void glUniform2ui64vNV(GLint location, GLsizei count, const GLuint64EXT* value) { fp_glUniform2ui64vNV(location, count, value); } -inline void glUniform3ui64vNV(GLint location, GLsizei count, const GLuint64EXT* value) { fp_glUniform3ui64vNV(location, count, value); } -inline void glUniform4ui64vNV(GLint location, GLsizei count, const GLuint64EXT* value) { fp_glUniform4ui64vNV(location, count, value); } -inline void glGetUniformi64vNV(GLuint program, GLint location, GLint64EXT* params) { fp_glGetUniformi64vNV(program, location, params); } -inline void glProgramUniform1i64NV(GLuint program, GLint location, GLint64EXT x) { fp_glProgramUniform1i64NV(program, location, x); } -inline void glProgramUniform2i64NV(GLuint program, GLint location, GLint64EXT x, GLint64EXT y) { fp_glProgramUniform2i64NV(program, location, x, y); } -inline void glProgramUniform3i64NV(GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z) { fp_glProgramUniform3i64NV(program, location, x, y, z); } -inline void glProgramUniform4i64NV(GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w) { fp_glProgramUniform4i64NV(program, location, x, y, z, w); } -inline void glProgramUniform1i64vNV(GLuint program, GLint location, GLsizei count, const GLint64EXT* value) { fp_glProgramUniform1i64vNV(program, location, count, value); } -inline void glProgramUniform2i64vNV(GLuint program, GLint location, GLsizei count, const GLint64EXT* value) { fp_glProgramUniform2i64vNV(program, location, count, value); } -inline void glProgramUniform3i64vNV(GLuint program, GLint location, GLsizei count, const GLint64EXT* value) { fp_glProgramUniform3i64vNV(program, location, count, value); } -inline void glProgramUniform4i64vNV(GLuint program, GLint location, GLsizei count, const GLint64EXT* value) { fp_glProgramUniform4i64vNV(program, location, count, value); } -inline void glProgramUniform1ui64NV(GLuint program, GLint location, GLuint64EXT x) { fp_glProgramUniform1ui64NV(program, location, x); } -inline void glProgramUniform2ui64NV(GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y) { fp_glProgramUniform2ui64NV(program, location, x, y); } -inline void glProgramUniform3ui64NV(GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z) { fp_glProgramUniform3ui64NV(program, location, x, y, z); } -inline void glProgramUniform4ui64NV(GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w) { fp_glProgramUniform4ui64NV(program, location, x, y, z, w); } -inline void glProgramUniform1ui64vNV(GLuint program, GLint location, GLsizei count, const GLuint64EXT* value) { fp_glProgramUniform1ui64vNV(program, location, count, value); } -inline void glProgramUniform2ui64vNV(GLuint program, GLint location, GLsizei count, const GLuint64EXT* value) { fp_glProgramUniform2ui64vNV(program, location, count, value); } -inline void glProgramUniform3ui64vNV(GLuint program, GLint location, GLsizei count, const GLuint64EXT* value) { fp_glProgramUniform3ui64vNV(program, location, count, value); } -inline void glProgramUniform4ui64vNV(GLuint program, GLint location, GLsizei count, const GLuint64EXT* value) { fp_glProgramUniform4ui64vNV(program, location, count, value); } - /* GL_NV_half_float */ inline void glVertex2hNV(GLhalfNV x, GLhalfNV y) { fp_glVertex2hNV(x, y); } inline void glVertex2hvNV(const GLhalfNV* v) { fp_glVertex2hvNV(v); } @@ -2624,6 +2162,9 @@ inline void glVertexAttribs4hvNV(GLuint index, GLsizei n, const GLhalfNV* v) { f /* GL_NV_instanced_arrays */ inline void glVertexAttribDivisorNV(GLuint index, GLuint divisor) { fp_glVertexAttribDivisorNV(index, divisor); } +/* GL_NV_internalformat_sample_query */ +inline void glGetInternalformatSampleivNV(GLenum target, GLenum internalformat, GLsizei samples, GLenum pname, GLsizei bufSize, GLint* params) { fp_glGetInternalformatSampleivNV(target, internalformat, samples, pname, bufSize, params); } + /* GL_NV_non_square_matrices */ inline void glUniformMatrix2x3fvNV(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) { fp_glUniformMatrix2x3fvNV(location, count, transpose, value); } inline void glUniformMatrix3x2fvNV(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) { fp_glUniformMatrix3x2fvNV(location, count, transpose, value); } @@ -2673,9 +2214,6 @@ inline void glStencilStrokePathNV(GLuint path, GLint reference, GLuint mask) { f inline void glStencilFillPathInstancedNV(GLsizei numPaths, GLenum pathNameType, const void* paths, GLuint pathBase, GLenum fillMode, GLuint mask, GLenum transformType, const GLfloat* transformValues) { fp_glStencilFillPathInstancedNV(numPaths, pathNameType, paths, pathBase, fillMode, mask, transformType, transformValues); } inline void glStencilStrokePathInstancedNV(GLsizei numPaths, GLenum pathNameType, const void* paths, GLuint pathBase, GLint reference, GLuint mask, GLenum transformType, const GLfloat* transformValues) { fp_glStencilStrokePathInstancedNV(numPaths, pathNameType, paths, pathBase, reference, mask, transformType, transformValues); } inline void glPathCoverDepthFuncNV(GLenum func) { fp_glPathCoverDepthFuncNV(func); } -inline void glPathColorGenNV(GLenum color, GLenum genMode, GLenum colorFormat, const GLfloat* coeffs) { fp_glPathColorGenNV(color, genMode, colorFormat, coeffs); } -inline void glPathTexGenNV(GLenum texCoordSet, GLenum genMode, GLint components, const GLfloat* coeffs) { fp_glPathTexGenNV(texCoordSet, genMode, components, coeffs); } -inline void glPathFogGenNV(GLenum genMode) { fp_glPathFogGenNV(genMode); } inline void glCoverFillPathNV(GLuint path, GLenum coverMode) { fp_glCoverFillPathNV(path, coverMode); } inline void glCoverStrokePathNV(GLuint path, GLenum coverMode) { fp_glCoverStrokePathNV(path, coverMode); } inline void glCoverFillPathInstancedNV(GLsizei numPaths, GLenum pathNameType, const void* paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat* transformValues) { fp_glCoverFillPathInstancedNV(numPaths, pathNameType, paths, pathBase, coverMode, transformType, transformValues); } @@ -2688,22 +2226,32 @@ inline void glGetPathDashArrayNV(GLuint path, GLfloat* dashArray) { fp_glGetPath inline void glGetPathMetricsNV(GLbitfield metricQueryMask, GLsizei numPaths, GLenum pathNameType, const void* paths, GLuint pathBase, GLsizei stride, GLfloat* metrics) { fp_glGetPathMetricsNV(metricQueryMask, numPaths, pathNameType, paths, pathBase, stride, metrics); } inline void glGetPathMetricRangeNV(GLbitfield metricQueryMask, GLuint firstPathName, GLsizei numPaths, GLsizei stride, GLfloat* metrics) { fp_glGetPathMetricRangeNV(metricQueryMask, firstPathName, numPaths, stride, metrics); } inline void glGetPathSpacingNV(GLenum pathListMode, GLsizei numPaths, GLenum pathNameType, const void* paths, GLuint pathBase, GLfloat advanceScale, GLfloat kerningScale, GLenum transformType, GLfloat* returnedSpacing) { fp_glGetPathSpacingNV(pathListMode, numPaths, pathNameType, paths, pathBase, advanceScale, kerningScale, transformType, returnedSpacing); } -inline void glGetPathColorGenivNV(GLenum color, GLenum pname, GLint* value) { fp_glGetPathColorGenivNV(color, pname, value); } -inline void glGetPathColorGenfvNV(GLenum color, GLenum pname, GLfloat* value) { fp_glGetPathColorGenfvNV(color, pname, value); } -inline void glGetPathTexGenivNV(GLenum texCoordSet, GLenum pname, GLint* value) { fp_glGetPathTexGenivNV(texCoordSet, pname, value); } -inline void glGetPathTexGenfvNV(GLenum texCoordSet, GLenum pname, GLfloat* value) { fp_glGetPathTexGenfvNV(texCoordSet, pname, value); } inline GLboolean glIsPointInFillPathNV(GLuint path, GLuint mask, GLfloat x, GLfloat y) { return fp_glIsPointInFillPathNV(path, mask, x, y); } inline GLboolean glIsPointInStrokePathNV(GLuint path, GLfloat x, GLfloat y) { return fp_glIsPointInStrokePathNV(path, x, y); } inline GLfloat glGetPathLengthNV(GLuint path, GLsizei startSegment, GLsizei numSegments) { return fp_glGetPathLengthNV(path, startSegment, numSegments); } inline GLboolean glPointAlongPathNV(GLuint path, GLsizei startSegment, GLsizei numSegments, GLfloat distance, GLfloat* x, GLfloat* y, GLfloat* tangentX, GLfloat* tangentY) { return fp_glPointAlongPathNV(path, startSegment, numSegments, distance, x, y, tangentX, tangentY); } - -/* GL_NV_pixel_data_range */ -inline void glPixelDataRangeNV(GLenum target, GLsizei length, const void* pointer) { fp_glPixelDataRangeNV(target, length, pointer); } -inline void glFlushPixelDataRangeNV(GLenum target) { fp_glFlushPixelDataRangeNV(target); } - -/* GL_NV_point_sprite */ -inline void glPointParameteriNV(GLenum pname, GLint param) { fp_glPointParameteriNV(pname, param); } -inline void glPointParameterivNV(GLenum pname, const GLint* params) { fp_glPointParameterivNV(pname, params); } +inline void glMatrixLoad3x2fNV(GLenum matrixMode, const GLfloat* m) { fp_glMatrixLoad3x2fNV(matrixMode, m); } +inline void glMatrixLoad3x3fNV(GLenum matrixMode, const GLfloat* m) { fp_glMatrixLoad3x3fNV(matrixMode, m); } +inline void glMatrixLoadTranspose3x3fNV(GLenum matrixMode, const GLfloat* m) { fp_glMatrixLoadTranspose3x3fNV(matrixMode, m); } +inline void glMatrixMult3x2fNV(GLenum matrixMode, const GLfloat* m) { fp_glMatrixMult3x2fNV(matrixMode, m); } +inline void glMatrixMult3x3fNV(GLenum matrixMode, const GLfloat* m) { fp_glMatrixMult3x3fNV(matrixMode, m); } +inline void glMatrixMultTranspose3x3fNV(GLenum matrixMode, const GLfloat* m) { fp_glMatrixMultTranspose3x3fNV(matrixMode, m); } +inline void glStencilThenCoverFillPathNV(GLuint path, GLenum fillMode, GLuint mask, GLenum coverMode) { fp_glStencilThenCoverFillPathNV(path, fillMode, mask, coverMode); } +inline void glStencilThenCoverStrokePathNV(GLuint path, GLint reference, GLuint mask, GLenum coverMode) { fp_glStencilThenCoverStrokePathNV(path, reference, mask, coverMode); } +inline void glStencilThenCoverFillPathInstancedNV(GLsizei numPaths, GLenum pathNameType, const void* paths, GLuint pathBase, GLenum fillMode, GLuint mask, GLenum coverMode, GLenum transformType, const GLfloat* transformValues) { fp_glStencilThenCoverFillPathInstancedNV(numPaths, pathNameType, paths, pathBase, fillMode, mask, coverMode, transformType, transformValues); } +inline void glStencilThenCoverStrokePathInstancedNV(GLsizei numPaths, GLenum pathNameType, const void* paths, GLuint pathBase, GLint reference, GLuint mask, GLenum coverMode, GLenum transformType, const GLfloat* transformValues) { fp_glStencilThenCoverStrokePathInstancedNV(numPaths, pathNameType, paths, pathBase, reference, mask, coverMode, transformType, transformValues); } +inline GLenum glPathGlyphIndexRangeNV(GLenum fontTarget, const void* fontName, GLbitfield fontStyle, GLuint pathParameterTemplate, GLfloat emScale, GLuint baseAndCount) { return fp_glPathGlyphIndexRangeNV(fontTarget, fontName, fontStyle, pathParameterTemplate, emScale, baseAndCount); } +inline GLenum glPathGlyphIndexArrayNV(GLuint firstPathName, GLenum fontTarget, const void* fontName, GLbitfield fontStyle, GLuint firstGlyphIndex, GLsizei numGlyphs, GLuint pathParameterTemplate, GLfloat emScale) { return fp_glPathGlyphIndexArrayNV(firstPathName, fontTarget, fontName, fontStyle, firstGlyphIndex, numGlyphs, pathParameterTemplate, emScale); } +inline GLenum glPathMemoryGlyphIndexArrayNV(GLuint firstPathName, GLenum fontTarget, GLsizeiptr fontSize, const void* fontData, GLsizei faceIndex, GLuint firstGlyphIndex, GLsizei numGlyphs, GLuint pathParameterTemplate, GLfloat emScale) { return fp_glPathMemoryGlyphIndexArrayNV(firstPathName, fontTarget, fontSize, fontData, faceIndex, firstGlyphIndex, numGlyphs, pathParameterTemplate, emScale); } +inline void glProgramPathFragmentInputGenNV(GLuint program, GLint location, GLenum genMode, GLint components, const GLfloat* coeffs) { fp_glProgramPathFragmentInputGenNV(program, location, genMode, components, coeffs); } +inline void glGetProgramResourcefvNV(GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum* props, GLsizei bufSize, GLsizei* length, GLfloat* params) { fp_glGetProgramResourcefvNV(program, programInterface, index, propCount, props, bufSize, length, params); } +inline void glPathColorGenNV(GLenum color, GLenum genMode, GLenum colorFormat, const GLfloat* coeffs) { fp_glPathColorGenNV(color, genMode, colorFormat, coeffs); } +inline void glPathTexGenNV(GLenum texCoordSet, GLenum genMode, GLint components, const GLfloat* coeffs) { fp_glPathTexGenNV(texCoordSet, genMode, components, coeffs); } +inline void glPathFogGenNV(GLenum genMode) { fp_glPathFogGenNV(genMode); } +inline void glGetPathColorGenivNV(GLenum color, GLenum pname, GLint* value) { fp_glGetPathColorGenivNV(color, pname, value); } +inline void glGetPathColorGenfvNV(GLenum color, GLenum pname, GLfloat* value) { fp_glGetPathColorGenfvNV(color, pname, value); } +inline void glGetPathTexGenivNV(GLenum texCoordSet, GLenum pname, GLint* value) { fp_glGetPathTexGenivNV(texCoordSet, pname, value); } +inline void glGetPathTexGenfvNV(GLenum texCoordSet, GLenum pname, GLfloat* value) { fp_glGetPathTexGenfvNV(texCoordSet, pname, value); } /* GL_NV_present_video */ inline void glPresentFrameKeyedNV(GLuint video_slot, GLuint64EXT minPresentTime, GLuint beginPresentTimeId, GLuint presentDurationId, GLenum type, GLenum target0, GLuint fill0, GLuint key0, GLenum target1, GLuint fill1, GLuint key1) { fp_glPresentFrameKeyedNV(video_slot, minPresentTime, beginPresentTimeId, presentDurationId, type, target0, fill0, key0, target1, fill1, key1); } @@ -2720,24 +2268,10 @@ inline void glPrimitiveRestartIndexNV(GLuint index) { fp_glPrimitiveRestartIndex /* GL_NV_read_buffer */ inline void glReadBufferNV(GLenum mode) { fp_glReadBufferNV(mode); } -/* GL_NV_register_combiners */ -inline void glCombinerParameterfvNV(GLenum pname, const GLfloat* params) { fp_glCombinerParameterfvNV(pname, params); } -inline void glCombinerParameterfNV(GLenum pname, GLfloat param) { fp_glCombinerParameterfNV(pname, param); } -inline void glCombinerParameterivNV(GLenum pname, const GLint* params) { fp_glCombinerParameterivNV(pname, params); } -inline void glCombinerParameteriNV(GLenum pname, GLint param) { fp_glCombinerParameteriNV(pname, param); } -inline void glCombinerInputNV(GLenum stage, GLenum portion, GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage) { fp_glCombinerInputNV(stage, portion, variable, input, mapping, componentUsage); } -inline void glCombinerOutputNV(GLenum stage, GLenum portion, GLenum abOutput, GLenum cdOutput, GLenum sumOutput, GLenum scale, GLenum bias, GLboolean abDotProduct, GLboolean cdDotProduct, GLboolean muxSum) { fp_glCombinerOutputNV(stage, portion, abOutput, cdOutput, sumOutput, scale, bias, abDotProduct, cdDotProduct, muxSum); } -inline void glFinalCombinerInputNV(GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage) { fp_glFinalCombinerInputNV(variable, input, mapping, componentUsage); } -inline void glGetCombinerInputParameterfvNV(GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLfloat* params) { fp_glGetCombinerInputParameterfvNV(stage, portion, variable, pname, params); } -inline void glGetCombinerInputParameterivNV(GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLint* params) { fp_glGetCombinerInputParameterivNV(stage, portion, variable, pname, params); } -inline void glGetCombinerOutputParameterfvNV(GLenum stage, GLenum portion, GLenum pname, GLfloat* params) { fp_glGetCombinerOutputParameterfvNV(stage, portion, pname, params); } -inline void glGetCombinerOutputParameterivNV(GLenum stage, GLenum portion, GLenum pname, GLint* params) { fp_glGetCombinerOutputParameterivNV(stage, portion, pname, params); } -inline void glGetFinalCombinerInputParameterfvNV(GLenum variable, GLenum pname, GLfloat* params) { fp_glGetFinalCombinerInputParameterfvNV(variable, pname, params); } -inline void glGetFinalCombinerInputParameterivNV(GLenum variable, GLenum pname, GLint* params) { fp_glGetFinalCombinerInputParameterivNV(variable, pname, params); } - -/* GL_NV_register_combiners2 */ -inline void glCombinerStageParameterfvNV(GLenum stage, GLenum pname, const GLfloat* params) { fp_glCombinerStageParameterfvNV(stage, pname, params); } -inline void glGetCombinerStageParameterfvNV(GLenum stage, GLenum pname, GLfloat* params) { fp_glGetCombinerStageParameterfvNV(stage, pname, params); } +/* GL_NV_sample_locations */ +inline void glFramebufferSampleLocationsfvNV(GLenum target, GLuint start, GLsizei count, const GLfloat* v) { fp_glFramebufferSampleLocationsfvNV(target, start, count, v); } +inline void glNamedFramebufferSampleLocationsfvNV(GLuint framebuffer, GLuint start, GLsizei count, const GLfloat* v) { fp_glNamedFramebufferSampleLocationsfvNV(framebuffer, start, count, v); } +inline void glResolveDepthValuesNV() { fp_glResolveDepthValuesNV(); } /* GL_NV_shader_buffer_load */ inline void glMakeBufferResidentNV(GLenum target, GLenum access) { fp_glMakeBufferResidentNV(target, access); } @@ -2751,7 +2285,6 @@ inline void glGetNamedBufferParameterui64vNV(GLuint buffer, GLenum pname, GLuint inline void glGetIntegerui64vNV(GLenum value, GLuint64EXT* result) { fp_glGetIntegerui64vNV(value, result); } inline void glUniformui64NV(GLint location, GLuint64EXT value) { fp_glUniformui64NV(location, value); } inline void glUniformui64vNV(GLint location, GLsizei count, const GLuint64EXT* value) { fp_glUniformui64vNV(location, count, value); } -inline void glGetUniformui64vNV(GLuint program, GLint location, GLuint64EXT* params) { fp_glGetUniformui64vNV(program, location, params); } inline void glProgramUniformui64NV(GLuint program, GLint location, GLuint64EXT value) { fp_glProgramUniformui64NV(program, location, value); } inline void glProgramUniformui64vNV(GLuint program, GLint location, GLsizei count, const GLuint64EXT* value) { fp_glProgramUniformui64vNV(program, location, count, value); } @@ -2769,7 +2302,7 @@ inline void glTextureImage3DMultisampleCoverageNV(GLuint texture, GLenum target, /* GL_NV_transform_feedback */ inline void glBeginTransformFeedbackNV(GLenum primitiveMode) { fp_glBeginTransformFeedbackNV(primitiveMode); } inline void glEndTransformFeedbackNV() { fp_glEndTransformFeedbackNV(); } -inline void glTransformFeedbackAttribsNV(GLuint count, const GLint* attribs, GLenum bufferMode) { fp_glTransformFeedbackAttribsNV(count, attribs, bufferMode); } +inline void glTransformFeedbackAttribsNV(GLsizei count, const GLint* attribs, GLenum bufferMode) { fp_glTransformFeedbackAttribsNV(count, attribs, bufferMode); } inline void glBindBufferRangeNV(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size) { fp_glBindBufferRangeNV(target, index, buffer, offset, size); } inline void glBindBufferOffsetNV(GLenum target, GLuint index, GLuint buffer, GLintptr offset) { fp_glBindBufferOffsetNV(target, index, buffer, offset); } inline void glBindBufferBaseNV(GLenum target, GLuint index, GLuint buffer) { fp_glBindBufferBaseNV(target, index, buffer); } @@ -2794,17 +2327,13 @@ inline void glVDPAUInitNV(const void* vdpDevice, const void* getProcAddress) { f inline void glVDPAUFiniNV() { fp_glVDPAUFiniNV(); } inline GLvdpauSurfaceNV glVDPAURegisterVideoSurfaceNV(const void* vdpSurface, GLenum target, GLsizei numTextureNames, const GLuint* textureNames) { return fp_glVDPAURegisterVideoSurfaceNV(vdpSurface, target, numTextureNames, textureNames); } inline GLvdpauSurfaceNV glVDPAURegisterOutputSurfaceNV(const void* vdpSurface, GLenum target, GLsizei numTextureNames, const GLuint* textureNames) { return fp_glVDPAURegisterOutputSurfaceNV(vdpSurface, target, numTextureNames, textureNames); } -inline void glVDPAUIsSurfaceNV(GLvdpauSurfaceNV surface) { fp_glVDPAUIsSurfaceNV(surface); } +inline GLboolean glVDPAUIsSurfaceNV(GLvdpauSurfaceNV surface) { return fp_glVDPAUIsSurfaceNV(surface); } inline void glVDPAUUnregisterSurfaceNV(GLvdpauSurfaceNV surface) { fp_glVDPAUUnregisterSurfaceNV(surface); } inline void glVDPAUGetSurfaceivNV(GLvdpauSurfaceNV surface, GLenum pname, GLsizei bufSize, GLsizei* length, GLint* values) { fp_glVDPAUGetSurfaceivNV(surface, pname, bufSize, length, values); } inline void glVDPAUSurfaceAccessNV(GLvdpauSurfaceNV surface, GLenum access) { fp_glVDPAUSurfaceAccessNV(surface, access); } inline void glVDPAUMapSurfacesNV(GLsizei numSurfaces, const GLvdpauSurfaceNV* surfaces) { fp_glVDPAUMapSurfacesNV(numSurfaces, surfaces); } inline void glVDPAUUnmapSurfacesNV(GLsizei numSurface, const GLvdpauSurfaceNV* surfaces) { fp_glVDPAUUnmapSurfacesNV(numSurface, surfaces); } -/* GL_NV_vertex_array_range */ -inline void glFlushVertexArrayRangeNV() { fp_glFlushVertexArrayRangeNV(); } -inline void glVertexArrayRangeNV(GLsizei length, const void* pointer) { fp_glVertexArrayRangeNV(length, pointer); } - /* GL_NV_vertex_attrib_integer_64bit */ inline void glVertexAttribL1i64NV(GLuint index, GLint64EXT x) { fp_glVertexAttribL1i64NV(index, x); } inline void glVertexAttribL2i64NV(GLuint index, GLint64EXT x, GLint64EXT y) { fp_glVertexAttribL2i64NV(index, x, y); } @@ -2840,72 +2369,6 @@ inline void glVertexAttribFormatNV(GLuint index, GLint size, GLenum type, GLbool inline void glVertexAttribIFormatNV(GLuint index, GLint size, GLenum type, GLsizei stride) { fp_glVertexAttribIFormatNV(index, size, type, stride); } inline void glGetIntegerui64i_vNV(GLenum value, GLuint index, GLuint64EXT* result) { fp_glGetIntegerui64i_vNV(value, index, result); } -/* GL_NV_vertex_program */ -inline GLboolean glAreProgramsResidentNV(GLsizei n, const GLuint* programs, GLboolean* residences) { return fp_glAreProgramsResidentNV(n, programs, residences); } -inline void glBindProgramNV(GLenum target, GLuint id) { fp_glBindProgramNV(target, id); } -inline void glDeleteProgramsNV(GLsizei n, const GLuint* programs) { fp_glDeleteProgramsNV(n, programs); } -inline void glExecuteProgramNV(GLenum target, GLuint id, const GLfloat* params) { fp_glExecuteProgramNV(target, id, params); } -inline void glGenProgramsNV(GLsizei n, GLuint* programs) { fp_glGenProgramsNV(n, programs); } -inline void glGetProgramParameterdvNV(GLenum target, GLuint index, GLenum pname, GLdouble* params) { fp_glGetProgramParameterdvNV(target, index, pname, params); } -inline void glGetProgramParameterfvNV(GLenum target, GLuint index, GLenum pname, GLfloat* params) { fp_glGetProgramParameterfvNV(target, index, pname, params); } -inline void glGetProgramivNV(GLuint id, GLenum pname, GLint* params) { fp_glGetProgramivNV(id, pname, params); } -inline void glGetProgramStringNV(GLuint id, GLenum pname, GLubyte* program) { fp_glGetProgramStringNV(id, pname, program); } -inline void glGetTrackMatrixivNV(GLenum target, GLuint address, GLenum pname, GLint* params) { fp_glGetTrackMatrixivNV(target, address, pname, params); } -inline void glGetVertexAttribdvNV(GLuint index, GLenum pname, GLdouble* params) { fp_glGetVertexAttribdvNV(index, pname, params); } -inline void glGetVertexAttribfvNV(GLuint index, GLenum pname, GLfloat* params) { fp_glGetVertexAttribfvNV(index, pname, params); } -inline void glGetVertexAttribivNV(GLuint index, GLenum pname, GLint* params) { fp_glGetVertexAttribivNV(index, pname, params); } -inline void glGetVertexAttribPointervNV(GLuint index, GLenum pname, void** pointer) { fp_glGetVertexAttribPointervNV(index, pname, pointer); } -inline GLboolean glIsProgramNV(GLuint id) { return fp_glIsProgramNV(id); } -inline void glLoadProgramNV(GLenum target, GLuint id, GLsizei len, const GLubyte* program) { fp_glLoadProgramNV(target, id, len, program); } -inline void glProgramParameter4dNV(GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w) { fp_glProgramParameter4dNV(target, index, x, y, z, w); } -inline void glProgramParameter4dvNV(GLenum target, GLuint index, const GLdouble* v) { fp_glProgramParameter4dvNV(target, index, v); } -inline void glProgramParameter4fNV(GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w) { fp_glProgramParameter4fNV(target, index, x, y, z, w); } -inline void glProgramParameter4fvNV(GLenum target, GLuint index, const GLfloat* v) { fp_glProgramParameter4fvNV(target, index, v); } -inline void glProgramParameters4dvNV(GLenum target, GLuint index, GLsizei count, const GLdouble* v) { fp_glProgramParameters4dvNV(target, index, count, v); } -inline void glProgramParameters4fvNV(GLenum target, GLuint index, GLsizei count, const GLfloat* v) { fp_glProgramParameters4fvNV(target, index, count, v); } -inline void glRequestResidentProgramsNV(GLsizei n, const GLuint* programs) { fp_glRequestResidentProgramsNV(n, programs); } -inline void glTrackMatrixNV(GLenum target, GLuint address, GLenum matrix, GLenum transform) { fp_glTrackMatrixNV(target, address, matrix, transform); } -inline void glVertexAttribPointerNV(GLuint index, GLint fsize, GLenum type, GLsizei stride, const void* pointer) { fp_glVertexAttribPointerNV(index, fsize, type, stride, pointer); } -inline void glVertexAttrib1dNV(GLuint index, GLdouble x) { fp_glVertexAttrib1dNV(index, x); } -inline void glVertexAttrib1dvNV(GLuint index, const GLdouble* v) { fp_glVertexAttrib1dvNV(index, v); } -inline void glVertexAttrib1fNV(GLuint index, GLfloat x) { fp_glVertexAttrib1fNV(index, x); } -inline void glVertexAttrib1fvNV(GLuint index, const GLfloat* v) { fp_glVertexAttrib1fvNV(index, v); } -inline void glVertexAttrib1sNV(GLuint index, GLshort x) { fp_glVertexAttrib1sNV(index, x); } -inline void glVertexAttrib1svNV(GLuint index, const GLshort* v) { fp_glVertexAttrib1svNV(index, v); } -inline void glVertexAttrib2dNV(GLuint index, GLdouble x, GLdouble y) { fp_glVertexAttrib2dNV(index, x, y); } -inline void glVertexAttrib2dvNV(GLuint index, const GLdouble* v) { fp_glVertexAttrib2dvNV(index, v); } -inline void glVertexAttrib2fNV(GLuint index, GLfloat x, GLfloat y) { fp_glVertexAttrib2fNV(index, x, y); } -inline void glVertexAttrib2fvNV(GLuint index, const GLfloat* v) { fp_glVertexAttrib2fvNV(index, v); } -inline void glVertexAttrib2sNV(GLuint index, GLshort x, GLshort y) { fp_glVertexAttrib2sNV(index, x, y); } -inline void glVertexAttrib2svNV(GLuint index, const GLshort* v) { fp_glVertexAttrib2svNV(index, v); } -inline void glVertexAttrib3dNV(GLuint index, GLdouble x, GLdouble y, GLdouble z) { fp_glVertexAttrib3dNV(index, x, y, z); } -inline void glVertexAttrib3dvNV(GLuint index, const GLdouble* v) { fp_glVertexAttrib3dvNV(index, v); } -inline void glVertexAttrib3fNV(GLuint index, GLfloat x, GLfloat y, GLfloat z) { fp_glVertexAttrib3fNV(index, x, y, z); } -inline void glVertexAttrib3fvNV(GLuint index, const GLfloat* v) { fp_glVertexAttrib3fvNV(index, v); } -inline void glVertexAttrib3sNV(GLuint index, GLshort x, GLshort y, GLshort z) { fp_glVertexAttrib3sNV(index, x, y, z); } -inline void glVertexAttrib3svNV(GLuint index, const GLshort* v) { fp_glVertexAttrib3svNV(index, v); } -inline void glVertexAttrib4dNV(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w) { fp_glVertexAttrib4dNV(index, x, y, z, w); } -inline void glVertexAttrib4dvNV(GLuint index, const GLdouble* v) { fp_glVertexAttrib4dvNV(index, v); } -inline void glVertexAttrib4fNV(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w) { fp_glVertexAttrib4fNV(index, x, y, z, w); } -inline void glVertexAttrib4fvNV(GLuint index, const GLfloat* v) { fp_glVertexAttrib4fvNV(index, v); } -inline void glVertexAttrib4sNV(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w) { fp_glVertexAttrib4sNV(index, x, y, z, w); } -inline void glVertexAttrib4svNV(GLuint index, const GLshort* v) { fp_glVertexAttrib4svNV(index, v); } -inline void glVertexAttrib4ubNV(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w) { fp_glVertexAttrib4ubNV(index, x, y, z, w); } -inline void glVertexAttrib4ubvNV(GLuint index, const GLubyte* v) { fp_glVertexAttrib4ubvNV(index, v); } -inline void glVertexAttribs1dvNV(GLuint index, GLsizei count, const GLdouble* v) { fp_glVertexAttribs1dvNV(index, count, v); } -inline void glVertexAttribs1fvNV(GLuint index, GLsizei count, const GLfloat* v) { fp_glVertexAttribs1fvNV(index, count, v); } -inline void glVertexAttribs1svNV(GLuint index, GLsizei count, const GLshort* v) { fp_glVertexAttribs1svNV(index, count, v); } -inline void glVertexAttribs2dvNV(GLuint index, GLsizei count, const GLdouble* v) { fp_glVertexAttribs2dvNV(index, count, v); } -inline void glVertexAttribs2fvNV(GLuint index, GLsizei count, const GLfloat* v) { fp_glVertexAttribs2fvNV(index, count, v); } -inline void glVertexAttribs2svNV(GLuint index, GLsizei count, const GLshort* v) { fp_glVertexAttribs2svNV(index, count, v); } -inline void glVertexAttribs3dvNV(GLuint index, GLsizei count, const GLdouble* v) { fp_glVertexAttribs3dvNV(index, count, v); } -inline void glVertexAttribs3fvNV(GLuint index, GLsizei count, const GLfloat* v) { fp_glVertexAttribs3fvNV(index, count, v); } -inline void glVertexAttribs3svNV(GLuint index, GLsizei count, const GLshort* v) { fp_glVertexAttribs3svNV(index, count, v); } -inline void glVertexAttribs4dvNV(GLuint index, GLsizei count, const GLdouble* v) { fp_glVertexAttribs4dvNV(index, count, v); } -inline void glVertexAttribs4fvNV(GLuint index, GLsizei count, const GLfloat* v) { fp_glVertexAttribs4fvNV(index, count, v); } -inline void glVertexAttribs4svNV(GLuint index, GLsizei count, const GLshort* v) { fp_glVertexAttribs4svNV(index, count, v); } -inline void glVertexAttribs4ubvNV(GLuint index, GLsizei count, const GLubyte* v) { fp_glVertexAttribs4ubvNV(index, count, v); } - /* GL_NV_vertex_program4 */ inline void glVertexAttribI1iEXT(GLuint index, GLint x) { fp_glVertexAttribI1iEXT(index, x); } inline void glVertexAttribI2iEXT(GLuint index, GLint x, GLint y) { fp_glVertexAttribI2iEXT(index, x, y); } @@ -2945,13 +2408,24 @@ inline void glVideoCaptureStreamParameterivNV(GLuint video_capture_slot, GLuint inline void glVideoCaptureStreamParameterfvNV(GLuint video_capture_slot, GLuint stream, GLenum pname, const GLfloat* params) { fp_glVideoCaptureStreamParameterfvNV(video_capture_slot, stream, pname, params); } inline void glVideoCaptureStreamParameterdvNV(GLuint video_capture_slot, GLuint stream, GLenum pname, const GLdouble* params) { fp_glVideoCaptureStreamParameterdvNV(video_capture_slot, stream, pname, params); } +/* GL_NV_viewport_array */ +inline void glViewportArrayvNV(GLuint first, GLsizei count, const GLfloat* v) { fp_glViewportArrayvNV(first, count, v); } +inline void glViewportIndexedfNV(GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h) { fp_glViewportIndexedfNV(index, x, y, w, h); } +inline void glViewportIndexedfvNV(GLuint index, const GLfloat* v) { fp_glViewportIndexedfvNV(index, v); } +inline void glScissorArrayvNV(GLuint first, GLsizei count, const GLint* v) { fp_glScissorArrayvNV(first, count, v); } +inline void glScissorIndexedNV(GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height) { fp_glScissorIndexedNV(index, left, bottom, width, height); } +inline void glScissorIndexedvNV(GLuint index, const GLint* v) { fp_glScissorIndexedvNV(index, v); } +inline void glDepthRangeArrayfvNV(GLuint first, GLsizei count, const GLfloat* v) { fp_glDepthRangeArrayfvNV(first, count, v); } +inline void glDepthRangeIndexedfNV(GLuint index, GLfloat n, GLfloat f) { fp_glDepthRangeIndexedfNV(index, n, f); } +inline void glGetFloati_vNV(GLenum target, GLuint index, GLfloat* data) { fp_glGetFloati_vNV(target, index, data); } +inline void glEnableiNV(GLenum target, GLuint index) { fp_glEnableiNV(target, index); } +inline void glDisableiNV(GLenum target, GLuint index) { fp_glDisableiNV(target, index); } +inline GLboolean glIsEnablediNV(GLenum target, GLuint index) { return fp_glIsEnablediNV(target, index); } + /* GL_NVX_conditional_render */ inline void glBeginConditionalRenderNVX(GLuint id) { fp_glBeginConditionalRenderNVX(id); } inline void glEndConditionalRenderNVX() { fp_glEndConditionalRenderNVX(); } -/* GL_PGI_misc_hints */ -inline void glHintPGI(GLenum target, GLint mode) { fp_glHintPGI(target, mode); } - /* GL_QCOM_alpha_test */ inline void glAlphaFuncQCOM(GLenum func, GLclampf ref) { fp_glAlphaFuncQCOM(func, ref); } diff --git a/jni/love/src/libraries/lodepng/lodepng.cpp b/jni/love/src/libraries/lodepng/lodepng.cpp index e4f35d7d..7f1b1c12 100644 --- a/jni/love/src/libraries/lodepng/lodepng.cpp +++ b/jni/love/src/libraries/lodepng/lodepng.cpp @@ -1,7 +1,7 @@ /* -LodePNG version 20131222 +LodePNG version 20141130 -Copyright (c) 2005-2013 Lode Vandevenne +Copyright (c) 2005-2014 Lode Vandevenne This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -37,7 +37,10 @@ Rename this file to lodepng.cpp to use it for C++, or to lodepng.c to use it for #include #endif /*LODEPNG_COMPILE_CPP*/ -#define VERSION_STRING "20131222" +#if defined(_MSC_VER) && (_MSC_VER >= 1310) /*Visual Studio: A few warning types are not desired here.*/ +#pragma warning( disable : 4244 ) /*implicit conversions: not warned by gcc -Wall -Wextra and requires too much casts*/ +#pragma warning( disable : 4996 ) /*VS does not like fopen, but fopen_s is not standard C so unusable here*/ +#endif /*_MSC_VER */ /* This source file is built up in the following large parts. The code sections @@ -114,6 +117,13 @@ Example: if(!uivector_resizev(&frequencies_ll, 286, 0)) ERROR_BREAK(83); if(error) return error;\ } +/*Set error var to the error code, and return from the void function.*/ +#define CERROR_RETURN(errorvar, code)\ +{\ + errorvar = code;\ + return;\ +} + /* About uivector, ucvector and string: -All of them wrap dynamic arrays or text strings in a similar way. @@ -140,30 +150,36 @@ static void uivector_cleanup(void* p) } /*returns 1 if success, 0 if failure ==> nothing done*/ -static unsigned uivector_resize(uivector* p, size_t size) +static unsigned uivector_reserve(uivector* p, size_t allocsize) { - if(size * sizeof(unsigned) > p->allocsize) + if(allocsize > p->allocsize) { - size_t newsize = size * sizeof(unsigned) * 2; + size_t newsize = (allocsize > p->allocsize * 2) ? allocsize : (allocsize * 3 / 2); void* data = lodepng_realloc(p->data, newsize); if(data) { p->allocsize = newsize; p->data = (unsigned*)data; - p->size = size; } - else return 0; + else return 0; /*error: not enough memory*/ } - else p->size = size; return 1; } +/*returns 1 if success, 0 if failure ==> nothing done*/ +static unsigned uivector_resize(uivector* p, size_t size) +{ + if(!uivector_reserve(p, size * sizeof(unsigned))) return 0; + p->size = size; + return 1; /*success*/ +} + /*resize and give all new elements the value*/ static unsigned uivector_resizev(uivector* p, size_t size, unsigned value) { size_t oldsize = p->size, i; if(!uivector_resize(p, size)) return 0; - for(i = oldsize; i < size; i++) p->data[i] = value; + for(i = oldsize; i < size; ++i) p->data[i] = value; return 1; } @@ -187,7 +203,7 @@ static unsigned uivector_copy(uivector* p, const uivector* q) { size_t i; if(!uivector_resize(p, q->size)) return 0; - for(i = 0; i < q->size; i++) p->data[i] = q->data[i]; + for(i = 0; i != q->size; ++i) p->data[i] = q->data[i]; return 1; } #endif /*LODEPNG_COMPILE_ENCODER*/ @@ -204,24 +220,30 @@ typedef struct ucvector } ucvector; /*returns 1 if success, 0 if failure ==> nothing done*/ -static unsigned ucvector_resize(ucvector* p, size_t size) +static unsigned ucvector_reserve(ucvector* p, size_t allocsize) { - if(size * sizeof(unsigned char) > p->allocsize) + if(allocsize > p->allocsize) { - size_t newsize = size * sizeof(unsigned char) * 2; + size_t newsize = (allocsize > p->allocsize * 2) ? allocsize : (allocsize * 3 / 2); void* data = lodepng_realloc(p->data, newsize); if(data) { p->allocsize = newsize; p->data = (unsigned char*)data; - p->size = size; } else return 0; /*error: not enough memory*/ } - else p->size = size; return 1; } +/*returns 1 if success, 0 if failure ==> nothing done*/ +static unsigned ucvector_resize(ucvector* p, size_t size) +{ + if(!ucvector_reserve(p, size * sizeof(unsigned char))) return 0; + p->size = size; + return 1; /*success*/ +} + #ifdef LODEPNG_COMPILE_PNG static void ucvector_cleanup(void* p) @@ -243,7 +265,7 @@ static unsigned ucvector_resizev(ucvector* p, size_t size, unsigned char value) { size_t oldsize = p->size, i; if(!ucvector_resize(p, size)) return 0; - for(i = oldsize; i < size; i++) p->data[i] = value; + for(i = oldsize; i < size; ++i) p->data[i] = value; return 1; } #endif /*LODEPNG_COMPILE_DECODER*/ @@ -302,10 +324,10 @@ static void string_cleanup(char** out) static void string_set(char** out, const char* in) { - size_t insize = strlen(in), i = 0; + size_t insize = strlen(in), i; if(string_resize(out, insize)) { - for(i = 0; i < insize; i++) + for(i = 0; i != insize; ++i) { (*out)[i] = in[i]; } @@ -318,7 +340,7 @@ static void string_set(char** out, const char* in) unsigned lodepng_read32bitInt(const unsigned char* buffer) { - return (buffer[0] << 24) | (buffer[1] << 16) | (buffer[2] << 8) | buffer[3]; + return (unsigned)((buffer[0] << 24) | (buffer[1] << 16) | (buffer[2] << 8) | buffer[3]); } #if defined(LODEPNG_COMPILE_PNG) || defined(LODEPNG_COMPILE_ENCODER) @@ -401,19 +423,19 @@ unsigned lodepng_save_file(const unsigned char* buffer, size_t buffersize, const if(((*bitpointer) & 7) == 0) ucvector_push_back(bitstream, (unsigned char)0);\ /*earlier bit of huffman code is in a lesser significant bit of an earlier byte*/\ (bitstream->data[bitstream->size - 1]) |= (bit << ((*bitpointer) & 0x7));\ - (*bitpointer)++;\ + ++(*bitpointer);\ } static void addBitsToStream(size_t* bitpointer, ucvector* bitstream, unsigned value, size_t nbits) { size_t i; - for(i = 0; i < nbits; i++) addBitToStream(bitpointer, bitstream, (unsigned char)((value >> i) & 1)); + for(i = 0; i != nbits; ++i) addBitToStream(bitpointer, bitstream, (unsigned char)((value >> i) & 1)); } static void addBitsToStreamReversed(size_t* bitpointer, ucvector* bitstream, unsigned value, size_t nbits) { size_t i; - for(i = 0; i < nbits; i++) addBitToStream(bitpointer, bitstream, (unsigned char)((value >> (nbits - 1 - i)) & 1)); + for(i = 0; i != nbits; ++i) addBitToStream(bitpointer, bitstream, (unsigned char)((value >> (nbits - 1 - i)) & 1)); } #endif /*LODEPNG_COMPILE_ENCODER*/ @@ -424,17 +446,17 @@ static void addBitsToStreamReversed(size_t* bitpointer, ucvector* bitstream, uns static unsigned char readBitFromStream(size_t* bitpointer, const unsigned char* bitstream) { unsigned char result = (unsigned char)(READBIT(*bitpointer, bitstream)); - (*bitpointer)++; + ++(*bitpointer); return result; } static unsigned readBitsFromStream(size_t* bitpointer, const unsigned char* bitstream, size_t nbits) { unsigned result = 0, i; - for(i = 0; i < nbits; i++) + for(i = 0; i != nbits; ++i) { result += ((unsigned)READBIT(*bitpointer, bitstream)) << i; - (*bitpointer)++; + ++(*bitpointer); } return result; } @@ -497,7 +519,7 @@ typedef struct HuffmanTree static void HuffmanTree_draw(HuffmanTree* tree) { std::cout << "tree. length: " << tree->numcodes << " maxbitlen: " << tree->maxbitlen << std::endl; - for(size_t i = 0; i < tree->tree1d.size; i++) + for(size_t i = 0; i != tree->tree1d.size; ++i) { if(tree->lengths.data[i]) std::cout << i << " " << tree->tree1d.data[i] << " " << tree->lengths.data[i] << std::endl; @@ -539,17 +561,18 @@ static unsigned HuffmanTree_make2DTree(HuffmanTree* tree) There is only memory for such good tree currently, if there are more nodes (due to too long length codes), error 55 will happen */ - for(n = 0; n < tree->numcodes * 2; n++) + for(n = 0; n < tree->numcodes * 2; ++n) { tree->tree2d[n] = 32767; /*32767 here means the tree2d isn't filled there yet*/ } - for(n = 0; n < tree->numcodes; n++) /*the codes*/ + for(n = 0; n < tree->numcodes; ++n) /*the codes*/ { - for(i = 0; i < tree->lengths[n]; i++) /*the bits for this code*/ + for(i = 0; i != tree->lengths[n]; ++i) /*the bits for this code*/ { unsigned char bit = (unsigned char)((tree->tree1d[n] >> (tree->lengths[n] - i - 1)) & 1); - if(treepos > tree->numcodes - 2) return 55; /*oversubscribed, see comment in lodepng_error_text*/ + /*oversubscribed, see comment in lodepng_error_text*/ + if(treepos > 2147483647 || treepos + 2 > tree->numcodes) return 55; if(tree->tree2d[2 * treepos + bit] == 32767) /*not yet filled in*/ { if(i + 1 == tree->lengths[n]) /*last bit*/ @@ -561,7 +584,7 @@ static unsigned HuffmanTree_make2DTree(HuffmanTree* tree) { /*put address of the next step in here, first that address has to be found of course (it's just nodefilled + 1)...*/ - nodefilled++; + ++nodefilled; /*addresses encoded with numcodes added to it*/ tree->tree2d[2 * treepos + bit] = nodefilled + tree->numcodes; treepos = nodefilled; @@ -571,7 +594,7 @@ static unsigned HuffmanTree_make2DTree(HuffmanTree* tree) } } - for(n = 0; n < tree->numcodes * 2; n++) + for(n = 0; n < tree->numcodes * 2; ++n) { if(tree->tree2d[n] == 32767) tree->tree2d[n] = 0; /*remove possible remaining 32767's*/ } @@ -588,7 +611,8 @@ static unsigned HuffmanTree_makeFromLengths2(HuffmanTree* tree) { uivector blcount; uivector nextcode; - unsigned bits, n, error = 0; + unsigned error = 0; + unsigned bits, n; uivector_init(&blcount); uivector_init(&nextcode); @@ -603,14 +627,14 @@ static unsigned HuffmanTree_makeFromLengths2(HuffmanTree* tree) if(!error) { /*step 1: count number of instances of each code length*/ - for(bits = 0; bits < tree->numcodes; bits++) blcount.data[tree->lengths[bits]]++; + for(bits = 0; bits != tree->numcodes; ++bits) ++blcount.data[tree->lengths[bits]]; /*step 2: generate the nextcode values*/ - for(bits = 1; bits <= tree->maxbitlen; bits++) + for(bits = 1; bits <= tree->maxbitlen; ++bits) { nextcode.data[bits] = (nextcode.data[bits - 1] + blcount.data[bits - 1]) << 1; } /*step 3: generate all the codes*/ - for(n = 0; n < tree->numcodes; n++) + for(n = 0; n != tree->numcodes; ++n) { if(tree->lengths[n] != 0) tree->tree1d[n] = nextcode.data[tree->lengths[n]]++; } @@ -634,7 +658,7 @@ static unsigned HuffmanTree_makeFromLengths(HuffmanTree* tree, const unsigned* b unsigned i; tree->lengths = (unsigned*)lodepng_malloc(numcodes * sizeof(unsigned)); if(!tree->lengths) return 83; /*alloc fail*/ - for(i = 0; i < numcodes; i++) tree->lengths[i] = bitlen[i]; + for(i = 0; i != numcodes; ++i) tree->lengths[i] = bitlen[i]; tree->numcodes = (unsigned)numcodes; /*number of symbols*/ tree->maxbitlen = maxbitlen; return HuffmanTree_makeFromLengths2(tree); @@ -673,20 +697,20 @@ static void coin_copy(Coin* c1, const Coin* c2) static void add_coins(Coin* c1, const Coin* c2) { size_t i; - for(i = 0; i < c2->symbols.size; i++) uivector_push_back(&c1->symbols, c2->symbols.data[i]); + for(i = 0; i != c2->symbols.size; ++i) uivector_push_back(&c1->symbols, c2->symbols.data[i]); c1->weight += c2->weight; } static void init_coins(Coin* coins, size_t num) { size_t i; - for(i = 0; i < num; i++) coin_init(&coins[i]); + for(i = 0; i != num; ++i) coin_init(&coins[i]); } static void cleanup_coins(Coin* coins, size_t num) { size_t i; - for(i = 0; i < num; i++) coin_cleanup(&coins[i]); + for(i = 0; i != num; ++i) coin_cleanup(&coins[i]); } static int coin_compare(const void* a, const void* b) { @@ -699,13 +723,13 @@ static unsigned append_symbol_coins(Coin* coins, const unsigned* frequencies, un { unsigned i; unsigned j = 0; /*index of present symbols*/ - for(i = 0; i < numcodes; i++) + for(i = 0; i != numcodes; ++i) { if(frequencies[i] != 0) /*only include symbols that are present*/ { coins[j].weight = frequencies[i] / (float)sum; uivector_push_back(&coins[j].symbols, i); - j++; + ++j; } } return 0; @@ -719,21 +743,21 @@ unsigned lodepng_huffman_code_lengths(unsigned* lengths, const unsigned* frequen unsigned error = 0; Coin* coins; /*the coins of the currently calculated row*/ Coin* prev_row; /*the previous row of coins*/ - unsigned numcoins; - unsigned coinmem; + size_t numcoins; + size_t coinmem; if(numcodes == 0) return 80; /*error: a tree of 0 symbols is not supposed to be made*/ - for(i = 0; i < numcodes; i++) + for(i = 0; i != numcodes; ++i) { if(frequencies[i] > 0) { - numpresent++; + ++numpresent; sum += frequencies[i]; } } - for(i = 0; i < numcodes; i++) lengths[i] = 0; + for(i = 0; i != numcodes; ++i) lengths[i] = 0; /*ensure at least two present symbols. There should be at least one symbol according to RFC 1951 section 3.2.7. To decoders incorrectly require two. To @@ -746,7 +770,7 @@ unsigned lodepng_huffman_code_lengths(unsigned* lengths, const unsigned* frequen } else if(numpresent == 1) { - for(i = 0; i < numcodes; i++) + for(i = 0; i != numcodes; ++i) { if(frequencies[i]) { @@ -780,7 +804,7 @@ unsigned lodepng_huffman_code_lengths(unsigned* lengths, const unsigned* frequen if(!error) { unsigned numprev = 0; - for(j = 1; j <= maxbitlen && !error; j++) /*each of the remaining rows*/ + for(j = 1; j <= maxbitlen && !error; ++j) /*each of the remaining rows*/ { unsigned tempnum; Coin* tempcoins; @@ -813,11 +837,11 @@ unsigned lodepng_huffman_code_lengths(unsigned* lengths, const unsigned* frequen if(!error) { - /*calculate the lenghts of each symbol, as the amount of times a coin of each symbol is used*/ - for(i = 0; i < numpresent - 1; i++) + /*calculate the lengths of each symbol, as the amount of times a coin of each symbol is used*/ + for(i = 0; i + 1 < numpresent; ++i) { Coin* coin = &coins[i]; - for(j = 0; j < coin->symbols.size; j++) lengths[coin->symbols.data[j]]++; + for(j = 0; j < coin->symbols.size; ++j) ++lengths[coin->symbols.data[j]]; } } @@ -835,7 +859,7 @@ static unsigned HuffmanTree_makeFromFrequencies(HuffmanTree* tree, const unsigne size_t mincodes, size_t numcodes, unsigned maxbitlen) { unsigned error = 0; - while(!frequencies[numcodes - 1] && numcodes > mincodes) numcodes--; /*trim zeroes*/ + while(!frequencies[numcodes - 1] && numcodes > mincodes) --numcodes; /*trim zeroes*/ tree->maxbitlen = maxbitlen; tree->numcodes = (unsigned)numcodes; /*number of symbols*/ tree->lengths = (unsigned*)lodepng_realloc(tree->lengths, numcodes * sizeof(unsigned)); @@ -867,10 +891,10 @@ static unsigned generateFixedLitLenTree(HuffmanTree* tree) if(!bitlen) return 83; /*alloc fail*/ /*288 possible codes: 0-255=literals, 256=endcode, 257-285=lengthcodes, 286-287=unused*/ - for(i = 0; i <= 143; i++) bitlen[i] = 8; - for(i = 144; i <= 255; i++) bitlen[i] = 9; - for(i = 256; i <= 279; i++) bitlen[i] = 7; - for(i = 280; i <= 287; i++) bitlen[i] = 8; + for(i = 0; i <= 143; ++i) bitlen[i] = 8; + for(i = 144; i <= 255; ++i) bitlen[i] = 9; + for(i = 256; i <= 279; ++i) bitlen[i] = 7; + for(i = 280; i <= 287; ++i) bitlen[i] = 8; error = HuffmanTree_makeFromLengths(tree, bitlen, NUM_DEFLATE_CODE_SYMBOLS, 15); @@ -886,7 +910,7 @@ static unsigned generateFixedDistanceTree(HuffmanTree* tree) if(!bitlen) return 83; /*alloc fail*/ /*there are 32 distance codes, but 30-31 are unused*/ - for(i = 0; i < NUM_DISTANCE_SYMBOLS; i++) bitlen[i] = 5; + for(i = 0; i != NUM_DISTANCE_SYMBOLS; ++i) bitlen[i] = 5; error = HuffmanTree_makeFromLengths(tree, bitlen, NUM_DISTANCE_SYMBOLS, 15); lodepng_free(bitlen); @@ -911,7 +935,7 @@ static unsigned huffmanDecodeSymbol(const unsigned char* in, size_t* bp, the expression below because this is the biggest bottleneck while decoding */ ct = codetree->tree2d[(treepos << 1) + READBIT(*bp, in)]; - (*bp)++; + ++(*bp); if(ct < codetree->numcodes) return ct; /*the symbol is decoded, return it*/ else treepos = ct - codetree->numcodes; /*symbol not yet decoded, instead move tree position*/ @@ -950,7 +974,7 @@ static unsigned getTreeInflateDynamic(HuffmanTree* tree_ll, HuffmanTree* tree_d, unsigned* bitlen_cl = 0; HuffmanTree tree_cl; /*the code tree for code length codes (the huffman tree for compressed huffman trees)*/ - if((*bp) >> 3 >= inlength - 2) return 49; /*error: the bit pointer is or will go past the memory*/ + if((*bp) + 14 > (inlength << 3)) return 49; /*error: the bit pointer is or will go past the memory*/ /*number of literal/length codes + 257. Unlike the spec, the value 257 is added to it here already*/ HLIT = readBitsFromStream(bp, in, 5) + 257; @@ -959,6 +983,8 @@ static unsigned getTreeInflateDynamic(HuffmanTree* tree_ll, HuffmanTree* tree_d, /*number of code length codes. Unlike the spec, the value 4 is added to it here already*/ HCLEN = readBitsFromStream(bp, in, 4) + 4; + if((*bp) + HCLEN * 3 > (inlength << 3)) return 50; /*error: the bit pointer is or will go past the memory*/ + HuffmanTree_init(&tree_cl); while(!error) @@ -968,7 +994,7 @@ static unsigned getTreeInflateDynamic(HuffmanTree* tree_ll, HuffmanTree* tree_d, bitlen_cl = (unsigned*)lodepng_malloc(NUM_CODE_LENGTH_CODES * sizeof(unsigned)); if(!bitlen_cl) ERROR_BREAK(83 /*alloc fail*/); - for(i = 0; i < NUM_CODE_LENGTH_CODES; i++) + for(i = 0; i != NUM_CODE_LENGTH_CODES; ++i) { if(i < HCLEN) bitlen_cl[CLCL_ORDER[i]] = readBitsFromStream(bp, in, 3); else bitlen_cl[CLCL_ORDER[i]] = 0; /*if not, it must stay 0*/ @@ -981,8 +1007,8 @@ static unsigned getTreeInflateDynamic(HuffmanTree* tree_ll, HuffmanTree* tree_d, bitlen_ll = (unsigned*)lodepng_malloc(NUM_DEFLATE_CODE_SYMBOLS * sizeof(unsigned)); bitlen_d = (unsigned*)lodepng_malloc(NUM_DISTANCE_SYMBOLS * sizeof(unsigned)); if(!bitlen_ll || !bitlen_d) ERROR_BREAK(83 /*alloc fail*/); - for(i = 0; i < NUM_DEFLATE_CODE_SYMBOLS; i++) bitlen_ll[i] = 0; - for(i = 0; i < NUM_DISTANCE_SYMBOLS; i++) bitlen_d[i] = 0; + for(i = 0; i != NUM_DEFLATE_CODE_SYMBOLS; ++i) bitlen_ll[i] = 0; + for(i = 0; i != NUM_DISTANCE_SYMBOLS; ++i) bitlen_d[i] = 0; /*i is the current symbol we're reading in the part that contains the code lengths of lit/len and dist codes*/ i = 0; @@ -993,61 +1019,59 @@ static unsigned getTreeInflateDynamic(HuffmanTree* tree_ll, HuffmanTree* tree_d, { if(i < HLIT) bitlen_ll[i] = code; else bitlen_d[i - HLIT] = code; - i++; + ++i; } else if(code == 16) /*repeat previous*/ { unsigned replength = 3; /*read in the 2 bits that indicate repeat length (3-6)*/ unsigned value; /*set value to the previous code*/ - if(*bp >= inbitlength) ERROR_BREAK(50); /*error, bit pointer jumps past memory*/ if (i == 0) ERROR_BREAK(54); /*can't repeat previous if i is 0*/ + if((*bp + 2) > inbitlength) ERROR_BREAK(50); /*error, bit pointer jumps past memory*/ replength += readBitsFromStream(bp, in, 2); if(i < HLIT + 1) value = bitlen_ll[i - 1]; else value = bitlen_d[i - HLIT - 1]; /*repeat this value in the next lengths*/ - for(n = 0; n < replength; n++) + for(n = 0; n < replength; ++n) { if(i >= HLIT + HDIST) ERROR_BREAK(13); /*error: i is larger than the amount of codes*/ if(i < HLIT) bitlen_ll[i] = value; else bitlen_d[i - HLIT] = value; - i++; + ++i; } } else if(code == 17) /*repeat "0" 3-10 times*/ { unsigned replength = 3; /*read in the bits that indicate repeat length*/ - if(*bp >= inbitlength) ERROR_BREAK(50); /*error, bit pointer jumps past memory*/ - + if((*bp + 3) > inbitlength) ERROR_BREAK(50); /*error, bit pointer jumps past memory*/ replength += readBitsFromStream(bp, in, 3); /*repeat this value in the next lengths*/ - for(n = 0; n < replength; n++) + for(n = 0; n < replength; ++n) { if(i >= HLIT + HDIST) ERROR_BREAK(14); /*error: i is larger than the amount of codes*/ if(i < HLIT) bitlen_ll[i] = 0; else bitlen_d[i - HLIT] = 0; - i++; + ++i; } } else if(code == 18) /*repeat "0" 11-138 times*/ { unsigned replength = 11; /*read in the bits that indicate repeat length*/ - if(*bp >= inbitlength) ERROR_BREAK(50); /*error, bit pointer jumps past memory*/ - + if((*bp + 7) > inbitlength) ERROR_BREAK(50); /*error, bit pointer jumps past memory*/ replength += readBitsFromStream(bp, in, 7); /*repeat this value in the next lengths*/ - for(n = 0; n < replength; n++) + for(n = 0; n < replength; ++n) { if(i >= HLIT + HDIST) ERROR_BREAK(15); /*error: i is larger than the amount of codes*/ if(i < HLIT) bitlen_ll[i] = 0; else bitlen_d[i - HLIT] = 0; - i++; + ++i; } } else /*if(code == (unsigned)(-1))*/ /*huffmanDecodeSymbol returns (unsigned)(-1) in case of error*/ @@ -1103,13 +1127,10 @@ static unsigned inflateHuffmanBlock(ucvector* out, const unsigned char* in, size unsigned code_ll = huffmanDecodeSymbol(in, bp, &tree_ll, inbitlength); if(code_ll <= 255) /*literal symbol*/ { - if((*pos) >= out->size) - { - /*reserve more room at once*/ - if(!ucvector_resize(out, ((*pos) + 1) * 2)) ERROR_BREAK(83 /*alloc fail*/); - } - out->data[(*pos)] = (unsigned char)(code_ll); - (*pos)++; + /*ucvector_push_back would do the same, but for some reason the two lines below run 10% faster*/ + if(!ucvector_resize(out, (*pos) + 1)) ERROR_BREAK(83 /*alloc fail*/); + out->data[*pos] = (unsigned char)code_ll; + ++(*pos); } else if(code_ll >= FIRST_LENGTH_CODE_INDEX && code_ll <= LAST_LENGTH_CODE_INDEX) /*length code*/ { @@ -1122,7 +1143,7 @@ static unsigned inflateHuffmanBlock(ucvector* out, const unsigned char* in, size /*part 2: get extra bits and add the value of that to length*/ numextrabits_l = LENGTHEXTRA[code_ll - FIRST_LENGTH_CODE_INDEX]; - if(*bp >= inbitlength) ERROR_BREAK(51); /*error, bit pointer will jump past memory*/ + if((*bp + numextrabits_l) > inbitlength) ERROR_BREAK(51); /*error, bit pointer will jump past memory*/ length += readBitsFromStream(bp, in, numextrabits_l); /*part 3: get distance code*/ @@ -1142,25 +1163,20 @@ static unsigned inflateHuffmanBlock(ucvector* out, const unsigned char* in, size /*part 4: get extra bits from distance*/ numextrabits_d = DISTANCEEXTRA[code_d]; - if(*bp >= inbitlength) ERROR_BREAK(51); /*error, bit pointer will jump past memory*/ - + if((*bp + numextrabits_d) > inbitlength) ERROR_BREAK(51); /*error, bit pointer will jump past memory*/ distance += readBitsFromStream(bp, in, numextrabits_d); /*part 5: fill in all the out[n] values based on the length and dist*/ start = (*pos); if(distance > start) ERROR_BREAK(52); /*too long backward distance*/ backward = start - distance; - if((*pos) + length >= out->size) - { - /*reserve more room at once*/ - if(!ucvector_resize(out, ((*pos) + length) * 2)) ERROR_BREAK(83 /*alloc fail*/); - } - for(forward = 0; forward < length; forward++) + if(!ucvector_resize(out, (*pos) + length)) ERROR_BREAK(83 /*alloc fail*/); + for(forward = 0; forward < length; ++forward) { out->data[(*pos)] = out->data[backward]; - (*pos)++; - backward++; + ++(*pos); + ++backward; if(backward >= start) backward = start - distance; } } @@ -1172,7 +1188,7 @@ static unsigned inflateHuffmanBlock(ucvector* out, const unsigned char* in, size { /*return error code 10 or 11 depending on the situation that happened in huffmanDecodeSymbol (10=no endcode, 11=wrong jump outside of tree)*/ - error = (*bp) > inlength * 8 ? 10 : 11; + error = ((*bp) > inlength * 8) ? 10 : 11; break; } } @@ -1185,28 +1201,26 @@ static unsigned inflateHuffmanBlock(ucvector* out, const unsigned char* in, size static unsigned inflateNoCompression(ucvector* out, const unsigned char* in, size_t* bp, size_t* pos, size_t inlength) { - /*go to first boundary of byte*/ size_t p; unsigned LEN, NLEN, n, error = 0; - while(((*bp) & 0x7) != 0) (*bp)++; + + /*go to first boundary of byte*/ + while(((*bp) & 0x7) != 0) ++(*bp); p = (*bp) / 8; /*byte position*/ /*read LEN (2 bytes) and NLEN (2 bytes)*/ - if(p >= inlength - 4) return 52; /*error, bit pointer will jump past memory*/ - LEN = in[p] + 256 * in[p + 1]; p += 2; - NLEN = in[p] + 256 * in[p + 1]; p += 2; + if(p + 4 >= inlength) return 52; /*error, bit pointer will jump past memory*/ + LEN = in[p] + 256u * in[p + 1]; p += 2; + NLEN = in[p] + 256u * in[p + 1]; p += 2; /*check if 16-bit NLEN is really the one's complement of LEN*/ if(LEN + NLEN != 65535) return 21; /*error: NLEN is not one's complement of LEN*/ - if((*pos) + LEN >= out->size) - { - if(!ucvector_resize(out, (*pos) + LEN)) return 83; /*alloc fail*/ - } + if(!ucvector_resize(out, (*pos) + LEN)) return 83; /*alloc fail*/ /*read the literal data: LEN bytes are now stored in the out buffer*/ if(p + LEN > inlength) return 23; /*error: reading outside of in buffer*/ - for(n = 0; n < LEN; n++) out->data[(*pos)++] = in[p++]; + for(n = 0; n < LEN; ++n) out->data[(*pos)++] = in[p++]; (*bp) = p * 8; @@ -1221,7 +1235,6 @@ static unsigned lodepng_inflatev(ucvector* out, size_t bp = 0; unsigned BFINAL = 0; size_t pos = 0; /*byte position in the out buffer*/ - unsigned error = 0; (void)settings; @@ -1231,8 +1244,8 @@ static unsigned lodepng_inflatev(ucvector* out, unsigned BTYPE; if(bp + 2 >= insize * 8) return 52; /*error, bit pointer will jump past memory*/ BFINAL = readBitFromStream(&bp, in); - BTYPE = 1 * readBitFromStream(&bp, in); - BTYPE += 2 * readBitFromStream(&bp, in); + BTYPE = 1u * readBitFromStream(&bp, in); + BTYPE += 2u * readBitFromStream(&bp, in); if(BTYPE == 3) return 20; /*error: invalid BTYPE*/ else if(BTYPE == 0) error = inflateNoCompression(out, in, &bp, &pos, insize); /*no compression*/ @@ -1241,9 +1254,6 @@ static unsigned lodepng_inflatev(ucvector* out, if(error) return error; } - /*Only now we know the true size of out, resize it to that*/ - if(!ucvector_resize(out, pos)) error = 83; /*alloc fail*/ - return error; } @@ -1295,7 +1305,7 @@ given array must be sorted (if no value is smaller, it returns the size of the g static size_t searchCodeIndex(const unsigned* array, size_t array_size, size_t value) { /*linear search implementation*/ - /*for(size_t i = 1; i < array_size; i++) if(array[i] > value) return i - 1; + /*for(size_t i = 1; i < array_size; ++i) if(array[i] > value) return i - 1; return array_size - 1;*/ /*binary search implementation (not that much faster) (precondition: array_size > 0)*/ @@ -1330,31 +1340,23 @@ static void addLengthDistance(uivector* values, size_t length, size_t distance) uivector_push_back(values, extra_distance); } -static const unsigned HASH_BIT_MASK = 65535; +/*3 bytes of data get encoded into two bytes. The hash cannot use more than 3 +bytes as input because 3 is the minimum match length for deflate*/ static const unsigned HASH_NUM_VALUES = 65536; -static const unsigned HASH_NUM_CHARACTERS = 3; -static const unsigned HASH_SHIFT = 2; -/* -The HASH_NUM_CHARACTERS value is used to make encoding faster by using longer -sequences to generate a hash value from the stream bytes. Setting it to 3 -gives exactly the same compression as the brute force method, since deflate's -run length encoding starts with lengths of 3. Setting it to higher values, -like 6, can make the encoding faster (not always though!), but will cause the -encoding to miss any length between 3 and this value, so that the compression -may be worse (but this can vary too depending on the image, sometimes it is -even a bit better instead). -The HASH_NUM_VALUES is the amount of unique possible hash values that -combinations of bytes can give, the higher it is the more memory is needed, but -if it's too low the advantage of hashing is gone. -*/ +static const unsigned HASH_BIT_MASK = 65535; /*HASH_NUM_VALUES - 1, but C90 does not like that as initializer*/ typedef struct Hash { - int* head; /*hash value to head circular pos*/ - int* val; /*circular pos to hash value*/ + int* head; /*hash value to head circular pos - can be outdated if went around window*/ /*circular pos to prev circular pos*/ unsigned short* chain; - unsigned short* zeros; + int* val; /*circular pos to hash value*/ + + /*TODO: do this not only for zeros but for any repeated byte. However for PNG + it's always going to be the zeros that dominate, so not important for PNG*/ + int* headz; /*similar to head, but for chainz*/ + unsigned short* chainz; /*those with same amount of zeros*/ + unsigned short* zeros; /*length of zeros streak, used as a second hash chain*/ } Hash; static unsigned hash_init(Hash* hash, unsigned windowsize) @@ -1363,14 +1365,23 @@ static unsigned hash_init(Hash* hash, unsigned windowsize) hash->head = (int*)lodepng_malloc(sizeof(int) * HASH_NUM_VALUES); hash->val = (int*)lodepng_malloc(sizeof(int) * windowsize); hash->chain = (unsigned short*)lodepng_malloc(sizeof(unsigned short) * windowsize); - hash->zeros = (unsigned short*)lodepng_malloc(sizeof(unsigned short) * windowsize); - if(!hash->head || !hash->val || !hash->chain || !hash->zeros) return 83; /*alloc fail*/ + hash->zeros = (unsigned short*)lodepng_malloc(sizeof(unsigned short) * windowsize); + hash->headz = (int*)lodepng_malloc(sizeof(int) * (MAX_SUPPORTED_DEFLATE_LENGTH + 1)); + hash->chainz = (unsigned short*)lodepng_malloc(sizeof(unsigned short) * windowsize); + + if(!hash->head || !hash->chain || !hash->val || !hash->headz|| !hash->chainz || !hash->zeros) + { + return 83; /*alloc fail*/ + } /*initialize hash table*/ - for(i = 0; i < HASH_NUM_VALUES; i++) hash->head[i] = -1; - for(i = 0; i < windowsize; i++) hash->val[i] = -1; - for(i = 0; i < windowsize; i++) hash->chain[i] = i; /*same value as index indicates uninitialized*/ + for(i = 0; i != HASH_NUM_VALUES; ++i) hash->head[i] = -1; + for(i = 0; i != windowsize; ++i) hash->val[i] = -1; + for(i = 0; i != windowsize; ++i) hash->chain[i] = i; /*same value as index indicates uninitialized*/ + + for(i = 0; i <= MAX_SUPPORTED_DEFLATE_LENGTH; ++i) hash->headz[i] = -1; + for(i = 0; i != windowsize; ++i) hash->chainz[i] = i; /*same value as index indicates uninitialized*/ return 0; } @@ -1380,22 +1391,31 @@ static void hash_cleanup(Hash* hash) lodepng_free(hash->head); lodepng_free(hash->val); lodepng_free(hash->chain); + lodepng_free(hash->zeros); + lodepng_free(hash->headz); + lodepng_free(hash->chainz); } + + static unsigned getHash(const unsigned char* data, size_t size, size_t pos) { unsigned result = 0; - if (HASH_NUM_CHARACTERS == 3 && pos + 2 < size) { - result ^= (data[pos + 0] << (0 * HASH_SHIFT)); - result ^= (data[pos + 1] << (1 * HASH_SHIFT)); - result ^= (data[pos + 2] << (2 * HASH_SHIFT)); + if (pos + 2 < size) + { + /*A simple shift and xor hash is used. Since the data of PNGs is dominated + by zeroes due to the filters, a better hash does not have a significant + effect on speed in traversing the chain, and causes more time spend on + calculating the hash.*/ + result ^= (unsigned)(data[pos + 0] << 0u); + result ^= (unsigned)(data[pos + 1] << 4u); + result ^= (unsigned)(data[pos + 2] << 8u); } else { size_t amount, i; if(pos >= size) return 0; - amount = HASH_NUM_CHARACTERS; - if(pos + amount >= size) amount = size - pos; - for(i = 0; i < amount; i++) result ^= (data[pos + i] << (i * HASH_SHIFT)); + amount = size - pos; + for(i = 0; i != amount; ++i) result ^= (unsigned)(data[pos + i] << (i * 8u)); } return result & HASH_BIT_MASK; } @@ -1406,17 +1426,21 @@ static unsigned countZeros(const unsigned char* data, size_t size, size_t pos) const unsigned char* end = start + MAX_SUPPORTED_DEFLATE_LENGTH; if(end > data + size) end = data + size; data = start; - while (data != end && *data == 0) data++; + while (data != end && *data == 0) ++data; /*subtracting two addresses returned as 32-bit number (max value is MAX_SUPPORTED_DEFLATE_LENGTH)*/ return (unsigned)(data - start); } /*wpos = pos & (windowsize - 1)*/ -static void updateHashChain(Hash* hash, size_t wpos, int hashval) +static void updateHashChain(Hash* hash, size_t wpos, unsigned hashval, unsigned short numzeros) { - hash->val[wpos] = hashval; + hash->val[wpos] = (int)hashval; if(hash->head[hashval] != -1) hash->chain[wpos] = hash->head[hashval]; hash->head[hashval] = wpos; + + hash->zeros[wpos] = numzeros; + if(hash->headz[numzeros] != -1) hash->chainz[wpos] = hash->headz[numzeros]; + hash->headz[numzeros] = wpos; } /* @@ -1432,7 +1456,8 @@ static unsigned encodeLZ77(uivector* out, Hash* hash, const unsigned char* in, size_t inpos, size_t insize, unsigned windowsize, unsigned minmatch, unsigned nicematch, unsigned lazymatching) { - unsigned pos, i, error = 0; + size_t pos; + unsigned i, error = 0; /*for large window lengths, assume the user wants no compression loss. Otherwise, max hash chain length speedup.*/ unsigned maxchainlength = windowsize >= 8192 ? windowsize : windowsize / 8; unsigned maxlazymatch = windowsize >= 8192 ? MAX_SUPPORTED_DEFLATE_LENGTH : 64; @@ -1446,51 +1471,51 @@ static unsigned encodeLZ77(uivector* out, Hash* hash, unsigned lazylength = 0, lazyoffset = 0; unsigned hashval; unsigned current_offset, current_length; + unsigned prev_offset; const unsigned char *lastptr, *foreptr, *backptr; - unsigned hashpos, prevpos; + unsigned hashpos; - if(windowsize <= 0 || windowsize > 32768) return 60; /*error: windowsize smaller/larger than allowed*/ + if(windowsize == 0 || windowsize > 32768) return 60; /*error: windowsize smaller/larger than allowed*/ if((windowsize & (windowsize - 1)) != 0) return 90; /*error: must be power of two*/ if(nicematch > MAX_SUPPORTED_DEFLATE_LENGTH) nicematch = MAX_SUPPORTED_DEFLATE_LENGTH; - for(pos = inpos; pos < insize; pos++) + for(pos = inpos; pos < insize; ++pos) { size_t wpos = pos & (windowsize - 1); /*position for in 'circular' hash buffers*/ unsigned chainlength = 0; hashval = getHash(in, insize, pos); - updateHashChain(hash, wpos, hashval); if(usezeros && hashval == 0) { if (numzeros == 0) numzeros = countZeros(in, insize, pos); - else if (pos + numzeros >= insize || in[pos + numzeros - 1] != 0) numzeros--; - hash->zeros[wpos] = numzeros; + else if (pos + numzeros > insize || in[pos + numzeros - 1] != 0) --numzeros; } else { numzeros = 0; } + updateHashChain(hash, wpos, hashval, numzeros); + /*the length and offset found for the current position*/ length = 0; offset = 0; - prevpos = hash->head[hashval]; - hashpos = hash->chain[prevpos]; + hashpos = hash->chain[wpos]; lastptr = &in[insize < pos + MAX_SUPPORTED_DEFLATE_LENGTH ? insize : pos + MAX_SUPPORTED_DEFLATE_LENGTH]; /*search for the longest string*/ + prev_offset = 0; for(;;) { - /*stop when went completely around the circular buffer*/ - if(prevpos < wpos && hashpos > prevpos && hashpos <= wpos) break; - if(prevpos > wpos && (hashpos <= wpos || hashpos > prevpos)) break; if(chainlength++ >= maxchainlength) break; - current_offset = hashpos <= wpos ? wpos - hashpos : wpos - hashpos + windowsize; + + if(current_offset < prev_offset) break; /*stop when went completely around the circular buffer*/ + prev_offset = current_offset; if(current_offset > 0) { /*test the next characters*/ @@ -1498,7 +1523,7 @@ static unsigned encodeLZ77(uivector* out, Hash* hash, backptr = &in[pos - current_offset]; /*common case in PNGs is lots of zeros. Quickly skip over them as a speedup*/ - if(usezeros && hashval == 0 && hash->val[hashpos] == 0 /*hashval[hashpos] may be out of date*/) + if(numzeros >= 3) { unsigned skip = hash->zeros[hashpos]; if(skip > numzeros) skip = numzeros; @@ -1525,8 +1550,14 @@ static unsigned encodeLZ77(uivector* out, Hash* hash, if(hashpos == hash->chain[hashpos]) break; - prevpos = hashpos; - hashpos = hash->chain[hashpos]; + if(numzeros >= 3 && length > numzeros) { + hashpos = hash->chainz[hashpos]; + if(hash->zeros[hashpos] != numzeros) break; + } else { + hashpos = hash->chain[hashpos]; + /*outdated hash value, happens if particular value was not encountered in whole last window*/ + if(hash->val[hashpos] != (int)hashval) break; + } } if(lazymatching) @@ -1552,7 +1583,8 @@ static unsigned encodeLZ77(uivector* out, Hash* hash, length = lazylength; offset = lazyoffset; hash->head[hashval] = -1; /*the same hashchain update will be done, this ensures no wrong alteration*/ - pos--; + hash->headz[numzeros] = -1; /*idem*/ + --pos; } } } @@ -1572,22 +1604,21 @@ static unsigned encodeLZ77(uivector* out, Hash* hash, else { addLengthDistance(out, length, offset); - for(i = 1; i < length; i++) + for(i = 1; i < length; ++i) { - pos++; + ++pos; wpos = pos & (windowsize - 1); hashval = getHash(in, insize, pos); - updateHashChain(hash, wpos, hashval); if(usezeros && hashval == 0) { if (numzeros == 0) numzeros = countZeros(in, insize, pos); - else if (pos + numzeros >= insize || in[pos + numzeros - 1] != 0) numzeros--; - hash->zeros[wpos] = numzeros; + else if (pos + numzeros > insize || in[pos + numzeros - 1] != 0) --numzeros; } else { numzeros = 0; } + updateHashChain(hash, wpos, hashval, numzeros); } } } /*end of the loop through each character of input*/ @@ -1604,7 +1635,7 @@ static unsigned deflateNoCompression(ucvector* out, const unsigned char* data, s size_t i, j, numdeflateblocks = (datasize + 65534) / 65535; unsigned datapos = 0; - for(i = 0; i < numdeflateblocks; i++) + for(i = 0; i != numdeflateblocks; ++i) { unsigned BFINAL, BTYPE, LEN, NLEN; unsigned char firstbyte; @@ -1625,7 +1656,7 @@ static unsigned deflateNoCompression(ucvector* out, const unsigned char* data, s ucvector_push_back(out, (unsigned char)(NLEN / 256)); /*Decompressed data*/ - for(j = 0; j < 65535 && datapos < datasize; j++) + for(j = 0; j < 65535 && datapos < datasize; ++j) { ucvector_push_back(out, data[datapos++]); } @@ -1643,7 +1674,7 @@ static void writeLZ77data(size_t* bp, ucvector* out, const uivector* lz77_encode const HuffmanTree* tree_ll, const HuffmanTree* tree_d) { size_t i = 0; - for(i = 0; i < lz77_encoded->size; i++) + for(i = 0; i != lz77_encoded->size; ++i) { unsigned val = lz77_encoded->data[i]; addHuffmanSymbol(bp, out, HuffmanTree_getCode(tree_ll, val), HuffmanTree_getLength(tree_ll, val)); @@ -1670,7 +1701,7 @@ static void writeLZ77data(size_t* bp, ucvector* out, const uivector* lz77_encode /*Deflate for a block of type "dynamic", that is, with freely, optimally, created huffman trees*/ static unsigned deflateDynamic(ucvector* out, size_t* bp, Hash* hash, const unsigned char* data, size_t datapos, size_t dataend, - const LodePNGCompressSettings* settings, int final) + const LodePNGCompressSettings* settings, unsigned final) { unsigned error = 0; @@ -1736,21 +1767,21 @@ static unsigned deflateDynamic(ucvector* out, size_t* bp, Hash* hash, else { if(!uivector_resize(&lz77_encoded, datasize)) ERROR_BREAK(83 /*alloc fail*/); - for(i = datapos; i < dataend; i++) lz77_encoded.data[i] = data[i]; /*no LZ77, but still will be Huffman compressed*/ + for(i = datapos; i < dataend; ++i) lz77_encoded.data[i] = data[i]; /*no LZ77, but still will be Huffman compressed*/ } if(!uivector_resizev(&frequencies_ll, 286, 0)) ERROR_BREAK(83 /*alloc fail*/); if(!uivector_resizev(&frequencies_d, 30, 0)) ERROR_BREAK(83 /*alloc fail*/); /*Count the frequencies of lit, len and dist codes*/ - for(i = 0; i < lz77_encoded.size; i++) + for(i = 0; i != lz77_encoded.size; ++i) { unsigned symbol = lz77_encoded.data[i]; - frequencies_ll.data[symbol]++; + ++frequencies_ll.data[symbol]; if(symbol > 256) { unsigned dist = lz77_encoded.data[i + 2]; - frequencies_d.data[dist]++; + ++frequencies_d.data[dist]; i += 3; } } @@ -1766,19 +1797,19 @@ static unsigned deflateDynamic(ucvector* out, size_t* bp, Hash* hash, numcodes_ll = tree_ll.numcodes; if(numcodes_ll > 286) numcodes_ll = 286; numcodes_d = tree_d.numcodes; if(numcodes_d > 30) numcodes_d = 30; /*store the code lengths of both generated trees in bitlen_lld*/ - for(i = 0; i < numcodes_ll; i++) uivector_push_back(&bitlen_lld, HuffmanTree_getLength(&tree_ll, (unsigned)i)); - for(i = 0; i < numcodes_d; i++) uivector_push_back(&bitlen_lld, HuffmanTree_getLength(&tree_d, (unsigned)i)); + for(i = 0; i != numcodes_ll; ++i) uivector_push_back(&bitlen_lld, HuffmanTree_getLength(&tree_ll, (unsigned)i)); + for(i = 0; i != numcodes_d; ++i) uivector_push_back(&bitlen_lld, HuffmanTree_getLength(&tree_d, (unsigned)i)); /*run-length compress bitlen_ldd into bitlen_lld_e by using repeat codes 16 (copy length 3-6 times), 17 (3-10 zeroes), 18 (11-138 zeroes)*/ - for(i = 0; i < (unsigned)bitlen_lld.size; i++) + for(i = 0; i != (unsigned)bitlen_lld.size; ++i) { unsigned j = 0; /*amount of repititions*/ - while(i + j + 1 < (unsigned)bitlen_lld.size && bitlen_lld.data[i + j + 1] == bitlen_lld.data[i]) j++; + while(i + j + 1 < (unsigned)bitlen_lld.size && bitlen_lld.data[i + j + 1] == bitlen_lld.data[i]) ++j; if(bitlen_lld.data[i] == 0 && j >= 2) /*repeat code for zeroes*/ { - j++; /*include the first zero*/ + ++j; /*include the first zero*/ if(j <= 10) /*repeat code 17 supports max 10 zeroes*/ { uivector_push_back(&bitlen_lld_e, 17); @@ -1797,7 +1828,7 @@ static unsigned deflateDynamic(ucvector* out, size_t* bp, Hash* hash, size_t k; unsigned num = j / 6, rest = j % 6; uivector_push_back(&bitlen_lld_e, bitlen_lld.data[i]); - for(k = 0; k < num; k++) + for(k = 0; k < num; ++k) { uivector_push_back(&bitlen_lld_e, 16); uivector_push_back(&bitlen_lld_e, 6 - 3); @@ -1819,12 +1850,12 @@ static unsigned deflateDynamic(ucvector* out, size_t* bp, Hash* hash, /*generate tree_cl, the huffmantree of huffmantrees*/ if(!uivector_resizev(&frequencies_cl, NUM_CODE_LENGTH_CODES, 0)) ERROR_BREAK(83 /*alloc fail*/); - for(i = 0; i < bitlen_lld_e.size; i++) + for(i = 0; i != bitlen_lld_e.size; ++i) { - frequencies_cl.data[bitlen_lld_e.data[i]]++; + ++frequencies_cl.data[bitlen_lld_e.data[i]]; /*after a repeat code come the bits that specify the number of repetitions, those don't need to be in the frequencies_cl calculation*/ - if(bitlen_lld_e.data[i] >= 16) i++; + if(bitlen_lld_e.data[i] >= 16) ++i; } error = HuffmanTree_makeFromFrequencies(&tree_cl, frequencies_cl.data, @@ -1832,7 +1863,7 @@ static unsigned deflateDynamic(ucvector* out, size_t* bp, Hash* hash, if(error) break; if(!uivector_resize(&bitlen_cl, tree_cl.numcodes)) ERROR_BREAK(83 /*alloc fail*/); - for(i = 0; i < tree_cl.numcodes; i++) + for(i = 0; i != tree_cl.numcodes; ++i) { /*lenghts of code length tree is in the order as specified by deflate*/ bitlen_cl.data[i] = HuffmanTree_getLength(&tree_cl, CLCL_ORDER[i]); @@ -1868,16 +1899,16 @@ static unsigned deflateDynamic(ucvector* out, size_t* bp, Hash* hash, HDIST = (unsigned)(numcodes_d - 1); HCLEN = (unsigned)bitlen_cl.size - 4; /*trim zeroes for HCLEN. HLIT and HDIST were already trimmed at tree creation*/ - while(!bitlen_cl.data[HCLEN + 4 - 1] && HCLEN > 0) HCLEN--; + while(!bitlen_cl.data[HCLEN + 4 - 1] && HCLEN > 0) --HCLEN; addBitsToStream(bp, out, HLIT, 5); addBitsToStream(bp, out, HDIST, 5); addBitsToStream(bp, out, HCLEN, 4); /*write the code lenghts of the code length alphabet*/ - for(i = 0; i < HCLEN + 4; i++) addBitsToStream(bp, out, bitlen_cl.data[i], 3); + for(i = 0; i != HCLEN + 4; ++i) addBitsToStream(bp, out, bitlen_cl.data[i], 3); /*write the lenghts of the lit/len AND the dist alphabet*/ - for(i = 0; i < bitlen_lld_e.size; i++) + for(i = 0; i != bitlen_lld_e.size; ++i) { addHuffmanSymbol(bp, out, HuffmanTree_getCode(&tree_cl, bitlen_lld_e.data[i]), HuffmanTree_getLength(&tree_cl, bitlen_lld_e.data[i])); @@ -1916,7 +1947,7 @@ static unsigned deflateDynamic(ucvector* out, size_t* bp, Hash* hash, static unsigned deflateFixed(ucvector* out, size_t* bp, Hash* hash, const unsigned char* data, size_t datapos, size_t dataend, - const LodePNGCompressSettings* settings, int final) + const LodePNGCompressSettings* settings, unsigned final) { HuffmanTree tree_ll; /*tree for literal values and length codes*/ HuffmanTree tree_d; /*tree for distance codes*/ @@ -1946,7 +1977,7 @@ static unsigned deflateFixed(ucvector* out, size_t* bp, Hash* hash, } else /*no LZ77, but still will be Huffman compressed*/ { - for(i = datapos; i < dataend; i++) + for(i = datapos; i < dataend; ++i) { addHuffmanSymbol(bp, out, HuffmanTree_getCode(&tree_ll, data[i]), HuffmanTree_getLength(&tree_ll, data[i])); } @@ -1984,9 +2015,9 @@ static unsigned lodepng_deflatev(ucvector* out, const unsigned char* in, size_t error = hash_init(&hash, settings->windowsize); if(error) return error; - for(i = 0; i < numdeflateblocks && !error; i++) + for(i = 0; i != numdeflateblocks && !error; ++i) { - int final = i == numdeflateblocks - 1; + unsigned final = (i == numdeflateblocks - 1); size_t start = i * blocksize; size_t end = start + blocksize; if(end > insize) end = insize; @@ -2047,7 +2078,7 @@ static unsigned update_adler32(unsigned adler, const unsigned char* data, unsign { s1 += (*data++); s2 += s1; - amount--; + --amount; } s1 %= 65521; s2 %= 65521; @@ -2141,7 +2172,6 @@ unsigned lodepng_zlib_compress(unsigned char** out, size_t* outsize, const unsig unsigned char* deflatedata = 0; size_t deflatesize = 0; - unsigned ADLER32; /*zlib data: 1 byte CMF (CM+CINFO), 1 byte FLG, deflate data, 4 byte ADLER32 checksum of the Decompressed data*/ unsigned CMF = 120; /*0b01111000: CM 8, CINFO 7. With CINFO 7, any window size up to 32768 can be used.*/ unsigned FLEVEL = 0; @@ -2160,8 +2190,8 @@ unsigned lodepng_zlib_compress(unsigned char** out, size_t* outsize, const unsig if(!error) { - ADLER32 = adler32(in, (unsigned)insize); - for(i = 0; i < deflatesize; i++) ucvector_push_back(&outv, deflatedata[i]); + unsigned ADLER32 = adler32(in, (unsigned)insize); + for(i = 0; i != deflatesize; ++i) ucvector_push_back(&outv, deflatedata[i]); lodepng_free(deflatedata); lodepng_add32bitInt(&outv, ADLER32); } @@ -2305,7 +2335,7 @@ unsigned lodepng_crc32(const unsigned char* buf, size_t len) unsigned c = 0xffffffffL; size_t n; - for(n = 0; n < len; n++) + for(n = 0; n < len; ++n) { c = lodepng_crc32_table[(c ^ buf[n]) & 0xff] ^ (c >> 8); } @@ -2319,7 +2349,7 @@ unsigned lodepng_crc32(const unsigned char* buf, size_t len) static unsigned char readBitFromReversedStream(size_t* bitpointer, const unsigned char* bitstream) { unsigned char result = (unsigned char)((bitstream[(*bitpointer) >> 3] >> (7 - ((*bitpointer) & 0x7))) & 1); - (*bitpointer)++; + ++(*bitpointer); return result; } @@ -2327,7 +2357,7 @@ static unsigned readBitsFromReversedStream(size_t* bitpointer, const unsigned ch { unsigned result = 0; size_t i; - for(i = nbits - 1; i < nbits; i--) + for(i = nbits - 1; i < nbits; --i) { result += (unsigned)readBitFromReversedStream(bitpointer, bitstream) << i; } @@ -2343,7 +2373,7 @@ static void setBitOfReversedStream0(size_t* bitpointer, unsigned char* bitstream /*earlier bit of huffman code is in a lesser significant bit of an earlier byte*/ bitstream[(*bitpointer) >> 3] |= (bit << (7 - ((*bitpointer) & 0x7))); } - (*bitpointer)++; + ++(*bitpointer); } #endif /*LODEPNG_COMPILE_DECODER*/ @@ -2352,7 +2382,7 @@ static void setBitOfReversedStream(size_t* bitpointer, unsigned char* bitstream, /*the current bit in bitstream may be 0 or 1 for this to work*/ if(bit == 0) bitstream[(*bitpointer) >> 3] &= (unsigned char)(~(1 << (7 - ((*bitpointer) & 0x7)))); else bitstream[(*bitpointer) >> 3] |= (1 << (7 - ((*bitpointer) & 0x7))); - (*bitpointer)++; + ++(*bitpointer); } /* ////////////////////////////////////////////////////////////////////////// */ @@ -2367,7 +2397,7 @@ unsigned lodepng_chunk_length(const unsigned char* chunk) void lodepng_chunk_type(char type[5], const unsigned char* chunk) { unsigned i; - for(i = 0; i < 4; i++) type[i] = chunk[4 + i]; + for(i = 0; i != 4; ++i) type[i] = (char)chunk[4 + i]; type[4] = 0; /*null termination char*/ } @@ -2445,7 +2475,7 @@ unsigned lodepng_chunk_append(unsigned char** out, size_t* outlength, const unsi (*outlength) = new_length; chunk_start = &(*out)[new_length - total_chunk_length]; - for(i = 0; i < total_chunk_length; i++) chunk_start[i] = chunk[i]; + for(i = 0; i != total_chunk_length; ++i) chunk_start[i] = chunk[i]; return 0; } @@ -2467,13 +2497,13 @@ unsigned lodepng_chunk_create(unsigned char** out, size_t* outlength, unsigned l lodepng_set32bitInt(chunk, (unsigned)length); /*2: chunk name (4 letters)*/ - chunk[4] = type[0]; - chunk[5] = type[1]; - chunk[6] = type[2]; - chunk[7] = type[3]; + chunk[4] = (unsigned char)type[0]; + chunk[5] = (unsigned char)type[1]; + chunk[6] = (unsigned char)type[2]; + chunk[7] = (unsigned char)type[3]; /*3: the data*/ - for(i = 0; i < length; i++) chunk[8 + i] = data[i]; + for(i = 0; i != length; ++i) chunk[8 + i] = data[i]; /*4: CRC (of the chunkname characters and the data)*/ lodepng_chunk_generate_crc(chunk); @@ -2545,7 +2575,7 @@ unsigned lodepng_color_mode_copy(LodePNGColorMode* dest, const LodePNGColorMode* { dest->palette = (unsigned char*)lodepng_malloc(1024); if(!dest->palette && source->palettesize) return 83; /*alloc fail*/ - for(i = 0; i < source->palettesize * 4; i++) dest->palette[i] = source->palette[i]; + for(i = 0; i != source->palettesize * 4; ++i) dest->palette[i] = source->palette[i]; } return 0; } @@ -2563,7 +2593,7 @@ static int lodepng_color_mode_equal(const LodePNGColorMode* a, const LodePNGColo if(a->key_b != b->key_b) return 0; } if(a->palettesize != b->palettesize) return 0; - for(i = 0; i < a->palettesize * 4; i++) + for(i = 0; i != a->palettesize * 4; ++i) { if(a->palette[i] != b->palette[i]) return 0; } @@ -2594,7 +2624,7 @@ unsigned lodepng_palette_add(LodePNGColorMode* info, info->palette[4 * info->palettesize + 1] = g; info->palette[4 * info->palettesize + 2] = b; info->palette[4 * info->palettesize + 3] = a; - info->palettesize++; + ++info->palettesize; return 0; } @@ -2627,7 +2657,7 @@ unsigned lodepng_is_palette_type(const LodePNGColorMode* info) unsigned lodepng_has_palette_alpha(const LodePNGColorMode* info) { size_t i; - for(i = 0; i < info->palettesize; i++) + for(i = 0; i != info->palettesize; ++i) { if(info->palette[i * 4 + 3] < 255) return 1; } @@ -2651,19 +2681,30 @@ size_t lodepng_get_raw_size_lct(unsigned w, unsigned h, LodePNGColorType colorty return (w * h * lodepng_get_bpp_lct(colortype, bitdepth) + 7) / 8; } + +#ifdef LODEPNG_COMPILE_PNG +#ifdef LODEPNG_COMPILE_DECODER +/*in an idat chunk, each scanline is a multiple of 8 bits, unlike the lodepng output buffer*/ +static size_t lodepng_get_raw_size_idat(unsigned w, unsigned h, const LodePNGColorMode* color) +{ + return h * ((w * lodepng_get_bpp(color) + 7) / 8); +} +#endif /*LODEPNG_COMPILE_DECODER*/ +#endif /*LODEPNG_COMPILE_PNG*/ + #ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS static void LodePNGUnknownChunks_init(LodePNGInfo* info) { unsigned i; - for(i = 0; i < 3; i++) info->unknown_chunks_data[i] = 0; - for(i = 0; i < 3; i++) info->unknown_chunks_size[i] = 0; + for(i = 0; i != 3; ++i) info->unknown_chunks_data[i] = 0; + for(i = 0; i != 3; ++i) info->unknown_chunks_size[i] = 0; } static void LodePNGUnknownChunks_cleanup(LodePNGInfo* info) { unsigned i; - for(i = 0; i < 3; i++) lodepng_free(info->unknown_chunks_data[i]); + for(i = 0; i != 3; ++i) lodepng_free(info->unknown_chunks_data[i]); } static unsigned LodePNGUnknownChunks_copy(LodePNGInfo* dest, const LodePNGInfo* src) @@ -2672,13 +2713,13 @@ static unsigned LodePNGUnknownChunks_copy(LodePNGInfo* dest, const LodePNGInfo* LodePNGUnknownChunks_cleanup(dest); - for(i = 0; i < 3; i++) + for(i = 0; i != 3; ++i) { size_t j; dest->unknown_chunks_size[i] = src->unknown_chunks_size[i]; dest->unknown_chunks_data[i] = (unsigned char*)lodepng_malloc(src->unknown_chunks_size[i]); if(!dest->unknown_chunks_data[i] && dest->unknown_chunks_size[i]) return 83; /*alloc fail*/ - for(j = 0; j < src->unknown_chunks_size[i]; j++) + for(j = 0; j < src->unknown_chunks_size[i]; ++j) { dest->unknown_chunks_data[i][j] = src->unknown_chunks_data[i][j]; } @@ -2699,7 +2740,7 @@ static void LodePNGText_init(LodePNGInfo* info) static void LodePNGText_cleanup(LodePNGInfo* info) { size_t i; - for(i = 0; i < info->text_num; i++) + for(i = 0; i != info->text_num; ++i) { string_cleanup(&info->text_keys[i]); string_cleanup(&info->text_strings[i]); @@ -2714,7 +2755,7 @@ static unsigned LodePNGText_copy(LodePNGInfo* dest, const LodePNGInfo* source) dest->text_keys = 0; dest->text_strings = 0; dest->text_num = 0; - for(i = 0; i < source->text_num; i++) + for(i = 0; i != source->text_num; ++i) { CERROR_TRY_RETURN(lodepng_add_text(dest, source->text_keys[i], source->text_strings[i])); } @@ -2737,7 +2778,7 @@ unsigned lodepng_add_text(LodePNGInfo* info, const char* key, const char* str) return 83; /*alloc fail*/ } - info->text_num++; + ++info->text_num; info->text_keys = new_keys; info->text_strings = new_strings; @@ -2764,7 +2805,7 @@ static void LodePNGIText_init(LodePNGInfo* info) static void LodePNGIText_cleanup(LodePNGInfo* info) { size_t i; - for(i = 0; i < info->itext_num; i++) + for(i = 0; i != info->itext_num; ++i) { string_cleanup(&info->itext_keys[i]); string_cleanup(&info->itext_langtags[i]); @@ -2785,7 +2826,7 @@ static unsigned LodePNGIText_copy(LodePNGInfo* dest, const LodePNGInfo* source) dest->itext_transkeys = 0; dest->itext_strings = 0; dest->itext_num = 0; - for(i = 0; i < source->itext_num; i++) + for(i = 0; i != source->itext_num; ++i) { CERROR_TRY_RETURN(lodepng_add_itext(dest, source->itext_keys[i], source->itext_langtags[i], source->itext_transkeys[i], source->itext_strings[i])); @@ -2814,7 +2855,7 @@ unsigned lodepng_add_itext(LodePNGInfo* info, const char* key, const char* langt return 83; /*alloc fail*/ } - info->itext_num++; + ++info->itext_num; info->itext_keys = new_keys; info->itext_langtags = new_langtags; info->itext_transkeys = new_transkeys; @@ -2899,7 +2940,7 @@ static void addColorBits(unsigned char* out, size_t index, unsigned bits, unsign unsigned m = bits == 1 ? 7 : bits == 2 ? 3 : 1; /*8 / bits - 1*/ /*p = the partial index in the byte, e.g. with 4 palettebits it is 0 for first half or 1 for second half*/ unsigned p = index & m; - in &= (1 << bits) - 1; /*filter out any other bits of the input value*/ + in &= (1u << bits) - 1u; /*filter out any other bits of the input value*/ in = in << (bits * (m - p)); if(p == 0) out[index * bits / 8] = in; else out[index * bits / 8] |= in; @@ -2922,14 +2963,14 @@ struct ColorTree static void color_tree_init(ColorTree* tree) { int i; - for(i = 0; i < 16; i++) tree->children[i] = 0; + for(i = 0; i != 16; ++i) tree->children[i] = 0; tree->index = -1; } static void color_tree_cleanup(ColorTree* tree) { int i; - for(i = 0; i < 16; i++) + for(i = 0; i != 16; ++i) { if(tree->children[i]) { @@ -2943,7 +2984,7 @@ static void color_tree_cleanup(ColorTree* tree) static int color_tree_get(ColorTree* tree, unsigned char r, unsigned char g, unsigned char b, unsigned char a) { int bit = 0; - for(bit = 0; bit < 8; bit++) + for(bit = 0; bit < 8; ++bit) { int i = 8 * ((r >> bit) & 1) + 4 * ((g >> bit) & 1) + 2 * ((b >> bit) & 1) + 1 * ((a >> bit) & 1); if(!tree->children[i]) return -1; @@ -2962,10 +3003,10 @@ static int color_tree_has(ColorTree* tree, unsigned char r, unsigned char g, uns /*color is not allowed to already exist. Index should be >= 0 (it's signed to be compatible with using -1 for "doesn't exist")*/ static void color_tree_add(ColorTree* tree, - unsigned char r, unsigned char g, unsigned char b, unsigned char a, int index) + unsigned char r, unsigned char g, unsigned char b, unsigned char a, unsigned index) { int bit; - for(bit = 0; bit < 8; bit++) + for(bit = 0; bit < 8; ++bit) { int i = 8 * ((r >> bit) & 1) + 4 * ((g >> bit) & 1) + 2 * ((b >> bit) & 1) + 1 * ((a >> bit) & 1); if(!tree->children[i]) @@ -2975,7 +3016,7 @@ static void color_tree_add(ColorTree* tree, } tree = tree->children[i]; } - tree->index = index; + tree->index = (int)index; } /*put a pixel, given its RGBA color, into image of any color type*/ @@ -3015,7 +3056,7 @@ static unsigned rgba8ToPixel(unsigned char* out, size_t i, int index = color_tree_get(tree, r, g, b, a); if(index < 0) return 82; /*color not in palette*/ if(mode->bitdepth == 8) out[i] = index; - else addColorBits(out, i, mode->bitdepth, index); + else addColorBits(out, i, mode->bitdepth, (unsigned)index); } else if(mode->colortype == LCT_GREY_ALPHA) { @@ -3053,11 +3094,10 @@ static unsigned rgba8ToPixel(unsigned char* out, size_t i, } /*put a pixel, given its RGBA16 color, into image of any color 16-bitdepth type*/ -static unsigned rgba16ToPixel(unsigned char* out, size_t i, - const LodePNGColorMode* mode, - unsigned short r, unsigned short g, unsigned short b, unsigned short a) +static void rgba16ToPixel(unsigned char* out, size_t i, + const LodePNGColorMode* mode, + unsigned short r, unsigned short g, unsigned short b, unsigned short a) { - if(mode->bitdepth != 16) return 85; /*must be 16 for this function*/ if(mode->colortype == LCT_GREY) { unsigned short grey = r; /*((unsigned)r + g + b) / 3*/; @@ -3092,16 +3132,13 @@ static unsigned rgba16ToPixel(unsigned char* out, size_t i, out[i * 8 + 6] = (a >> 8) & 255; out[i * 8 + 7] = a & 255; } - - return 0; /*no error*/ } /*Get RGBA8 color of pixel with index i (y * width + x) from the raw image with given color type.*/ -static unsigned getPixelColorRGBA8(unsigned char* r, unsigned char* g, - unsigned char* b, unsigned char* a, - const unsigned char* in, size_t i, - const LodePNGColorMode* mode, - unsigned fix_png) +static void getPixelColorRGBA8(unsigned char* r, unsigned char* g, + unsigned char* b, unsigned char* a, + const unsigned char* in, size_t i, + const LodePNGColorMode* mode) { if(mode->colortype == LCT_GREY) { @@ -3158,8 +3195,8 @@ static unsigned getPixelColorRGBA8(unsigned char* r, unsigned char* g, if(index >= mode->palettesize) { - /*This is an error according to the PNG spec, but fix_png can ignore it*/ - if(!fix_png) return (mode->bitdepth == 8 ? 46 : 47); /*index out of palette*/ + /*This is an error according to the PNG spec, but common PNG decoders make it black instead. + Done here too, slightly faster due to no error handling needed.*/ *r = *g = *b = 0; *a = 255; } @@ -3201,8 +3238,6 @@ static unsigned getPixelColorRGBA8(unsigned char* r, unsigned char* g, *a = in[i * 8 + 6]; } } - - return 0; /*no error*/ } /*Similar to getPixelColorRGBA8, but with all the for loops inside of the color @@ -3210,10 +3245,9 @@ mode test cases, optimized to convert the colors much faster, when converting to RGBA or RGB with 8 bit per cannel. buffer must be RGBA or RGB output with enough memory, if has_alpha is true the output is RGBA. mode has the color mode of the input buffer.*/ -static unsigned getPixelColorsRGBA8(unsigned char* buffer, size_t numpixels, - unsigned has_alpha, const unsigned char* in, - const LodePNGColorMode* mode, - unsigned fix_png) +static void getPixelColorsRGBA8(unsigned char* buffer, size_t numpixels, + unsigned has_alpha, const unsigned char* in, + const LodePNGColorMode* mode) { unsigned num_channels = has_alpha ? 4 : 3; size_t i; @@ -3221,7 +3255,7 @@ static unsigned getPixelColorsRGBA8(unsigned char* buffer, size_t numpixels, { if(mode->bitdepth == 8) { - for(i = 0; i < numpixels; i++, buffer += num_channels) + for(i = 0; i != numpixels; ++i, buffer += num_channels) { buffer[0] = buffer[1] = buffer[2] = in[i]; if(has_alpha) buffer[3] = mode->key_defined && in[i] == mode->key_r ? 0 : 255; @@ -3229,7 +3263,7 @@ static unsigned getPixelColorsRGBA8(unsigned char* buffer, size_t numpixels, } else if(mode->bitdepth == 16) { - for(i = 0; i < numpixels; i++, buffer += num_channels) + for(i = 0; i != numpixels; ++i, buffer += num_channels) { buffer[0] = buffer[1] = buffer[2] = in[i * 2]; if(has_alpha) buffer[3] = mode->key_defined && 256U * in[i * 2 + 0] + in[i * 2 + 1] == mode->key_r ? 0 : 255; @@ -3239,7 +3273,7 @@ static unsigned getPixelColorsRGBA8(unsigned char* buffer, size_t numpixels, { unsigned highest = ((1U << mode->bitdepth) - 1U); /*highest possible value for this bit depth*/ size_t j = 0; - for(i = 0; i < numpixels; i++, buffer += num_channels) + for(i = 0; i != numpixels; ++i, buffer += num_channels) { unsigned value = readBitsFromReversedStream(&j, in, mode->bitdepth); buffer[0] = buffer[1] = buffer[2] = (value * 255) / highest; @@ -3251,7 +3285,7 @@ static unsigned getPixelColorsRGBA8(unsigned char* buffer, size_t numpixels, { if(mode->bitdepth == 8) { - for(i = 0; i < numpixels; i++, buffer += num_channels) + for(i = 0; i != numpixels; ++i, buffer += num_channels) { buffer[0] = in[i * 3 + 0]; buffer[1] = in[i * 3 + 1]; @@ -3262,7 +3296,7 @@ static unsigned getPixelColorsRGBA8(unsigned char* buffer, size_t numpixels, } else { - for(i = 0; i < numpixels; i++, buffer += num_channels) + for(i = 0; i != numpixels; ++i, buffer += num_channels) { buffer[0] = in[i * 6 + 0]; buffer[1] = in[i * 6 + 2]; @@ -3278,15 +3312,15 @@ static unsigned getPixelColorsRGBA8(unsigned char* buffer, size_t numpixels, { unsigned index; size_t j = 0; - for(i = 0; i < numpixels; i++, buffer += num_channels) + for(i = 0; i != numpixels; ++i, buffer += num_channels) { if(mode->bitdepth == 8) index = in[i]; else index = readBitsFromReversedStream(&j, in, mode->bitdepth); if(index >= mode->palettesize) { - /*This is an error according to the PNG spec, but fix_png can ignore it*/ - if(!fix_png) return (mode->bitdepth == 8 ? 46 : 47); /*index out of palette*/ + /*This is an error according to the PNG spec, but most PNG decoders make it black instead. + Done here too, slightly faster due to no error handling needed.*/ buffer[0] = buffer[1] = buffer[2] = 0; if(has_alpha) buffer[3] = 255; } @@ -3303,7 +3337,7 @@ static unsigned getPixelColorsRGBA8(unsigned char* buffer, size_t numpixels, { if(mode->bitdepth == 8) { - for(i = 0; i < numpixels; i++, buffer += num_channels) + for(i = 0; i != numpixels; ++i, buffer += num_channels) { buffer[0] = buffer[1] = buffer[2] = in[i * 2 + 0]; if(has_alpha) buffer[3] = in[i * 2 + 1]; @@ -3311,7 +3345,7 @@ static unsigned getPixelColorsRGBA8(unsigned char* buffer, size_t numpixels, } else { - for(i = 0; i < numpixels; i++, buffer += num_channels) + for(i = 0; i != numpixels; ++i, buffer += num_channels) { buffer[0] = buffer[1] = buffer[2] = in[i * 4 + 0]; if(has_alpha) buffer[3] = in[i * 4 + 2]; @@ -3322,7 +3356,7 @@ static unsigned getPixelColorsRGBA8(unsigned char* buffer, size_t numpixels, { if(mode->bitdepth == 8) { - for(i = 0; i < numpixels; i++, buffer += num_channels) + for(i = 0; i != numpixels; ++i, buffer += num_channels) { buffer[0] = in[i * 4 + 0]; buffer[1] = in[i * 4 + 1]; @@ -3332,7 +3366,7 @@ static unsigned getPixelColorsRGBA8(unsigned char* buffer, size_t numpixels, } else { - for(i = 0; i < numpixels; i++, buffer += num_channels) + for(i = 0; i != numpixels; ++i, buffer += num_channels) { buffer[0] = in[i * 8 + 0]; buffer[1] = in[i * 8 + 2]; @@ -3341,17 +3375,13 @@ static unsigned getPixelColorsRGBA8(unsigned char* buffer, size_t numpixels, } } } - - return 0; /*no error*/ } /*Get RGBA16 color of pixel with index i (y * width + x) from the raw image with given color type, but the given color type must be 16-bit itself.*/ -static unsigned getPixelColorRGBA16(unsigned short* r, unsigned short* g, unsigned short* b, unsigned short* a, - const unsigned char* in, size_t i, const LodePNGColorMode* mode) +static void getPixelColorRGBA16(unsigned short* r, unsigned short* g, unsigned short* b, unsigned short* a, + const unsigned char* in, size_t i, const LodePNGColorMode* mode) { - if(mode->bitdepth != 16) return 85; /*error: this function only supports 16-bit input*/ - if(mode->colortype == LCT_GREY) { *r = *g = *b = 256 * in[i * 2 + 0] + in[i * 2 + 1]; @@ -3380,21 +3410,12 @@ static unsigned getPixelColorRGBA16(unsigned short* r, unsigned short* g, unsign *b = 256 * in[i * 8 + 4] + in[i * 8 + 5]; *a = 256 * in[i * 8 + 6] + in[i * 8 + 7]; } - else return 85; /*error: this function only supports 16-bit input, not palettes*/ - - return 0; /*no error*/ } -/* -converts from any color type to 24-bit or 32-bit (later maybe more supported). return value = LodePNG error code -the out buffer must have (w * h * bpp + 7) / 8 bytes, where bpp is the bits per pixel of the output color type -(lodepng_get_bpp) for < 8 bpp images, there may _not_ be padding bits at the end of scanlines. -*/ unsigned lodepng_convert(unsigned char* out, const unsigned char* in, LodePNGColorMode* mode_out, const LodePNGColorMode* mode_in, - unsigned w, unsigned h, unsigned fix_png) + unsigned w, unsigned h) { - unsigned error = 0; size_t i; ColorTree tree; size_t numpixels = w * h; @@ -3402,16 +3423,16 @@ unsigned lodepng_convert(unsigned char* out, const unsigned char* in, if(lodepng_color_mode_equal(mode_out, mode_in)) { size_t numbytes = lodepng_get_raw_size(w, h, mode_in); - for(i = 0; i < numbytes; i++) out[i] = in[i]; - return error; + for(i = 0; i != numbytes; ++i) out[i] = in[i]; + return 0; } if(mode_out->colortype == LCT_PALETTE) { - size_t palsize = 1 << mode_out->bitdepth; + size_t palsize = 1u << mode_out->bitdepth; if(mode_out->palettesize < palsize) palsize = mode_out->palettesize; color_tree_init(&tree); - for(i = 0; i < palsize; i++) + for(i = 0; i != palsize; ++i) { unsigned char* p = &mode_out->palette[i * 4]; color_tree_add(&tree, p[0], p[1], p[2], p[3], i); @@ -3420,32 +3441,28 @@ unsigned lodepng_convert(unsigned char* out, const unsigned char* in, if(mode_in->bitdepth == 16 && mode_out->bitdepth == 16) { - for(i = 0; i < numpixels; i++) + for(i = 0; i != numpixels; ++i) { unsigned short r = 0, g = 0, b = 0, a = 0; - error = getPixelColorRGBA16(&r, &g, &b, &a, in, i, mode_in); - if(error) break; - error = rgba16ToPixel(out, i, mode_out, r, g, b, a); - if(error) break; + getPixelColorRGBA16(&r, &g, &b, &a, in, i, mode_in); + rgba16ToPixel(out, i, mode_out, r, g, b, a); } } else if(mode_out->bitdepth == 8 && mode_out->colortype == LCT_RGBA) { - error = getPixelColorsRGBA8(out, numpixels, 1, in, mode_in, fix_png); + getPixelColorsRGBA8(out, numpixels, 1, in, mode_in); } else if(mode_out->bitdepth == 8 && mode_out->colortype == LCT_RGB) { - error = getPixelColorsRGBA8(out, numpixels, 0, in, mode_in, fix_png); + getPixelColorsRGBA8(out, numpixels, 0, in, mode_in); } else { unsigned char r = 0, g = 0, b = 0, a = 0; - for(i = 0; i < numpixels; i++) + for(i = 0; i != numpixels; ++i) { - error = getPixelColorRGBA8(&r, &g, &b, &a, in, i, mode_in, fix_png); - if(error) break; - error = rgba8ToPixel(out, i, mode_out, &tree, r, g, b, a); - if(error) break; + getPixelColorRGBA8(&r, &g, &b, &a, in, i, mode_in); + rgba8ToPixel(out, i, mode_out, &tree, r, g, b, a); } } @@ -3454,93 +3471,36 @@ unsigned lodepng_convert(unsigned char* out, const unsigned char* in, color_tree_cleanup(&tree); } - return error; + return 0; /*no error (this function currently never has one, but maybe OOM detection added later.)*/ } #ifdef LODEPNG_COMPILE_ENCODER -typedef struct ColorProfile +void lodepng_color_profile_init(LodePNGColorProfile* profile) { - unsigned char sixteenbit; /*needs more than 8 bits per channel*/ - unsigned char sixteenbit_done; - - - unsigned char colored; /*not greyscale*/ - unsigned char colored_done; - - unsigned char key; /*a color key is required, or more*/ - unsigned short key_r; /*these values are always in 16-bit bitdepth in the profile*/ - unsigned short key_g; - unsigned short key_b; - unsigned char alpha; /*alpha channel, or alpha palette, required*/ - unsigned char alpha_done; - - unsigned numcolors; - ColorTree tree; /*for listing the counted colors, up to 256*/ - unsigned char* palette; /*size 1024. Remember up to the first 256 RGBA colors*/ - unsigned maxnumcolors; /*if more than that amount counted*/ - unsigned char numcolors_done; - - unsigned greybits; /*amount of bits required for greyscale (1, 2, 4, 8). Does not take 16 bit into account.*/ - unsigned char greybits_done; - -} ColorProfile; - -static void color_profile_init(ColorProfile* profile, const LodePNGColorMode* mode) -{ - profile->sixteenbit = 0; - profile->sixteenbit_done = mode->bitdepth == 16 ? 0 : 1; - profile->colored = 0; - profile->colored_done = lodepng_is_greyscale_type(mode) ? 1 : 0; - profile->key = 0; profile->alpha = 0; - profile->alpha_done = lodepng_can_have_alpha(mode) ? 0 : 1; - + profile->key_r = profile->key_g = profile->key_b = 0; profile->numcolors = 0; - color_tree_init(&profile->tree); - profile->palette = (unsigned char*)lodepng_malloc(1024); - profile->maxnumcolors = 257; - if(lodepng_get_bpp(mode) <= 8) - { - int bpp = lodepng_get_bpp(mode); - profile->maxnumcolors = bpp == 1 ? 2 : (bpp == 2 ? 4 : (bpp == 4 ? 16 : 256)); - } - profile->numcolors_done = 0; - - profile->greybits = 1; - profile->greybits_done = lodepng_get_bpp(mode) == 1 ? 1 : 0; -} - -static void color_profile_cleanup(ColorProfile* profile) -{ - color_tree_cleanup(&profile->tree); - lodepng_free(profile->palette); + profile->bits = 1; } /*function used for debug purposes with C++*/ -/*void printColorProfile(ColorProfile* p) +/*void printColorProfile(LodePNGColorProfile* p) { - std::cout << "sixteenbit: " << (int)p->sixteenbit << std::endl; - std::cout << "sixteenbit_done: " << (int)p->sixteenbit_done << std::endl; - std::cout << "colored: " << (int)p->colored << std::endl; - std::cout << "colored_done: " << (int)p->colored_done << std::endl; - std::cout << "key: " << (int)p->key << std::endl; - std::cout << "key_r: " << (int)p->key_r << std::endl; - std::cout << "key_g: " << (int)p->key_g << std::endl; - std::cout << "key_b: " << (int)p->key_b << std::endl; - std::cout << "alpha: " << (int)p->alpha << std::endl; - std::cout << "alpha_done: " << (int)p->alpha_done << std::endl; - std::cout << "numcolors: " << (int)p->numcolors << std::endl; - std::cout << "maxnumcolors: " << (int)p->maxnumcolors << std::endl; - std::cout << "numcolors_done: " << (int)p->numcolors_done << std::endl; - std::cout << "greybits: " << (int)p->greybits << std::endl; - std::cout << "greybits_done: " << (int)p->greybits_done << std::endl; + std::cout << "colored: " << (int)p->colored << ", "; + std::cout << "key: " << (int)p->key << ", "; + std::cout << "key_r: " << (int)p->key_r << ", "; + std::cout << "key_g: " << (int)p->key_g << ", "; + std::cout << "key_b: " << (int)p->key_b << ", "; + std::cout << "alpha: " << (int)p->alpha << ", "; + std::cout << "numcolors: " << (int)p->numcolors << ", "; + std::cout << "bits: " << (int)p->bits << std::endl; }*/ /*Returns how many bits needed to represent given value (max 8 bit)*/ -unsigned getValueRequiredBits(unsigned short value) +static unsigned getValueRequiredBits(unsigned char value) { if(value == 0 || value == 255) return 1; /*The scaling of 2-bit and 4-bit values uses multiples of 85 and 17*/ @@ -3550,324 +3510,228 @@ unsigned getValueRequiredBits(unsigned short value) /*profile must already have been inited with mode. It's ok to set some parameters of profile to done already.*/ -static unsigned get_color_profile(ColorProfile* profile, - const unsigned char* in, - size_t numpixels /*must be full image size, for certain filesize based choices*/, - const LodePNGColorMode* mode, - unsigned fix_png) +unsigned lodepng_get_color_profile(LodePNGColorProfile* profile, + const unsigned char* in, unsigned w, unsigned h, + const LodePNGColorMode* mode) { unsigned error = 0; size_t i; + ColorTree tree; + size_t numpixels = w * h; + unsigned colored_done = lodepng_is_greyscale_type(mode) ? 1 : 0; + unsigned alpha_done = lodepng_can_have_alpha(mode) ? 0 : 1; + unsigned numcolors_done = 0; + unsigned bpp = lodepng_get_bpp(mode); + unsigned bits_done = bpp == 1 ? 1 : 0; + unsigned maxnumcolors = 257; + unsigned sixteen = 0; + if(bpp <= 8) maxnumcolors = bpp == 1 ? 2 : (bpp == 2 ? 4 : (bpp == 4 ? 16 : 256)); + + color_tree_init(&tree); + + /*Check if the 16-bit input is truly 16-bit*/ if(mode->bitdepth == 16) { - for(i = 0; i < numpixels; i++) + unsigned short r, g, b, a; + for(i = 0; i != numpixels; ++i) { - unsigned short r, g, b, a; - error = getPixelColorRGBA16(&r, &g, &b, &a, in, i, mode); - if(error) break; - - /*a color is considered good for 8-bit if the first byte and the second byte are equal, - (so if it's divisible through 257), NOT necessarily if the second byte is 0*/ - if(!profile->sixteenbit_done - && (((r & 255) != ((r >> 8) & 255)) - || ((g & 255) != ((g >> 8) & 255)) - || ((b & 255) != ((b >> 8) & 255)))) - { - profile->sixteenbit = 1; - profile->sixteenbit_done = 1; - profile->greybits_done = 1; /*greybits is not applicable anymore at 16-bit*/ - profile->numcolors_done = 1; /*counting colors no longer useful, palette doesn't support 16-bit*/ - } - - if(!profile->colored_done && (r != g || r != b)) - { - profile->colored = 1; - profile->colored_done = 1; - profile->greybits_done = 1; /*greybits is not applicable anymore*/ - } - - if(!profile->alpha_done && a != 65535) - { - /*only use color key if numpixels large enough to justify tRNS chunk size*/ - if(a == 0 && numpixels > 16 && !(profile->key && (r != profile->key_r || g != profile->key_g || b != profile->key_b))) - { - if(!profile->alpha && !profile->key) - { - profile->key = 1; - profile->key_r = r; - profile->key_g = g; - profile->key_b = b; - } - } - else - { - profile->alpha = 1; - profile->alpha_done = 1; - profile->greybits_done = 1; /*greybits is not applicable anymore*/ - } - } - - /* Color key cannot be used if an opaque pixel also has that RGB color. */ - if(!profile->alpha_done && a == 65535 && profile->key - && r == profile->key_r && g == profile->key_g && b == profile->key_b) - { - profile->alpha = 1; - profile->alpha_done = 1; - profile->greybits_done = 1; /*greybits is not applicable anymore*/ - } - - if(!profile->greybits_done) - { - /*assuming 8-bit r, this test does not care about 16-bit*/ - unsigned bits = getValueRequiredBits(r); - if(bits > profile->greybits) profile->greybits = bits; - if(profile->greybits >= 8) profile->greybits_done = 1; - } - - if(!profile->numcolors_done) - { - /*assuming 8-bit rgba, this test does not care about 16-bit*/ - if(!color_tree_has(&profile->tree, (unsigned char)r, (unsigned char)g, (unsigned char)b, (unsigned char)a)) - { - color_tree_add(&profile->tree, (unsigned char)r, (unsigned char)g, (unsigned char)b, (unsigned char)a, - profile->numcolors); - if(profile->numcolors < 256) - { - unsigned char* p = profile->palette; - unsigned i = profile->numcolors; - p[i * 4 + 0] = (unsigned char)r; - p[i * 4 + 1] = (unsigned char)g; - p[i * 4 + 2] = (unsigned char)b; - p[i * 4 + 3] = (unsigned char)a; - } - profile->numcolors++; - if(profile->numcolors >= profile->maxnumcolors) profile->numcolors_done = 1; - } - } - - if(profile->alpha_done && profile->numcolors_done - && profile->colored_done && profile->sixteenbit_done && profile->greybits_done) + getPixelColorRGBA16(&r, &g, &b, &a, in, i, mode); + if((r & 255) != ((r >> 8) & 255) || (g & 255) != ((g >> 8) & 255) || + (b & 255) != ((b >> 8) & 255) || (a & 255) != ((a >> 8) & 255)) /*first and second byte differ*/ { + sixteen = 1; break; } - }; + } + } + + if(sixteen) + { + unsigned short r = 0, g = 0, b = 0, a = 0; + profile->bits = 16; + bits_done = numcolors_done = 1; /*counting colors no longer useful, palette doesn't support 16-bit*/ + + for(i = 0; i != numpixels; ++i) + { + getPixelColorRGBA16(&r, &g, &b, &a, in, i, mode); + + if(!colored_done && (r != g || r != b)) + { + profile->colored = 1; + colored_done = 1; + } + + if(!alpha_done) + { + unsigned matchkey = (r == profile->key_r && g == profile->key_g && b == profile->key_b); + if(a != 65535 && (a != 0 || (profile->key && !matchkey))) + { + profile->alpha = 1; + alpha_done = 1; + if(profile->bits < 8) profile->bits = 8; /*PNG has no alphachannel modes with less than 8-bit per channel*/ + } + else if(a == 0 && !profile->alpha && !profile->key) + { + profile->key = 1; + profile->key_r = r; + profile->key_g = g; + profile->key_b = b; + } + else if(a == 65535 && profile->key && matchkey) + { + /* Color key cannot be used if an opaque pixel also has that RGB color. */ + profile->alpha = 1; + alpha_done = 1; + } + } + + if(alpha_done && numcolors_done && colored_done && bits_done) break; + } } else /* < 16-bit */ { - for(i = 0; i < numpixels; i++) + for(i = 0; i != numpixels; ++i) { unsigned char r = 0, g = 0, b = 0, a = 0; - error = getPixelColorRGBA8(&r, &g, &b, &a, in, i, mode, fix_png); - if(error) break; + getPixelColorRGBA8(&r, &g, &b, &a, in, i, mode); - if(!profile->colored_done && (r != g || r != b)) + if(!bits_done && profile->bits < 8) + { + /*only r is checked, < 8 bits is only relevant for greyscale*/ + unsigned bits = getValueRequiredBits(r); + if(bits > profile->bits) profile->bits = bits; + } + bits_done = (profile->bits >= bpp); + + if(!colored_done && (r != g || r != b)) { profile->colored = 1; - profile->colored_done = 1; - profile->greybits_done = 1; /*greybits is not applicable anymore*/ + colored_done = 1; + if(profile->bits < 8) profile->bits = 8; /*PNG has no colored modes with less than 8-bit per channel*/ } - if(!profile->alpha_done && a != 255) + if(!alpha_done) { - if(a == 0 && !(profile->key && (r != profile->key_r || g != profile->key_g || b != profile->key_b))) - { - if(!profile->key) - { - profile->key = 1; - profile->key_r = r; - profile->key_g = g; - profile->key_b = b; - } - } - else + unsigned matchkey = (r == profile->key_r && g == profile->key_g && b == profile->key_b); + if(a != 255 && (a != 0 || (profile->key && !matchkey))) { profile->alpha = 1; - profile->alpha_done = 1; - profile->greybits_done = 1; /*greybits is not applicable anymore*/ + alpha_done = 1; + if(profile->bits < 8) profile->bits = 8; /*PNG has no alphachannel modes with less than 8-bit per channel*/ + } + else if(a == 0 && !profile->alpha && !profile->key) + { + profile->key = 1; + profile->key_r = r; + profile->key_g = g; + profile->key_b = b; + } + else if(a == 255 && profile->key && matchkey) + { + /* Color key cannot be used if an opaque pixel also has that RGB color. */ + profile->alpha = 1; + alpha_done = 1; + if(profile->bits < 8) profile->bits = 8; /*PNG has no alphachannel modes with less than 8-bit per channel*/ } } - /* Color key cannot be used if an opaque pixel also has that RGB color. */ - if(!profile->alpha_done && a == 255 && profile->key - && r == profile->key_r && g == profile->key_g && b == profile->key_b) + if(!numcolors_done) { - profile->alpha = 1; - profile->alpha_done = 1; - profile->greybits_done = 1; /*greybits is not applicable anymore*/ - } - - if(!profile->greybits_done) - { - unsigned bits = getValueRequiredBits(r); - if(bits > profile->greybits) profile->greybits = bits; - if(profile->greybits >= 8) profile->greybits_done = 1; - } - - if(!profile->numcolors_done) - { - if(!color_tree_has(&profile->tree, r, g, b, a)) + if(!color_tree_has(&tree, r, g, b, a)) { - - color_tree_add(&profile->tree, r, g, b, a, profile->numcolors); + color_tree_add(&tree, r, g, b, a, profile->numcolors); if(profile->numcolors < 256) { unsigned char* p = profile->palette; - unsigned i = profile->numcolors; - p[i * 4 + 0] = r; - p[i * 4 + 1] = g; - p[i * 4 + 2] = b; - p[i * 4 + 3] = a; + unsigned n = profile->numcolors; + p[n * 4 + 0] = r; + p[n * 4 + 1] = g; + p[n * 4 + 2] = b; + p[n * 4 + 3] = a; } - profile->numcolors++; - if(profile->numcolors >= profile->maxnumcolors) profile->numcolors_done = 1; + ++profile->numcolors; + numcolors_done = profile->numcolors >= maxnumcolors; } } - if(profile->alpha_done && profile->numcolors_done && profile->colored_done && profile->greybits_done) - { - break; - } - }; - } - - /*make the profile's key always 16-bit for consistency*/ - if(mode->bitdepth < 16) - { - /*repeat each byte twice*/ - profile->key_r *= 257; - profile->key_g *= 257; - profile->key_b *= 257; + if(alpha_done && numcolors_done && colored_done && bits_done) break; + } + + /*make the profile's key always 16-bit for consistency - repeat each byte twice*/ + profile->key_r += (profile->key_r << 8); + profile->key_g += (profile->key_g << 8); + profile->key_b += (profile->key_b << 8); } + color_tree_cleanup(&tree); return error; } -static void setColorKeyFrom16bit(LodePNGColorMode* mode_out, unsigned r, unsigned g, unsigned b, unsigned bitdepth) -{ - unsigned mask = (1 << bitdepth) - 1; - mode_out->key_defined = 1; - mode_out->key_r = r & mask; - mode_out->key_g = g & mask; - mode_out->key_b = b & mask; -} - -/*updates values of mode with a potentially smaller color model. mode_out should +/*Automatically chooses color type that gives smallest amount of bits in the +output image, e.g. grey if there are only greyscale pixels, palette if there +are less than 256 colors, ... +Updates values of mode with a potentially smaller color model. mode_out should contain the user chosen color model, but will be overwritten with the new chosen one.*/ unsigned lodepng_auto_choose_color(LodePNGColorMode* mode_out, const unsigned char* image, unsigned w, unsigned h, - const LodePNGColorMode* mode_in, - LodePNGAutoConvert auto_convert) + const LodePNGColorMode* mode_in) { - ColorProfile profile; + LodePNGColorProfile prof; unsigned error = 0; - int no_nibbles = auto_convert == LAC_AUTO_NO_NIBBLES || auto_convert == LAC_AUTO_NO_NIBBLES_NO_PALETTE; - int no_palette = auto_convert == LAC_AUTO_NO_PALETTE || auto_convert == LAC_AUTO_NO_NIBBLES_NO_PALETTE; + unsigned i, n, palettebits, grey_ok, palette_ok; - if(auto_convert == LAC_ALPHA) - { - if(mode_out->colortype != LCT_RGBA && mode_out->colortype != LCT_GREY_ALPHA) return 0; - } + lodepng_color_profile_init(&prof); + error = lodepng_get_color_profile(&prof, image, w, h, mode_in); + if(error) return error; + mode_out->key_defined = 0; - color_profile_init(&profile, mode_in); - if(auto_convert == LAC_ALPHA) - { - profile.colored_done = 1; - profile.greybits_done = 1; - profile.numcolors_done = 1; - profile.sixteenbit_done = 1; + if(prof.key && w * h <= 16) { + prof.alpha = 1; /*too few pixels to justify tRNS chunk overhead*/ + if(prof.bits < 8) prof.bits = 8; /*PNG has no alphachannel modes with less than 8-bit per channel*/ } - error = get_color_profile(&profile, image, w * h, mode_in, 0 /*fix_png*/); - if(!error && auto_convert == LAC_ALPHA) + grey_ok = !prof.colored && !prof.alpha; /*grey without alpha, with potentially low bits*/ + n = prof.numcolors; + palettebits = n <= 2 ? 1 : (n <= 4 ? 2 : (n <= 16 ? 4 : 8)); + palette_ok = n <= 256 && (n * 2 < w * h) && prof.bits <= 8; + if(w * h < n * 2) palette_ok = 0; /*don't add palette overhead if image has only a few pixels*/ + if(grey_ok && prof.bits <= palettebits) palette_ok = 0; /*grey is less overhead*/ + + if(palette_ok) { - if(!profile.alpha) + unsigned char* p = prof.palette; + lodepng_palette_clear(mode_out); /*remove potential earlier palette*/ + for(i = 0; i != prof.numcolors; ++i) { - mode_out->colortype = (mode_out->colortype == LCT_RGBA ? LCT_RGB : LCT_GREY); - if(profile.key) setColorKeyFrom16bit(mode_out, profile.key_r, profile.key_g, profile.key_b, mode_out->bitdepth); + error = lodepng_palette_add(mode_out, p[i * 4 + 0], p[i * 4 + 1], p[i * 4 + 2], p[i * 4 + 3]); + if(error) break; + } + + mode_out->colortype = LCT_PALETTE; + mode_out->bitdepth = palettebits; + + if(mode_in->colortype == LCT_PALETTE && mode_in->palettesize >= mode_out->palettesize + && mode_in->bitdepth == mode_out->bitdepth) + { + /*If input should have same palette colors, keep original to preserve its order and prevent conversion*/ + lodepng_color_mode_cleanup(mode_out); + lodepng_color_mode_copy(mode_out, mode_in); } } - else if(!error && auto_convert != LAC_ALPHA) + else /*8-bit or 16-bit per channel*/ { - mode_out->key_defined = 0; + mode_out->bitdepth = prof.bits; + mode_out->colortype = prof.alpha ? (prof.colored ? LCT_RGBA : LCT_GREY_ALPHA) + : (prof.colored ? LCT_RGB : LCT_GREY); - if(profile.sixteenbit) + if(prof.key && !prof.alpha) { - mode_out->bitdepth = 16; - if(profile.alpha) - { - mode_out->colortype = profile.colored ? LCT_RGBA : LCT_GREY_ALPHA; - } - else - { - mode_out->colortype = profile.colored ? LCT_RGB : LCT_GREY; - if(profile.key) setColorKeyFrom16bit(mode_out, profile.key_r, profile.key_g, profile.key_b, mode_out->bitdepth); - } + unsigned mask = (1u << mode_out->bitdepth) - 1u; /*profile always uses 16-bit, mask converts it*/ + mode_out->key_r = prof.key_r & mask; + mode_out->key_g = prof.key_g & mask; + mode_out->key_b = prof.key_b & mask; + mode_out->key_defined = 1; } - else /*less than 16 bits per channel*/ - { - /*don't add palette overhead if image hasn't got a lot of pixels*/ - unsigned n = profile.numcolors; - int palette_ok = !no_palette && n <= 256 && (n * 2 < w * h); - unsigned palettebits = n <= 2 ? 1 : (n <= 4 ? 2 : (n <= 16 ? 4 : 8)); - int grey_ok = !profile.colored && !profile.alpha; /*grey without alpha, with potentially low bits*/ - if(palette_ok || grey_ok) - { - if(!palette_ok || (grey_ok && profile.greybits <= palettebits)) - { - unsigned grey = profile.key_r; - mode_out->colortype = LCT_GREY; - mode_out->bitdepth = profile.greybits; - if(profile.key) setColorKeyFrom16bit(mode_out, grey, grey, grey, mode_out->bitdepth); - } - else - { - /*fill in the palette*/ - unsigned i; - unsigned char* p = profile.palette; - /*remove potential earlier palette*/ - lodepng_palette_clear(mode_out); - for(i = 0; i < profile.numcolors; i++) - { - error = lodepng_palette_add(mode_out, p[i * 4 + 0], p[i * 4 + 1], p[i * 4 + 2], p[i * 4 + 3]); - if(error) break; - } - - mode_out->colortype = LCT_PALETTE; - mode_out->bitdepth = palettebits; - } - } - else /*8-bit per channel*/ - { - mode_out->bitdepth = 8; - if(profile.alpha) - { - mode_out->colortype = profile.colored ? LCT_RGBA : LCT_GREY_ALPHA; - } - else - { - mode_out->colortype = profile.colored ? LCT_RGB : LCT_GREY /*LCT_GREY normally won't occur, already done earlier*/; - if(profile.key) setColorKeyFrom16bit(mode_out, profile.key_r, profile.key_g, profile.key_b, mode_out->bitdepth); - } - } - } - } - - color_profile_cleanup(&profile); - - if(mode_out->colortype == LCT_PALETTE && mode_in->palettesize == mode_out->palettesize) - { - /*In this case keep the palette order of the input, so that the user can choose an optimal one*/ - size_t i; - for(i = 0; i < mode_in->palettesize * 4; i++) - { - mode_out->palette[i] = mode_in->palette[i]; - } - } - - if(no_nibbles && mode_out->bitdepth < 8) - { - /*palette can keep its small amount of colors, as long as no indices use it*/ - mode_out->bitdepth = 8; } return error; @@ -3920,7 +3784,7 @@ static void Adam7_getpassvalues(unsigned passw[7], unsigned passh[7], size_t fil unsigned i; /*calculate width and height in pixels of each pass*/ - for(i = 0; i < 7; i++) + for(i = 0; i != 7; ++i) { passw[i] = (w + ADAM7_DX[i] - ADAM7_IX[i] - 1) / ADAM7_DX[i]; passh[i] = (h + ADAM7_DY[i] - ADAM7_IY[i] - 1) / ADAM7_DY[i]; @@ -3929,7 +3793,7 @@ static void Adam7_getpassvalues(unsigned passw[7], unsigned passh[7], size_t fil } filter_passstart[0] = padded_passstart[0] = passstart[0] = 0; - for(i = 0; i < 7; i++) + for(i = 0; i != 7; ++i) { /*if passw[i] is 0, it's 0 bytes, not 1 (no filtertype-byte)*/ filter_passstart[i + 1] = filter_passstart[i] @@ -3956,7 +3820,7 @@ unsigned lodepng_inspect(unsigned* w, unsigned* h, LodePNGState* state, { CERROR_RETURN_ERROR(state->error, 48); /*error: the given data is empty*/ } - if(insize < 29) + if(insize < 33) { CERROR_RETURN_ERROR(state->error, 27); /*error: the data length is smaller than the length of a PNG header*/ } @@ -3984,6 +3848,11 @@ unsigned lodepng_inspect(unsigned* w, unsigned* h, LodePNGState* state, info->filter_method = in[27]; info->interlace_method = in[28]; + if(*w == 0 || *h == 0) + { + CERROR_RETURN_ERROR(state->error, 93); + } + if(!state->decoder.ignore_crc) { unsigned CRC = lodepng_read32bitInt(&in[29]); @@ -4021,53 +3890,53 @@ static unsigned unfilterScanline(unsigned char* recon, const unsigned char* scan switch(filterType) { case 0: - for(i = 0; i < length; i++) recon[i] = scanline[i]; + for(i = 0; i != length; ++i) recon[i] = scanline[i]; break; case 1: - for(i = 0; i < bytewidth; i++) recon[i] = scanline[i]; - for(i = bytewidth; i < length; i++) recon[i] = scanline[i] + recon[i - bytewidth]; + for(i = 0; i != bytewidth; ++i) recon[i] = scanline[i]; + for(i = bytewidth; i < length; ++i) recon[i] = scanline[i] + recon[i - bytewidth]; break; case 2: if(precon) { - for(i = 0; i < length; i++) recon[i] = scanline[i] + precon[i]; + for(i = 0; i != length; ++i) recon[i] = scanline[i] + precon[i]; } else { - for(i = 0; i < length; i++) recon[i] = scanline[i]; + for(i = 0; i != length; ++i) recon[i] = scanline[i]; } break; case 3: if(precon) { - for(i = 0; i < bytewidth; i++) recon[i] = scanline[i] + precon[i] / 2; - for(i = bytewidth; i < length; i++) recon[i] = scanline[i] + ((recon[i - bytewidth] + precon[i]) / 2); + for(i = 0; i != bytewidth; ++i) recon[i] = scanline[i] + precon[i] / 2; + for(i = bytewidth; i < length; ++i) recon[i] = scanline[i] + ((recon[i - bytewidth] + precon[i]) / 2); } else { - for(i = 0; i < bytewidth; i++) recon[i] = scanline[i]; - for(i = bytewidth; i < length; i++) recon[i] = scanline[i] + recon[i - bytewidth] / 2; + for(i = 0; i != bytewidth; ++i) recon[i] = scanline[i]; + for(i = bytewidth; i < length; ++i) recon[i] = scanline[i] + recon[i - bytewidth] / 2; } break; case 4: if(precon) { - for(i = 0; i < bytewidth; i++) + for(i = 0; i != bytewidth; ++i) { recon[i] = (scanline[i] + precon[i]); /*paethPredictor(0, precon[i], 0) is always precon[i]*/ } - for(i = bytewidth; i < length; i++) + for(i = bytewidth; i < length; ++i) { recon[i] = (scanline[i] + paethPredictor(recon[i - bytewidth], precon[i], precon[i - bytewidth])); } } else { - for(i = 0; i < bytewidth; i++) + for(i = 0; i != bytewidth; ++i) { recon[i] = scanline[i]; } - for(i = bytewidth; i < length; i++) + for(i = bytewidth; i < length; ++i) { /*paethPredictor(recon[i - bytewidth], 0, 0) is always recon[i - bytewidth]*/ recon[i] = (scanline[i] + recon[i - bytewidth]); @@ -4096,7 +3965,7 @@ static unsigned unfilter(unsigned char* out, const unsigned char* in, unsigned w size_t bytewidth = (bpp + 7) / 8; size_t linebytes = (w * bpp + 7) / 8; - for(y = 0; y < h; y++) + for(y = 0; y < h; ++y) { size_t outindex = linebytes * y; size_t inindex = (1 + linebytes) * y; /*the extra filterbyte added to each row*/ @@ -4131,16 +4000,16 @@ static void Adam7_deinterlace(unsigned char* out, const unsigned char* in, unsig if(bpp >= 8) { - for(i = 0; i < 7; i++) + for(i = 0; i != 7; ++i) { unsigned x, y, b; size_t bytewidth = bpp / 8; - for(y = 0; y < passh[i]; y++) - for(x = 0; x < passw[i]; x++) + for(y = 0; y < passh[i]; ++y) + for(x = 0; x < passw[i]; ++x) { size_t pixelinstart = passstart[i] + (y * passw[i] + x) * bytewidth; size_t pixeloutstart = ((ADAM7_IY[i] + y * ADAM7_DY[i]) * w + ADAM7_IX[i] + x * ADAM7_DX[i]) * bytewidth; - for(b = 0; b < bytewidth; b++) + for(b = 0; b < bytewidth; ++b) { out[pixeloutstart + b] = in[pixelinstart + b]; } @@ -4149,18 +4018,18 @@ static void Adam7_deinterlace(unsigned char* out, const unsigned char* in, unsig } else /*bpp < 8: Adam7 with pixels < 8 bit is a bit trickier: with bit pointers*/ { - for(i = 0; i < 7; i++) + for(i = 0; i != 7; ++i) { unsigned x, y, b; unsigned ilinebits = bpp * passw[i]; unsigned olinebits = bpp * w; size_t obp, ibp; /*bit pointers (for out and in buffer)*/ - for(y = 0; y < passh[i]; y++) - for(x = 0; x < passw[i]; x++) + for(y = 0; y < passh[i]; ++y) + for(x = 0; x < passw[i]; ++x) { ibp = (8 * passstart[i]) + (y * ilinebits + x * bpp); obp = (ADAM7_IY[i] + y * ADAM7_DY[i]) * olinebits + (ADAM7_IX[i] + x * ADAM7_DX[i]) * bpp; - for(b = 0; b < bpp; b++) + for(b = 0; b < bpp; ++b) { unsigned char bit = readBitFromReversedStream(&ibp, in); /*note that this function assumes the out buffer is completely 0, use setBitOfReversedStream otherwise*/ @@ -4186,10 +4055,10 @@ static void removePaddingBits(unsigned char* out, const unsigned char* in, unsigned y; size_t diff = ilinebits - olinebits; size_t ibp = 0, obp = 0; /*input and output bit pointers*/ - for(y = 0; y < h; y++) + for(y = 0; y < h; ++y) { size_t x; - for(x = 0; x < olinebits; x++) + for(x = 0; x < olinebits; ++x) { unsigned char bit = readBitFromReversedStream(&ibp, in); setBitOfReversedStream(&obp, out, bit); @@ -4231,7 +4100,7 @@ static unsigned postProcessScanlines(unsigned char* out, unsigned char* in, Adam7_getpassvalues(passw, passh, filter_passstart, padded_passstart, passstart, w, h, bpp); - for(i = 0; i < 7; i++) + for(i = 0; i != 7; ++i) { CERROR_TRY_RETURN(unfilter(&in[padded_passstart[i]], &in[filter_passstart[i]], passw[i], passh[i], bpp)); /*TODO: possible efficiency improvement: if in this reduced image the bits fit nicely in 1 scanline, @@ -4264,7 +4133,7 @@ static unsigned readChunk_PLTE(LodePNGColorMode* color, const unsigned char* dat } if(color->palettesize > 256) return 38; /*error: palette too big*/ - for(i = 0; i < color->palettesize; i++) + for(i = 0; i != color->palettesize; ++i) { color->palette[4 * i + 0] = data[pos++]; /*R*/ color->palette[4 * i + 1] = data[pos++]; /*G*/ @@ -4283,7 +4152,7 @@ static unsigned readChunk_tRNS(LodePNGColorMode* color, const unsigned char* dat /*error: more alpha values given than there are palette entries*/ if(chunkLength > color->palettesize) return 38; - for(i = 0; i < chunkLength; i++) color->palette[4 * i + 3] = data[i]; + for(i = 0; i != chunkLength; ++i) color->palette[4 * i + 3] = data[i]; } else if(color->colortype == LCT_GREY) { @@ -4291,7 +4160,7 @@ static unsigned readChunk_tRNS(LodePNGColorMode* color, const unsigned char* dat if(chunkLength != 2) return 30; color->key_defined = 1; - color->key_r = color->key_g = color->key_b = 256 * data[0] + data[1]; + color->key_r = color->key_g = color->key_b = 256u * data[0] + data[1]; } else if(color->colortype == LCT_RGB) { @@ -4299,9 +4168,9 @@ static unsigned readChunk_tRNS(LodePNGColorMode* color, const unsigned char* dat if(chunkLength != 6) return 41; color->key_defined = 1; - color->key_r = 256 * data[0] + data[1]; - color->key_g = 256 * data[2] + data[3]; - color->key_b = 256 * data[4] + data[5]; + color->key_r = 256u * data[0] + data[1]; + color->key_g = 256u * data[2] + data[3]; + color->key_b = 256u * data[4] + data[5]; } else return 42; /*error: tRNS chunk not allowed for other color models*/ @@ -4327,8 +4196,7 @@ static unsigned readChunk_bKGD(LodePNGInfo* info, const unsigned char* data, siz if(chunkLength != 2) return 44; info->background_defined = 1; - info->background_r = info->background_g = info->background_b - = 256 * data[0] + data[1]; + info->background_r = info->background_g = info->background_b = 256u * data[0] + data[1]; } else if(info->color.colortype == LCT_RGB || info->color.colortype == LCT_RGBA) { @@ -4336,9 +4204,9 @@ static unsigned readChunk_bKGD(LodePNGInfo* info, const unsigned char* data, siz if(chunkLength != 6) return 45; info->background_defined = 1; - info->background_r = 256 * data[0] + data[1]; - info->background_g = 256 * data[2] + data[3]; - info->background_b = 256 * data[4] + data[5]; + info->background_r = 256u * data[0] + data[1]; + info->background_g = 256u * data[2] + data[3]; + info->background_b = 256u * data[4] + data[5]; } return 0; /* OK */ @@ -4356,7 +4224,7 @@ static unsigned readChunk_tEXt(LodePNGInfo* info, const unsigned char* data, siz unsigned length, string2_begin; length = 0; - while(length < chunkLength && data[length] != 0) length++; + while(length < chunkLength && data[length] != 0) ++length; /*even though it's not allowed by the standard, no error is thrown if there's no null termination char, if the text is empty*/ if(length < 1 || length > 79) CERROR_BREAK(error, 89); /*keyword too short or long*/ @@ -4365,7 +4233,7 @@ static unsigned readChunk_tEXt(LodePNGInfo* info, const unsigned char* data, siz if(!key) CERROR_BREAK(error, 83); /*alloc fail*/ key[length] = 0; - for(i = 0; i < length; i++) key[i] = data[i]; + for(i = 0; i != length; ++i) key[i] = (char)data[i]; string2_begin = length + 1; /*skip keyword null terminator*/ @@ -4374,7 +4242,7 @@ static unsigned readChunk_tEXt(LodePNGInfo* info, const unsigned char* data, siz if(!str) CERROR_BREAK(error, 83); /*alloc fail*/ str[length] = 0; - for(i = 0; i < length; i++) str[i] = data[string2_begin + i]; + for(i = 0; i != length; ++i) str[i] = (char)data[string2_begin + i]; error = lodepng_add_text(info, key, str); @@ -4402,7 +4270,7 @@ static unsigned readChunk_zTXt(LodePNGInfo* info, const LodePNGDecompressSetting while(!error) /*not really a while loop, only used to break on error*/ { - for(length = 0; length < chunkLength && data[length] != 0; length++) ; + for(length = 0; length < chunkLength && data[length] != 0; ++length) ; if(length + 2 >= chunkLength) CERROR_BREAK(error, 75); /*no null termination, corrupt?*/ if(length < 1 || length > 79) CERROR_BREAK(error, 89); /*keyword too short or long*/ @@ -4410,7 +4278,7 @@ static unsigned readChunk_zTXt(LodePNGInfo* info, const LodePNGDecompressSetting if(!key) CERROR_BREAK(error, 83); /*alloc fail*/ key[length] = 0; - for(i = 0; i < length; i++) key[i] = data[i]; + for(i = 0; i != length; ++i) key[i] = (char)data[i]; if(data[length + 1] != 0) CERROR_BREAK(error, 72); /*the 0 byte indicating compression must be 0*/ @@ -4455,7 +4323,7 @@ static unsigned readChunk_iTXt(LodePNGInfo* info, const LodePNGDecompressSetting if(chunkLength < 5) CERROR_BREAK(error, 30); /*iTXt chunk too short*/ /*read the key*/ - for(length = 0; length < chunkLength && data[length] != 0; length++) ; + for(length = 0; length < chunkLength && data[length] != 0; ++length) ; if(length + 3 >= chunkLength) CERROR_BREAK(error, 75); /*no null termination char, corrupt?*/ if(length < 1 || length > 79) CERROR_BREAK(error, 89); /*keyword too short or long*/ @@ -4463,7 +4331,7 @@ static unsigned readChunk_iTXt(LodePNGInfo* info, const LodePNGDecompressSetting if(!key) CERROR_BREAK(error, 83); /*alloc fail*/ key[length] = 0; - for(i = 0; i < length; i++) key[i] = data[i]; + for(i = 0; i != length; ++i) key[i] = (char)data[i]; /*read the compression method*/ compressed = data[length + 1]; @@ -4475,24 +4343,24 @@ static unsigned readChunk_iTXt(LodePNGInfo* info, const LodePNGDecompressSetting /*read the langtag*/ begin = length + 3; length = 0; - for(i = begin; i < chunkLength && data[i] != 0; i++) length++; + for(i = begin; i < chunkLength && data[i] != 0; ++i) ++length; langtag = (char*)lodepng_malloc(length + 1); if(!langtag) CERROR_BREAK(error, 83); /*alloc fail*/ langtag[length] = 0; - for(i = 0; i < length; i++) langtag[i] = data[begin + i]; + for(i = 0; i != length; ++i) langtag[i] = (char)data[begin + i]; /*read the transkey*/ begin += length + 1; length = 0; - for(i = begin; i < chunkLength && data[i] != 0; i++) length++; + for(i = begin; i < chunkLength && data[i] != 0; ++i) ++length; transkey = (char*)lodepng_malloc(length + 1); if(!transkey) CERROR_BREAK(error, 83); /*alloc fail*/ transkey[length] = 0; - for(i = 0; i < length; i++) transkey[i] = data[begin + i]; + for(i = 0; i != length; ++i) transkey[i] = (char)data[begin + i]; /*read the actual text*/ begin += length + 1; @@ -4514,7 +4382,7 @@ static unsigned readChunk_iTXt(LodePNGInfo* info, const LodePNGDecompressSetting if(!ucvector_resize(&decoded, length + 1)) CERROR_BREAK(error, 83 /*alloc fail*/); decoded.data[length] = 0; - for(i = 0; i < length; i++) decoded.data[i] = data[begin + i]; + for(i = 0; i != length; ++i) decoded.data[i] = data[begin + i]; } error = lodepng_add_itext(info, key, langtag, transkey, (char*)decoded.data); @@ -4535,7 +4403,7 @@ static unsigned readChunk_tIME(LodePNGInfo* info, const unsigned char* data, siz if(chunkLength != 7) return 73; /*invalid tIME chunk size*/ info->time_defined = 1; - info->time.year = 256 * data[0] + data[+ 1]; + info->time.year = 256u * data[0] + data[1]; info->time.month = data[2]; info->time.day = data[3]; info->time.hour = data[4]; @@ -4550,8 +4418,8 @@ static unsigned readChunk_pHYs(LodePNGInfo* info, const unsigned char* data, siz if(chunkLength != 9) return 74; /*invalid pHYs chunk size*/ info->phys_defined = 1; - info->phys_x = 16777216 * data[0] + 65536 * data[1] + 256 * data[2] + data[3]; - info->phys_y = 16777216 * data[4] + 65536 * data[5] + 256 * data[6] + data[7]; + info->phys_x = 16777216u * data[0] + 65536u * data[1] + 256u * data[2] + data[3]; + info->phys_y = 16777216u * data[4] + 65536u * data[5] + 256u * data[6] + data[7]; info->phys_unit = data[8]; return 0; /* OK */ @@ -4568,6 +4436,8 @@ static void decodeGeneric(unsigned char** out, unsigned* w, unsigned* h, size_t i; ucvector idat; /*the data from idat chunks*/ ucvector scanlines; + size_t predict; + size_t numpixels; /*for unknown chunk order*/ unsigned unknown = 0; @@ -4581,6 +4451,14 @@ static void decodeGeneric(unsigned char** out, unsigned* w, unsigned* h, state->error = lodepng_inspect(w, h, state, in, insize); /*reads header and resets other parameters in state->info_png*/ if(state->error) return; + numpixels = *w * *h; + + /*multiplication overflow*/ + if(*h != 0 && numpixels / *h != *w) CERROR_RETURN(state->error, 92); + /*multiplication overflow possible further below. Allows up to 2^31-1 pixel + bytes with 16-bit RGBA, the rest is room for filter bytes.*/ + if(numpixels > 268435455) CERROR_RETURN(state->error, 92); + ucvector_init(&idat); chunk = &in[33]; /*first byte of the first chunk after the header*/ @@ -4611,7 +4489,7 @@ static void decodeGeneric(unsigned char** out, unsigned* w, unsigned* h, { size_t oldsize = idat.size; if(!ucvector_resize(&idat, oldsize + chunkLength)) CERROR_BREAK(state->error, 83 /*alloc fail*/); - for(i = 0; i < chunkLength; i++) idat.data[oldsize + i] = data[i]; + for(i = 0; i != chunkLength; ++i) idat.data[oldsize + i] = data[i]; #ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS critical_pos = 3; #endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ @@ -4706,28 +4584,41 @@ static void decodeGeneric(unsigned char** out, unsigned* w, unsigned* h, } ucvector_init(&scanlines); - if(!state->error) + /*predict output size, to allocate exact size for output buffer to avoid more dynamic allocation. + If the decompressed size does not match the prediction, the image must be corrupt.*/ + if(state->info_png.interlace_method == 0) { - /*maximum final image length is already reserved in the vector's length - this is not really necessary*/ - if(!ucvector_resize(&scanlines, lodepng_get_raw_size(*w, *h, &state->info_png.color) + *h)) - { - state->error = 83; /*alloc fail*/ - } + /*The extra *h is added because this are the filter bytes every scanline starts with*/ + predict = lodepng_get_raw_size_idat(*w, *h, &state->info_png.color) + *h; } + else + { + /*Adam-7 interlaced: predicted size is the sum of the 7 sub-images sizes*/ + const LodePNGColorMode* color = &state->info_png.color; + predict = 0; + predict += lodepng_get_raw_size_idat((*w + 7) / 8, (*h + 7) / 8, color) + (*h + 7) / 8; + if(*w > 4) predict += lodepng_get_raw_size_idat((*w + 3) / 8, (*h + 7) / 8, color) + (*h + 7) / 8; + predict += lodepng_get_raw_size_idat((*w + 3) / 4, (*h + 3) / 8, color) + (*h + 3) / 8; + if(*w > 2) predict += lodepng_get_raw_size_idat((*w + 1) / 4, (*h + 3) / 4, color) + (*h + 3) / 4; + predict += lodepng_get_raw_size_idat((*w + 1) / 2, (*h + 1) / 4, color) + (*h + 1) / 4; + if(*w > 1) predict += lodepng_get_raw_size_idat((*w + 0) / 2, (*h + 1) / 2, color) + (*h + 1) / 2; + predict += lodepng_get_raw_size_idat((*w + 0) / 1, (*h + 0) / 2, color) + (*h + 0) / 2; + } + if(!state->error && !ucvector_reserve(&scanlines, predict)) state->error = 83; /*alloc fail*/ if(!state->error) { - /*decompress with the Zlib decompressor*/ state->error = zlib_decompress(&scanlines.data, &scanlines.size, idat.data, idat.size, &state->decoder.zlibsettings); + if(!state->error && scanlines.size != predict) state->error = 91; /*decompressed size doesn't match prediction*/ } ucvector_cleanup(&idat); if(!state->error) { + size_t outsize = lodepng_get_raw_size(*w, *h, &state->info_png.color); ucvector outv; ucvector_init(&outv); - if(!ucvector_resizev(&outv, - lodepng_get_raw_size(*w, *h, &state->info_png.color), 0)) state->error = 83; /*alloc fail*/ + if(!ucvector_resizev(&outv, outsize, 0)) state->error = 83; /*alloc fail*/ if(!state->error) state->error = postProcessScanlines(outv.data, scanlines.data, *w, *h, &state->info_png); *out = outv.data; } @@ -4772,7 +4663,8 @@ unsigned lodepng_decode(unsigned char** out, unsigned* w, unsigned* h, { state->error = 83; /*alloc fail*/ } - else state->error = lodepng_convert(*out, data, &state->info_raw, &state->info_png.color, *w, *h, state->decoder.fix_png); + else state->error = lodepng_convert(*out, data, &state->info_raw, + &state->info_png.color, *w, *h); lodepng_free(data); } return state->error; @@ -4833,7 +4725,6 @@ void lodepng_decoder_settings_init(LodePNGDecoderSettings* settings) settings->remember_unknown_chunks = 0; #endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ settings->ignore_crc = 0; - settings->fix_png = 0; lodepng_decompress_settings_init(&settings->zlibsettings); } @@ -4926,7 +4817,7 @@ static unsigned addChunk_PLTE(ucvector* out, const LodePNGColorMode* info) size_t i; ucvector PLTE; ucvector_init(&PLTE); - for(i = 0; i < info->palettesize * 4; i++) + for(i = 0; i != info->palettesize * 4; ++i) { /*add all channels except alpha channel*/ if(i % 4 != 3) ucvector_push_back(&PLTE, info->palette[i]); @@ -4947,13 +4838,13 @@ static unsigned addChunk_tRNS(ucvector* out, const LodePNGColorMode* info) { size_t amount = info->palettesize; /*the tail of palette values that all have 255 as alpha, does not have to be encoded*/ - for(i = info->palettesize; i > 0; i--) + for(i = info->palettesize; i != 0; --i) { - if(info->palette[4 * (i - 1) + 3] == 255) amount--; + if(info->palette[4 * (i - 1) + 3] == 255) --amount; else break; } /*add only alpha channel*/ - for(i = 0; i < amount; i++) ucvector_push_back(&tRNS, info->palette[4 * i + 3]); + for(i = 0; i != amount; ++i) ucvector_push_back(&tRNS, info->palette[4 * i + 3]); } else if(info->colortype == LCT_GREY) { @@ -5012,10 +4903,10 @@ static unsigned addChunk_tEXt(ucvector* out, const char* keyword, const char* te size_t i; ucvector text; ucvector_init(&text); - for(i = 0; keyword[i] != 0; i++) ucvector_push_back(&text, (unsigned char)keyword[i]); + for(i = 0; keyword[i] != 0; ++i) ucvector_push_back(&text, (unsigned char)keyword[i]); if(i < 1 || i > 79) return 89; /*error: invalid keyword size*/ ucvector_push_back(&text, 0); /*0 termination char*/ - for(i = 0; textstring[i] != 0; i++) ucvector_push_back(&text, (unsigned char)textstring[i]); + for(i = 0; textstring[i] != 0; ++i) ucvector_push_back(&text, (unsigned char)textstring[i]); error = addChunk(out, "tEXt", text.data, text.size); ucvector_cleanup(&text); @@ -5031,7 +4922,7 @@ static unsigned addChunk_zTXt(ucvector* out, const char* keyword, const char* te ucvector_init(&data); ucvector_init(&compressed); - for(i = 0; keyword[i] != 0; i++) ucvector_push_back(&data, (unsigned char)keyword[i]); + for(i = 0; keyword[i] != 0; ++i) ucvector_push_back(&data, (unsigned char)keyword[i]); if(i < 1 || i > 79) return 89; /*error: invalid keyword size*/ ucvector_push_back(&data, 0); /*0 termination char*/ ucvector_push_back(&data, 0); /*compression method: 0*/ @@ -5040,7 +4931,7 @@ static unsigned addChunk_zTXt(ucvector* out, const char* keyword, const char* te (unsigned char*)textstring, textsize, zlibsettings); if(!error) { - for(i = 0; i < compressed.size; i++) ucvector_push_back(&data, compressed.data[i]); + for(i = 0; i != compressed.size; ++i) ucvector_push_back(&data, compressed.data[i]); error = addChunk(out, "zTXt", data.data, data.size); } @@ -5058,14 +4949,14 @@ static unsigned addChunk_iTXt(ucvector* out, unsigned compressed, const char* ke ucvector_init(&data); - for(i = 0; keyword[i] != 0; i++) ucvector_push_back(&data, (unsigned char)keyword[i]); + for(i = 0; keyword[i] != 0; ++i) ucvector_push_back(&data, (unsigned char)keyword[i]); if(i < 1 || i > 79) return 89; /*error: invalid keyword size*/ ucvector_push_back(&data, 0); /*null termination char*/ ucvector_push_back(&data, compressed ? 1 : 0); /*compression flag*/ ucvector_push_back(&data, 0); /*compression method*/ - for(i = 0; langtag[i] != 0; i++) ucvector_push_back(&data, (unsigned char)langtag[i]); + for(i = 0; langtag[i] != 0; ++i) ucvector_push_back(&data, (unsigned char)langtag[i]); ucvector_push_back(&data, 0); /*null termination char*/ - for(i = 0; transkey[i] != 0; i++) ucvector_push_back(&data, (unsigned char)transkey[i]); + for(i = 0; transkey[i] != 0; ++i) ucvector_push_back(&data, (unsigned char)transkey[i]); ucvector_push_back(&data, 0); /*null termination char*/ if(compressed) @@ -5076,13 +4967,13 @@ static unsigned addChunk_iTXt(ucvector* out, unsigned compressed, const char* ke (unsigned char*)textstring, textsize, zlibsettings); if(!error) { - for(i = 0; i < compressed_data.size; i++) ucvector_push_back(&data, compressed_data.data[i]); + for(i = 0; i != compressed_data.size; ++i) ucvector_push_back(&data, compressed_data.data[i]); } ucvector_cleanup(&compressed_data); } else /*not compressed*/ { - for(i = 0; textstring[i] != 0; i++) ucvector_push_back(&data, (unsigned char)textstring[i]); + for(i = 0; textstring[i] != 0; ++i) ucvector_push_back(&data, (unsigned char)textstring[i]); } if(!error) error = addChunk(out, "iTXt", data.data, data.size); @@ -5127,11 +5018,11 @@ static unsigned addChunk_tIME(ucvector* out, const LodePNGTime* time) if(!data) return 83; /*alloc fail*/ data[0] = (unsigned char)(time->year / 256); data[1] = (unsigned char)(time->year % 256); - data[2] = time->month; - data[3] = time->day; - data[4] = time->hour; - data[5] = time->minute; - data[6] = time->second; + data[2] = (unsigned char)time->month; + data[3] = (unsigned char)time->day; + data[4] = (unsigned char)time->hour; + data[5] = (unsigned char)time->minute; + data[6] = (unsigned char)time->second; error = addChunk(out, "tIME", data, 7); lodepng_free(data); return error; @@ -5162,57 +5053,49 @@ static void filterScanline(unsigned char* out, const unsigned char* scanline, co switch(filterType) { case 0: /*None*/ - for(i = 0; i < length; i++) out[i] = scanline[i]; + for(i = 0; i != length; ++i) out[i] = scanline[i]; break; case 1: /*Sub*/ - if(prevline) - { - for(i = 0; i < bytewidth; i++) out[i] = scanline[i]; - for(i = bytewidth; i < length; i++) out[i] = scanline[i] - scanline[i - bytewidth]; - } - else - { - for(i = 0; i < bytewidth; i++) out[i] = scanline[i]; - for(i = bytewidth; i < length; i++) out[i] = scanline[i] - scanline[i - bytewidth]; - } + for(i = 0; i != bytewidth; ++i) out[i] = scanline[i]; + for(i = bytewidth; i < length; ++i) out[i] = scanline[i] - scanline[i - bytewidth]; break; case 2: /*Up*/ if(prevline) { - for(i = 0; i < length; i++) out[i] = scanline[i] - prevline[i]; + for(i = 0; i != length; ++i) out[i] = scanline[i] - prevline[i]; } else { - for(i = 0; i < length; i++) out[i] = scanline[i]; + for(i = 0; i != length; ++i) out[i] = scanline[i]; } break; case 3: /*Average*/ if(prevline) { - for(i = 0; i < bytewidth; i++) out[i] = scanline[i] - prevline[i] / 2; - for(i = bytewidth; i < length; i++) out[i] = scanline[i] - ((scanline[i - bytewidth] + prevline[i]) / 2); + for(i = 0; i != bytewidth; ++i) out[i] = scanline[i] - prevline[i] / 2; + for(i = bytewidth; i < length; ++i) out[i] = scanline[i] - ((scanline[i - bytewidth] + prevline[i]) / 2); } else { - for(i = 0; i < bytewidth; i++) out[i] = scanline[i]; - for(i = bytewidth; i < length; i++) out[i] = scanline[i] - scanline[i - bytewidth] / 2; + for(i = 0; i != bytewidth; ++i) out[i] = scanline[i]; + for(i = bytewidth; i < length; ++i) out[i] = scanline[i] - scanline[i - bytewidth] / 2; } break; case 4: /*Paeth*/ if(prevline) { /*paethPredictor(0, prevline[i], 0) is always prevline[i]*/ - for(i = 0; i < bytewidth; i++) out[i] = (scanline[i] - prevline[i]); - for(i = bytewidth; i < length; i++) + for(i = 0; i != bytewidth; ++i) out[i] = (scanline[i] - prevline[i]); + for(i = bytewidth; i < length; ++i) { out[i] = (scanline[i] - paethPredictor(scanline[i - bytewidth], prevline[i], prevline[i - bytewidth])); } } else { - for(i = 0; i < bytewidth; i++) out[i] = scanline[i]; + for(i = 0; i != bytewidth; ++i) out[i] = scanline[i]; /*paethPredictor(scanline[i - bytewidth], 0, 0) is always scanline[i - bytewidth]*/ - for(i = bytewidth; i < length; i++) out[i] = (scanline[i] - scanline[i - bytewidth]); + for(i = bytewidth; i < length; ++i) out[i] = (scanline[i] - scanline[i - bytewidth]); } break; default: return; /*unexisting filter type given*/ @@ -5224,7 +5107,7 @@ static float flog2(float f) { float result = 0; while(f > 32) { result += 4; f /= 16; } - while(f > 2) { result++; f /= 2; } + while(f > 2) { ++result; f /= 2; } return result + 1.442695f * (f * f * f / 3 - 3 * f * f / 2 + 3 * f - 1.83333f); } @@ -5267,7 +5150,7 @@ static unsigned filter(unsigned char* out, const unsigned char* in, unsigned w, if(strategy == LFS_ZERO) { - for(y = 0; y < h; y++) + for(y = 0; y != h; ++y) { size_t outindex = (1 + linebytes) * y; /*the extra filterbyte added to each row*/ size_t inindex = linebytes * y; @@ -5282,9 +5165,9 @@ static unsigned filter(unsigned char* out, const unsigned char* in, unsigned w, size_t sum[5]; ucvector attempt[5]; /*five filtering attempts, one for each filter type*/ size_t smallest = 0; - unsigned type, bestType = 0; + unsigned char type, bestType = 0; - for(type = 0; type < 5; type++) + for(type = 0; type != 5; ++type) { ucvector_init(&attempt[type]); if(!ucvector_resize(&attempt[type], linebytes)) return 83; /*alloc fail*/ @@ -5292,10 +5175,10 @@ static unsigned filter(unsigned char* out, const unsigned char* in, unsigned w, if(!error) { - for(y = 0; y < h; y++) + for(y = 0; y != h; ++y) { /*try the 5 filter types*/ - for(type = 0; type < 5; type++) + for(type = 0; type != 5; ++type) { filterScanline(attempt[type].data, &in[y * linebytes], prevline, linebytes, bytewidth, type); @@ -5303,17 +5186,17 @@ static unsigned filter(unsigned char* out, const unsigned char* in, unsigned w, sum[type] = 0; if(type == 0) { - for(x = 0; x < linebytes; x++) sum[type] += (unsigned char)(attempt[type].data[x]); + for(x = 0; x != linebytes; ++x) sum[type] += (unsigned char)(attempt[type].data[x]); } else { - for(x = 0; x < linebytes; x++) + for(x = 0; x != linebytes; ++x) { /*For differences, each byte should be treated as signed, values above 127 are negative (converted to signed char). Filtertype 0 isn't a difference though, so use unsigned there. This means filtertype 0 is almost never chosen, but that is justified.*/ - signed char s = (signed char)(attempt[type].data[x]); - sum[type] += s < 0 ? -s : s; + unsigned char s = attempt[type].data[x]; + sum[type] += s < 128 ? s : (255U - s); } } @@ -5329,11 +5212,11 @@ static unsigned filter(unsigned char* out, const unsigned char* in, unsigned w, /*now fill the out values*/ out[y * (linebytes + 1)] = bestType; /*the first byte of a scanline will be the filter type*/ - for(x = 0; x < linebytes; x++) out[y * (linebytes + 1) + 1 + x] = attempt[bestType].data[x]; + for(x = 0; x != linebytes; ++x) out[y * (linebytes + 1) + 1 + x] = attempt[bestType].data[x]; } } - for(type = 0; type < 5; type++) ucvector_cleanup(&attempt[type]); + for(type = 0; type != 5; ++type) ucvector_cleanup(&attempt[type]); } else if(strategy == LFS_ENTROPY) { @@ -5343,23 +5226,23 @@ static unsigned filter(unsigned char* out, const unsigned char* in, unsigned w, unsigned type, bestType = 0; unsigned count[256]; - for(type = 0; type < 5; type++) + for(type = 0; type != 5; ++type) { ucvector_init(&attempt[type]); if(!ucvector_resize(&attempt[type], linebytes)) return 83; /*alloc fail*/ } - for(y = 0; y < h; y++) + for(y = 0; y != h; ++y) { /*try the 5 filter types*/ - for(type = 0; type < 5; type++) + for(type = 0; type != 5; ++type) { filterScanline(attempt[type].data, &in[y * linebytes], prevline, linebytes, bytewidth, type); - for(x = 0; x < 256; x++) count[x] = 0; - for(x = 0; x < linebytes; x++) count[attempt[type].data[x]]++; - count[type]++; /*the filter type itself is part of the scanline*/ + for(x = 0; x != 256; ++x) count[x] = 0; + for(x = 0; x != linebytes; ++x) ++count[attempt[type].data[x]]; + ++count[type]; /*the filter type itself is part of the scanline*/ sum[type] = 0; - for(x = 0; x < 256; x++) + for(x = 0; x != 256; ++x) { float p = count[x] / (float)(linebytes + 1); sum[type] += count[x] == 0 ? 0 : flog2(1 / p) * p; @@ -5376,18 +5259,18 @@ static unsigned filter(unsigned char* out, const unsigned char* in, unsigned w, /*now fill the out values*/ out[y * (linebytes + 1)] = bestType; /*the first byte of a scanline will be the filter type*/ - for(x = 0; x < linebytes; x++) out[y * (linebytes + 1) + 1 + x] = attempt[bestType].data[x]; + for(x = 0; x != linebytes; ++x) out[y * (linebytes + 1) + 1 + x] = attempt[bestType].data[x]; } - for(type = 0; type < 5; type++) ucvector_cleanup(&attempt[type]); + for(type = 0; type != 5; ++type) ucvector_cleanup(&attempt[type]); } else if(strategy == LFS_PREDEFINED) { - for(y = 0; y < h; y++) + for(y = 0; y != h; ++y) { size_t outindex = (1 + linebytes) * y; /*the extra filterbyte added to each row*/ size_t inindex = linebytes * y; - unsigned type = settings->predefined_filters[y]; + unsigned char type = settings->predefined_filters[y]; out[outindex] = type; /*filter type byte*/ filterScanline(&out[outindex + 1], &in[inindex], prevline, linebytes, bytewidth, type); prevline = &in[inindex]; @@ -5413,14 +5296,14 @@ static unsigned filter(unsigned char* out, const unsigned char* in, unsigned w, images only, so disable it*/ zlibsettings.custom_zlib = 0; zlibsettings.custom_deflate = 0; - for(type = 0; type < 5; type++) + for(type = 0; type != 5; ++type) { ucvector_init(&attempt[type]); ucvector_resize(&attempt[type], linebytes); /*todo: give error if resize failed*/ } - for(y = 0; y < h; y++) /*try the 5 filter types*/ + for(y = 0; y != h; ++y) /*try the 5 filter types*/ { - for(type = 0; type < 5; type++) + for(type = 0; type != 5; ++type) { unsigned testsize = attempt[type].size; /*if(testsize > 8) testsize /= 8;*/ /*it already works good enough by testing a part of the row*/ @@ -5439,9 +5322,9 @@ static unsigned filter(unsigned char* out, const unsigned char* in, unsigned w, } prevline = &in[y * linebytes]; out[y * (linebytes + 1)] = bestType; /*the first byte of a scanline will be the filter type*/ - for(x = 0; x < linebytes; x++) out[y * (linebytes + 1) + 1 + x] = attempt[bestType].data[x]; + for(x = 0; x != linebytes; ++x) out[y * (linebytes + 1) + 1 + x] = attempt[bestType].data[x]; } - for(type = 0; type < 5; type++) ucvector_cleanup(&attempt[type]); + for(type = 0; type != 5; ++type) ucvector_cleanup(&attempt[type]); } else return 88; /* unknown filter strategy */ @@ -5456,17 +5339,17 @@ static void addPaddingBits(unsigned char* out, const unsigned char* in, unsigned y; size_t diff = olinebits - ilinebits; size_t obp = 0, ibp = 0; /*bit pointers*/ - for(y = 0; y < h; y++) + for(y = 0; y != h; ++y) { size_t x; - for(x = 0; x < ilinebits; x++) + for(x = 0; x < ilinebits; ++x) { unsigned char bit = readBitFromReversedStream(&ibp, in); setBitOfReversedStream(&obp, out, bit); } /*obp += diff; --> no, fill in some value in the padding bits too, to avoid "Use of uninitialised value of size ###" warning from valgrind*/ - for(x = 0; x < diff; x++) setBitOfReversedStream(&obp, out, 0); + for(x = 0; x != diff; ++x) setBitOfReversedStream(&obp, out, 0); } } @@ -5491,16 +5374,16 @@ static void Adam7_interlace(unsigned char* out, const unsigned char* in, unsigne if(bpp >= 8) { - for(i = 0; i < 7; i++) + for(i = 0; i != 7; ++i) { unsigned x, y, b; size_t bytewidth = bpp / 8; - for(y = 0; y < passh[i]; y++) - for(x = 0; x < passw[i]; x++) + for(y = 0; y < passh[i]; ++y) + for(x = 0; x < passw[i]; ++x) { size_t pixelinstart = ((ADAM7_IY[i] + y * ADAM7_DY[i]) * w + ADAM7_IX[i] + x * ADAM7_DX[i]) * bytewidth; size_t pixeloutstart = passstart[i] + (y * passw[i] + x) * bytewidth; - for(b = 0; b < bytewidth; b++) + for(b = 0; b < bytewidth; ++b) { out[pixeloutstart + b] = in[pixelinstart + b]; } @@ -5509,18 +5392,18 @@ static void Adam7_interlace(unsigned char* out, const unsigned char* in, unsigne } else /*bpp < 8: Adam7 with pixels < 8 bit is a bit trickier: with bit pointers*/ { - for(i = 0; i < 7; i++) + for(i = 0; i != 7; ++i) { unsigned x, y, b; unsigned ilinebits = bpp * passw[i]; unsigned olinebits = bpp * w; size_t obp, ibp; /*bit pointers (for out and in buffer)*/ - for(y = 0; y < passh[i]; y++) - for(x = 0; x < passw[i]; x++) + for(y = 0; y < passh[i]; ++y) + for(x = 0; x < passw[i]; ++x) { ibp = (ADAM7_IY[i] + y * ADAM7_DY[i]) * olinebits + (ADAM7_IX[i] + x * ADAM7_DX[i]) * bpp; obp = (8 * passstart[i]) + (y * ilinebits + x * bpp); - for(b = 0; b < bpp; b++) + for(b = 0; b < bpp; ++b) { unsigned char bit = readBitFromReversedStream(&ibp, in); setBitOfReversedStream(&obp, out, bit); @@ -5591,7 +5474,7 @@ static unsigned preProcessScanlines(unsigned char** out, size_t* outsize, const unsigned i; Adam7_interlace(adam7, in, w, h, bpp); - for(i = 0; i < 7; i++) + for(i = 0; i != 7; ++i) { if(bpp < 8) { @@ -5627,9 +5510,10 @@ returns 2 if the palette is semi-translucent. */ static unsigned getPaletteTranslucency(const unsigned char* palette, size_t palettesize) { - size_t i, key = 0; + size_t i; + unsigned key = 0; unsigned r = 0, g = 0, b = 0; /*the value of the color with alpha 0, so long as color keying is possible*/ - for(i = 0; i < palettesize; i++) + for(i = 0; i != palettesize; ++i) { if(!key && palette[4 * i + 3] == 0) { @@ -5682,10 +5566,9 @@ unsigned lodepng_encode(unsigned char** out, size_t* outsize, return state->error; } - if(state->encoder.auto_convert != LAC_NO) + if(state->encoder.auto_convert) { - state->error = lodepng_auto_choose_color(&info.color, image, w, h, &state->info_raw, - state->encoder.auto_convert); + state->error = lodepng_auto_choose_color(&info.color, image, w, h, &state->info_raw); } if(state->error) return state->error; @@ -5712,7 +5595,7 @@ unsigned lodepng_encode(unsigned char** out, size_t* outsize, if(!converted && size) state->error = 83; /*alloc fail*/ if(!state->error) { - state->error = lodepng_convert(converted, image, &info.color, &state->info_raw, w, h, 0 /*fix_png*/); + state->error = lodepng_convert(converted, image, &info.color, &state->info_raw, w, h); } if(!state->error) preProcessScanlines(&data, &datasize, converted, w, h, &info, &state->encoder); lodepng_free(converted); @@ -5775,7 +5658,7 @@ unsigned lodepng_encode(unsigned char** out, size_t* outsize, /*tIME*/ if(info.time_defined) addChunk_tIME(&outv, &info.time); /*tEXt and/or zTXt*/ - for(i = 0; i < info.text_num; i++) + for(i = 0; i != info.text_num; ++i) { if(strlen(info.text_keys[i]) > 79) { @@ -5800,7 +5683,7 @@ unsigned lodepng_encode(unsigned char** out, size_t* outsize, if(state->encoder.add_id) { unsigned alread_added_id_text = 0; - for(i = 0; i < info.text_num; i++) + for(i = 0; i != info.text_num; ++i) { if(!strcmp(info.text_keys[i], "LodePNG")) { @@ -5810,11 +5693,11 @@ unsigned lodepng_encode(unsigned char** out, size_t* outsize, } if(alread_added_id_text == 0) { - addChunk_tEXt(&outv, "LodePNG", VERSION_STRING); /*it's shorter as tEXt than as zTXt chunk*/ + addChunk_tEXt(&outv, "LodePNG", LODEPNG_VERSION_STRING); /*it's shorter as tEXt than as zTXt chunk*/ } } /*iTXt*/ - for(i = 0; i < info.itext_num; i++) + for(i = 0; i != info.itext_num; ++i) { if(strlen(info.itext_keys[i]) > 79) { @@ -5906,7 +5789,7 @@ void lodepng_encoder_settings_init(LodePNGEncoderSettings* settings) lodepng_compress_settings_init(&settings->zlibsettings); settings->filter_palette_zero = 1; settings->filter_strategy = LFS_MINSUM; - settings->auto_convert = LAC_AUTO; + settings->auto_convert = 1; settings->force_palette = 0; settings->predefined_filters = 0; #ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS @@ -5969,10 +5852,6 @@ const char* lodepng_error_text(unsigned code) case 43: return "bKGD chunk has wrong size for palette image"; case 44: return "bKGD chunk has wrong size for greyscale image"; case 45: return "bKGD chunk has wrong size for RGB image"; - /*Is the palette too small?*/ - case 46: return "a value in indexed image is larger than the palette size (bitdepth = 8)"; - /*Is the palette too small?*/ - case 47: return "a value in indexed image is larger than the palette size (bitdepth < 8)"; /*the input data is empty, maybe a PNG file doesn't exist or is in the wrong path*/ case 48: return "empty input or file doesn't exist"; case 49: return "jumped past memory while generating dynamic huffman tree"; @@ -6015,13 +5894,15 @@ const char* lodepng_error_text(unsigned code) case 82: return "color conversion to palette requested while a color isn't in palette"; case 83: return "memory allocation failed"; case 84: return "given image too small to contain all pixels to be encoded"; - case 85: return "internal color conversion bug"; case 86: return "impossible offset in lz77 encoding (internal bug)"; case 87: return "must provide custom zlib function pointer if LODEPNG_COMPILE_ZLIB is not defined"; case 88: return "invalid filter strategy given for LodePNGEncoderSettings.filter_strategy"; case 89: return "text chunk keyword too short or long: must have size 1-79"; /*the windowsize in the LodePNGCompressSettings. Requiring POT(==> & instead of %) makes encoding 12% faster.*/ case 90: return "windowsize must be a power of two"; + case 91: return "invalid decompressed idat size"; + case 92: return "too many pixels, not supported"; + case 93: return "zero width or height is invalid"; } return "unknown error code"; } diff --git a/jni/love/src/libraries/lodepng/lodepng.h b/jni/love/src/libraries/lodepng/lodepng.h index 13247003..1c70e939 100644 --- a/jni/love/src/libraries/lodepng/lodepng.h +++ b/jni/love/src/libraries/lodepng/lodepng.h @@ -1,7 +1,7 @@ /* -LodePNG version 20131222 +LodePNG version 20141130 -Copyright (c) 2005-2013 Lode Vandevenne +Copyright (c) 2005-2014 Lode Vandevenne This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -33,6 +33,8 @@ freely, subject to the following restrictions: #include #endif /*__cplusplus*/ +#define LODEPNG_VERSION_STRING "20141130" + /* The following #defines are used to create code sections. They can be disabled to disable code sections, which can give faster compile time and smaller binary. @@ -195,7 +197,8 @@ unsigned lodepng_encode24_file(const char* filename, namespace lodepng { #ifdef LODEPNG_COMPILE_DECODER -/*Same as lodepng_decode_memory, but decodes to an std::vector.*/ +/*Same as lodepng_decode_memory, but decodes to an std::vector. The colortype +is the format to output the pixels to. Default is RGBA 8-bit per channel.*/ unsigned decode(std::vector& out, unsigned& w, unsigned& h, const unsigned char* in, size_t insize, LodePNGColorType colortype = LCT_RGBA, unsigned bitdepth = 8); @@ -214,7 +217,8 @@ unsigned decode(std::vector& out, unsigned& w, unsigned& h, #endif //LODEPNG_COMPILE_DECODER #ifdef LODEPNG_COMPILE_ENCODER -/*Same as lodepng_encode_memory, but encodes to an std::vector.*/ +/*Same as lodepng_encode_memory, but encodes to an std::vector. colortype +is that of the raw input data. The output PNG color type will be auto chosen.*/ unsigned encode(std::vector& out, const unsigned char* in, unsigned w, unsigned h, LodePNGColorType colortype = LCT_RGBA, unsigned bitdepth = 8); @@ -280,7 +284,7 @@ struct LodePNGCompressSettings /*deflate = compress*/ /*LZ77 related settings*/ unsigned btype; /*the block type for LZ (0, 1, 2 or 3, see zlib standard). Should be 2 for proper compression.*/ unsigned use_lz77; /*whether or not to use LZ77. Should be 1 for proper compression.*/ - unsigned windowsize; /*must be a power of two <= 32768. higher compresses more but is slower. Typical value: 2048.*/ + unsigned windowsize; /*must be a power of two <= 32768. higher compresses more but is slower. Default value: 2048.*/ unsigned minmatch; /*mininum lz77 length. 3 is normally best, 6 can be better for some PNGs. Default: 0*/ unsigned nicematch; /*stop searching if >= this length found. Set to 258 for best compression. Default: 128*/ unsigned lazymatching; /*use lazy matching: better compression but a bit slower. Default: true*/ @@ -496,13 +500,14 @@ LodePNGColorMode structs to describe the input and output color type. See the reference manual at the end of this header file to see which color conversions are supported. return value = LodePNG error code (0 if all went ok, an error if the conversion isn't supported) The out buffer must have size (w * h * bpp + 7) / 8, where bpp is the bits per pixel -of the output color type (lodepng_get_bpp) -The fix_png value works as described in struct LodePNGDecoderSettings. -Note: for 16-bit per channel colors, uses big endian format like PNG does. +of the output color type (lodepng_get_bpp). +For < 8 bpp images, there should not be padding bits at the end of scanlines. +For 16-bit per channel colors, uses big endian format like PNG does. +Return value is LodePNG error code */ unsigned lodepng_convert(unsigned char* out, const unsigned char* in, LodePNGColorMode* mode_out, const LodePNGColorMode* mode_in, - unsigned w, unsigned h, unsigned fix_png); + unsigned w, unsigned h); #ifdef LODEPNG_COMPILE_DECODER /* @@ -514,16 +519,7 @@ typedef struct LodePNGDecoderSettings LodePNGDecompressSettings zlibsettings; /*in here is the setting to ignore Adler32 checksums*/ unsigned ignore_crc; /*ignore CRC checksums*/ - /* - The fix_png setting, if 1, makes the decoder tolerant towards some PNG images - that do not correctly follow the PNG specification. This only supports errors - that are fixable, were found in images that are actually used on the web, and - are silently tolerated by other decoders as well. Currently only one such fix - is implemented: if a palette index is out of bounds given the palette size, - interpret it as opaque black. - By default this value is 0, which makes it stop with an error on such images. - */ - unsigned fix_png; + unsigned color_convert; /*whether to convert the PNG to the color type you want. Default: yes*/ #ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS @@ -556,46 +552,39 @@ typedef enum LodePNGFilterStrategy LFS_PREDEFINED } LodePNGFilterStrategy; -/*automatically use color type with less bits per pixel if losslessly possible. Default: LAC_AUTO*/ -typedef enum LodePNGAutoConvert +/*Gives characteristics about the colors of the image, which helps decide which color model to use for encoding. +Used internally by default if "auto_convert" is enabled. Public because it's useful for custom algorithms.*/ +typedef struct LodePNGColorProfile { - LAC_NO, /*use color type user requested*/ - LAC_ALPHA, /*use color type user requested, but if only opaque pixels and RGBA or grey+alpha, use RGB or grey*/ - LAC_AUTO, /*use PNG color type that can losslessly represent the uncompressed image the smallest possible*/ - /* - like AUTO, but do not choose 1, 2 or 4 bit per pixel types. - sometimes a PNG image compresses worse if less than 8 bits per pixels. - */ - LAC_AUTO_NO_NIBBLES, - /* - like AUTO, but never choose palette color type. For small images, encoding - the palette may take more bytes than what is gained. Note that AUTO also - already prevents encoding the palette for extremely small images, but that may - not be sufficient because due to the compression it cannot predict when to - switch. - */ - LAC_AUTO_NO_PALETTE, - LAC_AUTO_NO_NIBBLES_NO_PALETTE -} LodePNGAutoConvert; + unsigned colored; /*not greyscale*/ + unsigned key; /*if true, image is not opaque. Only if true and alpha is false, color key is possible.*/ + unsigned short key_r; /*these values are always in 16-bit bitdepth in the profile*/ + unsigned short key_g; + unsigned short key_b; + unsigned alpha; /*alpha channel or alpha palette required*/ + unsigned numcolors; /*amount of colors, up to 257. Not valid if bits == 16.*/ + unsigned char palette[1024]; /*Remembers up to the first 256 RGBA colors, in no particular order*/ + unsigned bits; /*bits per channel (not for palette). 1,2 or 4 for greyscale only. 16 if 16-bit per channel required.*/ +} LodePNGColorProfile; +void lodepng_color_profile_init(LodePNGColorProfile* profile); -/* -Automatically chooses color type that gives smallest amount of bits in the -output image, e.g. grey if there are only greyscale pixels, palette if there -are less than 256 colors, ... -The auto_convert parameter allows limiting it to not use palette, ... -*/ +/*Get a LodePNGColorProfile of the image.*/ +unsigned lodepng_get_color_profile(LodePNGColorProfile* profile, + const unsigned char* image, unsigned w, unsigned h, + const LodePNGColorMode* mode_in); +/*The function LodePNG uses internally to decide the PNG color with auto_convert. +Chooses an optimal color model, e.g. grey if only grey pixels, palette if < 256 colors, ...*/ unsigned lodepng_auto_choose_color(LodePNGColorMode* mode_out, const unsigned char* image, unsigned w, unsigned h, - const LodePNGColorMode* mode_in, - LodePNGAutoConvert auto_convert); + const LodePNGColorMode* mode_in); /*Settings for the encoder.*/ typedef struct LodePNGEncoderSettings { LodePNGCompressSettings zlibsettings; /*settings for the zlib encoder, such as window size, ...*/ - LodePNGAutoConvert auto_convert; /*how to automatically choose output PNG color type, if at all*/ + unsigned auto_convert; /*automatically choose output PNG color type. Default: true*/ /*If true, follows the official PNG heuristic: if the PNG uses a palette or lower than 8 bit depth, set all filters to zero. Otherwise use the filter_strategy. Note that to @@ -690,7 +679,11 @@ Third byte: must be uppercase Fourth byte: uppercase = unsafe to copy, lowercase = safe to copy */ -/*get the length of the data of the chunk. Total chunk length has 12 bytes more.*/ +/* +Gets the length of the data of the chunk. Total chunk length has 12 bytes more. +There must be at least 4 bytes to read from. If the result value is too large, +it may be corrupt data. +*/ unsigned lodepng_chunk_length(const unsigned char* chunk); /*puts the 4-byte type in null terminated string*/ @@ -901,8 +894,8 @@ TODO: [X] let the "isFullyOpaque" function check color keys and transparent palettes too [X] better name for the variables "codes", "codesD", "codelengthcodes", "clcl" and "lldl" [ ] don't stop decoding on errors like 69, 57, 58 (make warnings) -[ ] make option to choose if the raw image with non multiple of 8 bits per scanline should have padding bits or not [ ] let the C++ wrapper catch exceptions coming from the standard library and return LodePNG error codes +[ ] allow user to provide custom color conversion functions, e.g. for premultiplied alpha, padding bits or not, ... */ #endif /*LODEPNG_H inclusion guard*/ @@ -1240,20 +1233,22 @@ behaviour. If, when decoding, you want the raw image to be something else than the default, you need to set the color type and bit depth you want in the LodePNGColorMode, -or the parameters of the simple function of LodePNG you're using. +or the parameters colortype and bitdepth of the simple decoding function. -If, when encoding, you use another color type than the default in the input +If, when encoding, you use another color type than the default in the raw input image, you need to specify its color type and bit depth in the LodePNGColorMode -of the raw image, or use the parameters of the simplefunction of LodePNG you're -using. +of the raw image, or use the parameters colortype and bitdepth of the simple +encoding function. If, when encoding, you don't want LodePNG to choose the output PNG color type but control it yourself, you need to set auto_convert in the encoder settings -to LAC_NONE, and specify the color type you want in the LodePNGInfo of the -encoder. +to false, and specify the color type you want in the LodePNGInfo of the +encoder (including palette: it can generate a palette if auto_convert is true, +otherwise not). -If you do any of the above, LodePNG may need to do a color conversion, which -follows the rules below, and may sometimes not be allowed. +If the input and output color type differ (whether user chosen or auto chosen), +LodePNG will do a color conversion, which follows the rules below, and may +sometimes result in an error. To avoid some confusion: -the decoder converts from PNG to raw image @@ -1275,7 +1270,7 @@ To avoid some confusion: Non supported color conversions: -color to greyscale: no error is thrown, but the result will look ugly because only the red channel is taken --anything, to palette when that palette does not have that color in it: in this +-anything to palette when that palette does not have that color in it: in this case an error is thrown Supported color conversions: @@ -1285,10 +1280,10 @@ Supported color conversions: -removing alpha channel -higher to smaller bitdepth, and vice versa -If you want no color conversion to be done: +If you want no color conversion to be done (e.g. for speed or control): -In the encoder, you can make it save a PNG with any color type by giving the raw color mode and LodePNGInfo the same color mode, and setting auto_convert to -LAC_NO. +false. -In the decoder, you can make it store the pixel data in the same color type as the PNG has, by setting the color_convert setting to false. Settings in info_raw are then ignored. @@ -1455,6 +1450,8 @@ LodePNG. For the C++ version, only the standard C++ library is needed on top. Add the files lodepng.c(pp) and lodepng.h to your project, include lodepng.h where needed, and your program can read/write PNG files. +It is compatible with C90 and up, and C++03 and up. + If performance is important, use optimization when compiling! For both the encoder and decoder, this makes a large difference. @@ -1470,49 +1467,40 @@ LodePNG is developed in gcc so this compiler is natively supported. It gives no warnings with compiler options "-Wall -Wextra -pedantic -ansi", with gcc and g++ version 4.7.1 on Linux, 32-bit and 64-bit. +*) Clang + +Fully supported and warning-free. + *) Mingw -The Mingw compiler (a port of gcc) for Windows is fully supported by LodePNG. +The Mingw compiler (a port of gcc for Windows) should be fully supported by +LodePNG. -*) Visual Studio 2005 and up, Visual C++ Express Edition 2005 and up +*) Visual Studio and Visual C++ Express Edition -Visual Studio may give warnings about 'fopen' being deprecated. A multiplatform library -can't support the proposed Visual Studio alternative however, so LodePNG keeps using -fopen. If you don't want to see the deprecated warnings, put this on top of lodepng.h -before the inclusions: -#define _CRT_SECURE_NO_DEPRECATE - -Other than the above warnings, LodePNG should be warning-free with warning -level 3 (W3). Warning level 4 (W4) will give warnings about integer conversions. -I'm not planning to resolve these warnings. To get rid of them, let Visual -Studio use warning level W3 for lodepng.cpp only: right click lodepng.cpp, -Properties, C/C++, General, Warning Level: Level 3 (/W3). +LodePNG should be warning-free with warning level W4. Two warnings were disabled +with pragmas though: warning 4244 about implicit conversions, and warning 4996 +where it wants to use a non-standard function fopen_s instead of the standard C +fopen. Visual Studio may want "stdafx.h" files to be included in each source file and give an error "unexpected end of file while looking for precompiled header". -That is not standard C++ and will not be added to the stock LodePNG. You can +This is not standard C++ and will not be added to the stock LodePNG. You can disable it for lodepng.cpp only by right clicking it, Properties, C/C++, Precompiled Headers, and set it to Not Using Precompiled Headers there. -*) Visual Studio 6.0 - -LodePNG support for Visual Studio 6.0 is not guaranteed because VS6 doesn't -follow the C++ standard correctly. - -*) Comeau C/C++ - -Vesion 20070107 compiles without problems on the Comeau C/C++ Online Test Drive -at http://www.comeaucomputing.com/tryitout in both C90 and C++ mode. +NOTE: Modern versions of VS should be fully supported, but old versions, e.g. +VS6, are not guaranteed to work. *) Compilers on Macintosh -LodePNG has been reported to work both with the gcc and LLVM for Macintosh, both -for C and C++. +LodePNG has been reported to work both with gcc and LLVM for Macintosh, both for +C and C++. *) Other Compilers -If you encounter problems on other compilers, feel free to let me know and I may -try to fix it if the compiler is modern standards complient. +If you encounter problems on any compilers, feel free to let me know and I may +try to fix it if the compiler is modern and standards complient. 10. examples @@ -1574,6 +1562,10 @@ yyyymmdd. Some changes aren't backwards compatible. Those are indicated with a (!) symbol. +*) 23 aug 2014: Reduced needless memory usage of decoder. +*) 28 jun 2014: Removed fix_png setting, always support palette OOB for + simplicity. Made ColorProfile public. +*) 09 jun 2014: Faster encoder by fixing hash bug and more zeros optimization. *) 22 dec 2013: Power of two windowsize required for optimization. *) 15 apr 2013: Fixed bug with LAC_ALPHA and color key. *) 25 mar 2013: Added an optional feature to ignore some PNG errors (fix_png). @@ -1712,5 +1704,5 @@ Domain: gmail dot com. Account: lode dot vandevenne. -Copyright (c) 2005-2013 Lode Vandevenne +Copyright (c) 2005-2014 Lode Vandevenne */ diff --git a/jni/love/src/libraries/luasocket/libluasocket/except.c b/jni/love/src/libraries/luasocket/libluasocket/except.c index 5faa5be0..c8dc5915 100644 --- a/jni/love/src/libraries/luasocket/libluasocket/except.c +++ b/jni/love/src/libraries/luasocket/libluasocket/except.c @@ -11,6 +11,8 @@ #include "except.h" +extern void luax_register(lua_State *L, const char *name, const luaL_Reg *l); + /*=========================================================================*\ * Internal function prototypes. \*=========================================================================*/ @@ -94,6 +96,6 @@ static int global_protect(lua_State *L) { * Init module \*-------------------------------------------------------------------------*/ int except_open(lua_State *L) { - luaL_openlib(L, NULL, func, 0); + luax_register(L, NULL, func); return 0; } diff --git a/jni/love/src/libraries/luasocket/libluasocket/inet.c b/jni/love/src/libraries/luasocket/libluasocket/inet.c index f2cddeea..dff84432 100644 --- a/jni/love/src/libraries/luasocket/libluasocket/inet.c +++ b/jni/love/src/libraries/luasocket/libluasocket/inet.c @@ -12,6 +12,8 @@ #include "inet.h" +extern void luax_register(lua_State *L, const char *name, const luaL_Reg *l); + /*=========================================================================*\ * Internal function prototypes. \*=========================================================================*/ @@ -38,7 +40,7 @@ int inet_open(lua_State *L) { lua_pushstring(L, "dns"); lua_newtable(L); - luaL_openlib(L, NULL, func, 0); + luax_register(L, NULL, func); lua_settable(L, -3); return 0; } diff --git a/jni/love/src/libraries/luasocket/libluasocket/luasocket.c b/jni/love/src/libraries/luasocket/libluasocket/luasocket.c index 0d10bb1d..a60090e7 100644 --- a/jni/love/src/libraries/luasocket/libluasocket/luasocket.c +++ b/jni/love/src/libraries/luasocket/libluasocket/luasocket.c @@ -37,6 +37,8 @@ #include "udp.h" #include "select.h" +extern void luax_register(lua_State *L, const char *name, const luaL_Reg *l); + /*-------------------------------------------------------------------------*\ * Internal function prototypes \*-------------------------------------------------------------------------*/ @@ -69,7 +71,7 @@ static luaL_reg func[] = { * Skip a few arguments \*-------------------------------------------------------------------------*/ static int global_skip(lua_State *L) { - int amount = luaL_checkint(L, 1); + int amount = (int) luaL_checknumber(L, 1); int ret = lua_gettop(L) - amount - 1; return ret >= 0 ? ret : 0; } @@ -89,7 +91,7 @@ static int global_unload(lua_State *L) { static int base_open(lua_State *L) { if (socket_open()) { /* export functions (and leave namespace table on top of stack) */ - luaL_openlib(L, "socket", func, 0); + luax_register(L, "socket", func); #ifdef LUASOCKET_DEBUG lua_pushstring(L, "_DEBUG"); lua_pushboolean(L, 1); diff --git a/jni/love/src/libraries/luasocket/libluasocket/mime.c b/jni/love/src/libraries/luasocket/libluasocket/mime.c index 700fa05e..66098911 100644 --- a/jni/love/src/libraries/luasocket/libluasocket/mime.c +++ b/jni/love/src/libraries/luasocket/libluasocket/mime.c @@ -15,6 +15,8 @@ #include "mime.h" +extern void luax_register(lua_State *L, const char *name, const luaL_Reg *l); + /*=========================================================================*\ * Don't want to trust escape character constants \*=========================================================================*/ @@ -83,7 +85,7 @@ static UC b64unbase[256]; \*-------------------------------------------------------------------------*/ MIME_API int luaopen_mime_core(lua_State *L) { - luaL_openlib(L, "mime", func, 0); + luax_register(L, "mime", func); /* make version string available to scripts */ lua_pushstring(L, "_VERSION"); lua_pushstring(L, MIME_VERSION); @@ -644,7 +646,7 @@ static int eolprocess(int c, int last, const char *marker, \*-------------------------------------------------------------------------*/ static int mime_global_eol(lua_State *L) { - int ctx = luaL_checkint(L, 1); + int ctx = (int) luaL_checknumber(L, 1); size_t isize = 0; const char *input = luaL_optlstring(L, 2, NULL, &isize); const char *last = input + isize; diff --git a/jni/love/src/libraries/luasocket/libluasocket/select.c b/jni/love/src/libraries/luasocket/libluasocket/select.c index d70f6627..73848ce2 100644 --- a/jni/love/src/libraries/luasocket/libluasocket/select.c +++ b/jni/love/src/libraries/luasocket/libluasocket/select.c @@ -13,6 +13,8 @@ #include "timeout.h" #include "select.h" +extern void luax_register(lua_State *L, const char *name, const luaL_Reg *l); + /*=========================================================================*\ * Internal function prototypes. \*=========================================================================*/ @@ -39,7 +41,7 @@ static luaL_reg func[] = { * Initializes module \*-------------------------------------------------------------------------*/ int select_open(lua_State *L) { - luaL_openlib(L, NULL, func, 0); + luax_register(L, NULL, func); return 0; } diff --git a/jni/love/src/libraries/luasocket/libluasocket/tcp.c b/jni/love/src/libraries/luasocket/libluasocket/tcp.c index 6b8a79b4..7e26b080 100644 --- a/jni/love/src/libraries/luasocket/libluasocket/tcp.c +++ b/jni/love/src/libraries/luasocket/libluasocket/tcp.c @@ -15,6 +15,8 @@ #include "options.h" #include "tcp.h" +extern void luax_register(lua_State *L, const char *name, const luaL_Reg *l); + /*=========================================================================*\ * Internal function prototypes \*=========================================================================*/ @@ -92,7 +94,7 @@ int tcp_open(lua_State *L) auxiliar_add2group(L, "tcp{client}", "tcp{any}"); auxiliar_add2group(L, "tcp{server}", "tcp{any}"); /* define library functions */ - luaL_openlib(L, NULL, func, 0); + luax_register(L, NULL, func); return 0; } diff --git a/jni/love/src/libraries/luasocket/libluasocket/timeout.c b/jni/love/src/libraries/luasocket/libluasocket/timeout.c index c1df1021..8db087f4 100644 --- a/jni/love/src/libraries/luasocket/libluasocket/timeout.c +++ b/jni/love/src/libraries/luasocket/libluasocket/timeout.c @@ -27,6 +27,8 @@ #define MAX(x, y) ((x) > (y) ? x : y) #endif +extern void luax_register(lua_State *L, const char *name, const luaL_Reg *l); + /*=========================================================================*\ * Internal function prototypes \*=========================================================================*/ @@ -144,7 +146,7 @@ double timeout_gettime(void) { * Initializes module \*-------------------------------------------------------------------------*/ int timeout_open(lua_State *L) { - luaL_openlib(L, NULL, func, 0); + luax_register(L, NULL, func); return 0; } diff --git a/jni/love/src/libraries/luasocket/libluasocket/udp.c b/jni/love/src/libraries/luasocket/libluasocket/udp.c index fc25aa02..640c459e 100644 --- a/jni/love/src/libraries/luasocket/libluasocket/udp.c +++ b/jni/love/src/libraries/luasocket/libluasocket/udp.c @@ -23,6 +23,8 @@ #define MAX(x, y) ((x) > (y) ? x : y) #endif +extern void luax_register(lua_State *L, const char *name, const luaL_Reg *l); + /*=========================================================================*\ * Internal function prototypes \*=========================================================================*/ @@ -95,7 +97,7 @@ int udp_open(lua_State *L) auxiliar_add2group(L, "udp{connected}", "select{able}"); auxiliar_add2group(L, "udp{unconnected}", "select{able}"); /* define library functions */ - luaL_openlib(L, NULL, func, 0); + luax_register(L, NULL, func); return 0; } diff --git a/jni/love/src/libraries/luasocket/libluasocket/unix.c b/jni/love/src/libraries/luasocket/libluasocket/unix.c index 158d319a..fb12903d 100644 --- a/jni/love/src/libraries/luasocket/libluasocket/unix.c +++ b/jni/love/src/libraries/luasocket/libluasocket/unix.c @@ -15,6 +15,9 @@ #include "unix.h" #include +extern void luax_register(lua_State *L, const char *name, const luaL_Reg *l); +extern int luax_c_insistglobal(lua_State *L, const char *k); + /*=========================================================================*\ * Internal function prototypes \*=========================================================================*/ @@ -90,10 +93,14 @@ int luaopen_socket_unix(lua_State *L) { auxiliar_add2group(L, "unix{client}", "unix{any}"); auxiliar_add2group(L, "unix{server}", "unix{any}"); /* make sure the function ends up in the package table */ - luaL_openlib(L, "socket", func, 0); - /* return the function instead of the 'socket' table */ + lua_pushcfunction(L, global_create); + + luax_c_insistglobal(L, "socket"); lua_pushstring(L, "unix"); - lua_gettable(L, -2); + lua_pushvalue(L, -3); + lua_settable(L, -3); + + /* return the function instead of the 'socket' table */ return 1; } diff --git a/jni/love/src/libraries/luautf8/lutf8lib.c b/jni/love/src/libraries/luautf8/lutf8lib.c index 6418e311..48abc338 100644 --- a/jni/love/src/libraries/luautf8/lutf8lib.c +++ b/jni/love/src/libraries/luautf8/lutf8lib.c @@ -43,6 +43,9 @@ #define MAXUNICODE 0x10FFFF +/* size of buffer for 'utf8esc' function (taken from lobject.h) */ +#define UTF8BUFFSZ 8 + #define iscont(p) ((*(p) & 0xC0) == 0x80) @@ -146,10 +149,33 @@ static int codepoint (lua_State *L) { } +/* taken from lobject.c */ +static int utf8esc (char *buff, unsigned long x) { + int n = 1; /* number of bytes put in buffer (backwards) */ + lua_assert(x <= 0x10FFFF); + if (x < 0x80) /* ascii? */ + buff[UTF8BUFFSZ - 1] = (char) x; + else { /* need continuation bytes */ + unsigned int mfb = 0x3f; /* maximum that fits in first byte */ + do { /* add continuation bytes */ + buff[UTF8BUFFSZ - (n++)] = (char) (0x80 | (x & 0x3f)); + x >>= 6; /* remove added bits */ + mfb >>= 1; /* now there is one less bit available in first byte */ + } while (x > mfb); /* still needs continuation byte? */ + buff[UTF8BUFFSZ - n] = (char) ((~mfb << 1) | x); /* add first byte */ + } + return n; +} + static void pushutfchar (lua_State *L, int arg) { lua_Integer code = luaL_checkinteger(L, arg); luaL_argcheck(L, 0 <= code && code <= MAXUNICODE, arg, "value out of range"); - lua_pushfstring(L, "%U", (long)code); + + /* the %U string format does not exist in lua 5.1 or 5.2, so we emulate it */ + /* (code from luaO_pushvfstring in lobject.c) */ + char buff[UTF8BUFFSZ]; + int l = utf8esc(buff, (long) code); + lua_pushlstring(L, buff + UTF8BUFFSZ - l, l); } diff --git a/jni/love/src/libraries/lz4/lz4.c b/jni/love/src/libraries/lz4/lz4.c new file mode 100755 index 00000000..08cf6b5c --- /dev/null +++ b/jni/love/src/libraries/lz4/lz4.c @@ -0,0 +1,1516 @@ +/* + LZ4 - Fast LZ compression algorithm + Copyright (C) 2011-2015, Yann Collet. + + BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + You can contact the author at : + - LZ4 source repository : https://github.com/Cyan4973/lz4 + - LZ4 public forum : https://groups.google.com/forum/#!forum/lz4c +*/ + + +/************************************** +* Tuning parameters +**************************************/ +/* + * HEAPMODE : + * Select how default compression functions will allocate memory for their hash table, + * in memory stack (0:default, fastest), or in memory heap (1:requires malloc()). + */ +#define HEAPMODE 0 + +/* + * ACCELERATION_DEFAULT : + * Select "acceleration" for LZ4_compress_fast() when parameter value <= 0 + */ +#define ACCELERATION_DEFAULT 1 + + +/************************************** +* CPU Feature Detection +**************************************/ +/* + * LZ4_FORCE_SW_BITCOUNT + * Define this parameter if your target system or compiler does not support hardware bit count + */ +#if defined(_MSC_VER) && defined(_WIN32_WCE) /* Visual Studio for Windows CE does not support Hardware bit count */ +# define LZ4_FORCE_SW_BITCOUNT +#endif + + +/************************************** +* Includes +**************************************/ +#include "lz4.h" + + +/************************************** +* Compiler Options +**************************************/ +#ifdef _MSC_VER /* Visual Studio */ +# define FORCE_INLINE static __forceinline +# include +# pragma warning(disable : 4127) /* disable: C4127: conditional expression is constant */ +# pragma warning(disable : 4293) /* disable: C4293: too large shift (32-bits) */ +#else +# if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */ +# if defined(__GNUC__) || defined(__clang__) +# define FORCE_INLINE static inline __attribute__((always_inline)) +# else +# define FORCE_INLINE static inline +# endif +# else +# define FORCE_INLINE static +# endif /* __STDC_VERSION__ */ +#endif /* _MSC_VER */ + +/* LZ4_GCC_VERSION is defined into lz4.h */ +#if (LZ4_GCC_VERSION >= 302) || (__INTEL_COMPILER >= 800) || defined(__clang__) +# define expect(expr,value) (__builtin_expect ((expr),(value)) ) +#else +# define expect(expr,value) (expr) +#endif + +#define likely(expr) expect((expr) != 0, 1) +#define unlikely(expr) expect((expr) != 0, 0) + + +/************************************** +* Memory routines +**************************************/ +#include /* malloc, calloc, free */ +#define ALLOCATOR(n,s) calloc(n,s) +#define FREEMEM free +#include /* memset, memcpy */ +#define MEM_INIT memset + + +/************************************** +* Basic Types +**************************************/ +#if defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */ +# include + typedef uint8_t BYTE; + typedef uint16_t U16; + typedef uint32_t U32; + typedef int32_t S32; + typedef uint64_t U64; +#else + typedef unsigned char BYTE; + typedef unsigned short U16; + typedef unsigned int U32; + typedef signed int S32; + typedef unsigned long long U64; +#endif + + +/************************************** +* Reading and writing into memory +**************************************/ +#define STEPSIZE sizeof(size_t) + +static unsigned LZ4_64bits(void) { return sizeof(void*)==8; } + +static unsigned LZ4_isLittleEndian(void) +{ + const union { U32 i; BYTE c[4]; } one = { 1 }; /* don't use static : performance detrimental */ + return one.c[0]; +} + + +static U16 LZ4_read16(const void* memPtr) +{ + U16 val16; + memcpy(&val16, memPtr, 2); + return val16; +} + +static U16 LZ4_readLE16(const void* memPtr) +{ + if (LZ4_isLittleEndian()) + { + return LZ4_read16(memPtr); + } + else + { + const BYTE* p = (const BYTE*)memPtr; + return (U16)((U16)p[0] + (p[1]<<8)); + } +} + +static void LZ4_writeLE16(void* memPtr, U16 value) +{ + if (LZ4_isLittleEndian()) + { + memcpy(memPtr, &value, 2); + } + else + { + BYTE* p = (BYTE*)memPtr; + p[0] = (BYTE) value; + p[1] = (BYTE)(value>>8); + } +} + +static U32 LZ4_read32(const void* memPtr) +{ + U32 val32; + memcpy(&val32, memPtr, 4); + return val32; +} + +static U64 LZ4_read64(const void* memPtr) +{ + U64 val64; + memcpy(&val64, memPtr, 8); + return val64; +} + +static size_t LZ4_read_ARCH(const void* p) +{ + if (LZ4_64bits()) + return (size_t)LZ4_read64(p); + else + return (size_t)LZ4_read32(p); +} + + +static void LZ4_copy4(void* dstPtr, const void* srcPtr) { memcpy(dstPtr, srcPtr, 4); } + +static void LZ4_copy8(void* dstPtr, const void* srcPtr) { memcpy(dstPtr, srcPtr, 8); } + +/* customized version of memcpy, which may overwrite up to 7 bytes beyond dstEnd */ +static void LZ4_wildCopy(void* dstPtr, const void* srcPtr, void* dstEnd) +{ + BYTE* d = (BYTE*)dstPtr; + const BYTE* s = (const BYTE*)srcPtr; + BYTE* e = (BYTE*)dstEnd; + do { LZ4_copy8(d,s); d+=8; s+=8; } while (d>3); +# elif (defined(__clang__) || (LZ4_GCC_VERSION >= 304)) && !defined(LZ4_FORCE_SW_BITCOUNT) + return (__builtin_ctzll((U64)val) >> 3); +# else + static const int DeBruijnBytePos[64] = { 0, 0, 0, 0, 0, 1, 1, 2, 0, 3, 1, 3, 1, 4, 2, 7, 0, 2, 3, 6, 1, 5, 3, 5, 1, 3, 4, 4, 2, 5, 6, 7, 7, 0, 1, 2, 3, 3, 4, 6, 2, 6, 5, 5, 3, 4, 5, 6, 7, 1, 2, 4, 6, 4, 4, 5, 7, 2, 6, 5, 7, 6, 7, 7 }; + return DeBruijnBytePos[((U64)((val & -(long long)val) * 0x0218A392CDABBD3FULL)) >> 58]; +# endif + } + else /* 32 bits */ + { +# if defined(_MSC_VER) && !defined(LZ4_FORCE_SW_BITCOUNT) + unsigned long r; + _BitScanForward( &r, (U32)val ); + return (int)(r>>3); +# elif (defined(__clang__) || (LZ4_GCC_VERSION >= 304)) && !defined(LZ4_FORCE_SW_BITCOUNT) + return (__builtin_ctz((U32)val) >> 3); +# else + static const int DeBruijnBytePos[32] = { 0, 0, 3, 0, 3, 1, 3, 0, 3, 2, 2, 1, 3, 2, 0, 1, 3, 3, 1, 2, 2, 2, 2, 0, 3, 1, 2, 0, 1, 0, 1, 1 }; + return DeBruijnBytePos[((U32)((val & -(S32)val) * 0x077CB531U)) >> 27]; +# endif + } + } + else /* Big Endian CPU */ + { + if (LZ4_64bits()) + { +# if defined(_MSC_VER) && defined(_WIN64) && !defined(LZ4_FORCE_SW_BITCOUNT) + unsigned long r = 0; + _BitScanReverse64( &r, val ); + return (unsigned)(r>>3); +# elif (defined(__clang__) || (LZ4_GCC_VERSION >= 304)) && !defined(LZ4_FORCE_SW_BITCOUNT) + return (__builtin_clzll((U64)val) >> 3); +# else + unsigned r; + if (!(val>>32)) { r=4; } else { r=0; val>>=32; } + if (!(val>>16)) { r+=2; val>>=8; } else { val>>=24; } + r += (!val); + return r; +# endif + } + else /* 32 bits */ + { +# if defined(_MSC_VER) && !defined(LZ4_FORCE_SW_BITCOUNT) + unsigned long r = 0; + _BitScanReverse( &r, (unsigned long)val ); + return (unsigned)(r>>3); +# elif (defined(__clang__) || (LZ4_GCC_VERSION >= 304)) && !defined(LZ4_FORCE_SW_BITCOUNT) + return (__builtin_clz((U32)val) >> 3); +# else + unsigned r; + if (!(val>>16)) { r=2; val>>=8; } else { r=0; val>>=24; } + r += (!val); + return r; +# endif + } + } +} + +static unsigned LZ4_count(const BYTE* pIn, const BYTE* pMatch, const BYTE* pInLimit) +{ + const BYTE* const pStart = pIn; + + while (likely(pIn compression run slower on incompressible data */ + + +/************************************** +* Local Structures and types +**************************************/ +typedef struct { + U32 hashTable[HASH_SIZE_U32]; + U32 currentOffset; + U32 initCheck; + const BYTE* dictionary; + BYTE* bufferStart; /* obsolete, used for slideInputBuffer */ + U32 dictSize; +} LZ4_stream_t_internal; + +typedef enum { notLimited = 0, limitedOutput = 1 } limitedOutput_directive; +typedef enum { byPtr, byU32, byU16 } tableType_t; + +typedef enum { noDict = 0, withPrefix64k, usingExtDict } dict_directive; +typedef enum { noDictIssue = 0, dictSmall } dictIssue_directive; + +typedef enum { endOnOutputSize = 0, endOnInputSize = 1 } endCondition_directive; +typedef enum { full = 0, partial = 1 } earlyEnd_directive; + + +/************************************** +* Local Utils +**************************************/ +int LZ4_versionNumber (void) { return LZ4_VERSION_NUMBER; } +int LZ4_compressBound(int isize) { return LZ4_COMPRESSBOUND(isize); } +int LZ4_sizeofState() { return LZ4_STREAMSIZE; } + + + +/******************************** +* Compression functions +********************************/ + +static U32 LZ4_hashSequence(U32 sequence, tableType_t const tableType) +{ + if (tableType == byU16) + return (((sequence) * 2654435761U) >> ((MINMATCH*8)-(LZ4_HASHLOG+1))); + else + return (((sequence) * 2654435761U) >> ((MINMATCH*8)-LZ4_HASHLOG)); +} + +static const U64 prime5bytes = 889523592379ULL; +static U32 LZ4_hashSequence64(size_t sequence, tableType_t const tableType) +{ + const U32 hashLog = (tableType == byU16) ? LZ4_HASHLOG+1 : LZ4_HASHLOG; + const U32 hashMask = (1<> (40 - hashLog)) & hashMask; +} + +static U32 LZ4_hashSequenceT(size_t sequence, tableType_t const tableType) +{ + if (LZ4_64bits()) + return LZ4_hashSequence64(sequence, tableType); + return LZ4_hashSequence((U32)sequence, tableType); +} + +static U32 LZ4_hashPosition(const void* p, tableType_t tableType) { return LZ4_hashSequenceT(LZ4_read_ARCH(p), tableType); } + +static void LZ4_putPositionOnHash(const BYTE* p, U32 h, void* tableBase, tableType_t const tableType, const BYTE* srcBase) +{ + switch (tableType) + { + case byPtr: { const BYTE** hashTable = (const BYTE**)tableBase; hashTable[h] = p; return; } + case byU32: { U32* hashTable = (U32*) tableBase; hashTable[h] = (U32)(p-srcBase); return; } + case byU16: { U16* hashTable = (U16*) tableBase; hashTable[h] = (U16)(p-srcBase); return; } + } +} + +static void LZ4_putPosition(const BYTE* p, void* tableBase, tableType_t tableType, const BYTE* srcBase) +{ + U32 h = LZ4_hashPosition(p, tableType); + LZ4_putPositionOnHash(p, h, tableBase, tableType, srcBase); +} + +static const BYTE* LZ4_getPositionOnHash(U32 h, void* tableBase, tableType_t tableType, const BYTE* srcBase) +{ + if (tableType == byPtr) { const BYTE** hashTable = (const BYTE**) tableBase; return hashTable[h]; } + if (tableType == byU32) { U32* hashTable = (U32*) tableBase; return hashTable[h] + srcBase; } + { U16* hashTable = (U16*) tableBase; return hashTable[h] + srcBase; } /* default, to ensure a return */ +} + +static const BYTE* LZ4_getPosition(const BYTE* p, void* tableBase, tableType_t tableType, const BYTE* srcBase) +{ + U32 h = LZ4_hashPosition(p, tableType); + return LZ4_getPositionOnHash(h, tableBase, tableType, srcBase); +} + +FORCE_INLINE int LZ4_compress_generic( + void* const ctx, + const char* const source, + char* const dest, + const int inputSize, + const int maxOutputSize, + const limitedOutput_directive outputLimited, + const tableType_t tableType, + const dict_directive dict, + const dictIssue_directive dictIssue, + const U32 acceleration) +{ + LZ4_stream_t_internal* const dictPtr = (LZ4_stream_t_internal*)ctx; + + const BYTE* ip = (const BYTE*) source; + const BYTE* base; + const BYTE* lowLimit; + const BYTE* const lowRefLimit = ip - dictPtr->dictSize; + const BYTE* const dictionary = dictPtr->dictionary; + const BYTE* const dictEnd = dictionary + dictPtr->dictSize; + const size_t dictDelta = dictEnd - (const BYTE*)source; + const BYTE* anchor = (const BYTE*) source; + const BYTE* const iend = ip + inputSize; + const BYTE* const mflimit = iend - MFLIMIT; + const BYTE* const matchlimit = iend - LASTLITERALS; + + BYTE* op = (BYTE*) dest; + BYTE* const olimit = op + maxOutputSize; + + U32 forwardH; + size_t refDelta=0; + + /* Init conditions */ + if ((U32)inputSize > (U32)LZ4_MAX_INPUT_SIZE) return 0; /* Unsupported input size, too large (or negative) */ + switch(dict) + { + case noDict: + default: + base = (const BYTE*)source; + lowLimit = (const BYTE*)source; + break; + case withPrefix64k: + base = (const BYTE*)source - dictPtr->currentOffset; + lowLimit = (const BYTE*)source - dictPtr->dictSize; + break; + case usingExtDict: + base = (const BYTE*)source - dictPtr->currentOffset; + lowLimit = (const BYTE*)source; + break; + } + if ((tableType == byU16) && (inputSize>=LZ4_64Klimit)) return 0; /* Size too large (not within 64K limit) */ + if (inputSize> LZ4_skipTrigger); + + if (unlikely(forwardIp > mflimit)) goto _last_literals; + + match = LZ4_getPositionOnHash(h, ctx, tableType, base); + if (dict==usingExtDict) + { + if (match<(const BYTE*)source) + { + refDelta = dictDelta; + lowLimit = dictionary; + } + else + { + refDelta = 0; + lowLimit = (const BYTE*)source; + } + } + forwardH = LZ4_hashPosition(forwardIp, tableType); + LZ4_putPositionOnHash(ip, h, ctx, tableType, base); + + } while ( ((dictIssue==dictSmall) ? (match < lowRefLimit) : 0) + || ((tableType==byU16) ? 0 : (match + MAX_DISTANCE < ip)) + || (LZ4_read32(match+refDelta) != LZ4_read32(ip)) ); + } + + /* Catch up */ + while ((ip>anchor) && (match+refDelta > lowLimit) && (unlikely(ip[-1]==match[refDelta-1]))) { ip--; match--; } + + { + /* Encode Literal length */ + unsigned litLength = (unsigned)(ip - anchor); + token = op++; + if ((outputLimited) && (unlikely(op + litLength + (2 + 1 + LASTLITERALS) + (litLength/255) > olimit))) + return 0; /* Check output limit */ + if (litLength>=RUN_MASK) + { + int len = (int)litLength-RUN_MASK; + *token=(RUN_MASK<= 255 ; len-=255) *op++ = 255; + *op++ = (BYTE)len; + } + else *token = (BYTE)(litLength< matchlimit) limit = matchlimit; + matchLength = LZ4_count(ip+MINMATCH, match+MINMATCH, limit); + ip += MINMATCH + matchLength; + if (ip==limit) + { + unsigned more = LZ4_count(ip, (const BYTE*)source, matchlimit); + matchLength += more; + ip += more; + } + } + else + { + matchLength = LZ4_count(ip+MINMATCH, match+MINMATCH, matchlimit); + ip += MINMATCH + matchLength; + } + + if ((outputLimited) && (unlikely(op + (1 + LASTLITERALS) + (matchLength>>8) > olimit))) + return 0; /* Check output limit */ + if (matchLength>=ML_MASK) + { + *token += ML_MASK; + matchLength -= ML_MASK; + for (; matchLength >= 510 ; matchLength-=510) { *op++ = 255; *op++ = 255; } + if (matchLength >= 255) { matchLength-=255; *op++ = 255; } + *op++ = (BYTE)matchLength; + } + else *token += (BYTE)(matchLength); + } + + anchor = ip; + + /* Test end of chunk */ + if (ip > mflimit) break; + + /* Fill table */ + LZ4_putPosition(ip-2, ctx, tableType, base); + + /* Test next position */ + match = LZ4_getPosition(ip, ctx, tableType, base); + if (dict==usingExtDict) + { + if (match<(const BYTE*)source) + { + refDelta = dictDelta; + lowLimit = dictionary; + } + else + { + refDelta = 0; + lowLimit = (const BYTE*)source; + } + } + LZ4_putPosition(ip, ctx, tableType, base); + if ( ((dictIssue==dictSmall) ? (match>=lowRefLimit) : 1) + && (match+MAX_DISTANCE>=ip) + && (LZ4_read32(match+refDelta)==LZ4_read32(ip)) ) + { token=op++; *token=0; goto _next_match; } + + /* Prepare next loop */ + forwardH = LZ4_hashPosition(++ip, tableType); + } + +_last_literals: + /* Encode Last Literals */ + { + const size_t lastRun = (size_t)(iend - anchor); + if ((outputLimited) && ((op - (BYTE*)dest) + lastRun + 1 + ((lastRun+255-RUN_MASK)/255) > (U32)maxOutputSize)) + return 0; /* Check output limit */ + if (lastRun >= RUN_MASK) + { + size_t accumulator = lastRun - RUN_MASK; + *op++ = RUN_MASK << ML_BITS; + for(; accumulator >= 255 ; accumulator-=255) *op++ = 255; + *op++ = (BYTE) accumulator; + } + else + { + *op++ = (BYTE)(lastRun<= LZ4_compressBound(inputSize)) + { + if (inputSize < LZ4_64Klimit) + return LZ4_compress_generic(state, source, dest, inputSize, 0, notLimited, byU16, noDict, noDictIssue, acceleration); + else + return LZ4_compress_generic(state, source, dest, inputSize, 0, notLimited, LZ4_64bits() ? byU32 : byPtr, noDict, noDictIssue, acceleration); + } + else + { + if (inputSize < LZ4_64Klimit) + return LZ4_compress_generic(state, source, dest, inputSize, maxOutputSize, limitedOutput, byU16, noDict, noDictIssue, acceleration); + else + return LZ4_compress_generic(state, source, dest, inputSize, maxOutputSize, limitedOutput, LZ4_64bits() ? byU32 : byPtr, noDict, noDictIssue, acceleration); + } +} + + +int LZ4_compress_fast(const char* source, char* dest, int inputSize, int maxOutputSize, int acceleration) +{ +#if (HEAPMODE) + void* ctxPtr = ALLOCATOR(1, sizeof(LZ4_stream_t)); /* malloc-calloc always properly aligned */ +#else + LZ4_stream_t ctx; + void* ctxPtr = &ctx; +#endif + + int result = LZ4_compress_fast_extState(ctxPtr, source, dest, inputSize, maxOutputSize, acceleration); + +#if (HEAPMODE) + FREEMEM(ctxPtr); +#endif + return result; +} + + +int LZ4_compress_default(const char* source, char* dest, int inputSize, int maxOutputSize) +{ + return LZ4_compress_fast(source, dest, inputSize, maxOutputSize, 1); +} + + +/* hidden debug function */ +/* strangely enough, gcc generates faster code when this function is uncommented, even if unused */ +int LZ4_compress_fast_force(const char* source, char* dest, int inputSize, int maxOutputSize, int acceleration) +{ + LZ4_stream_t ctx; + + LZ4_resetStream(&ctx); + + if (inputSize < LZ4_64Klimit) + return LZ4_compress_generic(&ctx, source, dest, inputSize, maxOutputSize, limitedOutput, byU16, noDict, noDictIssue, acceleration); + else + return LZ4_compress_generic(&ctx, source, dest, inputSize, maxOutputSize, limitedOutput, LZ4_64bits() ? byU32 : byPtr, noDict, noDictIssue, acceleration); +} + + +/******************************** +* destSize variant +********************************/ + +static int LZ4_compress_destSize_generic( + void* const ctx, + const char* const src, + char* const dst, + int* const srcSizePtr, + const int targetDstSize, + const tableType_t tableType) +{ + const BYTE* ip = (const BYTE*) src; + const BYTE* base = (const BYTE*) src; + const BYTE* lowLimit = (const BYTE*) src; + const BYTE* anchor = ip; + const BYTE* const iend = ip + *srcSizePtr; + const BYTE* const mflimit = iend - MFLIMIT; + const BYTE* const matchlimit = iend - LASTLITERALS; + + BYTE* op = (BYTE*) dst; + BYTE* const oend = op + targetDstSize; + BYTE* const oMaxLit = op + targetDstSize - 2 /* offset */ - 8 /* because 8+MINMATCH==MFLIMIT */ - 1 /* token */; + BYTE* const oMaxMatch = op + targetDstSize - (LASTLITERALS + 1 /* token */); + BYTE* const oMaxSeq = oMaxLit - 1 /* token */; + + U32 forwardH; + + + /* Init conditions */ + if (targetDstSize < 1) return 0; /* Impossible to store anything */ + if ((U32)*srcSizePtr > (U32)LZ4_MAX_INPUT_SIZE) return 0; /* Unsupported input size, too large (or negative) */ + if ((tableType == byU16) && (*srcSizePtr>=LZ4_64Klimit)) return 0; /* Size too large (not within 64K limit) */ + if (*srcSizePtr> LZ4_skipTrigger); + + if (unlikely(forwardIp > mflimit)) + goto _last_literals; + + match = LZ4_getPositionOnHash(h, ctx, tableType, base); + forwardH = LZ4_hashPosition(forwardIp, tableType); + LZ4_putPositionOnHash(ip, h, ctx, tableType, base); + + } while ( ((tableType==byU16) ? 0 : (match + MAX_DISTANCE < ip)) + || (LZ4_read32(match) != LZ4_read32(ip)) ); + } + + /* Catch up */ + while ((ip>anchor) && (match > lowLimit) && (unlikely(ip[-1]==match[-1]))) { ip--; match--; } + + { + /* Encode Literal length */ + unsigned litLength = (unsigned)(ip - anchor); + token = op++; + if (op + ((litLength+240)/255) + litLength > oMaxLit) + { + /* Not enough space for a last match */ + op--; + goto _last_literals; + } + if (litLength>=RUN_MASK) + { + unsigned len = litLength - RUN_MASK; + *token=(RUN_MASK<= 255 ; len-=255) *op++ = 255; + *op++ = (BYTE)len; + } + else *token = (BYTE)(litLength< oMaxMatch) + { + /* Match description too long : reduce it */ + matchLength = (15-1) + (oMaxMatch-op) * 255; + } + //printf("offset %5i, matchLength%5i \n", (int)(ip-match), matchLength + MINMATCH); + ip += MINMATCH + matchLength; + + if (matchLength>=ML_MASK) + { + *token += ML_MASK; + matchLength -= ML_MASK; + while (matchLength >= 255) { matchLength-=255; *op++ = 255; } + *op++ = (BYTE)matchLength; + } + else *token += (BYTE)(matchLength); + } + + anchor = ip; + + /* Test end of block */ + if (ip > mflimit) break; + if (op > oMaxSeq) break; + + /* Fill table */ + LZ4_putPosition(ip-2, ctx, tableType, base); + + /* Test next position */ + match = LZ4_getPosition(ip, ctx, tableType, base); + LZ4_putPosition(ip, ctx, tableType, base); + if ( (match+MAX_DISTANCE>=ip) + && (LZ4_read32(match)==LZ4_read32(ip)) ) + { token=op++; *token=0; goto _next_match; } + + /* Prepare next loop */ + forwardH = LZ4_hashPosition(++ip, tableType); + } + +_last_literals: + /* Encode Last Literals */ + { + size_t lastRunSize = (size_t)(iend - anchor); + if (op + 1 /* token */ + ((lastRunSize+240)/255) /* litLength */ + lastRunSize /* literals */ > oend) + { + /* adapt lastRunSize to fill 'dst' */ + lastRunSize = (oend-op) - 1; + lastRunSize -= (lastRunSize+240)/255; + } + ip = anchor + lastRunSize; + + if (lastRunSize >= RUN_MASK) + { + size_t accumulator = lastRunSize - RUN_MASK; + *op++ = RUN_MASK << ML_BITS; + for(; accumulator >= 255 ; accumulator-=255) *op++ = 255; + *op++ = (BYTE) accumulator; + } + else + { + *op++ = (BYTE)(lastRunSize<= LZ4_compressBound(*srcSizePtr)) /* compression success is guaranteed */ + { + return LZ4_compress_fast_extState(state, src, dst, *srcSizePtr, targetDstSize, 1); + } + else + { + if (*srcSizePtr < LZ4_64Klimit) + return LZ4_compress_destSize_generic(state, src, dst, srcSizePtr, targetDstSize, byU16); + else + return LZ4_compress_destSize_generic(state, src, dst, srcSizePtr, targetDstSize, LZ4_64bits() ? byU32 : byPtr); + } +} + + +int LZ4_compress_destSize(const char* src, char* dst, int* srcSizePtr, int targetDstSize) +{ +#if (HEAPMODE) + void* ctx = ALLOCATOR(1, sizeof(LZ4_stream_t)); /* malloc-calloc always properly aligned */ +#else + LZ4_stream_t ctxBody; + void* ctx = &ctxBody; +#endif + + int result = LZ4_compress_destSize_extState(ctx, src, dst, srcSizePtr, targetDstSize); + +#if (HEAPMODE) + FREEMEM(ctx); +#endif + return result; +} + + + +/******************************** +* Streaming functions +********************************/ + +LZ4_stream_t* LZ4_createStream(void) +{ + LZ4_stream_t* lz4s = (LZ4_stream_t*)ALLOCATOR(8, LZ4_STREAMSIZE_U64); + LZ4_STATIC_ASSERT(LZ4_STREAMSIZE >= sizeof(LZ4_stream_t_internal)); /* A compilation error here means LZ4_STREAMSIZE is not large enough */ + LZ4_resetStream(lz4s); + return lz4s; +} + +void LZ4_resetStream (LZ4_stream_t* LZ4_stream) +{ + MEM_INIT(LZ4_stream, 0, sizeof(LZ4_stream_t)); +} + +int LZ4_freeStream (LZ4_stream_t* LZ4_stream) +{ + FREEMEM(LZ4_stream); + return (0); +} + + +#define HASH_UNIT sizeof(size_t) +int LZ4_loadDict (LZ4_stream_t* LZ4_dict, const char* dictionary, int dictSize) +{ + LZ4_stream_t_internal* dict = (LZ4_stream_t_internal*) LZ4_dict; + const BYTE* p = (const BYTE*)dictionary; + const BYTE* const dictEnd = p + dictSize; + const BYTE* base; + + if ((dict->initCheck) || (dict->currentOffset > 1 GB)) /* Uninitialized structure, or reuse overflow */ + LZ4_resetStream(LZ4_dict); + + if (dictSize < (int)HASH_UNIT) + { + dict->dictionary = NULL; + dict->dictSize = 0; + return 0; + } + + if ((dictEnd - p) > 64 KB) p = dictEnd - 64 KB; + dict->currentOffset += 64 KB; + base = p - dict->currentOffset; + dict->dictionary = p; + dict->dictSize = (U32)(dictEnd - p); + dict->currentOffset += dict->dictSize; + + while (p <= dictEnd-HASH_UNIT) + { + LZ4_putPosition(p, dict->hashTable, byU32, base); + p+=3; + } + + return dict->dictSize; +} + + +static void LZ4_renormDictT(LZ4_stream_t_internal* LZ4_dict, const BYTE* src) +{ + if ((LZ4_dict->currentOffset > 0x80000000) || + ((size_t)LZ4_dict->currentOffset > (size_t)src)) /* address space overflow */ + { + /* rescale hash table */ + U32 delta = LZ4_dict->currentOffset - 64 KB; + const BYTE* dictEnd = LZ4_dict->dictionary + LZ4_dict->dictSize; + int i; + for (i=0; ihashTable[i] < delta) LZ4_dict->hashTable[i]=0; + else LZ4_dict->hashTable[i] -= delta; + } + LZ4_dict->currentOffset = 64 KB; + if (LZ4_dict->dictSize > 64 KB) LZ4_dict->dictSize = 64 KB; + LZ4_dict->dictionary = dictEnd - LZ4_dict->dictSize; + } +} + + +int LZ4_compress_fast_continue (LZ4_stream_t* LZ4_stream, const char* source, char* dest, int inputSize, int maxOutputSize, int acceleration) +{ + LZ4_stream_t_internal* streamPtr = (LZ4_stream_t_internal*)LZ4_stream; + const BYTE* const dictEnd = streamPtr->dictionary + streamPtr->dictSize; + + const BYTE* smallest = (const BYTE*) source; + if (streamPtr->initCheck) return 0; /* Uninitialized structure detected */ + if ((streamPtr->dictSize>0) && (smallest>dictEnd)) smallest = dictEnd; + LZ4_renormDictT(streamPtr, smallest); + if (acceleration < 1) acceleration = ACCELERATION_DEFAULT; + + /* Check overlapping input/dictionary space */ + { + const BYTE* sourceEnd = (const BYTE*) source + inputSize; + if ((sourceEnd > streamPtr->dictionary) && (sourceEnd < dictEnd)) + { + streamPtr->dictSize = (U32)(dictEnd - sourceEnd); + if (streamPtr->dictSize > 64 KB) streamPtr->dictSize = 64 KB; + if (streamPtr->dictSize < 4) streamPtr->dictSize = 0; + streamPtr->dictionary = dictEnd - streamPtr->dictSize; + } + } + + /* prefix mode : source data follows dictionary */ + if (dictEnd == (const BYTE*)source) + { + int result; + if ((streamPtr->dictSize < 64 KB) && (streamPtr->dictSize < streamPtr->currentOffset)) + result = LZ4_compress_generic(LZ4_stream, source, dest, inputSize, maxOutputSize, limitedOutput, byU32, withPrefix64k, dictSmall, acceleration); + else + result = LZ4_compress_generic(LZ4_stream, source, dest, inputSize, maxOutputSize, limitedOutput, byU32, withPrefix64k, noDictIssue, acceleration); + streamPtr->dictSize += (U32)inputSize; + streamPtr->currentOffset += (U32)inputSize; + return result; + } + + /* external dictionary mode */ + { + int result; + if ((streamPtr->dictSize < 64 KB) && (streamPtr->dictSize < streamPtr->currentOffset)) + result = LZ4_compress_generic(LZ4_stream, source, dest, inputSize, maxOutputSize, limitedOutput, byU32, usingExtDict, dictSmall, acceleration); + else + result = LZ4_compress_generic(LZ4_stream, source, dest, inputSize, maxOutputSize, limitedOutput, byU32, usingExtDict, noDictIssue, acceleration); + streamPtr->dictionary = (const BYTE*)source; + streamPtr->dictSize = (U32)inputSize; + streamPtr->currentOffset += (U32)inputSize; + return result; + } +} + + +/* Hidden debug function, to force external dictionary mode */ +int LZ4_compress_forceExtDict (LZ4_stream_t* LZ4_dict, const char* source, char* dest, int inputSize) +{ + LZ4_stream_t_internal* streamPtr = (LZ4_stream_t_internal*)LZ4_dict; + int result; + const BYTE* const dictEnd = streamPtr->dictionary + streamPtr->dictSize; + + const BYTE* smallest = dictEnd; + if (smallest > (const BYTE*) source) smallest = (const BYTE*) source; + LZ4_renormDictT((LZ4_stream_t_internal*)LZ4_dict, smallest); + + result = LZ4_compress_generic(LZ4_dict, source, dest, inputSize, 0, notLimited, byU32, usingExtDict, noDictIssue, 1); + + streamPtr->dictionary = (const BYTE*)source; + streamPtr->dictSize = (U32)inputSize; + streamPtr->currentOffset += (U32)inputSize; + + return result; +} + + +int LZ4_saveDict (LZ4_stream_t* LZ4_dict, char* safeBuffer, int dictSize) +{ + LZ4_stream_t_internal* dict = (LZ4_stream_t_internal*) LZ4_dict; + const BYTE* previousDictEnd = dict->dictionary + dict->dictSize; + + if ((U32)dictSize > 64 KB) dictSize = 64 KB; /* useless to define a dictionary > 64 KB */ + if ((U32)dictSize > dict->dictSize) dictSize = dict->dictSize; + + memmove(safeBuffer, previousDictEnd - dictSize, dictSize); + + dict->dictionary = (const BYTE*)safeBuffer; + dict->dictSize = (U32)dictSize; + + return dictSize; +} + + + +/******************************* +* Decompression functions +*******************************/ +/* + * This generic decompression function cover all use cases. + * It shall be instantiated several times, using different sets of directives + * Note that it is essential this generic function is really inlined, + * in order to remove useless branches during compilation optimization. + */ +FORCE_INLINE int LZ4_decompress_generic( + const char* const source, + char* const dest, + int inputSize, + int outputSize, /* If endOnInput==endOnInputSize, this value is the max size of Output Buffer. */ + + int endOnInput, /* endOnOutputSize, endOnInputSize */ + int partialDecoding, /* full, partial */ + int targetOutputSize, /* only used if partialDecoding==partial */ + int dict, /* noDict, withPrefix64k, usingExtDict */ + const BYTE* const lowPrefix, /* == dest if dict == noDict */ + const BYTE* const dictStart, /* only if dict==usingExtDict */ + const size_t dictSize /* note : = 0 if noDict */ + ) +{ + /* Local Variables */ + const BYTE* ip = (const BYTE*) source; + const BYTE* const iend = ip + inputSize; + + BYTE* op = (BYTE*) dest; + BYTE* const oend = op + outputSize; + BYTE* cpy; + BYTE* oexit = op + targetOutputSize; + const BYTE* const lowLimit = lowPrefix - dictSize; + + const BYTE* const dictEnd = (const BYTE*)dictStart + dictSize; + const size_t dec32table[] = {4, 1, 2, 1, 4, 4, 4, 4}; + const size_t dec64table[] = {0, 0, 0, (size_t)-1, 0, 1, 2, 3}; + + const int safeDecode = (endOnInput==endOnInputSize); + const int checkOffset = ((safeDecode) && (dictSize < (int)(64 KB))); + + + /* Special cases */ + if ((partialDecoding) && (oexit> oend-MFLIMIT)) oexit = oend-MFLIMIT; /* targetOutputSize too high => decode everything */ + if ((endOnInput) && (unlikely(outputSize==0))) return ((inputSize==1) && (*ip==0)) ? 0 : -1; /* Empty output buffer */ + if ((!endOnInput) && (unlikely(outputSize==0))) return (*ip==0?1:-1); + + + /* Main Loop */ + while (1) + { + unsigned token; + size_t length; + const BYTE* match; + + /* get literal length */ + token = *ip++; + if ((length=(token>>ML_BITS)) == RUN_MASK) + { + unsigned s; + do + { + s = *ip++; + length += s; + } + while (likely((endOnInput)?ip(partialDecoding?oexit:oend-MFLIMIT)) || (ip+length>iend-(2+1+LASTLITERALS))) ) + || ((!endOnInput) && (cpy>oend-COPYLENGTH))) + { + if (partialDecoding) + { + if (cpy > oend) goto _output_error; /* Error : write attempt beyond end of output buffer */ + if ((endOnInput) && (ip+length > iend)) goto _output_error; /* Error : read attempt beyond end of input buffer */ + } + else + { + if ((!endOnInput) && (cpy != oend)) goto _output_error; /* Error : block decoding must stop exactly there */ + if ((endOnInput) && ((ip+length != iend) || (cpy > oend))) goto _output_error; /* Error : input must be consumed */ + } + memcpy(op, ip, length); + ip += length; + op += length; + break; /* Necessarily EOF, due to parsing restrictions */ + } + LZ4_wildCopy(op, ip, cpy); + ip += length; op = cpy; + + /* get offset */ + match = cpy - LZ4_readLE16(ip); ip+=2; + if ((checkOffset) && (unlikely(match < lowLimit))) goto _output_error; /* Error : offset outside destination buffer */ + + /* get matchlength */ + length = token & ML_MASK; + if (length == ML_MASK) + { + unsigned s; + do + { + if ((endOnInput) && (ip > iend-LASTLITERALS)) goto _output_error; + s = *ip++; + length += s; + } while (s==255); + if ((safeDecode) && unlikely((size_t)(op+length)<(size_t)op)) goto _output_error; /* overflow detection */ + } + length += MINMATCH; + + /* check external dictionary */ + if ((dict==usingExtDict) && (match < lowPrefix)) + { + if (unlikely(op+length > oend-LASTLITERALS)) goto _output_error; /* doesn't respect parsing restriction */ + + if (length <= (size_t)(lowPrefix-match)) + { + /* match can be copied as a single segment from external dictionary */ + match = dictEnd - (lowPrefix-match); + memmove(op, match, length); op += length; + } + else + { + /* match encompass external dictionary and current segment */ + size_t copySize = (size_t)(lowPrefix-match); + memcpy(op, dictEnd - copySize, copySize); + op += copySize; + copySize = length - copySize; + if (copySize > (size_t)(op-lowPrefix)) /* overlap within current segment */ + { + BYTE* const endOfMatch = op + copySize; + const BYTE* copyFrom = lowPrefix; + while (op < endOfMatch) *op++ = *copyFrom++; + } + else + { + memcpy(op, lowPrefix, copySize); + op += copySize; + } + } + continue; + } + + /* copy repeated sequence */ + cpy = op + length; + if (unlikely((op-match)<8)) + { + const size_t dec64 = dec64table[op-match]; + op[0] = match[0]; + op[1] = match[1]; + op[2] = match[2]; + op[3] = match[3]; + match += dec32table[op-match]; + LZ4_copy4(op+4, match); + op += 8; match -= dec64; + } else { LZ4_copy8(op, match); op+=8; match+=8; } + + if (unlikely(cpy>oend-12)) + { + if (cpy > oend-LASTLITERALS) goto _output_error; /* Error : last LASTLITERALS bytes must be literals */ + if (op < oend-8) + { + LZ4_wildCopy(op, match, oend-8); + match += (oend-8) - op; + op = oend-8; + } + while (opprefixSize = (size_t) dictSize; + lz4sd->prefixEnd = (const BYTE*) dictionary + dictSize; + lz4sd->externalDict = NULL; + lz4sd->extDictSize = 0; + return 1; +} + +/* +*_continue() : + These decoding functions allow decompression of multiple blocks in "streaming" mode. + Previously decoded blocks must still be available at the memory position where they were decoded. + If it's not possible, save the relevant part of decoded data into a safe buffer, + and indicate where it stands using LZ4_setStreamDecode() +*/ +int LZ4_decompress_safe_continue (LZ4_streamDecode_t* LZ4_streamDecode, const char* source, char* dest, int compressedSize, int maxOutputSize) +{ + LZ4_streamDecode_t_internal* lz4sd = (LZ4_streamDecode_t_internal*) LZ4_streamDecode; + int result; + + if (lz4sd->prefixEnd == (BYTE*)dest) + { + result = LZ4_decompress_generic(source, dest, compressedSize, maxOutputSize, + endOnInputSize, full, 0, + usingExtDict, lz4sd->prefixEnd - lz4sd->prefixSize, lz4sd->externalDict, lz4sd->extDictSize); + if (result <= 0) return result; + lz4sd->prefixSize += result; + lz4sd->prefixEnd += result; + } + else + { + lz4sd->extDictSize = lz4sd->prefixSize; + lz4sd->externalDict = lz4sd->prefixEnd - lz4sd->extDictSize; + result = LZ4_decompress_generic(source, dest, compressedSize, maxOutputSize, + endOnInputSize, full, 0, + usingExtDict, (BYTE*)dest, lz4sd->externalDict, lz4sd->extDictSize); + if (result <= 0) return result; + lz4sd->prefixSize = result; + lz4sd->prefixEnd = (BYTE*)dest + result; + } + + return result; +} + +int LZ4_decompress_fast_continue (LZ4_streamDecode_t* LZ4_streamDecode, const char* source, char* dest, int originalSize) +{ + LZ4_streamDecode_t_internal* lz4sd = (LZ4_streamDecode_t_internal*) LZ4_streamDecode; + int result; + + if (lz4sd->prefixEnd == (BYTE*)dest) + { + result = LZ4_decompress_generic(source, dest, 0, originalSize, + endOnOutputSize, full, 0, + usingExtDict, lz4sd->prefixEnd - lz4sd->prefixSize, lz4sd->externalDict, lz4sd->extDictSize); + if (result <= 0) return result; + lz4sd->prefixSize += originalSize; + lz4sd->prefixEnd += originalSize; + } + else + { + lz4sd->extDictSize = lz4sd->prefixSize; + lz4sd->externalDict = (BYTE*)dest - lz4sd->extDictSize; + result = LZ4_decompress_generic(source, dest, 0, originalSize, + endOnOutputSize, full, 0, + usingExtDict, (BYTE*)dest, lz4sd->externalDict, lz4sd->extDictSize); + if (result <= 0) return result; + lz4sd->prefixSize = originalSize; + lz4sd->prefixEnd = (BYTE*)dest + originalSize; + } + + return result; +} + + +/* +Advanced decoding functions : +*_usingDict() : + These decoding functions work the same as "_continue" ones, + the dictionary must be explicitly provided within parameters +*/ + +FORCE_INLINE int LZ4_decompress_usingDict_generic(const char* source, char* dest, int compressedSize, int maxOutputSize, int safe, const char* dictStart, int dictSize) +{ + if (dictSize==0) + return LZ4_decompress_generic(source, dest, compressedSize, maxOutputSize, safe, full, 0, noDict, (BYTE*)dest, NULL, 0); + if (dictStart+dictSize == dest) + { + if (dictSize >= (int)(64 KB - 1)) + return LZ4_decompress_generic(source, dest, compressedSize, maxOutputSize, safe, full, 0, withPrefix64k, (BYTE*)dest-64 KB, NULL, 0); + return LZ4_decompress_generic(source, dest, compressedSize, maxOutputSize, safe, full, 0, noDict, (BYTE*)dest-dictSize, NULL, 0); + } + return LZ4_decompress_generic(source, dest, compressedSize, maxOutputSize, safe, full, 0, usingExtDict, (BYTE*)dest, (const BYTE*)dictStart, dictSize); +} + +int LZ4_decompress_safe_usingDict(const char* source, char* dest, int compressedSize, int maxOutputSize, const char* dictStart, int dictSize) +{ + return LZ4_decompress_usingDict_generic(source, dest, compressedSize, maxOutputSize, 1, dictStart, dictSize); +} + +int LZ4_decompress_fast_usingDict(const char* source, char* dest, int originalSize, const char* dictStart, int dictSize) +{ + return LZ4_decompress_usingDict_generic(source, dest, 0, originalSize, 0, dictStart, dictSize); +} + +/* debug function */ +int LZ4_decompress_safe_forceExtDict(const char* source, char* dest, int compressedSize, int maxOutputSize, const char* dictStart, int dictSize) +{ + return LZ4_decompress_generic(source, dest, compressedSize, maxOutputSize, endOnInputSize, full, 0, usingExtDict, (BYTE*)dest, (const BYTE*)dictStart, dictSize); +} + + +/*************************************************** +* Obsolete Functions +***************************************************/ +/* obsolete compression functions */ +int LZ4_compress_limitedOutput(const char* source, char* dest, int inputSize, int maxOutputSize) { return LZ4_compress_default(source, dest, inputSize, maxOutputSize); } +int LZ4_compress(const char* source, char* dest, int inputSize) { return LZ4_compress_default(source, dest, inputSize, LZ4_compressBound(inputSize)); } +int LZ4_compress_limitedOutput_withState (void* state, const char* src, char* dst, int srcSize, int dstSize) { return LZ4_compress_fast_extState(state, src, dst, srcSize, dstSize, 1); } +int LZ4_compress_withState (void* state, const char* src, char* dst, int srcSize) { return LZ4_compress_fast_extState(state, src, dst, srcSize, LZ4_compressBound(srcSize), 1); } +int LZ4_compress_limitedOutput_continue (LZ4_stream_t* LZ4_stream, const char* src, char* dst, int srcSize, int maxDstSize) { return LZ4_compress_fast_continue(LZ4_stream, src, dst, srcSize, maxDstSize, 1); } +int LZ4_compress_continue (LZ4_stream_t* LZ4_stream, const char* source, char* dest, int inputSize) { return LZ4_compress_fast_continue(LZ4_stream, source, dest, inputSize, LZ4_compressBound(inputSize), 1); } + +/* +These function names are deprecated and should no longer be used. +They are only provided here for compatibility with older user programs. +- LZ4_uncompress is totally equivalent to LZ4_decompress_fast +- LZ4_uncompress_unknownOutputSize is totally equivalent to LZ4_decompress_safe +*/ +int LZ4_uncompress (const char* source, char* dest, int outputSize) { return LZ4_decompress_fast(source, dest, outputSize); } +int LZ4_uncompress_unknownOutputSize (const char* source, char* dest, int isize, int maxOutputSize) { return LZ4_decompress_safe(source, dest, isize, maxOutputSize); } + + +/* Obsolete Streaming functions */ + +int LZ4_sizeofStreamState() { return LZ4_STREAMSIZE; } + +static void LZ4_init(LZ4_stream_t_internal* lz4ds, BYTE* base) +{ + MEM_INIT(lz4ds, 0, LZ4_STREAMSIZE); + lz4ds->bufferStart = base; +} + +int LZ4_resetStreamState(void* state, char* inputBuffer) +{ + if ((((size_t)state) & 3) != 0) return 1; /* Error : pointer is not aligned on 4-bytes boundary */ + LZ4_init((LZ4_stream_t_internal*)state, (BYTE*)inputBuffer); + return 0; +} + +void* LZ4_create (char* inputBuffer) +{ + void* lz4ds = ALLOCATOR(8, LZ4_STREAMSIZE_U64); + LZ4_init ((LZ4_stream_t_internal*)lz4ds, (BYTE*)inputBuffer); + return lz4ds; +} + +char* LZ4_slideInputBuffer (void* LZ4_Data) +{ + LZ4_stream_t_internal* ctx = (LZ4_stream_t_internal*)LZ4_Data; + int dictSize = LZ4_saveDict((LZ4_stream_t*)LZ4_Data, (char*)ctx->bufferStart, 64 KB); + return (char*)(ctx->bufferStart + dictSize); +} + +/* Obsolete streaming decompression functions */ + +int LZ4_decompress_safe_withPrefix64k(const char* source, char* dest, int compressedSize, int maxOutputSize) +{ + return LZ4_decompress_generic(source, dest, compressedSize, maxOutputSize, endOnInputSize, full, 0, withPrefix64k, (BYTE*)dest - 64 KB, NULL, 64 KB); +} + +int LZ4_decompress_fast_withPrefix64k(const char* source, char* dest, int originalSize) +{ + return LZ4_decompress_generic(source, dest, 0, originalSize, endOnOutputSize, full, 0, withPrefix64k, (BYTE*)dest - 64 KB, NULL, 64 KB); +} + +#endif /* LZ4_COMMONDEFS_ONLY */ + diff --git a/jni/love/src/libraries/lz4/lz4.h b/jni/love/src/libraries/lz4/lz4.h new file mode 100755 index 00000000..99c6ebb0 --- /dev/null +++ b/jni/love/src/libraries/lz4/lz4.h @@ -0,0 +1,360 @@ +/* + LZ4 - Fast LZ compression algorithm + Header File + Copyright (C) 2011-2015, Yann Collet. + + BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + You can contact the author at : + - LZ4 source repository : https://github.com/Cyan4973/lz4 + - LZ4 public forum : https://groups.google.com/forum/#!forum/lz4c +*/ +#pragma once + +#if defined (__cplusplus) +extern "C" { +#endif + +/* + * lz4.h provides block compression functions, and gives full buffer control to programmer. + * If you need to generate inter-operable compressed data (respecting LZ4 frame specification), + * and can let the library handle its own memory, please use lz4frame.h instead. +*/ + +/************************************** +* Version +**************************************/ +#define LZ4_VERSION_MAJOR 1 /* for breaking interface changes */ +#define LZ4_VERSION_MINOR 7 /* for new (non-breaking) interface capabilities */ +#define LZ4_VERSION_RELEASE 0 /* for tweaks, bug-fixes, or development */ +#define LZ4_VERSION_NUMBER (LZ4_VERSION_MAJOR *100*100 + LZ4_VERSION_MINOR *100 + LZ4_VERSION_RELEASE) +int LZ4_versionNumber (void); + +/************************************** +* Tuning parameter +**************************************/ +/* + * LZ4_MEMORY_USAGE : + * Memory usage formula : N->2^N Bytes (examples : 10 -> 1KB; 12 -> 4KB ; 16 -> 64KB; 20 -> 1MB; etc.) + * Increasing memory usage improves compression ratio + * Reduced memory usage can improve speed, due to cache effect + * Default value is 14, for 16KB, which nicely fits into Intel x86 L1 cache + */ +#define LZ4_MEMORY_USAGE 14 + + +/************************************** +* Simple Functions +**************************************/ + +int LZ4_compress_default(const char* source, char* dest, int sourceSize, int maxDestSize); +int LZ4_decompress_safe (const char* source, char* dest, int compressedSize, int maxDecompressedSize); + +/* +LZ4_compress_default() : + Compresses 'sourceSize' bytes from buffer 'source' + into already allocated 'dest' buffer of size 'maxDestSize'. + Compression is guaranteed to succeed if 'maxDestSize' >= LZ4_compressBound(sourceSize). + It also runs faster, so it's a recommended setting. + If the function cannot compress 'source' into a more limited 'dest' budget, + compression stops *immediately*, and the function result is zero. + As a consequence, 'dest' content is not valid. + This function never writes outside 'dest' buffer, nor read outside 'source' buffer. + sourceSize : Max supported value is LZ4_MAX_INPUT_VALUE + maxDestSize : full or partial size of buffer 'dest' (which must be already allocated) + return : the number of bytes written into buffer 'dest' (necessarily <= maxOutputSize) + or 0 if compression fails + +LZ4_decompress_safe() : + compressedSize : is the precise full size of the compressed block. + maxDecompressedSize : is the size of destination buffer, which must be already allocated. + return : the number of bytes decompressed into destination buffer (necessarily <= maxDecompressedSize) + If destination buffer is not large enough, decoding will stop and output an error code (<0). + If the source stream is detected malformed, the function will stop decoding and return a negative result. + This function is protected against buffer overflow exploits, including malicious data packets. + It never writes outside output buffer, nor reads outside input buffer. +*/ + + +/************************************** +* Advanced Functions +**************************************/ +#define LZ4_MAX_INPUT_SIZE 0x7E000000 /* 2 113 929 216 bytes */ +#define LZ4_COMPRESSBOUND(isize) ((unsigned)(isize) > (unsigned)LZ4_MAX_INPUT_SIZE ? 0 : (isize) + ((isize)/255) + 16) + +/* +LZ4_compressBound() : + Provides the maximum size that LZ4 compression may output in a "worst case" scenario (input data not compressible) + This function is primarily useful for memory allocation purposes (destination buffer size). + Macro LZ4_COMPRESSBOUND() is also provided for compilation-time evaluation (stack memory allocation for example). + Note that LZ4_compress_default() compress faster when dest buffer size is >= LZ4_compressBound(srcSize) + inputSize : max supported value is LZ4_MAX_INPUT_SIZE + return : maximum output size in a "worst case" scenario + or 0, if input size is too large ( > LZ4_MAX_INPUT_SIZE) +*/ +int LZ4_compressBound(int inputSize); + +/* +LZ4_compress_fast() : + Same as LZ4_compress_default(), but allows to select an "acceleration" factor. + The larger the acceleration value, the faster the algorithm, but also the lesser the compression. + It's a trade-off. It can be fine tuned, with each successive value providing roughly +~3% to speed. + An acceleration value of "1" is the same as regular LZ4_compress_default() + Values <= 0 will be replaced by ACCELERATION_DEFAULT (see lz4.c), which is 1. +*/ +int LZ4_compress_fast (const char* source, char* dest, int sourceSize, int maxDestSize, int acceleration); + + +/* +LZ4_compress_fast_extState() : + Same compression function, just using an externally allocated memory space to store compression state. + Use LZ4_sizeofState() to know how much memory must be allocated, + and allocate it on 8-bytes boundaries (using malloc() typically). + Then, provide it as 'void* state' to compression function. +*/ +int LZ4_sizeofState(void); +int LZ4_compress_fast_extState (void* state, const char* source, char* dest, int inputSize, int maxDestSize, int acceleration); + + +/* +LZ4_compress_destSize() : + Reverse the logic, by compressing as much data as possible from 'source' buffer + into already allocated buffer 'dest' of size 'targetDestSize'. + This function either compresses the entire 'source' content into 'dest' if it's large enough, + or fill 'dest' buffer completely with as much data as possible from 'source'. + *sourceSizePtr : will be modified to indicate how many bytes where read from 'source' to fill 'dest'. + New value is necessarily <= old value. + return : Nb bytes written into 'dest' (necessarily <= targetDestSize) + or 0 if compression fails +*/ +int LZ4_compress_destSize (const char* source, char* dest, int* sourceSizePtr, int targetDestSize); + + +/* +LZ4_decompress_fast() : + originalSize : is the original and therefore uncompressed size + return : the number of bytes read from the source buffer (in other words, the compressed size) + If the source stream is detected malformed, the function will stop decoding and return a negative result. + Destination buffer must be already allocated. Its size must be a minimum of 'originalSize' bytes. + note : This function fully respect memory boundaries for properly formed compressed data. + It is a bit faster than LZ4_decompress_safe(). + However, it does not provide any protection against intentionally modified data stream (malicious input). + Use this function in trusted environment only (data to decode comes from a trusted source). +*/ +int LZ4_decompress_fast (const char* source, char* dest, int originalSize); + +/* +LZ4_decompress_safe_partial() : + This function decompress a compressed block of size 'compressedSize' at position 'source' + into destination buffer 'dest' of size 'maxDecompressedSize'. + The function tries to stop decompressing operation as soon as 'targetOutputSize' has been reached, + reducing decompression time. + return : the number of bytes decoded in the destination buffer (necessarily <= maxDecompressedSize) + Note : this number can be < 'targetOutputSize' should the compressed block to decode be smaller. + Always control how many bytes were decoded. + If the source stream is detected malformed, the function will stop decoding and return a negative result. + This function never writes outside of output buffer, and never reads outside of input buffer. It is therefore protected against malicious data packets +*/ +int LZ4_decompress_safe_partial (const char* source, char* dest, int compressedSize, int targetOutputSize, int maxDecompressedSize); + + +/*********************************************** +* Streaming Compression Functions +***********************************************/ +#define LZ4_STREAMSIZE_U64 ((1 << (LZ4_MEMORY_USAGE-3)) + 4) +#define LZ4_STREAMSIZE (LZ4_STREAMSIZE_U64 * sizeof(long long)) +/* + * LZ4_stream_t + * information structure to track an LZ4 stream. + * important : init this structure content before first use ! + * note : only allocated directly the structure if you are statically linking LZ4 + * If you are using liblz4 as a DLL, please use below construction methods instead. + */ +typedef struct { long long table[LZ4_STREAMSIZE_U64]; } LZ4_stream_t; + +/* + * LZ4_resetStream + * Use this function to init an allocated LZ4_stream_t structure + */ +void LZ4_resetStream (LZ4_stream_t* streamPtr); + +/* + * LZ4_createStream will allocate and initialize an LZ4_stream_t structure + * LZ4_freeStream releases its memory. + * In the context of a DLL (liblz4), please use these methods rather than the static struct. + * They are more future proof, in case of a change of LZ4_stream_t size. + */ +LZ4_stream_t* LZ4_createStream(void); +int LZ4_freeStream (LZ4_stream_t* streamPtr); + +/* + * LZ4_loadDict + * Use this function to load a static dictionary into LZ4_stream. + * Any previous data will be forgotten, only 'dictionary' will remain in memory. + * Loading a size of 0 is allowed. + * Return : dictionary size, in bytes (necessarily <= 64 KB) + */ +int LZ4_loadDict (LZ4_stream_t* streamPtr, const char* dictionary, int dictSize); + +/* + * LZ4_compress_fast_continue + * Compress buffer content 'src', using data from previously compressed blocks as dictionary to improve compression ratio. + * Important : Previous data blocks are assumed to still be present and unmodified ! + * 'dst' buffer must be already allocated. + * If maxDstSize >= LZ4_compressBound(srcSize), compression is guaranteed to succeed, and runs faster. + * If not, and if compressed data cannot fit into 'dst' buffer size, compression stops, and function returns a zero. + */ +int LZ4_compress_fast_continue (LZ4_stream_t* streamPtr, const char* src, char* dst, int srcSize, int maxDstSize, int acceleration); + +/* + * LZ4_saveDict + * If previously compressed data block is not guaranteed to remain available at its memory location + * save it into a safer place (char* safeBuffer) + * Note : you don't need to call LZ4_loadDict() afterwards, + * dictionary is immediately usable, you can therefore call LZ4_compress_fast_continue() + * Return : saved dictionary size in bytes (necessarily <= dictSize), or 0 if error + */ +int LZ4_saveDict (LZ4_stream_t* streamPtr, char* safeBuffer, int dictSize); + + +/************************************************ +* Streaming Decompression Functions +************************************************/ + +#define LZ4_STREAMDECODESIZE_U64 4 +#define LZ4_STREAMDECODESIZE (LZ4_STREAMDECODESIZE_U64 * sizeof(unsigned long long)) +typedef struct { unsigned long long table[LZ4_STREAMDECODESIZE_U64]; } LZ4_streamDecode_t; +/* + * LZ4_streamDecode_t + * information structure to track an LZ4 stream. + * init this structure content using LZ4_setStreamDecode or memset() before first use ! + * + * In the context of a DLL (liblz4) please prefer usage of construction methods below. + * They are more future proof, in case of a change of LZ4_streamDecode_t size in the future. + * LZ4_createStreamDecode will allocate and initialize an LZ4_streamDecode_t structure + * LZ4_freeStreamDecode releases its memory. + */ +LZ4_streamDecode_t* LZ4_createStreamDecode(void); +int LZ4_freeStreamDecode (LZ4_streamDecode_t* LZ4_stream); + +/* + * LZ4_setStreamDecode + * Use this function to instruct where to find the dictionary. + * Setting a size of 0 is allowed (same effect as reset). + * Return : 1 if OK, 0 if error + */ +int LZ4_setStreamDecode (LZ4_streamDecode_t* LZ4_streamDecode, const char* dictionary, int dictSize); + +/* +*_continue() : + These decoding functions allow decompression of multiple blocks in "streaming" mode. + Previously decoded blocks *must* remain available at the memory position where they were decoded (up to 64 KB) + In the case of a ring buffers, decoding buffer must be either : + - Exactly same size as encoding buffer, with same update rule (block boundaries at same positions) + In which case, the decoding & encoding ring buffer can have any size, including very small ones ( < 64 KB). + - Larger than encoding buffer, by a minimum of maxBlockSize more bytes. + maxBlockSize is implementation dependent. It's the maximum size you intend to compress into a single block. + In which case, encoding and decoding buffers do not need to be synchronized, + and encoding ring buffer can have any size, including small ones ( < 64 KB). + - _At least_ 64 KB + 8 bytes + maxBlockSize. + In which case, encoding and decoding buffers do not need to be synchronized, + and encoding ring buffer can have any size, including larger than decoding buffer. + Whenever these conditions are not possible, save the last 64KB of decoded data into a safe buffer, + and indicate where it is saved using LZ4_setStreamDecode() +*/ +int LZ4_decompress_safe_continue (LZ4_streamDecode_t* LZ4_streamDecode, const char* source, char* dest, int compressedSize, int maxDecompressedSize); +int LZ4_decompress_fast_continue (LZ4_streamDecode_t* LZ4_streamDecode, const char* source, char* dest, int originalSize); + + +/* +Advanced decoding functions : +*_usingDict() : + These decoding functions work the same as + a combination of LZ4_setStreamDecode() followed by LZ4_decompress_x_continue() + They are stand-alone. They don't need nor update an LZ4_streamDecode_t structure. +*/ +int LZ4_decompress_safe_usingDict (const char* source, char* dest, int compressedSize, int maxDecompressedSize, const char* dictStart, int dictSize); +int LZ4_decompress_fast_usingDict (const char* source, char* dest, int originalSize, const char* dictStart, int dictSize); + + + +/************************************** +* Obsolete Functions +**************************************/ +/* Deprecate Warnings */ +/* Should these warnings messages be a problem, + it is generally possible to disable them, + with -Wno-deprecated-declarations for gcc + or _CRT_SECURE_NO_WARNINGS in Visual for example. + You can also define LZ4_DEPRECATE_WARNING_DEFBLOCK. */ +#ifndef LZ4_DEPRECATE_WARNING_DEFBLOCK +# define LZ4_DEPRECATE_WARNING_DEFBLOCK +# define LZ4_GCC_VERSION (__GNUC__ * 100 + __GNUC_MINOR__) +# if (LZ4_GCC_VERSION >= 405) || defined(__clang__) +# define LZ4_DEPRECATED(message) __attribute__((deprecated(message))) +# elif (LZ4_GCC_VERSION >= 301) +# define LZ4_DEPRECATED(message) __attribute__((deprecated)) +# elif defined(_MSC_VER) +# define LZ4_DEPRECATED(message) __declspec(deprecated(message)) +# else +# pragma message("WARNING: You need to implement LZ4_DEPRECATED for this compiler") +# define LZ4_DEPRECATED(message) +# endif +#endif /* LZ4_DEPRECATE_WARNING_DEFBLOCK */ + +/* Obsolete compression functions */ +/* These functions are planned to start generate warnings by r131 approximately */ +int LZ4_compress (const char* source, char* dest, int sourceSize); +int LZ4_compress_limitedOutput (const char* source, char* dest, int sourceSize, int maxOutputSize); +int LZ4_compress_withState (void* state, const char* source, char* dest, int inputSize); +int LZ4_compress_limitedOutput_withState (void* state, const char* source, char* dest, int inputSize, int maxOutputSize); +int LZ4_compress_continue (LZ4_stream_t* LZ4_streamPtr, const char* source, char* dest, int inputSize); +int LZ4_compress_limitedOutput_continue (LZ4_stream_t* LZ4_streamPtr, const char* source, char* dest, int inputSize, int maxOutputSize); + +/* Obsolete decompression functions */ +/* These function names are completely deprecated and must no longer be used. + They are only provided here for compatibility with older programs. + - LZ4_uncompress is the same as LZ4_decompress_fast + - LZ4_uncompress_unknownOutputSize is the same as LZ4_decompress_safe + These function prototypes are now disabled; uncomment them only if you really need them. + It is highly recommended to stop using these prototypes and migrate to maintained ones */ +/* int LZ4_uncompress (const char* source, char* dest, int outputSize); */ +/* int LZ4_uncompress_unknownOutputSize (const char* source, char* dest, int isize, int maxOutputSize); */ + +/* Obsolete streaming functions; use new streaming interface whenever possible */ +LZ4_DEPRECATED("use LZ4_createStream() instead") void* LZ4_create (char* inputBuffer); +LZ4_DEPRECATED("use LZ4_createStream() instead") int LZ4_sizeofStreamState(void); +LZ4_DEPRECATED("use LZ4_resetStream() instead") int LZ4_resetStreamState(void* state, char* inputBuffer); +LZ4_DEPRECATED("use LZ4_saveDict() instead") char* LZ4_slideInputBuffer (void* state); + +/* Obsolete streaming decoding functions */ +LZ4_DEPRECATED("use LZ4_decompress_safe_usingDict() instead") int LZ4_decompress_safe_withPrefix64k (const char* src, char* dst, int compressedSize, int maxDstSize); +LZ4_DEPRECATED("use LZ4_decompress_fast_usingDict() instead") int LZ4_decompress_fast_withPrefix64k (const char* src, char* dst, int originalSize); + + +#if defined (__cplusplus) +} +#endif diff --git a/jni/love/src/libraries/lz4/lz4hc.c b/jni/love/src/libraries/lz4/lz4hc.c new file mode 100755 index 00000000..a22ab2b2 --- /dev/null +++ b/jni/love/src/libraries/lz4/lz4hc.c @@ -0,0 +1,730 @@ +/* + LZ4 HC - High Compression Mode of LZ4 + Copyright (C) 2011-2015, Yann Collet. + + BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + You can contact the author at : + - LZ4 source repository : https://github.com/Cyan4973/lz4 + - LZ4 public forum : https://groups.google.com/forum/#!forum/lz4c +*/ + + + +/************************************** +* Tuning Parameter +**************************************/ +static const int LZ4HC_compressionLevel_default = 9; + + +/************************************** +* Includes +**************************************/ +#include "lz4hc.h" + + +/************************************** +* Local Compiler Options +**************************************/ +#if defined(__GNUC__) +# pragma GCC diagnostic ignored "-Wunused-function" +#endif + +#if defined (__clang__) +# pragma clang diagnostic ignored "-Wunused-function" +#endif + + +/************************************** +* Common LZ4 definition +**************************************/ +#define LZ4_COMMONDEFS_ONLY +#include "lz4.c" + + +/************************************** +* Local Constants +**************************************/ +#define DICTIONARY_LOGSIZE 16 +#define MAXD (1<> ((MINMATCH*8)-HASH_LOG)) +//#define DELTANEXTU16(p) chainTable[(p) & MAXD_MASK] /* flexible, MAXD dependent */ +#define DELTANEXTU16(p) chainTable[(U16)(p)] /* faster */ + +static U32 LZ4HC_hashPtr(const void* ptr) { return HASH_FUNCTION(LZ4_read32(ptr)); } + + + +/************************************** +* HC Compression +**************************************/ +static void LZ4HC_init (LZ4HC_Data_Structure* hc4, const BYTE* start) +{ + MEM_INIT((void*)hc4->hashTable, 0, sizeof(hc4->hashTable)); + MEM_INIT(hc4->chainTable, 0xFF, sizeof(hc4->chainTable)); + hc4->nextToUpdate = 64 KB; + hc4->base = start - 64 KB; + hc4->end = start; + hc4->dictBase = start - 64 KB; + hc4->dictLimit = 64 KB; + hc4->lowLimit = 64 KB; +} + + +/* Update chains up to ip (excluded) */ +FORCE_INLINE void LZ4HC_Insert (LZ4HC_Data_Structure* hc4, const BYTE* ip) +{ + U16* chainTable = hc4->chainTable; + U32* HashTable = hc4->hashTable; + const BYTE* const base = hc4->base; + const U32 target = (U32)(ip - base); + U32 idx = hc4->nextToUpdate; + + while(idx < target) + { + U32 h = LZ4HC_hashPtr(base+idx); + size_t delta = idx - HashTable[h]; + if (delta>MAX_DISTANCE) delta = MAX_DISTANCE; + DELTANEXTU16(idx) = (U16)delta; + HashTable[h] = idx; + idx++; + } + + hc4->nextToUpdate = target; +} + + +FORCE_INLINE int LZ4HC_InsertAndFindBestMatch (LZ4HC_Data_Structure* hc4, /* Index table will be updated */ + const BYTE* ip, const BYTE* const iLimit, + const BYTE** matchpos, + const int maxNbAttempts) +{ + U16* const chainTable = hc4->chainTable; + U32* const HashTable = hc4->hashTable; + const BYTE* const base = hc4->base; + const BYTE* const dictBase = hc4->dictBase; + const U32 dictLimit = hc4->dictLimit; + const U32 lowLimit = (hc4->lowLimit + 64 KB > (U32)(ip-base)) ? hc4->lowLimit : (U32)(ip - base) - (64 KB - 1); + U32 matchIndex; + const BYTE* match; + int nbAttempts=maxNbAttempts; + size_t ml=0; + + /* HC4 match finder */ + LZ4HC_Insert(hc4, ip); + matchIndex = HashTable[LZ4HC_hashPtr(ip)]; + + while ((matchIndex>=lowLimit) && (nbAttempts)) + { + nbAttempts--; + if (matchIndex >= dictLimit) + { + match = base + matchIndex; + if (*(match+ml) == *(ip+ml) + && (LZ4_read32(match) == LZ4_read32(ip))) + { + size_t mlt = LZ4_count(ip+MINMATCH, match+MINMATCH, iLimit) + MINMATCH; + if (mlt > ml) { ml = mlt; *matchpos = match; } + } + } + else + { + match = dictBase + matchIndex; + if (LZ4_read32(match) == LZ4_read32(ip)) + { + size_t mlt; + const BYTE* vLimit = ip + (dictLimit - matchIndex); + if (vLimit > iLimit) vLimit = iLimit; + mlt = LZ4_count(ip+MINMATCH, match+MINMATCH, vLimit) + MINMATCH; + if ((ip+mlt == vLimit) && (vLimit < iLimit)) + mlt += LZ4_count(ip+mlt, base+dictLimit, iLimit); + if (mlt > ml) { ml = mlt; *matchpos = base + matchIndex; } /* virtual matchpos */ + } + } + matchIndex -= DELTANEXTU16(matchIndex); + } + + return (int)ml; +} + + +FORCE_INLINE int LZ4HC_InsertAndGetWiderMatch ( + LZ4HC_Data_Structure* hc4, + const BYTE* const ip, + const BYTE* const iLowLimit, + const BYTE* const iHighLimit, + int longest, + const BYTE** matchpos, + const BYTE** startpos, + const int maxNbAttempts) +{ + U16* const chainTable = hc4->chainTable; + U32* const HashTable = hc4->hashTable; + const BYTE* const base = hc4->base; + const U32 dictLimit = hc4->dictLimit; + const BYTE* const lowPrefixPtr = base + dictLimit; + const U32 lowLimit = (hc4->lowLimit + 64 KB > (U32)(ip-base)) ? hc4->lowLimit : (U32)(ip - base) - (64 KB - 1); + const BYTE* const dictBase = hc4->dictBase; + U32 matchIndex; + int nbAttempts = maxNbAttempts; + int delta = (int)(ip-iLowLimit); + + + /* First Match */ + LZ4HC_Insert(hc4, ip); + matchIndex = HashTable[LZ4HC_hashPtr(ip)]; + + while ((matchIndex>=lowLimit) && (nbAttempts)) + { + nbAttempts--; + if (matchIndex >= dictLimit) + { + const BYTE* matchPtr = base + matchIndex; + if (*(iLowLimit + longest) == *(matchPtr - delta + longest)) + if (LZ4_read32(matchPtr) == LZ4_read32(ip)) + { + int mlt = MINMATCH + LZ4_count(ip+MINMATCH, matchPtr+MINMATCH, iHighLimit); + int back = 0; + + while ((ip+back>iLowLimit) + && (matchPtr+back > lowPrefixPtr) + && (ip[back-1] == matchPtr[back-1])) + back--; + + mlt -= back; + + if (mlt > longest) + { + longest = (int)mlt; + *matchpos = matchPtr+back; + *startpos = ip+back; + } + } + } + else + { + const BYTE* matchPtr = dictBase + matchIndex; + if (LZ4_read32(matchPtr) == LZ4_read32(ip)) + { + size_t mlt; + int back=0; + const BYTE* vLimit = ip + (dictLimit - matchIndex); + if (vLimit > iHighLimit) vLimit = iHighLimit; + mlt = LZ4_count(ip+MINMATCH, matchPtr+MINMATCH, vLimit) + MINMATCH; + if ((ip+mlt == vLimit) && (vLimit < iHighLimit)) + mlt += LZ4_count(ip+mlt, base+dictLimit, iHighLimit); + while ((ip+back > iLowLimit) && (matchIndex+back > lowLimit) && (ip[back-1] == matchPtr[back-1])) back--; + mlt -= back; + if ((int)mlt > longest) { longest = (int)mlt; *matchpos = base + matchIndex + back; *startpos = ip+back; } + } + } + matchIndex -= DELTANEXTU16(matchIndex); + } + + return longest; +} + + +typedef enum { noLimit = 0, limitedOutput = 1 } limitedOutput_directive; + +#define LZ4HC_DEBUG 0 +#if LZ4HC_DEBUG +static unsigned debug = 0; +#endif + +FORCE_INLINE int LZ4HC_encodeSequence ( + const BYTE** ip, + BYTE** op, + const BYTE** anchor, + int matchLength, + const BYTE* const match, + limitedOutput_directive limitedOutputBuffer, + BYTE* oend) +{ + int length; + BYTE* token; + +#if LZ4HC_DEBUG + if (debug) printf("literal : %u -- match : %u -- offset : %u\n", (U32)(*ip - *anchor), (U32)matchLength, (U32)(*ip-match)); +#endif + + /* Encode Literal length */ + length = (int)(*ip - *anchor); + token = (*op)++; + if ((limitedOutputBuffer) && ((*op + (length>>8) + length + (2 + 1 + LASTLITERALS)) > oend)) return 1; /* Check output limit */ + if (length>=(int)RUN_MASK) { int len; *token=(RUN_MASK< 254 ; len-=255) *(*op)++ = 255; *(*op)++ = (BYTE)len; } + else *token = (BYTE)(length<>8) + (1 + LASTLITERALS) > oend)) return 1; /* Check output limit */ + if (length>=(int)ML_MASK) { *token+=ML_MASK; length-=ML_MASK; for(; length > 509 ; length-=510) { *(*op)++ = 255; *(*op)++ = 255; } if (length > 254) { length-=255; *(*op)++ = 255; } *(*op)++ = (BYTE)length; } + else *token += (BYTE)(length); + + /* Prepare next loop */ + *ip += matchLength; + *anchor = *ip; + + return 0; +} + + +static int LZ4HC_compress_generic ( + void* ctxvoid, + const char* source, + char* dest, + int inputSize, + int maxOutputSize, + int compressionLevel, + limitedOutput_directive limit + ) +{ + LZ4HC_Data_Structure* ctx = (LZ4HC_Data_Structure*) ctxvoid; + const BYTE* ip = (const BYTE*) source; + const BYTE* anchor = ip; + const BYTE* const iend = ip + inputSize; + const BYTE* const mflimit = iend - MFLIMIT; + const BYTE* const matchlimit = (iend - LASTLITERALS); + + BYTE* op = (BYTE*) dest; + BYTE* const oend = op + maxOutputSize; + + unsigned maxNbAttempts; + int ml, ml2, ml3, ml0; + const BYTE* ref=NULL; + const BYTE* start2=NULL; + const BYTE* ref2=NULL; + const BYTE* start3=NULL; + const BYTE* ref3=NULL; + const BYTE* start0; + const BYTE* ref0; + + + /* init */ + if (compressionLevel > g_maxCompressionLevel) compressionLevel = g_maxCompressionLevel; + if (compressionLevel < 1) compressionLevel = LZ4HC_compressionLevel_default; + maxNbAttempts = 1 << (compressionLevel-1); + ctx->end += inputSize; + + ip++; + + /* Main Loop */ + while (ip < mflimit) + { + ml = LZ4HC_InsertAndFindBestMatch (ctx, ip, matchlimit, (&ref), maxNbAttempts); + if (!ml) { ip++; continue; } + + /* saved, in case we would skip too much */ + start0 = ip; + ref0 = ref; + ml0 = ml; + +_Search2: + if (ip+ml < mflimit) + ml2 = LZ4HC_InsertAndGetWiderMatch(ctx, ip + ml - 2, ip + 1, matchlimit, ml, &ref2, &start2, maxNbAttempts); + else ml2 = ml; + + if (ml2 == ml) /* No better match */ + { + if (LZ4HC_encodeSequence(&ip, &op, &anchor, ml, ref, limit, oend)) return 0; + continue; + } + + if (start0 < ip) + { + if (start2 < ip + ml0) /* empirical */ + { + ip = start0; + ref = ref0; + ml = ml0; + } + } + + /* Here, start0==ip */ + if ((start2 - ip) < 3) /* First Match too small : removed */ + { + ml = ml2; + ip = start2; + ref =ref2; + goto _Search2; + } + +_Search3: + /* + * Currently we have : + * ml2 > ml1, and + * ip1+3 <= ip2 (usually < ip1+ml1) + */ + if ((start2 - ip) < OPTIMAL_ML) + { + int correction; + int new_ml = ml; + if (new_ml > OPTIMAL_ML) new_ml = OPTIMAL_ML; + if (ip+new_ml > start2 + ml2 - MINMATCH) new_ml = (int)(start2 - ip) + ml2 - MINMATCH; + correction = new_ml - (int)(start2 - ip); + if (correction > 0) + { + start2 += correction; + ref2 += correction; + ml2 -= correction; + } + } + /* Now, we have start2 = ip+new_ml, with new_ml = min(ml, OPTIMAL_ML=18) */ + + if (start2 + ml2 < mflimit) + ml3 = LZ4HC_InsertAndGetWiderMatch(ctx, start2 + ml2 - 3, start2, matchlimit, ml2, &ref3, &start3, maxNbAttempts); + else ml3 = ml2; + + if (ml3 == ml2) /* No better match : 2 sequences to encode */ + { + /* ip & ref are known; Now for ml */ + if (start2 < ip+ml) ml = (int)(start2 - ip); + /* Now, encode 2 sequences */ + if (LZ4HC_encodeSequence(&ip, &op, &anchor, ml, ref, limit, oend)) return 0; + ip = start2; + if (LZ4HC_encodeSequence(&ip, &op, &anchor, ml2, ref2, limit, oend)) return 0; + continue; + } + + if (start3 < ip+ml+3) /* Not enough space for match 2 : remove it */ + { + if (start3 >= (ip+ml)) /* can write Seq1 immediately ==> Seq2 is removed, so Seq3 becomes Seq1 */ + { + if (start2 < ip+ml) + { + int correction = (int)(ip+ml - start2); + start2 += correction; + ref2 += correction; + ml2 -= correction; + if (ml2 < MINMATCH) + { + start2 = start3; + ref2 = ref3; + ml2 = ml3; + } + } + + if (LZ4HC_encodeSequence(&ip, &op, &anchor, ml, ref, limit, oend)) return 0; + ip = start3; + ref = ref3; + ml = ml3; + + start0 = start2; + ref0 = ref2; + ml0 = ml2; + goto _Search2; + } + + start2 = start3; + ref2 = ref3; + ml2 = ml3; + goto _Search3; + } + + /* + * OK, now we have 3 ascending matches; let's write at least the first one + * ip & ref are known; Now for ml + */ + if (start2 < ip+ml) + { + if ((start2 - ip) < (int)ML_MASK) + { + int correction; + if (ml > OPTIMAL_ML) ml = OPTIMAL_ML; + if (ip + ml > start2 + ml2 - MINMATCH) ml = (int)(start2 - ip) + ml2 - MINMATCH; + correction = ml - (int)(start2 - ip); + if (correction > 0) + { + start2 += correction; + ref2 += correction; + ml2 -= correction; + } + } + else + { + ml = (int)(start2 - ip); + } + } + if (LZ4HC_encodeSequence(&ip, &op, &anchor, ml, ref, limit, oend)) return 0; + + ip = start2; + ref = ref2; + ml = ml2; + + start2 = start3; + ref2 = ref3; + ml2 = ml3; + + goto _Search3; + } + + /* Encode Last Literals */ + { + int lastRun = (int)(iend - anchor); + if ((limit) && (((char*)op - dest) + lastRun + 1 + ((lastRun+255-RUN_MASK)/255) > (U32)maxOutputSize)) return 0; /* Check output limit */ + if (lastRun>=(int)RUN_MASK) { *op++=(RUN_MASK< 254 ; lastRun-=255) *op++ = 255; *op++ = (BYTE) lastRun; } + else *op++ = (BYTE)(lastRun<base = NULL; + ((LZ4HC_Data_Structure*)LZ4_streamHCPtr)->compressionLevel = (unsigned)compressionLevel; +} + +int LZ4_loadDictHC (LZ4_streamHC_t* LZ4_streamHCPtr, const char* dictionary, int dictSize) +{ + LZ4HC_Data_Structure* ctxPtr = (LZ4HC_Data_Structure*) LZ4_streamHCPtr; + if (dictSize > 64 KB) + { + dictionary += dictSize - 64 KB; + dictSize = 64 KB; + } + LZ4HC_init (ctxPtr, (const BYTE*)dictionary); + if (dictSize >= 4) LZ4HC_Insert (ctxPtr, (const BYTE*)dictionary +(dictSize-3)); + ctxPtr->end = (const BYTE*)dictionary + dictSize; + return dictSize; +} + + +/* compression */ + +static void LZ4HC_setExternalDict(LZ4HC_Data_Structure* ctxPtr, const BYTE* newBlock) +{ + if (ctxPtr->end >= ctxPtr->base + 4) + LZ4HC_Insert (ctxPtr, ctxPtr->end-3); /* Referencing remaining dictionary content */ + /* Only one memory segment for extDict, so any previous extDict is lost at this stage */ + ctxPtr->lowLimit = ctxPtr->dictLimit; + ctxPtr->dictLimit = (U32)(ctxPtr->end - ctxPtr->base); + ctxPtr->dictBase = ctxPtr->base; + ctxPtr->base = newBlock - ctxPtr->dictLimit; + ctxPtr->end = newBlock; + ctxPtr->nextToUpdate = ctxPtr->dictLimit; /* match referencing will resume from there */ +} + +static int LZ4_compressHC_continue_generic (LZ4HC_Data_Structure* ctxPtr, + const char* source, char* dest, + int inputSize, int maxOutputSize, limitedOutput_directive limit) +{ + /* auto-init if forgotten */ + if (ctxPtr->base == NULL) + LZ4HC_init (ctxPtr, (const BYTE*) source); + + /* Check overflow */ + if ((size_t)(ctxPtr->end - ctxPtr->base) > 2 GB) + { + size_t dictSize = (size_t)(ctxPtr->end - ctxPtr->base) - ctxPtr->dictLimit; + if (dictSize > 64 KB) dictSize = 64 KB; + + LZ4_loadDictHC((LZ4_streamHC_t*)ctxPtr, (const char*)(ctxPtr->end) - dictSize, (int)dictSize); + } + + /* Check if blocks follow each other */ + if ((const BYTE*)source != ctxPtr->end) + LZ4HC_setExternalDict(ctxPtr, (const BYTE*)source); + + /* Check overlapping input/dictionary space */ + { + const BYTE* sourceEnd = (const BYTE*) source + inputSize; + const BYTE* dictBegin = ctxPtr->dictBase + ctxPtr->lowLimit; + const BYTE* dictEnd = ctxPtr->dictBase + ctxPtr->dictLimit; + if ((sourceEnd > dictBegin) && ((const BYTE*)source < dictEnd)) + { + if (sourceEnd > dictEnd) sourceEnd = dictEnd; + ctxPtr->lowLimit = (U32)(sourceEnd - ctxPtr->dictBase); + if (ctxPtr->dictLimit - ctxPtr->lowLimit < 4) ctxPtr->lowLimit = ctxPtr->dictLimit; + } + } + + return LZ4HC_compress_generic (ctxPtr, source, dest, inputSize, maxOutputSize, ctxPtr->compressionLevel, limit); +} + +int LZ4_compress_HC_continue (LZ4_streamHC_t* LZ4_streamHCPtr, const char* source, char* dest, int inputSize, int maxOutputSize) +{ + if (maxOutputSize < LZ4_compressBound(inputSize)) + return LZ4_compressHC_continue_generic ((LZ4HC_Data_Structure*)LZ4_streamHCPtr, source, dest, inputSize, maxOutputSize, limitedOutput); + else + return LZ4_compressHC_continue_generic ((LZ4HC_Data_Structure*)LZ4_streamHCPtr, source, dest, inputSize, maxOutputSize, noLimit); +} + + +/* dictionary saving */ + +int LZ4_saveDictHC (LZ4_streamHC_t* LZ4_streamHCPtr, char* safeBuffer, int dictSize) +{ + LZ4HC_Data_Structure* streamPtr = (LZ4HC_Data_Structure*)LZ4_streamHCPtr; + int prefixSize = (int)(streamPtr->end - (streamPtr->base + streamPtr->dictLimit)); + if (dictSize > 64 KB) dictSize = 64 KB; + if (dictSize < 4) dictSize = 0; + if (dictSize > prefixSize) dictSize = prefixSize; + memmove(safeBuffer, streamPtr->end - dictSize, dictSize); + { + U32 endIndex = (U32)(streamPtr->end - streamPtr->base); + streamPtr->end = (const BYTE*)safeBuffer + dictSize; + streamPtr->base = streamPtr->end - endIndex; + streamPtr->dictLimit = endIndex - dictSize; + streamPtr->lowLimit = endIndex - dictSize; + if (streamPtr->nextToUpdate < streamPtr->dictLimit) streamPtr->nextToUpdate = streamPtr->dictLimit; + } + return dictSize; +} + + +/*********************************** +* Deprecated Functions +***********************************/ +/* Deprecated compression functions */ +/* These functions are planned to start generate warnings by r131 approximately */ +int LZ4_compressHC(const char* src, char* dst, int srcSize) { return LZ4_compress_HC (src, dst, srcSize, LZ4_compressBound(srcSize), 0); } +int LZ4_compressHC_limitedOutput(const char* src, char* dst, int srcSize, int maxDstSize) { return LZ4_compress_HC(src, dst, srcSize, maxDstSize, 0); } +int LZ4_compressHC2(const char* src, char* dst, int srcSize, int cLevel) { return LZ4_compress_HC (src, dst, srcSize, LZ4_compressBound(srcSize), cLevel); } +int LZ4_compressHC2_limitedOutput(const char* src, char* dst, int srcSize, int maxDstSize, int cLevel) { return LZ4_compress_HC(src, dst, srcSize, maxDstSize, cLevel); } +int LZ4_compressHC_withStateHC (void* state, const char* src, char* dst, int srcSize) { return LZ4_compress_HC_extStateHC (state, src, dst, srcSize, LZ4_compressBound(srcSize), 0); } +int LZ4_compressHC_limitedOutput_withStateHC (void* state, const char* src, char* dst, int srcSize, int maxDstSize) { return LZ4_compress_HC_extStateHC (state, src, dst, srcSize, maxDstSize, 0); } +int LZ4_compressHC2_withStateHC (void* state, const char* src, char* dst, int srcSize, int cLevel) { return LZ4_compress_HC_extStateHC(state, src, dst, srcSize, LZ4_compressBound(srcSize), cLevel); } +int LZ4_compressHC2_limitedOutput_withStateHC (void* state, const char* src, char* dst, int srcSize, int maxDstSize, int cLevel) { return LZ4_compress_HC_extStateHC(state, src, dst, srcSize, maxDstSize, cLevel); } +int LZ4_compressHC_continue (LZ4_streamHC_t* ctx, const char* src, char* dst, int srcSize) { return LZ4_compress_HC_continue (ctx, src, dst, srcSize, LZ4_compressBound(srcSize)); } +int LZ4_compressHC_limitedOutput_continue (LZ4_streamHC_t* ctx, const char* src, char* dst, int srcSize, int maxDstSize) { return LZ4_compress_HC_continue (ctx, src, dst, srcSize, maxDstSize); } + + +/* Deprecated streaming functions */ +/* These functions currently generate deprecation warnings */ +int LZ4_sizeofStreamStateHC(void) { return LZ4_STREAMHCSIZE; } + +int LZ4_resetStreamStateHC(void* state, char* inputBuffer) +{ + if ((((size_t)state) & (sizeof(void*)-1)) != 0) return 1; /* Error : pointer is not aligned for pointer (32 or 64 bits) */ + LZ4HC_init((LZ4HC_Data_Structure*)state, (const BYTE*)inputBuffer); + ((LZ4HC_Data_Structure*)state)->inputBuffer = (BYTE*)inputBuffer; + return 0; +} + +void* LZ4_createHC (char* inputBuffer) +{ + void* hc4 = ALLOCATOR(1, sizeof(LZ4HC_Data_Structure)); + LZ4HC_init ((LZ4HC_Data_Structure*)hc4, (const BYTE*)inputBuffer); + ((LZ4HC_Data_Structure*)hc4)->inputBuffer = (BYTE*)inputBuffer; + return hc4; +} + +int LZ4_freeHC (void* LZ4HC_Data) +{ + FREEMEM(LZ4HC_Data); + return (0); +} + +int LZ4_compressHC2_continue (void* LZ4HC_Data, const char* source, char* dest, int inputSize, int compressionLevel) +{ + return LZ4HC_compress_generic (LZ4HC_Data, source, dest, inputSize, 0, compressionLevel, noLimit); +} + +int LZ4_compressHC2_limitedOutput_continue (void* LZ4HC_Data, const char* source, char* dest, int inputSize, int maxOutputSize, int compressionLevel) +{ + return LZ4HC_compress_generic (LZ4HC_Data, source, dest, inputSize, maxOutputSize, compressionLevel, limitedOutput); +} + +char* LZ4_slideInputBufferHC(void* LZ4HC_Data) +{ + LZ4HC_Data_Structure* hc4 = (LZ4HC_Data_Structure*)LZ4HC_Data; + int dictSize = LZ4_saveDictHC((LZ4_streamHC_t*)LZ4HC_Data, (char*)(hc4->inputBuffer), 64 KB); + return (char*)(hc4->inputBuffer + dictSize); +} diff --git a/jni/love/src/libraries/lz4/lz4hc.h b/jni/love/src/libraries/lz4/lz4hc.h new file mode 100755 index 00000000..431f7c87 --- /dev/null +++ b/jni/love/src/libraries/lz4/lz4hc.h @@ -0,0 +1,189 @@ +/* + LZ4 HC - High Compression Mode of LZ4 + Header File + Copyright (C) 2011-2015, Yann Collet. + BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + You can contact the author at : + - LZ4 source repository : https://github.com/Cyan4973/lz4 + - LZ4 public forum : https://groups.google.com/forum/#!forum/lz4c +*/ +#pragma once + + +#if defined (__cplusplus) +extern "C" { +#endif + +/***************************** +* Includes +*****************************/ +#include /* size_t */ + + +/************************************** +* Block Compression +**************************************/ +int LZ4_compress_HC (const char* src, char* dst, int srcSize, int maxDstSize, int compressionLevel); +/* +LZ4_compress_HC : + Destination buffer 'dst' must be already allocated. + Compression completion is guaranteed if 'dst' buffer is sized to handle worst circumstances (data not compressible) + Worst size evaluation is provided by function LZ4_compressBound() (see "lz4.h") + srcSize : Max supported value is LZ4_MAX_INPUT_SIZE (see "lz4.h") + compressionLevel : Recommended values are between 4 and 9, although any value between 0 and 16 will work. + 0 means "use default value" (see lz4hc.c). + Values >16 behave the same as 16. + return : the number of bytes written into buffer 'dst' + or 0 if compression fails. +*/ + + +/* Note : + Decompression functions are provided within LZ4 source code (see "lz4.h") (BSD license) +*/ + + +int LZ4_sizeofStateHC(void); +int LZ4_compress_HC_extStateHC(void* state, const char* src, char* dst, int srcSize, int maxDstSize, int compressionLevel); +/* +LZ4_compress_HC_extStateHC() : + Use this function if you prefer to manually allocate memory for compression tables. + To know how much memory must be allocated for the compression tables, use : + int LZ4_sizeofStateHC(); + + Allocated memory must be aligned on 8-bytes boundaries (which a normal malloc() will do properly). + + The allocated memory can then be provided to the compression functions using 'void* state' parameter. + LZ4_compress_HC_extStateHC() is equivalent to previously described function. + It just uses externally allocated memory for stateHC. +*/ + + +/************************************** +* Streaming Compression +**************************************/ +#define LZ4_STREAMHCSIZE 262192 +#define LZ4_STREAMHCSIZE_SIZET (LZ4_STREAMHCSIZE / sizeof(size_t)) +typedef struct { size_t table[LZ4_STREAMHCSIZE_SIZET]; } LZ4_streamHC_t; +/* + LZ4_streamHC_t + This structure allows static allocation of LZ4 HC streaming state. + State must then be initialized using LZ4_resetStreamHC() before first use. + + Static allocation should only be used in combination with static linking. + If you want to use LZ4 as a DLL, please use construction functions below, which are future-proof. +*/ + + +LZ4_streamHC_t* LZ4_createStreamHC(void); +int LZ4_freeStreamHC (LZ4_streamHC_t* streamHCPtr); +/* + These functions create and release memory for LZ4 HC streaming state. + Newly created states are already initialized. + Existing state space can be re-used anytime using LZ4_resetStreamHC(). + If you use LZ4 as a DLL, use these functions instead of static structure allocation, + to avoid size mismatch between different versions. +*/ + +void LZ4_resetStreamHC (LZ4_streamHC_t* streamHCPtr, int compressionLevel); +int LZ4_loadDictHC (LZ4_streamHC_t* streamHCPtr, const char* dictionary, int dictSize); + +int LZ4_compress_HC_continue (LZ4_streamHC_t* streamHCPtr, const char* src, char* dst, int srcSize, int maxDstSize); + +int LZ4_saveDictHC (LZ4_streamHC_t* streamHCPtr, char* safeBuffer, int maxDictSize); + +/* + These functions compress data in successive blocks of any size, using previous blocks as dictionary. + One key assumption is that previous blocks (up to 64 KB) remain read-accessible while compressing next blocks. + There is an exception for ring buffers, which can be smaller 64 KB. + Such case is automatically detected and correctly handled by LZ4_compress_HC_continue(). + + Before starting compression, state must be properly initialized, using LZ4_resetStreamHC(). + A first "fictional block" can then be designated as initial dictionary, using LZ4_loadDictHC() (Optional). + + Then, use LZ4_compress_HC_continue() to compress each successive block. + It works like LZ4_compress_HC(), but use previous memory blocks as dictionary to improve compression. + Previous memory blocks (including initial dictionary when present) must remain accessible and unmodified during compression. + As a reminder, size 'dst' buffer to handle worst cases, using LZ4_compressBound(), to ensure success of compression operation. + + If, for any reason, previous data blocks can't be preserved unmodified in memory during next compression block, + you must save it to a safer memory space, using LZ4_saveDictHC(). + Return value of LZ4_saveDictHC() is the size of dictionary effectively saved into 'safeBuffer'. +*/ + + + +/************************************** +* Deprecated Functions +**************************************/ +/* Deprecate Warnings */ +/* Should these warnings messages be a problem, + it is generally possible to disable them, + with -Wno-deprecated-declarations for gcc + or _CRT_SECURE_NO_WARNINGS in Visual for example. + You can also define LZ4_DEPRECATE_WARNING_DEFBLOCK. */ +#ifndef LZ4_DEPRECATE_WARNING_DEFBLOCK +# define LZ4_DEPRECATE_WARNING_DEFBLOCK +# define LZ4_GCC_VERSION (__GNUC__ * 100 + __GNUC_MINOR__) +# if (LZ4_GCC_VERSION >= 405) || defined(__clang__) +# define LZ4_DEPRECATED(message) __attribute__((deprecated(message))) +# elif (LZ4_GCC_VERSION >= 301) +# define LZ4_DEPRECATED(message) __attribute__((deprecated)) +# elif defined(_MSC_VER) +# define LZ4_DEPRECATED(message) __declspec(deprecated(message)) +# else +# pragma message("WARNING: You need to implement LZ4_DEPRECATED for this compiler") +# define LZ4_DEPRECATED(message) +# endif +#endif // LZ4_DEPRECATE_WARNING_DEFBLOCK + +/* compression functions */ +/* these functions are planned to trigger warning messages by r131 approximately */ +int LZ4_compressHC (const char* source, char* dest, int inputSize); +int LZ4_compressHC_limitedOutput (const char* source, char* dest, int inputSize, int maxOutputSize); +int LZ4_compressHC2 (const char* source, char* dest, int inputSize, int compressionLevel); +int LZ4_compressHC2_limitedOutput (const char* source, char* dest, int inputSize, int maxOutputSize, int compressionLevel); +int LZ4_compressHC_withStateHC (void* state, const char* source, char* dest, int inputSize); +int LZ4_compressHC_limitedOutput_withStateHC (void* state, const char* source, char* dest, int inputSize, int maxOutputSize); +int LZ4_compressHC2_withStateHC (void* state, const char* source, char* dest, int inputSize, int compressionLevel); +int LZ4_compressHC2_limitedOutput_withStateHC(void* state, const char* source, char* dest, int inputSize, int maxOutputSize, int compressionLevel); +int LZ4_compressHC_continue (LZ4_streamHC_t* LZ4_streamHCPtr, const char* source, char* dest, int inputSize); +int LZ4_compressHC_limitedOutput_continue (LZ4_streamHC_t* LZ4_streamHCPtr, const char* source, char* dest, int inputSize, int maxOutputSize); + +/* Streaming functions following the older model; should no longer be used */ +LZ4_DEPRECATED("use LZ4_createStreamHC() instead") void* LZ4_createHC (char* inputBuffer); +LZ4_DEPRECATED("use LZ4_saveDictHC() instead") char* LZ4_slideInputBufferHC (void* LZ4HC_Data); +LZ4_DEPRECATED("use LZ4_freeStreamHC() instead") int LZ4_freeHC (void* LZ4HC_Data); +LZ4_DEPRECATED("use LZ4_compress_HC_continue() instead") int LZ4_compressHC2_continue (void* LZ4HC_Data, const char* source, char* dest, int inputSize, int compressionLevel); +LZ4_DEPRECATED("use LZ4_compress_HC_continue() instead") int LZ4_compressHC2_limitedOutput_continue (void* LZ4HC_Data, const char* source, char* dest, int inputSize, int maxOutputSize, int compressionLevel); +LZ4_DEPRECATED("use LZ4_createStreamHC() instead") int LZ4_sizeofStreamStateHC(void); +LZ4_DEPRECATED("use LZ4_resetStreamHC() instead") int LZ4_resetStreamStateHC(void* state, char* inputBuffer); + + +#if defined (__cplusplus) +} +#endif diff --git a/jni/love/src/libraries/noise1234/noise1234.cpp b/jni/love/src/libraries/noise1234/noise1234.cpp new file mode 100644 index 00000000..bb84642d --- /dev/null +++ b/jni/love/src/libraries/noise1234/noise1234.cpp @@ -0,0 +1,528 @@ +// Noise1234 +// Author: Stefan Gustavson (stegu@itn.liu.se) +// +// This library is public domain software, released by the author +// into the public domain in February 2011. You may do anything +// you like with it. You may even remove all attributions, +// but of course I'd appreciate it if you kept my name somewhere. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// General Public License for more details. + +/** \file + \brief Implements the Noise1234 class for producing Perlin noise. + \author Stefan Gustavson (stegu@itn.liu.se) +*/ + +/* + * This implementation is "Improved Noise" as presented by + * Ken Perlin at Siggraph 2002. The 3D function is a direct port + * of his Java reference code available on www.noisemachine.com + * (although I cleaned it up and made the code more readable), + * but the 1D, 2D and 4D cases were implemented from scratch + * by me. + * + * This is a highly reusable class. It has no dependencies + * on any other file, apart from its own header file. + */ + + +#include "noise1234.h" + +// This is the new and improved, C(2) continuous interpolant +#define FADE(t) ( t * t * t * ( t * ( t * 6 - 15 ) + 10 ) ) + +#define FASTFLOOR(x) ( ((x)>0) ? ((int)x) : ((int)x-1 ) ) +#define LERP(t, a, b) ((a) + (t)*((b)-(a))) + + +//--------------------------------------------------------------------- +// Static data + +/* + * Permutation table. This is just a random jumble of all numbers 0-255, + * repeated twice to avoid wrapping the index at 255 for each lookup. + * This needs to be exactly the same for all instances on all platforms, + * so it's easiest to just keep it as static explicit data. + * This also removes the need for any initialisation of this class. + * + * Note that making this an int[] instead of a char[] might make the + * code run faster on platforms with a high penalty for unaligned single + * byte addressing. Intel x86 is generally single-byte-friendly, but + * some other CPUs are faster with 4-aligned reads. + * However, a char[] is smaller, which avoids cache trashing, and that + * is probably the most important aspect on most architectures. + * This array is accessed a *lot* by the noise functions. + * A vector-valued noise over 3D accesses it 96 times, and a + * float-valued 4D noise 64 times. We want this to fit in the cache! + */ +unsigned char Noise1234::perm[] = {151,160,137,91,90,15, + 131,13,201,95,96,53,194,233,7,225,140,36,103,30,69,142,8,99,37,240,21,10,23, + 190, 6,148,247,120,234,75,0,26,197,62,94,252,219,203,117,35,11,32,57,177,33, + 88,237,149,56,87,174,20,125,136,171,168, 68,175,74,165,71,134,139,48,27,166, + 77,146,158,231,83,111,229,122,60,211,133,230,220,105,92,41,55,46,245,40,244, + 102,143,54, 65,25,63,161, 1,216,80,73,209,76,132,187,208, 89,18,169,200,196, + 135,130,116,188,159,86,164,100,109,198,173,186, 3,64,52,217,226,250,124,123, + 5,202,38,147,118,126,255,82,85,212,207,206,59,227,47,16,58,17,182,189,28,42, + 223,183,170,213,119,248,152, 2,44,154,163, 70,221,153,101,155,167, 43,172,9, + 129,22,39,253, 19,98,108,110,79,113,224,232,178,185, 112,104,218,246,97,228, + 251,34,242,193,238,210,144,12,191,179,162,241, 81,51,145,235,249,14,239,107, + 49,192,214, 31,181,199,106,157,184, 84,204,176,115,121,50,45,127, 4,150,254, + 138,236,205,93,222,114,67,29,24,72,243,141,128,195,78,66,215,61,156,180, + 151,160,137,91,90,15, + 131,13,201,95,96,53,194,233,7,225,140,36,103,30,69,142,8,99,37,240,21,10,23, + 190, 6,148,247,120,234,75,0,26,197,62,94,252,219,203,117,35,11,32,57,177,33, + 88,237,149,56,87,174,20,125,136,171,168, 68,175,74,165,71,134,139,48,27,166, + 77,146,158,231,83,111,229,122,60,211,133,230,220,105,92,41,55,46,245,40,244, + 102,143,54, 65,25,63,161, 1,216,80,73,209,76,132,187,208, 89,18,169,200,196, + 135,130,116,188,159,86,164,100,109,198,173,186, 3,64,52,217,226,250,124,123, + 5,202,38,147,118,126,255,82,85,212,207,206,59,227,47,16,58,17,182,189,28,42, + 223,183,170,213,119,248,152, 2,44,154,163, 70,221,153,101,155,167, 43,172,9, + 129,22,39,253, 19,98,108,110,79,113,224,232,178,185, 112,104,218,246,97,228, + 251,34,242,193,238,210,144,12,191,179,162,241, 81,51,145,235,249,14,239,107, + 49,192,214, 31,181,199,106,157,184, 84,204,176,115,121,50,45,127, 4,150,254, + 138,236,205,93,222,114,67,29,24,72,243,141,128,195,78,66,215,61,156,180 +}; + +//--------------------------------------------------------------------- + +/* + * Helper functions to compute gradients-dot-residualvectors (1D to 4D) + * Note that these generate gradients of more than unit length. To make + * a close match with the value range of classic Perlin noise, the final + * noise values need to be rescaled. To match the RenderMan noise in a + * statistical sense, the approximate scaling values (empirically + * determined from test renderings) are: + * 1D noise needs rescaling with 0.188 + * 2D noise needs rescaling with 0.507 + * 3D noise needs rescaling with 0.936 + * 4D noise needs rescaling with 0.87 + * Note that these noise functions are the most practical and useful + * signed version of Perlin noise. To return values according to the + * RenderMan specification from the SL noise() and pnoise() functions, + * the noise values need to be scaled and offset to [0,1], like this: + * float SLnoise = (Noise1234::noise(x,y,z) + 1.0) * 0.5; + */ + +float Noise1234::grad( int hash, float x ) { + int h = hash & 15; + float grad = 1.0 + (h & 7); // Gradient value 1.0, 2.0, ..., 8.0 + if (h&8) grad = -grad; // and a random sign for the gradient + return ( grad * x ); // Multiply the gradient with the distance +} + +float Noise1234::grad( int hash, float x, float y ) { + int h = hash & 7; // Convert low 3 bits of hash code + float u = h<4 ? x : y; // into 8 simple gradient directions, + float v = h<4 ? y : x; // and compute the dot product with (x,y). + return ((h&1)? -u : u) + ((h&2)? -2.0*v : 2.0*v); +} + +float Noise1234::grad( int hash, float x, float y , float z ) { + int h = hash & 15; // Convert low 4 bits of hash code into 12 simple + float u = h<8 ? x : y; // gradient directions, and compute dot product. + float v = h<4 ? y : h==12||h==14 ? x : z; // Fix repeats at h = 12 to 15 + return ((h&1)? -u : u) + ((h&2)? -v : v); +} + +float Noise1234::grad( int hash, float x, float y, float z, float t ) { + int h = hash & 31; // Convert low 5 bits of hash code into 32 simple + float u = h<24 ? x : y; // gradient directions, and compute dot product. + float v = h<16 ? y : z; + float w = h<8 ? z : t; + return ((h&1)? -u : u) + ((h&2)? -v : v) + ((h&4)? -w : w); +} + +//--------------------------------------------------------------------- +/** 1D float Perlin noise, SL "noise()" + */ +float Noise1234::noise( float x ) +{ + int ix0, ix1; + float fx0, fx1; + float s, n0, n1; + + ix0 = FASTFLOOR( x ); // Integer part of x + fx0 = x - ix0; // Fractional part of x + fx1 = fx0 - 1.0f; + ix1 = ( ix0+1 ) & 0xff; + ix0 = ix0 & 0xff; // Wrap to 0..255 + + s = FADE( fx0 ); + + n0 = grad( perm[ ix0 ], fx0 ); + n1 = grad( perm[ ix1 ], fx1 ); + return 0.188f * ( LERP( s, n0, n1 ) ); +} + +//--------------------------------------------------------------------- +/** 1D float Perlin periodic noise, SL "pnoise()" + */ +float Noise1234::pnoise( float x, int px ) +{ + int ix0, ix1; + float fx0, fx1; + float s, n0, n1; + + ix0 = FASTFLOOR( x ); // Integer part of x + fx0 = x - ix0; // Fractional part of x + fx1 = fx0 - 1.0f; + ix1 = (( ix0 + 1 ) % px) & 0xff; // Wrap to 0..px-1 *and* wrap to 0..255 + ix0 = ( ix0 % px ) & 0xff; // (because px might be greater than 256) + + s = FADE( fx0 ); + + n0 = grad( perm[ ix0 ], fx0 ); + n1 = grad( perm[ ix1 ], fx1 ); + return 0.188f * ( LERP( s, n0, n1 ) ); +} + + +//--------------------------------------------------------------------- +/** 2D float Perlin noise. + */ +float Noise1234::noise( float x, float y ) +{ + int ix0, iy0, ix1, iy1; + float fx0, fy0, fx1, fy1; + float s, t, nx0, nx1, n0, n1; + + ix0 = FASTFLOOR( x ); // Integer part of x + iy0 = FASTFLOOR( y ); // Integer part of y + fx0 = x - ix0; // Fractional part of x + fy0 = y - iy0; // Fractional part of y + fx1 = fx0 - 1.0f; + fy1 = fy0 - 1.0f; + ix1 = (ix0 + 1) & 0xff; // Wrap to 0..255 + iy1 = (iy0 + 1) & 0xff; + ix0 = ix0 & 0xff; + iy0 = iy0 & 0xff; + + t = FADE( fy0 ); + s = FADE( fx0 ); + + nx0 = grad(perm[ix0 + perm[iy0]], fx0, fy0); + nx1 = grad(perm[ix0 + perm[iy1]], fx0, fy1); + n0 = LERP( t, nx0, nx1 ); + + nx0 = grad(perm[ix1 + perm[iy0]], fx1, fy0); + nx1 = grad(perm[ix1 + perm[iy1]], fx1, fy1); + n1 = LERP(t, nx0, nx1); + + return 0.507f * ( LERP( s, n0, n1 ) ); +} + +//--------------------------------------------------------------------- +/** 2D float Perlin periodic noise. + */ +float Noise1234::pnoise( float x, float y, int px, int py ) +{ + int ix0, iy0, ix1, iy1; + float fx0, fy0, fx1, fy1; + float s, t, nx0, nx1, n0, n1; + + ix0 = FASTFLOOR( x ); // Integer part of x + iy0 = FASTFLOOR( y ); // Integer part of y + fx0 = x - ix0; // Fractional part of x + fy0 = y - iy0; // Fractional part of y + fx1 = fx0 - 1.0f; + fy1 = fy0 - 1.0f; + ix1 = (( ix0 + 1 ) % px) & 0xff; // Wrap to 0..px-1 and wrap to 0..255 + iy1 = (( iy0 + 1 ) % py) & 0xff; // Wrap to 0..py-1 and wrap to 0..255 + ix0 = ( ix0 % px ) & 0xff; + iy0 = ( iy0 % py ) & 0xff; + + t = FADE( fy0 ); + s = FADE( fx0 ); + + nx0 = grad(perm[ix0 + perm[iy0]], fx0, fy0); + nx1 = grad(perm[ix0 + perm[iy1]], fx0, fy1); + n0 = LERP( t, nx0, nx1 ); + + nx0 = grad(perm[ix1 + perm[iy0]], fx1, fy0); + nx1 = grad(perm[ix1 + perm[iy1]], fx1, fy1); + n1 = LERP(t, nx0, nx1); + + return 0.507f * ( LERP( s, n0, n1 ) ); +} + + +//--------------------------------------------------------------------- +/** 3D float Perlin noise. + */ +float Noise1234::noise( float x, float y, float z ) +{ + int ix0, iy0, ix1, iy1, iz0, iz1; + float fx0, fy0, fz0, fx1, fy1, fz1; + float s, t, r; + float nxy0, nxy1, nx0, nx1, n0, n1; + + ix0 = FASTFLOOR( x ); // Integer part of x + iy0 = FASTFLOOR( y ); // Integer part of y + iz0 = FASTFLOOR( z ); // Integer part of z + fx0 = x - ix0; // Fractional part of x + fy0 = y - iy0; // Fractional part of y + fz0 = z - iz0; // Fractional part of z + fx1 = fx0 - 1.0f; + fy1 = fy0 - 1.0f; + fz1 = fz0 - 1.0f; + ix1 = ( ix0 + 1 ) & 0xff; // Wrap to 0..255 + iy1 = ( iy0 + 1 ) & 0xff; + iz1 = ( iz0 + 1 ) & 0xff; + ix0 = ix0 & 0xff; + iy0 = iy0 & 0xff; + iz0 = iz0 & 0xff; + + r = FADE( fz0 ); + t = FADE( fy0 ); + s = FADE( fx0 ); + + nxy0 = grad(perm[ix0 + perm[iy0 + perm[iz0]]], fx0, fy0, fz0); + nxy1 = grad(perm[ix0 + perm[iy0 + perm[iz1]]], fx0, fy0, fz1); + nx0 = LERP( r, nxy0, nxy1 ); + + nxy0 = grad(perm[ix0 + perm[iy1 + perm[iz0]]], fx0, fy1, fz0); + nxy1 = grad(perm[ix0 + perm[iy1 + perm[iz1]]], fx0, fy1, fz1); + nx1 = LERP( r, nxy0, nxy1 ); + + n0 = LERP( t, nx0, nx1 ); + + nxy0 = grad(perm[ix1 + perm[iy0 + perm[iz0]]], fx1, fy0, fz0); + nxy1 = grad(perm[ix1 + perm[iy0 + perm[iz1]]], fx1, fy0, fz1); + nx0 = LERP( r, nxy0, nxy1 ); + + nxy0 = grad(perm[ix1 + perm[iy1 + perm[iz0]]], fx1, fy1, fz0); + nxy1 = grad(perm[ix1 + perm[iy1 + perm[iz1]]], fx1, fy1, fz1); + nx1 = LERP( r, nxy0, nxy1 ); + + n1 = LERP( t, nx0, nx1 ); + + return 0.936f * ( LERP( s, n0, n1 ) ); +} + +//--------------------------------------------------------------------- +/** 3D float Perlin periodic noise. + */ +float Noise1234::pnoise( float x, float y, float z, int px, int py, int pz ) +{ + int ix0, iy0, ix1, iy1, iz0, iz1; + float fx0, fy0, fz0, fx1, fy1, fz1; + float s, t, r; + float nxy0, nxy1, nx0, nx1, n0, n1; + + ix0 = FASTFLOOR( x ); // Integer part of x + iy0 = FASTFLOOR( y ); // Integer part of y + iz0 = FASTFLOOR( z ); // Integer part of z + fx0 = x - ix0; // Fractional part of x + fy0 = y - iy0; // Fractional part of y + fz0 = z - iz0; // Fractional part of z + fx1 = fx0 - 1.0f; + fy1 = fy0 - 1.0f; + fz1 = fz0 - 1.0f; + ix1 = (( ix0 + 1 ) % px ) & 0xff; // Wrap to 0..px-1 and wrap to 0..255 + iy1 = (( iy0 + 1 ) % py ) & 0xff; // Wrap to 0..py-1 and wrap to 0..255 + iz1 = (( iz0 + 1 ) % pz ) & 0xff; // Wrap to 0..pz-1 and wrap to 0..255 + ix0 = ( ix0 % px ) & 0xff; + iy0 = ( iy0 % py ) & 0xff; + iz0 = ( iz0 % pz ) & 0xff; + + r = FADE( fz0 ); + t = FADE( fy0 ); + s = FADE( fx0 ); + + nxy0 = grad(perm[ix0 + perm[iy0 + perm[iz0]]], fx0, fy0, fz0); + nxy1 = grad(perm[ix0 + perm[iy0 + perm[iz1]]], fx0, fy0, fz1); + nx0 = LERP( r, nxy0, nxy1 ); + + nxy0 = grad(perm[ix0 + perm[iy1 + perm[iz0]]], fx0, fy1, fz0); + nxy1 = grad(perm[ix0 + perm[iy1 + perm[iz1]]], fx0, fy1, fz1); + nx1 = LERP( r, nxy0, nxy1 ); + + n0 = LERP( t, nx0, nx1 ); + + nxy0 = grad(perm[ix1 + perm[iy0 + perm[iz0]]], fx1, fy0, fz0); + nxy1 = grad(perm[ix1 + perm[iy0 + perm[iz1]]], fx1, fy0, fz1); + nx0 = LERP( r, nxy0, nxy1 ); + + nxy0 = grad(perm[ix1 + perm[iy1 + perm[iz0]]], fx1, fy1, fz0); + nxy1 = grad(perm[ix1 + perm[iy1 + perm[iz1]]], fx1, fy1, fz1); + nx1 = LERP( r, nxy0, nxy1 ); + + n1 = LERP( t, nx0, nx1 ); + + return 0.936f * ( LERP( s, n0, n1 ) ); +} + + +//--------------------------------------------------------------------- +/** 4D float Perlin noise. + */ + +float Noise1234::noise( float x, float y, float z, float w ) +{ + int ix0, iy0, iz0, iw0, ix1, iy1, iz1, iw1; + float fx0, fy0, fz0, fw0, fx1, fy1, fz1, fw1; + float s, t, r, q; + float nxyz0, nxyz1, nxy0, nxy1, nx0, nx1, n0, n1; + + ix0 = FASTFLOOR( x ); // Integer part of x + iy0 = FASTFLOOR( y ); // Integer part of y + iz0 = FASTFLOOR( z ); // Integer part of y + iw0 = FASTFLOOR( w ); // Integer part of w + fx0 = x - ix0; // Fractional part of x + fy0 = y - iy0; // Fractional part of y + fz0 = z - iz0; // Fractional part of z + fw0 = w - iw0; // Fractional part of w + fx1 = fx0 - 1.0f; + fy1 = fy0 - 1.0f; + fz1 = fz0 - 1.0f; + fw1 = fw0 - 1.0f; + ix1 = ( ix0 + 1 ) & 0xff; // Wrap to 0..255 + iy1 = ( iy0 + 1 ) & 0xff; + iz1 = ( iz0 + 1 ) & 0xff; + iw1 = ( iw0 + 1 ) & 0xff; + ix0 = ix0 & 0xff; + iy0 = iy0 & 0xff; + iz0 = iz0 & 0xff; + iw0 = iw0 & 0xff; + + q = FADE( fw0 ); + r = FADE( fz0 ); + t = FADE( fy0 ); + s = FADE( fx0 ); + + nxyz0 = grad(perm[ix0 + perm[iy0 + perm[iz0 + perm[iw0]]]], fx0, fy0, fz0, fw0); + nxyz1 = grad(perm[ix0 + perm[iy0 + perm[iz0 + perm[iw1]]]], fx0, fy0, fz0, fw1); + nxy0 = LERP( q, nxyz0, nxyz1 ); + + nxyz0 = grad(perm[ix0 + perm[iy0 + perm[iz1 + perm[iw0]]]], fx0, fy0, fz1, fw0); + nxyz1 = grad(perm[ix0 + perm[iy0 + perm[iz1 + perm[iw1]]]], fx0, fy0, fz1, fw1); + nxy1 = LERP( q, nxyz0, nxyz1 ); + + nx0 = LERP ( r, nxy0, nxy1 ); + + nxyz0 = grad(perm[ix0 + perm[iy1 + perm[iz0 + perm[iw0]]]], fx0, fy1, fz0, fw0); + nxyz1 = grad(perm[ix0 + perm[iy1 + perm[iz0 + perm[iw1]]]], fx0, fy1, fz0, fw1); + nxy0 = LERP( q, nxyz0, nxyz1 ); + + nxyz0 = grad(perm[ix0 + perm[iy1 + perm[iz1 + perm[iw0]]]], fx0, fy1, fz1, fw0); + nxyz1 = grad(perm[ix0 + perm[iy1 + perm[iz1 + perm[iw1]]]], fx0, fy1, fz1, fw1); + nxy1 = LERP( q, nxyz0, nxyz1 ); + + nx1 = LERP ( r, nxy0, nxy1 ); + + n0 = LERP( t, nx0, nx1 ); + + nxyz0 = grad(perm[ix1 + perm[iy0 + perm[iz0 + perm[iw0]]]], fx1, fy0, fz0, fw0); + nxyz1 = grad(perm[ix1 + perm[iy0 + perm[iz0 + perm[iw1]]]], fx1, fy0, fz0, fw1); + nxy0 = LERP( q, nxyz0, nxyz1 ); + + nxyz0 = grad(perm[ix1 + perm[iy0 + perm[iz1 + perm[iw0]]]], fx1, fy0, fz1, fw0); + nxyz1 = grad(perm[ix1 + perm[iy0 + perm[iz1 + perm[iw1]]]], fx1, fy0, fz1, fw1); + nxy1 = LERP( q, nxyz0, nxyz1 ); + + nx0 = LERP ( r, nxy0, nxy1 ); + + nxyz0 = grad(perm[ix1 + perm[iy1 + perm[iz0 + perm[iw0]]]], fx1, fy1, fz0, fw0); + nxyz1 = grad(perm[ix1 + perm[iy1 + perm[iz0 + perm[iw1]]]], fx1, fy1, fz0, fw1); + nxy0 = LERP( q, nxyz0, nxyz1 ); + + nxyz0 = grad(perm[ix1 + perm[iy1 + perm[iz1 + perm[iw0]]]], fx1, fy1, fz1, fw0); + nxyz1 = grad(perm[ix1 + perm[iy1 + perm[iz1 + perm[iw1]]]], fx1, fy1, fz1, fw1); + nxy1 = LERP( q, nxyz0, nxyz1 ); + + nx1 = LERP ( r, nxy0, nxy1 ); + + n1 = LERP( t, nx0, nx1 ); + + return 0.87f * ( LERP( s, n0, n1 ) ); +} + +//--------------------------------------------------------------------- +/** 4D float Perlin periodic noise. + */ + +float Noise1234::pnoise( float x, float y, float z, float w, + int px, int py, int pz, int pw ) +{ + int ix0, iy0, iz0, iw0, ix1, iy1, iz1, iw1; + float fx0, fy0, fz0, fw0, fx1, fy1, fz1, fw1; + float s, t, r, q; + float nxyz0, nxyz1, nxy0, nxy1, nx0, nx1, n0, n1; + + ix0 = FASTFLOOR( x ); // Integer part of x + iy0 = FASTFLOOR( y ); // Integer part of y + iz0 = FASTFLOOR( z ); // Integer part of y + iw0 = FASTFLOOR( w ); // Integer part of w + fx0 = x - ix0; // Fractional part of x + fy0 = y - iy0; // Fractional part of y + fz0 = z - iz0; // Fractional part of z + fw0 = w - iw0; // Fractional part of w + fx1 = fx0 - 1.0f; + fy1 = fy0 - 1.0f; + fz1 = fz0 - 1.0f; + fw1 = fw0 - 1.0f; + ix1 = (( ix0 + 1 ) % px ) & 0xff; // Wrap to 0..px-1 and wrap to 0..255 + iy1 = (( iy0 + 1 ) % py ) & 0xff; // Wrap to 0..py-1 and wrap to 0..255 + iz1 = (( iz0 + 1 ) % pz ) & 0xff; // Wrap to 0..pz-1 and wrap to 0..255 + iw1 = (( iw0 + 1 ) % pw ) & 0xff; // Wrap to 0..pw-1 and wrap to 0..255 + ix0 = ( ix0 % px ) & 0xff; + iy0 = ( iy0 % py ) & 0xff; + iz0 = ( iz0 % pz ) & 0xff; + iw0 = ( iw0 % pw ) & 0xff; + + q = FADE( fw0 ); + r = FADE( fz0 ); + t = FADE( fy0 ); + s = FADE( fx0 ); + + nxyz0 = grad(perm[ix0 + perm[iy0 + perm[iz0 + perm[iw0]]]], fx0, fy0, fz0, fw0); + nxyz1 = grad(perm[ix0 + perm[iy0 + perm[iz0 + perm[iw1]]]], fx0, fy0, fz0, fw1); + nxy0 = LERP( q, nxyz0, nxyz1 ); + + nxyz0 = grad(perm[ix0 + perm[iy0 + perm[iz1 + perm[iw0]]]], fx0, fy0, fz1, fw0); + nxyz1 = grad(perm[ix0 + perm[iy0 + perm[iz1 + perm[iw1]]]], fx0, fy0, fz1, fw1); + nxy1 = LERP( q, nxyz0, nxyz1 ); + + nx0 = LERP ( r, nxy0, nxy1 ); + + nxyz0 = grad(perm[ix0 + perm[iy1 + perm[iz0 + perm[iw0]]]], fx0, fy1, fz0, fw0); + nxyz1 = grad(perm[ix0 + perm[iy1 + perm[iz0 + perm[iw1]]]], fx0, fy1, fz0, fw1); + nxy0 = LERP( q, nxyz0, nxyz1 ); + + nxyz0 = grad(perm[ix0 + perm[iy1 + perm[iz1 + perm[iw0]]]], fx0, fy1, fz1, fw0); + nxyz1 = grad(perm[ix0 + perm[iy1 + perm[iz1 + perm[iw1]]]], fx0, fy1, fz1, fw1); + nxy1 = LERP( q, nxyz0, nxyz1 ); + + nx1 = LERP ( r, nxy0, nxy1 ); + + n0 = LERP( t, nx0, nx1 ); + + nxyz0 = grad(perm[ix1 + perm[iy0 + perm[iz0 + perm[iw0]]]], fx1, fy0, fz0, fw0); + nxyz1 = grad(perm[ix1 + perm[iy0 + perm[iz0 + perm[iw1]]]], fx1, fy0, fz0, fw1); + nxy0 = LERP( q, nxyz0, nxyz1 ); + + nxyz0 = grad(perm[ix1 + perm[iy0 + perm[iz1 + perm[iw0]]]], fx1, fy0, fz1, fw0); + nxyz1 = grad(perm[ix1 + perm[iy0 + perm[iz1 + perm[iw1]]]], fx1, fy0, fz1, fw1); + nxy1 = LERP( q, nxyz0, nxyz1 ); + + nx0 = LERP ( r, nxy0, nxy1 ); + + nxyz0 = grad(perm[ix1 + perm[iy1 + perm[iz0 + perm[iw0]]]], fx1, fy1, fz0, fw0); + nxyz1 = grad(perm[ix1 + perm[iy1 + perm[iz0 + perm[iw1]]]], fx1, fy1, fz0, fw1); + nxy0 = LERP( q, nxyz0, nxyz1 ); + + nxyz0 = grad(perm[ix1 + perm[iy1 + perm[iz1 + perm[iw0]]]], fx1, fy1, fz1, fw0); + nxyz1 = grad(perm[ix1 + perm[iy1 + perm[iz1 + perm[iw1]]]], fx1, fy1, fz1, fw1); + nxy1 = LERP( q, nxyz0, nxyz1 ); + + nx1 = LERP ( r, nxy0, nxy1 ); + + n1 = LERP( t, nx0, nx1 ); + + return 0.87f * ( LERP( s, n0, n1 ) ); +} + +//--------------------------------------------------------------------- diff --git a/jni/love/src/libraries/noise1234/noise1234.h b/jni/love/src/libraries/noise1234/noise1234.h new file mode 100644 index 00000000..928572a5 --- /dev/null +++ b/jni/love/src/libraries/noise1234/noise1234.h @@ -0,0 +1,57 @@ +// Noise1234 +// Author: Stefan Gustavson (stegu@itn.liu.se) +// +// This library is public domain software, released by the author +// into the public domain in February 2011. You may do anything +// you like with it. You may even remove all attributions, +// but of course I'd appreciate it if you kept my name somewhere. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// General Public License for more details. + +/** \file + \brief Declares the Noise1234 class for producing Perlin noise. + \author Stefan Gustavson (stegu@itn.liu.se) +*/ + +/* + * This is a clean, fast, modern and free Perlin noise class in C++. + * Being a stand-alone class with no external dependencies, it is + * highly reusable without source code modifications. + * + * Note: + * Replacing the "float" type with "double" can actually make this run faster + * on some platforms. A templatized version of Noise1234 could be useful. + */ + +class Noise1234 { + + public: + Noise1234() {} + ~Noise1234() {} + +/** 1D, 2D, 3D and 4D float Perlin noise, SL "noise()" + */ + static float noise( float x ); + static float noise( float x, float y ); + static float noise( float x, float y, float z ); + static float noise( float x, float y, float z, float w ); + +/** 1D, 2D, 3D and 4D float Perlin periodic noise, SL "pnoise()" + */ + static float pnoise( float x, int px ); + static float pnoise( float x, float y, int px, int py ); + static float pnoise( float x, float y, float z, int px, int py, int pz ); + static float pnoise( float x, float y, float z, float w, + int px, int py, int pz, int pw ); + + private: + static unsigned char perm[]; + static float grad( int hash, float x ); + static float grad( int hash, float x, float y ); + static float grad( int hash, float x, float y , float z ); + static float grad( int hash, float x, float y, float z, float t ); + +}; diff --git a/jni/love/src/libraries/noise1234/simplexnoise1234.cpp b/jni/love/src/libraries/noise1234/simplexnoise1234.cpp index d5d24bfa..2765f38e 100644 --- a/jni/love/src/libraries/noise1234/simplexnoise1234.cpp +++ b/jni/love/src/libraries/noise1234/simplexnoise1234.cpp @@ -13,6 +13,9 @@ // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // General Public License for more details. +// Modified by the LOVE Development Team to remove 3D and 4D implementations due +// to patent issues. + /** \file \brief Implements the SimplexNoise1234 class for producing Perlin simplex noise. \author Stefan Gustavson (stegu@itn.liu.se) @@ -114,34 +117,6 @@ float SimplexNoise1234::grad( int hash, float x, float y ) { return ((h&1)? -u : u) + ((h&2)? -2.0f*v : 2.0f*v); } -float SimplexNoise1234::grad( int hash, float x, float y , float z ) { - int h = hash & 15; // Convert low 4 bits of hash code into 12 simple - float u = h<8 ? x : y; // gradient directions, and compute dot product. - float v = h<4 ? y : h==12||h==14 ? x : z; // Fix repeats at h = 12 to 15 - return ((h&1)? -u : u) + ((h&2)? -v : v); -} - -float SimplexNoise1234::grad( int hash, float x, float y, float z, float t ) { - int h = hash & 31; // Convert low 5 bits of hash code into 32 simple - float u = h<24 ? x : y; // gradient directions, and compute dot product. - float v = h<16 ? y : z; - float w = h<8 ? z : t; - return ((h&1)? -u : u) + ((h&2)? -v : v) + ((h&4)? -w : w); -} - - // A lookup table to traverse the simplex around a given point in 4D. - // Details can be found where this table is used, in the 4D noise method. - /* TODO: This should not be required, backport it from Bill's GLSL code! */ - static unsigned char simplex[64][4] = { - {0,1,2,3},{0,1,3,2},{0,0,0,0},{0,2,3,1},{0,0,0,0},{0,0,0,0},{0,0,0,0},{1,2,3,0}, - {0,2,1,3},{0,0,0,0},{0,3,1,2},{0,3,2,1},{0,0,0,0},{0,0,0,0},{0,0,0,0},{1,3,2,0}, - {0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}, - {1,2,0,3},{0,0,0,0},{1,3,0,2},{0,0,0,0},{0,0,0,0},{0,0,0,0},{2,3,0,1},{2,3,1,0}, - {1,0,2,3},{1,0,3,2},{0,0,0,0},{0,0,0,0},{0,0,0,0},{2,0,3,1},{0,0,0,0},{2,1,3,0}, - {0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}, - {2,0,1,3},{0,0,0,0},{0,0,0,0},{0,0,0,0},{3,0,1,2},{3,0,2,1},{0,0,0,0},{3,1,2,0}, - {2,1,0,3},{0,0,0,0},{0,0,0,0},{0,0,0,0},{3,1,0,2},{0,0,0,0},{3,2,0,1},{3,2,1,0}}; - // 1D simplex noise float SimplexNoise1234::noise(float x) { @@ -233,238 +208,3 @@ float SimplexNoise1234::noise(float x, float y) { // The result is scaled to return values in the interval [-1,1]. return 45.23f * (n0 + n1 + n2); // TODO: The scale factor is preliminary! } - -// 3D simplex noise -float SimplexNoise1234::noise(float x, float y, float z) { - -// Simple skewing factors for the 3D case -#define F3 0.333333333 -#define G3 0.166666667 - - float n0, n1, n2, n3; // Noise contributions from the four corners - - // Skew the input space to determine which simplex cell we're in - float s = (x+y+z)*F3; // Very nice and simple skew factor for 3D - float xs = x+s; - float ys = y+s; - float zs = z+s; - int i = FASTFLOOR(xs); - int j = FASTFLOOR(ys); - int k = FASTFLOOR(zs); - - float t = (float)(i+j+k)*G3; - float X0 = i-t; // Unskew the cell origin back to (x,y,z) space - float Y0 = j-t; - float Z0 = k-t; - float x0 = x-X0; // The x,y,z distances from the cell origin - float y0 = y-Y0; - float z0 = z-Z0; - - // For the 3D case, the simplex shape is a slightly irregular tetrahedron. - // Determine which simplex we are in. - int i1, j1, k1; // Offsets for second corner of simplex in (i,j,k) coords - int i2, j2, k2; // Offsets for third corner of simplex in (i,j,k) coords - -/* This code would benefit from a backport from the GLSL version! */ - if(x0>=y0) { - if(y0>=z0) - { i1=1; j1=0; k1=0; i2=1; j2=1; k2=0; } // X Y Z order - else if(x0>=z0) { i1=1; j1=0; k1=0; i2=1; j2=0; k2=1; } // X Z Y order - else { i1=0; j1=0; k1=1; i2=1; j2=0; k2=1; } // Z X Y order - } - else { // x0 y0) ? 32 : 0; - int c2 = (x0 > z0) ? 16 : 0; - int c3 = (y0 > z0) ? 8 : 0; - int c4 = (x0 > w0) ? 4 : 0; - int c5 = (y0 > w0) ? 2 : 0; - int c6 = (z0 > w0) ? 1 : 0; - int c = c1 + c2 + c3 + c4 + c5 + c6; - - int i1, j1, k1, l1; // The integer offsets for the second simplex corner - int i2, j2, k2, l2; // The integer offsets for the third simplex corner - int i3, j3, k3, l3; // The integer offsets for the fourth simplex corner - - // simplex[c] is a 4-vector with the numbers 0, 1, 2 and 3 in some order. - // Many values of c will never occur, since e.g. x>y>z>w makes x=3 ? 1 : 0; - j1 = simplex[c][1]>=3 ? 1 : 0; - k1 = simplex[c][2]>=3 ? 1 : 0; - l1 = simplex[c][3]>=3 ? 1 : 0; - // The number 2 in the "simplex" array is at the second largest coordinate. - i2 = simplex[c][0]>=2 ? 1 : 0; - j2 = simplex[c][1]>=2 ? 1 : 0; - k2 = simplex[c][2]>=2 ? 1 : 0; - l2 = simplex[c][3]>=2 ? 1 : 0; - // The number 1 in the "simplex" array is at the second smallest coordinate. - i3 = simplex[c][0]>=1 ? 1 : 0; - j3 = simplex[c][1]>=1 ? 1 : 0; - k3 = simplex[c][2]>=1 ? 1 : 0; - l3 = simplex[c][3]>=1 ? 1 : 0; - // The fifth corner has all coordinate offsets = 1, so no need to look that up. - - float x1 = x0 - i1 + G4; // Offsets for second corner in (x,y,z,w) coords - float y1 = y0 - j1 + G4; - float z1 = z0 - k1 + G4; - float w1 = w0 - l1 + G4; - float x2 = x0 - i2 + 2.0f*G4; // Offsets for third corner in (x,y,z,w) coords - float y2 = y0 - j2 + 2.0f*G4; - float z2 = z0 - k2 + 2.0f*G4; - float w2 = w0 - l2 + 2.0f*G4; - float x3 = x0 - i3 + 3.0f*G4; // Offsets for fourth corner in (x,y,z,w) coords - float y3 = y0 - j3 + 3.0f*G4; - float z3 = z0 - k3 + 3.0f*G4; - float w3 = w0 - l3 + 3.0f*G4; - float x4 = x0 - 1.0f + 4.0f*G4; // Offsets for last corner in (x,y,z,w) coords - float y4 = y0 - 1.0f + 4.0f*G4; - float z4 = z0 - 1.0f + 4.0f*G4; - float w4 = w0 - 1.0f + 4.0f*G4; - - // Wrap the integer indices at 256, to avoid indexing perm[] out of bounds - int ii = i & 0xff; - int jj = j & 0xff; - int kk = k & 0xff; - int ll = l & 0xff; - - // Calculate the contribution from the five corners - float t0 = 0.6f - x0*x0 - y0*y0 - z0*z0 - w0*w0; - if(t0 < 0.0f) n0 = 0.0f; - else { - t0 *= t0; - n0 = t0 * t0 * grad(perm[ii+perm[jj+perm[kk+perm[ll]]]], x0, y0, z0, w0); - } - - float t1 = 0.6f - x1*x1 - y1*y1 - z1*z1 - w1*w1; - if(t1 < 0.0f) n1 = 0.0f; - else { - t1 *= t1; - n1 = t1 * t1 * grad(perm[ii+i1+perm[jj+j1+perm[kk+k1+perm[ll+l1]]]], x1, y1, z1, w1); - } - - float t2 = 0.6f - x2*x2 - y2*y2 - z2*z2 - w2*w2; - if(t2 < 0.0f) n2 = 0.0f; - else { - t2 *= t2; - n2 = t2 * t2 * grad(perm[ii+i2+perm[jj+j2+perm[kk+k2+perm[ll+l2]]]], x2, y2, z2, w2); - } - - float t3 = 0.6f - x3*x3 - y3*y3 - z3*z3 - w3*w3; - if(t3 < 0.0f) n3 = 0.0f; - else { - t3 *= t3; - n3 = t3 * t3 * grad(perm[ii+i3+perm[jj+j3+perm[kk+k3+perm[ll+l3]]]], x3, y3, z3, w3); - } - - float t4 = 0.6f - x4*x4 - y4*y4 - z4*z4 - w4*w4; - if(t4 < 0.0f) n4 = 0.0f; - else { - t4 *= t4; - n4 = t4 * t4 * grad(perm[ii+1+perm[jj+1+perm[kk+1+perm[ll+1]]]], x4, y4, z4, w4); - } - - // Sum up and scale the result to cover the range [-1,1] - return 27.3f * (n0 + n1 + n2 + n3 + n4); // TODO: The scale factor is preliminary! - } -//--------------------------------------------------------------------- diff --git a/jni/love/src/libraries/noise1234/simplexnoise1234.h b/jni/love/src/libraries/noise1234/simplexnoise1234.h index 1f74226c..6aceb6b6 100644 --- a/jni/love/src/libraries/noise1234/simplexnoise1234.h +++ b/jni/love/src/libraries/noise1234/simplexnoise1234.h @@ -13,6 +13,9 @@ // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // General Public License for more details. +// Modified by the LOVE Development Team to remove 3D and 4D implementations due +// to patent issues. + /** \file \brief Declares the SimplexNoise1234 class for producing Perlin simplex noise. \author Stefan Gustavson (stegu@itn.liu.se) @@ -35,26 +38,14 @@ class SimplexNoise1234 { SimplexNoise1234() {} ~SimplexNoise1234() {} -/** 1D, 2D, 3D and 4D float Perlin noise +/** 1D and 2D float Perlin noise */ static float noise( float x ); static float noise( float x, float y ); - static float noise( float x, float y, float z ); - static float noise( float x, float y, float z, float w ); - -/** 1D, 2D, 3D and 4D float Perlin noise, with a specified integer period - */ - static float pnoise( float x, int px ); - static float pnoise( float x, float y, int px, int py ); - static float pnoise( float x, float y, float z, int px, int py, int pz ); - static float pnoise( float x, float y, float z, float w, - int px, int py, int pz, int pw ); private: static unsigned char perm[]; static float grad( int hash, float x ); static float grad( int hash, float x, float y ); - static float grad( int hash, float x, float y , float z ); - static float grad( int hash, float x, float y, float z, float t ); }; diff --git a/jni/love/src/libraries/stb/stb_image.h b/jni/love/src/libraries/stb/stb_image.h index d23c7f60..79f076d7 100644 --- a/jni/love/src/libraries/stb/stb_image.h +++ b/jni/love/src/libraries/stb/stb_image.h @@ -1,19 +1,27 @@ -/* stb_image - v1.44 - public domain JPEG/PNG reader - http://nothings.org/stb_image.c - when you control the images you're loading +/* stb_image - v2.05 - public domain image loader - http://nothings.org/stb_image.h no warranty implied; use at your own risk Do this: #define STB_IMAGE_IMPLEMENTATION before you include this file in *one* C or C++ file to create the implementation. - #define STBI_ASSERT(x) to avoid using assert.h. + // i.e. it should look like this: + #include ... + #include ... + #include ... + #define STB_IMAGE_IMPLEMENTATION + #include "stb_image.h" + + You can #define STBI_ASSERT(x) before the #include to avoid using assert.h. + And #define STBI_MALLOC, STBI_REALLOC, and STBI_FREE to avoid using malloc,realloc,free + QUICK NOTES: Primarily of interest to game developers and other people who can avoid problematic images and only need the trivial interface - JPEG baseline (no JPEG progressive) - PNG 8-bit-per-channel only + JPEG baseline & progressive (12 bpc/arithmetic not supported, same as stock IJG lib) + PNG 1/2/4/8-bit-per-channel (16 bpc not supported) TGA (not sure what subset, if a subset) BMP non-1bpp, non-RLE @@ -22,31 +30,143 @@ GIF (*comp always reports as 4-channel) HDR (radiance rgbE format) PIC (Softimage PIC) + PNM (PPM and PGM binary only) - decode from memory or through FILE (define STBI_NO_STDIO to remove code) - decode from arbitrary I/O callbacks - - overridable dequantizing-IDCT, YCbCr-to-RGB conversion (define STBI_SIMD) + - SIMD acceleration on x86/x64 (SSE2) and ARM (NEON) - Latest revisions: - 1.44 (2014-08-07) warnings - 1.43 (2014-07-15) fix MSVC-only bug in 1.42 - 1.42 (2014-07-09) no _CRT_SECURE_NO_WARNINGS; error-path fixes; STBI_ASSERT - 1.41 (2014-06-25) fix search&replace that messed up comments/error messages - 1.40 (2014-06-22) gcc warning - 1.39 (2014-06-15) TGA optimization bugfix, multiple BMP fixes - 1.38 (2014-06-06) suppress MSVC run-time warnings, fix accidental rename of 'skip' - 1.37 (2014-06-04) remove duplicate typedef - 1.36 (2014-06-03) converted to header file, allow reading incorrect iphoned-images without iphone flag - 1.35 (2014-05-27) warnings, bugfixes, TGA optimization, etc + Full documentation under "DOCUMENTATION" below. + + + Revision 2.00 release notes: + + - Progressive JPEG is now supported. + + - PPM and PGM binary formats are now supported, thanks to Ken Miller. + + - x86 platforms now make use of SSE2 SIMD instructions for + JPEG decoding, and ARM platforms can use NEON SIMD if requested. + This work was done by Fabian "ryg" Giesen. SSE2 is used by + default, but NEON must be enabled explicitly; see docs. + + With other JPEG optimizations included in this version, we see + 2x speedup on a JPEG on an x86 machine, and a 1.5x speedup + on a JPEG on an ARM machine, relative to previous versions of this + library. The same results will not obtain for all JPGs and for all + x86/ARM machines. (Note that progressive JPEGs are significantly + slower to decode than regular JPEGs.) This doesn't mean that this + is the fastest JPEG decoder in the land; rather, it brings it + closer to parity with standard libraries. If you want the fastest + decode, look elsewhere. (See "Philosophy" section of docs below.) + + See final bullet items below for more info on SIMD. + + - Added STBI_MALLOC, STBI_REALLOC, and STBI_FREE macros for replacing + the memory allocator. Unlike other STBI libraries, these macros don't + support a context parameter, so if you need to pass a context in to + the allocator, you'll have to store it in a global or a thread-local + variable. + + - Split existing STBI_NO_HDR flag into two flags, STBI_NO_HDR and + STBI_NO_LINEAR. + STBI_NO_HDR: suppress implementation of .hdr reader format + STBI_NO_LINEAR: suppress high-dynamic-range light-linear float API + + - You can suppress implementation of any of the decoders to reduce + your code footprint by #defining one or more of the following + symbols before creating the implementation. + + STBI_NO_JPEG + STBI_NO_PNG + STBI_NO_BMP + STBI_NO_PSD + STBI_NO_TGA + STBI_NO_GIF + STBI_NO_HDR + STBI_NO_PIC + STBI_NO_PNM (.ppm and .pgm) + + - You can request *only* certain decoders and suppress all other ones + (this will be more forward-compatible, as addition of new decoders + doesn't require you to disable them explicitly): + + STBI_ONLY_JPEG + STBI_ONLY_PNG + STBI_ONLY_BMP + STBI_ONLY_PSD + STBI_ONLY_TGA + STBI_ONLY_GIF + STBI_ONLY_HDR + STBI_ONLY_PIC + STBI_ONLY_PNM (.ppm and .pgm) + + Note that you can define multiples of these, and you will get all + of them ("only x" and "only y" is interpreted to mean "only x&y"). + + - If you use STBI_NO_PNG (or _ONLY_ without PNG), and you still + want the zlib decoder to be available, #define STBI_SUPPORT_ZLIB + + - Compilation of all SIMD code can be suppressed with + #define STBI_NO_SIMD + It should not be necessary to disable SIMD unless you have issues + compiling (e.g. using an x86 compiler which doesn't support SSE + intrinsics or that doesn't support the method used to detect + SSE2 support at run-time), and even those can be reported as + bugs so I can refine the built-in compile-time checking to be + smarter. + + - The old STBI_SIMD system which allowed installing a user-defined + IDCT etc. has been removed. If you need this, don't upgrade. My + assumption is that almost nobody was doing this, and those who + were will find the built-in SIMD more satisfactory anyway. + + - RGB values computed for JPEG images are slightly different from + previous versions of stb_image. (This is due to using less + integer precision in SIMD.) The C code has been adjusted so + that the same RGB values will be computed regardless of whether + SIMD support is available, so your app should always produce + consistent results. But these results are slightly different from + previous versions. (Specifically, about 3% of available YCbCr values + will compute different RGB results from pre-1.49 versions by +-1; + most of the deviating values are one smaller in the G channel.) + + - If you must produce consistent results with previous versions of + stb_image, #define STBI_JPEG_OLD and you will get the same results + you used to; however, you will not get the SIMD speedups for + the YCbCr-to-RGB conversion step (although you should still see + significant JPEG speedup from the other changes). + + Please note that STBI_JPEG_OLD is a temporary feature; it will be + removed in future versions of the library. It is only intended for + near-term back-compatibility use. + + + Latest revision history: + 2.05 (2015-04-19) fix bug in progressive JPEG handling, fix warning + 2.04 (2015-04-15) try to re-enable SIMD on MinGW 64-bit + 2.03 (2015-04-12) additional corruption checking + stbi_set_flip_vertically_on_load + fix NEON support; fix mingw support + 2.02 (2015-01-19) fix incorrect assert, fix warning + 2.01 (2015-01-17) fix various warnings + 2.00b (2014-12-25) fix STBI_MALLOC in progressive JPEG + 2.00 (2014-12-25) optimize JPEG, including x86 SSE2 & ARM NEON SIMD + progressive JPEG + PGM/PPM support + STBI_MALLOC,STBI_REALLOC,STBI_FREE + STBI_NO_*, STBI_ONLY_* + GIF bugfix + 1.48 (2014-12-14) fix incorrectly-named assert() + 1.47 (2014-12-14) 1/2/4-bit PNG support (both grayscale and paletted) + optimize PNG + fix bug in interlaced PNG with user-specified channel count See end of file for full revision history. - TODO: - stbi_info support for BMP,PSD,HDR,PIC - ============================ Contributors ========================= - + Image formats Bug fixes & warning fixes Sean Barrett (jpeg, png, bmp) Marc LeBlanc Nicolas Schulz (hdr, psd) Christpher Lloyd @@ -54,41 +174,58 @@ Jean-Marc Lienher (gif) Won Chun Tom Seddon (pic) the Horde3D community Thatcher Ulrich (psd) Janez Zemva - Jonathan Blow + Ken Miller (pgm, ppm) Jonathan Blow Laurent Gomila - Extensions, features Aruelien Pocheville - Jetro Lauha (stbi_info) Ryamond Barbiero - James "moose2000" Brown (iPhone PNG) David Woo - Ben "Disch" Wenger (io callbacks) Roy Eltham - Martin "SpartanJ" Golini Luke Graham - Thomas Ruf - John Bartholomew - Optimizations & bugfixes Ken Hamada - Fabian "ryg" Giesen Cort Stratton - Arseny Kapoulkine Blazej Dariusz Roszkowski - Thibault Reuille + Aruelien Pocheville + Extensions, features Ryamond Barbiero + Jetro Lauha (stbi_info) David Woo + Martin "SpartanJ" Golini (stbi_info) Martin Golini + James "moose2000" Brown (iPhone PNG) Roy Eltham + Ben "Disch" Wenger (io callbacks) Luke Graham + Omar Cornut (1/2/4-bit PNG) Thomas Ruf + Nicolas Guillemot (vertical flip) John Bartholomew + Ken Hamada + Optimizations & bugfixes Cort Stratton + Fabian "ryg" Giesen Blazej Dariusz Roszkowski + Arseny Kapoulkine Thibault Reuille Paul Du Bois Guillaume George - Jerry Jansson - If your name should be here but Hayaki Saito - isn't, let Sean know. Johan Duparc + If your name should be here but Jerry Jansson + isn't, let Sean know. Hayaki Saito + Johan Duparc Ronny Chevalier + Michal Cichon + Tero Hanninen + Sergio Gonzalez + Cass Everitt + Engin Manap + Martins Mozeiko + Joseph Thomson + Phil Jordan + +License: + This software is in the public domain. Where that dedication is not + recognized, you are granted a perpetual, irrevocable license to copy + and modify this file however you want. + */ #ifndef STBI_INCLUDE_STB_IMAGE_H #define STBI_INCLUDE_STB_IMAGE_H +// DOCUMENTATION +// // Limitations: -// - no jpeg progressive support -// - non-HDR formats support 8-bit samples only (jpeg, png) -// - no delayed line count (jpeg) -- IJG doesn't support either +// - no 16-bit-per-channel PNG +// - no 12-bit-per-channel JPEG +// - no JPEGs with arithmetic coding // - no 1-bit BMP // - GIF always returns *comp=4 // -// Basic usage (see HDR discussion below): +// Basic usage (see HDR discussion below for HDR usage): // int x,y,n; // unsigned char *data = stbi_load(filename, &x, &y, &n, 0); -// // ... process data if not NULL ... +// // ... process data if not NULL ... // // ... x = width, y = height, n = # 8-bit components per pixel ... // // ... replace '0' with '1'..'4' to force that many components per pixel // // ... but 'n' will always be the number that it would have been if you said 0 @@ -101,14 +238,16 @@ // int req_comp -- if non-zero, # of image components requested in result // // The return value from an image loader is an 'unsigned char *' which points -// to the pixel data. The pixel data consists of *y scanlines of *x pixels, +// to the pixel data, or NULL on an allocation failure or if the image is +// corrupt or invalid. The pixel data consists of *y scanlines of *x pixels, // with each pixel consisting of N interleaved 8-bit components; the first // pixel pointed to is top-left-most in the image. There is no padding between // image scanlines or between pixels, regardless of format. The number of // components N is 'req_comp' if req_comp is non-zero, or *comp otherwise. // If req_comp is non-zero, *comp has the number of components that _would_ // have been output otherwise. E.g. if you set req_comp to 4, you will always -// get RGBA output, but you can check *comp to easily see if it's opaque. +// get RGBA output, but you can check *comp to see if it's trivially opaque +// because e.g. there were only 3 channels in the source image. // // An output image with N components has the following components interleaved // in this order in each pixel: @@ -130,18 +269,66 @@ // // =========================================================================== // -// iPhone PNG support: +// Philosophy // -// By default we convert iphone-formatted PNGs back to RGB; nominally they -// would silently load as BGR, except the existing code should have just -// failed on such iPhone PNGs. But you can disable this conversion by -// by calling stbi_convert_iphone_png_to_rgb(0), in which case -// you will always just get the native iphone "format" through. +// stb libraries are designed with the following priorities: // -// Call stbi_set_unpremultiply_on_load(1) as well to force a divide per -// pixel to remove any premultiplied alpha *only* if the image file explicitly -// says there's premultiplied data (currently only happens in iPhone images, -// and only if iPhone convert-to-rgb processing is on). +// 1. easy to use +// 2. easy to maintain +// 3. good performance +// +// Sometimes I let "good performance" creep up in priority over "easy to maintain", +// and for best performance I may provide less-easy-to-use APIs that give higher +// performance, in addition to the easy to use ones. Nevertheless, it's important +// to keep in mind that from the standpoint of you, a client of this library, +// all you care about is #1 and #3, and stb libraries do not emphasize #3 above all. +// +// Some secondary priorities arise directly from the first two, some of which +// make more explicit reasons why performance can't be emphasized. +// +// - Portable ("ease of use") +// - Small footprint ("easy to maintain") +// - No dependencies ("ease of use") +// +// =========================================================================== +// +// I/O callbacks +// +// I/O callbacks allow you to read from arbitrary sources, like packaged +// files or some other source. Data read from callbacks are processed +// through a small internal buffer (currently 128 bytes) to try to reduce +// overhead. +// +// The three functions you must define are "read" (reads some bytes of data), +// "skip" (skips some bytes of data), "eof" (reports if the stream is at the end). +// +// =========================================================================== +// +// SIMD support +// +// The JPEG decoder will try to automatically use SIMD kernels on x86 when +// supported by the compiler. For ARM Neon support, you must explicitly +// request it. +// +// (The old do-it-yourself SIMD API is no longer supported in the current +// code.) +// +// On x86, SSE2 will automatically be used when available based on a run-time +// test; if not, the generic C versions are used as a fall-back. On ARM targets, +// the typical path is to have separate builds for NEON and non-NEON devices +// (at least this is true for iOS and Android). Therefore, the NEON support is +// toggled by a build flag: define STBI_NEON to get NEON loops. +// +// The output of the JPEG decoder is slightly different from versions where +// SIMD support was introduced (that is, for versions before 1.49). The +// difference is only +-1 in the 8-bit RGB channels, and only on a small +// fraction of pixels. You can force the pre-1.49 behavior by defining +// STBI_JPEG_OLD, but this will disable some of the SIMD decoding path +// and hence cost some performance. +// +// If for some reason you do not want to use any of SIMD code, or if +// you have issues compiling it, you can disable it entirely by +// defining STBI_NO_SIMD. // // =========================================================================== // @@ -164,7 +351,7 @@ // (linear) floats to preserve the full dynamic range: // // float *data = stbi_loadf(filename, &x, &y, &n, 0); -// +// // If you load LDR images through this interface, those images will // be promoted to floating point values, run through the inverse of // constants corresponding to the above: @@ -181,15 +368,19 @@ // // =========================================================================== // -// I/O callbacks +// iPhone PNG support: // -// I/O callbacks allow you to read from arbitrary sources, like packaged -// files or some other source. Data read from callbacks are processed -// through a small internal buffer (currently 128 bytes) to try to reduce -// overhead. +// By default we convert iphone-formatted PNGs back to RGB, even though +// they are internally encoded differently. You can disable this conversion +// by by calling stbi_convert_iphone_png_to_rgb(0), in which case +// you will always just get the native iphone "format" through (which +// is BGR stored in RGB). +// +// Call stbi_set_unpremultiply_on_load(1) as well to force a divide per +// pixel to remove any premultiplied alpha *only* if the image file explicitly +// says there's premultiplied data (currently only happens in iPhone images, +// and only if iPhone convert-to-rgb processing is on). // -// The three functions you must define are "read" (reads some bytes of data), -// "skip" (skips some bytes of data), "eof" (reports if the stream is at the end). #ifndef STBI_NO_STDIO @@ -229,41 +420,43 @@ extern "C" { // load image by filename, open file, or memory buffer // -STBIDEF stbi_uc *stbi_load_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp); - -#ifndef STBI_NO_STDIO -STBIDEF stbi_uc *stbi_load (char const *filename, int *x, int *y, int *comp, int req_comp); -STBIDEF stbi_uc *stbi_load_from_file (FILE *f, int *x, int *y, int *comp, int req_comp); -// for stbi_load_from_file, file pointer is left pointing immediately after image -#endif - typedef struct { - int (*read) (void *user,char *data,int size); // fill 'data' with 'size' bytes. return number of bytes actually read + int (*read) (void *user,char *data,int size); // fill 'data' with 'size' bytes. return number of bytes actually read void (*skip) (void *user,int n); // skip the next 'n' bytes, or 'unget' the last -n bytes if negative int (*eof) (void *user); // returns nonzero if we are at end of file/data } stbi_io_callbacks; -STBIDEF stbi_uc *stbi_load_from_callbacks (stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp); +STBIDEF stbi_uc *stbi_load (char const *filename, int *x, int *y, int *comp, int req_comp); +STBIDEF stbi_uc *stbi_load_from_memory (stbi_uc const *buffer, int len , int *x, int *y, int *comp, int req_comp); +STBIDEF stbi_uc *stbi_load_from_callbacks(stbi_io_callbacks const *clbk , void *user, int *x, int *y, int *comp, int req_comp); -#ifndef STBI_NO_HDR - STBIDEF float *stbi_loadf_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp); +#ifndef STBI_NO_STDIO +STBIDEF stbi_uc *stbi_load_from_file (FILE *f, int *x, int *y, int *comp, int req_comp); +// for stbi_load_from_file, file pointer is left pointing immediately after image +#endif - #ifndef STBI_NO_STDIO - STBIDEF float *stbi_loadf (char const *filename, int *x, int *y, int *comp, int req_comp); - STBIDEF float *stbi_loadf_from_file (FILE *f, int *x, int *y, int *comp, int req_comp); - #endif - +#ifndef STBI_NO_LINEAR + STBIDEF float *stbi_loadf (char const *filename, int *x, int *y, int *comp, int req_comp); + STBIDEF float *stbi_loadf_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp); STBIDEF float *stbi_loadf_from_callbacks (stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp); + #ifndef STBI_NO_STDIO + STBIDEF float *stbi_loadf_from_file (FILE *f, int *x, int *y, int *comp, int req_comp); + #endif +#endif + +#ifndef STBI_NO_HDR STBIDEF void stbi_hdr_to_ldr_gamma(float gamma); STBIDEF void stbi_hdr_to_ldr_scale(float scale); +#endif +#ifndef STBI_NO_LINEAR STBIDEF void stbi_ldr_to_hdr_gamma(float gamma); STBIDEF void stbi_ldr_to_hdr_scale(float scale); #endif // STBI_NO_HDR -// stbi_is_hdr is always defined +// stbi_is_hdr is always defined, but always returns false if STBI_NO_HDR STBIDEF int stbi_is_hdr_from_callbacks(stbi_io_callbacks const *clbk, void *user); STBIDEF int stbi_is_hdr_from_memory(stbi_uc const *buffer, int len); #ifndef STBI_NO_STDIO @@ -274,7 +467,7 @@ STBIDEF int stbi_is_hdr_from_file(FILE *f); // get a VERY brief reason for failure // NOT THREADSAFE -STBIDEF const char *stbi_failure_reason (void); +STBIDEF const char *stbi_failure_reason (void); // free the loaded image -- this is just free() STBIDEF void stbi_image_free (void *retval_from_stbi_load); @@ -300,6 +493,8 @@ STBIDEF void stbi_set_unpremultiply_on_load(int flag_true_if_should_unpremultipl // or just pass them through "as-is" STBIDEF void stbi_convert_iphone_png_to_rgb(int flag_true_if_should_convert); +// flip the image vertically, so the first pixel in the output array is the bottom left +STBIDEF void stbi_set_flip_vertically_on_load(int flag_true_if_should_flip); // ZLIB client - used by PNG, available for other purposes @@ -312,26 +507,6 @@ STBIDEF char *stbi_zlib_decode_noheader_malloc(const char *buffer, int len, int STBIDEF int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const char *ibuffer, int ilen); -// define faster low-level operations (typically SIMD support) -#ifdef STBI_SIMD -typedef void (*stbi_idct_8x8)(stbi_uc *out, int out_stride, short data[64], unsigned short *dequantize); -// compute an integer IDCT on "input" -// input[x] = data[x] * dequantize[x] -// write results to 'out': 64 samples, each run of 8 spaced by 'out_stride' -// CLAMP results to 0..255 -typedef void (*stbi_YCbCr_to_RGB_run)(stbi_uc *output, stbi_uc const *y, stbi_uc const *cb, stbi_uc const *cr, int count, int step); -// compute a conversion from YCbCr to RGB -// 'count' pixels -// write pixels to 'output'; each pixel is 'step' bytes (either 3 or 4; if 4, write '255' as 4th), order R,G,B -// y: Y input channel -// cb: Cb input channel; scale/biased to be 0..255 -// cr: Cr input channel; scale/biased to be 0..255 - -STBIDEF void stbi_install_idct(stbi_idct_8x8 func); -STBIDEF void stbi_install_YCbCr_to_RGB(stbi_YCbCr_to_RGB_run func); -#endif // STBI_SIMD - - #ifdef __cplusplus } #endif @@ -343,22 +518,62 @@ STBIDEF void stbi_install_YCbCr_to_RGB(stbi_YCbCr_to_RGB_run func); #ifdef STB_IMAGE_IMPLEMENTATION -#ifndef STBI_NO_HDR +#if defined(STBI_ONLY_JPEG) || defined(STBI_ONLY_PNG) || defined(STBI_ONLY_BMP) \ + || defined(STBI_ONLY_TGA) || defined(STBI_ONLY_GIF) || defined(STBI_ONLY_PSD) \ + || defined(STBI_ONLY_HDR) || defined(STBI_ONLY_PIC) || defined(STBI_ONLY_PNM) \ + || defined(STBI_ONLY_ZLIB) + #ifndef STBI_ONLY_JPEG + #define STBI_NO_JPEG + #endif + #ifndef STBI_ONLY_PNG + #define STBI_NO_PNG + #endif + #ifndef STBI_ONLY_BMP + #define STBI_NO_BMP + #endif + #ifndef STBI_ONLY_PSD + #define STBI_NO_PSD + #endif + #ifndef STBI_ONLY_TGA + #define STBI_NO_TGA + #endif + #ifndef STBI_ONLY_GIF + #define STBI_NO_GIF + #endif + #ifndef STBI_ONLY_HDR + #define STBI_NO_HDR + #endif + #ifndef STBI_ONLY_PIC + #define STBI_NO_PIC + #endif + #ifndef STBI_ONLY_PNM + #define STBI_NO_PNM + #endif +#endif + +#if defined(STBI_NO_PNG) && !defined(STBI_SUPPORT_ZLIB) && !defined(STBI_NO_ZLIB) +#define STBI_NO_ZLIB +#endif + + +#include +#include // ptrdiff_t on osx +#include +#include + +#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) #include // ldexp -#include // strcmp, strtok #endif #ifndef STBI_NO_STDIO #include #endif -#include -#include + #ifndef STBI_ASSERT #include #define STBI_ASSERT(x) assert(x) #endif -#include -#include // ptrdiff_t on osx + #ifndef _MSC_VER #ifdef __cplusplus @@ -403,6 +618,117 @@ typedef unsigned char validate_uint32[sizeof(stbi__uint32)==4 ? 1 : -1]; #define stbi_lrot(x,y) (((x) << (y)) | ((x) >> (32 - (y)))) #endif +#if defined(STBI_MALLOC) && defined(STBI_FREE) && defined(STBI_REALLOC) +// ok +#elif !defined(STBI_MALLOC) && !defined(STBI_FREE) && !defined(STBI_REALLOC) +// ok +#else +#error "Must define all or none of STBI_MALLOC, STBI_FREE, and STBI_REALLOC." +#endif + +#ifndef STBI_MALLOC +#define STBI_MALLOC(sz) malloc(sz) +#define STBI_REALLOC(p,sz) realloc(p,sz) +#define STBI_FREE(p) free(p) +#endif + +// x86/x64 detection +#if defined(__x86_64__) || defined(_M_X64) +#define STBI__X64_TARGET +#elif defined(__i386) || defined(_M_IX86) +#define STBI__X86_TARGET +#endif + +#if defined(__GNUC__) && (defined(STBI__X86_TARGET) || defined(STBI__X64_TARGET)) && !defined(__SSE2__) && !defined(STBI_NO_SIMD) +// NOTE: not clear do we actually need this for the 64-bit path? +// gcc doesn't support sse2 intrinsics unless you compile with -msse2, +// (but compiling with -msse2 allows the compiler to use SSE2 everywhere; +// this is just broken and gcc are jerks for not fixing it properly +// http://www.virtualdub.org/blog/pivot/entry.php?id=363 ) +#define STBI_NO_SIMD +#endif + +#if defined(__MINGW32__) && defined(STBI__X86_TARGET) && !defined(STBI_MINGW_ENABLE_SSE2) && !defined(STBI_NO_SIMD) +// Note that __MINGW32__ doesn't actually mean 32-bit, so we have to avoid STBI__X64_TARGET +// +// 32-bit MinGW wants ESP to be 16-byte aligned, but this is not in the +// Windows ABI and VC++ as well as Windows DLLs don't maintain that invariant. +// As a result, enabling SSE2 on 32-bit MinGW is dangerous when not +// simultaneously enabling "-mstackrealign". +// +// See https://github.com/nothings/stb/issues/81 for more information. +// +// So default to no SSE2 on 32-bit MinGW. If you've read this far and added +// -mstackrealign to your build settings, feel free to #define STBI_MINGW_ENABLE_SSE2. +#define STBI_NO_SIMD +#endif + +#if !defined(STBI_NO_SIMD) && defined(STBI__X86_TARGET) +#define STBI_SSE2 +#include + +#ifdef _MSC_VER + +#if _MSC_VER >= 1400 // not VC6 +#include // __cpuid +static int stbi__cpuid3(void) +{ + int info[4]; + __cpuid(info,1); + return info[3]; +} +#else +static int stbi__cpuid3(void) +{ + int res; + __asm { + mov eax,1 + cpuid + mov res,edx + } + return res; +} +#endif + +#define STBI_SIMD_ALIGN(type, name) __declspec(align(16)) type name + +static int stbi__sse2_available() +{ + int info3 = stbi__cpuid3(); + return ((info3 >> 26) & 1) != 0; +} +#else // assume GCC-style if not VC++ +#define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16))) + +static int stbi__sse2_available() +{ +#if defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__) >= 408 // GCC 4.8 or later + // GCC 4.8+ has a nice way to do this + return __builtin_cpu_supports("sse2"); +#else + // portable way to do this, preferably without using GCC inline ASM? + // just bail for now. + return 0; +#endif +} +#endif +#endif + +// ARM NEON +#if defined(STBI_NO_SIMD) && defined(STBI_NEON) +#undef STBI_NEON +#endif + +#ifdef STBI_NEON +#include +// assume GCC or Clang on ARM targets +#define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16))) +#endif + +#ifndef STBI_SIMD_ALIGN +#define STBI_SIMD_ALIGN(type, name) type name +#endif + /////////////////////////////////////////////// // // stbi__context struct and start_xxx functions @@ -413,7 +739,7 @@ typedef struct { stbi__uint32 img_x, img_y; int img_n, img_out_n; - + stbi_io_callbacks io; void *io_user_data; @@ -489,29 +815,59 @@ static void stbi__rewind(stbi__context *s) s->img_buffer = s->img_buffer_original; } +#ifndef STBI_NO_JPEG static int stbi__jpeg_test(stbi__context *s); static stbi_uc *stbi__jpeg_load(stbi__context *s, int *x, int *y, int *comp, int req_comp); static int stbi__jpeg_info(stbi__context *s, int *x, int *y, int *comp); +#endif + +#ifndef STBI_NO_PNG static int stbi__png_test(stbi__context *s); static stbi_uc *stbi__png_load(stbi__context *s, int *x, int *y, int *comp, int req_comp); static int stbi__png_info(stbi__context *s, int *x, int *y, int *comp); +#endif + +#ifndef STBI_NO_BMP static int stbi__bmp_test(stbi__context *s); static stbi_uc *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req_comp); +static int stbi__bmp_info(stbi__context *s, int *x, int *y, int *comp); +#endif + +#ifndef STBI_NO_TGA static int stbi__tga_test(stbi__context *s); static stbi_uc *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int req_comp); static int stbi__tga_info(stbi__context *s, int *x, int *y, int *comp); +#endif + +#ifndef STBI_NO_PSD static int stbi__psd_test(stbi__context *s); static stbi_uc *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int req_comp); +static int stbi__psd_info(stbi__context *s, int *x, int *y, int *comp); +#endif + #ifndef STBI_NO_HDR static int stbi__hdr_test(stbi__context *s); static float *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int req_comp); +static int stbi__hdr_info(stbi__context *s, int *x, int *y, int *comp); #endif + +#ifndef STBI_NO_PIC static int stbi__pic_test(stbi__context *s); static stbi_uc *stbi__pic_load(stbi__context *s, int *x, int *y, int *comp, int req_comp); +static int stbi__pic_info(stbi__context *s, int *x, int *y, int *comp); +#endif + +#ifndef STBI_NO_GIF static int stbi__gif_test(stbi__context *s); static stbi_uc *stbi__gif_load(stbi__context *s, int *x, int *y, int *comp, int req_comp); static int stbi__gif_info(stbi__context *s, int *x, int *y, int *comp); +#endif +#ifndef STBI_NO_PNM +static int stbi__pnm_test(stbi__context *s); +static stbi_uc *stbi__pnm_load(stbi__context *s, int *x, int *y, int *comp, int req_comp); +static int stbi__pnm_info(stbi__context *s, int *x, int *y, int *comp); +#endif // this is not threadsafe static const char *stbi__g_failure_reason; @@ -527,6 +883,11 @@ static int stbi__err(const char *str) return 0; } +static void *stbi__malloc(size_t size) +{ + return STBI_MALLOC(size); +} + // stbi__err - error // stbi__errpf - error returning pointer to float // stbi__errpuc - error returning pointer to unsigned char @@ -544,22 +905,47 @@ static int stbi__err(const char *str) STBIDEF void stbi_image_free(void *retval_from_stbi_load) { - free(retval_from_stbi_load); + STBI_FREE(retval_from_stbi_load); } -#ifndef STBI_NO_HDR +#ifndef STBI_NO_LINEAR static float *stbi__ldr_to_hdr(stbi_uc *data, int x, int y, int comp); +#endif + +#ifndef STBI_NO_HDR static stbi_uc *stbi__hdr_to_ldr(float *data, int x, int y, int comp); #endif -static unsigned char *stbi_load_main(stbi__context *s, int *x, int *y, int *comp, int req_comp) +static int stbi__vertically_flip_on_load = 0; + +STBIDEF void stbi_set_flip_vertically_on_load(int flag_true_if_should_flip) { + stbi__vertically_flip_on_load = flag_true_if_should_flip; +} + +static unsigned char *stbi__load_main(stbi__context *s, int *x, int *y, int *comp, int req_comp) +{ + #ifndef STBI_NO_JPEG if (stbi__jpeg_test(s)) return stbi__jpeg_load(s,x,y,comp,req_comp); + #endif + #ifndef STBI_NO_PNG if (stbi__png_test(s)) return stbi__png_load(s,x,y,comp,req_comp); + #endif + #ifndef STBI_NO_BMP if (stbi__bmp_test(s)) return stbi__bmp_load(s,x,y,comp,req_comp); + #endif + #ifndef STBI_NO_GIF if (stbi__gif_test(s)) return stbi__gif_load(s,x,y,comp,req_comp); + #endif + #ifndef STBI_NO_PSD if (stbi__psd_test(s)) return stbi__psd_load(s,x,y,comp,req_comp); + #endif + #ifndef STBI_NO_PIC if (stbi__pic_test(s)) return stbi__pic_load(s,x,y,comp,req_comp); + #endif + #ifndef STBI_NO_PNM + if (stbi__pnm_test(s)) return stbi__pnm_load(s,x,y,comp,req_comp); + #endif #ifndef STBI_NO_HDR if (stbi__hdr_test(s)) { @@ -568,15 +954,65 @@ static unsigned char *stbi_load_main(stbi__context *s, int *x, int *y, int *comp } #endif + #ifndef STBI_NO_TGA // test tga last because it's a crappy test! if (stbi__tga_test(s)) return stbi__tga_load(s,x,y,comp,req_comp); + #endif + return stbi__errpuc("unknown image type", "Image not of any known type, or corrupt"); } +static unsigned char *stbi__load_flip(stbi__context *s, int *x, int *y, int *comp, int req_comp) +{ + unsigned char *result = stbi__load_main(s, x, y, comp, req_comp); + + if (stbi__vertically_flip_on_load && result != NULL) { + int w = *x, h = *y; + int depth = req_comp ? req_comp : *comp; + int row,col,z; + stbi_uc temp; + + // @OPTIMIZE: use a bigger temp buffer and memcpy multiple pixels at once + for (row = 0; row < (h>>1); row++) { + for (col = 0; col < w; col++) { + for (z = 0; z < depth; z++) { + temp = result[(row * w + col) * depth + z]; + result[(row * w + col) * depth + z] = result[((h - row - 1) * w + col) * depth + z]; + result[((h - row - 1) * w + col) * depth + z] = temp; + } + } + } + } + + return result; +} + +static void stbi__float_postprocess(float *result, int *x, int *y, int *comp, int req_comp) +{ + if (stbi__vertically_flip_on_load && result != NULL) { + int w = *x, h = *y; + int depth = req_comp ? req_comp : *comp; + int row,col,z; + float temp; + + // @OPTIMIZE: use a bigger temp buffer and memcpy multiple pixels at once + for (row = 0; row < (h>>1); row++) { + for (col = 0; col < w; col++) { + for (z = 0; z < depth; z++) { + temp = result[(row * w + col) * depth + z]; + result[(row * w + col) * depth + z] = result[((h - row - 1) * w + col) * depth + z]; + result[((h - row - 1) * w + col) * depth + z] = temp; + } + } + } + } +} + + #ifndef STBI_NO_STDIO -FILE *stbi__fopen(char const *filename, char const *mode) +static FILE *stbi__fopen(char const *filename, char const *mode) { FILE *f; #if defined(_MSC_VER) && _MSC_VER >= 1400 @@ -589,7 +1025,7 @@ FILE *stbi__fopen(char const *filename, char const *mode) } -STBIDEF unsigned char *stbi_load(char const *filename, int *x, int *y, int *comp, int req_comp) +STBIDEF stbi_uc *stbi_load(char const *filename, int *x, int *y, int *comp, int req_comp) { FILE *f = stbi__fopen(filename, "rb"); unsigned char *result; @@ -599,12 +1035,12 @@ STBIDEF unsigned char *stbi_load(char const *filename, int *x, int *y, int *comp return result; } -STBIDEF unsigned char *stbi_load_from_file(FILE *f, int *x, int *y, int *comp, int req_comp) +STBIDEF stbi_uc *stbi_load_from_file(FILE *f, int *x, int *y, int *comp, int req_comp) { unsigned char *result; stbi__context s; stbi__start_file(&s,f); - result = stbi_load_main(&s,x,y,comp,req_comp); + result = stbi__load_flip(&s,x,y,comp,req_comp); if (result) { // need to 'unget' all the characters in the IO buffer fseek(f, - (int) (s.img_buffer_end - s.img_buffer), SEEK_CUR); @@ -613,51 +1049,54 @@ STBIDEF unsigned char *stbi_load_from_file(FILE *f, int *x, int *y, int *comp, i } #endif //!STBI_NO_STDIO -STBIDEF unsigned char *stbi_load_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp) +STBIDEF stbi_uc *stbi_load_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp) { stbi__context s; stbi__start_mem(&s,buffer,len); - return stbi_load_main(&s,x,y,comp,req_comp); + return stbi__load_flip(&s,x,y,comp,req_comp); } -unsigned char *stbi_load_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp) +STBIDEF stbi_uc *stbi_load_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp) { stbi__context s; stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user); - return stbi_load_main(&s,x,y,comp,req_comp); + return stbi__load_flip(&s,x,y,comp,req_comp); } -#ifndef STBI_NO_HDR - -float *stbi_loadf_main(stbi__context *s, int *x, int *y, int *comp, int req_comp) +#ifndef STBI_NO_LINEAR +static float *stbi__loadf_main(stbi__context *s, int *x, int *y, int *comp, int req_comp) { unsigned char *data; #ifndef STBI_NO_HDR - if (stbi__hdr_test(s)) - return stbi__hdr_load(s,x,y,comp,req_comp); + if (stbi__hdr_test(s)) { + float *hdr_data = stbi__hdr_load(s,x,y,comp,req_comp); + if (hdr_data) + stbi__float_postprocess(hdr_data,x,y,comp,req_comp); + return hdr_data; + } #endif - data = stbi_load_main(s, x, y, comp, req_comp); + data = stbi__load_flip(s, x, y, comp, req_comp); if (data) return stbi__ldr_to_hdr(data, *x, *y, req_comp ? req_comp : *comp); return stbi__errpf("unknown image type", "Image not of any known type, or corrupt"); } -float *stbi_loadf_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp) +STBIDEF float *stbi_loadf_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp) { stbi__context s; stbi__start_mem(&s,buffer,len); - return stbi_loadf_main(&s,x,y,comp,req_comp); + return stbi__loadf_main(&s,x,y,comp,req_comp); } -float *stbi_loadf_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp) +STBIDEF float *stbi_loadf_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp) { stbi__context s; stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user); - return stbi_loadf_main(&s,x,y,comp,req_comp); + return stbi__loadf_main(&s,x,y,comp,req_comp); } #ifndef STBI_NO_STDIO -float *stbi_loadf(char const *filename, int *x, int *y, int *comp, int req_comp) +STBIDEF float *stbi_loadf(char const *filename, int *x, int *y, int *comp, int req_comp) { float *result; FILE *f = stbi__fopen(filename, "rb"); @@ -667,21 +1106,21 @@ float *stbi_loadf(char const *filename, int *x, int *y, int *comp, int req_comp) return result; } -float *stbi_loadf_from_file(FILE *f, int *x, int *y, int *comp, int req_comp) +STBIDEF float *stbi_loadf_from_file(FILE *f, int *x, int *y, int *comp, int req_comp) { stbi__context s; stbi__start_file(&s,f); - return stbi_loadf_main(&s,x,y,comp,req_comp); + return stbi__loadf_main(&s,x,y,comp,req_comp); } #endif // !STBI_NO_STDIO -#endif // !STBI_NO_HDR +#endif // !STBI_NO_LINEAR -// these is-hdr-or-not is defined independent of whether STBI_NO_HDR is -// defined, for API simplicity; if STBI_NO_HDR is defined, it always +// these is-hdr-or-not is defined independent of whether STBI_NO_LINEAR is +// defined, for API simplicity; if STBI_NO_LINEAR is defined, it always // reports false! -int stbi_is_hdr_from_memory(stbi_uc const *buffer, int len) +STBIDEF int stbi_is_hdr_from_memory(stbi_uc const *buffer, int len) { #ifndef STBI_NO_HDR stbi__context s; @@ -725,23 +1164,21 @@ STBIDEF int stbi_is_hdr_from_callbacks(stbi_io_callbacks const *clbk, void stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user); return stbi__hdr_test(&s); #else - STBI_NOTUSED(clbk); - STBI_NOTUSED(user); return 0; #endif } -#ifndef STBI_NO_HDR static float stbi__h2l_gamma_i=1.0f/2.2f, stbi__h2l_scale_i=1.0f; static float stbi__l2h_gamma=2.2f, stbi__l2h_scale=1.0f; -void stbi_hdr_to_ldr_gamma(float gamma) { stbi__h2l_gamma_i = 1/gamma; } -void stbi_hdr_to_ldr_scale(float scale) { stbi__h2l_scale_i = 1/scale; } - -void stbi_ldr_to_hdr_gamma(float gamma) { stbi__l2h_gamma = gamma; } -void stbi_ldr_to_hdr_scale(float scale) { stbi__l2h_scale = scale; } +#ifndef STBI_NO_LINEAR +STBIDEF void stbi_ldr_to_hdr_gamma(float gamma) { stbi__l2h_gamma = gamma; } +STBIDEF void stbi_ldr_to_hdr_scale(float scale) { stbi__l2h_scale = scale; } #endif +STBIDEF void stbi_hdr_to_ldr_gamma(float gamma) { stbi__h2l_gamma_i = 1/gamma; } +STBIDEF void stbi_hdr_to_ldr_scale(float scale) { stbi__h2l_scale_i = 1/scale; } + ////////////////////////////////////////////////////////////////////////////// // @@ -750,9 +1187,9 @@ void stbi_ldr_to_hdr_scale(float scale) { stbi__l2h_scale = scale; } enum { - SCAN_load=0, - SCAN_type, - SCAN_header + STBI__SCAN_load=0, + STBI__SCAN_type, + STBI__SCAN_header }; static void stbi__refill_buffer(stbi__context *s) @@ -760,7 +1197,7 @@ static void stbi__refill_buffer(stbi__context *s) int n = (s->io.read)(s->io_user_data,(char*)s->buffer_start,s->buflen); if (n == 0) { // at end of file, treat same as if from memory, but need to handle case - // where s->img_buffer isn't pointing to safe memory, stbi__err.g. 0-byte file + // where s->img_buffer isn't pointing to safe memory, e.g. 0-byte file s->read_from_callbacks = 0; s->img_buffer = s->buffer_start; s->img_buffer_end = s->buffer_start+1; @@ -791,11 +1228,15 @@ stbi_inline static int stbi__at_eof(stbi__context *s) if (s->read_from_callbacks == 0) return 1; } - return s->img_buffer >= s->img_buffer_end; + return s->img_buffer >= s->img_buffer_end; } static void stbi__skip(stbi__context *s, int n) { + if (n < 0) { + s->img_buffer = s->img_buffer_end; + return; + } if (s->io.read) { int blen = (int) (s->img_buffer_end - s->img_buffer); if (blen < n) { @@ -815,7 +1256,7 @@ static int stbi__getn(stbi__context *s, stbi_uc *buffer, int n) int res, count; memcpy(buffer, s->img_buffer, blen); - + count = (s->io.read)(s->io_user_data, (char*) buffer + blen, n - blen); res = (count == (n-blen)); s->img_buffer = s->img_buffer_end; @@ -855,10 +1296,13 @@ static stbi__uint32 stbi__get32le(stbi__context *s) return z + (stbi__get16le(s) << 16); } +#define STBI__BYTECAST(x) ((stbi_uc) ((x) & 255)) // truncate int to byte without warnings + + ////////////////////////////////////////////////////////////////////////////// // // generic converter from built-in img_n to req_comp -// individual types do this automatically as much as possible (stbi__err.g. jpeg +// individual types do this automatically as much as possible (e.g. jpeg // does all cases internally since it needs to colorspace convert anyway, // and it never has alpha, so very few cases ). png can automatically // interleave an alpha=255 channel, but falls back to this for other cases @@ -879,9 +1323,9 @@ static unsigned char *stbi__convert_format(unsigned char *data, int img_n, int r if (req_comp == img_n) return data; STBI_ASSERT(req_comp >= 1 && req_comp <= 4); - good = (unsigned char *) malloc(req_comp * x * y); + good = (unsigned char *) stbi__malloc(req_comp * x * y); if (good == NULL) { - free(data); + STBI_FREE(data); return stbi__errpuc("outofmem", "Out of memory"); } @@ -911,16 +1355,16 @@ static unsigned char *stbi__convert_format(unsigned char *data, int img_n, int r #undef CASE } - free(data); + STBI_FREE(data); return good; } -#ifndef STBI_NO_HDR +#ifndef STBI_NO_LINEAR static float *stbi__ldr_to_hdr(stbi_uc *data, int x, int y, int comp) { int i,k,n; - float *output = (float *) malloc(x * y * comp * sizeof(float)); - if (output == NULL) { free(data); return stbi__errpf("outofmem", "Out of memory"); } + float *output = (float *) stbi__malloc(x * y * comp * sizeof(float)); + if (output == NULL) { STBI_FREE(data); return stbi__errpf("outofmem", "Out of memory"); } // compute number of non-alpha components if (comp & 1) n = comp; else n = comp-1; for (i=0; i < x*y; ++i) { @@ -929,16 +1373,18 @@ static float *stbi__ldr_to_hdr(stbi_uc *data, int x, int y, int comp) } if (k < comp) output[i*comp + k] = data[i*comp+k]/255.0f; } - free(data); + STBI_FREE(data); return output; } +#endif +#ifndef STBI_NO_HDR #define stbi__float2int(x) ((int) (x)) static stbi_uc *stbi__hdr_to_ldr(float *data, int x, int y, int comp) { int i,k,n; - stbi_uc *output = (stbi_uc *) malloc(x * y * comp); - if (output == NULL) { free(data); return stbi__errpuc("outofmem", "Out of memory"); } + stbi_uc *output = (stbi_uc *) stbi__malloc(x * y * comp); + if (output == NULL) { STBI_FREE(data); return stbi__errpuc("outofmem", "Out of memory"); } // compute number of non-alpha components if (comp & 1) n = comp; else n = comp-1; for (i=0; i < x*y; ++i) { @@ -955,17 +1401,16 @@ static stbi_uc *stbi__hdr_to_ldr(float *data, int x, int y, int comp) output[i*comp + k] = (stbi_uc) stbi__float2int(z); } } - free(data); + STBI_FREE(data); return output; } #endif ////////////////////////////////////////////////////////////////////////////// // -// "baseline" JPEG/JFIF decoder (not actually fully baseline implementation) +// "baseline" JPEG/JFIF decoder // // simple implementation -// - channel subsampling of at most 2 in each dimension // - doesn't support delayed output of y-dimension // - simple interface (only one output format: 8-bit interleaved RGB) // - doesn't try to recover corrupt jpegs @@ -979,13 +1424,10 @@ static stbi_uc *stbi__hdr_to_ldr(float *data, int x, int y, int comp) // - quality integer IDCT derived from IJG's 'slow' // performance // - fast huffman; reasonable integer IDCT +// - some SIMD kernels for common paths on targets with SSE2/NEON // - uses a lot of intermediate memory, could cache poorly -// - load http://nothings.org/remote/anemones.jpg 3 times on 2.8Ghz P4 -// stb_jpeg: 1.34 seconds (MSVC6, default release build) -// stb_jpeg: 1.06 seconds (MSVC6, processor = Pentium Pro) -// IJL11.dll: 1.08 seconds (compiled by intel) -// IJG 1998: 0.98 seconds (MSVC6, makefile provided by IJG) -// IJG 1998: 0.95 seconds (MSVC6, makefile + proc=PPro) + +#ifndef STBI_NO_JPEG // huffman decoding acceleration #define FAST_BITS 9 // larger handles more cases; smaller stomps less cache @@ -1003,13 +1445,11 @@ typedef struct typedef struct { - #ifdef STBI_SIMD - unsigned short dequant2[4][64]; - #endif stbi__context *s; stbi__huffman huff_dc[4]; stbi__huffman huff_ac[4]; stbi_uc dequant[4][64]; + stbi__int16 fast_ac[4][1 << FAST_BITS]; // sizes for components, interleaved MCUs int img_h_max, img_v_max; @@ -1027,17 +1467,31 @@ typedef struct int x,y,w2,h2; stbi_uc *data; - void *raw_data; + void *raw_data, *raw_coeff; stbi_uc *linebuf; + short *coeff; // progressive only + int coeff_w, coeff_h; // number of 8x8 coefficient blocks } img_comp[4]; - stbi__uint32 code_buffer; // jpeg entropy-coded buffer + stbi__uint32 code_buffer; // jpeg entropy-coded buffer int code_bits; // number of valid bits unsigned char marker; // marker seen while filling entropy buffer int nomore; // flag if we saw a marker so must stop + int progressive; + int spec_start; + int spec_end; + int succ_high; + int succ_low; + int eob_run; + int scan_n, order[4]; int restart_interval, todo; + +// kernels + void (*idct_block_kernel)(stbi_uc *out, int out_stride, short data[64]); + void (*YCbCr_to_RGB_kernel)(stbi_uc *out, const stbi_uc *y, const stbi_uc *pcb, const stbi_uc *pcr, int count, int step); + stbi_uc *(*resample_row_hv_2_kernel)(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs); } stbi__jpeg; static int stbi__build_huffman(stbi__huffman *h, int *count) @@ -1081,6 +1535,33 @@ static int stbi__build_huffman(stbi__huffman *h, int *count) return 1; } +// build a table that decodes both magnitude and value of small ACs in +// one go. +static void stbi__build_fast_ac(stbi__int16 *fast_ac, stbi__huffman *h) +{ + int i; + for (i=0; i < (1 << FAST_BITS); ++i) { + stbi_uc fast = h->fast[i]; + fast_ac[i] = 0; + if (fast < 255) { + int rs = h->values[fast]; + int run = (rs >> 4) & 15; + int magbits = rs & 15; + int len = h->size[fast]; + + if (magbits && len + magbits <= FAST_BITS) { + // magnitude code followed by receive_extend code + int k = ((i << len) & ((1 << FAST_BITS) - 1)) >> (FAST_BITS - magbits); + int m = 1 << (magbits - 1); + if (k < m) k += (-1 << magbits) + 1; + // if the result is small enough, we can fit it in fast_ac table + if (k >= -128 && k <= 127) + fast_ac[i] = (stbi__int16) ((k << 8) + (run << 4) + (len + magbits)); + } + } + } +} + static void stbi__grow_buffer_unsafe(stbi__jpeg *j) { do { @@ -1151,31 +1632,46 @@ stbi_inline static int stbi__jpeg_huff_decode(stbi__jpeg *j, stbi__huffman *h) return h->values[c]; } +// bias[n] = (-1<code_bits < n) stbi__grow_buffer_unsafe(j); - #if 1 + sgn = (stbi__int32)j->code_buffer >> 31; // sign bit is always in MSB + k = stbi_lrot(j->code_buffer, n); + STBI_ASSERT(n >= 0 && n < (int) (sizeof(stbi__bmask)/sizeof(*stbi__bmask))); + j->code_buffer = k & ~stbi__bmask[n]; + k &= stbi__bmask[n]; + j->code_bits -= n; + return k + (stbi__jbias[n] & ~sgn); +} + +// get some unsigned bits +stbi_inline static int stbi__jpeg_get_bits(stbi__jpeg *j, int n) +{ + unsigned int k; + if (j->code_bits < n) stbi__grow_buffer_unsafe(j); k = stbi_lrot(j->code_buffer, n); j->code_buffer = k & ~stbi__bmask[n]; k &= stbi__bmask[n]; j->code_bits -= n; - #else - k = (j->code_buffer >> (32 - n)) & stbi__bmask[n]; - j->code_bits -= n; - j->code_buffer <<= n; - #endif - // the following test is probably a random branch that won't - // predict well. I tried to table accelerate it but failed. - // maybe it's compiling as a conditional move? - if (k < m) - return (-1 << n) + k + 1; - else - return k; + return k; +} + +stbi_inline static int stbi__jpeg_get_bit(stbi__jpeg *j) +{ + unsigned int k; + if (j->code_bits < 1) stbi__grow_buffer_unsafe(j); + k = j->code_buffer; + j->code_buffer <<= 1; + --j->code_bits; + return k & 0x80000000; } // given a value that's at position X in the zigzag stream, @@ -1196,10 +1692,13 @@ static stbi_uc stbi__jpeg_dezigzag[64+15] = }; // decode one 64-entry block-- -static int stbi__jpeg_decode_block(stbi__jpeg *j, short data[64], stbi__huffman *hdc, stbi__huffman *hac, int b) +static int stbi__jpeg_decode_block(stbi__jpeg *j, short data[64], stbi__huffman *hdc, stbi__huffman *hac, stbi__int16 *fac, int b, stbi_uc *dequant) { int diff,dc,k; - int t = stbi__jpeg_huff_decode(j, hdc); + int t; + + if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); + t = stbi__jpeg_huff_decode(j, hdc); if (t < 0) return stbi__err("bad huffman code","Corrupt JPEG"); // 0 all the ac values now so we can do it 32-bits at a time @@ -1208,28 +1707,189 @@ static int stbi__jpeg_decode_block(stbi__jpeg *j, short data[64], stbi__huffman diff = t ? stbi__extend_receive(j, t) : 0; dc = j->img_comp[b].dc_pred + diff; j->img_comp[b].dc_pred = dc; - data[0] = (short) dc; + data[0] = (short) (dc * dequant[0]); // decode AC components, see JPEG spec k = 1; do { - int r,s; - int rs = stbi__jpeg_huff_decode(j, hac); - if (rs < 0) return stbi__err("bad huffman code","Corrupt JPEG"); - s = rs & 15; - r = rs >> 4; - if (s == 0) { - if (rs != 0xf0) break; // end block - k += 16; - } else { - k += r; + unsigned int zig; + int c,r,s; + if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); + c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1); + r = fac[c]; + if (r) { // fast-AC path + k += (r >> 4) & 15; // run + s = r & 15; // combined length + j->code_buffer <<= s; + j->code_bits -= s; // decode into unzigzag'd location - data[stbi__jpeg_dezigzag[k++]] = (short) stbi__extend_receive(j,s); + zig = stbi__jpeg_dezigzag[k++]; + data[zig] = (short) ((r >> 8) * dequant[zig]); + } else { + int rs = stbi__jpeg_huff_decode(j, hac); + if (rs < 0) return stbi__err("bad huffman code","Corrupt JPEG"); + s = rs & 15; + r = rs >> 4; + if (s == 0) { + if (rs != 0xf0) break; // end block + k += 16; + } else { + k += r; + // decode into unzigzag'd location + zig = stbi__jpeg_dezigzag[k++]; + data[zig] = (short) (stbi__extend_receive(j,s) * dequant[zig]); + } } } while (k < 64); return 1; } +static int stbi__jpeg_decode_block_prog_dc(stbi__jpeg *j, short data[64], stbi__huffman *hdc, int b) +{ + int diff,dc; + int t; + if (j->spec_end != 0) return stbi__err("can't merge dc and ac", "Corrupt JPEG"); + + if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); + + if (j->succ_high == 0) { + // first scan for DC coefficient, must be first + memset(data,0,64*sizeof(data[0])); // 0 all the ac values now + t = stbi__jpeg_huff_decode(j, hdc); + diff = t ? stbi__extend_receive(j, t) : 0; + + dc = j->img_comp[b].dc_pred + diff; + j->img_comp[b].dc_pred = dc; + data[0] = (short) (dc << j->succ_low); + } else { + // refinement scan for DC coefficient + if (stbi__jpeg_get_bit(j)) + data[0] += (short) (1 << j->succ_low); + } + return 1; +} + +// @OPTIMIZE: store non-zigzagged during the decode passes, +// and only de-zigzag when dequantizing +static int stbi__jpeg_decode_block_prog_ac(stbi__jpeg *j, short data[64], stbi__huffman *hac, stbi__int16 *fac) +{ + int k; + if (j->spec_start == 0) return stbi__err("can't merge dc and ac", "Corrupt JPEG"); + + if (j->succ_high == 0) { + int shift = j->succ_low; + + if (j->eob_run) { + --j->eob_run; + return 1; + } + + k = j->spec_start; + do { + unsigned int zig; + int c,r,s; + if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); + c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1); + r = fac[c]; + if (r) { // fast-AC path + k += (r >> 4) & 15; // run + s = r & 15; // combined length + j->code_buffer <<= s; + j->code_bits -= s; + zig = stbi__jpeg_dezigzag[k++]; + data[zig] = (short) ((r >> 8) << shift); + } else { + int rs = stbi__jpeg_huff_decode(j, hac); + if (rs < 0) return stbi__err("bad huffman code","Corrupt JPEG"); + s = rs & 15; + r = rs >> 4; + if (s == 0) { + if (r < 15) { + j->eob_run = (1 << r); + if (r) + j->eob_run += stbi__jpeg_get_bits(j, r); + --j->eob_run; + break; + } + k += 16; + } else { + k += r; + zig = stbi__jpeg_dezigzag[k++]; + data[zig] = (short) (stbi__extend_receive(j,s) << shift); + } + } + } while (k <= j->spec_end); + } else { + // refinement scan for these AC coefficients + + short bit = (short) (1 << j->succ_low); + + if (j->eob_run) { + --j->eob_run; + for (k = j->spec_start; k <= j->spec_end; ++k) { + short *p = &data[stbi__jpeg_dezigzag[k]]; + if (*p != 0) + if (stbi__jpeg_get_bit(j)) + if ((*p & bit)==0) { + if (*p > 0) + *p += bit; + else + *p -= bit; + } + } + } else { + k = j->spec_start; + do { + int r,s; + int rs = stbi__jpeg_huff_decode(j, hac); // @OPTIMIZE see if we can use the fast path here, advance-by-r is so slow, eh + if (rs < 0) return stbi__err("bad huffman code","Corrupt JPEG"); + s = rs & 15; + r = rs >> 4; + if (s == 0) { + if (r < 15) { + j->eob_run = (1 << r) - 1; + if (r) + j->eob_run += stbi__jpeg_get_bits(j, r); + r = 64; // force end of block + } else { + // r=15 s=0 should write 16 0s, so we just do + // a run of 15 0s and then write s (which is 0), + // so we don't have to do anything special here + } + } else { + if (s != 1) return stbi__err("bad huffman code", "Corrupt JPEG"); + // sign bit + if (stbi__jpeg_get_bit(j)) + s = bit; + else + s = -bit; + } + + // advance by r + while (k <= j->spec_end) { + short *p = &data[stbi__jpeg_dezigzag[k++]]; + if (*p != 0) { + if (stbi__jpeg_get_bit(j)) + if ((*p & bit)==0) { + if (*p > 0) + *p += bit; + else + *p -= bit; + } + } else { + if (r == 0) { + *p = (short) s; + break; + } + --r; + } + } + } while (k <= j->spec_end); + } + } + return 1; +} + // take a -128..127 value and stbi__clamp it and convert to 0..255 stbi_inline static stbi_uc stbi__clamp(int x) { @@ -1241,21 +1901,21 @@ stbi_inline static stbi_uc stbi__clamp(int x) return (stbi_uc) x; } -#define stbi__f2f(x) (int) (((x) * 4096 + 0.5)) +#define stbi__f2f(x) ((int) (((x) * 4096 + 0.5))) #define stbi__fsh(x) ((x) << 12) // derived from jidctint -- DCT_ISLOW -#define STBI__IDCT_1D(s0,s1,s2,s3,s4,s5,s6,s7) \ +#define STBI__IDCT_1D(s0,s1,s2,s3,s4,s5,s6,s7) \ int t0,t1,t2,t3,p1,p2,p3,p4,p5,x0,x1,x2,x3; \ p2 = s2; \ p3 = s6; \ - p1 = (p2+p3) * stbi__f2f(0.5411961f); \ - t2 = p1 + p3*stbi__f2f(-1.847759065f); \ - t3 = p1 + p2*stbi__f2f( 0.765366865f); \ + p1 = (p2+p3) * stbi__f2f(0.5411961f); \ + t2 = p1 + p3*stbi__f2f(-1.847759065f); \ + t3 = p1 + p2*stbi__f2f( 0.765366865f); \ p2 = s0; \ p3 = s4; \ - t0 = stbi__fsh(p2+p3); \ - t1 = stbi__fsh(p2-p3); \ + t0 = stbi__fsh(p2+p3); \ + t1 = stbi__fsh(p2-p3); \ x0 = t0+t3; \ x3 = t0-t3; \ x1 = t1+t2; \ @@ -1268,36 +1928,28 @@ stbi_inline static stbi_uc stbi__clamp(int x) p4 = t1+t3; \ p1 = t0+t3; \ p2 = t1+t2; \ - p5 = (p3+p4)*stbi__f2f( 1.175875602f); \ - t0 = t0*stbi__f2f( 0.298631336f); \ - t1 = t1*stbi__f2f( 2.053119869f); \ - t2 = t2*stbi__f2f( 3.072711026f); \ - t3 = t3*stbi__f2f( 1.501321110f); \ - p1 = p5 + p1*stbi__f2f(-0.899976223f); \ - p2 = p5 + p2*stbi__f2f(-2.562915447f); \ - p3 = p3*stbi__f2f(-1.961570560f); \ - p4 = p4*stbi__f2f(-0.390180644f); \ + p5 = (p3+p4)*stbi__f2f( 1.175875602f); \ + t0 = t0*stbi__f2f( 0.298631336f); \ + t1 = t1*stbi__f2f( 2.053119869f); \ + t2 = t2*stbi__f2f( 3.072711026f); \ + t3 = t3*stbi__f2f( 1.501321110f); \ + p1 = p5 + p1*stbi__f2f(-0.899976223f); \ + p2 = p5 + p2*stbi__f2f(-2.562915447f); \ + p3 = p3*stbi__f2f(-1.961570560f); \ + p4 = p4*stbi__f2f(-0.390180644f); \ t3 += p1+p4; \ t2 += p2+p3; \ t1 += p2+p4; \ t0 += p1+p3; -#ifdef STBI_SIMD -typedef unsigned short stbi_dequantize_t; -#else -typedef stbi_uc stbi_dequantize_t; -#endif - -// .344 seconds on 3*anemones.jpg -static void stbi__idct_block(stbi_uc *out, int out_stride, short data[64], stbi_dequantize_t *dequantize) +static void stbi__idct_block(stbi_uc *out, int out_stride, short data[64]) { int i,val[64],*v=val; - stbi_dequantize_t *dq = dequantize; stbi_uc *o; short *d = data; // columns - for (i=0; i < 8; ++i,++d,++dq, ++v) { + for (i=0; i < 8; ++i,++d, ++v) { // if all zeroes, shortcut -- this avoids dequantizing 0s and IDCTing if (d[ 8]==0 && d[16]==0 && d[24]==0 && d[32]==0 && d[40]==0 && d[48]==0 && d[56]==0) { @@ -1305,11 +1957,10 @@ static void stbi__idct_block(stbi_uc *out, int out_stride, short data[64], stbi_ // (1|2|3|4|5|6|7)==0 0 seconds // all separate -0.047 seconds // 1 && 2|3 && 4|5 && 6|7: -0.047 seconds - int dcterm = d[0] * dq[0] << 2; + int dcterm = d[0] << 2; v[0] = v[8] = v[16] = v[24] = v[32] = v[40] = v[48] = v[56] = dcterm; } else { - STBI__IDCT_1D(d[ 0]*dq[ 0],d[ 8]*dq[ 8],d[16]*dq[16],d[24]*dq[24], - d[32]*dq[32],d[40]*dq[40],d[48]*dq[48],d[56]*dq[56]) + STBI__IDCT_1D(d[ 0],d[ 8],d[16],d[24],d[32],d[40],d[48],d[56]) // constants scaled things up by 1<<12; let's bring them back // down, but keep 2 extra bits of precision x0 += 512; x1 += 512; x2 += 512; x3 += 512; @@ -1350,14 +2001,394 @@ static void stbi__idct_block(stbi_uc *out, int out_stride, short data[64], stbi_ } } -#ifdef STBI_SIMD -static stbi_idct_8x8 stbi__idct_installed = stbi__idct_block; - -STBIDEF void stbi_install_idct(stbi_idct_8x8 func) +#ifdef STBI_SSE2 +// sse2 integer IDCT. not the fastest possible implementation but it +// produces bit-identical results to the generic C version so it's +// fully "transparent". +static void stbi__idct_simd(stbi_uc *out, int out_stride, short data[64]) { - stbi__idct_installed = func; + // This is constructed to match our regular (generic) integer IDCT exactly. + __m128i row0, row1, row2, row3, row4, row5, row6, row7; + __m128i tmp; + + // dot product constant: even elems=x, odd elems=y + #define dct_const(x,y) _mm_setr_epi16((x),(y),(x),(y),(x),(y),(x),(y)) + + // out(0) = c0[even]*x + c0[odd]*y (c0, x, y 16-bit, out 32-bit) + // out(1) = c1[even]*x + c1[odd]*y + #define dct_rot(out0,out1, x,y,c0,c1) \ + __m128i c0##lo = _mm_unpacklo_epi16((x),(y)); \ + __m128i c0##hi = _mm_unpackhi_epi16((x),(y)); \ + __m128i out0##_l = _mm_madd_epi16(c0##lo, c0); \ + __m128i out0##_h = _mm_madd_epi16(c0##hi, c0); \ + __m128i out1##_l = _mm_madd_epi16(c0##lo, c1); \ + __m128i out1##_h = _mm_madd_epi16(c0##hi, c1) + + // out = in << 12 (in 16-bit, out 32-bit) + #define dct_widen(out, in) \ + __m128i out##_l = _mm_srai_epi32(_mm_unpacklo_epi16(_mm_setzero_si128(), (in)), 4); \ + __m128i out##_h = _mm_srai_epi32(_mm_unpackhi_epi16(_mm_setzero_si128(), (in)), 4) + + // wide add + #define dct_wadd(out, a, b) \ + __m128i out##_l = _mm_add_epi32(a##_l, b##_l); \ + __m128i out##_h = _mm_add_epi32(a##_h, b##_h) + + // wide sub + #define dct_wsub(out, a, b) \ + __m128i out##_l = _mm_sub_epi32(a##_l, b##_l); \ + __m128i out##_h = _mm_sub_epi32(a##_h, b##_h) + + // butterfly a/b, add bias, then shift by "s" and pack + #define dct_bfly32o(out0, out1, a,b,bias,s) \ + { \ + __m128i abiased_l = _mm_add_epi32(a##_l, bias); \ + __m128i abiased_h = _mm_add_epi32(a##_h, bias); \ + dct_wadd(sum, abiased, b); \ + dct_wsub(dif, abiased, b); \ + out0 = _mm_packs_epi32(_mm_srai_epi32(sum_l, s), _mm_srai_epi32(sum_h, s)); \ + out1 = _mm_packs_epi32(_mm_srai_epi32(dif_l, s), _mm_srai_epi32(dif_h, s)); \ + } + + // 8-bit interleave step (for transposes) + #define dct_interleave8(a, b) \ + tmp = a; \ + a = _mm_unpacklo_epi8(a, b); \ + b = _mm_unpackhi_epi8(tmp, b) + + // 16-bit interleave step (for transposes) + #define dct_interleave16(a, b) \ + tmp = a; \ + a = _mm_unpacklo_epi16(a, b); \ + b = _mm_unpackhi_epi16(tmp, b) + + #define dct_pass(bias,shift) \ + { \ + /* even part */ \ + dct_rot(t2e,t3e, row2,row6, rot0_0,rot0_1); \ + __m128i sum04 = _mm_add_epi16(row0, row4); \ + __m128i dif04 = _mm_sub_epi16(row0, row4); \ + dct_widen(t0e, sum04); \ + dct_widen(t1e, dif04); \ + dct_wadd(x0, t0e, t3e); \ + dct_wsub(x3, t0e, t3e); \ + dct_wadd(x1, t1e, t2e); \ + dct_wsub(x2, t1e, t2e); \ + /* odd part */ \ + dct_rot(y0o,y2o, row7,row3, rot2_0,rot2_1); \ + dct_rot(y1o,y3o, row5,row1, rot3_0,rot3_1); \ + __m128i sum17 = _mm_add_epi16(row1, row7); \ + __m128i sum35 = _mm_add_epi16(row3, row5); \ + dct_rot(y4o,y5o, sum17,sum35, rot1_0,rot1_1); \ + dct_wadd(x4, y0o, y4o); \ + dct_wadd(x5, y1o, y5o); \ + dct_wadd(x6, y2o, y5o); \ + dct_wadd(x7, y3o, y4o); \ + dct_bfly32o(row0,row7, x0,x7,bias,shift); \ + dct_bfly32o(row1,row6, x1,x6,bias,shift); \ + dct_bfly32o(row2,row5, x2,x5,bias,shift); \ + dct_bfly32o(row3,row4, x3,x4,bias,shift); \ + } + + __m128i rot0_0 = dct_const(stbi__f2f(0.5411961f), stbi__f2f(0.5411961f) + stbi__f2f(-1.847759065f)); + __m128i rot0_1 = dct_const(stbi__f2f(0.5411961f) + stbi__f2f( 0.765366865f), stbi__f2f(0.5411961f)); + __m128i rot1_0 = dct_const(stbi__f2f(1.175875602f) + stbi__f2f(-0.899976223f), stbi__f2f(1.175875602f)); + __m128i rot1_1 = dct_const(stbi__f2f(1.175875602f), stbi__f2f(1.175875602f) + stbi__f2f(-2.562915447f)); + __m128i rot2_0 = dct_const(stbi__f2f(-1.961570560f) + stbi__f2f( 0.298631336f), stbi__f2f(-1.961570560f)); + __m128i rot2_1 = dct_const(stbi__f2f(-1.961570560f), stbi__f2f(-1.961570560f) + stbi__f2f( 3.072711026f)); + __m128i rot3_0 = dct_const(stbi__f2f(-0.390180644f) + stbi__f2f( 2.053119869f), stbi__f2f(-0.390180644f)); + __m128i rot3_1 = dct_const(stbi__f2f(-0.390180644f), stbi__f2f(-0.390180644f) + stbi__f2f( 1.501321110f)); + + // rounding biases in column/row passes, see stbi__idct_block for explanation. + __m128i bias_0 = _mm_set1_epi32(512); + __m128i bias_1 = _mm_set1_epi32(65536 + (128<<17)); + + // load + row0 = _mm_load_si128((const __m128i *) (data + 0*8)); + row1 = _mm_load_si128((const __m128i *) (data + 1*8)); + row2 = _mm_load_si128((const __m128i *) (data + 2*8)); + row3 = _mm_load_si128((const __m128i *) (data + 3*8)); + row4 = _mm_load_si128((const __m128i *) (data + 4*8)); + row5 = _mm_load_si128((const __m128i *) (data + 5*8)); + row6 = _mm_load_si128((const __m128i *) (data + 6*8)); + row7 = _mm_load_si128((const __m128i *) (data + 7*8)); + + // column pass + dct_pass(bias_0, 10); + + { + // 16bit 8x8 transpose pass 1 + dct_interleave16(row0, row4); + dct_interleave16(row1, row5); + dct_interleave16(row2, row6); + dct_interleave16(row3, row7); + + // transpose pass 2 + dct_interleave16(row0, row2); + dct_interleave16(row1, row3); + dct_interleave16(row4, row6); + dct_interleave16(row5, row7); + + // transpose pass 3 + dct_interleave16(row0, row1); + dct_interleave16(row2, row3); + dct_interleave16(row4, row5); + dct_interleave16(row6, row7); + } + + // row pass + dct_pass(bias_1, 17); + + { + // pack + __m128i p0 = _mm_packus_epi16(row0, row1); // a0a1a2a3...a7b0b1b2b3...b7 + __m128i p1 = _mm_packus_epi16(row2, row3); + __m128i p2 = _mm_packus_epi16(row4, row5); + __m128i p3 = _mm_packus_epi16(row6, row7); + + // 8bit 8x8 transpose pass 1 + dct_interleave8(p0, p2); // a0e0a1e1... + dct_interleave8(p1, p3); // c0g0c1g1... + + // transpose pass 2 + dct_interleave8(p0, p1); // a0c0e0g0... + dct_interleave8(p2, p3); // b0d0f0h0... + + // transpose pass 3 + dct_interleave8(p0, p2); // a0b0c0d0... + dct_interleave8(p1, p3); // a4b4c4d4... + + // store + _mm_storel_epi64((__m128i *) out, p0); out += out_stride; + _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p0, 0x4e)); out += out_stride; + _mm_storel_epi64((__m128i *) out, p2); out += out_stride; + _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p2, 0x4e)); out += out_stride; + _mm_storel_epi64((__m128i *) out, p1); out += out_stride; + _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p1, 0x4e)); out += out_stride; + _mm_storel_epi64((__m128i *) out, p3); out += out_stride; + _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p3, 0x4e)); + } + +#undef dct_const +#undef dct_rot +#undef dct_widen +#undef dct_wadd +#undef dct_wsub +#undef dct_bfly32o +#undef dct_interleave8 +#undef dct_interleave16 +#undef dct_pass } -#endif + +#endif // STBI_SSE2 + +#ifdef STBI_NEON + +// NEON integer IDCT. should produce bit-identical +// results to the generic C version. +static void stbi__idct_simd(stbi_uc *out, int out_stride, short data[64]) +{ + int16x8_t row0, row1, row2, row3, row4, row5, row6, row7; + + int16x4_t rot0_0 = vdup_n_s16(stbi__f2f(0.5411961f)); + int16x4_t rot0_1 = vdup_n_s16(stbi__f2f(-1.847759065f)); + int16x4_t rot0_2 = vdup_n_s16(stbi__f2f( 0.765366865f)); + int16x4_t rot1_0 = vdup_n_s16(stbi__f2f( 1.175875602f)); + int16x4_t rot1_1 = vdup_n_s16(stbi__f2f(-0.899976223f)); + int16x4_t rot1_2 = vdup_n_s16(stbi__f2f(-2.562915447f)); + int16x4_t rot2_0 = vdup_n_s16(stbi__f2f(-1.961570560f)); + int16x4_t rot2_1 = vdup_n_s16(stbi__f2f(-0.390180644f)); + int16x4_t rot3_0 = vdup_n_s16(stbi__f2f( 0.298631336f)); + int16x4_t rot3_1 = vdup_n_s16(stbi__f2f( 2.053119869f)); + int16x4_t rot3_2 = vdup_n_s16(stbi__f2f( 3.072711026f)); + int16x4_t rot3_3 = vdup_n_s16(stbi__f2f( 1.501321110f)); + +#define dct_long_mul(out, inq, coeff) \ + int32x4_t out##_l = vmull_s16(vget_low_s16(inq), coeff); \ + int32x4_t out##_h = vmull_s16(vget_high_s16(inq), coeff) + +#define dct_long_mac(out, acc, inq, coeff) \ + int32x4_t out##_l = vmlal_s16(acc##_l, vget_low_s16(inq), coeff); \ + int32x4_t out##_h = vmlal_s16(acc##_h, vget_high_s16(inq), coeff) + +#define dct_widen(out, inq) \ + int32x4_t out##_l = vshll_n_s16(vget_low_s16(inq), 12); \ + int32x4_t out##_h = vshll_n_s16(vget_high_s16(inq), 12) + +// wide add +#define dct_wadd(out, a, b) \ + int32x4_t out##_l = vaddq_s32(a##_l, b##_l); \ + int32x4_t out##_h = vaddq_s32(a##_h, b##_h) + +// wide sub +#define dct_wsub(out, a, b) \ + int32x4_t out##_l = vsubq_s32(a##_l, b##_l); \ + int32x4_t out##_h = vsubq_s32(a##_h, b##_h) + +// butterfly a/b, then shift using "shiftop" by "s" and pack +#define dct_bfly32o(out0,out1, a,b,shiftop,s) \ + { \ + dct_wadd(sum, a, b); \ + dct_wsub(dif, a, b); \ + out0 = vcombine_s16(shiftop(sum_l, s), shiftop(sum_h, s)); \ + out1 = vcombine_s16(shiftop(dif_l, s), shiftop(dif_h, s)); \ + } + +#define dct_pass(shiftop, shift) \ + { \ + /* even part */ \ + int16x8_t sum26 = vaddq_s16(row2, row6); \ + dct_long_mul(p1e, sum26, rot0_0); \ + dct_long_mac(t2e, p1e, row6, rot0_1); \ + dct_long_mac(t3e, p1e, row2, rot0_2); \ + int16x8_t sum04 = vaddq_s16(row0, row4); \ + int16x8_t dif04 = vsubq_s16(row0, row4); \ + dct_widen(t0e, sum04); \ + dct_widen(t1e, dif04); \ + dct_wadd(x0, t0e, t3e); \ + dct_wsub(x3, t0e, t3e); \ + dct_wadd(x1, t1e, t2e); \ + dct_wsub(x2, t1e, t2e); \ + /* odd part */ \ + int16x8_t sum15 = vaddq_s16(row1, row5); \ + int16x8_t sum17 = vaddq_s16(row1, row7); \ + int16x8_t sum35 = vaddq_s16(row3, row5); \ + int16x8_t sum37 = vaddq_s16(row3, row7); \ + int16x8_t sumodd = vaddq_s16(sum17, sum35); \ + dct_long_mul(p5o, sumodd, rot1_0); \ + dct_long_mac(p1o, p5o, sum17, rot1_1); \ + dct_long_mac(p2o, p5o, sum35, rot1_2); \ + dct_long_mul(p3o, sum37, rot2_0); \ + dct_long_mul(p4o, sum15, rot2_1); \ + dct_wadd(sump13o, p1o, p3o); \ + dct_wadd(sump24o, p2o, p4o); \ + dct_wadd(sump23o, p2o, p3o); \ + dct_wadd(sump14o, p1o, p4o); \ + dct_long_mac(x4, sump13o, row7, rot3_0); \ + dct_long_mac(x5, sump24o, row5, rot3_1); \ + dct_long_mac(x6, sump23o, row3, rot3_2); \ + dct_long_mac(x7, sump14o, row1, rot3_3); \ + dct_bfly32o(row0,row7, x0,x7,shiftop,shift); \ + dct_bfly32o(row1,row6, x1,x6,shiftop,shift); \ + dct_bfly32o(row2,row5, x2,x5,shiftop,shift); \ + dct_bfly32o(row3,row4, x3,x4,shiftop,shift); \ + } + + // load + row0 = vld1q_s16(data + 0*8); + row1 = vld1q_s16(data + 1*8); + row2 = vld1q_s16(data + 2*8); + row3 = vld1q_s16(data + 3*8); + row4 = vld1q_s16(data + 4*8); + row5 = vld1q_s16(data + 5*8); + row6 = vld1q_s16(data + 6*8); + row7 = vld1q_s16(data + 7*8); + + // add DC bias + row0 = vaddq_s16(row0, vsetq_lane_s16(1024, vdupq_n_s16(0), 0)); + + // column pass + dct_pass(vrshrn_n_s32, 10); + + // 16bit 8x8 transpose + { +// these three map to a single VTRN.16, VTRN.32, and VSWP, respectively. +// whether compilers actually get this is another story, sadly. +#define dct_trn16(x, y) { int16x8x2_t t = vtrnq_s16(x, y); x = t.val[0]; y = t.val[1]; } +#define dct_trn32(x, y) { int32x4x2_t t = vtrnq_s32(vreinterpretq_s32_s16(x), vreinterpretq_s32_s16(y)); x = vreinterpretq_s16_s32(t.val[0]); y = vreinterpretq_s16_s32(t.val[1]); } +#define dct_trn64(x, y) { int16x8_t x0 = x; int16x8_t y0 = y; x = vcombine_s16(vget_low_s16(x0), vget_low_s16(y0)); y = vcombine_s16(vget_high_s16(x0), vget_high_s16(y0)); } + + // pass 1 + dct_trn16(row0, row1); // a0b0a2b2a4b4a6b6 + dct_trn16(row2, row3); + dct_trn16(row4, row5); + dct_trn16(row6, row7); + + // pass 2 + dct_trn32(row0, row2); // a0b0c0d0a4b4c4d4 + dct_trn32(row1, row3); + dct_trn32(row4, row6); + dct_trn32(row5, row7); + + // pass 3 + dct_trn64(row0, row4); // a0b0c0d0e0f0g0h0 + dct_trn64(row1, row5); + dct_trn64(row2, row6); + dct_trn64(row3, row7); + +#undef dct_trn16 +#undef dct_trn32 +#undef dct_trn64 + } + + // row pass + // vrshrn_n_s32 only supports shifts up to 16, we need + // 17. so do a non-rounding shift of 16 first then follow + // up with a rounding shift by 1. + dct_pass(vshrn_n_s32, 16); + + { + // pack and round + uint8x8_t p0 = vqrshrun_n_s16(row0, 1); + uint8x8_t p1 = vqrshrun_n_s16(row1, 1); + uint8x8_t p2 = vqrshrun_n_s16(row2, 1); + uint8x8_t p3 = vqrshrun_n_s16(row3, 1); + uint8x8_t p4 = vqrshrun_n_s16(row4, 1); + uint8x8_t p5 = vqrshrun_n_s16(row5, 1); + uint8x8_t p6 = vqrshrun_n_s16(row6, 1); + uint8x8_t p7 = vqrshrun_n_s16(row7, 1); + + // again, these can translate into one instruction, but often don't. +#define dct_trn8_8(x, y) { uint8x8x2_t t = vtrn_u8(x, y); x = t.val[0]; y = t.val[1]; } +#define dct_trn8_16(x, y) { uint16x4x2_t t = vtrn_u16(vreinterpret_u16_u8(x), vreinterpret_u16_u8(y)); x = vreinterpret_u8_u16(t.val[0]); y = vreinterpret_u8_u16(t.val[1]); } +#define dct_trn8_32(x, y) { uint32x2x2_t t = vtrn_u32(vreinterpret_u32_u8(x), vreinterpret_u32_u8(y)); x = vreinterpret_u8_u32(t.val[0]); y = vreinterpret_u8_u32(t.val[1]); } + + // sadly can't use interleaved stores here since we only write + // 8 bytes to each scan line! + + // 8x8 8-bit transpose pass 1 + dct_trn8_8(p0, p1); + dct_trn8_8(p2, p3); + dct_trn8_8(p4, p5); + dct_trn8_8(p6, p7); + + // pass 2 + dct_trn8_16(p0, p2); + dct_trn8_16(p1, p3); + dct_trn8_16(p4, p6); + dct_trn8_16(p5, p7); + + // pass 3 + dct_trn8_32(p0, p4); + dct_trn8_32(p1, p5); + dct_trn8_32(p2, p6); + dct_trn8_32(p3, p7); + + // store + vst1_u8(out, p0); out += out_stride; + vst1_u8(out, p1); out += out_stride; + vst1_u8(out, p2); out += out_stride; + vst1_u8(out, p3); out += out_stride; + vst1_u8(out, p4); out += out_stride; + vst1_u8(out, p5); out += out_stride; + vst1_u8(out, p6); out += out_stride; + vst1_u8(out, p7); + +#undef dct_trn8_8 +#undef dct_trn8_16 +#undef dct_trn8_32 + } + +#undef dct_long_mul +#undef dct_long_mac +#undef dct_widen +#undef dct_wadd +#undef dct_wsub +#undef dct_bfly32o +#undef dct_pass +} + +#endif // STBI_NEON #define STBI__MARKER_none 0xff // if there's a pending marker from the entropy stream, return that @@ -1388,6 +2419,7 @@ static void stbi__jpeg_reset(stbi__jpeg *j) j->img_comp[0].dc_pred = j->img_comp[1].dc_pred = j->img_comp[2].dc_pred = 0; j->marker = STBI__MARKER_none; j->todo = j->restart_interval ? j->restart_interval : 0x7fffffff; + j->eob_run = 0; // no more than 1<<31 MCUs if no restart_interal? that's plenty safe, // since we don't even allow 1<<30 pixels } @@ -1395,73 +2427,151 @@ static void stbi__jpeg_reset(stbi__jpeg *j) static int stbi__parse_entropy_coded_data(stbi__jpeg *z) { stbi__jpeg_reset(z); - if (z->scan_n == 1) { - int i,j; - #ifdef STBI_SIMD - __declspec(align(16)) - #endif - short data[64]; - int n = z->order[0]; - // non-interleaved data, we just need to process one block at a time, - // in trivial scanline order - // number of blocks to do just depends on how many actual "pixels" this - // component has, independent of interleaved MCU blocking and such - int w = (z->img_comp[n].x+7) >> 3; - int h = (z->img_comp[n].y+7) >> 3; - for (j=0; j < h; ++j) { - for (i=0; i < w; ++i) { - if (!stbi__jpeg_decode_block(z, data, z->huff_dc+z->img_comp[n].hd, z->huff_ac+z->img_comp[n].ha, n)) return 0; - #ifdef STBI_SIMD - stbi__idct_installed(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data, z->dequant2[z->img_comp[n].tq]); - #else - stbi__idct_block(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data, z->dequant[z->img_comp[n].tq]); - #endif - // every data block is an MCU, so countdown the restart interval - if (--z->todo <= 0) { - if (z->code_bits < 24) stbi__grow_buffer_unsafe(z); - // if it's NOT a restart, then just bail, so we get corrupt data - // rather than no data - if (!STBI__RESTART(z->marker)) return 1; - stbi__jpeg_reset(z); - } - } - } - } else { // interleaved! - int i,j,k,x,y; - short data[64]; - for (j=0; j < z->img_mcu_y; ++j) { - for (i=0; i < z->img_mcu_x; ++i) { - // scan an interleaved mcu... process scan_n components in order - for (k=0; k < z->scan_n; ++k) { - int n = z->order[k]; - // scan out an mcu's worth of this component; that's just determined - // by the basic H and V specified for the component - for (y=0; y < z->img_comp[n].v; ++y) { - for (x=0; x < z->img_comp[n].h; ++x) { - int x2 = (i*z->img_comp[n].h + x)*8; - int y2 = (j*z->img_comp[n].v + y)*8; - if (!stbi__jpeg_decode_block(z, data, z->huff_dc+z->img_comp[n].hd, z->huff_ac+z->img_comp[n].ha, n)) return 0; - #ifdef STBI_SIMD - stbi__idct_installed(z->img_comp[n].data+z->img_comp[n].w2*y2+x2, z->img_comp[n].w2, data, z->dequant2[z->img_comp[n].tq]); - #else - stbi__idct_block(z->img_comp[n].data+z->img_comp[n].w2*y2+x2, z->img_comp[n].w2, data, z->dequant[z->img_comp[n].tq]); - #endif - } + if (!z->progressive) { + if (z->scan_n == 1) { + int i,j; + STBI_SIMD_ALIGN(short, data[64]); + int n = z->order[0]; + // non-interleaved data, we just need to process one block at a time, + // in trivial scanline order + // number of blocks to do just depends on how many actual "pixels" this + // component has, independent of interleaved MCU blocking and such + int w = (z->img_comp[n].x+7) >> 3; + int h = (z->img_comp[n].y+7) >> 3; + for (j=0; j < h; ++j) { + for (i=0; i < w; ++i) { + int ha = z->img_comp[n].ha; + if (!stbi__jpeg_decode_block(z, data, z->huff_dc+z->img_comp[n].hd, z->huff_ac+ha, z->fast_ac[ha], n, z->dequant[z->img_comp[n].tq])) return 0; + z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data); + // every data block is an MCU, so countdown the restart interval + if (--z->todo <= 0) { + if (z->code_bits < 24) stbi__grow_buffer_unsafe(z); + // if it's NOT a restart, then just bail, so we get corrupt data + // rather than no data + if (!STBI__RESTART(z->marker)) return 1; + stbi__jpeg_reset(z); } } - // after all interleaved components, that's an interleaved MCU, - // so now count down the restart interval - if (--z->todo <= 0) { - if (z->code_bits < 24) stbi__grow_buffer_unsafe(z); - // if it's NOT a restart, then just bail, so we get corrupt data - // rather than no data - if (!STBI__RESTART(z->marker)) return 1; - stbi__jpeg_reset(z); + } + return 1; + } else { // interleaved + int i,j,k,x,y; + STBI_SIMD_ALIGN(short, data[64]); + for (j=0; j < z->img_mcu_y; ++j) { + for (i=0; i < z->img_mcu_x; ++i) { + // scan an interleaved mcu... process scan_n components in order + for (k=0; k < z->scan_n; ++k) { + int n = z->order[k]; + // scan out an mcu's worth of this component; that's just determined + // by the basic H and V specified for the component + for (y=0; y < z->img_comp[n].v; ++y) { + for (x=0; x < z->img_comp[n].h; ++x) { + int x2 = (i*z->img_comp[n].h + x)*8; + int y2 = (j*z->img_comp[n].v + y)*8; + int ha = z->img_comp[n].ha; + if (!stbi__jpeg_decode_block(z, data, z->huff_dc+z->img_comp[n].hd, z->huff_ac+ha, z->fast_ac[ha], n, z->dequant[z->img_comp[n].tq])) return 0; + z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*y2+x2, z->img_comp[n].w2, data); + } + } + } + // after all interleaved components, that's an interleaved MCU, + // so now count down the restart interval + if (--z->todo <= 0) { + if (z->code_bits < 24) stbi__grow_buffer_unsafe(z); + if (!STBI__RESTART(z->marker)) return 1; + stbi__jpeg_reset(z); + } + } + } + return 1; + } + } else { + if (z->scan_n == 1) { + int i,j; + int n = z->order[0]; + // non-interleaved data, we just need to process one block at a time, + // in trivial scanline order + // number of blocks to do just depends on how many actual "pixels" this + // component has, independent of interleaved MCU blocking and such + int w = (z->img_comp[n].x+7) >> 3; + int h = (z->img_comp[n].y+7) >> 3; + for (j=0; j < h; ++j) { + for (i=0; i < w; ++i) { + short *data = z->img_comp[n].coeff + 64 * (i + j * z->img_comp[n].coeff_w); + if (z->spec_start == 0) { + if (!stbi__jpeg_decode_block_prog_dc(z, data, &z->huff_dc[z->img_comp[n].hd], n)) + return 0; + } else { + int ha = z->img_comp[n].ha; + if (!stbi__jpeg_decode_block_prog_ac(z, data, &z->huff_ac[ha], z->fast_ac[ha])) + return 0; + } + // every data block is an MCU, so countdown the restart interval + if (--z->todo <= 0) { + if (z->code_bits < 24) stbi__grow_buffer_unsafe(z); + if (!STBI__RESTART(z->marker)) return 1; + stbi__jpeg_reset(z); + } + } + } + return 1; + } else { // interleaved + int i,j,k,x,y; + for (j=0; j < z->img_mcu_y; ++j) { + for (i=0; i < z->img_mcu_x; ++i) { + // scan an interleaved mcu... process scan_n components in order + for (k=0; k < z->scan_n; ++k) { + int n = z->order[k]; + // scan out an mcu's worth of this component; that's just determined + // by the basic H and V specified for the component + for (y=0; y < z->img_comp[n].v; ++y) { + for (x=0; x < z->img_comp[n].h; ++x) { + int x2 = (i*z->img_comp[n].h + x); + int y2 = (j*z->img_comp[n].v + y); + short *data = z->img_comp[n].coeff + 64 * (x2 + y2 * z->img_comp[n].coeff_w); + if (!stbi__jpeg_decode_block_prog_dc(z, data, &z->huff_dc[z->img_comp[n].hd], n)) + return 0; + } + } + } + // after all interleaved components, that's an interleaved MCU, + // so now count down the restart interval + if (--z->todo <= 0) { + if (z->code_bits < 24) stbi__grow_buffer_unsafe(z); + if (!STBI__RESTART(z->marker)) return 1; + stbi__jpeg_reset(z); + } + } + } + return 1; + } + } +} + +static void stbi__jpeg_dequantize(short *data, stbi_uc *dequant) +{ + int i; + for (i=0; i < 64; ++i) + data[i] *= dequant[i]; +} + +static void stbi__jpeg_finish(stbi__jpeg *z) +{ + if (z->progressive) { + // dequantize and idct the data + int i,j,n; + for (n=0; n < z->s->img_n; ++n) { + int w = (z->img_comp[n].x+7) >> 3; + int h = (z->img_comp[n].y+7) >> 3; + for (j=0; j < h; ++j) { + for (i=0; i < w; ++i) { + short *data = z->img_comp[n].coeff + 64 * (i + j * z->img_comp[n].coeff_w); + stbi__jpeg_dequantize(data, z->dequant[z->img_comp[n].tq]); + z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data); } } } } - return 1; } static int stbi__process_marker(stbi__jpeg *z, int m) @@ -1471,9 +2581,6 @@ static int stbi__process_marker(stbi__jpeg *z, int m) case STBI__MARKER_none: // no marker found return stbi__err("expected marker","Corrupt JPEG"); - case 0xC2: // stbi__SOF - progressive - return stbi__err("progressive jpeg","JPEG format not supported (progressive)"); - case 0xDD: // DRI - specify restart interval if (stbi__get16be(z->s) != 4) return stbi__err("bad DRI len","Corrupt JPEG"); z->restart_interval = stbi__get16be(z->s); @@ -1489,10 +2596,6 @@ static int stbi__process_marker(stbi__jpeg *z, int m) if (t > 3) return stbi__err("bad DQT table","Corrupt JPEG"); for (i=0; i < 64; ++i) z->dequant[t][stbi__jpeg_dezigzag[i]] = stbi__get8(z->s); - #ifdef STBI_SIMD - for (i=0; i < 64; ++i) - z->dequant2[t][i] = z->dequant[t][i]; - #endif L -= 65; } return L==0; @@ -1520,6 +2623,8 @@ static int stbi__process_marker(stbi__jpeg *z, int m) } for (i=0; i < n; ++i) v[i] = stbi__get8(z->s); + if (tc != 0) + stbi__build_fast_ac(z->fast_ac[th], z->huff_ac + th); L -= n; } return L==0; @@ -1532,28 +2637,42 @@ static int stbi__process_marker(stbi__jpeg *z, int m) return 0; } -// after we see stbi__SOS +// after we see SOS static int stbi__process_scan_header(stbi__jpeg *z) { int i; int Ls = stbi__get16be(z->s); z->scan_n = stbi__get8(z->s); - if (z->scan_n < 1 || z->scan_n > 4 || z->scan_n > (int) z->s->img_n) return stbi__err("bad stbi__SOS component count","Corrupt JPEG"); - if (Ls != 6+2*z->scan_n) return stbi__err("bad stbi__SOS len","Corrupt JPEG"); + if (z->scan_n < 1 || z->scan_n > 4 || z->scan_n > (int) z->s->img_n) return stbi__err("bad SOS component count","Corrupt JPEG"); + if (Ls != 6+2*z->scan_n) return stbi__err("bad SOS len","Corrupt JPEG"); for (i=0; i < z->scan_n; ++i) { int id = stbi__get8(z->s), which; int q = stbi__get8(z->s); for (which = 0; which < z->s->img_n; ++which) if (z->img_comp[which].id == id) break; - if (which == z->s->img_n) return 0; + if (which == z->s->img_n) return 0; // no match z->img_comp[which].hd = q >> 4; if (z->img_comp[which].hd > 3) return stbi__err("bad DC huff","Corrupt JPEG"); z->img_comp[which].ha = q & 15; if (z->img_comp[which].ha > 3) return stbi__err("bad AC huff","Corrupt JPEG"); z->order[i] = which; } - if (stbi__get8(z->s) != 0) return stbi__err("bad stbi__SOS","Corrupt JPEG"); - stbi__get8(z->s); // should be 63, but might be 0 - if (stbi__get8(z->s) != 0) return stbi__err("bad stbi__SOS","Corrupt JPEG"); + + { + int aa; + z->spec_start = stbi__get8(z->s); + z->spec_end = stbi__get8(z->s); // should be 63, but might be 0 + aa = stbi__get8(z->s); + z->succ_high = (aa >> 4); + z->succ_low = (aa & 15); + if (z->progressive) { + if (z->spec_start > 63 || z->spec_end > 63 || z->spec_start > z->spec_end || z->succ_high > 13 || z->succ_low > 13) + return stbi__err("bad SOS", "Corrupt JPEG"); + } else { + if (z->spec_start != 0) return stbi__err("bad SOS","Corrupt JPEG"); + if (z->succ_high != 0 || z->succ_low != 0) return stbi__err("bad SOS","Corrupt JPEG"); + z->spec_end = 63; + } + } return 1; } @@ -1562,8 +2681,8 @@ static int stbi__process_frame_header(stbi__jpeg *z, int scan) { stbi__context *s = z->s; int Lf,p,i,q, h_max=1,v_max=1,c; - Lf = stbi__get16be(s); if (Lf < 11) return stbi__err("bad stbi__SOF len","Corrupt JPEG"); // JPEG - p = stbi__get8(s); if (p != 8) return stbi__err("only 8-bit","JPEG format not supported: 8-bit only"); // JPEG baseline + Lf = stbi__get16be(s); if (Lf < 11) return stbi__err("bad SOF len","Corrupt JPEG"); // JPEG + p = stbi__get8(s); if (p != 8) return stbi__err("only 8-bit","JPEG format not supported: 8-bit only"); // JPEG baseline s->img_y = stbi__get16be(s); if (s->img_y == 0) return stbi__err("no header height", "JPEG format not supported: delayed height"); // Legal, but we don't handle it--but neither does IJG s->img_x = stbi__get16be(s); if (s->img_x == 0) return stbi__err("0 width","Corrupt JPEG"); // JPEG requires c = stbi__get8(s); @@ -1574,7 +2693,7 @@ static int stbi__process_frame_header(stbi__jpeg *z, int scan) z->img_comp[i].linebuf = NULL; } - if (Lf != 8+3*s->img_n) return stbi__err("bad stbi__SOF len","Corrupt JPEG"); + if (Lf != 8+3*s->img_n) return stbi__err("bad SOF len","Corrupt JPEG"); for (i=0; i < s->img_n; ++i) { z->img_comp[i].id = stbi__get8(s); @@ -1587,7 +2706,7 @@ static int stbi__process_frame_header(stbi__jpeg *z, int scan) z->img_comp[i].tq = stbi__get8(s); if (z->img_comp[i].tq > 3) return stbi__err("bad TQ","Corrupt JPEG"); } - if (scan != SCAN_load) return 1; + if (scan != STBI__SCAN_load) return 1; if ((1 << 30) / s->img_x / s->img_n < s->img_y) return stbi__err("too large", "Image too large to decode"); @@ -1605,64 +2724,82 @@ static int stbi__process_frame_header(stbi__jpeg *z, int scan) z->img_mcu_y = (s->img_y + z->img_mcu_h-1) / z->img_mcu_h; for (i=0; i < s->img_n; ++i) { - // number of effective pixels (stbi__err.g. for non-interleaved MCU) + // number of effective pixels (e.g. for non-interleaved MCU) z->img_comp[i].x = (s->img_x * z->img_comp[i].h + h_max-1) / h_max; z->img_comp[i].y = (s->img_y * z->img_comp[i].v + v_max-1) / v_max; // to simplify generation, we'll allocate enough memory to decode // the bogus oversized data from using interleaved MCUs and their - // big blocks (stbi__err.g. a 16x16 iMCU on an image of width 33); we won't + // big blocks (e.g. a 16x16 iMCU on an image of width 33); we won't // discard the extra data until colorspace conversion z->img_comp[i].w2 = z->img_mcu_x * z->img_comp[i].h * 8; z->img_comp[i].h2 = z->img_mcu_y * z->img_comp[i].v * 8; - z->img_comp[i].raw_data = malloc(z->img_comp[i].w2 * z->img_comp[i].h2+15); + z->img_comp[i].raw_data = stbi__malloc(z->img_comp[i].w2 * z->img_comp[i].h2+15); + if (z->img_comp[i].raw_data == NULL) { for(--i; i >= 0; --i) { - free(z->img_comp[i].raw_data); + STBI_FREE(z->img_comp[i].raw_data); z->img_comp[i].data = NULL; } return stbi__err("outofmem", "Out of memory"); } - // align blocks for installable-idct using mmx/sse + // align blocks for idct using mmx/sse z->img_comp[i].data = (stbi_uc*) (((size_t) z->img_comp[i].raw_data + 15) & ~15); z->img_comp[i].linebuf = NULL; + if (z->progressive) { + z->img_comp[i].coeff_w = (z->img_comp[i].w2 + 7) >> 3; + z->img_comp[i].coeff_h = (z->img_comp[i].h2 + 7) >> 3; + z->img_comp[i].raw_coeff = STBI_MALLOC(z->img_comp[i].coeff_w * z->img_comp[i].coeff_h * 64 * sizeof(short) + 15); + z->img_comp[i].coeff = (short*) (((size_t) z->img_comp[i].raw_coeff + 15) & ~15); + } else { + z->img_comp[i].coeff = 0; + z->img_comp[i].raw_coeff = 0; + } } return 1; } -// use comparisons since in some cases we handle more than one case (stbi__err.g. stbi__SOF) +// use comparisons since in some cases we handle more than one case (e.g. SOF) #define stbi__DNL(x) ((x) == 0xdc) #define stbi__SOI(x) ((x) == 0xd8) #define stbi__EOI(x) ((x) == 0xd9) -#define stbi__SOF(x) ((x) == 0xc0 || (x) == 0xc1) +#define stbi__SOF(x) ((x) == 0xc0 || (x) == 0xc1 || (x) == 0xc2) #define stbi__SOS(x) ((x) == 0xda) -static int decode_jpeg_header(stbi__jpeg *z, int scan) +#define stbi__SOF_progressive(x) ((x) == 0xc2) + +static int stbi__decode_jpeg_header(stbi__jpeg *z, int scan) { int m; z->marker = STBI__MARKER_none; // initialize cached marker to empty m = stbi__get_marker(z); - if (!stbi__SOI(m)) return stbi__err("no stbi__SOI","Corrupt JPEG"); - if (scan == SCAN_type) return 1; + if (!stbi__SOI(m)) return stbi__err("no SOI","Corrupt JPEG"); + if (scan == STBI__SCAN_type) return 1; m = stbi__get_marker(z); while (!stbi__SOF(m)) { if (!stbi__process_marker(z,m)) return 0; m = stbi__get_marker(z); while (m == STBI__MARKER_none) { // some files have extra padding after their blocks, so ok, we'll scan - if (stbi__at_eof(z->s)) return stbi__err("no stbi__SOF", "Corrupt JPEG"); + if (stbi__at_eof(z->s)) return stbi__err("no SOF", "Corrupt JPEG"); m = stbi__get_marker(z); } } + z->progressive = stbi__SOF_progressive(m); if (!stbi__process_frame_header(z, scan)) return 0; return 1; } -static int decode_jpeg_image(stbi__jpeg *j) +// decode image to YCbCr format +static int stbi__decode_jpeg_image(stbi__jpeg *j) { int m; + for (m = 0; m < 4; m++) { + j->img_comp[m].raw_data = NULL; + j->img_comp[m].raw_coeff = NULL; + } j->restart_interval = 0; - if (!decode_jpeg_header(j, SCAN_load)) return 0; + if (!stbi__decode_jpeg_header(j, STBI__SCAN_load)) return 0; m = stbi__get_marker(j); while (!stbi__EOI(m)) { if (stbi__SOS(m)) { @@ -1676,7 +2813,7 @@ static int decode_jpeg_image(stbi__jpeg *j) j->marker = stbi__get8(j->s); break; } else if (x != 0) { - return 0; + return stbi__err("junk before marker", "Corrupt JPEG"); } } // if we reach eof without hitting a marker, stbi__get_marker() below will fail and we'll eventually return 0 @@ -1686,6 +2823,8 @@ static int decode_jpeg_image(stbi__jpeg *j) } m = stbi__get_marker(j); } + if (j->progressive) + stbi__jpeg_finish(j); return 1; } @@ -1769,6 +2908,123 @@ static stbi_uc *stbi__resample_row_hv_2(stbi_uc *out, stbi_uc *in_near, stbi_uc return out; } +#if defined(STBI_SSE2) || defined(STBI_NEON) +static stbi_uc *stbi__resample_row_hv_2_simd(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) +{ + // need to generate 2x2 samples for every one in input + int i=0,t0,t1; + + if (w == 1) { + out[0] = out[1] = stbi__div4(3*in_near[0] + in_far[0] + 2); + return out; + } + + t1 = 3*in_near[0] + in_far[0]; + // process groups of 8 pixels for as long as we can. + // note we can't handle the last pixel in a row in this loop + // because we need to handle the filter boundary conditions. + for (; i < ((w-1) & ~7); i += 8) { +#if defined(STBI_SSE2) + // load and perform the vertical filtering pass + // this uses 3*x + y = 4*x + (y - x) + __m128i zero = _mm_setzero_si128(); + __m128i farb = _mm_loadl_epi64((__m128i *) (in_far + i)); + __m128i nearb = _mm_loadl_epi64((__m128i *) (in_near + i)); + __m128i farw = _mm_unpacklo_epi8(farb, zero); + __m128i nearw = _mm_unpacklo_epi8(nearb, zero); + __m128i diff = _mm_sub_epi16(farw, nearw); + __m128i nears = _mm_slli_epi16(nearw, 2); + __m128i curr = _mm_add_epi16(nears, diff); // current row + + // horizontal filter works the same based on shifted vers of current + // row. "prev" is current row shifted right by 1 pixel; we need to + // insert the previous pixel value (from t1). + // "next" is current row shifted left by 1 pixel, with first pixel + // of next block of 8 pixels added in. + __m128i prv0 = _mm_slli_si128(curr, 2); + __m128i nxt0 = _mm_srli_si128(curr, 2); + __m128i prev = _mm_insert_epi16(prv0, t1, 0); + __m128i next = _mm_insert_epi16(nxt0, 3*in_near[i+8] + in_far[i+8], 7); + + // horizontal filter, polyphase implementation since it's convenient: + // even pixels = 3*cur + prev = cur*4 + (prev - cur) + // odd pixels = 3*cur + next = cur*4 + (next - cur) + // note the shared term. + __m128i bias = _mm_set1_epi16(8); + __m128i curs = _mm_slli_epi16(curr, 2); + __m128i prvd = _mm_sub_epi16(prev, curr); + __m128i nxtd = _mm_sub_epi16(next, curr); + __m128i curb = _mm_add_epi16(curs, bias); + __m128i even = _mm_add_epi16(prvd, curb); + __m128i odd = _mm_add_epi16(nxtd, curb); + + // interleave even and odd pixels, then undo scaling. + __m128i int0 = _mm_unpacklo_epi16(even, odd); + __m128i int1 = _mm_unpackhi_epi16(even, odd); + __m128i de0 = _mm_srli_epi16(int0, 4); + __m128i de1 = _mm_srli_epi16(int1, 4); + + // pack and write output + __m128i outv = _mm_packus_epi16(de0, de1); + _mm_storeu_si128((__m128i *) (out + i*2), outv); +#elif defined(STBI_NEON) + // load and perform the vertical filtering pass + // this uses 3*x + y = 4*x + (y - x) + uint8x8_t farb = vld1_u8(in_far + i); + uint8x8_t nearb = vld1_u8(in_near + i); + int16x8_t diff = vreinterpretq_s16_u16(vsubl_u8(farb, nearb)); + int16x8_t nears = vreinterpretq_s16_u16(vshll_n_u8(nearb, 2)); + int16x8_t curr = vaddq_s16(nears, diff); // current row + + // horizontal filter works the same based on shifted vers of current + // row. "prev" is current row shifted right by 1 pixel; we need to + // insert the previous pixel value (from t1). + // "next" is current row shifted left by 1 pixel, with first pixel + // of next block of 8 pixels added in. + int16x8_t prv0 = vextq_s16(curr, curr, 7); + int16x8_t nxt0 = vextq_s16(curr, curr, 1); + int16x8_t prev = vsetq_lane_s16(t1, prv0, 0); + int16x8_t next = vsetq_lane_s16(3*in_near[i+8] + in_far[i+8], nxt0, 7); + + // horizontal filter, polyphase implementation since it's convenient: + // even pixels = 3*cur + prev = cur*4 + (prev - cur) + // odd pixels = 3*cur + next = cur*4 + (next - cur) + // note the shared term. + int16x8_t curs = vshlq_n_s16(curr, 2); + int16x8_t prvd = vsubq_s16(prev, curr); + int16x8_t nxtd = vsubq_s16(next, curr); + int16x8_t even = vaddq_s16(curs, prvd); + int16x8_t odd = vaddq_s16(curs, nxtd); + + // undo scaling and round, then store with even/odd phases interleaved + uint8x8x2_t o; + o.val[0] = vqrshrun_n_s16(even, 4); + o.val[1] = vqrshrun_n_s16(odd, 4); + vst2_u8(out + i*2, o); +#endif + + // "previous" value for next iter + t1 = 3*in_near[i+7] + in_far[i+7]; + } + + t0 = t1; + t1 = 3*in_near[i] + in_far[i]; + out[i*2] = stbi__div16(3*t1 + t0 + 8); + + for (++i; i < w; ++i) { + t0 = t1; + t1 = 3*in_near[i]+in_far[i]; + out[i*2-1] = stbi__div16(3*t0 + t1 + 8); + out[i*2 ] = stbi__div16(3*t1 + t0 + 8); + } + out[w*2-1] = stbi__div4(t1+2); + + STBI_NOTUSED(hs); + + return out; +} +#endif + static stbi_uc *stbi__resample_row_generic(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) { // resample with nearest-neighbor @@ -1780,10 +3036,10 @@ static stbi_uc *stbi__resample_row_generic(stbi_uc *out, stbi_uc *in_near, stbi_ return out; } +#ifdef STBI_JPEG_OLD +// this is the same YCbCr-to-RGB calculation that stb_image has used +// historically before the algorithm changes in 1.49 #define float2fixed(x) ((int) ((x) * 65536 + 0.5)) - -// 0.38 seconds on 3*anemones.jpg (0.25 with processor = Pro) -// VC6 without processor=Pro is generating multiple LEAs per multiply! static void stbi__YCbCr_to_RGB_row(stbi_uc *out, const stbi_uc *y, const stbi_uc *pcb, const stbi_uc *pcr, int count, int step) { int i; @@ -1808,16 +3064,196 @@ static void stbi__YCbCr_to_RGB_row(stbi_uc *out, const stbi_uc *y, const stbi_uc out += step; } } - -#ifdef STBI_SIMD -static stbi_YCbCr_to_RGB_run stbi__YCbCr_installed = stbi__YCbCr_to_RGB_row; - -STBIDEF void stbi_install_YCbCr_to_RGB(stbi_YCbCr_to_RGB_run func) +#else +// this is a reduced-precision calculation of YCbCr-to-RGB introduced +// to make sure the code produces the same results in both SIMD and scalar +#define float2fixed(x) (((int) ((x) * 4096.0f + 0.5f)) << 8) +static void stbi__YCbCr_to_RGB_row(stbi_uc *out, const stbi_uc *y, const stbi_uc *pcb, const stbi_uc *pcr, int count, int step) { - stbi__YCbCr_installed = func; + int i; + for (i=0; i < count; ++i) { + int y_fixed = (y[i] << 20) + (1<<19); // rounding + int r,g,b; + int cr = pcr[i] - 128; + int cb = pcb[i] - 128; + r = y_fixed + cr* float2fixed(1.40200f); + g = y_fixed + (cr*-float2fixed(0.71414f)) + ((cb*-float2fixed(0.34414f)) & 0xffff0000); + b = y_fixed + cb* float2fixed(1.77200f); + r >>= 20; + g >>= 20; + b >>= 20; + if ((unsigned) r > 255) { if (r < 0) r = 0; else r = 255; } + if ((unsigned) g > 255) { if (g < 0) g = 0; else g = 255; } + if ((unsigned) b > 255) { if (b < 0) b = 0; else b = 255; } + out[0] = (stbi_uc)r; + out[1] = (stbi_uc)g; + out[2] = (stbi_uc)b; + out[3] = 255; + out += step; + } } #endif +#if defined(STBI_SSE2) || defined(STBI_NEON) +static void stbi__YCbCr_to_RGB_simd(stbi_uc *out, stbi_uc const *y, stbi_uc const *pcb, stbi_uc const *pcr, int count, int step) +{ + int i = 0; + +#ifdef STBI_SSE2 + // step == 3 is pretty ugly on the final interleave, and i'm not convinced + // it's useful in practice (you wouldn't use it for textures, for example). + // so just accelerate step == 4 case. + if (step == 4) { + // this is a fairly straightforward implementation and not super-optimized. + __m128i signflip = _mm_set1_epi8(-0x80); + __m128i cr_const0 = _mm_set1_epi16( (short) ( 1.40200f*4096.0f+0.5f)); + __m128i cr_const1 = _mm_set1_epi16( - (short) ( 0.71414f*4096.0f+0.5f)); + __m128i cb_const0 = _mm_set1_epi16( - (short) ( 0.34414f*4096.0f+0.5f)); + __m128i cb_const1 = _mm_set1_epi16( (short) ( 1.77200f*4096.0f+0.5f)); + __m128i y_bias = _mm_set1_epi8((char) (unsigned char) 128); + __m128i xw = _mm_set1_epi16(255); // alpha channel + + for (; i+7 < count; i += 8) { + // load + __m128i y_bytes = _mm_loadl_epi64((__m128i *) (y+i)); + __m128i cr_bytes = _mm_loadl_epi64((__m128i *) (pcr+i)); + __m128i cb_bytes = _mm_loadl_epi64((__m128i *) (pcb+i)); + __m128i cr_biased = _mm_xor_si128(cr_bytes, signflip); // -128 + __m128i cb_biased = _mm_xor_si128(cb_bytes, signflip); // -128 + + // unpack to short (and left-shift cr, cb by 8) + __m128i yw = _mm_unpacklo_epi8(y_bias, y_bytes); + __m128i crw = _mm_unpacklo_epi8(_mm_setzero_si128(), cr_biased); + __m128i cbw = _mm_unpacklo_epi8(_mm_setzero_si128(), cb_biased); + + // color transform + __m128i yws = _mm_srli_epi16(yw, 4); + __m128i cr0 = _mm_mulhi_epi16(cr_const0, crw); + __m128i cb0 = _mm_mulhi_epi16(cb_const0, cbw); + __m128i cb1 = _mm_mulhi_epi16(cbw, cb_const1); + __m128i cr1 = _mm_mulhi_epi16(crw, cr_const1); + __m128i rws = _mm_add_epi16(cr0, yws); + __m128i gwt = _mm_add_epi16(cb0, yws); + __m128i bws = _mm_add_epi16(yws, cb1); + __m128i gws = _mm_add_epi16(gwt, cr1); + + // descale + __m128i rw = _mm_srai_epi16(rws, 4); + __m128i bw = _mm_srai_epi16(bws, 4); + __m128i gw = _mm_srai_epi16(gws, 4); + + // back to byte, set up for transpose + __m128i brb = _mm_packus_epi16(rw, bw); + __m128i gxb = _mm_packus_epi16(gw, xw); + + // transpose to interleave channels + __m128i t0 = _mm_unpacklo_epi8(brb, gxb); + __m128i t1 = _mm_unpackhi_epi8(brb, gxb); + __m128i o0 = _mm_unpacklo_epi16(t0, t1); + __m128i o1 = _mm_unpackhi_epi16(t0, t1); + + // store + _mm_storeu_si128((__m128i *) (out + 0), o0); + _mm_storeu_si128((__m128i *) (out + 16), o1); + out += 32; + } + } +#endif + +#ifdef STBI_NEON + // in this version, step=3 support would be easy to add. but is there demand? + if (step == 4) { + // this is a fairly straightforward implementation and not super-optimized. + uint8x8_t signflip = vdup_n_u8(0x80); + int16x8_t cr_const0 = vdupq_n_s16( (short) ( 1.40200f*4096.0f+0.5f)); + int16x8_t cr_const1 = vdupq_n_s16( - (short) ( 0.71414f*4096.0f+0.5f)); + int16x8_t cb_const0 = vdupq_n_s16( - (short) ( 0.34414f*4096.0f+0.5f)); + int16x8_t cb_const1 = vdupq_n_s16( (short) ( 1.77200f*4096.0f+0.5f)); + + for (; i+7 < count; i += 8) { + // load + uint8x8_t y_bytes = vld1_u8(y + i); + uint8x8_t cr_bytes = vld1_u8(pcr + i); + uint8x8_t cb_bytes = vld1_u8(pcb + i); + int8x8_t cr_biased = vreinterpret_s8_u8(vsub_u8(cr_bytes, signflip)); + int8x8_t cb_biased = vreinterpret_s8_u8(vsub_u8(cb_bytes, signflip)); + + // expand to s16 + int16x8_t yws = vreinterpretq_s16_u16(vshll_n_u8(y_bytes, 4)); + int16x8_t crw = vshll_n_s8(cr_biased, 7); + int16x8_t cbw = vshll_n_s8(cb_biased, 7); + + // color transform + int16x8_t cr0 = vqdmulhq_s16(crw, cr_const0); + int16x8_t cb0 = vqdmulhq_s16(cbw, cb_const0); + int16x8_t cr1 = vqdmulhq_s16(crw, cr_const1); + int16x8_t cb1 = vqdmulhq_s16(cbw, cb_const1); + int16x8_t rws = vaddq_s16(yws, cr0); + int16x8_t gws = vaddq_s16(vaddq_s16(yws, cb0), cr1); + int16x8_t bws = vaddq_s16(yws, cb1); + + // undo scaling, round, convert to byte + uint8x8x4_t o; + o.val[0] = vqrshrun_n_s16(rws, 4); + o.val[1] = vqrshrun_n_s16(gws, 4); + o.val[2] = vqrshrun_n_s16(bws, 4); + o.val[3] = vdup_n_u8(255); + + // store, interleaving r/g/b/a + vst4_u8(out, o); + out += 8*4; + } + } +#endif + + for (; i < count; ++i) { + int y_fixed = (y[i] << 20) + (1<<19); // rounding + int r,g,b; + int cr = pcr[i] - 128; + int cb = pcb[i] - 128; + r = y_fixed + cr* float2fixed(1.40200f); + g = y_fixed + cr*-float2fixed(0.71414f) + ((cb*-float2fixed(0.34414f)) & 0xffff0000); + b = y_fixed + cb* float2fixed(1.77200f); + r >>= 20; + g >>= 20; + b >>= 20; + if ((unsigned) r > 255) { if (r < 0) r = 0; else r = 255; } + if ((unsigned) g > 255) { if (g < 0) g = 0; else g = 255; } + if ((unsigned) b > 255) { if (b < 0) b = 0; else b = 255; } + out[0] = (stbi_uc)r; + out[1] = (stbi_uc)g; + out[2] = (stbi_uc)b; + out[3] = 255; + out += step; + } +} +#endif + +// set up the kernels +static void stbi__setup_jpeg(stbi__jpeg *j) +{ + j->idct_block_kernel = stbi__idct_block; + j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_row; + j->resample_row_hv_2_kernel = stbi__resample_row_hv_2; + +#ifdef STBI_SSE2 + if (stbi__sse2_available()) { + j->idct_block_kernel = stbi__idct_simd; + #ifndef STBI_JPEG_OLD + j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd; + #endif + j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd; + } +#endif + +#ifdef STBI_NEON + j->idct_block_kernel = stbi__idct_simd; + #ifndef STBI_JPEG_OLD + j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd; + #endif + j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd; +#endif +} // clean up the temporary component buffers static void stbi__cleanup_jpeg(stbi__jpeg *j) @@ -1825,12 +3261,17 @@ static void stbi__cleanup_jpeg(stbi__jpeg *j) int i; for (i=0; i < j->s->img_n; ++i) { if (j->img_comp[i].raw_data) { - free(j->img_comp[i].raw_data); + STBI_FREE(j->img_comp[i].raw_data); j->img_comp[i].raw_data = NULL; j->img_comp[i].data = NULL; } + if (j->img_comp[i].raw_coeff) { + STBI_FREE(j->img_comp[i].raw_coeff); + j->img_comp[i].raw_coeff = 0; + j->img_comp[i].coeff = 0; + } if (j->img_comp[i].linebuf) { - free(j->img_comp[i].linebuf); + STBI_FREE(j->img_comp[i].linebuf); j->img_comp[i].linebuf = NULL; } } @@ -1841,7 +3282,7 @@ typedef struct resample_row_func resample; stbi_uc *line0,*line1; int hs,vs; // expansion factor in each axis - int w_lores; // horizontal pixels pre-expansion + int w_lores; // horizontal pixels pre-expansion int ystep; // how far through vertical expansion we are int ypos; // which pre-expansion row we're on } stbi__resample; @@ -1854,8 +3295,8 @@ static stbi_uc *load_jpeg_image(stbi__jpeg *z, int *out_x, int *out_y, int *comp // validate req_comp if (req_comp < 0 || req_comp > 4) return stbi__errpuc("bad req_comp", "Internal error"); - // load a jpeg image from whichever source - if (!decode_jpeg_image(z)) { stbi__cleanup_jpeg(z); return NULL; } + // load a jpeg image from whichever source, but leave in YCbCr format + if (!stbi__decode_jpeg_image(z)) { stbi__cleanup_jpeg(z); return NULL; } // determine actual number of components to generate n = req_comp ? req_comp : z->s->img_n; @@ -1879,7 +3320,7 @@ static stbi_uc *load_jpeg_image(stbi__jpeg *z, int *out_x, int *out_y, int *comp // allocate line buffer big enough for upsampling off the edges // with upsample factor of 4 - z->img_comp[k].linebuf = (stbi_uc *) malloc(z->s->img_x + 3); + z->img_comp[k].linebuf = (stbi_uc *) stbi__malloc(z->s->img_x + 3); if (!z->img_comp[k].linebuf) { stbi__cleanup_jpeg(z); return stbi__errpuc("outofmem", "Out of memory"); } r->hs = z->img_h_max / z->img_comp[k].h; @@ -1892,12 +3333,12 @@ static stbi_uc *load_jpeg_image(stbi__jpeg *z, int *out_x, int *out_y, int *comp if (r->hs == 1 && r->vs == 1) r->resample = resample_row_1; else if (r->hs == 1 && r->vs == 2) r->resample = stbi__resample_row_v_2; else if (r->hs == 2 && r->vs == 1) r->resample = stbi__resample_row_h_2; - else if (r->hs == 2 && r->vs == 2) r->resample = stbi__resample_row_hv_2; + else if (r->hs == 2 && r->vs == 2) r->resample = z->resample_row_hv_2_kernel; else r->resample = stbi__resample_row_generic; } // can't error after this so, this is safe - output = (stbi_uc *) malloc(n * z->s->img_x * z->s->img_y + 1); + output = (stbi_uc *) stbi__malloc(n * z->s->img_x * z->s->img_y + 1); if (!output) { stbi__cleanup_jpeg(z); return stbi__errpuc("outofmem", "Out of memory"); } // now go ahead and resample @@ -1920,11 +3361,7 @@ static stbi_uc *load_jpeg_image(stbi__jpeg *z, int *out_x, int *out_y, int *comp if (n >= 3) { stbi_uc *y = coutput[0]; if (z->s->img_n == 3) { - #ifdef STBI_SIMD - stbi__YCbCr_installed(out, y, coutput[1], coutput[2], z->s->img_x, n); - #else - stbi__YCbCr_to_RGB_row(out, y, coutput[1], coutput[2], z->s->img_x, n); - #endif + z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n); } else for (i=0; i < z->s->img_x; ++i) { out[0] = out[1] = out[2] = y[i]; @@ -1951,6 +3388,7 @@ static unsigned char *stbi__jpeg_load(stbi__context *s, int *x, int *y, int *com { stbi__jpeg j; j.s = s; + stbi__setup_jpeg(&j); return load_jpeg_image(&j, x,y,comp,req_comp); } @@ -1959,14 +3397,15 @@ static int stbi__jpeg_test(stbi__context *s) int r; stbi__jpeg j; j.s = s; - r = decode_jpeg_header(&j, SCAN_type); + stbi__setup_jpeg(&j); + r = stbi__decode_jpeg_header(&j, STBI__SCAN_type); stbi__rewind(s); return r; } static int stbi__jpeg_info_raw(stbi__jpeg *j, int *x, int *y, int *comp) { - if (!decode_jpeg_header(j, SCAN_header)) { + if (!stbi__decode_jpeg_header(j, STBI__SCAN_header)) { stbi__rewind( j->s ); return 0; } @@ -1982,6 +3421,7 @@ static int stbi__jpeg_info(stbi__context *s, int *x, int *y, int *comp) j.s = s; return stbi__jpeg_info_raw(&j, x, y, comp); } +#endif // public domain zlib decode v0.2 Sean Barrett 2006-11-18 // simple implementation @@ -1990,6 +3430,8 @@ static int stbi__jpeg_info(stbi__context *s, int *x, int *y, int *comp) // performance // - fast huffman +#ifndef STBI_NO_ZLIB + // fast-way is faster to check than jpeg huffman, but slow way is slower #define STBI__ZFAST_BITS 9 // accelerate all cases in default tables #define STBI__ZFAST_MASK ((1 << STBI__ZFAST_BITS) - 1) @@ -2003,7 +3445,7 @@ typedef struct int maxcode[17]; stbi__uint16 firstsymbol[16]; stbi_uc size[288]; - stbi__uint16 value[288]; + stbi__uint16 value[288]; } stbi__zhuffman; stbi_inline static int stbi__bitreverse16(int n) @@ -2019,7 +3461,7 @@ stbi_inline static int stbi__bit_reverse(int v, int bits) { STBI_ASSERT(bits <= 16); // to bit reverse n bits, reverse 16 and shift - // stbi__err.g. 11 bits, bit reverse and shift away 5 + // e.g. 11 bits, bit reverse and shift away 5 return stbi__bitreverse16(v) >> (16-bits); } @@ -2030,12 +3472,13 @@ static int stbi__zbuild_huffman(stbi__zhuffman *z, stbi_uc *sizelist, int num) // DEFLATE spec for generating codes memset(sizes, 0, sizeof(sizes)); - memset(z->fast, 255, sizeof(z->fast)); - for (i=0; i < num; ++i) + memset(z->fast, 0, sizeof(z->fast)); + for (i=0; i < num; ++i) ++sizes[sizelist[i]]; sizes[0] = 0; for (i=1; i < 16; ++i) - STBI_ASSERT(sizes[i] <= (1 << i)); + if (sizes[i] > (1 << i)) + return stbi__err("bad sizes", "Corrupt PNG"); code = 0; for (i=1; i < 16; ++i) { next_code[i] = code; @@ -2043,7 +3486,7 @@ static int stbi__zbuild_huffman(stbi__zhuffman *z, stbi_uc *sizelist, int num) z->firstsymbol[i] = (stbi__uint16) k; code = (code + sizes[i]); if (sizes[i]) - if (code-1 >= (1 << i)) return stbi__err("bad codelengths","Corrupt JPEG"); + if (code-1 >= (1 << i)) return stbi__err("bad codelengths","Corrupt PNG"); z->maxcode[i] = code << (16-i); // preshift for inner loop code <<= 1; k += sizes[i]; @@ -2053,12 +3496,13 @@ static int stbi__zbuild_huffman(stbi__zhuffman *z, stbi_uc *sizelist, int num) int s = sizelist[i]; if (s) { int c = next_code[s] - z->firstcode[s] + z->firstsymbol[s]; + stbi__uint16 fastv = (stbi__uint16) ((s << 9) | i); z->size [c] = (stbi_uc ) s; z->value[c] = (stbi__uint16) i; if (s <= STBI__ZFAST_BITS) { int k = stbi__bit_reverse(next_code[s],s); while (k < (1 << STBI__ZFAST_BITS)) { - z->fast[k] = (stbi__uint16) c; + z->fast[k] = fastv; k += (1 << s); } } @@ -2110,21 +3554,12 @@ stbi_inline static unsigned int stbi__zreceive(stbi__zbuf *z, int n) k = z->code_buffer & ((1 << n) - 1); z->code_buffer >>= n; z->num_bits -= n; - return k; + return k; } -stbi_inline static int stbi__zhuffman_decode(stbi__zbuf *a, stbi__zhuffman *z) +static int stbi__zhuffman_decode_slowpath(stbi__zbuf *a, stbi__zhuffman *z) { int b,s,k; - if (a->num_bits < 16) stbi__fill_bits(a); - b = z->fast[a->code_buffer & STBI__ZFAST_MASK]; - if (b < 0xffff) { - s = z->size[b]; - a->code_buffer >>= s; - a->num_bits -= s; - return z->value[b]; - } - // not resolved by fast table, so compute it the slow way // use jpeg approach, which requires MSbits at top k = stbi__bit_reverse(a->code_buffer, 16); @@ -2140,16 +3575,31 @@ stbi_inline static int stbi__zhuffman_decode(stbi__zbuf *a, stbi__zhuffman *z) return z->value[b]; } -static int stbi__zexpand(stbi__zbuf *z, int n) // need to make room for n bytes +stbi_inline static int stbi__zhuffman_decode(stbi__zbuf *a, stbi__zhuffman *z) +{ + int b,s; + if (a->num_bits < 16) stbi__fill_bits(a); + b = z->fast[a->code_buffer & STBI__ZFAST_MASK]; + if (b) { + s = b >> 9; + a->code_buffer >>= s; + a->num_bits -= s; + return b & 511; + } + return stbi__zhuffman_decode_slowpath(a, z); +} + +static int stbi__zexpand(stbi__zbuf *z, char *zout, int n) // need to make room for n bytes { char *q; int cur, limit; + z->zout = zout; if (!z->z_expandable) return stbi__err("output buffer limit","Corrupt PNG"); cur = (int) (z->zout - z->zout_start); limit = (int) (z->zout_end - z->zout_start); while (cur + n > limit) limit *= 2; - q = (char *) realloc(z->zout_start, limit); + q = (char *) STBI_REALLOC(z->zout_start, limit); if (q == NULL) return stbi__err("outofmem", "Out of memory"); z->zout_start = q; z->zout = q + cur; @@ -2162,7 +3612,7 @@ static int stbi__zlength_base[31] = { 15,17,19,23,27,31,35,43,51,59, 67,83,99,115,131,163,195,227,258,0,0 }; -static int stbi__zlength_extra[31]= +static int stbi__zlength_extra[31]= { 0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0 }; static int stbi__zdist_base[32] = { 1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193, @@ -2173,16 +3623,23 @@ static int stbi__zdist_extra[32] = static int stbi__parse_huffman_block(stbi__zbuf *a) { + char *zout = a->zout; for(;;) { int z = stbi__zhuffman_decode(a, &a->z_length); if (z < 256) { if (z < 0) return stbi__err("bad huffman code","Corrupt PNG"); // error in huffman codes - if (a->zout >= a->zout_end) if (!stbi__zexpand(a, 1)) return 0; - *a->zout++ = (char) z; + if (zout >= a->zout_end) { + if (!stbi__zexpand(a, zout, 1)) return 0; + zout = a->zout; + } + *zout++ = (char) z; } else { stbi_uc *p; int len,dist; - if (z == 256) return 1; + if (z == 256) { + a->zout = zout; + return 1; + } z -= 257; len = stbi__zlength_base[z]; if (stbi__zlength_extra[z]) len += stbi__zreceive(a, stbi__zlength_extra[z]); @@ -2190,11 +3647,18 @@ static int stbi__parse_huffman_block(stbi__zbuf *a) if (z < 0) return stbi__err("bad huffman code","Corrupt PNG"); dist = stbi__zdist_base[z]; if (stbi__zdist_extra[z]) dist += stbi__zreceive(a, stbi__zdist_extra[z]); - if (a->zout - a->zout_start < dist) return stbi__err("bad dist","Corrupt PNG"); - if (a->zout + len > a->zout_end) if (!stbi__zexpand(a, len)) return 0; - p = (stbi_uc *) (a->zout - dist); - while (len--) - *a->zout++ = *p++; + if (zout - a->zout_start < dist) return stbi__err("bad dist","Corrupt PNG"); + if (zout + len > a->zout_end) { + if (!stbi__zexpand(a, zout, len)) return 0; + zout = a->zout; + } + p = (stbi_uc *) (zout - dist); + if (dist == 1) { // run of one byte; common in images. + stbi_uc v = *p; + if (len) { do *zout++ = v; while (--len); } + } else { + if (len) { do *zout++ = *p++; while (--len); } + } } } } @@ -2221,7 +3685,7 @@ static int stbi__compute_huffman_codes(stbi__zbuf *a) n = 0; while (n < hlit + hdist) { int c = stbi__zhuffman_decode(a, &z_codelength); - STBI_ASSERT(c >= 0 && c < 19); + if (c < 0 || c >= 19) return stbi__err("bad codelengths", "Corrupt PNG"); if (c < 16) lencodes[n++] = (stbi_uc) c; else if (c == 16) { @@ -2267,7 +3731,7 @@ static int stbi__parse_uncomperssed_block(stbi__zbuf *a) if (nlen != (len ^ 0xffff)) return stbi__err("zlib corrupt","Corrupt PNG"); if (a->zbuffer + len > a->zbuffer_end) return stbi__err("read past buffer","Corrupt PNG"); if (a->zout + len > a->zout_end) - if (!stbi__zexpand(a, len)) return 0; + if (!stbi__zexpand(a, a->zout, len)) return 0; memcpy(a->zout, a->zbuffer, len); a->zbuffer += len; a->zout += len; @@ -2342,7 +3806,7 @@ static int stbi__do_zlib(stbi__zbuf *a, char *obuf, int olen, int exp, int parse STBIDEF char *stbi_zlib_decode_malloc_guesssize(const char *buffer, int len, int initial_size, int *outlen) { stbi__zbuf a; - char *p = (char *) malloc(initial_size); + char *p = (char *) stbi__malloc(initial_size); if (p == NULL) return NULL; a.zbuffer = (stbi_uc *) buffer; a.zbuffer_end = (stbi_uc *) buffer + len; @@ -2350,7 +3814,7 @@ STBIDEF char *stbi_zlib_decode_malloc_guesssize(const char *buffer, int len, int if (outlen) *outlen = (int) (a.zout - a.zout_start); return a.zout_start; } else { - free(a.zout_start); + STBI_FREE(a.zout_start); return NULL; } } @@ -2363,7 +3827,7 @@ STBIDEF char *stbi_zlib_decode_malloc(char const *buffer, int len, int *outlen) STBIDEF char *stbi_zlib_decode_malloc_guesssize_headerflag(const char *buffer, int len, int initial_size, int *outlen, int parse_header) { stbi__zbuf a; - char *p = (char *) malloc(initial_size); + char *p = (char *) stbi__malloc(initial_size); if (p == NULL) return NULL; a.zbuffer = (stbi_uc *) buffer; a.zbuffer_end = (stbi_uc *) buffer + len; @@ -2371,7 +3835,7 @@ STBIDEF char *stbi_zlib_decode_malloc_guesssize_headerflag(const char *buffer, i if (outlen) *outlen = (int) (a.zout - a.zout_start); return a.zout_start; } else { - free(a.zout_start); + STBI_FREE(a.zout_start); return NULL; } } @@ -2390,7 +3854,7 @@ STBIDEF int stbi_zlib_decode_buffer(char *obuffer, int olen, char const *ibuffer STBIDEF char *stbi_zlib_decode_noheader_malloc(char const *buffer, int len, int *outlen) { stbi__zbuf a; - char *p = (char *) malloc(16384); + char *p = (char *) stbi__malloc(16384); if (p == NULL) return NULL; a.zbuffer = (stbi_uc *) buffer; a.zbuffer_end = (stbi_uc *) buffer+len; @@ -2398,7 +3862,7 @@ STBIDEF char *stbi_zlib_decode_noheader_malloc(char const *buffer, int len, int if (outlen) *outlen = (int) (a.zout - a.zout_start); return a.zout_start; } else { - free(a.zout_start); + STBI_FREE(a.zout_start); return NULL; } } @@ -2413,6 +3877,7 @@ STBIDEF int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const char else return -1; } +#endif // public domain "baseline" PNG decoder v0.10 Sean Barrett 2006-11-18 // simple implementation @@ -2424,15 +3889,13 @@ STBIDEF int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const char // performance // - uses stb_zlib, a PD zlib implementation with fast huffman decoding - +#ifndef STBI_NO_PNG typedef struct { stbi__uint32 length; stbi__uint32 type; } stbi__pngchunk; -#define PNG_TYPE(a,b,c,d) (((a) << 24) + ((b) << 16) + ((c) << 8) + (d)) - static stbi__pngchunk stbi__get_chunk_header(stbi__context *s) { stbi__pngchunk c; @@ -2458,13 +3921,23 @@ typedef struct enum { - STBI__F_none=0, STBI__F_sub=1, STBI__F_up=2, STBI__F_avg=3, STBI__F_paeth=4, - STBI__F_avg_first, STBI__F_paeth_first + STBI__F_none=0, + STBI__F_sub=1, + STBI__F_up=2, + STBI__F_avg=3, + STBI__F_paeth=4, + // synthetic filters used for first scanline to avoid needing a dummy row of 0s + STBI__F_avg_first, + STBI__F_paeth_first }; static stbi_uc first_row_filter[5] = { - STBI__F_none, STBI__F_sub, STBI__F_none, STBI__F_avg_first, STBI__F_paeth_first + STBI__F_none, + STBI__F_sub, + STBI__F_none, + STBI__F_avg_first, + STBI__F_paeth_first }; static int stbi__paeth(int a, int b, int c) @@ -2478,32 +3951,50 @@ static int stbi__paeth(int a, int b, int c) return c; } -#define STBI__BYTECAST(x) ((stbi_uc) ((x) & 255)) // truncate int to byte without warnings +static stbi_uc stbi__depth_scale_table[9] = { 0, 0xff, 0x55, 0, 0x11, 0,0,0, 0x01 }; // create the png data from post-deflated data -static int stbi__create_png_image_raw(stbi__png *a, stbi_uc *raw, stbi__uint32 raw_len, int out_n, stbi__uint32 x, stbi__uint32 y) +static int stbi__create_png_image_raw(stbi__png *a, stbi_uc *raw, stbi__uint32 raw_len, int out_n, stbi__uint32 x, stbi__uint32 y, int depth, int color) { stbi__context *s = a->s; stbi__uint32 i,j,stride = x*out_n; + stbi__uint32 img_len, img_width_bytes; int k; int img_n = s->img_n; // copy it into a local for later + STBI_ASSERT(out_n == s->img_n || out_n == s->img_n+1); - a->out = (stbi_uc *) malloc(x * y * out_n); + a->out = (stbi_uc *) stbi__malloc(x * y * out_n); // extra bytes to write off the end into if (!a->out) return stbi__err("outofmem", "Out of memory"); + + img_width_bytes = (((img_n * x * depth) + 7) >> 3); + img_len = (img_width_bytes + 1) * y; if (s->img_x == x && s->img_y == y) { - if (raw_len != (img_n * x + 1) * y) return stbi__err("not enough pixels","Corrupt PNG"); + if (raw_len != img_len) return stbi__err("not enough pixels","Corrupt PNG"); } else { // interlaced: - if (raw_len < (img_n * x + 1) * y) return stbi__err("not enough pixels","Corrupt PNG"); + if (raw_len < img_len) return stbi__err("not enough pixels","Corrupt PNG"); } + for (j=0; j < y; ++j) { stbi_uc *cur = a->out + stride*j; stbi_uc *prior = cur - stride; int filter = *raw++; - if (filter > 4) return stbi__err("invalid filter","Corrupt PNG"); + int filter_bytes = img_n; + int width = x; + if (filter > 4) + return stbi__err("invalid filter","Corrupt PNG"); + + if (depth < 8) { + STBI_ASSERT(img_width_bytes <= x); + cur += x*out_n - img_width_bytes; // store output to the rightmost img_len bytes, so we can decode in place + filter_bytes = 1; + width = img_width_bytes; + } + // if first row, use special filter that doesn't sample previous row if (j == 0) filter = first_row_filter[filter]; - // handle first pixel explicitly - for (k=0; k < img_n; ++k) { + + // handle first byte explicitly + for (k=0; k < filter_bytes; ++k) { switch (filter) { case STBI__F_none : cur[k] = raw[k]; break; case STBI__F_sub : cur[k] = raw[k]; break; @@ -2514,26 +4005,37 @@ static int stbi__create_png_image_raw(stbi__png *a, stbi_uc *raw, stbi__uint32 r case STBI__F_paeth_first: cur[k] = raw[k]; break; } } - if (img_n != out_n) cur[img_n] = 255; - raw += img_n; - cur += out_n; - prior += out_n; + + if (depth == 8) { + if (img_n != out_n) + cur[img_n] = 255; // first pixel + raw += img_n; + cur += out_n; + prior += out_n; + } else { + raw += 1; + cur += 1; + prior += 1; + } + // this is a little gross, so that we don't switch per-pixel or per-component - if (img_n == out_n) { + if (depth < 8 || img_n == out_n) { + int nk = (width - 1)*img_n; #define CASE(f) \ case f: \ - for (i=x-1; i >= 1; --i, raw+=img_n,cur+=img_n,prior+=img_n) \ - for (k=0; k < img_n; ++k) + for (k=0; k < nk; ++k) switch (filter) { - CASE(STBI__F_none) cur[k] = raw[k]; break; - CASE(STBI__F_sub) cur[k] = STBI__BYTECAST(raw[k] + cur[k-img_n]); break; + // "none" filter turns into a memcpy here; make that explicit. + case STBI__F_none: memcpy(cur, raw, nk); break; + CASE(STBI__F_sub) cur[k] = STBI__BYTECAST(raw[k] + cur[k-filter_bytes]); break; CASE(STBI__F_up) cur[k] = STBI__BYTECAST(raw[k] + prior[k]); break; - CASE(STBI__F_avg) cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k-img_n])>>1)); break; - CASE(STBI__F_paeth) cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-img_n],prior[k],prior[k-img_n])); break; - CASE(STBI__F_avg_first) cur[k] = STBI__BYTECAST(raw[k] + (cur[k-img_n] >> 1)); break; - CASE(STBI__F_paeth_first) cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-img_n],0,0)); break; + CASE(STBI__F_avg) cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k-filter_bytes])>>1)); break; + CASE(STBI__F_paeth) cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-filter_bytes],prior[k],prior[k-filter_bytes])); break; + CASE(STBI__F_avg_first) cur[k] = STBI__BYTECAST(raw[k] + (cur[k-filter_bytes] >> 1)); break; + CASE(STBI__F_paeth_first) cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-filter_bytes],0,0)); break; } #undef CASE + raw += nk; } else { STBI_ASSERT(img_n+1 == out_n); #define CASE(f) \ @@ -2552,18 +4054,93 @@ static int stbi__create_png_image_raw(stbi__png *a, stbi_uc *raw, stbi__uint32 r #undef CASE } } + + // we make a separate pass to expand bits to pixels; for performance, + // this could run two scanlines behind the above code, so it won't + // intefere with filtering but will still be in the cache. + if (depth < 8) { + for (j=0; j < y; ++j) { + stbi_uc *cur = a->out + stride*j; + stbi_uc *in = a->out + stride*j + x*out_n - img_width_bytes; + // unpack 1/2/4-bit into a 8-bit buffer. allows us to keep the common 8-bit path optimal at minimal cost for 1/2/4-bit + // png guarante byte alignment, if width is not multiple of 8/4/2 we'll decode dummy trailing data that will be skipped in the later loop + stbi_uc scale = (color == 0) ? stbi__depth_scale_table[depth] : 1; // scale grayscale values to 0..255 range + + // note that the final byte might overshoot and write more data than desired. + // we can allocate enough data that this never writes out of memory, but it + // could also overwrite the next scanline. can it overwrite non-empty data + // on the next scanline? yes, consider 1-pixel-wide scanlines with 1-bit-per-pixel. + // so we need to explicitly clamp the final ones + + if (depth == 4) { + for (k=x*img_n; k >= 2; k-=2, ++in) { + *cur++ = scale * ((*in >> 4) ); + *cur++ = scale * ((*in ) & 0x0f); + } + if (k > 0) *cur++ = scale * ((*in >> 4) ); + } else if (depth == 2) { + for (k=x*img_n; k >= 4; k-=4, ++in) { + *cur++ = scale * ((*in >> 6) ); + *cur++ = scale * ((*in >> 4) & 0x03); + *cur++ = scale * ((*in >> 2) & 0x03); + *cur++ = scale * ((*in ) & 0x03); + } + if (k > 0) *cur++ = scale * ((*in >> 6) ); + if (k > 1) *cur++ = scale * ((*in >> 4) & 0x03); + if (k > 2) *cur++ = scale * ((*in >> 2) & 0x03); + } else if (depth == 1) { + for (k=x*img_n; k >= 8; k-=8, ++in) { + *cur++ = scale * ((*in >> 7) ); + *cur++ = scale * ((*in >> 6) & 0x01); + *cur++ = scale * ((*in >> 5) & 0x01); + *cur++ = scale * ((*in >> 4) & 0x01); + *cur++ = scale * ((*in >> 3) & 0x01); + *cur++ = scale * ((*in >> 2) & 0x01); + *cur++ = scale * ((*in >> 1) & 0x01); + *cur++ = scale * ((*in ) & 0x01); + } + if (k > 0) *cur++ = scale * ((*in >> 7) ); + if (k > 1) *cur++ = scale * ((*in >> 6) & 0x01); + if (k > 2) *cur++ = scale * ((*in >> 5) & 0x01); + if (k > 3) *cur++ = scale * ((*in >> 4) & 0x01); + if (k > 4) *cur++ = scale * ((*in >> 3) & 0x01); + if (k > 5) *cur++ = scale * ((*in >> 2) & 0x01); + if (k > 6) *cur++ = scale * ((*in >> 1) & 0x01); + } + if (img_n != out_n) { + // insert alpha = 255 + stbi_uc *cur = a->out + stride*j; + int i; + if (img_n == 1) { + for (i=x-1; i >= 0; --i) { + cur[i*2+1] = 255; + cur[i*2+0] = cur[i]; + } + } else { + STBI_ASSERT(img_n == 3); + for (i=x-1; i >= 0; --i) { + cur[i*4+3] = 255; + cur[i*4+2] = cur[i*3+2]; + cur[i*4+1] = cur[i*3+1]; + cur[i*4+0] = cur[i*3+0]; + } + } + } + } + } + return 1; } -static int stbi__create_png_image(stbi__png *a, stbi_uc *raw, stbi__uint32 raw_len, int out_n, int interlaced) +static int stbi__create_png_image(stbi__png *a, stbi_uc *image_data, stbi__uint32 image_data_len, int out_n, int depth, int color, int interlaced) { stbi_uc *final; int p; if (!interlaced) - return stbi__create_png_image_raw(a, raw, raw_len, out_n, a->s->img_x, a->s->img_y); + return stbi__create_png_image_raw(a, image_data, image_data_len, out_n, a->s->img_x, a->s->img_y, depth, color); // de-interlacing - final = (stbi_uc *) malloc(a->s->img_x * a->s->img_y * out_n); + final = (stbi_uc *) stbi__malloc(a->s->img_x * a->s->img_y * out_n); for (p=0; p < 7; ++p) { int xorig[] = { 0,4,0,2,0,1,0 }; int yorig[] = { 0,0,4,0,2,0,1 }; @@ -2574,17 +4151,22 @@ static int stbi__create_png_image(stbi__png *a, stbi_uc *raw, stbi__uint32 raw_l x = (a->s->img_x - xorig[p] + xspc[p]-1) / xspc[p]; y = (a->s->img_y - yorig[p] + yspc[p]-1) / yspc[p]; if (x && y) { - if (!stbi__create_png_image_raw(a, raw, raw_len, out_n, x, y)) { - free(final); + stbi__uint32 img_len = ((((a->s->img_n * x * depth) + 7) >> 3) + 1) * y; + if (!stbi__create_png_image_raw(a, image_data, image_data_len, out_n, x, y, depth, color)) { + STBI_FREE(final); return 0; } - for (j=0; j < y; ++j) - for (i=0; i < x; ++i) - memcpy(final + (j*yspc[p]+yorig[p])*a->s->img_x*out_n + (i*xspc[p]+xorig[p])*out_n, + for (j=0; j < y; ++j) { + for (i=0; i < x; ++i) { + int out_y = j*yspc[p]+yorig[p]; + int out_x = i*xspc[p]+xorig[p]; + memcpy(final + out_y*a->s->img_x*out_n + out_x*out_n, a->out + (j*x+i)*out_n, out_n); - free(a->out); - raw += (x*out_n+1)*y; - raw_len -= (x*out_n+1)*y; + } + } + STBI_FREE(a->out); + image_data += img_len; + image_data_len -= img_len; } } a->out = final; @@ -2622,7 +4204,7 @@ static int stbi__expand_png_palette(stbi__png *a, stbi_uc *palette, int len, int stbi__uint32 i, pixel_count = a->s->img_x * a->s->img_y; stbi_uc *p, *temp_out, *orig = a->out; - p = (stbi_uc *) malloc(pixel_count * pal_img_n); + p = (stbi_uc *) stbi__malloc(pixel_count * pal_img_n); if (p == NULL) return stbi__err("outofmem", "Out of memory"); // between here and free(out) below, exitting would leak @@ -2646,7 +4228,7 @@ static int stbi__expand_png_palette(stbi__png *a, stbi_uc *palette, int len, int p += 4; } } - free(a->out); + STBI_FREE(a->out); a->out = temp_out; STBI_NOTUSED(len); @@ -2694,7 +4276,7 @@ static void stbi__de_iphone(stbi__png *z) } else { p[0] = p[2]; p[2] = t; - } + } p += 4; } } else { @@ -2709,12 +4291,14 @@ static void stbi__de_iphone(stbi__png *z) } } +#define STBI__PNG_TYPE(a,b,c,d) (((a) << 24) + ((b) << 16) + ((c) << 8) + (d)) + static int stbi__parse_png_file(stbi__png *z, int scan, int req_comp) { stbi_uc palette[1024], pal_img_n=0; stbi_uc has_trans=0, tc[3]; stbi__uint32 ioff=0, idata_limit=0, i, pal_len=0; - int first=1,k,interlace=0, is_iphone=0; + int first=1,k,interlace=0, color=0, depth=0, is_iphone=0; stbi__context *s = z->s; z->expanded = NULL; @@ -2723,23 +4307,23 @@ static int stbi__parse_png_file(stbi__png *z, int scan, int req_comp) if (!stbi__check_png_header(s)) return 0; - if (scan == SCAN_type) return 1; + if (scan == STBI__SCAN_type) return 1; for (;;) { stbi__pngchunk c = stbi__get_chunk_header(s); switch (c.type) { - case PNG_TYPE('C','g','B','I'): + case STBI__PNG_TYPE('C','g','B','I'): is_iphone = 1; stbi__skip(s, c.length); break; - case PNG_TYPE('I','H','D','R'): { - int depth,color,comp,filter; + case STBI__PNG_TYPE('I','H','D','R'): { + int comp,filter; if (!first) return stbi__err("multiple IHDR","Corrupt PNG"); first = 0; if (c.length != 13) return stbi__err("bad IHDR len","Corrupt PNG"); s->img_x = stbi__get32be(s); if (s->img_x > (1 << 24)) return stbi__err("too large","Very large image (corrupt?)"); s->img_y = stbi__get32be(s); if (s->img_y > (1 << 24)) return stbi__err("too large","Very large image (corrupt?)"); - depth = stbi__get8(s); if (depth != 8) return stbi__err("8bit only","PNG not supported: 8-bit only"); + depth = stbi__get8(s); if (depth != 1 && depth != 2 && depth != 4 && depth != 8) return stbi__err("1/2/4/8-bit only","PNG not supported: 1/2/4/8-bit only"); color = stbi__get8(s); if (color > 6) return stbi__err("bad ctype","Corrupt PNG"); if (color == 3) pal_img_n = 3; else if (color & 1) return stbi__err("bad ctype","Corrupt PNG"); comp = stbi__get8(s); if (comp) return stbi__err("bad comp method","Corrupt PNG"); @@ -2749,7 +4333,7 @@ static int stbi__parse_png_file(stbi__png *z, int scan, int req_comp) if (!pal_img_n) { s->img_n = (color & 2 ? 3 : 1) + (color & 4 ? 1 : 0); if ((1 << 30) / s->img_x / s->img_n < s->img_y) return stbi__err("too large", "Image too large to decode"); - if (scan == SCAN_header) return 1; + if (scan == STBI__SCAN_header) return 1; } else { // if paletted, then pal_n is our final components, and // img_n is # components to decompress/filter. @@ -2760,7 +4344,7 @@ static int stbi__parse_png_file(stbi__png *z, int scan, int req_comp) break; } - case PNG_TYPE('P','L','T','E'): { + case STBI__PNG_TYPE('P','L','T','E'): { if (first) return stbi__err("first not IHDR", "Corrupt PNG"); if (c.length > 256*3) return stbi__err("invalid PLTE","Corrupt PNG"); pal_len = c.length / 3; @@ -2774,11 +4358,11 @@ static int stbi__parse_png_file(stbi__png *z, int scan, int req_comp) break; } - case PNG_TYPE('t','R','N','S'): { + case STBI__PNG_TYPE('t','R','N','S'): { if (first) return stbi__err("first not IHDR", "Corrupt PNG"); if (z->idata) return stbi__err("tRNS after IDAT","Corrupt PNG"); if (pal_img_n) { - if (scan == SCAN_header) { s->img_n = 4; return 1; } + if (scan == STBI__SCAN_header) { s->img_n = 4; return 1; } if (pal_len == 0) return stbi__err("tRNS before PLTE","Corrupt PNG"); if (c.length > pal_len) return stbi__err("bad tRNS len","Corrupt PNG"); pal_img_n = 4; @@ -2789,21 +4373,22 @@ static int stbi__parse_png_file(stbi__png *z, int scan, int req_comp) if (c.length != (stbi__uint32) s->img_n*2) return stbi__err("bad tRNS len","Corrupt PNG"); has_trans = 1; for (k=0; k < s->img_n; ++k) - tc[k] = (stbi_uc) (stbi__get16be(s) & 255); // non 8-bit images will be larger + tc[k] = (stbi_uc) (stbi__get16be(s) & 255) * stbi__depth_scale_table[depth]; // non 8-bit images will be larger } break; } - case PNG_TYPE('I','D','A','T'): { + case STBI__PNG_TYPE('I','D','A','T'): { if (first) return stbi__err("first not IHDR", "Corrupt PNG"); if (pal_img_n && !pal_len) return stbi__err("no PLTE","Corrupt PNG"); - if (scan == SCAN_header) { s->img_n = pal_img_n; return 1; } + if (scan == STBI__SCAN_header) { s->img_n = pal_img_n; return 1; } + if ((int)(ioff + c.length) < (int)ioff) return 0; if (ioff + c.length > idata_limit) { stbi_uc *p; if (idata_limit == 0) idata_limit = c.length > 4096 ? c.length : 4096; while (ioff + c.length > idata_limit) idata_limit *= 2; - p = (stbi_uc *) realloc(z->idata, idata_limit); if (p == NULL) return stbi__err("outofmem", "Out of memory"); + p = (stbi_uc *) STBI_REALLOC(z->idata, idata_limit); if (p == NULL) return stbi__err("outofmem", "Out of memory"); z->idata = p; } if (!stbi__getn(s, z->idata+ioff,c.length)) return stbi__err("outofdata","Corrupt PNG"); @@ -2811,19 +4396,22 @@ static int stbi__parse_png_file(stbi__png *z, int scan, int req_comp) break; } - case PNG_TYPE('I','E','N','D'): { - stbi__uint32 raw_len; + case STBI__PNG_TYPE('I','E','N','D'): { + stbi__uint32 raw_len, bpl; if (first) return stbi__err("first not IHDR", "Corrupt PNG"); - if (scan != SCAN_load) return 1; + if (scan != STBI__SCAN_load) return 1; if (z->idata == NULL) return stbi__err("no IDAT","Corrupt PNG"); - z->expanded = (stbi_uc *) stbi_zlib_decode_malloc_guesssize_headerflag((char *) z->idata, ioff, 16384, (int *) &raw_len, !is_iphone); + // initial guess for decoded data size to avoid unnecessary reallocs + bpl = (s->img_x * depth + 7) / 8; // bytes per line, per component + raw_len = bpl * s->img_y * s->img_n /* pixels */ + s->img_y /* filter mode per row */; + z->expanded = (stbi_uc *) stbi_zlib_decode_malloc_guesssize_headerflag((char *) z->idata, ioff, raw_len, (int *) &raw_len, !is_iphone); if (z->expanded == NULL) return 0; // zlib should set error - free(z->idata); z->idata = NULL; + STBI_FREE(z->idata); z->idata = NULL; if ((req_comp == s->img_n+1 && req_comp != 3 && !pal_img_n) || has_trans) s->img_out_n = s->img_n+1; else s->img_out_n = s->img_n; - if (!stbi__create_png_image(z, z->expanded, raw_len, s->img_out_n, interlace)) return 0; + if (!stbi__create_png_image(z, z->expanded, raw_len, s->img_out_n, depth, color, interlace)) return 0; if (has_trans) if (!stbi__compute_transparency(z, tc, s->img_out_n)) return 0; if (is_iphone && stbi__de_iphone_flag && s->img_out_n > 2) @@ -2836,7 +4424,7 @@ static int stbi__parse_png_file(stbi__png *z, int scan, int req_comp) if (!stbi__expand_png_palette(z, palette, pal_len, s->img_out_n)) return 0; } - free(z->expanded); z->expanded = NULL; + STBI_FREE(z->expanded); z->expanded = NULL; return 1; } @@ -2866,7 +4454,7 @@ static unsigned char *stbi__do_png(stbi__png *p, int *x, int *y, int *n, int req { unsigned char *result=NULL; if (req_comp < 0 || req_comp > 4) return stbi__errpuc("bad req_comp", "Internal error"); - if (stbi__parse_png_file(p, SCAN_load, req_comp)) { + if (stbi__parse_png_file(p, STBI__SCAN_load, req_comp)) { result = p->out; p->out = NULL; if (req_comp && req_comp != p->s->img_out_n) { @@ -2876,11 +4464,11 @@ static unsigned char *stbi__do_png(stbi__png *p, int *x, int *y, int *n, int req } *x = p->s->img_x; *y = p->s->img_y; - if (n) *n = p->s->img_n; + if (n) *n = p->s->img_out_n; } - free(p->out); p->out = NULL; - free(p->expanded); p->expanded = NULL; - free(p->idata); p->idata = NULL; + STBI_FREE(p->out); p->out = NULL; + STBI_FREE(p->expanded); p->expanded = NULL; + STBI_FREE(p->idata); p->idata = NULL; return result; } @@ -2902,7 +4490,7 @@ static int stbi__png_test(stbi__context *s) static int stbi__png_info_raw(stbi__png *p, int *x, int *y, int *comp) { - if (!stbi__parse_png_file(p, SCAN_header, 0)) { + if (!stbi__parse_png_file(p, STBI__SCAN_header, 0)) { stbi__rewind( p->s ); return 0; } @@ -2918,8 +4506,11 @@ static int stbi__png_info(stbi__context *s, int *x, int *y, int *comp) p.s = s; return stbi__png_info_raw(&p, x, y, comp); } +#endif // Microsoft/Windows BMP image + +#ifndef STBI_NO_BMP static int stbi__bmp_test_raw(stbi__context *s) { int r; @@ -3078,11 +4669,11 @@ static stbi_uc *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int target = req_comp; else target = s->img_n; // if they want monochrome, we'll post-convert - out = (stbi_uc *) malloc(target * s->img_x * s->img_y); + out = (stbi_uc *) stbi__malloc(target * s->img_x * s->img_y); if (!out) return stbi__errpuc("outofmem", "Out of memory"); if (bpp < 16) { int z=0; - if (psize == 0 || psize > 256) { free(out); return stbi__errpuc("invalid", "Corrupt BMP"); } + if (psize == 0 || psize > 256) { STBI_FREE(out); return stbi__errpuc("invalid", "Corrupt BMP"); } for (i=0; i < psize; ++i) { pal[i][2] = stbi__get8(s); pal[i][1] = stbi__get8(s); @@ -3093,7 +4684,7 @@ static stbi_uc *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int stbi__skip(s, offset - 14 - hsz - psize * (hsz == 12 ? 3 : 4)); if (bpp == 4) width = (s->img_x + 1) >> 1; else if (bpp == 8) width = s->img_x; - else { free(out); return stbi__errpuc("bad bpp", "Corrupt BMP"); } + else { STBI_FREE(out); return stbi__errpuc("bad bpp", "Corrupt BMP"); } pad = (-width)&3; for (j=0; j < (int) s->img_y; ++j) { for (i=0; i < (int) s->img_x; i += 2) { @@ -3131,7 +4722,7 @@ static stbi_uc *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int easy = 2; } if (!easy) { - if (!mr || !mg || !mb) { free(out); return stbi__errpuc("bad masks", "Corrupt BMP"); } + if (!mr || !mg || !mb) { STBI_FREE(out); return stbi__errpuc("bad masks", "Corrupt BMP"); } // right shift amt to put high bit in position #7 rshift = stbi__high_bit(mr)-7; rcount = stbi__bitcount(mr); gshift = stbi__high_bit(mg)-7; gcount = stbi__bitcount(mg); @@ -3151,13 +4742,13 @@ static stbi_uc *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int } } else { for (i=0; i < (int) s->img_x; ++i) { - stbi__uint32 v = (stbi__uint32) (bpp == 16 ? stbi__get16le(s) : stbi__get32le(s)); + stbi__uint32 v = (bpp == 16 ? (stbi__uint32) stbi__get16le(s) : stbi__get32le(s)); int a; out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mr, rshift, rcount)); out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mg, gshift, gcount)); out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mb, bshift, bcount)); a = (ma ? stbi__shiftsigned(v & ma, ashift, acount) : 255); - if (target == 4) out[z++] = STBI__BYTECAST(a); + if (target == 4) out[z++] = STBI__BYTECAST(a); } } stbi__skip(s, pad); @@ -3184,10 +4775,11 @@ static stbi_uc *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int if (comp) *comp = s->img_n; return out; } +#endif // Targa Truevision - TGA // by Jonathan Dummer - +#ifndef STBI_NO_TGA static int stbi__tga_info(stbi__context *s, int *x, int *y, int *comp) { int tga_w, tga_h, tga_comp; @@ -3307,7 +4899,7 @@ static stbi_uc *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int *y = tga_height; if (comp) *comp = tga_comp; - tga_data = (unsigned char*)malloc( tga_width * tga_height * tga_comp ); + tga_data = (unsigned char*)stbi__malloc( (size_t)tga_width * tga_height * tga_comp ); if (!tga_data) return stbi__errpuc("outofmem", "Out of memory"); // skip to the data's starting position (offset usually = 0) @@ -3326,14 +4918,14 @@ static stbi_uc *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int // any data to skip? (offset usually = 0) stbi__skip(s, tga_palette_start ); // load the palette - tga_palette = (unsigned char*)malloc( tga_palette_len * tga_palette_bits / 8 ); + tga_palette = (unsigned char*)stbi__malloc( tga_palette_len * tga_palette_bits / 8 ); if (!tga_palette) { - free(tga_data); + STBI_FREE(tga_data); return stbi__errpuc("outofmem", "Out of memory"); } if (!stbi__getn(s, tga_palette, tga_palette_len * tga_palette_bits / 8 )) { - free(tga_data); - free(tga_palette); + STBI_FREE(tga_data); + STBI_FREE(tga_palette); return stbi__errpuc("bad palette", "Corrupt TGA"); } } @@ -3415,7 +5007,7 @@ static stbi_uc *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int // clear my palette, if I had one if ( tga_palette != NULL ) { - free( tga_palette ); + STBI_FREE( tga_palette ); } } @@ -3443,10 +5035,12 @@ static stbi_uc *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int // OK, done return tga_data; } +#endif // ************************************************************************************************* // Photoshop PSD loader -- PD by Thatcher Ulrich, integration by Nicolas Schulz, tweaked by STB +#ifndef STBI_NO_PSD static int stbi__psd_test(stbi__context *s) { int r = (stbi__get32be(s) == 0x38425053); @@ -3481,7 +5075,7 @@ static stbi_uc *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int // Read the rows and columns of the image. h = stbi__get32be(s); w = stbi__get32be(s); - + // Make sure the depth is 8 bits. if (stbi__get16be(s) != 8) return stbi__errpuc("unsupported bit depth", "PSD bit depth is not 8 bit"); @@ -3517,13 +5111,13 @@ static stbi_uc *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int return stbi__errpuc("bad compression", "PSD has an unknown compression format"); // Create the destination image. - out = (stbi_uc *) malloc(4 * w*h); + out = (stbi_uc *) stbi__malloc(4 * w*h); if (!out) return stbi__errpuc("outofmem", "Out of memory"); pixelCount = w*h; // Initialize the data to zero. //memset( out, 0, pixelCount * 4 ); - + // Finally, the image data. if (compression) { // RLE as used by .PSD and .TIFF @@ -3541,7 +5135,7 @@ static stbi_uc *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int // Read the RLE data by channel. for (channel = 0; channel < 4; channel++) { stbi_uc *p; - + p = out+channel; if (channel >= channelCount) { // Fill this channel with default data. @@ -3579,15 +5173,15 @@ static stbi_uc *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int } } } - + } else { // We're at the raw image data. It's each channel in order (Red, Green, Blue, Alpha, ...) // where each channel consists of an 8-bit value for each pixel in the image. - + // Read the data by channel. for (channel = 0; channel < 4; channel++) { stbi_uc *p; - + p = out + channel; if (channel > channelCount) { // Fill this channel with default data. @@ -3608,9 +5202,10 @@ static stbi_uc *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int if (comp) *comp = channelCount; *y = h; *x = w; - + return out; } +#endif // ************************************************************************************************* // Softimage PIC loader @@ -3619,6 +5214,7 @@ static stbi_uc *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int // See http://softimage.wiki.softimage.com/index.php/INFO:_PIC_file_format // See http://ozviz.wasp.uwa.edu.au/~pbourke/dataformats/softimagepic/ +#ifndef STBI_NO_PIC static int stbi__pic_is4(stbi__context *s,const char *str) { int i; @@ -3802,11 +5398,11 @@ static stbi_uc *stbi__pic_load(stbi__context *s,int *px,int *py,int *comp,int re stbi__get16be(s); //skip `pad' // intermediate buffer is RGBA - result = (stbi_uc *) malloc(x*y*4); + result = (stbi_uc *) stbi__malloc(x*y*4); memset(result, 0xff, x*y*4); if (!stbi__pic_load_core(s,x,y,comp, result)) { - free(result); + STBI_FREE(result); result=0; } *px = x; @@ -3823,10 +5419,13 @@ static int stbi__pic_test(stbi__context *s) stbi__rewind(s); return r; } +#endif // ************************************************************************************************* // GIF loader -- public domain by Jean-Marc Lienher -- simplified/shrunk by stb -typedef struct + +#ifndef STBI_NO_GIF +typedef struct { stbi__int16 prefix; stbi_uc first; @@ -3874,8 +5473,8 @@ static void stbi__gif_parse_colortable(stbi__context *s, stbi_uc pal[256][4], in pal[i][2] = stbi__get8(s); pal[i][1] = stbi__get8(s); pal[i][0] = stbi__get8(s); - pal[i][3] = transp ? 0 : 255; - } + pal[i][3] = transp == i ? 0 : 255; + } } static int stbi__gif_header(stbi__context *s, stbi__gif *g, int *comp, int is_info) @@ -3886,8 +5485,8 @@ static int stbi__gif_header(stbi__context *s, stbi__gif *g, int *comp, int is_in version = stbi__get8(s); if (version != '7' && version != '9') return stbi__err("not GIF", "Corrupt GIF"); - if (stbi__get8(s) != 'a') return stbi__err("not GIF", "Corrupt GIF"); - + if (stbi__get8(s) != 'a') return stbi__err("not GIF", "Corrupt GIF"); + stbi__g_failure_reason = ""; g->w = stbi__get16le(s); g->h = stbi__get16le(s); @@ -3908,7 +5507,7 @@ static int stbi__gif_header(stbi__context *s, stbi__gif *g, int *comp, int is_in static int stbi__gif_info_raw(stbi__context *s, int *x, int *y, int *comp) { - stbi__gif g; + stbi__gif g; if (!stbi__gif_header(s, &g, comp, 1)) { stbi__rewind( s ); return 0; @@ -3928,7 +5527,7 @@ static void stbi__out_gif_code(stbi__gif *g, stbi__uint16 code) stbi__out_gif_code(g, g->codes[code].prefix); if (g->cur_y >= g->max_y) return; - + p = &g->out[g->cur_x + g->cur_y]; c = &g->color_table[g->codes[code].suffix * 4]; @@ -3961,6 +5560,7 @@ static stbi_uc *stbi__process_gif_raster(stbi__context *s, stbi__gif *g) stbi__gif_lzw *p; lzw_cs = stbi__get8(s); + if (lzw_cs > 12) return NULL; clear = 1 << lzw_cs; first = 1; codesize = lzw_cs + 1; @@ -3982,7 +5582,7 @@ static stbi_uc *stbi__process_gif_raster(stbi__context *s, stbi__gif *g) if (valid_bits < codesize) { if (len == 0) { len = stbi__get8(s); // start new block - if (len == 0) + if (len == 0) return g->out; } --len; @@ -4027,7 +5627,7 @@ static stbi_uc *stbi__process_gif_raster(stbi__context *s, stbi__gif *g) } else { return stbi__errpuc("illegal code in raster", "Corrupt GIF"); } - } + } } } @@ -4053,19 +5653,19 @@ static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g, int *comp, i if (g->out == 0) { if (!stbi__gif_header(s, g, comp,0)) return 0; // stbi__g_failure_reason set by stbi__gif_header - g->out = (stbi_uc *) malloc(4 * g->w * g->h); + g->out = (stbi_uc *) stbi__malloc(4 * g->w * g->h); if (g->out == 0) return stbi__errpuc("outofmem", "Out of memory"); stbi__fill_gif_background(g); } else { // animated-gif-only path if (((g->eflags & 0x1C) >> 2) == 3) { old_out = g->out; - g->out = (stbi_uc *) malloc(4 * g->w * g->h); + g->out = (stbi_uc *) stbi__malloc(4 * g->w * g->h); if (g->out == 0) return stbi__errpuc("outofmem", "Out of memory"); memcpy(g->out, old_out, g->w*g->h*4); } } - + for (;;) { switch (stbi__get8(s)) { case 0x2C: /* Image Descriptor */ @@ -4100,16 +5700,16 @@ static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g, int *comp, i if (g->lflags & 0x80) { stbi__gif_parse_colortable(s,g->lpal, 2 << (g->lflags & 7), g->eflags & 0x01 ? g->transparent : -1); - g->color_table = (stbi_uc *) g->lpal; + g->color_table = (stbi_uc *) g->lpal; } else if (g->flags & 0x80) { for (i=0; i < 256; ++i) // @OPTIMIZE: stbi__jpeg_reset only the previous transparent - g->pal[i][3] = 255; + g->pal[i][3] = 255; if (g->transparent >= 0 && (g->eflags & 0x01)) g->pal[g->transparent][3] = 0; g->color_table = (stbi_uc *) g->pal; } else return stbi__errpuc("missing color table", "Corrupt GIF"); - + o = stbi__process_gif_raster(s, g); if (o == NULL) return NULL; @@ -4166,7 +5766,7 @@ static int stbi__gif_info(stbi__context *s, int *x, int *y, int *comp) { return stbi__gif_info_raw(s,x,y,comp); } - +#endif // ************************************************************************************************* // Radiance RGBE HDR loader @@ -4255,7 +5855,7 @@ static float *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int re // Check identifier if (strcmp(stbi__hdr_gettoken(s,buffer), "#?RADIANCE") != 0) return stbi__errpf("not HDR", "Corrupt HDR image"); - + // Parse header for(;;) { token = stbi__hdr_gettoken(s,buffer); @@ -4283,7 +5883,7 @@ static float *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int re if (req_comp == 0) req_comp = 3; // Read data - hdr_data = (float *) malloc(height * width * req_comp * sizeof(float)); + hdr_data = (float *) stbi__malloc(height * width * req_comp * sizeof(float)); // Load image data // image data is stored as some number of sca @@ -4316,14 +5916,14 @@ static float *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int re stbi__hdr_convert(hdr_data, rgbe, req_comp); i = 1; j = 0; - free(scanline); + STBI_FREE(scanline); goto main_decode_loop; // yes, this makes no sense } len <<= 8; len |= stbi__get8(s); - if (len != width) { free(hdr_data); free(scanline); return stbi__errpf("invalid decoded scanline length", "corrupt HDR"); } - if (scanline == NULL) scanline = (stbi_uc *) malloc(width * 4); - + if (len != width) { STBI_FREE(hdr_data); STBI_FREE(scanline); return stbi__errpf("invalid decoded scanline length", "corrupt HDR"); } + if (scanline == NULL) scanline = (stbi_uc *) stbi__malloc(width * 4); + for (k = 0; k < 4; ++k) { i = 0; while (i < width) { @@ -4344,7 +5944,7 @@ static float *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int re for (i=0; i < width; ++i) stbi__hdr_convert(hdr_data+(j*width + i)*req_comp, scanline + i*4, req_comp); } - free(scanline); + STBI_FREE(scanline); } return hdr_data; @@ -4390,6 +5990,7 @@ static int stbi__hdr_info(stbi__context *s, int *x, int *y, int *comp) } #endif // STBI_NO_HDR +#ifndef STBI_NO_BMP static int stbi__bmp_info(stbi__context *s, int *x, int *y, int *comp) { int hsz; @@ -4417,7 +6018,9 @@ static int stbi__bmp_info(stbi__context *s, int *x, int *y, int *comp) *comp = stbi__get16le(s) / 8; return 1; } +#endif +#ifndef STBI_NO_PSD static int stbi__psd_info(stbi__context *s, int *x, int *y, int *comp) { int channelCount; @@ -4448,7 +6051,9 @@ static int stbi__psd_info(stbi__context *s, int *x, int *y, int *comp) *comp = 4; return 1; } +#endif +#ifndef STBI_NO_PIC static int stbi__pic_info(stbi__context *s, int *x, int *y, int *comp) { int act_comp=0,num_packets=0,chained; @@ -4493,28 +6098,156 @@ static int stbi__pic_info(stbi__context *s, int *x, int *y, int *comp) return 1; } +#endif + +// ************************************************************************************************* +// Portable Gray Map and Portable Pixel Map loader +// by Ken Miller +// +// PGM: http://netpbm.sourceforge.net/doc/pgm.html +// PPM: http://netpbm.sourceforge.net/doc/ppm.html +// +// Known limitations: +// Does not support comments in the header section +// Does not support ASCII image data (formats P2 and P3) +// Does not support 16-bit-per-channel + +#ifndef STBI_NO_PNM + +static int stbi__pnm_test(stbi__context *s) +{ + char p, t; + p = (char) stbi__get8(s); + t = (char) stbi__get8(s); + if (p != 'P' || (t != '5' && t != '6')) { + stbi__rewind( s ); + return 0; + } + return 1; +} + +static stbi_uc *stbi__pnm_load(stbi__context *s, int *x, int *y, int *comp, int req_comp) +{ + stbi_uc *out; + if (!stbi__pnm_info(s, (int *)&s->img_x, (int *)&s->img_y, (int *)&s->img_n)) + return 0; + *x = s->img_x; + *y = s->img_y; + *comp = s->img_n; + + out = (stbi_uc *) stbi__malloc(s->img_n * s->img_x * s->img_y); + if (!out) return stbi__errpuc("outofmem", "Out of memory"); + stbi__getn(s, out, s->img_n * s->img_x * s->img_y); + + if (req_comp && req_comp != s->img_n) { + out = stbi__convert_format(out, s->img_n, req_comp, s->img_x, s->img_y); + if (out == NULL) return out; // stbi__convert_format frees input on failure + } + return out; +} + +static int stbi__pnm_isspace(char c) +{ + return c == ' ' || c == '\t' || c == '\n' || c == '\v' || c == '\f' || c == '\r'; +} + +static void stbi__pnm_skip_whitespace(stbi__context *s, char *c) +{ + while (!stbi__at_eof(s) && stbi__pnm_isspace(*c)) + *c = (char) stbi__get8(s); +} + +static int stbi__pnm_isdigit(char c) +{ + return c >= '0' && c <= '9'; +} + +static int stbi__pnm_getinteger(stbi__context *s, char *c) +{ + int value = 0; + + while (!stbi__at_eof(s) && stbi__pnm_isdigit(*c)) { + value = value*10 + (*c - '0'); + *c = (char) stbi__get8(s); + } + + return value; +} + +static int stbi__pnm_info(stbi__context *s, int *x, int *y, int *comp) +{ + int maxv; + char c, p, t; + + stbi__rewind( s ); + + // Get identifier + p = (char) stbi__get8(s); + t = (char) stbi__get8(s); + if (p != 'P' || (t != '5' && t != '6')) { + stbi__rewind( s ); + return 0; + } + + *comp = (t == '6') ? 3 : 1; // '5' is 1-component .pgm; '6' is 3-component .ppm + + c = (char) stbi__get8(s); + stbi__pnm_skip_whitespace(s, &c); + + *x = stbi__pnm_getinteger(s, &c); // read width + stbi__pnm_skip_whitespace(s, &c); + + *y = stbi__pnm_getinteger(s, &c); // read height + stbi__pnm_skip_whitespace(s, &c); + + maxv = stbi__pnm_getinteger(s, &c); // read max value + + if (maxv > 255) + return stbi__err("max value > 255", "PPM image not 8-bit"); + else + return 1; +} +#endif static int stbi__info_main(stbi__context *s, int *x, int *y, int *comp) { - if (stbi__jpeg_info(s, x, y, comp)) - return 1; - if (stbi__png_info(s, x, y, comp)) - return 1; - if (stbi__gif_info(s, x, y, comp)) - return 1; - if (stbi__bmp_info(s, x, y, comp)) - return 1; - if (stbi__psd_info(s, x, y, comp)) - return 1; - if (stbi__pic_info(s, x, y, comp)) - return 1; - #ifndef STBI_NO_HDR - if (stbi__hdr_info(s, x, y, comp)) - return 1; + #ifndef STBI_NO_JPEG + if (stbi__jpeg_info(s, x, y, comp)) return 1; #endif + + #ifndef STBI_NO_PNG + if (stbi__png_info(s, x, y, comp)) return 1; + #endif + + #ifndef STBI_NO_GIF + if (stbi__gif_info(s, x, y, comp)) return 1; + #endif + + #ifndef STBI_NO_BMP + if (stbi__bmp_info(s, x, y, comp)) return 1; + #endif + + #ifndef STBI_NO_PSD + if (stbi__psd_info(s, x, y, comp)) return 1; + #endif + + #ifndef STBI_NO_PIC + if (stbi__pic_info(s, x, y, comp)) return 1; + #endif + + #ifndef STBI_NO_PNM + if (stbi__pnm_info(s, x, y, comp)) return 1; + #endif + + #ifndef STBI_NO_HDR + if (stbi__hdr_info(s, x, y, comp)) return 1; + #endif + // test tga last because it's a crappy test! + #ifndef STBI_NO_TGA if (stbi__tga_info(s, x, y, comp)) return 1; + #endif return stbi__err("unknown image type", "Image not of any known type, or corrupt"); } @@ -4559,117 +6292,142 @@ STBIDEF int stbi_info_from_callbacks(stbi_io_callbacks const *c, void *user, int /* revision history: - 1.43 (2014-07-15) - fix MSVC-only compiler problem in code changed in 1.42 - 1.42 (2014-07-09) - don't define _CRT_SECURE_NO_WARNINGS (affects user code) - fixes to stbi__cleanup_jpeg path - added STBI_ASSERT to avoid requiring assert.h - 1.41 (2014-06-25) - fix search&replace from 1.36 that messed up comments/error messages - 1.40 (2014-06-22) - fix gcc struct-initialization warning - 1.39 (2014-06-15) - fix to TGA optimization when req_comp != number of components in TGA; - fix to GIF loading because BMP wasn't rewinding (whoops, no GIFs in my test suite) - add support for BMP version 5 (more ignored fields) - 1.38 (2014-06-06) - suppress MSVC warnings on integer casts truncating values - fix accidental rename of 'skip' field of I/O - 1.37 (2014-06-04) - remove duplicate typedef - 1.36 (2014-06-03) - convert to header file single-file library - if de-iphone isn't set, load iphone images color-swapped instead of returning NULL - 1.35 (2014-05-27) - various warnings - fix broken STBI_SIMD path - fix bug where stbi_load_from_file no longer left file pointer in correct place - fix broken non-easy path for 32-bit BMP (possibly never used) - TGA optimization by Arseny Kapoulkine - 1.34 (unknown) - use STBI_NOTUSED in stbi__resample_row_generic(), fix one more leak in tga failure case - 1.33 (2011-07-14) - make stbi_is_hdr work in STBI_NO_HDR (as specified), minor compiler-friendly improvements - 1.32 (2011-07-13) - support for "info" function for all supported filetypes (SpartanJ) - 1.31 (2011-06-20) - a few more leak fixes, bug in PNG handling (SpartanJ) - 1.30 (2011-06-11) - added ability to load files via callbacks to accomidate custom input streams (Ben Wenger) - removed deprecated format-specific test/load functions - removed support for installable file formats (stbi_loader) -- would have been broken for IO callbacks anyway - error cases in bmp and tga give messages and don't leak (Raymond Barbiero, grisha) - fix inefficiency in decoding 32-bit BMP (David Woo) - 1.29 (2010-08-16) - various warning fixes from Aurelien Pocheville - 1.28 (2010-08-01) - fix bug in GIF palette transparency (SpartanJ) - 1.27 (2010-08-01) - cast-to-stbi_uc to fix warnings - 1.26 (2010-07-24) - fix bug in file buffering for PNG reported by SpartanJ - 1.25 (2010-07-17) - refix trans_data warning (Won Chun) - 1.24 (2010-07-12) - perf improvements reading from files on platforms with lock-heavy fgetc() - minor perf improvements for jpeg - deprecated type-specific functions so we'll get feedback if they're needed - attempt to fix trans_data warning (Won Chun) - 1.23 fixed bug in iPhone support - 1.22 (2010-07-10) - removed image *writing* support - stbi_info support from Jetro Lauha - GIF support from Jean-Marc Lienher - iPhone PNG-extensions from James Brown - warning-fixes from Nicolas Schulz and Janez Zemva (i.stbi__err. Janez (U+017D)emva) - 1.21 fix use of 'stbi_uc' in header (reported by jon blow) - 1.20 added support for Softimage PIC, by Tom Seddon - 1.19 bug in interlaced PNG corruption check (found by ryg) - 1.18 2008-08-02 - fix a threading bug (local mutable static) - 1.17 support interlaced PNG - 1.16 major bugfix - stbi__convert_format converted one too many pixels - 1.15 initialize some fields for thread safety - 1.14 fix threadsafe conversion bug - header-file-only version (#define STBI_HEADER_FILE_ONLY before including) - 1.13 threadsafe - 1.12 const qualifiers in the API - 1.11 Support installable IDCT, colorspace conversion routines - 1.10 Fixes for 64-bit (don't use "unsigned long") - optimized upsampling by Fabian "ryg" Giesen - 1.09 Fix format-conversion for PSD code (bad global variables!) - 1.08 Thatcher Ulrich's PSD code integrated by Nicolas Schulz - 1.07 attempt to fix C++ warning/errors again - 1.06 attempt to fix C++ warning/errors again - 1.05 fix TGA loading to return correct *comp and use good luminance calc - 1.04 default float alpha is 1, not 255; use 'void *' for stbi_image_free - 1.03 bugfixes to STBI_NO_STDIO, STBI_NO_HDR - 1.02 support for (subset of) HDR files, float interface for preferred access to them - 1.01 fix bug: possible bug in handling right-side up bmps... not sure - fix bug: the stbi__bmp_load() and stbi__tga_load() functions didn't work at all - 1.00 interface to zlib that skips zlib header - 0.99 correct handling of alpha in palette - 0.98 TGA loader by lonesock; dynamically add loaders (untested) - 0.97 jpeg errors on too large a file; also catch another malloc failure - 0.96 fix detection of invalid v value - particleman@mollyrocket forum - 0.95 during header scan, seek to markers in case of padding - 0.94 STBI_NO_STDIO to disable stdio usage; rename all #defines the same - 0.93 handle jpegtran output; verbose errors - 0.92 read 4,8,16,24,32-bit BMP files of several formats - 0.91 output 24-bit Windows 3.0 BMP files - 0.90 fix a few more warnings; bump version number to approach 1.0 - 0.61 bugfixes due to Marc LeBlanc, Christopher Lloyd - 0.60 fix compiling as c++ - 0.59 fix warnings: merge Dave Moore's -Wall fixes - 0.58 fix bug: zlib uncompressed mode len/nlen was wrong endian - 0.57 fix bug: jpg last huffman symbol before marker was >9 bits but less than 16 available - 0.56 fix bug: zlib uncompressed mode len vs. nlen - 0.55 fix bug: restart_interval not initialized to 0 - 0.54 allow NULL for 'int *comp' - 0.53 fix bug in png 3->4; speedup png decoding - 0.52 png handles req_comp=3,4 directly; minor cleanup; jpeg comments - 0.51 obey req_comp requests, 1-component jpegs return as 1-component, - on 'test' only check type, not whether we support this variant - 0.50 first released version + 2.05 (2015-04-19) fix bug in progressive JPEG handling, fix warning + 2.04 (2015-04-15) try to re-enable SIMD on MinGW 64-bit + 2.03 (2015-04-12) extra corruption checking (mmozeiko) + stbi_set_flip_vertically_on_load (nguillemot) + fix NEON support; fix mingw support + 2.02 (2015-01-19) fix incorrect assert, fix warning + 2.01 (2015-01-17) fix various warnings; suppress SIMD on gcc 32-bit without -msse2 + 2.00b (2014-12-25) fix STBI_MALLOC in progressive JPEG + 2.00 (2014-12-25) optimize JPG, including x86 SSE2 & NEON SIMD (ryg) + progressive JPEG (stb) + PGM/PPM support (Ken Miller) + STBI_MALLOC,STBI_REALLOC,STBI_FREE + GIF bugfix -- seemingly never worked + STBI_NO_*, STBI_ONLY_* + 1.48 (2014-12-14) fix incorrectly-named assert() + 1.47 (2014-12-14) 1/2/4-bit PNG support, both direct and paletted (Omar Cornut & stb) + optimize PNG (ryg) + fix bug in interlaced PNG with user-specified channel count (stb) + 1.46 (2014-08-26) + fix broken tRNS chunk (colorkey-style transparency) in non-paletted PNG + 1.45 (2014-08-16) + fix MSVC-ARM internal compiler error by wrapping malloc + 1.44 (2014-08-07) + various warning fixes from Ronny Chevalier + 1.43 (2014-07-15) + fix MSVC-only compiler problem in code changed in 1.42 + 1.42 (2014-07-09) + don't define _CRT_SECURE_NO_WARNINGS (affects user code) + fixes to stbi__cleanup_jpeg path + added STBI_ASSERT to avoid requiring assert.h + 1.41 (2014-06-25) + fix search&replace from 1.36 that messed up comments/error messages + 1.40 (2014-06-22) + fix gcc struct-initialization warning + 1.39 (2014-06-15) + fix to TGA optimization when req_comp != number of components in TGA; + fix to GIF loading because BMP wasn't rewinding (whoops, no GIFs in my test suite) + add support for BMP version 5 (more ignored fields) + 1.38 (2014-06-06) + suppress MSVC warnings on integer casts truncating values + fix accidental rename of 'skip' field of I/O + 1.37 (2014-06-04) + remove duplicate typedef + 1.36 (2014-06-03) + convert to header file single-file library + if de-iphone isn't set, load iphone images color-swapped instead of returning NULL + 1.35 (2014-05-27) + various warnings + fix broken STBI_SIMD path + fix bug where stbi_load_from_file no longer left file pointer in correct place + fix broken non-easy path for 32-bit BMP (possibly never used) + TGA optimization by Arseny Kapoulkine + 1.34 (unknown) + use STBI_NOTUSED in stbi__resample_row_generic(), fix one more leak in tga failure case + 1.33 (2011-07-14) + make stbi_is_hdr work in STBI_NO_HDR (as specified), minor compiler-friendly improvements + 1.32 (2011-07-13) + support for "info" function for all supported filetypes (SpartanJ) + 1.31 (2011-06-20) + a few more leak fixes, bug in PNG handling (SpartanJ) + 1.30 (2011-06-11) + added ability to load files via callbacks to accomidate custom input streams (Ben Wenger) + removed deprecated format-specific test/load functions + removed support for installable file formats (stbi_loader) -- would have been broken for IO callbacks anyway + error cases in bmp and tga give messages and don't leak (Raymond Barbiero, grisha) + fix inefficiency in decoding 32-bit BMP (David Woo) + 1.29 (2010-08-16) + various warning fixes from Aurelien Pocheville + 1.28 (2010-08-01) + fix bug in GIF palette transparency (SpartanJ) + 1.27 (2010-08-01) + cast-to-stbi_uc to fix warnings + 1.26 (2010-07-24) + fix bug in file buffering for PNG reported by SpartanJ + 1.25 (2010-07-17) + refix trans_data warning (Won Chun) + 1.24 (2010-07-12) + perf improvements reading from files on platforms with lock-heavy fgetc() + minor perf improvements for jpeg + deprecated type-specific functions so we'll get feedback if they're needed + attempt to fix trans_data warning (Won Chun) + 1.23 fixed bug in iPhone support + 1.22 (2010-07-10) + removed image *writing* support + stbi_info support from Jetro Lauha + GIF support from Jean-Marc Lienher + iPhone PNG-extensions from James Brown + warning-fixes from Nicolas Schulz and Janez Zemva (i.stbi__err. Janez (U+017D)emva) + 1.21 fix use of 'stbi_uc' in header (reported by jon blow) + 1.20 added support for Softimage PIC, by Tom Seddon + 1.19 bug in interlaced PNG corruption check (found by ryg) + 1.18 (2008-08-02) + fix a threading bug (local mutable static) + 1.17 support interlaced PNG + 1.16 major bugfix - stbi__convert_format converted one too many pixels + 1.15 initialize some fields for thread safety + 1.14 fix threadsafe conversion bug + header-file-only version (#define STBI_HEADER_FILE_ONLY before including) + 1.13 threadsafe + 1.12 const qualifiers in the API + 1.11 Support installable IDCT, colorspace conversion routines + 1.10 Fixes for 64-bit (don't use "unsigned long") + optimized upsampling by Fabian "ryg" Giesen + 1.09 Fix format-conversion for PSD code (bad global variables!) + 1.08 Thatcher Ulrich's PSD code integrated by Nicolas Schulz + 1.07 attempt to fix C++ warning/errors again + 1.06 attempt to fix C++ warning/errors again + 1.05 fix TGA loading to return correct *comp and use good luminance calc + 1.04 default float alpha is 1, not 255; use 'void *' for stbi_image_free + 1.03 bugfixes to STBI_NO_STDIO, STBI_NO_HDR + 1.02 support for (subset of) HDR files, float interface for preferred access to them + 1.01 fix bug: possible bug in handling right-side up bmps... not sure + fix bug: the stbi__bmp_load() and stbi__tga_load() functions didn't work at all + 1.00 interface to zlib that skips zlib header + 0.99 correct handling of alpha in palette + 0.98 TGA loader by lonesock; dynamically add loaders (untested) + 0.97 jpeg errors on too large a file; also catch another malloc failure + 0.96 fix detection of invalid v value - particleman@mollyrocket forum + 0.95 during header scan, seek to markers in case of padding + 0.94 STBI_NO_STDIO to disable stdio usage; rename all #defines the same + 0.93 handle jpegtran output; verbose errors + 0.92 read 4,8,16,24,32-bit BMP files of several formats + 0.91 output 24-bit Windows 3.0 BMP files + 0.90 fix a few more warnings; bump version number to approach 1.0 + 0.61 bugfixes due to Marc LeBlanc, Christopher Lloyd + 0.60 fix compiling as c++ + 0.59 fix warnings: merge Dave Moore's -Wall fixes + 0.58 fix bug: zlib uncompressed mode len/nlen was wrong endian + 0.57 fix bug: jpg last huffman symbol before marker was >9 bits but less than 16 available + 0.56 fix bug: zlib uncompressed mode len vs. nlen + 0.55 fix bug: restart_interval not initialized to 0 + 0.54 allow NULL for 'int *comp' + 0.53 fix bug in png 3->4; speedup png decoding + 0.52 png handles req_comp=3,4 directly; minor cleanup; jpeg comments + 0.51 obey req_comp requests, 1-component jpegs return as 1-component, + on 'test' only check type, not whether we support this variant + 0.50 (2006-11-19) + first released version */ diff --git a/jni/love/src/love.cpp b/jni/love/src/love.cpp index 36cd32a4..f7701f60 100644 --- a/jni/love/src/love.cpp +++ b/jni/love/src/love.cpp @@ -41,9 +41,13 @@ extern "C" { #endif // LOVE_WINDOWS #ifdef LOVE_MACOSX -#include "OSX.h" +#include "common/OSX.h" #endif // LOVE_MACOSX +#ifdef LOVE_IOS +#include "common/iOS.h" +#endif + #ifdef LOVE_WINDOWS extern "C" { @@ -53,7 +57,7 @@ extern "C" // systems is less mediocre? LOVE_EXPORT DWORD NvOptimusEnablement = 0x00000001; } -#endif +#endif // LOVE_WINDOWS #ifdef LOVE_LEGENDARY_UTF8_ARGV_HACK @@ -106,6 +110,7 @@ static void get_app_arguments(int argc, char **argv, int &new_argc, char **&new_ temp_argv.push_back(std::string(argv[i])); } +#ifdef LOVE_MACOSX // Check for a drop file string. std::string dropfilestr = love::osx::checkDropEvents(); if (!dropfilestr.empty()) @@ -113,15 +118,24 @@ static void get_app_arguments(int argc, char **argv, int &new_argc, char **&new_ temp_argv.insert(temp_argv.begin() + 1, dropfilestr); } else +#endif { // If it exists, add the love file in love.app/Contents/Resources/ to argv. - std::string loveResourcesPath = love::osx::getLoveInResources(); + std::string loveResourcesPath; + bool fused = true; +#if defined(LOVE_MACOSX) + loveResourcesPath = love::osx::getLoveInResources(); +#elif defined(LOVE_IOS) + loveResourcesPath = love::ios::getLoveInResources(fused); +#endif if (!loveResourcesPath.empty()) { - // Run in pseudo-fused mode. std::vector::iterator it = temp_argv.begin(); it = temp_argv.insert(it + 1, loveResourcesPath); - temp_argv.insert(it + 1, std::string("--fused")); + + // Run in pseudo-fused mode. + if (fused) + temp_argv.insert(it + 1, std::string("--fused")); } } @@ -190,10 +204,25 @@ static int l_print_sdl_log (lua_State *L) { int main(int argc, char **argv) { + int retval = 0; + #ifdef LOVE_ANDROID SDL_SetHint("LOVE_GRAPHICS_USE_OPENGLES", "1"); #endif +#ifdef LOVE_IOS + int orig_argc = argc; + char **orig_argv = argv; + + // on iOS we should never programmatically exit the app, so we'll just + // "restart" when that is attempted. Games which use threads might cause + // some issues if the threads aren't cleaned up properly... + while (true) + { + argc = orig_argc; + argv = orig_argv; +#endif + #ifdef LOVE_LEGENDARY_UTF8_ARGV_HACK int hack_argc = 0; char **hack_argv = 0; get_utf8_arguments(hack_argc, hack_argv); @@ -285,7 +314,6 @@ int main(int argc, char **argv) // Call the returned boot function. lua_call(L, 0, 1); - int retval = 0; if (lua_isnumber(L, -1)) retval = (int) lua_tonumber(L, -1); @@ -299,7 +327,14 @@ int main(int argc, char **argv) delete [] hack_argv; } #endif // LOVE_LEGENDARY_UTF8_ARGV_HACK || LOVE_LEGENDARY_APP_ARGV_HACK + +#ifdef LOVE_IOS + } // while (true) +#endif + +#ifdef LOVE_ANDROID SDL_Quit(); +#endif return retval; } diff --git a/jni/love/src/modules/audio/Audio.cpp b/jni/love/src/modules/audio/Audio.cpp index 398cc787..070aa9d3 100644 --- a/jni/love/src/modules/audio/Audio.cpp +++ b/jni/love/src/modules/audio/Audio.cpp @@ -29,11 +29,11 @@ StringMap::Entry Audio::distance { {"none", Audio::DISTANCE_NONE}, {"inverse", Audio::DISTANCE_INVERSE}, - {"inverse clamped", Audio::DISTANCE_INVERSE_CLAMPED}, + {"inverseclamped", Audio::DISTANCE_INVERSE_CLAMPED}, {"linear", Audio::DISTANCE_LINEAR}, - {"linear clamped", Audio::DISTANCE_LINEAR_CLAMPED}, + {"linearclamped", Audio::DISTANCE_LINEAR_CLAMPED}, {"exponent", Audio::DISTANCE_EXPONENT}, - {"exponent clamped", Audio::DISTANCE_EXPONENT_CLAMPED} + {"exponentclamped", Audio::DISTANCE_EXPONENT_CLAMPED} }; StringMap Audio::distanceModels(Audio::distanceModelEntries, sizeof(Audio::distanceModelEntries)); diff --git a/jni/love/src/modules/audio/Source.cpp b/jni/love/src/modules/audio/Source.cpp index bc81f5f0..a0ac5565 100644 --- a/jni/love/src/modules/audio/Source.cpp +++ b/jni/love/src/modules/audio/Source.cpp @@ -34,6 +34,11 @@ Source::~Source() { } +Source::Type Source::getType() const +{ + return type; +} + bool Source::getConstant(const char *in, Type &out) { return types.find(in, out); diff --git a/jni/love/src/modules/audio/Source.h b/jni/love/src/modules/audio/Source.h index 1aab7363..4c0fef64 100644 --- a/jni/love/src/modules/audio/Source.h +++ b/jni/love/src/modules/audio/Source.h @@ -88,7 +88,6 @@ public: virtual void setLooping(bool looping) = 0; virtual bool isLooping() const = 0; - virtual bool isStatic() const = 0; virtual void setMinVolume(float volume) = 0; virtual float getMinVolume() const = 0; @@ -103,6 +102,7 @@ public: virtual float getMaxDistance() const = 0; virtual int getChannels() const = 0; + virtual Type getType() const; static bool getConstant(const char *in, Type &out); static bool getConstant(Type in, const char *&out); @@ -110,6 +110,7 @@ public: static bool getConstant(Unit in, const char *&out); protected: + Type type; private: diff --git a/jni/love/src/modules/audio/null/Source.cpp b/jni/love/src/modules/audio/null/Source.cpp index 0db59550..aa682a62 100644 --- a/jni/love/src/modules/audio/null/Source.cpp +++ b/jni/love/src/modules/audio/null/Source.cpp @@ -170,11 +170,6 @@ bool Source::isLooping() const return looping; } -bool Source::isStatic() const -{ - return (type == TYPE_STATIC); -} - void Source::setMinVolume(float volume) { this->minVolume = volume; diff --git a/jni/love/src/modules/audio/null/Source.h b/jni/love/src/modules/audio/null/Source.h index dcbe4714..bbab20a4 100644 --- a/jni/love/src/modules/audio/null/Source.h +++ b/jni/love/src/modules/audio/null/Source.h @@ -66,7 +66,6 @@ public: virtual bool isRelative() const; void setLooping(bool looping); bool isLooping() const; - bool isStatic() const; virtual void setMinVolume(float volume); virtual float getMinVolume() const; virtual void setMaxVolume(float volume); diff --git a/jni/love/src/modules/audio/openal/Audio.h b/jni/love/src/modules/audio/openal/Audio.h index 492e62c7..1540acdc 100644 --- a/jni/love/src/modules/audio/openal/Audio.h +++ b/jni/love/src/modules/audio/openal/Audio.h @@ -36,9 +36,14 @@ #include "thread/threads.h" // OpenAL -#ifdef LOVE_MACOSX_USE_FRAMEWORKS // Frameworks have different include paths. +#ifdef LOVE_APPLE_USE_FRAMEWORKS // Frameworks have different include paths. +#ifdef LOVE_IOS +#include +#include +#else #include #include +#endif #else #include #include diff --git a/jni/love/src/modules/audio/openal/Pool.cpp b/jni/love/src/modules/audio/openal/Pool.cpp index 7491c189..bec0d8c1 100644 --- a/jni/love/src/modules/audio/openal/Pool.cpp +++ b/jni/love/src/modules/audio/openal/Pool.cpp @@ -56,7 +56,9 @@ Pool::Pool() // Create the mutex. mutex = thread::newMutex(); +#ifdef AL_SOFT_direct_channels ALboolean hasext = alIsExtensionPresent("AL_SOFT_direct_channels"); +#endif // Make all sources available initially. for (int i = 0; i < totalSources; i++) @@ -126,7 +128,7 @@ void Pool::update() int Pool::getSourceCount() const { - return playing.size(); + return (int) playing.size(); } int Pool::getMaxSources() const @@ -180,6 +182,7 @@ void Pool::stop() for (const auto &i : playing) { i.first->stopAtomic(); + i.first->rewindAtomic(); i.first->release(); available.push(i.second); } diff --git a/jni/love/src/modules/audio/openal/Pool.h b/jni/love/src/modules/audio/openal/Pool.h index dc596012..eccf59c7 100644 --- a/jni/love/src/modules/audio/openal/Pool.h +++ b/jni/love/src/modules/audio/openal/Pool.h @@ -32,10 +32,17 @@ #include "thread/threads.h" // OpenAL -#ifdef LOVE_MACOSX_USE_FRAMEWORKS +#ifdef LOVE_APPLE_USE_FRAMEWORKS +#ifdef LOVE_IOS +#include +#include +#include +#include +#else #include #include #include +#endif #else #include #include diff --git a/jni/love/src/modules/audio/openal/Source.cpp b/jni/love/src/modules/audio/openal/Source.cpp index a1a89123..7132ad8f 100644 --- a/jni/love/src/modules/audio/openal/Source.cpp +++ b/jni/love/src/modules/audio/openal/Source.cpp @@ -25,6 +25,7 @@ // STD #include #include +#include namespace love { @@ -33,6 +34,13 @@ namespace audio namespace openal { +#ifdef LOVE_IOS +// OpenAL on iOS barfs if the max distance is +inf. +static const float MAX_ATTENUATION_DISTANCE = 1000000.0f; +#else +static const float MAX_ATTENUATION_DISTANCE = FLT_MAX; +#endif + class InvalidFormatException : public love::Exception { public: @@ -44,6 +52,18 @@ public: }; +class SpatialSupportException : public love::Exception +{ +public: + + SpatialSupportException() + : Exception("This spatial audio functionality is only available for mono Sources. \ +Ensure the Source is not multi-channel before calling this function.") + { + } + +}; + StaticDataBuffer::StaticDataBuffer(ALenum format, const ALvoid *data, ALsizei size, ALsizei freq) { alGenBuffers(1, &buffer); @@ -69,7 +89,7 @@ Source::Source(Pool *pool, love::sound::SoundData *soundData) , maxVolume(1.0f) , referenceDistance(1.0f) , rolloffFactor(1.0f) - , maxDistance(FLT_MAX) + , maxDistance(MAX_ATTENUATION_DISTANCE) , cone() , offsetSamples(0) , offsetSeconds(0) @@ -82,7 +102,7 @@ Source::Source(Pool *pool, love::sound::SoundData *soundData) if (fmt == 0) throw InvalidFormatException(soundData->getChannels(), soundData->getBitDepth()); - staticBuffer.set(new StaticDataBuffer(fmt, soundData->getData(), soundData->getSize(), soundData->getSampleRate())); + staticBuffer.set(new StaticDataBuffer(fmt, soundData->getData(), (ALsizei) soundData->getSize(), soundData->getSampleRate())); // The buffer has a +2 retain count right now, but we want it to have +1. staticBuffer->release(); @@ -108,7 +128,7 @@ Source::Source(Pool *pool, love::sound::Decoder *decoder) , maxVolume(1.0f) , referenceDistance(1.0f) , rolloffFactor(1.0f) - , maxDistance(FLT_MAX) + , maxDistance(MAX_ATTENUATION_DISTANCE) , cone() , offsetSamples(0) , offsetSeconds(0) @@ -245,13 +265,14 @@ bool Source::isPaused() const bool Source::isFinished() const { - return type == TYPE_STATIC ? isStopped() : isStopped() && !isLooping() && decoder->isFinished(); + return type == TYPE_STATIC ? isStopped() : (isStopped() && !isLooping() && decoder->isFinished()); } bool Source::update() { if (!valid) return false; + if (type == TYPE_STATIC) { // Looping mode could have changed. @@ -290,8 +311,10 @@ bool Source::update() streamAtomic(buffer, decoder.get()); alSourceQueueBuffers(source, 1, &buffer); } + return true; } + return false; } @@ -319,9 +342,7 @@ float Source::getPitch() const void Source::setVolume(float volume) { if (valid) - { alSourcef(source, AL_GAIN, volume); - } this->volume = volume; } @@ -354,9 +375,7 @@ void Source::seekAtomic(float offset, void *unit) decoder->seek(offset); } else - { alSourcef(source, AL_SAMPLE_OFFSET, offset); - } break; case Source::UNIT_SECONDS: default: @@ -367,9 +386,7 @@ void Source::seekAtomic(float offset, void *unit) offsetSamples = offset * decoder->getSampleRate(); } else - { alSourcef(source, AL_SEC_OFFSET, offset); - } break; } if (type == TYPE_STREAM) @@ -423,6 +440,9 @@ float Source::tell(Source::Unit unit) void Source::setPosition(float *v) { + if (channels > 1) + throw SpatialSupportException(); + if (valid) alSourcefv(source, AL_POSITION, v); @@ -431,6 +451,9 @@ void Source::setPosition(float *v) void Source::getPosition(float *v) const { + if (channels > 1) + throw SpatialSupportException(); + if (valid) alGetSourcefv(source, AL_POSITION, v); else @@ -439,6 +462,9 @@ void Source::getPosition(float *v) const void Source::setVelocity(float *v) { + if (channels > 1) + throw SpatialSupportException(); + if (valid) alSourcefv(source, AL_VELOCITY, v); @@ -447,6 +473,9 @@ void Source::setVelocity(float *v) void Source::getVelocity(float *v) const { + if (channels > 1) + throw SpatialSupportException(); + if (valid) alGetSourcefv(source, AL_VELOCITY, v); else @@ -455,6 +484,9 @@ void Source::getVelocity(float *v) const void Source::setDirection(float *v) { + if (channels > 1) + throw SpatialSupportException(); + if (valid) alSourcefv(source, AL_DIRECTION, v); else @@ -463,6 +495,9 @@ void Source::setDirection(float *v) void Source::getDirection(float *v) const { + if (channels > 1) + throw SpatialSupportException(); + if (valid) alGetSourcefv(source, AL_DIRECTION, v); else @@ -471,8 +506,11 @@ void Source::getDirection(float *v) const void Source::setCone(float innerAngle, float outerAngle, float outerVolume) { - cone.innerAngle = (int) LOVE_TODEG(innerAngle); - cone.outerAngle = (int) LOVE_TODEG(outerAngle); + if (channels > 1) + throw SpatialSupportException(); + + cone.innerAngle = (int) LOVE_TODEG(innerAngle); + cone.outerAngle = (int) LOVE_TODEG(outerAngle); cone.outerVolume = outerVolume; if (valid) @@ -485,13 +523,19 @@ void Source::setCone(float innerAngle, float outerAngle, float outerVolume) void Source::getCone(float &innerAngle, float &outerAngle, float &outerVolume) const { - innerAngle = LOVE_TORAD(cone.innerAngle); - outerAngle = LOVE_TORAD(cone.outerAngle); + if (channels > 1) + throw SpatialSupportException(); + + innerAngle = LOVE_TORAD(cone.innerAngle); + outerAngle = LOVE_TORAD(cone.outerAngle); outerVolume = cone.outerVolume; } void Source::setRelative(bool enable) { + if (channels > 1) + throw SpatialSupportException(); + if (valid) alSourcei(source, AL_SOURCE_RELATIVE, relative ? AL_TRUE : AL_FALSE); @@ -500,15 +544,18 @@ void Source::setRelative(bool enable) bool Source::isRelative() const { + if (channels > 1) + throw SpatialSupportException(); + return relative; } -void Source::setLooping(bool looping) +void Source::setLooping(bool enable) { if (valid && type == TYPE_STATIC) - alSourcei(source, AL_LOOPING, looping ? AL_TRUE : AL_FALSE); + alSourcei(source, AL_LOOPING, enable ? AL_TRUE : AL_FALSE); - this->looping = looping; + looping = enable; } bool Source::isLooping() const @@ -563,9 +610,7 @@ void Source::stopAtomic() if (valid) { if (type == TYPE_STATIC) - { alSourceStop(source); - } else if (type == TYPE_STREAM) { alSourceStop(source); @@ -578,8 +623,10 @@ void Source::stopAtomic() alSourceUnqueueBuffers(source, 1, &buffer); } } + alSourcei(source, AL_BUFFER, AL_NONE); } + toLoop = 0; valid = false; } @@ -644,7 +691,7 @@ void Source::reset() alSourcef(source, AL_REFERENCE_DISTANCE, referenceDistance); alSourcef(source, AL_ROLLOFF_FACTOR, rolloffFactor); alSourcef(source, AL_MAX_DISTANCE, maxDistance); - alSourcei(source, AL_LOOPING, isStatic() && isLooping() ? AL_TRUE : AL_FALSE); + alSourcei(source, AL_LOOPING, (type == TYPE_STATIC) && isLooping() ? AL_TRUE : AL_FALSE); alSourcei(source, AL_SOURCE_RELATIVE, relative ? AL_TRUE : AL_FALSE); alSourcei(source, AL_CONE_INNER_ANGLE, cone.innerAngle); alSourcei(source, AL_CONE_OUTER_ANGLE, cone.outerAngle); @@ -721,19 +768,12 @@ int Source::streamAtomic(ALuint buffer, love::sound::Decoder *d) return decoded; } -bool Source::isStatic() const -{ - return (type == TYPE_STATIC); -} - void Source::setMinVolume(float volume) { if (valid) - { alSourcef(source, AL_MIN_GAIN, volume); - } - this->minVolume = volume; + minVolume = volume; } float Source::getMinVolume() const @@ -752,11 +792,9 @@ float Source::getMinVolume() const void Source::setMaxVolume(float volume) { if (valid) - { alSourcef(source, AL_MAX_GAIN, volume); - } - this->maxVolume = volume; + maxVolume = volume; } float Source::getMaxVolume() const @@ -769,21 +807,25 @@ float Source::getMaxVolume() const } // In case the Source isn't playing. - return this->maxVolume; + return maxVolume; } void Source::setReferenceDistance(float distance) { - if (valid) - { - alSourcef(source, AL_REFERENCE_DISTANCE, distance); - } + if (channels > 1) + throw SpatialSupportException(); - this->referenceDistance = distance; + if (valid) + alSourcef(source, AL_REFERENCE_DISTANCE, distance); + + referenceDistance = distance; } float Source::getReferenceDistance() const { + if (channels > 1) + throw SpatialSupportException(); + if (valid) { ALfloat f; @@ -792,21 +834,25 @@ float Source::getReferenceDistance() const } // In case the Source isn't playing. - return this->referenceDistance; + return referenceDistance; } void Source::setRolloffFactor(float factor) { - if (valid) - { - alSourcef(source, AL_ROLLOFF_FACTOR, factor); - } + if (channels > 1) + throw SpatialSupportException(); - this->rolloffFactor = factor; + if (valid) + alSourcef(source, AL_ROLLOFF_FACTOR, factor); + + rolloffFactor = factor; } float Source::getRolloffFactor() const { + if (channels > 1) + throw SpatialSupportException(); + if (valid) { ALfloat f; @@ -815,21 +861,27 @@ float Source::getRolloffFactor() const } // In case the Source isn't playing. - return this->rolloffFactor; + return rolloffFactor; } void Source::setMaxDistance(float distance) { - if (valid) - { - alSourcef(source, AL_MAX_DISTANCE, distance); - } + if (channels > 1) + throw SpatialSupportException(); - this->maxDistance = distance; + distance = std::min(distance, MAX_ATTENUATION_DISTANCE); + + if (valid) + alSourcef(source, AL_MAX_DISTANCE, distance); + + maxDistance = distance; } float Source::getMaxDistance() const { + if (channels > 1) + throw SpatialSupportException(); + if (valid) { ALfloat f; @@ -838,7 +890,7 @@ float Source::getMaxDistance() const } // In case the Source isn't playing. - return this->maxDistance; + return maxDistance; } int Source::getChannels() const diff --git a/jni/love/src/modules/audio/openal/Source.h b/jni/love/src/modules/audio/openal/Source.h index b6dfd4ff..28937243 100644 --- a/jni/love/src/modules/audio/openal/Source.h +++ b/jni/love/src/modules/audio/openal/Source.h @@ -29,9 +29,14 @@ #include "sound/Decoder.h" // OpenAL -#ifdef LOVE_MACOSX_USE_FRAMEWORKS +#ifdef LOVE_APPLE_USE_FRAMEWORKS +#ifdef LOVE_IOS +#include +#include +#else #include #include +#endif #else #include #include @@ -105,7 +110,6 @@ public: virtual bool isRelative() const; void setLooping(bool looping); bool isLooping() const; - bool isStatic() const; virtual void setMinVolume(float volume); virtual float getMinVolume() const; virtual void setMaxVolume(float volume); @@ -166,15 +170,9 @@ private: struct Cone { - int innerAngle; // degrees - int outerAngle; // degrees - float outerVolume; - - Cone() - : innerAngle(360) - , outerAngle(360) - , outerVolume(0.0f) - {} + int innerAngle = 360; // degrees + int outerAngle = 360; // degrees + float outerVolume = 0.0f; } cone; float offsetSamples; diff --git a/jni/love/src/modules/audio/wrap_Audio.cpp b/jni/love/src/modules/audio/wrap_Audio.cpp index 3acbc08d..d3ca6083 100644 --- a/jni/love/src/modules/audio/wrap_Audio.cpp +++ b/jni/love/src/modules/audio/wrap_Audio.cpp @@ -44,7 +44,7 @@ int w_getSourceCount(lua_State *L) int w_newSource(lua_State *L) { - if (lua_isstring(L, 1) || luax_istype(L, 1, FILESYSTEM_FILE_T) || luax_istype(L, 1, FILESYSTEM_FILE_DATA_T)) + if (lua_isstring(L, 1) || luax_istype(L, 1, FILESYSTEM_FILE_ID) || luax_istype(L, 1, FILESYSTEM_FILE_DATA_ID)) luax_convobj(L, 1, "sound", "newDecoder"); Source::Type stype = Source::TYPE_STREAM; @@ -53,21 +53,21 @@ int w_newSource(lua_State *L) if (stypestr && !Source::getConstant(stypestr, stype)) return luaL_error(L, "Invalid source type: %s", stypestr); - if (stype == Source::TYPE_STATIC && luax_istype(L, 1, SOUND_DECODER_T)) + if (stype == Source::TYPE_STATIC && luax_istype(L, 1, SOUND_DECODER_ID)) luax_convobj(L, 1, "sound", "newSoundData"); Source *t = 0; luax_catchexcept(L, [&]() { - if (luax_istype(L, 1, SOUND_SOUND_DATA_T)) - t = instance()->newSource(luax_totype(L, 1, "SoundData", SOUND_SOUND_DATA_T)); - else if (luax_istype(L, 1, SOUND_DECODER_T)) - t = instance()->newSource(luax_totype(L, 1, "Decoder", SOUND_DECODER_T)); + if (luax_istype(L, 1, SOUND_SOUND_DATA_ID)) + t = instance()->newSource(luax_totype(L, 1, SOUND_SOUND_DATA_ID)); + else if (luax_istype(L, 1, SOUND_DECODER_ID)) + t = instance()->newSource(luax_totype(L, 1, SOUND_DECODER_ID)); }); if (t) { - luax_pushtype(L, "Source", AUDIO_SOURCE_T, t); + luax_pushtype(L, AUDIO_SOURCE_ID, t); t->release(); return 1; } @@ -243,7 +243,7 @@ int w_getRecordedData(lua_State *L) lua_pushnil(L); else { - luax_pushtype(L, "SoundData", SOUND_SOUND_DATA_T, sd); + luax_pushtype(L, SOUND_SOUND_DATA_ID, sd); sd->release(); } return 1; @@ -258,7 +258,7 @@ int w_stopRecording(lua_State *L) lua_pushnil(L); else { - luax_pushtype(L, "SoundData", SOUND_SOUND_DATA_T, sd); + luax_pushtype(L, SOUND_SOUND_DATA_ID, sd); sd->release(); } return 1; @@ -369,7 +369,7 @@ extern "C" int luaopen_love_audio(lua_State *L) WrappedModule w; w.module = instance; w.name = "audio"; - w.flags = MODULE_T; + w.type = MODULE_ID; w.functions = functions; w.types = types; diff --git a/jni/love/src/modules/audio/wrap_Source.cpp b/jni/love/src/modules/audio/wrap_Source.cpp index ba5d64e5..c4fe1700 100644 --- a/jni/love/src/modules/audio/wrap_Source.cpp +++ b/jni/love/src/modules/audio/wrap_Source.cpp @@ -29,7 +29,7 @@ namespace audio Source *luax_checksource(lua_State *L, int idx) { - return luax_checktype(L, idx, "Source", AUDIO_SOURCE_T); + return luax_checktype(L, idx, AUDIO_SOURCE_ID); } int w_Source_clone(lua_State *L) @@ -37,7 +37,7 @@ int w_Source_clone(lua_State *L) Source *t = luax_checksource(L, 1); Source *clone = nullptr; luax_catchexcept(L, [&](){ clone = t->clone(); }); - luax_pushtype(L, "Source", AUDIO_SOURCE_T, clone); + luax_pushtype(L, AUDIO_SOURCE_ID, clone); clone->release(); return 1; } @@ -147,7 +147,7 @@ int w_Source_setPosition(lua_State *L) v[0] = (float)luaL_checknumber(L, 2); v[1] = (float)luaL_checknumber(L, 3); v[2] = (float)luaL_optnumber(L, 4, 0); - t->setPosition(v); + luax_catchexcept(L, [&](){ t->setPosition(v); }); return 0; } @@ -155,7 +155,7 @@ int w_Source_getPosition(lua_State *L) { Source *t = luax_checksource(L, 1); float v[3]; - t->getPosition(v); + luax_catchexcept(L, [&](){ t->getPosition(v); }); lua_pushnumber(L, v[0]); lua_pushnumber(L, v[1]); lua_pushnumber(L, v[2]); @@ -169,7 +169,7 @@ int w_Source_setVelocity(lua_State *L) v[0] = (float)luaL_checknumber(L, 2); v[1] = (float)luaL_checknumber(L, 3); v[2] = (float)luaL_optnumber(L, 4, 0); - t->setVelocity(v); + luax_catchexcept(L, [&](){ t->setVelocity(v); }); return 0; } @@ -177,7 +177,7 @@ int w_Source_getVelocity(lua_State *L) { Source *t = luax_checksource(L, 1); float v[3]; - t->getVelocity(v); + luax_catchexcept(L, [&](){ t->getVelocity(v); }); lua_pushnumber(L, v[0]); lua_pushnumber(L, v[1]); lua_pushnumber(L, v[2]); @@ -191,7 +191,7 @@ int w_Source_setDirection(lua_State *L) v[0] = (float)luaL_checknumber(L, 2); v[1] = (float)luaL_checknumber(L, 3); v[2] = (float)luaL_optnumber(L, 4, 0); - t->setDirection(v); + luax_catchexcept(L, [&](){ t->setDirection(v); }); return 0; } @@ -199,7 +199,7 @@ int w_Source_getDirection(lua_State *L) { Source *t = luax_checksource(L, 1); float v[3]; - t->getDirection(v); + luax_catchexcept(L, [&](){ t->getDirection(v); }); lua_pushnumber(L, v[0]); lua_pushnumber(L, v[1]); lua_pushnumber(L, v[2]); @@ -212,7 +212,7 @@ int w_Source_setCone(lua_State *L) float innerAngle = (float) luaL_checknumber(L, 2); float outerAngle = (float) luaL_checknumber(L, 3); float outerVolume = (float) luaL_optnumber(L, 4, 0.0); - t->setCone(innerAngle, outerAngle, outerVolume); + luax_catchexcept(L, [&](){ t->setCone(innerAngle, outerAngle, outerVolume); }); return 0; } @@ -220,7 +220,7 @@ int w_Source_getCone(lua_State *L) { Source *t = luax_checksource(L, 1); float innerAngle, outerAngle, outerVolume; - t->getCone(innerAngle, outerAngle, outerVolume); + luax_catchexcept(L, [&](){ t->getCone(innerAngle, outerAngle, outerVolume); }); lua_pushnumber(L, innerAngle); lua_pushnumber(L, outerAngle); lua_pushnumber(L, outerVolume); @@ -230,14 +230,14 @@ int w_Source_getCone(lua_State *L) int w_Source_setRelative(lua_State *L) { Source *t = luax_checksource(L, 1); - t->setRelative(luax_toboolean(L, 2)); + luax_catchexcept(L, [&](){ t->setRelative(luax_toboolean(L, 2)); }); return 0; } int w_Source_isRelative(lua_State *L) { Source *t = luax_checksource(L, 1); - luax_pushboolean(L, t->isRelative()); + luax_catchexcept(L, [&](){ luax_pushboolean(L, t->isRelative()); }); return 1; } @@ -276,13 +276,6 @@ int w_Source_isPlaying(lua_State *L) return 1; } -int w_Source_isStatic(lua_State *L) -{ - Source *t = luax_checksource(L, 1); - luax_pushboolean(L, t->isStatic()); - return 1; -} - int w_Source_setVolumeLimits(lua_State *L) { Source *t = luax_checksource(L, 1); @@ -310,16 +303,20 @@ int w_Source_setAttenuationDistances(lua_State *L) float dmax = (float)luaL_checknumber(L, 3); if (dref < .0f || dmax < .0f) return luaL_error(L, "Invalid distances: %f, %f. Must be > 0", dref, dmax); - t->setReferenceDistance(dref); - t->setMaxDistance(dmax); + luax_catchexcept(L, [&]() { + t->setReferenceDistance(dref); + t->setMaxDistance(dmax); + }); return 0; } int w_Source_getAttenuationDistances(lua_State *L) { Source *t = luax_checksource(L, 1); - lua_pushnumber(L, t->getReferenceDistance()); - lua_pushnumber(L, t->getMaxDistance()); + luax_catchexcept(L, [&]() { + lua_pushnumber(L, t->getReferenceDistance()); + lua_pushnumber(L, t->getMaxDistance()); + }); return 2; } @@ -329,14 +326,14 @@ int w_Source_setRolloff(lua_State *L) float rolloff = (float)luaL_checknumber(L, 2); if (rolloff < .0f) return luaL_error(L, "Invalid rolloff: %f. Must be > 0.", rolloff); - t->setRolloffFactor(rolloff); + luax_catchexcept(L, [&](){ t->setRolloffFactor(rolloff); }); return 0; } int w_Source_getRolloff(lua_State *L) { Source *t = luax_checksource(L, 1); - lua_pushnumber(L, t->getRolloffFactor()); + luax_catchexcept(L, [&](){ lua_pushnumber(L, t->getRolloffFactor()); }); return 1; } @@ -347,6 +344,19 @@ int w_Source_getChannels(lua_State *L) return 1; } +int w_Source_getType(lua_State *L) +{ + Source *t = luax_checksource(L, 1); + Source::Type type = t->getType(); + const char *str = nullptr; + + if (!Source::getConstant(type, str)) + return luaL_error(L, "Unknown Source type."); + + lua_pushstring(L, str); + return 1; +} + static const luaL_Reg functions[] = { { "clone", w_Source_clone }, @@ -380,7 +390,6 @@ static const luaL_Reg functions[] = { "isStopped", w_Source_isStopped }, { "isPaused", w_Source_isPaused }, { "isPlaying", w_Source_isPlaying }, - { "isStatic", w_Source_isStatic }, { "setVolumeLimits", w_Source_setVolumeLimits }, { "getVolumeLimits", w_Source_getVolumeLimits }, @@ -390,13 +399,14 @@ static const luaL_Reg functions[] = { "getRolloff", w_Source_getRolloff}, { "getChannels", w_Source_getChannels }, + { "getType", w_Source_getType }, { 0, 0 } }; extern "C" int luaopen_source(lua_State *L) { - return luax_register_type(L, "Source", functions); + return luax_register_type(L, AUDIO_SOURCE_ID, functions); } } // audio diff --git a/jni/love/src/modules/audio/wrap_Source.h b/jni/love/src/modules/audio/wrap_Source.h index 008ceae1..93dc52e2 100644 --- a/jni/love/src/modules/audio/wrap_Source.h +++ b/jni/love/src/modules/audio/wrap_Source.h @@ -57,7 +57,6 @@ int w_Source_isLooping(lua_State *L); int w_Source_isStopped(lua_State *L); int w_Source_isPaused(lua_State *L); int w_Source_isPlaying(lua_State *L); -int w_Source_isStatic(lua_State *L); int w_Source_setVolumeLimits(lua_State *L); int w_Source_getVolumeLimits(lua_State *L); int w_Source_setAttenuationDistances(lua_State *L); @@ -65,6 +64,7 @@ int w_Source_getAttenuationDistances(lua_State *L); int w_Source_setRolloff(lua_State *L); int w_Source_getRolloff(lua_State *L); int w_Source_getChannels(lua_State *L); +int w_Source_getType(lua_State *L); extern "C" int luaopen_source(lua_State *L); } // audio diff --git a/jni/love/src/modules/event/Event.h b/jni/love/src/modules/event/Event.h index becb5fbc..47b539b7 100644 --- a/jni/love/src/modules/event/Event.h +++ b/jni/love/src/modules/event/Event.h @@ -30,7 +30,7 @@ #include "joystick/Joystick.h" #include "thread/threads.h" -// STL +// C++ #include #include @@ -43,7 +43,7 @@ class Message : public Object { public: - Message(const std::string &name, const std::vector> &vargs = std::vector>()); + Message(const std::string &name, const std::vector> &vargs = {}); ~Message(); int toLua(lua_State *L); @@ -59,7 +59,6 @@ private: class Event : public Module { public: - Event(); virtual ~Event(); @@ -71,9 +70,9 @@ public: virtual void clear(); virtual void pump() = 0; + virtual Message *wait() = 0; protected: - thread::Mutex *mutex; std::queue queue; diff --git a/jni/love/src/modules/event/sdl/Event.cpp b/jni/love/src/modules/event/sdl/Event.cpp index d9dad293..b7d54c52 100644 --- a/jni/love/src/modules/event/sdl/Event.cpp +++ b/jni/love/src/modules/event/sdl/Event.cpp @@ -20,8 +20,9 @@ #include "Event.h" -#include "keyboard/Keyboard.h" -#include "mouse/Mouse.h" +#include "filesystem/DroppedFile.h" +#include "filesystem/Filesystem.h" +#include "keyboard/sdl/Keyboard.h" #include "joystick/JoystickModule.h" #include "joystick/sdl/Joystick.h" #include "touch/sdl/Touch.h" @@ -44,15 +45,27 @@ namespace sdl // we want them in pixel coordinates (may be different with high-DPI enabled.) static void windowToPixelCoords(double *x, double *y) { -#ifndef LOVE_ANDROID window::Window *window = Module::getInstance(Module::M_WINDOW); - if (window && x) - *x = window->toPixels(*x); - if (window && y) - *y = window->toPixels(*y); -#endif + if (window) + window->windowToPixelCoords(x, y); } +#ifndef LOVE_MACOSX +static void normalizedToPixelCoords(double *x, double *y) +{ + window::Window *window = Module::getInstance(Module::M_WINDOW); + int w = 1, h = 1; + + if (window) + window->getPixelDimensions(w, h); + + if (x) + *x = ((*x) * (double) w); + if (y) + *y = ((*y) * (double) h); +} +#endif + // SDL's event watch callbacks trigger when the event is actually posted inside // SDL, unlike with SDL_PollEvents. This is useful for some events which require // handling inside the function which triggered them on some backends. @@ -67,9 +80,6 @@ static int SDLCALL watchAppEvents(void * /*udata*/, SDL_Event *event) // with an event watch callback, which will be called inside that function. case SDL_APP_DIDENTERBACKGROUND: case SDL_APP_WILLENTERFOREGROUND: - // On Android, before calling setActive we should probably also call a - // window function to un-set the graphics mode and delete the context, - // after DIDENTERBACKGROUND (and the reverse after WILLENTERFOREGROUND.) if (gfx) gfx->setActive(event->type == SDL_APP_WILLENTERFOREGROUND); break; @@ -77,11 +87,9 @@ static int SDLCALL watchAppEvents(void * /*udata*/, SDL_Event *event) break; } - // Don't prevent the event from being processed further. return 1; } - const char *Event::getName() const { return "love.event.sdl"; @@ -90,7 +98,7 @@ const char *Event::getName() const Event::Event() { if (SDL_InitSubSystem(SDL_INIT_EVENTS) < 0) - throw love::Exception("%s", SDL_GetError()); + throw love::Exception("Could not initialize SDL events subsystem (%s)", SDL_GetError()); SDL_AddEventWatch(watchAppEvents, this); } @@ -146,13 +154,24 @@ Message *Event::convert(const SDL_Event &e) const vargs.reserve(4); love::keyboard::Keyboard *kb = nullptr; - love::touch::sdl::Touch *touch = nullptr; + love::filesystem::Filesystem *filesystem = nullptr; + + love::keyboard::Keyboard::Key key = love::keyboard::Keyboard::KEY_UNKNOWN; + love::keyboard::Keyboard::Scancode scancode = love::keyboard::Keyboard::SCANCODE_UNKNOWN; - love::keyboard::Keyboard::Key key; - love::mouse::Mouse::Button button; const char *txt; + const char *txt2; std::map::const_iterator keyit; +#ifndef LOVE_MACOSX + love::touch::sdl::Touch *touchmodule = nullptr; + love::touch::Touch::TouchInfo touchinfo; +#endif + +#ifdef LOVE_LINUX + static bool touchNormalizationBug = false; +#endif + switch (e.type) { case SDL_KEYDOWN: @@ -166,13 +185,16 @@ Message *Event::convert(const SDL_Event &e) const keyit = keys.find(e.key.keysym.sym); if (keyit != keys.end()) key = keyit->second; - else - key = love::keyboard::Keyboard::KEY_UNKNOWN; if (!love::keyboard::Keyboard::getConstant(key, txt)) txt = "unknown"; + love::keyboard::sdl::Keyboard::getConstant(e.key.keysym.scancode, scancode); + if (!love::keyboard::Keyboard::getConstant(scancode, txt2)) + txt2 = "unknown"; + vargs.push_back(new Variant(txt, strlen(txt))); + vargs.push_back(new Variant(txt2, strlen(txt2))); vargs.push_back(new Variant(e.key.repeat != 0)); msg = new Message("keypressed", vargs); break; @@ -180,13 +202,16 @@ Message *Event::convert(const SDL_Event &e) const keyit = keys.find(e.key.keysym.sym); if (keyit != keys.end()) key = keyit->second; - else - key = love::keyboard::Keyboard::KEY_UNKNOWN; if (!love::keyboard::Keyboard::getConstant(key, txt)) txt = "unknown"; + love::keyboard::sdl::Keyboard::getConstant(e.key.keysym.scancode, scancode); + if (!love::keyboard::Keyboard::getConstant(scancode, txt2)) + txt2 = "unknown"; + vargs.push_back(new Variant(txt, strlen(txt))); + vargs.push_back(new Variant(txt2, strlen(txt2))); msg = new Message("keyreleased", vargs); break; case SDL_TEXTINPUT: @@ -199,7 +224,7 @@ Message *Event::convert(const SDL_Event &e) const vargs.push_back(new Variant(txt, strlen(txt))); vargs.push_back(new Variant((double) e.edit.start)); vargs.push_back(new Variant((double) e.edit.length)); - msg = new Message("textedit", vargs); + msg = new Message("textedited", vargs); break; case SDL_MOUSEMOTION: { @@ -213,19 +238,32 @@ Message *Event::convert(const SDL_Event &e) const vargs.push_back(new Variant(y)); vargs.push_back(new Variant(xrel)); vargs.push_back(new Variant(yrel)); + vargs.push_back(new Variant(e.motion.which == SDL_TOUCH_MOUSEID)); msg = new Message("mousemoved", vargs); } break; case SDL_MOUSEBUTTONDOWN: case SDL_MOUSEBUTTONUP: - if (buttons.find(e.button.button, button) && mouse::Mouse::getConstant(button, txt)) { + // SDL uses button index 3 for the right mouse button, but we use + // index 2. + int button = e.button.button; + switch (button) + { + case SDL_BUTTON_RIGHT: + button = 2; + break; + case SDL_BUTTON_MIDDLE: + button = 3; + break; + } + double x = (double) e.button.x; double y = (double) e.button.y; windowToPixelCoords(&x, &y); vargs.push_back(new Variant(x)); vargs.push_back(new Variant(y)); - vargs.push_back(new Variant(txt, strlen(txt))); + vargs.push_back(new Variant((double) button)); vargs.push_back(new Variant(e.button.which == SDL_TOUCH_MOUSEID)); msg = new Message((e.type == SDL_MOUSEBUTTONDOWN) ? "mousepressed" : "mousereleased", @@ -233,38 +271,59 @@ Message *Event::convert(const SDL_Event &e) const } break; case SDL_MOUSEWHEEL: - if (e.wheel.y != 0) - { - button = (e.wheel.y > 0) ? mouse::Mouse::BUTTON_WHEELUP : mouse::Mouse::BUTTON_WHEELDOWN; - if (!love::mouse::Mouse::getConstant(button, txt)) - break; - - int mx, my; - double dmx, dmy; - SDL_GetMouseState(&mx, &my); - dmx = (double) mx; - dmy = (double) my; - windowToPixelCoords(&dmx, &dmy); - - vargs.push_back(new Variant(dmx)); - vargs.push_back(new Variant(dmy)); - vargs.push_back(new Variant(txt, strlen(txt))); - vargs.push_back(new Variant(false)); - msg = new Message("mousepressed", vargs); - } + vargs.push_back(new Variant((double) e.wheel.x)); + vargs.push_back(new Variant((double) e.wheel.y)); + msg = new Message("wheelmoved", vargs); break; case SDL_FINGERDOWN: case SDL_FINGERUP: case SDL_FINGERMOTION: - // We need to update the love.touch.sdl internal state from here. - touch = (touch::sdl::Touch *) Module::getInstance("love.touch.sdl"); - if (touch) - touch->onEvent(e.tfinger); + // Touch events are disabled in OS X because we only actually want touch + // screen events, but most touch devices in OS X aren't touch screens + // (and SDL doesn't differentiate.) Non-screen touch devices like Mac + // trackpads won't give touch coords in the window's coordinate-space. +#ifndef LOVE_MACOSX + touchinfo.id = (int64) e.tfinger.fingerId; + touchinfo.x = e.tfinger.x; + touchinfo.y = e.tfinger.y; + touchinfo.dx = e.tfinger.dx; + touchinfo.dy = e.tfinger.dy; + touchinfo.pressure = e.tfinger.pressure; + +#ifdef LOVE_LINUX + // FIXME: hacky workaround for SDL not normalizing touch coordinates in + // its X11 backend: https://bugzilla.libsdl.org/show_bug.cgi?id=2307 + if (touchNormalizationBug || fabs(touchinfo.x) >= 1.5 || fabs(touchinfo.y) >= 1.5 || fabs(touchinfo.dx) >= 1.5 || fabs(touchinfo.dy) >= 1.5) + { + touchNormalizationBug = true; + windowToPixelCoords(&touchinfo.x, &touchinfo.y); + windowToPixelCoords(&touchinfo.dx, &touchinfo.dy); + } + else +#endif + { + // SDL's coords are normalized to [0, 1], but we want them in pixels. + normalizedToPixelCoords(&touchinfo.x, &touchinfo.y); + normalizedToPixelCoords(&touchinfo.dx, &touchinfo.dy); + } + + // We need to update the love.touch.sdl internal state from here. + touchmodule = (touch::sdl::Touch *) Module::getInstance("love.touch.sdl"); + if (touchmodule) + touchmodule->onEvent(e.type, touchinfo); + + // This is a bit hackish and we lose the higher 32 bits of the id on + // 32-bit systems, but SDL only ever gives id's that at most use as many + // bits as can fit in a pointer (for now.) + // We use lightuserdata instead of a lua_Number (double) because doubles + // can't represent all possible id values on 64-bit systems. + vargs.push_back(new Variant((void *) (intptr_t) touchinfo.id)); + vargs.push_back(new Variant(touchinfo.x)); + vargs.push_back(new Variant(touchinfo.y)); + vargs.push_back(new Variant(touchinfo.dx)); + vargs.push_back(new Variant(touchinfo.dy)); + vargs.push_back(new Variant(touchinfo.pressure)); - vargs.push_back(new Variant((double) e.tfinger.fingerId)); - vargs.push_back(new Variant((double) e.tfinger.x)); - vargs.push_back(new Variant((double) e.tfinger.y)); - vargs.push_back(new Variant((double) e.tfinger.pressure)); if (e.type == SDL_FINGERDOWN) txt = "touchpressed"; else if (e.type == SDL_FINGERUP) @@ -272,14 +331,7 @@ Message *Event::convert(const SDL_Event &e) const else txt = "touchmoved"; msg = new Message(txt, vargs); - break; - case SDL_MULTIGESTURE: - vargs.push_back(new Variant((double) e.mgesture.x)); - vargs.push_back(new Variant((double) e.mgesture.y)); - vargs.push_back(new Variant((double) e.mgesture.dTheta)); - vargs.push_back(new Variant((double) e.mgesture.dDist)); - vargs.push_back(new Variant((double) e.mgesture.numFingers)); - msg = new Message("touchgestured", vargs); +#endif break; case SDL_JOYBUTTONDOWN: case SDL_JOYBUTTONUP: @@ -297,6 +349,27 @@ Message *Event::convert(const SDL_Event &e) const msg = convertWindowEvent(e); break; case SDL_DROPFILE: + filesystem = Module::getInstance(Module::M_FILESYSTEM); + if (filesystem != nullptr) + { + // Allow mounting any dropped path, so zips or dirs can be mounted. + filesystem->allowMountingForPath(e.drop.file); + + if (filesystem->isRealDirectory(e.drop.file)) + { + vargs.push_back(new Variant(e.drop.file, strlen(e.drop.file))); + msg = new Message("directorydropped", vargs); + } + else + { + Proxy proxy; + proxy.object = new love::filesystem::DroppedFile(e.drop.file); + proxy.type = FILESYSTEM_DROPPED_FILE_ID; + vargs.push_back(new Variant(proxy.type, &proxy)); + msg = new Message("filedropped", vargs); + proxy.object->release(); + } + } SDL_free(e.drop.file); break; case SDL_QUIT: @@ -310,9 +383,9 @@ Message *Event::convert(const SDL_Event &e) const break; } + // We gave +1 refs to the StrongRef list, so we should release them. for (const StrongRef &v : vargs) { - // We gave +1 refs to the StrongRef list, so we should release them. if (v.get() != nullptr) v->release(); } @@ -341,12 +414,12 @@ Message *Event::convertJoystickEvent(const SDL_Event &e) const { case SDL_JOYBUTTONDOWN: case SDL_JOYBUTTONUP: - proxy.flags = JOYSTICK_JOYSTICK_T; - proxy.data = joymodule->getJoystickFromID(e.jbutton.which); - if (!proxy.data) + proxy.type = JOYSTICK_JOYSTICK_ID; + proxy.object = joymodule->getJoystickFromID(e.jbutton.which); + if (!proxy.object) break; - vargs.push_back(new Variant(JOYSTICK_JOYSTICK_ID, (void *) &proxy)); + vargs.push_back(new Variant(proxy.type, (void *) &proxy)); vargs.push_back(new Variant((double)(e.jbutton.button+1))); msg = new Message((e.type == SDL_JOYBUTTONDOWN) ? "joystickpressed" : "joystickreleased", @@ -354,12 +427,12 @@ Message *Event::convertJoystickEvent(const SDL_Event &e) const break; case SDL_JOYAXISMOTION: { - proxy.flags = JOYSTICK_JOYSTICK_T; - proxy.data = joymodule->getJoystickFromID(e.jaxis.which); - if (!proxy.data) + proxy.type = JOYSTICK_JOYSTICK_ID; + proxy.object = joymodule->getJoystickFromID(e.jaxis.which); + if (!proxy.object) break; - vargs.push_back(new Variant(JOYSTICK_JOYSTICK_ID, (void *) &proxy)); + vargs.push_back(new Variant(proxy.type, (void *) &proxy)); vargs.push_back(new Variant((double)(e.jaxis.axis+1))); float value = joystick::Joystick::clampval(e.jaxis.value / 32768.0f); vargs.push_back(new Variant((double) value)); @@ -370,12 +443,12 @@ Message *Event::convertJoystickEvent(const SDL_Event &e) const if (!joystick::sdl::Joystick::getConstant(e.jhat.value, hat) || !joystick::Joystick::getConstant(hat, txt)) break; - proxy.flags = JOYSTICK_JOYSTICK_T; - proxy.data = joymodule->getJoystickFromID(e.jhat.which); - if (!proxy.data) + proxy.type = JOYSTICK_JOYSTICK_ID; + proxy.object = joymodule->getJoystickFromID(e.jhat.which); + if (!proxy.object) break; - vargs.push_back(new Variant(JOYSTICK_JOYSTICK_ID, (void *) &proxy)); + vargs.push_back(new Variant(proxy.type, (void *) &proxy)); vargs.push_back(new Variant((double)(e.jhat.hat+1))); vargs.push_back(new Variant(txt, strlen(txt))); msg = new Message("joystickhat", vargs); @@ -388,12 +461,12 @@ Message *Event::convertJoystickEvent(const SDL_Event &e) const if (!joystick::Joystick::getConstant(padbutton, txt)) break; - proxy.flags = JOYSTICK_JOYSTICK_T; - proxy.data = joymodule->getJoystickFromID(e.cbutton.which); - if (!proxy.data) + proxy.type = JOYSTICK_JOYSTICK_ID; + proxy.object = joymodule->getJoystickFromID(e.cbutton.which); + if (!proxy.object) break; - vargs.push_back(new Variant(JOYSTICK_JOYSTICK_ID, (void *) &proxy)); + vargs.push_back(new Variant(proxy.type, (void *) &proxy)); vargs.push_back(new Variant(txt, strlen(txt))); msg = new Message(e.type == SDL_CONTROLLERBUTTONDOWN ? "gamepadpressed" : "gamepadreleased", vargs); @@ -404,12 +477,13 @@ Message *Event::convertJoystickEvent(const SDL_Event &e) const if (!joystick::Joystick::getConstant(padaxis, txt)) break; - proxy.flags = JOYSTICK_JOYSTICK_T; - proxy.data = joymodule->getJoystickFromID(e.caxis.which); - if (!proxy.data) + proxy.type = JOYSTICK_JOYSTICK_ID; + proxy.object = joymodule->getJoystickFromID(e.caxis.which); + if (!proxy.object) break; - vargs.push_back(new Variant(JOYSTICK_JOYSTICK_ID, (void *) &proxy)); + vargs.push_back(new Variant(proxy.type, (void *) &proxy)); + vargs.push_back(new Variant(txt, strlen(txt))); float value = joystick::Joystick::clampval(e.caxis.value / 32768.0f); vargs.push_back(new Variant((double) value)); @@ -418,32 +492,48 @@ Message *Event::convertJoystickEvent(const SDL_Event &e) const break; case SDL_JOYDEVICEADDED: // jdevice.which is the joystick device index. - proxy.data = joymodule->addJoystick(e.jdevice.which); - proxy.flags = JOYSTICK_JOYSTICK_T; - if (proxy.data) + proxy.object = joymodule->addJoystick(e.jdevice.which); + proxy.type = JOYSTICK_JOYSTICK_ID; + if (proxy.object) { - vargs.push_back(new Variant(JOYSTICK_JOYSTICK_ID, (void *) &proxy)); + vargs.push_back(new Variant(proxy.type, (void *) &proxy)); msg = new Message("joystickadded", vargs); } break; case SDL_JOYDEVICEREMOVED: // jdevice.which is the joystick instance ID now. - proxy.data = joymodule->getJoystickFromID(e.jdevice.which); - proxy.flags = JOYSTICK_JOYSTICK_T; - if (proxy.data) + proxy.object = joymodule->getJoystickFromID(e.jdevice.which); + proxy.type = JOYSTICK_JOYSTICK_ID; + if (proxy.object) { - joymodule->removeJoystick((joystick::Joystick *) proxy.data); - vargs.push_back(new Variant(JOYSTICK_JOYSTICK_ID, (void *) &proxy)); + joymodule->removeJoystick((joystick::Joystick *) proxy.object); + vargs.push_back(new Variant(proxy.type, (void *) &proxy)); msg = new Message("joystickremoved", vargs); } break; default: break; +#ifdef LOVE_ANDROID + case SDL_WINDOWEVENT_MINIMIZED: + { + audio::Audio *audio = Module::getInstance(Module::M_AUDIO); + if (audio) + audio->pause(); + } + break; + case SDL_WINDOWEVENT_RESTORED: + { + audio::Audio *audio = Module::getInstance(Module::M_AUDIO); + if (audio) + audio->resume(); + } + break; +#endif } + // We gave +1 refs to the StrongRef list, so we should release them. for (const StrongRef &v : vargs) { - // We gave +1 refs to the StrongRef list, so we should release them. if (v.get() != nullptr) v->release(); } @@ -487,24 +577,13 @@ Message *Event::convertWindowEvent(const SDL_Event &e) const msg = new Message("visible", vargs); break; case SDL_WINDOWEVENT_RESIZED: - win = Module::getInstance(Module::M_WINDOW); - if (win) { int px_w = e.window.data1; int px_h = e.window.data2; - // FIXME: disabled in Linux for runtime SDL 2.0.0 compatibility. -#if SDL_VERSION_ATLEAST(2,0,1) && !defined(LOVE_LINUX) SDL_Window *sdlwin = SDL_GetWindowFromID(e.window.windowID); if (sdlwin) SDL_GL_GetDrawableSize(sdlwin, &px_w, &px_h); -#endif - - win->onWindowResize(e.window.data1, e.window.data2); - - graphics::Graphics *gfx = Module::getInstance(Module::M_GRAPHICS); - if (gfx) - gfx->setViewportSize(px_w, px_h); vargs.push_back(new Variant((double) px_w)); vargs.push_back(new Variant((double) px_h)); @@ -513,27 +592,16 @@ Message *Event::convertWindowEvent(const SDL_Event &e) const msg = new Message("resize", vargs); } break; -#ifdef LOVE_ANDROID - case SDL_WINDOWEVENT_MINIMIZED: - { - audio::Audio *audio = Module::getInstance(Module::M_AUDIO); - if (audio) - audio->pause(); - } + case SDL_WINDOWEVENT_SIZE_CHANGED: + win = Module::getInstance(Module::M_WINDOW); + if (win) + win->onSizeChanged(e.window.data1, e.window.data2); break; - case SDL_WINDOWEVENT_RESTORED: - { - audio::Audio *audio = Module::getInstance(Module::M_AUDIO); - if (audio) - audio->resume(); - } - break; -#endif } + // We gave +1 refs to the StrongRef list, so we should release them. for (const StrongRef &v : vargs) { - // We gave +1 refs to the StrongRef list, so we should release them. if (v.get() != nullptr) v->release(); } @@ -557,6 +625,7 @@ std::map Event::createKeyMap() k[SDLK_EXCLAIM] = Keyboard::KEY_EXCLAIM; k[SDLK_QUOTEDBL] = Keyboard::KEY_QUOTEDBL; k[SDLK_HASH] = Keyboard::KEY_HASH; + k[SDLK_PERCENT] = Keyboard::KEY_PERCENT; k[SDLK_DOLLAR] = Keyboard::KEY_DOLLAR; k[SDLK_AMPERSAND] = Keyboard::KEY_AMPERSAND; k[SDLK_QUOTE] = Keyboard::KEY_QUOTE; @@ -761,17 +830,6 @@ std::map Event::createKeyMap() std::map Event::keys = Event::createKeyMap(); -EnumMap::Entry Event::buttonEntries[] = -{ - { love::mouse::Mouse::BUTTON_LEFT, SDL_BUTTON_LEFT}, - { love::mouse::Mouse::BUTTON_MIDDLE, SDL_BUTTON_MIDDLE}, - { love::mouse::Mouse::BUTTON_RIGHT, SDL_BUTTON_RIGHT}, - { love::mouse::Mouse::BUTTON_X1, SDL_BUTTON_X1}, - { love::mouse::Mouse::BUTTON_X2, SDL_BUTTON_X2}, -}; - -EnumMap Event::buttons(Event::buttonEntries, sizeof(Event::buttonEntries)); - } // sdl } // event } // love diff --git a/jni/love/src/modules/event/sdl/Event.h b/jni/love/src/modules/event/sdl/Event.h index 5e1a9b4c..e3915a8e 100644 --- a/jni/love/src/modules/event/sdl/Event.h +++ b/jni/love/src/modules/event/sdl/Event.h @@ -23,8 +23,6 @@ // LOVE #include "event/Event.h" -#include "common/runtime.h" -#include "common/EnumMap.h" // SDL #include @@ -77,9 +75,6 @@ private: static std::map createKeyMap(); static std::map keys; - static EnumMap::Entry buttonEntries[]; - static EnumMap buttons; - }; // Event } // sdl diff --git a/jni/love/src/modules/event/sdl/wrap_Event.cpp b/jni/love/src/modules/event/wrap_Event.cpp similarity index 90% rename from jni/love/src/modules/event/sdl/wrap_Event.cpp rename to jni/love/src/modules/event/wrap_Event.cpp index dc76f991..718ea5dc 100644 --- a/jni/love/src/modules/event/sdl/wrap_Event.cpp +++ b/jni/love/src/modules/event/wrap_Event.cpp @@ -23,21 +23,18 @@ // LOVE #include "common/runtime.h" -// sdlevent -#include "Event.h" +#include "sdl/Event.h" namespace love { namespace event { -namespace sdl -{ #define instance() (Module::getInstance(Module::M_EVENT)) static int poll_i(lua_State *L) { - Message *m = nullptr; + Message *m; while (instance()->poll(m)) { @@ -58,13 +55,13 @@ int w_pump(lua_State *) int w_poll(lua_State *L) { - lua_pushcclosure(L, poll_i, 0); + lua_pushcclosure(L, &poll_i, 0); return 1; } int w_wait(lua_State *L) { - Message *m = nullptr; + Message *m; if ((m = instance()->wait())) { @@ -78,7 +75,7 @@ int w_wait(lua_State *L) int w_push(lua_State *L) { - Message *m = nullptr; + Message *m; bool success = (m = Message::fromLua(L, 1)) != NULL; luax_pushboolean(L, success); @@ -124,7 +121,7 @@ extern "C" int luaopen_love_event(lua_State *L) Event *instance = instance(); if (instance == nullptr) { - luax_catchexcept(L, [&](){ instance = new Event(); }); + luax_catchexcept(L, [&](){ instance = new love::event::sdl::Event(); }); } else instance->retain(); @@ -132,13 +129,12 @@ extern "C" int luaopen_love_event(lua_State *L) WrappedModule w; w.module = instance; w.name = "event"; - w.flags = MODULE_T; + w.type = MODULE_ID; w.functions = functions; - w.types = nullptr; + w.types = 0; return luax_register_module(L, w); } -} // sdl } // event } // love diff --git a/jni/love/src/modules/event/sdl/wrap_Event.h b/jni/love/src/modules/event/wrap_Event.h similarity index 90% rename from jni/love/src/modules/event/sdl/wrap_Event.h rename to jni/love/src/modules/event/wrap_Event.h index b99b433e..05a25f7c 100644 --- a/jni/love/src/modules/event/sdl/wrap_Event.h +++ b/jni/love/src/modules/event/wrap_Event.h @@ -18,8 +18,8 @@ * 3. This notice may not be removed or altered from any source distribution. **/ -#ifndef LOVE_EVENT_SDL_WRAP_EVENT_H -#define LOVE_EVENT_SDL_WRAP_EVENT_H +#ifndef LOVE_EVENT_WRAP_EVENT_H +#define LOVE_EVENT_WRAP_EVENT_H // LOVE #include "common/config.h" @@ -29,8 +29,6 @@ namespace love { namespace event { -namespace sdl -{ int w_pump(lua_State *L); int w_poll(lua_State *L); @@ -41,8 +39,7 @@ int w_quit(lua_State *L); extern "C" LOVE_EXPORT int luaopen_love_event(lua_State *L); -} // sdl } // event } // love -#endif // LOVE_EVENT_SDL_WRAP_EVENT_H +#endif // LOVE_EVENT_WRAP_EVENT_H diff --git a/jni/love/src/modules/filesystem/DroppedFile.cpp b/jni/love/src/modules/filesystem/DroppedFile.cpp new file mode 100644 index 00000000..c3e59e4a --- /dev/null +++ b/jni/love/src/modules/filesystem/DroppedFile.cpp @@ -0,0 +1,256 @@ +/** + * Copyright (c) 2006-2015 LOVE Development Team + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. + **/ + +// LOVE +#include "DroppedFile.h" +#include "common/utf8.h" + +// Assume POSIX or Visual Studio. +#include +#include + +#ifdef LOVE_WINDOWS +#include +#else +#include // POSIX. +#endif + +namespace love +{ +namespace filesystem +{ + +DroppedFile::DroppedFile(const std::string &filename) + : filename(filename) + , file(nullptr) + , mode(MODE_CLOSED) + , bufferMode(BUFFER_NONE) + , bufferSize(0) +{ +} + +DroppedFile::~DroppedFile() +{ + if (mode != MODE_CLOSED) + close(); +} + +bool DroppedFile::open(Mode newmode) +{ + if (newmode == MODE_CLOSED) + return true; + + // File already open? + if (file != nullptr) + return false; + +#ifdef LOVE_WINDOWS + // make sure non-ASCII filenames work. + std::wstring modestr = to_widestr(getModeString(newmode)); + std::wstring wfilename = to_widestr(filename); + + file = _wfopen(wfilename.c_str(), modestr.c_str()); +#else + file = fopen(filename.c_str(), getModeString(newmode)); +#endif + + if (newmode == MODE_READ && file == nullptr) + throw love::Exception("Could not open file %s. Does not exist.", filename.c_str()); + + mode = newmode; + + if (file != nullptr && !setBuffer(bufferMode, bufferSize)) + { + // Revert to buffer defaults if we don't successfully set the buffer. + bufferMode = BUFFER_NONE; + bufferSize = 0; + } + + return file != nullptr; +} + +bool DroppedFile::close() +{ + if (file == nullptr || fclose(file) != 0) + return false; + + mode = MODE_CLOSED; + file = nullptr; + + return true; +} + +bool DroppedFile::isOpen() const +{ + return mode != MODE_CLOSED && file != nullptr; +} + +int64 DroppedFile::getSize() +{ +#ifdef LOVE_WINDOWS + + // make sure non-ASCII filenames work. + std::wstring wfilename = to_widestr(filename); + + struct _stat buf; + if (_wstat(wfilename.c_str(), &buf) != 0) + return -1; + + return (int64) buf.st_size; + +#else + + // Assume POSIX support... + struct stat buf; + if (stat(filename.c_str(), &buf) != 0) + return -1; + + return (int64) buf.st_size; + +#endif +} + +int64 DroppedFile::read(void *dst, int64 size) +{ + if (!file || mode != MODE_READ) + throw love::Exception("File is not opened for reading."); + + if (size < 0) + throw love::Exception("Invalid read size."); + + size_t read = fread(dst, 1, (size_t) size, file); + + return (int64) read; +} + +bool DroppedFile::write(const void *data, int64 size) +{ + if (!file || (mode != MODE_WRITE && mode != MODE_APPEND)) + throw love::Exception("File is not opened for writing."); + + if (size < 0) + throw love::Exception("Invalid write size."); + + int64 written = (int64) fwrite(data, 1, (size_t) size, file); + + return written == size; +} + +bool DroppedFile::flush() +{ + if (!file || (mode != MODE_WRITE && mode != MODE_APPEND)) + throw love::Exception("File is not opened for writing."); + + return fflush(file) == 0; +} + +bool DroppedFile::isEOF() +{ + return file == nullptr || feof(file) != 0; +} + +int64 DroppedFile::tell() +{ + if (file == nullptr) + return -1; + + return (int64) ftell(file); +} + +bool DroppedFile::seek(uint64 pos) +{ + return file != nullptr && fseek(file, (long) pos, SEEK_SET) == 0; +} + +bool DroppedFile::setBuffer(BufferMode bufmode, int64 size) +{ + if (size < 0) + return false; + + if (bufmode == BUFFER_NONE) + size = 0; + + // If the file isn't open, we'll make sure the buffer values are set in + // DroppedFile::open. + if (!isOpen()) + { + bufferMode = bufmode; + bufferSize = size; + return true; + } + + int vbufmode; + switch (bufmode) + { + case File::BUFFER_NONE: + default: + vbufmode = _IONBF; + break; + case File::BUFFER_LINE: + vbufmode = _IOLBF; + break; + case File::BUFFER_FULL: + vbufmode = _IOFBF; + break; + } + + if (setvbuf(file, nullptr, vbufmode, (size_t) size) != 0) + return false; + + bufferMode = bufmode; + bufferSize = size; + + return true; +} + +File::BufferMode DroppedFile::getBuffer(int64 &size) const +{ + size = bufferSize; + return bufferMode; +} + +const std::string &DroppedFile::getFilename() const +{ + return filename; +} + +File::Mode DroppedFile::getMode() const +{ + return mode; +} + +const char *DroppedFile::getModeString(Mode mode) +{ + switch (mode) + { + case File::MODE_CLOSED: + default: + return "c"; + case File::MODE_READ: + return "rb"; + case File::MODE_WRITE: + return "wb"; + case File::MODE_APPEND: + return "ab"; + } +} + +} // filesystem +} // love diff --git a/jni/love/src/modules/filesystem/DroppedFile.h b/jni/love/src/modules/filesystem/DroppedFile.h new file mode 100644 index 00000000..3e541728 --- /dev/null +++ b/jni/love/src/modules/filesystem/DroppedFile.h @@ -0,0 +1,83 @@ +/** + * Copyright (c) 2006-2015 LOVE Development Team + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. + **/ + +#ifndef LOVE_FILESYSTEM_DROPPED_FILE_H +#define LOVE_FILESYSTEM_DROPPED_FILE_H + +// LOVE +#include "common/config.h" +#include "File.h" + +// C +#include + +namespace love +{ +namespace filesystem +{ + +/** + * File which is created when a user drags and drops an actual file onto the + * LOVE game. Uses C's stdio. Filenames are system-dependent full paths. + **/ +class DroppedFile : public File +{ +public: + + DroppedFile(const std::string &filename); + virtual ~DroppedFile(); + + // Implements File. + using File::read; + using File::write; + bool open(Mode mode) override; + bool close() override; + bool isOpen() const override; + int64 getSize() override; + int64 read(void *dst, int64 size) override; + bool write(const void *data, int64 size) override; + bool flush() override; + bool isEOF() override; + int64 tell() override; + bool seek(uint64 pos) override; + bool setBuffer(BufferMode bufmode, int64 size) override; + BufferMode getBuffer(int64 &size) const override; + Mode getMode() const override; + const std::string &getFilename() const override; + +private: + + static const char *getModeString(Mode mode); + + std::string filename; + + FILE *file; + + Mode mode; + + BufferMode bufferMode; + int64 bufferSize; + +}; // DroppedFile + +} // filesystem +} // love + +#endif // LOVE_FILESYSTEM_DROPPED_FILE_H diff --git a/jni/love/src/modules/filesystem/File.cpp b/jni/love/src/modules/filesystem/File.cpp index ffc301b7..6f4f4499 100644 --- a/jni/love/src/modules/filesystem/File.cpp +++ b/jni/love/src/modules/filesystem/File.cpp @@ -29,6 +29,68 @@ File::~File() { } +FileData *File::read(int64 size) +{ + bool isopen = isOpen(); + + if (!isopen && !open(MODE_READ)) + throw love::Exception("Could not read file %s.", getFilename().c_str()); + + int64 max = getSize(); + int64 cur = tell(); + size = (size == ALL) ? max : size; + + if (size < 0) + throw love::Exception("Invalid read size."); + + // Clamping because the file offset may be in a weird position. + if (cur < 0) + cur = 0; + else if (cur > max) + cur = max; + + if (cur + size > max) + size = max - cur; + + FileData *fileData = new FileData(size, getFilename()); + int64 bytesRead = read(fileData->getData(), size); + + if (bytesRead < 0 || (bytesRead == 0 && bytesRead != size)) + { + delete fileData; + throw love::Exception("Could not read from file."); + } + + if (bytesRead < size) + { + FileData *tmpFileData = new FileData(bytesRead, getFilename()); + memcpy(tmpFileData->getData(), fileData->getData(), (size_t) bytesRead); + fileData->release(); + fileData = tmpFileData; + } + + if (!isopen) + close(); + + return fileData; +} + +bool File::write(const Data *data, int64 size) +{ + return write(data->getData(), (size == ALL) ? data->getSize() : size); +} + +std::string File::getExtension() const +{ + const std::string &filename = getFilename(); + std::string::size_type idx = filename.rfind('.'); + + if (idx != std::string::npos) + return filename.substr(idx+1); + else + return std::string(); +} + bool File::getConstant(const char *in, Mode &out) { return modes.find(in, out); @@ -51,10 +113,10 @@ bool File::getConstant(BufferMode in, const char *&out) StringMap::Entry File::modeEntries[] = { - {"c", File::CLOSED}, - {"r", File::READ}, - {"w", File::WRITE}, - {"a", File::APPEND}, + {"c", File::MODE_CLOSED}, + {"r", File::MODE_READ}, + {"w", File::MODE_WRITE}, + {"a", File::MODE_APPEND}, }; StringMap File::modes(File::modeEntries, sizeof(File::modeEntries)); diff --git a/jni/love/src/modules/filesystem/File.h b/jni/love/src/modules/filesystem/File.h index f7a161f1..923ddb72 100644 --- a/jni/love/src/modules/filesystem/File.h +++ b/jni/love/src/modules/filesystem/File.h @@ -49,10 +49,10 @@ public: **/ enum Mode { - CLOSED, - READ, - WRITE, - APPEND, + MODE_CLOSED, + MODE_READ, + MODE_WRITE, + MODE_APPEND, MODE_MAX_ENUM }; @@ -77,7 +77,7 @@ public: /** * Opens the file in a certain mode. * - * @param mode READ, WRITE, APPEND. + * @param mode MODE_READ, MODE_WRITE, MODE_APPEND. * @return True if successful, false otherwise. **/ virtual bool open(Mode mode) = 0; @@ -107,7 +107,7 @@ public: * @param size The number of bytes to attempt reading, or -1 for EOF. * @return A newly allocated Data object. **/ - virtual FileData *read(int64 size = ALL) = 0; + virtual FileData *read(int64 size = ALL); /** * Reads data into the destination buffer. @@ -134,7 +134,7 @@ public: * @param size The number of bytes to attempt writing, or -1 for everything. * @return True of success, false otherwise. **/ - virtual bool write(const Data *data, int64 size = ALL) = 0; + virtual bool write(const Data *data, int64 size = ALL); /** * Flushes the currently buffered file data to disk. Only applicable in @@ -147,7 +147,7 @@ public: * * @return True if EOF, false otherwise. **/ - virtual bool eof() = 0; + virtual bool isEOF() = 0; /** * Gets the current position in the File. @@ -192,13 +192,13 @@ public: * Gets the filename for this File, or empty string if none. * @return The filename for this File. **/ - virtual std::string getFilename() const = 0; + virtual const std::string &getFilename() const = 0; /** * Gets the file extension for this File, or empty string if none. * @return The file extension for this File (without the dot). **/ - virtual std::string getExtension() const = 0; + virtual std::string getExtension() const; static bool getConstant(const char *in, Mode &out); static bool getConstant(Mode in, const char *&out); diff --git a/jni/love/src/modules/filesystem/Filesystem.cpp b/jni/love/src/modules/filesystem/Filesystem.cpp new file mode 100644 index 00000000..a9975b54 --- /dev/null +++ b/jni/love/src/modules/filesystem/Filesystem.cpp @@ -0,0 +1,105 @@ +/** + * Copyright (c) 2006-2015 LOVE Development Team + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. + **/ + +// LOVE +#include "Filesystem.h" +#include "common/utf8.h" + +// Assume POSIX or Visual Studio. +#include +#include + +#if defined(LOVE_MACOSX) +#include "common/OSX.h" +#elif defined(LOVE_IOS) +#include "common/iOS.h" +#elif defined(LOVE_WINDOWS) +#include +#include "common/utf8.h" +#elif defined(LOVE_LINUX) +#include +#endif + +namespace love +{ +namespace filesystem +{ + +Filesystem::Filesystem() +{ +} + +Filesystem::~Filesystem() +{ +} + +bool Filesystem::isRealDirectory(const std::string &path) const +{ +#ifdef LOVE_WINDOWS + // make sure non-ASCII paths work. + std::wstring wpath = to_widestr(path); + + struct _stat buf; + if (_wstat(wpath.c_str(), &buf) != 0) + return false; + + return (buf.st_mode & _S_IFDIR) == _S_IFDIR; +#else + // Assume POSIX support... + struct stat buf; + if (stat(path.c_str(), &buf) != 0) + return false; + + return S_ISDIR(buf.st_mode) != 0; +#endif +} + +std::string Filesystem::getExecutablePath() const +{ +#if defined(LOVE_MACOSX) + return love::osx::getExecutablePath(); +#elif defined(LOVE_IOS) + return love::ios::getExecutablePath(); +#elif defined(LOVE_WINDOWS) + + wchar_t buffer[MAX_PATH + 1] = {0}; + + if (GetModuleFileNameW(nullptr, buffer, MAX_PATH) == 0) + return ""; + + return to_utf8(buffer); + +#elif defined(LOVE_LINUX) + + char buffer[2048] = {0}; + + ssize_t len = readlink("/proc/self/exe", buffer, 2048); + if (len <= 0) + return ""; + + return std::string(buffer, len); + +#else +#error Missing implementation for Filesystem::getExecutablePath! +#endif +} + +} // filesystem +} // love diff --git a/jni/love/src/modules/filesystem/Filesystem.h b/jni/love/src/modules/filesystem/Filesystem.h new file mode 100644 index 00000000..257c456a --- /dev/null +++ b/jni/love/src/modules/filesystem/Filesystem.h @@ -0,0 +1,265 @@ +/** + * Copyright (c) 2006-2015 LOVE Development Team + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. + **/ + +#ifndef LOVE_FILESYSTEM_FILESYSTEM_H +#define LOVE_FILESYSTEM_FILESYSTEM_H + +// LOVE +#include "common/config.h" +#include "common/Module.h" +#include "common/int.h" +#include "FileData.h" +#include "File.h" + +// C++ +#include +#include + +// In Windows, we would like to use "LOVE" as the +// application folder, but in Linux, we like .love. +#define LOVE_APPDATA_PREFIX "" +#ifdef LOVE_WINDOWS +# define LOVE_APPDATA_FOLDER "LOVE" +# define LOVE_PATH_SEPARATOR "/" +# define LOVE_MAX_PATH _MAX_PATH +#else +# if defined(LOVE_MACOSX) || defined(LOVE_IOS) +# define LOVE_APPDATA_FOLDER "LOVE" +# elif defined(LOVE_LINUX) +# define LOVE_APPDATA_FOLDER "love" +# else +# define LOVE_APPDATA_PREFIX "." +# define LOVE_APPDATA_FOLDER "love" +# endif +# define LOVE_PATH_SEPARATOR "/" +# define LOVE_MAX_PATH MAXPATHLEN +#endif + +namespace love +{ +namespace filesystem +{ + +class Filesystem : public Module +{ +public: + + Filesystem(); + virtual ~Filesystem(); + + // Implements Module. + virtual ModuleType getModuleType() const { return M_FILESYSTEM; } + + virtual void init(const char *arg0) = 0; + + virtual void setFused(bool fused) = 0; + virtual bool isFused() const = 0; + + /** + * This sets up the save directory. If the + * it is already set up, nothing happens. + * @return True on success, false otherwise. + **/ + virtual bool setupWriteDirectory() = 0; + + /** + * Sets the name of the save folder. + * @param ident The name of the game. Will be used to + * to create the folder in the LOVE data folder. + **/ + virtual bool setIdentity(const char *ident, bool appendToPath = false) = 0; + virtual const char *getIdentity() const = 0; + + /** + * Sets the path to the game source. + * This can only be set once. + * @param source Path to a directory or a .love-file. + **/ + virtual bool setSource(const char *source) = 0; + + /** + * Gets the path to the game source. + * Returns a 0-length string if the source has not been set. + **/ + virtual const char *getSource() const = 0; + + virtual bool mount(const char *archive, const char *mountpoint, bool appendToPath = false) = 0; + virtual bool unmount(const char *archive) = 0; + + /** + * Creates a new file. + **/ + virtual File *newFile(const char *filename) const = 0; + + /** + * Creates a new FileData object. Data will be copied. + * @param data Pointer to the data. + * @param size The size of the data. + * @param filename The full filename used to file type identification. + **/ + virtual FileData *newFileData(void *data, unsigned int size, const char *filename) const = 0; + + /** + * Creates a new FileData object from base64 data. + * @param b64 The base64 data. + **/ + virtual FileData *newFileData(const char *b64, const char *filename) const = 0; + + /** + * Gets the current working directory. + **/ + virtual const char *getWorkingDirectory() = 0; + + /** + * Gets the user home directory. + **/ + virtual std::string getUserDirectory() = 0; + + /** + * Gets the APPDATA directory. On Windows, this is the folder + * in the %APPDATA% enviroment variable. On Linux, this is the + * user home folder. + **/ + virtual std::string getAppdataDirectory() = 0; + + /** + * Gets the full path of the save folder. + **/ + virtual const char *getSaveDirectory() = 0; + + /** + * Gets the full path to the directory containing the game source. + * For example if the game source is C:\Games\mygame.love, this will return + * C:\Games. + **/ + virtual std::string getSourceBaseDirectory() const = 0; + + /** + * Gets the real directory path containing the file. + **/ + virtual std::string getRealDirectory(const char *filename) const = 0; + + /** + * Checks if a path is a directory. + * @param dir The directory name to check. + **/ + virtual bool isDirectory(const char *dir) const = 0; + + /** + * Checks if a filename exists. + * @param file The filename to check. + **/ + virtual bool isFile(const char *file) const = 0; + + /** + * Creates a directory. Write dir must be set. + * @param dir The directory to create. + **/ + virtual bool createDirectory(const char *dir) = 0; + + /** + * Removes a file (or directory). + * @param file The file or directory to remove. + **/ + virtual bool remove(const char *file) = 0; + + /** + * Reads data from a file. + * @param filename The name of the file to read from. + * @param size The size in bytes of the data to read. + **/ + virtual FileData *read(const char *filename, int64 size = File::ALL) const = 0; + + /** + * Write data to a file. + * @param filename The name of the file to write to. + * @param data The data to write. + * @param size The size in bytes of the data to write. + **/ + virtual void write(const char *filename, const void *data, int64 size) const = 0; + + /** + * Append data to a file, creating it if it doesn't exist. + * @param filename The name of the file to write to. + * @param data The data to append. + * @param size The size in bytes of the data to append. + **/ + virtual void append(const char *filename, const void *data, int64 size) const = 0; + + /** + * This "native" method returns a table of all + * files in a given directory. + **/ + virtual void getDirectoryItems(const char *dir, std::vector &items) = 0; + + /** + * Gets the last modification time of a file, in seconds + * since the Unix epoch. + * @param filename The name of the file. + **/ + virtual int64 getLastModified(const char *filename) const = 0; + + /** + * Gets the size of a file in bytes. + * @param filename The name of the file. + **/ + virtual int64 getSize(const char *filename) const = 0; + + /** + * Enable or disable symbolic link support in love.filesystem. + **/ + virtual void setSymlinksEnabled(bool enable) = 0; + + /** + * Gets whether symbolic link support is enabled. + **/ + virtual bool areSymlinksEnabled() const = 0; + + /** + * Gets whether a filepath is actually a symlink. + * Always returns false if symlinks are not enabled. + **/ + virtual bool isSymlink(const char *filename) const = 0; + + // Require path accessors + // Not const because it's R/W + virtual std::vector &getRequirePath() = 0; + + /** + * Allows a full (OS-dependent) path to be used with Filesystem::mount. + **/ + virtual void allowMountingForPath(const std::string &path) = 0; + + /** + * Gets whether the given full (OS-dependent) path is a directory. + **/ + virtual bool isRealDirectory(const std::string &path) const; + + /** + * Gets the full platform-dependent path to the executable. + **/ + virtual std::string getExecutablePath() const; + +}; // Filesystem + +} // filesystem +} // love + +#endif // LOVE_FILESYSTEM_FILESYSTEM_H diff --git a/jni/love/src/modules/filesystem/physfs/File.cpp b/jni/love/src/modules/filesystem/physfs/File.cpp index 790398b9..8b07390b 100644 --- a/jni/love/src/modules/filesystem/physfs/File.cpp +++ b/jni/love/src/modules/filesystem/physfs/File.cpp @@ -39,8 +39,8 @@ namespace physfs File::File(const std::string &filename) : filename(filename) - , file(0) - , mode(CLOSED) + , file(nullptr) + , mode(MODE_CLOSED) , bufferMode(BUFFER_NONE) , bufferSize(0) { @@ -48,25 +48,25 @@ File::File(const std::string &filename) File::~File() { - if (mode != CLOSED) + if (mode != MODE_CLOSED) close(); } bool File::open(Mode mode) { - if (mode == CLOSED) + if (mode == MODE_CLOSED) return true; // File must exist if read mode. - if ((mode == READ) && !PHYSFS_exists(filename.c_str())) + if ((mode == MODE_READ) && !PHYSFS_exists(filename.c_str())) throw love::Exception("Could not open file %s. Does not exist.", filename.c_str()); // Check whether the write directory is set. - if ((mode == APPEND || mode == WRITE) && (PHYSFS_getWriteDir() == 0) && !hack_setupWriteDirectory()) + if ((mode == MODE_APPEND || mode == MODE_WRITE) && (PHYSFS_getWriteDir() == 0) && !hack_setupWriteDirectory()) throw love::Exception("Could not set write directory."); // File already open? - if (file != 0) + if (file != nullptr) return false; PHYSFS_getLastError(); // Clear the error buffer. @@ -74,13 +74,13 @@ bool File::open(Mode mode) switch (mode) { - case READ: + case MODE_READ: handle = PHYSFS_openRead(filename.c_str()); break; - case APPEND: + case MODE_APPEND: handle = PHYSFS_openAppend(filename.c_str()); break; - case WRITE: + case MODE_WRITE: handle = PHYSFS_openWrite(filename.c_str()); break; default: @@ -99,94 +99,50 @@ bool File::open(Mode mode) this->mode = mode; - if (file != 0 && !setBuffer(bufferMode, bufferSize)) + if (file != nullptr && !setBuffer(bufferMode, bufferSize)) { // Revert to buffer defaults if we don't successfully set the buffer. bufferMode = BUFFER_NONE; bufferSize = 0; } - return (file != 0); + return (file != nullptr); } bool File::close() { - if (!PHYSFS_close(file)) + if (file == nullptr || !PHYSFS_close(file)) return false; - mode = CLOSED; - file = 0; + + mode = MODE_CLOSED; + file = nullptr; + return true; } bool File::isOpen() const { - return mode != CLOSED && file != 0; + return mode != MODE_CLOSED && file != nullptr; } int64 File::getSize() { // If the file is closed, open it to // check the size. - if (file == 0) + if (file == nullptr) { - open(READ); - int64 size = (int64)PHYSFS_fileLength(file); + open(MODE_READ); + int64 size = (int64) PHYSFS_fileLength(file); close(); return size; } - return (int64)PHYSFS_fileLength(file); -} - - -FileData *File::read(int64 size) -{ - bool isOpen = (file != 0); - - if (!isOpen && !open(READ)) - throw love::Exception("Could not read file %s.", filename.c_str()); - - int64 max = getSize(); - int64 cur = tell(); - size = (size == ALL) ? max : size; - - if (size < 0) - throw love::Exception("Invalid read size."); - - // Clamping because the file offset may be in a weird position. - if (cur < 0) - cur = 0; - else if (cur > max) - cur = max; - - if (cur + size > max) - size = max - cur; - - FileData *fileData = new FileData(size, getFilename()); - int64 bytesRead = read(fileData->getData(), size); - - if (bytesRead < 0 || (bytesRead == 0 && bytesRead != size)) - { - delete fileData; - throw love::Exception("Could not read from file."); - } - if (bytesRead < size) - { - FileData *tmpFileData = new FileData(bytesRead, getFilename()); - memcpy(tmpFileData->getData(), fileData->getData(), (size_t) bytesRead); - delete fileData; - fileData = tmpFileData; - } - - if (!isOpen) - close(); - - return fileData; + return (int64) PHYSFS_fileLength(file); } int64 File::read(void *dst, int64 size) { - if (!file || mode != READ) + if (!file || mode != MODE_READ) throw love::Exception("File is not opened for reading."); int64 max = (int64)PHYSFS_fileLength(file); @@ -205,7 +161,7 @@ int64 File::read(void *dst, int64 size) bool File::write(const void *data, int64 size) { - if (!file || (mode != WRITE && mode != APPEND)) + if (!file || (mode != MODE_WRITE && mode != MODE_APPEND)) throw love::Exception("File is not opened for writing."); // Another clamp, for the time being. @@ -215,7 +171,7 @@ bool File::write(const void *data, int64 size) throw love::Exception("Invalid write size."); // Try to write. - int64 written = static_cast(PHYSFS_write(file, data, 1, (PHYSFS_uint32) size)); + int64 written = (int64) PHYSFS_write(file, data, 1, (PHYSFS_uint32) size); // Check that correct amount of data was written. if (written != size) @@ -231,14 +187,9 @@ bool File::write(const void *data, int64 size) return true; } -bool File::write(const Data *data, int64 size) -{ - return write(data->getData(), (size == ALL) ? data->getSize() : size); -} - bool File::flush() { - if (!file || (mode != WRITE && mode != APPEND)) + if (!file || (mode != MODE_WRITE && mode != MODE_APPEND)) throw love::Exception("File is not opened for writing."); return PHYSFS_flush(file) != 0; @@ -261,16 +212,14 @@ inline bool test_eof(File *, PHYSFS_File *file) } #endif -bool File::eof() +bool File::isEOF() { - if (file == 0 || test_eof(this, file)) - return true; - return false; + return file == nullptr || test_eof(this, file); } int64 File::tell() { - if (file == 0) + if (file == nullptr) return -1; return (int64) PHYSFS_tell(file); @@ -278,23 +227,17 @@ int64 File::tell() bool File::seek(uint64 pos) { - if (file == 0) - return false; - - if (!PHYSFS_seek(file, (PHYSFS_uint64) pos)) - return false; - return true; + return file != nullptr && PHYSFS_seek(file, (PHYSFS_uint64) pos) != 0; } bool File::setBuffer(BufferMode bufmode, int64 size) { - // No negativity allowed! if (size < 0) return false; // If the file isn't open, we'll make sure the buffer values are set in // File::open. - if (file == 0 || mode == CLOSED) + if (!isOpen()) { bufferMode = bufmode; bufferSize = size; @@ -331,21 +274,11 @@ File::BufferMode File::getBuffer(int64 &size) const return bufferMode; } -std::string File::getFilename() const +const std::string &File::getFilename() const { return filename; } -std::string File::getExtension() const -{ - std::string::size_type idx = filename.rfind('.'); - - if (idx != std::string::npos) - return filename.substr(idx+1); - else - return std::string(); -} - filesystem::File::Mode File::getMode() const { return mode; diff --git a/jni/love/src/modules/filesystem/physfs/File.h b/jni/love/src/modules/filesystem/physfs/File.h index 5738fbc3..999c28e3 100644 --- a/jni/love/src/modules/filesystem/physfs/File.h +++ b/jni/love/src/modules/filesystem/physfs/File.h @@ -25,7 +25,7 @@ #include "filesystem/File.h" // PhysFS -#ifdef LOVE_MACOSX_USE_FRAMEWORKS +#ifdef LOVE_APPLE_USE_FRAMEWORKS #include #else #include @@ -54,23 +54,22 @@ public: virtual ~File(); // Implements love::filesystem::File. - bool open(Mode mode); - bool close(); - bool isOpen() const; - int64 getSize(); - FileData *read(int64 size = ALL); - int64 read(void *dst, int64 size); - bool write(const void *data, int64 size); - bool write(const Data *data, int64 size = ALL); - bool flush(); - bool eof(); - int64 tell(); - bool seek(uint64 pos); - bool setBuffer(BufferMode bufmode, int64 size); - BufferMode getBuffer(int64 &size) const; - Mode getMode() const; - std::string getFilename() const; - std::string getExtension() const; + using love::filesystem::File::read; + using love::filesystem::File::write; + bool open(Mode mode) override; + bool close() override; + bool isOpen() const override; + int64 getSize() override; + virtual int64 read(void *dst, int64 size) override; + bool write(const void *data, int64 size) override; + bool flush() override; + bool isEOF() override; + int64 tell() override; + bool seek(uint64 pos) override; + bool setBuffer(BufferMode bufmode, int64 size) override; + BufferMode getBuffer(int64 &size) const override; + Mode getMode() const override; + const std::string &getFilename() const override; private: diff --git a/jni/love/src/modules/filesystem/physfs/Filesystem.cpp b/jni/love/src/modules/filesystem/physfs/Filesystem.cpp index 13c1f66f..8b868d6e 100644 --- a/jni/love/src/modules/filesystem/physfs/Filesystem.cpp +++ b/jni/love/src/modules/filesystem/physfs/Filesystem.cpp @@ -18,15 +18,37 @@ * 3. This notice may not be removed or altered from any source distribution. **/ -#include "common/config.h" - #include #include +#include #include "common/utf8.h" #include "common/b64.h" #include "Filesystem.h" +#include "File.h" + +// PhysFS +#ifdef LOVE_APPLE_USE_FRAMEWORKS +#include +#else +#include +#endif + +// For great CWD. (Current Working Directory) +// Using this instead of boost::filesystem which totally +// cramped our style. +#ifdef LOVE_WINDOWS +# include +# include +#else +# include +# include +#endif + +#ifdef LOVE_IOS +# include "common/iOS.h" +#endif #include "SDL.h" #include @@ -81,15 +103,15 @@ namespace physfs { Filesystem::Filesystem() - : initialized(false) - , fused(false) + : fused(false) , fusedSet(false) { + requirePath = {"?.lua", "?/init.lua"}; } Filesystem::~Filesystem() { - if (initialized) + if (PHYSFS_isInit()) PHYSFS_deinit(); } @@ -101,13 +123,14 @@ const char *Filesystem::getName() const void Filesystem::init(const char *arg0) { if (!PHYSFS_init(arg0)) - throw Exception(PHYSFS_getLastError()); + throw love::Exception("%s", PHYSFS_getLastError()); -#ifdef LOVE_ANDROID - PHYSFS_permitSymbolicLinks (1); -#endif + PHYSFS_Version version = {}; + PHYSFS_getLinkedVersion(&version); - initialized = true; + // FIXME: This is a workaround for a bug in PHYSFS_enumerateFiles in 2.1-alpha. + if (version.major == 2 && version.minor == 1) + PHYSFS_permitSymbolicLinks(1); } void Filesystem::setFused(bool fused) @@ -127,7 +150,7 @@ bool Filesystem::isFused() const bool Filesystem::setIdentity(const char *ident, bool appendToPath) { - if (!initialized) + if (!PHYSFS_isInit()) return false; std::string old_save_path = save_path_full; @@ -185,7 +208,7 @@ bool Filesystem::setIdentity(const char *ident, bool appendToPath) // Try to add the save directory to the search path. // (No error on fail, it means that the path doesn't exist). - PHYSFS_addToSearchPath(save_path_full.c_str(), appendToPath); + PHYSFS_mount(save_path_full.c_str(), nullptr, appendToPath); // HACK: This forces setupWriteDirectory to be called the next time a file // is opened for writing - otherwise it won't be called at all if it was @@ -202,7 +225,7 @@ const char *Filesystem::getIdentity() const bool Filesystem::setSource(const char *source) { - if (!initialized) + if (!PHYSFS_isInit()) return false; // Check whether directory is already set. @@ -253,7 +276,7 @@ bool Filesystem::setSource(const char *source) new_search_path = game_path; sdcard_main->close(sdcard_main); - if (!PHYSFS_addToSearchPath(new_search_path.c_str(), 1)) { + if (!PHYSFS_mount(new_search_path.c_str(), nullptr, 1)) { SDL_Log ("mounting of %s failed", new_search_path.c_str()); return false; } @@ -265,10 +288,9 @@ bool Filesystem::setSource(const char *source) } #else // Add the directory. - if (!PHYSFS_addToSearchPath(new_search_path.c_str(), 1)) { + if (!PHYSFS_mount(new_search_path.c_str(), nullptr, 1)) { SDL_Log ("mounting of %s failed", new_search_path.c_str()); return false; - } #endif // Save the game source. @@ -284,7 +306,7 @@ const char *Filesystem::getSource() const bool Filesystem::setupWriteDirectory() { - if (!initialized) + if (!PHYSFS_isInit()) return false; // These must all be set. @@ -329,7 +351,7 @@ bool Filesystem::setupWriteDirectory() return false; // Add the directory. (Will not be readded if already present). - if (!PHYSFS_addToSearchPath(save_path_full.c_str(), 0)) + if (!PHYSFS_mount(save_path_full.c_str(), nullptr, 0)) { PHYSFS_setWriteDir(nullptr); // Clear the write directory in case of error. return false; @@ -340,13 +362,18 @@ bool Filesystem::setupWriteDirectory() bool Filesystem::mount(const char *archive, const char *mountpoint, bool appendToPath) { - if (!initialized || !archive) + if (!PHYSFS_isInit() || !archive) return false; std::string realPath; std::string sourceBase = getSourceBaseDirectory(); - if (isFused() && sourceBase.compare(archive) == 0) + // Check whether the given archive path is in the list of allowed full paths. + auto it = std::find(allowedMountPaths.begin(), allowedMountPaths.end(), archive); + + if (it != allowedMountPaths.end()) + realPath = *it; + else if (isFused() && sourceBase.compare(archive) == 0) { // Special case: if the game is fused and the archive is the source's // base directory, mount it even though it's outside of the save dir. @@ -376,18 +403,23 @@ bool Filesystem::mount(const char *archive, const char *mountpoint, bool appendT if (realPath.length() == 0) return false; - return PHYSFS_mount(realPath.c_str(), mountpoint, appendToPath); + return PHYSFS_mount(realPath.c_str(), mountpoint, appendToPath) != 0; } bool Filesystem::unmount(const char *archive) { - if (!initialized || !archive) + if (!PHYSFS_isInit() || !archive) return false; std::string realPath; std::string sourceBase = getSourceBaseDirectory(); - if (isFused() && sourceBase.compare(archive) == 0) + // Check whether the given archive path is in the list of allowed full paths. + auto it = std::find(allowedMountPaths.begin(), allowedMountPaths.end(), archive); + + if (it != allowedMountPaths.end()) + realPath = *it; + else if (isFused() && sourceBase.compare(archive) == 0) { // Special case: if the game is fused and the archive is the source's // base directory, unmount it even though it's outside of the save dir. @@ -412,10 +444,10 @@ bool Filesystem::unmount(const char *archive) if (!mountPoint) return false; - return PHYSFS_removeFromSearchPath(realPath.c_str()); + return PHYSFS_removeFromSearchPath(realPath.c_str()) != 0; } -File *Filesystem::newFile(const char *filename) const +love::filesystem::File *Filesystem::newFile(const char *filename) const { return new File(filename); } @@ -432,7 +464,7 @@ FileData *Filesystem::newFileData(void *data, unsigned int size, const char *fil FileData *Filesystem::newFileData(const char *b64, const char *filename) const { - int size = strlen(b64); + int size = (int) strlen(b64); int outsize = 0; char *dst = b64_decode(b64, size, outsize); FileData *fd = new FileData(outsize, std::string(filename)); @@ -485,6 +517,8 @@ std::string Filesystem::getAppdataDirectory() std::string udir = getUserDirectory(); udir.append("/Library/Application Support"); appdata = normalize(udir); +#elif defined(LOVE_IOS) + appdata = normalize(love::ios::getAppdataDirectory()); #elif defined(LOVE_LINUX) char *xdgdatahome = getenv("XDG_DATA_HOME"); if (!xdgdatahome) @@ -540,19 +574,14 @@ std::string Filesystem::getRealDirectory(const char *filename) const return std::string(dir); } -bool Filesystem::exists(const char *file) const +bool Filesystem::isDirectory(const char *dir) const { - return PHYSFS_exists(file); -} - -bool Filesystem::isDirectory(const char *file) const -{ - return PHYSFS_isDirectory(file); + return PHYSFS_isDirectory(dir) != 0; } bool Filesystem::isFile(const char *file) const { - return exists(file) && !isDirectory(file); + return PHYSFS_exists(file) && !PHYSFS_isDirectory(file); } bool Filesystem::createDirectory(const char *dir) @@ -575,11 +604,11 @@ bool Filesystem::remove(const char *file) return true; } -Data *Filesystem::read(const char *filename, int64 size) const +FileData *Filesystem::read(const char *filename, int64 size) const { File file(filename); - file.open(File::READ); + file.open(File::MODE_READ); // close() is called in the File destructor. return file.read(size); @@ -589,7 +618,7 @@ void Filesystem::write(const char *filename, const void *data, int64 size) const { File file(filename); - file.open(File::WRITE); + file.open(File::MODE_WRITE); // close() is called in the File destructor. if (!file.write(data, size)) @@ -600,145 +629,21 @@ void Filesystem::append(const char *filename, const void *data, int64 size) cons { File file(filename); - file.open(File::APPEND); + file.open(File::MODE_APPEND); // close() is called in the File destructor. if (!file.write(data, size)) throw love::Exception("Data could not be written."); } -int Filesystem::getDirectoryItems(lua_State *L) +void Filesystem::getDirectoryItems(const char *dir, std::vector &items) { - const char *dir = luaL_checkstring(L, 1); - bool hascallback = !lua_isnoneornil(L, 2); - - if (hascallback) - luaL_checktype(L, 2, LUA_TFUNCTION); - char **rc = PHYSFS_enumerateFiles(dir); - int index = 1; - - lua_newtable(L); for (char **i = rc; *i != 0; i++) - { - if (hascallback) - { - lua_pushvalue(L, 2); - lua_pushstring(L, *i); - lua_call(L, 1, 0); - } - - lua_pushstring(L, *i); - lua_rawseti(L, -2, index); - index++; - } + items.push_back(*i); PHYSFS_freeList(rc); - - return 1; -} - -int Filesystem::lines_i(lua_State *L) -{ - const int bufsize = 1024; - char buf[bufsize]; - int linesize = 0; - bool newline = false; - - File *file = luax_checktype(L, lua_upvalueindex(1), "File", FILESYSTEM_FILE_T); - - // Only accept read mode at this point. - if (file->getMode() != File::READ) - return luaL_error(L, "File needs to stay in read mode."); - - int64 pos = file->tell(); - int64 userpos = -1; - - if (lua_isnoneornil(L, lua_upvalueindex(2)) == 0) - { - // User may have changed the file position. - userpos = pos; - pos = (int64) lua_tonumber(L, lua_upvalueindex(2)); - if (userpos != pos) - file->seek(pos); - } - - while (!newline && !file->eof()) - { - // This 64-bit to 32-bit integer cast should be safe as it never exceeds bufsize. - int read = (int) file->read(buf, bufsize); - if (read < 0) - return luaL_error(L, "Could not read from file."); - - linesize += read; - - for (int i = 0; i < read; i++) - { - if (buf[i] == '\n') - { - linesize -= read - i; - newline = true; - break; - } - } - } - - if (newline || (file->eof() && linesize > 0)) - { - if (linesize < bufsize) - { - // We have the line in the buffer on the stack. No 'new' and 'read' needed. - lua_pushlstring(L, buf, linesize > 0 && buf[linesize - 1] == '\r' ? linesize - 1 : linesize); - if (userpos < 0) - file->seek(pos + linesize + 1); - } - else - { - char *str = 0; - try - { - str = new char[linesize + 1]; - } - catch(std::bad_alloc &) - { - // Can't lua_error (longjmp) in exception handlers. - } - - if (!str) - return luaL_error(L, "Out of memory."); - - file->seek(pos); - - // Read the \n anyway and save us a call to seek. - if (file->read(str, linesize + 1) == -1) - { - delete [] str; - return luaL_error(L, "Could not read from file."); - } - - lua_pushlstring(L, str, str[linesize - 1] == '\r' ? linesize - 1 : linesize); - delete [] str; - } - - if (userpos >= 0) - { - // Save new position in upvalue. - lua_pushnumber(L, (lua_Number)(pos + linesize + 1)); - lua_replace(L, lua_upvalueindex(2)); - file->seek(userpos); - } - - return 1; - } - - // EOF reached. - if (userpos >= 0 && luax_toboolean(L, lua_upvalueindex(3))) - file->seek(userpos); - else - file->close(); - - return 0; } int64 Filesystem::getLastModified(const char *filename) const @@ -773,6 +678,17 @@ bool Filesystem::isSymlink(const char *filename) const return PHYSFS_isSymbolicLink(filename) != 0; } +std::vector &Filesystem::getRequirePath() +{ + return requirePath; +} + +void Filesystem::allowMountingForPath(const std::string &path) +{ + if (std::find(allowedMountPaths.begin(), allowedMountPaths.end(), path) == allowedMountPaths.end()) + allowedMountPaths.push_back(path); +} + } // physfs } // filesystem } // love diff --git a/jni/love/src/modules/filesystem/physfs/Filesystem.h b/jni/love/src/modules/filesystem/physfs/Filesystem.h index 23d7eb1f..d3cd9665 100644 --- a/jni/love/src/modules/filesystem/physfs/Filesystem.h +++ b/jni/love/src/modules/filesystem/physfs/Filesystem.h @@ -24,46 +24,9 @@ // STD #include #include -#include // LOVE -#include "common/Module.h" -#include "common/config.h" -#include "common/int.h" -#include "common/runtime.h" -#include "filesystem/FileData.h" -#include "File.h" - -// For great CWD. (Current Working Directory) -// Using this instead of boost::filesystem which totally -// cramped our style. -#ifdef LOVE_WINDOWS -# include -# include -#else -# include -# include -#endif - -// In Windows, we would like to use "LOVE" as the -// application folder, but in Linux, we like .love. -#define LOVE_APPDATA_PREFIX "" -#ifdef LOVE_WINDOWS -# define LOVE_APPDATA_FOLDER "LOVE" -# define LOVE_PATH_SEPARATOR "/" -# define LOVE_MAX_PATH _MAX_PATH -#else -# ifdef LOVE_MACOSX -# define LOVE_APPDATA_FOLDER "LOVE" -# elif defined(LOVE_LINUX) -# define LOVE_APPDATA_FOLDER "love" -# else -# define LOVE_APPDATA_PREFIX "." -# define LOVE_APPDATA_FOLDER "love" -# endif -# define LOVE_PATH_SEPARATOR "/" -# define LOVE_MAX_PATH MAXPATHLEN -#endif +#include "filesystem/Filesystem.h" namespace love { @@ -72,7 +35,7 @@ namespace filesystem namespace physfs { -class Filesystem : public Module +class Filesystem : public love::filesystem::Filesystem { public: @@ -80,7 +43,6 @@ public: virtual ~Filesystem(); // Implements Module. - virtual ModuleType getModuleType() const { return M_FILESYSTEM; } const char *getName() const; void init(const char *arg0); @@ -88,186 +50,54 @@ public: void setFused(bool fused); bool isFused() const; - /** - * This sets up the save directory. If the - * it is already set up, nothing happens. - * @return True on success, false otherwise. - **/ bool setupWriteDirectory(); - /** - * Sets the name of the save folder. - * @param ident The name of the game. Will be used to - * to create the folder in the LOVE data folder. - **/ bool setIdentity(const char *ident, bool appendToPath = false); const char *getIdentity() const; - /** - * Sets the path to the game source. - * This can only be set once. - * @param source Path to a directory or a .love-file. - **/ bool setSource(const char *source); - /** - * Gets the path to the game source. - * Returns a 0-length string if the source has not been set. - **/ const char *getSource() const; bool mount(const char *archive, const char *mountpoint, bool appendToPath = false); bool unmount(const char *archive); - /** - * Creates a new file. - **/ File *newFile(const char *filename) const; - /** - * Creates a new FileData object. Data will be copied. - * @param data Pointer to the data. - * @param size The size of the data. - * @param filename The full filename used to file type identification. - **/ FileData *newFileData(void *data, unsigned int size, const char *filename) const; - - /** - * Creates a new FileData object from base64 data. - * @param b64 The base64 data. - **/ FileData *newFileData(const char *b64, const char *filename) const; - /** - * Gets the current working directory. - **/ const char *getWorkingDirectory(); - - /** - * Gets the user home directory. - **/ std::string getUserDirectory(); - - /** - * Gets the APPDATA directory. On Windows, this is the folder - * in the %APPDATA% enviroment variable. On Linux, this is the - * user home folder. - **/ std::string getAppdataDirectory(); - - /** - * Gets the full path of the save folder. - **/ const char *getSaveDirectory(); - - /** - * Gets the full path to the directory containing the game source. - * For example if the game source is C:\Games\mygame.love, this will return - * C:\Games. - **/ std::string getSourceBaseDirectory() const; - /** - * Gets the real directory path containing the file. - **/ std::string getRealDirectory(const char *filename) const; - /** - * Checks whether a file exists in the current search path - * or not. - * @param file The filename to check. - **/ - bool exists(const char *file) const; - - /** - * Checks if an existing file really is a directory. - * @param file The filename to check. - **/ - bool isDirectory(const char *file) const; - - /** - * Checks if an existing file really is a file, - * and not a directory. - * @param file The filename to check. - **/ + bool isDirectory(const char *dir) const; bool isFile(const char *file) const; - /** - * Creates a directory. Write dir must be set. - * @param dir The directory to create. - **/ bool createDirectory(const char *dir); - /** - * Removes a file (or directory). - * @param file The file or directory to remove. - **/ bool remove(const char *file); - /** - * Reads data from a file. - * @param filename The name of the file to read from. - * @param size The size in bytes of the data to read. - **/ - Data *read(const char *filename, int64 size = File::ALL) const; - - /** - * Write data to a file. - * @param filename The name of the file to write to. - * @param data The data to write. - * @param size The size in bytes of the data to write. - **/ + FileData *read(const char *filename, int64 size = File::ALL) const; void write(const char *filename, const void *data, int64 size) const; - - /** - * Append data to a file, creating it if it doesn't exist. - * @param filename The name of the file to write to. - * @param data The data to append. - * @param size The size in bytes of the data to append. - **/ void append(const char *filename, const void *data, int64 size) const; - /** - * This "native" method returns a table of all - * files in a given directory. - **/ - int getDirectoryItems(lua_State *L); + void getDirectoryItems(const char *dir, std::vector &items); - /** - * Gets the last modification time of a file, in seconds - * since the Unix epoch. - * @param filename The name of the file. - **/ int64 getLastModified(const char *filename) const; - - /** - * Gets the size of a file in bytes. - * @param filename The name of the file. - **/ int64 getSize(const char *filename) const; - /** - * Enable or disable symbolic link support in love.filesystem. - **/ void setSymlinksEnabled(bool enable); - - /** - * Gets whether symbolic link support is enabled. - **/ bool areSymlinksEnabled() const; - - /** - * Gets whether a filepath is actually a symlink. - * Always returns false if symlinks are not enabled. - **/ bool isSymlink(const char *filename) const; - /** - * Text file line-reading iterator function used and - * pushed on the Lua stack by love.filesystem.lines - * and File:lines. - **/ - static int lines_i(lua_State *L); + std::vector &getRequirePath(); + + void allowMountingForPath(const std::string &path); private: @@ -289,14 +119,16 @@ private: // The full path to the source of the game. std::string game_source; - // Workaround for machines without PhysFS 2.0 - bool initialized; - // Allow saving outside of the LOVE_APPDATA_FOLDER // for release 'builds' bool fused; bool fusedSet; + // Search path for require + std::vector requirePath; + + std::vector allowedMountPaths; + }; // Filesystem } // physfs diff --git a/jni/love/src/modules/filesystem/wrap_DroppedFile.cpp b/jni/love/src/modules/filesystem/wrap_DroppedFile.cpp new file mode 100644 index 00000000..b3898255 --- /dev/null +++ b/jni/love/src/modules/filesystem/wrap_DroppedFile.cpp @@ -0,0 +1,62 @@ +/** + * Copyright (c) 2006-2015 LOVE Development Team + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. + **/ + +#include "wrap_DroppedFile.h" +#include "wrap_File.h" + +namespace love +{ +namespace filesystem +{ + +DroppedFile *luax_checkdroppedfile(lua_State *L, int idx) +{ + return luax_checktype(L, idx, FILESYSTEM_DROPPED_FILE_ID); +} + +static const luaL_Reg functions[] = +{ + // Inherits from File. + { "getSize", w_File_getSize }, + { "open", w_File_open }, + { "close", w_File_close }, + { "isOpen", w_File_isOpen }, + { "read", w_File_read }, + { "write", w_File_write }, + { "flush", w_File_flush }, + { "isEOF", w_File_isEOF }, + { "tell", w_File_tell }, + { "seek", w_File_seek }, + { "lines", w_File_lines }, + { "setBuffer", w_File_setBuffer }, + { "getBuffer", w_File_getBuffer }, + { "getMode", w_File_getMode }, + { "getFilename", w_File_getFilename }, + { "getExtension", w_File_getExtension }, + { 0, 0 } +}; + +extern "C" int luaopen_droppedfile(lua_State *L) +{ + return luax_register_type(L, FILESYSTEM_DROPPED_FILE_ID, functions); +} + +} // filesystem +} // love diff --git a/jni/love/src/modules/filesystem/wrap_DroppedFile.h b/jni/love/src/modules/filesystem/wrap_DroppedFile.h new file mode 100644 index 00000000..a380a3e9 --- /dev/null +++ b/jni/love/src/modules/filesystem/wrap_DroppedFile.h @@ -0,0 +1,39 @@ +/** + * Copyright (c) 2006-2015 LOVE Development Team + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. + **/ + +#ifndef LOVE_FILESYSTEM_WRAP_DROPPED_FILE_H +#define LOVE_FILESYSTEM_WRAP_DROPPED_FILE_H + +// LOVE +#include "common/runtime.h" +#include "DroppedFile.h" + +namespace love +{ +namespace filesystem +{ + +DroppedFile *luax_checkdroppedfile(lua_State *L, int idx); +extern "C" int luaopen_droppedfile(lua_State *L); + +} // filesystem +} // love + +#endif // LOVE_FILESYSTEM_WRAP_DROPPED_FILE_H diff --git a/jni/love/src/modules/filesystem/wrap_File.cpp b/jni/love/src/modules/filesystem/wrap_File.cpp index f31a8932..f8b0fe0f 100644 --- a/jni/love/src/modules/filesystem/wrap_File.cpp +++ b/jni/love/src/modules/filesystem/wrap_File.cpp @@ -20,8 +20,6 @@ #include "wrap_File.h" -#include "physfs/Filesystem.h" - #include "common/Data.h" #include "common/Exception.h" #include "common/int.h" @@ -45,7 +43,7 @@ int luax_ioError(lua_State *L, const char *fmt, ...) File *luax_checkfile(lua_State *L, int idx) { - return luax_checktype(L, idx, "File", FILESYSTEM_FILE_T); + return luax_checktype(L, idx, FILESYSTEM_FILE_ID); } int w_File_getSize(lua_State *L) @@ -112,7 +110,7 @@ int w_File_read(lua_State *L) File *file = luax_checkfile(L, 1); Data *d = 0; - int64 size = (int64)luaL_optnumber(L, 2, File::ALL); + int64 size = (int64) luaL_optnumber(L, 2, (lua_Number) File::ALL); try { @@ -151,11 +149,11 @@ int w_File_write(lua_State *L) return luax_ioError(L, "%s", e.what()); } } - else if (luax_istype(L, 2, DATA_T)) + else if (luax_istype(L, 2, DATA_ID)) { try { - love::Data *data = luax_totype(L, 2, "Data", DATA_T); + love::Data *data = luax_totype(L, 2, DATA_ID); result = file->write(data, luaL_optinteger(L, 3, data->getSize())); } catch (love::Exception &e) @@ -188,10 +186,10 @@ int w_File_flush(lua_State *L) return 1; } -int w_File_eof(lua_State *L) +int w_File_isEOF(lua_State *L) { File *file = luax_checkfile(L, 1); - luax_pushboolean(L, file->eof()); + luax_pushboolean(L, file->isEOF()); return 1; } @@ -223,26 +221,128 @@ int w_File_seek(lua_State *L) return 1; } +int w_File_lines_i(lua_State *L) +{ + const int bufsize = 1024; + char buf[bufsize]; + int linesize = 0; + bool newline = false; + + File *file = luax_checktype(L, lua_upvalueindex(1), FILESYSTEM_FILE_ID); + + // Only accept read mode at this point. + if (file->getMode() != File::MODE_READ) + return luaL_error(L, "File needs to stay in read mode."); + + int64 pos = file->tell(); + int64 userpos = -1; + + if (lua_isnoneornil(L, lua_upvalueindex(2)) == 0) + { + // User may have changed the file position. + userpos = pos; + pos = (int64) lua_tonumber(L, lua_upvalueindex(2)); + if (userpos != pos) + file->seek(pos); + } + + while (!newline && !file->isEOF()) + { + // This 64-bit to 32-bit integer cast should be safe as it never exceeds bufsize. + int read = (int) file->read(buf, bufsize); + if (read < 0) + return luaL_error(L, "Could not read from file."); + + linesize += read; + + for (int i = 0; i < read; i++) + { + if (buf[i] == '\n') + { + linesize -= read - i; + newline = true; + break; + } + } + } + + if (newline || (file->isEOF() && linesize > 0)) + { + if (linesize < bufsize) + { + // We have the line in the buffer on the stack. No 'new' and 'read' needed. + lua_pushlstring(L, buf, linesize > 0 && buf[linesize - 1] == '\r' ? linesize - 1 : linesize); + if (userpos < 0) + file->seek(pos + linesize + 1); + } + else + { + char *str = 0; + try + { + str = new char[linesize + 1]; + } + catch(std::bad_alloc &) + { + // Can't lua_error (longjmp) in exception handlers. + } + + if (!str) + return luaL_error(L, "Out of memory."); + + file->seek(pos); + + // Read the \n anyway and save us a call to seek. + if (file->read(str, linesize + 1) == -1) + { + delete [] str; + return luaL_error(L, "Could not read from file."); + } + + lua_pushlstring(L, str, str[linesize - 1] == '\r' ? linesize - 1 : linesize); + delete [] str; + } + + if (userpos >= 0) + { + // Save new position in upvalue. + lua_pushnumber(L, (lua_Number)(pos + linesize + 1)); + lua_replace(L, lua_upvalueindex(2)); + file->seek(userpos); + } + + return 1; + } + + // EOF reached. + if (userpos >= 0 && luax_toboolean(L, lua_upvalueindex(3))) + file->seek(userpos); + else + file->close(); + + return 0; +} + int w_File_lines(lua_State *L) { File *file = luax_checkfile(L, 1); lua_pushnumber(L, 0); // File position. - luax_pushboolean(L, file->getMode() != File::CLOSED); // Save current file mode. + luax_pushboolean(L, file->getMode() != File::MODE_CLOSED); // Save current file mode. - if (file->getMode() != File::READ) + if (file->getMode() != File::MODE_READ) { - if (file->getMode() != File::CLOSED) + if (file->getMode() != File::MODE_CLOSED) file->close(); bool success = false; - luax_catchexcept(L, [&](){ success = file->open(File::READ); }); + luax_catchexcept(L, [&](){ success = file->open(File::MODE_READ); }); if (!success) return luaL_error(L, "Could not open file."); } - lua_pushcclosure(L, physfs::Filesystem::lines_i, 3); + lua_pushcclosure(L, w_File_lines_i, 3); return 1; } @@ -299,6 +399,20 @@ int w_File_getMode(lua_State *L) return 1; } +int w_File_getFilename(lua_State *L) +{ + File *file = luax_checkfile(L, 1); + luax_pushstring(L, file->getFilename()); + return 1; +} + +int w_File_getExtension(lua_State *L) +{ + File *file = luax_checkfile(L, 1); + luax_pushstring(L, file->getExtension()); + return 1; +} + static const luaL_Reg functions[] = { { "getSize", w_File_getSize }, @@ -308,19 +422,21 @@ static const luaL_Reg functions[] = { "read", w_File_read }, { "write", w_File_write }, { "flush", w_File_flush }, - { "eof", w_File_eof }, + { "isEOF", w_File_isEOF }, { "tell", w_File_tell }, { "seek", w_File_seek }, { "lines", w_File_lines }, { "setBuffer", w_File_setBuffer }, { "getBuffer", w_File_getBuffer }, { "getMode", w_File_getMode }, + { "getFilename", w_File_getFilename }, + { "getExtension", w_File_getExtension }, { 0, 0 } }; extern "C" int luaopen_file(lua_State *L) { - return luax_register_type(L, "File", functions); + return luax_register_type(L, FILESYSTEM_FILE_ID, functions); } } // filesystem diff --git a/jni/love/src/modules/filesystem/wrap_File.h b/jni/love/src/modules/filesystem/wrap_File.h index 0f78074d..50ee0f13 100644 --- a/jni/love/src/modules/filesystem/wrap_File.h +++ b/jni/love/src/modules/filesystem/wrap_File.h @@ -41,13 +41,16 @@ int w_File_isOpen(lua_State *L); int w_File_read(lua_State *L); int w_File_write(lua_State *L); int w_File_flush(lua_State *L); -int w_File_eof(lua_State *L); +int w_File_isEOF(lua_State *L); int w_File_tell(lua_State *L); int w_File_seek(lua_State *L); +int w_File_lines_i(lua_State *L); int w_File_lines(lua_State *L); int w_File_setBuffer(lua_State *L); int w_File_getBuffer(lua_State *L); int w_File_getMode(lua_State *L); +int w_File_getFilename(lua_State *L); +int w_File_getExtension(lua_State *L); extern "C" int luaopen_file(lua_State *L); } // filesystem diff --git a/jni/love/src/modules/filesystem/wrap_FileData.cpp b/jni/love/src/modules/filesystem/wrap_FileData.cpp index fdf768f6..83a2af9e 100644 --- a/jni/love/src/modules/filesystem/wrap_FileData.cpp +++ b/jni/love/src/modules/filesystem/wrap_FileData.cpp @@ -29,7 +29,7 @@ namespace filesystem FileData *luax_checkfiledata(lua_State *L, int idx) { - return luax_checktype(L, idx, "FileData", FILESYSTEM_FILE_DATA_T); + return luax_checktype(L, idx, FILESYSTEM_FILE_DATA_ID); } int w_FileData_getFilename(lua_State *L) @@ -61,7 +61,7 @@ static const luaL_Reg w_FileData_functions[] = extern "C" int luaopen_filedata(lua_State *L) { - return luax_register_type(L, "FileData", w_FileData_functions); + return luax_register_type(L, FILESYSTEM_FILE_DATA_ID, w_FileData_functions); } } // filesystem diff --git a/jni/love/src/modules/filesystem/wrap_Filesystem.cpp b/jni/love/src/modules/filesystem/wrap_Filesystem.cpp index 29138e61..8e8941d5 100644 --- a/jni/love/src/modules/filesystem/wrap_Filesystem.cpp +++ b/jni/love/src/modules/filesystem/wrap_Filesystem.cpp @@ -21,6 +21,7 @@ // LOVE #include "wrap_Filesystem.h" #include "wrap_File.h" +#include "wrap_DroppedFile.h" #include "wrap_FileData.h" #include "physfs/Filesystem.h" @@ -28,12 +29,17 @@ // SDL #include +// STL +#include +#include +#include + namespace love { namespace filesystem { - -#define instance() (Module::getInstance(Module::M_FILESYSTEM)) + +#define instance() (Module::getInstance(Module::M_FILESYSTEM)) bool hack_setupWriteDirectory() { @@ -119,7 +125,7 @@ int w_newFile(lua_State *L) const char *filename = luaL_checkstring(L, 1); const char *str = 0; - File::Mode mode = File::CLOSED; + File::Mode mode = File::MODE_CLOSED; if (lua_isstring(L, 2)) { @@ -130,7 +136,7 @@ int w_newFile(lua_State *L) File *t = instance()->newFile(filename); - if (mode != File::CLOSED) + if (mode != File::MODE_CLOSED) { try { @@ -144,7 +150,7 @@ int w_newFile(lua_State *L) } } - luax_pushtype(L, "File", FILESYSTEM_FILE_T, t); + luax_pushtype(L, FILESYSTEM_FILE_ID, t); t->release(); return 1; } @@ -159,12 +165,12 @@ FileData *luax_getfiledata(lua_State *L, int idx) const char *filename = luaL_checkstring(L, idx); file = instance()->newFile(filename); } - else if (luax_istype(L, idx, FILESYSTEM_FILE_T)) + else if (luax_istype(L, idx, FILESYSTEM_FILE_ID)) { file = luax_checkfile(L, idx); file->retain(); } - else if (luax_istype(L, idx, FILESYSTEM_FILE_DATA_T)) + else if (luax_istype(L, idx, FILESYSTEM_FILE_DATA_ID)) { data = luax_checkfiledata(L, idx); data->retain(); @@ -180,7 +186,7 @@ FileData *luax_getfiledata(lua_State *L, int idx) { luax_catchexcept(L, [&]() { data = file->read(); }, - [&]() { file->release(); } + [&](bool) { file->release(); } ); } @@ -197,7 +203,7 @@ int w_newFileData(lua_State *L) luax_convobj(L, 1, "filesystem", "newFile"); // Get FileData from the File. - if (luax_istype(L, 1, FILESYSTEM_FILE_T)) + if (luax_istype(L, 1, FILESYSTEM_FILE_ID)) { File *file = luax_checkfile(L, 1); @@ -210,7 +216,7 @@ int w_newFileData(lua_State *L) { return luax_ioError(L, "%s", e.what()); } - luax_pushtype(L, "FileData", FILESYSTEM_FILE_DATA_T, data); + luax_pushtype(L, FILESYSTEM_FILE_DATA_ID, data); data->release(); return 1; } @@ -242,7 +248,7 @@ int w_newFileData(lua_State *L) return luaL_error(L, "Invalid FileData decoder: %s", decstr); } - luax_pushtype(L, "FileData", FILESYSTEM_FILE_DATA_T, t); + luax_pushtype(L, FILESYSTEM_FILE_DATA_ID, t); t->release(); return 1; } @@ -295,10 +301,9 @@ int w_getRealDirectory(lua_State *L) return 1; } -int w_exists(lua_State *L) +int w_getExecutablePath(lua_State *L) { - const char *arg = luaL_checkstring(L, 1); - luax_pushboolean(L, instance()->exists(arg)); + luax_pushstring(L, instance()->getExecutablePath()); return 1; } @@ -367,9 +372,9 @@ static int w_write_or_append(lua_State *L, File::Mode mode) const char *input = 0; size_t len = 0; - if (luax_istype(L, 2, DATA_T)) + if (luax_istype(L, 2, DATA_ID)) { - love::Data *data = luax_totype(L, 2, "Data", DATA_T); + love::Data *data = luax_totype(L, 2, DATA_ID); input = (const char *) data->getData(); len = data->getSize(); } @@ -383,7 +388,7 @@ static int w_write_or_append(lua_State *L, File::Mode mode) try { - if (mode == File::APPEND) + if (mode == File::MODE_APPEND) instance()->append(filename, (const void *) input, len); else instance()->write(filename, (const void *) input, len); @@ -399,17 +404,31 @@ static int w_write_or_append(lua_State *L, File::Mode mode) int w_write(lua_State *L) { - return w_write_or_append(L, File::WRITE); + return w_write_or_append(L, File::MODE_WRITE); } int w_append(lua_State *L) { - return w_write_or_append(L, File::APPEND); + return w_write_or_append(L, File::MODE_APPEND); } int w_getDirectoryItems(lua_State *L) { - return instance()->getDirectoryItems(L); + const char *dir = luaL_checkstring(L, 1); + std::vector items; + + instance()->getDirectoryItems(dir, items); + + lua_createtable(L, (int) items.size(), 0); + + for (int i = 0; i < (int) items.size(); i++) + { + lua_pushstring(L, items[i].c_str()); + lua_rawseti(L, -2, i + 1); + } + + // Return the table. + return 1; } int w_lines(lua_State *L) @@ -421,7 +440,7 @@ int w_lines(lua_State *L) file = instance()->newFile(lua_tostring(L, 1)); bool success = false; - luax_catchexcept(L, [&](){ success = file->open(File::READ); }); + luax_catchexcept(L, [&](){ success = file->open(File::MODE_READ); }); if (!success) { @@ -429,13 +448,13 @@ int w_lines(lua_State *L) return luaL_error(L, "Could not open file."); } - luax_pushtype(L, "File", FILESYSTEM_FILE_T, file); + luax_pushtype(L, FILESYSTEM_FILE_ID, file); file->release(); } else return luaL_argerror(L, 1, "expected filename."); - lua_pushcclosure(L, physfs::Filesystem::lines_i, 1); + lua_pushcclosure(L, w_File_lines_i, 1); return 1; } @@ -530,58 +549,67 @@ int w_isSymlink(lua_State *L) return 1; } +int w_getRequirePath(lua_State *L) +{ + std::stringstream path; + bool seperator = false; + for (auto &element : instance()->getRequirePath()) + { + if (seperator) + path << ";"; + else + seperator = true; + + path << element; + } + + luax_pushstring(L, path.str()); + return 1; +} + +int w_setRequirePath(lua_State *L) +{ + std::string element = luax_checkstring(L, 1); + auto &requirePath = instance()->getRequirePath(); + + requirePath.clear(); + std::stringstream path; + path << element; + + while(std::getline(path, element, ';')) + requirePath.push_back(element); + + return 0; +} + int loader(lua_State *L) { - const char *filename = lua_tostring(L, -1); + std::string modulename = luax_tostring(L, 1); - std::string tmp(filename); - tmp += ".lua"; - - int size = tmp.size(); - - for (int i=0; iexists(tmp.c_str())) + auto *inst = instance(); + for (std::string element : inst->getRequirePath()) { - lua_pop(L, 1); - lua_pushstring(L, tmp.c_str()); - // Ok, load it. - return w_load(L); - } + size_t pos = element.find('?'); + if (pos != std::string::npos) + element.replace(pos, 1, modulename); - tmp = filename; - size = tmp.size(); - for (int i=0; iisDirectory(tmp.c_str())) - { - tmp += "/init.lua"; - if (instance()->exists(tmp.c_str())) + if (inst->isFile(element.c_str())) { lua_pop(L, 1); - lua_pushstring(L, tmp.c_str()); - // Ok, load it. + lua_pushstring(L, element.c_str()); return w_load(L); } } - std::string errstr = "\n\tno file '%s' in LOVE game directories."; - errstr += errstr; + std::string errstr = "\n\tno '%s' in LOVE game directories."; - lua_pushfstring(L, errstr.c_str(), (tmp + ".lua").c_str(), (tmp + "/init.lua").c_str()); + lua_pushfstring(L, errstr.c_str(), modulename.c_str()); return 1; } @@ -677,7 +705,7 @@ static const luaL_Reg functions[] = { "getSaveDirectory", w_getSaveDirectory }, { "getSourceBaseDirectory", w_getSourceBaseDirectory }, { "getRealDirectory", w_getRealDirectory }, - { "exists", w_exists }, + { "getExecutablePath", w_getExecutablePath }, { "isDirectory", w_isDirectory }, { "isFile", w_isFile }, { "createDirectory", w_createDirectory }, @@ -694,19 +722,22 @@ static const luaL_Reg functions[] = { "areSymlinksEnabled", w_areSymlinksEnabled }, { "isSymlink", w_isSymlink }, { "newFileData", w_newFileData }, + { "getRequirePath", w_getRequirePath }, + { "setRequirePath", w_setRequirePath }, { 0, 0 } }; static const lua_CFunction types[] = { luaopen_file, + luaopen_droppedfile, luaopen_filedata, 0 }; extern "C" int luaopen_love_filesystem(lua_State *L) { - physfs::Filesystem *instance = instance(); + Filesystem *instance = instance(); if (instance == nullptr) { luax_catchexcept(L, [&](){ instance = new physfs::Filesystem(); }); @@ -721,7 +752,7 @@ extern "C" int luaopen_love_filesystem(lua_State *L) WrappedModule w; w.module = instance; w.name = "filesystem"; - w.flags = MODULE_FILESYSTEM_T; + w.type = MODULE_FILESYSTEM_ID; w.functions = functions; w.types = types; diff --git a/jni/love/src/modules/filesystem/wrap_Filesystem.h b/jni/love/src/modules/filesystem/wrap_Filesystem.h index 01c95252..38ffa0b6 100644 --- a/jni/love/src/modules/filesystem/wrap_Filesystem.h +++ b/jni/love/src/modules/filesystem/wrap_Filesystem.h @@ -57,7 +57,7 @@ int w_getAppdataDirectory(lua_State *L); int w_getSaveDirectory(lua_State *L); int w_getSourceBaseDirectory(lua_State *L); int w_getRealDirectory(lua_State *L); -int w_exists(lua_State *L); +int w_getExecutablePath(lua_State *L); int w_isDirectory(lua_State *L); int w_isFile(lua_State *L); int w_createDirectory(lua_State *L); @@ -75,6 +75,8 @@ int w_getSize(lua_State *L); int w_setSymlinksEnabled(lua_State *L); int w_areSymlinksEnabled(lua_State *L); int w_isSymlink(lua_State *L); +int w_getRequirePath(lua_State *L); +int w_setRequirePath(lua_State *L); int loader(lua_State *L); int extloader(lua_State *L); extern "C" LOVE_EXPORT int luaopen_love_filesystem(lua_State *L); diff --git a/jni/love/src/modules/font/BMFontRasterizer.cpp b/jni/love/src/modules/font/BMFontRasterizer.cpp new file mode 100644 index 00000000..70b3db56 --- /dev/null +++ b/jni/love/src/modules/font/BMFontRasterizer.cpp @@ -0,0 +1,338 @@ +/** + * Copyright (c) 2006-2015 LOVE Development Team + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. + **/ + +// LOVE +#include "BMFontRasterizer.h" +#include "filesystem/Filesystem.h" +#include "image/Image.h" + +// C++ +#include +#include +#include + +// C +#include +#include + +namespace love +{ +namespace font +{ + +namespace +{ + +/** + * Helper class for parsing lines in BMFont definition files. + * NOTE: Does not properly handle multi-value attributes (e.g. 'padding' or + * 'spacing'.) + **/ +class BMFontLine +{ +public: + + BMFontLine(const std::string &line); + + const std::string &getTag() const { return tag; } + + int getAttributeInt(const char *name) const; + std::string getAttributeString(const char *name) const; + +private: + + std::string tag; + std::unordered_map attributes; + +}; + +// This is not entirely robust... +BMFontLine::BMFontLine(const std::string &line) +{ + // The tag name should always be at the start of the line. + tag = line.substr(0, line.find(' ')); + + size_t startpos = 0; + + while (startpos < line.length()) + { + // Find the next '=', which indicates a key-value pair. + size_t fpos = line.find('=', startpos); + if (fpos == std::string::npos || fpos + 1 >= line.length()) + break; + + // The key should be between a space character and the '='. + size_t keystart = line.rfind(' ', fpos); + if (keystart == std::string::npos) + break; + + keystart++; + + std::string key = line.substr(keystart, fpos - keystart); + + size_t valstart = fpos + 1; + size_t valend = valstart + 1; + + if (line[valstart] == '"') + { + // Values can be surrounded by quotes (a literal string.) + valstart++; + valend = line.find('"', valstart) - 1; + } + else + { + // Otherwise look for the next space character after the '='. + valend = line.find(' ', valstart + 1) - 1; + } + + valend = std::min(valend, line.length() - 1); + + attributes[key] = line.substr(valstart, valend - valstart + 1); + + startpos = valend + 1; + } +} + +int BMFontLine::getAttributeInt(const char *name) const +{ + auto it = attributes.find(name); + if (it == attributes.end()) + return 0; + + return (int) strtol(it->second.c_str(), nullptr, 10); +} + +std::string BMFontLine::getAttributeString(const char *name) const +{ + auto it = attributes.find(name); + if (it == attributes.end()) + return ""; + + return it->second; +} + +} // anonymous namespace + + +BMFontRasterizer::BMFontRasterizer(love::filesystem::FileData *fontdef, const std::vector &imagelist) + : fontSize(0) + , unicode(false) + , lineHeight(0) +{ + const std::string &filename = fontdef->getFilename(); + + size_t separatorpos = filename.rfind('/'); + if (separatorpos != std::string::npos) + fontFolder = filename.substr(0, separatorpos); + + // The parseConfig function will try to load any missing page images. + for (int i = 0; i < (int) imagelist.size(); i++) + images[i] = imagelist[i]; + + std::string configtext((const char *) fontdef->getData(), fontdef->getSize()); + + parseConfig(configtext); +} + +BMFontRasterizer::~BMFontRasterizer() +{ +} + +void BMFontRasterizer::parseConfig(const std::string &configtext) +{ + std::stringstream ss(configtext); + std::string line; + + while (std::getline(ss, line)) + { + BMFontLine cline(line); + + const std::string &tag = cline.getTag(); + + if (tag == "info") + { + fontSize = cline.getAttributeInt("size"); + unicode = cline.getAttributeInt("unicode") > 0; + } + else if (tag == "common") + { + lineHeight = cline.getAttributeInt("lineHeight"); + metrics.ascent = cline.getAttributeInt("base"); + } + else if (tag == "page") + { + int pageindex = cline.getAttributeInt("id"); + std::string filename = cline.getAttributeString("file"); + + // The file name is relative to the font file's folder. + if (!fontFolder.empty()) + filename = fontFolder + "/" + filename; + + // Load the page file from disk into an ImageData, if necessary. + if (images[pageindex].get() == nullptr) + { + using namespace love::filesystem; + + Filesystem *filesystem = Module::getInstance(Module::M_FILESYSTEM); + image::Image *imagemodule = Module::getInstance(Module::M_IMAGE); + + if (!filesystem) + throw love::Exception("Filesystem module not loaded!"); + if (!imagemodule) + throw love::Exception("Image module not loaded!"); + + // Release these variables right away since StrongRef retains. + StrongRef data = filesystem->read(filename.c_str()); + data->release(); + + images[pageindex].set(imagemodule->newImageData(data.get())); + images[pageindex]->release(); + } + } + else if (tag == "char") + { + BMFontCharacter c = {}; + + uint32 id = (uint32) cline.getAttributeInt("id"); + + c.x = cline.getAttributeInt("x"); + c.y = cline.getAttributeInt("y"); + c.page = cline.getAttributeInt("page"); + + c.metrics.width = cline.getAttributeInt("width"); + c.metrics.height = cline.getAttributeInt("height"); + c.metrics.bearingX = cline.getAttributeInt("xoffset"); + c.metrics.bearingY = -cline.getAttributeInt("yoffset"); + c.metrics.advance = cline.getAttributeInt("xadvance"); + + characters[id] = c; + } + else if (tag == "kerning") + { + uint32 firstid = (uint32) cline.getAttributeInt("first"); + uint32 secondid = (uint32) cline.getAttributeInt("second"); + + uint64 packedids = ((uint64) firstid << 32) | (uint64) secondid; + + kerning[packedids] = cline.getAttributeInt("amount"); + } + } + + if (characters.size() == 0) + throw love::Exception("Invalid BMFont file (no character definitions?)"); + + // Try to guess the line height if the lineheight attribute isn't found. + bool guessheight = lineHeight == 0; + + // Verify the glyph character attributes. + for (const auto &cpair : characters) + { + const BMFontCharacter &c = cpair.second; + + if (!unicode && cpair.first > 127) + throw love::Exception("Invalid BMFont character id (only unicode and ASCII are supported)"); + + if (c.page < 0 || images[c.page].get() == nullptr) + throw love::Exception("Invalid BMFont character page id: %d", c.page); + + const image::ImageData *id = images[c.page].get(); + + if (!id->inside(c.x, c.y) || !id->inside(c.x + c.metrics.width - 1, c.y + c.metrics.height - 1)) + throw love::Exception("Invalid BMFont character coordinates."); + + if (guessheight) + lineHeight = std::max(lineHeight, c.metrics.height); + } + + metrics.height = lineHeight; +} + +int BMFontRasterizer::getLineHeight() const +{ + return lineHeight; +} + +GlyphData *BMFontRasterizer::getGlyphData(uint32 glyph) const +{ + auto it = characters.find(glyph); + + // Return an empty GlyphData if we don't have the glyph character. + if (it == characters.end()) + return new GlyphData(glyph, GlyphMetrics(), GlyphData::FORMAT_RGBA); + + const BMFontCharacter &c = it->second; + GlyphData *g = new GlyphData(glyph, c.metrics, GlyphData::FORMAT_RGBA); + + const auto &imagepair = images.find(c.page); + + if (imagepair == images.end()) + { + g->release(); + return new GlyphData(glyph, GlyphMetrics(), GlyphData::FORMAT_RGBA); + } + + image::ImageData *imagedata = imagepair->second.get(); + image::pixel *pixels = (image::pixel *) g->getData(); + const image::pixel *ipixels = (const image::pixel *) imagedata->getData(); + + love::thread::Lock lock(imagedata->getMutex()); + + // Copy the subsection of the texture from the ImageData to the GlyphData. + for (int y = 0; y < c.metrics.height; y++) + { + size_t idindex = (c.y + y) * imagedata->getWidth() + c.x; + memcpy(&pixels[y * c.metrics.width], &ipixels[idindex], sizeof(image::pixel) * c.metrics.width); + } + + return g; +} + +int BMFontRasterizer::getGlyphCount() const +{ + return (int) characters.size(); +} + +bool BMFontRasterizer::hasGlyph(uint32 glyph) const +{ + return characters.find(glyph) != characters.end(); +} + +float BMFontRasterizer::getKerning(uint32 leftglyph, uint32 rightglyph) const +{ + uint64 packedglyphs = ((uint64) leftglyph << 32) | (uint64) rightglyph; + + auto it = kerning.find(packedglyphs); + if (it != kerning.end()) + return it->second; + + return 0.0f; +} + +bool BMFontRasterizer::accepts(love::filesystem::FileData *fontdef) +{ + const char *data = (const char *) fontdef->getData(); + + // Check if the "info" tag is at the start of the file. This is a truly + // crappy test. Is the tag even guaranteed to be at the start? + return fontdef->getSize() > 4 && memcmp(data, "info", 4) == 0; +} + +} // font +} // love diff --git a/jni/love/src/modules/font/BMFontRasterizer.h b/jni/love/src/modules/font/BMFontRasterizer.h new file mode 100644 index 00000000..40591d08 --- /dev/null +++ b/jni/love/src/modules/font/BMFontRasterizer.h @@ -0,0 +1,90 @@ +/** + * Copyright (c) 2006-2015 LOVE Development Team + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. + **/ + +#ifndef LOVE_FONT_BMFONT_RASTERIZER_H +#define LOVE_FONT_BMFONT_RASTERIZER_H + +// LOVE +#include "common/config.h" +#include "Rasterizer.h" +#include "image/ImageData.h" + +// C++ +#include +#include + +namespace love +{ +namespace font +{ + +/** + * Rasterizer for BMFont bitmap fonts. + **/ +class BMFontRasterizer : public Rasterizer +{ +public: + + BMFontRasterizer(love::filesystem::FileData *fontdef, const std::vector &imagelist); + virtual ~BMFontRasterizer(); + + // Implements Rasterizer. + int getLineHeight() const override; + GlyphData *getGlyphData(uint32 glyph) const override; + int getGlyphCount() const override; + bool hasGlyph(uint32 glyph) const override; + float getKerning(uint32 leftglyph, uint32 rightglyph) const; + + static bool accepts(love::filesystem::FileData *fontdef); + +private: + + struct BMFontCharacter + { + int x; + int y; + int page; + GlyphMetrics metrics; + }; + + void parseConfig(const std::string &config); + + std::string fontFolder; + + // Image pages, indexed by their page id. + std::unordered_map> images; + + // Glyph characters, indexed by their glyph id. + std::unordered_map characters; + + // Kerning information, indexed by two (packed) characters. + std::unordered_map kerning; + + int fontSize; + bool unicode; + + int lineHeight; + +}; // BMFontRasterizer + +} // font +} // love + +#endif // LOVE_FONT_BMFONT_RASTERIZER_H diff --git a/jni/love/src/modules/font/Font.cpp b/jni/love/src/modules/font/Font.cpp new file mode 100644 index 00000000..567e8d09 --- /dev/null +++ b/jni/love/src/modules/font/Font.cpp @@ -0,0 +1,105 @@ +/** + * Copyright (c) 2006-2015 LOVE Development Team + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. + **/ + +// LOVE +#include "Font.h" +#include "BMFontRasterizer.h" +#include "ImageRasterizer.h" + +#include "libraries/utf8/utf8.h" + +namespace love +{ +namespace font +{ + +// Default TrueType font. +#include "Vera.ttf.h" + +class DefaultFontData : public love::Data +{ +public: + + void *getData() const override { return Vera_ttf; } + size_t getSize() const override { return sizeof(Vera_ttf); } +}; + +Rasterizer *Font::newTrueTypeRasterizer(int size, TrueTypeRasterizer::Hinting hinting) +{ + StrongRef data(new DefaultFontData); + data->release(); + + return newTrueTypeRasterizer(data.get(), size, hinting); +} + +Rasterizer *Font::newBMFontRasterizer(love::filesystem::FileData *fontdef, const std::vector &images) +{ + return new BMFontRasterizer(fontdef, images); +} + +Rasterizer *Font::newImageRasterizer(love::image::ImageData *data, const std::string &text, int extraspacing) +{ + std::vector glyphs; + glyphs.reserve(text.size()); + + try + { + utf8::iterator i(text.begin(), text.begin(), text.end()); + utf8::iterator end(text.end(), text.begin(), text.end()); + + while (i != end) + glyphs.push_back(*i++); + } + catch (utf8::exception &e) + { + throw love::Exception("UTF-8 decoding error: %s", e.what()); + } + + return newImageRasterizer(data, &glyphs[0], (int) glyphs.size(), extraspacing); +} + +Rasterizer *Font::newImageRasterizer(love::image::ImageData *data, uint32 *glyphs, int numglyphs, int extraspacing) +{ + return new ImageRasterizer(data, glyphs, numglyphs, extraspacing); +} + +GlyphData *Font::newGlyphData(Rasterizer *r, const std::string &text) +{ + uint32 codepoint = 0; + + try + { + codepoint = utf8::peek_next(text.begin(), text.end()); + } + catch (utf8::exception &e) + { + throw love::Exception("UTF-8 decoding error: %s", e.what()); + } + + return r->getGlyphData(codepoint); +} + +GlyphData *Font::newGlyphData(Rasterizer *r, uint32 glyph) +{ + return r->getGlyphData(glyph); +} + +} // font +} // love diff --git a/jni/love/src/modules/font/Font.h b/jni/love/src/modules/font/Font.h index 7cfd474f..81558776 100644 --- a/jni/love/src/modules/font/Font.h +++ b/jni/love/src/modules/font/Font.h @@ -23,12 +23,15 @@ // LOVE #include "Rasterizer.h" +#include "TrueTypeRasterizer.h" #include "image/ImageData.h" +#include "filesystem/FileData.h" #include "common/Module.h" #include "common/int.h" -// STD +// C++ #include +#include namespace love { @@ -42,17 +45,21 @@ public: virtual ~Font() {} - // Implements Module. + virtual Rasterizer *newRasterizer(love::filesystem::FileData *data) = 0; + + virtual Rasterizer *newTrueTypeRasterizer(int size, TrueTypeRasterizer::Hinting hinting); + virtual Rasterizer *newTrueTypeRasterizer(love::Data *data, int size, TrueTypeRasterizer::Hinting hinting) = 0; + + virtual Rasterizer *newBMFontRasterizer(love::filesystem::FileData *fontdef, const std::vector &images); + + virtual Rasterizer *newImageRasterizer(love::image::ImageData *data, const std::string &glyphs, int extraspacing); + virtual Rasterizer *newImageRasterizer(love::image::ImageData *data, uint32 *glyphs, int length, int extraspacing); + + virtual GlyphData *newGlyphData(Rasterizer *r, const std::string &glyph); + virtual GlyphData *newGlyphData(Rasterizer *r, uint32 glyph); + + // Implement Module. virtual ModuleType getModuleType() const { return M_FONT; } - - virtual Rasterizer *newRasterizer(int size) = 0; - virtual Rasterizer *newRasterizer(Data *data, int size) = 0; - virtual Rasterizer *newRasterizer(love::image::ImageData *data, const std::string &glyphs) = 0; - virtual Rasterizer *newRasterizer(love::image::ImageData *data, uint32 *glyphs, int length) = 0; - virtual GlyphData *newGlyphData(Rasterizer *r, const std::string &glyph) = 0; - virtual GlyphData *newGlyphData(Rasterizer *r, uint32 glyph) = 0; - - // Implement Module virtual const char *getName() const = 0; }; // Font diff --git a/jni/love/src/modules/font/GlyphData.cpp b/jni/love/src/modules/font/GlyphData.cpp index b507e840..809d0aee 100644 --- a/jni/love/src/modules/font/GlyphData.cpp +++ b/jni/love/src/modules/font/GlyphData.cpp @@ -168,7 +168,7 @@ bool GlyphData::getConstant(GlyphData::Format in, const char *&out) StringMap::Entry GlyphData::formatEntries[] = { - {"luminance alpha", GlyphData::FORMAT_LUMINANCE_ALPHA}, + {"luminancealpha", GlyphData::FORMAT_LUMINANCE_ALPHA}, {"rgba", GlyphData::FORMAT_RGBA}, }; diff --git a/jni/love/src/modules/font/ImageRasterizer.cpp b/jni/love/src/modules/font/ImageRasterizer.cpp index 410218fd..18586748 100644 --- a/jni/love/src/modules/font/ImageRasterizer.cpp +++ b/jni/love/src/modules/font/ImageRasterizer.cpp @@ -34,10 +34,11 @@ inline bool equal(const love::image::pixel &a, const love::image::pixel &b) return (a.r == b.r && a.g == b.g && a.b == b.b && a.a == b.a); } -ImageRasterizer::ImageRasterizer(love::image::ImageData *data, uint32 *glyphs, int numglyphs) +ImageRasterizer::ImageRasterizer(love::image::ImageData *data, uint32 *glyphs, int numglyphs, int extraspacing) : imageData(data) , glyphs(glyphs) , numglyphs(numglyphs) + , extraSpacing(extraspacing) { load(); } @@ -53,15 +54,14 @@ int ImageRasterizer::getLineHeight() const GlyphData *ImageRasterizer::getGlyphData(uint32 glyph) const { - GlyphMetrics gm; - memset(&gm, 0, sizeof(GlyphMetrics)); + GlyphMetrics gm = {}; // Set relevant glyph metrics if the glyph is in this ImageFont std::map::const_iterator it = imageGlyphs.find(glyph); if (it != imageGlyphs.end()) { gm.width = it->second.width; - gm.advance = it->second.width + it->second.spacing; + gm.advance = it->second.width + extraSpacing; } gm.height = metrics.height; @@ -119,10 +119,6 @@ void ImageRasterizer::load() while (start < imgw && equal(pixels[start], spacer)) ++start; - // set previous glyph's spacing - if (i > 0 && imageGlyphs.size() > 0) - imageGlyphs[glyphs[i - 1]].spacing = (start > end) ? (start - end) : 0; - end = start; // Find where glyph ends. @@ -138,16 +134,6 @@ void ImageRasterizer::load() imageGlyphs[glyphs[i]] = imageGlyph; } - - // Find spacing of last glyph - if (numglyphs > 0) - { - start = end; - while (start < imgw && equal(pixels[start], spacer)) - ++start; - - imageGlyphs[glyphs[numglyphs - 1]].spacing = (start > end) ? (start - end) : 0; - } } int ImageRasterizer::getGlyphCount() const diff --git a/jni/love/src/modules/font/ImageRasterizer.h b/jni/love/src/modules/font/ImageRasterizer.h index a3c2ef0b..a02116ad 100644 --- a/jni/love/src/modules/font/ImageRasterizer.h +++ b/jni/love/src/modules/font/ImageRasterizer.h @@ -39,7 +39,7 @@ namespace font class ImageRasterizer : public Rasterizer { public: - ImageRasterizer(love::image::ImageData *imageData, uint32 *glyphs, int numglyphs); + ImageRasterizer(love::image::ImageData *imageData, uint32 *glyphs, int numglyphs, int extraspacing); virtual ~ImageRasterizer(); // Implement Rasterizer @@ -49,6 +49,14 @@ public: virtual bool hasGlyph(uint32 glyph) const; private: + + // Information about a glyph in the ImageData + struct ImageGlyphData + { + int x; + int width; + }; + // Load all the glyph positions into memory void load(); @@ -61,13 +69,7 @@ private: // Number of glyphs in the font int numglyphs; - // Information about a glyph in the ImageData - struct ImageGlyphData - { - int x; - int width; - int spacing; - }; + int extraSpacing; std::map imageGlyphs; diff --git a/jni/love/src/modules/font/Rasterizer.cpp b/jni/love/src/modules/font/Rasterizer.cpp index eecb5892..a574888b 100644 --- a/jni/love/src/modules/font/Rasterizer.cpp +++ b/jni/love/src/modules/font/Rasterizer.cpp @@ -95,5 +95,10 @@ bool Rasterizer::hasGlyphs(const std::string &text) const return true; } +float Rasterizer::getKerning(uint32 /*leftglyph*/, uint32 /*rightglyph*/) const +{ + return 0.0f; +} + } // font } // love diff --git a/jni/love/src/modules/font/Rasterizer.h b/jni/love/src/modules/font/Rasterizer.h index 97752223..db5b163b 100644 --- a/jni/love/src/modules/font/Rasterizer.h +++ b/jni/love/src/modules/font/Rasterizer.h @@ -105,6 +105,11 @@ public: **/ virtual bool hasGlyphs(const std::string &text) const; + /** + * Gets the amount of horizontal kerning between two glyphs. + **/ + virtual float getKerning(uint32 leftglyph, uint32 rightglyph) const; + protected: FontMetrics metrics; diff --git a/jni/love/src/modules/font/TrueTypeRasterizer.cpp b/jni/love/src/modules/font/TrueTypeRasterizer.cpp new file mode 100644 index 00000000..0eeb91af --- /dev/null +++ b/jni/love/src/modules/font/TrueTypeRasterizer.cpp @@ -0,0 +1,49 @@ +/** + * Copyright (c) 2006-2015 LOVE Development Team + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. + **/ + +#include "TrueTypeRasterizer.h" + +namespace love +{ +namespace font +{ + +bool TrueTypeRasterizer::getConstant(const char *in, Hinting &out) +{ + return hintings.find(in, out); +} + +bool TrueTypeRasterizer::getConstant(Hinting in, const char *&out) +{ + return hintings.find(in, out); +} + +StringMap::Entry TrueTypeRasterizer::hintingEntries[] = +{ + {"normal", HINTING_NORMAL}, + {"light", HINTING_LIGHT}, + {"mono", HINTING_MONO}, + {"none", HINTING_NONE}, +}; + +StringMap TrueTypeRasterizer::hintings(TrueTypeRasterizer::hintingEntries, sizeof(TrueTypeRasterizer::hintingEntries)); + +} // font +} // love diff --git a/jni/love/src/modules/font/TrueTypeRasterizer.h b/jni/love/src/modules/font/TrueTypeRasterizer.h new file mode 100644 index 00000000..89308ea5 --- /dev/null +++ b/jni/love/src/modules/font/TrueTypeRasterizer.h @@ -0,0 +1,62 @@ +/** + * Copyright (c) 2006-2015 LOVE Development Team + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. + **/ + +#ifndef LOVE_FONT_TRUE_TYPE_RASTERIZER_H +#define LOVE_FONT_TRUE_TYPE_RASTERIZER_H + +// LOVE +#include "Rasterizer.h" +#include "common/StringMap.h" + +namespace love +{ +namespace font +{ + +class TrueTypeRasterizer : public Rasterizer +{ +public: + + // Types of hinting for TrueType font glyphs. + enum Hinting + { + HINTING_NORMAL, + HINTING_LIGHT, + HINTING_MONO, + HINTING_NONE, + HINTING_MAX_ENUM + }; + + virtual ~TrueTypeRasterizer() {} + + static bool getConstant(const char *in, Hinting &out); + static bool getConstant(Hinting in, const char *&out); + +private: + + static StringMap::Entry hintingEntries[]; + static StringMap hintings; + +}; // TrueTypeRasterizer + +} // font +} // love + +#endif // LOVE_FONT_TRUE_TYPE_RASTERIZER_H diff --git a/jni/love/src/modules/font/freetype/Font.cpp b/jni/love/src/modules/font/freetype/Font.cpp index 25b49aae..b9955c53 100644 --- a/jni/love/src/modules/font/freetype/Font.cpp +++ b/jni/love/src/modules/font/freetype/Font.cpp @@ -21,9 +21,7 @@ #include "Font.h" #include "TrueTypeRasterizer.h" -#include "font/ImageRasterizer.h" - -#include "libraries/utf8/utf8.h" +#include "font/BMFontRasterizer.h" #include @@ -34,9 +32,6 @@ namespace font namespace freetype { -// Default TrueType font. -#include "font/Vera.ttf.h" - Font::Font() { if (FT_Init_FreeType(&library)) @@ -48,72 +43,19 @@ Font::~Font() FT_Done_FreeType(library); } -Rasterizer *Font::newRasterizer(int size) +Rasterizer *Font::newRasterizer(love::filesystem::FileData *data) { - StrongRef data(new filesystem::FileData(sizeof(Vera_ttf), "Vera.ttf")); - data->release(); + if (TrueTypeRasterizer::accepts(library, data)) + return newTrueTypeRasterizer(data, 12, TrueTypeRasterizer::HINTING_NORMAL); + else if (BMFontRasterizer::accepts(data)) + return newBMFontRasterizer(data, {}); - memcpy(data->getData(), Vera_ttf, sizeof(Vera_ttf)); - - return new TrueTypeRasterizer(library, data.get(), size); + throw love::Exception("Invalid font file: %s", data->getFilename().c_str()); } -Rasterizer *Font::newRasterizer(Data *data, int size) +Rasterizer *Font::newTrueTypeRasterizer(love::Data *data, int size, TrueTypeRasterizer::Hinting hinting) { - return new TrueTypeRasterizer(library, data, size); -} - -Rasterizer *Font::newRasterizer(love::image::ImageData *data, const std::string &text) -{ - size_t strlen = text.size(); - size_t numglyphs = 0; - - uint32 *glyphs = new uint32[strlen]; - - try - { - utf8::iterator i(text.begin(), text.begin(), text.end()); - utf8::iterator end(text.end(), text.begin(), text.end()); - - while (i != end) - glyphs[numglyphs++] = *i++; - } - catch (utf8::exception &e) - { - delete [] glyphs; - throw love::Exception("UTF-8 decoding error: %s", e.what()); - } - - Rasterizer *r = newRasterizer(data, glyphs, numglyphs); - delete [] glyphs; - - return r; -} - -Rasterizer *Font::newRasterizer(love::image::ImageData *data, uint32 *glyphs, int numglyphs) -{ - return new ImageRasterizer(data, glyphs, numglyphs); -} - -GlyphData *Font::newGlyphData(Rasterizer *r, const std::string &text) -{ - uint32 codepoint = 0; - - try - { - codepoint = utf8::peek_next(text.begin(), text.end()); - } - catch (utf8::exception &e) - { - throw love::Exception("UTF-8 decoding error: %s", e.what()); - } - - return r->getGlyphData(codepoint); -} - -GlyphData *Font::newGlyphData(Rasterizer *r, uint32 glyph) -{ - return r->getGlyphData(glyph); + return new TrueTypeRasterizer(library, data, size, hinting); } const char *Font::getName() const diff --git a/jni/love/src/modules/font/freetype/Font.h b/jni/love/src/modules/font/freetype/Font.h index 6b214028..dcd3fa46 100644 --- a/jni/love/src/modules/font/freetype/Font.h +++ b/jni/love/src/modules/font/freetype/Font.h @@ -25,11 +25,7 @@ #include "font/Font.h" // FreeType2 -#ifdef LOVE_MACOSX_USE_FRAMEWORKS -#include -#else #include -#endif #include FT_FREETYPE_H #include FT_GLYPH_H @@ -45,19 +41,11 @@ class Font : public love::font::Font public: Font(); - - /** - * Destructor. - **/ virtual ~Font(); // Implements Font - Rasterizer *newRasterizer(int size); - Rasterizer *newRasterizer(Data *data, int size); - Rasterizer *newRasterizer(love::image::ImageData *data, const std::string &text); - Rasterizer *newRasterizer(love::image::ImageData *data, uint32 *glyphs, int numglyphs); - GlyphData *newGlyphData(Rasterizer *r, const std::string &glyph); - GlyphData *newGlyphData(Rasterizer *r, uint32 glyph); + Rasterizer *newRasterizer(love::filesystem::FileData *data); + Rasterizer *newTrueTypeRasterizer(love::Data *data, int size, TrueTypeRasterizer::Hinting hinting); // Implement Module const char *getName() const; @@ -66,6 +54,7 @@ private: // FreeType library FT_Library library; + }; // Font } // freetype diff --git a/jni/love/src/modules/font/freetype/TrueTypeRasterizer.cpp b/jni/love/src/modules/font/freetype/TrueTypeRasterizer.cpp index 81c21699..29c77fdd 100644 --- a/jni/love/src/modules/font/freetype/TrueTypeRasterizer.cpp +++ b/jni/love/src/modules/font/freetype/TrueTypeRasterizer.cpp @@ -30,8 +30,9 @@ namespace font namespace freetype { -TrueTypeRasterizer::TrueTypeRasterizer(FT_Library library, Data *data, int size) +TrueTypeRasterizer::TrueTypeRasterizer(FT_Library library, love::Data *data, int size, Hinting hinting) : data(data) + , hinting(hinting) { if (size <= 0) throw love::Exception("Invalid TrueType font size: %d", size); @@ -53,10 +54,10 @@ TrueTypeRasterizer::TrueTypeRasterizer(FT_Library library, Data *data, int size) // Set global metrics FT_Size_Metrics s = face->size->metrics; - metrics.advance = s.max_advance >> 6; - metrics.ascent = s.ascender >> 6; - metrics.descent = s.descender >> 6; - metrics.height = s.height >> 6; + metrics.advance = (int) (s.max_advance >> 6); + metrics.ascent = (int) (s.ascender >> 6); + metrics.descent = (int) (s.descender >> 6); + metrics.height = (int) (s.height >> 6); } TrueTypeRasterizer::~TrueTypeRasterizer() @@ -75,9 +76,10 @@ GlyphData *TrueTypeRasterizer::getGlyphData(uint32 glyph) const FT_Glyph ftglyph; FT_Error err = FT_Err_Ok; + FT_ULong loadoption = hintingToLoadOption(hinting); // Initialize - err = FT_Load_Glyph(face, FT_Get_Char_Index(face, glyph), FT_LOAD_DEFAULT); + err = FT_Load_Glyph(face, FT_Get_Char_Index(face, glyph), FT_LOAD_DEFAULT | loadoption); if (err != FT_Err_Ok) throw love::Exception("TrueType Font glyph error: FT_Load_Glyph failed (0x%x)", err); @@ -87,7 +89,11 @@ GlyphData *TrueTypeRasterizer::getGlyphData(uint32 glyph) const if (err != FT_Err_Ok) throw love::Exception("TrueType Font glyph error: FT_Get_Glyph failed (0x%x)", err); - err = FT_Glyph_To_Bitmap(&ftglyph, FT_RENDER_MODE_NORMAL, 0, 1); + FT_Render_Mode rendermode = FT_RENDER_MODE_NORMAL; + if (hinting == HINTING_MONO) + rendermode = FT_RENDER_MODE_MONO; + + err = FT_Glyph_To_Bitmap(&ftglyph, rendermode, 0, 1); if (err != FT_Err_Ok) throw love::Exception("TrueType Font glyph error: FT_Glyph_To_Bitmap failed (0x%x)", err); @@ -100,7 +106,7 @@ GlyphData *TrueTypeRasterizer::getGlyphData(uint32 glyph) const glyphMetrics.bearingY = bitmap_glyph->top; glyphMetrics.height = bitmap.rows; glyphMetrics.width = bitmap.width; - glyphMetrics.advance = ftglyph->advance.x >> 16; + glyphMetrics.advance = (int) (ftglyph->advance.x >> 16); GlyphData *glyphData = new GlyphData(glyph, glyphMetrics, GlyphData::FORMAT_LUMINANCE_ALPHA); @@ -151,7 +157,7 @@ GlyphData *TrueTypeRasterizer::getGlyphData(uint32 glyph) const int TrueTypeRasterizer::getGlyphCount() const { - return face->num_glyphs; + return (int) face->num_glyphs; } bool TrueTypeRasterizer::hasGlyph(uint32 glyph) const @@ -159,6 +165,38 @@ bool TrueTypeRasterizer::hasGlyph(uint32 glyph) const return FT_Get_Char_Index(face, glyph) != 0; } +float TrueTypeRasterizer::getKerning(uint32 leftglyph, uint32 rightglyph) const +{ + FT_Vector kerning = {}; + FT_Get_Kerning(face, leftglyph, rightglyph, FT_KERNING_DEFAULT, &kerning); + return float(kerning.x >> 6); +} + +bool TrueTypeRasterizer::accepts(FT_Library library, love::Data *data) +{ + const FT_Byte *fbase = (const FT_Byte *) data->getData(); + FT_Long fsize = (FT_Long) data->getSize(); + + // Pasing in -1 for the face index lets us test if the data is valid. + return FT_New_Memory_Face(library, fbase, fsize, -1, nullptr) == 0; +} + +FT_ULong TrueTypeRasterizer::hintingToLoadOption(Hinting hint) +{ + switch (hint) + { + case HINTING_NORMAL: + default: + return FT_LOAD_TARGET_NORMAL; + case HINTING_LIGHT: + return FT_LOAD_TARGET_LIGHT; + case HINTING_MONO: + return FT_LOAD_TARGET_MONO; + case HINTING_NONE: + return FT_LOAD_NO_HINTING; + } +} + } // freetype } // font } // love diff --git a/jni/love/src/modules/font/freetype/TrueTypeRasterizer.h b/jni/love/src/modules/font/freetype/TrueTypeRasterizer.h index be545702..5b0acb83 100644 --- a/jni/love/src/modules/font/freetype/TrueTypeRasterizer.h +++ b/jni/love/src/modules/font/freetype/TrueTypeRasterizer.h @@ -22,10 +22,10 @@ #define LOVE_FONT_FREETYPE_TRUE_TYPE_RASTERIZER_H // LOVE -#include "filesystem/File.h" -#include "font/Rasterizer.h" +#include "filesystem/FileData.h" +#include "font/TrueTypeRasterizer.h" -// TrueType2 +// FreeType2 #include #include FT_FREETYPE_H #include FT_GLYPH_H @@ -40,10 +40,11 @@ namespace freetype /** * Holds data for a font object. **/ -class TrueTypeRasterizer : public Rasterizer +class TrueTypeRasterizer : public love::font::TrueTypeRasterizer { public: - TrueTypeRasterizer(FT_Library library, Data *data, int size); + + TrueTypeRasterizer(FT_Library library, love::Data *data, int size, Hinting hinting); virtual ~TrueTypeRasterizer(); // Implement Rasterizer @@ -51,15 +52,23 @@ public: virtual GlyphData *getGlyphData(uint32 glyph) const; virtual int getGlyphCount() const; virtual bool hasGlyph(uint32 glyph) const; + virtual float getKerning(uint32 leftglyph, uint32 rightglyph) const; + + static bool accepts(FT_Library library, love::Data *data); private: + static FT_ULong hintingToLoadOption(Hinting hinting); + // TrueType face FT_Face face; - // File data - StrongRef data; -}; // FreetypeRasterizer + // Font data + StrongRef data; + + Hinting hinting; + +}; // TrueTypeRasterizer } // freetype } // font diff --git a/jni/love/src/modules/font/freetype/wrap_Font.cpp b/jni/love/src/modules/font/freetype/wrap_Font.cpp deleted file mode 100644 index 2d88cb2c..00000000 --- a/jni/love/src/modules/font/freetype/wrap_Font.cpp +++ /dev/null @@ -1,132 +0,0 @@ -/** - * Copyright (c) 2006-2015 LOVE Development Team - * - * This software is provided 'as-is', without any express or implied - * warranty. In no event will the authors be held liable for any damages - * arising from the use of this software. - * - * Permission is granted to anyone to use this software for any purpose, - * including commercial applications, and to alter it and redistribute it - * freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; you must not - * claim that you wrote the original software. If you use this software - * in a product, an acknowledgment in the product documentation would be - * appreciated but is not required. - * 2. Altered source versions must be plainly marked as such, and must not be - * misrepresented as being the original software. - * 3. This notice may not be removed or altered from any source distribution. - **/ - -#include "wrap_Font.h" - -#include "Font.h" - -#include "font/wrap_GlyphData.h" -#include "font/wrap_Rasterizer.h" - -#include "filesystem/wrap_Filesystem.h" - -#include "TrueTypeRasterizer.h" - -namespace love -{ -namespace font -{ -namespace freetype -{ - -#define instance() (Module::getInstance(Module::M_FONT)) - -int w_newRasterizer(lua_State *L) -{ - Rasterizer *t = nullptr; - - if (luax_istype(L, 1, IMAGE_IMAGE_DATA_T)) - { - love::image::ImageData *d = luax_checktype(L, 1, "ImageData", IMAGE_IMAGE_DATA_T); - const char *g = luaL_checkstring(L, 2); - std::string glyphs(g); - luax_catchexcept(L, [&](){ t = instance()->newRasterizer(d, glyphs); }); - } - else if (lua_type(L, 1) == LUA_TSTRING || luax_istype(L, 1, FILESYSTEM_FILE_T) || luax_istype(L, 1, FILESYSTEM_FILE_DATA_T)) - { - love::filesystem::FileData *d = love::filesystem::luax_getfiledata(L, 1); - int size = luaL_optint(L, 2, 12); - luax_catchexcept(L, - [&]() { t = instance()->newRasterizer(d, size); }, - [&]() { d->release(); } - ); - } - else - { - // Default font (Vera.) - int size = luaL_optint(L, 1, 12); - luax_catchexcept(L, [&]() { t = instance()->newRasterizer(size); }); - } - - luax_pushtype(L, "Rasterizer", FONT_RASTERIZER_T, t); - t->release(); - return 1; -} - -int w_newGlyphData(lua_State *L) -{ - Rasterizer *r = luax_checkrasterizer(L, 1); - GlyphData *t = nullptr; - - // newGlyphData accepts a unicode character or a codepoint number. - if (lua_type(L, 2) == LUA_TSTRING) - { - std::string glyph = luax_checkstring(L, 2); - luax_catchexcept(L, [&](){ t = instance()->newGlyphData(r, glyph); }); - } - else - { - uint32 g = (uint32) luaL_checknumber(L, 2); - t = instance()->newGlyphData(r, g); - } - - luax_pushtype(L, "GlyphData", FONT_GLYPH_DATA_T, t); - t->release(); - return 1; -} - -// List of functions to wrap. -static const luaL_Reg functions[] = -{ - { "newRasterizer", w_newRasterizer }, - { "newGlyphData", w_newGlyphData }, - { 0, 0 } -}; - -static const lua_CFunction types[] = -{ - luaopen_glyphdata, - luaopen_rasterizer, - 0 -}; - -extern "C" int luaopen_love_font(lua_State *L) -{ - Font *instance = instance(); - if (instance == nullptr) - { - luax_catchexcept(L, [&](){ instance = new Font(); }); - } - else - instance->retain(); - - WrappedModule w; - w.module = instance; - w.name = "font"; - w.flags = MODULE_T; - w.functions = functions; - w.types = types; - - return luax_register_module(L, w); -} - -} // freetype -} // font -} // love diff --git a/jni/love/src/modules/font/wrap_Font.cpp b/jni/love/src/modules/font/wrap_Font.cpp new file mode 100644 index 00000000..d95aec83 --- /dev/null +++ b/jni/love/src/modules/font/wrap_Font.cpp @@ -0,0 +1,235 @@ +/** + * Copyright (c) 2006-2015 LOVE Development Team + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. + **/ + +#include "wrap_Font.h" + +#include "Font.h" +#include "freetype/Font.h" + +#include "wrap_GlyphData.h" +#include "wrap_Rasterizer.h" + +#include "filesystem/wrap_Filesystem.h" + +namespace love +{ +namespace font +{ + +#define instance() (Module::getInstance(Module::M_FONT)) + +int w_newRasterizer(lua_State *L) +{ + if (lua_type(L, 1) == LUA_TNUMBER || lua_type(L, 2) == LUA_TNUMBER || lua_isnone(L, 1)) + { + // First or second argument is a number: call newTrueTypeRasterizer. + return w_newTrueTypeRasterizer(L); + } + else if (lua_isnoneornil(L, 2)) + { + // Single argument of another type: call Font::newRasterizer. + Rasterizer *t = nullptr; + filesystem::FileData *d = filesystem::luax_getfiledata(L, 1); + + luax_catchexcept(L, + [&]() { t = instance()->newRasterizer(d); }, + [&](bool) { d->release(); } + ); + + luax_pushtype(L, FONT_RASTERIZER_ID, t); + t->release(); + return 1; + } + else + { + // Otherwise call newBMFontRasterizer. + return w_newBMFontRasterizer(L); + } +} + +int w_newTrueTypeRasterizer(lua_State *L) +{ + Rasterizer *t = nullptr; + TrueTypeRasterizer::Hinting hinting = TrueTypeRasterizer::HINTING_NORMAL; + + if (lua_type(L, 1) == LUA_TNUMBER || lua_isnone(L, 1)) + { + // First argument is a number: use the default TrueType font. + int size = (int) luaL_optnumber(L, 1, 12); + + const char *hintstr = lua_isnoneornil(L, 2) ? nullptr : luaL_checkstring(L, 2); + if (hintstr && !TrueTypeRasterizer::getConstant(hintstr, hinting)) + return luaL_error(L, "Invalid TrueType font hinting mode: %s", hintstr); + + luax_catchexcept(L, [&](){ t = instance()->newTrueTypeRasterizer(size, hinting); }); + } + else + { + love::Data *d = nullptr; + + if (luax_istype(L, 1, DATA_ID)) + d = luax_checkdata(L, 1); + else + d = filesystem::luax_getfiledata(L, 1); + + int size = (int) luaL_optnumber(L, 2, 12); + + const char *hintstr = lua_isnoneornil(L, 3) ? nullptr : luaL_checkstring(L, 3); + if (hintstr && !TrueTypeRasterizer::getConstant(hintstr, hinting)) + return luaL_error(L, "Invalid TrueType font hinting mode: %s", hintstr); + + luax_catchexcept(L, + [&]() { t = instance()->newTrueTypeRasterizer(d, size, hinting); }, + [&](bool) { d->release(); } + ); + } + + luax_pushtype(L, FONT_RASTERIZER_ID, t); + t->release(); + return 1; +} + +static void convimagedata(lua_State *L, int idx) +{ + if (lua_type(L, 1) == LUA_TSTRING || luax_istype(L, idx, FILESYSTEM_FILE_ID) || luax_istype(L, idx, FILESYSTEM_FILE_DATA_ID)) + luax_convobj(L, idx, "image", "newImageData"); +} + +int w_newBMFontRasterizer(lua_State *L) +{ + Rasterizer *t = nullptr; + + filesystem::FileData *d = filesystem::luax_getfiledata(L, 1); + std::vector images; + + if (lua_istable(L, 2)) + { + for (int i = 1; i <= (int) luax_objlen(L, 2); i++) + { + lua_rawgeti(L, 2, i); + + convimagedata(L, -1); + image::ImageData *id = luax_checktype(L, -1, IMAGE_IMAGE_DATA_ID); + images.push_back(id); + id->retain(); + + lua_pop(L, 1); + } + } + else + { + for (int i = 2; i <= lua_gettop(L); i++) + { + convimagedata(L, i); + image::ImageData *id = luax_checktype(L, i, IMAGE_IMAGE_DATA_ID); + images.push_back(id); + id->retain(); + } + } + + luax_catchexcept(L, + [&]() { t = instance()->newBMFontRasterizer(d, images); }, + [&](bool) { d->release(); for (auto id : images) id->release(); } + ); + + luax_pushtype(L, FONT_RASTERIZER_ID, t); + t->release(); + return 1; +} + +int w_newImageRasterizer(lua_State *L) +{ + Rasterizer *t = nullptr; + + convimagedata(L, 1); + + image::ImageData *d = luax_checktype(L, 1, IMAGE_IMAGE_DATA_ID); + std::string glyphs = luax_checkstring(L, 2); + int extraspacing = (int) luaL_optnumber(L, 3, 0); + + luax_catchexcept(L, [&](){ t = instance()->newImageRasterizer(d, glyphs, extraspacing); }); + + luax_pushtype(L, FONT_RASTERIZER_ID, t); + t->release(); + return 1; +} + +int w_newGlyphData(lua_State *L) +{ + Rasterizer *r = luax_checkrasterizer(L, 1); + GlyphData *t = nullptr; + + // newGlyphData accepts a unicode character or a codepoint number. + if (lua_type(L, 2) == LUA_TSTRING) + { + std::string glyph = luax_checkstring(L, 2); + luax_catchexcept(L, [&](){ t = instance()->newGlyphData(r, glyph); }); + } + else + { + uint32 g = (uint32) luaL_checknumber(L, 2); + t = instance()->newGlyphData(r, g); + } + + luax_pushtype(L, FONT_GLYPH_DATA_ID, t); + t->release(); + return 1; +} + +// List of functions to wrap. +static const luaL_Reg functions[] = +{ + { "newRasterizer", w_newRasterizer }, + { "newTrueTypeRasterizer", w_newTrueTypeRasterizer }, + { "newBMFontRasterizer", w_newBMFontRasterizer }, + { "newImageRasterizer", w_newImageRasterizer }, + { "newGlyphData", w_newGlyphData }, + { 0, 0 } +}; + +static const lua_CFunction types[] = +{ + luaopen_glyphdata, + luaopen_rasterizer, + 0 +}; + +extern "C" int luaopen_love_font(lua_State *L) +{ + Font *instance = instance(); + if (instance == nullptr) + { + luax_catchexcept(L, [&](){ instance = new freetype::Font(); }); + } + else + instance->retain(); + + WrappedModule w; + w.module = instance; + w.name = "font"; + w.type = MODULE_ID; + w.functions = functions; + w.types = types; + + return luax_register_module(L, w); +} + +} // font +} // love diff --git a/jni/love/src/modules/font/freetype/wrap_Font.h b/jni/love/src/modules/font/wrap_Font.h similarity index 84% rename from jni/love/src/modules/font/freetype/wrap_Font.h rename to jni/love/src/modules/font/wrap_Font.h index d5af7efb..34b64e5f 100644 --- a/jni/love/src/modules/font/freetype/wrap_Font.h +++ b/jni/love/src/modules/font/wrap_Font.h @@ -18,8 +18,8 @@ * 3. This notice may not be removed or altered from any source distribution. **/ -#ifndef LOVE_FONT_FREETYPE_WRAP_FONT_H -#define LOVE_FONT_FREETYPE_WRAP_FONT_H +#ifndef LOVE_FONT_WRAP_FONT_H +#define LOVE_FONT_WRAP_FONT_H // LOVE #include "common/config.h" @@ -29,15 +29,15 @@ namespace love { namespace font { -namespace freetype -{ int w_newRasterizer(lua_State *L); +int w_newTrueTypeRasterizer(lua_State *L); +int w_newBMFontRasterizer(lua_State *L); +int w_newImageRasterizer(lua_State *L); int w_newGlyphData(lua_State *L); extern "C" LOVE_EXPORT int luaopen_love_font(lua_State *L); -} // freetype } // font } // love -#endif // LOVE_FONT_FREETYPE_WRAP_FONT_H +#endif // LOVE_FONT_WRAP_FONT_H diff --git a/jni/love/src/modules/font/wrap_GlyphData.cpp b/jni/love/src/modules/font/wrap_GlyphData.cpp index d38e5d96..494d9e5e 100644 --- a/jni/love/src/modules/font/wrap_GlyphData.cpp +++ b/jni/love/src/modules/font/wrap_GlyphData.cpp @@ -27,7 +27,7 @@ namespace font GlyphData *luax_checkglyphdata(lua_State *L, int idx) { - return luax_checktype(L, idx, "GlyphData", FONT_GLYPH_DATA_T); + return luax_checktype(L, idx, FONT_GLYPH_DATA_ID); } int w_GlyphData_getWidth(lua_State *L) @@ -59,7 +59,7 @@ int w_GlyphData_getGlyph(lua_State *L) lua_pushnumber(L, (lua_Number) glyph); return 1; } - + int w_GlyphData_getGlyphString(lua_State *L) { GlyphData *t = luax_checkglyphdata(L, 1); @@ -136,7 +136,7 @@ static const luaL_Reg functions[] = extern "C" int luaopen_glyphdata(lua_State *L) { - return luax_register_type(L, "GlyphData", functions); + return luax_register_type(L, FONT_GLYPH_DATA_ID, functions); } } // font diff --git a/jni/love/src/modules/font/wrap_Rasterizer.cpp b/jni/love/src/modules/font/wrap_Rasterizer.cpp index 0ba4285a..59a93495 100644 --- a/jni/love/src/modules/font/wrap_Rasterizer.cpp +++ b/jni/love/src/modules/font/wrap_Rasterizer.cpp @@ -29,7 +29,7 @@ namespace font Rasterizer *luax_checkrasterizer(lua_State *L, int idx) { - return luax_checktype(L, idx, "Rasterizer", FONT_RASTERIZER_T); + return luax_checktype(L, idx, FONT_RASTERIZER_ID); } int w_Rasterizer_getHeight(lua_State *L) @@ -86,7 +86,7 @@ int w_Rasterizer_getGlyphData(lua_State *L) } }); - luax_pushtype(L, "GlyphData", FONT_GLYPH_DATA_T, g); + luax_pushtype(L, FONT_GLYPH_DATA_ID, g); g->release(); return 1; } @@ -139,7 +139,7 @@ static const luaL_Reg functions[] = extern "C" int luaopen_rasterizer(lua_State *L) { - return luax_register_type(L, "Rasterizer", functions); + return luax_register_type(L, FONT_RASTERIZER_ID, functions); } } // font diff --git a/jni/love/src/modules/graphics/Graphics.cpp b/jni/love/src/modules/graphics/Graphics.cpp index 4dc4a271..7c1a24db 100644 --- a/jni/love/src/modules/graphics/Graphics.cpp +++ b/jni/love/src/modules/graphics/Graphics.cpp @@ -34,27 +34,17 @@ bool Graphics::getConstant(const char *in, DrawMode &out) return drawModes.find(in, out); } -bool Graphics::getConstant(DrawMode in, const char *&out) +bool Graphics::getConstant(DrawMode in, const char *&out) { return drawModes.find(in, out); } -bool Graphics::getConstant(const char *in, AlignMode &out) -{ - return alignModes.find(in, out); -} - -bool Graphics::getConstant(AlignMode in, const char *&out) -{ - return alignModes.find(in, out); -} - bool Graphics::getConstant(const char *in, BlendMode &out) { return blendModes.find(in, out); } -bool Graphics::getConstant(BlendMode in, const char *&out) +bool Graphics::getConstant(BlendMode in, const char *&out) { return blendModes.find(in, out); } @@ -64,7 +54,7 @@ bool Graphics::getConstant(const char *in, LineStyle &out) return lineStyles.find(in, out); } -bool Graphics::getConstant(LineStyle in, const char *&out) +bool Graphics::getConstant(LineStyle in, const char *&out) { return lineStyles.find(in, out); } @@ -74,27 +64,17 @@ bool Graphics::getConstant(const char *in, LineJoin &out) return lineJoins.find(in, out); } -bool Graphics::getConstant(LineJoin in, const char *&out) +bool Graphics::getConstant(LineJoin in, const char *&out) { return lineJoins.find(in, out); } -bool Graphics::getConstant(const char *in, PointStyle &out) -{ - return pointStyles.find(in, out); -} - -bool Graphics::getConstant(PointStyle in, const char *&out) -{ - return pointStyles.find(in, out); -} - bool Graphics::getConstant(const char *in, Support &out) { return support.find(in, out); } -bool Graphics::getConstant(Support in, const char *&out) +bool Graphics::getConstant(Support in, const char *&out) { return support.find(in, out); } @@ -131,105 +111,76 @@ bool Graphics::getConstant(StatType in, const char *&out) StringMap::Entry Graphics::drawModeEntries[] = { - { "line", Graphics::DRAW_LINE }, - { "fill", Graphics::DRAW_FILL }, + { "line", DRAW_LINE }, + { "fill", DRAW_FILL }, }; StringMap Graphics::drawModes(Graphics::drawModeEntries, sizeof(Graphics::drawModeEntries)); -StringMap::Entry Graphics::alignModeEntries[] = -{ - { "left", Graphics::ALIGN_LEFT }, - { "right", Graphics::ALIGN_RIGHT }, - { "center", Graphics::ALIGN_CENTER }, - { "justify", Graphics::ALIGN_JUSTIFY }, -}; - -StringMap Graphics::alignModes(Graphics::alignModeEntries, sizeof(Graphics::alignModeEntries)); - StringMap::Entry Graphics::blendModeEntries[] = { - { "alpha", Graphics::BLEND_ALPHA }, - { "additive", Graphics::BLEND_ADDITIVE }, - { "subtractive", Graphics::BLEND_SUBTRACTIVE }, - { "multiplicative", Graphics::BLEND_MULTIPLICATIVE }, - { "premultiplied", Graphics::BLEND_PREMULTIPLIED }, - { "screen", Graphics::BLEND_SCREEN }, - { "replace", Graphics::BLEND_REPLACE }, + { "alpha", BLEND_ALPHA }, + { "add", BLEND_ADD }, + { "subtract", BLEND_SUBTRACT }, + { "multiply", BLEND_MULTIPLY }, + { "screen", BLEND_SCREEN }, + { "replace", BLEND_REPLACE }, }; StringMap Graphics::blendModes(Graphics::blendModeEntries, sizeof(Graphics::blendModeEntries)); StringMap::Entry Graphics::lineStyleEntries[] = { - { "smooth", Graphics::LINE_SMOOTH }, - { "rough", Graphics::LINE_ROUGH } + { "smooth", LINE_SMOOTH }, + { "rough", LINE_ROUGH } }; StringMap Graphics::lineStyles(Graphics::lineStyleEntries, sizeof(Graphics::lineStyleEntries)); StringMap::Entry Graphics::lineJoinEntries[] = { - { "none", Graphics::LINE_JOIN_NONE }, - { "miter", Graphics::LINE_JOIN_MITER }, - { "bevel", Graphics::LINE_JOIN_BEVEL } + { "none", LINE_JOIN_NONE }, + { "miter", LINE_JOIN_MITER }, + { "bevel", LINE_JOIN_BEVEL } }; StringMap Graphics::lineJoins(Graphics::lineJoinEntries, sizeof(Graphics::lineJoinEntries)); -StringMap::Entry Graphics::pointStyleEntries[] = -{ - { "smooth", Graphics::POINT_SMOOTH }, - { "rough", Graphics::POINT_ROUGH } -}; - -StringMap Graphics::pointStyles(Graphics::pointStyleEntries, sizeof(Graphics::pointStyleEntries)); - StringMap::Entry Graphics::supportEntries[] = { - { "canvas", Graphics::SUPPORT_CANVAS }, - { "hdrcanvas", Graphics::SUPPORT_HDR_CANVAS }, - { "multicanvas", Graphics::SUPPORT_MULTI_CANVAS }, - { "shader", Graphics::SUPPORT_SHADER }, - { "npot", Graphics::SUPPORT_NPOT }, - { "subtractive", Graphics::SUPPORT_SUBTRACTIVE }, - { "mipmap", Graphics::SUPPORT_MIPMAP }, - { "dxt", Graphics::SUPPORT_DXT }, - { "bc5", Graphics::SUPPORT_BC5 }, - { "etc1", Graphics::SUPPORT_ETC1 }, - { "pvrtc1", Graphics::SUPPORT_PVRTC1 }, - { "srgb", Graphics::SUPPORT_SRGB }, + { "multicanvas", SUPPORT_MULTI_CANVAS }, + { "multicanvasformats", SUPPORT_MULTI_CANVAS_FORMATS }, + { "srgb", SUPPORT_SRGB }, }; StringMap Graphics::support(Graphics::supportEntries, sizeof(Graphics::supportEntries)); StringMap::Entry Graphics::systemLimitEntries[] = { - {"pointsize", Graphics::LIMIT_POINT_SIZE}, - {"texturesize", Graphics::LIMIT_TEXTURE_SIZE}, - {"multicanvas", Graphics::LIMIT_MULTI_CANVAS}, - {"canvasfsaa", Graphics::LIMIT_CANVAS_FSAA}, - {"canvasmsaa", Graphics::LIMIT_CANVAS_MSAA}, + { "pointsize", LIMIT_POINT_SIZE }, + { "texturesize", LIMIT_TEXTURE_SIZE }, + { "multicanvas", LIMIT_MULTI_CANVAS }, + { "canvasmsaa", LIMIT_CANVAS_MSAA }, }; StringMap Graphics::systemLimits(Graphics::systemLimitEntries, sizeof(Graphics::systemLimitEntries)); StringMap::Entry Graphics::stackTypeEntries[] = { - {"all", Graphics::STACK_ALL}, - {"transform", Graphics::STACK_TRANSFORM}, + { "all", STACK_ALL }, + { "transform", STACK_TRANSFORM }, }; StringMap Graphics::stackTypes(Graphics::stackTypeEntries, sizeof(Graphics::stackTypeEntries)); StringMap::Entry Graphics::statTypeEntries[] = { - {"drawcalls", Graphics::STAT_DRAW_CALLS}, - {"canvasswitches", Graphics::STAT_CANVAS_SWITCHES}, - {"canvases", Graphics::STAT_CANVASES}, - {"images", Graphics::STAT_IMAGES}, - {"fonts", Graphics::STAT_FONTS}, - {"texturememory", Graphics::STAT_TEXTURE_MEMORY}, + { "drawcalls", STAT_DRAW_CALLS }, + { "canvasswitches", STAT_CANVAS_SWITCHES }, + { "canvases", STAT_CANVASES }, + { "images", STAT_IMAGES }, + { "fonts", STAT_FONTS }, + { "texturememory", STAT_TEXTURE_MEMORY }, }; StringMap Graphics::statTypes(Graphics::statTypeEntries, sizeof(Graphics::statTypeEntries)); diff --git a/jni/love/src/modules/graphics/Graphics.h b/jni/love/src/modules/graphics/Graphics.h index 8085fdef..13c7eed7 100644 --- a/jni/love/src/modules/graphics/Graphics.h +++ b/jni/love/src/modules/graphics/Graphics.h @@ -44,22 +44,12 @@ public: DRAW_MAX_ENUM }; - enum AlignMode - { - ALIGN_LEFT, - ALIGN_CENTER, - ALIGN_RIGHT, - ALIGN_JUSTIFY, - ALIGN_MAX_ENUM - }; - enum BlendMode { BLEND_ALPHA, - BLEND_ADDITIVE, - BLEND_SUBTRACTIVE, - BLEND_MULTIPLICATIVE, - BLEND_PREMULTIPLIED, + BLEND_ADD, + BLEND_SUBTRACT, + BLEND_MULTIPLY, BLEND_SCREEN, BLEND_REPLACE, BLEND_MAX_ENUM @@ -80,26 +70,10 @@ public: LINE_JOIN_MAX_ENUM }; - enum PointStyle - { - POINT_ROUGH, - POINT_SMOOTH, - POINT_MAX_ENUM - }; - enum Support { - SUPPORT_CANVAS, - SUPPORT_HDR_CANVAS, SUPPORT_MULTI_CANVAS, - SUPPORT_SHADER, - SUPPORT_NPOT, - SUPPORT_SUBTRACTIVE, - SUPPORT_MIPMAP, - SUPPORT_DXT, - SUPPORT_BC5, - SUPPORT_ETC1, - SUPPORT_PVRTC1, + SUPPORT_MULTI_CANVAS_FORMATS, SUPPORT_SRGB, SUPPORT_MAX_ENUM }; @@ -116,7 +90,6 @@ public: LIMIT_POINT_SIZE, LIMIT_TEXTURE_SIZE, LIMIT_MULTI_CANVAS, - LIMIT_CANVAS_FSAA, // For backward-compatibility. TODO: remove! LIMIT_CANVAS_MSAA, LIMIT_MAX_ENUM }; @@ -159,10 +132,7 @@ public: struct ColorMask { - bool r; - bool g; - bool b; - bool a; + bool r, g, b, a; bool operator == (const ColorMask &m) const { @@ -213,25 +183,19 @@ public: virtual bool isActive() const = 0; static bool getConstant(const char *in, DrawMode &out); - static bool getConstant(DrawMode in, const char *&out); - - static bool getConstant(const char *in, AlignMode &out); - static bool getConstant(AlignMode in, const char *&out); + static bool getConstant(DrawMode in, const char *&out); static bool getConstant(const char *in, BlendMode &out); - static bool getConstant(BlendMode in, const char *&out); + static bool getConstant(BlendMode in, const char *&out); static bool getConstant(const char *in, LineStyle &out); - static bool getConstant(LineStyle in, const char *&out); + static bool getConstant(LineStyle in, const char *&out); static bool getConstant(const char *in, LineJoin &out); - static bool getConstant(LineJoin in, const char *&out); - - static bool getConstant(const char *in, PointStyle &out); - static bool getConstant(PointStyle in, const char *&out); + static bool getConstant(LineJoin in, const char *&out); static bool getConstant(const char *in, Support &out); - static bool getConstant(Support in, const char *&out); + static bool getConstant(Support in, const char *&out); static bool getConstant(const char *in, SystemLimit &out); static bool getConstant(SystemLimit in, const char *&out); @@ -247,9 +211,6 @@ private: static StringMap::Entry drawModeEntries[]; static StringMap drawModes; - static StringMap::Entry alignModeEntries[]; - static StringMap alignModes; - static StringMap::Entry blendModeEntries[]; static StringMap blendModes; @@ -259,9 +220,6 @@ private: static StringMap::Entry lineJoinEntries[]; static StringMap lineJoins; - static StringMap::Entry pointStyleEntries[]; - static StringMap pointStyles; - static StringMap::Entry supportEntries[]; static StringMap support; diff --git a/jni/love/src/modules/graphics/Quad.cpp b/jni/love/src/modules/graphics/Quad.cpp index 0eb60d1c..d4aa80b2 100644 --- a/jni/love/src/modules/graphics/Quad.cpp +++ b/jni/love/src/modules/graphics/Quad.cpp @@ -33,7 +33,7 @@ Quad::Quad(const Quad::Viewport &v, float sw, float sh) : sw(sw) , sh(sh) { - memset(vertices, 255, sizeof(Vertex) * NUM_VERTICES); + memset(vertices, 255, sizeof(Vertex) * 4); refresh(v, sw, sh); } @@ -45,23 +45,28 @@ void Quad::refresh(const Quad::Viewport &v, float sw, float sh) { viewport = v; - vertices[0].x = 0; - vertices[0].y = 0; - vertices[1].x = 0; + // Vertices are ordered for use with triangle strips: + // 0----2 + // | / | + // | / | + // 1----3 + vertices[0].x = 0.0f; + vertices[0].y = 0.0f; + vertices[1].x = 0.0f; vertices[1].y = v.h; vertices[2].x = v.w; - vertices[2].y = v.h; + vertices[2].y = 0.0f; vertices[3].x = v.w; - vertices[3].y = 0; + vertices[3].y = v.h; vertices[0].s = v.x/sw; vertices[0].t = v.y/sh; vertices[1].s = v.x/sw; vertices[1].t = (v.y+v.h)/sh; vertices[2].s = (v.x+v.w)/sw; - vertices[2].t = (v.y+v.h)/sh; + vertices[2].t = v.y/sh; vertices[3].s = (v.x+v.w)/sw; - vertices[3].t = v.y/sh; + vertices[3].t = (v.y+v.h)/sh; } void Quad::setViewport(const Quad::Viewport &v) diff --git a/jni/love/src/modules/graphics/Quad.h b/jni/love/src/modules/graphics/Quad.h index 99047513..c146c97e 100644 --- a/jni/love/src/modules/graphics/Quad.h +++ b/jni/love/src/modules/graphics/Quad.h @@ -40,8 +40,6 @@ public: float w, h; }; - static const size_t NUM_VERTICES = 4; - Quad(const Viewport &v, float sw, float sh); virtual ~Quad(); @@ -53,7 +51,7 @@ public: private: - Vertex vertices[NUM_VERTICES]; + Vertex vertices[4]; Viewport viewport; float sw; diff --git a/jni/love/src/modules/graphics/Texture.cpp b/jni/love/src/modules/graphics/Texture.cpp index 891a3800..d1e268dd 100644 --- a/jni/love/src/modules/graphics/Texture.cpp +++ b/jni/love/src/modules/graphics/Texture.cpp @@ -27,20 +27,6 @@ namespace graphics Texture::Filter Texture::defaultFilter; -Texture::Filter::Filter() - : min(FILTER_LINEAR) - , mag(FILTER_LINEAR) - , mipmap(FILTER_NONE) - , anisotropy(1.0f) -{ -} - -Texture::Wrap::Wrap() - : s(WRAP_CLAMP) - , t(WRAP_CLAMP) -{ -} - Texture::Texture() : width(0) , height(0) @@ -89,6 +75,23 @@ const Texture::Filter &Texture::getDefaultFilter() return defaultFilter; } +bool Texture::validateFilter(const Filter &f, bool mipmapsAllowed) +{ + if (!mipmapsAllowed && f.mipmap != FILTER_NONE) + return false; + + if (f.mag != FILTER_LINEAR && f.mag != FILTER_NEAREST) + return false; + + if (f.min != FILTER_LINEAR && f.min != FILTER_NEAREST) + return false; + + if (f.mipmap != FILTER_LINEAR && f.mipmap != FILTER_NEAREST && f.mipmap != FILTER_NONE) + return false; + + return true; +} + bool Texture::getConstant(const char *in, FilterMode &out) { return filterModes.find(in, out); @@ -113,6 +116,7 @@ StringMap::Entry Texture::filterM { { "linear", Texture::FILTER_LINEAR }, { "nearest", Texture::FILTER_NEAREST }, + { "none", Texture::FILTER_NONE }, }; StringMap Texture::filterModes(Texture::filterModeEntries, sizeof(Texture::filterModeEntries)); diff --git a/jni/love/src/modules/graphics/Texture.h b/jni/love/src/modules/graphics/Texture.h index d4488d13..fb6082a7 100644 --- a/jni/love/src/modules/graphics/Texture.h +++ b/jni/love/src/modules/graphics/Texture.h @@ -58,18 +58,16 @@ public: struct Filter { - Filter(); - FilterMode min; - FilterMode mag; - FilterMode mipmap; - float anisotropy; + FilterMode min = FILTER_LINEAR; + FilterMode mag = FILTER_LINEAR; + FilterMode mipmap = FILTER_NONE; + float anisotropy = 1.0f; }; struct Wrap { - Wrap(); - WrapMode s; - WrapMode t; + WrapMode s = WRAP_CLAMP; + WrapMode t = WRAP_CLAMP; }; Texture(); @@ -102,10 +100,14 @@ public: virtual const Vertex *getVertices() const; + virtual const void *getHandle() const = 0; + // The default filter. static void setDefaultFilter(const Filter &f); static const Filter &getDefaultFilter(); + static bool validateFilter(const Filter &f, bool mipmapsAllowed); + static bool getConstant(const char *in, FilterMode &out); static bool getConstant(FilterMode in, const char *&out); diff --git a/jni/love/src/modules/graphics/opengl/Canvas.cpp b/jni/love/src/modules/graphics/opengl/Canvas.cpp index 450dc72c..7869ab71 100644 --- a/jni/love/src/modules/graphics/opengl/Canvas.cpp +++ b/jni/love/src/modules/graphics/opengl/Canvas.cpp @@ -22,10 +22,9 @@ #include "Image.h" #include "Graphics.h" #include "common/Matrix.h" -#include "common/config.h" #include // For memcpy -#include +#include // For min/max namespace love { @@ -34,427 +33,66 @@ namespace graphics namespace opengl { -// strategy for fbo creation, interchangable at runtime: -// none, opengl >= 3.0, extensions -struct FramebufferStrategy +static GLenum createFBO(GLuint &framebuffer, GLuint texture) { - virtual ~FramebufferStrategy() {} + // get currently bound fbo to reset to it later + GLint current_fbo; + glGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, ¤t_fbo); - /// create a new framebuffer and texture - /** - * @param[out] framebuffer Framebuffer name - * @param[in] texture Texture name - * @return Creation status - */ - virtual GLenum createFBO(GLuint &, GLuint) + glGenFramebuffers(1, &framebuffer); + gl.bindFramebuffer(GL_FRAMEBUFFER, framebuffer); + + if (texture != 0) { - return GL_FRAMEBUFFER_UNSUPPORTED; + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0); + + // Initialize the texture to transparent black. + glClearColor(0.0f, 0.0f, 0.0f, 0.0f); + glClear(GL_COLOR_BUFFER_BIT); } - /// Create a stencil buffer and attach it to the active framebuffer object - /** - * @param[in] width Width of the stencil buffer - * @param[in] height Height of the stencil buffer - * @param[in] samples Number of samples to use - * @param[out] stencil Name for stencil buffer - * @return Whether the stencil buffer was successfully created - **/ - virtual bool createStencil(int, int, int, GLuint &) - { - return false; - } + GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER); - /// Create a MSAA renderbuffer and attach it to the active FBO. - /** - * @param[in] width Width of the MSAA buffer - * @param[in] height Height of the MSAA buffer - * @param[inout] samples Number of samples to use - * @param[in] internalformat The internal format to use for the buffer - * @param[out] buffer Name for the MSAA buffer - * @return Whether the MSAA buffer was successfully created and attached - **/ - virtual bool createMSAABuffer(int, int, int &, GLenum, GLuint &) - { - return false; - } + // unbind framebuffer + gl.bindFramebuffer(GL_FRAMEBUFFER, (GLuint) current_fbo); - /// remove objects - /** - * @param[in] framebuffer Framebuffer name - * @param[in] depth_stencil Name for packed depth and stencil buffer - */ - virtual void deleteFBO(GLuint, GLuint, GLuint) {} - virtual void bindFBO(GLuint) {} + return status; +} - /// attach additional canvases to the active framebuffer for rendering - /** - * @param[in] canvases List of canvases to attach - **/ - virtual void setAttachments(const std::vector &) {} - - /// stop using all additional attached canvases - virtual void setAttachments() {} -}; - -struct FramebufferStrategyCore : public FramebufferStrategy +static GLenum createMSAABuffer(int width, int height, int &samples, GLenum iformat, GLuint &buffer) { - virtual GLenum createFBO(GLuint &framebuffer, GLuint texture) + glGenRenderbuffers(1, &buffer); + glBindRenderbuffer(GL_RENDERBUFFER, buffer); + + glRenderbufferStorageMultisample(GL_RENDERBUFFER, samples, iformat, width, height); + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, buffer); + + glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_SAMPLES, &samples); + + glBindRenderbuffer(GL_RENDERBUFFER, 0); + + GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER); + + if (status == GL_FRAMEBUFFER_COMPLETE) { - // get currently bound fbo to reset to it later - GLint current_fbo; - glGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, ¤t_fbo); - - // create framebuffer - glGenFramebuffers(1, &framebuffer); - glBindFramebuffer(GL_FRAMEBUFFER, framebuffer); - - if (texture != 0) - { - glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, - GL_TEXTURE_2D, texture, 0); - } - - // check status - GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER); - - // unbind framebuffer - glBindFramebuffer(GL_FRAMEBUFFER, (GLuint) current_fbo); - return status; + // Initialize the buffer to transparent black. + glClearColor(0.0f, 0.0f, 0.0f, 0.0f); + glClear(GL_COLOR_BUFFER_BIT); + } + else + { + glDeleteRenderbuffers(1, &buffer); + buffer = 0; } - virtual bool createStencil(int width, int height, int samples, GLuint &stencil) - { - // create stencil buffer - glDeleteRenderbuffers(1, &stencil); - glGenRenderbuffers(1, &stencil); - glBindRenderbuffer(GL_RENDERBUFFER, stencil); - - if (samples > 1) - glRenderbufferStorageMultisample(GL_RENDERBUFFER, samples, GL_STENCIL_INDEX8, width, height); - else - glRenderbufferStorage(GL_RENDERBUFFER, GL_STENCIL_INDEX8, width, height); - - glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, - GL_RENDERBUFFER, stencil); - - glBindRenderbuffer(GL_RENDERBUFFER, 0); - - // check status - if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) - { - glDeleteRenderbuffers(1, &stencil); - stencil = 0; - return false; - } - - return true; - } - - virtual bool createMSAABuffer(int width, int height, int &samples, GLenum internalformat, GLuint &buffer) - { - glGenRenderbuffers(1, &buffer); - glBindRenderbuffer(GL_RENDERBUFFER, buffer); - glRenderbufferStorageMultisample(GL_RENDERBUFFER, samples, internalformat, - width, height); - glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, - GL_RENDERBUFFER, buffer); - glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_SAMPLES, &samples); - - glBindRenderbuffer(GL_RENDERBUFFER, 0); - - if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) - { - glDeleteRenderbuffers(1, &buffer); - buffer = 0; - return false; - } - - return true; - } - - virtual void deleteFBO(GLuint framebuffer, GLuint depth_stencil, GLuint msaa_buffer) - { - if (depth_stencil != 0) - glDeleteRenderbuffers(1, &depth_stencil); - if (msaa_buffer != 0) - glDeleteRenderbuffers(1, &msaa_buffer); - if (framebuffer != 0) - glDeleteFramebuffers(1, &framebuffer); - } - - virtual void bindFBO(GLuint framebuffer) - { - glBindFramebuffer(GL_FRAMEBUFFER, framebuffer); - ++Canvas::switchCount; - } - - virtual void setAttachments() - { - // set a single render target - glDrawBuffer(GL_COLOR_ATTACHMENT0); - } - - virtual void setAttachments(const std::vector &canvases) - { - if (canvases.size() == 0) - { - setAttachments(); - return; - } - - std::vector drawbuffers; - drawbuffers.push_back(GL_COLOR_ATTACHMENT0); - - // Attach the canvas textures to the currently bound framebuffer. - for (size_t i = 0; i < canvases.size(); i++) - { - glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1 + i, - GL_TEXTURE_2D, canvases[i]->getGLTexture(), 0); - drawbuffers.push_back(GL_COLOR_ATTACHMENT1 + i); - } - - // set up multiple render targets - if (GLAD_VERSION_2_0 || GLAD_ES_VERSION_3_0) - glDrawBuffers(drawbuffers.size(), &drawbuffers[0]); - else if (GLAD_ARB_draw_buffers) - glDrawBuffersARB(drawbuffers.size(), &drawbuffers[0]); - } -}; - -struct FramebufferStrategyCorePacked : public FramebufferStrategyCore -{ - virtual bool createStencil(int width, int height, int samples, GLuint &stencil) - { - // create combined depth/stencil buffer - glDeleteRenderbuffers(1, &stencil); - glGenRenderbuffers(1, &stencil); - glBindRenderbuffer(GL_RENDERBUFFER, stencil); - - if (samples > 1) - glRenderbufferStorageMultisample(GL_RENDERBUFFER, samples, GL_DEPTH_STENCIL, width, height); - else - glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_STENCIL, width, height); - - glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, - GL_RENDERBUFFER, stencil); - - glBindRenderbuffer(GL_RENDERBUFFER, 0); - - // check status - return glCheckFramebufferStatus(GL_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE; - } -}; - -struct FramebufferStrategyPackedEXT : public FramebufferStrategy -{ - virtual GLenum createFBO(GLuint &framebuffer, GLuint texture) - { - GLint current_fbo; - glGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING_EXT, ¤t_fbo); - - // create framebuffer - glGenFramebuffersEXT(1, &framebuffer); - glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, framebuffer); - - glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, - GL_TEXTURE_2D, texture, 0); - - // check status - GLenum status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT); - - // unbind framebuffer - glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, (GLuint) current_fbo); - return status; - } - - virtual bool createStencil(int width, int height, int samples, GLuint &stencil) - { - // create combined depth/stencil buffer - glDeleteRenderbuffersEXT(1, &stencil); - glGenRenderbuffersEXT(1, &stencil); - glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, stencil); - - if (samples > 1) - { - glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER, samples, - GL_DEPTH_STENCIL, width, height); - } - else - { - glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_STENCIL_EXT, - width, height); - } - - glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT, - GL_RENDERBUFFER_EXT, stencil); - - glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, 0); - - // check status - if (glCheckFramebufferStatusEXT(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) - { - glDeleteRenderbuffersEXT(1, &stencil); - stencil = 0; - return false; - } - - return true; - } - - virtual bool createMSAABuffer(int width, int height, int &samples, GLenum internalformat, GLuint &buffer) - { - if (!GLAD_EXT_framebuffer_multisample) - return false; - - glGenRenderbuffersEXT(1, &buffer); - glBindRenderbufferEXT(GL_RENDERBUFFER, buffer); - glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER, samples, - internalformat, width, height); - glFramebufferRenderbufferEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, - GL_RENDERBUFFER, buffer); - glGetRenderbufferParameterivEXT(GL_RENDERBUFFER, GL_RENDERBUFFER_SAMPLES, &samples); - - glBindRenderbufferEXT(GL_RENDERBUFFER, 0); - - if (glCheckFramebufferStatusEXT(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) - { - glDeleteRenderbuffersEXT(1, &buffer); - buffer = 0; - return false; - } - - return true; - } - - virtual void deleteFBO(GLuint framebuffer, GLuint depth_stencil, GLuint msaa_buffer) - { - if (depth_stencil != 0) - glDeleteRenderbuffersEXT(1, &depth_stencil); - if (msaa_buffer != 0) - glDeleteRenderbuffersEXT(1, &msaa_buffer); - if (framebuffer != 0) - glDeleteFramebuffersEXT(1, &framebuffer); - } - - virtual void bindFBO(GLuint framebuffer) - { - glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, framebuffer); - ++Canvas::switchCount; - } - - virtual void setAttachments() - { - // set a single render target - glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT); - } - - virtual void setAttachments(const std::vector &canvases) - { - if (canvases.size() == 0) - { - setAttachments(); - return; - } - - std::vector drawbuffers; - drawbuffers.push_back(GL_COLOR_ATTACHMENT0_EXT); - - // Attach the canvas textures to the currently bound framebuffer. - for (size_t i = 0; i < canvases.size(); i++) - { - glFramebufferTexture2DEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1_EXT + i, - GL_TEXTURE_2D, canvases[i]->getGLTexture(), 0); - drawbuffers.push_back(GL_COLOR_ATTACHMENT1_EXT + i); - } - - // set up multiple render targets - if (GLAD_VERSION_2_0 || GLAD_ES_VERSION_3_0) - glDrawBuffers(drawbuffers.size(), &drawbuffers[0]); - else if (GLAD_ARB_draw_buffers) - glDrawBuffersARB(drawbuffers.size(), &drawbuffers[0]); - } -}; - -struct FramebufferStrategyEXT : public FramebufferStrategyPackedEXT -{ - virtual bool createStencil(int width, int height, int samples, GLuint &stencil) - { - // create stencil buffer - glDeleteRenderbuffersEXT(1, &stencil); - glGenRenderbuffersEXT(1, &stencil); - glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, stencil); - - if (samples > 1) - { - glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER, samples, - GL_STENCIL_INDEX, width, height); - } - else - { - glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_STENCIL_INDEX, - width, height); - } - - glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT, - GL_RENDERBUFFER_EXT, stencil); - - glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, 0); - - // check status - if (glCheckFramebufferStatusEXT(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) - { - glDeleteRenderbuffersEXT(1, &stencil); - stencil = 0; - return false; - } - - return true; - } - - bool isSupported() - { - GLuint fb = 0, stencil = 0; - GLenum status = createFBO(fb, 0); - deleteFBO(fb, stencil, 0); - return status == GL_FRAMEBUFFER_COMPLETE; - } -}; - -FramebufferStrategy *strategy = nullptr; - -FramebufferStrategy strategyNone; - -FramebufferStrategyCore strategyCore; - -FramebufferStrategyCorePacked strategyCorePacked; - -FramebufferStrategyPackedEXT strategyPackedEXT; - -FramebufferStrategyEXT strategyEXT; + return status; +} Canvas *Canvas::current = nullptr; OpenGL::Viewport Canvas::systemViewport = OpenGL::Viewport(); bool Canvas::screenHasSRGB = false; -int Canvas::switchCount = 0; int Canvas::canvasCount = 0; -static void getStrategy() -{ - if (!strategy) - { - if (GLAD_VERSION_3_0 || GLAD_ARB_framebuffer_object) - strategy = &strategyCorePacked; - else if (GLAD_ES_VERSION_2_0) - strategy = &strategyCore; - else if (GLAD_EXT_framebuffer_object && GLAD_EXT_packed_depth_stencil) - strategy = &strategyPackedEXT; - else if (GLAD_EXT_framebuffer_object && strategyEXT.isSupported()) - strategy = &strategyEXT; - else - strategy = &strategyNone; - } -} - Canvas::Canvas(int width, int height, Format format, int msaa) : fbo(0) , resolve_fbo(0) @@ -462,8 +100,8 @@ Canvas::Canvas(int width, int height, Format format, int msaa) , msaa_buffer(0) , depth_stencil(0) , format(format) - , msaa_samples(msaa) - , msaa_dirty(false) + , requested_samples(msaa) + , actual_samples(0) , texture_memory(0) { this->width = width; @@ -472,15 +110,20 @@ Canvas::Canvas(int width, int height, Format format, int msaa) float w = static_cast(width); float h = static_cast(height); + // Vertices are ordered for use with triangle strips: + // 0----2 + // | / | + // | / | + // 1----3 // world coordinates vertices[0].x = 0; vertices[0].y = 0; vertices[1].x = 0; vertices[1].y = h; vertices[2].x = w; - vertices[2].y = h; + vertices[2].y = 0; vertices[3].x = w; - vertices[3].y = 0; + vertices[3].y = h; // texture coordinates vertices[0].s = 0; @@ -488,11 +131,9 @@ Canvas::Canvas(int width, int height, Format format, int msaa) vertices[1].s = 0; vertices[1].t = 1; vertices[2].s = 1; - vertices[2].t = 1; + vertices[2].t = 0; vertices[3].s = 1; - vertices[3].t = 0; - - getStrategy(); + vertices[3].t = 1; loadVolatile(); @@ -512,45 +153,53 @@ Canvas::~Canvas() bool Canvas::createMSAAFBO(GLenum internalformat) { - // Create our FBO without a texture. - status = strategy->createFBO(fbo, 0); + actual_samples = requested_samples; - GLuint previous = 0; + if (actual_samples <= 1) + { + actual_samples = 0; + return false; + } + + // Create our FBO without a texture. + status = createFBO(fbo, 0); + + GLuint previous = gl.getDefaultFBO(); if (current != this) { if (current != nullptr) previous = current->fbo; - strategy->bindFBO(fbo); + gl.bindFramebuffer(GL_FRAMEBUFFER, fbo); } // Create and attach the MSAA buffer for our FBO. - if (strategy->createMSAABuffer(width, height, msaa_samples, internalformat, msaa_buffer)) - status = GL_FRAMEBUFFER_COMPLETE; - else - status = GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT; + status = createMSAABuffer(width, height, actual_samples, internalformat, msaa_buffer); // Create the FBO used for the MSAA resolve, and attach the texture. if (status == GL_FRAMEBUFFER_COMPLETE) - status = strategy->createFBO(resolve_fbo, texture); + status = createFBO(resolve_fbo, texture); if (status != GL_FRAMEBUFFER_COMPLETE) { // Clean up. - strategy->deleteFBO(fbo, 0, msaa_buffer); - strategy->deleteFBO(resolve_fbo, 0, 0); + glDeleteFramebuffers(1, &fbo); + glDeleteFramebuffers(1, &resolve_fbo); + glDeleteRenderbuffers(1, &msaa_buffer); fbo = msaa_buffer = resolve_fbo = 0; - msaa_samples = 0; + actual_samples = 0; } if (current != this) - strategy->bindFBO(previous); + gl.bindFramebuffer(GL_FRAMEBUFFER, previous); return status == GL_FRAMEBUFFER_COMPLETE; } bool Canvas::loadVolatile() { + OpenGL::TempDebugGroup debuggroup("Canvas load"); + fbo = depth_stencil = texture = 0; resolve_fbo = msaa_buffer = 0; status = GL_FRAMEBUFFER_COMPLETE; @@ -562,6 +211,11 @@ bool Canvas::loadVolatile() return false; } + // getMaxRenderbufferSamples will be 0 on systems that don't support + // multisampled renderbuffers / don't export FBO multisample extensions. + requested_samples = std::min(requested_samples, gl.getMaxRenderbufferSamples()); + requested_samples = std::max(requested_samples, 0); + glGenTextures(1, &texture); gl.bindTexture(texture); @@ -577,21 +231,16 @@ bool Canvas::loadVolatile() convertFormat(format, internalformat, externalformat, textype); - // in ES2, the internalformat and format params of TexImage have to match. + // in GLES2, the internalformat and format params of TexImage have to match. + GLint iformat = (GLint) internalformat; if (GLAD_ES_VERSION_2_0 && !GLAD_ES_VERSION_3_0) - internalformat = externalformat; + iformat = (GLint) externalformat; while (glGetError() != GL_NO_ERROR) /* Clear the error buffer. */; - glTexImage2D(GL_TEXTURE_2D, - 0, - (GLint) internalformat, - width, height, - 0, - externalformat, - textype, - nullptr); + glTexImage2D(GL_TEXTURE_2D, 0, iformat, width, height, 0, + externalformat, textype, nullptr); if (glGetError() != GL_NO_ERROR) { @@ -601,44 +250,26 @@ bool Canvas::loadVolatile() return false; } - int max_samples = 0; - if (GLAD_VERSION_3_0 || GLAD_ARB_framebuffer_object - || GLAD_EXT_framebuffer_multisample) - { - glGetIntegerv(GL_MAX_SAMPLES, &max_samples); - } - - if (msaa_samples > max_samples) - msaa_samples = max_samples; - - // Try to create a MSAA FBO if requested. - bool msaasuccess = false; - if (msaa_samples > 1) - msaasuccess = createMSAAFBO(internalformat); - - // On failure (or no requested MSAA), fall back to a regular FBO. - if (!msaasuccess) - status = strategy->createFBO(fbo, texture); + // Try to create a MSAA FBO if requested. On failure (or no requested MSAA), + // fall back to a regular FBO. + if (!createMSAAFBO(internalformat)) + status = createFBO(fbo, texture); if (status != GL_FRAMEBUFFER_COMPLETE) { if (fbo != 0) { - strategy->deleteFBO(fbo, 0, 0); + glDeleteFramebuffers(1, &fbo); fbo = 0; } return false; } - clear(Color(0, 0, 0, 0)); - - msaa_dirty = (msaa_buffer != 0); - size_t prevmemsize = texture_memory; texture_memory = (getFormatBitsPerPixel(format) * width * height) / 8; if (msaa_buffer != 0) - texture_memory += (texture_memory * msaa_samples); + texture_memory += (texture_memory * actual_samples); gl.updateTextureMemorySize(prevmemsize, texture_memory); @@ -647,13 +278,19 @@ bool Canvas::loadVolatile() void Canvas::unloadVolatile() { - strategy->deleteFBO(fbo, depth_stencil, msaa_buffer); - strategy->deleteFBO(resolve_fbo, 0, 0); + glDeleteFramebuffers(1, &fbo); + glDeleteFramebuffers(1, &resolve_fbo); + + glDeleteRenderbuffers(1, &depth_stencil); + glDeleteRenderbuffers(1, &msaa_buffer); gl.deleteTexture(texture); - fbo = depth_stencil = texture = 0; - resolve_fbo = msaa_buffer = 0; + fbo = 0; + resolve_fbo = 0; + depth_stencil = 0; + msaa_buffer = 0; + texture = 0; attachedCanvases.clear(); @@ -661,41 +298,34 @@ void Canvas::unloadVolatile() texture_memory = 0; } -void Canvas::drawv(const Matrix &t, const Vertex *v) +void Canvas::drawv(const Matrix4 &t, const Vertex *v) { + OpenGL::TempDebugGroup debuggroup("Canvas draw"); + OpenGL::TempTransform transform(gl); transform.get() *= t; + gl.bindTexture(texture); + + gl.useVertexAttribArrays(ATTRIBFLAG_POS | ATTRIBFLAG_TEXCOORD); + + glVertexAttribPointer(ATTRIB_POS, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), &v[0].x); + glVertexAttribPointer(ATTRIB_TEXCOORD, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), &v[0].s); + gl.prepareDraw(); - - predraw(); - - gl.enableVertexAttribArray(OpenGL::ATTRIB_POS); - gl.enableVertexAttribArray(OpenGL::ATTRIB_TEXCOORD); - - gl.setVertexAttribArray(OpenGL::ATTRIB_POS, 2, GL_FLOAT, sizeof(Vertex), (GLvoid *) &v[0].x); - gl.setVertexAttribArray(OpenGL::ATTRIB_TEXCOORD, 2, GL_FLOAT, sizeof(Vertex), (GLvoid *) &v[0].s); - - gl.drawArrays(GL_TRIANGLE_FAN, 0, 4); - - gl.disableVertexAttribArray(OpenGL::ATTRIB_POS); - gl.disableVertexAttribArray(OpenGL::ATTRIB_TEXCOORD); - - postdraw(); + gl.drawArrays(GL_TRIANGLE_STRIP, 0, 4); } void Canvas::draw(float x, float y, float angle, float sx, float sy, float ox, float oy, float kx, float ky) { - static Matrix t; - t.setTransformation(x, y, angle, sx, sy, ox, oy, kx, ky); + Matrix4 t(x, y, angle, sx, sy, ox, oy, kx, ky); drawv(t, vertices); } void Canvas::drawq(Quad *quad, float x, float y, float angle, float sx, float sy, float ox, float oy, float kx, float ky) { - static Matrix t; - t.setTransformation(x, y, angle, sx, sy, ox, oy, kx, ky); + Matrix4 t(x, y, angle, sx, sy, ox, oy, kx, ky); const Vertex *v = quad->getVertices(); drawv(t, v); @@ -703,6 +333,9 @@ void Canvas::drawq(Quad *quad, float x, float y, float angle, float sx, float sy void Canvas::setFilter(const Texture::Filter &f) { + if (!validateFilter(f, false)) + throw love::Exception("Invalid texture filter."); + filter = f; gl.bindTexture(texture); gl.setTextureFilter(filter); @@ -713,7 +346,8 @@ bool Canvas::setWrap(const Texture::Wrap &w) bool success = true; wrap = w; - if (hasLimitedNpot() && (width != next_p2(width) || height != next_p2(height))) + if ((GLAD_ES_VERSION_2_0 && !(GLAD_ES_VERSION_3_0 || GLAD_OES_texture_npot)) + && (width != next_p2(width) || height != next_p2(height))) { if (wrap.s != WRAP_CLAMP || wrap.t != WRAP_CLAMP) success = false; @@ -728,18 +362,9 @@ bool Canvas::setWrap(const Texture::Wrap &w) return success; } -GLuint Canvas::getGLTexture() const +const void *Canvas::getHandle() const { - return texture; -} - -void Canvas::predraw() -{ - // We need to make sure the texture is up-to-date by resolving the MSAA - // buffer (which we render to when the canvas is active) to it. - resolveMSAA(); - - gl.bindTexture(texture); + return &texture; } void Canvas::setupGrab() @@ -761,23 +386,11 @@ void Canvas::setupGrab() current = this; // bind the framebuffer object. - strategy->bindFBO(fbo); - gl.setViewport(OpenGL::Viewport(0, 0, width, height)); + gl.bindFramebuffer(GL_FRAMEBUFFER, fbo); + gl.setViewport({0, 0, width, height}); // Set up the projection matrix - gl.matrices.projection.push_back(Matrix::ortho(0.0, width, 0.0, height)); - - // Make sure the correct sRGB setting is used when drawing to the canvas. - if (GLAD_VERSION_1_1 || GLAD_EXT_sRGB_write_control) - { - if (format == FORMAT_SRGB) - glEnable(GL_FRAMEBUFFER_SRGB); - else if (screenHasSRGB) - glDisable(GL_FRAMEBUFFER_SRGB); - } - - if (msaa_buffer != 0) - msaa_dirty = true; + gl.matrices.projection.push_back(Matrix4::ortho(0.0, (float) width, 0.0, (float) height)); } void Canvas::startGrab(const std::vector &canvases) @@ -785,6 +398,7 @@ void Canvas::startGrab(const std::vector &canvases) // Whether the new canvas list is different from the old one. // A more thorough check is done below. bool canvaseschanged = canvases.size() != attachedCanvases.size(); + bool hasSRGBcanvas = (format == FORMAT_SRGB); if (canvases.size() > 0) { @@ -792,35 +406,68 @@ void Canvas::startGrab(const std::vector &canvases) throw love::Exception("Multi-canvas rendering is not supported on this system."); if ((int) canvases.size() + 1 > gl.getMaxRenderTargets()) - throw love::Exception("This system can't simultaniously render to %d canvases.", canvases.size()+1); + throw love::Exception("This system can't simultaneously render to %d canvases.", canvases.size()+1); - if (msaa_samples != 0) + if (actual_samples != 0) throw love::Exception("Multi-canvas rendering is not supported with MSAA."); } + bool multiformatsupported = isMultiFormatMultiCanvasSupported(); + for (size_t i = 0; i < canvases.size(); i++) { if (canvases[i]->getWidth() != width || canvases[i]->getHeight() != height) - throw love::Exception("All canvas arguments must have the same dimensions."); + throw love::Exception("All canvases must have the same dimensions."); - if (canvases[i]->getTextureFormat() != format) - throw love::Exception("All canvas arguments must have the same texture format."); + Format otherformat = canvases[i]->getTextureFormat(); + + if (otherformat != format && !multiformatsupported) + throw love::Exception("This system doesn't support multi-canvas rendering with different canvas formats."); if (canvases[i]->getMSAA() != 0) throw love::Exception("Multi-canvas rendering is not supported with MSAA."); if (!canvaseschanged && canvases[i] != attachedCanvases[i]) canvaseschanged = true; + + if (otherformat == FORMAT_SRGB) + hasSRGBcanvas = true; } + OpenGL::TempDebugGroup debuggroup("Canvas set"); + setupGrab(); + // Make sure the correct sRGB setting is used when drawing to the canvases. + if (GLAD_VERSION_1_0 || GLAD_EXT_sRGB_write_control) + { + if (hasSRGBcanvas && !gl.hasFramebufferSRGB()) + gl.setFramebufferSRGB(true); + else if (!hasSRGBcanvas && gl.hasFramebufferSRGB()) + gl.setFramebufferSRGB(false); + } + // Don't attach anything if there's nothing to change. if (!canvaseschanged) return; // Attach the canvas textures to the active FBO and set up MRTs. - strategy->setAttachments(canvases); + std::vector drawbuffers; + drawbuffers.reserve(canvases.size() + 1); + + drawbuffers.push_back(GL_COLOR_ATTACHMENT0); + + // Attach the canvas textures to the currently bound framebuffer. + for (int i = 0; i < (int) canvases.size(); i++) + { + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1 + i, + GL_TEXTURE_2D, *(GLuint *) canvases[i]->getHandle(), 0); + + drawbuffers.push_back(GL_COLOR_ATTACHMENT1 + i); + } + + // set up multiple render targets + glDrawBuffers((int) drawbuffers.size(), &drawbuffers[0]); // We want to avoid reference cycles, so we don't retain the attached // Canvases here. The code in Graphics::setCanvas retains them. @@ -830,13 +477,24 @@ void Canvas::startGrab(const std::vector &canvases) void Canvas::startGrab() { + OpenGL::TempDebugGroup debuggroup("Canvas set"); + setupGrab(); + // Make sure the correct sRGB setting is used when drawing to the canvas. + if (GLAD_VERSION_1_0 || GLAD_EXT_sRGB_write_control) + { + if (format == FORMAT_SRGB && !gl.hasFramebufferSRGB()) + gl.setFramebufferSRGB(true); + else if (format != FORMAT_SRGB && gl.hasFramebufferSRGB()) + gl.setFramebufferSRGB(false); + } + if (attachedCanvases.size() == 0) return; - // make sure the FBO is only using a single canvas - strategy->setAttachments(); + // Make sure the FBO is only using a single draw buffer. + glDrawBuffer(GL_COLOR_ATTACHMENT0); attachedCanvases.clear(); } @@ -847,199 +505,147 @@ void Canvas::stopGrab(bool switchingToOtherCanvas) if (current != this) return; - if (depth_stencil != 0 && GLAD_EXT_discard_framebuffer) - { - // Hint for the driver that it doesn't need to save these buffers. - GLenum attachments[] = {GL_STENCIL_ATTACHMENT, GL_DEPTH_ATTACHMENT}; - glDiscardFramebufferEXT(GL_FRAMEBUFFER, 2, attachments); - } + OpenGL::TempDebugGroup debuggroup("Canvas un-set"); + + // Make sure the canvas texture is up to date if we're using MSAA. + resolveMSAA(false); gl.matrices.projection.pop_back(); - if (switchingToOtherCanvas) + if (!switchingToOtherCanvas) { - if (GLAD_VERSION_1_1 || GLAD_EXT_sRGB_write_control) - { - if (format == FORMAT_SRGB) - glDisable(GL_FRAMEBUFFER_SRGB); - } - } - else - { - // bind the default framebuffer. - strategy->bindFBO(gl.getDefaultFBO()); + // bind system framebuffer. + gl.bindFramebuffer(GL_FRAMEBUFFER, gl.getDefaultFBO()); current = nullptr; gl.setViewport(systemViewport); - if (GLAD_VERSION_1_1 || GLAD_EXT_sRGB_write_control) + if (GLAD_VERSION_1_0 || GLAD_EXT_sRGB_write_control) { - if (format == FORMAT_SRGB && !screenHasSRGB) - glDisable(GL_FRAMEBUFFER_SRGB); - else if (format != FORMAT_SRGB && screenHasSRGB) - glEnable(GL_FRAMEBUFFER_SRGB); + if (screenHasSRGB && !gl.hasFramebufferSRGB()) + gl.setFramebufferSRGB(true); + else if (!screenHasSRGB && gl.hasFramebufferSRGB()) + gl.setFramebufferSRGB(false); } } } -void Canvas::clear(Color c) -{ - if (strategy == &strategyNone) - return; - - GLuint previous = gl.getDefaultFBO(); - - if (current != this) - { - if (current != nullptr) - previous = current->fbo; - - strategy->bindFBO(fbo); - } - - GLfloat glcolor[] = {c.r/255.f, c.g/255.f, c.b/255.f, c.a/255.f}; - - // We don't need to worry about multiple FBO attachments or global clear - // color state when OpenGL 3.0+ is supported. - if (GLAD_VERSION_3_0 || GLAD_ES_VERSION_3_0) - { - glClearBufferfv(GL_COLOR, 0, glcolor); - - if (depth_stencil != 0) - { - GLint stencilvalue = 0; - glClearBufferiv(GL_STENCIL, 0, &stencilvalue); - } - } - else - { - // glClear will clear all active draw buffers, so we need to temporarily - // detach any other canvases (when MRT is being used.) - if (attachedCanvases.size() > 0) - strategy->setAttachments(); - - // Don't use the state-shadowed gl.setClearColor because we want to save - // the previous clear color. - glClearColor(glcolor[0], glcolor[1], glcolor[2], glcolor[3]); - glClear(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); - - if (attachedCanvases.size() > 0) - strategy->setAttachments(attachedCanvases); - - // Restore the global clear color. - gl.setClearColor(gl.getClearColor()); - } - - if (current != this) - strategy->bindFBO(previous); - - if (msaa_buffer != 0) - msaa_dirty = true; -} - bool Canvas::checkCreateStencil() { // Do nothing if we've already created the stencil buffer. if (depth_stencil != 0) return true; - if (current != this) - strategy->bindFBO(fbo); + OpenGL::TempDebugGroup debuggroup("Canvas create stencil"); - bool success = strategy->createStencil(width, height, msaa_samples, depth_stencil); + if (current != this) + gl.bindFramebuffer(GL_FRAMEBUFFER, fbo); + + GLenum format = GL_STENCIL_INDEX8; + GLenum attachment = GL_STENCIL_ATTACHMENT; + + // Prefer a combined depth/stencil buffer. + if (GLAD_ES_VERSION_3_0 || GLAD_VERSION_3_0 || GLAD_ARB_framebuffer_object + || GLAD_EXT_packed_depth_stencil || GLAD_OES_packed_depth_stencil) + { + format = GL_DEPTH_STENCIL; + attachment = GL_DEPTH_STENCIL_ATTACHMENT; + } + + glGenRenderbuffers(1, &depth_stencil); + glBindRenderbuffer(GL_RENDERBUFFER, depth_stencil); + + if (requested_samples > 1) + glRenderbufferStorageMultisample(GL_RENDERBUFFER, requested_samples, format, width, height); + else + glRenderbufferStorage(GL_RENDERBUFFER, format, width, height); + + // Attach the stencil buffer to the framebuffer object. + glFramebufferRenderbuffer(GL_FRAMEBUFFER, attachment, GL_RENDERBUFFER, depth_stencil); + + glBindRenderbuffer(GL_RENDERBUFFER, 0); + + bool success = glCheckFramebufferStatus(GL_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE; + + // We don't want the stencil buffer filled with garbage. + if (success) + glClear(GL_STENCIL_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + else + { + glDeleteRenderbuffers(1, &depth_stencil); + depth_stencil = 0; + } if (current && current != this) - strategy->bindFBO(current->fbo); + gl.bindFramebuffer(GL_FRAMEBUFFER, current->fbo); else if (!current) - strategy->bindFBO(gl.getDefaultFBO()); + gl.bindFramebuffer(GL_FRAMEBUFFER, gl.getDefaultFBO()); return success; } -love::image::ImageData *Canvas::getImageData(love::image::Image *image) +love::image::ImageData *Canvas::newImageData(love::image::Image *image, int x, int y, int w, int h) { - resolveMSAA(); + if (x < 0 || y < 0 || w <= 0 || h <= 0 || (x + w) > width || (y + h) > height) + throw love::Exception("Invalid ImageData rectangle dimensions."); - int row = 4 * width; - int size = row * height; - GLubyte *pixels = new GLubyte[size]; + int row = 4 * w; + int size = row * h; + GLubyte *pixels = nullptr; + try + { + pixels = new GLubyte[size]; + } + catch (std::bad_alloc &) + { + throw love::Exception("Out of memory."); + } + + // Make sure the canvas texture is up to date if we're using MSAA. + if (current == this) + resolveMSAA(false); // Our texture is attached to 'resolve_fbo' when we use MSAA. - if (msaa_samples > 1 && (GLAD_VERSION_3_0 || GLAD_ARB_framebuffer_object)) - glBindFramebuffer(GL_READ_FRAMEBUFFER, resolve_fbo); - else if (msaa_samples > 1 && GLAD_EXT_framebuffer_multisample) - glBindFramebufferEXT(GL_READ_FRAMEBUFFER, resolve_fbo); + if (resolve_fbo != 0) + gl.bindFramebuffer(GL_READ_FRAMEBUFFER, resolve_fbo); else - strategy->bindFBO(fbo); + gl.bindFramebuffer(GL_FRAMEBUFFER, fbo); - glReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, pixels); + glReadPixels(x, y, w, h, GL_RGBA, GL_UNSIGNED_BYTE, pixels); - if (current) - strategy->bindFBO(current->fbo); - else - strategy->bindFBO(gl.getDefaultFBO()); + GLuint prevfbo = current ? current->fbo : gl.getDefaultFBO(); + gl.bindFramebuffer(GL_FRAMEBUFFER, prevfbo); // The new ImageData now owns the pixel data, so we don't delete it here. - love::image::ImageData *img = image->newImageData(width, height, (void *)pixels, true); - return img; + return image->newImageData(w, h, pixels, true); } -void Canvas::getPixel(unsigned char* pixel_rgba, int x, int y) -{ - if (x < 0 || x >= width || y < 0 || y >= width) - throw love::Exception("Attempt to get out-of-range pixel (%d,%d)!", x, y); - - resolveMSAA(); - - // Our texture is attached to 'resolve_fbo' when we use MSAA. - if (msaa_samples > 1 && (GLAD_VERSION_3_0 || GLAD_ARB_framebuffer_object)) - glBindFramebuffer(GL_READ_FRAMEBUFFER, resolve_fbo); - else if (msaa_samples > 1 && GLAD_EXT_framebuffer_multisample) - glBindFramebufferEXT(GL_READ_FRAMEBUFFER, resolve_fbo); - else if (current != this) - strategy->bindFBO(fbo); - - glReadPixels(x, y, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, pixel_rgba); - - if (current && current != this) - strategy->bindFBO(current->fbo); - else if (!current) - strategy->bindFBO(gl.getDefaultFBO()); -} - -bool Canvas::resolveMSAA() +bool Canvas::resolveMSAA(bool restoreprev) { if (resolve_fbo == 0 || msaa_buffer == 0) return false; - if (!msaa_dirty) - return true; + OpenGL::TempDebugGroup debuggroup("Canvas MSAA resolve"); - GLuint previous = 0; - if (current != nullptr) - previous = current->fbo; + GLint w = width; + GLint h = height; // Do the MSAA resolve by blitting the MSAA renderbuffer to the texture. - if (GLAD_VERSION_3_0 || GLAD_ARB_framebuffer_object) - { - glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo); - glBindFramebuffer(GL_DRAW_FRAMEBUFFER, resolve_fbo); - glBlitFramebuffer(0, 0, width, height, 0, 0, width, height, - GL_COLOR_BUFFER_BIT, GL_NEAREST); - } - else if (GLAD_EXT_framebuffer_multisample && GLAD_EXT_framebuffer_blit) - { - glBindFramebufferEXT(GL_READ_FRAMEBUFFER, fbo); - glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER, resolve_fbo); - glBlitFramebufferEXT(0, 0, width, height, 0, 0, width, height, - GL_COLOR_BUFFER_BIT, GL_NEAREST); - } + // For many of the MSAA extensions that add suffixes to the functions, we + // assign function pointers in OpenGL.cpp so we can call the core functions. + + gl.bindFramebuffer(GL_READ_FRAMEBUFFER, fbo); + gl.bindFramebuffer(GL_DRAW_FRAMEBUFFER, resolve_fbo); + + if (GLAD_APPLE_framebuffer_multisample) + glResolveMultisampleFramebufferAPPLE(); else - return false; + glBlitFramebuffer(0, 0, w, h, 0, 0, w, h, GL_COLOR_BUFFER_BIT, GL_NEAREST); - strategy->bindFBO(previous); - - if (current != this) - msaa_dirty = false; + if (restoreprev) + { + GLuint fbo = current ? current->fbo : gl.getDefaultFBO(); + gl.bindFramebuffer(GL_FRAMEBUFFER, fbo); + } return true; } @@ -1068,11 +674,6 @@ void Canvas::convertFormat(Canvas::Format format, GLenum &internalformat, GLenum switch (format) { - case FORMAT_RGBA8: - default: - internalformat = GL_RGBA8; - type = GL_UNSIGNED_BYTE; - break; case FORMAT_RGBA4: internalformat = GL_RGBA4; type = GL_UNSIGNED_SHORT_4_4_4_4; @@ -1086,6 +687,21 @@ void Canvas::convertFormat(Canvas::Format format, GLenum &internalformat, GLenum externalformat = GL_RGB; type = GL_UNSIGNED_SHORT_5_6_5; break; + case FORMAT_R8: + internalformat = GL_R8; + externalformat = GL_RED; + type = GL_UNSIGNED_BYTE; + break; + case FORMAT_RG8: + internalformat = GL_RG8; + externalformat = GL_RG; + type = GL_UNSIGNED_BYTE; + break; + case FORMAT_RGBA8: + default: + internalformat = GL_RGBA8; + type = GL_UNSIGNED_BYTE; + break; case FORMAT_RGB10A2: internalformat = GL_RGB10_A2; type = GL_UNSIGNED_INT_2_10_10_10_REV; @@ -1095,15 +711,45 @@ void Canvas::convertFormat(Canvas::Format format, GLenum &internalformat, GLenum externalformat = GL_RGB; type = GL_UNSIGNED_INT_10F_11F_11F_REV; break; - case FORMAT_RGBA16F: - internalformat = GL_RGBA16F; - if (GLAD_OES_texture_float) + case FORMAT_R16F: + internalformat = GL_R16F; + externalformat = GL_RED; + if (GLAD_OES_texture_half_float) type = GL_HALF_FLOAT_OES; - else if (GLAD_VERSION_1_1) + else if (GLAD_VERSION_1_0) type = GL_FLOAT; else type = GL_HALF_FLOAT; break; + case FORMAT_RG16F: + internalformat = GL_RG16F; + externalformat = GL_RG; + if (GLAD_OES_texture_half_float) + type = GL_HALF_FLOAT_OES; + else if (GLAD_VERSION_1_0) + type = GL_FLOAT; + else + type = GL_HALF_FLOAT; + break; + case FORMAT_RGBA16F: + internalformat = GL_RGBA16F; + if (GLAD_OES_texture_half_float) + type = GL_HALF_FLOAT_OES; + else if (GLAD_VERSION_1_0) + type = GL_FLOAT; + else + type = GL_HALF_FLOAT; + break; + case FORMAT_R32F: + internalformat = GL_R32F; + externalformat = GL_RED; + type = GL_FLOAT; + break; + case FORMAT_RG32F: + internalformat = GL_RG32F; + externalformat = GL_RG; + type = GL_FLOAT; + break; case FORMAT_RGBA32F: internalformat = GL_RGBA32F; type = GL_FLOAT; @@ -1111,7 +757,7 @@ void Canvas::convertFormat(Canvas::Format format, GLenum &internalformat, GLenum case FORMAT_SRGB: internalformat = GL_SRGB8_ALPHA8; type = GL_UNSIGNED_BYTE; - if (GLAD_ES_VERSION_2_0) + if (GLAD_ES_VERSION_2_0 && !GLAD_ES_VERSION_3_0) externalformat = GL_SRGB_ALPHA; break; } @@ -1121,17 +767,24 @@ size_t Canvas::getFormatBitsPerPixel(Format format) { switch (getSizedFormat(format)) { - case FORMAT_RGBA8: - case FORMAT_RGB10A2: - case FORMAT_RG11B10F: - case FORMAT_SRGB: - default: - return 32; + case FORMAT_R8: + return 8; case FORMAT_RGBA4: case FORMAT_RGB5A1: case FORMAT_RGB565: + case FORMAT_RG8: + case FORMAT_R16F: return 16; + case FORMAT_RGBA8: + case FORMAT_RGB10A2: + case FORMAT_RG11B10F: + case FORMAT_RG16F: + case FORMAT_R32F: + case FORMAT_SRGB: + default: + return 32; case FORMAT_RGBA16F: + case FORMAT_RG32F: return 64; case FORMAT_RGBA32F: return 128; @@ -1140,16 +793,20 @@ size_t Canvas::getFormatBitsPerPixel(Format format) bool Canvas::isSupported() { - getStrategy(); - return (strategy != &strategyNone); + return GLAD_ES_VERSION_2_0 || GLAD_VERSION_3_0 || GLAD_ARB_framebuffer_object || GLAD_EXT_framebuffer_object; } bool Canvas::isMultiCanvasSupported() { - // system must support at least 4 simultanious active canvases. + // system must support at least 4 simultaneous active canvases. return gl.getMaxRenderTargets() >= 4; } +bool Canvas::isMultiFormatMultiCanvasSupported() +{ + return isMultiCanvasSupported() && (GLAD_ES_VERSION_3_0 || GLAD_VERSION_3_0 || GLAD_ARB_framebuffer_object); +} + bool Canvas::supportedFormats[] = {false}; bool Canvas::checkedFormats[] = {false}; @@ -1163,12 +820,6 @@ bool Canvas::isFormatSupported(Canvas::Format format) switch (format) { - case FORMAT_RGBA8: - if (GLAD_VERSION_1_1) - supported = true; - else - supported = GLAD_ES_VERSION_3_0 || GLAD_OES_rgb8_rgba8 || GLAD_ARM_rgba8; - break; case FORMAT_RGBA4: case FORMAT_RGB5A1: supported = true; @@ -1176,34 +827,48 @@ bool Canvas::isFormatSupported(Canvas::Format format) case FORMAT_RGB565: supported = GLAD_ES_VERSION_2_0 || GLAD_VERSION_4_2 || GLAD_ARB_ES2_compatibility; break; + case FORMAT_R8: + case FORMAT_RG8: + if (GLAD_VERSION_1_0) + supported = GLAD_VERSION_3_0 || GLAD_ARB_texture_rg; + else if (GLAD_ES_VERSION_2_0) + supported = GLAD_ES_VERSION_3_0 || GLAD_EXT_texture_rg; + break; + case FORMAT_RGBA8: + supported = GLAD_VERSION_1_0 || GLAD_ES_VERSION_3_0 || GLAD_OES_rgb8_rgba8 || GLAD_ARM_rgba8; + break; case FORMAT_RGB10A2: - if (GLAD_VERSION_1_1) - supported = true; - else - supported = GLAD_ES_VERSION_3_0; + supported = GLAD_ES_VERSION_3_0 || GLAD_VERSION_1_0; break; case FORMAT_RG11B10F: - if (GLAD_VERSION_1_1) - supported = GLAD_VERSION_3_0 || GLAD_EXT_packed_float; + supported = GLAD_VERSION_3_0 || GLAD_EXT_packed_float || GLAD_APPLE_color_buffer_packed_float; + break; + case FORMAT_R16F: + case FORMAT_RG16F: + if (GLAD_VERSION_1_0) + supported = GLAD_VERSION_3_0 || (GLAD_ARB_texture_float && GLAD_ARB_texture_rg); else - supported = GLAD_ES_VERSION_3_0 /*|| GLAD_NV_packed_float*/; + supported = GLAD_EXT_color_buffer_half_float && (GLAD_ES_VERSION_3_0 || (GLAD_OES_texture_half_float && GLAD_EXT_texture_rg)); break; case FORMAT_RGBA16F: - if (GLAD_VERSION_1_1) + if (GLAD_VERSION_1_0) supported = GLAD_VERSION_3_0 || GLAD_ARB_texture_float; - else + else if (GLAD_ES_VERSION_2_0) supported = GLAD_EXT_color_buffer_half_float && (GLAD_ES_VERSION_3_0 || GLAD_OES_texture_half_float); break; + case FORMAT_R32F: + case FORMAT_RG32F: + supported = GLAD_VERSION_3_0 || (GLAD_ARB_texture_float && GLAD_ARB_texture_rg); + break; case FORMAT_RGBA32F: - if (GLAD_VERSION_1_1) - supported = GLAD_VERSION_3_0 || GLAD_ARB_texture_float; - else - supported = false; // GLAD_EXT_color_buffer_float && GLAD_ES_VERSION_3_0; + supported = GLAD_VERSION_3_0 || GLAD_ARB_texture_float; break; case FORMAT_SRGB: - if (GLAD_VERSION_1_1) + if (GLAD_VERSION_1_0) + { supported = GLAD_VERSION_3_0 || ((GLAD_ARB_framebuffer_sRGB || GLAD_EXT_framebuffer_sRGB) && (GLAD_VERSION_2_1 || GLAD_EXT_texture_sRGB)); + } else supported = GLAD_ES_VERSION_3_0 || GLAD_EXT_sRGB; break; @@ -1228,6 +893,7 @@ bool Canvas::isFormatSupported(Canvas::Format format) GLenum textype = GL_UNSIGNED_BYTE; convertFormat(format, internalformat, externalformat, textype); + // in GLES2, the internalformat and format params of TexImage have to match. if (GLAD_ES_VERSION_2_0 && !GLAD_ES_VERSION_3_0) internalformat = externalformat; @@ -1245,8 +911,8 @@ bool Canvas::isFormatSupported(Canvas::Format format) glTexImage2D(GL_TEXTURE_2D, 0, internalformat, 2, 2, 0, externalformat, textype, nullptr); GLuint fbo = 0; - supported = (strategy->createFBO(fbo, texture) == GL_FRAMEBUFFER_COMPLETE); - strategy->deleteFBO(fbo, 0, 0); + supported = (createFBO(fbo, texture) == GL_FRAMEBUFFER_COMPLETE); + glDeleteFramebuffers(1, &fbo); gl.deleteTexture(texture); @@ -1269,17 +935,23 @@ bool Canvas::getConstant(Format in, const char *&out) StringMap::Entry Canvas::formatEntries[] = { - {"normal", Canvas::FORMAT_NORMAL}, - {"hdr", Canvas::FORMAT_HDR}, - {"rgba8", Canvas::FORMAT_RGBA8}, - {"rgba4", Canvas::FORMAT_RGBA4}, - {"rgb5a1", Canvas::FORMAT_RGB5A1}, - {"rgb565", Canvas::FORMAT_RGB565}, - {"rgb10a2", Canvas::FORMAT_RGB10A2}, - {"rg11b10f", Canvas::FORMAT_RG11B10F}, - {"rgba16f", Canvas::FORMAT_RGBA16F}, - {"rgba32f", Canvas::FORMAT_RGBA32F}, - {"srgb", Canvas::FORMAT_SRGB}, + {"normal", FORMAT_NORMAL}, + {"hdr", FORMAT_HDR}, + {"rgba4", FORMAT_RGBA4}, + {"rgb5a1", FORMAT_RGB5A1}, + {"rgb565", FORMAT_RGB565}, + {"r8", FORMAT_R8}, + {"rg8", FORMAT_RG8}, + {"rgba8", FORMAT_RGBA8}, + {"rgb10a2", FORMAT_RGB10A2}, + {"rg11b10f", FORMAT_RG11B10F}, + {"r16f", FORMAT_R16F}, + {"rg16f", FORMAT_RG16F}, + {"rgba16f", FORMAT_RGBA16F}, + {"r32f", FORMAT_R32F}, + {"rg32f", FORMAT_RG32F}, + {"rgba32f", FORMAT_RGBA32F}, + {"srgb", FORMAT_SRGB}, }; StringMap Canvas::formats(Canvas::formatEntries, sizeof(Canvas::formatEntries)); diff --git a/jni/love/src/modules/graphics/opengl/Canvas.h b/jni/love/src/modules/graphics/opengl/Canvas.h index 46ad5a9d..8d63d15f 100644 --- a/jni/love/src/modules/graphics/opengl/Canvas.h +++ b/jni/love/src/modules/graphics/opengl/Canvas.h @@ -21,13 +21,15 @@ #ifndef LOVE_GRAPHICS_OPENGL_CANVAS_H #define LOVE_GRAPHICS_OPENGL_CANVAS_H +#include "common/config.h" #include "graphics/Color.h" #include "image/Image.h" #include "image/ImageData.h" #include "common/Matrix.h" #include "common/StringMap.h" #include "common/int.h" -#include "Texture.h" +#include "graphics/Texture.h" +#include "graphics/Volatile.h" #include "OpenGL.h" namespace love @@ -37,7 +39,7 @@ namespace graphics namespace opengl { -class Canvas : public Texture +class Canvas : public Texture, public Volatile { public: @@ -46,15 +48,21 @@ public: { FORMAT_NORMAL, // Usually RGBA8 or a similar fallback. Always supported. FORMAT_HDR, // Usually RGBA16F. Not always supported. - FORMAT_RGBA8, // RGBA with 8 bits per component. - FORMAT_RGBA4, // RGBA with 4 bits per component. - FORMAT_RGB5A1, // RGB with 5 bits per component, and A with 1 bit. + FORMAT_RGBA4, // RGBA with 4 bits per channel. + FORMAT_RGB5A1, // RGB with 5 bits per channel, and A with 1 bit. FORMAT_RGB565, // RGB with 5, 6, and 5 bits each, respectively. + FORMAT_R8, // Single (red) 8-bit channel. + FORMAT_RG8, // Two-channel (red and green) with 8 bits per channel. + FORMAT_RGBA8, // RGBA with 8 bits per channel. FORMAT_RGB10A2, // RGB with 10 bits each, and A with 2 bits. FORMAT_RG11B10F, // Floating point [0, +inf]. RG with 11 FP bits each, and B with 10 FP bits. - FORMAT_RGBA16F, // Floating point [-inf, +inf]. RGBA with 16 FP bits per component. - FORMAT_RGBA32F, // Floating point [-inf, +inf]. RGBA with 32 FP bits per component. - FORMAT_SRGB, // sRGB with 8 bits per component, plus 8 bit linear A. + FORMAT_R16F, // Floating point [-inf, +inf]. R with 16 FP bits. + FORMAT_RG16F, // Floating point [-inf, +inf]. RG with 16 FP bits per channel. + FORMAT_RGBA16F, // Floating point [-inf, +inf]. RGBA with 16 FP bits per channel. + FORMAT_R32F, // Floating point [-inf, +inf]. R with 32 FP bits. + FORMAT_RG32F, // Floating point [-inf, +inf]. RG with 32 FP bits per channel. + FORMAT_RGBA32F, // Floating point [-inf, +inf]. RGBA with 32 FP bits per channel. + FORMAT_SRGB, // sRGB with 8 bits per channel, plus 8 bit linear A. FORMAT_MAX_ENUM }; @@ -72,8 +80,7 @@ public: virtual void drawq(Quad *quad, float x, float y, float angle, float sx, float sy, float ox, float oy, float kx, float ky); virtual void setFilter(const Texture::Filter &f); virtual bool setWrap(const Texture::Wrap &w); - virtual GLuint getGLTexture() const; - virtual void predraw(); + virtual const void *getHandle() const; /** * @param canvases A list of other canvases to temporarily attach to this one, @@ -83,16 +90,12 @@ public: void startGrab(); void stopGrab(bool switchingToOtherCanvas = false); - void clear(Color c); - /** * Create and attach a stencil buffer to this Canvas' framebuffer, if necessary. **/ bool checkCreateStencil(); - love::image::ImageData *getImageData(love::image::Image *image); - - void getPixel(unsigned char* pixel_rgba, int x, int y); + love::image::ImageData *newImageData(love::image::Image *image, int x, int y, int w, int h); inline const std::vector &getAttachedCanvases() const { @@ -111,13 +114,12 @@ public: inline int getMSAA() const { - return msaa_samples; + return actual_samples; } - bool resolveMSAA(); - static bool isSupported(); static bool isMultiCanvasSupported(); + static bool isMultiFormatMultiCanvasSupported(); static bool isFormatSupported(Format format); static Canvas *current; @@ -128,7 +130,6 @@ public: // Whether the main screen should have linear -> sRGB conversions enabled. static bool screenHasSRGB; - static int switchCount; static int canvasCount; static bool getConstant(const char *in, Format &out); @@ -136,7 +137,12 @@ public: private: + void setupGrab(); + bool createMSAAFBO(GLenum internalformat); + bool resolveMSAA(bool restoreprev); + + void drawv(const Matrix4 &t, const Vertex *v); static Format getSizedFormat(Format format); static void convertFormat(Format format, GLenum &internalformat, GLenum &externalformat, GLenum &type); @@ -155,14 +161,11 @@ private: std::vector attachedCanvases; - int msaa_samples; - bool msaa_dirty; + int requested_samples; + int actual_samples; size_t texture_memory; - void setupGrab(); - void drawv(const Matrix &t, const Vertex *v); - static bool supportedFormats[FORMAT_MAX_ENUM]; static bool checkedFormats[FORMAT_MAX_ENUM]; diff --git a/jni/love/src/modules/graphics/opengl/Font.cpp b/jni/love/src/modules/graphics/opengl/Font.cpp index 145b187b..2589ddd8 100644 --- a/jni/love/src/modules/graphics/opengl/Font.cpp +++ b/jni/love/src/modules/graphics/opengl/Font.cpp @@ -29,6 +29,7 @@ #include #include #include // for max +#include namespace love { @@ -39,175 +40,194 @@ namespace opengl int Font::fontCount = 0; -const int Font::TEXTURE_WIDTHS[] = {128, 256, 256, 512, 512, 1024, 1024}; -const int Font::TEXTURE_HEIGHTS[] = {128, 128, 256, 256, 512, 512, 1024}; - Font::Font(love::font::Rasterizer *r, const Texture::Filter &filter) - : rasterizer(r) - , indexBuffer(nullptr) + : rasterizers({r}) , height(r->getHeight()) , lineHeight(1) - , mSpacing(1) + , textureWidth(128) + , textureHeight(128) , filter(filter) , useSpacesAsTab(false) + , quadIndices(20) // We make this bigger at draw-time, if needed. + , textureCacheID(0) , textureMemorySize(0) { this->filter.mipmap = Texture::FILTER_NONE; // Try to find the best texture size match for the font size. default to the // largest texture size if no rough match is found. - textureSizeIndex = NUM_TEXTURE_SIZES - 1; - for (int i = 0; i < NUM_TEXTURE_SIZES; i++) + while (true) { - // Make a rough estimate of the total used texture size, based on glyph - // height. The estimated size is likely larger than the actual total - // size, which is good because texture switching is expensive. - if ((height * 0.8) * height * 95 <= TEXTURE_WIDTHS[i] * TEXTURE_HEIGHTS[i]) - { - textureSizeIndex = i; + if ((height * 0.8) * height * 30 <= textureWidth * textureHeight) break; - } + + TextureSize nextsize = getNextTextureSize(); + + if (nextsize.width <= textureWidth && nextsize.height <= textureHeight) + break; + + textureWidth = nextsize.width; + textureHeight = nextsize.height; } - textureWidth = TEXTURE_WIDTHS[textureSizeIndex]; - textureHeight = TEXTURE_HEIGHTS[textureSizeIndex]; + love::font::GlyphData *gd = r->getGlyphData(32); // Space character. + type = (gd->getFormat() == font::GlyphData::FORMAT_LUMINANCE_ALPHA) ? FONT_TRUETYPE : FONT_IMAGE; + gd->release(); - indexBuffer = new VertexIndex(20); + if (!r->hasGlyph(9)) // No tab character in the Rasterizer. + useSpacesAsTab = true; - love::font::GlyphData *gd = nullptr; - - try - { - gd = r->getGlyphData(32); // Space character. - type = (gd->getFormat() == love::font::GlyphData::FORMAT_LUMINANCE_ALPHA) ? FONT_TRUETYPE : FONT_IMAGE; - - if (!r->hasGlyph(9)) // No tab character in the Rasterizer. - useSpacesAsTab = true; - - loadVolatile(); - } - catch (love::Exception &) - { - delete gd; - throw; - } - - delete gd; + loadVolatile(); ++fontCount; } Font::~Font() { - delete indexBuffer; unloadVolatile(); --fontCount; } -bool Font::initializeTexture(GLenum format) +Font::TextureSize Font::getNextTextureSize() const { - GLint internalformat = (format == GL_LUMINANCE_ALPHA) ? GL_LUMINANCE_ALPHA : GL_RGBA; + TextureSize size = {textureWidth, textureHeight}; - // clear errors before initializing - while (glGetError() != GL_NO_ERROR); + int maxsize = std::min(4096, gl.getMaxTextureSize()); - glTexImage2D(GL_TEXTURE_2D, - 0, - internalformat, - (GLsizei)textureWidth, - (GLsizei)textureHeight, - 0, - format, - GL_UNSIGNED_BYTE, - NULL); + if (size.width * 2 <= maxsize || size.height * 2 <= maxsize) + { + // {128, 128} -> {256, 128} -> {256, 256} -> {512, 256} -> etc. + if (size.width == size.height) + size.width *= 2; + else + size.height *= 2; + } - return glGetError() == GL_NO_ERROR; + return size; } void Font::createTexture() { - textureX = textureY = rowHeight = TEXTURE_PADDING; + OpenGL::TempDebugGroup debuggroup("Font create texture"); - GLuint t; - glGenTextures(1, &t); - textures.push_back(t); + GLenum format = type == FONT_TRUETYPE ? GL_LUMINANCE_ALPHA : GL_RGBA; + size_t bpp = format == GL_LUMINANCE_ALPHA ? 2 : 4; + + size_t prevmemsize = textureMemorySize; + if (prevmemsize > 0) + { + textureMemorySize -= (textureWidth * textureHeight * bpp); + gl.updateTextureMemorySize(prevmemsize, textureMemorySize); + } + + GLuint t = 0; + TextureSize size = {textureWidth, textureHeight}; + TextureSize nextsize = getNextTextureSize(); + bool recreatetexture = false; + + // If we have an existing texture already, we'll try replacing it with a + // larger-sized one rather than creating a second one. Having a single + // texture reduces texture switches and draw calls when rendering. + if ((nextsize.width > size.width || nextsize.height > size.height) + && !textures.empty()) + { + recreatetexture = true; + size = nextsize; + t = textures.back(); + } + else + glGenTextures(1, &t); gl.bindTexture(t); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + gl.setTextureFilter(filter); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - GLenum format = (type == FONT_TRUETYPE ? GL_LUMINANCE_ALPHA : GL_RGBA); + GLenum internalformat = type == FONT_TRUETYPE ? GL_LUMINANCE8_ALPHA8 : GL_RGBA8; - // Initialize the texture, attempting smaller sizes if initialization fails. - bool initialized = false; - while (textureSizeIndex >= 0) + // In GLES2, the internalformat and format params of TexImage have to match. + // There is still no GL_LUMINANCE8_ALPHA8 in GLES3, so we have to use + // GL_LUMINANCE_ALPHA even on ES3. + if (GLAD_ES_VERSION_2_0) + internalformat = format; + + // Initialize the texture with transparent black. + std::vector emptydata(size.width * size.height * bpp, 0); + + // Clear errors before initializing. + while (glGetError() != GL_NO_ERROR); + + glTexImage2D(GL_TEXTURE_2D, 0, internalformat, size.width, size.height, 0, + format, GL_UNSIGNED_BYTE, &emptydata[0]); + + if (glGetError() != GL_NO_ERROR) { - textureWidth = TEXTURE_WIDTHS[textureSizeIndex]; - textureHeight = TEXTURE_HEIGHTS[textureSizeIndex]; - - initialized = initializeTexture(format); - - if (initialized || textureSizeIndex <= 0) - break; - - --textureSizeIndex; - } - - if (!initialized) - { - // Clean up before throwing. - gl.deleteTexture(t); - gl.bindTexture(gl.getDefaultTexture()); - textures.pop_back(); - + if (!recreatetexture) + gl.deleteTexture(t); throw love::Exception("Could not create font texture!"); } - // Fill the texture with transparent black. - std::vector emptyData(textureWidth * textureHeight * (type == FONT_TRUETYPE ? 2 : 4), 0); - glTexSubImage2D(GL_TEXTURE_2D, - 0, - 0, 0, - (GLsizei)textureWidth, - (GLsizei)textureHeight, - format, - GL_UNSIGNED_BYTE, - &emptyData[0]); + textureWidth = size.width; + textureHeight = size.height; - setFilter(filter); + rowHeight = textureX = textureY = TEXTURE_PADDING; - size_t prevmemsize = textureMemorySize; - - textureMemorySize += emptyData.size(); + prevmemsize = textureMemorySize; + textureMemorySize += emptydata.size(); gl.updateTextureMemorySize(prevmemsize, textureMemorySize); + + // Re-add the old glyphs if we re-created the existing texture object. + if (recreatetexture) + { + textureCacheID++; + + std::vector glyphstoadd; + + for (const auto &glyphpair : glyphs) + glyphstoadd.push_back(glyphpair.first); + + glyphs.clear(); + + for (uint32 g : glyphstoadd) + addGlyph(g); + } + else + textures.push_back(t); } -Font::Glyph *Font::addGlyph(uint32 glyph) +love::font::GlyphData *Font::getRasterizerGlyphData(uint32 glyph) { - love::font::GlyphData *gd = nullptr; - // Use spaces for the tab 'glyph'. if (glyph == 9 && useSpacesAsTab) { - love::font::GlyphData *spacegd = rasterizer->getGlyphData(32); + love::font::GlyphData *spacegd = rasterizers[0]->getGlyphData(32); + love::font::GlyphData::Format fmt = spacegd->getFormat(); love::font::GlyphMetrics gm = {}; gm.advance = spacegd->getAdvance() * SPACES_PER_TAB; gm.bearingX = spacegd->getBearingX(); gm.bearingY = spacegd->getBearingY(); - love::font::GlyphData::Format f = spacegd->getFormat(); spacegd->release(); - gd = new love::font::GlyphData(glyph, gm, f); + return new love::font::GlyphData(glyph, gm, fmt); } - else - gd = rasterizer->getGlyphData(glyph); + + for (const StrongRef &r : rasterizers) + { + if (r->hasGlyph(glyph)) + return r->getGlyphData(glyph); + } + + return rasterizers[0]->getGlyphData(glyph); +} + +const Font::Glyph &Font::addGlyph(uint32 glyph) +{ + love::font::GlyphData *gd = getRasterizerGlyphData(glyph); int w = gd->getWidth(); int h = gd->getHeight(); @@ -233,89 +253,116 @@ Font::Glyph *Font::addGlyph(uint32 glyph) } } - Glyph *g = new Glyph; + Glyph g; - g->texture = 0; - g->spacing = gd->getAdvance(); + g.texture = 0; + g.spacing = gd->getAdvance(); - memset(g->vertices, 0, sizeof(GlyphVertex) * 4); + memset(g.vertices, 0, sizeof(GlyphVertex) * 4); - // don't waste space for empty glyphs. also fixes a division by zero bug with ati drivers + // don't waste space for empty glyphs. also fixes a divide by zero bug with ATI drivers if (w > 0 && h > 0) { const GLuint t = textures.back(); gl.bindTexture(t); - glTexSubImage2D(GL_TEXTURE_2D, - 0, - textureX, - textureY, - w, h, - (type == FONT_TRUETYPE ? GL_LUMINANCE_ALPHA : GL_RGBA), - GL_UNSIGNED_BYTE, - gd->getData()); + glTexSubImage2D(GL_TEXTURE_2D, 0, textureX, textureY, w, h, + (type == FONT_TRUETYPE ? GL_LUMINANCE_ALPHA : GL_RGBA), + GL_UNSIGNED_BYTE, gd->getData()); - g->texture = t; + g.texture = t; + float tX = (float) textureX, tY = (float) textureY; + float tWidth = (float) textureWidth, tHeight = (float) textureHeight; + + // 0----2 + // | / | + // | / | + // 1----3 const GlyphVertex verts[4] = { - { 0.0f, 0.0f, float(textureX)/float(textureWidth), float(textureY)/float(textureHeight)}, - { 0.0f, float(h), float(textureX)/float(textureWidth), float(textureY+h)/float(textureHeight)}, - {float(w), float(h), float(textureX+w)/float(textureWidth), float(textureY+h)/float(textureHeight)}, - {float(w), 0.0f, float(textureX+w)/float(textureWidth), float(textureY)/float(textureHeight)}, + { 0.0f, 0.0f, tX/tWidth, tY/tHeight}, + { 0.0f, float(h), tX/tWidth, (tY+h)/tHeight}, + {float(w), 0.0f, (tX+w)/tWidth, tY/tHeight}, + {float(w), float(h), (tX+w)/tWidth, (tY+h)/tHeight} }; - // copy vertex data to the glyph and set proper bearing + // Copy vertex data to the glyph and set proper bearing. for (int i = 0; i < 4; i++) { - g->vertices[i] = verts[i]; - g->vertices[i].x += gd->getBearingX(); - g->vertices[i].y -= gd->getBearingY(); + g.vertices[i] = verts[i]; + g.vertices[i].x += gd->getBearingX(); + g.vertices[i].y -= gd->getBearingY(); } } if (w > 0) textureX += (w + TEXTURE_PADDING); + if (h > 0) rowHeight = std::max(rowHeight, h + TEXTURE_PADDING); - delete gd; + gd->release(); - glyphs[glyph] = g; + const auto p = glyphs.insert(std::make_pair(glyph, g)); - return g; + return p.first->second; } -Font::Glyph *Font::findGlyph(uint32 glyph) +const Font::Glyph &Font::findGlyph(uint32 glyph) { - auto it = glyphs.find(glyph); + const auto it = glyphs.find(glyph); if (it != glyphs.end()) return it->second; - else - return addGlyph(glyph); + + return addGlyph(glyph); +} + +float Font::getKerning(uint32 leftglyph, uint32 rightglyph) +{ + uint64 packedglyphs = ((uint64) leftglyph << 32) | (uint64) rightglyph; + + const auto it = kerning.find(packedglyphs); + if (it != kerning.end()) + return it->second; + + float k = rasterizers[0]->getKerning(leftglyph, rightglyph); + + for (const auto &r : rasterizers) + { + if (r->hasGlyph(leftglyph) && r->hasGlyph(rightglyph)) + { + k = r->getKerning(leftglyph, rightglyph); + break; + } + } + + kerning[packedglyphs] = k; + return k; } float Font::getHeight() const { - return static_cast(height); + return (float) height; } -void Font::print(const std::string &text, float x, float y, float extra_spacing, float angle, float sx, float sy, float ox, float oy, float kx, float ky) +std::vector Font::generateVertices(const std::string &text, std::vector &vertices, float extra_spacing, Vector offset, TextInfo *info) { // Spacing counter and newline handling. - float dx = 0.0f; - float dy = 0.0f; + float dx = offset.x; + float dy = offset.y; float lineheight = getBaseline(); + int maxwidth = 0; // Keeps track of when we need to switch textures in our vertex array. - std::vector glyphinfolist; + std::vector drawcommands; // Pre-allocate space for the maximum possible number of vertices. - std::vector glyphverts; - glyphverts.reserve(text.length() * 4); + size_t vertstartsize = vertices.size(); + vertices.reserve(vertstartsize + text.length() * 4); - int vertexcount = 0; + uint32 prevglyph = 0; try { @@ -328,45 +375,67 @@ void Font::print(const std::string &text, float x, float y, float extra_spacing, if (g == '\n') { + if (dx > maxwidth) + maxwidth = (int) dx; + // Wrap newline, but do not print it. dy += floorf(getHeight() * getLineHeight() + 0.5f); - dx = 0.0f; + dx = offset.x; continue; } - Glyph *glyph = findGlyph(g); + uint32 cacheid = textureCacheID; - if (glyph->texture != 0) + const Glyph &glyph = findGlyph(g); + + // If findGlyph invalidates the texture cache, re-start the loop. + if (cacheid != textureCacheID) + { + i = utf8::iterator(text.begin(), text.begin(), text.end()); + maxwidth = 0; + dx = offset.x; + dy = offset.y; + drawcommands.clear(); + vertices.resize(vertstartsize); + prevglyph = 0; + continue; + } + + // Add kerning to the current horizontal offset. + dx += getKerning(prevglyph, g); + + if (glyph.texture != 0) { // Copy the vertices and set their proper relative positions. for (int j = 0; j < 4; j++) { - glyphverts.push_back(glyph->vertices[j]); - glyphverts.back().x += dx; - glyphverts.back().y += dy + lineheight; + vertices.push_back(glyph.vertices[j]); + vertices.back().x += dx /*+ kerning*/; + vertices.back().y += dy /*+ kerning.y*/ + lineheight; } // Check if glyph texture has changed since the last iteration. - if (glyphinfolist.size() == 0 || glyphinfolist.back().texture != glyph->texture) + if (drawcommands.empty() || drawcommands.back().texture != glyph.texture) { - // keep track of each sub-section of the string whose glyphs use different textures than the previous section - GlyphArrayDrawInfo gdrawinfo; - gdrawinfo.startvertex = vertexcount; - gdrawinfo.vertexcount = 0; - gdrawinfo.texture = glyph->texture; - glyphinfolist.push_back(gdrawinfo); + // Add a new draw command if the texture has changed. + DrawCommand cmd; + cmd.startvertex = (int) vertices.size() - 4; + cmd.vertexcount = 0; + cmd.texture = glyph.texture; + drawcommands.push_back(cmd); } - vertexcount += 4; - glyphinfolist.back().vertexcount += 4; + drawcommands.back().vertexcount += 4; } // Advance the x position for the next glyph. - dx += glyph->spacing; + dx += glyph.spacing; // Account for extra spacing given to space characters. if (g == ' ' && extra_spacing != 0.0f) dx = floorf(dx + extra_spacing); + + prevglyph = g; } } catch (utf8::exception &e) @@ -374,71 +443,186 @@ void Font::print(const std::string &text, float x, float y, float extra_spacing, throw love::Exception("UTF-8 decoding error: %s", e.what()); } - if (vertexcount <= 0 || glyphinfolist.size() == 0) - return; + // Sort draw commands by texture first, and quad position in memory second + // (using the struct's < operator). + std::sort(drawcommands.begin(), drawcommands.end()); - // Sort glyph draw info list by texture first, and quad position in memory - // second (using the struct's < operator). - std::sort(glyphinfolist.begin(), glyphinfolist.end()); + if (dx > maxwidth) + maxwidth = (int) dx; - int maxvertices = 0; - for (auto it = glyphinfolist.begin(); it != glyphinfolist.end(); ++it) - maxvertices = std::max(maxvertices, it->vertexcount); - - // If the index buffer is too small for the number of glyphs we're going to - // draw, we need to make a new one that has the correct size. - if ((size_t) maxvertices / 4 > indexBuffer->getSize()) + if (info != nullptr) { - VertexIndex *newIndexBuffer = new VertexIndex(maxvertices / 4); - delete indexBuffer; - indexBuffer = newIndexBuffer; + info->width = maxwidth - offset.x;; + info->height = (int) dy + (dx > 0.0f ? floorf(getHeight() * getLineHeight() + 0.5f) : 0) - offset.y; } - Matrix t; - t.setTransformation(ceilf(x), ceilf(y), angle, sx, sy, ox, oy, kx, ky); + return drawcommands; +} + +std::vector Font::generateVerticesFormatted(const std::string &text, float wrap, AlignMode align, std::vector &vertices, TextInfo *info) +{ + if (wrap < 0.0f) + wrap = std::numeric_limits::max(); + + uint32 cacheid = textureCacheID; + + std::vector drawcommands; + vertices.reserve(text.length() * 4); + + // wrappedlines indicates which lines were automatically wrapped. It + // has the same number of elements as lines_to_draw. + std::vector wrappedlines; + std::vector widths; + std::vector lines; + + // We only need the list of wrapped lines in 'justify' mode. + getWrap(text, wrap, lines, &widths, align == ALIGN_JUSTIFY ? &wrappedlines : nullptr); + + float extraspacing = 0.0f; + int numspaces = 0; + int i = 0; + float y = 0.0f; + float maxwidth = 0; + + for (const std::string &line : lines) + { + extraspacing = 0.0f; + float width = (float) widths[i]; + love::Vector offset(0.0f, floorf(y)); + + if (width > maxwidth) + maxwidth = width; + + switch (align) + { + case ALIGN_RIGHT: + offset.x = floorf(wrap - width); + break; + case ALIGN_CENTER: + offset.x = floorf((wrap - width) / 2.0f); + break; + case ALIGN_JUSTIFY: + numspaces = (int) std::count(line.begin(), line.end(), ' '); + if (wrappedlines[i] && numspaces >= 1) + extraspacing = (wrap - width) / float(numspaces); + else + extraspacing = 0.0f; + break; + case ALIGN_LEFT: + default: + break; + } + + std::vector commands = generateVertices(line, vertices, extraspacing, offset); + + if (!commands.empty()) + { + auto firstcmd = commands.begin(); + + // If the first draw command in the new list has the same texture + // as the last one in the existing list we're building and its + // vertices are in-order, we can combine them (saving a draw call.) + if (!drawcommands.empty()) + { + auto prevcmd = drawcommands.back(); + if (prevcmd.texture == firstcmd->texture && (prevcmd.startvertex + prevcmd.vertexcount) == firstcmd->startvertex) + { + drawcommands.back().vertexcount += firstcmd->vertexcount; + ++firstcmd; + } + } + + // Append the new draw commands to the list we're building. + drawcommands.insert(drawcommands.end(), firstcmd, commands.end()); + } + + y += getHeight() * getLineHeight(); + i++; + } + + if (info != nullptr) + { + info->width = (int) maxwidth; + info->height = (int) y; + } + + if (cacheid != textureCacheID) + { + vertices.clear(); + drawcommands = generateVerticesFormatted(text, wrap, align, vertices); + } + + return drawcommands; +} + +void Font::drawVertices(const std::vector &drawcommands) +{ + // Vertex attribute pointers need to be set before calling this function. + // This assumes that the attribute pointers are constant for all vertices. + + int totalverts = 0; + for (const DrawCommand &cmd : drawcommands) + totalverts = std::max(cmd.startvertex + cmd.vertexcount, totalverts); + + if ((size_t) totalverts / 4 > quadIndices.getSize()) + quadIndices = QuadIndices((size_t) totalverts / 4); + + gl.prepareDraw(); + + const GLenum gltype = quadIndices.getType(); + const size_t elemsize = quadIndices.getElementSize(); + + GLBuffer::Bind bind(*quadIndices.getBuffer()); + + // We need a separate draw call for every section of the text which uses a + // different texture than the previous section. + for (const DrawCommand &cmd : drawcommands) + { + GLsizei count = (cmd.vertexcount / 4) * 6; + size_t offset = (cmd.startvertex / 4) * 6 * elemsize; + + // TODO: Use glDrawElementsBaseVertex when supported? + gl.bindTexture(cmd.texture); + gl.drawElements(GL_TRIANGLES, count, gltype, quadIndices.getPointer(offset)); + } +} + +void Font::printv(const Matrix4 &t, const std::vector &drawcommands, const std::vector &vertices) +{ + if (vertices.empty() || drawcommands.empty()) + return; + + OpenGL::TempDebugGroup debuggroup("Font print"); OpenGL::TempTransform transform(gl); transform.get() *= t; - gl.enableVertexAttribArray(OpenGL::ATTRIB_POS); - gl.enableVertexAttribArray(OpenGL::ATTRIB_TEXCOORD); + gl.useVertexAttribArrays(ATTRIBFLAG_POS | ATTRIBFLAG_TEXCOORD); - gl.prepareDraw(); + glVertexAttribPointer(ATTRIB_POS, 2, GL_FLOAT, GL_FALSE, sizeof(GlyphVertex), &vertices[0].x); + glVertexAttribPointer(ATTRIB_TEXCOORD, 2, GL_FLOAT, GL_FALSE, sizeof(GlyphVertex), &vertices[0].s); - VertexBuffer::Bind index_bind(*indexBuffer->getVertexBuffer()); - GLenum elemtype = indexBuffer->getType(); - const GLvoid *elemoffset = indexBuffer->getPointer(0); + drawVertices(drawcommands); +} - // Optimization: we can take these calls out of the loop if we have support. - if (GLAD_VERSION_3_2 || GLAD_ARB_draw_elements_base_vertex) - { - gl.setVertexAttribArray(OpenGL::ATTRIB_POS, 2, GL_FLOAT, sizeof(GlyphVertex), &glyphverts[0].x); - gl.setVertexAttribArray(OpenGL::ATTRIB_TEXCOORD, 2, GL_FLOAT, sizeof(GlyphVertex), &glyphverts[0].s); - } +void Font::print(const std::string &text, float x, float y, float angle, float sx, float sy, float ox, float oy, float kx, float ky) +{ + std::vector vertices; + std::vector drawcommands = generateVertices(text, vertices); - // We need to draw a new vertex array for every section of the string which - // uses a different texture than the previous section. - for (auto it = glyphinfolist.begin(); it != glyphinfolist.end(); ++it) - { - gl.bindTexture(it->texture); + Matrix4 t(ceilf(x), ceilf(y), angle, sx, sy, ox, oy, kx, ky); - if (GLAD_VERSION_3_2 || GLAD_ARB_draw_elements_base_vertex) - { - // Optimization: setting a base vertex is faster than redoing the - // setVertexAttribArray calls before each draw. - gl.drawElementsBaseVertex(GL_TRIANGLES, (it->vertexcount / 4) * 6, elemtype, elemoffset, it->startvertex); - } - else - { - gl.setVertexAttribArray(OpenGL::ATTRIB_POS, 2, GL_FLOAT, sizeof(GlyphVertex), &glyphverts[it->startvertex].x); - gl.setVertexAttribArray(OpenGL::ATTRIB_TEXCOORD, 2, GL_FLOAT, sizeof(GlyphVertex), &glyphverts[it->startvertex].s); + printv(t, drawcommands, vertices); +} - gl.drawElements(GL_TRIANGLES, (it->vertexcount / 4) * 6, elemtype, elemoffset); - } - } +void Font::printf(const std::string &text, float x, float y, float wrap, AlignMode align, float angle, float sx, float sy, float ox, float oy, float kx, float ky) +{ + std::vector vertices; + std::vector drawcommands = generateVerticesFormatted(text, wrap, align, vertices); - gl.disableVertexAttribArray(OpenGL::ATTRIB_POS); - gl.disableVertexAttribArray(OpenGL::ATTRIB_TEXCOORD); + Matrix4 t(ceilf(x), ceilf(y), angle, sx, sy, ox, oy, kx, ky); + + printv(t, drawcommands, vertices); } int Font::getWidth(const std::string &str) @@ -447,7 +631,6 @@ int Font::getWidth(const std::string &str) std::istringstream iss(str); std::string line; - Glyph *g; int max_width = 0; while (getline(iss, line, '\n')) @@ -455,13 +638,17 @@ int Font::getWidth(const std::string &str) int width = 0; try { + uint32 prevglyph = 0; + utf8::iterator i(line.begin(), line.begin(), line.end()); utf8::iterator end(line.end(), line.begin(), line.end()); while (i != end) { uint32 c = *i++; - g = findGlyph(c); - width += static_cast(g->spacing * mSpacing); + const Glyph &g = findGlyph(c); + width += g.spacing + getKerning(prevglyph, c); + + prevglyph = c; } } catch(utf8::exception &e) @@ -478,16 +665,14 @@ int Font::getWidth(const std::string &str) int Font::getWidth(char character) { - Glyph *g = findGlyph(character); - return g->spacing; + const Glyph &g = findGlyph(character); + return g.spacing; } -std::vector Font::getWrap(const std::string &text, float wrap, int *max_width, std::vector *wrappedlines) +void Font::getWrap(const std::string &text, float wrap, std::vector &lines, std::vector *linewidths, std::vector *wrappedlines) { using namespace std; - const float width_space = static_cast(getWidth(' ')); - vector lines_to_draw; - int maxw = 0; + const float width_space = (float) getWidth(' '); //split text at newlines istringstream iss(text); @@ -518,12 +703,13 @@ std::vector Font::getWrap(const std::string &text, float wrap, int // remove trailing space string tmp = string_builder.str(); - lines_to_draw.push_back(tmp.substr(0,tmp.size()-1)); + lines.push_back(tmp.substr(0,tmp.size()-1)); string_builder.str(""); width = static_cast(getWidth(word)); realw -= (int) width; - if (realw > maxw) - maxw = realw; + + if (linewidths) + linewidths->push_back(realw); // Indicate that this line was automatically wrapped. if (wrappedlines) @@ -534,25 +720,21 @@ std::vector Font::getWrap(const std::string &text, float wrap, int oldwidth = width; } // push last line - if (width > maxw) - maxw = (int) width; + if (linewidths) + linewidths->push_back(width); + string tmp = string_builder.str(); - lines_to_draw.push_back(tmp.substr(0,tmp.size()-1)); + lines.push_back(tmp.substr(0,tmp.size()-1)); // Indicate that this line was not automatically wrapped. if (wrappedlines) wrappedlines->push_back(false); } - - if (max_width) - *max_width = maxw; - - return lines_to_draw; } void Font::setLineHeight(float height) { - this->lineHeight = height; + lineHeight = height; } float Font::getLineHeight() const @@ -560,23 +742,16 @@ float Font::getLineHeight() const return lineHeight; } -void Font::setSpacing(float amount) -{ - mSpacing = amount; -} - -float Font::getSpacing() const -{ - return mSpacing; -} - void Font::setFilter(const Texture::Filter &f) { + if (!Texture::validateFilter(f, false)) + throw love::Exception("Invalid texture filter."); + filter = f; - for (auto it = textures.begin(); it != textures.end(); ++it) + for (GLuint texture : textures) { - gl.bindTexture(*it); + gl.bindTexture(texture); gl.setTextureFilter(filter); } } @@ -589,26 +764,19 @@ const Texture::Filter &Font::getFilter() bool Font::loadVolatile() { createTexture(); + textureCacheID++; return true; } void Font::unloadVolatile() { // nuke everything from orbit - std::map::iterator it = glyphs.begin(); - Glyph *g; - while (it != glyphs.end()) - { - g = it->second; - delete g; - glyphs.erase(it++); - } - std::vector::iterator iter = textures.begin(); - while (iter != textures.end()) - { - gl.deleteTexture(*iter); - iter++; - } + + glyphs.clear(); + + for (GLuint texture : textures) + gl.deleteTexture(texture); + textures.clear(); gl.updateTextureMemorySize(textureMemorySize, 0); @@ -617,12 +785,12 @@ void Font::unloadVolatile() int Font::getAscent() const { - return rasterizer->getAscent(); + return rasterizers[0]->getAscent(); } int Font::getDescent() const { - return rasterizer->getDescent(); + return rasterizers[0]->getDescent(); } float Font::getBaseline() const @@ -633,14 +801,81 @@ float Font::getBaseline() const bool Font::hasGlyph(uint32 glyph) const { - return rasterizer->hasGlyph(glyph); + for (const StrongRef &r : rasterizers) + { + if (r->hasGlyph(glyph)) + return true; + } + + return false; } bool Font::hasGlyphs(const std::string &text) const { - return rasterizer->hasGlyphs(text); + if (text.size() == 0) + return false; + + try + { + utf8::iterator i(text.begin(), text.begin(), text.end()); + utf8::iterator end(text.end(), text.begin(), text.end()); + + while (i != end) + { + uint32 codepoint = *i++; + + if (!hasGlyph(codepoint)) + return false; + } + } + catch (utf8::exception &e) + { + throw love::Exception("UTF-8 decoding error: %s", e.what()); + } + + return true; } +void Font::setFallbacks(const std::vector &fallbacks) +{ + for (const Font *f : fallbacks) + { + if (f->type != this->type) + throw love::Exception("Font fallbacks must be of the same font type."); + } + + rasterizers.resize(1); + + // NOTE: this won't invalidate already-rasterized glyphs. + for (const Font *f : fallbacks) + rasterizers.push_back(f->rasterizers[0]); +} + +uint32 Font::getTextureCacheID() const +{ + return textureCacheID; +} + +bool Font::getConstant(const char *in, AlignMode &out) +{ + return alignModes.find(in, out); +} + +bool Font::getConstant(AlignMode in, const char *&out) +{ + return alignModes.find(in, out); +} + +StringMap::Entry Font::alignModeEntries[] = +{ + { "left", Font::ALIGN_LEFT }, + { "right", Font::ALIGN_RIGHT }, + { "center", Font::ALIGN_CENTER }, + { "justify", Font::ALIGN_JUSTIFY }, +}; + +StringMap Font::alignModes(Font::alignModeEntries, sizeof(Font::alignModeEntries)); + } // opengl } // graphics } // love diff --git a/jni/love/src/modules/graphics/opengl/Font.h b/jni/love/src/modules/graphics/opengl/Font.h index 34aab9a2..cf1dbca2 100644 --- a/jni/love/src/modules/graphics/opengl/Font.h +++ b/jni/love/src/modules/graphics/opengl/Font.h @@ -22,16 +22,20 @@ #define LOVE_GRAPHICS_OPENGL_FONT_H // STD -#include +#include #include #include // LOVE +#include "common/config.h" #include "common/Object.h" +#include "common/Matrix.h" +#include "common/Vector.h" + #include "font/Rasterizer.h" #include "graphics/Texture.h" #include "graphics/Volatile.h" -#include "VertexBuffer.h" +#include "GLBuffer.h" #include "OpenGL.h" @@ -46,17 +50,60 @@ class Font : public Object, public Volatile { public: + enum AlignMode + { + ALIGN_LEFT, + ALIGN_CENTER, + ALIGN_RIGHT, + ALIGN_JUSTIFY, + ALIGN_MAX_ENUM + }; + + struct GlyphVertex + { + float x, y; + float s, t; + }; + + struct TextInfo + { + int width; + int height; + }; + + // Used to determine when to change textures in the generated vertex array. + struct DrawCommand + { + GLuint texture; + int startvertex; + int vertexcount; + + // used when sorting with std::sort. + bool operator < (const DrawCommand &other) const + { + // Texture binds are expensive, so we should sort by that first. + if (texture != other.texture) + return texture < other.texture; + else + return startvertex < other.startvertex; + } + }; + Font(love::font::Rasterizer *r, const Texture::Filter &filter = Texture::getDefaultFilter()); virtual ~Font(); + std::vector generateVertices(const std::string &text, std::vector &vertices, float extra_spacing = 0.0f, Vector offset = Vector(), TextInfo *info = nullptr); + std::vector generateVerticesFormatted(const std::string &text, float wrap, AlignMode align, std::vector &vertices, TextInfo *info = nullptr); + + void drawVertices(const std::vector &drawcommands); + /** * Prints the text at the designated position with rotation and scaling. * * @param text A string. * @param x The x-coordinate. * @param y The y-coordinate. - * @param extra_spacing Additional spacing added to spaces (" "). * @param angle The amount of rotation. * @param sx Scale along the x axis. * @param sy Scale along the y axis. @@ -65,7 +112,9 @@ public: * @param kx Shear along the x axis. * @param ky Shear along the y axis. **/ - void print(const std::string &text, float x, float y, float extra_spacing = 0.0f, float angle = 0.0f, float sx = 1.0f, float sy = 1.0f, float ox = 0.0f, float oy = 0.0f, float kx = 0.0f, float ky = 0.0f); + void print(const std::string &text, float x, float y, float angle = 0.0f, float sx = 1.0f, float sy = 1.0f, float ox = 0.0f, float oy = 0.0f, float kx = 0.0f, float ky = 0.0f); + + void printf(const std::string &text, float x, float y, float wrap, AlignMode align, float angle = 0.0f, float sx = 1.0f, float sy = 1.0f, float ox = 0.0f, float oy = 0.0f, float kx = 0.0f, float ky = 0.0f); /** * Returns the height of the font. @@ -97,7 +146,7 @@ public: * auto-wrapped. Indices correspond to indices of the returned value. * Returns a vector with the lines. **/ - std::vector getWrap(const std::string &text, float wrap, int *max_width = 0, std::vector *wrapped_lines = 0); + void getWrap(const std::string &text, float wrap, std::vector &lines, std::vector *line_widths = 0, std::vector *wrapped_lines = 0); /** * Sets the line height (which should be a number to multiply the font size by, @@ -111,19 +160,6 @@ public: **/ float getLineHeight() const; - /** - * Sets the spacing modifier (changes the spacing between the characters the - * same way that the line height does [multiplication]). - * Note: The spacing must be set BEFORE the font is loaded to have any effect. - * @param amount The amount of modification. - **/ - void setSpacing(float amount); - - /** - * Returns the spacing modifier. - **/ - float getSpacing() const; - void setFilter(const Texture::Filter &f); const Texture::Filter &getFilter(); @@ -139,6 +175,13 @@ public: bool hasGlyph(uint32 glyph) const; bool hasGlyphs(const std::string &text) const; + void setFallbacks(const std::vector &fallbacks); + + uint32 getTextureCacheID() const; + + static bool getConstant(const char *in, AlignMode &out); + static bool getConstant(AlignMode in, const char *&out); + static int fontCount; private: @@ -150,12 +193,6 @@ private: FONT_UNKNOWN }; - struct GlyphVertex - { - float x, y; - float s, t; - }; - struct Glyph { GLuint texture; @@ -163,38 +200,25 @@ private: GlyphVertex vertices[4]; }; - // used to determine when to change textures in the vertex array generated when printing text - struct GlyphArrayDrawInfo + struct TextureSize { - GLuint texture; - int startvertex; - int vertexcount; - - // used when sorting with std::sort - // sorts by texture first (binding textures is expensive) and relative position in memory second - bool operator < (const GlyphArrayDrawInfo &other) const - { - if (texture != other.texture) - return texture < other.texture; - else - return startvertex < other.startvertex; - } + int width; + int height; }; - bool initializeTexture(GLenum format); + TextureSize getNextTextureSize() const; void createTexture(); - Glyph *addGlyph(uint32 glyph); - Glyph *findGlyph(uint32 glyph); + love::font::GlyphData *getRasterizerGlyphData(uint32 glyph); + const Glyph &addGlyph(uint32 glyph); + const Glyph &findGlyph(uint32 glyph); + float getKerning(uint32 leftglyph, uint32 rightglyph); + void printv(const Matrix4 &t, const std::vector &drawcommands, const std::vector &vertices); - StrongRef rasterizer; - - VertexIndex *indexBuffer; + std::vector> rasterizers; int height; float lineHeight; - float mSpacing; // modifies the spacing by multiplying it with this value - int textureSizeIndex; int textureWidth; int textureHeight; @@ -202,7 +226,10 @@ private: std::vector textures; // maps glyphs to glyph texture information - std::map glyphs; + std::unordered_map glyphs; + + // map of left/right glyph pairs to horizontal kerning. + std::unordered_map kerning; FontType type; Texture::Filter filter; @@ -212,17 +239,22 @@ private: bool useSpacesAsTab; - size_t textureMemorySize; + // Index buffer used for drawing quads with GL_TRIANGLES. + QuadIndices quadIndices; - static const int NUM_TEXTURE_SIZES = 7; - static const int TEXTURE_WIDTHS[NUM_TEXTURE_SIZES]; - static const int TEXTURE_HEIGHTS[NUM_TEXTURE_SIZES]; + // ID which is incremented when the texture cache is invalidated. + uint32 textureCacheID; + + size_t textureMemorySize; static const int TEXTURE_PADDING = 1; // This will be used if the Rasterizer doesn't have a tab character itself. static const int SPACES_PER_TAB = 4; + static StringMap::Entry alignModeEntries[]; + static StringMap alignModes; + }; // Font } // opengl diff --git a/jni/love/src/modules/graphics/opengl/GLBuffer.cpp b/jni/love/src/modules/graphics/opengl/GLBuffer.cpp new file mode 100644 index 00000000..b13ff89f --- /dev/null +++ b/jni/love/src/modules/graphics/opengl/GLBuffer.cpp @@ -0,0 +1,343 @@ +/** + * Copyright (c) 2006-2015 LOVE Development Team + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. + **/ + +#include "GLBuffer.h" + +#include "common/Exception.h" + +#include +#include +#include +#include + +namespace love +{ +namespace graphics +{ +namespace opengl +{ + +GLBuffer::GLBuffer(size_t size, const void *data, GLenum target, GLenum usage) + : is_bound(false) + , is_mapped(false) + , size(size) + , target(target) + , usage(usage) + , vbo(0) + , memory_map(nullptr) +{ + try + { + memory_map = new char[size]; + } + catch (std::bad_alloc &) + { + throw love::Exception("Out of memory."); + } + + if (data != nullptr) + memcpy(memory_map, data, size); + + bool ok = load(data != nullptr); + + if (!ok) + { + delete[] memory_map; + throw love::Exception("Could not load VBO."); + } +} + +GLBuffer::~GLBuffer() +{ + if (vbo != 0) + unload(); + + delete[] memory_map; +} + +void *GLBuffer::map() +{ + if (is_mapped) + return memory_map; + + is_mapped = true; + + return memory_map; +} + +void GLBuffer::unmapStatic(size_t offset, size_t size) +{ + // Upload the mapped data to the buffer. + glBufferSubData(getTarget(), (GLintptr) offset, (GLsizeiptr) size, memory_map + offset); +} + +void GLBuffer::unmapStream() +{ + // "orphan" current buffer to avoid implicit synchronisation on the GPU: + // http://www.seas.upenn.edu/~pcozzi/OpenGLInsights/OpenGLInsights-AsynchronousBufferTransfers.pdf + glBufferData(getTarget(), (GLsizeiptr) getSize(), nullptr, getUsage()); + glBufferData(getTarget(), (GLsizeiptr) getSize(), memory_map, getUsage()); +} + +void GLBuffer::unmap(size_t usedOffset, size_t usedSize) +{ + if (!is_mapped) + return; + + usedOffset = std::min(usedOffset, getSize()); + usedSize = std::min(usedSize, getSize() - usedOffset); + + // VBO::bind is a no-op when the VBO is mapped, so we have to make sure it's + // bound here. + if (!is_bound) + { + glBindBuffer(getTarget(), vbo); + is_bound = true; + } + + switch (getUsage()) + { + case GL_STATIC_DRAW: + unmapStatic(usedOffset, usedSize); + break; + case GL_STREAM_DRAW: + unmapStream(); + break; + case GL_DYNAMIC_DRAW: + default: + // It's probably more efficient to treat it like a streaming buffer if + // more than a third of its contents have been modified during the map(). + if (usedSize >= getSize() / 3) + unmapStream(); + else + unmapStatic(usedOffset, usedSize); + break; + } + + is_mapped = false; +} + +void GLBuffer::bind() +{ + if (!is_mapped) + { + glBindBuffer(getTarget(), vbo); + is_bound = true; + } +} + +void GLBuffer::unbind() +{ + if (is_bound) + glBindBuffer(getTarget(), 0); + + is_bound = false; +} + +void GLBuffer::fill(size_t offset, size_t size, const void *data) +{ + memcpy(memory_map + offset, data, size); + + if (!is_mapped) + glBufferSubData(getTarget(), (GLintptr) offset, (GLsizeiptr) size, data); +} + +const void *GLBuffer::getPointer(size_t offset) const +{ + return BUFFER_OFFSET(offset); +} + +bool GLBuffer::loadVolatile() +{ + return load(true); +} + +void GLBuffer::unloadVolatile() +{ + unload(); +} + +bool GLBuffer::load(bool restore) +{ + glGenBuffers(1, &vbo); + + GLBuffer::Bind bind(*this); + + // Copy the old buffer only if 'restore' was requested. + const GLvoid *src = restore ? memory_map : nullptr; + + // Note that if 'src' is '0', no data will be copied. + glBufferData(getTarget(), (GLsizeiptr) getSize(), src, getUsage()); + + return true; +} + +void GLBuffer::unload() +{ + is_mapped = false; + + glDeleteBuffers(1, &vbo); + vbo = 0; +} + + +// QuadIndices + +size_t QuadIndices::maxSize = 0; +size_t QuadIndices::elementSize = 0; +size_t QuadIndices::objectCount = 0; +GLBuffer *QuadIndices::indexBuffer = nullptr; + +QuadIndices::QuadIndices(size_t size) + : size(size) +{ + // The upper limit is the maximum of GLuint divided by six (the number + // of indices per size) and divided by the size of GLuint. This guarantees + // no overflows when calculating the array size in bytes. + if (size == 0 || size > ((GLuint) -1) / 6 / sizeof(GLuint)) + throw love::Exception("Invalid number of quads."); + + // Create a new / larger buffer if needed. + if (indexBuffer == nullptr || size > maxSize) + { + GLBuffer *newbuffer = nullptr; + + // Depending on the size, a switch to int and more memory is needed. + GLenum targettype = getType(size); + size_t elemsize = (targettype == GL_UNSIGNED_SHORT) ? sizeof(GLushort) : sizeof(GLuint); + + size_t buffersize = elemsize * 6 * size; + + // Create may throw out-of-memory exceptions. + // QuadIndices will propagate the exception and keep the old GLBuffer. + try + { + newbuffer = new GLBuffer(buffersize, nullptr, GL_ELEMENT_ARRAY_BUFFER, GL_STATIC_DRAW); + } + catch (std::bad_alloc &) + { + throw love::Exception("Out of memory."); + } + + // Allocation of the new GLBuffer succeeded. + // The old GLBuffer can now be deleted. + delete indexBuffer; + indexBuffer = newbuffer; + maxSize = size; + elementSize = elemsize; + + switch (targettype) + { + case GL_UNSIGNED_SHORT: + fill(); + break; + case GL_UNSIGNED_INT: + fill(); + break; + } + } + + objectCount++; +} + +QuadIndices::QuadIndices(const QuadIndices &other) + : size(other.size) +{ + objectCount++; +} + +QuadIndices &QuadIndices::operator = (const QuadIndices &other) +{ + size = other.size; + return *this; +} + +QuadIndices::~QuadIndices() +{ + --objectCount; + + // Delete the buffer if we were the last living QuadIndices object. + if (objectCount <= 0) + { + delete indexBuffer; + indexBuffer = nullptr; + } +} + +size_t QuadIndices::getSize() const +{ + return size; +} + +size_t QuadIndices::getIndexCount(size_t elements) const +{ + return elements * 6; +} + +GLenum QuadIndices::getType(size_t s) const +{ + // Calculates if unsigned short is big enough to hold all the vertex indices. + static const GLenum types[] = {GL_UNSIGNED_SHORT, GL_UNSIGNED_INT}; + return types[s * 4 > std::numeric_limits::max()]; + // if buffer-size > max(GLushort) then GL_UNSIGNED_INT else GL_UNSIGNED_SHORT +} + +size_t QuadIndices::getElementSize() +{ + return elementSize; +} + +GLBuffer *QuadIndices::getBuffer() const +{ + return indexBuffer; +} + +const void *QuadIndices::getPointer(size_t offset) const +{ + return indexBuffer->getPointer(offset); +} + +template +void QuadIndices::fill() +{ + GLBuffer::Bind bind(*indexBuffer); + GLBuffer::Mapper mapper(*indexBuffer); + + T *indices = (T *) mapper.get(); + + // 0----2 + // | / | + // | / | + // 1----3 + for (size_t i = 0; i < maxSize; ++i) + { + indices[i*6+0] = T(i * 4 + 0); + indices[i*6+1] = T(i * 4 + 1); + indices[i*6+2] = T(i * 4 + 2); + + indices[i*6+3] = T(i * 4 + 2); + indices[i*6+4] = T(i * 4 + 1); + indices[i*6+5] = T(i * 4 + 3); + } +} + +} // opengl +} // graphics +} // love diff --git a/jni/love/src/modules/graphics/opengl/GLBuffer.h b/jni/love/src/modules/graphics/opengl/GLBuffer.h new file mode 100644 index 00000000..44a95e2d --- /dev/null +++ b/jni/love/src/modules/graphics/opengl/GLBuffer.h @@ -0,0 +1,398 @@ +/** + * Copyright (c) 2006-2015 LOVE Development Team + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. + **/ + + +#ifndef LOVE_GRAPHICS_OPENGL_GL_BUFFER_H +#define LOVE_GRAPHICS_OPENGL_GL_BUFFER_H + +// LOVE +#include "common/config.h" +#include "graphics/Volatile.h" + +// OpenGL +#include "OpenGL.h" + +// C +#include + +namespace love +{ +namespace graphics +{ +namespace opengl +{ + +/** + * GLBuffer is a thin abstraction over OpenGL's Buffer Objects. + * The class is meant for internal use. + */ +class GLBuffer : public Volatile +{ +public: + + /** + * Constructor. + * + * @param size The size of the GLBuffer in bytes. + * @param target The target GLBuffer object, e.g. GL_ARRAY_BUFFER. + * @param usage Usage hint, e.g. GL_DYNAMIC_DRAW. + */ + GLBuffer(size_t size, const void *data, GLenum target, GLenum usage); + + /** + * Destructor. + */ + virtual ~GLBuffer(); + + /** + * Get the size of the GLBuffer, in bytes. + * + * @return The size of the GLBuffer. + */ + size_t getSize() const + { + return size; + } + + /** + * Get the target buffer object. + * + * @return The target buffer object, e.g. GL_ARRAY_BUFFER. + */ + GLenum getTarget() const + { + return target; + } + + /** + * Get the usage hint for this GLBuffer. + * + * @return The usage hint, e.g. GL_DYNAMIC_DRAW. + */ + GLenum getUsage() const + { + return usage; + } + + bool isBound() const + { + return is_bound; + } + + bool isMapped() const + { + return is_mapped; + } + + /** + * Map the GLBuffer to client memory. + * + * This can be faster for large changes to the buffer. For smaller + * changes, see fill(). + * + * The GLBuffer must be bound to use this function. + * + * @return A pointer to memory which represents the buffer. + */ + void *map(); + + /** + * Unmap a previously mapped GLBuffer. The buffer must be unmapped + * when used to draw elements. + * + * The GLBuffer must be bound to use this function. + * + * @param usedOffset The offset into the mapped buffer indicating the + * sub-range of data modified. Optional. + * @param usedSize The size of the sub-range of modified data. Optional. + */ + void unmap(size_t usedOffset = 0, size_t usedSize = -1); + + /** + * Bind the GLBuffer to its specified target. + * (GL_ARRAY_BUFFER, GL_ELEMENT_ARRAY_BUFFER, etc). + */ + void bind(); + + /** + * Unbind a prevously bound GLBuffer. + */ + void unbind(); + + /** + * Fill a portion of the buffer with data. + * + * The GLBuffer must be bound to use this function. + * + * @param offset The offset in the GLBuffer to store the data. + * @param size The size of the incoming data. + * @param data Pointer to memory to copy data from. + */ + void fill(size_t offset, size_t size, const void *data); + + /** + * Get a pointer which represents the specified byte offset. + * + * @param offset The byte offset. (0 is first byte). + * @return A pointer which represents the offset. + */ + const void *getPointer(size_t offset) const; + + // Implements Volatile. + bool loadVolatile() override; + void unloadVolatile() override; + + /** + * This helper class can bind a GLBuffer temporarily, and + * automatically un-bind when it's destroyed. + */ + class Bind + { + public: + + /** + * Bind a GLBuffer. + */ + Bind(GLBuffer &buf) + : buf(buf) + { + buf.bind(); + } + + /** + * Unbinds a GLBuffer. + */ + ~Bind() + { + buf.unbind(); + } + + private: + + // GLBuffer to work on. + GLBuffer &buf; + + }; // Bind + + class Mapper + { + public: + + /** + * Memory-maps a GLBuffer. + */ + Mapper(GLBuffer &buffer) + : buf(buffer) + { + elems = buf.map(); + } + + /** + * unmaps the buffer + */ + ~Mapper() + { + buf.unmap(); + } + + /** + * Get pointer to memory mapped region + */ + void *get() + { + return elems; + } + + private: + + GLBuffer &buf; + void *elems; + + }; // Mapper + +private: + + /** + * Creates the VBO, and optionally restores data we saved earlier. + * + * @param restore True to restore data previously saved with 'unload'. + * @return True on success, false otherwise. + */ + bool load(bool restore); + void unload(); + + void unmapStatic(size_t offset, size_t size); + void unmapStream(); + + // Whether the buffer is currently bound. + bool is_bound; + + // Whether the buffer is currently mapped to main memory. + bool is_mapped; + + // The size of the buffer, in bytes. + size_t size; + + // The target buffer object. (GL_ARRAY_BUFFER, GL_ELEMENT_ARRAY_BUFFER). + GLenum target; + + // Usage hint. GL_[DYNAMIC, STATIC, STREAM]_DRAW. + GLenum usage; + + // The VBO identifier. Assigned by OpenGL. + GLuint vbo; + + // A pointer to mapped memory. + char *memory_map; + +}; // GLBuffer + + +/** + * QuadIndices manages one shared GLBuffer that stores the indices for an + * element array. Vertex arrays using the vertex structure (or anything else + * that can use the pattern below) can request a size and use it for the + * drawElements call. + * + * indices[i*6 + 0] = i*4 + 0; + * indices[i*6 + 1] = i*4 + 1; + * indices[i*6 + 2] = i*4 + 2; + * + * indices[i*6 + 3] = i*4 + 2; + * indices[i*6 + 4] = i*4 + 1; + * indices[i*6 + 5] = i*4 + 3; + * + * There will always be a large enough GLBuffer around until all + * QuadIndices instances have been deleted. + * + * Q: Why have something like QuadIndices? + * A: The indices for the SpriteBatch do not change, only the array size + * varies. Using one GLBuffer for all element arrays removes this + * duplicated data and saves some memory. + */ +class QuadIndices +{ +public: + /** + * Adds an entry to the list of sizes and resizes the GLBuffer + * if needed. A size of 1 allocates a group of 6 indices for 4 vertices + * creating 1 face. + * + * @param size The requested size in groups of 6 indices. + */ + QuadIndices(size_t size); + + QuadIndices(const QuadIndices &other); + QuadIndices &operator = (const QuadIndices &other); + + /** + * Removes an entry from the list of sizes and resizes the GLBuffer + * if needed. + */ + ~QuadIndices(); + + /** + * Returns the number of index groups. + * This can be used for getIndexCount to get the full count of indices. + * + * @return The number of index groups. + */ + size_t getSize() const; + + /** + * Returns the number of indices that the passed element count will have. + * Use QuadIndices::getSize to get the full index count for that + * QuadIndices instance. + * + * @param elements The number of elements to calculate the index count for. + * @return The index count. + */ + size_t getIndexCount(size_t elements) const; + + /** + * Returns the integer type of the element array. + * If an optional nonzero size argument is passed, the function returns + * the integer type of the element array of that size. + * + * @param s The size of the array to calculated the integer type of. + * @return The element array integer type. + */ + GLenum getType(size_t s) const; + inline GLenum getType() const + { + return getType(maxSize); + } + + /** + * Returns the size in bytes of an element in the element array. + * Can be used with getPointer to calculate an offset into the array based + * on a number of elements. + * + * @return The size of an element in bytes. + **/ + size_t getElementSize(); + + /** + * Returns the pointer to the GLBuffer. + * The pointer will change if a new size request or removal causes + * a GLBuffer resize. It is recommended to retrieve the pointer + * value directly before the drawing call. + * + * @return The pointer to the GLBuffer. + */ + GLBuffer *getBuffer() const; + + /** + * Returns a pointer which represents the specified byte offset. + * + * @param offset The offset in bytes. + * @return A pointer which represents the offset. + */ + const void *getPointer(size_t offset) const; + +private: + + /** + * Adds all indices to the array with the type T. + * There are no checks for the correct types or overflows. The calling + * function should check for that. + */ + template void fill(); + + // The size of the array requested by this instance. + size_t size; + + // The size in bytes of an element in the element array. + static size_t elementSize; + + // The current GLBuffer size. 0 means no GLBuffer. + static size_t maxSize; + + static size_t objectCount; + + // The GLBuffer for the element array. Can be null. + static GLBuffer *indexBuffer; +}; + +} // opengl +} // graphics +} // love + +#endif // LOVE_GRAPHICS_OPENGL_GL_BUFFER_H diff --git a/jni/love/src/modules/graphics/opengl/Graphics.cpp b/jni/love/src/modules/graphics/opengl/Graphics.cpp index a92185df..46d4d06b 100644 --- a/jni/love/src/modules/graphics/opengl/Graphics.cpp +++ b/jni/love/src/modules/graphics/opengl/Graphics.cpp @@ -38,6 +38,10 @@ #include #include +#ifdef LOVE_IOS +#include +#endif + namespace love { namespace graphics @@ -46,11 +50,12 @@ namespace opengl { Graphics::Graphics() - : width(0) + : quadIndices(nullptr) + , width(0) , height(0) , created(false) , active(true) - , activeStencil(false) + , writingToStencil(false) { gl = OpenGL(); @@ -80,6 +85,9 @@ Graphics::~Graphics() Shader::defaultShader = nullptr; } + if (quadIndices) + delete quadIndices; + currentWindow->release(); } @@ -93,20 +101,21 @@ void Graphics::restoreState(const DisplayState &s) setColor(s.color); setBackgroundColor(s.backgroundColor); - setBlendMode(s.blendMode); + setBlendMode(s.blendMode, s.blendMultiplyAlpha); setLineWidth(s.lineWidth); setLineStyle(s.lineStyle); setLineJoin(s.lineJoin); setPointSize(s.pointSize); - setPointStyle(s.pointStyle); if (s.scissor) setScissor(s.scissorBox.x, s.scissorBox.y, s.scissorBox.w, s.scissorBox.h); else setScissor(); + setStencilTest(s.stencilTest, s.stencilInvert); + setFont(s.font.get()); setShader(s.shader.get()); setCanvas(s.canvases); @@ -128,8 +137,8 @@ void Graphics::restoreStateChecked(const DisplayState &s) if (*(uint32 *) &s.backgroundColor.r != *(uint32 *) &cur.backgroundColor.r) setBackgroundColor(s.backgroundColor); - if (s.blendMode != cur.blendMode) - setBlendMode(s.blendMode); + if (s.blendMode != cur.blendMode || s.blendMultiplyAlpha != cur.blendMultiplyAlpha) + setBlendMode(s.blendMode, s.blendMultiplyAlpha); // These are just simple assignments. setLineWidth(s.lineWidth); @@ -139,9 +148,6 @@ void Graphics::restoreStateChecked(const DisplayState &s) if (s.pointSize != cur.pointSize) setPointSize(s.pointSize); - if (s.pointStyle != cur.pointStyle) - setPointStyle(s.pointStyle); - if (s.scissor != cur.scissor || (s.scissor && !(s.scissorBox == cur.scissorBox))) { if (s.scissor) @@ -150,18 +156,26 @@ void Graphics::restoreStateChecked(const DisplayState &s) setScissor(); } + if (s.stencilTest != cur.stencilTest || s.stencilInvert != cur.stencilInvert) + setStencilTest(s.stencilTest, s.stencilInvert); + setFont(s.font.get()); setShader(s.shader.get()); + bool canvaseschanged = s.canvases.size() != cur.canvases.size(); + for (size_t i = 0; i < s.canvases.size() && i < cur.canvases.size(); i++) { if (s.canvases[i].get() != cur.canvases[i].get()) { - setCanvas(s.canvases); + canvaseschanged = true; break; } } + if (canvaseschanged) + setCanvas(s.canvases); + if (s.colorMask != cur.colorMask) setColorMask(s.colorMask); @@ -185,7 +199,7 @@ void Graphics::checkSetDefaultFont() if (!fontmodule) throw love::Exception("Font module has not been loaded."); - StrongRef r(fontmodule->newRasterizer(12)); + StrongRef r(fontmodule->newTrueTypeRasterizer(12, font::TrueTypeRasterizer::HINTING_NORMAL)); r->release(); defaultFont.set(newFont(r.get())); @@ -209,14 +223,14 @@ void Graphics::setViewportSize(int width, int height) setCanvas(); // Set the viewport to top-left corner. - gl.setViewport(OpenGL::Viewport(0, 0, width, height)); + gl.setViewport({0, 0, width, height}); // If a canvas was bound before this function was called, it needs to be // made aware of the new system viewport size. Canvas::systemViewport = gl.getViewport(); // Set up the projection matrix - gl.matrices.projection.back() = Matrix::ortho(0.0, width, height, 0.0); + gl.matrices.projection.back() = Matrix4::ortho(0.0, (float) width, (float) height, 0.0); // Restore the previously active Canvas. setCanvas(canvases); @@ -228,40 +242,27 @@ bool Graphics::setMode(int width, int height, bool &sRGB) this->height = height; // Okay, setup OpenGL. - if (!gl.initContext()) - { - created = false; - return false; - } - - // Minimum required OpenGL version. - if (!(GLAD_ES_VERSION_2_0 || GLAD_VERSION_1_3)) - { - created = false; - return false; - } + gl.initContext(); + gl.setupContext(); created = true; setViewportSize(width, height); - // Make sure antialiasing works when set elsewhere - if (GLAD_VERSION_1_3) - glEnable(GL_MULTISAMPLE); - // Enable blending glEnable(GL_BLEND); - if (GLAD_VERSION_1_0) - glHint(GL_POINT_SMOOTH_HINT, GL_NICEST); - // Auto-generated mipmaps should be the best quality possible - if (GLAD_ES_VERSION_2_0 || GLAD_VERSION_1_4 || GLAD_SGIS_generate_mipmap) - glHint(GL_GENERATE_MIPMAP_HINT, GL_NICEST); + glHint(GL_GENERATE_MIPMAP_HINT, GL_NICEST); - // Enable textures (necessary on desktop GL) - if (GLAD_VERSION_1_1) + if (!GLAD_ES_VERSION_2_0) + { + // Make sure antialiasing works when set elsewhere + glEnable(GL_MULTISAMPLE); + + // Enable texturing glEnable(GL_TEXTURE_2D); + } gl.setTextureUnit(0); @@ -270,15 +271,10 @@ bool Graphics::setMode(int width, int height, bool &sRGB) // Set whether drawing converts input from linear -> sRGB colorspace. if (GLAD_VERSION_3_0 || GLAD_ARB_framebuffer_sRGB || GLAD_EXT_framebuffer_sRGB - || (GLAD_ES_VERSION_3_0 || GLAD_EXT_sRGB)) + || GLAD_ES_VERSION_3_0 || GLAD_EXT_sRGB) { - if (GLAD_VERSION_1_1 || GLAD_EXT_sRGB_write_control) - { - if (sRGB) - glEnable(GL_FRAMEBUFFER_SRGB); - else - glDisable(GL_FRAMEBUFFER_SRGB); - } + if (GLAD_VERSION_1_0 || GLAD_EXT_sRGB_write_control) + gl.setFramebufferSRGB(sRGB); } else sRGB = false; @@ -295,10 +291,15 @@ bool Graphics::setMode(int width, int height, bool &sRGB) enabledebug = (flags & GL_CONTEXT_FLAG_DEBUG_BIT) != 0; } - // FIXME: workaround for KHR_debug being supported but function pointers - // resolving to null on Ouya. - if (!GLAD_ES_VERSION_2_0) - setDebug(enabledebug); + setDebug(enabledebug); + + // Create a quad indices object owned by love.graphics, so at least one + // QuadIndices object is alive at all times while love.graphics is alive. + // This makes sure there aren't too many expensive destruction/creations of + // index buffer objects, since the shared index buffer used by QuadIndices + // objects is destroyed when the last object is destroyed. + if (quadIndices == nullptr) + quadIndices = new QuadIndices(20); // Reload all volatile objects. if (!Volatile::loadAll()) @@ -307,20 +308,22 @@ bool Graphics::setMode(int width, int height, bool &sRGB) // Restore the graphics state. restoreState(states.back()); - pixel_size_stack.clear(); - pixel_size_stack.reserve(5); - pixel_size_stack.push_back(1); + pixelSizeStack.clear(); + pixelSizeStack.reserve(5); + pixelSizeStack.push_back(1); - // We always need a default shader in OpenGL ES 2. - if (GLAD_ES_VERSION_2_0) + // We always need a default shader. + if (!Shader::defaultShader) { - if (!Shader::defaultShader) - Shader::defaultShader = newShader(Shader::defaultCode[RENDERER_OPENGLES]); - - if (!getShader()) - setShader(Shader::defaultShader); + Renderer renderer = GLAD_ES_VERSION_2_0 ? RENDERER_OPENGLES : RENDERER_OPENGL; + Shader::defaultShader = newShader(Shader::defaultCode[renderer]); } + // A shader should always be active, but the default shader shouldn't be + // returned by getShader(), so we don't do setShader(defaultShader). + if (!Shader::current) + Shader::defaultShader->attach(); + return true; } @@ -338,14 +341,14 @@ void Graphics::unSetMode() created = false; } -void Graphics::setActive(bool active) +void Graphics::setActive(bool enable) { // Make sure all pending OpenGL commands have fully executed before // returning, if we're going from active to inactive. - if (isCreated() && this->active && !active) + if (isCreated() && this->active && !enable) glFinish(); - this->active = active; + active = enable; } bool Graphics::isActive() const @@ -373,17 +376,16 @@ void Graphics::setDebug(bool enable) if (!(GLAD_VERSION_4_3 || GLAD_KHR_debug || GLAD_ARB_debug_output)) return; + // TODO: We don't support GL_KHR_debug in GLES yet. + if (GLAD_ES_VERSION_2_0) + return; + // Ugly hack to reduce code duplication. if (GLAD_ARB_debug_output && !(GLAD_VERSION_4_3 || GLAD_KHR_debug)) { fp_glDebugMessageCallback = (pfn_glDebugMessageCallback) fp_glDebugMessageCallbackARB; fp_glDebugMessageControl = (pfn_glDebugMessageControl) fp_glDebugMessageControlARB; } - else if (GLAD_ES_VERSION_2_0 && GLAD_KHR_debug) - { - fp_glDebugMessageCallback = (pfn_glDebugMessageCallback) fp_glDebugMessageCallbackKHR; - fp_glDebugMessageControl = (pfn_glDebugMessageControl) fp_glDebugMessageControlKHR; - } if (!enable) { @@ -418,19 +420,100 @@ void Graphics::setDebug(bool enable) void Graphics::reset() { DisplayState s; - discardStencil(); - origin(); + drawToStencilBuffer(false); restoreState(s); + origin(); } -void Graphics::clear() +void Graphics::clear(Color c) { - GLbitfield buffers = GL_COLOR_BUFFER_BIT; + glClearColor(c.r / 255.0f, c.g / 255.0f, c.b / 255.0f, c.a / 255.0f); + glClear(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); +} - if (GLAD_EXT_discard_framebuffer) - buffers |= GL_STENCIL_BUFFER_BIT | GL_DEPTH_BUFFER_BIT; +void Graphics::clear(const std::vector &colors) +{ + if (colors.size() == 0) + return; - glClear(buffers); + if (states.back().canvases.size() == 0) + return clear(colors[0]); + + if (colors.size() != states.back().canvases.size()) + throw love::Exception("Number of clear colors must match the number of active canvases (%ld)", states.back().canvases.size()); + + std::vector bufs; + + for (int i = 0; i < (int) colors.size(); i++) + { + const GLfloat c[] = {colors[i].r/255.f, colors[i].g/255.f, colors[i].b/255.f, colors[i].a/255.f}; + + if (GLAD_ES_VERSION_3_0 || GLAD_VERSION_3_0) + glClearBufferfv(GL_COLOR, i, c); + else + { + bufs.push_back(GL_COLOR_ATTACHMENT0 + i); + glDrawBuffer(GL_COLOR_ATTACHMENT0 + i); + glClearColor(c[0], c[1], c[2], c[3]); + glClear(GL_COLOR_BUFFER_BIT); + } + } + + glClear(GL_STENCIL_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + // Revert to the expected draw buffers once we're done, if glClearBuffer + // wasn't supported. + if (!(GLAD_ES_VERSION_3_0 || GLAD_VERSION_3_0)) + { + if (bufs.size() > 1) + glDrawBuffers((int) bufs.size(), &bufs[0]); + else + glDrawBuffer(GL_COLOR_ATTACHMENT0); + } +} + +void Graphics::discard(const std::vector &colorbuffers, bool stencil) +{ + if (!(GLAD_VERSION_4_3 || GLAD_ARB_invalidate_subdata || GLAD_ES_VERSION_3_0 || GLAD_EXT_discard_framebuffer)) + return; + + std::vector attachments; + attachments.reserve(colorbuffers.size()); + + // glDiscardFramebuffer uses different attachment enums for the default FBO. + if (!Canvas::current && gl.getDefaultFBO() == 0) + { + if (colorbuffers.size() > 0 && colorbuffers[0]) + attachments.push_back(GL_COLOR); + + if (stencil) + { + attachments.push_back(GL_STENCIL); + attachments.push_back(GL_DEPTH); + } + } + else + { + int activecanvascount = (int) states.back().canvases.size(); + + for (int i = 0; i < (int) colorbuffers.size(); i++) + { + if (colorbuffers[i] && i < activecanvascount) + attachments.push_back(GL_COLOR_ATTACHMENT0 + i); + } + + if (stencil) + { + attachments.push_back(GL_STENCIL_ATTACHMENT); + attachments.push_back(GL_DEPTH_ATTACHMENT); + } + } + + // Hint for the driver that it doesn't need to save these buffers. + if (GLAD_VERSION_4_3 || GLAD_ARB_invalidate_subdata || GLAD_ES_VERSION_3_0) + glInvalidateFramebuffer(GL_FRAMEBUFFER, (GLint) attachments.size(), &attachments[0]); + else if (GLAD_EXT_discard_framebuffer) + glDiscardFramebufferEXT(GL_FRAMEBUFFER, (GLint) attachments.size(), &attachments[0]); } void Graphics::present() @@ -442,20 +525,16 @@ void Graphics::present() std::vector> canvases = states.back().canvases; setCanvas(); - if (GLAD_EXT_discard_framebuffer) - { - GLenum attachments[] = {GL_STENCIL_EXT, GL_DEPTH_EXT}; + // Discard the stencil buffer before swapping. + discard({}, true); - if (gl.getDefaultFBO() != 0) - { - // A non-zero FBO needs different attachment enums. - attachments[0] = GL_STENCIL_ATTACHMENT; - attachments[1] = GL_DEPTH_ATTACHMENT; - } - - // Hint for the driver that it doesn't need to save these buffers. - glDiscardFramebufferEXT(GL_FRAMEBUFFER, 2, attachments); - } +#ifdef LOVE_IOS + // Hack: SDL's color renderbuffer must be bound when swapBuffers is called. + SDL_SysWMinfo info = {}; + SDL_VERSION(&info.version); + SDL_GetWindowWMInfo(SDL_GL_GetCurrentWindow(), &info); + glBindRenderbuffer(GL_RENDERBUFFER, info.info.uikit.colorbuffer); +#endif currentWindow->swapBuffers(); @@ -464,7 +543,7 @@ void Graphics::present() // Reset the per-frame stat counts. gl.stats.drawCalls = 0; - Canvas::switchCount = 0; + gl.stats.framebufferBinds = 0; } int Graphics::getWidth() const @@ -484,12 +563,13 @@ bool Graphics::isCreated() const void Graphics::setScissor(int x, int y, int width, int height) { - OpenGL::Viewport box(x, y, width, height); + OpenGL::Viewport box = {x, y, width, height}; - states.back().scissor = true; glEnable(GL_SCISSOR_TEST); // OpenGL's reversed y-coordinate is compensated for in OpenGL::setScissor. gl.setScissor(box); + + states.back().scissor = true; states.back().scissorBox = box; } @@ -501,102 +581,93 @@ void Graphics::setScissor() bool Graphics::getScissor(int &x, int &y, int &width, int &height) const { - OpenGL::Viewport scissor = gl.getScissor(); + const DisplayState &state = states.back(); - x = scissor.x; - y = scissor.y; - width = scissor.w; - height = scissor.h; + x = state.scissorBox.x; + y = state.scissorBox.y; + width = state.scissorBox.w; + height = state.scissorBox.h; - return states.back().scissor; + return state.scissor; } -void Graphics::defineStencil() +void Graphics::drawToStencilBuffer(bool enable) { + if (writingToStencil == enable) + return; + + writingToStencil = enable; + + if (!enable) + { + const DisplayState &state = states.back(); + + // Revert the color write mask. + setColorMask(state.colorMask); + + // Use the user-set stencil test state when writes are disabled. + setStencilTest(state.stencilTest, state.stencilInvert); + return; + } + // Make sure the active canvas has a stencil buffer. if (Canvas::current) Canvas::current->checkCreateStencil(); - // Disable color writes but don't save the mask values. + // Disable color writes but don't save the state for it. glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); - glClear(GL_STENCIL_BUFFER_BIT); + // The stencil test must be enabled in order to write to the stencil buffer. glEnable(GL_STENCIL_TEST); + glStencilFunc(GL_ALWAYS, 1, 1); glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE); - - activeStencil = true; } -void Graphics::useStencil(bool invert) +void Graphics::setStencilTest(bool enable, bool invert) { - glStencilFunc(GL_EQUAL, (GLint)(!invert), 1); // invert ? 0 : 1 - glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); - setColorMask(states.back().colorMask); -} + DisplayState &state = states.back(); + state.stencilTest = enable; + state.stencilInvert = invert; -void Graphics::discardStencil() -{ - if (!activeStencil) + if (writingToStencil) return; - setColorMask(states.back().colorMask); - glDisable(GL_STENCIL_TEST); - activeStencil = false; + if (!enable) + { + glDisable(GL_STENCIL_TEST); + return; + } + + // Make sure the active canvas has a stencil buffer. + if (Canvas::current) + Canvas::current->checkCreateStencil(); + + glEnable(GL_STENCIL_TEST); + glStencilFunc(GL_EQUAL, invert ? 0 : 1, 1); + glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); } -Image *Graphics::newImage(love::image::ImageData *data, Image::Format format) +void Graphics::getStencilTest(bool &enable, bool &invert) { - // Create the image. - Image *image = new Image(data, format); - - if (!isCreated()) - return image; - - bool success = false; - try - { - success = image->load(); - } - catch(love::Exception &) - { - image->release(); - throw; - } - if (!success) - { - image->release(); - return 0; - } - - return image; + const DisplayState &state = states.back(); + enable = state.stencilTest; + invert = state.stencilInvert; } -Image *Graphics::newImage(love::image::CompressedData *cdata, Image::Format format) +void Graphics::clearStencil() { - // Create the image. - Image *image = new Image(cdata, format); + glClear(GL_STENCIL_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); +} - if (!isCreated()) - return image; +Image *Graphics::newImage(love::image::ImageData *data, const Image::Flags &flags) +{ + return new Image(data, flags); +} - bool success = false; - try - { - success = image->load(); - } - catch(love::Exception &) - { - image->release(); - throw; - } - if (!success) - { - image->release(); - return 0; - } - - return image; +Image *Graphics::newImage(love::image::CompressedImageData *cdata, const Image::Flags &flags) +{ + return new Image(cdata, flags); } Quad *Graphics::newQuad(Quad::Viewport v, float sw, float sh) @@ -609,7 +680,7 @@ Font *Graphics::newFont(love::font::Rasterizer *r, const Texture::Filter &filter return new Font(r, filter); } -SpriteBatch *Graphics::newSpriteBatch(Texture *texture, int size, int usage) +SpriteBatch *Graphics::newSpriteBatch(Texture *texture, int size, Mesh::Usage usage) { return new SpriteBatch(texture, size, usage); } @@ -648,21 +719,20 @@ Canvas *Graphics::newCanvas(int width, int height, Canvas::Format format, int ms error_string << "Cannot create canvas: "; switch (err) { - case GL_FRAMEBUFFER_UNSUPPORTED: error_string << "Not supported by your OpenGL implementation."; break; - + case GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT: + error_string << "Texture format cannot be rendered to on this system."; + break; // remaining error codes are highly unlikely: case GL_FRAMEBUFFER_UNDEFINED: - case GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT: case GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT: case GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER: case GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER: case GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE: - error_string << "Error in implementation. Possible fix: Make canvas width and height powers of two."; + error_string << "Error in implementation."; break; - default: // my intel hda card wrongly returns 0 to glCheckFramebufferStatus() but sets // no error flag. I think it meant to return GL_FRAMEBUFFER_UNSUPPORTED, but who @@ -686,19 +756,34 @@ Shader *Graphics::newShader(const Shader::ShaderSource &source) return new Shader(source); } -Mesh *Graphics::newMesh(const std::vector &vertices, Mesh::DrawMode mode) +Mesh *Graphics::newMesh(const std::vector &vertices, Mesh::DrawMode drawmode, Mesh::Usage usage) { - return new Mesh(vertices, mode); + return new Mesh(vertices, drawmode, usage); } -Mesh *Graphics::newMesh(int vertexcount, Mesh::DrawMode mode) +Mesh *Graphics::newMesh(int vertexcount, Mesh::DrawMode drawmode, Mesh::Usage usage) { - return new Mesh(vertexcount, mode); + return new Mesh(vertexcount, drawmode, usage); } -void Graphics::setColor(const Color &c) +Mesh *Graphics::newMesh(const std::vector &vertexformat, int vertexcount, Mesh::DrawMode drawmode, Mesh::Usage usage) { - gl.setColor(c); + return new Mesh(vertexformat, vertexcount, drawmode, usage); +} + +Mesh *Graphics::newMesh(const std::vector &vertexformat, const void *data, size_t datasize, Mesh::DrawMode drawmode, Mesh::Usage usage) +{ + return new Mesh(vertexformat, data, datasize, drawmode, usage); +} + +Text *Graphics::newText(Font *font, const std::string &text) +{ + return new Text(font, text); +} + +void Graphics::setColor(Color c) +{ + glVertexAttrib4f(ATTRIB_CONSTANTCOLOR, c.r/255.0f, c.g/255.0f, c.b/255.0f, c.a/255.0f); states.back().color = c; } @@ -707,9 +792,8 @@ Color Graphics::getColor() const return states.back().color; } -void Graphics::setBackgroundColor(const Color &c) +void Graphics::setBackgroundColor(Color c) { - gl.setClearColor(c); states.back().backgroundColor = c; } @@ -749,6 +833,7 @@ void Graphics::setShader() { DisplayState &state = states.back(); + // This will activate the default shader. Shader::detach(); state.shader.set(nullptr); @@ -830,6 +915,7 @@ std::vector Graphics::getCanvas() const void Graphics::setColorMask(ColorMask mask) { glColorMask(mask.r, mask.g, mask.b, mask.a); + states.back().colorMask = mask; } Graphics::ColorMask Graphics::getColorMask() const @@ -837,60 +923,56 @@ Graphics::ColorMask Graphics::getColorMask() const return states.back().colorMask; } -void Graphics::setBlendMode(Graphics::BlendMode mode) +void Graphics::setBlendMode(BlendMode mode, bool multiplyalpha) { - OpenGL::BlendState blend = {GL_ONE, GL_ONE, GL_ZERO, GL_ZERO, GL_FUNC_ADD}; + GLenum func = GL_FUNC_ADD; + GLenum srcRGB = GL_ONE; + GLenum srcA = GL_ONE; + GLenum dstRGB = GL_ZERO; + GLenum dstA = GL_ZERO; switch (mode) { case BLEND_ALPHA: - if (GLAD_ES_VERSION_2_0 || GLAD_VERSION_1_4 || GLAD_EXT_blend_func_separate) - { - blend.srcRGB = GL_SRC_ALPHA; - blend.srcA = GL_ONE; - blend.dstRGB = blend.dstA = GL_ONE_MINUS_SRC_ALPHA; - } - else - { - // Fallback for OpenGL implementations without support for separate blend functions. - // This will most likely only be used for the Microsoft software renderer and - // since it's still stuck with OpenGL 1.1, the only expected difference is a - // different alpha value when reading back the default framebuffer (newScreenshot). - blend.srcRGB = blend.srcA = GL_SRC_ALPHA; - blend.dstRGB = blend.dstA = GL_ONE_MINUS_SRC_ALPHA; - } + srcRGB = srcA = GL_ONE; + dstRGB = dstA = GL_ONE_MINUS_SRC_ALPHA; break; - case BLEND_MULTIPLICATIVE: - blend.srcRGB = blend.srcA = GL_DST_COLOR; - blend.dstRGB = blend.dstA = GL_ZERO; + case BLEND_MULTIPLY: + srcRGB = srcA = GL_DST_COLOR; + dstRGB = dstA = GL_ZERO; break; - case BLEND_PREMULTIPLIED: - blend.srcRGB = blend.srcA = GL_ONE; - blend.dstRGB = blend.dstA = GL_ONE_MINUS_SRC_ALPHA; - break; - case BLEND_SUBTRACTIVE: - blend.func = GL_FUNC_REVERSE_SUBTRACT; - case BLEND_ADDITIVE: - blend.srcRGB = blend.srcA = GL_SRC_ALPHA; - blend.dstRGB = blend.dstA = GL_ONE; + case BLEND_SUBTRACT: + func = GL_FUNC_REVERSE_SUBTRACT; + case BLEND_ADD: + srcRGB = GL_ONE; + srcA = GL_SRC_ALPHA; // FIXME: This isn't correct... + dstRGB = dstA = GL_ONE; break; case BLEND_SCREEN: - blend.srcRGB = blend.srcA = GL_ONE; - blend.dstRGB = blend.dstA = GL_ONE_MINUS_SRC_COLOR; + srcRGB = srcA = GL_ONE; + dstRGB = dstA = GL_ONE_MINUS_SRC_COLOR; break; case BLEND_REPLACE: default: - blend.srcRGB = blend.srcA = GL_ONE; - blend.dstRGB = blend.dstA = GL_ZERO; + srcRGB = srcA = GL_ONE; + dstRGB = dstA = GL_ZERO; break; } - gl.setBlendState(blend); + // We can only do alpha-multiplication when srcRGB would have been unmodified. + if (srcRGB == GL_ONE && multiplyalpha) + srcRGB = GL_SRC_ALPHA; + + glBlendEquation(func); + glBlendFuncSeparate(srcRGB, dstRGB, srcA, dstA); + states.back().blendMode = mode; + states.back().blendMultiplyAlpha = multiplyalpha; } -Graphics::BlendMode Graphics::getBlendMode() const +Graphics::BlendMode Graphics::getBlendMode(bool &multiplyalpha) const { + multiplyalpha = states.back().blendMultiplyAlpha; return states.back().blendMode; } @@ -956,35 +1038,18 @@ void Graphics::setPointSize(float size) states.back().pointSize = size; } -void Graphics::setPointStyle(Graphics::PointStyle style) -{ - if (GLAD_ES_VERSION_2_0) - return; - - if (style == POINT_SMOOTH) - glEnable(GL_POINT_SMOOTH); - else // love::POINT_ROUGH - glDisable(GL_POINT_SMOOTH); - - states.back().pointStyle = style; -} - float Graphics::getPointSize() const { return states.back().pointSize; } -Graphics::PointStyle Graphics::getPointStyle() const -{ - return states.back().pointStyle; -} - void Graphics::setWireframe(bool enable) { // Not supported in OpenGL ES. - if (!GLAD_ES_VERSION_2_0) - glPolygonMode(GL_FRONT_AND_BACK, enable ? GL_LINE : GL_FILL); + if (GLAD_ES_VERSION_2_0) + return; + glPolygonMode(GL_FRONT_AND_BACK, enable ? GL_LINE : GL_FILL); states.back().wireframe = enable; } @@ -1000,70 +1065,17 @@ void Graphics::print(const std::string &str, float x, float y , float angle, flo DisplayState &state = states.back(); if (state.font.get() != nullptr) - state.font->print(str, x, y, 0.0, angle, sx, sy, ox, oy, kx, ky); + state.font->print(str, x, y, angle, sx, sy, ox, oy, kx, ky); } -void Graphics::printf(const std::string &str, float x, float y, float wrap, AlignMode align, float angle, float sx, float sy, float ox, float oy, float kx, float ky) +void Graphics::printf(const std::string &str, float x, float y, float wrap, Font::AlignMode align, float angle, float sx, float sy, float ox, float oy, float kx, float ky) { checkSetDefaultFont(); DisplayState &state = states.back(); - if (state.font.get() == nullptr) - return; - - if (wrap < 0.0f) - throw love::Exception("Horizontal wrap limit cannot be negative."); - - using std::string; - using std::vector; - - // wrappedlines indicates which lines were automatically wrapped. It's - // guaranteed to have the same number of elements as lines_to_draw. - vector wrappedlines; - vector lines_to_draw = state.font->getWrap(str, wrap, 0, &wrappedlines); - - Matrix t; - t.setTransformation(ceilf(x), ceilf(y), angle, sx, sy, ox, oy, kx, ky); - - OpenGL::TempTransform transform(gl); - transform.get() *= t; - - x = y = 0.0f; - - // now for the actual printing - vector::const_iterator line_iter, line_end = lines_to_draw.end(); - float extra_spacing = 0.0f; - int num_spaces = 0; - int i = 0; - - for (line_iter = lines_to_draw.begin(); line_iter != line_end; ++line_iter) - { - float width = static_cast(state.font->getWidth(*line_iter)); - switch (align) - { - case ALIGN_RIGHT: - state.font->print(*line_iter, ceilf(x + (wrap - width)), ceilf(y), 0.0f); - break; - case ALIGN_CENTER: - state.font->print(*line_iter, ceilf(x + (wrap - width) / 2), ceilf(y), 0.0f); - break; - case ALIGN_JUSTIFY: - num_spaces = std::count(line_iter->begin(), line_iter->end(), ' '); - if (wrappedlines[i] && num_spaces >= 1) - extra_spacing = (wrap - width) / float(num_spaces); - else - extra_spacing = 0.0f; - state.font->print(*line_iter, ceilf(x), ceilf(y), extra_spacing); - break; - case ALIGN_LEFT: - default: - state.font->print(*line_iter, ceilf(x), ceilf(y), 0.0f); - break; - } - y += state.font->getHeight() * state.font->getLineHeight(); - i++; - } + if (state.font.get() != nullptr) + state.font->printf(str, x, y, wrap, align, angle, sx, sy, ox, oy, kx, ky); } /** @@ -1072,40 +1084,37 @@ void Graphics::printf(const std::string &str, float x, float y, float wrap, Alig void Graphics::point(float x, float y) { - gl.prepareDraw(); - - gl.bindTexture(gl.getDefaultTexture()); + OpenGL::TempDebugGroup debuggroup("Graphics point draw"); GLfloat coord[] = {x, y}; - gl.enableVertexAttribArray(OpenGL::ATTRIB_POS); - gl.setVertexAttribArray(OpenGL::ATTRIB_POS, 2, GL_FLOAT, 0, coord); - + gl.prepareDraw(); + gl.bindTexture(gl.getDefaultTexture()); + gl.useVertexAttribArrays(ATTRIBFLAG_POS); + glVertexAttribPointer(ATTRIB_POS, 2, GL_FLOAT, GL_FALSE, 0, coord); gl.drawArrays(GL_POINTS, 0, 1); - - gl.disableVertexAttribArray(OpenGL::ATTRIB_POS); } void Graphics::polyline(const float *coords, size_t count) { - DisplayState &state = states.back(); + const DisplayState &state = states.back(); if (state.lineJoin == LINE_JOIN_NONE) { - NoneJoinPolyline line; - line.render(coords, count, state.lineWidth * .5f, float(pixel_size_stack.back()), state.lineStyle == LINE_SMOOTH); - line.draw(); + NoneJoinPolyline line; + line.render(coords, count, state.lineWidth * .5f, float(pixelSizeStack.back()), state.lineStyle == LINE_SMOOTH); + line.draw(); } else if (state.lineJoin == LINE_JOIN_BEVEL) { BevelJoinPolyline line; - line.render(coords, count, state.lineWidth * .5f, float(pixel_size_stack.back()), state.lineStyle == LINE_SMOOTH); + line.render(coords, count, state.lineWidth * .5f, float(pixelSizeStack.back()), state.lineStyle == LINE_SMOOTH); line.draw(); } else // LINE_JOIN_MITER { MiterJoinPolyline line; - line.render(coords, count, state.lineWidth * .5f, float(pixel_size_stack.back()), state.lineStyle == LINE_SMOOTH); + line.render(coords, count, state.lineWidth * .5f, float(pixelSizeStack.back()), state.lineStyle == LINE_SMOOTH); line.draw(); } } @@ -1116,44 +1125,84 @@ void Graphics::rectangle(DrawMode mode, float x, float y, float w, float h) polygon(mode, coords, 5 * 2); } +void Graphics::rectangle(DrawMode mode, float x, float y, float w, float h, float rx, float ry, int points) +{ + if (rx == 0 || ry == 0) + { + rectangle(mode, x, y, w, h); + return; + } + + points = std::max(points, 1); + + const float half_pi = static_cast(LOVE_M_PI / 2); + float angle_shift = half_pi / ((float) points + 1.0f); + + int num_coords = (points + 2) * 8; + float *coords = new float[num_coords + 2]; + float phi = .0f; + + for (int i = 0; i <= points + 2; ++i, phi += angle_shift) + { + coords[2 * i + 0] = x + rx * (1 - cosf(phi)); + coords[2 * i + 1] = y + ry * (1 - sinf(phi)); + } + + phi = half_pi; + + for (int i = points + 2; i <= 2 * (points + 2); ++i, phi += angle_shift) + { + coords[2 * i + 0] = x + w - rx * (1 + cosf(phi)); + coords[2 * i + 1] = y + ry * (1 - sinf(phi)); + } + + phi = 2 * half_pi; + + for (int i = 2 * (points + 2); i <= 3 * (points + 2); ++i, phi += angle_shift) + { + coords[2 * i + 0] = x + w - rx * (1 + cosf(phi)); + coords[2 * i + 1] = y + h - ry * (1 + sinf(phi)); + } + + phi = 3 * half_pi; + + for (int i = 3 * (points + 2); i <= 4 * (points + 2); ++i, phi += angle_shift) + { + coords[2 * i + 0] = x + rx * (1 - cosf(phi)); + coords[2 * i + 1] = y + h - ry * (1 + sinf(phi)); + } + + coords[num_coords + 0] = coords[0]; + coords[num_coords + 1] = coords[1]; + + polygon(mode, coords, num_coords + 2); + + delete[] coords; +} + void Graphics::circle(DrawMode mode, float x, float y, float radius, int points) +{ + ellipse(mode, x, y, radius, radius, points); +} + +void Graphics::ellipse(DrawMode mode, float x, float y, float a, float b, int points) { float two_pi = static_cast(LOVE_M_PI * 2); if (points <= 0) points = 1; float angle_shift = (two_pi / points); float phi = .0f; - float *coords = nullptr; - int extrapoints = 1; - - // Fill mode will use a triangle fan internally, so we want the "hub" of the - // fan (its first vertex) to be the midpoint of the circle. - if (mode == DRAW_FILL) - { - extrapoints = 2; - coords = new float[2 * (points + extrapoints)]; - - coords[0] = x; - coords[1] = y; - - coords += 2; - } - else - coords = new float[2 * (points + extrapoints)]; - + float *coords = new float[2 * (points + 1)]; for (int i = 0; i < points; ++i, phi += angle_shift) { - coords[2*i] = x + radius * cosf(phi); - coords[2*i+1] = y + radius * sinf(phi); + coords[2*i+0] = x + a * cosf(phi); + coords[2*i+1] = y + b * sinf(phi); } - coords[2*points] = coords[0]; + coords[2*points+0] = coords[0]; coords[2*points+1] = coords[1]; - if (mode == DRAW_FILL) - coords -= 2; - - polygon(mode, coords, 2 * (points + extrapoints)); + polygon(mode, coords, (points + 1) * 2); delete[] coords; } @@ -1195,16 +1244,13 @@ void Graphics::arc(DrawMode mode, float x, float y, float radius, float angle1, } else { + OpenGL::TempDebugGroup debuggroup("Filled arc draw"); + gl.prepareDraw(); - gl.bindTexture(gl.getDefaultTexture()); - - gl.enableVertexAttribArray(OpenGL::ATTRIB_POS); - gl.setVertexAttribArray(OpenGL::ATTRIB_POS, 2, GL_FLOAT, 0, (GLvoid *) coords); - + gl.useVertexAttribArrays(ATTRIBFLAG_POS); + glVertexAttribPointer(ATTRIB_POS, 2, GL_FLOAT, GL_FALSE, 0, coords); gl.drawArrays(GL_TRIANGLE_FAN, 0, points + 2); - - gl.disableVertexAttribArray(OpenGL::ATTRIB_POS); } delete[] coords; @@ -1223,16 +1269,13 @@ void Graphics::polygon(DrawMode mode, const float *coords, size_t count) } else { + OpenGL::TempDebugGroup debuggroup("Filled polygon draw"); + gl.prepareDraw(); - gl.bindTexture(gl.getDefaultTexture()); - - gl.enableVertexAttribArray(OpenGL::ATTRIB_POS); - gl.setVertexAttribArray(OpenGL::ATTRIB_POS, 2, GL_FLOAT, 0, (GLvoid *) coords); - - gl.drawArrays(GL_TRIANGLE_FAN, 0, count / 2); - - gl.disableVertexAttribArray(OpenGL::ATTRIB_POS); + gl.useVertexAttribArrays(ATTRIBFLAG_POS); + glVertexAttribPointer(ATTRIB_POS, 2, GL_FLOAT, GL_FALSE, 0, coords); + gl.drawArrays(GL_TRIANGLE_FAN, 0, (int)count/2-1); // opengl will close the polygon for us } } @@ -1246,12 +1289,11 @@ love::image::ImageData *Graphics::newScreenshot(love::image::Image *image, bool int w = getWidth(); int h = getHeight(); - int row = 4*w; + int row = 4 * w; + int size = row * h; - int size = row*h; - - GLubyte *pixels = 0; - GLubyte *screenshot = 0; + GLubyte *pixels = nullptr; + GLubyte *screenshot = nullptr; try { @@ -1276,15 +1318,15 @@ love::image::ImageData *Graphics::newScreenshot(love::image::Image *image, bool } // OpenGL sucks and reads pixels from the lower-left. Let's fix that. - - GLubyte *src = pixels - row, *dst = screenshot + size; + GLubyte *src = pixels - row; + GLubyte *dst = screenshot + size; for (int i = 0; i < h; ++i) memcpy(dst-=row, src+=row, row); delete[] pixels; - love::image::ImageData *img = 0; + love::image::ImageData *img = nullptr; try { // Tell the new ImageData that it owns the screenshot data, so we don't @@ -1339,7 +1381,7 @@ Graphics::Stats Graphics::getStats() const Stats stats; stats.drawCalls = gl.stats.drawCalls; - stats.canvasSwitches = Canvas::switchCount; + stats.canvasSwitches = gl.stats.framebufferBinds; stats.canvases = Canvas::canvasCount; stats.images = Image::imageCount; stats.fonts = Font::fontCount; @@ -1350,66 +1392,33 @@ Graphics::Stats Graphics::getStats() const double Graphics::getSystemLimit(SystemLimit limittype) const { - double limit = 0.0; - switch (limittype) { case Graphics::LIMIT_POINT_SIZE: { GLfloat limits[2]; glGetFloatv(GL_ALIASED_POINT_SIZE_RANGE, limits); - limit = limits[1]; + return (double) limits[1]; } - break; case Graphics::LIMIT_TEXTURE_SIZE: - limit = (double) gl.getMaxTextureSize(); - break; + return (double) gl.getMaxTextureSize(); case Graphics::LIMIT_MULTI_CANVAS: - limit = (double) gl.getMaxRenderTargets(); - break; - case Graphics::LIMIT_CANVAS_FSAA: // For backward-compatibility. + return (double) gl.getMaxRenderTargets(); case Graphics::LIMIT_CANVAS_MSAA: - if (GLAD_VERSION_3_0 || GLAD_ARB_framebuffer_object - || GLAD_EXT_framebuffer_multisample) - { - GLint intlimit = 0; - glGetIntegerv(GL_MAX_SAMPLES, &intlimit); - limit = (double) intlimit; - } - break; + return (double) gl.getMaxRenderbufferSamples(); default: - break; + return 0.0; } - - return limit; } bool Graphics::isSupported(Support feature) const { switch (feature) { - case SUPPORT_CANVAS: - return Canvas::isSupported(); - case SUPPORT_HDR_CANVAS: - return Canvas::isFormatSupported(Canvas::FORMAT_HDR); case SUPPORT_MULTI_CANVAS: return Canvas::isMultiCanvasSupported(); - case SUPPORT_SHADER: - return Shader::isSupported(); - case SUPPORT_NPOT: - return Image::hasNpot(); - case SUPPORT_SUBTRACTIVE: - return (GLAD_ES_VERSION_2_0 || GLAD_VERSION_1_4) || (GLAD_EXT_blend_minmax && GLAD_EXT_blend_subtract); - case SUPPORT_MIPMAP: - return Image::hasMipmapSupport(); - case SUPPORT_DXT: - return Image::hasCompressedTextureSupport(image::CompressedData::FORMAT_DXT5); - case SUPPORT_BC5: - return Image::hasCompressedTextureSupport(image::CompressedData::FORMAT_BC5); - case SUPPORT_ETC1: - return Image::hasCompressedTextureSupport(image::CompressedData::FORMAT_ETC1); - case SUPPORT_PVRTC1: - return Image::hasCompressedTextureSupport(image::CompressedData::FORMAT_PVR1_RGBA4); + case SUPPORT_MULTI_CANVAS_FORMATS: + return Canvas::isMultiFormatMultiCanvasSupported(); case SUPPORT_SRGB: // sRGB support for the screen is guaranteed if it's supported as a // Canvas format. @@ -1426,7 +1435,7 @@ void Graphics::push(StackType type) gl.pushTransform(); - pixel_size_stack.push_back(pixel_size_stack.back()); + pixelSizeStack.push_back(pixelSizeStack.back()); if (type == STACK_ALL) states.push_back(states.back()); @@ -1440,7 +1449,7 @@ void Graphics::pop() throw Exception("Minimum stack depth reached (more pops than pushes?)"); gl.popTransform(); - pixel_size_stack.pop_back(); + pixelSizeStack.pop_back(); if (stackTypes.back() == STACK_ALL) { @@ -1463,7 +1472,7 @@ void Graphics::rotate(float r) void Graphics::scale(float x, float y) { gl.getTransform().scale(x, y); - pixel_size_stack.back() *= 2. / (fabs(x) + fabs(y)); + pixelSizeStack.back() *= 2. / (fabs(x) + fabs(y)); } void Graphics::translate(float x, float y) @@ -1473,32 +1482,34 @@ void Graphics::translate(float x, float y) void Graphics::shear(float kx, float ky) { - gl.getTransform().setShear(kx, ky); + gl.getTransform().shear(kx, ky); } void Graphics::origin() { gl.getTransform().setIdentity(); - pixel_size_stack.back() = 1; + pixelSizeStack.back() = 1; } Graphics::DisplayState::DisplayState() : color(255, 255, 255, 255) , backgroundColor(0, 0, 0, 255) , blendMode(BLEND_ALPHA) + , blendMultiplyAlpha(true) , lineWidth(1.0f) , lineStyle(LINE_SMOOTH) , lineJoin(LINE_JOIN_MITER) , pointSize(1.0f) - , pointStyle(POINT_SMOOTH) , scissor(false) , scissorBox() + , stencilTest(false) + , stencilInvert(false) , font(nullptr) , shader(nullptr) , colorMask({true, true, true, true}) , wireframe(false) , defaultFilter() - , defaultMipmapFilter(Texture::FILTER_NONE) + , defaultMipmapFilter(Texture::FILTER_NEAREST) , defaultMipmapSharpness(0.0f) { } @@ -1507,13 +1518,15 @@ Graphics::DisplayState::DisplayState(const DisplayState &other) : color(other.color) , backgroundColor(other.backgroundColor) , blendMode(other.blendMode) + , blendMultiplyAlpha(other.blendMultiplyAlpha) , lineWidth(other.lineWidth) , lineStyle(other.lineStyle) , lineJoin(other.lineJoin) , pointSize(other.pointSize) - , pointStyle(other.pointStyle) , scissor(other.scissor) , scissorBox(other.scissorBox) + , stencilTest(other.stencilTest) + , stencilInvert(other.stencilInvert) , font(other.font) , shader(other.shader) , canvases(other.canvases) @@ -1534,13 +1547,15 @@ Graphics::DisplayState &Graphics::DisplayState::operator = (const DisplayState & color = other.color; backgroundColor = other.backgroundColor; blendMode = other.blendMode; + blendMultiplyAlpha = other.blendMultiplyAlpha; lineWidth = other.lineWidth; lineStyle = other.lineStyle; lineJoin = other.lineJoin; pointSize = other.pointSize; - pointStyle = other.pointStyle; scissor = other.scissor; scissorBox = other.scissorBox; + stencilTest = other.stencilTest; + stencilInvert = other.stencilInvert; font = other.font; shader = other.shader; diff --git a/jni/love/src/modules/graphics/opengl/Graphics.h b/jni/love/src/modules/graphics/opengl/Graphics.h index 64be2378..ba9a97ac 100644 --- a/jni/love/src/modules/graphics/opengl/Graphics.h +++ b/jni/love/src/modules/graphics/opengl/Graphics.h @@ -40,11 +40,13 @@ #include "Font.h" #include "Image.h" #include "graphics/Quad.h" +#include "graphics/Texture.h" #include "SpriteBatch.h" #include "ParticleSystem.h" #include "Canvas.h" #include "Shader.h" #include "Mesh.h" +#include "Text.h" namespace love { @@ -53,11 +55,6 @@ namespace graphics namespace opengl { -// During display mode changing, certain -// variables about the OpenGL context are -// lost. - - class Graphics : public love::graphics::Graphics { public: @@ -85,9 +82,19 @@ public: void reset(); /** - * Clears the screen. + * Clears the screen to a specific color. **/ - void clear(); + void clear(Color c); + + /** + * Clears each active canvas to a different color. + **/ + void clear(const std::vector &colors); + + /** + * Discards the contents of the screen. + **/ + void discard(const std::vector &colorbuffers, bool stencil); /** * Flips buffers. (Rendered geometry is presented on screen). @@ -131,28 +138,27 @@ public: bool getScissor(int &x, int &y, int &width, int &height) const; /** - * Enables the stencil buffer and set stencil function to fill it - */ - void defineStencil(); + * Enables or disables drawing to the stencil buffer. When enabled, the + * color buffer is disabled. + **/ + void drawToStencilBuffer(bool enable); /** - * Set stencil function to mask the following drawing calls using - * the current stencil buffer - * @param invert Invert the mask, i.e. draw everywhere expect where - * the mask is defined. - */ - void useStencil(bool invert = false); + * Sets whether stencil testing is enabled. + **/ + void setStencilTest(bool enable, bool invert); + void getStencilTest(bool &enable, bool &invert); /** - * Disables the stencil buffer - */ - void discardStencil(); + * Clear the stencil buffer in the active Canvas(es.) + **/ + void clearStencil(); /** * Creates an Image object with padding and/or optimization. **/ - Image *newImage(love::image::ImageData *data, Image::Format format = Image::FORMAT_NORMAL); - Image *newImage(love::image::CompressedData *cdata, Image::Format format = Image::FORMAT_NORMAL); + Image *newImage(love::image::ImageData *data, const Image::Flags &flags); + Image *newImage(love::image::CompressedImageData *cdata, const Image::Flags &flags); Quad *newQuad(Quad::Viewport v, float sw, float sh); @@ -161,7 +167,7 @@ public: **/ Font *newFont(love::font::Rasterizer *data, const Texture::Filter &filter = Texture::getDefaultFilter()); - SpriteBatch *newSpriteBatch(Texture *texture, int size, int usage); + SpriteBatch *newSpriteBatch(Texture *texture, int size, Mesh::Usage usage); ParticleSystem *newParticleSystem(Texture *texture, int size); @@ -169,14 +175,19 @@ public: Shader *newShader(const Shader::ShaderSource &source); - Mesh *newMesh(const std::vector &vertices, Mesh::DrawMode mode = Mesh::DRAW_MODE_FAN); - Mesh *newMesh(int vertexcount, Mesh::DrawMode mode = Mesh::DRAW_MODE_FAN); + Mesh *newMesh(const std::vector &vertices, Mesh::DrawMode drawmode, Mesh::Usage usage); + Mesh *newMesh(int vertexcount, Mesh::DrawMode drawmode, Mesh::Usage usage); + + Mesh *newMesh(const std::vector &vertexformat, int vertexcount, Mesh::DrawMode drawmode, Mesh::Usage usage); + Mesh *newMesh(const std::vector &vertexformat, const void *data, size_t datasize, Mesh::DrawMode drawmode, Mesh::Usage usage); + + Text *newText(Font *font, const std::string &text = ""); /** * Sets the foreground color. * @param c The new foreground color. **/ - void setColor(const Color &c); + void setColor(Color c); /** * Gets current color. @@ -186,7 +197,7 @@ public: /** * Sets the background Color. **/ - void setBackgroundColor(const Color &c); + void setBackgroundColor(Color c); /** * Gets the current background color. @@ -221,12 +232,12 @@ public: /** * Sets the current blend mode. **/ - void setBlendMode(BlendMode mode); + void setBlendMode(BlendMode mode, bool multiplyalpha); /** * Gets the current blend mode. **/ - BlendMode getBlendMode() const; + BlendMode getBlendMode(bool &multiplyalpha) const; /** * Sets the default filter for images, canvases, and fonts. @@ -282,22 +293,11 @@ public: **/ void setPointSize(float size); - /** - * Sets the style of points. - * @param style POINT_SMOOTH or POINT_ROUGH. - **/ - void setPointStyle(PointStyle style); - /** * Gets the point size. **/ float getPointSize() const; - /** - * Gets the point style. - **/ - PointStyle getPointStyle() const; - /** * Sets whether graphics will be drawn as wireframe lines instead of filled * triangles (has no effect for drawn points.) @@ -342,7 +342,7 @@ public: * @param kx Shear along the x-axis. * @param ky Shear along the y-axis. **/ - void printf(const std::string &str, float x, float y, float wrap, AlignMode align, float angle, float sx, float sy, float ox, float oy, float kx, float ky); + void printf(const std::string &str, float x, float y, float wrap, Font::AlignMode align, float angle, float sx, float sy, float ox, float oy, float kx, float ky); /** * Draws a point at (x,y). @@ -367,6 +367,19 @@ public: **/ void rectangle(DrawMode mode, float x, float y, float w, float h); + /** + * Variant of rectangle that draws a rounded rectangle. + * @param mode The mode of drawing (line/filled). + * @param x X-coordinate of top-left corner + * @param y Y-coordinate of top-left corner + * @param w The width of the rectangle. + * @param h The height of the rectangle. + * @param rx The radius of the corners on the x axis + * @param ry The radius of the corners on the y axis + * @param points The number of points to use per corner + **/ + void rectangle(DrawMode mode, float x, float y, float w, float h, float rx, float ry, int points = 10); + /** * Draws a circle using the specified arguments. * @param mode The mode of drawing (line/filled). @@ -377,6 +390,17 @@ public: **/ void circle(DrawMode mode, float x, float y, float radius, int points = 10); + /** + * Draws an ellipse using the specified arguments. + * @param mode The mode of drawing (line/filled). + * @param x X-coordinate of center + * @param y Y-coordinate of center + * @param a Radius in x-direction + * @param b Radius in y-direction + * @param points Number of points to use to draw the circle. + **/ + void ellipse(DrawMode mode, float x, float y, float a, float b, int points = 10); + /** * Draws an arc using the specified arguments. * @param mode The mode of drawing (line/filled). @@ -443,17 +467,21 @@ private: Color backgroundColor; BlendMode blendMode; + bool blendMultiplyAlpha; float lineWidth; LineStyle lineStyle; LineJoin lineJoin; float pointSize; - PointStyle pointStyle; bool scissor; OpenGL::Viewport scissorBox; + // Stencil. + bool stencilTest; + bool stencilInvert; + StrongRef font; StrongRef shader; @@ -484,14 +512,16 @@ private: StrongRef defaultFont; - std::vector pixel_size_stack; // stores current size of a pixel (needed for line drawing) + std::vector pixelSizeStack; // stores current size of a pixel (needed for line drawing) + + QuadIndices *quadIndices; int width; int height; bool created; bool active; - bool activeStencil; + bool writingToStencil; std::vector states; std::vector stackTypes; // Keeps track of the pushed stack types. diff --git a/jni/love/src/modules/graphics/opengl/Image.cpp b/jni/love/src/modules/graphics/opengl/Image.cpp index 8642bc24..e591c234 100644 --- a/jni/love/src/modules/graphics/opengl/Image.cpp +++ b/jni/love/src/modules/graphics/opengl/Image.cpp @@ -20,10 +20,22 @@ #include "Image.h" +#include "common/int.h" + // STD #include // For memcpy #include // for min/max +#ifdef LOVE_ANDROID +// log2 is not declared in the math.h shipped with the Android NDK +#include +inline double log2( double n ) +{ + // log(n)/log(2) is log2. + return std::log( n ) / std::log( 2 ); +} +#endif + namespace love { namespace graphics @@ -35,365 +47,197 @@ int Image::imageCount = 0; float Image::maxMipmapSharpness = 0.0f; -Texture::FilterMode Image::defaultMipmapFilter = Texture::FILTER_NONE; +Texture::FilterMode Image::defaultMipmapFilter = Texture::FILTER_LINEAR; float Image::defaultMipmapSharpness = 0.0f; -Image::Image(love::image::ImageData *data, Format format) +Image::Image(love::image::ImageData *data, const Flags &flags) : data(data) , cdata(nullptr) - , paddedWidth(width) - , paddedHeight(height) , texture(0) , mipmapSharpness(defaultMipmapSharpness) - , mipmapsCreated(false) , compressed(false) - , format(format) + , flags(flags) , usingDefaultTexture(false) , textureMemorySize(0) { width = data->getWidth(); height = data->getHeight(); + preload(); + loadVolatile(); ++imageCount; } -Image::Image(love::image::CompressedData *cdata, Format format) +Image::Image(love::image::CompressedImageData *cdata, const Flags &flags) : data(nullptr) , cdata(cdata) - , paddedWidth(width) - , paddedHeight(height) , texture(0) , mipmapSharpness(defaultMipmapSharpness) - , mipmapsCreated(false) , compressed(true) - , format(format) + , flags(flags) , usingDefaultTexture(false) , textureMemorySize(0) { + this->flags.sRGB = (flags.sRGB || cdata->isSRGB()); + width = cdata->getWidth(0); height = cdata->getHeight(0); + + if (flags.mipmaps) + { + // The mipmap texture data comes from the CompressedImageData in this case, + // so we should make sure it has all necessary mipmap levels. + if (cdata->getMipmapCount() < (int) log2(std::max(width, height)) + 1) + throw love::Exception("Image cannot have mipmaps: compressed image data does not have all required mipmap levels."); + } + preload(); + loadVolatile(); ++imageCount; } Image::~Image() { - unload(); - + unloadVolatile(); --imageCount; } -love::image::ImageData *Image::getImageData() const -{ - return data.get(); -} - -love::image::CompressedData *Image::getCompressedData() const -{ - return cdata.get(); -} - -void Image::draw(float x, float y, float angle, float sx, float sy, float ox, float oy, float kx, float ky) -{ - Matrix t; - t.setTransformation(x, y, angle, sx, sy, ox, oy, kx, ky); - - drawv(t, vertices); -} - -void Image::drawq(Quad *quad, float x, float y, float angle, float sx, float sy, float ox, float oy, float kx, float ky) -{ - Matrix t; - t.setTransformation(x, y, angle, sx, sy, ox, oy, kx, ky); - - drawv(t, quad->getVertices()); -} - -void Image::predraw() -{ - bind(); - - if (width != paddedWidth || height != paddedHeight) - { - // NPOT image padded to POT size, so the texcoords should be scaled. - glMatrixMode(GL_TEXTURE); - glPushMatrix(); - glScalef(float(width) / float(paddedWidth), float(height) / float(paddedHeight), 0.0f); - glMatrixMode(GL_MODELVIEW); - } -} - -void Image::postdraw() -{ - if (width != paddedWidth || height != paddedHeight) - { - glMatrixMode(GL_TEXTURE); - glPopMatrix(); - glMatrixMode(GL_MODELVIEW); - } -} - -GLuint Image::getGLTexture() const -{ - return texture; -} - -void Image::uploadCompressedMipmaps() -{ - if (!isCompressed() || !cdata.get() || !hasCompressedTextureSupport(cdata->getFormat())) - return; - - // NPOT textures don't support mipmapping without full NPOT support. - if (hasLimitedNpot() && (width != next_p2(width) || height != next_p2(height))) - return; - - bind(); - - int count = cdata->getMipmapCount(); - - // We have to inform OpenGL if the image doesn't have all mipmap levels. - if (GLAD_VERSION_1_2 || GLAD_ES_VERSION_3_0 || GLAD_APPLE_texture_max_level) - { - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, count - 1); - } - else if (cdata->getWidth(count-1) > 1 || cdata->getHeight(count-1) > 1) - { - // Telling OpenGL to ignore certain levels isn't always supported. - throw love::Exception("Cannot load mipmaps: " - "compressed image does not have all required levels."); - } - - size_t totalsize = cdata->getSize(0); - - for (int i = 1; i < count; i++) - { - totalsize += cdata->getSize(i); - glCompressedTexImage2D(GL_TEXTURE_2D, - i, - getCompressedFormat(cdata->getFormat()), - cdata->getWidth(i), - cdata->getHeight(i), - 0, - GLsizei(cdata->getSize(i)), - cdata->getData(i)); - } - - size_t prevmemsize = textureMemorySize; - textureMemorySize = totalsize; - gl.updateTextureMemorySize(prevmemsize, textureMemorySize); -} - -void Image::createMipmaps() -{ - // Only valid for Images created with ImageData. - if (!data.get() || isCompressed()) - return; - - if (!hasMipmapSupport()) - throw love::Exception("Mipmap filtering is not supported on this system."); - - // Some old drivers claim support for NPOT textures, but fail when creating - // mipmaps. We can't detect which systems will do this, so we fail gracefully - // for all NPOT images. - int w = int(width), h = int(height); - if (w != next_p2(w) || h != next_p2(h)) - { - throw love::Exception("Cannot create mipmaps: " - "image does not have power of two dimensions."); - } - - bind(); - - // Prevent other threads from changing the ImageData while we upload it. - love::thread::Lock lock(data->getMutex()); - - if (hasNpot() && (GLAD_ES_VERSION_2_0 || GLAD_VERSION_3_0 || GLAD_ARB_framebuffer_object)) - { - if (gl.getVendor() == OpenGL::VENDOR_ATI_AMD) - { - // AMD/ATI drivers have several bugs when generating mipmaps, - // re-uploading the entire base image seems to be required. - uploadTexture(); - - // More bugs: http://www.opengl.org/wiki/Common_Mistakes#Automatic_mipmap_generation - glEnable(GL_TEXTURE_2D); - } - - glGenerateMipmap(GL_TEXTURE_2D); - } - else - { - glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE); - glTexSubImage2D(GL_TEXTURE_2D, - 0, - 0, - 0, - (GLsizei)width, - (GLsizei)height, - GL_RGBA, - GL_UNSIGNED_BYTE, - data->getData()); - glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_FALSE); - } - - size_t prevmemsize = textureMemorySize; - textureMemorySize = paddedWidth * paddedHeight * 4 * 1.3333; - gl.updateTextureMemorySize(prevmemsize, textureMemorySize); -} - -void Image::checkMipmapsCreated() -{ - if (mipmapsCreated || filter.mipmap == FILTER_NONE || usingDefaultTexture) - return; - - if (isCompressed() && cdata.get() && hasCompressedTextureSupport(cdata->getFormat())) - uploadCompressedMipmaps(); - else if (data.get()) - createMipmaps(); - else - return; - - mipmapsCreated = true; -} - -void Image::setFilter(const Texture::Filter &f) -{ - const Filter oldfilter = filter; - filter = f; - - // We don't want filtering or (attempted) mipmaps on the default texture. - if (usingDefaultTexture) - { - filter.mipmap = FILTER_NONE; - filter.min = filter.mag = FILTER_NEAREST; - } - - if (hasLimitedNpot() && (width != next_p2(width) || height != next_p2(height))) - { - // If we only have limited NPOT support then mipmapping isn't supported. - filter.mipmap = FILTER_NONE; - } - - bind(); - gl.setTextureFilter(filter); - - try - { - checkMipmapsCreated(); - } - catch (love::Exception &) - { - // Don't keep the new mipmap filter if we can't create mipmaps. - filter = oldfilter; - gl.setTextureFilter(filter); - throw; - } -} - -bool Image::setWrap(const Texture::Wrap &w) -{ - bool success = true; - wrap = w; - - if (hasLimitedNpot() && (width != next_p2(width) || height != next_p2(height))) - { - if (wrap.s != WRAP_CLAMP || wrap.t != WRAP_CLAMP) - success = false; - - // If we only have limited NPOT support then the wrap mode must be CLAMP. - wrap.s = wrap.t = WRAP_CLAMP; - } - - bind(); - gl.setTextureWrap(w); - - return success; -} - -void Image::setMipmapSharpness(float sharpness) -{ - if (hasMipmapSharpnessSupport()) - { - // LOD bias has the range (-maxbias, maxbias) - mipmapSharpness = std::min(std::max(sharpness, -maxMipmapSharpness + 0.01f), maxMipmapSharpness - 0.01f); - - bind(); - - // negative bias is sharper - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_LOD_BIAS, -mipmapSharpness); - } - else - mipmapSharpness = 0.0f; -} - -float Image::getMipmapSharpness() const -{ - return mipmapSharpness; -} - -void Image::bind() const -{ - if (texture == 0) - return; - - gl.bindTexture(texture); -} - void Image::preload() { - memset(vertices, 255, sizeof(Vertex)*4); + for (int i = 0; i < 4; i++) + vertices[i].r = vertices[i].g = vertices[i].b = vertices[i].a = 255; - vertices[0].x = 0; - vertices[0].y = 0; - vertices[1].x = 0; + // Vertices are ordered for use with triangle strips: + // 0----2 + // | / | + // | / | + // 1----3 + vertices[0].x = 0.0f; + vertices[0].y = 0.0f; + vertices[1].x = 0.0f; vertices[1].y = (float) height; vertices[2].x = (float) width; - vertices[2].y = (float) height; + vertices[2].y = 0.0f; vertices[3].x = (float) width; - vertices[3].y = 0; + vertices[3].y = (float) height; - vertices[0].s = 0; - vertices[0].t = 0; - vertices[1].s = 0; - vertices[1].t = 1; - vertices[2].s = 1; - vertices[2].t = 1; - vertices[3].s = 1; - vertices[3].t = 0; + vertices[0].s = 0.0f; + vertices[0].t = 0.0f; + vertices[1].s = 0.0f; + vertices[1].t = 1.0f; + vertices[2].s = 1.0f; + vertices[2].t = 0.0f; + vertices[3].s = 1.0f; + vertices[3].t = 1.0f; - filter.mipmap = defaultMipmapFilter; + if (flags.mipmaps) + filter.mipmap = defaultMipmapFilter; } -bool Image::load() +void Image::generateMipmaps() { - return loadVolatile(); + // The GL_GENERATE_MIPMAP texparameter is set in loadVolatile if we don't + // have support for glGenerateMipmap. + if (flags.mipmaps && !isCompressed() && + (GLAD_ES_VERSION_2_0 || GLAD_VERSION_3_0 || GLAD_ARB_framebuffer_object)) + { + // Driver bug: http://www.opengl.org/wiki/Common_Mistakes#Automatic_mipmap_generation +#if defined(LOVE_WINDOWS) || defined(LOVE_LINUX) + if (gl.getVendor() == OpenGL::VENDOR_AMD) + glEnable(GL_TEXTURE_2D); +#endif + + glGenerateMipmap(GL_TEXTURE_2D); + } } -void Image::unload() +void Image::loadDefaultTexture() { - return unloadVolatile(); + usingDefaultTexture = true; + + gl.bindTexture(texture); + setFilter(filter); + + // A nice friendly checkerboard to signify invalid textures... + GLubyte px[] = {0xFF,0xFF,0xFF,0xFF, 0xFF,0xC0,0xC0,0xFF, + 0xFF,0xC0,0xC0,0xFF, 0xFF,0xFF,0xFF,0xFF}; + + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, px); +} + +void Image::loadFromCompressedData() +{ + GLenum iformat = getCompressedFormat(cdata->getFormat()); + int count = flags.mipmaps ? cdata->getMipmapCount() : 1; + + for (int i = 0; i < count; i++) + { + glCompressedTexImage2D(GL_TEXTURE_2D, i, iformat, + cdata->getWidth(i), cdata->getHeight(i), 0, + (GLsizei) cdata->getSize(i), cdata->getData(i)); + } +} + +void Image::loadFromImageData() +{ + GLenum iformat = flags.sRGB ? GL_SRGB8_ALPHA8 : GL_RGBA8; + GLenum format = GL_RGBA; + + // in GLES2, the internalformat and format params of TexImage have to match. + if (GLAD_ES_VERSION_2_0 && !GLAD_ES_VERSION_3_0) + { + format = flags.sRGB ? GL_SRGB_ALPHA : GL_RGBA; + iformat = format; + } + + { + love::thread::Lock lock(data->getMutex()); + glTexImage2D(GL_TEXTURE_2D, 0, iformat, width, height, 0, format, + GL_UNSIGNED_BYTE, data->getData()); + } + + generateMipmaps(); } bool Image::loadVolatile() { - if (format == FORMAT_SRGB && !hasSRGBSupport()) - throw love::Exception("sRGB images are not supported on this system."); + OpenGL::TempDebugGroup debuggroup("Image load"); - if (isCompressed() && cdata.get() && !hasCompressedTextureSupport(cdata->getFormat())) + if (isCompressed() && !hasCompressedTextureSupport(cdata->getFormat(), flags.sRGB)) { const char *str; - if (image::CompressedData::getConstant(cdata->getFormat(), str)) + if (image::CompressedImageData::getConstant(cdata->getFormat(), str)) { throw love::Exception("Cannot create image: " - "%s compressed images are not supported on this system.", str); + "%s%s compressed images are not supported on this system.", flags.sRGB ? "sRGB " : "", str); } else throw love::Exception("cannot create image: format is not supported on this system."); } + else if (!isCompressed()) + { + if (flags.sRGB && !hasSRGBSupport()) + throw love::Exception("sRGB images are not supported on this system."); - if (hasMipmapSharpnessSupport() && maxMipmapSharpness == 0.0f) + // GL_EXT_sRGB doesn't support glGenerateMipmap for sRGB textures. + if (flags.sRGB && (GLAD_ES_VERSION_2_0 && GLAD_EXT_sRGB && !GLAD_ES_VERSION_3_0)) + { + flags.mipmaps = false; + filter.mipmap = FILTER_NONE; + } + } + + // NPOT textures don't support mipmapping without full NPOT support. + if ((GLAD_ES_VERSION_2_0 && !(GLAD_ES_VERSION_3_0 || GLAD_OES_texture_npot)) + && (width != next_p2(width) || height != next_p2(height))) + { + flags.mipmaps = false; + filter.mipmap = FILTER_NONE; + } + + if (maxMipmapSharpness == 0.0f && GLAD_VERSION_1_4) glGetFloatv(GL_MAX_TEXTURE_LOD_BIAS, &maxMipmapSharpness); glGenTextures(1, &texture); @@ -403,216 +247,234 @@ bool Image::loadVolatile() setWrap(wrap); setMipmapSharpness(mipmapSharpness); - paddedWidth = width; - paddedHeight = height; - - if (!hasNpot()) - { - // NPOT textures will be padded to POT dimensions if necessary. - paddedWidth = next_p2(width); - paddedHeight = next_p2(height); - } - // Use a default texture if the size is too big for the system. - if (paddedWidth > gl.getMaxTextureSize() || paddedHeight > gl.getMaxTextureSize()) + if (width > gl.getMaxTextureSize() || height > gl.getMaxTextureSize()) { - uploadDefaultTexture(); + loadDefaultTexture(); return true; } - // Mutex lock will potentially cover texture loading and mipmap creation. - love::thread::EmptyLock lock; - if (data.get()) - lock.setLock(data->getMutex()); + if ((isCompressed() || !flags.mipmaps) && (GLAD_ES_VERSION_3_0 || GLAD_VERSION_1_0)) + { + int count = (flags.mipmaps && isCompressed()) ? cdata->getMipmapCount() : 1; + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, count - 1); + } + + if (flags.mipmaps && !isCompressed() && + !(GLAD_ES_VERSION_2_0 || GLAD_VERSION_3_0 || GLAD_ARB_framebuffer_object)) + { + // Auto-generate mipmaps every time the texture is modified, if + // glGenerateMipmap isn't supported. + glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE); + } while (glGetError() != GL_NO_ERROR); // Clear errors. - if (hasNpot() || (width == paddedWidth && height == paddedHeight)) - uploadTexture(); - else - uploadTexturePadded(); + try + { + if (isCompressed()) + loadFromCompressedData(); + else + loadFromImageData(); - GLenum glerr = glGetError(); - if (glerr != GL_NO_ERROR) - throw love::Exception("Cannot create image (error code 0x%x)", glerr); + GLenum glerr = glGetError(); + if (glerr != GL_NO_ERROR) + throw love::Exception("Cannot create image (error code 0x%x)", glerr); + } + catch (love::Exception &) + { + gl.deleteTexture(texture); + texture = 0; + throw; + } + + size_t prevmemsize = textureMemorySize; if (isCompressed()) - textureMemorySize = cdata->getSize(0); + { + textureMemorySize = 0; + for (int i = 0; i < (flags.mipmaps ? cdata->getMipmapCount() : 1); i++) + textureMemorySize += cdata->getSize(i); + } else - textureMemorySize = paddedWidth * paddedHeight * 4; + { + textureMemorySize = width * height * 4; + if (flags.mipmaps) + textureMemorySize *= 1.333; + } - gl.updateTextureMemorySize(0, textureMemorySize); + gl.updateTextureMemorySize(prevmemsize, textureMemorySize); usingDefaultTexture = false; - mipmapsCreated = false; - checkMipmapsCreated(); - return true; } -void Image::uploadTexturePadded() -{ - if (isCompressed() && cdata.get()) - { - // Padded textures don't really work if they're compressed... - throw love::Exception("Cannot create image: " - "compressed NPOT images are not supported on this system."); - } - else if (data.get()) - { - GLenum xformat = GL_RGBA; - GLenum iformat = (format == FORMAT_SRGB) ? GL_SRGB_ALPHA : GL_RGBA; - - if (GLAD_ES_VERSION_2_0 && !GLAD_ES_VERSION_3_0) - xformat = iformat; - - glTexImage2D(GL_TEXTURE_2D, - 0, - iformat, - (GLsizei)paddedWidth, - (GLsizei)paddedHeight, - 0, - xformat, - GL_UNSIGNED_BYTE, - 0); - - glTexSubImage2D(GL_TEXTURE_2D, - 0, - 0, 0, - (GLsizei)width, - (GLsizei)height, - xformat, - GL_UNSIGNED_BYTE, - data->getData()); - } -} - -void Image::uploadTexture() -{ - if (isCompressed() && cdata.get()) - { - GLenum format = getCompressedFormat(cdata->getFormat()); - glCompressedTexImage2D(GL_TEXTURE_2D, - 0, - format, - cdata->getWidth(0), - cdata->getHeight(0), - 0, - GLsizei(cdata->getSize(0)), - cdata->getData(0)); - } - else if (data.get()) - { - GLenum xformat = GL_RGBA; - GLenum iformat = (format == FORMAT_SRGB) ? GL_SRGB_ALPHA : GL_RGBA; - - // The internal and external format parameters must match in OpenGL ES 2. - if (GLAD_ES_VERSION_2_0 && !GLAD_ES_VERSION_3_0) - xformat = iformat; - - glTexImage2D(GL_TEXTURE_2D, - 0, - iformat, - (GLsizei)width, - (GLsizei)height, - 0, - xformat, - GL_UNSIGNED_BYTE, - data->getData()); - } -} - void Image::unloadVolatile() { - // Delete the hardware texture. - if (texture != 0) - { - gl.deleteTexture(texture); - texture = 0; + if (texture == 0) + return; - gl.updateTextureMemorySize(textureMemorySize, 0); - textureMemorySize = 0; - } + gl.deleteTexture(texture); + texture = 0; + + gl.updateTextureMemorySize(textureMemorySize, 0); + textureMemorySize = 0; } -bool Image::refresh() +bool Image::refresh(int xoffset, int yoffset, int w, int h) { // No effect if the texture hasn't been created yet. - if (texture == 0) + if (texture == 0 || usingDefaultTexture) return false; - if (usingDefaultTexture) + if (xoffset < 0 || yoffset < 0 || w <= 0 || h <= 0 || + (xoffset + w) > width || (yoffset + h) > height) { - uploadDefaultTexture(); - return true; + throw love::Exception("Invalid rectangle dimensions."); } - // We want this lock to potentially cover mipmap creation as well. - love::thread::EmptyLock lock; + gl.bindTexture(texture); - bind(); - - if (data.get() && !isCompressed()) - lock.setLock(data->getMutex()); - - while (glGetError() != GL_NO_ERROR); // Clear errors. - - if (hasNpot() || (width == paddedWidth && height == paddedHeight)) - uploadTexture(); + if (isCompressed()) + loadFromCompressedData(); else - uploadTexturePadded(); + { + const image::pixel *pdata = (const image::pixel *) data->getData(); + pdata += yoffset * data->getWidth() + xoffset; - if (glGetError() != GL_NO_ERROR) - uploadDefaultTexture(); - else - usingDefaultTexture = false; + GLenum format = GL_RGBA; - mipmapsCreated = false; - checkMipmapsCreated(); + // In ES2, the format parameter of TexSubImage must match the internal + // format of the texture. + if (flags.sRGB && (GLAD_ES_VERSION_2_0 && !GLAD_ES_VERSION_3_0)) + format = GL_SRGB_ALPHA; + + { + thread::Lock lock(data->getMutex()); + glTexSubImage2D(GL_TEXTURE_2D, 0, xoffset, yoffset, w, h, format, + GL_UNSIGNED_BYTE, pdata); + } + + generateMipmaps(); + } return true; } -Image::Format Image::getFormat() const +void Image::drawv(const Matrix4 &t, const Vertex *v) { - return format; -} + OpenGL::TempDebugGroup debuggroup("Image draw"); -void Image::uploadDefaultTexture() -{ - usingDefaultTexture = true; - - bind(); - setFilter(filter); - - // A nice friendly checkerboard to signify invalid textures... - GLubyte px[] = {0xFF,0xFF,0xFF,0xFF, 0xC0,0xC0,0xC0,0xFF, - 0xC0,0xC0,0xC0,0xFF, 0xFF,0xFF,0xFF,0xFF}; - - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, px); -} - -void Image::drawv(const Matrix &t, const Vertex *v) -{ OpenGL::TempTransform transform(gl); transform.get() *= t; - predraw(); + gl.bindTexture(texture); + + gl.useVertexAttribArrays(ATTRIBFLAG_POS | ATTRIBFLAG_TEXCOORD); + + glVertexAttribPointer(ATTRIB_POS, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), &v[0].x); + glVertexAttribPointer(ATTRIB_TEXCOORD, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), &v[0].s); gl.prepareDraw(); + gl.drawArrays(GL_TRIANGLE_STRIP, 0, 4); +} - gl.enableVertexAttribArray(OpenGL::ATTRIB_POS); - gl.enableVertexAttribArray(OpenGL::ATTRIB_TEXCOORD); +void Image::draw(float x, float y, float angle, float sx, float sy, float ox, float oy, float kx, float ky) +{ + Matrix4 t(x, y, angle, sx, sy, ox, oy, kx, ky); - gl.setVertexAttribArray(OpenGL::ATTRIB_POS, 2, GL_FLOAT, sizeof(Vertex), (GLvoid *)&v[0].x); - gl.setVertexAttribArray(OpenGL::ATTRIB_TEXCOORD, 2, GL_FLOAT, sizeof(Vertex), (GLvoid *)&v[0].s); + drawv(t, vertices); +} - gl.drawArrays(GL_TRIANGLE_FAN, 0, 4); +void Image::drawq(Quad *quad, float x, float y, float angle, float sx, float sy, float ox, float oy, float kx, float ky) +{ + Matrix4 t(x, y, angle, sx, sy, ox, oy, kx, ky); - gl.disableVertexAttribArray(OpenGL::ATTRIB_POS); - gl.disableVertexAttribArray(OpenGL::ATTRIB_TEXCOORD); + drawv(t, quad->getVertices()); +} - postdraw(); +const void *Image::getHandle() const +{ + return &texture; +} + +love::image::ImageData *Image::getImageData() const +{ + return data.get(); +} + +love::image::CompressedImageData *Image::getCompressedData() const +{ + return cdata.get(); +} + +void Image::setFilter(const Texture::Filter &f) +{ + if (!validateFilter(f, flags.mipmaps)) + { + if (f.mipmap != FILTER_NONE && !flags.mipmaps) + throw love::Exception("Non-mipmapped image cannot have mipmap filtering."); + else + throw love::Exception("Invalid texture filter."); + } + + filter = f; + + // We don't want filtering or (attempted) mipmaps on the default texture. + if (usingDefaultTexture) + { + filter.mipmap = FILTER_NONE; + filter.min = filter.mag = FILTER_NEAREST; + } + + gl.bindTexture(texture); + gl.setTextureFilter(filter); +} + +bool Image::setWrap(const Texture::Wrap &w) +{ + bool success = true; + wrap = w; + + if ((GLAD_ES_VERSION_2_0 && !(GLAD_ES_VERSION_3_0 || GLAD_OES_texture_npot)) + && (width != next_p2(width) || height != next_p2(height))) + { + if (wrap.s != WRAP_CLAMP || wrap.t != WRAP_CLAMP) + success = false; + + // If we only have limited NPOT support then the wrap mode must be CLAMP. + wrap.s = wrap.t = WRAP_CLAMP; + } + + gl.bindTexture(texture); + gl.setTextureWrap(w); + + return success; +} + +void Image::setMipmapSharpness(float sharpness) +{ + // OpenGL ES doesn't support LOD bias via glTexParameter. + if (!GLAD_VERSION_1_4) + return; + + // LOD bias has the range (-maxbias, maxbias) + mipmapSharpness = std::min(std::max(sharpness, -maxMipmapSharpness + 0.01f), maxMipmapSharpness - 0.01f); + + gl.bindTexture(texture); + + // negative bias is sharper + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_LOD_BIAS, -mipmapSharpness); +} + +float Image::getMipmapSharpness() const +{ + return mipmapSharpness; +} + +const Image::Flags &Image::getFlags() const +{ + return flags; } void Image::setDefaultMipmapSharpness(float sharpness) @@ -640,116 +502,142 @@ bool Image::isCompressed() const return compressed; } -GLenum Image::getCompressedFormat(image::CompressedData::Format cformat) const +GLenum Image::getCompressedFormat(image::CompressedImageData::Format cformat) const { - bool srgb = format == FORMAT_SRGB; - switch (cformat) { - case image::CompressedData::FORMAT_DXT1: - if (srgb) + case image::CompressedImageData::FORMAT_DXT1: + if (flags.sRGB) return GL_COMPRESSED_SRGB_S3TC_DXT1_EXT; else return GL_COMPRESSED_RGB_S3TC_DXT1_EXT; - case image::CompressedData::FORMAT_DXT3: - if (srgb) + case image::CompressedImageData::FORMAT_DXT3: + if (flags.sRGB) return GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT; else return GL_COMPRESSED_RGBA_S3TC_DXT3_EXT; - case image::CompressedData::FORMAT_DXT5: - if (srgb) + case image::CompressedImageData::FORMAT_DXT5: + if (flags.sRGB) return GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT; else return GL_COMPRESSED_RGBA_S3TC_DXT5_EXT; - case image::CompressedData::FORMAT_BC4: + case image::CompressedImageData::FORMAT_BC4: return GL_COMPRESSED_RED_RGTC1; - case image::CompressedData::FORMAT_BC4s: + case image::CompressedImageData::FORMAT_BC4s: return GL_COMPRESSED_SIGNED_RED_RGTC1; - case image::CompressedData::FORMAT_BC5: + case image::CompressedImageData::FORMAT_BC5: return GL_COMPRESSED_RG_RGTC2; - case image::CompressedData::FORMAT_BC5s: + case image::CompressedImageData::FORMAT_BC5s: return GL_COMPRESSED_SIGNED_RG_RGTC2; - case image::CompressedData::FORMAT_BC6H: - return GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_ARB; - case image::CompressedData::FORMAT_BC6Hs: - return GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_ARB; - case image::CompressedData::FORMAT_BC7: - if (srgb) - return GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_ARB; + case image::CompressedImageData::FORMAT_BC6H: + return GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT; + case image::CompressedImageData::FORMAT_BC6Hs: + return GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT; + case image::CompressedImageData::FORMAT_BC7: + if (flags.sRGB) + return GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM; else - return GL_COMPRESSED_RGBA_BPTC_UNORM_ARB; - case image::CompressedData::FORMAT_BC7SRGB: - return GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_ARB; - case image::CompressedData::FORMAT_ETC1: + return GL_COMPRESSED_RGBA_BPTC_UNORM; + case image::CompressedImageData::FORMAT_ETC1: // The ETC2 format can load ETC1 textures. - if (GLAD_VERSION_4_3 || GLAD_ES_VERSION_3_0 || GLAD_ARB_ES3_compatibility) + if (GLAD_ES_VERSION_3_0 || GLAD_VERSION_4_3 || GLAD_ARB_ES3_compatibility) return GL_COMPRESSED_RGB8_ETC2; else return GL_ETC1_RGB8_OES; - case image::CompressedData::FORMAT_PVR1_RGB2: - return GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG; - case image::CompressedData::FORMAT_PVR1_RGB4: - return GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG; - case image::CompressedData::FORMAT_PVR1_RGBA2: - return GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG; - case image::CompressedData::FORMAT_PVR1_RGBA4: - return GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG; - default: - if (srgb) - return GL_SRGB_ALPHA; + case image::CompressedImageData::FORMAT_ETC2_RGB: + if (flags.sRGB) + return GL_COMPRESSED_SRGB8_ETC2; else - return GL_RGBA; + return GL_COMPRESSED_RGB8_ETC2; + case image::CompressedImageData::FORMAT_ETC2_RGBA: + if (flags.sRGB) + return GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC; + else + return GL_COMPRESSED_RGBA8_ETC2_EAC; + case image::CompressedImageData::FORMAT_ETC2_RGBA1: + if (flags.sRGB) + return GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2; + else + return GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2; + case image::CompressedImageData::FORMAT_EAC_R: + return GL_COMPRESSED_R11_EAC; + case image::CompressedImageData::FORMAT_EAC_Rs: + return GL_COMPRESSED_SIGNED_R11_EAC; + case image::CompressedImageData::FORMAT_EAC_RG: + return GL_COMPRESSED_RG11_EAC; + case image::CompressedImageData::FORMAT_EAC_RGs: + return GL_COMPRESSED_SIGNED_RG11_EAC; + case image::CompressedImageData::FORMAT_PVR1_RGB2: + if (flags.sRGB) + return GL_COMPRESSED_SRGB_PVRTC_2BPPV1_EXT; + else + return GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG; + case image::CompressedImageData::FORMAT_PVR1_RGB4: + if (flags.sRGB) + return GL_COMPRESSED_SRGB_PVRTC_4BPPV1_EXT; + else + return GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG; + case image::CompressedImageData::FORMAT_PVR1_RGBA2: + if (flags.sRGB) + return GL_COMPRESSED_SRGB_ALPHA_PVRTC_2BPPV1_EXT; + else + return GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG; + case image::CompressedImageData::FORMAT_PVR1_RGBA4: + if (flags.sRGB) + return GL_COMPRESSED_SRGB_ALPHA_PVRTC_4BPPV1_EXT; + else + return GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG; + default: + if (flags.sRGB) + return GL_SRGB8_ALPHA8; + else + return GL_RGBA8; } } -bool Image::hasNpot() -{ - return GLAD_ES_VERSION_2_0 || GLAD_VERSION_2_0 || GLAD_ARB_texture_non_power_of_two; -} - bool Image::hasAnisotropicFilteringSupport() { - return GLAD_EXT_texture_filter_anisotropic; + return GLAD_EXT_texture_filter_anisotropic != GL_FALSE; } -bool Image::hasMipmapSupport() -{ - return GLAD_ES_VERSION_2_0 || GLAD_VERSION_1_4 || GLAD_SGIS_generate_mipmap; -} - -bool Image::hasMipmapSharpnessSupport() -{ - return GLAD_VERSION_1_4; -} - -bool Image::hasCompressedTextureSupport(image::CompressedData::Format format) +bool Image::hasCompressedTextureSupport(image::CompressedImageData::Format format, bool sRGB) { switch (format) { - case image::CompressedData::FORMAT_DXT1: + case image::CompressedImageData::FORMAT_DXT1: return GLAD_EXT_texture_compression_s3tc || GLAD_EXT_texture_compression_dxt1; - case image::CompressedData::FORMAT_DXT3: + case image::CompressedImageData::FORMAT_DXT3: return GLAD_EXT_texture_compression_s3tc || GLAD_ANGLE_texture_compression_dxt3; - case image::CompressedData::FORMAT_DXT5: + case image::CompressedImageData::FORMAT_DXT5: return GLAD_EXT_texture_compression_s3tc || GLAD_ANGLE_texture_compression_dxt5; - case image::CompressedData::FORMAT_BC4: - case image::CompressedData::FORMAT_BC4s: - case image::CompressedData::FORMAT_BC5: - case image::CompressedData::FORMAT_BC5s: + case image::CompressedImageData::FORMAT_BC4: + case image::CompressedImageData::FORMAT_BC4s: + case image::CompressedImageData::FORMAT_BC5: + case image::CompressedImageData::FORMAT_BC5s: return (GLAD_VERSION_3_0 || GLAD_ARB_texture_compression_rgtc || GLAD_EXT_texture_compression_rgtc); - case image::CompressedData::FORMAT_BC6H: - case image::CompressedData::FORMAT_BC6Hs: - case image::CompressedData::FORMAT_BC7: - case image::CompressedData::FORMAT_BC7SRGB: + case image::CompressedImageData::FORMAT_BC6H: + case image::CompressedImageData::FORMAT_BC6Hs: + case image::CompressedImageData::FORMAT_BC7: return GLAD_VERSION_4_2 || GLAD_ARB_texture_compression_bptc; - case image::CompressedData::FORMAT_ETC1: + case image::CompressedImageData::FORMAT_ETC1: // ETC2 support guarantees ETC1 support as well. - return GLAD_VERSION_4_3 || GLAD_ES_VERSION_3_0 || GLAD_ARB_ES3_compatibility || GLAD_OES_compressed_ETC1_RGB8_texture; - case image::CompressedData::FORMAT_PVR1_RGB2: - case image::CompressedData::FORMAT_PVR1_RGB4: - case image::CompressedData::FORMAT_PVR1_RGBA2: - case image::CompressedData::FORMAT_PVR1_RGBA4: - return GLAD_IMG_texture_compression_pvrtc; + return GLAD_ES_VERSION_3_0 || GLAD_VERSION_4_3 || GLAD_ARB_ES3_compatibility || GLAD_OES_compressed_ETC1_RGB8_texture; + case image::CompressedImageData::FORMAT_ETC2_RGB: + case image::CompressedImageData::FORMAT_ETC2_RGBA: + case image::CompressedImageData::FORMAT_ETC2_RGBA1: + case image::CompressedImageData::FORMAT_EAC_R: + case image::CompressedImageData::FORMAT_EAC_Rs: + case image::CompressedImageData::FORMAT_EAC_RG: + case image::CompressedImageData::FORMAT_EAC_RGs: + return GLAD_ES_VERSION_3_0 || GLAD_VERSION_4_3 || GLAD_ARB_ES3_compatibility; + case image::CompressedImageData::FORMAT_PVR1_RGB2: + case image::CompressedImageData::FORMAT_PVR1_RGB4: + case image::CompressedImageData::FORMAT_PVR1_RGBA2: + case image::CompressedImageData::FORMAT_PVR1_RGBA4: + if (sRGB) + return GLAD_EXT_pvrtc_sRGB; + else + return GLAD_IMG_texture_compression_pvrtc; default: return false; } @@ -757,26 +645,26 @@ bool Image::hasCompressedTextureSupport(image::CompressedData::Format format) bool Image::hasSRGBSupport() { - return GLAD_VERSION_2_1 || GLAD_EXT_texture_sRGB || GLAD_EXT_sRGB; + return GLAD_ES_VERSION_3_0 || GLAD_EXT_sRGB || GLAD_VERSION_2_1 || GLAD_EXT_texture_sRGB; } -bool Image::getConstant(const char *in, Format &out) +bool Image::getConstant(const char *in, FlagType &out) { - return formats.find(in, out); + return flagNames.find(in, out); } -bool Image::getConstant(Format in, const char *&out) +bool Image::getConstant(FlagType in, const char *&out) { - return formats.find(in, out); + return flagNames.find(in, out); } -StringMap::Entry Image::formatEntries[] = +StringMap::Entry Image::flagNameEntries[] = { - {"normal", Image::FORMAT_NORMAL}, - {"srgb", Image::FORMAT_SRGB}, + {"mipmaps", Image::FLAG_TYPE_MIPMAPS}, + {"srgb", Image::FLAG_TYPE_SRGB}, }; -StringMap Image::formats(Image::formatEntries, sizeof(Image::formatEntries)); +StringMap Image::flagNames(Image::flagNameEntries, sizeof(Image::flagNameEntries)); } // opengl } // graphics diff --git a/jni/love/src/modules/graphics/opengl/Image.h b/jni/love/src/modules/graphics/opengl/Image.h index 1728b3b7..65f8cfc1 100644 --- a/jni/love/src/modules/graphics/opengl/Image.h +++ b/jni/love/src/modules/graphics/opengl/Image.h @@ -28,8 +28,9 @@ #include "common/StringMap.h" #include "common/math.h" #include "image/ImageData.h" -#include "image/CompressedData.h" -#include "Texture.h" +#include "image/CompressedImageData.h" +#include "graphics/Texture.h" +#include "graphics/Volatile.h" // OpenGL #include "OpenGL.h" @@ -47,15 +48,21 @@ namespace opengl * * @author Anders Ruud **/ -class Image : public Texture +class Image : public Texture, public Volatile { public: - enum Format + enum FlagType { - FORMAT_NORMAL, - FORMAT_SRGB, - FORMAT_MAX_ENUM + FLAG_TYPE_MIPMAPS, + FLAG_TYPE_SRGB, + FLAG_TYPE_MAX_ENUM + }; + + struct Flags + { + bool mipmaps = false; + bool sRGB = false;; }; /** @@ -64,22 +71,20 @@ public: * * @param data The data from which to load the image. **/ - Image(love::image::ImageData *data, Format format = FORMAT_NORMAL); + Image(love::image::ImageData *data, const Flags &flags); /** * Creates a new Image with compressed image data. * * @param cdata The compressed data from which to load the image. **/ - Image(love::image::CompressedData *cdata, Format format = FORMAT_NORMAL); + Image(love::image::CompressedImageData *cdata, const Flags &flags); - /** - * Destructor. Deletes the hardware texture and other resources. - **/ virtual ~Image(); - love::image::ImageData *getImageData() const; - love::image::CompressedData *getCompressedData() const; + // Implements Volatile. + bool loadVolatile(); + void unloadVolatile(); /** * @copydoc Drawable::draw() @@ -91,15 +96,10 @@ public: **/ void drawq(Quad *quad, float x, float y, float angle, float sx, float sy, float ox, float oy, float kx, float ky); - /** - * Call before using this Image's texture to draw. Binds the texture, - * globally scales texture coordinates if the Image has NPOT dimensions and - * NPOT isn't supported, etc. - **/ - virtual void predraw(); - virtual void postdraw(); + virtual const void *getHandle() const; - virtual GLuint getGLTexture() const; + love::image::ImageData *getImageData() const; + love::image::CompressedImageData *getCompressedData() const; virtual void setFilter(const Texture::Filter &f); virtual bool setWrap(const Texture::Wrap &w); @@ -108,52 +108,44 @@ public: float getMipmapSharpness() const; /** - * Whether this Image is using a compressed texture (via CompressedData). + * Whether this Image is using a compressed texture (via CompressedImageData). **/ bool isCompressed() const; - void bind() const; - - bool load(); - void unload(); - - // Implements Volatile. - bool loadVolatile(); - void unloadVolatile(); - /** - * Re-uploads the ImageData or CompressedData associated with this Image to - * the GPU, allowing situations where lovers modify an ImageData after image - * creation from the ImageData, and apply the changes with Image:refresh(). + * Re-uploads the ImageData or CompressedImageData associated with this Image to + * the GPU. **/ - bool refresh(); + bool refresh(int xoffset, int yoffset, int w, int h); - Format getFormat() const; + const Flags &getFlags() const; static void setDefaultMipmapSharpness(float sharpness); static float getDefaultMipmapSharpness(); static void setDefaultMipmapFilter(FilterMode f); static FilterMode getDefaultMipmapFilter(); - static bool hasNpot(); static bool hasAnisotropicFilteringSupport(); - static bool hasMipmapSupport(); - static bool hasMipmapSharpnessSupport(); - - static bool hasCompressedTextureSupport(image::CompressedData::Format format); - + static bool hasCompressedTextureSupport(image::CompressedImageData::Format format, bool sRGB); static bool hasSRGBSupport(); - static bool getConstant(const char *in, Format &out); - static bool getConstant(Format in, const char *&out); + static bool getConstant(const char *in, FlagType &out); + static bool getConstant(FlagType in, const char *&out); static int imageCount; private: - void uploadDefaultTexture(); + void drawv(const Matrix4 &t, const Vertex *v); - void drawv(const Matrix &t, const Vertex *v); + void preload(); + + void generateMipmaps(); + void loadDefaultTexture(); + void loadFromCompressedData(); + void loadFromImageData(); + + GLenum getCompressedFormat(image::CompressedImageData::Format cformat) const; // The ImageData from which the texture is created. May be null if // Compressed image data was used to create the texture. @@ -161,10 +153,7 @@ private: // Or the Compressed Image Data from which the texture is created. May be // null if raw ImageData was used to create the texture. - StrongRef cdata; - - // Real dimensions of the texture, if it was auto-padded to POT size. - int paddedWidth, paddedHeight; + StrongRef cdata; // OpenGL texture identifier. GLuint texture; @@ -172,14 +161,11 @@ private: // Mipmap texture LOD bias (sharpness) value. float mipmapSharpness; - // True if mipmaps have been created for this Image. - bool mipmapsCreated; - // Whether this Image is using a compressed texture. bool compressed; - // The format to interpret the image's data as. - Format format; + // The flags used to initialize this Image. + Flags flags; // True if the image wasn't able to be properly created and it had to fall // back to a default texture. @@ -187,24 +173,13 @@ private: size_t textureMemorySize; - void preload(); - - void uploadTexturePadded(); - void uploadTexture(); - - void uploadCompressedMipmaps(); - void createMipmaps(); - void checkMipmapsCreated(); - static float maxMipmapSharpness; static FilterMode defaultMipmapFilter; static float defaultMipmapSharpness; - GLenum getCompressedFormat(image::CompressedData::Format cformat) const; - - static StringMap::Entry formatEntries[]; - static StringMap formats; + static StringMap::Entry flagNameEntries[]; + static StringMap flagNames; }; // Image diff --git a/jni/love/src/modules/graphics/opengl/Mesh.cpp b/jni/love/src/modules/graphics/opengl/Mesh.cpp index 7481320d..8b39b172 100644 --- a/jni/love/src/modules/graphics/opengl/Mesh.cpp +++ b/jni/love/src/modules/graphics/opengl/Mesh.cpp @@ -22,9 +22,11 @@ #include "Mesh.h" #include "common/Matrix.h" #include "common/Exception.h" +#include "Shader.h" // C++ #include +#include namespace love { @@ -33,130 +35,373 @@ namespace graphics namespace opengl { -Mesh::Mesh(const std::vector &verts, Mesh::DrawMode mode) - : vbo(nullptr) - , vertex_count(0) - , ibo(nullptr) - , element_count(0) - , element_data_type(getGLDataTypeFromMax(verts.size())) - , draw_mode(mode) - , range_min(-1) - , range_max(-1) - , texture(nullptr) - , colors_enabled(false) +static const char *getBuiltinAttribName(VertexAttribID attribid) { - setVertices(verts); + const char *name = ""; + Shader::getConstant(attribid, name); + return name; } -Mesh::Mesh(int vertexcount, Mesh::DrawMode mode) - : vbo(nullptr) - , vertex_count(0) - , ibo(nullptr) - , element_count(0) - , element_data_type(getGLDataTypeFromMax(vertexcount)) - , draw_mode(mode) - , range_min(-1) - , range_max(-1) - , texture(nullptr) - , colors_enabled(false) +static_assert(offsetof(Vertex, x) == sizeof(float) * 0, "Incorrect position offset in Vertex struct"); +static_assert(offsetof(Vertex, s) == sizeof(float) * 2, "Incorrect texture coordinate offset in Vertex struct"); +static_assert(offsetof(Vertex, r) == sizeof(float) * 4, "Incorrect color offset in Vertex struct"); + +static std::vector getDefaultVertexFormat() { - if (vertexcount < 1) - throw love::Exception("Invalid number of vertices."); + // Corresponds to the love::Vertex struct. + std::vector vertexformat = { + {getBuiltinAttribName(ATTRIB_POS), Mesh::DATA_FLOAT, 2}, + {getBuiltinAttribName(ATTRIB_TEXCOORD), Mesh::DATA_FLOAT, 2}, + {getBuiltinAttribName(ATTRIB_COLOR), Mesh::DATA_BYTE, 4}, + }; - std::vector verts(vertexcount); + return vertexformat; +} - // Default-initialized vertices should have a white opaque color. - for (size_t i = 0; i < verts.size(); i++) - { - verts[i].r = 255; - verts[i].g = 255; - verts[i].b = 255; - verts[i].a = 255; - } +Mesh::Mesh(const std::vector &vertexformat, const void *data, size_t datasize, DrawMode drawmode, Usage usage) + : vertexFormat(vertexformat) + , vbo(nullptr) + , vertexCount(0) + , vertexStride(0) + , vboUsedOffset(0) + , vboUsedSize(0) + , ibo(nullptr) + , elementCount(0) + , elementDataType(0) + , drawMode(drawmode) + , rangeMin(-1) + , rangeMax(-1) +{ + setupAttachedAttributes(); + calculateAttributeSizes(); - setVertices(verts); + vertexCount = datasize / vertexStride; + elementDataType = getGLDataTypeFromMax(vertexCount); + + if (vertexCount == 0) + throw love::Exception("Data size is too small for specified vertex attribute formats."); + + vbo = new GLBuffer(datasize, data, GL_ARRAY_BUFFER, getGLBufferUsage(usage)); + + vertexScratchBuffer = new char[vertexStride]; +} + +Mesh::Mesh(const std::vector &vertexformat, int vertexcount, DrawMode drawmode, Usage usage) + : vertexFormat(vertexformat) + , vbo(nullptr) + , vertexCount((size_t) vertexcount) + , vertexStride(0) + , vboUsedOffset(0) + , vboUsedSize(0) + , ibo(nullptr) + , elementCount(0) + , elementDataType(getGLDataTypeFromMax(vertexcount)) + , drawMode(drawmode) + , rangeMin(-1) + , rangeMax(-1) +{ + if (vertexcount <= 0) + throw love::Exception("Invalid number of vertices (%d).", vertexcount); + + setupAttachedAttributes(); + calculateAttributeSizes(); + + size_t buffersize = vertexCount * vertexStride; + + vbo = new GLBuffer(buffersize, nullptr, GL_ARRAY_BUFFER, getGLBufferUsage(usage)); + + // Initialize the buffer's contents to 0. + GLBuffer::Bind bind(*vbo); + memset(vbo->map(), 0, buffersize); + vbo->unmap(); + + vertexScratchBuffer = new char[vertexStride]; +} + +Mesh::Mesh(const std::vector &vertices, DrawMode drawmode, Usage usage) + : Mesh(getDefaultVertexFormat(), &vertices[0], vertices.size() * sizeof(Vertex), drawmode, usage) +{ +} + +Mesh::Mesh(int vertexcount, DrawMode drawmode, Usage usage) + : Mesh(getDefaultVertexFormat(), vertexcount, drawmode, usage) +{ } Mesh::~Mesh() { delete vbo; delete ibo; + delete vertexScratchBuffer; + + for (const auto &attrib : attachedAttributes) + { + if (attrib.second.mesh != this) + attrib.second.mesh->release(); + } } -void Mesh::setVertices(const std::vector &verts) +void Mesh::setupAttachedAttributes() { - if (verts.size() == 0) - throw love::Exception("At least one vertex is required."); - - size_t size = sizeof(Vertex) * verts.size(); - - if (vbo && size > vbo->getSize()) + for (size_t i = 0; i < vertexFormat.size(); i++) { - delete vbo; - vbo = nullptr; + const std::string &name = vertexFormat[i].name; + + if (attachedAttributes.find(name) != attachedAttributes.end()) + throw love::Exception("Duplicate vertex attribute name: %s", name.c_str()); + + attachedAttributes[name] = {this, i, true}; + } +} + +void Mesh::calculateAttributeSizes() +{ + size_t stride = 0; + + for (const AttribFormat &format : vertexFormat) + { + // Hardware really doesn't like attributes that aren't 32 bit-aligned. + if (format.type == DATA_BYTE && format.components != 4) + throw love::Exception("byte vertex attributes must have 4 components."); + + if (format.components <= 0 || format.components > 4) + throw love::Exception("Vertex attributes must have between 1 and 4 components."); + + // Total size in bytes of each attribute in a single vertex. + attributeSizes.push_back(getAttribFormatSize(format)); + stride += attributeSizes.back(); } - if (!vbo) + vertexStride = stride; +} + +size_t Mesh::getAttributeOffset(size_t attribindex) const +{ + size_t offset = 0; + + for (size_t i = 0; i < attribindex; i++) + offset += attributeSizes[i]; + + return offset; +} + +void Mesh::setVertex(size_t vertindex, const void *data, size_t datasize) +{ + if (vertindex >= vertexCount) + throw love::Exception("Invalid vertex index: %ld", vertindex + 1); + + size_t offset = vertindex * vertexStride; + size_t size = std::min(datasize, vertexStride); + + GLBuffer::Bind bind(*vbo); + uint8 *bufferdata = (uint8 *) vbo->map(); + + memcpy(bufferdata + offset, data, size); + + vboUsedOffset = std::min(vboUsedOffset, offset); + vboUsedSize = std::max(vboUsedSize, (offset + size) - vboUsedOffset); +} + +size_t Mesh::getVertex(size_t vertindex, void *data, size_t datasize) +{ + if (vertindex >= vertexCount) + throw love::Exception("Invalid vertex index: %ld", vertindex + 1); + + size_t offset = vertindex * vertexStride; + size_t size = std::min(datasize, vertexStride); + + // We're relying on vbo->map() returning read/write data... ew. + GLBuffer::Bind bind(*vbo); + const uint8 *bufferdata = (const uint8 *) vbo->map(); + + memcpy(data, bufferdata + offset, size); + + if (vboUsedSize == 0) { - // Full memory backing because we might access the data at any time. - vbo = VertexBuffer::Create(size, GL_ARRAY_BUFFER, GL_DYNAMIC_DRAW, VertexBuffer::BACKING_FULL); + vboUsedOffset = std::min(vboUsedOffset, offset); + vboUsedSize = std::max(vboUsedSize, (offset + size) - vboUsedOffset); } - vertex_count = verts.size(); - - VertexBuffer::Bind vbo_bind(*vbo); - VertexBuffer::Mapper vbo_mapper(*vbo); - - // Fill the buffer with the vertices. - memcpy(vbo_mapper.get(), &verts[0], size); + return size; } -const Vertex *Mesh::getVertices() const +void *Mesh::getVertexScratchBuffer() { - if (vbo) + return vertexScratchBuffer; +} + +void Mesh::setVertexAttribute(size_t vertindex, int attribindex, const void *data, size_t datasize) +{ + if (vertindex >= vertexCount) + throw love::Exception("Invalid vertex index: %ld", vertindex + 1); + + if (attribindex >= (int) vertexFormat.size()) + throw love::Exception("Invalid vertex attribute index: %d", attribindex + 1); + + size_t offset = vertindex * vertexStride + getAttributeOffset(attribindex); + size_t size = std::min(datasize, attributeSizes[attribindex]); + + GLBuffer::Bind bind(*vbo); + uint8 *bufferdata = (uint8 *) vbo->map(); + + memcpy(bufferdata + offset, data, size); + + vboUsedOffset = std::min(vboUsedOffset, offset); + vboUsedSize = std::max(vboUsedSize, (offset + size) - vboUsedOffset); +} + +size_t Mesh::getVertexAttribute(size_t vertindex, int attribindex, void *data, size_t datasize) +{ + if (vertindex >= vertexCount) + throw love::Exception("Invalid vertex index: %ld", vertindex + 1); + + if (attribindex >= (int) vertexFormat.size()) + throw love::Exception("Invalid vertex attribute index: %d", attribindex + 1); + + size_t offset = vertindex * vertexStride + getAttributeOffset(attribindex); + size_t size = std::min(datasize, attributeSizes[attribindex]); + + // We're relying on vbo->map() returning read/write data... ew. + GLBuffer::Bind bind(*vbo); + const uint8 *bufferdata = (const uint8 *) vbo->map(); + + memcpy(data, bufferdata + offset, size); + + if (vboUsedSize == 0) { - VertexBuffer::Bind vbo_bind(*vbo); - return (Vertex *) vbo->map(); + vboUsedOffset = std::min(vboUsedOffset, offset); + vboUsedSize = std::max(vboUsedSize, (offset + size) - vboUsedOffset); } - return nullptr; -} - -void Mesh::setVertex(size_t index, const Vertex &v) -{ - if (index >= vertex_count) - throw love::Exception("Invalid vertex index: %ld", index + 1); - - VertexBuffer::Bind vbo_bind(*vbo); - - // We unmap the vertex buffer in Mesh::draw. This lets us coalesce the - // buffer transfer calls into just one. - Vertex *vertices = (Vertex *) vbo->map(); - vertices[index] = v; -} - -Vertex Mesh::getVertex(size_t index) const -{ - if (index >= vertex_count) - throw love::Exception("Invalid vertex index: %ld", index + 1); - - VertexBuffer::Bind vbo_bind(*vbo); - - // We unmap the vertex buffer in Mesh::draw. - Vertex *vertices = (Vertex *) vbo->map(); - return vertices[index]; + return size; } size_t Mesh::getVertexCount() const { - return vertex_count; + return vertexCount; +} + +size_t Mesh::getVertexStride() const +{ + return vertexStride; +} + +const std::vector &Mesh::getVertexFormat() const +{ + return vertexFormat; +} + +Mesh::DataType Mesh::getAttributeInfo(int attribindex, int &components) const +{ + if (attribindex < 0 || attribindex >= (int) vertexFormat.size()) + throw love::Exception("Invalid vertex attribute index: %d", attribindex + 1); + + DataType type = vertexFormat[attribindex].type; + components = vertexFormat[attribindex].components; + return type; +} + +void Mesh::setAttributeEnabled(const std::string &name, bool enable) +{ + auto it = attachedAttributes.find(name); + + if (it == attachedAttributes.end()) + throw love::Exception("Mesh does not have an attached vertex attribute named '%s'", name.c_str()); + + it->second.enabled = enable; +} + +bool Mesh::isAttributeEnabled(const std::string &name) const +{ + const auto it = attachedAttributes.find(name); + + if (it == attachedAttributes.end()) + throw love::Exception("Mesh does not have an attached vertex attribute named '%s'", name.c_str()); + + return it->second.enabled; +} + +void Mesh::attachAttribute(const std::string &name, Mesh *mesh) +{ + if (mesh != this) + { + for (const auto &it : mesh->attachedAttributes) + { + // If the supplied Mesh has attached attributes of its own, then we + // prevent it from being attached to avoid reference cycles. + if (it.second.mesh != mesh) + throw love::Exception("Cannot attach a Mesh which has attached Meshes of its own."); + } + } + + AttachedAttribute oldattrib = {}; + AttachedAttribute newattrib = {}; + + auto it = attachedAttributes.find(name); + if (it != attachedAttributes.end()) + oldattrib = it->second; + + newattrib.mesh = mesh; + newattrib.index = std::numeric_limits::max(); + newattrib.enabled = oldattrib.mesh ? oldattrib.enabled : true; + + // Find the index of the attribute in the mesh. + for (size_t i = 0; i < mesh->vertexFormat.size(); i++) + { + if (mesh->vertexFormat[i].name == name) + { + newattrib.index = i; + break; + } + } + + if (newattrib.index == std::numeric_limits::max()) + throw love::Exception("The specified mesh does not have a vertex attribute named '%s'", name.c_str()); + + if (newattrib.mesh != this) + newattrib.mesh->retain(); + + attachedAttributes[name] = newattrib; + + if (oldattrib.mesh && oldattrib.mesh != this) + oldattrib.mesh->release(); +} + +void *Mesh::mapVertexData() +{ + GLBuffer::Bind bind(*vbo); + return vbo->map(); +} + +void Mesh::unmapVertexData() +{ + // Assume the whole buffer was modified. + GLBuffer::Bind bind(*vbo); + vbo->unmap(); + + vboUsedOffset = vboUsedSize = 0; +} + +void Mesh::flush() +{ + { + GLBuffer::Bind vbobind(*vbo); + vbo->unmap(vboUsedOffset, vboUsedSize); + vboUsedOffset = vboUsedSize = 0; + } + + if (ibo != nullptr) + { + GLBuffer::Bind ibobind(*ibo); + ibo->unmap(); + } } /** * Copies index data from a vector to a mapped index buffer. **/ template -static void copyToIndexBuffer(const std::vector &indices, VertexBuffer::Mapper &buffermap, size_t maxval) +static void copyToIndexBuffer(const std::vector &indices, GLBuffer::Mapper &buffermap, size_t maxval) { T *elems = (T *) buffermap.get(); @@ -171,7 +416,9 @@ static void copyToIndexBuffer(const std::vector &indices, VertexBuffer:: void Mesh::setVertexMap(const std::vector &map) { - GLenum datatype = getGLDataTypeFromMax(vertex_count); + size_t maxval = getVertexCount(); + + GLenum datatype = getGLDataTypeFromMax(maxval); // Calculate the size in bytes of the index buffer data. size_t size = map.size() * getGLDataTypeSize(datatype); @@ -183,35 +430,29 @@ void Mesh::setVertexMap(const std::vector &map) } if (!ibo && size > 0) - { - // Full memory backing because we might access the data at any time. - ibo = VertexBuffer::Create(size, GL_ELEMENT_ARRAY_BUFFER, GL_DYNAMIC_DRAW, VertexBuffer::BACKING_FULL); - } + ibo = new GLBuffer(size, nullptr, GL_ELEMENT_ARRAY_BUFFER, vbo->getUsage()); - element_count = map.size(); + elementCount = map.size(); - if (!ibo || element_count == 0) + if (!ibo || elementCount == 0) return; - VertexBuffer::Bind ibo_bind(*ibo); - VertexBuffer::Mapper ibo_map(*ibo); + GLBuffer::Bind ibobind(*ibo); + GLBuffer::Mapper ibomap(*ibo); // Fill the buffer with the index values from the vector. switch (datatype) { - case GL_UNSIGNED_BYTE: - copyToIndexBuffer(map, ibo_map, vertex_count); - break; case GL_UNSIGNED_SHORT: - copyToIndexBuffer(map, ibo_map, vertex_count); + copyToIndexBuffer(map, ibomap, maxval); break; case GL_UNSIGNED_INT: default: - copyToIndexBuffer(map, ibo_map, vertex_count); + copyToIndexBuffer(map, ibomap, maxval); break; } - element_data_type = datatype; + elementDataType = datatype; } /** @@ -227,36 +468,33 @@ static void copyFromIndexBuffer(void *buffer, size_t count, std::vector void Mesh::getVertexMap(std::vector &map) const { - if (!ibo || element_count == 0) + if (!ibo || elementCount == 0) return; map.clear(); - map.reserve(element_count); + map.reserve(elementCount); - VertexBuffer::Bind ibo_bind(*ibo); + GLBuffer::Bind ibobind(*ibo); - // We unmap the buffer in Mesh::draw and Mesh::setVertexMap. + // We unmap the buffer in Mesh::draw, Mesh::setVertexMap, and Mesh::flush. void *buffer = ibo->map(); // Fill the vector from the buffer. - switch (element_data_type) + switch (elementDataType) { - case GL_UNSIGNED_BYTE: - copyFromIndexBuffer(buffer, element_count, map); - break; case GL_UNSIGNED_SHORT: - copyFromIndexBuffer(buffer, element_count, map); + copyFromIndexBuffer(buffer, elementCount, map); break; case GL_UNSIGNED_INT: default: - copyFromIndexBuffer(buffer, element_count, map); + copyFromIndexBuffer(buffer, elementCount, map); break; } } size_t Mesh::getVertexMapCount() const { - return element_count; + return elementCount; } void Mesh::setTexture(Texture *tex) @@ -274,14 +512,14 @@ Texture *Mesh::getTexture() const return texture.get(); } -void Mesh::setDrawMode(Mesh::DrawMode mode) +void Mesh::setDrawMode(DrawMode mode) { - draw_mode = mode; + drawMode = mode; } Mesh::DrawMode Mesh::getDrawMode() const { - return draw_mode; + return drawMode; } void Mesh::setDrawRange(int min, int max) @@ -289,139 +527,165 @@ void Mesh::setDrawRange(int min, int max) if (min < 0 || max < 0 || min > max) throw love::Exception("Invalid draw range."); - range_min = min; - range_max = max; + rangeMin = min; + rangeMax = max; } void Mesh::setDrawRange() { - range_min = range_max = -1; + rangeMin = rangeMax = -1; } void Mesh::getDrawRange(int &min, int &max) const { - min = range_min; - max = range_max; -} - -void Mesh::setVertexColors(bool enable) -{ - colors_enabled = enable; -} - -bool Mesh::hasVertexColors() const -{ - return colors_enabled; + min = rangeMin; + max = rangeMax; } void Mesh::draw(float x, float y, float angle, float sx, float sy, float ox, float oy, float kx, float ky) { - const size_t pos_offset = offsetof(Vertex, x); - const size_t tex_offset = offsetof(Vertex, s); - const size_t color_offset = offsetof(Vertex, r); + OpenGL::TempDebugGroup debuggroup("Mesh draw"); - if (vertex_count == 0) - return; + uint32 enabledattribs = 0; + + for (const auto &attrib : attachedAttributes) + { + if (!attrib.second.enabled) + continue; + + Mesh *mesh = attrib.second.mesh; + const AttribFormat &format = mesh->vertexFormat[attrib.second.index]; + + GLint attriblocation = -1; + + // If the attribute is one of the LOVE-defined ones, use the constant + // attribute index for it, otherwise query the index from the shader. + VertexAttribID builtinattrib; + if (Shader::getConstant(format.name.c_str(), builtinattrib)) + attriblocation = (GLint) builtinattrib; + else if (Shader::current) + attriblocation = Shader::current->getAttribLocation(format.name); + + // The active shader might not use this vertex attribute name. + if (attriblocation < 0) + continue; + + // Needed for unmap and glVertexAttribPointer. + GLBuffer::Bind vbobind(*mesh->vbo); + + // Make sure the buffer isn't mapped (sends data to GPU if needed.) + mesh->vbo->unmap(mesh->vboUsedOffset, mesh->vboUsedSize); + mesh->vboUsedOffset = mesh->vboUsedSize = 0; + + size_t offset = mesh->getAttributeOffset(attrib.second.index); + const void *gloffset = mesh->vbo->getPointer(offset); + GLenum datatype = getGLDataType(format.type); + GLboolean normalized = (datatype == GL_UNSIGNED_BYTE); + + glVertexAttribPointer(attriblocation, format.components, datatype, normalized, mesh->vertexStride, gloffset); + + enabledattribs |= 1 << uint32(attriblocation); + } + + if (!(enabledattribs & ATTRIBFLAG_POS)) + { + // Not supported on all platforms or GL versions at least, I believe. + throw love::Exception("Mesh must have an enabled VertexPosition attribute to be drawn."); + } + + gl.useVertexAttribArrays(enabledattribs); if (texture.get()) - texture->predraw(); + gl.bindTexture(*(GLuint *) texture->getHandle()); else gl.bindTexture(gl.getDefaultTexture()); - Matrix m; - m.setTransformation(x, y, angle, sx, sy, ox, oy, kx, ky); + Matrix4 m(x, y, angle, sx, sy, ox, oy, kx, ky); OpenGL::TempTransform transform(gl); transform.get() *= m; - VertexBuffer::Bind vbo_bind(*vbo); - - // Make sure the VBO isn't mapped when we draw (sends data to GPU if needed.) - vbo->unmap(); - - gl.enableVertexAttribArray(OpenGL::ATTRIB_POS); - gl.enableVertexAttribArray(OpenGL::ATTRIB_TEXCOORD); - - gl.setVertexAttribArray(OpenGL::ATTRIB_POS, 2, GL_FLOAT, sizeof(Vertex), vbo->getPointer(pos_offset)); - gl.setVertexAttribArray(OpenGL::ATTRIB_TEXCOORD, 2, GL_FLOAT, sizeof(Vertex), vbo->getPointer(tex_offset)); - - if (hasVertexColors()) - { - // Per-vertex colors. - gl.enableVertexAttribArray(OpenGL::ATTRIB_COLOR); - gl.setVertexAttribArray(OpenGL::ATTRIB_COLOR, 4, GL_UNSIGNED_BYTE, sizeof(Vertex), vbo->getPointer(color_offset)); - } - - GLenum mode = getGLDrawMode(draw_mode); - gl.prepareDraw(); - if (ibo && element_count > 0) + if (ibo && elementCount > 0) { // Use the custom vertex map (index buffer) to draw the vertices. - VertexBuffer::Bind ibo_bind(*ibo); + GLBuffer::Bind ibo_bind(*ibo); // Make sure the index buffer isn't mapped (sends data to GPU if needed.) ibo->unmap(); - int max = element_count - 1; - if (range_max >= 0) - max = std::min(range_max, max); + int max = (int) elementCount - 1; + if (rangeMax >= 0) + max = std::min(rangeMax, max); int min = 0; - if (range_min >= 0) - min = std::min(range_min, max); + if (rangeMin >= 0) + min = std::min(rangeMin, max); - GLenum type = element_data_type; + GLenum type = elementDataType; const void *indices = ibo->getPointer(min * getGLDataTypeSize(type)); - gl.drawElements(mode, max - min + 1, type, indices); + gl.drawElements(getGLDrawMode(drawMode), max - min + 1, type, indices); } else { - int max = vertex_count - 1; - if (range_max >= 0) - max = std::min(range_max, max); + int max = (int) vertexCount - 1; + if (rangeMax >= 0) + max = std::min(rangeMax, max); int min = 0; - if (range_min >= 0) - min = std::min(range_min, max); + if (rangeMin >= 0) + min = std::min(rangeMin, max); // Normal non-indexed drawing (no custom vertex map.) - gl.drawArrays(mode, min, max - min + 1); + gl.drawArrays(getGLDrawMode(drawMode), min, max - min + 1); } - - gl.disableVertexAttribArray(OpenGL::ATTRIB_POS); - gl.disableVertexAttribArray(OpenGL::ATTRIB_TEXCOORD); - - if (hasVertexColors()) - { - gl.disableVertexAttribArray(OpenGL::ATTRIB_COLOR); - // Using the color array leaves the GL constant color undefined. - gl.setColor(gl.getColor()); - } - - if (texture.get()) - texture->postdraw(); } -GLenum Mesh::getGLDrawMode(DrawMode mode) const +size_t Mesh::getAttribFormatSize(const AttribFormat &format) +{ + switch (format.type) + { + case DATA_BYTE: + return format.components * sizeof(uint8); + case DATA_FLOAT: + return format.components * sizeof(float); + default: + return 0; + } +} + +GLenum Mesh::getGLDrawMode(DrawMode mode) { switch (mode) { - case DRAW_MODE_FAN: + case DRAWMODE_FAN: return GL_TRIANGLE_FAN; - case DRAW_MODE_STRIP: + case DRAWMODE_STRIP: return GL_TRIANGLE_STRIP; - case DRAW_MODE_TRIANGLES: + case DRAWMODE_TRIANGLES: default: return GL_TRIANGLES; - case DRAW_MODE_POINTS: + case DRAWMODE_POINTS: return GL_POINTS; } } -GLenum Mesh::getGLDataTypeFromMax(size_t maxvalue) const +GLenum Mesh::getGLDataType(DataType type) +{ + switch (type) + { + case DATA_BYTE: + return GL_UNSIGNED_BYTE; + case DATA_FLOAT: + return GL_FLOAT; + default: + return 0; + } +} + +GLenum Mesh::getGLDataTypeFromMax(size_t maxvalue) { if (maxvalue > LOVE_UINT16_MAX) return GL_UNSIGNED_INT; @@ -429,7 +693,7 @@ GLenum Mesh::getGLDataTypeFromMax(size_t maxvalue) const return GL_UNSIGNED_SHORT; } -size_t Mesh::getGLDataTypeSize(GLenum datatype) const +size_t Mesh::getGLDataTypeSize(GLenum datatype) { switch (datatype) { @@ -444,6 +708,31 @@ size_t Mesh::getGLDataTypeSize(GLenum datatype) const } } +GLenum Mesh::getGLBufferUsage(Usage usage) +{ + switch (usage) + { + case USAGE_STREAM: + return GL_STREAM_DRAW; + case USAGE_DYNAMIC: + return GL_DYNAMIC_DRAW; + case USAGE_STATIC: + return GL_STATIC_DRAW; + default: + return 0; + } +} + +bool Mesh::getConstant(const char *in, Usage &out) +{ + return usages.find(in, out); +} + +bool Mesh::getConstant(Usage in, const char *&out) +{ + return usages.find(in, out); +} + bool Mesh::getConstant(const char *in, Mesh::DrawMode &out) { return drawModes.find(in, out); @@ -454,15 +743,42 @@ bool Mesh::getConstant(Mesh::DrawMode in, const char *&out) return drawModes.find(in, out); } -StringMap::Entry Mesh::drawModeEntries[] = +bool Mesh::getConstant(const char *in, DataType &out) { - {"fan", Mesh::DRAW_MODE_FAN}, - {"strip", Mesh::DRAW_MODE_STRIP}, - {"triangles", Mesh::DRAW_MODE_TRIANGLES}, - {"points", Mesh::DRAW_MODE_POINTS}, + return dataTypes.find(in, out); +} + +bool Mesh::getConstant(DataType in, const char *&out) +{ + return dataTypes.find(in, out); +} + +StringMap::Entry Mesh::usageEntries[] = +{ + {"stream", USAGE_STREAM}, + {"dynamic", USAGE_DYNAMIC}, + {"static", USAGE_STATIC}, }; -StringMap Mesh::drawModes(Mesh::drawModeEntries, sizeof(Mesh::drawModeEntries)); +StringMap Mesh::usages(Mesh::usageEntries, sizeof(Mesh::usageEntries)); + +StringMap::Entry Mesh::drawModeEntries[] = +{ + {"fan", DRAWMODE_FAN}, + {"strip", DRAWMODE_STRIP}, + {"triangles", DRAWMODE_TRIANGLES}, + {"points", DRAWMODE_POINTS}, +}; + +StringMap Mesh::drawModes(Mesh::drawModeEntries, sizeof(Mesh::drawModeEntries)); + +StringMap::Entry Mesh::dataTypeEntries[] = +{ + {"byte", DATA_BYTE}, + {"float", DATA_FLOAT}, +}; + +StringMap Mesh::dataTypes(Mesh::dataTypeEntries, sizeof(Mesh::dataTypeEntries)); } // opengl } // graphics diff --git a/jni/love/src/modules/graphics/opengl/Mesh.h b/jni/love/src/modules/graphics/opengl/Mesh.h index 7791f6c1..ab608ea1 100644 --- a/jni/love/src/modules/graphics/opengl/Mesh.h +++ b/jni/love/src/modules/graphics/opengl/Mesh.h @@ -27,11 +27,12 @@ #include "common/math.h" #include "common/StringMap.h" #include "graphics/Drawable.h" -#include "Texture.h" -#include "VertexBuffer.h" +#include "graphics/Texture.h" +#include "GLBuffer.h" // C++ #include +#include namespace love { @@ -42,64 +43,110 @@ namespace opengl /** * Holds and draws arbitrary vertex geometry. - * Each vertex in the Mesh has a position, texture coordinate, and color. + * Each vertex in the Mesh has a collection of vertex attributes specified on + * creation. **/ class Mesh : public Drawable { public: + // The expected usage pattern of the Mesh's vertex data. + enum Usage + { + USAGE_STREAM, + USAGE_DYNAMIC, + USAGE_STATIC, + USAGE_MAX_ENUM + }; + // How the Mesh's vertices are used when drawing. // http://escience.anu.edu.au/lecture/cg/surfaceModeling/image/surfaceModeling015.png enum DrawMode { - DRAW_MODE_FAN, - DRAW_MODE_STRIP, - DRAW_MODE_TRIANGLES, - DRAW_MODE_POINTS, - DRAW_MODE_MAX_ENUM + DRAWMODE_FAN, + DRAWMODE_STRIP, + DRAWMODE_TRIANGLES, + DRAWMODE_POINTS, + DRAWMODE_MAX_ENUM }; - /** - * Constructor. - * @param verts The vertices to use in the Mesh. - * @param mode The draw mode to use when drawing the Mesh. - **/ - Mesh(const std::vector &verts, DrawMode mode = DRAW_MODE_FAN); + // The type of data a vertex attribute can store. + enum DataType + { + DATA_BYTE, + DATA_FLOAT, + DATA_MAX_ENUM + }; - /** - * Constructor. - * Creates a Mesh with a certain number of default-initialized (hidden) - * vertices. - * @param vertexcount The number of vertices to use in the Mesh. - * @param mode The draw mode to use when drawing the Mesh. - **/ - Mesh(int vertexcount, DrawMode mode = DRAW_MODE_FAN); + struct AttribFormat + { + std::string name; + DataType type; + int components; // max 4 + }; + + Mesh(const std::vector &vertexformat, const void *data, size_t datasize, DrawMode drawmode, Usage usage); + Mesh(const std::vector &vertexformat, int vertexcount, DrawMode drawmode, Usage usage); + + Mesh(const std::vector &vertices, DrawMode drawmode, Usage usage); + Mesh(int vertexcount, DrawMode drawmode, Usage usage); virtual ~Mesh(); /** - * Replaces all the vertices in the Mesh with a new set of vertices. + * Sets the values of all attributes at a specific vertex index in the Mesh. + * The size of the data must be less than or equal to the total size of all + * vertex attributes. **/ - void setVertices(const std::vector &verts); + void setVertex(size_t vertindex, const void *data, size_t datasize); + size_t getVertex(size_t vertindex, void *data, size_t datasize); + void *getVertexScratchBuffer(); /** - * Gets all of the vertices in the Mesh as an array. + * Sets the values for a single attribute at a specific vertex index in the + * Mesh. The size of the data must be less than or equal to the size of the + * attribute. **/ - const Vertex *getVertices() const; + void setVertexAttribute(size_t vertindex, int attribindex, const void *data, size_t datasize); + size_t getVertexAttribute(size_t vertindex, int attribindex, void *data, size_t datasize); /** - * Sets an individual vertex in the Mesh. - * @param index The index into the list of vertices to use. - * @param v The new vertex. - **/ - void setVertex(size_t index, const Vertex &v); - Vertex getVertex(size_t index) const; - - /** - * Gets the total number of vertices in the Mesh. + * Gets the total number of vertices that can be used when drawing the Mesh. **/ size_t getVertexCount() const; + /** + * Gets the size in bytes of the start of one vertex to the start of the + * next, in the buffer. + **/ + size_t getVertexStride() const; + + /** + * Gets the format of each vertex attribute stored in the Mesh. + **/ + const std::vector &getVertexFormat() const; + DataType getAttributeInfo(int attribindex, int &components) const; + + /** + * Sets whether a specific vertex attribute is used when drawing the Mesh. + **/ + void setAttributeEnabled(const std::string &name, bool enable); + bool isAttributeEnabled(const std::string &name) const; + + /** + * Attaches a vertex attribute from another Mesh to this one. The attribute + * will be used when drawing this Mesh. + **/ + void attachAttribute(const std::string &name, Mesh *mesh); + + void *mapVertexData(); + void unmapVertexData(); + + /** + * Flushes all modified data to the GPU. + **/ + void flush(); + /** * Sets the vertex map to use when drawing the Mesh. The vertex map * determines the order in which vertices are used by the draw mode. @@ -145,46 +192,79 @@ public: void setDrawRange(); void getDrawRange(int &min, int &max) const; - /** - * Sets whether per-vertex colors are enabled. If this is disabled, the - * global color (love.graphics.setColor) will be used for the entire Mesh. - **/ - void setVertexColors(bool enable); - bool hasVertexColors() const; - // Implements Drawable. - void draw(float x, float y, float angle, float sx, float sy, float ox, float oy, float kx, float ky); + void draw(float x, float y, float angle, float sx, float sy, float ox, float oy, float kx, float ky) override; + + static GLenum getGLBufferUsage(Usage usage); + + static bool getConstant(const char *in, Usage &out); + static bool getConstant(Usage in, const char *&out); static bool getConstant(const char *in, DrawMode &out); static bool getConstant(DrawMode in, const char *&out); + static bool getConstant(const char *in, DataType &out); + static bool getConstant(DataType in, const char *&out); + private: - GLenum getGLDrawMode(DrawMode mode) const; - GLenum getGLDataTypeFromMax(size_t maxvalue) const; - size_t getGLDataTypeSize(GLenum datatype) const; + struct AttachedAttribute + { + Mesh *mesh; + size_t index; + bool enabled; + }; - // Vertex buffer. - VertexBuffer *vbo; - size_t vertex_count; + void setupAttachedAttributes(); + void calculateAttributeSizes(); + size_t getAttributeOffset(size_t attribindex) const; + + static size_t getAttribFormatSize(const AttribFormat &format); + + static GLenum getGLDrawMode(DrawMode mode); + static GLenum getGLDataType(DataType type); + static GLenum getGLDataTypeFromMax(size_t maxvalue); + static size_t getGLDataTypeSize(GLenum datatype); + + std::vector vertexFormat; + std::vector attributeSizes; + + std::unordered_map attachedAttributes; + + // Vertex buffer, for the vertex data. + GLBuffer *vbo; + size_t vertexCount; + size_t vertexStride; + + // Block of memory whose size is at least as large as a single vertex. Helps + // avoid memory allocations when using Mesh::setVertex etc. + char *vertexScratchBuffer; + + // Tracks the range of the vertex buffer that has been used, to make unmap() + // calls as efficient as possible. + size_t vboUsedOffset; + size_t vboUsedSize; // Element (vertex index) buffer, for the vertex map. - VertexBuffer *ibo; - size_t element_count; - GLenum element_data_type; + GLBuffer *ibo; + size_t elementCount; + GLenum elementDataType; - DrawMode draw_mode; + DrawMode drawMode; - int range_min; - int range_max; + int rangeMin; + int rangeMax; StrongRef texture; - // Whether the per-vertex colors are used when drawing. - bool colors_enabled; + static StringMap::Entry usageEntries[]; + static StringMap usages; - static StringMap::Entry drawModeEntries[]; - static StringMap drawModes; + static StringMap::Entry drawModeEntries[]; + static StringMap drawModes; + + static StringMap::Entry dataTypeEntries[]; + static StringMap dataTypes; }; // Mesh diff --git a/jni/love/src/modules/graphics/opengl/OpenGL.cpp b/jni/love/src/modules/graphics/opengl/OpenGL.cpp index 3539f855..a6d7d2aa 100644 --- a/jni/love/src/modules/graphics/opengl/OpenGL.cpp +++ b/jni/love/src/modules/graphics/opengl/OpenGL.cpp @@ -33,6 +33,13 @@ // C #include +// For SDL_GL_GetProcAddress. +#include + +#ifdef LOVE_IOS +#include +#endif + namespace love { namespace graphics @@ -45,7 +52,9 @@ OpenGL::OpenGL() , contextInitialized(false) , maxAnisotropy(1.0f) , maxTextureSize(0) - , maxRenderTargets(0) + , maxRenderTargets(1) + , maxRenderbufferSamples(0) + , maxTextureUnits(1) , vendor(VENDOR_UNKNOWN) , state() { @@ -58,30 +67,33 @@ bool OpenGL::initContext() if (contextInitialized) return true; - if (!gladLoadGL()) + if (!gladLoadGLLoader(SDL_GL_GetProcAddress)) return false; initOpenGLFunctions(); initVendor(); initMatrices(); - // Store the current color so we don't have to get it through GL later. - GLfloat glcolor[4]; - if (GLAD_ES_VERSION_2_0) - glGetVertexAttribfv(GLuint(ATTRIB_COLOR), GL_CURRENT_VERTEX_ATTRIB, glcolor); - else - glGetFloatv(GL_CURRENT_COLOR, glcolor); - state.color.r = glcolor[0] * 255; - state.color.g = glcolor[1] * 255; - state.color.b = glcolor[2] * 255; - state.color.a = glcolor[3] * 255; + contextInitialized = true; - // Same with the current clear color. - glGetFloatv(GL_COLOR_CLEAR_VALUE, glcolor); - state.clearColor.r = glcolor[0] * 255; - state.clearColor.g = glcolor[1] * 255; - state.clearColor.b = glcolor[2] * 255; - state.clearColor.a = glcolor[3] * 255; + return true; +} + +void OpenGL::setupContext() +{ + if (!contextInitialized) + return; + + initMaxValues(); + + GLfloat glcolor[4] = {1.0f, 1.0f, 1.0f, 1.0f}; + glVertexAttrib4fv(ATTRIB_COLOR, glcolor); + glVertexAttrib4fv(ATTRIB_CONSTANTCOLOR, glcolor); + + GLint maxvertexattribs = 1; + glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &maxvertexattribs); + state.enabledAttribArrays = (uint32) ((1ull << uint32(maxvertexattribs)) - 1); + useVertexAttribArrays(0); // Get the current viewport. glGetIntegerv(GL_VIEWPORT, (GLint *) &state.viewport.x); @@ -96,45 +108,32 @@ bool OpenGL::initContext() else state.pointSize = 1.0f; - // Initialize multiple texture unit support for shaders, if available. - state.textureUnits.clear(); - if (Shader::isSupported()) + if (GLAD_VERSION_3_0 || GLAD_ARB_framebuffer_sRGB || GLAD_EXT_framebuffer_sRGB + || GLAD_EXT_sRGB_write_control) { - GLint maxtextureunits; - glGetIntegerv(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, &maxtextureunits); - - state.textureUnits.resize(maxtextureunits, 0); - - GLenum curgltextureunit; - glGetIntegerv(GL_ACTIVE_TEXTURE, (GLint *) &curgltextureunit); - - state.curTextureUnit = (int) curgltextureunit - GL_TEXTURE0; - - // Retrieve currently bound textures for each texture unit. - for (size_t i = 0; i < state.textureUnits.size(); i++) - { - glActiveTexture(GL_TEXTURE0 + i); - glGetIntegerv(GL_TEXTURE_BINDING_2D, (GLint *) &state.textureUnits[i]); - } - - glActiveTexture(curgltextureunit); + state.framebufferSRGBEnabled = (glIsEnabled(GL_FRAMEBUFFER_SRGB) == GL_TRUE); } else + state.framebufferSRGBEnabled = false; + + // Initialize multiple texture unit support for shaders. + state.boundTextures.clear(); + state.boundTextures.resize(maxTextureUnits, 0); + + GLenum curgltextureunit; + glGetIntegerv(GL_ACTIVE_TEXTURE, (GLint *) &curgltextureunit); + + state.curTextureUnit = (int) curgltextureunit - GL_TEXTURE0; + + // Retrieve currently bound textures for each texture unit. + for (int i = 0; i < (int) state.boundTextures.size(); i++) { - // Multitexturing not supported, so we only have 1 texture unit. - state.textureUnits.resize(1, 0); - state.curTextureUnit = 0; - glGetIntegerv(GL_TEXTURE_BINDING_2D, (GLint *) &state.textureUnits[0]); + glActiveTexture(GL_TEXTURE0 + i); + glGetIntegerv(GL_TEXTURE_BINDING_2D, (GLint *) &state.boundTextures[i]); } - // This will be non-zero on some platforms. - if (Canvas::isSupported()) - glGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, (GLint *) &state.defaultFBO); + glActiveTexture(curgltextureunit); - BlendState blend = {GL_ONE, GL_ONE, GL_ZERO, GL_ZERO, GL_FUNC_ADD}; - setBlendState(blend); - - initMaxValues(); createDefaultTexture(); // Invalidate the cached matrices by setting some elements to NaN. @@ -142,11 +141,10 @@ bool OpenGL::initContext() state.lastProjectionMatrix.setTranslation(nan, nan); state.lastTransformMatrix.setTranslation(nan, nan); - if (GLAD_VERSION_1_1) + if (GLAD_VERSION_1_0) glMatrixMode(GL_MODELVIEW); contextInitialized = true; - return true; } void OpenGL::deInitContext() @@ -172,14 +170,14 @@ void OpenGL::initVendor() // http://feedback.wildfiregames.com/report/opengl/feature/GL_VENDOR // http://stackoverflow.com/questions/2093594/opengl-extensions-available-on-different-android-devices if (strstr(vstr, "ATI Technologies")) - vendor = VENDOR_ATI_AMD; + vendor = VENDOR_AMD; else if (strstr(vstr, "NVIDIA")) vendor = VENDOR_NVIDIA; else if (strstr(vstr, "Intel")) vendor = VENDOR_INTEL; else if (strstr(vstr, "Mesa")) vendor = VENDOR_MESA_SOFT; - else if (strstr(vstr, "Apple Computer")) + else if (strstr(vstr, "Apple Computer") || strstr(vstr, "Apple Inc.")) vendor = VENDOR_APPLE; else if (strstr(vstr, "Microsoft")) vendor = VENDOR_MICROSOFT; @@ -199,22 +197,42 @@ void OpenGL::initVendor() void OpenGL::initOpenGLFunctions() { - // The functionality of the core and ARB VBOs are identical, so we can - // assign the pointers of the ARB functions to the names of the core - // functions, if the latter isn't supported but the former is. - if (GLAD_ARB_vertex_buffer_object && !GLAD_VERSION_1_5) + // Alias extension-suffixed framebuffer functions to core versions since + // there are so many different-named extensions that do the same things... + if (!(GLAD_ES_VERSION_3_0 || GLAD_VERSION_3_0 || GLAD_ARB_framebuffer_object)) { - fp_glBindBuffer = (pfn_glBindBuffer) fp_glBindBufferARB; - fp_glBufferData = (pfn_glBufferData) fp_glBufferDataARB; - fp_glBufferSubData = (pfn_glBufferSubData) fp_glBufferSubDataARB; - fp_glDeleteBuffers = (pfn_glDeleteBuffers) fp_glDeleteBuffersARB; - fp_glGenBuffers = (pfn_glGenBuffers) fp_glGenBuffersARB; - fp_glGetBufferParameteriv = (pfn_glGetBufferParameteriv) fp_glGetBufferParameterivARB; - fp_glGetBufferPointerv = (pfn_glGetBufferPointerv) fp_glGetBufferPointervARB; - fp_glGetBufferSubData = (pfn_glGetBufferSubData) fp_glGetBufferSubDataARB; - fp_glIsBuffer = (pfn_glIsBuffer) fp_glIsBufferARB; - fp_glMapBuffer = (pfn_glMapBuffer) fp_glMapBufferARB; - fp_glUnmapBuffer = (pfn_glUnmapBuffer) fp_glUnmapBufferARB; + if (GLAD_VERSION_1_0 && GLAD_EXT_framebuffer_object) + { + fp_glBindRenderbuffer = fp_glBindRenderbufferEXT; + fp_glDeleteRenderbuffers = fp_glDeleteRenderbuffersEXT; + fp_glGenRenderbuffers = fp_glGenRenderbuffersEXT; + fp_glRenderbufferStorage = fp_glRenderbufferStorageEXT; + fp_glGetRenderbufferParameteriv = fp_glGetRenderbufferParameterivEXT; + fp_glBindFramebuffer = fp_glBindFramebufferEXT; + fp_glDeleteFramebuffers = fp_glDeleteFramebuffersEXT; + fp_glGenFramebuffers = fp_glGenFramebuffersEXT; + fp_glCheckFramebufferStatus = fp_glCheckFramebufferStatusEXT; + fp_glFramebufferTexture2D = fp_glFramebufferTexture2DEXT; + fp_glFramebufferRenderbuffer = fp_glFramebufferRenderbufferEXT; + fp_glGetFramebufferAttachmentParameteriv = fp_glGetFramebufferAttachmentParameterivEXT; + fp_glGenerateMipmap = fp_glGenerateMipmapEXT; + } + + if (GLAD_EXT_framebuffer_blit) + fp_glBlitFramebuffer = fp_glBlitFramebufferEXT; + else if (GLAD_ANGLE_framebuffer_blit) + fp_glBlitFramebuffer = fp_glBlitFramebufferANGLE; + else if (GLAD_NV_framebuffer_blit) + fp_glBlitFramebuffer = fp_glBlitFramebufferNV; + + if (GLAD_EXT_framebuffer_multisample) + fp_glRenderbufferStorageMultisample = fp_glRenderbufferStorageMultisampleEXT; + else if (GLAD_APPLE_framebuffer_multisample) + fp_glRenderbufferStorageMultisample = fp_glRenderbufferStorageMultisampleAPPLE; + else if (GLAD_ANGLE_framebuffer_multisample) + fp_glRenderbufferStorageMultisample = fp_glRenderbufferStorageMultisampleANGLE; + else if (GLAD_NV_framebuffer_multisample) + fp_glRenderbufferStorageMultisample = fp_glRenderbufferStorageMultisampleNV; } } @@ -228,18 +246,27 @@ void OpenGL::initMaxValues() glGetIntegerv(GL_MAX_TEXTURE_SIZE, &maxTextureSize); - if (Canvas::isSupported() && (GLAD_VERSION_2_0 || GLAD_ARB_draw_buffers)) + int maxattachments = 1; + int maxdrawbuffers = 1; + + if (GLAD_ES_VERSION_3_0 || GLAD_VERSION_2_0) { - int maxattachments = 0; glGetIntegerv(GL_MAX_COLOR_ATTACHMENTS, &maxattachments); - - int maxdrawbuffers = 0; glGetIntegerv(GL_MAX_DRAW_BUFFERS, &maxdrawbuffers); + } - maxRenderTargets = std::min(maxattachments, maxdrawbuffers); + maxRenderTargets = std::min(maxattachments, maxdrawbuffers); + + if (GLAD_ES_VERSION_3_0 || GLAD_VERSION_3_0 || GLAD_ARB_framebuffer_object + || GLAD_EXT_framebuffer_multisample || GLAD_APPLE_framebuffer_multisample + || GLAD_ANGLE_framebuffer_multisample) + { + glGetIntegerv(GL_MAX_SAMPLES, &maxRenderbufferSamples); } else - maxRenderTargets = 0; + maxRenderbufferSamples = 0; + + glGetIntegerv(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, &maxTextureUnits); } void OpenGL::initMatrices() @@ -247,18 +274,18 @@ void OpenGL::initMatrices() matrices.transform.clear(); matrices.projection.clear(); - matrices.transform.push_back(Matrix()); - matrices.projection.push_back(Matrix()); + matrices.transform.push_back(Matrix4()); + matrices.projection.push_back(Matrix4()); } void OpenGL::createDefaultTexture() { - // Set the 'default' texture as a repeating white pixel. Otherwise, + // Set the 'default' texture (id 0) as a repeating white pixel. Otherwise, // texture2D calls inside a shader would return black when drawing graphics // primitives, which would create the need to use different "passthrough" // shaders for untextured primitives vs images. - GLuint curtexture = state.textureUnits[state.curTextureUnit]; + GLuint curtexture = state.boundTextures[state.curTextureUnit]; glGenTextures(1, &state.defaultTexture); bindTexture(state.defaultTexture); @@ -269,8 +296,8 @@ void OpenGL::createDefaultTexture() glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); - GLubyte pix = 255; - glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, 1, 1, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, &pix); + GLubyte pix[] = {255, 255, 255, 255}; + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, pix); bindTexture(curtexture); } @@ -285,68 +312,44 @@ void OpenGL::popTransform() matrices.transform.pop_back(); } -Matrix &OpenGL::getTransform() +Matrix4 &OpenGL::getTransform() { return matrices.transform.back(); } void OpenGL::prepareDraw() { - const Matrix &transform = matrices.transform.back(); - const Matrix &proj = matrices.projection.back(); + TempDebugGroup debuggroup("Prepare OpenGL draw"); - Shader *shader = Shader::current; + // Make sure the active shader's love-provided uniforms are up to date. + if (Shader::current != nullptr) + Shader::current->checkSetBuiltinUniforms(); - // Make sure the active shader has the correct values for its love-provided - // uniforms. - if (shader) + // We use glLoadMatrix rather than uniforms for our matrices when possible, + // because uniform uploads can be significantly slower than glLoadMatrix. + if (GLAD_VERSION_1_0) { - shader->checkSetScreenParams(); + const Matrix4 &curproj = matrices.projection.back(); + const Matrix4 &curxform = matrices.transform.back(); - // We need to make sure antialiased Canvases are properly resolved - // before sampling from their textures in a shader. - // This is kind of a big hack. :( - for (auto &r : shader->getBoundRetainables()) - { - // Even bigger hack! D: - Canvas *canvas = dynamic_cast(r.second); - if (canvas != nullptr) - canvas->resolveMSAA(); - } - } - - if (GLAD_ES_VERSION_2_0 && shader) - { - // Send built-in uniforms to the current shader. - shader->sendBuiltinMatrix(Shader::BUILTIN_TRANSFORM_MATRIX, 4, transform.getElements(), 1); - shader->sendBuiltinMatrix(Shader::BUILTIN_PROJECTION_MATRIX, 4, proj.getElements(), 1); - - Matrix tp_matrix(proj * transform); - shader->sendBuiltinMatrix(Shader::BUILTIN_TRANSFORM_PROJECTION_MATRIX, 4, tp_matrix.getElements(), 1); - - shader->sendBuiltinFloat(Shader::BUILTIN_POINT_SIZE, 1, &state.pointSize, 1); - } - else if (GLAD_VERSION_1_0) - { - const float *lastproj = state.lastProjectionMatrix.getElements(); + const Matrix4 &lastproj = state.lastProjectionMatrix; + const Matrix4 &lastxform = state.lastTransformMatrix; // We only need to re-upload the projection matrix if it's changed. - if (memcmp(proj.getElements(), lastproj, sizeof(float) * 16) != 0) + if (memcmp(curproj.getElements(), lastproj.getElements(), sizeof(float) * 16) != 0) { glMatrixMode(GL_PROJECTION); - glLoadMatrixf(proj.getElements()); + glLoadMatrixf(curproj.getElements()); glMatrixMode(GL_MODELVIEW); - state.lastProjectionMatrix = proj; + state.lastProjectionMatrix = matrices.projection.back(); } - const float *lastxform = state.lastTransformMatrix.getElements(); - // Same with the transform matrix. - if (memcmp(transform.getElements(), lastxform, sizeof(float) * 16) != 0) + if (memcmp(curxform.getElements(), lastxform.getElements(), sizeof(float) * 16) != 0) { - glLoadMatrixf(transform.getElements()); - state.lastTransformMatrix = transform; + glLoadMatrixf(curxform.getElements()); + state.lastTransformMatrix = matrices.transform.back(); } } } @@ -363,107 +366,36 @@ void OpenGL::drawElements(GLenum mode, GLsizei count, GLenum type, const void *i ++stats.drawCalls; } -void OpenGL::drawElementsBaseVertex(GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex) +void OpenGL::useVertexAttribArrays(uint32 arraybits) { - glDrawElementsBaseVertex(mode, count, type, indices, basevertex); - ++stats.drawCalls; -} + uint32 diff = arraybits ^ state.enabledAttribArrays; -void OpenGL::setColor(const Color &c) -{ - if (GLAD_ES_VERSION_2_0) - glVertexAttrib4f(GLuint(ATTRIB_COLOR), c.r/255.f, c.g/255.f, c.b/255.f, c.a/255.f); - else - glColor4ubv(&c.r); + if (diff == 0) + return; - state.color = c; -} - -Color OpenGL::getColor() const -{ - return state.color; -} - -void OpenGL::setClearColor(const Color &c) -{ - glClearColor(c.r / 255.0f, c.g / 255.0f, c.b / 255.0f, c.a / 255.0f); - state.clearColor = c; -} - -Color OpenGL::getClearColor() const -{ - return state.clearColor; -} - -GLint OpenGL::getGLAttrib(OpenGL::VertexAttrib attrib) -{ - if (GLAD_ES_VERSION_2_0) + // Max 32 attributes. As of when this was written, no GL driver exposes more + // than 32. Lets hope that doesn't change... + for (uint32 i = 0; i < 32; i++) { - // The enum value maps to a generic vertex attribute index. - return GLint(attrib); - } - else - { - switch (attrib) + uint32 bit = 1 << i; + + if (diff & bit) { - case ATTRIB_POS: - return GL_VERTEX_ARRAY; - case ATTRIB_TEXCOORD: - return GL_TEXTURE_COORD_ARRAY; - case ATTRIB_COLOR: - return GL_COLOR_ARRAY; - default: - return GLint(attrib); + if (arraybits & bit) + glEnableVertexAttribArray(i); + else + glDisableVertexAttribArray(i); } } - return -1; -} + state.enabledAttribArrays = arraybits; -void OpenGL::enableVertexAttribArray(OpenGL::VertexAttrib attrib) -{ - GLint glattrib = getGLAttrib(attrib); - - if (GLAD_ES_VERSION_2_0) - glEnableVertexAttribArray((GLuint) glattrib); - else - glEnableClientState((GLenum) glattrib); -} - -void OpenGL::disableVertexAttribArray(OpenGL::VertexAttrib attrib) -{ - GLint glattrib = getGLAttrib(attrib); - - if (GLAD_ES_VERSION_2_0) - glDisableVertexAttribArray((GLuint) glattrib); - else - glDisableClientState((GLenum) glattrib); -} - -void OpenGL::setVertexAttribArray(OpenGL::VertexAttrib attrib, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer) -{ - if (GLAD_ES_VERSION_2_0) - { - GLboolean normalized = (type == GL_UNSIGNED_BYTE) ? GL_TRUE : GL_FALSE; - glVertexAttribPointer(GLuint(attrib), size, type, normalized, stride, pointer); - } - else - { - switch (attrib) - { - case ATTRIB_POS: - glVertexPointer(size, type, stride, pointer); - break; - case ATTRIB_TEXCOORD: - glTexCoordPointer(size, type, stride, pointer); - break; - case ATTRIB_COLOR: - glColorPointer(size, type, stride, pointer); - break; - default: - break; - } - } + // glDisableVertexAttribArray will make the constant value for a vertex + // attribute undefined. We rely on the per-vertex color attribute being + // white when no per-vertex color is used, so we set it here. + // FIXME: Is there a better place to do this? + if ((diff & ATTRIBFLAG_COLOR) && !(arraybits & ATTRIBFLAG_COLOR)) + glVertexAttrib4f(ATTRIB_COLOR, 1.0f, 1.0f, 1.0f, 1.0f); } void OpenGL::setViewport(const OpenGL::Viewport &v) @@ -501,40 +433,6 @@ OpenGL::Viewport OpenGL::getScissor() const return state.scissor; } -void OpenGL::setBlendState(const BlendState &blend) -{ - if (GLAD_ES_VERSION_2_0 || GLAD_VERSION_1_4) - glBlendEquation(blend.func); - else if (GLAD_EXT_blend_minmax && GLAD_EXT_blend_subtract) - glBlendEquationEXT(blend.func); - else - { - if (blend.func == GL_FUNC_REVERSE_SUBTRACT) - throw love::Exception("This graphics card does not support the subtractive blend mode!"); - // GL_FUNC_ADD is the default even without access to glBlendEquation, so that'll still work. - } - - if (blend.srcRGB == blend.srcA && blend.dstRGB == blend.dstA) - glBlendFunc(blend.srcRGB, blend.dstRGB); - else - { - if (GLAD_ES_VERSION_2_0 || GLAD_VERSION_1_4) - glBlendFuncSeparate(blend.srcRGB, blend.dstRGB, blend.srcA, blend.dstA); - else if (GLAD_EXT_blend_func_separate) - glBlendFuncSeparateEXT(blend.srcRGB, blend.dstRGB, blend.srcA, blend.dstA); - else - throw love::Exception("This graphics card does not support separated rgb and alpha blend functions!"); - } - - state.blend = blend; -} - -OpenGL::BlendState OpenGL::getBlendState() const -{ - return state.blend; -} - - void OpenGL::setPointSize(float size) { if (GLAD_VERSION_1_0) @@ -548,9 +446,40 @@ float OpenGL::getPointSize() const return state.pointSize; } +void OpenGL::setFramebufferSRGB(bool enable) +{ + if (enable) + glEnable(GL_FRAMEBUFFER_SRGB); + else + glDisable(GL_FRAMEBUFFER_SRGB); + + state.framebufferSRGBEnabled = enable; +} + +bool OpenGL::hasFramebufferSRGB() const +{ + return state.framebufferSRGBEnabled; +} + +void OpenGL::bindFramebuffer(GLenum target, GLuint framebuffer) +{ + glBindFramebuffer(target, framebuffer); + + if (target == GL_FRAMEBUFFER) + ++stats.framebufferBinds; +} + GLuint OpenGL::getDefaultFBO() const { - return state.defaultFBO; +#ifdef LOVE_IOS + // Hack: iOS uses a custom FBO. + SDL_SysWMinfo info = {}; + SDL_VERSION(&info.version); + SDL_GetWindowWMInfo(SDL_GL_GetCurrentWindow(), &info); + return info.info.uikit.framebuffer; +#else + return 0; +#endif } GLuint OpenGL::getDefaultTexture() const @@ -560,40 +489,35 @@ GLuint OpenGL::getDefaultTexture() const void OpenGL::setTextureUnit(int textureunit) { - if (textureunit < 0 || (size_t) textureunit >= state.textureUnits.size()) + if (textureunit < 0 || (size_t) textureunit >= state.boundTextures.size()) throw love::Exception("Invalid texture unit index (%d).", textureunit); if (textureunit != state.curTextureUnit) - { - if (state.textureUnits.size() > 1) - glActiveTexture(GL_TEXTURE0 + textureunit); - else - throw love::Exception("Multitexturing is not supported."); - } + glActiveTexture(GL_TEXTURE0 + textureunit); state.curTextureUnit = textureunit; } void OpenGL::bindTexture(GLuint texture) { - if (texture != state.textureUnits[state.curTextureUnit]) + if (texture != state.boundTextures[state.curTextureUnit]) { - state.textureUnits[state.curTextureUnit] = texture; + state.boundTextures[state.curTextureUnit] = texture; glBindTexture(GL_TEXTURE_2D, texture); } } void OpenGL::bindTextureToUnit(GLuint texture, int textureunit, bool restoreprev) { - if (textureunit < 0 || (size_t) textureunit >= state.textureUnits.size()) + if (textureunit < 0 || (size_t) textureunit >= state.boundTextures.size()) throw love::Exception("Invalid texture unit index."); - if (texture != state.textureUnits[textureunit]) + if (texture != state.boundTextures[textureunit]) { int oldtextureunit = state.curTextureUnit; setTextureUnit(textureunit); - state.textureUnits[textureunit] = texture; + state.boundTextures[textureunit] = texture; glBindTexture(GL_TEXTURE_2D, texture); if (restoreprev) @@ -605,7 +529,7 @@ void OpenGL::deleteTexture(GLuint texture) { // glDeleteTextures binds texture 0 to all texture units the deleted texture // was bound to before deletion. - for (GLuint &texid : state.textureUnits) + for (GLuint &texid : state.boundTextures) { if (texid == texture) texid = 0; @@ -614,7 +538,7 @@ void OpenGL::deleteTexture(GLuint texture) glDeleteTextures(1, &texture); } -float OpenGL::setTextureFilter(graphics::Texture::Filter &f) +void OpenGL::setTextureFilter(graphics::Texture::Filter &f) { GLint gmin, gmag; @@ -639,7 +563,6 @@ float OpenGL::setTextureFilter(graphics::Texture::Filter &f) gmin = GL_LINEAR; } - switch (f.mag) { case Texture::FILTER_NEAREST: @@ -659,8 +582,8 @@ float OpenGL::setTextureFilter(graphics::Texture::Filter &f) f.anisotropy = std::min(std::max(f.anisotropy, 1.0f), maxAnisotropy); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, f.anisotropy); } - - return f.anisotropy; + else + f.anisotropy = 1.0f; } void OpenGL::setTextureWrap(const graphics::Texture::Wrap &w) @@ -693,6 +616,16 @@ int OpenGL::getMaxRenderTargets() const return maxRenderTargets; } +int OpenGL::getMaxRenderbufferSamples() const +{ + return maxRenderbufferSamples; +} + +int OpenGL::getMaxTextureUnits() const +{ + return maxTextureUnits; +} + void OpenGL::updateTextureMemorySize(size_t oldsize, size_t newsize) { int64 memsize = (int64) stats.textureMemory + ((int64 )newsize - (int64) oldsize); @@ -715,9 +648,8 @@ const char *OpenGL::debugSeverityString(GLenum severity) case GL_DEBUG_SEVERITY_LOW: return "low"; default: - break; + return "unknown"; } - return "unknown"; } const char *OpenGL::debugSourceString(GLenum source) @@ -737,9 +669,8 @@ const char *OpenGL::debugSourceString(GLenum source) case GL_DEBUG_SOURCE_OTHER: return "other"; default: - break; + return "unknown"; } - return "unknown"; } const char *OpenGL::debugTypeString(GLenum type) @@ -759,9 +690,8 @@ const char *OpenGL::debugTypeString(GLenum type) case GL_DEBUG_TYPE_OTHER: return "other"; default: - break; + return "unknown"; } - return "unknown"; } diff --git a/jni/love/src/modules/graphics/opengl/OpenGL.h b/jni/love/src/modules/graphics/opengl/OpenGL.h index 9ad5f993..2d87f452 100644 --- a/jni/love/src/modules/graphics/opengl/OpenGL.h +++ b/jni/love/src/modules/graphics/opengl/OpenGL.h @@ -21,9 +21,9 @@ #ifndef LOVE_GRAPHICS_OPENGL_OPENGL_H #define LOVE_GRAPHICS_OPENGL_OPENGL_H -#include - // LOVE +#include "common/config.h" +#include "common/int.h" #include "graphics/Color.h" #include "graphics/Texture.h" #include "common/Matrix.h" @@ -50,6 +50,25 @@ namespace opengl // no clashes with other GL libraries when linking, etc. using namespace glad; +// Vertex attribute indices used in shaders by LOVE. The values map to OpenGL +// generic vertex attribute indices. +enum VertexAttribID +{ + ATTRIB_POS = 0, + ATTRIB_TEXCOORD, + ATTRIB_COLOR, + ATTRIB_CONSTANTCOLOR, + ATTRIB_MAX_ENUM +}; + +enum VertexAttribFlags +{ + ATTRIBFLAG_POS = 1 << ATTRIB_POS, + ATTRIBFLAG_TEXCOORD = 1 << ATTRIB_TEXCOORD, + ATTRIBFLAG_COLOR = 1 << ATTRIB_COLOR, + ATTRIBFLAG_CONSTANTCOLOR = 1 << ATTRIB_CONSTANTCOLOR +}; + /** * Thin layer between OpenGL and the rest of the program. * Internally shadows some OpenGL context state for improved efficiency and @@ -64,11 +83,11 @@ public: // OpenGL GPU vendors. enum Vendor { - VENDOR_ATI_AMD, + VENDOR_AMD, VENDOR_NVIDIA, VENDOR_INTEL, VENDOR_MESA_SOFT, // Software renderer. - VENDOR_APPLE, // Software renderer (or Apple A7 chips and newer.) + VENDOR_APPLE, // Software renderer on desktops. VENDOR_MICROSOFT, // Software renderer. VENDOR_IMGTEC, VENDOR_ARM, @@ -78,49 +97,22 @@ public: VENDOR_UNKNOWN }; - // Vertex attributes used in shaders by LOVE. The values map to OpenGL - // generic vertex attribute indices, when applicable. - // LOVE uses the old hard-coded attribute APIs on desktop GL (for now.) - enum VertexAttrib - { - ATTRIB_POS = 0, - ATTRIB_TEXCOORD = 1, - ATTRIB_COLOR = 2, - ATTRIB_PSEUDO_INSTANCE_ID = 3, // Shader pseudo-instance ID. - ATTRIB_MAX_ENUM - }; - // A rectangle representing an OpenGL viewport or a scissor box. struct Viewport { int x, y; int w, h; - Viewport() - : x(0), y(0), w(0), h(0) - {} - - Viewport(int _x, int _y, int _w, int _h) - : x(_x), y(_y), w(_w), h(_h) - {} - bool operator == (const Viewport &rhs) const { return x == rhs.x && y == rhs.y && w == rhs.w && h == rhs.h; } }; - struct BlendState - { - GLenum srcRGB, srcA; - GLenum dstRGB, dstA; - GLenum func; - }; - struct { - std::vector transform; - std::vector projection; + std::vector transform; + std::vector projection; } matrices; class TempTransform @@ -138,7 +130,7 @@ public: gl.popTransform(); } - Matrix &get() + Matrix4 &get() { return gl.getTransform(); } @@ -147,21 +139,49 @@ public: OpenGL ≷ }; + class TempDebugGroup + { + public: + +#if defined(DEBUG) && DEBUG == 1 + TempDebugGroup(const char *name) + { + if (GLAD_EXT_debug_marker) + glPushGroupMarkerEXT(0, (const GLchar *) name); + } +#else + TempDebugGroup(const char *) {} +#endif + +#if defined(DEBUG) && DEBUG == 1 + ~TempDebugGroup() + { + if (GLAD_EXT_debug_marker) + glPopGroupMarkerEXT(); + } +#endif + }; + struct Stats { size_t textureMemory; int drawCalls; + int framebufferBinds; } stats; OpenGL(); - virtual ~OpenGL() {} /** - * Initializes some required context state based on current and default - * OpenGL state. Call this directly after creating an OpenGL context! + * Initializes the active OpenGL context. **/ bool initContext(); + /** + * Sets up some required context state based on current and default OpenGL + * state. Call this directly after initializing an OpenGL context! + **/ + void setupContext(); + /** * Marks current context state as invalid and deletes OpenGL objects owned * by this class instance. Call this directly before potentially deleting @@ -171,58 +191,29 @@ public: void pushTransform(); void popTransform(); - Matrix &getTransform(); + Matrix4 &getTransform(); /** - * Set up necessary state (matrices etc.) for drawing. This *must* be called - * directly before GL draws. + * Set up necessary state (LOVE-provided shader uniforms, etc.) for drawing. + * This *MUST* be called directly before OpenGL drawing functions. **/ void prepareDraw(); /** - * glDraw* functions which increment the draw-call counter by themselves. + * glDrawArrays and glDrawElements which increment the draw-call counter by + * themselves. **/ void drawArrays(GLenum mode, GLint first, GLsizei count); void drawElements(GLenum mode, GLsizei count, GLenum type, const void *indices); - void drawElementsBaseVertex(GLenum mode, GLsizei count, GLenum type, const void* indices, GLint basevertex); /** - * Sets the current constant color. + * Sets the enabled vertex attribute arrays based on the specified attribute + * bits. Each bit in the uint32 represents an enabled attribute array index. + * For example, useVertexAttribArrays(1 << 0) will enable attribute index 0. + * See the VertexAttribFlags enum for the standard vertex attributes. + * This function *must* be used instead of glEnable/DisableVertexAttribArray. **/ - void setColor(const Color &c); - - /** - * Gets the current constant color. - **/ - Color getColor() const; - - /** - * Sets the current clear color for all framebuffer objects. - **/ - void setClearColor(const Color &c); - - /** - * Gets the current clear color. - **/ - Color getClearColor() const; - - /** - * Enables usage of an array for a vertex attribute when drawing. - * See http://www.opengl.org/sdk/docs/man/xhtml/glEnableVertexAttribArray.xml - **/ - void enableVertexAttribArray(VertexAttrib attrib); - - /** - * Disables usage of an array for a vertex attribute when drawing. - * See http://www.opengl.org/sdk/docs/man/xhtml/glDisableVertexAttribArray.xml - **/ - void disableVertexAttribArray(VertexAttrib attrib); - - /** - * Sets the parameters for an array of data for a vertex attribute. - * See http://www.opengl.org/sdk/docs/man/xhtml/glVertexAttribPointer.xml - **/ - void setVertexAttribArray(VertexAttrib attrib, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); + void useVertexAttribArrays(uint32 arraybits); /** * Sets the OpenGL rendering viewport to the specified rectangle. @@ -246,17 +237,6 @@ public: **/ Viewport getScissor() const; - /** - * Sets blending functionality. - * Note: This does not globally enable or disable blending. - **/ - void setBlendState(const BlendState &blend); - - /** - * Gets the currently set blending functionality. - **/ - BlendState getBlendState() const; - /** * Sets the global point size. **/ @@ -267,6 +247,21 @@ public: **/ float getPointSize() const; + /** + * Calls glEnable/glDisable(GL_FRAMEBUFFER_SRGB). + **/ + void setFramebufferSRGB(bool enable); + + /** + * Equivalent to glIsEnabled(GL_FRAMEBUFFER_SRGB). + **/ + bool hasFramebufferSRGB() const; + + /** + * Binds a Framebuffer Object to the specified target. + **/ + void bindFramebuffer(GLenum target, GLuint framebuffer); + /** * This will usually be 0 (system drawable), but some platforms require a * non-zero FBO for rendering. @@ -274,7 +269,7 @@ public: GLuint getDefaultFBO() const; /** - * Gets the ID for love's default texture (used for "untextured" draws.) + * Gets the ID for love's default texture (used for "untextured" primitives.) **/ GLuint getDefaultTexture() const; @@ -307,9 +302,10 @@ public: /** * Sets the texture filter mode for the currently bound texture. - * Returns the actual amount of anisotropic filtering set. + * The anisotropy parameter of the argument is set to the actual amount of + * anisotropy that was used. **/ - float setTextureFilter(graphics::Texture::Filter &f); + void setTextureFilter(graphics::Texture::Filter &f); /** * Sets the texture wrap mode for the currently bound texture. @@ -326,6 +322,16 @@ public: **/ int getMaxRenderTargets() const; + /** + * Returns the maximum supported number of MSAA samples for renderbuffers. + **/ + int getMaxRenderbufferSamples() const; + + /** + * Returns the maximum number of accessible texture units. + **/ + int getMaxTextureUnits() const; + void updateTextureMemorySize(size_t oldsize, size_t newsize); /** @@ -346,43 +352,38 @@ private: void initMatrices(); void createDefaultTexture(); - GLint getGLAttrib(VertexAttrib attrib); - bool contextInitialized; float maxAnisotropy; int maxTextureSize; int maxRenderTargets; + int maxRenderbufferSamples; + int maxTextureUnits; Vendor vendor; // Tracked OpenGL state. struct { - // Current constant color. - Color color; - - Color clearColor; - // Texture unit state (currently bound texture for each texture unit.) - std::vector textureUnits; + std::vector boundTextures; // Currently active texture unit. int curTextureUnit; + uint32 enabledAttribArrays; + Viewport viewport; Viewport scissor; float pointSize; + bool framebufferSRGBEnabled; + GLuint defaultTexture; - GLuint defaultFBO; - - BlendState blend; - - Matrix lastProjectionMatrix; - Matrix lastTransformMatrix; + Matrix4 lastProjectionMatrix; + Matrix4 lastTransformMatrix; } state; diff --git a/jni/love/src/modules/graphics/opengl/ParticleSystem.cpp b/jni/love/src/modules/graphics/opengl/ParticleSystem.cpp index 8986b90f..302c12d4 100644 --- a/jni/love/src/modules/graphics/opengl/ParticleSystem.cpp +++ b/jni/love/src/modules/graphics/opengl/ParticleSystem.cpp @@ -64,7 +64,7 @@ ParticleSystem::ParticleSystem(Texture *texture, uint32 size) , pHead(nullptr) , pTail(nullptr) , particleVerts(nullptr) - , ibo(nullptr) + , quadIndices(1) , texture(texture) , active(true) , insertMode(INSERT_MODE_TOP) @@ -95,8 +95,8 @@ ParticleSystem::ParticleSystem(Texture *texture, uint32 size) , spinStart(0) , spinEnd(0) , spinVariation(0) - , offsetX(float(texture->getWidth())*0.5f) - , offsetY(float(texture->getHeight())*0.5f) + , offset(float(texture->getWidth())*0.5f, float(texture->getHeight())*0.5f) + , defaultOffset(true) , relativeRotation(false) { if (size == 0 || size > MAX_PARTICLES) @@ -113,7 +113,7 @@ ParticleSystem::ParticleSystem(const ParticleSystem &p) , pHead(nullptr) , pTail(nullptr) , particleVerts(nullptr) - , ibo(nullptr) + , quadIndices(p.quadIndices) , texture(p.texture) , active(p.active) , insertMode(p.insertMode) @@ -148,8 +148,8 @@ ParticleSystem::ParticleSystem(const ParticleSystem &p) , spinStart(p.spinStart) , spinEnd(p.spinEnd) , spinVariation(p.spinVariation) - , offsetX(p.offsetX) - , offsetY(p.offsetY) + , offset(p.offset) + , defaultOffset(p.defaultOffset) , colors(p.colors) , quads(p.quads) , relativeRotation(p.relativeRotation) @@ -167,20 +167,25 @@ ParticleSystem *ParticleSystem::clone() return new ParticleSystem(*this); } +void ParticleSystem::resetOffset() +{ + if (quads.empty()) + offset = love::Vector(float(texture->getWidth())*0.5f, float(texture->getHeight())*0.5f); + else + { + Quad::Viewport v = quads[0]->getViewport(); + offset = love::Vector(v.x*0.5f, v.y*0.5f); + } +} + void ParticleSystem::createBuffers(size_t size) { try { pFree = pMem = new Particle[size]; particleVerts = new love::Vertex[size * 4]; - ibo = new VertexIndex(size); maxParticles = (uint32) size; } - catch (love::Exception &) - { - deleteBuffers(); - throw; - } catch (std::bad_alloc &) { deleteBuffers(); @@ -193,12 +198,9 @@ void ParticleSystem::deleteBuffers() // Clean up for great gracefulness! delete[] pMem; delete[] particleVerts; - delete ibo; pMem = nullptr; particleVerts = nullptr; - ibo = nullptr; - maxParticles = 0; activeParticles = 0; } @@ -207,6 +209,7 @@ void ParticleSystem::setBufferSize(uint32 size) { if (size == 0 || size > MAX_PARTICLES) throw love::Exception("Invalid buffer size"); + quadIndices = QuadIndices(size); deleteBuffers(); createBuffers(size); reset(); @@ -431,6 +434,9 @@ ParticleSystem::Particle *ParticleSystem::removeParticle(Particle *p) void ParticleSystem::setTexture(Texture *tex) { texture.set(tex); + + if (defaultOffset) + resetOffset(); } Texture *ParticleSystem::getTexture() const @@ -691,13 +697,13 @@ float ParticleSystem::getSpinVariation() const void ParticleSystem::setOffset(float x, float y) { - offsetX = x; - offsetY = y; + offset = love::Vector(x, y); + defaultOffset = false; } love::Vector ParticleSystem::getOffset() const { - return love::Vector(offsetX, offsetY); + return offset; } void ParticleSystem::setColor(const Color &color) @@ -738,6 +744,9 @@ void ParticleSystem::setQuads(const std::vector &newQuads) quadlist.push_back(q); quads = quadlist; + + if (defaultOffset) + resetOffset(); } void ParticleSystem::setQuads() @@ -843,10 +852,9 @@ void ParticleSystem::draw(float x, float y, float angle, float sx, float sy, flo if (pCount == 0 || texture.get() == nullptr || pMem == nullptr || particleVerts == nullptr) return; - Color curcolor = gl.getColor(); + OpenGL::TempDebugGroup debuggroup("ParticleSystem draw"); - Matrix t; - t.setTransformation(x, y, angle, sx, sy, ox, oy, kx, ky); + Matrix4 t(x, y, angle, sx, sy, ox, oy, kx, ky); OpenGL::TempTransform transform(gl); transform.get() *= t; @@ -864,7 +872,7 @@ void ParticleSystem::draw(float x, float y, float angle, float sx, float sy, flo textureVerts = quads[p->quadIndex]->getVertices(); // particle vertices are image vertices transformed by particle information - t.setTransformation(p->position[0], p->position[1], p->angle, p->size, p->size, offsetX, offsetY, 0.0f, 0.0f); + t.setTransformation(p->position[0], p->position[1], p->angle, p->size, p->size, offset.x, offset.y, 0.0f, 0.0f); t.transform(pVerts, textureVerts, 4); // set the texture coordinate and color data for particle vertices @@ -884,29 +892,20 @@ void ParticleSystem::draw(float x, float y, float angle, float sx, float sy, flo p = p->next; } - texture->predraw(); + gl.bindTexture(*(GLuint *) texture->getHandle()); gl.prepareDraw(); - gl.enableVertexAttribArray(OpenGL::ATTRIB_POS); - gl.enableVertexAttribArray(OpenGL::ATTRIB_TEXCOORD); - gl.enableVertexAttribArray(OpenGL::ATTRIB_COLOR); + gl.useVertexAttribArrays(ATTRIBFLAG_POS | ATTRIBFLAG_TEXCOORD | ATTRIBFLAG_COLOR); - gl.setVertexAttribArray(OpenGL::ATTRIB_POS, 2, GL_FLOAT, sizeof(Vertex), &particleVerts[0].x); - gl.setVertexAttribArray(OpenGL::ATTRIB_TEXCOORD, 2, GL_FLOAT, sizeof(Vertex), &particleVerts[0].s); - gl.setVertexAttribArray(OpenGL::ATTRIB_COLOR, 4, GL_UNSIGNED_BYTE, sizeof(Vertex), &particleVerts[0].r); + glVertexAttribPointer(ATTRIB_COLOR, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(Vertex), &particleVerts[0].r); + glVertexAttribPointer(ATTRIB_POS, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), &particleVerts[0].x); + glVertexAttribPointer(ATTRIB_TEXCOORD, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), &particleVerts[0].s); { - VertexBuffer::Bind ibo_bind(*ibo->getVertexBuffer()); - gl.drawElements(GL_TRIANGLES, ibo->getIndexCount(pCount), ibo->getType(), ibo->getPointer(0)); + GLsizei count = (GLsizei) quadIndices.getIndexCount(pCount); + GLBuffer::Bind ibo_bind(*quadIndices.getBuffer()); + gl.drawElements(GL_TRIANGLES, count, quadIndices.getType(), quadIndices.getPointer(0)); } - - gl.disableVertexAttribArray(OpenGL::ATTRIB_POS); - gl.disableVertexAttribArray(OpenGL::ATTRIB_TEXCOORD); - gl.disableVertexAttribArray(OpenGL::ATTRIB_COLOR); - - texture->postdraw(); - - gl.setColor(curcolor); } void ParticleSystem::update(float dt) @@ -998,7 +997,7 @@ void ParticleSystem::update(float dt) { s = t * (float) k; // [0:numquads-1] (clamped below) i = (s > 0.0f) ? (size_t) s : 0; - p->quadIndex = (i < k) ? i : k - 1; + p->quadIndex = (int) ((i < k) ? i : k - 1); } // Next particle. diff --git a/jni/love/src/modules/graphics/opengl/ParticleSystem.h b/jni/love/src/modules/graphics/opengl/ParticleSystem.h index ec26a979..05c16fcf 100644 --- a/jni/love/src/modules/graphics/opengl/ParticleSystem.h +++ b/jni/love/src/modules/graphics/opengl/ParticleSystem.h @@ -27,9 +27,9 @@ #include "common/Vector.h" #include "graphics/Drawable.h" #include "graphics/Color.h" -#include "VertexBuffer.h" #include "graphics/Quad.h" -#include "Texture.h" +#include "graphics/Texture.h" +#include "GLBuffer.h" // STL #include @@ -577,7 +577,7 @@ protected: Vertex *particleVerts; // Vertex index buffer. - VertexIndex *ibo; + QuadIndices quadIndices; // The texture to be drawn. StrongRef texture; @@ -653,8 +653,10 @@ protected: float spinVariation; // Offsets - float offsetX; - float offsetY; + love::Vector offset; + + // Is the ParticleSystem using a default offset? + bool defaultOffset; // Color. std::vector colors; @@ -664,6 +666,8 @@ protected: bool relativeRotation; + void resetOffset(); + void createBuffers(size_t size); void deleteBuffers(); diff --git a/jni/love/src/modules/graphics/opengl/Polyline.cpp b/jni/love/src/modules/graphics/opengl/Polyline.cpp index 98a079b5..561da744 100644 --- a/jni/love/src/modules/graphics/opengl/Polyline.cpp +++ b/jni/love/src/modules/graphics/opengl/Polyline.cpp @@ -24,6 +24,7 @@ // OpenGL #include "OpenGL.h" +// C++ #include // treat adjacent segments with angles between their directions <5 degree as straight @@ -36,16 +37,6 @@ namespace graphics namespace opengl { -Polyline::Polyline(GLenum mode, bool quadindices) - : vertices(nullptr) - , overdraw(nullptr) - , vertex_count(0) - , overdraw_vertex_count(0) - , draw_mode(mode) - , use_quad_indices(quadindices) -{ -} - void Polyline::render(const float *coords, size_t count, size_t size_hint, float halfwidth, float pixel_size, bool draw_overdraw) { static std::vector anchors; @@ -58,7 +49,7 @@ void Polyline::render(const float *coords, size_t count, size_t size_hint, float // prepare vertex arrays if (draw_overdraw) - halfwidth -= pixel_size * .3; + halfwidth -= pixel_size * 0.3f; // compute sleeve bool is_looping = (coords[0] == coords[count - 2]) && (coords[1] == coords[count - 1]); @@ -84,12 +75,40 @@ void Polyline::render(const float *coords, size_t count, size_t size_hint, float renderEdge(anchors, normals, s, len_s, ns, q, r, halfwidth); vertex_count = normals.size(); - vertices = new Vector[vertex_count]; + + size_t extra_vertices = 0; + + if (draw_overdraw) + { + calc_overdraw_vertex_count(is_looping); + + // When drawing overdraw lines using triangle strips, we want to add an + // extra degenerate triangle in between the core line and the overdraw + // line in order to break up the strip into two. This will let us draw + // everything in one draw call. + if (draw_mode == GL_TRIANGLE_STRIP) + extra_vertices = 2; + } + + // Use a single linear array for both the regular and overdraw vertices. + vertices = new Vector[vertex_count + extra_vertices + overdraw_vertex_count]; + for (size_t i = 0; i < vertex_count; ++i) vertices[i] = anchors[i] + normals[i]; if (draw_overdraw) + { + overdraw = vertices + vertex_count + extra_vertices; + overdraw_vertex_start = vertex_count + extra_vertices; render_overdraw(normals, pixel_size, is_looping); + } + + // Add the degenerate triangle strip. + if (extra_vertices) + { + vertices[vertex_count + 0] = vertices[vertex_count - 1]; + vertices[vertex_count + 1] = vertices[overdraw_vertex_start]; + } } void NoneJoinPolyline::renderEdge(std::vector &anchors, std::vector &normals, @@ -247,10 +266,13 @@ void BevelJoinPolyline::renderEdge(std::vector &anchors, std::vector &normals, float pixel_size, bool is_looping) +void Polyline::calc_overdraw_vertex_count(bool is_looping) { overdraw_vertex_count = 2 * vertex_count + (is_looping ? 0 : 2); - overdraw = new Vector[overdraw_vertex_count]; +} + +void Polyline::render_overdraw(const std::vector &normals, float pixel_size, bool is_looping) +{ // upper segment for (size_t i = 0; i + 1 < vertex_count; i += 2) { @@ -293,10 +315,13 @@ void Polyline::render_overdraw(const std::vector &normals, float pixel_s } } -void NoneJoinPolyline::render_overdraw(const std::vector &/*normals*/, float pixel_size, bool /*is_looping*/) +void NoneJoinPolyline::calc_overdraw_vertex_count(bool /*is_looping*/) { overdraw_vertex_count = 4 * (vertex_count-2); // less than ideal - overdraw = new Vector[overdraw_vertex_count]; +} + +void NoneJoinPolyline::render_overdraw(const std::vector &/*normals*/, float pixel_size, bool /*is_looping*/) +{ for (size_t i = 2; i + 3 < vertex_count; i += 4) { Vector s = vertices[i] - vertices[i+3]; @@ -331,32 +356,43 @@ Polyline::~Polyline() { if (vertices) delete[] vertices; - if (overdraw) - delete[] overdraw; } void Polyline::draw() { - GLushort *indices = nullptr; + OpenGL::TempDebugGroup debuggroup("Line draw"); + GLushort *indices = nullptr; + Color *colors = nullptr; + + size_t total_vertex_count = vertex_count; + if (overdraw) + total_vertex_count = overdraw_vertex_start + overdraw_vertex_count; + + // TODO: We should probably be using a reusable index buffer. if (use_quad_indices) { - size_t numindices = (vertex_count / 4) * 6; - if (overdraw) - numindices = std::max(numindices, (overdraw_vertex_count / 4) * 6); + size_t numindices = (total_vertex_count / 4) * 6; - indices = new GLushort[numindices]; + try + { + indices = new GLushort[numindices]; + } + catch (std::bad_alloc &) + { + throw love::Exception("Out of memory."); + } - // Fill the index array to make the draw call render 2 triangles from - // a 4-vertex quad. + // Fill the index array to make 2 triangles from each quad. + // NOTE: The triangle vertex ordering here is important! for (size_t i = 0; i < numindices / 6; i++) { - // First triangle: vertices 0-1-2. + // First triangle. indices[i * 6 + 0] = GLushort(i * 4 + 0); indices[i * 6 + 1] = GLushort(i * 4 + 1); indices[i * 6 + 2] = GLushort(i * 4 + 2); - // Second triangle: vertices 0-2-3. + // Second triangle. indices[i * 6 + 3] = GLushort(i * 4 + 0); indices[i * 6 + 4] = GLushort(i * 4 + 2); indices[i * 6 + 5] = GLushort(i * 4 + 3); @@ -365,61 +401,57 @@ void Polyline::draw() gl.prepareDraw(); - // draw the core line gl.bindTexture(gl.getDefaultTexture()); - gl.enableVertexAttribArray(OpenGL::ATTRIB_POS); - gl.setVertexAttribArray(OpenGL::ATTRIB_POS, 2, GL_FLOAT, 0, vertices); - if (use_quad_indices) - gl.drawElements(draw_mode, (vertex_count / 4) * 6, GL_UNSIGNED_SHORT, indices); - else - gl.drawArrays(draw_mode, 0, vertex_count); + uint32 enabledattribs = ATTRIBFLAG_POS; if (overdraw) { - // prepare colors: - Color c = gl.getColor(); - Color *colors = new Color[overdraw_vertex_count]; - fill_color_array(colors, c); + // Prepare per-vertex colors. Set the core to white, and the overdraw + // line's colors to white on one side and transparent on the other. + colors = new Color[total_vertex_count]; + memset(colors, 255, overdraw_vertex_start * sizeof(Color)); + fill_color_array(colors + overdraw_vertex_start); - gl.enableVertexAttribArray(OpenGL::ATTRIB_COLOR); + glVertexAttribPointer(ATTRIB_COLOR, 4, GL_UNSIGNED_BYTE, GL_TRUE, 0, colors); - gl.setVertexAttribArray(OpenGL::ATTRIB_POS, 2, GL_FLOAT, 0, overdraw); - gl.setVertexAttribArray(OpenGL::ATTRIB_COLOR, 4, GL_UNSIGNED_BYTE, 0, colors); + enabledattribs |= ATTRIBFLAG_COLOR; + } - if (use_quad_indices) - gl.drawElements(draw_mode, (overdraw_vertex_count / 4) * 6, GL_UNSIGNED_SHORT, indices); - else - gl.drawArrays(draw_mode, 0, overdraw_vertex_count); + gl.useVertexAttribArrays(enabledattribs); - gl.disableVertexAttribArray(OpenGL::ATTRIB_COLOR); - gl.setColor(c); + glVertexAttribPointer(ATTRIB_POS, 2, GL_FLOAT, GL_FALSE, 0, vertices); + // Draw the core line and the overdraw in a single draw call. We can do this + // because the vertex array contains both the core line and the overdraw + // vertices. + if (use_quad_indices) + gl.drawElements(draw_mode, (int) (total_vertex_count / 4) * 6, GL_UNSIGNED_SHORT, indices); + else + gl.drawArrays(draw_mode, 0, (int) total_vertex_count); + + if (overdraw) delete[] colors; - } - gl.disableVertexAttribArray(OpenGL::ATTRIB_POS); - - delete[] indices; + if (indices) + delete[] indices; } -void Polyline::fill_color_array(Color *colors, const Color &c) +void Polyline::fill_color_array(Color *colors) { for (size_t i = 0; i < overdraw_vertex_count; ++i) { - colors[i] = c; // avoids branching. equiv to if (i%2 == 1) colors[i].a = 0; - colors[i].a *= GLubyte((i+1) % 2); + colors[i] = {255, 255, 255, GLubyte(255 * ((i+1) % 2))}; } } -void NoneJoinPolyline::fill_color_array(Color *colors, const Color &c) +void NoneJoinPolyline::fill_color_array(Color *colors) { for (size_t i = 0; i < overdraw_vertex_count; ++i) { - colors[i] = c; // if (i % 4 == 1 || i % 4 == 2) colors[i].a = 0 - colors[i].a *= GLubyte((i+1) % 4 < 2); + colors[i] = {255, 255, 255, GLubyte(255 * ((i+1) % 4 < 2))}; } } diff --git a/jni/love/src/modules/graphics/opengl/Polyline.h b/jni/love/src/modules/graphics/opengl/Polyline.h index f2b7959a..56957b81 100644 --- a/jni/love/src/modules/graphics/opengl/Polyline.h +++ b/jni/love/src/modules/graphics/opengl/Polyline.h @@ -21,8 +21,6 @@ #ifndef LOVE_GRAPHICS_OPENGL_POLYLINE_H #define LOVE_GRAPHICS_OPENGL_POLYLINE_H -#include - // LOVE #include "common/config.h" #include "common/Vector.h" @@ -30,6 +28,10 @@ // OpenGL #include "OpenGL.h" +// C++ +#include +#include + namespace love { namespace graphics @@ -44,8 +46,15 @@ namespace opengl class Polyline { public: - - Polyline(GLenum mode = GL_TRIANGLE_STRIP, bool quadindices = false); + Polyline(GLenum mode = GL_TRIANGLE_STRIP, bool quadindices = false) + : vertices(nullptr) + , overdraw(nullptr) + , vertex_count(0) + , overdraw_vertex_count(0) + , draw_mode(mode) + , use_quad_indices(quadindices) + , overdraw_vertex_start(0) + {} virtual ~Polyline(); /** @@ -63,8 +72,9 @@ public: void draw(); protected: + virtual void calc_overdraw_vertex_count(bool is_looping); virtual void render_overdraw(const std::vector &normals, float pixel_size, bool is_looping); - virtual void fill_color_array(Color *colors, const Color &c); + virtual void fill_color_array(Color *colors); /** Calculate line boundary points. * @@ -87,6 +97,7 @@ protected: size_t overdraw_vertex_count; GLenum draw_mode; bool use_quad_indices; + size_t overdraw_vertex_start; }; // Polyline @@ -99,22 +110,30 @@ class NoneJoinPolyline : public Polyline { public: NoneJoinPolyline() - // Draw quads using GL_TRIANGLES and a vertex index array. : Polyline(GL_TRIANGLES, true) {} void render(const float *vertices, size_t count, float halfwidth, float pixel_size, bool draw_overdraw) { Polyline::render(vertices, count, 2 * count - 4, halfwidth, pixel_size, draw_overdraw); + // discard the first and last two vertices. (these are redundant) - for (size_t i = 0; i < vertex_count - 2; ++i) + for (size_t i = 0; i < vertex_count - 4; ++i) this->vertices[i] = this->vertices[i+2]; - vertex_count -= 2; + + // The last quad is now garbage, so zero it out to make sure it doesn't + // get rasterized. These vertices are in between the core line vertices + // and the overdraw vertices in the combined vertex array, so they still + // get "rendered" since we draw everything with one draw call. + memset(&this->vertices[vertex_count - 4], 0, sizeof(love::Vector) * 4); + + vertex_count -= 4; } protected: + virtual void calc_overdraw_vertex_count(bool is_looping); virtual void render_overdraw(const std::vector &normals, float pixel_size, bool is_looping); - virtual void fill_color_array(Color *colors, const Color &c); + virtual void fill_color_array(Color *colors); virtual void renderEdge(std::vector &anchors, std::vector &normals, Vector &s, float &len_s, Vector &ns, const Vector &q, const Vector &r, float hw); diff --git a/jni/love/src/modules/graphics/opengl/Shader.cpp b/jni/love/src/modules/graphics/opengl/Shader.cpp index 8b96b77b..226eb37c 100644 --- a/jni/love/src/modules/graphics/opengl/Shader.cpp +++ b/jni/love/src/modules/graphics/opengl/Shader.cpp @@ -26,6 +26,7 @@ // C++ #include +#include namespace love { @@ -66,7 +67,6 @@ Shader *Shader::defaultShader = nullptr; Shader::ShaderSource Shader::defaultCode[Graphics::RENDERER_MAX_ENUM]; -GLint Shader::maxTexUnits = 0; std::vector Shader::textureCounters; Shader::Shader(const ShaderSource &source) @@ -76,20 +76,14 @@ Shader::Shader(const ShaderSource &source) , builtinAttributes() , lastCanvas((Canvas *) -1) , lastViewport() + , lastPointSize(0.0f) { if (source.vertex.empty() && source.pixel.empty()) throw love::Exception("Cannot create shader: no source code!"); - if (maxTexUnits <= 0) - { - GLint maxtexunits; - glGetIntegerv(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, &maxtexunits); - maxTexUnits = std::max(maxtexunits - 1, 0); - } - // initialize global texture id counters if needed - if (textureCounters.size() < (size_t) maxTexUnits) - textureCounters.resize(maxTexUnits, 0); + if ((int) textureCounters.size() < gl.getMaxTextureUnits() - 1) + textureCounters.resize(gl.getMaxTextureUnits() - 1, 0); // load shader source and create program object loadVolatile(); @@ -129,9 +123,6 @@ GLuint Shader::compileCode(ShaderStage stage, const std::string &code) break; } - // clear existing errors - while (glGetError() != GL_NO_ERROR); - GLuint shaderid = glCreateShader(glstage); if (shaderid == 0) @@ -221,30 +212,37 @@ void Shader::mapActiveUniforms() bool Shader::loadVolatile() { - // Creating the shader will invalidate the uniforms that rely on these. - lastCanvas = (Canvas *) -1; - lastViewport = OpenGL::Viewport(); + OpenGL::TempDebugGroup debuggroup("Shader load"); + + // Recreating the shader program will invalidate uniforms that rely on these. + lastCanvas = (Canvas *) -1; + lastViewport = OpenGL::Viewport(); + + lastPointSize = -1.0f; + + // Invalidate the cached matrices by setting some elements to NaN. + float nan = std::numeric_limits::quiet_NaN(); + lastProjectionMatrix.setTranslation(nan, nan); + lastTransformMatrix.setTranslation(nan, nan); // zero out active texture list activeTexUnits.clear(); - activeTexUnits.insert(activeTexUnits.begin(), maxTexUnits, 0); + activeTexUnits.insert(activeTexUnits.begin(), gl.getMaxTextureUnits() - 1, 0); std::vector shaderids; + const ShaderSource *defaults = &defaultCode[Graphics::RENDERER_OPENGL]; + if (GLAD_ES_VERSION_2_0) + defaults = &defaultCode[Graphics::RENDERER_OPENGLES]; + + // The shader program must have both vertex and pixel shader stages. + const std::string &vertexcode = shaderSource.vertex.empty() ? defaults->vertex : shaderSource.vertex; + const std::string &pixelcode = shaderSource.pixel.empty() ? defaults->pixel : shaderSource.pixel; + try { - // All shader programs in ES2 must have a vertex and pixel shader. - const ShaderSource &defaultESCode = defaultCode[Graphics::RENDERER_OPENGLES]; - - if (!shaderSource.vertex.empty()) - shaderids.push_back(compileCode(STAGE_VERTEX, shaderSource.vertex)); - else if (GLAD_ES_VERSION_2_0) - shaderids.push_back(compileCode(STAGE_VERTEX, defaultESCode.vertex)); - - if (!shaderSource.pixel.empty()) - shaderids.push_back(compileCode(STAGE_PIXEL, shaderSource.pixel)); - else if (GLAD_ES_VERSION_2_0) - shaderids.push_back(compileCode(STAGE_PIXEL, defaultESCode.pixel)); + shaderids.push_back(compileCode(STAGE_VERTEX, vertexcode)); + shaderids.push_back(compileCode(STAGE_PIXEL, pixelcode)); } catch (love::Exception &) { @@ -253,9 +251,6 @@ bool Shader::loadVolatile() throw; } - if (shaderids.empty()) - throw love::Exception("Cannot create shader: no valid source code!"); - program = glCreateProgram(); if (program == 0) @@ -269,22 +264,10 @@ bool Shader::loadVolatile() glAttachShader(program, id); // Bind generic vertex attribute indices to names in the shader. - for (int i = 0; i < int(OpenGL::ATTRIB_MAX_ENUM); i++) + for (int i = 0; i < int(ATTRIB_MAX_ENUM); i++) { - // Desktop OpenGL should ignore some of these. - if (!GLAD_ES_VERSION_2_0 && i <= int(OpenGL::ATTRIB_COLOR)) - continue; - - OpenGL::VertexAttrib attrib = (OpenGL::VertexAttrib) i; - - // FIXME: We skip this both because pseudo-instancing is temporarily - // disabled (see graphics.lua), and because binding a non-existant - // attribute name to a location causes a shader linker warning. - if (attrib == OpenGL::ATTRIB_PSEUDO_INSTANCE_ID) - continue; - const char *name = nullptr; - if (attribNames.find(attrib, name)) + if (attribNames.find((VertexAttribID) i, name)) glBindAttribLocation(program, i, (const GLchar *) name); } @@ -305,13 +288,13 @@ bool Shader::loadVolatile() throw love::Exception("Cannot link shader program object:\n%s", warnings.c_str()); } - // Retrieve all active uniform variables in this shader from OpenGL. + // Get all active uniform variables in this shader from OpenGL. mapActiveUniforms(); - for (int i = 0; i < int(OpenGL::ATTRIB_MAX_ENUM); i++) + for (int i = 0; i < int(ATTRIB_MAX_ENUM); i++) { const char *name = nullptr; - if (attribNames.find(OpenGL::VertexAttrib(i), name)) + if (attribNames.find(VertexAttribID(i), name)) builtinAttributes[i] = glGetAttribLocation(program, name); else builtinAttributes[i] = -1; @@ -322,7 +305,7 @@ bool Shader::loadVolatile() // make sure glUseProgram gets called. current = nullptr; attach(); - checkSetScreenParams(); + checkSetBuiltinUniforms(); } return true; @@ -348,7 +331,9 @@ void Shader::unloadVolatile() // active texture list is probably invalid, clear it activeTexUnits.clear(); - activeTexUnits.insert(activeTexUnits.begin(), maxTexUnits, 0); + activeTexUnits.resize(gl.getMaxTextureUnits() - 1, 0); + + attributes.clear(); // same with uniform location list uniforms.clear(); @@ -399,12 +384,10 @@ std::string Shader::getWarnings() const void Shader::attach(bool temporary) { - Shader *oldshader = current; - if (oldshader != this) + if (current != this) { glUseProgram(program); current = this; - // retain/release happens in Graphics::setShader. } @@ -425,20 +408,18 @@ void Shader::attach(bool temporary) void Shader::detach() { - // We always need a shader set in ES2. - if (GLAD_ES_VERSION_2_0) + if (defaultShader) { - if (defaultShader && current != defaultShader) + if (current != defaultShader) defaultShader->attach(); + + return; } - else - { - if (current != nullptr) - { - glUseProgram(0); - current = nullptr; - } - } + + if (current != nullptr) + glUseProgram(0); + + current = nullptr; } const Shader::Uniform &Shader::getUniform(const std::string &name) const @@ -452,72 +433,6 @@ const Shader::Uniform &Shader::getUniform(const std::string &name) const return it->second; } -int Shader::getUniformTypeSize(GLenum type) const -{ - switch (type) - { - case GL_INT: - case GL_FLOAT: - case GL_BOOL: - case GL_SAMPLER_1D: - case GL_SAMPLER_2D: - case GL_SAMPLER_3D: - return 1; - case GL_INT_VEC2: - case GL_FLOAT_VEC2: - case GL_FLOAT_MAT2: - case GL_BOOL_VEC2: - return 2; - case GL_INT_VEC3: - case GL_FLOAT_VEC3: - case GL_FLOAT_MAT3: - case GL_BOOL_VEC3: - return 3; - case GL_INT_VEC4: - case GL_FLOAT_VEC4: - case GL_FLOAT_MAT4: - case GL_BOOL_VEC4: - return 4; - default: - break; - } - - return 1; -} - -Shader::UniformType Shader::getUniformBaseType(GLenum type) const -{ - switch (type) - { - case GL_INT: - case GL_INT_VEC2: - case GL_INT_VEC3: - case GL_INT_VEC4: - return UNIFORM_INT; - case GL_FLOAT: - case GL_FLOAT_VEC2: - case GL_FLOAT_VEC3: - case GL_FLOAT_VEC4: - case GL_FLOAT_MAT2: - case GL_FLOAT_MAT3: - case GL_FLOAT_MAT4: - return UNIFORM_FLOAT; - case GL_BOOL: - case GL_BOOL_VEC2: - case GL_BOOL_VEC3: - case GL_BOOL_VEC4: - return UNIFORM_BOOL; - case GL_SAMPLER_1D: - case GL_SAMPLER_2D: - case GL_SAMPLER_3D: - return UNIFORM_SAMPLER; - default: - break; - } - - return UNIFORM_UNKNOWN; -} - void Shader::checkSetUniformError(const Uniform &u, int size, int count, UniformType sendtype) const { if (!program) @@ -618,7 +533,7 @@ void Shader::sendMatrix(const std::string &name, int size, const GLfloat *m, int void Shader::sendTexture(const std::string &name, Texture *texture) { - GLuint gltex = texture->getGLTexture(); + GLuint gltex = *(GLuint *) texture->getHandle(); TemporaryAttacher attacher(this); @@ -628,13 +543,10 @@ void Shader::sendTexture(const std::string &name, Texture *texture) checkSetUniformError(u, 1, 1, UNIFORM_SAMPLER); // bind texture to assigned texture unit and send uniform to shader program - gl.bindTextureToUnit(gltex, texunit, false); + gl.bindTextureToUnit(gltex, texunit, true); glUniform1i(u.location, texunit); - // reset texture unit - gl.setTextureUnit(0); - // increment global shader texture id counter for this texture unit, if we haven't already if (activeTexUnits[texunit-1] == 0) ++textureCounters[texunit-1]; @@ -647,11 +559,12 @@ void Shader::sendTexture(const std::string &name, Texture *texture) void Shader::retainObject(const std::string &name, Object *object) { + object->retain(); + auto it = boundRetainables.find(name); if (it != boundRetainables.end()) it->second->release(); - object->retain(); boundRetainables[name] = object; } @@ -670,7 +583,7 @@ int Shader::getTextureUnit(const std::string &name) if (freeunit_it != textureCounters.end()) { // we don't want to use unit 0 - texunit = std::distance(textureCounters.begin(), freeunit_it) + 1; + texunit = (int) std::distance(textureCounters.begin(), freeunit_it) + 1; } else { @@ -681,7 +594,7 @@ int Shader::getTextureUnit(const std::string &name) throw love::Exception("No more texture units available for shader."); // we don't want to use unit 0 - texunit = std::distance(activeTexUnits.begin(), nextunit_it) + 1; + texunit = (int) std::distance(activeTexUnits.begin(), nextunit_it) + 1; } texUnitPool[name] = texunit; @@ -705,73 +618,23 @@ Shader::UniformType Shader::getExternVariable(const std::string &name, int &comp return it->second.baseType; } -bool Shader::hasVertexAttrib(OpenGL::VertexAttrib attrib) const +GLint Shader::getAttribLocation(const std::string &name) +{ + auto it = attributes.find(name); + if (it != attributes.end()) + return it->second; + + GLint location = glGetAttribLocation(program, name.c_str()); + + attributes[name] = location; + return location; +} + +bool Shader::hasVertexAttrib(VertexAttribID attrib) const { return builtinAttributes[int(attrib)] != -1; } -bool Shader::hasBuiltinUniform(BuiltinUniform builtin) const -{ - return builtinUniforms[int(builtin)] != -1; -} - -bool Shader::sendBuiltinFloat(BuiltinUniform builtin, int size, const GLfloat *vec, int count) -{ - if (!hasBuiltinUniform(builtin)) - return false; - - GLint location = builtinUniforms[int(builtin)]; - - TemporaryAttacher attacher(this); - - switch (size) - { - case 1: - glUniform1fv(location, count, vec); - break; - case 2: - glUniform2fv(location, count, vec); - break; - case 3: - glUniform3fv(location, count, vec); - break; - case 4: - glUniform4fv(location, count, vec); - break; - default: - return false; - } - - return true; -} - -bool Shader::sendBuiltinMatrix(BuiltinUniform builtin, int size, const GLfloat *m, int count) -{ - if (!hasBuiltinUniform(builtin)) - return false; - - GLint location = builtinUniforms[GLint(builtin)]; - - TemporaryAttacher attacher(this); - - switch (size) - { - case 2: - glUniformMatrix2fv(location, count, GL_FALSE, m); - break; - case 3: - glUniformMatrix3fv(location, count, GL_FALSE, m); - break; - case 4: - glUniformMatrix4fv(location, count, GL_FALSE, m); - break; - default: - return false; - } - - return true; -} - void Shader::checkSetScreenParams() { OpenGL::Viewport view = gl.getViewport(); @@ -780,33 +643,115 @@ void Shader::checkSetScreenParams() return; // In the shader, we do pixcoord.y = gl_FragCoord.y * params.z + params.w. - // This lets us flip pixcoord.y when needed, to be consistent (Canvases - // have flipped y-values for pixel coordinates.) + // This lets us flip pixcoord.y when needed, to be consistent (drawing with + // no Canvas active makes the y-values for pixel coordinates flipped.) GLfloat params[] = { (GLfloat) view.w, (GLfloat) view.h, 0.0f, 0.0f, }; if (Canvas::current != nullptr) - { - // gl_FragCoord.y is flipped in Canvases, so we un-flip: - // pixcoord.y = gl_FragCoord.y * -1.0 + height. - params[2] = -1.0f; - params[3] = (GLfloat) view.h; - } - else { // No flipping: pixcoord.y = gl_FragCoord.y * 1.0 + 0.0. params[2] = 1.0f; params[3] = 0.0f; } + else + { + // gl_FragCoord.y is flipped when drawing to the screen, so we un-flip: + // pixcoord.y = gl_FragCoord.y * -1.0 + height. + params[2] = -1.0f; + params[3] = (GLfloat) view.h; + } - sendBuiltinFloat(BUILTIN_SCREEN_SIZE, 4, params, 1); + GLint location = builtinUniforms[BUILTIN_SCREEN_SIZE]; + + if (location >= 0) + { + TemporaryAttacher attacher(this); + glUniform4fv(location, 1, params); + } lastCanvas = Canvas::current; lastViewport = view; } +void Shader::checkSetPointSize(float size) +{ + if (size == lastPointSize) + return; + + GLint location = builtinUniforms[BUILTIN_POINT_SIZE]; + + if (location >= 0) + { + TemporaryAttacher attacher(this); + glUniform1f(location, size); + } + + lastPointSize = size; +} + +void Shader::checkSetBuiltinUniforms() +{ + checkSetScreenParams(); + + // We use a more efficient method for sending transformation matrices to + // the GPU on desktop GL. + if (GLAD_ES_VERSION_2_0) + { + checkSetPointSize(gl.getPointSize()); + + const Matrix4 &curxform = gl.matrices.transform.back(); + const Matrix4 &curproj = gl.matrices.projection.back(); + + TemporaryAttacher attacher(this); + + bool tpmatrixneedsupdate = false; + + // Only upload the matrices if they've changed. + if (memcmp(curxform.getElements(), lastTransformMatrix.getElements(), sizeof(float) * 16) != 0) + { + GLint location = builtinUniforms[BUILTIN_TRANSFORM_MATRIX]; + if (location >= 0) + glUniformMatrix4fv(location, 1, GL_FALSE, curxform.getElements()); + + // Also upload the re-calculated normal matrix, if possible. The + // normal matrix is the transpose of the inverse of the rotation + // portion (top-left 3x3) of the transform matrix. + location = builtinUniforms[BUILTIN_NORMAL_MATRIX]; + if (location >= 0) + { + Matrix3 normalmatrix = Matrix3(curxform).transposedInverse(); + glUniformMatrix3fv(location, 1, GL_FALSE, normalmatrix.getElements()); + } + + tpmatrixneedsupdate = true; + lastTransformMatrix = curxform; + } + + if (memcmp(curproj.getElements(), lastProjectionMatrix.getElements(), sizeof(float) * 16) != 0) + { + GLint location = builtinUniforms[BUILTIN_PROJECTION_MATRIX]; + if (location >= 0) + glUniformMatrix4fv(location, 1, GL_FALSE, curproj.getElements()); + + tpmatrixneedsupdate = true; + lastProjectionMatrix = curproj; + } + + if (tpmatrixneedsupdate) + { + GLint location = builtinUniforms[BUILTIN_TRANSFORM_PROJECTION_MATRIX]; + if (location >= 0) + { + Matrix4 tp_matrix(curproj * curxform); + glUniformMatrix4fv(location, 1, GL_FALSE, tp_matrix.getElements()); + } + } + } +} + const std::map &Shader::getBoundRetainables() const { return boundRetainables; @@ -814,11 +759,7 @@ const std::map &Shader::getBoundRetainables() const std::string Shader::getGLSLVersion() { - const char *tmp = nullptr; - - // GL_SHADING_LANGUAGE_VERSION isn't available in OpenGL < 2.0. - if (GLAD_ES_VERSION_2_0 || GLAD_VERSION_2_0 || GLAD_ARB_shading_language_100) - tmp = (const char *) glGetString(GL_SHADING_LANGUAGE_VERSION); + const char *tmp = (const char *) glGetString(GL_SHADING_LANGUAGE_VERSION); if (tmp == nullptr) return "0.0"; @@ -835,7 +776,69 @@ std::string Shader::getGLSLVersion() bool Shader::isSupported() { - return GLAD_ES_VERSION_2_0 || (GLAD_VERSION_2_0 && getGLSLVersion() >= "1.2"); + return GLAD_ES_VERSION_2_0 || (getGLSLVersion() >= "1.2"); +} + +int Shader::getUniformTypeSize(GLenum type) const +{ + switch (type) + { + case GL_INT: + case GL_FLOAT: + case GL_BOOL: + case GL_SAMPLER_1D: + case GL_SAMPLER_2D: + case GL_SAMPLER_3D: + return 1; + case GL_INT_VEC2: + case GL_FLOAT_VEC2: + case GL_FLOAT_MAT2: + case GL_BOOL_VEC2: + return 2; + case GL_INT_VEC3: + case GL_FLOAT_VEC3: + case GL_FLOAT_MAT3: + case GL_BOOL_VEC3: + return 3; + case GL_INT_VEC4: + case GL_FLOAT_VEC4: + case GL_FLOAT_MAT4: + case GL_BOOL_VEC4: + return 4; + default: + return 1; + } +} + +Shader::UniformType Shader::getUniformBaseType(GLenum type) const +{ + switch (type) + { + case GL_INT: + case GL_INT_VEC2: + case GL_INT_VEC3: + case GL_INT_VEC4: + return UNIFORM_INT; + case GL_FLOAT: + case GL_FLOAT_VEC2: + case GL_FLOAT_VEC3: + case GL_FLOAT_VEC4: + case GL_FLOAT_MAT2: + case GL_FLOAT_MAT3: + case GL_FLOAT_MAT4: + return UNIFORM_FLOAT; + case GL_BOOL: + case GL_BOOL_VEC2: + case GL_BOOL_VEC3: + case GL_BOOL_VEC4: + return UNIFORM_BOOL; + case GL_SAMPLER_1D: + case GL_SAMPLER_2D: + case GL_SAMPLER_3D: + return UNIFORM_SAMPLER; + default: + return UNIFORM_UNKNOWN; + } } bool Shader::getConstant(const char *in, UniformType &out) @@ -848,6 +851,16 @@ bool Shader::getConstant(UniformType in, const char *&out) return uniformTypes.find(in, out); } +bool Shader::getConstant(const char *in, VertexAttribID &out) +{ + return attribNames.find(in, out); +} + +bool Shader::getConstant(VertexAttribID in, const char *&out) +{ + return attribNames.find(in, out); +} + StringMap::Entry Shader::stageNameEntries[] = { {"vertex", Shader::STAGE_VERTEX}, @@ -867,21 +880,22 @@ StringMap::Entry Shader::uniformT StringMap Shader::uniformTypes(Shader::uniformTypeEntries, sizeof(Shader::uniformTypeEntries)); -StringMap::Entry Shader::attribNameEntries[] = +StringMap::Entry Shader::attribNameEntries[] = { - {"VertexPosition", OpenGL::ATTRIB_POS}, - {"VertexTexCoord", OpenGL::ATTRIB_TEXCOORD}, - {"VertexColor", OpenGL::ATTRIB_COLOR}, - {"love_PseudoInstanceID", OpenGL::ATTRIB_PSEUDO_INSTANCE_ID}, + {"VertexPosition", ATTRIB_POS}, + {"VertexTexCoord", ATTRIB_TEXCOORD}, + {"VertexColor", ATTRIB_COLOR}, + {"ConstantColor", ATTRIB_CONSTANTCOLOR}, }; -StringMap Shader::attribNames(Shader::attribNameEntries, sizeof(Shader::attribNameEntries)); +StringMap Shader::attribNames(Shader::attribNameEntries, sizeof(Shader::attribNameEntries)); StringMap::Entry Shader::builtinNameEntries[] = { {"TransformMatrix", Shader::BUILTIN_TRANSFORM_MATRIX}, {"ProjectionMatrix", Shader::BUILTIN_PROJECTION_MATRIX}, {"TransformProjectionMatrix", Shader::BUILTIN_TRANSFORM_PROJECTION_MATRIX}, + {"NormalMatrix", Shader::BUILTIN_NORMAL_MATRIX}, {"love_PointSize", Shader::BUILTIN_POINT_SIZE}, {"love_ScreenSize", Shader::BUILTIN_SCREEN_SIZE}, }; diff --git a/jni/love/src/modules/graphics/opengl/Shader.h b/jni/love/src/modules/graphics/opengl/Shader.h index 721bd0aa..47e7d294 100644 --- a/jni/love/src/modules/graphics/opengl/Shader.h +++ b/jni/love/src/modules/graphics/opengl/Shader.h @@ -25,8 +25,9 @@ #include "common/Object.h" #include "common/StringMap.h" #include "graphics/Graphics.h" +#include "graphics/Texture.h" +#include "graphics/Volatile.h" #include "OpenGL.h" -#include "Texture.h" // STL #include @@ -47,12 +48,6 @@ class Shader : public Object, public Volatile { public: - // Pointer to currently active Shader. - static Shader *current; - - // Pointer to the current default Shader. - static Shader *defaultShader; - enum ShaderStage { STAGE_VERTEX, @@ -66,6 +61,7 @@ public: BUILTIN_TRANSFORM_MATRIX = 0, BUILTIN_PROJECTION_MATRIX, BUILTIN_TRANSFORM_PROJECTION_MATRIX, + BUILTIN_NORMAL_MATRIX, BUILTIN_POINT_SIZE, BUILTIN_SCREEN_SIZE, BUILTIN_MAX_ENUM @@ -88,6 +84,15 @@ public: std::string pixel; }; + // Pointer to currently active Shader. + static Shader *current; + + // Pointer to the default Shader. + static Shader *defaultShader; + + // Default shader code (a shader is always required internally.) + static ShaderSource defaultCode[Graphics::RENDERER_MAX_ENUM]; + /** * Creates a new Shader using a list of source codes. * Source must contain either vertex or pixel shader code, or both. @@ -170,26 +175,28 @@ public: **/ UniformType getExternVariable(const std::string &name, int &components, int &count); + GLint getAttribLocation(const std::string &name); + /** * Internal use only. **/ - bool hasVertexAttrib(OpenGL::VertexAttrib attrib) const; - bool hasBuiltinUniform(BuiltinUniform builtin) const; - bool sendBuiltinMatrix(BuiltinUniform builtin, int size, const GLfloat *m, int count); - bool sendBuiltinFloat(BuiltinUniform builtin, int size, const GLfloat *m, int count); + bool hasVertexAttrib(VertexAttribID attrib) const; + void checkSetScreenParams(); + void checkSetPointSize(float size); + void checkSetBuiltinUniforms(); const std::map &getBoundRetainables() const; static std::string getGLSLVersion(); static bool isSupported(); - // Default code used when renderers require code for a shader stage. - static ShaderSource defaultCode[Graphics::RENDERER_MAX_ENUM]; - static bool getConstant(const char *in, UniformType &out); static bool getConstant(UniformType in, const char *&out); + static bool getConstant(const char *in, VertexAttribID &out); + static bool getConstant(VertexAttribID in, const char *&out); + private: // Represents a single uniform/extern shader variable. @@ -233,7 +240,9 @@ private: GLint builtinUniforms[BUILTIN_MAX_ENUM]; // Location values for any generic vertex attribute variables. - GLint builtinAttributes[OpenGL::ATTRIB_MAX_ENUM]; + GLint builtinAttributes[ATTRIB_MAX_ENUM]; + + std::map attributes; // Uniform location buffer map std::map uniforms; @@ -249,8 +258,10 @@ private: Canvas *lastCanvas; OpenGL::Viewport lastViewport; - // Max GPU texture units available for sent images - static GLint maxTexUnits; + float lastPointSize; + + Matrix4 lastTransformMatrix; + Matrix4 lastProjectionMatrix; // Counts total number of textures bound to each texture unit in all shaders static std::vector textureCounters; @@ -262,13 +273,13 @@ private: static StringMap uniformTypes; // Names for the generic vertex attributes used by love. - static StringMap::Entry attribNameEntries[]; - static StringMap attribNames; + static StringMap::Entry attribNameEntries[]; + static StringMap attribNames; + // Names for the built-in uniform variables. static StringMap::Entry builtinNameEntries[]; static StringMap builtinNames; - -}; // Shader +}; } // opengl } // graphics diff --git a/jni/love/src/modules/graphics/opengl/SpriteBatch.cpp b/jni/love/src/modules/graphics/opengl/SpriteBatch.cpp index c7495766..c15a9417 100644 --- a/jni/love/src/modules/graphics/opengl/SpriteBatch.cpp +++ b/jni/love/src/modules/graphics/opengl/SpriteBatch.cpp @@ -25,8 +25,8 @@ #include "OpenGL.h" // LOVE -#include "VertexBuffer.h" -#include "Texture.h" +#include "GLBuffer.h" +#include "graphics/Texture.h" // C++ #include @@ -41,39 +41,26 @@ namespace graphics namespace opengl { -SpriteBatch::SpriteBatch(Texture *texture, int size, int usage) +SpriteBatch::SpriteBatch(Texture *texture, int size, Mesh::Usage usage) : texture(texture) , size(size) , next(0) , color(0) , array_buf(nullptr) - , element_buf(size) + , quad_indices(size) , buffer_used_offset(0) , buffer_used_size(0) { if (size <= 0) throw love::Exception("Invalid SpriteBatch size."); - GLenum gl_usage; - switch (usage) - { - default: - case USAGE_DYNAMIC: - gl_usage = GL_DYNAMIC_DRAW; - break; - case USAGE_STATIC: - gl_usage = GL_STATIC_DRAW; - break; - case USAGE_STREAM: - gl_usage = GL_STREAM_DRAW; - break; - } + GLenum gl_usage = Mesh::getGLBufferUsage(usage); const size_t vertex_size = sizeof(Vertex) * 4 * size; try { - array_buf = VertexBuffer::Create(vertex_size, GL_ARRAY_BUFFER, gl_usage); + array_buf = new GLBuffer(vertex_size, nullptr, GL_ARRAY_BUFFER, gl_usage); } catch (love::Exception &) { @@ -99,7 +86,7 @@ int SpriteBatch::add(float x, float y, float a, float sx, float sy, float ox, fl if ((index == -1 && next >= size) || index < -1 || index >= size) return -1; - Matrix t(x, y, a, sx, sy, ox, oy, kx, ky); + Matrix4 t(x, y, a, sx, sy, ox, oy, kx, ky); addv(texture->getVertices(), t, (index == -1) ? next : index); @@ -116,7 +103,7 @@ int SpriteBatch::addq(Quad *quad, float x, float y, float a, float sx, float sy, if ((index == -1 && next >= size) || index < -1 || index >= next) return -1; - Matrix t(x, y, a, sx, sy, ox, oy, kx, ky); + Matrix4 t(x, y, a, sx, sy, ox, oy, kx, ky); addv(quad->getVertices(), t, (index == -1) ? next : index); @@ -135,7 +122,7 @@ void SpriteBatch::clear() void SpriteBatch::flush() { - VertexBuffer::Bind bind(*array_buf); + GLBuffer::Bind bind(*array_buf); array_buf->unmap(buffer_used_offset, buffer_used_size); buffer_used_offset = buffer_used_size = 0; @@ -162,7 +149,7 @@ void SpriteBatch::setColor(const Color &color) void SpriteBatch::setColor() { delete color; - color = 0; + color = nullptr; } const Color *SpriteBatch::getColor() const @@ -183,26 +170,26 @@ void SpriteBatch::setBufferSize(int newsize) if (newsize == size) return; - // Map (lock) the old VertexBuffer to get a pointer to its data. + // Map the old GLBuffer to get a pointer to its data. void *old_data = nullptr; { - VertexBuffer::Bind bind(*array_buf); + GLBuffer::Bind bind(*array_buf); old_data = array_buf->map(); } size_t vertex_size = sizeof(Vertex) * 4 * newsize; - VertexBuffer *new_array_buf = nullptr; + GLBuffer *new_array_buf = nullptr; try { - new_array_buf = VertexBuffer::Create(vertex_size, array_buf->getTarget(), array_buf->getUsage()); + new_array_buf = new GLBuffer(vertex_size, nullptr, array_buf->getTarget(), array_buf->getUsage()); - // Copy as much of the old data into the new VertexBuffer as can fit. - VertexBuffer::Bind bind(*new_array_buf); + // Copy as much of the old data into the new GLBuffer as can fit. + GLBuffer::Bind bind(*new_array_buf); void *new_data = new_array_buf->map(); memcpy(new_data, old_data, sizeof(Vertex) * 4 * std::min(newsize, size)); - element_buf = VertexIndex(newsize); + quad_indices = QuadIndices(newsize); } catch (love::Exception &) { @@ -210,7 +197,7 @@ void SpriteBatch::setBufferSize(int newsize) throw; } - // We don't need to unmap the old VertexBuffer since we're deleting it. + // We don't need to unmap the old GLBuffer since we're deleting it. delete array_buf; array_buf = new_array_buf; @@ -226,58 +213,48 @@ int SpriteBatch::getBufferSize() const void SpriteBatch::draw(float x, float y, float angle, float sx, float sy, float ox, float oy, float kx, float ky) { - const size_t pos_offset = offsetof(Vertex, x); + const size_t pos_offset = offsetof(Vertex, x); const size_t texel_offset = offsetof(Vertex, s); const size_t color_offset = offsetof(Vertex, r); if (next == 0) return; - Matrix t(x, y, angle, sx, sy, ox, oy, kx, ky); + OpenGL::TempDebugGroup debuggroup("SpriteBatch draw"); + + Matrix4 t(x, y, angle, sx, sy, ox, oy, kx, ky); OpenGL::TempTransform transform(gl); transform.get() *= t; - texture->predraw(); + gl.bindTexture(*(GLuint *) texture->getHandle()); - VertexBuffer::Bind array_bind(*array_buf); - VertexBuffer::Bind element_bind(*element_buf.getVertexBuffer()); + GLBuffer::Bind array_bind(*array_buf); + GLBuffer::Bind element_bind(*quad_indices.getBuffer()); // Make sure the VBO isn't mapped when we draw (sends data to GPU if needed.) array_buf->unmap(buffer_used_offset, buffer_used_size); buffer_used_offset = buffer_used_size = 0; - Color curcolor = gl.getColor(); + uint32 enabledattribs = ATTRIBFLAG_POS | ATTRIBFLAG_TEXCOORD; // Apply per-sprite color, if a color is set. if (color) { - gl.enableVertexAttribArray(OpenGL::ATTRIB_COLOR); - gl.setVertexAttribArray(OpenGL::ATTRIB_COLOR, 4, GL_UNSIGNED_BYTE, sizeof(Vertex), array_buf->getPointer(color_offset)); + enabledattribs |= ATTRIBFLAG_COLOR; + glVertexAttribPointer(ATTRIB_COLOR, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(Vertex), array_buf->getPointer(color_offset)); } - gl.enableVertexAttribArray(OpenGL::ATTRIB_POS); - gl.setVertexAttribArray(OpenGL::ATTRIB_POS, 2, GL_FLOAT, sizeof(Vertex), array_buf->getPointer(pos_offset)); + glVertexAttribPointer(ATTRIB_POS, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), array_buf->getPointer(pos_offset)); + glVertexAttribPointer(ATTRIB_TEXCOORD, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), array_buf->getPointer(texel_offset)); - gl.enableVertexAttribArray(OpenGL::ATTRIB_TEXCOORD); - gl.setVertexAttribArray(OpenGL::ATTRIB_TEXCOORD, 2, GL_FLOAT, sizeof(Vertex), array_buf->getPointer(texel_offset)); + gl.useVertexAttribArrays(enabledattribs); gl.prepareDraw(); - gl.drawElements(GL_TRIANGLES, element_buf.getIndexCount(next), element_buf.getType(), element_buf.getPointer(0)); - - gl.disableVertexAttribArray(OpenGL::ATTRIB_POS); - gl.disableVertexAttribArray(OpenGL::ATTRIB_TEXCOORD); - - if (color) - { - gl.disableVertexAttribArray(OpenGL::ATTRIB_COLOR); - gl.setColor(curcolor); - } - - texture->postdraw(); + gl.drawElements(GL_TRIANGLES, (GLsizei) quad_indices.getIndexCount(next), quad_indices.getType(), quad_indices.getPointer(0)); } -void SpriteBatch::addv(const Vertex *v, const Matrix &m, int index) +void SpriteBatch::addv(const Vertex *v, const Matrix4 &m, int index) { // Needed for colors. Vertex sprite[4] = {v[0], v[1], v[2], v[3]}; @@ -288,7 +265,7 @@ void SpriteBatch::addv(const Vertex *v, const Matrix &m, int index) if (color) setColorv(sprite, *color); - VertexBuffer::Bind bind(*array_buf); + GLBuffer::Bind bind(*array_buf); // Always keep the VBO mapped when adding data for now (it'll be unmapped // on draw.) @@ -311,25 +288,6 @@ void SpriteBatch::setColorv(Vertex *v, const Color &color) } } -bool SpriteBatch::getConstant(const char *in, UsageHint &out) -{ - return usageHints.find(in, out); -} - -bool SpriteBatch::getConstant(UsageHint in, const char *&out) -{ - return usageHints.find(in, out); -} - -StringMap::Entry SpriteBatch::usageHintEntries[] = -{ - {"dynamic", SpriteBatch::USAGE_DYNAMIC}, - {"static", SpriteBatch::USAGE_STATIC}, - {"stream", SpriteBatch::USAGE_STREAM}, -}; - -StringMap SpriteBatch::usageHints(usageHintEntries, sizeof(usageHintEntries)); - } // opengl } // graphics } // love diff --git a/jni/love/src/modules/graphics/opengl/SpriteBatch.h b/jni/love/src/modules/graphics/opengl/SpriteBatch.h index 9f9188f4..28e33af4 100644 --- a/jni/love/src/modules/graphics/opengl/SpriteBatch.h +++ b/jni/love/src/modules/graphics/opengl/SpriteBatch.h @@ -27,36 +27,29 @@ // LOVE #include "common/math.h" #include "common/Matrix.h" -#include "common/StringMap.h" #include "graphics/Drawable.h" #include "graphics/Volatile.h" #include "graphics/Color.h" #include "graphics/Quad.h" -#include "VertexBuffer.h" +#include "GLBuffer.h" +#include "Mesh.h" namespace love { namespace graphics { -namespace opengl -{ // Forward declarations. class Texture; +namespace opengl +{ + class SpriteBatch : public Drawable { public: - enum UsageHint - { - USAGE_DYNAMIC, - USAGE_STATIC, - USAGE_STREAM, - USAGE_MAX_ENUM - }; - - SpriteBatch(Texture *texture, int size, int usage); + SpriteBatch(Texture *texture, int size, Mesh::Usage usage); virtual ~SpriteBatch(); int add(float x, float y, float a, float sx, float sy, float ox, float oy, float kx, float ky, int index = -1); @@ -108,12 +101,9 @@ public: // Implements Drawable. void draw(float x, float y, float angle, float sx, float sy, float ox, float oy, float kx, float ky); - static bool getConstant(const char *in, UsageHint &out); - static bool getConstant(UsageHint in, const char *&out); - private: - void addv(const Vertex *v, const Matrix &m, int index); + void addv(const Vertex *v, const Matrix4 &m, int index); /** * Set the color for vertices. @@ -136,16 +126,13 @@ private: // added sprite. Color *color; - VertexBuffer *array_buf; - VertexIndex element_buf; + GLBuffer *array_buf; + QuadIndices quad_indices; // The portion of the vertex buffer that's been modified while mapped. size_t buffer_used_offset; size_t buffer_used_size; - static StringMap::Entry usageHintEntries[]; - static StringMap usageHints; - }; // SpriteBatch } // opengl diff --git a/jni/love/src/modules/graphics/opengl/Text.cpp b/jni/love/src/modules/graphics/opengl/Text.cpp new file mode 100644 index 00000000..5758a9d0 --- /dev/null +++ b/jni/love/src/modules/graphics/opengl/Text.cpp @@ -0,0 +1,279 @@ +/** + * Copyright (c) 2006-2015 LOVE Development Team + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. + **/ + +#include "Text.h" +#include "common/Matrix.h" + +#include + +namespace love +{ +namespace graphics +{ +namespace opengl +{ + +Text::Text(Font *font, const std::string &text) + : font(font) + , vbo(nullptr) + , text_info() + , vert_offset(0) + , texture_cache_id((uint32) -1) +{ + set(text); +} + +Text::~Text() +{ + delete vbo; +} + +void Text::uploadVertices(const std::vector &vertices, size_t vertoffset) +{ + size_t offset = vertoffset * sizeof(Font::GlyphVertex); + size_t datasize = vertices.size() * sizeof(Font::GlyphVertex); + uint8 *vbodata = nullptr; + + // If we haven't created a VBO or the vertices are too big, make a new one. + if (datasize > 0 && (!vbo || (offset + datasize) > vbo->getSize())) + { + // Make it bigger than necessary to reduce potential future allocations. + size_t newsize = size_t((offset + datasize) * 1.5); + if (vbo != nullptr) + newsize = std::max(size_t(vbo->getSize() * 1.5), newsize); + + GLBuffer *new_vbo = new GLBuffer(newsize, nullptr, GL_ARRAY_BUFFER, GL_DYNAMIC_DRAW); + + if (vbo != nullptr) + { + try + { + GLBuffer::Bind bind(*vbo); + vbodata = (uint8 *) vbo->map(); + } + catch (love::Exception &) + { + delete new_vbo; + throw; + } + + GLBuffer::Bind bind(*new_vbo); + new_vbo->fill(0, vbo->getSize(), vbodata); + } + + delete vbo; + vbo = new_vbo; + } + + if (vbo != nullptr) + { + GLBuffer::Bind bind(*vbo); + vbodata = (uint8 *) vbo->map(); + memcpy(vbodata + offset, &vertices[0], datasize); + // We unmap when we draw, to avoid unnecessary full map()/unmap() calls. + } +} + +void Text::regenerateVertices() +{ + // If the font's texture cache was invalidated then we need to recreate the + // text's vertices, since glyph texcoords might have changed. + if (font->getTextureCacheID() != texture_cache_id) + { + std::vector textdata = text_data; + + clear(); + + for (const TextData &t : textdata) + addTextData(t); + + texture_cache_id = font->getTextureCacheID(); + } +} + +void Text::addTextData(const TextData &t) +{ + std::vector vertices; + std::vector new_commands; + + // We only have formatted text if the align mode is valid. + if (t.align == Font::ALIGN_MAX_ENUM) + new_commands = font->generateVertices(t.text, vertices, 0.0f, Vector(0.0f, 0.0f), &text_info); + else + new_commands = font->generateVerticesFormatted(t.text, t.wrap, t.align, vertices, &text_info); + + if (t.use_matrix) + t.matrix.transform(&vertices[0], &vertices[0], (int) vertices.size()); + + size_t voffset = vert_offset; + + if (!t.append_vertices) + { + voffset = 0; + draw_commands.clear(); + } + + uploadVertices(vertices, voffset); + + if (!new_commands.empty()) + { + // The start vertex should be adjusted to account for the vertex offset. + for (Font::DrawCommand &cmd : new_commands) + cmd.startvertex += (int) voffset; + + auto firstcmd = new_commands.begin(); + + // If the first draw command in the new list has the same texture as the + // last one in the existing list we're building and its vertices are + // in-order, we can combine them (saving a draw call.) + if (!draw_commands.empty()) + { + auto prevcmd = draw_commands.back(); + if (prevcmd.texture == firstcmd->texture && (prevcmd.startvertex + prevcmd.vertexcount) == firstcmd->startvertex) + { + draw_commands.back().vertexcount += firstcmd->vertexcount; + ++firstcmd; + } + } + + // Append the new draw commands to the list we're building. + draw_commands.insert(draw_commands.end(), firstcmd, new_commands.end()); + } + + vert_offset = voffset + vertices.size(); + text_data.push_back(t); + + // Font::generateVertices can invalidate the font's texture cache. + if (font->getTextureCacheID() != texture_cache_id) + regenerateVertices(); +} + +void Text::set(const std::string &text) +{ + if (text.empty()) + return set(); + + addTextData({text, -1.0f, Font::ALIGN_MAX_ENUM, false, false, Matrix4()}); +} + +void Text::set(const std::string &text, float wrap, Font::AlignMode align) +{ + if (text.empty()) + return set(); + + addTextData({text, wrap, align, false, false, Matrix4()}); +} + +void Text::set() +{ + clear(); +} + +void Text::add(const std::string &text, float x, float y, float angle, float sx, float sy, float ox, float oy, float kx, float ky) +{ + if (text.empty()) + return; + + Matrix4 m(x, y, angle, sx, sy, ox, oy, kx, ky); + + addTextData({text, -1.0f, Font::ALIGN_MAX_ENUM, true, true, m}); +} + +void Text::addf(const std::string &text, float wrap, Font::AlignMode align, float x, float y, float angle, float sx, float sy, float ox, float oy, float kx, float ky) +{ + if (text.empty()) + return; + + Matrix4 m(x, y, angle, sx, sy, ox, oy, kx, ky); + + addTextData({text, wrap, align, true, true, m}); +} + +void Text::clear() +{ + text_data.clear(); + draw_commands.clear(); + texture_cache_id = font->getTextureCacheID(); + text_info = {}; + vert_offset = 0; +} + +void Text::draw(float x, float y, float angle, float sx, float sy, float ox, float oy, float kx, float ky) +{ + if (vbo == nullptr || draw_commands.empty()) + return; + + OpenGL::TempDebugGroup debuggroup("Text object draw"); + + // Re-generate the text if the Font's texture cache was invalidated. + if (font->getTextureCacheID() != texture_cache_id) + regenerateVertices(); + + const size_t pos_offset = offsetof(Font::GlyphVertex, x); + const size_t tex_offset = offsetof(Font::GlyphVertex, s); + const size_t stride = sizeof(Font::GlyphVertex); + + Matrix4 t(ceilf(x), ceilf(y), angle, sx, sy, ox, oy, kx, ky); + + OpenGL::TempTransform transform(gl); + transform.get() *= t; + + { + GLBuffer::Bind bind(*vbo); + vbo->unmap(); // Make sure all pending data is flushed to the GPU. + + // Font::drawVertices expects AttribPointer calls to be done already. + glVertexAttribPointer(ATTRIB_POS, 2, GL_FLOAT, GL_FALSE, stride, vbo->getPointer(pos_offset)); + glVertexAttribPointer(ATTRIB_TEXCOORD, 2, GL_FLOAT, GL_FALSE, stride, vbo->getPointer(tex_offset)); + } + + gl.useVertexAttribArrays(ATTRIBFLAG_POS | ATTRIBFLAG_TEXCOORD); + + font->drawVertices(draw_commands); +} + +void Text::setFont(Font *f) +{ + font.set(f); + + // Invalidate the texture cache ID since the font is different. We also have + // to re-upload all the vertices based on the new font's textures. + texture_cache_id = (uint32) -1; + regenerateVertices(); +} + +Font *Text::getFont() const +{ + return font.get(); +} + +int Text::getWidth() const +{ + return text_info.width; +} + +int Text::getHeight() const +{ + return text_info.height; +} + +} // opengl +} // graphics +} // love diff --git a/jni/love/src/modules/graphics/opengl/Text.h b/jni/love/src/modules/graphics/opengl/Text.h new file mode 100644 index 00000000..1e8b70d3 --- /dev/null +++ b/jni/love/src/modules/graphics/opengl/Text.h @@ -0,0 +1,103 @@ +/** + * Copyright (c) 2006-2015 LOVE Development Team + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. + **/ + +#ifndef LOVE_GRAPHICS_OPENGL_TEXT_H +#define LOVE_GRAPHICS_OPENGL_TEXT_H + +// LOVE +#include "common/config.h" +#include "graphics/Drawable.h" +#include "Font.h" +#include "GLBuffer.h" + +namespace love +{ +namespace graphics +{ +namespace opengl +{ + +class Text : public Drawable +{ +public: + + Text(Font *font, const std::string &text = ""); + virtual ~Text(); + + void set(const std::string &text); + void set(const std::string &text, float wrap, Font::AlignMode align); + void set(); + + void add(const std::string &text, float x, float y, float angle, float sx, float sy, float ox, float oy, float kx, float ky); + void addf(const std::string &text, float wrap, Font::AlignMode align, float x, float y, float angle, float sx, float sy, float ox, float oy, float kx, float ky); + void clear(); + + // Implements Drawable. + virtual void draw(float x, float y, float angle, float sx, float sy, float ox, float oy, float kx, float ky); + + void setFont(Font *f); + Font *getFont() const; + + /** + * Gets the width of the currently set text. + **/ + int getWidth() const; + + /** + * Gets the height of the currently set text. + **/ + int getHeight() const; + +private: + + struct TextData + { + std::string text; + float wrap; + Font::AlignMode align; + bool use_matrix; + bool append_vertices; + Matrix4 matrix; + }; + + void uploadVertices(const std::vector &vertices, size_t vertoffset); + void regenerateVertices(); + void addTextData(const TextData &s); + + StrongRef font; + GLBuffer *vbo; + + std::vector draw_commands; + + std::vector text_data; + Font::TextInfo text_info; + + size_t vert_offset; + + // Used so we know when the font's texture cache is invalidated. + uint32 texture_cache_id; + +}; // Text + +} // opengl +} // graphics +} // love + +#endif // LOVE_GRAPHICS_OPENGL_TEXT_H diff --git a/jni/love/src/modules/graphics/opengl/VertexBuffer.cpp b/jni/love/src/modules/graphics/opengl/VertexBuffer.cpp deleted file mode 100644 index 5b45aea2..00000000 --- a/jni/love/src/modules/graphics/opengl/VertexBuffer.cpp +++ /dev/null @@ -1,486 +0,0 @@ -/** - * Copyright (c) 2006-2015 LOVE Development Team - * - * This software is provided 'as-is', without any express or implied - * warranty. In no event will the authors be held liable for any damages - * arising from the use of this software. - * - * Permission is granted to anyone to use this software for any purpose, - * including commercial applications, and to alter it and redistribute it - * freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; you must not - * claim that you wrote the original software. If you use this software - * in a product, an acknowledgment in the product documentation would be - * appreciated but is not required. - * 2. Altered source versions must be plainly marked as such, and must not be - * misrepresented as being the original software. - * 3. This notice may not be removed or altered from any source distribution. - **/ - -#include "VertexBuffer.h" - -#include "common/Exception.h" - -#include -#include -#include -#include - -// Conflicts with std::numeric_limits::max() (Windows). -#ifdef max -# undef max -#endif - -namespace love -{ -namespace graphics -{ -namespace opengl -{ - -// VertexBuffer - -VertexBuffer *VertexBuffer::Create(size_t size, GLenum target, GLenum usage, MemoryBacking backing) -{ - try - { - // Try to create a VBO. - return new VBO(size, target, usage, backing); - } - catch(const love::Exception &) - { - // VBO not supported ... create regular array. - return new VertexArray(size, target, usage, backing); - } -} - -VertexBuffer::VertexBuffer(size_t size, GLenum target, GLenum usage, MemoryBacking backing) - : is_bound(false) - , is_mapped(false) - , size(size) - , target(target) - , usage(usage) - , backing(backing) -{ -} - -VertexBuffer::~VertexBuffer() -{ -} - -// VertexArray - -VertexArray::VertexArray(size_t size, GLenum target, GLenum usage, MemoryBacking backing) - : VertexBuffer(size, target, usage, backing) - , buf(new char[size]) -{ -} - -VertexArray::~VertexArray() -{ - delete [] buf; -} - -void *VertexArray::map() -{ - is_mapped = true; - return buf; -} - -void VertexArray::unmap(size_t /*usedOffset*/, size_t /*usedSize*/) -{ - is_mapped = false; -} - -void VertexArray::bind() -{ - is_bound = true; -} - -void VertexArray::unbind() -{ - is_bound = false; -} - -void VertexArray::fill(size_t offset, size_t size, const void *data) -{ - memcpy(buf + offset, data, size); -} - -const void *VertexArray::getPointer(size_t offset) const -{ - return buf + offset; -} - -// VBO - -VBO::VBO(size_t size, GLenum target, GLenum usage, MemoryBacking backing) - // FIXME: - // ES2 can't do glGetBufferSubData. - : VertexBuffer(size, target, usage, GLAD_ES_VERSION_2_0 ? BACKING_FULL : backing) - , vbo(0) - , memory_map(nullptr) - , is_dirty(false) -{ - if (!(GLAD_ARB_vertex_buffer_object || GLAD_VERSION_1_5 || GLAD_ES_VERSION_2_0)) - throw love::Exception("Not supported"); - - // FIXME: - // ES2 can't do glGetBufferSubData. - if (GLAD_ES_VERSION_2_0) - backing = BACKING_FULL; - - if (getMemoryBacking() == BACKING_FULL) - memory_map = (char *) malloc(getSize()); - - bool ok = load(false); - - if (!ok) - { - free(memory_map); - throw love::Exception("Could not load VBO."); - } -} - -VBO::~VBO() -{ - if (vbo != 0) - unload(false); - - if (memory_map) - free(memory_map); -} - -void *VBO::map() -{ - if (is_mapped) - return memory_map; - - if (!memory_map) - { - memory_map = (char * ) malloc(getSize()); - if (!memory_map) - throw love::Exception("Out of memory (oh the humanity!)"); - } - - if (is_dirty) - { - glGetBufferSubData(getTarget(), 0, (GLsizeiptr) getSize(), memory_map); - is_dirty = false; - } - - is_mapped = true; - - return memory_map; -} - -void VBO::unmapStatic(size_t offset, size_t size) -{ - // Upload the mapped data to the buffer. - glBufferSubData(getTarget(), (GLintptr) offset, (GLsizeiptr) size, memory_map + offset); -} - -void VBO::unmapStream() -{ - // "orphan" current buffer to avoid implicit synchronisation on the GPU: - // http://www.seas.upenn.edu/~pcozzi/OpenGLInsights/OpenGLInsights-AsynchronousBufferTransfers.pdf - glBufferData(getTarget(), (GLsizeiptr) getSize(), nullptr, getUsage()); - glBufferData(getTarget(), (GLsizeiptr) getSize(), memory_map, getUsage()); -} - -void VBO::unmap(size_t usedOffset, size_t usedSize) -{ - if (!is_mapped) - return; - - usedOffset = std::min(usedOffset, getSize()); - usedSize = std::min(usedSize, getSize() - usedOffset); - - // VBO::bind is a no-op when the VBO is mapped, so we have to make sure it's - // bound here. - if (!is_bound) - { - glBindBuffer(getTarget(), vbo); - is_bound = true; - } - - switch (getUsage()) - { - case GL_STATIC_DRAW: - unmapStatic(usedOffset, usedSize); - break; - case GL_STREAM_DRAW: - unmapStream(); - break; - case GL_DYNAMIC_DRAW: - default: - // It's probably more efficient to treat it like a streaming buffer if - // more than a third of its contents have been modified during the map(). - if (usedSize >= getSize() / 3) - unmapStream(); - else - unmapStatic(usedOffset, usedSize); - break; - } - - is_mapped = false; -} - -void VBO::bind() -{ - if (!is_mapped) - { - glBindBuffer(getTarget(), vbo); - is_bound = true; - } -} - -void VBO::unbind() -{ - if (is_bound) - glBindBuffer(getTarget(), 0); - - is_bound = false; -} - -void VBO::fill(size_t offset, size_t size, const void *data) -{ - if (is_mapped || getMemoryBacking() == BACKING_FULL) - memcpy(memory_map + offset, data, size); - - if (!is_mapped) - { - glBufferSubData(getTarget(), (GLintptr) offset, (GLsizeiptr) size, data); - - if (getMemoryBacking() != BACKING_FULL) - is_dirty = true; - } -} - -const void *VBO::getPointer(size_t offset) const -{ - return BUFFER_OFFSET(offset); -} - -bool VBO::loadVolatile() -{ - return load(true); -} - -void VBO::unloadVolatile() -{ - unload(true); -} - -bool VBO::load(bool restore) -{ - glGenBuffers(1, &vbo); - - VertexBuffer::Bind bind(*this); - - // Copy the old buffer only if 'restore' was requested. - const GLvoid *src = restore ? memory_map : nullptr; - - while (GL_NO_ERROR != glGetError()) - /* clear error messages */; - - // Note that if 'src' is '0', no data will be copied. - glBufferData(getTarget(), (GLsizeiptr) getSize(), src, getUsage()); - GLenum err = glGetError(); - - return (GL_NO_ERROR == err); -} - -void VBO::unload(bool save) -{ - // Save data before unloading, if we need to. - if (save && getMemoryBacking() == BACKING_PARTIAL) - { - VertexBuffer::Bind bind(*this); - map(); // saves buffer content to memory_map. - } - - is_mapped = false; - - glDeleteBuffers(1, &vbo); - vbo = 0; -} - - -// VertexIndex - -size_t VertexIndex::maxSize = 0; -size_t VertexIndex::elementSize = 0; -std::list VertexIndex::sizeRefs; -VertexBuffer *VertexIndex::element_array = NULL; - -VertexIndex::VertexIndex(size_t size) - : size(size) -{ - // The upper limit is the maximum of GLuint divided by six (the number - // of indices per size) and divided by the size of GLuint. This guarantees - // no overflows when calculating the array size in bytes. - // Memory issues will be handled by other exceptions. - if (size == 0 || size > ((GLuint) -1) / 6 / sizeof(GLuint)) - throw love::Exception("Invalid size."); - - addSize(size); -} - -VertexIndex::VertexIndex(const VertexIndex &other) - : size(other.size) -{ - addSize(size); -} - -VertexIndex &VertexIndex::operator = (const VertexIndex &other) -{ - addSize(other.size); - removeSize(size); - size = other.size; - return *this; -} - -VertexIndex::~VertexIndex() -{ - removeSize(size); -} - -size_t VertexIndex::getSize() const -{ - return size; -} - -size_t VertexIndex::getIndexCount(size_t elements) const -{ - return elements * 6; -} - -GLenum VertexIndex::getType(size_t s) const -{ - // Calculates if unsigned short is big enough to hold all the vertex indices. - static const GLenum type_table[] = {GL_UNSIGNED_SHORT, GL_UNSIGNED_INT}; - return type_table[s * 4 > std::numeric_limits::max()]; - // if buffer-size > max(GLushort) then GL_UNSIGNED_INT else GL_UNSIGNED_SHORT -} - -size_t VertexIndex::getElementSize() -{ - return elementSize; -} - -VertexBuffer *VertexIndex::getVertexBuffer() const -{ - return element_array; -} - -const void *VertexIndex::getPointer(size_t offset) const -{ - return element_array->getPointer(offset); -} - -void VertexIndex::addSize(size_t newSize) -{ - if (newSize <= maxSize) - { - // Current size is bigger. Append the size to list and sort. - sizeRefs.push_back(newSize); - sizeRefs.sort(); - return; - } - - // Try to resize before adding it to the list because resize may throw. - resize(newSize); - sizeRefs.push_back(newSize); -} - -void VertexIndex::removeSize(size_t oldSize) -{ - // TODO: For debugging purposes, this should check if the size was actually found. - sizeRefs.erase(std::find(sizeRefs.begin(), sizeRefs.end(), oldSize)); - if (sizeRefs.size() == 0) - { - resize(0); - return; - } - - if (oldSize == maxSize) - { - // Shrink if there's a smaller size. - size_t newSize = sizeRefs.back(); - if (newSize < maxSize) - resize(newSize); - } -} - -void VertexIndex::resize(size_t size) -{ - if (size == 0) - { - delete element_array; - element_array = NULL; - maxSize = 0; - return; - } - - VertexBuffer *new_element_array; - - // Depending on the size, a switch to int and more memory is needed. - GLenum target_type = getType(size); - size_t elem_size = (target_type == GL_UNSIGNED_SHORT) ? sizeof(GLushort) : sizeof(GLuint); - - size_t array_size = elem_size * 6 * size; - - // Create may throw out-of-memory exceptions. - // VertexIndex will propagate the exception and keep the old VertexBuffer. - try - { - new_element_array = VertexBuffer::Create(array_size, GL_ELEMENT_ARRAY_BUFFER, GL_STATIC_DRAW); - } - catch (std::bad_alloc &) - { - throw love::Exception("Out of memory."); - } - - // Allocation of the new VertexBuffer succeeded. - // The old VertexBuffer can now be deleted. - delete element_array; - element_array = new_element_array; - maxSize = size; - elementSize = elem_size; - - switch (target_type) - { - case GL_UNSIGNED_SHORT: - fill(); - break; - case GL_UNSIGNED_INT: - fill(); - break; - } -} - -template -void VertexIndex::fill() -{ - VertexBuffer::Bind bind(*element_array); - VertexBuffer::Mapper mapper(*element_array); - - T *indices = (T *) mapper.get(); - - for (size_t i = 0; i < maxSize; ++i) - { - indices[i*6+0] = i * 4 + 0; - indices[i*6+1] = i * 4 + 1; - indices[i*6+2] = i * 4 + 2; - - indices[i*6+3] = i * 4 + 0; - indices[i*6+4] = i * 4 + 2; - indices[i*6+5] = i * 4 + 3; - } -} - -} // opengl -} // graphics -} // love diff --git a/jni/love/src/modules/graphics/opengl/VertexBuffer.h b/jni/love/src/modules/graphics/opengl/VertexBuffer.h deleted file mode 100644 index de90f823..00000000 --- a/jni/love/src/modules/graphics/opengl/VertexBuffer.h +++ /dev/null @@ -1,533 +0,0 @@ -/** - * Copyright (c) 2006-2015 LOVE Development Team - * - * This software is provided 'as-is', without any express or implied - * warranty. In no event will the authors be held liable for any damages - * arising from the use of this software. - * - * Permission is granted to anyone to use this software for any purpose, - * including commercial applications, and to alter it and redistribute it - * freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; you must not - * claim that you wrote the original software. If you use this software - * in a product, an acknowledgment in the product documentation would be - * appreciated but is not required. - * 2. Altered source versions must be plainly marked as such, and must not be - * misrepresented as being the original software. - * 3. This notice may not be removed or altered from any source distribution. - **/ - - -#ifndef LOVE_GRAPHICS_OPENGL_VERTEX_BUFFER_H -#define LOVE_GRAPHICS_OPENGL_VERTEX_BUFFER_H - -// LOVE -#include "common/config.h" -#include "graphics/Volatile.h" - -// OpenGL -#include "OpenGL.h" - -// C -#include - -namespace love -{ -namespace graphics -{ -namespace opengl -{ - -/** - * VertexBuffer is an abstraction over VBOs (Vertex Buffer Objects), which - * falls back to regular vertex arrays if VBOs are not supported. - * - * This allows code to take advantage of VBOs where available, but still - * work on older systems where it's *not* available. Everyone's happy. - * - * The class is (for now) meant for internal use. - */ -class VertexBuffer -{ -public: - - // Different guarantees for VertexBuffer data storage. - enum MemoryBacking - { - // The VertexBuffer is will have a valid copy of its data in main memory - // at all times. - BACKING_FULL, - - // The VertexBuffer will have a valid copy of its data in main memory - // when it needs to be reloaded and when it's mapped. - BACKING_PARTIAL - }; - - /** - * Create a new VertexBuffer (either a plain vertex array, or a VBO), - * based on what's supported on the system. - * - * If VBOs are not supported, a plain vertex array will automatically - * be created and returned instead. - * - * @param size The size of the VertexBuffer (in bytes). - * @param target GL_ARRAY_BUFFER, GL_ELEMENT_ARRAY_BUFFER. - * @param usage GL_DYNAMIC_DRAW, etc. - * @param backing Determines what guarantees are placed on the data. - * @return A new VertexBuffer. - */ - static VertexBuffer *Create(size_t size, GLenum target, GLenum usage, MemoryBacking backing = BACKING_PARTIAL); - - /** - * Constructor. - * - * @param size The size of the VertexBuffer in bytes. - * @param target The target VertexBuffer object, e.g. GL_ARRAY_BUFFER. - * @param usage Usage hint, e.g. GL_DYNAMIC_DRAW. - * @param backing Determines what guarantees are placed on the data. - */ - VertexBuffer(size_t size, GLenum target, GLenum usage, MemoryBacking backing = BACKING_PARTIAL); - - /** - * Destructor. Does nothing, but must be declared virtual. - */ - virtual ~VertexBuffer(); - - /** - * Get the size of the VertexBuffer, in bytes. - * - * @return The size of the VertexBuffer. - */ - size_t getSize() const - { - return size; - } - - /** - * Get the target buffer object. - * - * @return The target buffer object, e.g. GL_ARRAY_BUFFER. - */ - GLenum getTarget() const - { - return target; - } - - /** - * Get the usage hint for this VertexBuffer. - * - * @return The usage hint, e.g. GL_DYNAMIC_DRAW. - */ - GLenum getUsage() const - { - return usage; - } - - bool isBound() const - { - return is_bound; - } - - bool isMapped() const - { - return is_mapped; - } - - MemoryBacking getMemoryBacking() const - { - return backing; - } - - /** - * Map the VertexBuffer to client memory. - * - * This can be faster for large changes to the buffer. For smaller - * changes, see fill(). - * - * The VertexBuffer must be bound to use this function. - * - * @return A pointer to memory which represents the buffer. - */ - virtual void *map() = 0; - - /** - * Unmap a previously mapped VertexBuffer. The buffer must be unmapped - * when used to draw elements. - * - * The VertexBuffer must be bound to use this function. - * - * @param usedOffset The offset into the mapped buffer indicating the - * sub-range of data modified. Optional. - * @param usedSize The size of the sub-range of modified data. Optional. - */ - virtual void unmap(size_t usedOffset = 0, size_t usedSize = -1) = 0; - - /** - * Bind the VertexBuffer to its specified target. - * (GL_ARRAY_BUFFER, GL_ELEMENT_ARRAY_BUFFER, etc). - */ - virtual void bind() = 0; - - /** - * Unbind a prevously bound VertexBuffer. - */ - virtual void unbind() = 0; - - /** - * Fill a portion of the buffer with data. - * - * The VertexBuffer must be bound to use this function. - * - * @param offset The offset in the VertexBuffer to store the data. - * @param size The size of the incoming data. - * @param data Pointer to memory to copy data from. - */ - virtual void fill(size_t offset, size_t size, const void *data) = 0; - - /** - * Get a pointer which represents the specified byte offset. - * - * @param offset The byte offset. (0 is first byte). - * @return A pointer which represents the offset. - */ - virtual const void *getPointer(size_t offset) const = 0; - - /** - * This helper class can bind a VertexArray temporarily, and - * automatically un-bind when it's destroyed. - */ - class Bind - { - public: - - /** - * Bind a VertexBuffer. - */ - Bind(VertexBuffer &buf) - : buf(buf) - { - buf.bind(); - } - - /** - * Unbinds a VertexBuffer. - */ - ~Bind() - { - buf.unbind(); - } - - private: - - // VertexBuffer to work on. - VertexBuffer &buf; - }; - - class Mapper - { - public: - /** - * Memory-maps a VertexBuffer. - */ - Mapper(VertexBuffer &buffer) - : buf(buffer) - { - elems = buf.map(); - } - - /** - * unmaps the buffer - */ - ~Mapper() - { - buf.unmap(); - } - - /** - * Get pointer to memory mapped region - */ - void *get() - { - return elems; - } - - private: - VertexBuffer &buf; - void *elems; - }; - -protected: - - // Whether the buffer is currently bound. - bool is_bound; - - // Whether the buffer is currently mapped to main memory. - bool is_mapped; - -private: - - // The size of the buffer, in bytes. - size_t size; - - // The target buffer object. (GL_ARRAY_BUFFER, GL_ELEMENT_ARRAY_BUFFER). - GLenum target; - - // Usage hint. GL_[DYNAMIC, STATIC, STREAM]_DRAW. - GLenum usage; - - // - MemoryBacking backing; -}; - -/** - * Implementation of VertexBuffer which uses plain arrays to store the data. - * - * This implementation should be supported everywhere, and acts as a fallback - * on systems which do not support VBOs. - */ -class VertexArray : public VertexBuffer -{ -public: - - /** - * @copydoc VertexBuffer(int, GLenum, GLenum, Backing) - */ - VertexArray(size_t size, GLenum target, GLenum usage, MemoryBacking backing); - - /** - * Frees the data we've allocated. - */ - virtual ~VertexArray(); - - // Implements VertexBuffer. - virtual void *map(); - virtual void unmap(size_t usedOffset = 0, size_t usedSize = -1); - virtual void bind(); - virtual void unbind(); - virtual void fill(size_t offset, size_t size, const void *data); - virtual const void *getPointer(size_t offset) const ; - -private: - // Holds the data. - char *buf; -}; - -/** - * Vertex Buffer Object (VBO) implementation of VertexBuffer. - * - * This will be used on all systems that support it. It's in general - * faster than vertex arrays, but especially in use-cases where there - * is no need to update the data every frame. - **/ -class VBO : public VertexBuffer, public Volatile -{ -public: - - /** - * @copydoc VertexBuffer(size_t, GLenum, GLenum, Backing) - **/ - VBO(size_t size, GLenum target, GLenum usage, MemoryBacking backing); - - /** - * Deletes the VBOs from OpenGL. - **/ - virtual ~VBO(); - - // Implements VertexBuffer. - virtual void *map(); - virtual void unmap(size_t usedOffset = 0, size_t usedSize = -1); - virtual void bind(); - virtual void unbind(); - virtual void fill(size_t offset, size_t size, const void *data); - virtual const void *getPointer(size_t offset) const ; - - // Implements Volatile. - bool loadVolatile(); - void unloadVolatile(); - -private: - - /** - * Creates the VBO, and optionally restores data we saved earlier. - * - * @param restore True to restore data previously saved with 'unload'. - * @return True on success, false otherwise. - */ - bool load(bool restore); - - /** - * Optionally save the data in the VBO, then delete it. - * - * @param save True to save the data before deleting. - */ - void unload(bool save); - - void unmapStatic(size_t offset, size_t size); - void unmapStream(); - - // The VBO identifier. Assigned by OpenGL. - GLuint vbo; - - // A pointer to mapped memory. Will be inialized on the first - // call to map(). - char *memory_map; - - // Set if the buffer was modified while operating on gpu memory - // and needs to be synchronized. - bool is_dirty; -}; - -/** - * VertexIndex manages one shared VertexBuffer that stores the indices for an - * element array. Vertex arrays using the vertex structure (or anything else - * that can use the pattern below) can request a size and use it for the - * drawElements call. - * - * indices[i*6 + 0] = i*4 + 0; - * indices[i*6 + 1] = i*4 + 1; - * indices[i*6 + 2] = i*4 + 2; - * - * indices[i*6 + 3] = i*4 + 0; - * indices[i*6 + 4] = i*4 + 2; - * indices[i*6 + 5] = i*4 + 3; - * - * There will always be a large enough VertexBuffer around until all - * VertexIndex instances have been deleted. - * - * Q: Why have something like VertexIndex? - * A: The indices for the SpriteBatch do not change, only the array size - * varies. Using one VertexBuffer for all element arrays removes this - * duplicated data and saves some memory. - */ -class VertexIndex -{ -public: - /** - * Adds an entry to the list of sizes and resizes the VertexBuffer - * if needed. A size of 1 allocates a group of 6 indices for 4 vertices - * creating 1 face. - * - * @param size The requested size in groups of 6 indices. - */ - VertexIndex(size_t size); - - VertexIndex(const VertexIndex &other); - VertexIndex &operator = (const VertexIndex &other); - - /** - * Removes an entry from the list of sizes and resizes the VertexBuffer - * if needed. - */ - ~VertexIndex(); - - /** - * Returns the number of index groups. - * This can be used for getIndexCount to get the full count of indices. - * - * @return The number of index groups. - */ - size_t getSize() const; - - /** - * Returns the number of indices that the passed element count will have. - * Use VertexIndex::getSize to get the full index count for that - * VertexIndex instance. - * - * @param elements The number of elements to calculate the index count for. - * @return The index count. - */ - size_t getIndexCount(size_t elements) const; - - /** - * Returns the integer type of the element array. - * If an optional nonzero size argument is passed, the function returns - * the integer type of the element array of that size. - * - * @param s The size of the array to calculated the integer type of. - * @return The element array integer type. - */ - GLenum getType(size_t s) const; - inline GLenum getType() const - { - return getType(maxSize); - } - - /** - * Returns the size in bytes of an element in the element array. - * Can be used with getPointer to calculate an offset into the array based - * on a number of elements. - * - * @return The size of an element in bytes. - **/ - size_t getElementSize(); - - /** - * Returns the pointer to the VertexBuffer. - * The pointer will change if a new size request or removal causes - * a VertexBuffer resize. It is recommended to retrieve the pointer - * value directly before the drawing call. - * - * @return The pointer to the VertexBuffer. - */ - VertexBuffer *getVertexBuffer() const; - - /** - * Returns a pointer which represents the specified byte offset. - * - * @param offset The offset in bytes. - * @return A pointer which represents the offset. - */ - const void *getPointer(size_t offset) const; - -private: - - /** - * Adds a new size to the size list, then sorts and resizes it if needed. - * - * @param newSize The new size to be added. - */ - void addSize(size_t newSize); - - /** - * Removes a size from the size list, then sorts and resizes it if needed. - * - * @param oldSize The old size to be removed. - */ - void removeSize(size_t oldSize); - - /** - * Resizes the VertexBuffer to the requested size. - * This function takes care of choosing the correct integer type and - * allocating and deleting the VertexBuffer instance. It also has some - * fallback logic in case the memory ran out. - * - * @param size The requested VertexBuffer size. Passing 0 deletes the VertexBuffer without allocating a new one. - */ - void resize(size_t size); - - /** - * Adds all indices to the array with the type T. - * There are no checks for the correct types or overflows. The calling - * function should check for that. - */ - template void fill(); - - // The size of the array requested by this instance. - size_t size; - - // The size in bytes of an element in the element array. - static size_t elementSize; - // The current VertexBuffer size. 0 means no VertexBuffer. - static size_t maxSize; - // The list of sizes. Needs to be kept sorted in ascending order. - static std::list sizeRefs; - // The VertexBuffer for the element array. Can be NULL. - static VertexBuffer *element_array; -}; - -} // opengl -} // graphics -} // love - -#endif // LOVE_GRAPHICS_OPENGL_SPRITE_BATCH_H diff --git a/jni/love/src/modules/graphics/opengl/wrap_Canvas.cpp b/jni/love/src/modules/graphics/opengl/wrap_Canvas.cpp index bb6838f6..48d916e1 100644 --- a/jni/love/src/modules/graphics/opengl/wrap_Canvas.cpp +++ b/jni/love/src/modules/graphics/opengl/wrap_Canvas.cpp @@ -30,7 +30,7 @@ namespace opengl Canvas *luax_checkcanvas(lua_State *L, int idx) { - return luax_checktype(L, idx, "Canvas", GRAPHICS_CANVAS_T); + return luax_checktype(L, idx, GRAPHICS_CANVAS_ID); } int w_Canvas_renderTo(lua_State *L) @@ -62,64 +62,23 @@ int w_Canvas_renderTo(lua_State *L) return 0; } -int w_Canvas_getImageData(lua_State *L) +int w_Canvas_newImageData(lua_State *L) { Canvas *canvas = luax_checkcanvas(L, 1); - love::image::Image *image = luax_getmodule(L, "image", MODULE_IMAGE_T); - love::image::ImageData *img = canvas->getImageData(image); - luax_pushtype(L, "ImageData", IMAGE_IMAGE_DATA_T, img); + love::image::Image *image = luax_getmodule(L, MODULE_IMAGE_ID); + int x = (int) luaL_optnumber(L, 2, 0); + int y = (int) luaL_optnumber(L, 3, 0); + int w = (int) luaL_optnumber(L, 4, canvas->getWidth()); + int h = (int) luaL_optnumber(L, 5, canvas->getHeight()); + + love::image::ImageData *img = nullptr; + luax_catchexcept(L, [&](){ img = canvas->newImageData(image, x, y, w, h); }); + + luax_pushtype(L, IMAGE_IMAGE_DATA_ID, img); img->release(); return 1; } -int w_Canvas_getPixel(lua_State * L) -{ - Canvas * canvas = luax_checkcanvas(L, 1); - int x = luaL_checkint(L, 2); - int y = luaL_checkint(L, 3); - unsigned char c[4]; - - luax_catchexcept(L, [&](){ canvas->getPixel(c, x, y); }); - - lua_pushnumber(L, c[0]); - lua_pushnumber(L, c[1]); - lua_pushnumber(L, c[2]); - lua_pushnumber(L, c[3]); - return 4; -} - -int w_Canvas_clear(lua_State *L) -{ - Canvas *canvas = luax_checkcanvas(L, 1); - Color c; - if (lua_isnoneornil(L, 2)) - { - c.set(0, 0, 0, 0); - } - else if (lua_istable(L, 2)) - { - for (int i = 1; i <= 4; i++) - lua_rawgeti(L, 2, i); - - c.r = (unsigned char)luaL_checkinteger(L, -4); - c.g = (unsigned char)luaL_checkinteger(L, -3); - c.b = (unsigned char)luaL_checkinteger(L, -2); - c.a = (unsigned char)luaL_optinteger(L, -1, 255); - - lua_pop(L, 4); - } - else - { - c.r = (unsigned char)luaL_checkinteger(L, 2); - c.g = (unsigned char)luaL_checkinteger(L, 3); - c.b = (unsigned char)luaL_checkinteger(L, 4); - c.a = (unsigned char)luaL_optinteger(L, 5, 255); - } - canvas->clear(c); - - return 0; -} - int w_Canvas_getFormat(lua_State *L) { Canvas *canvas = luax_checkcanvas(L, 1); @@ -151,24 +110,15 @@ static const luaL_Reg functions[] = { "getWrap", w_Texture_getWrap }, { "renderTo", w_Canvas_renderTo }, - { "getImageData", w_Canvas_getImageData }, - { "getPixel", w_Canvas_getPixel }, - { "clear", w_Canvas_clear }, + { "newImageData", w_Canvas_newImageData }, { "getFormat", w_Canvas_getFormat }, { "getMSAA", w_Canvas_getMSAA }, - - // Deprecated since 0.9.1. - { "getType", w_Canvas_getFormat }, - - // Deprecated since 0.9.2. - { "getFSAA", w_Canvas_getMSAA }, - { 0, 0 } }; extern "C" int luaopen_canvas(lua_State *L) { - return luax_register_type(L, "Canvas", functions); + return luax_register_type(L, GRAPHICS_CANVAS_ID, functions); } } // opengl diff --git a/jni/love/src/modules/graphics/opengl/wrap_Canvas.h b/jni/love/src/modules/graphics/opengl/wrap_Canvas.h index 1093f980..9eb0fbe1 100644 --- a/jni/love/src/modules/graphics/opengl/wrap_Canvas.h +++ b/jni/love/src/modules/graphics/opengl/wrap_Canvas.h @@ -24,7 +24,7 @@ // LOVE #include "common/runtime.h" #include "Canvas.h" -#include "wrap_Texture.h" +#include "graphics/wrap_Texture.h" namespace love { @@ -36,9 +36,7 @@ namespace opengl //see Canvas.h Canvas *luax_checkcanvas(lua_State *L, int idx); int w_Canvas_renderTo(lua_State *L); -int w_Canvas_getImageData(lua_State *L); -int w_Canvas_getPixel(lua_State * L); -int w_Canvas_clear(lua_State *L); +int w_Canvas_newImageData(lua_State *L); int w_Canvas_getFormat(lua_State *L); int w_Canvas_getMSAA(lua_State *L); extern "C" int luaopen_canvas(lua_State *L); diff --git a/jni/love/src/modules/graphics/opengl/wrap_Font.cpp b/jni/love/src/modules/graphics/opengl/wrap_Font.cpp index 34203f07..22836c84 100644 --- a/jni/love/src/modules/graphics/opengl/wrap_Font.cpp +++ b/jni/love/src/modules/graphics/opengl/wrap_Font.cpp @@ -19,8 +19,12 @@ **/ // LOVE +#include "common/config.h" #include "wrap_Font.h" +// C++ +#include + namespace love { namespace graphics @@ -30,7 +34,7 @@ namespace opengl Font *luax_checkfont(lua_State *L, int idx) { - return luax_checktype(L, idx, "Font", GRAPHICS_FONT_T); + return luax_checktype(L, idx, GRAPHICS_FONT_ID); } int w_Font_getHeight(lua_State *L) @@ -54,15 +58,24 @@ int w_Font_getWrap(lua_State *L) Font *t = luax_checkfont(L, 1); const char *str = luaL_checkstring(L, 2); float wrap = (float) luaL_checknumber(L, 3); - int max_width = 0, numlines = 0; + int max_width = 0; + std::vector lines; + std::vector widths; - luax_catchexcept(L, [&]() { - std::vector lines = t->getWrap(str, wrap, &max_width); - numlines = lines.size(); - }); + luax_catchexcept(L, [&]() { t->getWrap(str, wrap, lines, &widths); }); + + for (int width : widths) + max_width = std::max(max_width, width); lua_pushinteger(L, max_width); - lua_pushinteger(L, numlines); + lua_createtable(L, (int) lines.size(), 0); + + for (int i = 0; i < (int) lines.size(); i++) + { + lua_pushstring(L, lines[i].c_str()); + lua_rawseti(L, -2, i + 1); + } + return 2; } @@ -140,8 +153,7 @@ int w_Font_hasGlyphs(lua_State *L) Font *t = luax_checkfont(L, 1); bool hasglyph = false; - int count = lua_gettop(L) - 1; - count = count < 1 ? 1 : count; + int count = std::max(lua_gettop(L) - 1, 1); luax_catchexcept(L, [&]() { for (int i = 2; i < count + 2; i++) @@ -160,6 +172,18 @@ int w_Font_hasGlyphs(lua_State *L) return 1; } +int w_Font_setFallbacks(lua_State *L) +{ + Font *t = luax_checkfont(L, 1); + std::vector fallbacks; + + for (int i = 2; i <= lua_gettop(L); i++) + fallbacks.push_back(luax_checkfont(L, i)); + + luax_catchexcept(L, [&](){ t->setFallbacks(fallbacks); }); + return 0; +} + static const luaL_Reg functions[] = { { "getHeight", w_Font_getHeight }, @@ -173,12 +197,13 @@ static const luaL_Reg functions[] = { "getDescent", w_Font_getDescent }, { "getBaseline", w_Font_getBaseline }, { "hasGlyphs", w_Font_hasGlyphs }, + { "setFallbacks", w_Font_setFallbacks }, { 0, 0 } }; extern "C" int luaopen_font(lua_State *L) { - return luax_register_type(L, "Font", functions); + return luax_register_type(L, GRAPHICS_FONT_ID, functions); } } // opengl diff --git a/jni/love/src/modules/graphics/opengl/wrap_Font.h b/jni/love/src/modules/graphics/opengl/wrap_Font.h index c38d2c22..172cc90c 100644 --- a/jni/love/src/modules/graphics/opengl/wrap_Font.h +++ b/jni/love/src/modules/graphics/opengl/wrap_Font.h @@ -44,6 +44,7 @@ int w_Font_getAscent(lua_State *L); int w_Font_getDescent(lua_State *L); int w_Font_getBaseline(lua_State *L); int w_Font_hasGlyphs(lua_State *L); +int w_Font_setFallbacks(lua_State *L); extern "C" int luaopen_font(lua_State *L); } // opengl diff --git a/jni/love/src/modules/graphics/opengl/wrap_Graphics.cpp b/jni/love/src/modules/graphics/opengl/wrap_Graphics.cpp index f128fe3b..6057a14b 100644 --- a/jni/love/src/modules/graphics/opengl/wrap_Graphics.cpp +++ b/jni/love/src/modules/graphics/opengl/wrap_Graphics.cpp @@ -26,10 +26,16 @@ #include "font/Rasterizer.h" #include "filesystem/wrap_Filesystem.h" -#include "scripts/graphics.lua.h" #include #include +#include + +// Shove the wrap_Graphics.lua code directly into a raw string literal. +static const char graphics_lua[] = +#include "wrap_Graphics.lua" +; + namespace love { namespace graphics @@ -45,9 +51,69 @@ int w_reset(lua_State *) return 0; } -int w_clear(lua_State *) +int w_clear(lua_State *L) { - instance()->clear(); + std::vector colors(1); + + if (lua_isnoneornil(L, 1)) + colors[0].set(0, 0, 0, 0); + else if (lua_istable(L, 1)) + { + colors.resize((size_t) lua_gettop(L)); + + for (int i = 0; i < lua_gettop(L); i++) + { + for (int j = 1; j <= 4; j++) + lua_rawgeti(L, i + 1, j); + + colors[i].r = (unsigned char) luaL_checkinteger(L, -4); + colors[i].g = (unsigned char) luaL_checkinteger(L, -3); + colors[i].b = (unsigned char) luaL_checkinteger(L, -2); + colors[i].a = (unsigned char) luaL_optinteger(L, -1, 255); + + lua_pop(L, 4); + } + } + else + { + colors[0].r = (unsigned char) luaL_checkinteger(L, 1); + colors[0].g = (unsigned char) luaL_checkinteger(L, 2); + colors[0].b = (unsigned char) luaL_checkinteger(L, 3); + colors[0].a = (unsigned char) luaL_optinteger(L, 4, 255); + } + + luax_catchexcept(L, [&]() { + if (colors.size() == 1) + instance()->clear(colors[0]); + else + instance()->clear(colors); + }); + + return 0; +} + +int w_discard(lua_State *L) +{ + std::vector colorbuffers; + + if (lua_istable(L, 1)) + { + for (size_t i = 1; i <= luax_objlen(L, 1); i++) + { + lua_rawgeti(L, 1, i); + colorbuffers.push_back(luax_optboolean(L, -1, true)); + lua_pop(L, 1); + } + } + else + { + bool discardcolor = luax_optboolean(L, 1, true); + size_t numbuffers = std::max((size_t) 1, instance()->getCanvas().size()); + colorbuffers = std::vector(numbuffers, discardcolor); + } + + bool stencil = luax_optboolean(L, 2, true); + instance()->discard(colorbuffers, stencil); return 0; } @@ -99,10 +165,10 @@ int w_setScissor(lua_State *L) return 0; } - int x = luaL_checkint(L, 1); - int y = luaL_checkint(L, 2); - int w = luaL_checkint(L, 3); - int h = luaL_checkint(L, 4); + int x = (int) luaL_checknumber(L, 1); + int y = (int) luaL_checknumber(L, 2); + int w = (int) luaL_checknumber(L, 3); + int h = (int) luaL_checknumber(L, 4); if (w < 0 || h < 0) return luaL_error(L, "Can't set scissor with negative width and/or height."); @@ -125,55 +191,66 @@ int w_getScissor(lua_State *L) return 4; } -static int setStencil(lua_State *L, bool invert) +int w_stencil(lua_State *L) { - // no argument -> clear stencil - if (lua_isnoneornil(L, 1)) - { - instance()->discardStencil(); - return 0; - } - luaL_checktype(L, 1, LUA_TFUNCTION); - instance()->defineStencil(); - lua_call(L, lua_gettop(L) - 1, 0); // call stencil(...) - instance()->useStencil(invert); + // Second argument: whether to keep the contents of the stencil buffer. + if (lua_toboolean(L, 2) == 0) + instance()->clearStencil(); + + instance()->drawToStencilBuffer(true); + + // Call stencilfunc() + lua_pushvalue(L, 1); + lua_call(L, 0, 0); + + instance()->drawToStencilBuffer(false); return 0; } -int w_setStencil(lua_State *L) +int w_setStencilTest(lua_State *L) { - return setStencil(L, false); + bool enable = luax_toboolean(L, 1); + bool invert = luax_toboolean(L, 2); + instance()->setStencilTest(enable, invert); + return 0; } -int w_setInvertedStencil(lua_State *L) +int w_getStencilTest(lua_State *L) { - return setStencil(L, true); + bool enabled, inverted; + instance()->getStencilTest(enabled, inverted); + luax_pushboolean(L, enabled); + luax_pushboolean(L, inverted); + return 2; } -int w_getMaxTextureSize(lua_State *L) +static const char *imageFlagName(Image::FlagType flagtype) { - lua_pushinteger(L, instance()->getSystemLimit(Graphics::LIMIT_TEXTURE_SIZE)); - return 1; + const char *name = nullptr; + Image::getConstant(flagtype, name); + return name; } int w_newImage(lua_State *L) { love::image::ImageData *data = nullptr; - love::image::CompressedData *cdata = nullptr; + love::image::CompressedImageData *cdata = nullptr; - Image::Format format = Image::FORMAT_NORMAL; - const char *fstr = lua_isnoneornil(L, 2) ? nullptr : luaL_checkstring(L, 2); - - if (fstr != nullptr && !Image::getConstant(fstr, format)) - return luaL_error(L, "Invalid Image format: %s", fstr); + Image::Flags flags; + if (!lua_isnoneornil(L, 2)) + { + luaL_checktype(L, 2, LUA_TTABLE); + flags.mipmaps = luax_boolflag(L, 2, imageFlagName(Image::FLAG_TYPE_MIPMAPS), flags.mipmaps); + flags.sRGB = luax_boolflag(L, 2, imageFlagName(Image::FLAG_TYPE_SRGB), flags.sRGB); + } bool releasedata = false; - // Convert to ImageData / CompressedData, if necessary. - if (lua_isstring(L, 1) || luax_istype(L, 1, FILESYSTEM_FILE_T) || luax_istype(L, 1, FILESYSTEM_FILE_DATA_T)) + // Convert to ImageData / CompressedImageData, if necessary. + if (lua_isstring(L, 1) || luax_istype(L, 1, FILESYSTEM_FILE_ID) || luax_istype(L, 1, FILESYSTEM_FILE_DATA_ID)) { love::image::Image *image = Module::getInstance(Module::M_IMAGE); if (image == nullptr) @@ -185,24 +262,24 @@ int w_newImage(lua_State *L) { luax_catchexcept(L, [&]() { cdata = image->newCompressedData(fdata); }, - [&]() { fdata->release(); } + [&](bool) { fdata->release(); } ); } else { luax_catchexcept(L, [&]() { data = image->newImageData(fdata); }, - [&]() { fdata->release(); } + [&](bool) { fdata->release(); } ); } // Lua's GC won't release the image data, so we should do it ourselves. releasedata = true; } - else if (luax_istype(L, 1, IMAGE_COMPRESSED_DATA_T)) - cdata = luax_checktype(L, 1, "CompressedData", IMAGE_COMPRESSED_DATA_T); + else if (luax_istype(L, 1, IMAGE_COMPRESSED_IMAGE_DATA_ID)) + cdata = luax_checktype(L, 1, IMAGE_COMPRESSED_IMAGE_DATA_ID); else - data = luax_checktype(L, 1, "ImageData", IMAGE_IMAGE_DATA_T); + data = luax_checktype(L, 1, IMAGE_IMAGE_DATA_ID); if (!data && !cdata) return luaL_error(L, "Error creating image (could not load data.)"); @@ -212,11 +289,11 @@ int w_newImage(lua_State *L) luax_catchexcept(L, [&]() { if (cdata) - image = instance()->newImage(cdata, format); + image = instance()->newImage(cdata, flags); else if (data) - image = instance()->newImage(data, format); + image = instance()->newImage(data, flags); }, - [&]() { + [&](bool) { if (releasedata && data) data->release(); else if (releasedata && cdata) @@ -228,7 +305,7 @@ int w_newImage(lua_State *L) return luaL_error(L, "Could not load image."); // Push the type. - luax_pushtype(L, "Image", GRAPHICS_IMAGE_T, image); + luax_pushtype(L, GRAPHICS_IMAGE_ID, image); image->release(); return 1; } @@ -245,21 +322,18 @@ int w_newQuad(lua_State *L) float sh = (float) luaL_checknumber(L, 6); Quad *quad = instance()->newQuad(v, sw, sh); - luax_pushtype(L, "Quad", GRAPHICS_QUAD_T, quad); + luax_pushtype(L, GRAPHICS_QUAD_ID, quad); quad->release(); return 1; } int w_newFont(lua_State *L) { - // Convert to Rasterizer, if necessary. Note that lua_isstring returns true - // if the value is a number, which we rely on for the variant that uses the - // default Font rather than a font file. - if (lua_isnoneornil(L, 1) || lua_isstring(L, 1) || luax_istype(L, 1, FILESYSTEM_FILE_T) || luax_istype(L, 1, FILESYSTEM_FILE_DATA_T)) - { - if (lua_isnone(L, 1)) - lua_pushnil(L); + Font *font = nullptr; + // Convert to Rasterizer, if necessary. + if (!luax_istype(L, 1, FONT_RASTERIZER_ID)) + { std::vector idxs; for (int i = 0; i < lua_gettop(L); i++) idxs.push_back(i + 1); @@ -267,18 +341,14 @@ int w_newFont(lua_State *L) luax_convobj(L, &idxs[0], (int) idxs.size(), "font", "newRasterizer"); } - love::font::Rasterizer *rasterizer = luax_checktype(L, 1, "Rasterizer", FONT_RASTERIZER_T); + love::font::Rasterizer *rasterizer = luax_checktype(L, 1, FONT_RASTERIZER_ID); - Font *font = 0; luax_catchexcept(L, [&]() { font = instance()->newFont(rasterizer, instance()->getDefaultFilter()); } ); - if (font == 0) - return luaL_error(L, "Could not load font."); - // Push the type. - luax_pushtype(L, "Font", GRAPHICS_FONT_T, font); + luax_pushtype(L, GRAPHICS_FONT_ID, font); font->release(); return 1; } @@ -289,51 +359,49 @@ int w_newImageFont(lua_State *L) Texture::Filter filter = instance()->getDefaultFilter(); // Convert to ImageData if necessary. - if (lua_isstring(L, 1) || luax_istype(L, 1, FILESYSTEM_FILE_T) || luax_istype(L, 1, FILESYSTEM_FILE_DATA_T)) - luax_convobj(L, 1, "image", "newImageData"); - else if (luax_istype(L, 1, GRAPHICS_IMAGE_T)) + if (luax_istype(L, 1, GRAPHICS_IMAGE_ID)) { - Image *i = luax_checktype(L, 1, "Image", GRAPHICS_IMAGE_T); + Image *i = luax_checktype(L, 1, GRAPHICS_IMAGE_ID); filter = i->getFilter(); love::image::ImageData *id = i->getImageData(); if (!id) return luaL_argerror(L, 1, "Image must not be compressed."); - luax_pushtype(L, "ImageData", IMAGE_IMAGE_DATA_T, id); + luax_pushtype(L, IMAGE_IMAGE_DATA_ID, id); lua_replace(L, 1); } // Convert to Rasterizer if necessary. - if (luax_istype(L, 1, IMAGE_IMAGE_DATA_T)) + if (!luax_istype(L, 1, FONT_RASTERIZER_ID)) { - luaL_checkstring(L, 2); - int idxs[] = {1, 2}; - luax_convobj(L, idxs, 2, "font", "newRasterizer"); + luaL_checktype(L, 2, LUA_TSTRING); + + std::vector idxs; + for (int i = 0; i < lua_gettop(L); i++) + idxs.push_back(i + 1); + + luax_convobj(L, &idxs[0], (int) idxs.size(), "font", "newImageRasterizer"); } - love::font::Rasterizer *rasterizer = luax_checktype(L, 1, "Rasterizer", FONT_RASTERIZER_T); + love::font::Rasterizer *rasterizer = luax_checktype(L, 1, FONT_RASTERIZER_ID); // Create the font. Font *font = instance()->newFont(rasterizer, filter); - if (font == 0) - return luaL_error(L, "Could not load font."); - // Push the type. - luax_pushtype(L, "Font", GRAPHICS_FONT_T, font); + luax_pushtype(L, GRAPHICS_FONT_ID, font); font->release(); - return 1; } int w_newSpriteBatch(lua_State *L) { Texture *texture = luax_checktexture(L, 1); - int size = luaL_optint(L, 2, 1000); - SpriteBatch::UsageHint usage = SpriteBatch::USAGE_DYNAMIC; + int size = (int) luaL_optnumber(L, 2, 1000); + Mesh::Usage usage = Mesh::USAGE_DYNAMIC; if (lua_gettop(L) > 2) { const char *usagestr = luaL_checkstring(L, 3); - if (!SpriteBatch::getConstant(usagestr, usage)) + if (!Mesh::getConstant(usagestr, usage)) return luaL_error(L, "Invalid SpriteBatch usage hint: %s", usagestr); } @@ -342,7 +410,7 @@ int w_newSpriteBatch(lua_State *L) [&](){ t = instance()->newSpriteBatch(texture, size, usage); } ); - luax_pushtype(L, "SpriteBatch", GRAPHICS_SPRITE_BATCH_T, t); + luax_pushtype(L, GRAPHICS_SPRITE_BATCH_ID, t); t->release(); return 1; } @@ -353,13 +421,13 @@ int w_newParticleSystem(lua_State *L) lua_Number size = luaL_optnumber(L, 2, 1000); ParticleSystem *t = 0; if (size < 1.0 || size > ParticleSystem::MAX_PARTICLES) - return luaL_error(L, "Invalid ParticleSystem size"); + return luaL_error(L, "Invalid ParticleSystem size"); luax_catchexcept(L, [&](){ t = instance()->newParticleSystem(texture, int(size)); } ); - luax_pushtype(L, "ParticleSystem", GRAPHICS_PARTICLE_SYSTEM_T, t); + luax_pushtype(L, GRAPHICS_PARTICLE_SYSTEM_ID, t); t->release(); return 1; } @@ -367,10 +435,10 @@ int w_newParticleSystem(lua_State *L) int w_newCanvas(lua_State *L) { // check if width and height are given. else default to screen dimensions. - int width = luaL_optint(L, 1, instance()->getWidth()); - int height = luaL_optint(L, 2, instance()->getHeight()); + int width = (int) luaL_optnumber(L, 1, instance()->getWidth()); + int height = (int) luaL_optnumber(L, 2, instance()->getHeight()); const char *str = luaL_optstring(L, 3, "normal"); - int msaa = luaL_optint(L, 4, 0); + int msaa = (int) luaL_optnumber(L, 4, 0); Canvas::Format format; if (!Canvas::getConstant(str, format)) @@ -384,16 +452,13 @@ int w_newCanvas(lua_State *L) if (canvas == nullptr) return luaL_error(L, "Canvas not created, but no error thrown. I don't even..."); - luax_pushtype(L, "Canvas", GRAPHICS_CANVAS_T, canvas); + luax_pushtype(L, GRAPHICS_CANVAS_ID, canvas); canvas->release(); return 1; } int w_newShader(lua_State *L) { - if (!Shader::isSupported()) - return luaL_error(L, "Sorry, your graphics card does not support shaders."); - // clamp stack to 2 elements lua_settop(L, 2); @@ -433,8 +498,8 @@ int w_newShader(lua_State *L) } } - bool has_arg1 = lua_isstring(L, 1); - bool has_arg2 = lua_isstring(L, 2); + bool has_arg1 = lua_isstring(L, 1) != 0; + bool has_arg2 = lua_isstring(L, 2) != 0; // require at least one string argument if (!(has_arg1 || has_arg2)) @@ -478,7 +543,7 @@ int w_newShader(lua_State *L) try { Shader *shader = instance()->newShader(source); - luax_pushtype(L, "Shader", GRAPHICS_SHADER_T, shader); + luax_pushtype(L, GRAPHICS_SHADER_ID, shader); shader->release(); } catch (love::Exception &e) @@ -497,43 +562,69 @@ int w_newShader(lua_State *L) return 1; } -int w_newMesh(lua_State *L) +static Mesh::Usage luax_optmeshusage(lua_State *L, int idx, Mesh::Usage def) { - // Check first argument: table of vertices or number of vertices. - int ttype = lua_type(L, 1); - if (ttype != LUA_TTABLE && ttype != LUA_TNUMBER) - luaL_argerror(L, 1, "table or number expected"); + const char *usagestr = lua_isnoneornil(L, idx) ? nullptr : luaL_checkstring(L, idx); - // Second argument: optional texture. - Texture *tex = nullptr; - if (!lua_isnoneornil(L, 2)) - tex = luax_checktexture(L, 2); + if (usagestr && !Mesh::getConstant(usagestr, def)) + luaL_error(L, "Invalid mesh usage hint: %s", usagestr); - // Third argument: optional draw mode. - const char *str = 0; - Mesh::DrawMode mode = Mesh::DRAW_MODE_FAN; - str = lua_isnoneornil(L, 3) ? 0 : luaL_checkstring(L, 3); + return def; +} - if (str && !Mesh::getConstant(str, mode)) - return luaL_error(L, "Invalid mesh draw mode: %s", str); +static Mesh::DrawMode luax_optmeshdrawmode(lua_State *L, int idx, Mesh::DrawMode def) +{ + const char *modestr = lua_isnoneornil(L, idx) ? nullptr : luaL_checkstring(L, idx); + if (modestr && !Mesh::getConstant(modestr, def)) + luaL_error(L, "Invalid mesh draw mode: %s", modestr); + + return def; +} + +static inline size_t writeVertexByteData(lua_State *L, int startidx, int components, char *data) +{ + uint8 *componentdata = (uint8 *) data; + for (int i = 0; i < components; i++) + componentdata[i] = (uint8) luaL_optnumber(L, startidx + i, 255); + + return sizeof(uint8) * components; +} + +static inline size_t writeVertexFloatData(lua_State *L, int startidx, int components, char *data) +{ + float *componentdata = (float *) data; + for (int i = 0; i < components; i++) + componentdata[i] = (float) luaL_optnumber(L, startidx + i, 0); + + return sizeof(float) * components; +} + +static Mesh *newStandardMesh(lua_State *L) +{ Mesh *t = nullptr; - if (ttype == LUA_TTABLE) - { - size_t vertex_count = lua_objlen(L, 1); - std::vector vertices; - vertices.reserve(vertex_count); + Mesh::DrawMode drawmode = luax_optmeshdrawmode(L, 2, Mesh::DRAWMODE_FAN); + Mesh::Usage usage = luax_optmeshusage(L, 3, Mesh::USAGE_DYNAMIC); - bool use_colors = false; + // First argument is a table of standard vertices, or the number of + // standard vertices. + if (lua_istable(L, 1)) + { + size_t vertexcount = luax_objlen(L, 1); + std::vector vertices; + vertices.reserve(vertexcount); // Get the vertices from the table. - for (size_t i = 1; i <= vertex_count; i++) + for (size_t i = 1; i <= vertexcount; i++) { - lua_rawgeti(L, 1, i); + lua_rawgeti(L, 1, (int) i); if (lua_type(L, -1) != LUA_TTABLE) - return luax_typerror(L, 1, "table of tables"); + { + luax_typerror(L, 1, "table of tables"); + return nullptr; + } for (int j = 1; j <= 8; j++) lua_rawgeti(L, -j, j); @@ -542,36 +633,199 @@ int w_newMesh(lua_State *L) v.x = (float) luaL_checknumber(L, -8); v.y = (float) luaL_checknumber(L, -7); - v.s = (float) luaL_optnumber(L, -6, 0.0); v.t = (float) luaL_optnumber(L, -5, 0.0); - v.r = (unsigned char) luaL_optinteger(L, -4, 255); v.g = (unsigned char) luaL_optinteger(L, -3, 255); v.b = (unsigned char) luaL_optinteger(L, -2, 255); v.a = (unsigned char) luaL_optinteger(L, -1, 255); - // Enable per-vertex coloring if any color is not the default. - if (!use_colors && (v.r != 255 || v.g != 255 || v.b != 255 || v.a != 255)) - use_colors = true; - lua_pop(L, 9); vertices.push_back(v); } - luax_catchexcept(L, [&](){ t = instance()->newMesh(vertices, mode); }); - t->setVertexColors(use_colors); + luax_catchexcept(L, [&](){ t = instance()->newMesh(vertices, drawmode, usage); }); } else { - int count = luaL_checkint(L, 1); - luax_catchexcept(L, [&](){ t = instance()->newMesh(count, mode); }); + int count = (int) luaL_checknumber(L, 1); + luax_catchexcept(L, [&](){ t = instance()->newMesh(count, drawmode, usage); }); } - if (tex) - t->setTexture(tex); + return t; +} - luax_pushtype(L, "Mesh", GRAPHICS_MESH_T, t); +static Mesh *newCustomMesh(lua_State *L) +{ + Mesh *t = nullptr; + + // First argument is the vertex format, second is a table of vertices or + // the number of vertices. + std::vector vertexformat; + + Mesh::DrawMode drawmode = luax_optmeshdrawmode(L, 3, Mesh::DRAWMODE_FAN); + Mesh::Usage usage = luax_optmeshusage(L, 4, Mesh::USAGE_DYNAMIC); + + lua_rawgeti(L, 1, 1); + if (!lua_istable(L, -1)) + { + luaL_argerror(L, 1, "table of tables expected"); + return nullptr; + } + lua_pop(L, 1); + + // Per-vertex attribute formats. + for (int i = 1; i <= (int) luax_objlen(L, 1); i++) + { + lua_rawgeti(L, 1, i); + + // {name, datatype, components} + for (int j = 1; j <= 3; j++) + lua_rawgeti(L, -j, j); + + Mesh::AttribFormat format; + format.name = luaL_checkstring(L, -3); + + const char *tname = luaL_checkstring(L, -2); + if (!Mesh::getConstant(tname, format.type)) + { + luaL_error(L, "Invalid Mesh vertex data type name: %s", tname); + return nullptr; + } + + format.components = (int) luaL_checknumber(L, -1); + if (format.components <= 0 || format.components > 4) + { + luaL_error(L, "Number of vertex attribute components must be between 1 and 4 (got %d)", format.components); + return nullptr; + } + + lua_pop(L, 4); + vertexformat.push_back(format); + } + + if (lua_isnumber(L, 2)) + { + int vertexcount = (int) luaL_checknumber(L, 2); + luax_catchexcept(L, [&](){ t = instance()->newMesh(vertexformat, vertexcount, drawmode, usage); }); + } + else if (luax_istype(L, 2, DATA_ID)) + { + // Vertex data comes directly from a Data object. + Data *data = luax_checktype(L, 2, DATA_ID); + luax_catchexcept(L, [&](){ t = instance()->newMesh(vertexformat, data->getData(), data->getSize(), drawmode, usage); }); + } + else + { + // Table of vertices. + lua_rawgeti(L, 2, 1); + if (!lua_istable(L, -1)) + { + luaL_argerror(L, 2, "expected table of tables"); + return nullptr; + } + lua_pop(L, 1); + + int vertexcomponents = 0; + for (const Mesh::AttribFormat &format : vertexformat) + vertexcomponents += format.components; + + size_t numvertices = luax_objlen(L, 2); + + luax_catchexcept(L, [&](){ t = instance()->newMesh(vertexformat, numvertices, drawmode, usage); }); + + // Maximum possible data size for a single vertex attribute. + char data[sizeof(float) * 4]; + + for (size_t vertindex = 0; vertindex < numvertices; vertindex++) + { + // get vertices[vertindex] + lua_rawgeti(L, 2, vertindex + 1); + luaL_checktype(L, -1, LUA_TTABLE); + + if ((int) luax_objlen(L, -1) < vertexcomponents) + { + t->release(); + const char *err = "Invalid number of components in vertex #%d (expected %d components, got %d)"; + luaL_error(L, err, vertindex+1, vertexcomponents, luax_objlen(L, -1)); + return nullptr; + } + + int n = 0; + for (size_t i = 0; i < vertexformat.size(); i++) + { + int components = vertexformat[i].components; + + // get vertices[vertindex][n] + for (int c = 0; c < components; c++) + { + n++; + lua_rawgeti(L, -(c + 1), n); + } + + // Fetch the values from Lua and store them in data buffer. + switch (vertexformat[i].type) + { + case Mesh::DATA_BYTE: + writeVertexByteData(L, -components, components, data); + break; + case Mesh::DATA_FLOAT: + default: + writeVertexFloatData(L, -components, components, data); + break; + } + + lua_pop(L, components); + + luax_catchexcept(L, + [&](){ t->setVertexAttribute(vertindex, i, data, sizeof(float) * 4); }, + [&](bool diderror){ if (diderror) t->release(); } + ); + } + + lua_pop(L, 1); // pop vertices[vertindex] + } + + t->flush(); + } + + return t; +} + +int w_newMesh(lua_State *L) +{ + // Check first argument: table or number of vertices. + int arg1type = lua_type(L, 1); + if (arg1type != LUA_TTABLE && arg1type != LUA_TNUMBER) + luaL_argerror(L, 1, "table or number expected"); + + Mesh *t = nullptr; + + int arg2type = lua_type(L, 2); + if (arg1type == LUA_TTABLE && (arg2type == LUA_TTABLE || arg2type == LUA_TNUMBER || arg2type == LUA_TUSERDATA)) + t = newCustomMesh(L); + else + t = newStandardMesh(L); + + luax_pushtype(L, GRAPHICS_MESH_ID, t); + t->release(); + return 1; +} + +int w_newText(lua_State *L) +{ + Font *font = luax_checkfont(L, 1); + Text *t = nullptr; + + if (lua_isnoneornil(L, 2)) + luax_catchexcept(L, [&](){ t = instance()->newText(font); }); + else + { + std::string text = luax_checkstring(L, 2); + luax_catchexcept(L, [&](){ t = instance()->newText(font, text); }); + } + + luax_pushtype(L, GRAPHICS_TEXT_ID, t); t->release(); return 1; } @@ -584,19 +838,19 @@ int w_setColor(lua_State *L) for (int i = 1; i <= 4; i++) lua_rawgeti(L, 1, i); - c.r = (unsigned char)luaL_checkint(L, -4); - c.g = (unsigned char)luaL_checkint(L, -3); - c.b = (unsigned char)luaL_checkint(L, -2); - c.a = (unsigned char)luaL_optint(L, -1, 255); + c.r = (unsigned char) luaL_checknumber(L, -4); + c.g = (unsigned char) luaL_checknumber(L, -3); + c.b = (unsigned char) luaL_checknumber(L, -2); + c.a = (unsigned char) luaL_optnumber(L, -1, 255); lua_pop(L, 4); } else { - c.r = (unsigned char)luaL_checkint(L, 1); - c.g = (unsigned char)luaL_checkint(L, 2); - c.b = (unsigned char)luaL_checkint(L, 3); - c.a = (unsigned char)luaL_optint(L, 4, 255); + c.r = (unsigned char) luaL_checknumber(L, 1); + c.g = (unsigned char) luaL_checknumber(L, 2); + c.b = (unsigned char) luaL_checknumber(L, 3); + c.a = (unsigned char) luaL_optnumber(L, 4, 255); } instance()->setColor(c); return 0; @@ -620,19 +874,19 @@ int w_setBackgroundColor(lua_State *L) for (int i = 1; i <= 4; i++) lua_rawgeti(L, 1, i); - c.r = (unsigned char)luaL_checkint(L, -4); - c.g = (unsigned char)luaL_checkint(L, -3); - c.b = (unsigned char)luaL_checkint(L, -2); - c.a = (unsigned char)luaL_optint(L, -1, 255); + c.r = (unsigned char) luaL_checknumber(L, -4); + c.g = (unsigned char) luaL_checknumber(L, -3); + c.b = (unsigned char) luaL_checknumber(L, -2); + c.a = (unsigned char) luaL_optnumber(L, -1, 255); lua_pop(L, 4); } else { - c.r = (unsigned char)luaL_checkint(L, 1); - c.g = (unsigned char)luaL_checkint(L, 2); - c.b = (unsigned char)luaL_checkint(L, 3); - c.a = (unsigned char)luaL_optint(L, 4, 255); + c.r = (unsigned char) luaL_checknumber(L, 1); + c.g = (unsigned char) luaL_checknumber(L, 2); + c.b = (unsigned char) luaL_checknumber(L, 3); + c.a = (unsigned char) luaL_optnumber(L, 4, 255); } instance()->setBackgroundColor(c); return 0; @@ -651,14 +905,14 @@ int w_getBackgroundColor(lua_State *L) int w_setNewFont(lua_State *L) { int ret = w_newFont(L); - Font *font = luax_checktype(L, -1, "Font", GRAPHICS_FONT_T); + Font *font = luax_checktype(L, -1, GRAPHICS_FONT_ID); instance()->setFont(font); return ret; } int w_setFont(lua_State *L) { - Font *font = luax_checktype(L, 1, "Font", GRAPHICS_FONT_T); + Font *font = luax_checktype(L, 1, GRAPHICS_FONT_ID); instance()->setFont(font); return 0; } @@ -668,7 +922,7 @@ int w_getFont(lua_State *L) Font *f = nullptr; luax_catchexcept(L, [&](){ f = instance()->getFont(); }); - luax_pushtype(L, "Font", GRAPHICS_FONT_T, f); + luax_pushtype(L, GRAPHICS_FONT_ID, f); return 1; } @@ -713,7 +967,9 @@ int w_setBlendMode(lua_State *L) if (!Graphics::getConstant(str, mode)) return luaL_error(L, "Invalid blend mode: %s", str); - luax_catchexcept(L, [&](){ instance()->setBlendMode(mode); }); + bool multiplyalpha = luax_optboolean(L, 2, true); + + luax_catchexcept(L, [&](){ instance()->setBlendMode(mode, multiplyalpha); }); return 0; } @@ -721,38 +977,34 @@ int w_getBlendMode(lua_State *L) { const char *str; Graphics::BlendMode mode; + bool multiplyalpha = false; - luax_catchexcept(L, [&](){ mode = instance()->getBlendMode(); }); + luax_catchexcept(L, [&](){ mode = instance()->getBlendMode(multiplyalpha); }); if (!Graphics::getConstant(mode, str)) return luaL_error(L, "Unknown blend mode"); lua_pushstring(L, str); - return 1; + lua_pushboolean(L, multiplyalpha); + return 2; } int w_setDefaultFilter(lua_State *L) { - Texture::FilterMode min; - Texture::FilterMode mag; + Texture::Filter f; const char *minstr = luaL_checkstring(L, 1); const char *magstr = luaL_optstring(L, 2, minstr); - if (!Texture::getConstant(minstr, min)) + if (!Texture::getConstant(minstr, f.min)) return luaL_error(L, "Invalid filter mode: %s", minstr); - if (!Texture::getConstant(magstr, mag)) + if (!Texture::getConstant(magstr, f.mag)) return luaL_error(L, "Invalid filter mode: %s", magstr); - float anisotropy = (float) luaL_optnumber(L, 3, 1.0); - - Texture::Filter f; - f.min = min; - f.mag = mag; - f.anisotropy = anisotropy; + f.anisotropy = (float) luaL_optnumber(L, 3, 1.0); instance()->setDefaultFilter(f); - + return 0; } @@ -800,7 +1052,7 @@ int w_getDefaultMipmapFilter(lua_State *L) lua_pushstring(L, str); else lua_pushnil(L); - + lua_pushnumber(L, sharpness); return 2; @@ -868,40 +1120,12 @@ int w_setPointSize(lua_State *L) return 0; } -int w_setPointStyle(lua_State *L) -{ - Graphics::PointStyle style; - - const char *str = luaL_checkstring(L, 1); - if (!Graphics::getConstant(str, style)) - return luaL_error(L, "Invalid point style: %s", str); - - instance()->setPointStyle(style); - return 0; -} - int w_getPointSize(lua_State *L) { lua_pushnumber(L, instance()->getPointSize()); return 1; } -int w_getPointStyle(lua_State *L) -{ - Graphics::PointStyle style = instance()->getPointStyle(); - const char *str; - if (!Graphics::getConstant(style, str)) - return luaL_error(L, "Unknown point style"); - lua_pushstring(L, str); - return 1; -} - -int w_getMaxPointSize(lua_State *L) -{ - lua_pushnumber(L, instance()->getSystemLimit(Graphics::LIMIT_POINT_SIZE)); - return 1; -} - int w_setWireframe(lua_State *L) { instance()->setWireframe(luax_toboolean(L, 1)); @@ -916,21 +1140,21 @@ int w_isWireframe(lua_State *L) int w_newScreenshot(lua_State *L) { - love::image::Image *image = luax_getmodule(L, "image", MODULE_IMAGE_T); + love::image::Image *image = luax_getmodule(L, MODULE_IMAGE_ID); bool copyAlpha = luax_optboolean(L, 1, false); love::image::ImageData *i = 0; luax_catchexcept(L, [&](){ i = instance()->newScreenshot(image, copyAlpha); }); - luax_pushtype(L, "ImageData", IMAGE_IMAGE_DATA_T, i); + luax_pushtype(L, IMAGE_IMAGE_DATA_ID, i); i->release(); return 1; } int w_setCanvas(lua_State *L) { - // discard stencil testing - instance()->discardStencil(); + // Disable stencil writes. + instance()->drawToStencilBuffer(false); // called with none -> reset to default buffer if (lua_isnoneornil(L, 1)) @@ -944,7 +1168,7 @@ int w_setCanvas(lua_State *L) if (is_table) { - for (size_t i = 1; i <= lua_objlen(L, 1); i++) + for (int i = 1; i <= (int) luax_objlen(L, 1); i++) { lua_rawgeti(L, 1, i); canvases.push_back(luax_checkcanvas(L, -1)); @@ -974,7 +1198,7 @@ int w_getCanvas(lua_State *L) for (Canvas *c : canvases) { - luax_pushtype(L, "Canvas", GRAPHICS_CANVAS_T, c); + luax_pushtype(L, GRAPHICS_CANVAS_ID, c); n++; } @@ -1004,7 +1228,7 @@ int w_getShader(lua_State *L) { Shader *shader = instance()->getShader(); if (shader) - luax_pushtype(L, "Shader", GRAPHICS_SHADER_T, shader); + luax_pushtype(L, GRAPHICS_SHADER_ID, shader); else lua_pushnil(L); @@ -1035,31 +1259,28 @@ int w_setDefaultShaderCode(lua_State *L) lua_pop(L, 3); - Shader::defaultCode[Graphics::RENDERER_OPENGL] = openglcode; + Shader::defaultCode[Graphics::RENDERER_OPENGL] = openglcode; Shader::defaultCode[Graphics::RENDERER_OPENGLES] = openglescode; return 0; } -int w_isSupported(lua_State *L) +int w_getSupported(lua_State *L) { - bool supported = true; + lua_createtable(L, 0, (int) Graphics::SUPPORT_MAX_ENUM); - for (int i = 1; i <= lua_gettop(L); i++) + for (int i = 0; i < (int) Graphics::SUPPORT_MAX_ENUM; i++) { - const char *str = luaL_checkstring(L, i); - Graphics::Support feature; - if (!Graphics::getConstant(str, feature)) - return luaL_error(L, "Invalid graphics feature: %s", str); + Graphics::Support feature = (Graphics::Support) i; + const char *name = nullptr; - if (!instance()->isSupported(feature)) - { - supported = false; - break; - } + if (!Graphics::getConstant(feature, name)) + continue; + + luax_pushboolean(L, instance()->isSupported(feature)); + lua_setfield(L, -2, name); } - luax_pushboolean(L, supported); return 1; } @@ -1084,20 +1305,20 @@ int w_getCanvasFormats(lua_State *L) int w_getCompressedImageFormats(lua_State *L) { - lua_createtable(L, 0, (int) image::CompressedData::FORMAT_MAX_ENUM); + lua_createtable(L, 0, (int) image::CompressedImageData::FORMAT_MAX_ENUM); - for (int i = 0; i < (int) image::CompressedData::FORMAT_MAX_ENUM; i++) + for (int i = 0; i < (int) image::CompressedImageData::FORMAT_MAX_ENUM; i++) { - image::CompressedData::Format format = (image::CompressedData::Format) i; + image::CompressedImageData::Format format = (image::CompressedImageData::Format) i; const char *name = nullptr; - if (format == image::CompressedData::FORMAT_UNKNOWN) + if (format == image::CompressedImageData::FORMAT_UNKNOWN) continue; - if (!image::CompressedData::getConstant(format, name)) + if (!image::CompressedImageData::getConstant(format, name)) continue; - luax_pushboolean(L, Image::hasCompressedTextureSupport(format)); + luax_pushboolean(L, Image::hasCompressedTextureSupport(format, false)); lua_setfield(L, -2, name); } @@ -1116,6 +1337,25 @@ int w_getRendererInfo(lua_State *L) return 4; } +int w_getSystemLimits(lua_State *L) +{ + lua_createtable(L, 0, (int) Graphics::LIMIT_MAX_ENUM); + + for (int i = 0; i < (int) Graphics::LIMIT_MAX_ENUM; i++) + { + Graphics::SystemLimit limittype = (Graphics::SystemLimit) i; + const char *name = nullptr; + + if (!Graphics::getConstant(limittype, name)) + continue; + + lua_pushnumber(L, instance()->getSystemLimit(limittype)); + lua_setfield(L, -2, name); + } + + return 1; +} + int w_getStats(lua_State *L) { Graphics::Stats stats = instance()->getStats(); @@ -1151,18 +1391,6 @@ int w_getStats(lua_State *L) return 1; } -int w_getSystemLimit(lua_State *L) -{ - const char *limitstr = luaL_checkstring(L, 1); - Graphics::SystemLimit limittype; - - if (!Graphics::getConstant(limitstr, limittype)) - return luaL_error(L, "Invalid system limit type: %s", limitstr); - - lua_pushnumber(L, instance()->getSystemLimit(limittype)); - return 1; -} - int w_draw(lua_State *L) { Drawable *drawable = nullptr; @@ -1170,10 +1398,10 @@ int w_draw(lua_State *L) Quad *quad = nullptr; int startidx = 2; - if (luax_istype(L, 2, GRAPHICS_QUAD_T)) + if (luax_istype(L, 2, GRAPHICS_QUAD_ID)) { texture = luax_checktexture(L, 1); - quad = luax_totype(L, 2, "Quad", GRAPHICS_QUAD_T); + quad = luax_totype(L, 2, GRAPHICS_QUAD_ID); startidx = 3; } else if (lua_isnil(L, 2) && !lua_isnoneornil(L, 3)) @@ -1182,7 +1410,7 @@ int w_draw(lua_State *L) } else { - drawable = luax_checktype(L, 1, "Drawable", GRAPHICS_DRAWABLE_T); + drawable = luax_checktype(L, 1, GRAPHICS_DRAWABLE_ID); startidx = 2; } @@ -1196,10 +1424,12 @@ int w_draw(lua_State *L) float kx = (float) luaL_optnumber(L, startidx + 7, 0.0); float ky = (float) luaL_optnumber(L, startidx + 8, 0.0); - if (texture && quad) - texture->drawq(quad, x, y, a, sx, sy, ox, oy, kx, ky); - else if (drawable) - drawable->draw(x, y, a, sx, sy, ox, oy, kx, ky); + luax_catchexcept(L, [&]() { + if (texture && quad) + texture->drawq(quad, x, y, a, sx, sy, ox, oy, kx, ky); + else if (drawable) + drawable->draw(x, y, a, sx, sy, ox, oy, kx, ky); + }); return 0; } @@ -1235,14 +1465,14 @@ int w_printf(lua_State *L) float ox = 0.0f, oy = 0.0f; float kx = 0.0f, ky = 0.0f; - Graphics::AlignMode align = Graphics::ALIGN_LEFT; + Font::AlignMode align = Font::ALIGN_LEFT; if (lua_gettop(L) >= 5) { if (!lua_isnil(L, 5)) { const char *str = luaL_checkstring(L, 5); - if (!Graphics::getConstant(str, align)) + if (!Font::getConstant(str, align)) return luaL_error(L, "Incorrect alignment: %s", str); } @@ -1275,7 +1505,7 @@ int w_line(lua_State *L) bool is_table = false; if (args == 1 && lua_istable(L, 1)) { - args = lua_objlen(L, 1); + args = (int) luax_objlen(L, 1); is_table = true; } @@ -1317,7 +1547,28 @@ int w_rectangle(lua_State *L) float y = (float)luaL_checknumber(L, 3); float w = (float)luaL_checknumber(L, 4); float h = (float)luaL_checknumber(L, 5); - instance()->rectangle(mode, x, y, w, h); + + if (lua_isnoneornil(L, 6)) + { + instance()->rectangle(mode, x, y, w, h); + return 0; + } + + float rx = (float)luaL_optnumber(L, 6, 0.0); + float ry = (float)luaL_optnumber(L, 7, rx); + + if (w > 0.0 && rx >= w / 2.0) + return luaL_error(L, "Invalid rectangle x-axis radius (must be less than half the width)"); + if (h > 0.0 && ry >= h / 2.0) + return luaL_error(L, "Invalid rectangle y-axis radius (must be less than half the height)"); + + int points; + if (lua_isnoneornil(L, 8)) + points = std::max(rx, ry) > 20.0 ? (int)(std::max(rx, ry) / 2) : 10; + else + points = (int) luaL_checknumber(L, 8); + + instance()->rectangle(mode, x, y, w, h, rx, ry, points); return 0; } @@ -1335,12 +1586,34 @@ int w_circle(lua_State *L) if (lua_isnoneornil(L, 5)) points = radius > 10 ? (int)(radius) : 10; else - points = luaL_checkint(L, 5); + points = (int) luaL_checknumber(L, 5); instance()->circle(mode, x, y, radius, points); return 0; } +int w_ellipse(lua_State *L) +{ + Graphics::DrawMode mode; + const char *str = luaL_checkstring(L, 1); + if (!Graphics::getConstant(str, mode)) + return luaL_error(L, "Incorrect draw mode %s", str); + + float x = (float)luaL_checknumber(L, 2); + float y = (float)luaL_checknumber(L, 3); + float a = (float)luaL_checknumber(L, 4); + float b = (float)luaL_optnumber(L, 5, a); + + int points; + if (lua_isnoneornil(L, 6)) + points = a + b > 30 ? (int)((a + b) / 2) : 15; + else + points = (int) luaL_checknumber(L, 6); + + instance()->ellipse(mode, x, y, a, b, points); + return 0; +} + int w_arc(lua_State *L) { Graphics::DrawMode mode; @@ -1357,7 +1630,7 @@ int w_arc(lua_State *L) if (lua_isnoneornil(L, 7)) points = radius > 10 ? (int)(radius) : 10; else - points = luaL_checkint(L, 7); + points = (int) luaL_checknumber(L, 7); instance()->arc(mode, x, y, radius, angle1, angle2, points); return 0; @@ -1376,7 +1649,7 @@ int w_polygon(lua_State *L) float *coords; if (args == 1 && lua_istable(L, 2)) { - args = lua_objlen(L, 2); + args = (int) luax_objlen(L, 2); is_table = true; } @@ -1471,6 +1744,7 @@ static const luaL_Reg functions[] = { { "reset", w_reset }, { "clear", w_clear }, + { "discard", w_discard }, { "present", w_present }, { "newImage", w_newImage }, @@ -1482,6 +1756,7 @@ static const luaL_Reg functions[] = { "newCanvas", w_newCanvas }, { "newShader", w_newShader }, { "newMesh", w_newMesh }, + { "newText", w_newText }, { "setColor", w_setColor }, { "getColor", w_getColor }, @@ -1507,9 +1782,7 @@ static const luaL_Reg functions[] = { "getLineStyle", w_getLineStyle }, { "getLineJoin", w_getLineJoin }, { "setPointSize", w_setPointSize }, - { "setPointStyle", w_setPointStyle }, { "getPointSize", w_getPointSize }, - { "getPointStyle", w_getPointStyle }, { "setWireframe", w_setWireframe }, { "isWireframe", w_isWireframe }, { "newScreenshot", w_newScreenshot }, @@ -1520,12 +1793,12 @@ static const luaL_Reg functions[] = { "getShader", w_getShader }, { "_setDefaultShaderCode", w_setDefaultShaderCode }, - { "isSupported", w_isSupported }, + { "getSupported", w_getSupported }, { "getCanvasFormats", w_getCanvasFormats }, { "getCompressedImageFormats", w_getCompressedImageFormats }, { "getRendererInfo", w_getRendererInfo }, + { "getSystemLimits", w_getSystemLimits }, { "getStats", w_getStats }, - { "getSystemLimit", w_getSystemLimit }, { "draw", w_draw }, @@ -1541,13 +1814,15 @@ static const luaL_Reg functions[] = { "setScissor", w_setScissor }, { "getScissor", w_getScissor }, - { "setStencil", w_setStencil }, - { "setInvertedStencil", w_setInvertedStencil }, + { "stencil", w_stencil }, + { "setStencilTest", w_setStencilTest }, + { "getStencilTest", w_getStencilTest }, { "point", w_point }, { "line", w_line }, { "rectangle", w_rectangle }, { "circle", w_circle }, + { "ellipse", w_ellipse }, { "arc", w_arc }, { "polygon", w_polygon }, @@ -1560,10 +1835,6 @@ static const luaL_Reg functions[] = { "shear", w_shear }, { "origin", w_origin }, - // Deprecated since 0.9.1. - { "getMaxImageSize", w_getMaxTextureSize }, - { "getMaxPointSize", w_getMaxPointSize }, - { 0, 0 } }; @@ -1578,6 +1849,7 @@ static const lua_CFunction types[] = luaopen_canvas, luaopen_shader, luaopen_mesh, + luaopen_text, 0 }; @@ -1594,13 +1866,13 @@ extern "C" int luaopen_love_graphics(lua_State *L) WrappedModule w; w.module = instance; w.name = "graphics"; - w.flags = MODULE_GRAPHICS_T; + w.type = MODULE_GRAPHICS_ID; w.functions = functions; w.types = types; int n = luax_register_module(L, w); - if (luaL_loadbuffer(L, (const char *)graphics_lua, sizeof(graphics_lua), "graphics.lua") == 0) + if (luaL_loadbuffer(L, (const char *)graphics_lua, sizeof(graphics_lua), "wrap_Graphics.lua") == 0) lua_call(L, 0, 0); return n; diff --git a/jni/love/src/modules/graphics/opengl/wrap_Graphics.h b/jni/love/src/modules/graphics/opengl/wrap_Graphics.h index e13e725f..6540d60b 100644 --- a/jni/love/src/modules/graphics/opengl/wrap_Graphics.h +++ b/jni/love/src/modules/graphics/opengl/wrap_Graphics.h @@ -22,14 +22,16 @@ #define LOVE_GRAPHICS_OPENGL_WRAP_GRAPHICS_H // LOVE +#include "common/config.h" #include "wrap_Font.h" #include "wrap_Image.h" -#include "wrap_Quad.h" +#include "graphics/wrap_Quad.h" #include "wrap_SpriteBatch.h" #include "wrap_ParticleSystem.h" #include "wrap_Canvas.h" #include "wrap_Shader.h" #include "wrap_Mesh.h" +#include "wrap_Text.h" #include "Graphics.h" namespace love @@ -41,6 +43,7 @@ namespace opengl int w_reset(lua_State *L); int w_clear(lua_State *L); +int w_discard(lua_State *L); int w_present(lua_State *L); int w_isCreated(lua_State *L); int w_isActive(lua_State *L); @@ -49,18 +52,19 @@ int w_getHeight(lua_State *L); int w_getDimensions(lua_State *L); int w_setScissor(lua_State *L); int w_getScissor(lua_State *L); -int w_setStencil(lua_State *L); -int w_setInvertedStencil(lua_State *L); -int w_getMaxTextureSize(lua_State *L); +int w_stencil(lua_State *L); +int w_setStencilTest(lua_State *L); +int w_getStencilTest(lua_State *L); int w_newImage(lua_State *L); int w_newQuad(lua_State *L); int w_newFont(lua_State *L); int w_newImageFont(lua_State *L); int w_newSpriteBatch(lua_State *L); int w_newParticleSystem(lua_State *L); -int w_newCanvas(lua_State *L); // comments in function +int w_newCanvas(lua_State *L); int w_newShader(lua_State *L); int w_newMesh(lua_State *L); +int w_newText(lua_State *L); int w_setColor(lua_State *L); int w_getColor(lua_State *L); int w_setBackgroundColor(lua_State *L); @@ -83,10 +87,7 @@ int w_getLineWidth(lua_State *L); int w_getLineStyle(lua_State *L); int w_getLineJoin(lua_State *L); int w_setPointSize(lua_State *L); -int w_setPointStyle(lua_State *L); int w_getPointSize(lua_State *L); -int w_getPointStyle(lua_State *L); -int w_getMaxPointSize(lua_State *L); int w_setWireframe(lua_State *L); int w_isWireframe(lua_State *L); int w_newScreenshot(lua_State *L); @@ -95,12 +96,12 @@ int w_getCanvas(lua_State *L); int w_setShader(lua_State *L); int w_getShader(lua_State *L); int w_setDefaultShaderCode(lua_State *L); -int w_isSupported(lua_State *L); +int w_getSupported(lua_State *L); int w_getCanvasFormats(lua_State *L); int w_getCompressedImageFormats(lua_State *L); int w_getRendererInfo(lua_State *L); +int w_getSystemLimits(lua_State *L); int w_getStats(lua_State *L); -int w_getSystemLimit(lua_State *L); int w_draw(lua_State *L); int w_print(lua_State *L); int w_printf(lua_State *L); @@ -108,6 +109,7 @@ int w_point(lua_State *L); int w_line(lua_State *L); int w_rectangle(lua_State *L); int w_circle(lua_State *L); +int w_ellipse(lua_State *L); int w_arc(lua_State *L); int w_polygon(lua_State *L); int w_push(lua_State *L); diff --git a/jni/love/src/modules/graphics/opengl/wrap_Graphics.lua b/jni/love/src/modules/graphics/opengl/wrap_Graphics.lua new file mode 100644 index 00000000..a78f0f84 --- /dev/null +++ b/jni/love/src/modules/graphics/opengl/wrap_Graphics.lua @@ -0,0 +1,266 @@ +R"luastring"--( +-- DO NOT REMOVE THE ABOVE LINE. It is used to load this file as a C++ string. +-- There is a matching delimiter at the bottom of the file. + +--[[ +Copyright (c) 2006-2015 LOVE Development Team + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not +claim that you wrote the original software. If you use this software +in a product, an acknowledgment in the product documentation would be +appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be +misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +--]] + +local table_concat = table.concat + +-- SHADERS + +local GLSL = {} + +GLSL.VERSION = "#version 120" +GLSL.VERSION_ES = "#version 100" + +GLSL.SYNTAX = [[ +#ifndef GL_ES +#define lowp +#define mediump +#define highp +#endif +#define number float +#define Image sampler2D +#define extern uniform +#define Texel texture2D +#pragma optionNV(strict on)]] + +-- Uniforms shared by the vertex and pixel shader stages. +GLSL.UNIFORMS = [[ +#ifdef GL_ES +// According to the GLSL ES 1.0 spec, uniform precision must match between stages, +// but we can't guarantee that highp is always supported in fragment shaders... +// We *really* don't want to use mediump for these in vertex shaders though. +#if defined(VERTEX) || defined(GL_FRAGMENT_PRECISION_HIGH) +#define LOVE_UNIFORM_PRECISION highp +#else +#define LOVE_UNIFORM_PRECISION mediump +#endif +uniform LOVE_UNIFORM_PRECISION mat4 TransformMatrix; +uniform LOVE_UNIFORM_PRECISION mat4 ProjectionMatrix; +uniform LOVE_UNIFORM_PRECISION mat4 TransformProjectionMatrix; +uniform LOVE_UNIFORM_PRECISION mat3 NormalMatrix; +#else +#define TransformMatrix gl_ModelViewMatrix +#define ProjectionMatrix gl_ProjectionMatrix +#define TransformProjectionMatrix gl_ModelViewProjectionMatrix +#define NormalMatrix gl_NormalMatrix +#endif +uniform mediump vec4 love_ScreenSize;]] + +GLSL.VERTEX = { + HEADER = [[ +#define VERTEX + +attribute vec4 VertexPosition; +attribute vec4 VertexTexCoord; +attribute vec4 VertexColor; +attribute vec4 ConstantColor; + +varying vec4 VaryingTexCoord; +varying vec4 VaryingColor; + +#ifdef GL_ES +uniform mediump float love_PointSize; +#endif]], + + FOOTER = [[ +void main() { + VaryingTexCoord = VertexTexCoord; + VaryingColor = VertexColor * ConstantColor; +#ifdef GL_ES + gl_PointSize = love_PointSize; +#endif + gl_Position = position(TransformProjectionMatrix, VertexPosition); +}]], +} + +GLSL.PIXEL = { + HEADER = [[ +#define PIXEL + +#ifdef GL_ES +precision mediump float; +#endif + +varying mediump vec4 VaryingTexCoord; +varying lowp vec4 VaryingColor; + +#define love_Canvases gl_FragData + +uniform sampler2D _tex0_;]], + + FOOTER = [[ +void main() { + // fix crashing issue in OSX when _tex0_ is unused within effect() + float dummy = Texel(_tex0_, vec2(.5)).r; + + // See Shader::checkSetScreenParams in Shader.cpp. + vec2 pixelcoord = vec2(gl_FragCoord.x, (gl_FragCoord.y * love_ScreenSize.z) + love_ScreenSize.w); + + gl_FragColor = effect(VaryingColor, _tex0_, VaryingTexCoord.st, pixelcoord); +}]], + + FOOTER_MULTI_CANVAS = [[ +void main() { + // fix crashing issue in OSX when _tex0_ is unused within effect() + float dummy = Texel(_tex0_, vec2(.5)).r; + + // See Shader::checkSetScreenParams in Shader.cpp. + vec2 pixelcoord = vec2(gl_FragCoord.x, (gl_FragCoord.y * love_ScreenSize.z) + love_ScreenSize.w); + + effects(VaryingColor, _tex0_, VaryingTexCoord.st, pixelcoord); +}]], +} + +local function createVertexCode(vertexcode, lang) + local vertexcodes = { + lang == "glsles" and GLSL.VERSION_ES or GLSL.VERSION, + GLSL.SYNTAX, GLSL.VERTEX.HEADER, GLSL.UNIFORMS, + lang == "glsles" and "#line 1" or "#line 0", + vertexcode, + GLSL.VERTEX.FOOTER, + } + return table_concat(vertexcodes, "\n") +end + +local function createPixelCode(pixelcode, is_multicanvas, lang) + local pixelcodes = { + lang == "glsles" and GLSL.VERSION_ES or GLSL.VERSION, + GLSL.SYNTAX, GLSL.PIXEL.HEADER, GLSL.UNIFORMS, + lang == "glsles" and "#line 1" or "#line 0", + pixelcode, + is_multicanvas and GLSL.PIXEL.FOOTER_MULTI_CANVAS or GLSL.PIXEL.FOOTER, + } + return table_concat(pixelcodes, "\n") +end + +local function isVertexCode(code) + return code:match("vec4%s+position%s*%(") ~= nil +end + +local function isPixelCode(code) + if code:match("vec4%s+effect%s*%(") then + return true + elseif code:match("void%s+effects%s*%(") then + -- function for rendering to multiple canvases simultaneously + return true, true + else + return false + end +end + +function love.graphics._shaderCodeToGLSL(arg1, arg2) + local vertexcode, pixelcode + local is_multicanvas = false -- whether pixel code has "effects" function instead of "effect" + + local lang = "glsl" + if (love.graphics.getRendererInfo()) == "OpenGL ES" then + lang = "glsles" + end + + if arg1 then + if isVertexCode(arg1) then + vertexcode = arg1 -- first arg contains vertex shader code + end + + local ispixel, isMultiCanvas = isPixelCode(arg1) + if ispixel then + pixelcode = arg1 -- first arg contains pixel shader code + is_multicanvas = isMultiCanvas + end + end + + if arg2 then + if isVertexCode(arg2) then + vertexcode = arg2 -- second arg contains vertex shader code + end + + local ispixel, isMultiCanvas = isPixelCode(arg2) + if ispixel then + pixelcode = arg2 -- second arg contains pixel shader code + is_multicanvas = isMultiCanvas + end + end + + if vertexcode then + vertexcode = createVertexCode(vertexcode, lang) + end + if pixelcode then + pixelcode = createPixelCode(pixelcode, is_multicanvas, lang) + end + + return vertexcode, pixelcode +end + +function love.graphics._transformGLSLErrorMessages(message) + local shadertype = message:match("Cannot compile (%a+) shader code") + if not shadertype then return message end + local lines = {"Cannot compile "..shadertype.." shader code:"} + for l in message:gmatch("[^\n]+") do + -- nvidia compiler message: + -- 0() : error/warning [NUMBER]: + local linenumber, what, message = l:match("^0%((%d+)%)%s*:%s*(%w+)[^:]+:%s*(.+)$") + if not linenumber then + -- ati compiler message: + -- ERROR 0:: error/warning(#[NUMBER]) [ERRORNAME]: + linenumber, what, message = l:match("^%w+: 0:(%d+):%s*(%w+)%([^%)]+%)%s*(.+)$") + if not linenumber then + -- OSX compiler message (?): + -- ERROR: 0:: + what, linenumber, message = l:match("^(%w+): %d+:(%d+): (.+)$") + end + end + if linenumber and what and message then + lines[#lines+1] = ("Line %d: %s: %s"):format(linenumber, what, message) + end + end + -- did not match any known error messages + if #lines == 1 then return message end + return table_concat(lines, "\n") +end + +local defaultcode = { + vertex = [[ +vec4 position(mat4 transform_proj, vec4 vertpos) { + return transform_proj * vertpos; +}]], + pixel = [[ +vec4 effect(lowp vec4 vcolor, Image tex, vec2 texcoord, vec2 pixcoord) { + return Texel(tex, texcoord) * vcolor; +}]] +} + +local defaults = { + opengl = { + createVertexCode(defaultcode.vertex, "glsl"), + createPixelCode(defaultcode.pixel, false, "glsl"), + }, + opengles = { + createVertexCode(defaultcode.vertex, "glsles"), + createPixelCode(defaultcode.pixel, false, "glsles"), + }, +} + +love.graphics._setDefaultShaderCode(defaults) + +-- DO NOT REMOVE THE NEXT LINE. It is used to load this file as a C++ string. +--)luastring"--" diff --git a/jni/love/src/modules/graphics/opengl/wrap_Image.cpp b/jni/love/src/modules/graphics/opengl/wrap_Image.cpp index 9e2dac9f..3e2790e3 100644 --- a/jni/love/src/modules/graphics/opengl/wrap_Image.cpp +++ b/jni/love/src/modules/graphics/opengl/wrap_Image.cpp @@ -30,7 +30,7 @@ namespace opengl Image *luax_checkimage(lua_State *L, int idx) { - return luax_checktype(L, idx, "Image", GRAPHICS_IMAGE_T); + return luax_checktype(L, idx, GRAPHICS_IMAGE_ID); } int w_Image_setMipmapFilter(lua_State *L) @@ -48,9 +48,7 @@ int w_Image_setMipmapFilter(lua_State *L) } luax_catchexcept(L, [&](){ t->setFilter(f); }); - - float sharpness = (float) luaL_optnumber(L, 3, 0); - t->setMipmapSharpness(sharpness); + t->setMipmapSharpness((float) luaL_optnumber(L, 3, 0.0)); return 0; } @@ -81,7 +79,13 @@ int w_Image_isCompressed(lua_State *L) int w_Image_refresh(lua_State *L) { Image *i = luax_checkimage(L, 1); - luax_catchexcept(L, [&](){ i->refresh(); }); + + int xoffset = (int) luaL_optnumber(L, 2, 0); + int yoffset = (int) luaL_optnumber(L, 3, 0); + int w = (int) luaL_optnumber(L, 4, i->getWidth()); + int h = (int) luaL_optnumber(L, 5, i->getHeight()); + + luax_catchexcept(L, [&](){ i->refresh(xoffset, yoffset, w, h); }); return 0; } @@ -90,21 +94,32 @@ int w_Image_getData(lua_State *L) Image *i = luax_checkimage(L, 1); if (i->isCompressed()) - { - love::image::CompressedData *t = i->getCompressedData(); - if (t) - luax_pushtype(L, "CompressedData", IMAGE_COMPRESSED_DATA_T, t); - else - lua_pushnil(L); - } + luax_pushtype(L, IMAGE_COMPRESSED_IMAGE_DATA_ID, i->getCompressedData()); else - { - love::image::ImageData *t = i->getImageData(); - if (t) - luax_pushtype(L, "ImageData", IMAGE_IMAGE_DATA_T, t); - else - lua_pushnil(L); - } + luax_pushtype(L, IMAGE_IMAGE_DATA_ID, i->getImageData()); + + return 1; +} + +static const char *imageFlagName(Image::FlagType flagtype) +{ + const char *name = nullptr; + Image::getConstant(flagtype, name); + return name; +} + +int w_Image_getFlags(lua_State *L) +{ + Image *i = luax_checkimage(L, 1); + Image::Flags flags = i->getFlags(); + + lua_createtable(L, 0, 2); + + lua_pushboolean(L, flags.mipmaps); + lua_setfield(L, -2, imageFlagName(Image::FLAG_TYPE_MIPMAPS)); + + lua_pushboolean(L, flags.sRGB); + lua_setfield(L, -2, imageFlagName(Image::FLAG_TYPE_SRGB)); return 1; } @@ -125,12 +140,13 @@ static const luaL_Reg functions[] = { "isCompressed", w_Image_isCompressed }, { "refresh", w_Image_refresh }, { "getData", w_Image_getData }, + { "getFlags", w_Image_getFlags }, { 0, 0 } }; extern "C" int luaopen_image(lua_State *L) { - return luax_register_type(L, "Image", functions); + return luax_register_type(L, GRAPHICS_IMAGE_ID, functions); } } // opengl diff --git a/jni/love/src/modules/graphics/opengl/wrap_Image.h b/jni/love/src/modules/graphics/opengl/wrap_Image.h index d91d81b2..edf8f789 100644 --- a/jni/love/src/modules/graphics/opengl/wrap_Image.h +++ b/jni/love/src/modules/graphics/opengl/wrap_Image.h @@ -24,7 +24,7 @@ // LOVE #include "common/runtime.h" #include "Image.h" -#include "wrap_Texture.h" +#include "graphics/wrap_Texture.h" namespace love { @@ -39,6 +39,7 @@ int w_Image_getMipmapFilter(lua_State *L); int w_Image_isCompressed(lua_State *L); int w_Image_refresh(lua_State *L); int w_Image_getData(lua_State *L); +int w_Image_getFlags(lua_State *L); extern "C" int luaopen_image(lua_State *L); } // opengl diff --git a/jni/love/src/modules/graphics/opengl/wrap_Mesh.cpp b/jni/love/src/modules/graphics/opengl/wrap_Mesh.cpp index 20c33c94..0538edc6 100644 --- a/jni/love/src/modules/graphics/opengl/wrap_Mesh.cpp +++ b/jni/love/src/modules/graphics/opengl/wrap_Mesh.cpp @@ -22,7 +22,7 @@ #include "wrap_Mesh.h" #include "Image.h" #include "Canvas.h" -#include "wrap_Texture.h" +#include "graphics/wrap_Texture.h" // C++ #include @@ -36,155 +36,209 @@ namespace opengl Mesh *luax_checkmesh(lua_State *L, int idx) { - return luax_checktype(L, idx, "Mesh", GRAPHICS_MESH_T); + return luax_checktype(L, idx, GRAPHICS_MESH_ID); +} + +static inline size_t writeByteData(lua_State *L, int startidx, int components, char *data) +{ + uint8 *componentdata = (uint8 *) data; + for (int i = 0; i < components; i++) + componentdata[i] = (uint8) luaL_optnumber(L, startidx + i, 255); + + return sizeof(uint8) * components; +} + +static inline size_t writeFloatData(lua_State *L, int startidx, int components, char *data) +{ + float *componentdata = (float *) data; + for (int i = 0; i < components; i++) + componentdata[i] = (float) luaL_optnumber(L, startidx + i, 0); + + return sizeof(float) * components; +} + +static inline char *writeAttributeData(lua_State *L, int startidx, Mesh::DataType type, int components, char *data) +{ + switch (type) + { + case Mesh::DATA_BYTE: + return data + writeByteData(L, startidx, components, data); + case Mesh::DATA_FLOAT: + return data + writeFloatData(L, startidx, components, data); + default: + return data; + } +} + +template +static inline size_t readData(lua_State *L, int components, const char *data) +{ + const T *componentdata = (const T *) data; + for (int i = 0; i < components; i++) + lua_pushnumber(L, (lua_Number) componentdata[i]); + + return sizeof(T) * components; +} + +static inline const char *readAttributeData(lua_State *L, Mesh::DataType type, int components, const char *data) +{ + switch (type) + { + case Mesh::DATA_BYTE: + return data + readData(L, components, data); + case Mesh::DATA_FLOAT: + return data + readData(L, components, data); + default: + return data; + } +} + +int w_Mesh_setVertices(lua_State *L) +{ + Mesh *t = luax_checkmesh(L, 1); + luaL_checktype(L, 2, LUA_TTABLE); + + size_t nvertices = luax_objlen(L, 2); + if (nvertices != t->getVertexCount()) + return luaL_error(L, "Invalid number of vertices (expected %d, got %d)", (int) t->getVertexCount(), (int) nvertices); + + const std::vector &vertexformat = t->getVertexFormat(); + + int ncomponents = 0; + for (const Mesh::AttribFormat &format : vertexformat) + ncomponents += format.components; + + char *data = (char *) t->mapVertexData(); + + for (size_t i = 0; i < nvertices; i++) + { + // get vertices[vertindex] + lua_rawgeti(L, 2, i + 1); + luaL_checktype(L, -1, LUA_TTABLE); + + // get vertices[vertindex][j] + for (int j = 1; j <= ncomponents; j++) + lua_rawgeti(L, -j, j); + + int idx = -ncomponents; + + for (const Mesh::AttribFormat &format : vertexformat) + { + // Fetch the values from Lua and store them in data buffer. + data = writeAttributeData(L, idx, format.type, format.components, data); + + idx += format.components; + } + + lua_pop(L, ncomponents + 1); + } + + t->unmapVertexData(); + return 0; } int w_Mesh_setVertex(lua_State *L) { Mesh *t = luax_checkmesh(L, 1); - size_t i = size_t(luaL_checkinteger(L, 2) - 1); + size_t index = (size_t) luaL_checkinteger(L, 2) - 1; - Vertex v; + bool istable = lua_istable(L, 3); - if (lua_istable(L, 3)) + const std::vector &vertexformat = t->getVertexFormat(); + + char *data = (char *) t->getVertexScratchBuffer(); + char *writtendata = data; + + int idx = istable ? 1 : 3; + + if (istable) { - for (int i = 1; i <= 8; i++) - lua_rawgeti(L, 3, i); + for (const Mesh::AttribFormat &format : vertexformat) + { + for (int i = idx; i < idx + format.components; i++) + lua_rawgeti(L, 3, i); - v.x = luaL_checknumber(L, -8); - v.y = luaL_checknumber(L, -7); - v.s = luaL_optnumber(L, -6, 0.0); - v.t = luaL_optnumber(L, -5, 0.0); - v.r = luaL_optinteger(L, -4, 255); - v.g = luaL_optinteger(L, -3, 255); - v.b = luaL_optinteger(L, -2, 255); - v.a = luaL_optinteger(L, -1, 255); + // Fetch the values from Lua and store them in data buffer. + writtendata = writeAttributeData(L, -format.components, format.type, format.components, writtendata); - lua_pop(L, 8); + idx += format.components; + lua_pop(L, format.components); + } } else { - v.x = luaL_checknumber(L, 3); - v.y = luaL_checknumber(L, 4); - v.s = luaL_optnumber(L, 5, 0.0); - v.t = luaL_optnumber(L, 6, 0.0); - v.r = luaL_optinteger(L, 7, 255); - v.g = luaL_optinteger(L, 8, 255); - v.b = luaL_optinteger(L, 9, 255); - v.a = luaL_optinteger(L, 10, 255); + for (const Mesh::AttribFormat &format : vertexformat) + { + // Fetch the values from Lua and store them in data buffer. + writtendata = writeAttributeData(L, idx, format.type, format.components, writtendata); + idx += format.components; + } } - luax_catchexcept(L, [&](){ t->setVertex(i, v); }); + luax_catchexcept(L, [&](){ t->setVertex(index, data, t->getVertexStride()); }); return 0; } int w_Mesh_getVertex(lua_State *L) { Mesh *t = luax_checkmesh(L, 1); - size_t i = (size_t) (luaL_checkinteger(L, 2) - 1); + size_t index = (size_t) luaL_checkinteger(L, 2) - 1; - Vertex v; - luax_catchexcept(L, [&](){ v = t->getVertex(i); }); + const std::vector &vertexformat = t->getVertexFormat(); - lua_pushnumber(L, v.x); - lua_pushnumber(L, v.y); - lua_pushnumber(L, v.s); - lua_pushnumber(L, v.t); - lua_pushnumber(L, v.r); - lua_pushnumber(L, v.g); - lua_pushnumber(L, v.b); - lua_pushnumber(L, v.a); + char *data = (char *) t->getVertexScratchBuffer(); + const char *readdata = data; - return 8; -} + luax_catchexcept(L, [&](){ t->getVertex(index, data, t->getVertexStride()); }); -int w_Mesh_setVertices(lua_State *L) -{ - Mesh *t = luax_checkmesh(L, 1); + int n = 0; - size_t vertex_count = lua_objlen(L, 2); - std::vector vertices; - vertices.reserve(vertex_count); - - // Get the vertices from the table. - for (size_t i = 1; i <= vertex_count; i++) + for (const Mesh::AttribFormat &format : vertexformat) { - lua_rawgeti(L, 2, i); - - if (lua_type(L, -1) != LUA_TTABLE) - return luax_typerror(L, 2, "table of tables"); - - for (int j = 1; j <= 8; j++) - lua_rawgeti(L, -j, j); - - Vertex v; - - v.x = (float) luaL_checknumber(L, -8); - v.y = (float) luaL_checknumber(L, -7); - - v.s = (float) luaL_optnumber(L, -6, 0.0); - v.t = (float) luaL_optnumber(L, -5, 0.0); - - v.r = (unsigned char) luaL_optinteger(L, -4, 255); - v.g = (unsigned char) luaL_optinteger(L, -3, 255); - v.b = (unsigned char) luaL_optinteger(L, -2, 255); - v.a = (unsigned char) luaL_optinteger(L, -1, 255); - - lua_pop(L, 9); - vertices.push_back(v); + readdata = readAttributeData(L, format.type, format.components, readdata); + n += format.components; } - luax_catchexcept(L, [&](){ t->setVertices(vertices); }); + return n; +} + +int w_Mesh_setVertexAttribute(lua_State *L) +{ + Mesh *t = luax_checkmesh(L, 1); + size_t vertindex = (size_t) luaL_checkinteger(L, 2) - 1; + int attribindex = (int) luaL_checkinteger(L, 3) - 1; + + Mesh::DataType type; + int components; + luax_catchexcept(L, [&](){ type = t->getAttributeInfo(attribindex, components); }); + + // Maximum possible size for a single vertex attribute. + char data[sizeof(float) * 4]; + + // Fetch the values from Lua and store them in the data buffer. + writeAttributeData(L, 4, type, components, data); + + luax_catchexcept(L, [&](){ t->setVertexAttribute(vertindex, attribindex, data, sizeof(float) * 4); }); return 0; } -int w_Mesh_getVertices(lua_State *L) +int w_Mesh_getVertexAttribute(lua_State *L) { Mesh *t = luax_checkmesh(L, 1); + size_t vertindex = (size_t) luaL_checkinteger(L, 2) - 1; + int attribindex = (int) luaL_checkinteger(L, 3) - 1; - const Vertex *vertices = t->getVertices(); + Mesh::DataType type; + int components; + luax_catchexcept(L, [&](){ type = t->getAttributeInfo(attribindex, components); }); - size_t count = t->getVertexCount(); - lua_createtable(L, count, 0); + // Maximum possible size for a single vertex attribute. + char data[sizeof(float) * 4]; - if (count == 0 || vertices == nullptr) - return 1; + luax_catchexcept(L, [&](){ t->getVertexAttribute(vertindex, attribindex, data, sizeof(float) * 4); }); - for (size_t i = 0; i < count; i++) - { - // Create vertex table. - lua_createtable(L, 8, 0); - - lua_pushnumber(L, vertices[i].x); - lua_rawseti(L, -2, 1); - - lua_pushnumber(L, vertices[i].y); - lua_rawseti(L, -2, 2); - - lua_pushnumber(L, vertices[i].s); - lua_rawseti(L, -2, 3); - - lua_pushnumber(L, vertices[i].t); - lua_rawseti(L, -2, 4); - - lua_pushnumber(L, vertices[i].r); - lua_rawseti(L, -2, 5); - - lua_pushnumber(L, vertices[i].g); - lua_rawseti(L, -2, 6); - - lua_pushnumber(L, vertices[i].b); - lua_rawseti(L, -2, 7); - - lua_pushnumber(L, vertices[i].a); - lua_rawseti(L, -2, 8); - - // Insert vertex table into vertices table. - lua_rawseti(L, -2, i + 1); - } - - // Return vertices table. - return 1; + readAttributeData(L, type, components, data); + return components; } int w_Mesh_getVertexCount(lua_State *L) @@ -194,25 +248,95 @@ int w_Mesh_getVertexCount(lua_State *L) return 1; } +int w_Mesh_getVertexFormat(lua_State *L) +{ + Mesh *t = luax_checkmesh(L, 1); + + const std::vector &vertexformat = t->getVertexFormat(); + lua_createtable(L, (int) vertexformat.size(), 0); + + const char *tname = nullptr; + + for (size_t i = 0; i < vertexformat.size(); i++) + { + if (!Mesh::getConstant(vertexformat[i].type, tname)) + return luaL_error(L, "Unknown vertex attribute data type."); + + lua_createtable(L, 3, 0); + + lua_pushstring(L, vertexformat[i].name.c_str()); + lua_rawseti(L, -2, 1); + + lua_pushstring(L, tname); + lua_rawseti(L, -2, 2); + + lua_pushinteger(L, vertexformat[i].components); + lua_rawseti(L, -2, 3); + + // format[i] = {name, type, components} + lua_rawseti(L, -2, (int) i + 1); + } + + return 1; +} + +int w_Mesh_setAttributeEnabled(lua_State *L) +{ + Mesh *t = luax_checkmesh(L, 1); + const char *name = luaL_checkstring(L, 2); + bool enable = luax_toboolean(L, 3); + luax_catchexcept(L, [&](){ t->setAttributeEnabled(name, enable); }); + return 0; +} + +int w_Mesh_isAttributeEnabled(lua_State *L) +{ + Mesh *t = luax_checkmesh(L, 1); + const char *name = luaL_checkstring(L, 2); + bool enabled = false; + luax_catchexcept(L, [&](){ enabled = t->isAttributeEnabled(name); }); + lua_pushboolean(L, enabled); + return 1; +} + +int w_Mesh_attachAttribute(lua_State *L) +{ + Mesh *t = luax_checkmesh(L, 1); + const char *name = luaL_checkstring(L, 2); + Mesh *mesh = luax_checkmesh(L, 3); + luax_catchexcept(L, [&](){ t->attachAttribute(name, mesh); }); + return 0; +} + +int w_Mesh_flush(lua_State *L) +{ + Mesh *t = luax_checkmesh(L, 1); + t->flush(); + return 0; +} + int w_Mesh_setVertexMap(lua_State *L) { Mesh *t = luax_checkmesh(L, 1); bool is_table = lua_istable(L, 2); - int nargs = is_table ? lua_objlen(L, 2) : lua_gettop(L) - 1; + int nargs = is_table ? (int) luax_objlen(L, 2) : lua_gettop(L) - 1; std::vector vertexmap; vertexmap.reserve(nargs); - for (int i = 0; i < nargs; i++) + if (is_table) { - if (is_table) + for (int i = 0; i < nargs; i++) { lua_rawgeti(L, 2, i + 1); vertexmap.push_back(uint32(luaL_checkinteger(L, -1) - 1)); lua_pop(L, 1); } - else + } + else + { + for (int i = 0; i < nargs; i++) vertexmap.push_back(uint32(luaL_checkinteger(L, i + 2) - 1)); } @@ -227,11 +351,11 @@ int w_Mesh_getVertexMap(lua_State *L) std::vector vertex_map; luax_catchexcept(L, [&](){ t->getVertexMap(vertex_map); }); - size_t element_count = vertex_map.size(); + int element_count = (int) vertex_map.size(); lua_createtable(L, element_count, 0); - for (size_t i = 0; i < element_count; i++) + for (int i = 0; i < element_count; i++) { lua_pushinteger(L, lua_Integer(vertex_map[i]) + 1); lua_rawseti(L, -2, i + 1); @@ -265,9 +389,9 @@ int w_Mesh_getTexture(lua_State *L) // FIXME: big hack right here. if (typeid(*tex) == typeid(Image)) - luax_pushtype(L, "Image", GRAPHICS_IMAGE_T, tex); + luax_pushtype(L, GRAPHICS_IMAGE_ID, tex); else if (typeid(*tex) == typeid(Canvas)) - luax_pushtype(L, "Canvas", GRAPHICS_CANVAS_T, tex); + luax_pushtype(L, GRAPHICS_CANVAS_ID, tex); else return luaL_error(L, "Unable to determine texture type."); @@ -308,8 +432,8 @@ int w_Mesh_setDrawRange(lua_State *L) t->setDrawRange(); else { - int rangemin = luaL_checkint(L, 2) - 1; - int rangemax = luaL_checkint(L, 3) - 1; + int rangemin = (int) luaL_checknumber(L, 2) - 1; + int rangemax = (int) luaL_checknumber(L, 3) - 1; luax_catchexcept(L, [&](){ t->setDrawRange(rangemin, rangemax); }); } @@ -332,27 +456,19 @@ int w_Mesh_getDrawRange(lua_State *L) return 2; } -int w_Mesh_setVertexColors(lua_State *L) -{ - Mesh *t = luax_checkmesh(L, 1); - t->setVertexColors(luax_toboolean(L, 2)); - return 0; -} - -int w_Mesh_hasVertexColors(lua_State *L) -{ - Mesh *t = luax_checkmesh(L, 1); - luax_pushboolean(L, t->hasVertexColors()); - return 1; -} - static const luaL_Reg functions[] = { + { "setVertices", w_Mesh_setVertices }, { "setVertex", w_Mesh_setVertex }, { "getVertex", w_Mesh_getVertex }, - { "setVertices", w_Mesh_setVertices }, - { "getVertices", w_Mesh_getVertices }, + { "setVertexAttribute", w_Mesh_setVertexAttribute }, + { "getVertexAttribute", w_Mesh_getVertexAttribute }, { "getVertexCount", w_Mesh_getVertexCount }, + { "getVertexFormat", w_Mesh_getVertexFormat }, + { "setAttributeEnabled", w_Mesh_setAttributeEnabled }, + { "isAttributeEnabled", w_Mesh_isAttributeEnabled }, + { "attachAttribute", w_Mesh_attachAttribute }, + { "flush", w_Mesh_flush }, { "setVertexMap", w_Mesh_setVertexMap }, { "getVertexMap", w_Mesh_getVertexMap }, { "setTexture", w_Mesh_setTexture }, @@ -361,19 +477,12 @@ static const luaL_Reg functions[] = { "getDrawMode", w_Mesh_getDrawMode }, { "setDrawRange", w_Mesh_setDrawRange }, { "getDrawRange", w_Mesh_getDrawRange }, - { "setVertexColors", w_Mesh_setVertexColors }, - { "hasVertexColors", w_Mesh_hasVertexColors }, - - // Deprecated since 0.9.1. - { "setImage", w_Mesh_setTexture }, - { "getImage", w_Mesh_getTexture }, - { 0, 0 } }; extern "C" int luaopen_mesh(lua_State *L) { - return luax_register_type(L, "Mesh", functions); + return luax_register_type(L, GRAPHICS_MESH_ID, functions); } } // opengl diff --git a/jni/love/src/modules/graphics/opengl/wrap_Mesh.h b/jni/love/src/modules/graphics/opengl/wrap_Mesh.h index 477927d3..5ba254ca 100644 --- a/jni/love/src/modules/graphics/opengl/wrap_Mesh.h +++ b/jni/love/src/modules/graphics/opengl/wrap_Mesh.h @@ -33,12 +33,17 @@ namespace opengl { Mesh *luax_checkmesh(lua_State *L, int idx); - +int w_Mesh_setVertices(lua_State *L); int w_Mesh_setVertex(lua_State *L); int w_Mesh_getVertex(lua_State *L); -int w_Mesh_setVertices(lua_State *L); -int w_Mesh_getVertices(lua_State *L); +int w_Mesh_setVertexAttribute(lua_State *L); +int w_Mesh_getVertexAttribute(lua_State *L); int w_Mesh_getVertexCount(lua_State *L); +int w_Mesh_getVertexFormat(lua_State *L); +int w_Mesh_setAttributeEnabled(lua_State *L); +int w_Mesh_isAttributeEnabled(lua_State *L); +int w_Mesh_attachAttribute(lua_State *L); +int w_Mesh_flush(lua_State *L); int w_Mesh_setVertexMap(lua_State *L); int w_Mesh_getVertexMap(lua_State *L); int w_Mesh_setTexture(lua_State *L); @@ -47,9 +52,6 @@ int w_Mesh_setDrawMode(lua_State *L); int w_Mesh_getDrawMode(lua_State *L); int w_Mesh_setDrawRange(lua_State *L); int w_Mesh_getDrawRange(lua_State *L); -int w_Mesh_setVertexColors(lua_State *L); -int w_Mesh_hasVertexColors(lua_State *L); - extern "C" int luaopen_mesh(lua_State *L); } // opengl diff --git a/jni/love/src/modules/graphics/opengl/wrap_ParticleSystem.cpp b/jni/love/src/modules/graphics/opengl/wrap_ParticleSystem.cpp index 970f2c3d..399db4e0 100644 --- a/jni/love/src/modules/graphics/opengl/wrap_ParticleSystem.cpp +++ b/jni/love/src/modules/graphics/opengl/wrap_ParticleSystem.cpp @@ -24,7 +24,7 @@ #include "Image.h" #include "Canvas.h" -#include "wrap_Texture.h" +#include "graphics/wrap_Texture.h" // C #include @@ -41,7 +41,7 @@ namespace opengl ParticleSystem *luax_checkparticlesystem(lua_State *L, int idx) { - return luax_checktype(L, idx, "ParticleSystem", GRAPHICS_PARTICLE_SYSTEM_T); + return luax_checktype(L, idx, GRAPHICS_PARTICLE_SYSTEM_ID); } int w_ParticleSystem_clone(lua_State *L) @@ -51,7 +51,7 @@ int w_ParticleSystem_clone(lua_State *L) ParticleSystem *clone = nullptr; luax_catchexcept(L, [&](){ clone = t->clone(); }); - luax_pushtype(L, "ParticleSystem", GRAPHICS_PARTICLE_SYSTEM_T, clone); + luax_pushtype(L, GRAPHICS_PARTICLE_SYSTEM_ID, clone); clone->release(); return 1; } @@ -71,9 +71,9 @@ int w_ParticleSystem_getTexture(lua_State *L) // FIXME: big hack right here. if (typeid(*tex) == typeid(Image)) - luax_pushtype(L, "Image", GRAPHICS_IMAGE_T, tex); + luax_pushtype(L, GRAPHICS_IMAGE_ID, tex); else if (typeid(*tex) == typeid(Canvas)) - luax_pushtype(L, "Canvas", GRAPHICS_CANVAS_T, tex); + luax_pushtype(L, GRAPHICS_CANVAS_ID, tex); else return luaL_error(L, "Unable to determine texture type."); @@ -381,7 +381,7 @@ int w_ParticleSystem_setSizes(lua_State *L) { std::vector sizes(nSizes); for (size_t i = 0; i < nSizes; ++i) - sizes[i] = luax_checkfloat(L, 1 + i + 1); + sizes[i] = luax_checkfloat(L, (int) (1 + i + 1)); t->setSizes(sizes); } @@ -396,7 +396,7 @@ int w_ParticleSystem_getSizes(lua_State *L) for (size_t i = 0; i < sizes.size(); i++) lua_pushnumber(L, sizes[i]); - return sizes.size(); + return (int) sizes.size(); } int w_ParticleSystem_setSizeVariation(lua_State *L) @@ -494,18 +494,18 @@ int w_ParticleSystem_setColors(lua_State *L) if (lua_istable(L, 2)) // setColors({r,g,b,a}, {r,g,b,a}, ...) { - size_t nColors = lua_gettop(L) - 1; + int nColors = (int) lua_gettop(L) - 1; if (nColors > 8) return luaL_error(L, "At most eight (8) colors may be used."); std::vector colors(nColors); - for (size_t i = 0; i < nColors; i++) + for (int i = 0; i < nColors; i++) { luaL_checktype(L, i + 2, LUA_TTABLE); - if (lua_objlen(L, i + 2) < 3) + if (luax_objlen(L, i + 2) < 3) return luaL_argerror(L, i + 2, "expected 4 color components"); for (int j = 0; j < 4; j++) @@ -528,7 +528,7 @@ int w_ParticleSystem_setColors(lua_State *L) else // setColors(r,g,b,a, r,g,b,a, ...) { int cargs = lua_gettop(L) - 1; - size_t nColors = (cargs + 3) / 4; // nColors = ceil(color_args / 4) + int nColors = (cargs + 3) / 4; // nColors = ceil(color_args / 4) if (cargs != 3 && (cargs % 4 != 0 || cargs == 0)) return luaL_error(L, "Expected red, green, blue, and alpha. Only got %d of 4 components.", cargs % 4); @@ -547,7 +547,7 @@ int w_ParticleSystem_setColors(lua_State *L) else { std::vector colors(nColors); - for (size_t i = 0; i < nColors; ++i) + for (int i = 0; i < nColors; ++i) { unsigned char r = (unsigned char) luaL_checkinteger(L, 1 + i*4 + 1); unsigned char g = (unsigned char) luaL_checkinteger(L, 1 + i*4 + 2); @@ -582,7 +582,7 @@ int w_ParticleSystem_getColors(lua_State *L) lua_rawseti(L, -2, 4); } - return colors.size(); + return (int) colors.size(); } int w_ParticleSystem_setQuads(lua_State *L) @@ -592,11 +592,11 @@ int w_ParticleSystem_setQuads(lua_State *L) if (lua_istable(L, 2)) { - for (size_t i = 1; i <= lua_objlen(L, 2); i++) + for (int i = 1; i <= (int) luax_objlen(L, 2); i++) { lua_rawgeti(L, 2, i); - Quad *q = luax_checktype(L, -1, "Quad", GRAPHICS_QUAD_T); + Quad *q = luax_checktype(L, -1, GRAPHICS_QUAD_ID); quads.push_back(q); lua_pop(L, 1); @@ -606,7 +606,7 @@ int w_ParticleSystem_setQuads(lua_State *L) { for (int i = 2; i <= lua_gettop(L); i++) { - Quad *q = luax_checktype(L, i, "Quad", GRAPHICS_QUAD_T); + Quad *q = luax_checktype(L, i, GRAPHICS_QUAD_ID); quads.push_back(q); } } @@ -622,9 +622,9 @@ int w_ParticleSystem_getQuads(lua_State *L) lua_createtable(L, (int) quads.size(), 0); - for (size_t i = 0; i < quads.size(); i++) + for (int i = 0; i < (int) quads.size(); i++) { - luax_pushtype(L, "Quad", GRAPHICS_QUAD_T, quads[i]); + luax_pushtype(L, GRAPHICS_QUAD_ID, quads[i]); lua_rawseti(L, -2, i + 1); } @@ -683,7 +683,7 @@ int w_ParticleSystem_reset(lua_State *L) int w_ParticleSystem_emit(lua_State *L) { ParticleSystem *t = luax_checkparticlesystem(L, 1); - int num = luaL_checkint(L, 2); + int num = (int) luaL_checknumber(L, 2); t->emit(num); return 0; } @@ -779,17 +779,12 @@ static const luaL_Reg functions[] = { "isPaused", w_ParticleSystem_isPaused }, { "isStopped", w_ParticleSystem_isStopped }, { "update", w_ParticleSystem_update }, - - // Deprecated since 0.9.1. - { "setImage", w_ParticleSystem_setTexture }, - { "getImage", w_ParticleSystem_getTexture }, - { 0, 0 } }; extern "C" int luaopen_particlesystem(lua_State *L) { - return luax_register_type(L, "ParticleSystem", functions); + return luax_register_type(L, GRAPHICS_PARTICLE_SYSTEM_ID, functions); } } // opengl diff --git a/jni/love/src/modules/graphics/opengl/wrap_Shader.cpp b/jni/love/src/modules/graphics/opengl/wrap_Shader.cpp index 555cee43..562ac8f6 100644 --- a/jni/love/src/modules/graphics/opengl/wrap_Shader.cpp +++ b/jni/love/src/modules/graphics/opengl/wrap_Shader.cpp @@ -19,7 +19,7 @@ **/ #include "wrap_Shader.h" -#include "wrap_Texture.h" +#include "graphics/wrap_Texture.h" #include #include @@ -32,7 +32,7 @@ namespace opengl Shader *luax_checkshader(lua_State *L, int idx) { - return luax_checktype(L, idx, "Shader", GRAPHICS_SHADER_T); + return luax_checktype(L, idx, GRAPHICS_SHADER_ID); } int w_Shader_getWarnings(lua_State *L) @@ -68,7 +68,7 @@ static T *_getScalars(lua_State *L, int count, size_t &dimension) template static T *_getVectors(lua_State *L, int count, size_t &dimension) { - dimension = lua_objlen(L, 3); + dimension = luax_objlen(L, 3); T *values = new T[count * dimension]; for (int i = 0; i < count; ++i) @@ -79,15 +79,15 @@ static T *_getVectors(lua_State *L, int count, size_t &dimension) luax_typerror(L, 3 + i, "table"); return 0; } - if (lua_objlen(L, 3 + i) != dimension) + if (luax_objlen(L, 3 + i) != dimension) { delete[] values; luaL_error(L, "Error in argument %d: Expected table size %d, got %d.", - 3+i, dimension, lua_objlen(L, 3+i)); + 3+i, dimension, luax_objlen(L, 3+i)); return 0; } - for (size_t k = 1; k <= dimension; ++k) + for (int k = 1; k <= (int) dimension; ++k) { lua_rawgeti(L, 3 + i, k); if (lua_isnumber(L, -1)) @@ -132,7 +132,7 @@ int w_Shader_sendInt(lua_State *L) bool should_error = false; try { - shader->sendInt(name, dimension, values, count); + shader->sendInt(name, (int) dimension, values, count); } catch (love::Exception &e) { @@ -173,7 +173,7 @@ int w_Shader_sendFloat(lua_State *L) bool should_error = false; try { - shader->sendFloat(name, dimension, values, count); + shader->sendFloat(name, (int) dimension, values, count); } catch (love::Exception &e) { @@ -199,7 +199,7 @@ int w_Shader_sendMatrix(lua_State *L) return luax_typerror(L, 3, "matrix table"); lua_getfield(L, 3, "dimension"); - int dimension = lua_tointeger(L, -1); + int dimension = (int) lua_tointeger(L, -1); lua_pop(L, 1); if (dimension < 2 || dimension > 4) @@ -217,7 +217,7 @@ int w_Shader_sendMatrix(lua_State *L) // a dimension of mind. You're moving into a land of both shadow // and substance, of things and ideas. You've just crossed over // into... the Twilight Zone. - int other_dimension = lua_tointeger(L, -1); + int other_dimension = (int) lua_tointeger(L, -1); delete[] values; return luaL_error(L, "Invalid matrix size at argument %d: Expected size %dx%d, got %dx%d.", 3+i, dimension, dimension, other_dimension, other_dimension); @@ -234,7 +234,7 @@ int w_Shader_sendMatrix(lua_State *L) luax_catchexcept(L, [&]() { shader->sendMatrix(name, dimension, values, count); }, - [&]() { delete[] values; } + [&](bool) { delete[] values; } ); return 0; @@ -258,19 +258,19 @@ static void w_convertMatrices(lua_State *L, int idx) for (int matrix = idx; matrix < idx + matrixcount; matrix++) { luaL_checktype(L, matrix, LUA_TTABLE); - int dimension = lua_objlen(L, matrix); + int dimension = (int) luax_objlen(L, matrix); int newi = 1; lua_createtable(L, dimension * dimension, 0); // Collapse {{a,b,c}, {d,e,f}, ...} to {a,b,c, d,e,f, ...} - for (size_t i = 1; i <= lua_objlen(L, matrix); i++) + for (int i = 1; i <= (int) luax_objlen(L, matrix); i++) { // Push args[matrix][i] onto the stack. lua_rawgeti(L, matrix, i); luaL_checktype(L, -1, LUA_TTABLE); - for (size_t j = 1; j <= lua_objlen(L, -1); j++) + for (int j = 1; j <= (int) luax_objlen(L, -1); j++) { // Push args[matrix[i][j] onto the stack. lua_rawgeti(L, -1, j); @@ -308,7 +308,7 @@ int w_Shader_send(lua_State *L) // Texture (Image or Canvas). p = (Proxy *) lua_touserdata(L, 3); - if (p->flags[GRAPHICS_TEXTURE_ID]) + if (typeFlags[p->type][GRAPHICS_TEXTURE_ID]) return w_Shader_sendTexture(L); break; @@ -376,17 +376,12 @@ static const luaL_Reg functions[] = { "sendTexture", w_Shader_sendTexture }, { "send", w_Shader_send }, { "getExternVariable", w_Shader_getExternVariable }, - - // Deprecated since 0.9.1. - { "sendImage", w_Shader_sendTexture }, - { "sendCanvas", w_Shader_sendTexture }, - { 0, 0 } }; extern "C" int luaopen_shader(lua_State *L) { - return luax_register_type(L, "Shader", functions); + return luax_register_type(L, GRAPHICS_SHADER_ID, functions); } } // opengl diff --git a/jni/love/src/modules/graphics/opengl/wrap_SpriteBatch.cpp b/jni/love/src/modules/graphics/opengl/wrap_SpriteBatch.cpp index 5b891348..08ff147f 100644 --- a/jni/love/src/modules/graphics/opengl/wrap_SpriteBatch.cpp +++ b/jni/love/src/modules/graphics/opengl/wrap_SpriteBatch.cpp @@ -22,7 +22,7 @@ #include "wrap_SpriteBatch.h" #include "Image.h" #include "Canvas.h" -#include "wrap_Texture.h" +#include "graphics/wrap_Texture.h" // C++ #include @@ -36,7 +36,7 @@ namespace opengl SpriteBatch *luax_checkspritebatch(lua_State *L, int idx) { - return luax_checktype(L, idx, "SpriteBatch", GRAPHICS_SPRITE_BATCH_T); + return luax_checktype(L, idx, GRAPHICS_SPRITE_BATCH_ID); } int w_SpriteBatch_add(lua_State *L) @@ -45,9 +45,9 @@ int w_SpriteBatch_add(lua_State *L) Quad *quad = nullptr; int startidx = 2; - if (luax_istype(L, 2, GRAPHICS_QUAD_T)) + if (luax_istype(L, 2, GRAPHICS_QUAD_ID)) { - quad = luax_totype(L, 2, "Quad", GRAPHICS_QUAD_T); + quad = luax_totype(L, 2, GRAPHICS_QUAD_ID); startidx = 3; } else if (lua_isnil(L, 2) && !lua_isnoneornil(L, 3)) @@ -63,29 +63,29 @@ int w_SpriteBatch_add(lua_State *L) float kx = (float) luaL_optnumber(L, startidx + 7, 0.0); float ky = (float) luaL_optnumber(L, startidx + 8, 0.0); - int id = 0; + int index = 0; luax_catchexcept(L, [&]() { if (quad) - id = t->addq(quad, x, y, a, sx, sy, ox, oy, kx, ky); + index = t->addq(quad, x, y, a, sx, sy, ox, oy, kx, ky); else - id = t->add(x, y, a, sx, sy, ox, oy, kx, ky); + index = t->add(x, y, a, sx, sy, ox, oy, kx, ky); }); - lua_pushinteger(L, id); + lua_pushinteger(L, index + 1); return 1; } int w_SpriteBatch_set(lua_State *L) { SpriteBatch *t = luax_checkspritebatch(L, 1); - int id = luaL_checkinteger(L, 2); + int index = (int) luaL_checknumber(L, 2) - 1; Quad *quad = nullptr; int startidx = 3; - if (luax_istype(L, 3, GRAPHICS_QUAD_T)) + if (luax_istype(L, 3, GRAPHICS_QUAD_ID)) { - quad = luax_totype(L, 3, "Quad", GRAPHICS_QUAD_T); + quad = luax_totype(L, 3, GRAPHICS_QUAD_ID); startidx = 4; } else if (lua_isnil(L, 3) && !lua_isnoneornil(L, 4)) @@ -103,9 +103,9 @@ int w_SpriteBatch_set(lua_State *L) luax_catchexcept(L, [&]() { if (quad) - t->addq(quad, x, y, a, sx, sy, ox, oy, kx, ky, id); + t->addq(quad, x, y, a, sx, sy, ox, oy, kx, ky, index); else - t->add(x, y, a, sx, sy, ox, oy, kx, ky, id); + t->add(x, y, a, sx, sy, ox, oy, kx, ky, index); }); return 0; @@ -118,12 +118,6 @@ int w_SpriteBatch_clear(lua_State *L) return 0; } -int w_SpriteBatch_bind(lua_State* /*L*/) -{ - // No-op (deprecated.) - return 0; -} - int w_SpriteBatch_flush(lua_State *L) { SpriteBatch *t = luax_checkspritebatch(L, 1); @@ -146,9 +140,9 @@ int w_SpriteBatch_getTexture(lua_State *L) // FIXME: big hack right here. if (typeid(*tex) == typeid(Image)) - luax_pushtype(L, "Image", GRAPHICS_IMAGE_T, tex); + luax_pushtype(L, GRAPHICS_IMAGE_ID, tex); else if (typeid(*tex) == typeid(Canvas)) - luax_pushtype(L, "Canvas", GRAPHICS_CANVAS_T, tex); + luax_pushtype(L, GRAPHICS_CANVAS_ID, tex); else return luaL_error(L, "Unable to determine texture type."); @@ -217,7 +211,7 @@ int w_SpriteBatch_getCount(lua_State *L) int w_SpriteBatch_setBufferSize(lua_State *L) { SpriteBatch *t = luax_checkspritebatch(L, 1); - int size = luaL_checkint(L, 2); + int size = (int) luaL_checknumber(L, 2); luax_catchexcept(L, [&]() {t->setBufferSize(size); }); return 0; } @@ -242,21 +236,12 @@ static const luaL_Reg functions[] = { "getCount", w_SpriteBatch_getCount }, { "setBufferSize", w_SpriteBatch_setBufferSize }, { "getBufferSize", w_SpriteBatch_getBufferSize }, - - // Deprecated since 0.9.1. - { "setImage", w_SpriteBatch_setTexture }, - { "getImage", w_SpriteBatch_getTexture }, - - // Deprecated since 0.9.2. - { "bind", w_SpriteBatch_bind }, - { "unbind", w_SpriteBatch_flush }, - { 0, 0 } }; extern "C" int luaopen_spritebatch(lua_State *L) { - return luax_register_type(L, "SpriteBatch", functions); + return luax_register_type(L, GRAPHICS_SPRITE_BATCH_ID, functions); } } // opengl diff --git a/jni/love/src/modules/graphics/opengl/wrap_SpriteBatch.h b/jni/love/src/modules/graphics/opengl/wrap_SpriteBatch.h index b4095971..84c92699 100644 --- a/jni/love/src/modules/graphics/opengl/wrap_SpriteBatch.h +++ b/jni/love/src/modules/graphics/opengl/wrap_SpriteBatch.h @@ -33,11 +33,8 @@ namespace opengl SpriteBatch *luax_checkspritebatch(lua_State *L, int idx); int w_SpriteBatch_add(lua_State *L); -int w_SpriteBatch_addg(lua_State *L); int w_SpriteBatch_set(lua_State *L); -int w_SpriteBatch_setg(lua_State *L); int w_SpriteBatch_clear(lua_State *L); -int w_SpriteBatch_bind(lua_State *L); int w_SpriteBatch_flush(lua_State *L); int w_SpriteBatch_setTexture(lua_State *L); int w_SpriteBatch_getTexture(lua_State *L); diff --git a/jni/love/src/modules/graphics/opengl/wrap_Text.cpp b/jni/love/src/modules/graphics/opengl/wrap_Text.cpp new file mode 100644 index 00000000..1f53871d --- /dev/null +++ b/jni/love/src/modules/graphics/opengl/wrap_Text.cpp @@ -0,0 +1,189 @@ +/** + * Copyright (c) 2006-2015 LOVE Development Team + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. + **/ + +#include "wrap_Text.h" + +namespace love +{ +namespace graphics +{ +namespace opengl +{ + +Text *luax_checktext(lua_State *L, int idx) +{ + return luax_checktype(L, idx, GRAPHICS_TEXT_ID); +} + +int w_Text_set(lua_State *L) +{ + Text *t = luax_checktext(L, 1); + + if (lua_isnoneornil(L, 2)) + { + // No argument: clear all current text. + luax_catchexcept(L, [&](){ t->set(); }); + } + else if (lua_isnoneornil(L, 3)) + { + // Single argument: unformatted text. + std::string newtext = luax_checkstring(L, 2); + luax_catchexcept(L, [&](){ t->set(newtext); }); + } + else + { + // Multiple arguments: formatted text. + float wraplimit = (float) luaL_checknumber(L, 3); + + Font::AlignMode align; + const char *alignstr = luaL_checkstring(L, 4); + if (!Font::getConstant(alignstr, align)) + return luaL_error(L, "Invalid align mode: %s", alignstr); + + std::string newtext = luax_checkstring(L, 2); + + luax_catchexcept(L, [&](){ t->set(newtext, wraplimit, align); }); + } + + return 0; +} + +int w_Text_setf(lua_State *L) +{ + Text *t = luax_checktext(L, 1); + + float wraplimit = (float) luaL_checknumber(L, 3); + + Font::AlignMode align; + const char *alignstr = luaL_checkstring(L, 4); + if (!Font::getConstant(alignstr, align)) + return luaL_error(L, "Invalid align mode: %s", alignstr); + + std::string newtext = luax_checkstring(L, 2); + + luax_catchexcept(L, [&](){ t->set(newtext, wraplimit, align); }); + + return 0; +} + +int w_Text_add(lua_State *L) +{ + Text *t = luax_checktext(L, 1); + std::string text = luax_checkstring(L, 2); + + float x = (float) luaL_optnumber(L, 3, 0.0); + float y = (float) luaL_optnumber(L, 4, 0.0); + float a = (float) luaL_optnumber(L, 5, 0.0); + float sx = (float) luaL_optnumber(L, 6, 1.0); + float sy = (float) luaL_optnumber(L, 7, sx); + float ox = (float) luaL_optnumber(L, 8, 0.0); + float oy = (float) luaL_optnumber(L, 9, 0.0); + float kx = (float) luaL_optnumber(L, 10, 0.0); + float ky = (float) luaL_optnumber(L, 11, 0.0); + + luax_catchexcept(L, [&](){ t->add(text, x, y, a, sx, sy, ox, oy, kx, ky); }); + return 0; +} + +int w_Text_addf(lua_State *L) +{ + Text *t = luax_checktext(L, 1); + std::string text = luax_checkstring(L, 2); + float wrap = (float) luaL_checknumber(L, 3); + + Font::AlignMode align = Font::ALIGN_MAX_ENUM; + const char *alignstr = luaL_checkstring(L, 4); + + if (!Font::getConstant(alignstr, align)) + return luaL_error(L, "Invalid align mode: %s", alignstr); + + float x = (float) luaL_optnumber(L, 5, 0.0); + float y = (float) luaL_optnumber(L, 6, 0.0); + float a = (float) luaL_optnumber(L, 7, 0.0); + float sx = (float) luaL_optnumber(L, 8, 1.0); + float sy = (float) luaL_optnumber(L, 9, sx); + float ox = (float) luaL_optnumber(L, 10, 0.0); + float oy = (float) luaL_optnumber(L, 11, 0.0); + float kx = (float) luaL_optnumber(L, 12, 0.0); + float ky = (float) luaL_optnumber(L, 13, 0.0); + + luax_catchexcept(L, [&](){ t->addf(text, wrap, align, x, y, a, sx, sy, ox, oy, kx, ky); }); + return 0; +} + +int w_Text_clear(lua_State *L) +{ + Text *t = luax_checktext(L, 1); + luax_catchexcept(L, [&](){ t->clear(); }); + return 0; +} + +int w_Text_setFont(lua_State *L) +{ + Text *t = luax_checktext(L, 1); + Font *f = luax_checktype(L, 2, GRAPHICS_FONT_ID); + luax_catchexcept(L, [&](){ t->setFont(f); }); + return 0; +} + +int w_Text_getFont(lua_State *L) +{ + Text *t = luax_checktext(L, 1); + Font *f = t->getFont(); + luax_pushtype(L, GRAPHICS_FONT_ID, f); + return 1; +} + +int w_Text_getWidth(lua_State *L) +{ + Text *t = luax_checktext(L, 1); + lua_pushnumber(L, t->getWidth()); + return 1; +} + +int w_Text_getHeight(lua_State *L) +{ + Text *t = luax_checktext(L, 1); + lua_pushnumber(L, t->getHeight()); + return 1; +} + +static const luaL_Reg functions[] = +{ + { "set", w_Text_set }, + { "setf", w_Text_setf }, + { "add", w_Text_add }, + { "addf", w_Text_addf }, + { "clear", w_Text_clear }, + { "setFont", w_Text_setFont }, + { "getFont", w_Text_getFont }, + { "getWidth", w_Text_getWidth }, + { "getHeight", w_Text_getHeight }, + { 0, 0 } +}; + +extern "C" int luaopen_text(lua_State *L) +{ + return luax_register_type(L, GRAPHICS_TEXT_ID, functions); +} + +} // opengl +} // graphics +} // love diff --git a/jni/love/src/modules/mouse/Mouse.cpp b/jni/love/src/modules/graphics/opengl/wrap_Text.h similarity index 60% rename from jni/love/src/modules/mouse/Mouse.cpp rename to jni/love/src/modules/graphics/opengl/wrap_Text.h index 9f745354..fb867b85 100644 --- a/jni/love/src/modules/mouse/Mouse.cpp +++ b/jni/love/src/modules/graphics/opengl/wrap_Text.h @@ -18,35 +18,34 @@ * 3. This notice may not be removed or altered from any source distribution. **/ -#include "Mouse.h" +#ifndef LOVE_GRAPHICS_OPENGL_WRAP_TEXT_H +#define LOVE_GRAPHICS_OPENGL_WRAP_TEXT_H + +#include "Text.h" +#include "common/runtime.h" namespace love { -namespace mouse +namespace graphics +{ +namespace opengl { -bool Mouse::getConstant(const char *in, Button &out) -{ - return buttons.find(in, out); -} +Text *luax_checktext(lua_State *L, int idx); +int w_Text_set(lua_State *L); +int w_Text_setf(lua_State *L); +int w_Text_add(lua_State *L); +int w_Text_addf(lua_State *L); +int w_Text_clear(lua_State *L); +int w_Text_setFont(lua_State *L); +int w_Text_getFont(lua_State *L); +int w_Text_getWidth(lua_State *L); +int w_Text_getHeight(lua_State *L); +extern "C" int luaopen_text(lua_State *L); -bool Mouse::getConstant(Button in, const char *&out) -{ - return buttons.find(in, out); -} - -StringMap::Entry Mouse::buttonEntries[] = -{ - {"l", Mouse::BUTTON_LEFT}, - {"m", Mouse::BUTTON_MIDDLE}, - {"r", Mouse::BUTTON_RIGHT}, - {"wu", Mouse::BUTTON_WHEELUP}, - {"wd", Mouse::BUTTON_WHEELDOWN}, - {"x1", Mouse::BUTTON_X1}, - {"x2", Mouse::BUTTON_X2}, -}; - -StringMap Mouse::buttons(Mouse::buttonEntries, sizeof(Mouse::buttonEntries)); - -} // mouse +} // opengl +} // graphics } // love + +#endif // LOVE_GRAPHICS_OPENGL_WRAP_TEXT_H + diff --git a/jni/love/src/modules/graphics/opengl/wrap_Quad.cpp b/jni/love/src/modules/graphics/wrap_Quad.cpp similarity index 93% rename from jni/love/src/modules/graphics/opengl/wrap_Quad.cpp rename to jni/love/src/modules/graphics/wrap_Quad.cpp index 77a2dbeb..2ee276db 100644 --- a/jni/love/src/modules/graphics/opengl/wrap_Quad.cpp +++ b/jni/love/src/modules/graphics/wrap_Quad.cpp @@ -25,12 +25,10 @@ namespace love { namespace graphics { -namespace opengl -{ Quad *luax_checkquad(lua_State *L, int idx) { - return luax_checktype(L, idx, "Quad", GRAPHICS_QUAD_T); + return luax_checktype(L, idx, GRAPHICS_QUAD_ID); } int w_Quad_setViewport(lua_State *L) @@ -75,9 +73,8 @@ static const luaL_Reg functions[] = extern "C" int luaopen_quad(lua_State *L) { - return luax_register_type(L, "Quad", functions); + return luax_register_type(L, GRAPHICS_QUAD_ID, functions); } -} // opengl } // graphics } // love diff --git a/jni/love/src/modules/graphics/opengl/wrap_Quad.h b/jni/love/src/modules/graphics/wrap_Quad.h similarity index 86% rename from jni/love/src/modules/graphics/opengl/wrap_Quad.h rename to jni/love/src/modules/graphics/wrap_Quad.h index a766ecb8..5cc6f996 100644 --- a/jni/love/src/modules/graphics/opengl/wrap_Quad.h +++ b/jni/love/src/modules/graphics/wrap_Quad.h @@ -18,27 +18,24 @@ * 3. This notice may not be removed or altered from any source distribution. **/ -#ifndef LOVE_GRAPHICS_OPENGL_WRAP_QUAD_H -#define LOVE_GRAPHICS_OPENGL_WRAP_QUAD_H +#ifndef LOVE_GRAPHICS_WRAP_QUAD_H +#define LOVE_GRAPHICS_WRAP_QUAD_H // LOVE #include "common/runtime.h" -#include "graphics/Quad.h" +#include "Quad.h" namespace love { namespace graphics { -namespace opengl -{ Quad *luax_checkquad(lua_State *L, int idx); int w_Quad_setViewport(lua_State *L); int w_Quad_getViewport(lua_State *L); extern "C" int luaopen_quad(lua_State *L); -} // opengl } // graphics } // love -#endif // LOVE_GRAPHICS_OPENGL_WRAP_QUAD_H +#endif // LOVE_GRAPHICS_WRAP_QUAD_H diff --git a/jni/love/src/modules/graphics/opengl/wrap_Texture.cpp b/jni/love/src/modules/graphics/wrap_Texture.cpp similarity index 96% rename from jni/love/src/modules/graphics/opengl/wrap_Texture.cpp rename to jni/love/src/modules/graphics/wrap_Texture.cpp index a318a3b1..a6a0e954 100644 --- a/jni/love/src/modules/graphics/opengl/wrap_Texture.cpp +++ b/jni/love/src/modules/graphics/wrap_Texture.cpp @@ -24,12 +24,10 @@ namespace love { namespace graphics { -namespace opengl -{ Texture *luax_checktexture(lua_State *L, int idx) { - return luax_checktype(L, idx, "Texture", GRAPHICS_TEXTURE_T); + return luax_checktype(L, idx, GRAPHICS_TEXTURE_ID); } int w_Texture_getWidth(lua_State *L) @@ -127,7 +125,5 @@ int w_Texture_getWrap(lua_State *L) return 2; } - -} // opengl } // graphics } // love diff --git a/jni/love/src/modules/graphics/opengl/wrap_Texture.h b/jni/love/src/modules/graphics/wrap_Texture.h similarity index 89% rename from jni/love/src/modules/graphics/opengl/wrap_Texture.h rename to jni/love/src/modules/graphics/wrap_Texture.h index bb9c54a0..dd75da6a 100644 --- a/jni/love/src/modules/graphics/opengl/wrap_Texture.h +++ b/jni/love/src/modules/graphics/wrap_Texture.h @@ -18,8 +18,8 @@ * 3. This notice may not be removed or altered from any source distribution. **/ -#ifndef LOVE_GRAPHICS_OPENGL_WRAP_TEXTURE_H -#define LOVE_GRAPHICS_OPENGL_WRAP_TEXTURE_H +#ifndef LOVE_GRAPHICS_WRAP_TEXTURE_H +#define LOVE_GRAPHICS_WRAP_TEXTURE_H #include "Texture.h" #include "common/runtime.h" @@ -28,8 +28,6 @@ namespace love { namespace graphics { -namespace opengl -{ Texture *luax_checktexture(lua_State *L, int idx); int w_Texture_getWidth(lua_State *L); @@ -40,8 +38,7 @@ int w_Texture_getFilter(lua_State *L); int w_Texture_setWrap(lua_State *L); int w_Texture_getWrap(lua_State *L); -} // opengl } // graphics } // love -#endif // LOVE_GRAPHICS_OPENGL_WRAP_TEXTURE_H +#endif // LOVE_GRAPHICS_WRAP_TEXTURE_H diff --git a/jni/love/src/modules/image/CompressedData.cpp b/jni/love/src/modules/image/CompressedData.cpp deleted file mode 100644 index f90bb2c7..00000000 --- a/jni/love/src/modules/image/CompressedData.cpp +++ /dev/null @@ -1,127 +0,0 @@ -/** - * Copyright (c) 2006-2015 LOVE Development Team - * - * This software is provided 'as-is', without any express or implied - * warranty. In no event will the authors be held liable for any damages - * arising from the use of this software. - * - * Permission is granted to anyone to use this software for any purpose, - * including commercial applications, and to alter it and redistribute it - * freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; you must not - * claim that you wrote the original software. If you use this software - * in a product, an acknowledgment in the product documentation would be - * appreciated but is not required. - * 2. Altered source versions must be plainly marked as such, and must not be - * misrepresented as being the original software. - * 3. This notice may not be removed or altered from any source distribution. - **/ - -#include "CompressedData.h" - -namespace love -{ -namespace image -{ - -CompressedData::CompressedData() - : format(FORMAT_UNKNOWN) - , data(0) - , dataSize(0) -{ -} - -CompressedData::~CompressedData() -{ -} - -size_t CompressedData::getSize() const -{ - return dataSize; -} - -void *CompressedData::getData() const -{ - return data; -} - -int CompressedData::getMipmapCount() const -{ - return dataImages.size(); -} - -size_t CompressedData::getSize(int miplevel) const -{ - checkMipmapLevelExists(miplevel); - - return dataImages[miplevel].size; -} - -void *CompressedData::getData(int miplevel) const -{ - checkMipmapLevelExists(miplevel); - - return (void *) &dataImages[miplevel].data[0]; -} - -int CompressedData::getWidth(int miplevel) const -{ - checkMipmapLevelExists(miplevel); - - return dataImages[miplevel].width; -} - -int CompressedData::getHeight(int miplevel) const -{ - checkMipmapLevelExists(miplevel); - - return dataImages[miplevel].height; -} - -CompressedData::Format CompressedData::getFormat() const -{ - return format; -} - -void CompressedData::checkMipmapLevelExists(int miplevel) const -{ - if (miplevel < 0 || miplevel >= (int) dataImages.size()) - throw love::Exception("Mipmap level %d does not exist", miplevel + 1); -} - -bool CompressedData::getConstant(const char *in, CompressedData::Format &out) -{ - return formats.find(in, out); -} - -bool CompressedData::getConstant(CompressedData::Format in, const char *&out) -{ - return formats.find(in, out); -} - -StringMap::Entry CompressedData::formatEntries[] = -{ - {"unknown", CompressedData::FORMAT_UNKNOWN}, - {"dxt1", CompressedData::FORMAT_DXT1}, - {"dxt3", CompressedData::FORMAT_DXT3}, - {"dxt5", CompressedData::FORMAT_DXT5}, - {"bc4", CompressedData::FORMAT_BC4}, - {"bc4s", CompressedData::FORMAT_BC4s}, - {"bc5", CompressedData::FORMAT_BC5}, - {"bc5s", CompressedData::FORMAT_BC5s}, - {"bc6h", CompressedData::FORMAT_BC6H}, - {"bc6hs", CompressedData::FORMAT_BC6Hs}, - {"bc7", CompressedData::FORMAT_BC7}, - {"bc7srgb", CompressedData::FORMAT_BC7SRGB}, - {"etc1", CompressedData::FORMAT_ETC1}, - {"pvr1rgb2", CompressedData::FORMAT_PVR1_RGB2}, - {"pvr1rgb4", CompressedData::FORMAT_PVR1_RGB4}, - {"pvr1rgba2", CompressedData::FORMAT_PVR1_RGBA2}, - {"pvr1rgba4", CompressedData::FORMAT_PVR1_RGBA4}, -}; - -StringMap CompressedData::formats(CompressedData::formatEntries, sizeof(CompressedData::formatEntries)); - -} // image -} // love diff --git a/jni/love/src/modules/image/CompressedImageData.cpp b/jni/love/src/modules/image/CompressedImageData.cpp new file mode 100644 index 00000000..1ee4090c --- /dev/null +++ b/jni/love/src/modules/image/CompressedImageData.cpp @@ -0,0 +1,139 @@ +/** + * Copyright (c) 2006-2015 LOVE Development Team + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. + **/ + +#include "CompressedImageData.h" + +namespace love +{ +namespace image +{ + +CompressedImageData::CompressedImageData() + : format(FORMAT_UNKNOWN) + , sRGB(false) + , data(nullptr) + , dataSize(0) +{ +} + +CompressedImageData::~CompressedImageData() +{ +} + +size_t CompressedImageData::getSize() const +{ + return dataSize; +} + +void *CompressedImageData::getData() const +{ + return data; +} + +int CompressedImageData::getMipmapCount() const +{ + return (int) dataImages.size(); +} + +size_t CompressedImageData::getSize(int miplevel) const +{ + checkMipmapLevelExists(miplevel); + + return dataImages[miplevel].size; +} + +void *CompressedImageData::getData(int miplevel) const +{ + checkMipmapLevelExists(miplevel); + + return &dataImages[miplevel].data[0]; +} + +int CompressedImageData::getWidth(int miplevel) const +{ + checkMipmapLevelExists(miplevel); + + return dataImages[miplevel].width; +} + +int CompressedImageData::getHeight(int miplevel) const +{ + checkMipmapLevelExists(miplevel); + + return dataImages[miplevel].height; +} + +CompressedImageData::Format CompressedImageData::getFormat() const +{ + return format; +} + +bool CompressedImageData::isSRGB() const +{ + return sRGB; +} + +void CompressedImageData::checkMipmapLevelExists(int miplevel) const +{ + if (miplevel < 0 || miplevel >= (int) dataImages.size()) + throw love::Exception("Mipmap level %d does not exist", miplevel + 1); +} + +bool CompressedImageData::getConstant(const char *in, CompressedImageData::Format &out) +{ + return formats.find(in, out); +} + +bool CompressedImageData::getConstant(CompressedImageData::Format in, const char *&out) +{ + return formats.find(in, out); +} + +StringMap::Entry CompressedImageData::formatEntries[] = +{ + {"unknown", FORMAT_UNKNOWN}, + {"DXT1", FORMAT_DXT1}, + {"DXT3", FORMAT_DXT3}, + {"DXT5", FORMAT_DXT5}, + {"BC4", FORMAT_BC4}, + {"BC4s", FORMAT_BC4s}, + {"BC5", FORMAT_BC5}, + {"BC5s", FORMAT_BC5s}, + {"BC6h", FORMAT_BC6H}, + {"BC6hs", FORMAT_BC6Hs}, + {"BC7", FORMAT_BC7}, + {"ETC1", FORMAT_ETC1}, + {"ETC2rgb", FORMAT_ETC2_RGB}, + {"ETC2rgba", FORMAT_ETC2_RGBA}, + {"ETC2rgba1", FORMAT_ETC2_RGBA1}, + {"EACr", FORMAT_EAC_R}, + {"EACrs", FORMAT_EAC_Rs}, + {"EACrg", FORMAT_EAC_RG}, + {"EACrgs", FORMAT_EAC_RGs}, + {"PVR1rgb2", FORMAT_PVR1_RGB2}, + {"PVR1rgb4", FORMAT_PVR1_RGB4}, + {"PVR1rgba2", FORMAT_PVR1_RGBA2}, + {"PVR1rgba4", FORMAT_PVR1_RGBA4}, +}; + +StringMap CompressedImageData::formats(CompressedImageData::formatEntries, sizeof(CompressedImageData::formatEntries)); + +} // image +} // love diff --git a/jni/love/src/modules/image/CompressedData.h b/jni/love/src/modules/image/CompressedImageData.h similarity index 83% rename from jni/love/src/modules/image/CompressedData.h rename to jni/love/src/modules/image/CompressedImageData.h index 41196fac..8a7a1a7e 100644 --- a/jni/love/src/modules/image/CompressedData.h +++ b/jni/love/src/modules/image/CompressedImageData.h @@ -18,8 +18,8 @@ * 3. This notice may not be removed or altered from any source distribution. **/ -#ifndef LOVE_IMAGE_COMPRESSED_DATA_H -#define LOVE_IMAGE_COMPRESSED_DATA_H +#ifndef LOVE_IMAGE_COMPRESSED_IMAGE_DATA_H +#define LOVE_IMAGE_COMPRESSED_IMAGE_DATA_H // LOVE #include "common/Data.h" @@ -35,11 +35,11 @@ namespace image { /** - * CompressedData represents image data which is designed to be uploaded to the - * GPU and rendered in its compressed form, without being un-compressed. + * CompressedImageData represents image data which is designed to be uploaded to + * the GPU and rendered in its compressed form, without being decompressed. * http://renderingpipeline.com/2012/07/texture-compression/ **/ -class CompressedData : public Data +class CompressedImageData : public Data { public: @@ -57,8 +57,14 @@ public: FORMAT_BC6H, FORMAT_BC6Hs, FORMAT_BC7, - FORMAT_BC7SRGB, FORMAT_ETC1, + FORMAT_ETC2_RGB, + FORMAT_ETC2_RGBA, + FORMAT_ETC2_RGBA1, + FORMAT_EAC_R, + FORMAT_EAC_Rs, + FORMAT_EAC_RG, + FORMAT_EAC_RGs, FORMAT_PVR1_RGB2, FORMAT_PVR1_RGB4, FORMAT_PVR1_RGBA2, @@ -75,8 +81,8 @@ public: uint8 *data; // Should not have ownership of the data. }; - CompressedData(); - virtual ~CompressedData(); + CompressedImageData(); + virtual ~CompressedImageData(); // Implements Data. virtual void *getData() const; @@ -113,6 +119,8 @@ public: **/ Format getFormat() const; + bool isSRGB() const; + static bool getConstant(const char *in, Format &out); static bool getConstant(Format in, const char *&out); @@ -120,6 +128,8 @@ protected: Format format; + bool sRGB; + // Single block of memory containing all of the sub-images. uint8 *data; size_t dataSize; @@ -134,9 +144,9 @@ private: static StringMap::Entry formatEntries[]; static StringMap formats; -}; // CompressedData +}; // CompressedImageData } // image } // love -#endif // LOVE_IMAGE_COMPRESSED_DATA_H +#endif // LOVE_IMAGE_COMPRESSED_IMAGE_DATA_H diff --git a/jni/love/src/modules/image/Image.h b/jni/love/src/modules/image/Image.h index 3558f6d6..89d7d0ef 100644 --- a/jni/love/src/modules/image/Image.h +++ b/jni/love/src/modules/image/Image.h @@ -26,7 +26,7 @@ #include "common/Module.h" #include "filesystem/File.h" #include "ImageData.h" -#include "CompressedData.h" +#include "CompressedImageData.h" namespace love { @@ -76,11 +76,11 @@ public: virtual ImageData *newImageData(int width, int height, void *data, bool own = false) = 0; /** - * Creates new CompressedData from FileData. + * Creates new CompressedImageData from FileData. * @param data The FileData containing the compressed image data. - * @return The new CompressedData. + * @return The new CompressedImageData. **/ - virtual CompressedData *newCompressedData(love::filesystem::FileData *data) = 0; + virtual CompressedImageData *newCompressedData(love::filesystem::FileData *data) = 0; /** * Determines whether a FileData is Compressed image data or not. diff --git a/jni/love/src/modules/image/ImageData.cpp b/jni/love/src/modules/image/ImageData.cpp index 212432fa..2ccbd3a7 100644 --- a/jni/love/src/modules/image/ImageData.cpp +++ b/jni/love/src/modules/image/ImageData.cpp @@ -28,7 +28,7 @@ namespace image { ImageData::ImageData() - : data(0) + : data(nullptr) { mutex = thread::newMutex(); } @@ -71,16 +71,13 @@ void ImageData::setPixel(int x, int y, pixel c) Lock lock(mutex); pixel *pixels = (pixel *) getData(); - pixels[y*getWidth()+x] = c; + pixels[y*width+x] = c; } -void ImageData::setPixelUnsafe(int x, int y, love::image::pixel c) +void ImageData::setPixelUnsafe(int x, int y, pixel c) { - if (!inside(x, y)) - throw love::Exception("Attempt to set out-of-range pixel!"); - pixel *pixels = (pixel *) getData(); - pixels[y*getWidth()+x] = c; + pixels[y*width+x] = c; } pixel ImageData::getPixel(int x, int y) const @@ -88,8 +85,16 @@ pixel ImageData::getPixel(int x, int y) const if (!inside(x, y)) throw love::Exception("Attempt to get out-of-range pixel!"); + Lock lock(mutex); + const pixel *pixels = (const pixel *) getData(); - return pixels[y*getWidth()+x]; + return pixels[y*width+x]; +} + +pixel ImageData::getPixelUnsafe(int x, int y) const +{ + const pixel *pixels = (const pixel *) getData(); + return pixels[y*width+x]; } void ImageData::paste(ImageData *src, int dx, int dy, int sx, int sy, int sw, int sh) @@ -130,22 +135,18 @@ void ImageData::paste(ImageData *src, int dx, int dy, int sx, int sy, int sw, in dy -= sy; sy = 0; } + if (dx + sw > getWidth()) - { sw = getWidth() - dx; - } + if (dy + sh > getHeight()) - { sh = getHeight() - dy; - } + if (sx + sw > src->getWidth()) - { sw = src->getWidth() - sx; - } + if (sy + sh > src->getHeight()) - { sh = src->getHeight() - sy; - } // If the dimensions match up, copy the entire memory stream in one go if (sw == getWidth() && getWidth() == src->getWidth() @@ -166,25 +167,23 @@ love::thread::Mutex *ImageData::getMutex() const return mutex; } -bool ImageData::getConstant(const char *in, ImageData::Format &out) +bool ImageData::getConstant(const char *in, EncodedFormat &out) { - return formats.find(in, out); + return encodedFormats.find(in, out); } -bool ImageData::getConstant(ImageData::Format in, const char *&out) +bool ImageData::getConstant(EncodedFormat in, const char *&out) { - return formats.find(in, out); + return encodedFormats.find(in, out); } -StringMap::Entry ImageData::formatEntries[] = +StringMap::Entry ImageData::encodedFormatEntries[] = { - {"tga", ImageData::FORMAT_TGA}, - {"bmp", ImageData::FORMAT_BMP}, - {"jpg", ImageData::FORMAT_JPG}, - {"png", ImageData::FORMAT_PNG}, + {"tga", ENCODED_TGA}, + {"png", ENCODED_PNG}, }; -StringMap ImageData::formats(ImageData::formatEntries, sizeof(ImageData::formatEntries)); +StringMap ImageData::encodedFormats(ImageData::encodedFormatEntries, sizeof(ImageData::encodedFormatEntries)); } // image } // love diff --git a/jni/love/src/modules/image/ImageData.h b/jni/love/src/modules/image/ImageData.h index bbf63417..81e39266 100644 --- a/jni/love/src/modules/image/ImageData.h +++ b/jni/love/src/modules/image/ImageData.h @@ -47,25 +47,16 @@ class ImageData : public Data { public: - enum Format + enum EncodedFormat { - FORMAT_TGA, - FORMAT_BMP, - FORMAT_JPG, - FORMAT_PNG, - FORMAT_MAX_ENUM + ENCODED_TGA, + ENCODED_PNG, + ENCODED_MAX_ENUM }; ImageData(); - - /** - * Destructor. - **/ virtual ~ImageData(); - static bool getConstant(const char *in, Format &out); - static bool getConstant(Format in, const char *&out); - /** * Paste part of one ImageData onto another. The subregion defined by the top-left * corner (sx, sy) and the size (sw,sh) will be pasted to (dx,dy) in this ImageData. @@ -107,7 +98,7 @@ public: /** * Sets the pixel at location (x,y). - * Not thread-safe! + * Not thread-safe, and doesn't verify the coordinates! **/ void setPixelUnsafe(int x, int y, pixel p); @@ -119,12 +110,18 @@ public: **/ pixel getPixel(int x, int y) const; + /** + * Gets the pixel at location (x,y). + * Not thread-safe, and doesn't verify the coordinates! + **/ + pixel getPixelUnsafe(int x, int y) const; + /** * Encodes raw pixel data into a given format. * @param f The file to save the encoded image data to. * @param format The format of the encoded data. **/ - virtual void encode(love::filesystem::File *f, Format format) = 0; + virtual void encode(love::filesystem::File *f, EncodedFormat format) = 0; love::thread::Mutex *getMutex() const; @@ -132,6 +129,9 @@ public: virtual void *getData() const; virtual size_t getSize() const; + static bool getConstant(const char *in, EncodedFormat &out); + static bool getConstant(EncodedFormat in, const char *&out); + protected: // The width of the image data. @@ -150,8 +150,8 @@ protected: private: - static StringMap::Entry formatEntries[]; - static StringMap formats; + static StringMap::Entry encodedFormatEntries[]; + static StringMap encodedFormats; }; // ImageData diff --git a/jni/love/src/modules/image/magpie/CompressedFormatHandler.h b/jni/love/src/modules/image/magpie/CompressedFormatHandler.h index e04d3344..a721fe95 100644 --- a/jni/love/src/modules/image/magpie/CompressedFormatHandler.h +++ b/jni/love/src/modules/image/magpie/CompressedFormatHandler.h @@ -23,7 +23,7 @@ // LOVE #include "filesystem/FileData.h" -#include "image/CompressedData.h" +#include "image/CompressedImageData.h" #include "common/Object.h" namespace love @@ -34,7 +34,7 @@ namespace magpie { /** - * Base class for all CompressedData parser library interfaces. + * Base class for all CompressedImageData parser library interfaces. * We inherit from love::Object to take advantage of reference counting... **/ class CompressedFormatHandler : public love::Object @@ -45,7 +45,7 @@ public: virtual ~CompressedFormatHandler() {} /** - * Determines whether a particular FileData can be parsed as CompressedData + * Determines whether a particular FileData can be parsed as CompressedImageData * by this handler. * @param data The data to parse. **/ @@ -56,14 +56,16 @@ public: * a single block of memory containing all the images. * * @param[in] filedata The data to parse. - * @param[out] image The list of sub-images generated. Byte data is a pointer + * @param[out] images The list of sub-images generated. Byte data is a pointer * to the returned data. * @param[out] dataSize The total size in bytes of the returned data. * @param[out] format The format of the Compressed Data. + * @param[out] sRGB Whether the texture is sRGB-encoded. * * @return The single block of memory containing the parsed images. **/ - virtual uint8 *parse(filesystem::FileData *filedata, std::vector &images, size_t &dataSize, CompressedData::Format &format) = 0; + virtual uint8 *parse(filesystem::FileData *filedata, std::vector &images, + size_t &dataSize, CompressedImageData::Format &format, bool &sRGB) = 0; }; // CompressedFormatHandler diff --git a/jni/love/src/modules/image/magpie/CompressedData.cpp b/jni/love/src/modules/image/magpie/CompressedImageData.cpp similarity index 58% rename from jni/love/src/modules/image/magpie/CompressedData.cpp rename to jni/love/src/modules/image/magpie/CompressedImageData.cpp index 3620cdfd..b8888462 100644 --- a/jni/love/src/modules/image/magpie/CompressedData.cpp +++ b/jni/love/src/modules/image/magpie/CompressedImageData.cpp @@ -18,9 +18,7 @@ * 3. This notice may not be removed or altered from any source distribution. **/ -#include "CompressedData.h" - -#include "ddsHandler.h" +#include "CompressedImageData.h" namespace love { @@ -29,28 +27,11 @@ namespace image namespace magpie { -CompressedData::CompressedData(std::list formats, love::filesystem::FileData *filedata) - : formatHandlers(formats) -{ - for (CompressedFormatHandler *handler : formatHandlers) - handler->retain(); - - load(filedata); -} - -CompressedData::~CompressedData() -{ - delete[] data; - - for (CompressedFormatHandler *handler : formatHandlers) - handler->release(); -} - -void CompressedData::load(love::filesystem::FileData *filedata) +CompressedImageData::CompressedImageData(std::list formats, love::filesystem::FileData *filedata) { CompressedFormatHandler *parser = nullptr; - for (CompressedFormatHandler *handler : formatHandlers) + for (CompressedFormatHandler *handler : formats) { if (handler->canParse(filedata)) { @@ -62,36 +43,27 @@ void CompressedData::load(love::filesystem::FileData *filedata) if (parser == nullptr) throw love::Exception("Could not parse compressed data: Unknown format."); - // SubImage vector will be populated by a parser. - std::vector parsedimages; - Format texformat = FORMAT_UNKNOWN; + data = parser->parse(filedata, dataImages, dataSize, format, sRGB); - size_t newdata_size = 0; - uint8 *newdata = parser->parse(filedata, parsedimages, newdata_size, texformat); - - if (newdata == nullptr) + if (data == nullptr) throw love::Exception("Could not parse compressed data."); - if (texformat == FORMAT_UNKNOWN) + if (format == FORMAT_UNKNOWN) { - delete[] newdata; + delete[] data; throw love::Exception("Could not parse compressed data: Unknown format."); } - if (parsedimages.size() == 0 || newdata_size == 0) + if (dataImages.size() == 0 || dataSize == 0) { - delete[] newdata; + delete[] data; throw love::Exception("Could not parse compressed data: No valid data?"); } +} - // Make sure to clean up any previously loaded data. +CompressedImageData::~CompressedImageData() +{ delete[] data; - - data = newdata; - dataSize = newdata_size; - - dataImages = parsedimages; - format = texformat; } } // magpie diff --git a/jni/love/src/modules/image/magpie/CompressedData.h b/jni/love/src/modules/image/magpie/CompressedImageData.h similarity index 67% rename from jni/love/src/modules/image/magpie/CompressedData.h rename to jni/love/src/modules/image/magpie/CompressedImageData.h index 9d70b764..67a91c92 100644 --- a/jni/love/src/modules/image/magpie/CompressedData.h +++ b/jni/love/src/modules/image/magpie/CompressedImageData.h @@ -18,13 +18,13 @@ * 3. This notice may not be removed or altered from any source distribution. **/ -#ifndef LOVE_IMAGE_MAGPIE_COMPRESSED_DATA_H -#define LOVE_IMAGE_MAGPIE_COMPRESSED_DATA_H +#ifndef LOVE_IMAGE_MAGPIE_COMPRESSED_IMAGE_DATA_H +#define LOVE_IMAGE_MAGPIE_COMPRESSED_IMAGE_DATA_H // LOVE #include "CompressedFormatHandler.h" #include "filesystem/FileData.h" -#include "image/CompressedData.h" +#include "image/CompressedImageData.h" // C++ #include @@ -36,24 +36,17 @@ namespace image namespace magpie { -class CompressedData : public love::image::CompressedData +class CompressedImageData : public love::image::CompressedImageData { public: - CompressedData(std::list formats, love::filesystem::FileData *filedata); - virtual ~CompressedData(); + CompressedImageData(std::list formats, love::filesystem::FileData *filedata); + virtual ~CompressedImageData(); -private: - - void load(love::filesystem::FileData *filedata); - - // Compressed image format handlers we use for parsing. - std::list formatHandlers; - -}; // CompressedData +}; // CompressedImageData } // magpie } // image } // love -#endif // LOVE_IMAGE_MAGPIE_COMPRESSED_DATA_H +#endif // LOVE_IMAGE_MAGPIE_COMPRESSED_IMAGE_DATA_H diff --git a/jni/love/src/modules/image/magpie/DevilHandler.cpp b/jni/love/src/modules/image/magpie/DevilHandler.cpp deleted file mode 100644 index 6bb10816..00000000 --- a/jni/love/src/modules/image/magpie/DevilHandler.cpp +++ /dev/null @@ -1,232 +0,0 @@ -/** - * Copyright (c) 2006-2015 LOVE Development Team - * - * This software is provided 'as-is', without any express or implied - * warranty. In no event will the authors be held liable for any damages - * arising from the use of this software. - * - * Permission is granted to anyone to use this software for any purpose, - * including commercial applications, and to alter it and redistribute it - * freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; you must not - * claim that you wrote the original software. If you use this software - * in a product, an acknowledgment in the product documentation would be - * appreciated but is not required. - * 2. Altered source versions must be plainly marked as such, and must not be - * misrepresented as being the original software. - * 3. This notice may not be removed or altered from any source distribution. - **/ - -#include "DevilHandler.h" - -#ifndef LOVE_NO_DEVIL - -// LOVE -#include "common/Exception.h" -#include "common/math.h" - -// DevIL -#include - -namespace love -{ -namespace image -{ -namespace magpie -{ - -static inline void ilxClearErrors() -{ - while (ilGetError() != IL_NO_ERROR); -} - -DevilHandler::DevilHandler() - : mutex(nullptr) -{ - // There should only ever be one DevilHandler object (owned by the Image - // module), so we can use the global initialization function here. - ilInit(); - ilEnable(IL_ORIGIN_SET); - ilOriginFunc(IL_ORIGIN_UPPER_LEFT); -} - -DevilHandler::~DevilHandler() -{ - ilShutDown(); - - if (mutex) - delete mutex; -} - -bool DevilHandler::canDecode(love::filesystem::FileData * /*data*/) -{ - // DevIL can decode a lot of formats... - return true; -} - -bool DevilHandler::canEncode(ImageData::Format format) -{ - switch (format) - { - case ImageData::FORMAT_BMP: - case ImageData::FORMAT_TGA: - case ImageData::FORMAT_JPG: - case ImageData::FORMAT_PNG: - return true; - default: - return false; - } - - return false; -} - -DevilHandler::DecodedImage DevilHandler::decode(love::filesystem::FileData *data) -{ - if (!mutex) - mutex = love::thread::newMutex(); - - love::thread::Lock lock(mutex); - - ILuint image = ilGenImage(); - ilBindImage(image); - - DecodedImage img; - - try - { - bool success = ilLoadL(IL_TYPE_UNKNOWN, (void *)data->getData(), (ILuint) data->getSize()) == IL_TRUE; - - if (!success) - throw love::Exception("Could not decode image!"); - - img.width = ilGetInteger(IL_IMAGE_WIDTH); - img.height = ilGetInteger(IL_IMAGE_HEIGHT); - - // Make sure the image is in RGBA format. - ilConvertImage(IL_RGBA, IL_UNSIGNED_BYTE); - - // This should always be four. - int bpp = ilGetInteger(IL_IMAGE_BPP); - if (bpp != sizeof(pixel)) - throw love::Exception("Could not convert image!"); - - img.size = (size_t) ilGetInteger(IL_IMAGE_SIZE_OF_DATA); - - try - { - img.data = new ILubyte[img.size]; - } - catch (std::bad_alloc &) - { - throw love::Exception("Out of memory."); - } - - memcpy(img.data, ilGetData(), img.size); - } - catch (std::exception &e) - { - // catches love and std exceptions - ilDeleteImage(image); - throw love::Exception("%s", e.what()); - } - - ilDeleteImage(image); - - return img; -} - -DevilHandler::EncodedImage DevilHandler::encode(const DecodedImage &img, ImageData::Format format) -{ - if (!mutex) - mutex = love::thread::newMutex(); - - love::thread::Lock lock(mutex); - - ILuint tempimage = ilGenImage(); - ilBindImage(tempimage); - ilxClearErrors(); - - EncodedImage encodedimage; - - try - { - bool success = ilTexImage(img.width, img.height, 1, sizeof(pixel), IL_RGBA, IL_UNSIGNED_BYTE, img.data) == IL_TRUE; - - ILenum err = ilGetError(); - ilxClearErrors(); - - if (!success) - { - if (err != IL_NO_ERROR) - { - switch (err) - { - case IL_ILLEGAL_OPERATION: - throw love::Exception("Illegal operation"); - case IL_INVALID_PARAM: - throw love::Exception("Invalid parameters"); - case IL_OUT_OF_MEMORY: - throw love::Exception("Out of memory"); - default: - throw love::Exception("Unknown error (%d)", (int) err); - } - } - - throw love::Exception("Could not create image for the encoding!"); - } - - ilRegisterOrigin(IL_ORIGIN_UPPER_LEFT); - - ILuint ilFormat; - switch (format) - { - case ImageData::FORMAT_BMP: - ilFormat = IL_BMP; - break; - case ImageData::FORMAT_TGA: - ilFormat = IL_TGA; - break; - case ImageData::FORMAT_JPG: - ilFormat = IL_JPG; - break; - case ImageData::FORMAT_PNG: - default: // PNG is the default format - ilFormat = IL_PNG; - break; - } - - encodedimage.size = ilSaveL(ilFormat, NULL, 0); - if (!encodedimage.size) - throw love::Exception("Could not encode image!"); - - try - { - encodedimage.data = new ILubyte[encodedimage.size]; - } - catch(std::bad_alloc &) - { - throw love::Exception("Out of memory"); - } - - ilSaveL(ilFormat, encodedimage.data, encodedimage.size); - } - catch (std::exception &e) - { - // Catches love and std exceptions. - ilDeleteImage(tempimage); - delete[] encodedimage.data; - encodedimage.data = 0; - throw love::Exception("%s", e.what()); - } - - ilDeleteImage(tempimage); - - return encodedimage; -} - -} // magpie -} // image -} // love - -#endif // LOVE_NO_DEVIL diff --git a/jni/love/src/modules/image/magpie/FormatHandler.cpp b/jni/love/src/modules/image/magpie/FormatHandler.cpp index 55781fec..c34bf7da 100644 --- a/jni/love/src/modules/image/magpie/FormatHandler.cpp +++ b/jni/love/src/modules/image/magpie/FormatHandler.cpp @@ -42,7 +42,7 @@ bool FormatHandler::canDecode(love::filesystem::FileData* /*data*/) return false; } -bool FormatHandler::canEncode(ImageData::Format /*format*/) +bool FormatHandler::canEncode(ImageData::EncodedFormat /*format*/) { return false; } @@ -52,7 +52,7 @@ FormatHandler::DecodedImage FormatHandler::decode(love::filesystem::FileData* /* throw love::Exception("Image decoding is not implemented for this format backend."); } -FormatHandler::EncodedImage FormatHandler::encode(const DecodedImage& /*img*/, ImageData::Format /*format*/) +FormatHandler::EncodedImage FormatHandler::encode(const DecodedImage& /*img*/, ImageData::EncodedFormat /*format*/) { throw love::Exception("Image encoding is not implemented for this format backend."); } diff --git a/jni/love/src/modules/image/magpie/FormatHandler.h b/jni/love/src/modules/image/magpie/FormatHandler.h index 15cd0e8c..20e3f73f 100644 --- a/jni/love/src/modules/image/magpie/FormatHandler.h +++ b/jni/love/src/modules/image/magpie/FormatHandler.h @@ -44,18 +44,17 @@ public: // Raw RGBA pixel data. struct DecodedImage { - int width, height; - size_t size; - unsigned char *data; - DecodedImage() : width(0), height(0), size(0), data(0) {} + int width = 0; + int height = 0; + size_t size = 0; + unsigned char *data = nullptr; }; // Pixel data encoded in a particular format. struct EncodedImage { - size_t size; - unsigned char *data; - EncodedImage() : size(0), data(0) {} + size_t size = 0; + unsigned char *data = nullptr; }; /** @@ -76,7 +75,7 @@ public: /** * Whether this format handler can encode to a particular format. **/ - virtual bool canEncode(ImageData::Format format); + virtual bool canEncode(ImageData::EncodedFormat format); /** * Decodes an image from its encoded form into raw pixel data. @@ -91,7 +90,7 @@ public: * @param format The format to encode to. * @return The encoded image data. **/ - virtual EncodedImage encode(const DecodedImage &img, ImageData::Format format); + virtual EncodedImage encode(const DecodedImage &img, ImageData::EncodedFormat format); /** * Frees memory allocated by the format handler. diff --git a/jni/love/src/modules/image/magpie/Image.cpp b/jni/love/src/modules/image/magpie/Image.cpp index 166f8271..7caeb471 100644 --- a/jni/love/src/modules/image/magpie/Image.cpp +++ b/jni/love/src/modules/image/magpie/Image.cpp @@ -21,12 +21,10 @@ #include "Image.h" #include "ImageData.h" -#include "CompressedData.h" +#include "CompressedImageData.h" #include "PNGHandler.h" #include "STBHandler.h" -#include "JPEGHandler.h" -#include "DevilHandler.h" #include "ddsHandler.h" #include "PVRHandler.h" @@ -45,14 +43,6 @@ Image::Image() formatHandlers.push_back(new PNGHandler); formatHandlers.push_back(new STBHandler); -#ifdef LOVE_TURBO_JPEG - formatHandlers.push_back(new JPEGHandler); -#endif - -#ifndef LOVE_NO_DEVIL - formatHandlers.push_back(new DevilHandler); -#endif - compressedFormatHandlers.push_back(new DDSHandler); compressedFormatHandlers.push_back(new PVRHandler); compressedFormatHandlers.push_back(new KTXHandler); @@ -90,9 +80,9 @@ love::image::ImageData *Image::newImageData(int width, int height, void *data, b return new ImageData(formatHandlers, width, height, data, own); } -love::image::CompressedData *Image::newCompressedData(love::filesystem::FileData *data) +love::image::CompressedImageData *Image::newCompressedData(love::filesystem::FileData *data) { - return new CompressedData(compressedFormatHandlers, data); + return new CompressedImageData(compressedFormatHandlers, data); } bool Image::isCompressed(love::filesystem::FileData *data) diff --git a/jni/love/src/modules/image/magpie/Image.h b/jni/love/src/modules/image/magpie/Image.h index 4597e46b..b441794e 100644 --- a/jni/love/src/modules/image/magpie/Image.h +++ b/jni/love/src/modules/image/magpie/Image.h @@ -55,7 +55,7 @@ public: love::image::ImageData *newImageData(int width, int height); love::image::ImageData *newImageData(int width, int height, void *data, bool own = false); - love::image::CompressedData *newCompressedData(love::filesystem::FileData *data); + love::image::CompressedImageData *newCompressedData(love::filesystem::FileData *data); bool isCompressed(love::filesystem::FileData *data); @@ -64,7 +64,7 @@ private: // Image format handlers we can use for decoding and encoding ImageData. std::list formatHandlers; - // Compressed image format handers we can use for parsing CompressedData. + // Compressed image format handers we can use for parsing CompressedImageData. std::list compressedFormatHandlers; }; // Image diff --git a/jni/love/src/modules/image/magpie/ImageData.cpp b/jni/love/src/modules/image/magpie/ImageData.cpp index 4a3c0548..7920c78a 100644 --- a/jni/love/src/modules/image/magpie/ImageData.cpp +++ b/jni/love/src/modules/image/magpie/ImageData.cpp @@ -124,7 +124,10 @@ void ImageData::decode(love::filesystem::FileData *data) // The decoder *must* output a 32 bits-per-pixel image. if (decodedimage.size != decodedimage.width*decodedimage.height*sizeof(pixel)) { - delete[] decodedimage.data; + if (decodeHandler) + decodeHandler->free(decodedimage.data); + else + delete[] decodedimage.data; throw love::Exception("Could not convert image!"); } @@ -141,7 +144,7 @@ void ImageData::decode(love::filesystem::FileData *data) decodeHandler = decoder; } -void ImageData::encode(love::filesystem::File *f, ImageData::Format format) +void ImageData::encode(love::filesystem::File *f, ImageData::EncodedFormat format) { FormatHandler *encoder = nullptr; FormatHandler::EncodedImage encodedimage; @@ -176,7 +179,7 @@ void ImageData::encode(love::filesystem::File *f, ImageData::Format format) try { - f->open(love::filesystem::File::WRITE); + f->open(love::filesystem::File::MODE_WRITE); f->write(encodedimage.data, encodedimage.size); f->close(); } diff --git a/jni/love/src/modules/image/magpie/ImageData.h b/jni/love/src/modules/image/magpie/ImageData.h index c8dbc945..181b3a67 100644 --- a/jni/love/src/modules/image/magpie/ImageData.h +++ b/jni/love/src/modules/image/magpie/ImageData.h @@ -46,7 +46,7 @@ public: virtual ~ImageData(); // Implements image::ImageData. - virtual void encode(love::filesystem::File *f, ImageData::Format format); + virtual void encode(love::filesystem::File *f, ImageData::EncodedFormat format); private: diff --git a/jni/love/src/modules/image/magpie/JPEGHandler.cpp b/jni/love/src/modules/image/magpie/JPEGHandler.cpp deleted file mode 100644 index f4c4512f..00000000 --- a/jni/love/src/modules/image/magpie/JPEGHandler.cpp +++ /dev/null @@ -1,166 +0,0 @@ -/** - * Copyright (c) 2006-2015 LOVE Development Team - * - * This software is provided 'as-is', without any express or implied - * warranty. In no event will the authors be held liable for any damages - * arising from the use of this software. - * - * Permission is granted to anyone to use this software for any purpose, - * including commercial applications, and to alter it and redistribute it - * freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; you must not - * claim that you wrote the original software. If you use this software - * in a product, an acknowledgment in the product documentation would be - * appreciated but is not required. - * 2. Altered source versions must be plainly marked as such, and must not be - * misrepresented as being the original software. - * 3. This notice may not be removed or altered from any source distribution. - **/ - -// LOVE -#include "JPEGHandler.h" - -#ifdef LOVE_TURBO_JPEG - -#include "common/Exception.h" -#include "common/math.h" - -namespace love -{ -namespace image -{ -namespace magpie -{ - -JPEGHandler::JPEGHandler() -{ - mutex = love::thread::newMutex(); - - decompressor = tjInitDecompress(); - compressor = tjInitCompress(); -} - -JPEGHandler::~JPEGHandler() -{ - delete mutex; - - if (decompressor) - tjDestroy(decompressor); - - if (compressor) - tjDestroy(compressor); -} - -bool JPEGHandler::canDecode(love::filesystem::FileData *data) -{ - if (!decompressor) - return false; - - int w, h, subsamp; - int status = tjDecompressHeader2(decompressor, - (unsigned char *) data->getData(), - data->getSize(), - &w, &h, &subsamp); - - return (status == 0); -} - -bool JPEGHandler::canEncode(ImageData::Format format) -{ - if (!compressor) - return false; - - return format == ImageData::FORMAT_JPG; -} - -FormatHandler::DecodedImage JPEGHandler::decode(love::filesystem::FileData *data) -{ - if (!decompressor) - throw love::Exception("Could not decode jpeg image: %s", tjGetErrorStr()); - - DecodedImage img; - unsigned char *jpegdata = (unsigned char *) data->getData(); - - love::thread::Lock lock(mutex); - - int unused; - int status = tjDecompressHeader2(decompressor, - jpegdata, data->getSize(), - &img.width, &img.height, - &unused); - - if (status < 0) - throw love::Exception("Could not decode jpeg image: %s", tjGetErrorStr()); - - img.size = img.width * img.height * sizeof(pixel); - - try - { - img.data = new unsigned char[img.size]; - } - catch (std::bad_alloc &) - { - throw love::Exception("Out of memory."); - } - - status = tjDecompress2(decompressor, - jpegdata, data->getSize(), - img.data, 0, 0, 0, TJPF_RGBA, 0); - - if (status < 0) - { - delete[] img.data; - throw love::Exception("Could not decode jpeg image: %s", tjGetErrorStr()); - } - - return img; -} - -FormatHandler::EncodedImage JPEGHandler::encode(const DecodedImage &img, ImageData::Format format) -{ - if (!canEncode(format)) - throw love::Exception("JPEG encoder cannot encode specified format."); - - EncodedImage encodedimage; - - love::thread::Lock lock(mutex); - - unsigned long tjsize = tjBufSize(img.width, img.height, TJSAMP_444); - - try - { - // We want to allocate the memory ourselves instead of letting - // TurboJPEG do it, so we can safely use delete[] in ImageData.cpp. - encodedimage.data = new unsigned char[tjsize]; - } - catch (std::bad_alloc &) - { - throw love::Exception("Out of memory."); - } - - unsigned long jpegSize = tjsize; - - int status = tjCompress2(compressor, - img.data, - img.width, 0, img.height, - TJPF_RGBA, - &encodedimage.data, &jpegSize, - TJSAMP_444, COMPRESS_QUALITY, TJFLAG_NOREALLOC); - - if (status < 0) - { - delete[] encodedimage.data; - throw love::Exception("Could not encode jpeg image: %s", tjGetErrorStr()); - } - - encodedimage.size = jpegSize; - - return encodedimage; -} - -} // magpie -} // image -} // love - -#endif // LOVE_TURBO_JPEG diff --git a/jni/love/src/modules/image/magpie/KTXHandler.cpp b/jni/love/src/modules/image/magpie/KTXHandler.cpp index bd7397de..1530e7dd 100644 --- a/jni/love/src/modules/image/magpie/KTXHandler.cpp +++ b/jni/love/src/modules/image/magpie/KTXHandler.cpp @@ -67,7 +67,6 @@ enum KTXGLInternalFormat { KTX_GL_ETC1_RGB8_OES = 0x8D64, - // LOVE doesn't support EAC or ETC2 yet, but it won't be hard to add. KTX_GL_COMPRESSED_R11_EAC = 0x9270, KTX_GL_COMPRESSED_SIGNED_R11_EAC = 0x9271, KTX_GL_COMPRESSED_RG11_EAC = 0x9272, @@ -91,28 +90,53 @@ enum KTXGLInternalFormat KTX_GL_COMPRESSED_RGBA_S3TC_DXT5_EXT = 0x83F3 }; -CompressedData::Format convertFormat(uint32 glformat) +CompressedImageData::Format convertFormat(uint32 glformat, bool &sRGB) { + sRGB = false; + switch (glformat) { case KTX_GL_ETC1_RGB8_OES: - return CompressedData::FORMAT_ETC1; + return CompressedImageData::FORMAT_ETC1; + case KTX_GL_COMPRESSED_R11_EAC: + return CompressedImageData::FORMAT_EAC_R; + case KTX_GL_COMPRESSED_SIGNED_R11_EAC: + return CompressedImageData::FORMAT_EAC_Rs; + case KTX_GL_COMPRESSED_RG11_EAC: + return CompressedImageData::FORMAT_EAC_RG; + case KTX_GL_COMPRESSED_SIGNED_RG11_EAC: + return CompressedImageData::FORMAT_EAC_RGs; + case KTX_GL_COMPRESSED_RGB8_ETC2: + return CompressedImageData::FORMAT_ETC2_RGB; + case KTX_GL_COMPRESSED_SRGB8_ETC2: + sRGB = true; + return CompressedImageData::FORMAT_ETC2_RGB; + case KTX_GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2: + return CompressedImageData::FORMAT_ETC2_RGBA1; + case KTX_GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2: + sRGB = true; + return CompressedImageData::FORMAT_ETC2_RGBA1; + case KTX_GL_COMPRESSED_RGBA8_ETC2_EAC: + return CompressedImageData::FORMAT_ETC2_RGBA; + case KTX_GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC: + sRGB = true; + return CompressedImageData::FORMAT_ETC2_RGBA; case KTX_GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG: - return CompressedData::FORMAT_PVR1_RGB4; + return CompressedImageData::FORMAT_PVR1_RGB4; case KTX_GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG: - return CompressedData::FORMAT_PVR1_RGB2; + return CompressedImageData::FORMAT_PVR1_RGB2; case KTX_GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG: - return CompressedData::FORMAT_PVR1_RGBA4; + return CompressedImageData::FORMAT_PVR1_RGBA4; case KTX_GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG: - return CompressedData::FORMAT_PVR1_RGBA2; + return CompressedImageData::FORMAT_PVR1_RGBA2; case KTX_GL_COMPRESSED_RGB_S3TC_DXT1_EXT: - return CompressedData::FORMAT_DXT1; + return CompressedImageData::FORMAT_DXT1; case KTX_GL_COMPRESSED_RGBA_S3TC_DXT3_EXT: - return CompressedData::FORMAT_DXT3; + return CompressedImageData::FORMAT_DXT3; case KTX_GL_COMPRESSED_RGBA_S3TC_DXT5_EXT: - return CompressedData::FORMAT_DXT5; + return CompressedImageData::FORMAT_DXT5; default: - return CompressedData::FORMAT_UNKNOWN; + return CompressedImageData::FORMAT_UNKNOWN; } } @@ -135,7 +159,7 @@ bool KTXHandler::canParse(const filesystem::FileData *data) return true; } -uint8 *KTXHandler::parse(filesystem::FileData *filedata, std::vector &images, size_t &dataSize, CompressedData::Format &format) +uint8 *KTXHandler::parse(filesystem::FileData *filedata, std::vector &images, size_t &dataSize, CompressedImageData::Format &format, bool &sRGB) { if (!canParse(filedata)) throw love::Exception("Could not decode compressed data (not a KTX file?)"); @@ -151,9 +175,10 @@ uint8 *KTXHandler::parse(filesystem::FileData *filedata, std::vector 0) @@ -216,7 +241,7 @@ uint8 *KTXHandler::parse(filesystem::FileData *filedata, std::vector> i, 1u); mip.height = (int) std::max(header.pixelHeight >> i, 1u); mip.size = mipsize; @@ -232,6 +257,7 @@ uint8 *KTXHandler::parse(filesystem::FileData *filedata, std::vector &images, size_t &dataSize, CompressedData::Format &format); + virtual uint8 *parse(filesystem::FileData *filedata, std::vector &images, size_t &dataSize, CompressedImageData::Format &format, bool &sRGB); }; // KTXHandler diff --git a/jni/love/src/modules/image/magpie/PKMHandler.cpp b/jni/love/src/modules/image/magpie/PKMHandler.cpp index 0662c5da..f434cad6 100644 --- a/jni/love/src/modules/image/magpie/PKMHandler.cpp +++ b/jni/love/src/modules/image/magpie/PKMHandler.cpp @@ -68,14 +68,29 @@ enum PKMTextureFormat ETC2PACKAGE_RG_SIGNED_NO_MIPMAPS }; -CompressedData::Format convertFormat(uint16 texformat) +static CompressedImageData::Format convertFormat(uint16 texformat) { switch (texformat) { case ETC1_RGB_NO_MIPMAPS: - return CompressedData::FORMAT_ETC1; + return CompressedImageData::FORMAT_ETC1; + case ETC2PACKAGE_RGB_NO_MIPMAPS: + return CompressedImageData::FORMAT_ETC2_RGB; + case ETC2PACKAGE_RGBA_NO_MIPMAPS_OLD: + case ETC2PACKAGE_RGBA_NO_MIPMAPS: + return CompressedImageData::FORMAT_ETC2_RGBA; + case ETC2PACKAGE_RGBA1_NO_MIPMAPS: + return CompressedImageData::FORMAT_ETC2_RGBA1; + case ETC2PACKAGE_R_NO_MIPMAPS: + return CompressedImageData::FORMAT_EAC_R; + case ETC2PACKAGE_RG_NO_MIPMAPS: + return CompressedImageData::FORMAT_EAC_RG; + case ETC2PACKAGE_R_SIGNED_NO_MIPMAPS: + return CompressedImageData::FORMAT_EAC_Rs; + case ETC2PACKAGE_RG_SIGNED_NO_MIPMAPS: + return CompressedImageData::FORMAT_EAC_RGs; default: - return CompressedData::FORMAT_UNKNOWN; + return CompressedImageData::FORMAT_UNKNOWN; } } @@ -98,7 +113,7 @@ bool PKMHandler::canParse(const filesystem::FileData *data) return true; } -uint8 *PKMHandler::parse(filesystem::FileData *filedata, std::vector &images, size_t &dataSize, CompressedData::Format &format) +uint8 *PKMHandler::parse(filesystem::FileData *filedata, std::vector &images, size_t &dataSize, CompressedImageData::Format &format, bool &sRGB) { if (!canParse(filedata)) throw love::Exception("Could not decode compressed data (not a PKM file?)"); @@ -111,9 +126,9 @@ uint8 *PKMHandler::parse(filesystem::FileData *filedata, std::vectorgetData() + sizeof(PKMHeader), totalsize); - CompressedData::SubImage mip; + CompressedImageData::SubImage mip; // TODO: verify whether glCompressedTexImage works properly with the unpadded // width and height values (extended == padded.) @@ -146,6 +161,7 @@ uint8 *PKMHandler::parse(filesystem::FileData *filedata, std::vector &images, size_t &dataSize, CompressedData::Format &format); + virtual uint8 *parse(filesystem::FileData *filedata, std::vector &images, size_t &dataSize, CompressedImageData::Format &format, bool &sRGB); }; // PKMHandler diff --git a/jni/love/src/modules/image/magpie/PNGHandler.cpp b/jni/love/src/modules/image/magpie/PNGHandler.cpp index ae72c020..5dacd0f7 100644 --- a/jni/love/src/modules/image/magpie/PNGHandler.cpp +++ b/jni/love/src/modules/image/magpie/PNGHandler.cpp @@ -51,7 +51,7 @@ static unsigned zlibDecompress(unsigned char **out, size_t *outsize, const unsig uLongf outdatasize = insize; size_t sizemultiplier = 0; - unsigned char *outdata = nullptr; + unsigned char *outdata = out != nullptr ? *out : nullptr; while (true) { @@ -59,7 +59,13 @@ static unsigned zlibDecompress(unsigned char **out, size_t *outsize, const unsig outdatasize = insize << (++sizemultiplier); // LodePNG uses malloc, realloc, and free. - outdata = (unsigned char *) malloc(outdatasize); + // Since version 2014-08-23, LodePNG passes in an existing pointer in + // the 'out' argument that it expects to be realloc'd. Not doing so can + // result in a memory leak. + if (outdata != nullptr) + outdata = (unsigned char *) realloc(outdata, outdatasize); + else + outdata = (unsigned char *) malloc(outdatasize); if (!outdata) return 83; // "Memory allocation failed" error code for LodePNG. @@ -134,9 +140,9 @@ bool PNGHandler::canDecode(love::filesystem::FileData *data) return status == 0 && width > 0 && height > 0; } -bool PNGHandler::canEncode(ImageData::Format format) +bool PNGHandler::canEncode(ImageData::EncodedFormat format) { - return format == ImageData::FORMAT_PNG; + return format == ImageData::ENCODED_PNG; } PNGHandler::DecodedImage PNGHandler::decode(love::filesystem::FileData *fdata) @@ -163,16 +169,16 @@ PNGHandler::DecodedImage PNGHandler::decode(love::filesystem::FileData *fdata) throw love::Exception("Could not decode PNG image (%s)", err); } - img.width = (int) width; + img.width = (int) width; img.height = (int) height; - img.size = width * height * 4; + img.size = width * height * 4; return img; } -PNGHandler::EncodedImage PNGHandler::encode(const DecodedImage &img, ImageData::Format format) +PNGHandler::EncodedImage PNGHandler::encode(const DecodedImage &img, ImageData::EncodedFormat format) { - if (format != ImageData::FORMAT_PNG) + if (format != ImageData::ENCODED_PNG) throw love::Exception("PNG encoder cannot encode to non-PNG format."); EncodedImage encimg; diff --git a/jni/love/src/modules/image/magpie/PNGHandler.h b/jni/love/src/modules/image/magpie/PNGHandler.h index 0b6d1a77..f8af808f 100644 --- a/jni/love/src/modules/image/magpie/PNGHandler.h +++ b/jni/love/src/modules/image/magpie/PNGHandler.h @@ -41,10 +41,10 @@ public: // Implements FormatHandler. virtual bool canDecode(love::filesystem::FileData *data); - virtual bool canEncode(ImageData::Format format); + virtual bool canEncode(ImageData::EncodedFormat format); virtual DecodedImage decode(love::filesystem::FileData *data); - virtual EncodedImage encode(const DecodedImage &img, ImageData::Format format); + virtual EncodedImage encode(const DecodedImage &img, ImageData::EncodedFormat format); virtual void free(unsigned char *mem); diff --git a/jni/love/src/modules/image/magpie/PVRHandler.cpp b/jni/love/src/modules/image/magpie/PVRHandler.cpp index 3ccd7aa9..5fa36108 100644 --- a/jni/love/src/modules/image/magpie/PVRHandler.cpp +++ b/jni/love/src/modules/image/magpie/PVRHandler.cpp @@ -163,28 +163,28 @@ void ConvertPVRHeader(PVRTexHeaderV2 header2, PVRTexHeaderV3 *header3) } } -CompressedData::Format convertFormat(PVRV3PixelFormat format) +static CompressedImageData::Format convertFormat(PVRV3PixelFormat format) { switch (format) { case ePVRTPF_PVRTCI_2bpp_RGB: - return CompressedData::FORMAT_PVR1_RGB2; + return CompressedImageData::FORMAT_PVR1_RGB2; case ePVRTPF_PVRTCI_2bpp_RGBA: - return CompressedData::FORMAT_PVR1_RGBA2; + return CompressedImageData::FORMAT_PVR1_RGBA2; case ePVRTPF_PVRTCI_4bpp_RGB: - return CompressedData::FORMAT_PVR1_RGB4; + return CompressedImageData::FORMAT_PVR1_RGB4; case ePVRTPF_PVRTCI_4bpp_RGBA: - return CompressedData::FORMAT_PVR1_RGBA4; + return CompressedImageData::FORMAT_PVR1_RGBA4; case ePVRTPF_ETC1: - return CompressedData::FORMAT_ETC1; + return CompressedImageData::FORMAT_ETC1; case ePVRTPF_DXT1: - return CompressedData::FORMAT_DXT1; + return CompressedImageData::FORMAT_DXT1; case ePVRTPF_DXT3: - return CompressedData::FORMAT_DXT3; + return CompressedImageData::FORMAT_DXT3; case ePVRTPF_DXT5: - return CompressedData::FORMAT_DXT5; + return CompressedImageData::FORMAT_DXT5; default: - return CompressedData::FORMAT_UNKNOWN; + return CompressedImageData::FORMAT_UNKNOWN; } } @@ -294,7 +294,7 @@ bool PVRHandler::canParse(const filesystem::FileData *data) return false; } -uint8 *PVRHandler::parse(filesystem::FileData *filedata, std::vector &images, size_t &dataSize, CompressedData::Format &format) +uint8 *PVRHandler::parse(filesystem::FileData *filedata, std::vector &images, size_t &dataSize, CompressedImageData::Format &format, bool &sRGB) { if (!canParse(filedata)) throw love::Exception("Could not decode compressed data (not a PVR file?)"); @@ -324,9 +324,9 @@ uint8 *PVRHandler::parse(filesystem::FileData *filedata, std::vector 1) throw love::Exception("Image depths greater than 1 in PVR files are unsupported."); - CompressedData::Format cformat = convertFormat((PVRV3PixelFormat) header3.pixelFormat); + CompressedImageData::Format cformat = convertFormat((PVRV3PixelFormat) header3.pixelFormat); - if (cformat == CompressedData::FORMAT_UNKNOWN) + if (cformat == CompressedImageData::FORMAT_UNKNOWN) throw love::Exception("Could not parse PVR file: unsupported image format."); size_t totalsize = 0; @@ -361,7 +361,7 @@ uint8 *PVRHandler::parse(filesystem::FileData *filedata, std::vector totalsize) break; // Just in case. - CompressedData::SubImage mip; + CompressedImageData::SubImage mip; mip.width = std::max((int) header3.width >> i, 1); mip.height = std::max((int) header3.height >> i, 1); mip.size = mipsize; @@ -376,6 +376,7 @@ uint8 *PVRHandler::parse(filesystem::FileData *filedata, std::vector &images, size_t &dataSize, CompressedData::Format &format); + virtual uint8 *parse(filesystem::FileData *filedata, std::vector &images, size_t &dataSize, CompressedImageData::Format &format, bool &sRGB); }; // PVRHandler diff --git a/jni/love/src/modules/image/magpie/STBHandler.cpp b/jni/love/src/modules/image/magpie/STBHandler.cpp index 5c30d43b..44f8ad46 100644 --- a/jni/love/src/modules/image/magpie/STBHandler.cpp +++ b/jni/love/src/modules/image/magpie/STBHandler.cpp @@ -21,17 +21,20 @@ // LOVE #include "STBHandler.h" -static void loveSTBAssert(bool test, const char *teststr) +static void loveSTBIAssert(bool test, const char *teststr) { if (!test) throw love::Exception("Could not decode image (stb_image assertion '%s' failed)", teststr); } // stb_image -#define STBI_NO_HDR + #define STBI_ONLY_JPEG +// #define STBI_ONLY_PNG +#define STBI_ONLY_BMP +#define STBI_ONLY_TGA #define STBI_NO_STDIO #define STB_IMAGE_IMPLEMENTATION -#define STBI_ASSERT(A) loveSTBAssert((A), #A) +#define STBI_ASSERT(A) loveSTBIAssert((A), #A) #include "libraries/stb/stb_image.h" // C @@ -46,16 +49,19 @@ namespace magpie bool STBHandler::canDecode(love::filesystem::FileData *data) { - stbi__context s = {}; - stbi__start_mem(&s, (const stbi_uc *) data->getData(), (int) data->getSize()); + int w = 0; + int h = 0; + int comp = 0; - // These are internal stb_image functions, but we can still use them! - return stbi__bmp_test(&s) || stbi__tga_test(&s); + int status = stbi_info_from_memory((const stbi_uc *) data->getData(), + (int) data->getSize(), &w, &h, &comp); + + return status == 1 && w > 0 && h > 0; } -bool STBHandler::canEncode(ImageData::Format format) +bool STBHandler::canEncode(ImageData::EncodedFormat format) { - return format == ImageData::FORMAT_TGA; + return format == ImageData::ENCODED_TGA; } FormatHandler::DecodedImage STBHandler::decode(love::filesystem::FileData *data) @@ -65,18 +71,18 @@ FormatHandler::DecodedImage STBHandler::decode(love::filesystem::FileData *data) int comp = 0; img.data = stbi_load_from_memory((const stbi_uc *) data->getData(), (int) data->getSize(), - &img.width, &img.height, - &comp, 4); + &img.width, &img.height, + &comp, 4); if (img.data == nullptr || img.width <= 0 || img.height <= 0) - throw love::Exception("Could not decode TGA or BMP image."); + throw love::Exception("Could not decode image with stb_image."); img.size = img.width * img.height * 4; return img; } -FormatHandler::EncodedImage STBHandler::encode(const DecodedImage &img, ImageData::Format format) +FormatHandler::EncodedImage STBHandler::encode(const DecodedImage &img, ImageData::EncodedFormat format) { if (!canEncode(format)) throw love::Exception("Invalid format."); diff --git a/jni/love/src/modules/image/magpie/STBHandler.h b/jni/love/src/modules/image/magpie/STBHandler.h index 2636fd65..962d6b65 100644 --- a/jni/love/src/modules/image/magpie/STBHandler.h +++ b/jni/love/src/modules/image/magpie/STBHandler.h @@ -31,12 +31,11 @@ namespace magpie { /** - * Interface between ImageData and the stb_image library, for decoding TGA and - * BMP images. + * Interface between ImageData and the stb_image library, for decoding JPEG, + * TGA, and BMP images. * - * We could use stb_image to decode PNG and JPEG as well, but performance and - * comprehensive format support is lacking compared to some alternatives, plus - * stb_image_write doesn't have JPEG support. + * We could use stb_image to decode PNG as well, but performance and + * comprehensive format support is lacking compared to some alternatives. **/ class STBHandler : public FormatHandler { @@ -45,10 +44,10 @@ public: // Implements FormatHandler. virtual bool canDecode(love::filesystem::FileData *data); - virtual bool canEncode(ImageData::Format format); + virtual bool canEncode(ImageData::EncodedFormat format); virtual DecodedImage decode(love::filesystem::FileData *data); - virtual EncodedImage encode(const DecodedImage &img, ImageData::Format format); + virtual EncodedImage encode(const DecodedImage &img, ImageData::EncodedFormat format); virtual void free(unsigned char *mem); diff --git a/jni/love/src/modules/image/magpie/ddsHandler.cpp b/jni/love/src/modules/image/magpie/ddsHandler.cpp index 30d3b9a9..a8a28f6c 100644 --- a/jni/love/src/modules/image/magpie/ddsHandler.cpp +++ b/jni/love/src/modules/image/magpie/ddsHandler.cpp @@ -18,7 +18,6 @@ * 3. This notice may not be removed or altered from any source distribution. **/ -// LOVE #include "ddsHandler.h" namespace love @@ -33,12 +32,13 @@ bool DDSHandler::canParse(const filesystem::FileData *data) return dds::isCompressedDDS(data->getData(), data->getSize()); } -uint8 *DDSHandler::parse(filesystem::FileData *filedata, std::vector &images, size_t &dataSize, CompressedData::Format &format) +uint8 *DDSHandler::parse(filesystem::FileData *filedata, std::vector &images, size_t &dataSize, CompressedImageData::Format &format, bool &sRGB) { if (!dds::isDDS(filedata->getData(), filedata->getSize())) throw love::Exception("Could not decode compressed data (not a DDS file?)"); - CompressedData::Format texformat = CompressedData::FORMAT_UNKNOWN; + CompressedImageData::Format texformat = CompressedImageData::FORMAT_UNKNOWN; + bool isSRGB = false; uint8 *data = nullptr; dataSize = 0; @@ -49,9 +49,9 @@ uint8 *DDSHandler::parse(filesystem::FileData *filedata, std::vectorgetData(), filedata->getSize()); - texformat = convertFormat(parser.getFormat()); + texformat = convertFormat(parser.getFormat(), isSRGB); - if (texformat == CompressedData::FORMAT_UNKNOWN) + if (texformat == CompressedImageData::FORMAT_UNKNOWN) throw love::Exception("Could not parse compressed data: Unsupported format."); if (parser.getMipmapCount() == 0) @@ -68,13 +68,13 @@ uint8 *DDSHandler::parse(filesystem::FileData *filedata, std::vectorwidth; mip.height = img->height; @@ -97,37 +97,41 @@ uint8 *DDSHandler::parse(filesystem::FileData *filedata, std::vector &images, size_t &dataSize, CompressedData::Format &format); + virtual uint8 *parse(filesystem::FileData *filedata, std::vector &images, size_t &dataSize, CompressedImageData::Format &format, bool &sRGB); private: - static CompressedData::Format convertFormat(dds::Format ddsformat); + static CompressedImageData::Format convertFormat(dds::Format ddsformat, bool &sRGB); }; // DDSHandler diff --git a/jni/love/src/modules/image/wrap_CompressedData.cpp b/jni/love/src/modules/image/wrap_CompressedImageData.cpp similarity index 56% rename from jni/love/src/modules/image/wrap_CompressedData.cpp rename to jni/love/src/modules/image/wrap_CompressedImageData.cpp index 884d042a..5c2375ed 100644 --- a/jni/love/src/modules/image/wrap_CompressedData.cpp +++ b/jni/love/src/modules/image/wrap_CompressedImageData.cpp @@ -18,7 +18,7 @@ * 3. This notice may not be removed or altered from any source distribution. **/ -#include "wrap_CompressedData.h" +#include "wrap_CompressedImageData.h" #include "common/wrap_Data.h" namespace love @@ -26,15 +26,15 @@ namespace love namespace image { -CompressedData *luax_checkcompresseddata(lua_State *L, int idx) +CompressedImageData *luax_checkcompressedimagedata(lua_State *L, int idx) { - return luax_checktype(L, idx, "CompressedData", IMAGE_COMPRESSED_DATA_T); + return luax_checktype(L, idx, IMAGE_COMPRESSED_IMAGE_DATA_ID); } -int w_CompressedData_getWidth(lua_State *L) +int w_CompressedImageData_getWidth(lua_State *L) { - CompressedData *t = luax_checkcompresseddata(L, 1); - int miplevel = luaL_optinteger(L, 2, 1); + CompressedImageData *t = luax_checkcompressedimagedata(L, 1); + int miplevel = (int) luaL_optnumber(L, 2, 1); int width = 0; luax_catchexcept(L, [&](){ width = t->getWidth(miplevel - 1); }); @@ -43,10 +43,10 @@ int w_CompressedData_getWidth(lua_State *L) return 1; } -int w_CompressedData_getHeight(lua_State *L) +int w_CompressedImageData_getHeight(lua_State *L) { - CompressedData *t = luax_checkcompresseddata(L, 1); - int miplevel = luaL_optinteger(L, 2, 1); + CompressedImageData *t = luax_checkcompressedimagedata(L, 1); + int miplevel = (int) luaL_optnumber(L, 2, 1); int height = 0; luax_catchexcept(L, [&](){ height = t->getHeight(miplevel - 1); }); @@ -55,10 +55,10 @@ int w_CompressedData_getHeight(lua_State *L) return 1; } -int w_CompressedData_getDimensions(lua_State *L) +int w_CompressedImageData_getDimensions(lua_State *L) { - CompressedData *t = luax_checkcompresseddata(L, 1); - int miplevel = luaL_optinteger(L, 2, 1); + CompressedImageData *t = luax_checkcompressedimagedata(L, 1); + int miplevel = (int) luaL_optnumber(L, 2, 1); int width = 0, height = 0; luax_catchexcept(L, [&]() @@ -72,21 +72,21 @@ int w_CompressedData_getDimensions(lua_State *L) return 2; } -int w_CompressedData_getMipmapCount(lua_State *L) +int w_CompressedImageData_getMipmapCount(lua_State *L) { - CompressedData *t = luax_checkcompresseddata(L, 1); + CompressedImageData *t = luax_checkcompressedimagedata(L, 1); lua_pushinteger(L, t->getMipmapCount()); return 1; } -int w_CompressedData_getFormat(lua_State *L) +int w_CompressedImageData_getFormat(lua_State *L) { - CompressedData *t = luax_checkcompresseddata(L, 1); + CompressedImageData *t = luax_checkcompressedimagedata(L, 1); - image::CompressedData::Format format = t->getFormat(); + image::CompressedImageData::Format format = t->getFormat(); const char *str; - if (image::CompressedData::getConstant(format, str)) + if (image::CompressedImageData::getConstant(format, str)) lua_pushstring(L, str); else lua_pushstring(L, "unknown"); @@ -101,17 +101,17 @@ static const luaL_Reg functions[] = { "getPointer", w_Data_getPointer }, { "getSize", w_Data_getSize }, - { "getWidth", w_CompressedData_getWidth }, - { "getHeight", w_CompressedData_getHeight }, - { "getDimensions", w_CompressedData_getDimensions }, - { "getMipmapCount", w_CompressedData_getMipmapCount }, - { "getFormat", w_CompressedData_getFormat }, + { "getWidth", w_CompressedImageData_getWidth }, + { "getHeight", w_CompressedImageData_getHeight }, + { "getDimensions", w_CompressedImageData_getDimensions }, + { "getMipmapCount", w_CompressedImageData_getMipmapCount }, + { "getFormat", w_CompressedImageData_getFormat }, { 0, 0 }, }; -extern "C" int luaopen_compresseddata(lua_State *L) +extern "C" int luaopen_compressedimagedata(lua_State *L) { - return luax_register_type(L, "CompressedData", functions); + return luax_register_type(L, IMAGE_COMPRESSED_IMAGE_DATA_ID, functions); } } // image diff --git a/jni/love/src/modules/image/magpie/DevilHandler.h b/jni/love/src/modules/image/wrap_CompressedImageData.h similarity index 55% rename from jni/love/src/modules/image/magpie/DevilHandler.h rename to jni/love/src/modules/image/wrap_CompressedImageData.h index a5244597..c5675812 100644 --- a/jni/love/src/modules/image/magpie/DevilHandler.h +++ b/jni/love/src/modules/image/wrap_CompressedImageData.h @@ -18,53 +18,27 @@ * 3. This notice may not be removed or altered from any source distribution. **/ -#ifndef LOVE_IMAGE_MAGPIE_DEVIL_HANDLER_H -#define LOVE_IMAGE_MAGPIE_DEVIL_HANDLER_H +#ifndef LOVE_IMAGE_WRAP_COMRESSED_IMAGE_DATA_H +#define LOVE_IMAGE_WRAP_COMRESSED_IMAGE_DATA_H // LOVE -#include "common/config.h" - -#ifndef LOVE_NO_DEVIL - -#include "filesystem/FileData.h" -#include "FormatHandler.h" -#include "thread/threads.h" +#include "common/runtime.h" +#include "CompressedImageData.h" namespace love { namespace image { -namespace magpie -{ -/** - * Interface between ImageData and DevIL. - **/ -class DevilHandler : public FormatHandler -{ -public: +CompressedImageData *luax_checkcompressedimagedata(lua_State *L, int idx); +int w_CompressedImageData_getWidth(lua_State *L); +int w_CompressedImageData_getHeight(lua_State *L); +int w_CompressedImageData_getDimensions(lua_State *L); +int w_CompressedImageData_getMipmapCount(lua_State *L); +int w_CompressedImageData_getFormat(lua_State *L); +extern "C" int luaopen_compressedimagedata(lua_State *L); - // Implements FormatHandler. - - DevilHandler(); - virtual ~DevilHandler(); - - virtual bool canDecode(love::filesystem::FileData *data); - virtual bool canEncode(ImageData::Format format); - - virtual DecodedImage decode(love::filesystem::FileData *data); - virtual EncodedImage encode(const DecodedImage &img, ImageData::Format format); - -private: - - Mutex *mutex; - -}; // DevilHandler - -} // magpie } // image } // love -#endif // !LOVE_NO_DEVIL - -#endif // LOVE_IMAGE_MAGPIE_DEVIL_HANDLER_H +#endif // LOVE_IMAGE_WRAP_COMRESSED_IMAGE_DATA_H diff --git a/jni/love/src/modules/image/wrap_Image.cpp b/jni/love/src/modules/image/wrap_Image.cpp index 9af04127..15c0959b 100644 --- a/jni/love/src/modules/image/wrap_Image.cpp +++ b/jni/love/src/modules/image/wrap_Image.cpp @@ -39,15 +39,32 @@ int w_newImageData(lua_State *L) // Case 1: Integers. if (lua_isnumber(L, 1)) { - int w = luaL_checkint(L, 1); - int h = luaL_checkint(L, 2); + int w = (int) luaL_checknumber(L, 1); + int h = (int) luaL_checknumber(L, 2); if (w <= 0 || h <= 0) return luaL_error(L, "Invalid image size."); + size_t numbytes = 0; + const char *bytes = nullptr; + + if (!lua_isnoneornil(L, 3)) + bytes = luaL_checklstring(L, 3, &numbytes); + ImageData *t = nullptr; luax_catchexcept(L, [&](){ t = instance()->newImageData(w, h); }); - luax_pushtype(L, "ImageData", IMAGE_IMAGE_DATA_T, t); + if (bytes) + { + if (numbytes != t->getSize()) + { + t->release(); + return luaL_error(L, "The size of the raw byte string must match the ImageData's actual size in bytes."); + } + + memcpy(t->getData(), bytes, t->getSize()); + } + + luax_pushtype(L, IMAGE_IMAGE_DATA_ID, t); t->release(); return 1; } @@ -58,10 +75,10 @@ int w_newImageData(lua_State *L) ImageData *t = nullptr; luax_catchexcept(L, [&]() { t = instance()->newImageData(data); }, - [&]() { data->release(); } + [&](bool) { data->release(); } ); - luax_pushtype(L, "ImageData", IMAGE_IMAGE_DATA_T, t); + luax_pushtype(L, IMAGE_IMAGE_DATA_ID, t); t->release(); return 1; } @@ -70,13 +87,13 @@ int w_newCompressedData(lua_State *L) { love::filesystem::FileData *data = love::filesystem::luax_getfiledata(L, 1); - CompressedData *t = nullptr; + CompressedImageData *t = nullptr; luax_catchexcept(L, [&]() { t = instance()->newCompressedData(data); }, - [&]() { data->release(); } + [&](bool) { data->release(); } ); - luax_pushtype(L, "CompressedData", IMAGE_COMPRESSED_DATA_T, t); + luax_pushtype(L, IMAGE_COMPRESSED_IMAGE_DATA_ID, t); t->release(); return 1; } @@ -103,7 +120,7 @@ static const luaL_Reg functions[] = static const lua_CFunction types[] = { luaopen_imagedata, - luaopen_compresseddata, + luaopen_compressedimagedata, 0 }; @@ -120,7 +137,7 @@ extern "C" int luaopen_love_image(lua_State *L) WrappedModule w; w.module = instance; w.name = "image"; - w.flags = MODULE_IMAGE_T; + w.type = MODULE_IMAGE_ID; w.functions = functions; w.types = types; diff --git a/jni/love/src/modules/image/wrap_Image.h b/jni/love/src/modules/image/wrap_Image.h index 0b529ce5..5b910a99 100644 --- a/jni/love/src/modules/image/wrap_Image.h +++ b/jni/love/src/modules/image/wrap_Image.h @@ -24,7 +24,7 @@ // LOVE #include "Image.h" #include "wrap_ImageData.h" -#include "wrap_CompressedData.h" +#include "wrap_CompressedImageData.h" namespace love { diff --git a/jni/love/src/modules/image/wrap_ImageData.cpp b/jni/love/src/modules/image/wrap_ImageData.cpp index b4918fe4..970bf486 100644 --- a/jni/love/src/modules/image/wrap_ImageData.cpp +++ b/jni/love/src/modules/image/wrap_ImageData.cpp @@ -23,14 +23,24 @@ #include "common/wrap_Data.h" #include "filesystem/File.h" +// Shove the wrap_ImageData.lua code directly into a raw string literal. +static const char imagedata_lua[] = +#include "wrap_ImageData.lua" +; + namespace love { namespace image { +/** + * NOTE: Additional wrapper code is in wrap_ImageData.lua. Be sure to keep it + * in sync with any changes made to this file! + **/ + ImageData *luax_checkimagedata(lua_State *L, int idx) { - return luax_checktype(L, idx, "ImageData", IMAGE_IMAGE_DATA_T); + return luax_checktype(L, idx, IMAGE_IMAGE_DATA_ID); } int w_ImageData_getWidth(lua_State *L) @@ -58,8 +68,8 @@ int w_ImageData_getDimensions(lua_State *L) int w_ImageData_getPixel(lua_State *L) { ImageData *t = luax_checkimagedata(L, 1); - int x = luaL_checkint(L, 2); - int y = luaL_checkint(L, 3); + int x = (int) luaL_checknumber(L, 2); + int y = (int) luaL_checknumber(L, 3); pixel c; luax_catchexcept(L, [&](){ c = t->getPixel(x, y); }); @@ -74,8 +84,8 @@ int w_ImageData_getPixel(lua_State *L) int w_ImageData_setPixel(lua_State *L) { ImageData *t = luax_checkimagedata(L, 1); - int x = luaL_checkint(L, 2); - int y = luaL_checkint(L, 3); + int x = (int) luaL_checknumber(L, 2); + int y = (int) luaL_checknumber(L, 3); pixel c; if (lua_istable(L, 4)) @@ -130,8 +140,9 @@ static int luax_retnumbererror(lua_State *L, int level, int retnum, int ttype) where, retnum, ttypename); } -// ImageData:mapPixel. Not thread-safe! See the wrapper function below. -static int w_ImageData_mapPixelUnsafe(lua_State *L) +// ImageData:mapPixel. Not thread-safe! See wrap_ImageData.lua for the thread- +// safe wrapper function. +int w_ImageData__mapPixelUnsafe(lua_State *L) { ImageData *t = luax_checkimagedata(L, 1); luaL_checktype(L, 2, LUA_TFUNCTION); @@ -186,38 +197,6 @@ static int w_ImageData_mapPixelUnsafe(lua_State *L) t->setPixelUnsafe(x, y, c); } } - return 0; -} - -// Thread-safe wrapper for the above function. -int w_ImageData_mapPixel(lua_State *L) -{ - ImageData *t = luax_checkimagedata(L, 1); - luaL_checktype(L, 2, LUA_TFUNCTION); - int sx = luaL_optint(L, 3, 0); - int sy = luaL_optint(L, 4, 0); - int w = luaL_optint(L, 5, t->getWidth()); - int h = luaL_optint(L, 6, t->getHeight()); - - lua_pushcfunction(L, w_ImageData_mapPixelUnsafe); - lua_pushvalue(L, 1); - lua_pushvalue(L, 2); - lua_pushinteger(L, sx); - lua_pushinteger(L, sy); - lua_pushinteger(L, w); - lua_pushinteger(L, h); - - int ret = 0; - - // Lock this ImageData's mutex during the entire mapPixel. We pcall instead - // of call because lua_error longjmp's without calling object destructors. - { - love::thread::Lock lock(t->getMutex()); - ret = lua_pcall(L, 6, 0, 0); - } - - if (ret != 0) - return lua_error(L); return 0; } @@ -226,12 +205,12 @@ int w_ImageData_paste(lua_State *L) { ImageData *t = luax_checkimagedata(L, 1); ImageData *src = luax_checkimagedata(L, 2); - int dx = luaL_checkint(L, 3); - int dy = luaL_checkint(L, 4); - int sx = luaL_optint(L, 5, 0); - int sy = luaL_optint(L, 6, 0); - int sw = luaL_optint(L, 7, src->getWidth()); - int sh = luaL_optint(L, 8, src->getHeight()); + int dx = (int) luaL_checknumber(L, 3); + int dy = (int) luaL_checknumber(L, 4); + int sx = (int) luaL_optnumber(L, 5, 0); + int sy = (int) luaL_optnumber(L, 6, 0); + int sw = (int) luaL_optnumber(L, 7, src->getWidth()); + int sh = (int) luaL_optnumber(L, 8, src->getHeight()); t->paste((love::image::ImageData *)src, dx, dy, sx, sy, sw, sh); return 0; } @@ -240,12 +219,12 @@ int w_ImageData_encode(lua_State *L) { std::string ext; const char *fmt; - ImageData::Format format = ImageData::FORMAT_MAX_ENUM; + ImageData::EncodedFormat format = ImageData::ENCODED_MAX_ENUM; ImageData *t = luax_checkimagedata(L, 1); if (lua_isstring(L, 2)) luax_convobj(L, 2, "filesystem", "newFile"); - love::filesystem::File *file = luax_checktype(L, 2, "File", FILESYSTEM_FILE_T); + love::filesystem::File *file = luax_checktype(L, 2, FILESYSTEM_FILE_ID); if (lua_isnoneornil(L, 3)) { @@ -265,6 +244,50 @@ int w_ImageData_encode(lua_State *L) return 0; } +int w_ImageData__performAtomic(lua_State *L) +{ + ImageData *t = luax_checkimagedata(L, 1); + int err = 0; + + { + love::thread::Lock lock(t->getMutex()); + // call the function, passing any user-specified arguments. + err = lua_pcall(L, lua_gettop(L) - 2, LUA_MULTRET, 0); + } + + // Unfortunately, this eats the stack trace, too bad. + if (err != 0) + return lua_error(L); + + // The function and everything after it in the stack are eaten by the pcall, + // leaving only the ImageData object. Everything else is a return value. + return lua_gettop(L) - 1; +} + +// C functions in a struct, necessary for the FFI versions of ImageData methods. +struct FFI_ImageData +{ + void (*lockMutex)(Proxy *p); + void (*unlockMutex)(Proxy *p); +}; + +static FFI_ImageData ffifuncs = +{ + [](Proxy *p) -> void // lockMutex + { + // We don't do any type-checking for the Proxy here since these functions + // are always called from code which has already done type checking. + ImageData *i = (ImageData *) p->object; + i->getMutex()->lock(); + }, + + [](Proxy *p) -> void // unlockMutex + { + ImageData *i = (ImageData *) p->object; + i->getMutex()->unlock(); + } +}; + static const luaL_Reg functions[] = { // Data @@ -277,15 +300,36 @@ static const luaL_Reg functions[] = { "getDimensions", w_ImageData_getDimensions }, { "getPixel", w_ImageData_getPixel }, { "setPixel", w_ImageData_setPixel }, - { "mapPixel", w_ImageData_mapPixel }, { "paste", w_ImageData_paste }, { "encode", w_ImageData_encode }, + + // Used in the Lua wrapper code. + { "_mapPixelUnsafe", w_ImageData__mapPixelUnsafe }, + { "_performAtomic", w_ImageData__performAtomic }, + { 0, 0 } }; extern "C" int luaopen_imagedata(lua_State *L) { - return luax_register_type(L, "ImageData", functions); + // The last argument pushes the type's metatable onto the stack. + int ret = luax_register_type(L, IMAGE_IMAGE_DATA_ID, functions, true); + + // Load and execute ImageData.lua, sending the metatable and the ffi + // functions struct pointer as arguments. + if (ret > 0) + { + luaL_loadbuffer(L, imagedata_lua, sizeof(imagedata_lua), "ImageData.lua"); + lua_pushvalue(L, -2); + lua_pushlightuserdata(L, &ffifuncs); + lua_call(L, 2, 0); + + // Pop the metatable. + lua_pop(L, 1); + ret--; + } + + return ret; } } // image diff --git a/jni/love/src/modules/image/wrap_ImageData.lua b/jni/love/src/modules/image/wrap_ImageData.lua new file mode 100644 index 00000000..a017a31d --- /dev/null +++ b/jni/love/src/modules/image/wrap_ImageData.lua @@ -0,0 +1,189 @@ +R"luastring"--( +-- DO NOT REMOVE THE ABOVE LINE. It is used to load this file as a C++ string. +-- There is a matching delimiter at the bottom of the file. + +--[[ +Copyright (c) 2006-2015 LOVE Development Team + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not +claim that you wrote the original software. If you use this software +in a product, an acknowledgment in the product documentation would be +appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be +misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +--]] + +local ImageData_mt, ffifuncspointer = ... + +local tonumber, assert = tonumber, assert +local type, pcall = type, pcall + +local function inside(x, y, w, h) + return x >= 0 and x < w and y >= 0 and y < h +end + +-- Implement thread-safe ImageData:mapPixel regardless of whether the FFI is +-- used or not. +function ImageData_mt.__index:mapPixel(func, ix, iy, iw, ih) + local idw, idh = self:getDimensions() + + ix = ix or 0 + iy = iy or 0 + iw = iw or idw + ih = ih or idh + + assert(type(ix) == "number", "Invalid argument #2 to ImageData:mapPixel (expected number)") + assert(type(iy) == "number", "Invalid argument #3 to ImageData:mapPixel (expected number)") + assert(type(iw) == "number", "Invalid argument #4 to ImageData:mapPixel (expected number)") + assert(type(ih) == "number", "Invalid argument #5 to ImageData:mapPixel (expected number)") + + assert(type(func) == "function", "Invalid argument #1 to ImageData:mapPixel (expected function)") + assert(inside(ix, iy, idw, idh) and inside(ix+iw-1, iy+ih-1, idw, idh), "Invalid rectangle dimensions") + + -- performAtomic and mapPixelUnsafe have Lua-C API and FFI versions. + self:_performAtomic(self._mapPixelUnsafe, self, func, ix, iy, iw, ih) +end + + +-- Everything below this point is efficient FFI replacements for existing +-- ImageData functionality. + +if type(jit) ~= "table" or not jit.status() then + -- LuaJIT's FFI is *much* slower than LOVE's regular methods when the JIT + -- compiler is disabled. + return +end + +local status, ffi = pcall(require, "ffi") +if not status then return end + +pcall(ffi.cdef, [[ +typedef struct Proxy Proxy; + +typedef struct FFI_ImageData +{ + void (*lockMutex)(Proxy *p); + void (*unlockMutex)(Proxy *p); +} FFI_ImageData; + +typedef struct ImageData_Pixel +{ + uint8_t r, g, b, a; +} ImageData_Pixel; +]]) + +local ffifuncs = ffi.cast("FFI_ImageData *", ffifuncspointer) + +local pixelpointer = ffi.typeof("ImageData_Pixel *") + +local _getWidth = ImageData_mt.__index.getWidth +local _getHeight = ImageData_mt.__index.getHeight +local _getDimensions = ImageData_mt.__index.getDimensions + +-- Table which holds ImageData objects as keys, and information about the objects +-- as values. Uses weak keys so the ImageData objects can still be GC'd properly. +local objectcache = setmetatable({}, { + __mode = "k", + __index = function(self, imagedata) + local width, height = _getDimensions(imagedata) + local pointer = ffi.cast(pixelpointer, imagedata:getPointer()) + + local p = { + width = width, + height = height, + pointer = pointer, + } + + self[imagedata] = p + return p + end, +}) + + +-- Overwrite existing functions with new FFI versions. + +function ImageData_mt.__index:_performAtomic(...) + ffifuncs.lockMutex(self) + local success, err = pcall(...) + ffifuncs.unlockMutex(self) + + if not success then + error(err, 3) + end +end + +function ImageData_mt.__index:_mapPixelUnsafe(func, ix, iy, iw, ih) + local p = objectcache[self] + local idw, idh = p.width, p.height + + local pixels = p.pointer + + for y=iy, iy+ih-1 do + for x=ix, ix+iw-1 do + local p = pixels[y*idw+x] + local r, g, b, a = func(x, y, tonumber(p.r), tonumber(p.g), tonumber(p.b), tonumber(p.a)) + pixels[y*idw+x].r = r + pixels[y*idw+x].g = g + pixels[y*idw+x].b = b + pixels[y*idw+x].a = a == nil and 255 or a + end + end +end + +function ImageData_mt.__index:getPixel(x, y) + local p = objectcache[self] + assert(inside(x, y, p.width, p.height), "Attempt to get out-of-range pixel!") + + ffifuncs.lockMutex(self) + local pixel = p.pointer[y * p.width + x] + local r, g, b, a = tonumber(pixel.r), tonumber(pixel.g), tonumber(pixel.b), tonumber(pixel.a) + ffifuncs.unlockMutex(self) + + return r, g, b, a +end + +local temppixel = ffi.new("ImageData_Pixel") + +function ImageData_mt.__index:setPixel(x, y, r, g, b, a) + local p = objectcache[self] + assert(inside(x, y, p.width, p.height), "Attempt to set out-of-range pixel!") + + if type(r) == "table" then + local t = r + r, g, b, a = t[1], t[2], t[3], t[4] + end + + temppixel.r = r + temppixel.g = g + temppixel.b = b + temppixel.a = a == nil and 255 or a + + ffifuncs.lockMutex(self) + p.pointer[y * p.width + x] = temppixel + ffifuncs.unlockMutex(self) +end + +function ImageData_mt.__index:getWidth() + return objectcache[self].width +end + +function ImageData_mt.__index:getHeight() + return objectcache[self].height +end + +function ImageData_mt.__index:getDimensions() + local p = objectcache[self] + return p.width, p.height +end + +-- DO NOT REMOVE THE NEXT LINE. It is used to load this file as a C++ string. +--)luastring"--" diff --git a/jni/love/src/modules/joystick/sdl/Joystick.cpp b/jni/love/src/modules/joystick/sdl/Joystick.cpp index 2cef123b..f9fe3db1 100644 --- a/jni/love/src/modules/joystick/sdl/Joystick.cpp +++ b/jni/love/src/modules/joystick/sdl/Joystick.cpp @@ -122,17 +122,7 @@ bool Joystick::isConnected() const const char *Joystick::getName() const { - // Use the saved name if this Joystick isn't connected anymore. - if (!isConnected()) - return name.c_str(); - - // Prefer the Joystick name for consistency. - const char *joyname = SDL_JoystickName(joyhandle); - - if (!joyname && isGamepad()) - joyname = SDL_GameControllerName(controller); - - return joyname; + return name.c_str(); } int Joystick::getAxisCount() const @@ -342,7 +332,7 @@ bool Joystick::runVibrationEffect() if (vibration.id != -1 && SDL_HapticRunEffect(haptic, vibration.id, 1) == 0) return true; - + return false; } diff --git a/jni/love/src/modules/joystick/sdl/Joystick.h b/jni/love/src/modules/joystick/sdl/Joystick.h index e4521a8f..c4b2084f 100644 --- a/jni/love/src/modules/joystick/sdl/Joystick.h +++ b/jni/love/src/modules/joystick/sdl/Joystick.h @@ -129,7 +129,7 @@ private: static EnumMap::Entry gpButtonEntries[]; static EnumMap gpButtons; - + }; } // sdl diff --git a/jni/love/src/modules/joystick/sdl/JoystickModule.cpp b/jni/love/src/modules/joystick/sdl/JoystickModule.cpp index de8fbe35..96ff8d9c 100644 --- a/jni/love/src/modules/joystick/sdl/JoystickModule.cpp +++ b/jni/love/src/modules/joystick/sdl/JoystickModule.cpp @@ -42,7 +42,7 @@ namespace sdl JoystickModule::JoystickModule() { if (SDL_InitSubSystem(SDL_INIT_JOYSTICK | SDL_INIT_GAMECONTROLLER) < 0) - throw love::Exception("%s", SDL_GetError()); + throw love::Exception("Could not initialize SDL joystick subsystem (%s)", SDL_GetError()); // Initialize any joysticks which are already connected. for (int i = 0; i < SDL_NumJoysticks(); i++) @@ -84,7 +84,7 @@ love::joystick::Joystick *JoystickModule::getJoystick(int joyindex) int JoystickModule::getIndex(const love::joystick::Joystick *joystick) { - for (size_t i = 0; i < activeSticks.size(); i++) + for (int i = 0; i < (int) activeSticks.size(); i++) { if (activeSticks[i] == joystick) return i; @@ -132,7 +132,7 @@ love::joystick::Joystick *JoystickModule::addJoystick(int deviceindex) if (!joystick) { - joystick = new Joystick(joysticks.size()); + joystick = new Joystick((int) joysticks.size()); joysticks.push_back(joystick); } @@ -241,7 +241,7 @@ bool JoystickModule::setGamepadMapping(const std::string &guid, Joystick::Gamepa std::string insertstr = gpinputname + ":" + joyinputstr + ","; // We should replace any existing gamepad bind. - size_t findpos = mapstr.find(gpinputname + ":"); + size_t findpos = mapstr.find(std::string(", ") + gpinputname + ":"); if (findpos != std::string::npos) { // The bind string ends at the next comma, or the end of the string. diff --git a/jni/love/src/modules/joystick/wrap_Joystick.cpp b/jni/love/src/modules/joystick/wrap_Joystick.cpp index 40a67edc..d6e0c87f 100644 --- a/jni/love/src/modules/joystick/wrap_Joystick.cpp +++ b/jni/love/src/modules/joystick/wrap_Joystick.cpp @@ -31,7 +31,7 @@ namespace joystick Joystick *luax_checkjoystick(lua_State *L, int idx) { - return luax_checktype(L, idx, "Joystick", JOYSTICK_JOYSTICK_T); + return luax_checktype(L, idx, JOYSTICK_JOYSTICK_ID); } int w_Joystick_isConnected(lua_State *L) @@ -95,7 +95,7 @@ int w_Joystick_getHatCount(lua_State *L) int w_Joystick_getAxis(lua_State *L) { Joystick *j = luax_checkjoystick(L, 1); - int axisindex = luaL_checkint(L, 2) - 1; + int axisindex = (int) luaL_checknumber(L, 2) - 1; lua_pushnumber(L, j->getAxis(axisindex)); return 1; } @@ -114,7 +114,7 @@ int w_Joystick_getAxes(lua_State *L) int w_Joystick_getHat(lua_State *L) { Joystick *j = luax_checkjoystick(L, 1); - int hatindex = luaL_checkint(L, 2) - 1; + int hatindex = (int) luaL_checknumber(L, 2) - 1; Joystick::Hat h = j->getHat(hatindex); @@ -133,7 +133,7 @@ int w_Joystick_isDown(lua_State *L) std::vector buttons; for (int i = 2; i <= lua_gettop(L); i++) - buttons.push_back(luaL_checkint(L, i) - 1); + buttons.push_back((int) luaL_checknumber(L, i) - 1); luax_pushboolean(L, j->isDown(buttons)); return 1; @@ -255,7 +255,7 @@ static const luaL_Reg functions[] = extern "C" int luaopen_joystick(lua_State *L) { - return luax_register_type(L, "Joystick", functions); + return luax_register_type(L, JOYSTICK_JOYSTICK_ID, functions); } } // joystick diff --git a/jni/love/src/modules/joystick/wrap_JoystickModule.cpp b/jni/love/src/modules/joystick/wrap_JoystickModule.cpp index 8fd3ec9b..b895c36e 100644 --- a/jni/love/src/modules/joystick/wrap_JoystickModule.cpp +++ b/jni/love/src/modules/joystick/wrap_JoystickModule.cpp @@ -40,7 +40,7 @@ int w_getJoysticks(lua_State *L) for (int i = 0; i < stickcount; i++) { Joystick *stick = instance()->getJoystick(i); - luax_pushtype(L, "Joystick", JOYSTICK_JOYSTICK_T, stick); + luax_pushtype(L, JOYSTICK_JOYSTICK_ID, stick); lua_rawseti(L, -2, i + 1); } @@ -91,14 +91,14 @@ int w_setGamepadMapping(lua_State *L) switch (jinput.type) { case Joystick::INPUT_TYPE_AXIS: - jinput.axis = luaL_checkint(L, 4) - 1; + jinput.axis = (int) luaL_checknumber(L, 4) - 1; break; case Joystick::INPUT_TYPE_BUTTON: - jinput.button = luaL_checkint(L, 4) - 1; + jinput.button = (int) luaL_checknumber(L, 4) - 1; break; case Joystick::INPUT_TYPE_HAT: // Hats need both a hat index and a hat value. - jinput.hat.index = luaL_checkint(L, 4) - 1; + jinput.hat.index = (int) luaL_checknumber(L, 4) - 1; hatstr = luaL_checkstring(L, 5); if (!Joystick::getConstant(hatstr, jinput.hat.value)) return luaL_error(L, "Invalid joystick hat: %s", hatstr); @@ -254,7 +254,7 @@ extern "C" int luaopen_love_joystick(lua_State *L) WrappedModule w; w.module = instance; w.name = "joystick"; - w.flags = MODULE_T; + w.type = MODULE_ID; w.functions = functions; w.types = types; diff --git a/jni/love/src/modules/keyboard/Keyboard.cpp b/jni/love/src/modules/keyboard/Keyboard.cpp index 6b7b0c4c..804b46c1 100644 --- a/jni/love/src/modules/keyboard/Keyboard.cpp +++ b/jni/love/src/modules/keyboard/Keyboard.cpp @@ -55,10 +55,11 @@ StringMap::Entry Keyboard::keyEntries[] = {"escape", Keyboard::KEY_ESCAPE}, {"backspace", Keyboard::KEY_BACKSPACE}, {"tab", Keyboard::KEY_TAB}, - {" ", Keyboard::KEY_SPACE}, + {"space", Keyboard::KEY_SPACE}, {"!", Keyboard::KEY_EXCLAIM}, {"\"", Keyboard::KEY_QUOTEDBL}, {"#", Keyboard::KEY_HASH}, + {"%", Keyboard::KEY_PERCENT}, {"$", Keyboard::KEY_DOLLAR}, {"&", Keyboard::KEY_AMPERSAND}, {"'", Keyboard::KEY_QUOTE}, @@ -303,7 +304,7 @@ StringMap::Entry Keyboard::scan {"escape", SCANCODE_ESCAPE}, {"backspace", SCANCODE_BACKSPACE}, {"tab", SCANCODE_TAB}, - {" ", SCANCODE_SPACE}, + {"space", SCANCODE_SPACE}, {"-", SCANCODE_MINUS}, {"=", SCANCODE_EQUALS}, @@ -514,7 +515,7 @@ StringMap::Entry Keyboard::scan {"kbdillumup", SCANCODE_KBDILLUMUP}, {"eject", SCANCODE_EJECT}, {"sleep", SCANCODE_SLEEP}, - + {"app1", SCANCODE_APP1}, {"app2", SCANCODE_APP2}, }; diff --git a/jni/love/src/modules/keyboard/Keyboard.h b/jni/love/src/modules/keyboard/Keyboard.h index ef0a2ba8..82c90691 100644 --- a/jni/love/src/modules/keyboard/Keyboard.h +++ b/jni/love/src/modules/keyboard/Keyboard.h @@ -25,6 +25,9 @@ #include "common/Module.h" #include "common/StringMap.h" +// C++ +#include + namespace love { namespace keyboard @@ -501,7 +504,7 @@ public: SCANCODE_AC_STOP, SCANCODE_AC_REFRESH, SCANCODE_AC_BOOKMARKS, - + SCANCODE_BRIGHTNESSDOWN, SCANCODE_BRIGHTNESSUP, SCANCODE_DISPLAYSWITCH, @@ -510,7 +513,7 @@ public: SCANCODE_KBDILLUMUP, SCANCODE_EJECT, SCANCODE_SLEEP, - + SCANCODE_APP1, SCANCODE_APP2, @@ -535,11 +538,18 @@ public: virtual bool hasKeyRepeat() const = 0; /** - * Checks whether certain keys are down or not. - * @param keylist An array of key identifiers, terminated by KEY_MAX_ENUM. - * @return boolean + * Checks whether certain keys are pressed or not. + * @param keylist A list of key identifiers. + * @return Whether any of the specified keys are pressed. **/ - virtual bool isDown(Key *keylist) const = 0; + virtual bool isDown(const std::vector &keylist) const = 0; + + /** + * Checks whether certain scancodes are pressed or not. + * @param scancodelist A list of scancodes. + * @return Whether any of the specified scancodes are pressed. + **/ + virtual bool isScancodeDown(const std::vector &scancodelist) const = 0; /** * Gets the key corresponding to the specified scancode according to the @@ -554,16 +564,17 @@ public: virtual Scancode getScancodeFromKey(Key key) const = 0; /** - * Sets whether text input events should be sent - * @param enable Whether to send text input events. + * Sets whether text input events should be received. + * @param enable Whether to receive text input events. **/ virtual void setTextInput(bool enable) = 0; /** - * Sets whether text input events should be received, and sets the - * rectangle used for on-screen keyboards. + * Sets whether text input events should be received, and specifies where + * on the screen the text will appear. This is used as a hint so on-screen + * keyboards don't cover the text area. **/ - virtual void setTextInput(bool enable, int x, int y, int w, int h) = 0; + virtual void setTextInput(bool enable, double x, double y, double w, double h) = 0; /** * Gets whether text input events are enabled. @@ -571,7 +582,7 @@ public: virtual bool hasTextInput() const = 0; /** - * Gets whether the system can display an on-screen keyboard when text input + * Gets whether the system will display an on-screen keyboard when text input * events are enabled. **/ virtual bool hasScreenKeyboard() const = 0; diff --git a/jni/love/src/modules/keyboard/sdl/Keyboard.cpp b/jni/love/src/modules/keyboard/sdl/Keyboard.cpp index b0459c61..c4ad0509 100644 --- a/jni/love/src/modules/keyboard/sdl/Keyboard.cpp +++ b/jni/love/src/modules/keyboard/sdl/Keyboard.cpp @@ -19,6 +19,7 @@ **/ #include "Keyboard.h" +#include "window/Window.h" namespace love { @@ -47,14 +48,31 @@ bool Keyboard::hasKeyRepeat() const return key_repeat; } -bool Keyboard::isDown(Key *keylist) const +bool Keyboard::isDown(const std::vector &keylist) const { - const Uint8 *keystate = SDL_GetKeyboardState(nullptr); + const Uint8 *state = SDL_GetKeyboardState(nullptr); - for (Key key = *keylist; key != KEY_MAX_ENUM; key = *(++keylist)) + for (Key key : keylist) { SDL_Scancode scancode = SDL_GetScancodeFromKey(keymap[key]); - if (keystate[scancode]) + if (state[scancode]) + return true; + } + + return false; +} + +bool Keyboard::isScancodeDown(const std::vector &scancodelist) const +{ + const Uint8 *state = SDL_GetKeyboardState(nullptr); + + for (Scancode scancode : scancodelist) + { + SDL_Scancode sdlscancode = SDL_SCANCODE_UNKNOWN; + if (!scancodes.find(scancode, sdlscancode)) + continue; + + if (state[sdlscancode]) return true; } @@ -100,22 +118,41 @@ void Keyboard::setTextInput(bool enable) SDL_StopTextInput(); } -void Keyboard::setTextInput(bool enable, int x, int y, int w, int h) +void Keyboard::setTextInput(bool enable, double x, double y, double w, double h) { - SDL_Rect textrect = {x, y, w, h}; - SDL_SetTextInputRect(&textrect); + // SDL_SetTextInputRect expects coordinates in window-space but setTextInput + // takes pixels, so we should convert. + window::Window *window = Module::getInstance(M_WINDOW); + if (window) + { + window->pixelToWindowCoords(&x, &y); + window->pixelToWindowCoords(&w, &h); + } + + SDL_Rect rect = {(int) x, (int) y, (int) w, (int) h}; + SDL_SetTextInputRect(&rect); setTextInput(enable); } bool Keyboard::hasTextInput() const { - return SDL_IsTextInputActive(); + return SDL_IsTextInputActive() != SDL_FALSE; } bool Keyboard::hasScreenKeyboard() const { - return SDL_HasScreenKeyboardSupport(); + return SDL_HasScreenKeyboardSupport() != SDL_FALSE; +} + +bool Keyboard::getConstant(Scancode in, SDL_Scancode &out) +{ + return scancodes.find(in, out); +} + +bool Keyboard::getConstant(SDL_Scancode in, Scancode &out) +{ + return scancodes.find(in, out); } const SDL_Keycode *Keyboard::createKeyMap() @@ -133,6 +170,7 @@ const SDL_Keycode *Keyboard::createKeyMap() k[Keyboard::KEY_EXCLAIM] = SDLK_EXCLAIM; k[Keyboard::KEY_QUOTEDBL] = SDLK_QUOTEDBL; k[Keyboard::KEY_HASH] = SDLK_HASH; + k[Keyboard::KEY_PERCENT] = SDLK_PERCENT; k[Keyboard::KEY_DOLLAR] = SDLK_DOLLAR; k[Keyboard::KEY_AMPERSAND] = SDLK_AMPERSAND; k[Keyboard::KEY_QUOTE] = SDLK_QUOTE; @@ -590,7 +628,7 @@ EnumMap::Entry Keyboard::sc {SCANCODE_KBDILLUMUP, SDL_SCANCODE_KBDILLUMUP}, {SCANCODE_EJECT, SDL_SCANCODE_EJECT}, {SCANCODE_SLEEP, SDL_SCANCODE_SLEEP}, - + {SCANCODE_APP1, SDL_SCANCODE_APP1}, {SCANCODE_APP2, SDL_SCANCODE_APP2}, }; diff --git a/jni/love/src/modules/keyboard/sdl/Keyboard.h b/jni/love/src/modules/keyboard/sdl/Keyboard.h index 13aedf83..46d9d0fe 100644 --- a/jni/love/src/modules/keyboard/sdl/Keyboard.h +++ b/jni/love/src/modules/keyboard/sdl/Keyboard.h @@ -46,16 +46,20 @@ public: void setKeyRepeat(bool enable); bool hasKeyRepeat() const; - bool isDown(Key *keylist) const; + bool isDown(const std::vector &keylist) const; + bool isScancodeDown(const std::vector &scancodelist) const; Key getKeyFromScancode(Scancode scancode) const; Scancode getScancodeFromKey(Key key) const; void setTextInput(bool enable); - void setTextInput(bool enable, int x, int y, int w, int h); + void setTextInput(bool enable, double x, double y, double w, double h); bool hasTextInput() const; bool hasScreenKeyboard() const; + static bool getConstant(Scancode in, SDL_Scancode &out); + static bool getConstant(SDL_Scancode in, Scancode &out); + private: // Whether holding down a key triggers repeated key press events. diff --git a/jni/love/src/modules/keyboard/wrap_Keyboard.cpp b/jni/love/src/modules/keyboard/wrap_Keyboard.cpp index 59be6e11..2c3932f8 100644 --- a/jni/love/src/modules/keyboard/wrap_Keyboard.cpp +++ b/jni/love/src/modules/keyboard/wrap_Keyboard.cpp @@ -46,19 +46,34 @@ int w_hasKeyRepeat(lua_State *L) int w_isDown(lua_State *L) { Keyboard::Key k; - unsigned int num = lua_gettop(L); - Keyboard::Key *keylist = new Keyboard::Key[num+1]; - unsigned int counter = 0; + int num = lua_gettop(L); + std::vector keylist; + keylist.reserve(num); - for (unsigned int i = 0; i < num; i++) + for (int i = 0; i < num; i++) { if (Keyboard::getConstant(luaL_checkstring(L, i+1), k)) - keylist[counter++] = k; + keylist.push_back(k); } - keylist[counter] = Keyboard::KEY_MAX_ENUM; luax_pushboolean(L, instance()->isDown(keylist)); - delete[] keylist; + return 1; +} + +int w_isScancodeDown(lua_State *L) +{ + Keyboard::Scancode scancode; + int num = lua_gettop(L); + std::vector scancodelist; + scancodelist.reserve(num); + + for (int i = 0; i < num; i++) + { + if (Keyboard::getConstant(luaL_checkstring(L, i+1), scancode)) + scancodelist.push_back(scancode); + } + + luax_pushboolean(L, instance()->isScancodeDown(scancodelist)); return 1; } @@ -104,13 +119,13 @@ int w_setTextInput(lua_State *L) instance()->setTextInput(enable); else { - int x = (int) luaL_checkinteger(L, 2); - int y = (int) luaL_checkinteger(L, 3); - int w = (int) luaL_checkinteger(L, 4); - int h = (int) luaL_checkinteger(L, 5); + double x = luaL_checknumber(L, 2); + double y = luaL_checknumber(L, 3); + double w = luaL_checknumber(L, 4); + double h = luaL_checknumber(L, 5); instance()->setTextInput(enable, x, y, w, h); } - + return 0; } @@ -135,6 +150,7 @@ static const luaL_Reg functions[] = { "hasTextInput", w_hasTextInput }, { "hasScreenKeyboard", w_hasScreenKeyboard }, { "isDown", w_isDown }, + { "isScancodeDown", w_isScancodeDown }, { "getScancodeFromKey", w_getScancodeFromKey }, { "getKeyFromScancode", w_getKeyFromScancode }, { 0, 0 } @@ -153,7 +169,7 @@ extern "C" int luaopen_love_keyboard(lua_State *L) WrappedModule w; w.module = instance; w.name = "keyboard"; - w.flags = MODULE_T; + w.type = MODULE_ID; w.functions = functions; w.types = 0; diff --git a/jni/love/src/modules/keyboard/wrap_Keyboard.h b/jni/love/src/modules/keyboard/wrap_Keyboard.h index a808e0d0..30f47117 100644 --- a/jni/love/src/modules/keyboard/wrap_Keyboard.h +++ b/jni/love/src/modules/keyboard/wrap_Keyboard.h @@ -33,8 +33,9 @@ namespace keyboard int w_setKeyRepeat(lua_State *L); int w_hasKeyRepeat(lua_State *L); int w_isDown(lua_State *L); +int w_isScancodeDown(lua_State *L); int w_getKeyFromScancode(lua_State *L); -int w_getScancodeFromkey(lua_State *L); +int w_getScancodeFromKey(lua_State *L); int w_setTextInput(lua_State *L); int w_hasTextInput(lua_State *L); int w_hasScreenKeyboard(lua_State *L); diff --git a/jni/love/src/modules/love/love.cpp b/jni/love/src/modules/love/love.cpp index 1cb1075a..b06a2b48 100644 --- a/jni/love/src/modules/love/love.cpp +++ b/jni/love/src/modules/love/love.cpp @@ -25,6 +25,10 @@ #include "love.h" +// C++ +#include +#include + #ifdef LOVE_WINDOWS #include #endif // LOVE_WINDOWS @@ -52,6 +56,7 @@ #endif // Scripts +#include "scripts/nogame.lua.h" #include "scripts/boot.lua.h" // All modules define a c-accessible luaopen @@ -110,6 +115,7 @@ extern "C" #if defined(LOVE_ENABLE_WINDOW) extern int luaopen_love_window(lua_State*); #endif + extern int luaopen_love_nogame(lua_State*); extern int luaopen_love_boot(lua_State*); } @@ -165,6 +171,7 @@ static const luaL_Reg modules[] = { #if defined(LOVE_ENABLE_WINDOW) { "love.window", luaopen_love_window }, #endif + { "love.nogame", luaopen_love_nogame }, { "love.boot", luaopen_love_boot }, { 0, 0 } }; @@ -198,6 +205,39 @@ static int w_love_getVersion(lua_State *L) return 4; } +static int w_love_isVersionCompatible(lua_State *L) +{ + std::string version; + + if (lua_type(L, 1) == LUA_TSTRING) + version = luaL_checkstring(L, 1); + else + { + int major = (int) luaL_checknumber(L, 1); + int minor = (int) luaL_checknumber(L, 2); + int rev = (int) luaL_checknumber(L, 3); + + // Convert the numbers to a string, since VERSION_COMPATIBILITY is an + // array of version strings. + std::stringstream ss; + ss << major << "." << minor << "." << rev; + + version = ss.str(); + } + + for (int i = 0; love::VERSION_COMPATIBILITY[i] != nullptr; i++) + { + if (version.compare(love::VERSION_COMPATIBILITY[i]) != 0) + continue; + + lua_pushboolean(L, true); + return 1; + } + + lua_pushboolean(L, false); + return 1; +} + int luaopen_love(lua_State * L) { love::luax_insistglobal(L, "love"); @@ -228,7 +268,7 @@ int luaopen_love(lua_State * L) lua_newtable(L); - for (int i = 0; love::VERSION_COMPATIBILITY[i] != 0; ++i) + for (int i = 0; love::VERSION_COMPATIBILITY[i] != nullptr; i++) { lua_pushstring(L, love::VERSION_COMPATIBILITY[i]); lua_rawseti(L, -2, i+1); @@ -239,10 +279,15 @@ int luaopen_love(lua_State * L) lua_pushcfunction(L, w_love_getVersion); lua_setfield(L, -2, "getVersion"); + lua_pushcfunction(L, w_love_isVersionCompatible); + lua_setfield(L, -2, "isVersionCompatible"); + #ifdef LOVE_WINDOWS lua_pushstring(L, "Windows"); #elif defined(LOVE_MACOSX) lua_pushstring(L, "OS X"); +#elif defined(LOVE_IOS) + lua_pushstring(L, "iOS"); #elif defined(LOVE_ANDROID) lua_pushstring(L, "Android"); #elif defined(LOVE_LINUX) @@ -253,7 +298,7 @@ int luaopen_love(lua_State * L) lua_setfield(L, -2, "_os"); // Preload module loaders. - for (int i = 0; modules[i].name != 0; i++) + for (int i = 0; modules[i].name != nullptr; i++) love::luax_preload(L, modules[i].func, modules[i].name); #ifdef LOVE_ENABLE_LUASOCKET @@ -347,16 +392,22 @@ int w__openConsole(lua_State *L) #endif // LOVE_LEGENDARY_CONSOLE_IO_HACK #ifdef LOVE_LEGENDARY_ACCELEROMETER_AS_JOYSTICK_HACK - int w__setAccelerometerAsJoystick(lua_State *L) { - bool enable = lua_toboolean(L, 1); + bool enable = (bool) lua_toboolean(L, 1); SDL_SetHint(SDL_HINT_ACCELEROMETER_AS_JOYSTICK, enable ? "1" : "0"); return 0; } - #endif // LOVE_LEGENDARY_ACCELEROMETER_AS_JOYSTICK_HACK +int luaopen_love_nogame(lua_State *L) +{ + if (luaL_loadbuffer(L, (const char *)love::nogame_lua, sizeof(love::nogame_lua), "nogame.lua") == 0) + lua_call(L, 0, 1); + + return 1; +} + int luaopen_love_boot(lua_State *L) { if (luaL_loadbuffer(L, (const char *)love::boot_lua, sizeof(love::boot_lua), "boot.lua") == 0) diff --git a/jni/love/src/modules/love/love.h b/jni/love/src/modules/love/love.h index a3d5f389..93bf417a 100644 --- a/jni/love/src/modules/love/love.h +++ b/jni/love/src/modules/love/love.h @@ -35,6 +35,7 @@ extern "C" LOVE_EXPORT const char *love_version(); LOVE_EXPORT const char *love_codename(); LOVE_EXPORT int luaopen_love(lua_State *L); +LOVE_EXPORT int luaopen_love_nogame(lua_State *L); LOVE_EXPORT int luaopen_love_boot(lua_State *L); #ifdef __cplusplus diff --git a/jni/love/src/modules/math/BezierCurve.cpp b/jni/love/src/modules/math/BezierCurve.cpp index 3c1f7685..c8e700a4 100644 --- a/jni/love/src/modules/math/BezierCurve.cpp +++ b/jni/love/src/modules/math/BezierCurve.cpp @@ -23,6 +23,7 @@ #include "common/Exception.h" #include +#include using namespace std; @@ -104,35 +105,46 @@ BezierCurve BezierCurve::getDerivative() const const Vector &BezierCurve::getControlPoint(int i) const { - if (i < 0) + while (i < 0) i += controlPoints.size(); - if (i < 0 || (size_t) i >= controlPoints.size()) - throw Exception("Invalid control point index"); + while ((size_t) i >= controlPoints.size()) + i -= controlPoints.size(); return controlPoints[i]; } void BezierCurve::setControlPoint(int i, const Vector &point) { - if (i < 0) + while (i < 0) i += controlPoints.size(); - if (i < 0 || (size_t) i >= controlPoints.size()) - throw Exception("Invalid control point index"); + while ((size_t) i >= controlPoints.size()) + i -= controlPoints.size(); controlPoints[i] = point; } -void BezierCurve::insertControlPoint(const Vector &point, int pos) +void BezierCurve::insertControlPoint(const Vector &point, int i) { - if (pos < 0) - pos += controlPoints.size() + 1; + while (i < 0) + i += controlPoints.size(); - if (pos < 0 ||(size_t) pos > controlPoints.size()) - throw Exception("Invalid control point index"); + while ((size_t) i > controlPoints.size()) + i -= controlPoints.size(); - controlPoints.insert(controlPoints.begin() + pos, point); + controlPoints.insert(controlPoints.begin() + i, point); +} + +void BezierCurve::removeControlPoint(int i) +{ + while (i < 0) + i += controlPoints.size(); + + while ((size_t) i >= controlPoints.size()) + i -= controlPoints.size(); + + controlPoints.erase(controlPoints.begin() + i); } void BezierCurve::translate(const Vector &t) @@ -170,11 +182,49 @@ Vector BezierCurve::evaluate(double t) const for (size_t step = 1; step < controlPoints.size(); ++step) for (size_t i = 0; i < controlPoints.size() - step; ++i) points[i] = points[i] * (1-t) + points[i+1] * t; - + return points[0]; } -vector BezierCurve::render(size_t accuracy) const +BezierCurve* BezierCurve::getSegment(double t1, double t2) const +{ + if (t1 < 0 || t2 > 1) + throw Exception("Invalid segment parameters: must be between 0 and 1"); + if (t2 <= t1) + throw Exception("Invalid segment parameters: t1 must be smaller than t2"); + + // First, sudivide the curve at t2, then subdivide the "left" + // sub-curve at t1/t2. The "right" curve is the segment. + vector points(controlPoints); + vector left, right; + left.reserve(points.size()); + right.reserve(points.size()); + + // first subdivision at t2 (take only the left curve) + for (size_t step = 1; step < points.size(); ++step) + { + left.push_back(points[0]); + for (size_t i = 0; i < points.size() - step; ++i) + points[i] += (points[i+1] - points[i]) * t2; // p_i <- (1-t2)*p_i + t2*p_{i+1} + } + left.push_back(points[0]); + + // second subdivion at t1/t2 (take only the right curve) + double s = t1/t2; + for (size_t step = 1; step < left.size(); ++step) + { + right.push_back(left[left.size() - step]); + for (size_t i = 0; i < left.size() - step; ++i) + left[i] += (left[i+1] - left[i]) * s; + } + right.push_back(left[0]); + + // control points for right curve were added in reversed order + std::reverse(right.begin(), right.end()); + return new BezierCurve(right); +} + +vector BezierCurve::render(int accuracy) const { if (controlPoints.size() < 2) throw Exception("Invalid Bezier curve: Not enough control points."); @@ -183,6 +233,30 @@ vector BezierCurve::render(size_t accuracy) const return vertices; } +vector BezierCurve::renderSegment(double start, double end, size_t accuracy) const +{ + if (controlPoints.size() < 2) + throw Exception("Invalid Bezier curve: Not enough control points."); + vector vertices(controlPoints); + subdivide(vertices, accuracy); + if (start == end) + { + vertices.clear(); + } + else if (start < end) + { + size_t start_idx = size_t(start * vertices.size()); + size_t end_idx = size_t(end * vertices.size() + 0.5); + return std::vector(vertices.begin() + start_idx, vertices.begin() + end_idx); + } + else if (end > start) + { + size_t start_idx = size_t(end * vertices.size() + 0.5); + size_t end_idx = size_t(start * vertices.size()); + return std::vector(vertices.begin() + start_idx, vertices.begin() + end_idx); + } + return vertices; +} } // namespace math } // namespace love diff --git a/jni/love/src/modules/math/BezierCurve.h b/jni/love/src/modules/math/BezierCurve.h index 7c06bf6e..0b30d465 100644 --- a/jni/love/src/modules/math/BezierCurve.h +++ b/jni/love/src/modules/math/BezierCurve.h @@ -73,6 +73,12 @@ public: **/ void insertControlPoint(const Vector &point, int pos = -1); + /** + * Remove the i'th control point from the curve. + * @param i Control point to remove + **/ + void removeControlPoint(int i); + /** * @returns Number of control points. **/ @@ -107,12 +113,30 @@ public: **/ Vector evaluate(double t) const; + /** + * Get curve segment starting at t1 and ending at t2. + * The new curve will be parametrized from 0 <= t <= 1. + * @param t1 Start of the segment. + * @param t2 End of the segment. + * @returns Bezier curve covering the segment. + */ + BezierCurve* getSegment(double t1, double t2) const; + /** * Renders the curve by subdivision. * @param accuracy The 'fineness' of the curve. * @returns A polygon chain that approximates the bezier curve. **/ - std::vector render(size_t accuracy = 4) const; + std::vector render(int accuracy = 4) const; + + /** + * Renders a segment of the curve by subdivision. + * @param start The starting point (between 0 and 1) on the curve. + * @param end The ending point on the curve. + * @param accuracy The 'fineness' of the curve. + * @returns A polygon chain that approximates the segment along the curve + **/ + std::vector renderSegment(double start, double end, size_t accuracy = 4) const; private: std::vector controlPoints; diff --git a/jni/love/src/modules/math/CompressedData.cpp b/jni/love/src/modules/math/CompressedData.cpp new file mode 100644 index 00000000..6930021f --- /dev/null +++ b/jni/love/src/modules/math/CompressedData.cpp @@ -0,0 +1,78 @@ +/** + * Copyright (c) 2006-2015 LOVE Development Team + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. + **/ + +// LOVE +#include "CompressedData.h" + +namespace love +{ +namespace math +{ + +CompressedData::CompressedData(Compressor::Format format, char *cdata, size_t compressedsize, size_t rawsize, bool own) + : format(format) + , data(nullptr) + , dataSize(compressedsize) + , originalSize(rawsize) +{ + if (own) + data = cdata; + else + { + try + { + data = new char[dataSize]; + } + catch (std::bad_alloc &) + { + throw love::Exception("Out of memory."); + } + + memcpy(data, cdata, dataSize); + } +} + +CompressedData::~CompressedData() +{ + delete[] data; +} + +Compressor::Format CompressedData::getFormat() const +{ + return format; +} + +size_t CompressedData::getDecompressedSize() const +{ + return originalSize; +} + +void *CompressedData::getData() const +{ + return data; +} + +size_t CompressedData::getSize() const +{ + return dataSize; +} + +} // math +} // love diff --git a/jni/love/src/modules/graphics/opengl/Texture.h b/jni/love/src/modules/math/CompressedData.h similarity index 51% rename from jni/love/src/modules/graphics/opengl/Texture.h rename to jni/love/src/modules/math/CompressedData.h index eea72f57..a5d8de68 100644 --- a/jni/love/src/modules/graphics/opengl/Texture.h +++ b/jni/love/src/modules/math/CompressedData.h @@ -18,56 +18,58 @@ * 3. This notice may not be removed or altered from any source distribution. **/ -#ifndef LOVE_GRAPHICS_OPENGL_TEXTURE_H -#define LOVE_GRAPHICS_OPENGL_TEXTURE_H +#ifndef LOVE_MATH_COMPRESSED_DATA_H +#define LOVE_MATH_COMPRESSED_DATA_H // LOVE -#include "graphics/Texture.h" -#include "graphics/Volatile.h" -#include "OpenGL.h" +#include "common/Data.h" +#include "Compressor.h" namespace love { -namespace graphics -{ -namespace opengl +namespace math { -class Texture : public love::graphics::Texture, public Volatile +/** + * Stores byte data compressed via Math::compress. + **/ +class CompressedData : public love::Data { public: - virtual ~Texture() {} + /** + * Constructor just stores already-compressed data in the object. + **/ + CompressedData(Compressor::Format format, char *cdata, size_t compressedsize, size_t rawsize, bool own = true); + virtual ~CompressedData(); /** - * Gets the OpenGL id for this texture. + * Gets the format that was used to compress the data. **/ - virtual GLuint getGLTexture() const = 0; + Compressor::Format getFormat() const; /** - * Any setup the texture might need to do before drawing, e.g. binding - * the OpenGL texture for use. + * Gets the original (uncompressed) size of the compressed data. May return + * 0 if the uncompressed size is unknown. **/ - virtual void predraw() {} + size_t getDecompressedSize() const; - /** - * Any cleanup the texture might need to do directly after drawing. - **/ - virtual void postdraw() {} + // Implements Data. + void *getData() const override; + size_t getSize() const override; - /** - * Unextended OpenGL ES 2 doesn't support non-clamp wrap modes or mipmapping - * with non-power-of-two textures. - **/ - static bool hasLimitedNpot() - { - return GLAD_ES_VERSION_2_0 && !(GLAD_ES_VERSION_3_0 || GLAD_OES_texture_npot); - } +private: -}; // Texture + Compressor::Format format; -} // opengl -} // graphics + char *data; + size_t dataSize; + + size_t originalSize; + +}; // CompressedData + +} // math } // love -#endif // LOVE_GRAPHICS_OPENGL_TEXTURE_H +#endif // LOVE_MATH_COMPRESSED_DATA_H diff --git a/jni/love/src/modules/math/Compressor.cpp b/jni/love/src/modules/math/Compressor.cpp new file mode 100644 index 00000000..48827c94 --- /dev/null +++ b/jni/love/src/modules/math/Compressor.cpp @@ -0,0 +1,292 @@ +/** + * Copyright (c) 2006-2015 LOVE Development Team + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. + **/ + +// LOVE +#include "Compressor.h" +#include "common/config.h" +#include "common/int.h" + +// LZ4 +#include "libraries/lz4/lz4.h" +#include "libraries/lz4/lz4hc.h" + +// zlib +#include + +namespace love +{ +namespace math +{ + +class LZ4Compressor : public Compressor +{ +public: + + char *compress(const char *data, size_t dataSize, int level, size_t &compressedSize) override + { + if (dataSize > LZ4_MAX_INPUT_SIZE) + throw love::Exception("Data is too large for LZ4 compressor."); + + // We use a custom header to store some info with the compressed data. + const size_t headersize = sizeof(uint32); + + int maxdestsize = LZ4_compressBound((int) dataSize); + size_t maxsize = headersize + (size_t) maxdestsize; + char *compressedbytes = nullptr; + + try + { + compressedbytes = new char[maxsize]; + } + catch (std::bad_alloc &) + { + throw love::Exception("Out of memory."); + } + + // Store the size of the uncompressed data as a header. +#ifdef LOVE_BIG_ENDIAN + // Make sure it's little-endian for storage. + *(uint32 *) compressedbytes = swap32((uint32) dataSize); +#else + *(uint32 *) compressedbytes = (uint32) dataSize; +#endif + + // Use LZ4-HC for compression level 9 and higher. + int csize = 0; + if (level > 8) + csize = LZ4_compress_HC(data, compressedbytes + headersize, (int) dataSize, maxdestsize, 0); + else + csize = LZ4_compress_default(data, compressedbytes + headersize, (int) dataSize, maxdestsize); + + if (csize <= 0) + { + delete[] compressedbytes; + throw love::Exception("Could not LZ4-compress data."); + } + + // We allocated space for the maximum possible amount of data, but the + // actual compressed size might be much smaller, so we should shrink the + // data buffer if so. + if ((double) maxsize / (double) (csize + headersize) >= 1.2) + { + char *cbytes = new (std::nothrow) char[csize + headersize]; + if (cbytes) + { + memcpy(cbytes, compressedbytes, csize + headersize); + delete[] compressedbytes; + compressedbytes = cbytes; + } + } + + compressedSize = (size_t) csize + headersize; + return compressedbytes; + } + + char *decompress(const char *data, size_t dataSize, size_t &decompressedSize) override + { + const size_t headersize = sizeof(uint32); + char *rawbytes = nullptr; + + if (dataSize < headersize) + throw love::Exception("Invalid LZ4-compressed data size."); + + // Extract the original uncompressed size (stored in our custom header.) +#ifdef LOVE_BIG_ENDIAN + // Convert from stored little-endian to big-endian. + uint32 rawsize = swap32(*(uint32 *) data); +#else + uint32 rawsize = *(uint32 *) data; +#endif + + try + { + rawbytes = new char[rawsize]; + } + catch (std::bad_alloc &) + { + throw love::Exception("Out of memory."); + } + + // If the uncompressed size is passed in as an argument (non-zero) and + // it matches the header's stored size, then we assume it's 100% accurate + // and we use a more efficient decompression function. + if (decompressedSize > 0 && decompressedSize == (size_t) rawsize) + { + // We don't use the header here, but we need to account for its size. + if (LZ4_decompress_fast(data + headersize, rawbytes, (int) decompressedSize) < 0) + { + delete[] rawbytes; + throw love::Exception("Could not decompress LZ4-compressed data."); + } + } + else + { + // Account for our custom header's size in the decompress arguments. + int result = LZ4_decompress_safe(data + headersize, rawbytes, + dataSize - headersize, rawsize); + + if (result < 0) + { + delete[] rawbytes; + throw love::Exception("Could not decompress LZ4-compressed data."); + } + + decompressedSize = (size_t) result; + } + + return rawbytes; + } + + Compressor::Format getFormat() const override { return FORMAT_LZ4; } + +}; // LZ4Compressor + + +class zlibCompressor : public Compressor +{ +public: + + char *compress(const char *data, size_t dataSize, int level, size_t &compressedSize) override + { + if (level < 0) + level = Z_DEFAULT_COMPRESSION; + else if (level > 9) + level = 9; + + uLong maxsize = compressBound((uLong) dataSize); + char *compressedbytes = nullptr; + + try + { + compressedbytes = new char[maxsize]; + } + catch (std::bad_alloc &) + { + throw love::Exception("Out of memory."); + } + + uLongf destlen = maxsize; + int status = compress2((Bytef *) compressedbytes, &destlen, (const Bytef *) data, (uLong) dataSize, level); + + if (status != Z_OK) + { + delete[] compressedbytes; + throw love::Exception("Could not zlib-compress data."); + } + + // We allocated space for the maximum possible amount of data, but the + // actual compressed size might be much smaller, so we should shrink the + // data buffer if so. + if ((double) maxsize / (double) destlen >= 1.2) + { + char *cbytes = new (std::nothrow) char[destlen]; + if (cbytes) + { + memcpy(cbytes, compressedbytes, destlen); + delete[] compressedbytes; + compressedbytes = cbytes; + } + } + + compressedSize = (size_t) destlen; + return compressedbytes; + } + + char *decompress(const char *data, size_t dataSize, size_t &decompressedSize) override + { + char *rawbytes = nullptr; + + // We might know the output size before decompression. If not, we guess. + size_t rawsize = decompressedSize > 0 ? decompressedSize : dataSize * 2; + + // Repeatedly try to decompress with an increasingly large output buffer. + while (true) + { + try + { + rawbytes = new char[rawsize]; + } + catch (std::bad_alloc &) + { + throw love::Exception("Out of memory."); + } + + uLongf destLen = (uLongf) rawsize; + int status = uncompress((Bytef *) rawbytes, &destLen, (const Bytef *) data, (uLong) dataSize); + + if (status == Z_OK) + { + decompressedSize = (size_t) destLen; + break; + } + else if (status != Z_BUF_ERROR) + { + // For any error other than "not enough room", throw an exception. + delete[] rawbytes; + throw love::Exception("Could not decompress zlib-compressed data."); + } + + // Not enough room in the output buffer: try again with a larger size. + delete[] rawbytes; + rawsize *= 2; + } + + return rawbytes; + } + + Compressor::Format getFormat() const override { return FORMAT_ZLIB; } + +}; // zlibCompressor + + +Compressor *Compressor::Create(Format format) +{ + switch (format) + { + case FORMAT_LZ4: + return new LZ4Compressor; + case FORMAT_ZLIB: + return new zlibCompressor; + default: + throw love::Exception("Invalid compressor format."); + return nullptr; + } +} + +bool Compressor::getConstant(const char *in, Format &out) +{ + return formatNames.find(in, out); +} + +bool Compressor::getConstant(Format in, const char *&out) +{ + return formatNames.find(in, out); +} + +StringMap::Entry Compressor::formatEntries[] = +{ + {"lz4", Compressor::FORMAT_LZ4}, + {"zlib", Compressor::FORMAT_ZLIB}, +}; + +StringMap Compressor::formatNames(Compressor::formatEntries, sizeof(Compressor::formatEntries)); + +} // math +} // love diff --git a/jni/love/src/modules/math/Compressor.h b/jni/love/src/modules/math/Compressor.h new file mode 100644 index 00000000..d253e62c --- /dev/null +++ b/jni/love/src/modules/math/Compressor.h @@ -0,0 +1,101 @@ +/** + * Copyright (c) 2006-2015 LOVE Development Team + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. + **/ + +#ifndef LOVE_MATH_COMPRESSOR_H +#define LOVE_MATH_COMPRESSOR_H + +// LOVE +#include "common/StringMap.h" + +namespace love +{ +namespace math +{ + +/** + * Base class for backends for different compression formats. + **/ +class Compressor +{ +public: + + enum Format + { + FORMAT_LZ4, + FORMAT_ZLIB, + FORMAT_MAX_ENUM + }; + + /** + * Creates a new Compressor that can compress and decompress a specific + * format. + **/ + static Compressor *Create(Format format); + + virtual ~Compressor() {} + + /** + * Compresses input data, and returns the compressed result. + * + * @param[in] data The input (uncompressed) data. + * @param[in] dataSize The size in bytes of the input data. + * @param[in] level The amount of compression to apply (between 0 and 9.) + * A value of -1 indicates the default amount of compression. + * Specific formats may not use every level. + * @param[out] compressedSize The size in bytes of the compressed result. + * + * @return The newly compressed data (allocated with new[]). + **/ + virtual char *compress(const char *data, size_t dataSize, int level, size_t &compressedSize) = 0; + + /** + * Decompresses compressed data, and returns the decompressed result. + * + * @param[in] data The input (compressed) data. + * @param[in] dataSize The size in bytes of the compressed data. + * @param[in,out] decompressedSize On input, the size in bytes of the + * original uncompressed data, or 0 if unknown. On return, the + * size in bytes of the decompressed data. + * + * @return The decompressed data (allocated with new[]). + **/ + virtual char *decompress(const char *data, size_t dataSize, size_t &decompressedSize) = 0; + + /** + * Gets the compression format implemented by this backend. + * + * @return The supported format. + **/ + virtual Format getFormat() const = 0; + + static bool getConstant(const char *in, Format &out); + static bool getConstant(Format in, const char *&out); + +private: + + static StringMap::Entry formatEntries[]; + static StringMap formatNames; + +}; // Compressor + +} // math +} // love + +#endif // LOVE_MATH_COMPRESSOR_H diff --git a/jni/love/src/modules/math/MathModule.cpp b/jni/love/src/modules/math/MathModule.cpp index c9d78eb7..3ad86d67 100644 --- a/jni/love/src/modules/math/MathModule.cpp +++ b/jni/love/src/modules/math/MathModule.cpp @@ -86,9 +86,19 @@ Math Math::instance; Math::Math() : rng() + , compressors() { // prevent the runtime from free()-ing this retain(); + + for (int i = 0; i < (int) Compressor::FORMAT_MAX_ENUM; i++) + compressors[i] = Compressor::Create((Compressor::Format) i); +} + +Math::~Math() +{ + for (Compressor *c : compressors) + delete c; } RandomGenerator *Math::newRandomGenerator() @@ -223,5 +233,54 @@ float Math::linearToGamma(float c) const return 1.055f * powf(c, 0.41666f) - 0.055f; } +CompressedData *Math::compress(Compressor::Format format, love::Data *rawdata, int level) +{ + return compress(format, (const char *) rawdata->getData(), rawdata->getSize(), level); +} + +CompressedData *Math::compress(Compressor::Format format, const char *rawbytes, size_t rawsize, int level) +{ + if (format == Compressor::FORMAT_MAX_ENUM || !compressors[format]) + throw love::Exception("Invalid compression format."); + + size_t compressedsize = 0; + Compressor *compressor = compressors[format]; + + char *cbytes = compressor->compress(rawbytes, rawsize, level, compressedsize); + + CompressedData *data = nullptr; + + try + { + data = new CompressedData(format, cbytes, compressedsize, rawsize, true); + } + catch (love::Exception &) + { + delete[] cbytes; + throw; + } + + return data; +} + +char *Math::decompress(CompressedData *data, size_t &decompressedsize) +{ + size_t rawsize = data->getDecompressedSize(); + + char *rawbytes = decompress(data->getFormat(), (const char *) data->getData(), + data->getSize(), rawsize); + + decompressedsize = rawsize; + return rawbytes; +} + +char *Math::decompress(Compressor::Format format, const char *cbytes, size_t compressedsize, size_t &rawsize) +{ + if (format == Compressor::FORMAT_MAX_ENUM || !compressors[format]) + throw love::Exception("Invalid compression format."); + + return compressors[format]->decompress(cbytes, compressedsize, rawsize); +} + } // math } // love diff --git a/jni/love/src/modules/math/MathModule.h b/jni/love/src/modules/math/MathModule.h index d3e1e8cb..b2af7265 100644 --- a/jni/love/src/modules/math/MathModule.h +++ b/jni/love/src/modules/math/MathModule.h @@ -22,6 +22,8 @@ #define LOVE_MATH_MODMATH_H #include "RandomGenerator.h" +#include "CompressedData.h" +#include "Compressor.h" // LOVE #include "common/Module.h" @@ -30,6 +32,7 @@ #include "common/int.h" // Noise +#include "libraries/noise1234/noise1234.h" #include "libraries/noise1234/simplexnoise1234.h" // STL @@ -50,8 +53,7 @@ private: public: - virtual ~Math() - {} + virtual ~Math(); /** * @copydoc RandomGenerator::random() @@ -153,7 +155,7 @@ public: float linearToGamma(float c) const; /** - * Calculate Simplex noise for the specified coordinate(s). + * Calculate noise for the specified coordinate(s). * * @return Noise value in the range of [0, 1]. **/ @@ -162,12 +164,49 @@ public: float noise(float x, float y, float z) const; float noise(float x, float y, float z, float w) const; + /** + * Compresses a block of memory using the given compression format. + * + * @param format The compression format to use. + * @param rawdata The data to compress. + * @param level The amount of compression to apply (between 0 and 9.) + * A value of -1 indicates the default amount of compression. + * Specific formats may not use every level. + * @return The newly compressed data. + **/ + CompressedData *compress(Compressor::Format format, Data *rawdata, int level = -1); + CompressedData *compress(Compressor::Format format, const char *rawbytes, size_t rawsize, int level = -1); + + /** + * Decompresses existing compressed data into raw bytes. + * + * @param[in] data The compressed data to decompress. + * @param[out] decompressedsize The size in bytes of the decompressed data. + * @return The newly decompressed data (allocated with new[]). + **/ + char *decompress(CompressedData *data, size_t &decompressedsize); + + /** + * Decompresses existing compressed data into raw bytes. + * + * @param[in] format The compression format the data is in. + * @param[in] cbytes The compressed data to decompress. + * @param[in] compressedsize The size in bytes of the compressed data. + * @param[in,out] rawsize On input, the size in bytes of the original + * uncompressed data, or 0 if unknown. On return, the size in + * bytes of the newly decompressed data. + * @return The newly decompressed data (allocated with new[]). + **/ + char *decompress(Compressor::Format format, const char *cbytes, size_t compressedsize, size_t &rawsize); + static Math instance; private: Math(); + Compressor *compressors[Compressor::FORMAT_MAX_ENUM]; + }; // Math inline float Math::noise(float x) const @@ -180,14 +219,17 @@ inline float Math::noise(float x, float y) const return SimplexNoise1234::noise(x, y) * 0.5f + 0.5f; } +// Perlin noise is used instead of Simplex noise in the 3D and 4D cases to avoid +// patent issues. + inline float Math::noise(float x, float y, float z) const { - return SimplexNoise1234::noise(x, y, z) * 0.5f + 0.5f; + return Noise1234::noise(x, y, z) * 0.5f + 0.5f; } inline float Math::noise(float x, float y, float z, float w) const { - return SimplexNoise1234::noise(x, y, z, w) * 0.5f + 0.5f; + return Noise1234::noise(x, y, z, w) * 0.5f + 0.5f; } } // math diff --git a/jni/love/src/modules/math/RandomGenerator.cpp b/jni/love/src/modules/math/RandomGenerator.cpp index 5bc86d04..6bd21543 100644 --- a/jni/love/src/modules/math/RandomGenerator.cpp +++ b/jni/love/src/modules/math/RandomGenerator.cpp @@ -21,11 +21,11 @@ #include "RandomGenerator.h" // C++ -#include #include #include // C +#include #include namespace love @@ -33,6 +33,20 @@ namespace love namespace math { +// Thomas Wang's 64-bit integer hashing function: +// https://web.archive.org/web/20110807030012/http://www.cris.com/%7ETtwang/tech/inthash.htm +static uint64 wangHash64(uint64 key) +{ + key = (~key) + (key << 21); // key = (key << 21) - key - 1; + key = key ^ (key >> 24); + key = (key + (key << 3)) + (key << 8); // key * 265 + key = key ^ (key >> 14); + key = (key + (key << 2)) + (key << 4); // key * 21 + key = key ^ (key >> 28); + key = key + (key << 31); + return key; +} + // 64 bit Xorshift implementation taken from the end of Sec. 3 (page 4) in // George Marsaglia, "Xorshift RNGs", Journal of Statistical Software, Vol.8 (Issue 14), 2003 @@ -75,12 +89,18 @@ double RandomGenerator::randomNormal(double stddev) void RandomGenerator::setSeed(RandomGenerator::Seed newseed) { - // 0 xor 0 is still 0, so Xorshift can't generate new numbers. - if (newseed.b64 == 0) - throw love::Exception("Random seed cannot be 0."); - seed = newseed; - rng_state = seed; + + // Xorshift isn't designed to give a good distribution of values across many + // similar seeds, so we hash the state integer before using it. + // http://www.reedbeta.com/blog/2013/01/12/quick-and-easy-gpu-random-numbers-in-d3d11/ + // Xorshift also can't handle a state value of 0, so we avoid that. + do + { + newseed.b64 = wangHash64(newseed.b64); + } while (newseed.b64 == 0); + + rng_state = newseed; } RandomGenerator::Seed RandomGenerator::getSeed() const @@ -93,32 +113,17 @@ void RandomGenerator::setState(const std::string &statestr) // For this implementation we'll accept a hex string representing the // 64-bit state integer xorshift uses. - Seed state = {}; - // Hex string must start with 0x. if (statestr.find("0x") != 0 || statestr.size() < 3) - throw love::Exception("Invalid random state."); + throw love::Exception("Invalid random state: %s", statestr.c_str()); - // standardized strtoull (or 64 bit integer support for stringstream) - // requires C++11's standard library, which we can't use yet. - // I use strtol like this not because it's the best solution, but because - // it's "good enough". + Seed state = {}; - // Convert the hex string to the state integer character-by-character. - for (size_t i = 2; i < statestr.size(); i++) - { - char hex[2] = {statestr[i], 0}; - char *end = nullptr; + char *end = nullptr; + state.b64 = strtoull(statestr.c_str(), &end, 16); - // Convert the current hex character to a number. - int nibble = strtol(hex, &end, 16); - - // Check if strtol failed to convert it. - if (end != nullptr && *end != 0) - throw love::Exception("Invalid random state."); - - state.b64 = (state.b64 << 4) + nibble; - } + if (end != nullptr && *end != 0) + throw love::Exception("Invalid random state: %s", statestr.c_str()); rng_state = state; } @@ -127,14 +132,8 @@ std::string RandomGenerator::getState() const { // For this implementation we'll return a hex string representing the 64-bit // state integer xorshift uses. - std::stringstream ss; - - ss << "0x"; - - // Again with the stringstream not dealing with 64 bit integers... - ss << std::setfill('0') << std::setw(8) << std::hex << rng_state.b32.high; - ss << std::setfill('0') << std::setw(8) << std::hex << rng_state.b32.low; + ss << "0x" << std::setfill('0') << std::setw(16) << std::hex << rng_state.b64; return ss.str(); } diff --git a/jni/love/src/modules/math/wrap_BezierCurve.cpp b/jni/love/src/modules/math/wrap_BezierCurve.cpp index 0104d831..76edfd41 100644 --- a/jni/love/src/modules/math/wrap_BezierCurve.cpp +++ b/jni/love/src/modules/math/wrap_BezierCurve.cpp @@ -30,7 +30,7 @@ namespace math BezierCurve *luax_checkbeziercurve(lua_State *L, int idx) { - return luax_checktype(L, idx, "BezierCurve", MATH_BEZIER_CURVE_T); + return luax_checktype(L, idx, MATH_BEZIER_CURVE_ID); } int w_BezierCurve_getDegree(lua_State *L) @@ -44,7 +44,7 @@ int w_BezierCurve_getDerivative(lua_State *L) { BezierCurve *curve = luax_checkbeziercurve(L, 1); BezierCurve *deriv = new BezierCurve(curve->getDerivative()); - luax_pushtype(L, "BezierCurve", MATH_BEZIER_CURVE_T, deriv); + luax_pushtype(L, MATH_BEZIER_CURVE_ID, deriv); deriv->release(); return 1; } @@ -52,7 +52,7 @@ int w_BezierCurve_getDerivative(lua_State *L) int w_BezierCurve_getControlPoint(lua_State *L) { BezierCurve *curve = luax_checkbeziercurve(L, 1); - int idx = luaL_checkinteger(L, 2); + int idx = (int) luaL_checknumber(L, 2); if (idx > 0) // 1-indexing idx--; @@ -69,7 +69,7 @@ int w_BezierCurve_getControlPoint(lua_State *L) int w_BezierCurve_setControlPoint(lua_State *L) { BezierCurve *curve = luax_checkbeziercurve(L, 1); - int idx = luaL_checkinteger(L, 2); + int idx = (int) luaL_checknumber(L, 2); float vx = (float) luaL_checknumber(L, 3); float vy = (float) luaL_checknumber(L, 4); @@ -85,7 +85,7 @@ int w_BezierCurve_insertControlPoint(lua_State *L) BezierCurve *curve = luax_checkbeziercurve(L, 1); float vx = (float) luaL_checknumber(L, 2); float vy = (float) luaL_checknumber(L, 3); - int idx = luaL_optinteger(L, 4, -1); + int idx = (int) luaL_optnumber(L, 4, -1); if (idx > 0) // 1-indexing idx--; @@ -94,6 +94,18 @@ int w_BezierCurve_insertControlPoint(lua_State *L) return 0; } +int w_BezierCurve_removeControlPoint(lua_State *L) +{ + BezierCurve *curve = luax_checkbeziercurve(L, 1); + int idx = (int) luaL_checknumber(L, 2); + + if (idx > 0) // 1-indexing + idx--; + + luax_catchexcept(L, [&](){ curve->removeControlPoint(idx); }); + return 0; +} + int w_BezierCurve_getControlPointCount(lua_State *L) { BezierCurve *curve = luax_checkbeziercurve(L, 1); @@ -145,14 +157,50 @@ int w_BezierCurve_evaluate(lua_State *L) } +int w_BezierCurve_getSegment(lua_State *L) +{ + BezierCurve *curve = luax_checkbeziercurve(L, 1); + double t1 = luaL_checknumber(L, 2); + double t2 = luaL_checknumber(L, 3); + + BezierCurve *segment; + luax_catchexcept(L, [&](){ segment = curve->getSegment(t1, t2); }); + luax_pushtype(L, MATH_BEZIER_CURVE_ID, segment); + segment->release(); + + return 1; +} + int w_BezierCurve_render(lua_State *L) { BezierCurve *curve = luax_checkbeziercurve(L, 1); - int accuracy = luaL_optinteger(L, 2, 5); + int accuracy = (int) luaL_optnumber(L, 2, 5); std::vector points; luax_catchexcept(L, [&](){ points = curve->render(accuracy); }); + lua_createtable(L, (int) points.size() * 2, 0); + for (int i = 0; i < (int) points.size(); ++i) + { + lua_pushnumber(L, points[i].x); + lua_rawseti(L, -2, 2*i+1); + lua_pushnumber(L, points[i].y); + lua_rawseti(L, -2, 2*i+2); + } + + return 1; +} + +int w_BezierCurve_renderSegment(lua_State *L) +{ + BezierCurve *curve = luax_checkbeziercurve(L, 1); + double start = luaL_checknumber(L, 2); + double end = luaL_checknumber(L, 3); + int accuracy = luaL_optinteger(L, 4, 5); + + std::vector points; + luax_catchexcept(L, [&](){ points = curve->renderSegment(start, end, accuracy); }); + lua_createtable(L, points.size()*2, 0); for (size_t i = 0; i < points.size(); ++i) { @@ -172,18 +220,21 @@ static const luaL_Reg functions[] = {"getControlPoint", w_BezierCurve_getControlPoint}, {"setControlPoint", w_BezierCurve_setControlPoint}, {"insertControlPoint", w_BezierCurve_insertControlPoint}, + {"removeControlPoint", w_BezierCurve_removeControlPoint}, {"getControlPointCount", w_BezierCurve_getControlPointCount}, {"translate", w_BezierCurve_translate}, {"rotate", w_BezierCurve_rotate}, {"scale", w_BezierCurve_scale}, {"evaluate", w_BezierCurve_evaluate}, + {"getSegment", w_BezierCurve_getSegment}, {"render", w_BezierCurve_render}, + {"renderSegment", w_BezierCurve_renderSegment}, { 0, 0 } }; extern "C" int luaopen_beziercurve(lua_State *L) { - return luax_register_type(L, "BezierCurve", functions); + return luax_register_type(L, MATH_BEZIER_CURVE_ID, functions); } } // math diff --git a/jni/love/src/modules/math/wrap_BezierCurve.h b/jni/love/src/modules/math/wrap_BezierCurve.h index 9fd0fbd1..e5aae3da 100644 --- a/jni/love/src/modules/math/wrap_BezierCurve.h +++ b/jni/love/src/modules/math/wrap_BezierCurve.h @@ -36,12 +36,15 @@ int w_BezierCurve_getDerivative(lua_State *L); int w_BezierCurve_getControlPoint(lua_State *L); int w_BezierCurve_setControlPoint(lua_State *L); int w_BezierCurve_insertControlPoint(lua_State *L); +int w_BezierCurve_removeControlPoint(lua_State *L); int w_BezierCurve_getControlPointCount(lua_State *L); int w_BezierCurve_translate(lua_State *L); int w_BezierCurve_rotate(lua_State *L); int w_BezierCurve_scale(lua_State *L); int w_BezierCurve_evaluate(lua_State *L); +int w_BezierCurve_getSegment(lua_State *L); int w_BezierCurve_render(lua_State *L); +int w_BezierCurve_renderSegment(lua_State *L); extern "C" int luaopen_beziercurve(lua_State *L); } // math diff --git a/jni/love/src/modules/math/wrap_CompressedData.cpp b/jni/love/src/modules/math/wrap_CompressedData.cpp new file mode 100644 index 00000000..e9868d8e --- /dev/null +++ b/jni/love/src/modules/math/wrap_CompressedData.cpp @@ -0,0 +1,65 @@ +/** + * Copyright (c) 2006-2015 LOVE Development Team + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. + **/ + +// LOVE +#include "wrap_CompressedData.h" +#include "common/wrap_Data.h" + +namespace love +{ +namespace math +{ + +CompressedData *luax_checkcompresseddata(lua_State *L, int idx) +{ + return luax_checktype(L, idx, MATH_COMPRESSED_DATA_ID); +} + +int w_CompressedData_getFormat(lua_State *L) +{ + CompressedData *t = luax_checkcompresseddata(L, 1); + + const char *fname = nullptr; + if (!Compressor::getConstant(t->getFormat(), fname)) + return luaL_error(L, "Unknown compressed data format."); + + lua_pushstring(L, fname); + return 1; +} + +static const luaL_Reg functions[] = +{ + // Data + { "getString", w_Data_getString }, + { "getPointer", w_Data_getPointer }, + { "getSize", w_Data_getSize }, + + { "getFormat", w_CompressedData_getFormat }, + { 0, 0 }, +}; + + +extern "C" int luaopen_compresseddata(lua_State *L) +{ + return luax_register_type(L, MATH_COMPRESSED_DATA_ID, functions); +} + +} // math +} // love diff --git a/jni/love/src/modules/image/wrap_CompressedData.h b/jni/love/src/modules/math/wrap_CompressedData.h similarity index 77% rename from jni/love/src/modules/image/wrap_CompressedData.h rename to jni/love/src/modules/math/wrap_CompressedData.h index fe9d4e38..00dd41bb 100644 --- a/jni/love/src/modules/image/wrap_CompressedData.h +++ b/jni/love/src/modules/math/wrap_CompressedData.h @@ -18,8 +18,8 @@ * 3. This notice may not be removed or altered from any source distribution. **/ -#ifndef LOVE_IMAGE_WRAP_COMRESSED_DATA_H -#define LOVE_IMAGE_WRAP_COMRESSED_DATA_H +#ifndef LOVE_MATH_WRAP_COMPRESSED_DATA_H +#define LOVE_MATH_WRAP_COMPRESSED_DATA_H // LOVE #include "common/runtime.h" @@ -27,18 +27,14 @@ namespace love { -namespace image +namespace math { CompressedData *luax_checkcompresseddata(lua_State *L, int idx); -int w_CompressedData_getWidth(lua_State *L); -int w_CompressedData_getHeight(lua_State *L); -int w_CompressedData_getDimensions(lua_State *L); -int w_CompressedData_getMipmapCount(lua_State *L); int w_CompressedData_getFormat(lua_State *L); extern "C" int luaopen_compresseddata(lua_State *L); -} // image +} // math } // love -#endif // LOVE_IMAGE_WRAP_COMRESSED_DATA_H +#endif // LOVE_MATH_WRAP_COMPRESSED_DATA_H diff --git a/jni/love/src/modules/math/wrap_Math.cpp b/jni/love/src/modules/math/wrap_Math.cpp index 04769986..7bc4ae93 100644 --- a/jni/love/src/modules/math/wrap_Math.cpp +++ b/jni/love/src/modules/math/wrap_Math.cpp @@ -21,6 +21,7 @@ #include "wrap_Math.h" #include "wrap_RandomGenerator.h" #include "wrap_BezierCurve.h" +#include "wrap_CompressedData.h" #include "MathModule.h" #include "BezierCurve.h" @@ -100,7 +101,7 @@ int w_newRandomGenerator(lua_State *L) return luaL_error(L, "%s", lua_tostring(L, -1)); } - luax_pushtype(L, "RandomGenerator", MATH_RANDOM_GENERATOR_T, t); + luax_pushtype(L, MATH_RANDOM_GENERATOR_ID, t); t->release(); return 1; } @@ -110,9 +111,9 @@ int w_newBezierCurve(lua_State *L) std::vector points; if (lua_istable(L, 1)) { - size_t top = lua_objlen(L, 1); + int top = (int) luax_objlen(L, 1); points.reserve(top / 2); - for (size_t i = 1; i <= top; i += 2) + for (int i = 1; i <= top; i += 2) { lua_rawgeti(L, 1, i); lua_rawgeti(L, 1, i+1); @@ -127,9 +128,9 @@ int w_newBezierCurve(lua_State *L) } else { - size_t top = lua_gettop(L); + int top = (int) lua_gettop(L); points.reserve(top / 2); - for (size_t i = 1; i <= top; i += 2) + for (int i = 1; i <= top; i += 2) { Vector v; v.x = (float) luaL_checknumber(L, i); @@ -139,7 +140,7 @@ int w_newBezierCurve(lua_State *L) } BezierCurve *curve = Math::instance.newBezierCurve(points); - luax_pushtype(L, "BezierCurve", MATH_BEZIER_CURVE_T, curve); + luax_pushtype(L, MATH_BEZIER_CURVE_ID, curve); curve->release(); return 1; } @@ -149,9 +150,9 @@ int w_triangulate(lua_State *L) std::vector vertices; if (lua_istable(L, 1)) { - size_t top = lua_objlen(L, 1); + int top = (int) luax_objlen(L, 1); vertices.reserve(top / 2); - for (size_t i = 1; i <= top; i += 2) + for (int i = 1; i <= top; i += 2) { lua_rawgeti(L, 1, i); lua_rawgeti(L, 1, i+1); @@ -166,9 +167,9 @@ int w_triangulate(lua_State *L) } else { - size_t top = lua_gettop(L); + int top = (int) lua_gettop(L); vertices.reserve(top / 2); - for (size_t i = 1; i <= top; i += 2) + for (int i = 1; i <= top; i += 2) { Vertex v; v.x = (float) luaL_checknumber(L, i); @@ -189,8 +190,8 @@ int w_triangulate(lua_State *L) triangles = Math::instance.triangulate(vertices); }); - lua_createtable(L, triangles.size(), 0); - for (size_t i = 0; i < triangles.size(); ++i) + lua_createtable(L, (int) triangles.size(), 0); + for (int i = 0; i < (int) triangles.size(); ++i) { const Triangle &tri = triangles[i]; @@ -219,9 +220,9 @@ int w_isConvex(lua_State *L) std::vector vertices; if (lua_istable(L, 1)) { - size_t top = lua_objlen(L, 1); + int top = (int) luax_objlen(L, 1); vertices.reserve(top / 2); - for (size_t i = 1; i <= top; i += 2) + for (int i = 1; i <= top; i += 2) { lua_rawgeti(L, 1, i); lua_rawgeti(L, 1, i+1); @@ -257,7 +258,7 @@ static int getGammaArgs(lua_State *L, float color[4]) if (lua_istable(L, 1)) { - int n = lua_objlen(L, 1); + int n = (int) luax_objlen(L, 1); for (int i = 1; i <= n && i <= 4; i++) { lua_rawgeti(L, 1, i); @@ -279,7 +280,7 @@ static int getGammaArgs(lua_State *L, float color[4]) if (numcomponents == 0) luaL_checknumber(L, 1); - + return numcomponents; } @@ -351,6 +352,64 @@ int w_noise(lua_State *L) return 1; } +int w_compress(lua_State *L) +{ + const char *fstr = lua_isnoneornil(L, 2) ? nullptr : luaL_checkstring(L, 2); + Compressor::Format format = Compressor::FORMAT_LZ4; + + if (fstr && !Compressor::getConstant(fstr, format)) + return luaL_error(L, "Invalid compressed format: %s", fstr); + + int level = (int) luaL_optnumber(L, 3, -1); + + CompressedData *cdata = nullptr; + if (lua_isstring(L, 1)) + { + size_t rawsize = 0; + const char *rawbytes = luaL_checklstring(L, 1, &rawsize); + luax_catchexcept(L, [&](){ cdata = Math::instance.compress(format, rawbytes, rawsize, level); }); + } + else + { + Data *rawdata = luax_checktype(L, 1, DATA_ID); + luax_catchexcept(L, [&](){ cdata = Math::instance.compress(format, rawdata, level); }); + } + + luax_pushtype(L, MATH_COMPRESSED_DATA_ID, cdata); + return 1; +} + +int w_decompress(lua_State *L) +{ + char *rawbytes = nullptr; + size_t rawsize = 0; + + if (lua_isstring(L, 1)) + { + Compressor::Format format = Compressor::FORMAT_LZ4; + const char *fstr = luaL_checkstring(L, 2); + + if (!Compressor::getConstant(fstr, format)) + return luaL_error(L, "Invalid compressed format: %s", fstr); + + size_t compressedsize = 0; + const char *cbytes = luaL_checklstring(L, 1, &compressedsize); + + luax_catchexcept(L, [&](){ rawbytes = Math::instance.decompress(format, cbytes, compressedsize, rawsize); }); + } + else + { + CompressedData *data = luax_checkcompresseddata(L, 1); + rawsize = data->getDecompressedSize(); + luax_catchexcept(L, [&](){ rawbytes = Math::instance.decompress(data, rawsize); }); + } + + lua_pushlstring(L, rawbytes, rawsize); + delete[] rawbytes; + + return 1; +} + // List of functions to wrap. static const luaL_Reg functions[] = { @@ -367,6 +426,8 @@ static const luaL_Reg functions[] = { "gammaToLinear", w_gammaToLinear }, { "linearToGamma", w_linearToGamma }, { "noise", w_noise }, + { "compress", w_compress }, + { "decompress", w_decompress }, { 0, 0 } }; @@ -374,6 +435,7 @@ static const lua_CFunction types[] = { luaopen_randomgenerator, luaopen_beziercurve, + luaopen_compresseddata, 0 }; @@ -384,7 +446,7 @@ extern "C" int luaopen_love_math(lua_State *L) WrappedModule w; w.module = &Math::instance; w.name = "math"; - w.flags = MODULE_T; + w.type = MODULE_ID; w.functions = functions; w.types = types; diff --git a/jni/love/src/modules/math/wrap_Math.h b/jni/love/src/modules/math/wrap_Math.h index 275e2497..ccbb8aee 100644 --- a/jni/love/src/modules/math/wrap_Math.h +++ b/jni/love/src/modules/math/wrap_Math.h @@ -43,6 +43,8 @@ int w_isConvex(lua_State *L); int w_gammaToLinear(lua_State *L); int w_linearToGamma(lua_State *L); int w_noise(lua_State *L); +int w_compress(lua_State *L); +int w_decompress(lua_State *L); extern "C" LOVE_EXPORT int luaopen_love_math(lua_State *L); } // random diff --git a/jni/love/src/modules/math/wrap_RandomGenerator.cpp b/jni/love/src/modules/math/wrap_RandomGenerator.cpp index 4b1ef586..4923c07a 100644 --- a/jni/love/src/modules/math/wrap_RandomGenerator.cpp +++ b/jni/love/src/modules/math/wrap_RandomGenerator.cpp @@ -66,13 +66,13 @@ int luax_getrandom(lua_State *L, int startidx, double r) lua_pushnumber(L, r); break; case 1: - u = luaL_checkint(L, startidx); + u = (int) luaL_checknumber(L, startidx); luaL_argcheck(L, 1 <= u, startidx, "interval is empty"); lua_pushnumber(L, floor(r * u) + 1); break; case 2: - l = luaL_checkint(L, startidx); - u = luaL_checkint(L, startidx + 1); + l = (int) luaL_checknumber(L, startidx); + u = (int) luaL_checknumber(L, startidx + 1); luaL_argcheck(L, l <= u, startidx + 1, "interval is empty"); lua_pushnumber(L, floor(r * (u - l + 1)) + l); break; @@ -84,7 +84,7 @@ int luax_getrandom(lua_State *L, int startidx, double r) RandomGenerator *luax_checkrandomgenerator(lua_State *L, int idx) { - return luax_checktype(L, idx, "RandomGenerator", MATH_RANDOM_GENERATOR_T); + return luax_checktype(L, idx, MATH_RANDOM_GENERATOR_ID); } int w_RandomGenerator_random(lua_State *L) @@ -148,7 +148,7 @@ static const luaL_Reg functions[] = extern "C" int luaopen_randomgenerator(lua_State *L) { - return luax_register_type(L, "RandomGenerator", functions); + return luax_register_type(L, MATH_RANDOM_GENERATOR_ID, functions); } } // math diff --git a/jni/love/src/modules/mouse/Mouse.h b/jni/love/src/modules/mouse/Mouse.h index 19bd652e..92d19a5b 100644 --- a/jni/love/src/modules/mouse/Mouse.h +++ b/jni/love/src/modules/mouse/Mouse.h @@ -24,9 +24,11 @@ // LOVE #include "Cursor.h" #include "common/Module.h" -#include "common/StringMap.h" #include "image/ImageData.h" +// C++ +#include + namespace love { namespace mouse @@ -36,19 +38,6 @@ class Mouse : public Module { public: - enum Button - { - BUTTON_INVALID, - BUTTON_LEFT, - BUTTON_MIDDLE, - BUTTON_RIGHT, - BUTTON_X1, - BUTTON_X2, - BUTTON_WHEELUP, - BUTTON_WHEELDOWN, - BUTTON_MAX_ENUM - }; - virtual ~Mouse() {} // Implements Module. @@ -64,28 +53,20 @@ public: virtual bool hasCursor() const = 0; - virtual int getX() const = 0; - virtual int getY() const = 0; - virtual void getPosition(int &x, int &y) const = 0; - virtual void setX(int x) = 0; - virtual void setY(int y) = 0; - virtual void setPosition(int x, int y) = 0; + virtual double getX() const = 0; + virtual double getY() const = 0; + virtual void getPosition(double &x, double &y) const = 0; + virtual void setX(double x) = 0; + virtual void setY(double y) = 0; + virtual void setPosition(double x, double y) = 0; virtual void setVisible(bool visible) = 0; - virtual bool isDown(Button *buttonlist) const = 0; + virtual bool isDown(const std::vector &buttons) const = 0; virtual bool isVisible() const = 0; virtual void setGrabbed(bool grab) = 0; virtual bool isGrabbed() const = 0; virtual bool setRelativeMode(bool relative) = 0; virtual bool getRelativeMode() const = 0; - static bool getConstant(const char *in, Button &out); - static bool getConstant(Button in, const char *&out); - -private: - - static StringMap::Entry buttonEntries[]; - static StringMap buttons; - }; // Mouse } // mouse diff --git a/jni/love/src/modules/mouse/sdl/Mouse.cpp b/jni/love/src/modules/mouse/sdl/Mouse.cpp index d4748b91..27f895be 100644 --- a/jni/love/src/modules/mouse/sdl/Mouse.cpp +++ b/jni/love/src/modules/mouse/sdl/Mouse.cpp @@ -34,29 +34,19 @@ namespace sdl // SDL reports mouse coordinates in the window coordinate system in OS X, but // we want them in pixel coordinates (may be different with high-DPI enabled.) -static void windowToPixelCoords(int *x, int *y) +static void windowToPixelCoords(double *x, double *y) { -#ifndef LOVE_ANDROID window::Window *window = Module::getInstance(Module::M_WINDOW); - - if (window && x) - *x = (int) window->toPixels(*x); - if (window && y) - *y = (int) window->toPixels(*y); -#endif + if (window) + window->windowToPixelCoords(x, y); } // And vice versa for setting mouse coordinates. -static void pixelToWindowCoords(int *x, int *y) +static void pixelToWindowCoords(double *x, double *y) { -#ifndef LOVE_ANDROID window::Window *window = Module::getInstance(Module::M_WINDOW); - - if (window && x) - *x = (int) window->fromPixels(*x); - if (window && y) - *y = (int) window->fromPixels(*y); -#endif + if (window) + window->pixelToWindowCoords(x, y); } const char *Mouse::getName() const @@ -116,49 +106,54 @@ love::mouse::Cursor *Mouse::getCursor() const return curCursor.get(); } + bool Mouse::hasCursor() const { return SDL_GetDefaultCursor() != nullptr; } -int Mouse::getX() const +double Mouse::getX() const { int x; SDL_GetMouseState(&x, nullptr); - windowToPixelCoords(&x, nullptr); - return x; + double dx = (double) x; + windowToPixelCoords(&dx, nullptr); + + return dx; } -int Mouse::getY() const +double Mouse::getY() const { int y; SDL_GetMouseState(nullptr, &y); - windowToPixelCoords(nullptr, &y); - return y; + double dy = (double) y; + windowToPixelCoords(nullptr, &dy); + + return dy; } -void Mouse::getPosition(int &x, int &y) const +void Mouse::getPosition(double &x, double &y) const { int mx, my; SDL_GetMouseState(&mx, &my); - windowToPixelCoords(&mx, &my); - x = mx; - y = my; + x = (double) mx; + y = (double) my; + windowToPixelCoords(&x, &y); } -void Mouse::setPosition(int x, int y) +void Mouse::setPosition(double x, double y) { - love::window::Window *window = love::window::sdl::Window::getSingleton(); + window::Window *window = Module::getInstance(Module::M_WINDOW); SDL_Window *handle = nullptr; if (window) handle = (SDL_Window *) window->getHandle(); pixelToWindowCoords(&x, &y); - SDL_WarpMouseInWindow(handle, x, y); + SDL_WarpMouseInWindow(handle, (int) x, (int) y); // SDL_WarpMouse doesn't directly update SDL's internal mouse state in Linux // and Windows, so we call SDL_PumpEvents now to make sure the next @@ -166,16 +161,14 @@ void Mouse::setPosition(int x, int y) SDL_PumpEvents(); } -void Mouse::setX(int x) +void Mouse::setX(double x) { - int y = getY(); - setPosition(x, y); + setPosition(x, getY()); } -void Mouse::setY(int y) +void Mouse::setY(double y) { - int x = getX(); - setPosition(x, y); + setPosition(getX(), y); } void Mouse::setVisible(bool visible) @@ -183,12 +176,27 @@ void Mouse::setVisible(bool visible) SDL_ShowCursor(visible ? SDL_ENABLE : SDL_DISABLE); } -bool Mouse::isDown(Button *buttonlist) const +bool Mouse::isDown(const std::vector &buttons) const { Uint32 buttonstate = SDL_GetMouseState(nullptr, nullptr); - for (Button button = *buttonlist; button != BUTTON_MAX_ENUM; button = *(++buttonlist)) + for (int button : buttons) { + if (button <= 0) + continue; + + // We use button index 2 to represent the right mouse button, but SDL + // uses 2 to represent the middle mouse button. + switch (button) + { + case 2: + button = SDL_BUTTON_RIGHT; + break; + case 3: + button = SDL_BUTTON_MIDDLE; + break; + } + if (buttonstate & SDL_BUTTON(button)) return true; } @@ -203,14 +211,14 @@ bool Mouse::isVisible() const void Mouse::setGrabbed(bool grab) { - love::window::Window *window = love::window::sdl::Window::getSingleton(); + window::Window *window = Module::getInstance(Module::M_WINDOW); if (window) window->setMouseGrab(grab); } bool Mouse::isGrabbed() const { - love::window::Window *window = love::window::sdl::Window::getSingleton(); + window::Window *window = Module::getInstance(Module::M_WINDOW); if (window) return window->isMouseGrabbed(); else diff --git a/jni/love/src/modules/mouse/sdl/Mouse.h b/jni/love/src/modules/mouse/sdl/Mouse.h index f63239d1..bf93cab1 100644 --- a/jni/love/src/modules/mouse/sdl/Mouse.h +++ b/jni/love/src/modules/mouse/sdl/Mouse.h @@ -40,34 +40,34 @@ class Mouse : public love::mouse::Mouse public: // Implements Module. - const char *getName() const; + const char *getName() const override; Mouse(); - ~Mouse(); + virtual ~Mouse(); - love::mouse::Cursor *newCursor(love::image::ImageData *data, int hotx, int hoty); - love::mouse::Cursor *getSystemCursor(Cursor::SystemCursor cursortype); + love::mouse::Cursor *newCursor(love::image::ImageData *data, int hotx, int hoty) override; + love::mouse::Cursor *getSystemCursor(Cursor::SystemCursor cursortype) override; - void setCursor(love::mouse::Cursor *cursor); - void setCursor(); + void setCursor(love::mouse::Cursor *cursor) override; + void setCursor() override; - love::mouse::Cursor *getCursor() const; + love::mouse::Cursor *getCursor() const override; - bool hasCursor() const; + bool hasCursor() const override; - int getX() const; - int getY() const; - void getPosition(int &x, int &y) const; - void setX(int x); - void setY(int y); - void setPosition(int x, int y); - void setVisible(bool visible); - bool isDown(Button *buttonlist) const; - bool isVisible() const; - void setGrabbed(bool grab); - bool isGrabbed() const; - bool setRelativeMode(bool relative); - bool getRelativeMode() const; + double getX() const override; + double getY() const override; + void getPosition(double &x, double &y) const override; + void setX(double x) override; + void setY(double y) override; + void setPosition(double x, double y) override; + void setVisible(bool visible) override; + bool isDown(const std::vector &buttons) const override; + bool isVisible() const override; + void setGrabbed(bool grab) override; + bool isGrabbed() const override; + bool setRelativeMode(bool relative) override; + bool getRelativeMode() const override; private: diff --git a/jni/love/src/modules/mouse/wrap_Cursor.cpp b/jni/love/src/modules/mouse/wrap_Cursor.cpp index 2bb93cfc..b1ea6562 100644 --- a/jni/love/src/modules/mouse/wrap_Cursor.cpp +++ b/jni/love/src/modules/mouse/wrap_Cursor.cpp @@ -28,7 +28,7 @@ namespace mouse Cursor *luax_checkcursor(lua_State *L, int idx) { - return luax_checktype(L, idx, "Cursor", MOUSE_CURSOR_T); + return luax_checktype(L, idx, MOUSE_CURSOR_ID); } int w_Cursor_getType(lua_State *L) @@ -61,7 +61,7 @@ static const luaL_Reg functions[] = extern "C" int luaopen_cursor(lua_State *L) { - return luax_register_type(L, "Cursor", functions); + return luax_register_type(L, MOUSE_CURSOR_ID, functions); } } // mouse diff --git a/jni/love/src/modules/mouse/wrap_Mouse.cpp b/jni/love/src/modules/mouse/wrap_Mouse.cpp index d45fe41a..daca061d 100644 --- a/jni/love/src/modules/mouse/wrap_Mouse.cpp +++ b/jni/love/src/modules/mouse/wrap_Mouse.cpp @@ -36,16 +36,16 @@ int w_newCursor(lua_State *L) { Cursor *cursor = nullptr; - if (lua_isstring(L, 1) || luax_istype(L, 1, FILESYSTEM_FILE_T) || luax_istype(L, 1, FILESYSTEM_FILE_DATA_T)) + if (lua_isstring(L, 1) || luax_istype(L, 1, FILESYSTEM_FILE_ID) || luax_istype(L, 1, FILESYSTEM_FILE_DATA_ID)) luax_convobj(L, 1, "image", "newImageData"); - love::image::ImageData *data = luax_checktype(L, 1, "ImageData", IMAGE_IMAGE_DATA_T); - int hotx = luaL_optint(L, 2, 0); - int hoty = luaL_optint(L, 3, 0); + love::image::ImageData *data = luax_checktype(L, 1, IMAGE_IMAGE_DATA_ID); + int hotx = (int) luaL_optnumber(L, 2, 0); + int hoty = (int) luaL_optnumber(L, 3, 0); luax_catchexcept(L, [&](){ cursor = instance()->newCursor(data, hotx, hoty); }); - luax_pushtype(L, "Cursor", MOUSE_CURSOR_T, cursor); + luax_pushtype(L, MOUSE_CURSOR_ID, cursor); cursor->release(); return 1; } @@ -61,7 +61,7 @@ int w_getSystemCursor(lua_State *L) Cursor *cursor = 0; luax_catchexcept(L, [&](){ cursor = instance()->getSystemCursor(systemCursor); }); - luax_pushtype(L, "Cursor", MOUSE_CURSOR_T, cursor); + luax_pushtype(L, MOUSE_CURSOR_ID, cursor); return 1; } @@ -84,7 +84,7 @@ int w_getCursor(lua_State *L) Cursor *cursor = instance()->getCursor(); if (cursor) - luax_pushtype(L, "Cursor", MOUSE_CURSOR_T, cursor); + luax_pushtype(L, MOUSE_CURSOR_ID, cursor); else lua_pushnil(L); @@ -111,51 +111,45 @@ int w_getY(lua_State *L) int w_getPosition(lua_State *L) { - int x, y; + double x, y; instance()->getPosition(x, y); - lua_pushinteger(L, x); - lua_pushinteger(L, y); + lua_pushnumber(L, x); + lua_pushnumber(L, y); return 2; } int w_setX(lua_State *L) { - int x = luaL_checkint(L, 1); + double x = luaL_checknumber(L, 1); instance()->setX(x); return 0; } int w_setY(lua_State *L) { - int y = luaL_checkint(L, 1); + double y = luaL_checknumber(L, 1); instance()->setY(y); return 0; } int w_setPosition(lua_State *L) { - int x = luaL_checkint(L, 1); - int y = luaL_checkint(L, 2); + double x = luaL_checknumber(L, 1); + double y = luaL_checknumber(L, 2); instance()->setPosition(x, y); return 0; } int w_isDown(lua_State *L) { - Mouse::Button b; - unsigned int num = lua_gettop(L); - Mouse::Button *buttonlist = new Mouse::Button[num+1]; - unsigned int counter = 0; + int num = lua_gettop(L); + std::vector buttons; + buttons.reserve(num); - for (unsigned int i = 0; i < num; i++) - { - if (Mouse::getConstant(luaL_checkstring(L, i+1), b)) - buttonlist[counter++] = b; - } - buttonlist[counter] = Mouse::BUTTON_MAX_ENUM; + for (int i = 0; i < num; i++) + buttons.push_back((int) luaL_checknumber(L, i + 1)); - luax_pushboolean(L, instance()->isDown(buttonlist)); - delete[] buttonlist; + luax_pushboolean(L, instance()->isDown(buttons)); return 1; } @@ -242,7 +236,7 @@ extern "C" int luaopen_love_mouse(lua_State *L) WrappedModule w; w.module = instance; w.name = "mouse"; - w.flags = MODULE_T; + w.type = MODULE_ID; w.functions = functions; w.types = types; diff --git a/jni/love/src/modules/physics/box2d/Body.cpp b/jni/love/src/modules/physics/box2d/Body.cpp index e6232ef9..998685d4 100644 --- a/jni/love/src/modules/physics/box2d/Body.cpp +++ b/jni/love/src/modules/physics/box2d/Body.cpp @@ -435,7 +435,7 @@ int Body::getFixtureList(lua_State *L) const Fixture *fixture = (Fixture *)Memoizer::find(f); if (!fixture) throw love::Exception("A fixture has escaped Memoizer!"); - luax_pushtype(L, "Fixture", PHYSICS_FIXTURE_T, fixture); + luax_pushtype(L, PHYSICS_FIXTURE_ID, fixture); lua_rawseti(L, -2, i); i++; } @@ -482,8 +482,8 @@ int Body::getContactList(lua_State *L) const contact = new Contact(ce->contact); else contact->retain(); - - luax_pushtype(L, "Contact", PHYSICS_CONTACT_T, contact); + + luax_pushtype(L, PHYSICS_CONTACT_ID, contact); contact->release(); lua_rawseti(L, -2, i); i++; diff --git a/jni/love/src/modules/physics/box2d/ChainShape.cpp b/jni/love/src/modules/physics/box2d/ChainShape.cpp index 4c778a3d..b85f4ed2 100644 --- a/jni/love/src/modules/physics/box2d/ChainShape.cpp +++ b/jni/love/src/modules/physics/box2d/ChainShape.cpp @@ -76,7 +76,7 @@ EdgeShape *ChainShape::getChildEdge(int index) const { c->GetChildEdge(e, index); } - catch (love::Exception &ex) + catch (love::Exception &) { delete e; throw; @@ -85,12 +85,6 @@ EdgeShape *ChainShape::getChildEdge(int index) const return new EdgeShape(e, true); } -int ChainShape::getChildCount() const -{ - b2ChainShape *c = (b2ChainShape *)shape; - return c->GetChildCount(); -} - int ChainShape::getVertexCount() const { b2ChainShape *c = (b2ChainShape *)shape; diff --git a/jni/love/src/modules/physics/box2d/ChainShape.h b/jni/love/src/modules/physics/box2d/ChainShape.h index f2defdf0..74c7b6dd 100644 --- a/jni/love/src/modules/physics/box2d/ChainShape.h +++ b/jni/love/src/modules/physics/box2d/ChainShape.h @@ -63,11 +63,6 @@ public: **/ void setPreviousVertex(float x, float y); - /** - * Gets the number of children shapes. - **/ - int getChildCount() const; - /** * Returns a child EdgeShape. * @param index The index of the child shape. diff --git a/jni/love/src/modules/physics/box2d/Fixture.cpp b/jni/love/src/modules/physics/box2d/Fixture.cpp index 92dda491..ff014355 100644 --- a/jni/love/src/modules/physics/box2d/Fixture.cpp +++ b/jni/love/src/modules/physics/box2d/Fixture.cpp @@ -263,7 +263,7 @@ int Fixture::rayCast(lua_State *L) const float p2x = Physics::scaleDown((float)luaL_checknumber(L, 3)); float p2y = Physics::scaleDown((float)luaL_checknumber(L, 4)); float maxFraction = (float)luaL_checknumber(L, 5); - int childIndex = (int)luaL_optint(L, 6, 1) - 1; // Convert from 1-based index + int childIndex = (int) luaL_optnumber(L, 6, 1) - 1; // Convert from 1-based index b2RayCastInput input; input.p1.Set(p1x, p1y); input.p2.Set(p2x, p2y); @@ -279,7 +279,7 @@ int Fixture::rayCast(lua_State *L) const int Fixture::getBoundingBox(lua_State *L) const { - int childIndex = (int)luaL_optint(L, 1, 1) - 1; // Convert from 1-based index + int childIndex = (int) luaL_optnumber(L, 1, 1) - 1; // Convert from 1-based index b2AABB box = fixture->GetAABB(childIndex); box = Physics::scaleUp(box); lua_pushnumber(L, box.lowerBound.x); diff --git a/jni/love/src/modules/physics/box2d/Joint.cpp b/jni/love/src/modules/physics/box2d/Joint.cpp index 61aca42c..acc76d54 100644 --- a/jni/love/src/modules/physics/box2d/Joint.cpp +++ b/jni/love/src/modules/physics/box2d/Joint.cpp @@ -213,7 +213,7 @@ int Joint::getUserData(lua_State *L) udata->ref->push(L); else lua_pushnil(L); - + return 1; } diff --git a/jni/love/src/modules/physics/box2d/MotorJoint.h b/jni/love/src/modules/physics/box2d/MotorJoint.h index e677ca64..530ed50d 100644 --- a/jni/love/src/modules/physics/box2d/MotorJoint.h +++ b/jni/love/src/modules/physics/box2d/MotorJoint.h @@ -69,7 +69,7 @@ public: /// Get the position correction factor in the range [0,1]. float getCorrectionFactor() const; - + private: // The Box2D MotorJoint object. diff --git a/jni/love/src/modules/physics/box2d/Physics.cpp b/jni/love/src/modules/physics/box2d/Physics.cpp index 7e404496..f6b10d0f 100644 --- a/jni/love/src/modules/physics/box2d/Physics.cpp +++ b/jni/love/src/modules/physics/box2d/Physics.cpp @@ -97,7 +97,7 @@ int Physics::newPolygonShape(lua_State *L) bool istable = lua_istable(L, 1); if (istable) - argc = lua_objlen(L, 1); + argc = (int) luax_objlen(L, 1); if (argc % 2 != 0) return luaL_error(L, "Number of vertex components must be a multiple of two."); @@ -146,7 +146,7 @@ int Physics::newPolygonShape(lua_State *L) } PolygonShape *p = new PolygonShape(s); - luax_pushtype(L, "PolygonShape", PHYSICS_POLYGON_SHAPE_T, p); + luax_pushtype(L, PHYSICS_POLYGON_SHAPE_ID, p); p->release(); return 1; } @@ -158,12 +158,12 @@ int Physics::newChainShape(lua_State *L) bool istable = lua_istable(L, 2); if (istable) - argc = lua_objlen(L, 2); + argc = (int) luax_objlen(L, 2); if (argc % 2 != 0) return luaL_error(L, "Number of vertex components must be a multiple of two."); - int vcount = (int)argc/2; + int vcount = argc/2; bool loop = luax_toboolean(L, 1); b2Vec2 *vecs = new b2Vec2[vcount]; @@ -208,7 +208,7 @@ int Physics::newChainShape(lua_State *L) delete[] vecs; ChainShape *c = new ChainShape(s); - luax_pushtype(L, "ChainShape", PHYSICS_CHAIN_SHAPE_T, c); + luax_pushtype(L, PHYSICS_CHAIN_SHAPE_ID, c); c->release(); return 1; } @@ -281,8 +281,8 @@ Fixture *Physics::newFixture(Body *body, Shape *shape, float density) int Physics::getDistance(lua_State *L) { - Fixture *fixtureA = luax_checktype(L, 1, "Fixture", PHYSICS_FIXTURE_T); - Fixture *fixtureB = luax_checktype(L, 2, "Fixture", PHYSICS_FIXTURE_T); + Fixture *fixtureA = luax_checktype(L, 1, PHYSICS_FIXTURE_ID); + Fixture *fixtureB = luax_checktype(L, 2, PHYSICS_FIXTURE_ID); b2DistanceProxy pA, pB; b2DistanceInput i; b2DistanceOutput o; diff --git a/jni/love/src/modules/physics/box2d/Shape.cpp b/jni/love/src/modules/physics/box2d/Shape.cpp index e82ba15a..41412d0b 100644 --- a/jni/love/src/modules/physics/box2d/Shape.cpp +++ b/jni/love/src/modules/physics/box2d/Shape.cpp @@ -105,7 +105,7 @@ int Shape::rayCast(lua_State *L) const float x = Physics::scaleDown((float)luaL_checknumber(L, 6)); float y = Physics::scaleDown((float)luaL_checknumber(L, 7)); float r = (float)luaL_checknumber(L, 8); - int childIndex = (int)luaL_optint(L, 9, 1) - 1; // Convert from 1-based index + int childIndex = (int) luaL_optnumber(L, 9, 1) - 1; // Convert from 1-based index b2RayCastInput input; input.p1.Set(p1x, p1y); input.p2.Set(p2x, p2y); @@ -125,7 +125,7 @@ int Shape::computeAABB(lua_State *L) const float x = Physics::scaleDown((float)luaL_checknumber(L, 1)); float y = Physics::scaleDown((float)luaL_checknumber(L, 2)); float r = (float)luaL_checknumber(L, 3); - int childIndex = (int)luaL_optint(L, 4, 1) - 1; // Convert from 1-based index + int childIndex = (int) luaL_optnumber(L, 4, 1) - 1; // Convert from 1-based index b2Transform transform(b2Vec2(x, y), b2Rot(r)); b2AABB box; shape->ComputeAABB(&box, transform, childIndex); diff --git a/jni/love/src/modules/physics/box2d/World.cpp b/jni/love/src/modules/physics/box2d/World.cpp index 1bafc838..ef151a7a 100644 --- a/jni/love/src/modules/physics/box2d/World.cpp +++ b/jni/love/src/modules/physics/box2d/World.cpp @@ -35,20 +35,20 @@ namespace box2d { World::ContactCallback::ContactCallback() - : ref(0) + : ref(nullptr) { } World::ContactCallback::~ContactCallback() { - if (ref != 0) + if (ref != nullptr) delete ref; } void World::ContactCallback::process(b2Contact *contact, const b2ContactImpulse *impulse) { // Process contacts. - if (ref != 0) + if (ref != nullptr) { lua_State *L = ref->getL(); ref->push(); @@ -56,8 +56,8 @@ void World::ContactCallback::process(b2Contact *contact, const b2ContactImpulse // Push first fixture. { Fixture *a = (Fixture *)Memoizer::find(contact->GetFixtureA()); - if (a != 0) - luax_pushtype(L, "Fixture", PHYSICS_FIXTURE_T, a); + if (a != nullptr) + luax_pushtype(L, PHYSICS_FIXTURE_ID, a); else throw love::Exception("A fixture has escaped Memoizer!"); } @@ -65,8 +65,8 @@ void World::ContactCallback::process(b2Contact *contact, const b2ContactImpulse // Push second fixture. { Fixture *b = (Fixture *)Memoizer::find(contact->GetFixtureB()); - if (b != 0) - luax_pushtype(L, "Fixture", PHYSICS_FIXTURE_T, b); + if (b != nullptr) + luax_pushtype(L, PHYSICS_FIXTURE_ID, b); else throw love::Exception("A fixture has escaped Memoizer!"); } @@ -77,7 +77,7 @@ void World::ContactCallback::process(b2Contact *contact, const b2ContactImpulse else cobj->retain(); - luax_pushtype(L, "Contact", (PHYSICS_CONTACT_T), cobj); + luax_pushtype(L, PHYSICS_CONTACT_ID, cobj); cobj->release(); int args = 3; @@ -96,13 +96,13 @@ void World::ContactCallback::process(b2Contact *contact, const b2ContactImpulse } World::ContactFilter::ContactFilter() - : ref(0) + : ref(nullptr) { } World::ContactFilter::~ContactFilter() { - if (ref != 0) + if (ref != nullptr) delete ref; } @@ -124,12 +124,12 @@ bool World::ContactFilter::process(Fixture *a, Fixture *b) (filterB[1] & filterA[0]) == 0) return false; // A and B aren't set to collide - if (ref != 0) + if (ref != nullptr) { lua_State *L = ref->getL(); ref->push(); - luax_pushtype(L, "Fixture", PHYSICS_FIXTURE_T, a); - luax_pushtype(L, "Fixture", PHYSICS_FIXTURE_T, b); + luax_pushtype(L, PHYSICS_FIXTURE_ID, a); + luax_pushtype(L, PHYSICS_FIXTURE_ID, b); lua_call(L, 2, 1); return luax_toboolean(L, -1); } @@ -137,26 +137,26 @@ bool World::ContactFilter::process(Fixture *a, Fixture *b) } World::QueryCallback::QueryCallback() - : ref(0) + : ref(nullptr) { } World::QueryCallback::~QueryCallback() { - if (ref != 0) + if (ref != nullptr) delete ref; } bool World::QueryCallback::ReportFixture(b2Fixture *fixture) { - if (ref != 0) + if (ref != nullptr) { lua_State *L = ref->getL(); ref->push(); Fixture *f = (Fixture *)Memoizer::find(fixture); if (!f) throw love::Exception("A fixture has escaped Memoizer!"); - luax_pushtype(L, "Fixture", PHYSICS_FIXTURE_T, f); + luax_pushtype(L, PHYSICS_FIXTURE_ID, f); lua_call(L, 1, 1); return luax_toboolean(L, -1); } @@ -164,26 +164,26 @@ bool World::QueryCallback::ReportFixture(b2Fixture *fixture) } World::RayCastCallback::RayCastCallback() - : ref(0) + : ref(nullptr) { } World::RayCastCallback::~RayCastCallback() { - if (ref != 0) + if (ref != nullptr) delete ref; } float32 World::RayCastCallback::ReportFixture(b2Fixture *fixture, const b2Vec2 &point, const b2Vec2 &normal, float32 fraction) { - if (ref != 0) + if (ref != nullptr) { lua_State *L = ref->getL(); ref->push(); Fixture *f = (Fixture *)Memoizer::find(fixture); if (!f) throw love::Exception("A fixture has escaped Memoizer!"); - luax_pushtype(L, "Fixture", PHYSICS_FIXTURE_T, f); + luax_pushtype(L, PHYSICS_FIXTURE_ID, f); b2Vec2 scaledPoint = Physics::scaleUp(point); lua_pushnumber(L, scaledPoint.x); lua_pushnumber(L, scaledPoint.y); @@ -213,7 +213,8 @@ void World::SayGoodbye(b2Joint *joint) } World::World() - : world(NULL), destructWorld(false) + : world(nullptr) + , destructWorld(false) { world = new b2World(b2Vec2(0,0)); this->retain(); // The Box2D world holds a reference to this World. @@ -227,7 +228,8 @@ World::World() } World::World(b2Vec2 gravity, bool sleep) - : world(NULL), destructWorld(false) + : world(nullptr) + , destructWorld(false) { world = new b2World(Physics::scaleDown(gravity)); // The Box2D world holds a reference to this World. @@ -252,7 +254,7 @@ void World::update(float dt) // Destroy all objects marked during the time step. for (Body *b : destructBodies) { - if (b->body != 0) b->destroy(); + if (b->body != nullptr) b->destroy(); // Release for reference in vector. b->release(); } @@ -314,34 +316,55 @@ bool World::ShouldCollide(b2Fixture *fixtureA, b2Fixture *fixtureB) bool World::isValid() const { - return world != 0; + return world != nullptr; } int World::setCallbacks(lua_State *L) { - int n = lua_gettop(L); - luax_assert_argc(L, 1, 4); + int nargs = lua_gettop(L); - switch (n) + for (int i = 1; i <= 4; i++) { - case 4: - if (postsolve.ref) - delete postsolve.ref; - postsolve.ref = luax_refif(L, LUA_TFUNCTION); - case 3: - if (presolve.ref) - delete presolve.ref; - presolve.ref = luax_refif(L, LUA_TFUNCTION); - case 2: - if (end.ref) - delete end.ref; - end.ref = luax_refif(L, LUA_TFUNCTION); - case 1: - if (begin.ref) - delete begin.ref; + if (!lua_isnoneornil(L, i)) + luaL_checktype(L, i, LUA_TFUNCTION); + } + + delete begin.ref; + begin.ref = nullptr; + + delete end.ref; + end.ref = nullptr; + + delete presolve.ref; + presolve.ref = nullptr; + + delete postsolve.ref; + postsolve.ref = nullptr; + + if (nargs >= 1) + { + lua_pushvalue(L, 1); begin.ref = luax_refif(L, LUA_TFUNCTION); } + if (nargs >= 2) + { + lua_pushvalue(L, 2); + end.ref = luax_refif(L, LUA_TFUNCTION); + } + + if (nargs >= 3) + { + lua_pushvalue(L, 3); + presolve.ref = luax_refif(L, LUA_TFUNCTION); + } + + if (nargs >= 4) + { + lua_pushvalue(L, 4); + postsolve.ref = luax_refif(L, LUA_TFUNCTION); + } + return 0; } @@ -356,7 +379,9 @@ int World::getCallbacks(lua_State *L) int World::setContactFilter(lua_State *L) { - luax_assert_argc(L, 1); + if (!lua_isnoneornil(L, 1)) + luaL_checktype(L, 1, LUA_TFUNCTION); + if (filter.ref) delete filter.ref; filter.ref = luax_refif(L, LUA_TFUNCTION); @@ -431,7 +456,7 @@ int World::getBodyList(lua_State *L) const Body *body = (Body *)Memoizer::find(b); if (!body) throw love::Exception("A body has escaped Memoizer!"); - luax_pushtype(L, "Body", PHYSICS_BODY_T, body); + luax_pushtype(L, PHYSICS_BODY_ID, body); lua_rawseti(L, -2, i); i++; } @@ -449,7 +474,7 @@ int World::getJointList(lua_State *L) const if (!j) break; Joint *joint = (Joint *)Memoizer::find(j); if (!joint) throw love::Exception("A joint has escaped Memoizer!"); - luax_pushtype(L, "Joint", PHYSICS_JOINT_T, joint); + luax_pushtype(L, PHYSICS_JOINT_ID, joint); lua_rawseti(L, -2, i); i++; } @@ -470,7 +495,7 @@ int World::getContactList(lua_State *L) const contact = new Contact(c); else contact->retain(); - luax_pushtype(L, "Contact", PHYSICS_CONTACT_T, contact); + luax_pushtype(L, PHYSICS_CONTACT_ID, contact); contact->release(); lua_rawseti(L, -2, i); i++; @@ -486,7 +511,6 @@ b2Body *World::getGroundBody() const int World::queryBoundingBox(lua_State *L) { - luax_assert_argc(L, 5); b2AABB box; float lx = (float)luaL_checknumber(L, 1); float ly = (float)luaL_checknumber(L, 2); @@ -494,6 +518,7 @@ int World::queryBoundingBox(lua_State *L) float uy = (float)luaL_checknumber(L, 4); box.lowerBound = Physics::scaleDown(b2Vec2(lx, ly)); box.upperBound = Physics::scaleDown(b2Vec2(ux, uy)); + luaL_checktype(L, 5, LUA_TFUNCTION); if (query.ref) delete query.ref; query.ref = luax_refif(L, LUA_TFUNCTION); world->QueryAABB(&query, box); @@ -502,13 +527,13 @@ int World::queryBoundingBox(lua_State *L) int World::rayCast(lua_State *L) { - luax_assert_argc(L, 5); float x1 = (float)luaL_checknumber(L, 1); float y1 = (float)luaL_checknumber(L, 2); float x2 = (float)luaL_checknumber(L, 3); float y2 = (float)luaL_checknumber(L, 4); b2Vec2 v1 = Physics::scaleDown(b2Vec2(x1, y1)); b2Vec2 v2 = Physics::scaleDown(b2Vec2(x2, y2)); + luaL_checktype(L, 5, LUA_TFUNCTION); if (raycast.ref) delete raycast.ref; raycast.ref = luax_refif(L, LUA_TFUNCTION); @@ -541,7 +566,7 @@ void World::destroy() world->DestroyBody(groundBody); Memoizer::remove(world); delete world; - world = 0; + world = nullptr; // Box2D world destroyed. Release its reference. this->release(); diff --git a/jni/love/src/modules/physics/box2d/wrap_Body.cpp b/jni/love/src/modules/physics/box2d/wrap_Body.cpp index 786fe9cb..edd8dfea 100644 --- a/jni/love/src/modules/physics/box2d/wrap_Body.cpp +++ b/jni/love/src/modules/physics/box2d/wrap_Body.cpp @@ -30,7 +30,7 @@ namespace box2d Body *luax_checkbody(lua_State *L, int idx) { - Body *b = luax_checktype(L, idx, "Body", PHYSICS_BODY_T); + Body *b = luax_checktype(L, idx, PHYSICS_BODY_ID); if (b->body == 0) luaL_error(L, "Attempt to use destroyed body."); return b; @@ -526,7 +526,7 @@ int w_Body_getWorld(lua_State *L) { Body *t = luax_checkbody(L, 1); World *world = t->getWorld(); - luax_pushtype(L, "World", PHYSICS_WORLD_T, world); + luax_pushtype(L, PHYSICS_WORLD_ID, world); return 1; } @@ -566,7 +566,7 @@ int w_Body_destroy(lua_State *L) int w_Body_isDestroyed(lua_State *L) { - Body *b = luax_checktype(L, 1, "Body", PHYSICS_BODY_T); + Body *b = luax_checktype(L, 1, PHYSICS_BODY_ID); luax_pushboolean(L, b->body == nullptr); return 1; } @@ -650,7 +650,7 @@ static const luaL_Reg functions[] = extern "C" int luaopen_body(lua_State *L) { - return luax_register_type(L, "Body", functions); + return luax_register_type(L, PHYSICS_BODY_ID, functions); } } // box2d diff --git a/jni/love/src/modules/physics/box2d/wrap_ChainShape.cpp b/jni/love/src/modules/physics/box2d/wrap_ChainShape.cpp index 0f7b7b5a..952c4b11 100644 --- a/jni/love/src/modules/physics/box2d/wrap_ChainShape.cpp +++ b/jni/love/src/modules/physics/box2d/wrap_ChainShape.cpp @@ -31,7 +31,7 @@ namespace box2d ChainShape *luax_checkchainshape(lua_State *L, int idx) { - return luax_checktype(L, idx, "ChainShape", PHYSICS_CHAIN_SHAPE_T); + return luax_checktype(L, idx, PHYSICS_CHAIN_SHAPE_ID); } int w_ChainShape_setNextVertex(lua_State *L) @@ -52,20 +52,13 @@ int w_ChainShape_setPreviousVertex(lua_State *L) return 0; } -int w_ChainShape_getChildCount(lua_State *L) -{ - ChainShape *c = luax_checkchainshape(L, 1); - lua_pushinteger(L, c->getChildCount()); - return 1; -} - int w_ChainShape_getChildEdge(lua_State *L) { ChainShape *c = luax_checkchainshape(L, 1); - int index = luaL_checkint(L, 2) - 1; // Convert from 1-based index + int index = (int) luaL_checknumber(L, 2) - 1; // Convert from 1-based index EdgeShape *e = 0; luax_catchexcept(L, [&](){ e = c->getChildEdge(index); }); - luax_pushtype(L, "EdgeShape", PHYSICS_EDGE_SHAPE_T, e); + luax_pushtype(L, PHYSICS_EDGE_SHAPE_ID, e); e->release(); return 1; } @@ -81,7 +74,7 @@ int w_ChainShape_getVertexCount(lua_State *L) int w_ChainShape_getPoint(lua_State *L) { ChainShape *c = luax_checkchainshape(L, 1); - int index = luaL_checkint(L, 2) - 1; // Convert from 1-based index + int index = (int) luaL_checknumber(L, 2) - 1; // Convert from 1-based index b2Vec2 v; luax_catchexcept(L, [&](){ v = c->getPoint(index); }); lua_pushnumber(L, v.x); @@ -109,7 +102,6 @@ static const luaL_Reg functions[] = { { "setNextVertex", w_ChainShape_setNextVertex }, { "setPreviousVertex", w_ChainShape_setPreviousVertex }, - { "getChildCount", w_ChainShape_getChildCount }, { "getChildEdge", w_ChainShape_getChildEdge }, { "getVertexCount", w_ChainShape_getVertexCount }, { "getPoint", w_ChainShape_getPoint }, @@ -127,7 +119,7 @@ static const luaL_Reg functions[] = extern "C" int luaopen_chainshape(lua_State *L) { - return luax_register_type(L, "ChainShape", functions); + return luax_register_type(L, PHYSICS_CHAIN_SHAPE_ID, functions); } } // box2d diff --git a/jni/love/src/modules/physics/box2d/wrap_ChainShape.h b/jni/love/src/modules/physics/box2d/wrap_ChainShape.h index 2a2f878f..312730fc 100644 --- a/jni/love/src/modules/physics/box2d/wrap_ChainShape.h +++ b/jni/love/src/modules/physics/box2d/wrap_ChainShape.h @@ -37,7 +37,6 @@ ChainShape *luax_checkchainshape(lua_State *L, int idx); int w_ChainShape_setNextVertex(lua_State *L); int w_ChainShape_setPreviousVertex(lua_State *L); -int w_ChainShape_getChildCount(lua_State *L); int w_ChainShape_getChildEdge(lua_State *L); int w_ChainShape_getVertexCount(lua_State *L); int w_ChainShape_getPoint(lua_State *L); diff --git a/jni/love/src/modules/physics/box2d/wrap_CircleShape.cpp b/jni/love/src/modules/physics/box2d/wrap_CircleShape.cpp index 85610b86..b3a02789 100644 --- a/jni/love/src/modules/physics/box2d/wrap_CircleShape.cpp +++ b/jni/love/src/modules/physics/box2d/wrap_CircleShape.cpp @@ -29,7 +29,7 @@ namespace box2d CircleShape *luax_checkcircleshape(lua_State *L, int idx) { - return luax_checktype(L, idx, "CircleShape", PHYSICS_CIRCLE_SHAPE_T); + return luax_checktype(L, idx, PHYSICS_CIRCLE_SHAPE_ID); } int w_CircleShape_getRadius(lua_State *L) @@ -83,7 +83,7 @@ static const luaL_Reg functions[] = extern "C" int luaopen_circleshape(lua_State *L) { - return luax_register_type(L, "CircleShape", functions); + return luax_register_type(L, PHYSICS_CIRCLE_SHAPE_ID, functions); } } // box2d diff --git a/jni/love/src/modules/physics/box2d/wrap_Contact.cpp b/jni/love/src/modules/physics/box2d/wrap_Contact.cpp index bb02f60c..4a3a7cef 100644 --- a/jni/love/src/modules/physics/box2d/wrap_Contact.cpp +++ b/jni/love/src/modules/physics/box2d/wrap_Contact.cpp @@ -30,7 +30,7 @@ namespace box2d Contact *luax_checkcontact(lua_State *L, int idx) { - Contact *c = luax_checktype(L, idx, "Contact", PHYSICS_CONTACT_T); + Contact *c = luax_checktype(L, idx, PHYSICS_CONTACT_ID); if (!c->isValid()) luaL_error(L, "Attempt to use destroyed contact."); return c; @@ -146,14 +146,14 @@ int w_Contact_getFixtures(lua_State *L) Fixture *b = nullptr; luax_catchexcept(L, [&](){ t->getFixtures(a, b); }); - luax_pushtype(L, "Fixture", PHYSICS_FIXTURE_T, a); - luax_pushtype(L, "Fixture", PHYSICS_FIXTURE_T, b); + luax_pushtype(L, PHYSICS_FIXTURE_ID, a); + luax_pushtype(L, PHYSICS_FIXTURE_ID, b); return 2; } int w_Contact_isDestroyed(lua_State *L) { - Contact *c = luax_checktype(L, 1, "Contact", PHYSICS_CONTACT_T); + Contact *c = luax_checktype(L, 1, PHYSICS_CONTACT_ID); luax_pushboolean(L, !c->isValid()); return 1; } @@ -181,7 +181,7 @@ extern "C" int luaopen_contact(lua_State *L) { 0, 0 } }; - return luax_register_type(L, "Contact", functions); + return luax_register_type(L, PHYSICS_CONTACT_ID, functions); } } // box2d diff --git a/jni/love/src/modules/physics/box2d/wrap_DistanceJoint.cpp b/jni/love/src/modules/physics/box2d/wrap_DistanceJoint.cpp index 1d16d967..5f06cdfc 100644 --- a/jni/love/src/modules/physics/box2d/wrap_DistanceJoint.cpp +++ b/jni/love/src/modules/physics/box2d/wrap_DistanceJoint.cpp @@ -29,7 +29,7 @@ namespace box2d DistanceJoint *luax_checkdistancejoint(lua_State *L, int idx) { - DistanceJoint *j = luax_checktype(L, idx, "DistanceJoint", PHYSICS_DISTANCE_JOINT_T); + DistanceJoint *j = luax_checktype(L, idx, PHYSICS_DISTANCE_JOINT_ID); if (!j->isValid()) luaL_error(L, "Attempt to use destroyed joint."); return j; @@ -104,7 +104,7 @@ static const luaL_Reg functions[] = extern "C" int luaopen_distancejoint(lua_State *L) { - return luax_register_type(L, "DistanceJoint", functions); + return luax_register_type(L, PHYSICS_DISTANCE_JOINT_ID, functions); } } // box2d diff --git a/jni/love/src/modules/physics/box2d/wrap_EdgeShape.cpp b/jni/love/src/modules/physics/box2d/wrap_EdgeShape.cpp index fb106486..9caafbdc 100644 --- a/jni/love/src/modules/physics/box2d/wrap_EdgeShape.cpp +++ b/jni/love/src/modules/physics/box2d/wrap_EdgeShape.cpp @@ -29,7 +29,7 @@ namespace box2d EdgeShape *luax_checkedgeshape(lua_State *L, int idx) { - return luax_checktype(L, idx, "EdgeShape", PHYSICS_EDGE_SHAPE_T); + return luax_checktype(L, idx, PHYSICS_EDGE_SHAPE_ID); } int w_EdgeShape_getPoints(lua_State *L) @@ -55,7 +55,7 @@ static const luaL_Reg functions[] = extern "C" int luaopen_edgeshape(lua_State *L) { - return luax_register_type(L, "EdgeShape", functions); + return luax_register_type(L, PHYSICS_EDGE_SHAPE_ID, functions); } } // box2d diff --git a/jni/love/src/modules/physics/box2d/wrap_Fixture.cpp b/jni/love/src/modules/physics/box2d/wrap_Fixture.cpp index 907cf14b..1bd1b54e 100644 --- a/jni/love/src/modules/physics/box2d/wrap_Fixture.cpp +++ b/jni/love/src/modules/physics/box2d/wrap_Fixture.cpp @@ -30,7 +30,7 @@ namespace box2d Fixture *luax_checkfixture(lua_State *L, int idx) { - Fixture *f = luax_checktype(L, idx, "Fixture", PHYSICS_FIXTURE_T); + Fixture *f = luax_checktype(L, idx, PHYSICS_FIXTURE_ID); if (!f->isValid()) luaL_error(L, "Attempt to use destroyed fixture."); return f; @@ -111,7 +111,7 @@ int w_Fixture_getBody(lua_State *L) Body *body = t->getBody(); if (body == 0) return 0; - luax_pushtype(L, "Body", PHYSICS_BODY_T, body); + luax_pushtype(L, PHYSICS_BODY_ID, body); return 1; } @@ -124,19 +124,19 @@ int w_Fixture_getShape(lua_State *L) switch (shape->getType()) { case Shape::SHAPE_EDGE: - luax_pushtype(L, "EdgeShape", PHYSICS_EDGE_SHAPE_T, shape); + luax_pushtype(L, PHYSICS_EDGE_SHAPE_ID, shape); break; case Shape::SHAPE_CHAIN: - luax_pushtype(L, "ChainShape", PHYSICS_CHAIN_SHAPE_T, shape); + luax_pushtype(L, PHYSICS_CHAIN_SHAPE_ID, shape); break; case Shape::SHAPE_CIRCLE: - luax_pushtype(L, "CircleShape", PHYSICS_CIRCLE_SHAPE_T, shape); + luax_pushtype(L, PHYSICS_CIRCLE_SHAPE_ID, shape); break; case Shape::SHAPE_POLYGON: - luax_pushtype(L, "PolygonShape", PHYSICS_POLYGON_SHAPE_T, shape); + luax_pushtype(L, PHYSICS_POLYGON_SHAPE_ID, shape); break; default: - luax_pushtype(L, "Shape", PHYSICS_SHAPE_T, shape); + luax_pushtype(L, PHYSICS_SHAPE_ID, shape); break; } shape->release(); @@ -165,9 +165,9 @@ int w_Fixture_setFilterData(lua_State *L) { Fixture *t = luax_checkfixture(L, 1); int v[3]; - v[0] = luaL_checkint(L, 2); - v[1] = luaL_checkint(L, 3); - v[2] = luaL_checkint(L, 4); + v[0] = (int) luaL_checknumber(L, 2); + v[1] = (int) luaL_checknumber(L, 3); + v[2] = (int) luaL_checknumber(L, 4); t->setFilterData(v); return 0; } @@ -250,7 +250,7 @@ int w_Fixture_getGroupIndex(lua_State *L) int w_Fixture_setGroupIndex(lua_State *L) { Fixture *t = luax_checkfixture(L, 1); - int i = luaL_checkint(L, 2); + int i = (int) luaL_checknumber(L, 2); t->setGroupIndex(i); return 0; } @@ -264,7 +264,7 @@ int w_Fixture_destroy(lua_State *L) int w_Fixture_isDestroyed(lua_State *L) { - Fixture *f = luax_checktype(L, 1, "Fixture", PHYSICS_FIXTURE_T); + Fixture *f = luax_checktype(L, 1, PHYSICS_FIXTURE_ID); luax_pushboolean(L, !f->isValid()); return 1; } @@ -303,7 +303,7 @@ static const luaL_Reg functions[] = extern "C" int luaopen_fixture(lua_State *L) { - return luax_register_type(L, "Fixture", functions); + return luax_register_type(L, PHYSICS_FIXTURE_ID, functions); } } // box2d diff --git a/jni/love/src/modules/physics/box2d/wrap_FrictionJoint.cpp b/jni/love/src/modules/physics/box2d/wrap_FrictionJoint.cpp index 94de9bb1..44b00786 100644 --- a/jni/love/src/modules/physics/box2d/wrap_FrictionJoint.cpp +++ b/jni/love/src/modules/physics/box2d/wrap_FrictionJoint.cpp @@ -30,7 +30,7 @@ namespace box2d FrictionJoint *luax_checkfrictionjoint(lua_State *L, int idx) { - FrictionJoint *j = luax_checktype(L, idx, "FrictionJoint", PHYSICS_FRICTION_JOINT_T); + FrictionJoint *j = luax_checktype(L, idx, PHYSICS_FRICTION_JOINT_ID); if (!j->isValid()) luaL_error(L, "Attempt to use destroyed joint."); return j; @@ -88,7 +88,7 @@ static const luaL_Reg functions[] = extern "C" int luaopen_frictionjoint(lua_State *L) { - return luax_register_type(L, "FrictionJoint", functions); + return luax_register_type(L, PHYSICS_FRICTION_JOINT_ID, functions); } } // box2d diff --git a/jni/love/src/modules/physics/box2d/wrap_GearJoint.cpp b/jni/love/src/modules/physics/box2d/wrap_GearJoint.cpp index 11733198..569be86c 100644 --- a/jni/love/src/modules/physics/box2d/wrap_GearJoint.cpp +++ b/jni/love/src/modules/physics/box2d/wrap_GearJoint.cpp @@ -30,7 +30,7 @@ namespace box2d GearJoint *luax_checkgearjoint(lua_State *L, int idx) { - GearJoint *j = luax_checktype(L, idx, "GearJoint", PHYSICS_GEAR_JOINT_T); + GearJoint *j = luax_checktype(L, idx, PHYSICS_GEAR_JOINT_ID); if (!j->isValid()) luaL_error(L, "Attempt to use destroyed joint."); return j; @@ -88,7 +88,7 @@ static const luaL_Reg functions[] = extern "C" int luaopen_gearjoint(lua_State *L) { - return luax_register_type(L, "GearJoint", functions); + return luax_register_type(L, PHYSICS_GEAR_JOINT_ID, functions); } } // box2d diff --git a/jni/love/src/modules/physics/box2d/wrap_Joint.cpp b/jni/love/src/modules/physics/box2d/wrap_Joint.cpp index 2f7026bd..249ac1bc 100644 --- a/jni/love/src/modules/physics/box2d/wrap_Joint.cpp +++ b/jni/love/src/modules/physics/box2d/wrap_Joint.cpp @@ -38,27 +38,27 @@ void luax_pushjoint(lua_State *L, Joint *j) switch (j->getType()) { case Joint::JOINT_DISTANCE: - return luax_pushtype(L, "DistanceJoint", PHYSICS_DISTANCE_JOINT_T, j); + return luax_pushtype(L, PHYSICS_DISTANCE_JOINT_ID, j); case Joint::JOINT_REVOLUTE: - return luax_pushtype(L, "RevoluteJoint", PHYSICS_REVOLUTE_JOINT_T, j); + return luax_pushtype(L, PHYSICS_REVOLUTE_JOINT_ID, j); case Joint::JOINT_PRISMATIC: - return luax_pushtype(L, "PrismaticJoint", PHYSICS_PRISMATIC_JOINT_T, j); + return luax_pushtype(L, PHYSICS_PRISMATIC_JOINT_ID, j); case Joint::JOINT_MOUSE: - return luax_pushtype(L, "MouseJoint", PHYSICS_MOUSE_JOINT_T, j); + return luax_pushtype(L, PHYSICS_MOUSE_JOINT_ID, j); case Joint::JOINT_PULLEY: - return luax_pushtype(L, "PulleyJoint", PHYSICS_PULLEY_JOINT_T, j); + return luax_pushtype(L, PHYSICS_PULLEY_JOINT_ID, j); case Joint::JOINT_GEAR: - return luax_pushtype(L, "GearJoint", PHYSICS_GEAR_JOINT_T, j); + return luax_pushtype(L, PHYSICS_GEAR_JOINT_ID, j); case Joint::JOINT_FRICTION: - return luax_pushtype(L, "FrictionJoint", PHYSICS_FRICTION_JOINT_T, j); + return luax_pushtype(L, PHYSICS_FRICTION_JOINT_ID, j); case Joint::JOINT_WELD: - return luax_pushtype(L, "WeldJoint", PHYSICS_WELD_JOINT_T, j); + return luax_pushtype(L, PHYSICS_WELD_JOINT_ID, j); case Joint::JOINT_WHEEL: - return luax_pushtype(L, "WheelJoint", PHYSICS_WHEEL_JOINT_T, j); + return luax_pushtype(L, PHYSICS_WHEEL_JOINT_ID, j); case Joint::JOINT_ROPE: - return luax_pushtype(L, "RopeJoint", PHYSICS_ROPE_JOINT_T, j); + return luax_pushtype(L, PHYSICS_ROPE_JOINT_ID, j); case Joint::JOINT_MOTOR: - return luax_pushtype(L, "MotorJoint", PHYSICS_MOTOR_JOINT_T, j); + return luax_pushtype(L, PHYSICS_MOTOR_JOINT_ID, j); default: return lua_pushnil(L); } @@ -66,7 +66,7 @@ void luax_pushjoint(lua_State *L, Joint *j) Joint *luax_checkjoint(lua_State *L, int idx) { - Joint *t = luax_checktype(L, idx, "Joint", PHYSICS_JOINT_T); + Joint *t = luax_checktype(L, idx, PHYSICS_JOINT_ID); if (!t->isValid()) luaL_error(L, "Attempt to use destroyed joint."); return t; @@ -92,8 +92,8 @@ int w_Joint_getBodies(lua_State *L) b2 = t->getBodyB(); }); - luax_pushtype(L, "Body", PHYSICS_BODY_T, b1); - luax_pushtype(L, "Body", PHYSICS_BODY_T, b2); + luax_pushtype(L, PHYSICS_BODY_ID, b1); + luax_pushtype(L, PHYSICS_BODY_ID, b2); return 2; } @@ -149,7 +149,7 @@ int w_Joint_destroy(lua_State *L) int w_Joint_isDestroyed(lua_State *L) { - Joint *t = luax_checktype(L, 1, "Joint", PHYSICS_JOINT_T); + Joint *t = luax_checktype(L, 1, PHYSICS_JOINT_ID); luax_pushboolean(L, !t->isValid()); return 1; } @@ -171,7 +171,7 @@ static const luaL_Reg functions[] = extern "C" int luaopen_joint(lua_State *L) { - return luax_register_type(L, "Joint", functions); + return luax_register_type(L, PHYSICS_JOINT_ID, functions); } } // box2d diff --git a/jni/love/src/modules/physics/box2d/wrap_MotorJoint.cpp b/jni/love/src/modules/physics/box2d/wrap_MotorJoint.cpp index e9ad2bc0..40d60d21 100644 --- a/jni/love/src/modules/physics/box2d/wrap_MotorJoint.cpp +++ b/jni/love/src/modules/physics/box2d/wrap_MotorJoint.cpp @@ -29,7 +29,7 @@ namespace box2d MotorJoint *luax_checkmotorjoint(lua_State *L, int idx) { - MotorJoint *j = luax_checktype(L, idx, "MotorJoint", PHYSICS_MOTOR_JOINT_T); + MotorJoint *j = luax_checktype(L, idx, PHYSICS_MOTOR_JOINT_ID); if (!j->isValid()) luaL_error(L, "Attempt to use destroyed joint."); return j; @@ -138,7 +138,7 @@ static const luaL_Reg functions[] = extern "C" int luaopen_motorjoint(lua_State *L) { - return luax_register_type(L, "MotorJoint", functions); + return luax_register_type(L, PHYSICS_MOTOR_JOINT_ID, functions); } diff --git a/jni/love/src/modules/physics/box2d/wrap_MouseJoint.cpp b/jni/love/src/modules/physics/box2d/wrap_MouseJoint.cpp index 5caa42db..0e9338fc 100644 --- a/jni/love/src/modules/physics/box2d/wrap_MouseJoint.cpp +++ b/jni/love/src/modules/physics/box2d/wrap_MouseJoint.cpp @@ -29,7 +29,7 @@ namespace box2d MouseJoint *luax_checkmousejoint(lua_State *L, int idx) { - MouseJoint *j = luax_checktype(L, idx, "MouseJoint", PHYSICS_MOUSE_JOINT_T); + MouseJoint *j = luax_checktype(L, idx, PHYSICS_MOUSE_JOINT_ID); if (!j->isValid()) luaL_error(L, "Attempt to use destroyed joint."); return j; @@ -122,7 +122,7 @@ static const luaL_Reg functions[] = extern "C" int luaopen_mousejoint(lua_State *L) { - return luax_register_type(L, "MouseJoint", functions); + return luax_register_type(L, PHYSICS_MOUSE_JOINT_ID, functions); } } // box2d diff --git a/jni/love/src/modules/physics/box2d/wrap_Physics.cpp b/jni/love/src/modules/physics/box2d/wrap_Physics.cpp index 31edec83..fa5fcd41 100644 --- a/jni/love/src/modules/physics/box2d/wrap_Physics.cpp +++ b/jni/love/src/modules/physics/box2d/wrap_Physics.cpp @@ -59,7 +59,7 @@ int w_newWorld(lua_State *L) World *w; luax_catchexcept(L, [&](){ w = instance()->newWorld(gx, gy, sleep); }); - luax_pushtype(L, "World", PHYSICS_WORLD_T, w); + luax_pushtype(L, PHYSICS_WORLD_ID, w); w->release(); return 1; @@ -67,7 +67,7 @@ int w_newWorld(lua_State *L) int w_newBody(lua_State *L) { - World *world = luax_checktype(L, 1, "World", PHYSICS_WORLD_T); + World *world = luax_checkworld(L, 1); float x = (float)luaL_optnumber(L, 2, 0.0); float y = (float)luaL_optnumber(L, 3, 0.0); @@ -78,7 +78,7 @@ int w_newBody(lua_State *L) Body *body; luax_catchexcept(L, [&](){ body = instance()->newBody(world, x, y, btype); }); - luax_pushtype(L, "Body", PHYSICS_BODY_T, body); + luax_pushtype(L, PHYSICS_BODY_ID, body); body->release(); return 1; } @@ -90,7 +90,7 @@ int w_newFixture(lua_State *L) float density = (float)luaL_optnumber(L, 3, 1.0f); Fixture *fixture; luax_catchexcept(L, [&](){ fixture = instance()->newFixture(body, shape, density); }); - luax_pushtype(L, "Fixture", PHYSICS_FIXTURE_T, fixture); + luax_pushtype(L, PHYSICS_FIXTURE_ID, fixture); fixture->release(); return 1; } @@ -104,7 +104,7 @@ int w_newCircleShape(lua_State *L) float radius = (float)luaL_checknumber(L, 1); CircleShape *shape; luax_catchexcept(L, [&](){ shape = instance()->newCircleShape(radius); }); - luax_pushtype(L, "CircleShape", PHYSICS_CIRCLE_SHAPE_T, shape); + luax_pushtype(L, PHYSICS_CIRCLE_SHAPE_ID, shape); shape->release(); return 1; } @@ -115,7 +115,7 @@ int w_newCircleShape(lua_State *L) float radius = (float)luaL_checknumber(L, 3); CircleShape *shape; luax_catchexcept(L, [&](){ shape = instance()->newCircleShape(x, y, radius); }); - luax_pushtype(L, "CircleShape", PHYSICS_CIRCLE_SHAPE_T, shape); + luax_pushtype(L, PHYSICS_CIRCLE_SHAPE_ID, shape); shape->release(); return 1; } @@ -133,7 +133,7 @@ int w_newRectangleShape(lua_State *L) float h = (float)luaL_checknumber(L, 2); PolygonShape *shape; luax_catchexcept(L, [&](){ shape = instance()->newRectangleShape(w, h); }); - luax_pushtype(L, "PolygonShape", PHYSICS_POLYGON_SHAPE_T, shape); + luax_pushtype(L, PHYSICS_POLYGON_SHAPE_ID, shape); shape->release(); return 1; } @@ -146,7 +146,7 @@ int w_newRectangleShape(lua_State *L) float angle = (float)luaL_optnumber(L, 5, 0); PolygonShape *shape; luax_catchexcept(L, [&](){ shape = instance()->newRectangleShape(x, y, w, h, angle); }); - luax_pushtype(L, "PolygonShape", PHYSICS_POLYGON_SHAPE_T, shape); + luax_pushtype(L, PHYSICS_POLYGON_SHAPE_ID, shape); shape->release(); return 1; } @@ -162,7 +162,7 @@ int w_newEdgeShape(lua_State *L) float y2 = (float)luaL_checknumber(L, 4); EdgeShape *shape; luax_catchexcept(L, [&](){ shape = instance()->newEdgeShape(x1, y1, x2, y2); }); - luax_pushtype(L, "EdgeShape", PHYSICS_EDGE_SHAPE_T, shape); + luax_pushtype(L, PHYSICS_EDGE_SHAPE_ID, shape); shape->release(); return 1; } @@ -183,8 +183,8 @@ int w_newChainShape(lua_State *L) int w_newDistanceJoint(lua_State *L) { - Body *body1 = luax_checktype(L, 1, "Body", PHYSICS_BODY_T); - Body *body2 = luax_checktype(L, 2, "Body", PHYSICS_BODY_T); + Body *body1 = luax_checkbody(L, 1); + Body *body2 = luax_checkbody(L, 2); float x1 = (float)luaL_checknumber(L, 3); float y1 = (float)luaL_checknumber(L, 4); float x2 = (float)luaL_checknumber(L, 5); @@ -194,27 +194,27 @@ int w_newDistanceJoint(lua_State *L) luax_catchexcept(L, [&]() { j = instance()->newDistanceJoint(body1, body2, x1, y1, x2, y2, collideConnected); }); - luax_pushtype(L, "DistanceJoint", PHYSICS_DISTANCE_JOINT_T, j); + luax_pushtype(L, PHYSICS_DISTANCE_JOINT_ID, j); j->release(); return 1; } int w_newMouseJoint(lua_State *L) { - Body *body = luax_checktype(L, 1, "Body", PHYSICS_BODY_T); + Body *body = luax_checkbody(L, 1); float x = (float)luaL_checknumber(L, 2); float y = (float)luaL_checknumber(L, 3); MouseJoint *j; luax_catchexcept(L, [&](){ j = instance()->newMouseJoint(body, x, y); }); - luax_pushtype(L, "MouseJoint", PHYSICS_MOUSE_JOINT_T, j); + luax_pushtype(L, PHYSICS_MOUSE_JOINT_ID, j); j->release(); return 1; } int w_newRevoluteJoint(lua_State *L) { - Body *body1 = luax_checktype(L, 1, "Body", PHYSICS_BODY_T); - Body *body2 = luax_checktype(L, 2, "Body", PHYSICS_BODY_T); + Body *body1 = luax_checkbody(L, 1); + Body *body2 = luax_checkbody(L, 2); float x = (float)luaL_checknumber(L, 3); float y = (float)luaL_checknumber(L, 4); bool collideConnected = luax_optboolean(L, 5, false); @@ -222,15 +222,15 @@ int w_newRevoluteJoint(lua_State *L) luax_catchexcept(L, [&]() { j = instance()->newRevoluteJoint(body1, body2, x, y, collideConnected); }); - luax_pushtype(L, "RevoluteJoint", PHYSICS_REVOLUTE_JOINT_T, j); + luax_pushtype(L, PHYSICS_REVOLUTE_JOINT_ID, j); j->release(); return 1; } int w_newPrismaticJoint(lua_State *L) { - Body *body1 = luax_checktype(L, 1, "Body", PHYSICS_BODY_T); - Body *body2 = luax_checktype(L, 2, "Body", PHYSICS_BODY_T); + Body *body1 = luax_checkbody(L, 1); + Body *body2 = luax_checkbody(L, 2); float xA = (float)luaL_checknumber(L, 3); float yA = (float)luaL_checknumber(L, 4); float xB, yB, ax, ay; @@ -255,15 +255,15 @@ int w_newPrismaticJoint(lua_State *L) luax_catchexcept(L, [&]() { j = instance()->newPrismaticJoint(body1, body2, xA, yA, xB, yB, ax, ay, collideConnected); }); - luax_pushtype(L, "PrismaticJoint", PHYSICS_PRISMATIC_JOINT_T, j); + luax_pushtype(L, PHYSICS_PRISMATIC_JOINT_ID, j); j->release(); return 1; } int w_newPulleyJoint(lua_State *L) { - Body *body1 = luax_checktype(L, 1, "Body", PHYSICS_BODY_T); - Body *body2 = luax_checktype(L, 2, "Body", PHYSICS_BODY_T); + Body *body1 = luax_checkbody(L, 1); + Body *body2 = luax_checkbody(L, 2); float gx1 = (float)luaL_checknumber(L, 3); float gy1 = (float)luaL_checknumber(L, 4); float gx2 = (float)luaL_checknumber(L, 5); @@ -279,15 +279,15 @@ int w_newPulleyJoint(lua_State *L) luax_catchexcept(L, [&]() { j = instance()->newPulleyJoint(body1, body2, b2Vec2(gx1,gy1), b2Vec2(gx2,gy2), b2Vec2(x1,y1), b2Vec2(x2,y2), ratio, collideConnected); }); - luax_pushtype(L, "PulleyJoint", PHYSICS_PULLEY_JOINT_T, j); + luax_pushtype(L, PHYSICS_PULLEY_JOINT_ID, j); j->release(); return 1; } int w_newGearJoint(lua_State *L) { - Joint *joint1 = luax_checktype(L, 1, "Joint", PHYSICS_JOINT_T); - Joint *joint2 = luax_checktype(L, 2, "Joint", PHYSICS_JOINT_T); + Joint *joint1 = luax_checkjoint(L, 1); + Joint *joint2 = luax_checkjoint(L, 2); float ratio = (float)luaL_optnumber(L, 3, 1.0); bool collideConnected = luax_optboolean(L, 4, false); @@ -295,15 +295,15 @@ int w_newGearJoint(lua_State *L) luax_catchexcept(L, [&]() { j = instance()->newGearJoint(joint1, joint2, ratio, collideConnected); }); - luax_pushtype(L, "GearJoint", PHYSICS_GEAR_JOINT_T, j); + luax_pushtype(L, PHYSICS_GEAR_JOINT_ID, j); j->release(); return 1; } int w_newFrictionJoint(lua_State *L) { - Body *body1 = luax_checktype(L, 1, "Body", PHYSICS_BODY_T); - Body *body2 = luax_checktype(L, 2, "Body", PHYSICS_BODY_T); + Body *body1 = luax_checkbody(L, 1); + Body *body2 = luax_checkbody(L, 2); float xA = (float)luaL_checknumber(L, 3); float yA = (float)luaL_checknumber(L, 4); float xB, yB; @@ -324,15 +324,15 @@ int w_newFrictionJoint(lua_State *L) luax_catchexcept(L, [&]() { j = instance()->newFrictionJoint(body1, body2, xA, yA, xB, yB, collideConnected); }); - luax_pushtype(L, "FrictionJoint", PHYSICS_FRICTION_JOINT_T, j); + luax_pushtype(L, PHYSICS_FRICTION_JOINT_ID, j); j->release(); return 1; } int w_newWeldJoint(lua_State *L) { - Body *body1 = luax_checktype(L, 1, "Body", PHYSICS_BODY_T); - Body *body2 = luax_checktype(L, 2, "Body", PHYSICS_BODY_T); + Body *body1 = luax_checkbody(L, 1); + Body *body2 = luax_checkbody(L, 2); float xA = (float)luaL_checknumber(L, 3); float yA = (float)luaL_checknumber(L, 4); float xB, yB; @@ -353,15 +353,15 @@ int w_newWeldJoint(lua_State *L) luax_catchexcept(L, [&]() { j = instance()->newWeldJoint(body1, body2, xA, yA, xB, yB, collideConnected); }); - luax_pushtype(L, "WeldJoint", PHYSICS_WELD_JOINT_T, j); + luax_pushtype(L, PHYSICS_WELD_JOINT_ID, j); j->release(); return 1; } int w_newWheelJoint(lua_State *L) { - Body *body1 = luax_checktype(L, 1, "Body", PHYSICS_BODY_T); - Body *body2 = luax_checktype(L, 2, "Body", PHYSICS_BODY_T); + Body *body1 = luax_checkbody(L, 1); + Body *body2 = luax_checkbody(L, 2); float xA = (float)luaL_checknumber(L, 3); float yA = (float)luaL_checknumber(L, 4); float xB, yB, ax, ay; @@ -387,15 +387,15 @@ int w_newWheelJoint(lua_State *L) luax_catchexcept(L, [&]() { j = instance()->newWheelJoint(body1, body2, xA, yA, xB, yB, ax, ay, collideConnected); }); - luax_pushtype(L, "WheelJoint", PHYSICS_WHEEL_JOINT_T, j); + luax_pushtype(L, PHYSICS_WHEEL_JOINT_ID, j); j->release(); return 1; } int w_newRopeJoint(lua_State *L) { - Body *body1 = luax_checktype(L, 1, "Body", PHYSICS_BODY_T); - Body *body2 = luax_checktype(L, 2, "Body", PHYSICS_BODY_T); + Body *body1 = luax_checkbody(L, 1); + Body *body2 = luax_checkbody(L, 2); float x1 = (float)luaL_checknumber(L, 3); float y1 = (float)luaL_checknumber(L, 4); float x2 = (float)luaL_checknumber(L, 5); @@ -406,15 +406,15 @@ int w_newRopeJoint(lua_State *L) luax_catchexcept(L, [&]() { j = instance()->newRopeJoint(body1, body2, x1, y1, x2, y2, maxLength, collideConnected); }); - luax_pushtype(L, "RopeJoint", PHYSICS_ROPE_JOINT_T, j); + luax_pushtype(L, PHYSICS_ROPE_JOINT_ID, j); j->release(); return 1; } int w_newMotorJoint(lua_State *L) { - Body *body1 = luax_checktype(L, 1, "Body", PHYSICS_BODY_T); - Body *body2 = luax_checktype(L, 2, "Body", PHYSICS_BODY_T); + Body *body1 = luax_checkbody(L, 1); + Body *body2 = luax_checkbody(L, 2); MotorJoint *j = 0; if (!lua_isnoneornil(L, 3)) { @@ -427,7 +427,7 @@ int w_newMotorJoint(lua_State *L) { luax_catchexcept(L, [&](){ j = instance()->newMotorJoint(body1, body2); }); } - luax_pushtype(L, "MotorJoint", PHYSICS_MOTOR_JOINT_T, j); + luax_pushtype(L, PHYSICS_MOTOR_JOINT_ID, j); j->release(); return 1; } @@ -439,7 +439,7 @@ int w_getDistance(lua_State *L) int w_setMeter(lua_State *L) { - int arg1 = luaL_checkint(L, 1); + int arg1 = (int) luaL_checknumber(L, 1); luax_catchexcept(L, [&](){ Physics::setMeter(arg1); }); return 0; @@ -517,7 +517,7 @@ extern "C" int luaopen_love_physics(lua_State *L) WrappedModule w; w.module = instance; w.name = "physics"; - w.flags = MODULE_T; + w.type = MODULE_ID; w.functions = functions; w.types = types; diff --git a/jni/love/src/modules/physics/box2d/wrap_PolygonShape.cpp b/jni/love/src/modules/physics/box2d/wrap_PolygonShape.cpp index 336703f3..b29ebd25 100644 --- a/jni/love/src/modules/physics/box2d/wrap_PolygonShape.cpp +++ b/jni/love/src/modules/physics/box2d/wrap_PolygonShape.cpp @@ -29,7 +29,7 @@ namespace box2d PolygonShape *luax_checkpolygonshape(lua_State *L, int idx) { - return luax_checktype(L, idx, "PolygonShape", PHYSICS_POLYGON_SHAPE_T); + return luax_checktype(L, idx, PHYSICS_POLYGON_SHAPE_ID); } int w_PolygonShape_getPoints(lua_State *L) @@ -63,7 +63,7 @@ static const luaL_Reg functions[] = extern "C" int luaopen_polygonshape(lua_State *L) { - return luax_register_type(L, "PolygonShape", functions); + return luax_register_type(L, PHYSICS_POLYGON_SHAPE_ID, functions); } } // box2d diff --git a/jni/love/src/modules/physics/box2d/wrap_PrismaticJoint.cpp b/jni/love/src/modules/physics/box2d/wrap_PrismaticJoint.cpp index 04f3c6e4..44e9628e 100644 --- a/jni/love/src/modules/physics/box2d/wrap_PrismaticJoint.cpp +++ b/jni/love/src/modules/physics/box2d/wrap_PrismaticJoint.cpp @@ -30,7 +30,7 @@ namespace box2d PrismaticJoint *luax_checkprismaticjoint(lua_State *L, int idx) { - PrismaticJoint *j = luax_checktype(L, idx, "PrismaticJoint", PHYSICS_PRISMATIC_JOINT_T); + PrismaticJoint *j = luax_checktype(L, idx, PHYSICS_PRISMATIC_JOINT_ID); if (!j->isValid()) luaL_error(L, "Attempt to use destroyed joint."); return j; @@ -199,7 +199,7 @@ static const luaL_Reg functions[] = extern "C" int luaopen_prismaticjoint(lua_State *L) { - return luax_register_type(L, "PrismaticJoint", functions); + return luax_register_type(L, PHYSICS_PRISMATIC_JOINT_ID, functions); } } // box2d diff --git a/jni/love/src/modules/physics/box2d/wrap_PulleyJoint.cpp b/jni/love/src/modules/physics/box2d/wrap_PulleyJoint.cpp index 18a7bb88..3a8c718f 100644 --- a/jni/love/src/modules/physics/box2d/wrap_PulleyJoint.cpp +++ b/jni/love/src/modules/physics/box2d/wrap_PulleyJoint.cpp @@ -29,7 +29,7 @@ namespace box2d PulleyJoint *luax_checkpulleyjoint(lua_State *L, int idx) { - PulleyJoint *j = luax_checktype(L, idx, "PulleyJoint", PHYSICS_PULLEY_JOINT_T); + PulleyJoint *j = luax_checktype(L, idx, PHYSICS_PULLEY_JOINT_ID); if (!j->isValid()) luaL_error(L, "Attempt to use destroyed joint."); return j; @@ -85,7 +85,7 @@ static const luaL_Reg functions[] = extern "C" int luaopen_pulleyjoint(lua_State *L) { - return luax_register_type(L, "PulleyJoint", functions); + return luax_register_type(L, PHYSICS_PULLEY_JOINT_ID, functions); } } // box2d diff --git a/jni/love/src/modules/physics/box2d/wrap_RevoluteJoint.cpp b/jni/love/src/modules/physics/box2d/wrap_RevoluteJoint.cpp index f61a991f..75ad5914 100644 --- a/jni/love/src/modules/physics/box2d/wrap_RevoluteJoint.cpp +++ b/jni/love/src/modules/physics/box2d/wrap_RevoluteJoint.cpp @@ -30,7 +30,7 @@ namespace box2d RevoluteJoint *luax_checkrevolutejoint(lua_State *L, int idx) { - RevoluteJoint *j = luax_checktype(L, idx, "RevoluteJoint", PHYSICS_REVOLUTE_JOINT_T); + RevoluteJoint *j = luax_checktype(L, idx, PHYSICS_REVOLUTE_JOINT_ID); if (!j->isValid()) luaL_error(L, "Attempt to use destroyed joint."); return j; @@ -199,7 +199,7 @@ static const luaL_Reg functions[] = extern "C" int luaopen_revolutejoint(lua_State *L) { - return luax_register_type(L, "RevoluteJoint", functions); + return luax_register_type(L, PHYSICS_REVOLUTE_JOINT_ID, functions); } } // box2d diff --git a/jni/love/src/modules/physics/box2d/wrap_RopeJoint.cpp b/jni/love/src/modules/physics/box2d/wrap_RopeJoint.cpp index 76635873..b9b9800d 100644 --- a/jni/love/src/modules/physics/box2d/wrap_RopeJoint.cpp +++ b/jni/love/src/modules/physics/box2d/wrap_RopeJoint.cpp @@ -29,7 +29,7 @@ namespace box2d RopeJoint *luax_checkropejoint(lua_State *L, int idx) { - RopeJoint *j = luax_checktype(L, idx, "RopeJoint", PHYSICS_ROPE_JOINT_T); + RopeJoint *j = luax_checktype(L, idx, PHYSICS_ROPE_JOINT_ID); if (!j->isValid()) luaL_error(L, "Attempt to use destroyed joint."); return j; @@ -61,7 +61,7 @@ static const luaL_Reg functions[] = extern "C" int luaopen_ropejoint(lua_State *L) { - return luax_register_type(L, "RopeJoint", functions); + return luax_register_type(L, PHYSICS_ROPE_JOINT_ID, functions); } } // box2d diff --git a/jni/love/src/modules/physics/box2d/wrap_Shape.cpp b/jni/love/src/modules/physics/box2d/wrap_Shape.cpp index da58bd13..0750d3e0 100644 --- a/jni/love/src/modules/physics/box2d/wrap_Shape.cpp +++ b/jni/love/src/modules/physics/box2d/wrap_Shape.cpp @@ -30,7 +30,7 @@ namespace box2d Shape *luax_checkshape(lua_State *L, int idx) { - return luax_checktype(L, idx, "Shape", PHYSICS_SHAPE_T); + return luax_checktype(L, idx, PHYSICS_SHAPE_ID); } int w_Shape_getType(lua_State *L) @@ -108,7 +108,7 @@ static const luaL_Reg functions[] = extern "C" int luaopen_shape(lua_State *L) { - return luax_register_type(L, "Shape", functions); + return luax_register_type(L, PHYSICS_SHAPE_ID, functions); } } // box2d diff --git a/jni/love/src/modules/physics/box2d/wrap_WeldJoint.cpp b/jni/love/src/modules/physics/box2d/wrap_WeldJoint.cpp index 5c4a2a6d..056411bc 100644 --- a/jni/love/src/modules/physics/box2d/wrap_WeldJoint.cpp +++ b/jni/love/src/modules/physics/box2d/wrap_WeldJoint.cpp @@ -29,7 +29,7 @@ namespace box2d WeldJoint *luax_checkweldjoint(lua_State *L, int idx) { - WeldJoint *j = luax_checktype(L, idx, "WeldJoint", PHYSICS_WELD_JOINT_T); + WeldJoint *j = luax_checktype(L, idx, PHYSICS_WELD_JOINT_ID); if (!j->isValid()) luaL_error(L, "Attempt to use destroyed joint."); return j; @@ -87,7 +87,7 @@ static const luaL_Reg functions[] = extern "C" int luaopen_weldjoint(lua_State *L) { - return luax_register_type(L, "WeldJoint", functions); + return luax_register_type(L, PHYSICS_WELD_JOINT_ID, functions); } } // box2d diff --git a/jni/love/src/modules/physics/box2d/wrap_WheelJoint.cpp b/jni/love/src/modules/physics/box2d/wrap_WheelJoint.cpp index 8ccea3a1..d8691898 100644 --- a/jni/love/src/modules/physics/box2d/wrap_WheelJoint.cpp +++ b/jni/love/src/modules/physics/box2d/wrap_WheelJoint.cpp @@ -29,7 +29,7 @@ namespace box2d WheelJoint *luax_checkwheeljoint(lua_State *L, int idx) { - WheelJoint *j = luax_checktype(L, idx, "WheelJoint", PHYSICS_WHEEL_JOINT_T); + WheelJoint *j = luax_checktype(L, idx, PHYSICS_WHEEL_JOINT_ID); if (!j->isValid()) luaL_error(L, "Attempt to use destroyed joint."); return j; @@ -163,7 +163,7 @@ static const luaL_Reg functions[] = extern "C" int luaopen_wheeljoint(lua_State *L) { - return luax_register_type(L, "WheelJoint", functions); + return luax_register_type(L, PHYSICS_WHEEL_JOINT_ID, functions); } } // box2d diff --git a/jni/love/src/modules/physics/box2d/wrap_World.cpp b/jni/love/src/modules/physics/box2d/wrap_World.cpp index 7b433425..e88b9345 100644 --- a/jni/love/src/modules/physics/box2d/wrap_World.cpp +++ b/jni/love/src/modules/physics/box2d/wrap_World.cpp @@ -29,7 +29,7 @@ namespace box2d World *luax_checkworld(lua_State *L, int idx) { - World *w = luax_checktype(L, idx, "World", PHYSICS_WORLD_T); + World *w = luax_checktype(L, idx, PHYSICS_WORLD_ID); if (!w->isValid()) luaL_error(L, "Attempt to use destroyed world."); return w; @@ -191,7 +191,7 @@ int w_World_destroy(lua_State *L) int w_World_isDestroyed(lua_State *L) { - World *w = luax_checktype(L, 1, "World", PHYSICS_WORLD_T); + World *w = luax_checktype(L, 1, PHYSICS_WORLD_ID); luax_pushboolean(L, !w->isValid()); return 1; } @@ -225,7 +225,7 @@ static const luaL_Reg functions[] = extern "C" int luaopen_world(lua_State *L) { - return luax_register_type(L, "World", functions); + return luax_register_type(L, PHYSICS_WORLD_ID, functions); } } // box2d diff --git a/jni/love/src/modules/sound/SoundData.cpp b/jni/love/src/modules/sound/SoundData.cpp index 91aedb79..c083eb4e 100644 --- a/jni/love/src/modules/sound/SoundData.cpp +++ b/jni/love/src/modules/sound/SoundData.cpp @@ -41,6 +41,9 @@ SoundData::SoundData(Decoder *decoder) , bitDepth(0) , channels(0) { + if (decoder->getBitDepth() != 8 && decoder->getBitDepth() != 16) + throw love::Exception("Invalid bit depth: %d", decoder->getBitDepth()); + size_t bufferSize = 524288; // 0x80000 int decoded = decoder->decode(); @@ -117,7 +120,7 @@ void SoundData::load(int samples, int sampleRate, int bitDepth, int channels, vo if (sampleRate <= 0) throw love::Exception("Invalid sample rate: %d", sampleRate); - if (bitDepth <= 0) + if (bitDepth != 8 && bitDepth != 16) throw love::Exception("Invalid bit depth: %d", bitDepth); if (channels <= 0) @@ -176,7 +179,7 @@ int SoundData::getSampleRate() const int SoundData::getSampleCount() const { - return (size/channels)/(bitDepth/8); + return (int) ((size/channels)/(bitDepth/8)); } float SoundData::getDuration() const diff --git a/jni/love/src/modules/sound/lullaby/CoreAudioDecoder.cpp b/jni/love/src/modules/sound/lullaby/CoreAudioDecoder.cpp new file mode 100644 index 00000000..a3284745 --- /dev/null +++ b/jni/love/src/modules/sound/lullaby/CoreAudioDecoder.cpp @@ -0,0 +1,274 @@ +/** + * Copyright (c) 2006-2015 LOVE Development Team + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. + **/ + +#ifdef LOVE_SUPPORT_COREAUDIO + +// LOVE +#include "CoreAudioDecoder.h" + +// C++ +#include + +namespace love +{ +namespace sound +{ +namespace lullaby +{ + +// Callbacks +namespace +{ +OSStatus readFunc(void *inClientData, SInt64 inPosition, UInt32 requestCount, void *buffer, UInt32 *actualCount) +{ + Data *data = (Data *) inClientData; + SInt64 bytesLeft = data->getSize() - inPosition; + + if (bytesLeft > 0) + { + UInt32 actualSize = bytesLeft >= requestCount ? requestCount : (UInt32) bytesLeft; + memcpy(buffer, (char *) data->getData() + inPosition, actualSize); + *actualCount = actualSize; + } + else + { + *actualCount = 0; + return kAudioFilePositionError; + } + + return noErr; +} + +SInt64 getSizeFunc(void *inClientData) +{ + Data *data = (Data *) inClientData; + return data->getSize(); +} +} // anonymous namespace + +CoreAudioDecoder::CoreAudioDecoder(Data *data, const std::string &ext, int bufferSize) + : Decoder(data, ext, bufferSize) + , audioFile(nullptr) + , extAudioFile(nullptr) + , inputInfo() + , outputInfo() +{ + try + { + OSStatus err = noErr; + + // Open the file represented by the Data. + err = AudioFileOpenWithCallbacks(data, readFunc, nullptr, getSizeFunc, nullptr, kAudioFileMP3Type, &audioFile); + if (err != noErr) + throw love::Exception("Could open audio file for decoding."); + + // We want to use the Extended AudioFile API. + err = ExtAudioFileWrapAudioFileID(audioFile, false, &extAudioFile); + + if (err != noErr) + throw love::Exception("Could open audio file for decoding."); + + // Get the format of the audio data. + UInt32 propertySize = sizeof(inputInfo); + err = ExtAudioFileGetProperty(extAudioFile, kExtAudioFileProperty_FileDataFormat, &propertySize, &inputInfo); + + if (err != noErr) + throw love::Exception("Could not determine file format."); + + // Set the output format to 16 bit signed integer (native-endian) data. + // Keep the channel count and sample rate of the source format. + outputInfo.mSampleRate = inputInfo.mSampleRate; + outputInfo.mChannelsPerFrame = inputInfo.mChannelsPerFrame; + + int bytes = (inputInfo.mBitsPerChannel == 8) ? 1 : 2; + + outputInfo.mFormatID = kAudioFormatLinearPCM; + outputInfo.mBitsPerChannel = bytes * 8; + outputInfo.mBytesPerFrame = bytes * outputInfo.mChannelsPerFrame; + outputInfo.mFramesPerPacket = 1; + outputInfo.mBytesPerPacket = bytes * outputInfo.mChannelsPerFrame; + outputInfo.mFormatFlags = kAudioFormatFlagsNativeEndian | kAudioFormatFlagIsPacked; + + // unsigned 8-bit or signed 16-bit integer PCM data. + if (outputInfo.mBitsPerChannel == 16) + outputInfo.mFormatFlags |= kAudioFormatFlagIsSignedInteger; + + // Set the desired output format. + propertySize = sizeof(outputInfo); + err = ExtAudioFileSetProperty(extAudioFile, kExtAudioFileProperty_ClientDataFormat, propertySize, &outputInfo); + + if (err != noErr) + throw love::Exception("Could not set decoder properties."); + } + catch (love::Exception &) + { + closeAudioFile(); + throw; + } + + sampleRate = (int) outputInfo.mSampleRate; +} + +CoreAudioDecoder::~CoreAudioDecoder() +{ + closeAudioFile(); +} + +void CoreAudioDecoder::closeAudioFile() +{ + if (extAudioFile != nullptr) + ExtAudioFileDispose(extAudioFile); + else if (audioFile != nullptr) + AudioFileClose(audioFile); + + extAudioFile = nullptr; + audioFile = nullptr; +} + +bool CoreAudioDecoder::accepts(const std::string &ext) +{ + UInt32 size = 0; + std::vector types; + + // Get the size in bytes of the type array we're about to get. + OSStatus err = AudioFileGetGlobalInfoSize(kAudioFileGlobalInfo_ReadableTypes, sizeof(UInt32), nullptr, &size); + if (err != noErr) + return false; + + types.resize(size / sizeof(UInt32)); + + // Get an array of supported types. + err = AudioFileGetGlobalInfo(kAudioFileGlobalInfo_ReadableTypes, 0, nullptr, &size, &types[0]); + if (err != noErr) + return false; + + // Turn the extension string into a CFStringRef. + CFStringRef extstr = CFStringCreateWithCString(nullptr, ext.c_str(), kCFStringEncodingUTF8); + + CFArrayRef exts = nullptr; + size = sizeof(CFArrayRef); + + for (UInt32 type : types) + { + // Get the extension strings for the type. + err = AudioFileGetGlobalInfo(kAudioFileGlobalInfo_ExtensionsForType, sizeof(UInt32), &type, &size, &exts); + if (err != noErr) + continue; + + // A type can have more than one extension string. + for (CFIndex i = 0; i < CFArrayGetCount(exts); i++) + { + CFStringRef value = (CFStringRef) CFArrayGetValueAtIndex(exts, i); + + if (CFStringCompare(extstr, value, 0) == kCFCompareEqualTo) + { + CFRelease(extstr); + CFRelease(exts); + return true; + } + } + + CFRelease(exts); + } + + CFRelease(extstr); + return false; +} + +love::sound::Decoder *CoreAudioDecoder::clone() +{ + return new CoreAudioDecoder(data.get(), ext, bufferSize); +} + +int CoreAudioDecoder::decode() +{ + int size = 0; + + while (size < bufferSize) + { + AudioBufferList dataBuffer; + dataBuffer.mNumberBuffers = 1; + dataBuffer.mBuffers[0].mDataByteSize = bufferSize - size; + dataBuffer.mBuffers[0].mData = (char *) buffer + size; + dataBuffer.mBuffers[0].mNumberChannels = outputInfo.mChannelsPerFrame; + + UInt32 frames = (bufferSize - size) / outputInfo.mBytesPerFrame; + + if (ExtAudioFileRead(extAudioFile, &frames, &dataBuffer) != noErr) + return size; + + if (frames == 0) + { + eof = true; + break; + } + + size += frames * outputInfo.mBytesPerFrame; + } + + return size; +} + +bool CoreAudioDecoder::seek(float s) +{ + OSStatus err = ExtAudioFileSeek(extAudioFile, (SInt64) (s * inputInfo.mSampleRate)); + + if (err == noErr) + { + eof = false; + return true; + } + + return false; +} + +bool CoreAudioDecoder::rewind() +{ + OSStatus err = ExtAudioFileSeek(extAudioFile, 0); + + if (err == noErr) + { + eof = false; + return true; + } + + return false; +} + +bool CoreAudioDecoder::isSeekable() +{ + return true; +} + +int CoreAudioDecoder::getChannels() const +{ + return outputInfo.mChannelsPerFrame; +} + +int CoreAudioDecoder::getBitDepth() const +{ + return outputInfo.mBitsPerChannel; +} + +} // lullaby +} // sound +} // love + +#endif // LOVE_SUPPORT_COREAUDIO diff --git a/jni/love/src/modules/image/magpie/JPEGHandler.h b/jni/love/src/modules/sound/lullaby/CoreAudioDecoder.h similarity index 50% rename from jni/love/src/modules/image/magpie/JPEGHandler.h rename to jni/love/src/modules/sound/lullaby/CoreAudioDecoder.h index 9c25e3a1..61dd0d93 100644 --- a/jni/love/src/modules/image/magpie/JPEGHandler.h +++ b/jni/love/src/modules/sound/lullaby/CoreAudioDecoder.h @@ -18,64 +18,64 @@ * 3. This notice may not be removed or altered from any source distribution. **/ -#ifndef LOVE_IMAGE_MAGPIE_JPEG_HANDLER_H -#define LOVE_IMAGE_MAGPIE_JPEG_HANDLER_H +#ifndef LOVE_SOUND_LULLABY_CORE_AUDIO_DECODER_H +#define LOVE_SOUND_LULLABY_CORE_AUDIO_DECODER_H -// LOVE #include "common/config.h" -#ifdef LOVE_TURBO_JPEG +#ifdef LOVE_SUPPORT_COREAUDIO -#include "FormatHandler.h" -#include "thread/threads.h" +// LOVE +#include "common/Data.h" +#include "Decoder.h" -// libjpeg-turbo -#ifdef LOVE_MACOSX_USE_FRAMEWORKS -#include -#else -#include -#endif +// Core Audio +#include +#include namespace love { -namespace image +namespace sound { -namespace magpie +namespace lullaby { /** - * Interface between ImageData and TurboJPEG. + * Decoder which supports all formats handled by Apple's Core Audio framework. **/ -class JPEGHandler : public FormatHandler +class CoreAudioDecoder : public Decoder { public: - // Implements FormatHandler. + CoreAudioDecoder(Data *data, const std::string &ext, int bufferSize); + virtual ~CoreAudioDecoder(); - JPEGHandler(); - virtual ~JPEGHandler(); + static bool accepts(const std::string &ext); - virtual bool canDecode(love::filesystem::FileData *data); - virtual bool canEncode(ImageData::Format format); - - virtual DecodedImage decode(love::filesystem::FileData *data); - virtual EncodedImage encode(const DecodedImage &img, ImageData::Format format); + love::sound::Decoder *clone(); + int decode(); + bool seek(float s); + bool rewind(); + bool isSeekable(); + int getChannels() const; + int getBitDepth() const; private: - Mutex *mutex; + void closeAudioFile(); - tjhandle decompressor; - tjhandle compressor; + AudioFileID audioFile; + ExtAudioFileRef extAudioFile; - static const int COMPRESS_QUALITY = 90; + AudioStreamBasicDescription inputInfo; + AudioStreamBasicDescription outputInfo; -}; // JPEGHandler +}; // CoreAudioDecoder -} // magpie -} // image +} // lullaby +} // sound } // love -#endif // LOVE_TURBO_JPEG +#endif // LOVE_SUPPORT_COREAUDIO -#endif // LOVE_IMAGE_MAGPIE_JPEG_HANDLER_H +#endif // LOVE_SOUND_LULLABY_CORE_AUDIO_DECODER_H diff --git a/jni/love/src/modules/sound/lullaby/GmeDecoder.h b/jni/love/src/modules/sound/lullaby/GmeDecoder.h index 422d0f31..564c3ab2 100644 --- a/jni/love/src/modules/sound/lullaby/GmeDecoder.h +++ b/jni/love/src/modules/sound/lullaby/GmeDecoder.h @@ -27,7 +27,7 @@ #include "common/Data.h" #include "Decoder.h" -#ifdef LOVE_MACOSX_USE_FRAMEWORKS +#ifdef LOVE_APPLE_USE_FRAMEWORKS #include #else #include diff --git a/jni/love/src/modules/sound/lullaby/ModPlugDecoder.cpp b/jni/love/src/modules/sound/lullaby/ModPlugDecoder.cpp index 1ccf74c7..1a2f97f9 100644 --- a/jni/love/src/modules/sound/lullaby/ModPlugDecoder.cpp +++ b/jni/love/src/modules/sound/lullaby/ModPlugDecoder.cpp @@ -17,9 +17,11 @@ * misrepresented as being the original software. * 3. This notice may not be removed or altered from any source distribution. **/ -#include "common/config.h" + #include "ModPlugDecoder.h" +#ifndef LOVE_NO_MODPLUG + #include "common/Exception.h" namespace love @@ -45,11 +47,8 @@ ModPlugDecoder::ModPlugDecoder(Data *data, const std::string &ext, int bufferSiz // garbage settings when the struct is only partially initialized) // This does not exist yet on Windows. - // Some settings not supported by some older versions -#ifndef LOVE_OLD_MODPLUG settings.mStereoSeparation = 128; settings.mMaxMixChannels = 32; -#endif settings.mReverbDepth = 0; settings.mReverbDelay = 0; settings.mBassAmount = 0; @@ -145,3 +144,5 @@ int ModPlugDecoder::getBitDepth() const } // lullaby } // sound } // love + +#endif // LOVE_NO_MODPLUG diff --git a/jni/love/src/modules/sound/lullaby/ModPlugDecoder.h b/jni/love/src/modules/sound/lullaby/ModPlugDecoder.h index 9535737b..155a9df7 100644 --- a/jni/love/src/modules/sound/lullaby/ModPlugDecoder.h +++ b/jni/love/src/modules/sound/lullaby/ModPlugDecoder.h @@ -21,6 +21,10 @@ #ifndef LOVE_SOUND_LULLABY_MODPLUG_DECODER_H #define LOVE_SOUND_LULLABY_MODPLUG_DECODER_H +#include "common/config.h" + +#ifndef LOVE_NO_MODPLUG + // LOVE #include "common/Data.h" #include "Decoder.h" @@ -62,4 +66,6 @@ private: } // sound } // love +#endif // LOVE_NO_MODPLUG + #endif // LOVE_SOUND_LULLABY_MODPLUG_DECODER_H diff --git a/jni/love/src/modules/sound/lullaby/Mpg123Decoder.h b/jni/love/src/modules/sound/lullaby/Mpg123Decoder.h index d5d0f77d..47706bc0 100644 --- a/jni/love/src/modules/sound/lullaby/Mpg123Decoder.h +++ b/jni/love/src/modules/sound/lullaby/Mpg123Decoder.h @@ -26,7 +26,7 @@ #include "Decoder.h" // libmpg123 -#ifdef LOVE_MACOSX_USE_FRAMEWORKS +#ifdef LOVE_APPLE_USE_FRAMEWORKS #include #else #include diff --git a/jni/love/src/modules/sound/lullaby/Sound.cpp b/jni/love/src/modules/sound/lullaby/Sound.cpp index 54a0a61f..683660cf 100644 --- a/jni/love/src/modules/sound/lullaby/Sound.cpp +++ b/jni/love/src/modules/sound/lullaby/Sound.cpp @@ -34,6 +34,10 @@ # include "Mpg123Decoder.h" #endif // LOVE_NOMPG123 +#ifdef LOVE_SUPPORT_COREAUDIO +# include "CoreAudioDecoder.h" +#endif + namespace love { namespace sound @@ -65,8 +69,12 @@ sound::Decoder *Sound::newDecoder(love::filesystem::FileData *data, int bufferSi sound::Decoder *decoder = 0; // Find a suitable decoder here, and return it. - if (ModPlugDecoder::accepts(ext)) + if (false) + /* nothing */; +#ifndef LOVE_NO_MODPLUG + else if (ModPlugDecoder::accepts(ext)) decoder = new ModPlugDecoder(data, ext, bufferSize); +#endif // LOVE_NO_MODPLUG #ifndef LOVE_NOMPG123 else if (Mpg123Decoder::accepts(ext)) decoder = new Mpg123Decoder(data, ext, bufferSize); @@ -77,6 +85,10 @@ sound::Decoder *Sound::newDecoder(love::filesystem::FileData *data, int bufferSi else if (GmeDecoder::accepts(ext)) decoder = new GmeDecoder(data, ext, bufferSize); #endif // LOVE_SUPPORT_GME +#ifdef LOVE_SUPPORT_COREAUDIO + else if (CoreAudioDecoder::accepts(ext)) + decoder = new CoreAudioDecoder(data, ext, bufferSize); +#endif else if (WaveDecoder::accepts(ext)) decoder = new WaveDecoder(data, ext, bufferSize); /*else if (FLACDecoder::accepts(ext)) diff --git a/jni/love/src/modules/sound/lullaby/VorbisDecoder.cpp b/jni/love/src/modules/sound/lullaby/VorbisDecoder.cpp index 20f32c3c..7cff4aab 100644 --- a/jni/love/src/modules/sound/lullaby/VorbisDecoder.cpp +++ b/jni/love/src/modules/sound/lullaby/VorbisDecoder.cpp @@ -63,7 +63,7 @@ static size_t vorbisRead(void *ptr /* ptr to the data that the vorbis files need if (actualSizeToRead) { // Copy the data from the start of the file PLUS how much we have already read in - memcpy(ptr, (char *)vorbisData->dataPtr + vorbisData->dataRead, actualSizeToRead); + memcpy(ptr, (const char *)vorbisData->dataPtr + vorbisData->dataRead, actualSizeToRead); // Increase by how much we have read by vorbisData->dataRead += (actualSizeToRead); } @@ -109,7 +109,7 @@ static int vorbisSeek(void *datasource /* ptr to the data that the vorbis files vorbisData->dataRead = vorbisData->dataSize+1; break; default: - throw love::Exception("Unknown seek command in vorbisSeek\n"); + throw love::Exception("Unknown seek command in vorbisSeek"); break; }; @@ -143,8 +143,8 @@ VorbisDecoder::VorbisDecoder(Data *data, const std::string &ext, int bufferSize) #endif // Initialize OGG file - oggFile.dataPtr = (char *) data->getData(); - oggFile.dataSize = data->getSize(); + oggFile.dataPtr = (const char *) data->getData(); + oggFile.dataSize = (int) data->getSize(); oggFile.dataRead = 0; // Open Vorbis handle @@ -188,7 +188,7 @@ int VorbisDecoder::decode() while (size < bufferSize) { - int result = ov_read(&handle, (char *) buffer + size, bufferSize - size, endian, (getBitDepth() == 16 ? 2 : 1), 1, 0); + long result = ov_read(&handle, (char *) buffer + size, bufferSize - size, endian, (getBitDepth() == 16 ? 2 : 1), 1, 0); if (result == OV_HOLE) continue; @@ -250,7 +250,7 @@ int VorbisDecoder::getBitDepth() const int VorbisDecoder::getSampleRate() const { - return vorbisInfo->rate; + return (int) vorbisInfo->rate; } } // lullaby diff --git a/jni/love/src/modules/sound/lullaby/VorbisDecoder.h b/jni/love/src/modules/sound/lullaby/VorbisDecoder.h index ea6f2697..ebd815c5 100644 --- a/jni/love/src/modules/sound/lullaby/VorbisDecoder.h +++ b/jni/love/src/modules/sound/lullaby/VorbisDecoder.h @@ -40,7 +40,7 @@ namespace lullaby // Struct for handling data struct SOggFile { - char *dataPtr; // Pointer to the data in memory + const char *dataPtr; // Pointer to the data in memory int dataSize; // Size of the data int dataRead; // How much we've read so far }; diff --git a/jni/love/src/modules/sound/lullaby/WaveDecoder.cpp b/jni/love/src/modules/sound/lullaby/WaveDecoder.cpp index b04ec12b..9dfc3ec2 100644 --- a/jni/love/src/modules/sound/lullaby/WaveDecoder.cpp +++ b/jni/love/src/modules/sound/lullaby/WaveDecoder.cpp @@ -126,8 +126,8 @@ int WaveDecoder::decode() while (size < (size_t) bufferSize) { - size_t bytes = bufferSize; - int wuff_status = wuff_read(handle, (wuff_uint8 *) buffer, &bytes); + size_t bytes = bufferSize-size; + int wuff_status = wuff_read(handle, (wuff_uint8 *) buffer+size, &bytes); if (wuff_status < 0) return 0; @@ -140,7 +140,7 @@ int WaveDecoder::decode() size += bytes; } - return size; + return (int) size; } bool WaveDecoder::seek(float s) diff --git a/jni/love/src/modules/sound/wrap_Decoder.cpp b/jni/love/src/modules/sound/wrap_Decoder.cpp index 616afb0f..3d9c03a0 100644 --- a/jni/love/src/modules/sound/wrap_Decoder.cpp +++ b/jni/love/src/modules/sound/wrap_Decoder.cpp @@ -27,7 +27,7 @@ namespace sound Decoder *luax_checkdecoder(lua_State *L, int idx) { - return luax_checktype(L, idx, "Decoder", SOUND_DECODER_T); + return luax_checktype(L, idx, SOUND_DECODER_ID); } int w_Decoder_getChannels(lua_State *L) @@ -61,7 +61,7 @@ static const luaL_Reg functions[] = extern "C" int luaopen_decoder(lua_State *L) { - return luax_register_type(L, "Decoder", functions); + return luax_register_type(L, SOUND_DECODER_ID, functions); } } // sound diff --git a/jni/love/src/modules/sound/wrap_Sound.cpp b/jni/love/src/modules/sound/wrap_Sound.cpp index 08d8549e..6f43343b 100644 --- a/jni/love/src/modules/sound/wrap_Sound.cpp +++ b/jni/love/src/modules/sound/wrap_Sound.cpp @@ -38,10 +38,10 @@ int w_newSoundData(lua_State *L) if (lua_isnumber(L, 1)) { - int samples = luaL_checkint(L, 1); - int sampleRate = luaL_optint(L, 2, Decoder::DEFAULT_SAMPLE_RATE); - int bitDepth = luaL_optint(L, 3, Decoder::DEFAULT_BIT_DEPTH); - int channels = luaL_optint(L, 4, Decoder::DEFAULT_CHANNELS); + int samples = (int) luaL_checknumber(L, 1); + int sampleRate = (int) luaL_optnumber(L, 2, Decoder::DEFAULT_SAMPLE_RATE); + int bitDepth = (int) luaL_optnumber(L, 3, Decoder::DEFAULT_BIT_DEPTH); + int channels = (int) luaL_optnumber(L, 4, Decoder::DEFAULT_CHANNELS); luax_catchexcept(L, [&](){ t = instance()->newSoundData(samples, sampleRate, bitDepth, channels); }); } @@ -49,7 +49,7 @@ int w_newSoundData(lua_State *L) else { // Convert to Decoder, if necessary. - if (!luax_istype(L, 1, SOUND_DECODER_T)) + if (!luax_istype(L, 1, SOUND_DECODER_ID)) { w_newDecoder(L); lua_replace(L, 1); @@ -58,7 +58,7 @@ int w_newSoundData(lua_State *L) luax_catchexcept(L, [&](){ t = instance()->newSoundData(luax_checkdecoder(L, 1)); }); } - luax_pushtype(L, "SoundData", SOUND_SOUND_DATA_T, t); + luax_pushtype(L, SOUND_SOUND_DATA_ID, t); t->release(); return 1; } @@ -66,18 +66,18 @@ int w_newSoundData(lua_State *L) int w_newDecoder(lua_State *L) { love::filesystem::FileData *data = love::filesystem::luax_getfiledata(L, 1); - int bufferSize = luaL_optint(L, 2, Decoder::DEFAULT_BUFFER_SIZE); + int bufferSize = (int) luaL_optnumber(L, 2, Decoder::DEFAULT_BUFFER_SIZE); Decoder *t = nullptr; luax_catchexcept(L, [&]() { t = instance()->newDecoder(data, bufferSize); }, - [&]() { data->release(); } + [&](bool) { data->release(); } ); if (t == nullptr) return luaL_error(L, "Extension \"%s\" not supported.", data->getExtension().c_str()); - luax_pushtype(L, "Decoder", SOUND_DECODER_T, t); + luax_pushtype(L, SOUND_DECODER_ID, t); t->release(); return 1; } @@ -111,7 +111,7 @@ extern "C" int luaopen_love_sound(lua_State *L) WrappedModule w; w.module = instance; w.name = "sound"; - w.flags = MODULE_SOUND_T; + w.type = MODULE_SOUND_ID; w.functions = functions; w.types = types; diff --git a/jni/love/src/modules/sound/wrap_SoundData.cpp b/jni/love/src/modules/sound/wrap_SoundData.cpp index 951ab58c..b4fc7b7a 100644 --- a/jni/love/src/modules/sound/wrap_SoundData.cpp +++ b/jni/love/src/modules/sound/wrap_SoundData.cpp @@ -22,14 +22,24 @@ #include "common/wrap_Data.h" +// Shove the wrap_SoundData.lua code directly into a raw string literal. +static const char sounddata_lua[] = +#include "wrap_SoundData.lua" +; + namespace love { namespace sound { +/** + * NOTE: Additional wrapper code is in wrap_SoundData.lua. Be sure to keep it + * in sync with any changes made to this file! + **/ + SoundData *luax_checksounddata(lua_State *L, int idx) { - return luax_checktype(L, idx, "SoundData", SOUND_SOUND_DATA_T); + return luax_checktype(L, idx, SOUND_SOUND_DATA_ID); } int w_SoundData_getChannels(lua_State *L) @@ -105,7 +115,22 @@ static const luaL_Reg functions[] = extern "C" int luaopen_sounddata(lua_State *L) { - return luax_register_type(L, "SoundData", functions); + // The last argument pushes the type's metatable onto the stack. + int ret = luax_register_type(L, SOUND_SOUND_DATA_ID, functions, true); + + // Load and execute SoundData.lua, sending the metatable as an argument. + if (ret > 0) + { + luaL_loadbuffer(L, sounddata_lua, sizeof(sounddata_lua), "SoundData.lua"); + lua_pushvalue(L, -2); + lua_call(L, 1, 0); + + // Pop the metatable. + lua_pop(L, 1); + ret--; + } + + return ret; } } // sound diff --git a/jni/love/src/modules/sound/wrap_SoundData.lua b/jni/love/src/modules/sound/wrap_SoundData.lua new file mode 100644 index 00000000..5f799150 --- /dev/null +++ b/jni/love/src/modules/sound/wrap_SoundData.lua @@ -0,0 +1,123 @@ +R"luastring"--( +-- DO NOT REMOVE THE ABOVE LINE. It is used to load this file as a C++ string. +-- There is a matching delimiter at the bottom of the file. + +--[[ +Copyright (c) 2006-2015 LOVE Development Team + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not +claim that you wrote the original software. If you use this software +in a product, an acknowledgment in the product documentation would be +appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be +misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +--]] + +local SoundData_mt = ... + +if type(jit) ~= "table" or not jit.status() then + -- LuaJIT's FFI is *much* slower than LOVE's regular methods when the JIT + -- compiler is disabled. + return +end + +local status, ffi = pcall(require, "ffi") +if not status then return end + +local tonumber, assert = tonumber, assert + +local float = ffi.typeof("float") +local datatypes = {ffi.typeof("uint8_t *"), ffi.typeof("int16_t *")} + +local typemaxvals = {0x7F, 0x7FFF} + +local _getBitDepth = SoundData_mt.__index.getBitDepth +local _getSampleCount = SoundData_mt.__index.getSampleCount +local _getSampleRate = SoundData_mt.__index.getSampleRate +local _getChannels = SoundData_mt.__index.getChannels +local _getDuration = SoundData_mt.__index.getDuration + +-- Table which holds SoundData objects as keys, and information about the objects +-- as values. Uses weak keys so the SoundData objects can still be GC'd properly. +local objectcache = setmetatable({}, { + __mode = "k", + __index = function(self, sounddata) + local bytedepth = _getBitDepth(sounddata) / 8 + local pointer = ffi.cast(datatypes[bytedepth], sounddata:getPointer()) + + local p = { + bytedepth = bytedepth, + pointer = pointer, + size = sounddata:getSize(), + maxvalue = typemaxvals[bytedepth], + samplecount = _getSampleCount(sounddata), + samplerate = _getSampleRate(sounddata), + channels = _getChannels(sounddata), + duration = _getDuration(sounddata), + } + + self[sounddata] = p + return p + end, +}) + + +-- Overwrite existing functions with new FFI versions. + +function SoundData_mt.__index:getSample(i) + local p = objectcache[self] + assert(i >= 0 and i < p.size/p.bytedepth, "Attempt to get out-of-range sample!") + if p.bytedepth == 2 then + -- 16-bit data is stored as signed values internally. + return tonumber(p.pointer[i]) / p.maxvalue + else + -- 8-bit data is stored as unsigned values internally. + return (tonumber(p.pointer[i]) - 128) / 127 + end +end + +function SoundData_mt.__index:setSample(i, sample) + local p = objectcache[self] + assert(i >= 0 and i < p.size/p.bytedepth, "Attempt to set out-of-range sample!") + if p.bytedepth == 2 then + -- 16-bit data is stored as signed values internally. + p.pointer[i] = sample * p.maxvalue + else + -- 8-bit data is stored as unsigned values internally. + -- The float cast is needed to make values end up the same as in the + -- C++ version of this method. + p.pointer[i] = ffi.cast(float, (sample * 127) + 128) + end +end + +function SoundData_mt.__index:getBitDepth() + return objectcache[self].bytedepth * 8 +end + +function SoundData_mt.__index:getSampleCount() + return objectcache[self].samplecount +end + +function SoundData_mt.__index:getSampleRate() + return objectcache[self].samplerate +end + +function SoundData_mt.__index:getChannels() + return objectcache[self].channels +end + +function SoundData_mt.__index:getDuration() + return objectcache[self].duration +end + +-- DO NOT REMOVE THE NEXT LINE. It is used to load this file as a C++ string. +--)luastring"--" diff --git a/jni/love/src/modules/system/System.cpp b/jni/love/src/modules/system/System.cpp index c43b9db7..a7205cad 100755 --- a/jni/love/src/modules/system/System.cpp +++ b/jni/love/src/modules/system/System.cpp @@ -24,6 +24,8 @@ #if defined(LOVE_MACOSX) #include +#elif defined(LOVE_IOS) +#include "common/iOS.h" #elif defined(LOVE_ANDROID) #include "common/android.h" #elif defined(LOVE_LINUX) @@ -62,6 +64,8 @@ std::string System::getOS() const { #if defined(LOVE_MACOSX) return "OS X"; +#elif defined(LOVE_IOS) + return "iOS"; #elif defined(LOVE_WINDOWS) return "Windows"; #elif LOVE_ANDROID @@ -84,7 +88,6 @@ bool System::openURL(const std::string &url) const #if defined(LOVE_MACOSX) bool success = false; - // We could be lazy and use system("open " + url), but this is safer. CFURLRef cfurl = CFURLCreateWithBytes(nullptr, (const UInt8 *) url.c_str(), url.length(), @@ -95,6 +98,10 @@ bool System::openURL(const std::string &url) const CFRelease(cfurl); return success; +#elif defined(LOVE_IOS) + + return love::ios::openURL(url); + #elif defined(LOVE_ANDROID) return love::android::openURL (url); diff --git a/jni/love/src/modules/system/wrap_System.cpp b/jni/love/src/modules/system/wrap_System.cpp index 1a937b46..1f0f138d 100644 --- a/jni/love/src/modules/system/wrap_System.cpp +++ b/jni/love/src/modules/system/wrap_System.cpp @@ -118,7 +118,7 @@ extern "C" int luaopen_love_system(lua_State *L) WrappedModule w; w.module = instance; w.name = "system"; - w.flags = MODULE_T; + w.type = MODULE_ID; w.functions = functions; w.types = nullptr; diff --git a/jni/love/src/modules/thread/Channel.cpp b/jni/love/src/modules/thread/Channel.cpp index 18fd5f19..94180b1d 100644 --- a/jni/love/src/modules/thread/Channel.cpp +++ b/jni/love/src/modules/thread/Channel.cpp @@ -176,7 +176,7 @@ Variant *Channel::peek() int Channel::getCount() { Lock l(mutex); - return queue.size(); + return (int) queue.size(); } void Channel::clear() diff --git a/jni/love/src/modules/thread/Channel.h b/jni/love/src/modules/thread/Channel.h index f1174e01..db3c2b90 100644 --- a/jni/love/src/modules/thread/Channel.h +++ b/jni/love/src/modules/thread/Channel.h @@ -39,6 +39,7 @@ class Channel : public love::Object // FOR WRAPPER USE ONLY friend void retainVariant(Channel *, Variant *); friend void releaseVariant(Channel *, Variant *); +friend int w_Channel_performAtomic(lua_State *); public: diff --git a/jni/love/src/modules/thread/LuaThread.cpp b/jni/love/src/modules/thread/LuaThread.cpp index 95507241..edef4964 100644 --- a/jni/love/src/modules/thread/LuaThread.cpp +++ b/jni/love/src/modules/thread/LuaThread.cpp @@ -25,7 +25,6 @@ #ifdef LOVE_BUILD_STANDALONE extern "C" int luaopen_love(lua_State * L); #endif // LOVE_BUILD_STANDALONE -extern "C" int luaopen_love_thread(lua_State *L); namespace love { @@ -34,7 +33,7 @@ namespace thread LuaThread::LuaThread(const std::string &name, love::Data *code) : code(code) , name(name) - , args(0) + , args(nullptr) , nargs(0) { threadName = name; @@ -52,13 +51,25 @@ void LuaThread::threadFunction() { this->retain(); error.clear(); + lua_State *L = luaL_newstate(); luaL_openlibs(L); + #ifdef LOVE_BUILD_STANDALONE - love::luax_preload(L, luaopen_love, "love"); - luaopen_love(L); + luax_preload(L, luaopen_love, "love"); + luax_require(L, "love"); + lua_pop(L, 1); #endif // LOVE_BUILD_STANDALONE - luaopen_love_thread(L); + + luax_require(L, "love.thread"); + lua_pop(L, 1); + + // We load love.filesystem by default, since require still exists without it + // but won't load files from the proper paths. love.filesystem also must be + // loaded before using any love function that can take a filepath argument. + luax_require(L, "love.filesystem"); + lua_pop(L, 1); + if (luaL_loadbuffer(L, (const char *) code->getData(), code->getSize(), name.c_str()) != 0) error = luax_tostring(L, -1); else @@ -72,14 +83,17 @@ void LuaThread::threadFunction() // Set both args and nargs to nil, prevents the deconstructor from // accessing it again. nargs = 0; - args = 0; + args = nullptr; if (lua_pcall(L, pushedargs, 0, 0) != 0) error = luax_tostring(L, -1); } + lua_close(L); + if (!error.empty()) onError(); + this->release(); } @@ -108,14 +122,14 @@ void LuaThread::onError() if (!event) return; - std::vector> vargs; - Proxy p; - p.flags = THREAD_THREAD_T; - p.data = this; + p.type = THREAD_THREAD_ID; + p.object = this; - vargs.push_back(new Variant(THREAD_THREAD_ID, &p)); - vargs.push_back(new Variant(error.c_str(), error.length())); + std::vector> vargs = { + new Variant(THREAD_THREAD_ID, &p), + new Variant(error.c_str(), error.length()) + }; event::Message *msg = new event::Message("threaderror", vargs); diff --git a/jni/love/src/modules/thread/Thread.h b/jni/love/src/modules/thread/Thread.h index 37cf3790..f418a220 100644 --- a/jni/love/src/modules/thread/Thread.h +++ b/jni/love/src/modules/thread/Thread.h @@ -22,7 +22,6 @@ #define LOVE_THREAD_THREAD_H // LOVE -#include "common/runtime.h" #include "common/Object.h" namespace love @@ -39,7 +38,7 @@ public: virtual void wait() = 0; virtual bool isRunning() = 0; -}; // ThreadObject +}; // Thread } // thread } // love diff --git a/jni/love/src/modules/thread/wrap_Channel.cpp b/jni/love/src/modules/thread/wrap_Channel.cpp index b0d632c8..002af716 100644 --- a/jni/love/src/modules/thread/wrap_Channel.cpp +++ b/jni/love/src/modules/thread/wrap_Channel.cpp @@ -24,6 +24,7 @@ namespace love { namespace thread { + void retainVariant(Channel *c, Variant *v) { c->lockMutex(); @@ -40,7 +41,7 @@ void releaseVariant(Channel *c, Variant *v) Channel *luax_checkchannel(lua_State *L, int idx) { - return luax_checktype(L, idx, "Channel", THREAD_CHANNEL_T); + return luax_checktype(L, idx, THREAD_CHANNEL_ID); } int w_Channel_push(lua_State *L) @@ -116,6 +117,33 @@ int w_Channel_clear(lua_State *L) return 0; } +int w_Channel_performAtomic(lua_State *L) +{ + Channel *c = luax_checkchannel(L, 1); + luaL_checktype(L, 2, LUA_TFUNCTION); + + // Pass this channel as an argument to the function. + lua_pushvalue(L, 1); + lua_insert(L, 3); + + c->lockMutex(); + + // call the function, passing the channel as the first argument and any + // user-specified arguments after. + int numargs = lua_gettop(L) - 2; + int err = lua_pcall(L, numargs, LUA_MULTRET, 0); + + c->unlockMutex(); + + // Unfortunately, this eats the stack trace, too bad. + if (err != 0) + return lua_error(L); + + // The function and everything after it in the stack are eaten by the pcall, + // leaving only the Channel argument. Everything else is a return value. + return lua_gettop(L) - 1; +} + static const luaL_Reg type_functions[] = { { "push", w_Channel_push }, { "supply", w_Channel_supply }, @@ -124,12 +152,14 @@ static const luaL_Reg type_functions[] = { { "peek", w_Channel_peek }, { "getCount", w_Channel_getCount }, { "clear", w_Channel_clear }, + { "performAtomic", w_Channel_performAtomic }, { 0, 0 } }; extern "C" int luaopen_channel(lua_State *L) { - return luax_register_type(L, "Channel", type_functions); -} -} + return luax_register_type(L, THREAD_CHANNEL_ID, type_functions); } + +} // thread +} // love diff --git a/jni/love/src/modules/thread/wrap_Channel.h b/jni/love/src/modules/thread/wrap_Channel.h index 9df12351..2a4b2c89 100644 --- a/jni/love/src/modules/thread/wrap_Channel.h +++ b/jni/love/src/modules/thread/wrap_Channel.h @@ -36,6 +36,7 @@ int w_Channel_demand(lua_State *L); int w_Channel_peek(lua_State *L); int w_Channel_getCount(lua_State *L); int w_Channel_clear(lua_State *L); +int w_Channel_performAtomic(lua_State *L); extern "C" int luaopen_channel(lua_State *L); } // thread diff --git a/jni/love/src/modules/thread/wrap_LuaThread.cpp b/jni/love/src/modules/thread/wrap_LuaThread.cpp index 1629051c..15a29061 100644 --- a/jni/love/src/modules/thread/wrap_LuaThread.cpp +++ b/jni/love/src/modules/thread/wrap_LuaThread.cpp @@ -27,7 +27,7 @@ namespace thread LuaThread *luax_checkthread(lua_State *L, int idx) { - return luax_checktype(L, idx, "Thread", THREAD_THREAD_T); + return luax_checktype(L, idx, THREAD_THREAD_ID); } int w_Thread_start(lua_State *L) @@ -91,7 +91,7 @@ static const luaL_Reg type_functions[] = { extern "C" int luaopen_thread(lua_State *L) { - return luax_register_type(L, "Thread", type_functions); + return luax_register_type(L, THREAD_THREAD_ID, type_functions); } } // thread diff --git a/jni/love/src/modules/thread/wrap_ThreadModule.cpp b/jni/love/src/modules/thread/wrap_ThreadModule.cpp index d0123d65..ce757622 100644 --- a/jni/love/src/modules/thread/wrap_ThreadModule.cpp +++ b/jni/love/src/modules/thread/wrap_ThreadModule.cpp @@ -61,22 +61,22 @@ int w_newThread(lua_State *L) else luax_convobj(L, 1, "filesystem", "newFileData"); } - else if (luax_istype(L, 1, FILESYSTEM_FILE_T)) + else if (luax_istype(L, 1, FILESYSTEM_FILE_ID)) luax_convobj(L, 1, "filesystem", "newFileData"); - if (luax_istype(L, 1, FILESYSTEM_FILE_DATA_T)) + if (luax_istype(L, 1, FILESYSTEM_FILE_DATA_ID)) { - love::filesystem::FileData *fdata = luax_checktype(L, 1, "FileData", FILESYSTEM_FILE_DATA_T); + love::filesystem::FileData *fdata = luax_checktype(L, 1, FILESYSTEM_FILE_DATA_ID); name = std::string("@") + fdata->getFilename(); data = fdata; } else { - data = luax_checktype(L, 1, "Data", DATA_T); + data = luax_checktype(L, 1, DATA_ID); } LuaThread *t = instance()->newThread(name, data); - luax_pushtype(L, "Thread", THREAD_THREAD_T, t); + luax_pushtype(L, THREAD_THREAD_ID, t); t->release(); return 1; } @@ -84,7 +84,7 @@ int w_newThread(lua_State *L) int w_newChannel(lua_State *L) { Channel *c = instance()->newChannel(); - luax_pushtype(L, "Channel", THREAD_CHANNEL_T, c); + luax_pushtype(L, THREAD_CHANNEL_ID, c); c->release(); return 1; } @@ -93,7 +93,7 @@ int w_getChannel(lua_State *L) { std::string name = luax_checkstring(L, 1); Channel *c = instance()->getChannel(name); - luax_pushtype(L, "Channel", THREAD_CHANNEL_T, c); + luax_pushtype(L, THREAD_CHANNEL_ID, c); c->release(); return 1; } @@ -125,7 +125,7 @@ extern "C" int luaopen_love_thread(lua_State *L) WrappedModule w; w.module = instance; w.name = "thread"; - w.flags = MODULE_T; + w.type = MODULE_ID; w.functions = module_functions; w.types = types; diff --git a/jni/love/src/modules/timer/Timer.cpp b/jni/love/src/modules/timer/Timer.cpp new file mode 100644 index 00000000..7567f3e9 --- /dev/null +++ b/jni/love/src/modules/timer/Timer.cpp @@ -0,0 +1,147 @@ +/** + * Copyright (c) 2006-2015 LOVE Development Team + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. + **/ + +// LOVE +#include "common/config.h" +#include "common/int.h" +#include "Timer.h" + +#if defined(LOVE_WINDOWS) +#include +#elif defined(LOVE_MACOSX) || defined(LOVE_IOS) +#include +#include +#elif defined(LOVE_LINUX) +#include +#include +#include +#endif + +#if defined(LOVE_LINUX) +static inline double getTimeOfDay() +{ + timeval t; + gettimeofday(&t, NULL); + return (double) t.tv_sec + (double) t.tv_usec / 1000000.0; +} +#endif + +namespace love +{ +namespace timer +{ + +Timer::Timer() + : currTime(0) + , prevFpsUpdate(0) + , fps(0) + , averageDelta(0) + , fpsUpdateFrequency(1) + , frames(0) + , dt(0) + , timerPeriod(getTimerPeriod()) +{ + prevFpsUpdate = currTime = getTime(); +} + +void Timer::step() +{ + // Frames rendered + frames++; + + // "Current" time is previous time by now. + prevTime = currTime; + + // Get time from system. + currTime = getTime(); + + // Convert to number of seconds. + dt = currTime - prevTime; + + double timeSinceLast = currTime - prevFpsUpdate; + // Update FPS? + if (timeSinceLast > fpsUpdateFrequency) + { + fps = int((frames/timeSinceLast) + 0.5); + averageDelta = timeSinceLast/frames; + prevFpsUpdate = currTime; + frames = 0; + } +} + +double Timer::getDelta() const +{ + return dt; +} + +int Timer::getFPS() const +{ + return fps; +} + +double Timer::getAverageDelta() const +{ + return averageDelta; +} + +double Timer::getTimerPeriod() +{ +#if defined(LOVE_MACOSX) || defined(LOVE_IOS) + mach_timebase_info_data_t info; + mach_timebase_info(&info); + return (double) info.numer / (double) info.denom / 1000000000.0; +#elif defined(LOVE_WINDOWS) + LARGE_INTEGER temp; + if (QueryPerformanceFrequency(&temp) != 0 && temp.QuadPart != 0) + return 1.0 / (double) temp.QuadPart; +#endif + return 0; +} + +double Timer::getTime() const +{ +#if defined(LOVE_LINUX) + double mt; + // Check for POSIX timers and monotonic clocks. If not supported, use the gettimeofday fallback. +#if _POSIX_TIMERS > 0 && defined(_POSIX_MONOTONIC_CLOCK) \ +&& (defined(CLOCK_MONOTONIC_RAW) || defined(CLOCK_MONOTONIC)) + timespec t; +#ifdef CLOCK_MONOTONIC_RAW + clockid_t clk_id = CLOCK_MONOTONIC_RAW; +#else + clockid_t clk_id = CLOCK_MONOTONIC; +#endif + if (clock_gettime(clk_id, &t) == 0) + mt = (double) t.tv_sec + (double) t.tv_nsec / 1000000000.0; + else +#endif + mt = getTimeOfDay(); + return mt; +#elif defined(LOVE_MACOSX) || defined(LOVE_IOS) + return (double) mach_absolute_time() * timerPeriod; +#elif defined(LOVE_WINDOWS) + LARGE_INTEGER microTime; + QueryPerformanceCounter(µTime); + return (double) microTime.QuadPart * timerPeriod; +#endif +} + +} // timer +} // love diff --git a/jni/love/src/modules/timer/Timer.h b/jni/love/src/modules/timer/Timer.h index 85322060..b61f4476 100644 --- a/jni/love/src/modules/timer/Timer.h +++ b/jni/love/src/modules/timer/Timer.h @@ -33,6 +33,7 @@ class Timer : public Module { public: + Timer(); virtual ~Timer() {} // Implements Module. @@ -42,7 +43,7 @@ public: * Measures the time between this call and the previous call, * and updates internal values accordinly. **/ - virtual void step() = 0; + virtual void step(); /** * Tries to sleep for the specified amount of time. The precision is @@ -55,19 +56,19 @@ public: * Gets the time between the last two frames, assuming step is called * each frame. **/ - virtual double getDelta() const = 0; + virtual double getDelta() const; /** * Gets the average FPS over the last second. Beucase the value is only updated * once per second, it does not look erratic when displayed on screen. * @return The "current" FPS. **/ - virtual int getFPS() const = 0; + virtual int getFPS() const; /** * Gets the average delta time (seconds per frame) over the last second. **/ - virtual double getAverageDelta() const = 0; + virtual double getAverageDelta() const; /** * Gets the amount of time passed since an unspecified time. Useful for @@ -75,7 +76,33 @@ public: * and increases monotonically. * @return The time (in seconds) **/ - virtual double getTime() const = 0; + virtual double getTime() const; + +private: + + // Frame delta vars. + double currTime; + double prevTime; + double prevFpsUpdate; + + // Updated with a certain frequency. + int fps; + double averageDelta; + + // The frequency by which to update the FPS. + double fpsUpdateFrequency; + + // Frames since last FPS update. + int frames; + + // The current timestep. + double dt; + + // The timer period (reciprocal of the frequency.) + const double timerPeriod; + + // Returns the timer period on some platforms. + static double getTimerPeriod(); }; // Timer diff --git a/jni/love/src/modules/timer/sdl/Timer.cpp b/jni/love/src/modules/timer/sdl/Timer.cpp index d710cb16..eb5e0c8a 100644 --- a/jni/love/src/modules/timer/sdl/Timer.cpp +++ b/jni/love/src/modules/timer/sdl/Timer.cpp @@ -19,38 +19,12 @@ **/ // LOVE -#include "common/config.h" #include "Timer.h" - #include "common/delay.h" -#include "common/int.h" // SDL #include -#if defined(LOVE_WINDOWS) -#include -#elif defined(LOVE_MACOSX) -#include -#include -#elif defined(LOVE_LINUX) -#include -#include -#include -#endif - -namespace -{ -#if defined(LOVE_LINUX) -inline double getTimeOfDay() -{ - timeval t; - gettimeofday(&t, NULL); - return (double) t.tv_sec + (double) t.tv_usec / 1000000.0; -} -#endif -} - namespace love { namespace timer @@ -59,20 +33,10 @@ namespace sdl { Timer::Timer() - : currTime(0) - , prevFpsUpdate(0) - , fps(0) - , averageDelta(0) - , fpsUpdateFrequency(1) - , frames(0) - , dt(0) - , timerPeriod(getTimerPeriod()) { // Init the SDL timer system (needed for SDL_Delay.) if (SDL_InitSubSystem(SDL_INIT_TIMER) < 0) - throw love::Exception("%s", SDL_GetError()); - - prevFpsUpdate = currTime = getTime(); + throw love::Exception("Could not initialize SDL timer subsystem (%s)", SDL_GetError()); } Timer::~Timer() @@ -86,94 +50,12 @@ const char *Timer::getName() const return "love.timer.sdl"; } -void Timer::step() -{ - // Frames rendered - frames++; - - // "Current" time is previous time by now. - prevTime = currTime; - - // Get time from system. - currTime = getTime(); - - // Convert to number of seconds. - dt = currTime - prevTime; - - double timeSinceLast = currTime - prevFpsUpdate; - // Update FPS? - if (timeSinceLast > fpsUpdateFrequency) - { - fps = int((frames/timeSinceLast) + 0.5); - averageDelta = timeSinceLast/frames; - prevFpsUpdate = currTime; - frames = 0; - } -} - void Timer::sleep(double seconds) const { if (seconds > 0) delay((unsigned int)(seconds*1000)); } -double Timer::getDelta() const -{ - return dt; -} - -int Timer::getFPS() const -{ - return fps; -} - -double Timer::getAverageDelta() const -{ - return averageDelta; -} - -double Timer::getTimerPeriod() -{ -#if defined(LOVE_MACOSX) - mach_timebase_info_data_t info; - mach_timebase_info(&info); - return (double) info.numer / (double) info.denom / 1000000000.0; -#elif defined(LOVE_WINDOWS) - LARGE_INTEGER temp; - if (QueryPerformanceFrequency(&temp) != 0 && temp.QuadPart != 0) - return 1.0 / (double) temp.QuadPart; -#endif - return 0; -} - -double Timer::getTime() const -{ -#if defined(LOVE_LINUX) - double mt; - // Check for POSIX timers and monotonic clocks. If not supported, use the gettimeofday fallback. -#if _POSIX_TIMERS > 0 && defined(_POSIX_MONOTONIC_CLOCK) \ -&& (defined(CLOCK_MONOTONIC_RAW) || defined(CLOCK_MONOTONIC)) - timespec t; -#ifdef CLOCK_MONOTONIC_RAW - clockid_t clk_id = CLOCK_MONOTONIC_RAW; -#else - clockid_t clk_id = CLOCK_MONOTONIC; -#endif - if (clock_gettime(clk_id, &t) == 0) - mt = (double) t.tv_sec + (double) t.tv_nsec / 1000000000.0; - else -#endif - mt = getTimeOfDay(); - return mt; -#elif defined(LOVE_MACOSX) - return (double) mach_absolute_time() * timerPeriod; -#elif defined(LOVE_WINDOWS) - LARGE_INTEGER microTime; - QueryPerformanceCounter(µTime); - return (double) microTime.QuadPart * timerPeriod; -#endif -} - } // sdl } // timer } // love diff --git a/jni/love/src/modules/timer/sdl/Timer.h b/jni/love/src/modules/timer/sdl/Timer.h index e4b13fef..3f2da641 100644 --- a/jni/love/src/modules/timer/sdl/Timer.h +++ b/jni/love/src/modules/timer/sdl/Timer.h @@ -31,58 +31,17 @@ namespace timer namespace sdl { -/** - * An SDL timer module. Can keep track of time between certain function - * calls, and provides access to a FPS metric which updates once each second. - **/ class Timer : public love::timer::Timer { public: - /** - * Constructor. Initializes the SDL/timer subsystem. - **/ Timer(); - - /** - * Destructor. - **/ virtual ~Timer(); - const char *getName() const; - void step(); - void sleep(double seconds) const; - double getDelta() const; - int getFPS() const; - double getAverageDelta() const; - double getTime() const; + const char *getName() const override; -private: + void sleep(double seconds) const override; - // Frame delta vars. - double currTime; - double prevTime; - double prevFpsUpdate; - - // Updated with a certain frequency. - int fps; - double averageDelta; - - // The frequency by which to update the FPS. - double fpsUpdateFrequency; - - // Frames since last FPS update. - int frames; - - // The current timestep. - double dt; - - // The timer period (reciprocal of the frequency.) - const double timerPeriod; - - // Returns the timer period on some platforms. - static double getTimerPeriod(); - }; // Timer } // sdl diff --git a/jni/love/src/modules/timer/wrap_Timer.cpp b/jni/love/src/modules/timer/wrap_Timer.cpp index 4fdb06f0..11e6c9f1 100644 --- a/jni/love/src/modules/timer/wrap_Timer.cpp +++ b/jni/love/src/modules/timer/wrap_Timer.cpp @@ -94,7 +94,7 @@ extern "C" int luaopen_love_timer(lua_State *L) WrappedModule w; w.module = instance; w.name = "timer"; - w.flags = MODULE_T; + w.type = MODULE_ID; w.functions = functions; w.types = 0; diff --git a/jni/love/src/modules/touch/Touch.h b/jni/love/src/modules/touch/Touch.h index 448018d1..70fe3314 100644 --- a/jni/love/src/modules/touch/Touch.h +++ b/jni/love/src/modules/touch/Touch.h @@ -41,10 +41,12 @@ public: struct TouchInfo { - int64 id; // Only unique for the duration of the touch-press. - float x; // Normalized to [0, 1]. - float y; // Normalized to [0, 1]. - float pressure; // Normalized to [0, 1]. + int64 id; // Identifier. Only unique for the duration of the touch-press. + double x; // Position in pixels along the x-axis. + double y; // Position in pixels along the y-axis. + double dx; // Amount in pixels moved along the x-axis. + double dy; // Amount in pixels moved along the y-axis. + double pressure; }; virtual ~Touch() {} @@ -53,15 +55,19 @@ public: virtual ModuleType getModuleType() const { return M_TOUCH; } /** - * Gets the number of current touch presses. + * Gets a list of the IDs of all currently active touches. **/ - virtual int getTouchCount() const = 0; + virtual std::vector getTouches() const = 0; /** - * Gets information about a touch press. The index is unstable and should - * not be relied on being the same in between calls. + * Gets the position in pixels of a specific touch, using its ID. **/ - virtual TouchInfo getTouch(int index) const = 0; + virtual void getPosition(int64 id, double &x, double &y) const = 0; + + /** + * Gets the pressure of a specific touch, using its ID. + **/ + virtual double getPressure(int64 id) const = 0; }; // Touch diff --git a/jni/love/src/modules/touch/sdl/Touch.cpp b/jni/love/src/modules/touch/sdl/Touch.cpp index 8c54f19e..6c1fee48 100644 --- a/jni/love/src/modules/touch/sdl/Touch.cpp +++ b/jni/love/src/modules/touch/sdl/Touch.cpp @@ -30,27 +30,34 @@ namespace touch namespace sdl { -int Touch::getTouchCount() const +std::vector Touch::getTouches() const { - return (int) touches.size(); + std::vector ids; + ids.reserve(touches.size()); + + for (const auto &touch : touches) + ids.push_back(touch.first); + + return ids; } -Touch::TouchInfo Touch::getTouch(int index) const +void Touch::getPosition(int64 id, double &x, double &y) const { - if (index < 0) - throw love::Exception("Invalid touch index: %d", index); + const auto it = touches.find(id); + if (it == touches.end()) + throw love::Exception("Invalid active touch ID: %d", id); - std::map::const_iterator it = touches.begin(); + x = it->second.x; + y = it->second.y; +} - // We can't do something like "touches.begin() + index", so we get the - // value at the index by iterating from the beginning of the map. - for (int i = 0; i < index; i++) - { - if (++it == touches.end()) - throw love::Exception("Invalid touch index: %d", index); - } +double Touch::getPressure(int64 id) const +{ + const auto it = touches.find(id); + if (it == touches.end()) + throw love::Exception("Invalid active touch ID: %d", id); - return it->second; + return it->second.pressure; } const char *Touch::getName() const @@ -58,16 +65,9 @@ const char *Touch::getName() const return "love.touch.sdl"; } -void Touch::onEvent(const SDL_TouchFingerEvent &event) +void Touch::onEvent(Uint32 eventtype, const TouchInfo &info) { - TouchInfo info = { - (int64) event.fingerId, - event.x, - event.y, - event.pressure - }; - - switch (event.type) + switch (eventtype) { case SDL_FINGERDOWN: case SDL_FINGERMOTION: diff --git a/jni/love/src/modules/touch/sdl/Touch.h b/jni/love/src/modules/touch/sdl/Touch.h index db5a2f83..00b51a27 100644 --- a/jni/love/src/modules/touch/sdl/Touch.h +++ b/jni/love/src/modules/touch/sdl/Touch.h @@ -43,18 +43,19 @@ public: virtual ~Touch() {} - virtual int getTouchCount() const; - virtual TouchInfo getTouch(int index) const; + std::vector getTouches() const override; + void getPosition(int64 id, double &x, double &y) const override; + double getPressure(int64 id) const override; // Implements Module. - virtual const char *getName() const; + const char *getName() const override; // SDL has functions to query the state of touch presses, but unfortunately // they are updated on a different thread in some backends, which causes // issues especially if the user is iterating through the current touches // when they're updated. So we only update our touch press state in // love::event::sdl::Event::convert. - void onEvent(const SDL_TouchFingerEvent &event); + void onEvent(Uint32 eventtype, const TouchInfo &info); private: diff --git a/jni/love/src/modules/touch/wrap_Touch.cpp b/jni/love/src/modules/touch/wrap_Touch.cpp index 4943311f..37059a16 100644 --- a/jni/love/src/modules/touch/wrap_Touch.cpp +++ b/jni/love/src/modules/touch/wrap_Touch.cpp @@ -32,32 +32,62 @@ namespace touch #define instance() (Module::getInstance(Module::M_TOUCH)) -int w_getTouchCount(lua_State *L) +int64 luax_checktouchid(lua_State *L, int idx) { - lua_pushinteger(L, instance()->getTouchCount()); + if (!lua_islightuserdata(L, idx)) + return luax_typerror(L, idx, "touch id"); + + return (int64) (intptr_t) lua_touserdata(L, 1); +} + +int w_getTouches(lua_State *L) +{ + std::vector ids = instance()->getTouches(); + + lua_createtable(L, (int) ids.size(), 0); + + for (size_t i = 0; i < ids.size(); i++) + { + // This is a bit hackish and we lose the higher 32 bits of the id on + // 32-bit systems, but SDL only ever gives id's that at most use as many + // bits as can fit in a pointer (for now.) + // We use lightuserdata instead of a lua_Number (double) because doubles + // can't represent all possible id values on 64-bit systems. + lua_pushlightuserdata(L, (void *) (intptr_t) ids[i]); + lua_rawseti(L, -2, (int) i + 1); + } + return 1; } -int w_getTouch(lua_State *L) +int w_getPosition(lua_State *L) { - int index = luaL_checkint(L, 1) - 1; + int64 id = luax_checktouchid(L, 1); - Touch::TouchInfo info; - luax_catchexcept(L, [&](){ info = instance()->getTouch(index); }); + double x = 0; + double y = 0; + luax_catchexcept(L, [&]() { instance()->getPosition(id, x, y); }); - // Lets hope the ID can be accurately represented in a Lua number... - lua_pushnumber(L, (lua_Number) info.id); - lua_pushnumber(L, info.x); - lua_pushnumber(L, info.y); - lua_pushnumber(L, info.pressure); + lua_pushnumber(L, x); + lua_pushnumber(L, y); - return 4; + return 2; +} + +int w_getPressure(lua_State *L) +{ + int64 id = luax_checktouchid(L, 1); + double pressure = 0.0; + luax_catchexcept(L, [&](){ pressure = instance()->getPressure(id); }); + lua_pushnumber(L, pressure); + return 1; } static const luaL_Reg functions[] = { - { "getTouchCount", w_getTouchCount }, - { "getTouch", w_getTouch }, + { "getTouches", w_getTouches }, + { "getPosition", w_getPosition }, + { "getPressure", w_getPressure }, { 0, 0 } }; @@ -74,7 +104,7 @@ extern "C" int luaopen_love_touch(lua_State *L) WrappedModule w; w.module = instance; w.name = "touch"; - w.flags = MODULE_T; + w.type = MODULE_ID; w.functions = functions; w.types = nullptr; diff --git a/jni/love/src/modules/touch/wrap_Touch.h b/jni/love/src/modules/touch/wrap_Touch.h index 89d376c5..161a4b1f 100644 --- a/jni/love/src/modules/touch/wrap_Touch.h +++ b/jni/love/src/modules/touch/wrap_Touch.h @@ -24,14 +24,17 @@ // LOVE #include "Touch.h" #include "common/runtime.h" +#include "common/int.h" namespace love { namespace touch { -int w_getTouchCount(lua_State *L); -int w_getTouch(lua_State *L); +int64 luax_checktouchid(lua_State *L, int idx); +int w_getTouches(lua_State *L); +int w_getPosition(lua_State *L); +int w_getPressure(lua_State *L); extern "C" LOVE_EXPORT int luaopen_love_touch(lua_State *L); } // touch diff --git a/jni/love/src/modules/window/Window.cpp b/jni/love/src/modules/window/Window.cpp index 476bddc0..c513bc4e 100644 --- a/jni/love/src/modules/window/Window.cpp +++ b/jni/love/src/modules/window/Window.cpp @@ -38,26 +38,6 @@ void Window::swapBuffers() { } -WindowSettings::WindowSettings() - : fullscreen(false) - , fstype(Window::FULLSCREEN_TYPE_NORMAL) - , vsync(true) - , msaa(0) - , resizable(false) - , minwidth(1) - , minheight(1) - , borderless(false) - , centered(true) - , display(0) - , highdpi(false) - , sRGB(false) - , refreshrate(0.0) - , useposition(false) - , x(0) - , y(0) -{ -} - bool Window::getConstant(const char *in, Window::FullscreenType &out) { return fullscreenTypes.find(in, out); @@ -93,7 +73,6 @@ StringMap::Entry Window::settingEntri {"fullscreen", SETTING_FULLSCREEN}, {"fullscreentype", SETTING_FULLSCREEN_TYPE}, {"vsync", SETTING_VSYNC}, - {"fsaa", SETTING_FSAA}, {"msaa", SETTING_MSAA}, {"resizable", SETTING_RESIZABLE}, {"minwidth", SETTING_MIN_WIDTH}, @@ -110,19 +89,19 @@ StringMap::Entry Window::settingEntri StringMap Window::settings(Window::settingEntries, sizeof(Window::settingEntries)); -StringMap::Entry Window::fullscreenTypeEntries[] = +StringMap::Entry Window::fullscreenTypeEntries[] = { - {"normal", Window::FULLSCREEN_TYPE_NORMAL}, - {"desktop", Window::FULLSCREEN_TYPE_DESKTOP}, + {"exclusive", FULLSCREEN_EXCLUSIVE}, + {"desktop", FULLSCREEN_DESKTOP}, }; -StringMap Window::fullscreenTypes(Window::fullscreenTypeEntries, sizeof(Window::fullscreenTypeEntries)); +StringMap Window::fullscreenTypes(Window::fullscreenTypeEntries, sizeof(Window::fullscreenTypeEntries)); StringMap::Entry Window::messageBoxTypeEntries[] = { - {"error", Window::MESSAGEBOX_ERROR}, - {"warning", Window::MESSAGEBOX_WARNING}, - {"info", Window::MESSAGEBOX_INFO}, + {"error", MESSAGEBOX_ERROR}, + {"warning", MESSAGEBOX_WARNING}, + {"info", MESSAGEBOX_INFO}, }; StringMap Window::messageBoxTypes(Window::messageBoxTypeEntries, sizeof(Window::messageBoxTypeEntries)); diff --git a/jni/love/src/modules/window/Window.h b/jni/love/src/modules/window/Window.h index 9520589c..e0738011 100644 --- a/jni/love/src/modules/window/Window.h +++ b/jni/love/src/modules/window/Window.h @@ -49,7 +49,6 @@ public: SETTING_FULLSCREEN, SETTING_FULLSCREEN_TYPE, SETTING_VSYNC, - SETTING_FSAA, // For backward-compatibility. TODO: remove! SETTING_MSAA, SETTING_RESIZABLE, SETTING_MIN_WIDTH, @@ -67,9 +66,9 @@ public: enum FullscreenType { - FULLSCREEN_TYPE_NORMAL, - FULLSCREEN_TYPE_DESKTOP, - FULLSCREEN_TYPE_MAX_ENUM + FULLSCREEN_EXCLUSIVE, + FULLSCREEN_DESKTOP, + FULLSCREEN_MAX_ENUM }; enum MessageBoxType @@ -116,7 +115,7 @@ public: virtual bool setFullscreen(bool fullscreen, FullscreenType fstype) = 0; virtual bool setFullscreen(bool fullscreen) = 0; - virtual bool onWindowResize(int width, int height) = 0; + virtual bool onSizeChanged(int width, int height) = 0; virtual int getDisplayCount() const = 0; @@ -124,9 +123,6 @@ public: virtual std::vector getFullscreenSizes(int displayindex) const = 0; - virtual int getWidth() const = 0; - virtual int getHeight() const = 0; - virtual void getDesktopDimensions(int displayindex, int &width, int &height) const = 0; virtual void setPosition(int x, int y, int displayindex) = 0; @@ -157,9 +153,13 @@ public: virtual void setMouseGrab(bool grab) = 0; virtual bool isMouseGrabbed() const = 0; - virtual double getPixelScale() const = 0; + virtual void getPixelDimensions(int &w, int &h) const = 0; + // Note: window-space coordinates are not necessarily the same as + // density-independent units (which toPixels and fromPixels use.) + virtual void windowToPixelCoords(double *x, double *y) const = 0; + virtual void pixelToWindowCoords(double *x, double *y) const = 0; - virtual bool isTouchScreen(int displayindex) const = 0; + virtual double getPixelScale() const = 0; virtual double toPixels(double x) const = 0; virtual void toPixels(double wx, double wy, double &px, double &py) const = 0; @@ -171,9 +171,10 @@ public: virtual bool showMessageBox(const std::string &title, const std::string &message, MessageBoxType type, bool attachtowindow) = 0; virtual int showMessageBox(const MessageBoxData &data) = 0; + virtual void requestAttention(bool continuous) = 0; + //virtual static Window *createSingleton() = 0; - //virtual static Window *getSingleton() = 0; - // No virtual statics, of course, but you are supposed to implement these statics. + // No virtual statics, of course, but you are supposed to implement this static. static bool getConstant(const char *in, Setting &out); static bool getConstant(Setting in, const char *&out); @@ -193,8 +194,8 @@ private: static StringMap::Entry settingEntries[]; static StringMap settings; - static StringMap::Entry fullscreenTypeEntries[]; - static StringMap fullscreenTypes; + static StringMap::Entry fullscreenTypeEntries[]; + static StringMap fullscreenTypes; static StringMap::Entry messageBoxTypeEntries[]; static StringMap messageBoxTypes; @@ -203,26 +204,23 @@ private: struct WindowSettings { - WindowSettings(); - - bool fullscreen; // = false - Window::FullscreenType fstype; // = FULLSCREEN_TYPE_NORMAL - bool vsync; // = true - int msaa; // = 0 - bool resizable; // = false - int minwidth; // = 1 - int minheight; // = 1 - bool borderless; // = false - bool centered; // = true - int display; // = 0 - bool highdpi; // false - bool sRGB; // false - double refreshrate; // 0.0 - bool useposition; // false - int x; // 0 - int y; // 0 - -}; // WindowSettings + bool fullscreen = false; + Window::FullscreenType fstype = Window::FULLSCREEN_DESKTOP; + bool vsync = true; + int msaa = 0; + bool resizable = false; + int minwidth = 1; + int minheight = 1; + bool borderless = false; + bool centered = true; + int display = 0; + bool highdpi = false; + bool sRGB = false; + double refreshrate = 0.0; + bool useposition = false; + int x = 0; + int y = 0; +}; } // window } // love diff --git a/jni/love/src/modules/window/sdl/Window.cpp b/jni/love/src/modules/window/sdl/Window.cpp index d4ab7074..7d94fe7b 100644 --- a/jni/love/src/modules/window/sdl/Window.cpp +++ b/jni/love/src/modules/window/sdl/Window.cpp @@ -33,7 +33,20 @@ #include // C -#include +#include + +// SDL +#include + +#if defined(LOVE_WINDOWS) +#include +#elif defined(LOVE_MACOSX) +#include "common/OSX.h" +#endif + +#ifndef APIENTRY +#define APIENTRY +#endif namespace love { @@ -43,14 +56,15 @@ namespace sdl { Window::Window() - : windowTitle("") - , created(false) + : created(false) , mouseGrabbed(false) - , window(0) - , context(0) + , window(nullptr) + , context(nullptr) + , displayedWindowError(false) + , displayedContextError(false) { if (SDL_InitSubSystem(SDL_INIT_VIDEO) < 0) - throw love::Exception("%s", SDL_GetError()); + throw love::Exception("Could not initialize SDL video subsystem (%s)", SDL_GetError()); } Window::~Window() @@ -70,12 +84,288 @@ Window::~Window() SDL_QuitSubSystem(SDL_INIT_VIDEO); } -Window::_currentMode::_currentMode() - : width(800) - , height(600) - , settings() - , icon(0) +void Window::setGLFramebufferAttributes(int msaa, bool sRGB) { + // Set GL window / framebuffer attributes. + SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8); + SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8); + SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8); + SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, 8); + SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); + SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 1); + SDL_GL_SetAttribute(SDL_GL_RETAINED_BACKING, 0); + + SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, (msaa > 0) ? 1 : 0); + SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, (msaa > 0) ? msaa : 0); + + // SDL or GLX may have bugs with this: https://bugzilla.libsdl.org/show_bug.cgi?id=2897 + // It's fine to leave the attribute disabled on desktops though, because in + // practice the framebuffer will be sRGB-capable even if it's not requested. +#if !defined(LOVE_LINUX) + SDL_GL_SetAttribute(SDL_GL_FRAMEBUFFER_SRGB_CAPABLE, sRGB ? 1 : 0); +#endif +} + +void Window::setGLContextAttributes(const ContextAttribs &attribs) +{ + int profilemask = 0; + int contextflags = 0; + + if (attribs.gles) + profilemask |= SDL_GL_CONTEXT_PROFILE_ES; + else if (attribs.debug) + profilemask |= SDL_GL_CONTEXT_PROFILE_COMPATIBILITY; + + if (attribs.debug) + contextflags |= SDL_GL_CONTEXT_DEBUG_FLAG; + + SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, attribs.versionMajor); + SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, attribs.versionMinor); + SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, profilemask); + SDL_GL_SetAttribute(SDL_GL_CONTEXT_FLAGS, contextflags); +} + +bool Window::checkGLVersion(const ContextAttribs &attribs) +{ + typedef unsigned char GLubyte; + typedef unsigned int GLenum; + typedef const GLubyte *(APIENTRY *glGetStringPtr)(GLenum name); + const GLenum GL_VERSION_ENUM = 0x1F02; + + // We don't have OpenGL headers or an automatic OpenGL function loader in + // this module, so we have to get the glGetString function pointer ourselves. + glGetStringPtr glGetStringFunc = (glGetStringPtr) SDL_GL_GetProcAddress("glGetString"); + if (!glGetStringFunc) + return false; + + const char *glversion = (const char *) glGetStringFunc(GL_VERSION_ENUM); + if (!glversion) + return false; + + int glmajor = 0; + int glminor = 0; + + // glGetString(GL_VERSION) returns a string with the format "major.minor", + // or "OpenGL ES major.minor" in GLES contexts. + const char *format = "%d.%d"; + if (attribs.gles) + format = "OpenGL ES %d.%d"; + + if (sscanf(glversion, format, &glmajor, &glminor) != 2) + return false; + + if (glmajor < attribs.versionMajor + || (glmajor == attribs.versionMajor && glminor < attribs.versionMinor)) + return false; + + return true; +} + +bool Window::createWindowAndContext(int x, int y, int w, int h, Uint32 windowflags, int msaa, bool sRGB) +{ + bool preferGLES = false; + +#ifdef LOVE_GRAPHICS_USE_OPENGLES + preferGLES = true; +#endif + + const char *curdriver = SDL_GetCurrentVideoDriver(); + const char *glesdrivers[] = {"RPI", "Android", "uikit", "winrt", "emscripten"}; + + // We always want to try OpenGL ES first on certain video backends. + for (const char *glesdriver : glesdrivers) + { + if (curdriver && strstr(curdriver, glesdriver) == curdriver) + { + preferGLES = true; + break; + } + } + + if (!preferGLES) + { + const char *gleshint = SDL_GetHint("LOVE_GRAPHICS_USE_OPENGLES"); + preferGLES = (gleshint != nullptr && gleshint[0] != '0'); + } + + // Do we want a debug context? + const char *debughint = SDL_GetHint("LOVE_GRAPHICS_DEBUG"); + bool debug = (debughint != nullptr && debughint[0] != '0'); + + // Different context attribute profiles to try. + std::vector attribslist = { + {2, 1, false, debug}, // OpenGL 2.1. + {3, 0, true, debug}, // OpenGL ES 3. + {2, 0, true, debug}, // OpenGL ES 2. + }; + + SDL_version sdlversion = {}; + SDL_GetVersion(&sdlversion); + + // OpenGL ES 3+ contexts are only properly supported in SDL 2.0.4+. + if (sdlversion.major == 2 && sdlversion.minor == 0 && sdlversion.patch <= 3) + attribslist.erase(attribslist.begin() + 1); + + // Move OpenGL ES to the front of the list if we should prefer GLES. + if (preferGLES) + std::rotate(attribslist.begin(), attribslist.begin() + 1, attribslist.end()); + + if (context) + { + SDL_GL_DeleteContext(context); + context = nullptr; + } + + std::string windowerror; + + // Try each context profile in order. + for (ContextAttribs attribs : attribslist) + { + // Unfortunately some OpenGL context settings are part of the internal + // window state in the Windows and Linux SDL backends, so we have to + // recreate the window when we want to change those settings... + if (window) + { + SDL_DestroyWindow(window); + SDL_FlushEvent(SDL_WINDOWEVENT); + window = nullptr; + } + + int curMSAA = msaa; + bool curSRGB = sRGB; + + setGLFramebufferAttributes(curMSAA, curSRGB); + setGLContextAttributes(attribs); + + window = SDL_CreateWindow(title.c_str(), x, y, w, h, windowflags); + + if (!window && curMSAA > 0) + { + // The MSAA setting could have caused the failure. + setGLFramebufferAttributes(0, curSRGB); + window = SDL_CreateWindow(title.c_str(), x, y, w, h, windowflags); + if (window) + curMSAA = 0; + } + + if (!window && curSRGB) + { + // same with sRGB. + setGLFramebufferAttributes(curMSAA, false); + window = SDL_CreateWindow(title.c_str(), x, y, w, h, windowflags); + if (window) + curSRGB = false; + } + + if (!window && curMSAA > 0 && curSRGB) + { + // Or both! + setGLFramebufferAttributes(0, false); + window = SDL_CreateWindow(title.c_str(), x, y, w, h, windowflags); + if (window) + { + curMSAA = 0; + curSRGB = false; + } + } + + // Immediately try the next context profile if window creation failed. + if (!window) + { + windowerror = std::string(SDL_GetError()); + continue; + } + + windowerror.clear(); + + context = SDL_GL_CreateContext(window); + + if (!context && curMSAA > 0) + { + // MSAA and sRGB settings can also cause CreateContext to fail, on + // certain SDL backends. + setGLFramebufferAttributes(0, curSRGB); + context = SDL_GL_CreateContext(window); + } + + if (!context && curSRGB) + { + setGLFramebufferAttributes(curMSAA, false); + context = SDL_GL_CreateContext(window); + } + + if (!context && curMSAA > 0 && curSRGB) + { + setGLFramebufferAttributes(0, false); + context = SDL_GL_CreateContext(window); + } + + if (!context && attribs.debug) + { + attribs.debug = false; + setGLContextAttributes(attribs); + context = SDL_GL_CreateContext(window); + } + + // Make sure the context's version is at least what we requested. + if (context && !checkGLVersion(attribs)) + { + SDL_GL_DeleteContext(context); + context = nullptr; + } + + if (context) + break; + } + + if (!context || !window) + { + if (!windowerror.empty()) + { + std::string title = "Unable to create window"; + std::string message = "SDL error: " + windowerror; + + std::cerr << title << std::endl << message << std::endl; + + // Display a message box with the error, but only once. + if (!displayedWindowError) + { + showMessageBox(title, message, MESSAGEBOX_ERROR, false); + displayedWindowError = true; + } + } + else if (!context) + { + std::string title = "Unable to initialize OpenGL"; + std::string message = "This program requires a graphics card and video drivers which support OpenGL 2.1 or OpenGL ES 2."; + + std::cerr << title << std::endl << message << std::endl; + + // Display a message box with the error, but only once. + if (!displayedContextError) + { + showMessageBox(title, message, MESSAGEBOX_ERROR, true); + displayedContextError = true; + } + } + + if (context) + { + SDL_GL_DeleteContext(context); + context = nullptr; + } + + if (window) + { + SDL_DestroyWindow(window); + SDL_FlushEvent(SDL_WINDOWEVENT); + window = nullptr; + } + + return false; + } + + return true; } bool Window::setWindow(int width, int height, WindowSettings *settings) @@ -103,12 +393,12 @@ bool Window::setWindow(int width, int height, WindowSettings *settings) // On Android we always must have fullscreen type FULLSCREEN_TYPE_DESKTOP #ifdef LOVE_ANDROID - f.fstype = FULLSCREEN_TYPE_DESKTOP; + f.fstype = FULLSCREEN_DESKTOP; #endif if (f.fullscreen) { - if (f.fstype == FULLSCREEN_TYPE_DESKTOP) + if (f.fstype == FULLSCREEN_DESKTOP) sdlflags |= SDL_WINDOW_FULLSCREEN_DESKTOP; else { @@ -136,11 +426,8 @@ bool Window::setWindow(int width, int height, WindowSettings *settings) if (f.borderless) sdlflags |= SDL_WINDOW_BORDERLESS; - // FIXME: disabled in Linux for runtime SDL 2.0.0 compatibility. -#if SDL_VERSION_ATLEAST(2,0,1) && !defined(LOVE_LINUX) if (f.highdpi) sdlflags |= SDL_WINDOW_ALLOW_HIGHDPI; -#endif int x = f.x; int y = f.y; @@ -165,65 +452,34 @@ bool Window::setWindow(int width, int height, WindowSettings *settings) if (gfx != nullptr) gfx->unSetMode(); - // Destroy and recreate the window if the dimensions or flags have changed. + if (context) + { + SDL_GL_DeleteContext(context); + context = nullptr; + } + if (window) { - int curdisplay = SDL_GetWindowDisplayIndex(window); - Uint32 wflags = SDL_GetWindowFlags(window); + SDL_DestroyWindow(window); + window = nullptr; - Uint32 testflags = SDL_WINDOW_OPENGL | SDL_WINDOW_FULLSCREEN_DESKTOP - | SDL_WINDOW_RESIZABLE | SDL_WINDOW_BORDERLESS; - - // FIXME: disabled in Linux for runtime SDL 2.0.0 compatibility. -#if SDL_VERSION_ATLEAST(2,0,1) && !defined(LOVE_LINUX) - testflags |= SDL_WINDOW_ALLOW_HIGHDPI; -#endif - - wflags &= testflags; - - if (sdlflags != wflags || width != curMode.width || height != curMode.height - || f.display != curdisplay || f.msaa != curMode.settings.msaa) - { - SDL_DestroyWindow(window); - window = 0; - - // The old window may have generated pending events which are no - // longer relevant. Destroy them all! - SDL_FlushEvent(SDL_WINDOWEVENT); - } + // The old window may have generated pending events which are no longer + // relevant. Destroy them all! + SDL_FlushEvent(SDL_WINDOWEVENT); } - if (!window) - { - created = false; + created = false; - // In Windows and Linux, some GL attributes are set on window creation. - setWindowGLAttributes(f.msaa, f.sRGB); - - const char *title = windowTitle.c_str(); - - window = SDL_CreateWindow(title, x, y, width, height, sdlflags); - - if (!window && f.msaa > 0) - { - // MSAA might have caused the failure, disable it and try again. - SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, 0); - SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 0); - - window = SDL_CreateWindow(title, x, y, width, height, sdlflags); - f.msaa = 0; - } - - // Make sure the window keeps any previously set icon. - if (window && curMode.icon.get()) - setIcon(curMode.icon.get()); - } - - if (!window) - { - showMessageBox("Could not create window", SDL_GetError(), MESSAGEBOX_ERROR, false); + if (!createWindowAndContext(x, y, width, height, sdlflags, f.msaa, f.sRGB)) return false; - } + + created = true; + + // Make sure the window keeps any previously set icon. + setIcon(curMode.icon.get()); + + // Make sure the mouse keeps its previous grab setting. + setMouseGrab(mouseGrabbed); // Enforce minimum window dimensions. SDL_SetWindowMinimumSize(window, f.minwidth, f.minheight); @@ -233,41 +489,21 @@ bool Window::setWindow(int width, int height, WindowSettings *settings) SDL_RaiseWindow(window); - if (!setContext(f.msaa, f.vsync, f.sRGB)) - { - created = false; - return false; - } - - created = true; + SDL_GL_SetSwapInterval(f.vsync ? 1 : 0); updateSettings(f); if (gfx != nullptr) - { - int width = curMode.width; - int height = curMode.height; - - // FIXME: disabled in Linux for runtime SDL 2.0.0 compatibility. -#if SDL_VERSION_ATLEAST(2,0,1) && !defined(LOVE_LINUX) - SDL_GL_GetDrawableSize(window, &width, &height); -#endif - - if (!gfx->setMode(width, height, curMode.settings.sRGB)) - showMessageBox("Could not set graphics mode", "Unsupported OpenGL version?", MESSAGEBOX_ERROR, true); + gfx->setMode(curMode.pixelwidth, curMode.pixelheight, curMode.settings.sRGB); #ifdef LOVE_ANDROID love::android::setImmersive(f.fullscreen); #endif - } - - // Make sure the mouse keeps its previous grab setting. - setMouseGrab(mouseGrabbed); return true; } -bool Window::onWindowResize(int width, int height) +bool Window::onSizeChanged(int width, int height) { if (!window) return false; @@ -275,166 +511,32 @@ bool Window::onWindowResize(int width, int height) curMode.width = width; curMode.height = height; - return true; -} + SDL_GL_GetDrawableSize(window, &curMode.pixelwidth, &curMode.pixelheight); -bool Window::setContext(int msaa, bool vsync, bool sRGB) -{ - // We would normally only need to recreate the context if MSAA changes or - // SDL_GL_MakeCurrent is unsuccessful, but in Windows MakeCurrent can - // sometimes claim success but the context will actually be trashed. - if (context) - { - SDL_GL_DeleteContext(context); - context = 0; - } - - // Make sure the proper attributes are set. - setWindowGLAttributes(msaa, sRGB); - - context = SDL_GL_CreateContext(window); - - if (!context && msaa > 0) - { - // MSAA might have caused the failure, disable it and try again. - SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, 0); - SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 0); - context = SDL_GL_CreateContext(window); - } - - if (!context) - { - int flags = 0; - int profilemask = 0; - SDL_GL_GetAttribute(SDL_GL_CONTEXT_FLAGS, &flags); - SDL_GL_GetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, &profilemask); - if (flags & SDL_GL_CONTEXT_DEBUG_FLAG) - { - profilemask &= ~SDL_GL_CONTEXT_PROFILE_COMPATIBILITY; - SDL_GL_SetAttribute(SDL_GL_CONTEXT_FLAGS, 0); - SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, profilemask); - context = SDL_GL_CreateContext(window); - } - } - - if (!context) - { - showMessageBox("Could not create OpenGL context", SDL_GetError(), MESSAGEBOX_ERROR, true); - return false; - } - - // Set vertical synchronization. - SDL_GL_SetSwapInterval(vsync ? 1 : 0); - - // Verify MSAA setting. - int buffers; - int samples; - SDL_GL_GetAttribute(SDL_GL_MULTISAMPLEBUFFERS, &buffers); - SDL_GL_GetAttribute(SDL_GL_MULTISAMPLESAMPLES, &samples); - - // Don't fail because of this, but issue a warning. - if ((!buffers && msaa) || (samples != msaa)) - { - std::cerr << "Warning, MSAA setting failed! (Result: buffers: " << buffers << ", samples: " << samples << ")" << std::endl; - msaa = (buffers > 0) ? samples : 0; - } - - curMode.settings.msaa = msaa; - curMode.settings.vsync = SDL_GL_GetSwapInterval() != 0; + graphics::Graphics *gfx = Module::getInstance(Module::M_GRAPHICS); + if (gfx != nullptr) + gfx->setViewportSize(curMode.pixelwidth, curMode.pixelheight); return true; } -void Window::setWindowGLAttributes(int msaa, bool /* sRGB */) const -{ - // Set GL window attributes. - SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8); - SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8); - SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8); - SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, 8); - SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); - SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 1); - SDL_GL_SetAttribute(SDL_GL_RETAINED_BACKING, 0); - - // MSAA. - SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, (msaa > 0) ? 1 : 0); - SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, (msaa > 0) ? msaa : 0); - - /* FIXME: Enable this code but make sure to try to re-create the window and - * context with this disabled, if creation fails with it enabled. - * We can leave this out for now because in practice the framebuffer will - * already be sRGB-capable (on desktops at least.) - #if SDL_VERSION_ATLEAST(2,0,1) - SDL_GL_SetAttribute(SDL_GL_FRAMEBUFFER_SRGB_CAPABLE, sRGB ? 1 : 0); - #endif - */ - - int contextprofile = 0; - - bool tryGLES = false; - - const char *driver = SDL_GetCurrentVideoDriver(); - const char *glesdrivers[] = {"RPI", "Android", "uikit", "winrt"}; - - // We always want to use OpenGL ES on certain video backends. - for (size_t i = 0; i < sizeof(glesdrivers) / sizeof(glesdrivers[0]); i++) - { - if (driver && strstr(driver, glesdrivers[i])) - { - tryGLES = true; - break; - } - } - - const char *hint = SDL_GetHint("LOVE_GRAPHICS_USE_OPENGLES"); - if (hint) - tryGLES = (*hint) != '0'; - - if (tryGLES) - { - // Use OpenGL ES 2+. - contextprofile = SDL_GL_CONTEXT_PROFILE_ES; - SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2); - SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 0); - } - else - { - // Use desktop OpenGL. - contextprofile = 0; - SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2); // default - SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 1); - } - - // Do we want a debug context? - const char *debugenv = SDL_GetHint("LOVE_GRAPHICS_DEBUG"); - if (debugenv && *debugenv == '1') - { - SDL_GL_SetAttribute(SDL_GL_CONTEXT_FLAGS, SDL_GL_CONTEXT_DEBUG_FLAG); - if (!tryGLES) - contextprofile |= SDL_GL_CONTEXT_PROFILE_COMPATIBILITY; - } - else - SDL_GL_SetAttribute(SDL_GL_CONTEXT_FLAGS, 0); - - SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, contextprofile); -} - void Window::updateSettings(const WindowSettings &newsettings) { Uint32 wflags = SDL_GetWindowFlags(window); // Set the new display mode as the current display mode. SDL_GetWindowSize(window, &curMode.width, &curMode.height); + SDL_GL_GetDrawableSize(window, &curMode.pixelwidth, &curMode.pixelheight); if ((wflags & SDL_WINDOW_FULLSCREEN_DESKTOP) == SDL_WINDOW_FULLSCREEN_DESKTOP) { curMode.settings.fullscreen = true; - curMode.settings.fstype = FULLSCREEN_TYPE_DESKTOP; + curMode.settings.fstype = FULLSCREEN_DESKTOP; } else if ((wflags & SDL_WINDOW_FULLSCREEN) == SDL_WINDOW_FULLSCREEN) { curMode.settings.fullscreen = true; - curMode.settings.fstype = FULLSCREEN_TYPE_NORMAL; + curMode.settings.fstype = FULLSCREEN_EXCLUSIVE; } else { @@ -461,21 +563,26 @@ void Window::updateSettings(const WindowSettings &newsettings) getPosition(curMode.settings.x, curMode.settings.y, curMode.settings.display); -#if SDL_VERSION_ATLEAST(2,0,1) curMode.settings.highdpi = (wflags & SDL_WINDOW_ALLOW_HIGHDPI) != 0; -#else - curMode.settings.highdpi = false; -#endif // Only minimize on focus loss if the window is in exclusive-fullscreen // mode. - if (curMode.settings.fullscreen && curMode.settings.fstype == FULLSCREEN_TYPE_NORMAL) + if (curMode.settings.fullscreen && curMode.settings.fstype == FULLSCREEN_EXCLUSIVE) SDL_SetHint(SDL_HINT_VIDEO_MINIMIZE_ON_FOCUS_LOSS, "1"); else SDL_SetHint(SDL_HINT_VIDEO_MINIMIZE_ON_FOCUS_LOSS, "0"); curMode.settings.sRGB = newsettings.sRGB; + // Verify MSAA setting. + int buffers = 0; + int samples = 0; + SDL_GL_GetAttribute(SDL_GL_MULTISAMPLEBUFFERS, &buffers); + SDL_GL_GetAttribute(SDL_GL_MULTISAMPLESAMPLES, &samples); + + curMode.settings.msaa = (buffers > 0 ? samples : 0); + curMode.settings.vsync = SDL_GL_GetSwapInterval() != 0; + SDL_DisplayMode dmode = {}; SDL_GetCurrentDisplayMode(curMode.settings.display, &dmode); @@ -507,7 +614,7 @@ bool Window::setFullscreen(bool fullscreen, Window::FullscreenType fstype) if (fullscreen) { - if (fstype == FULLSCREEN_TYPE_DESKTOP) + if (fstype == FULLSCREEN_DESKTOP) sdlflags = SDL_WINDOW_FULLSCREEN_DESKTOP; else { @@ -534,17 +641,7 @@ bool Window::setFullscreen(bool fullscreen, Window::FullscreenType fstype) // Update the viewport size now instead of waiting for event polling. graphics::Graphics *gfx = Module::getInstance(Module::M_GRAPHICS); if (gfx != nullptr) - { - int width = curMode.width; - int height = curMode.height; - - // FIXME: disabled in Linux for runtime SDL 2.0.0 compatibility. -#if SDL_VERSION_ATLEAST(2,0,1) && !defined(LOVE_LINUX) - SDL_GL_GetDrawableSize(window, &width, &height); -#endif - - gfx->setViewportSize(width, height); - } + gfx->setViewportSize(curMode.pixelwidth, curMode.pixelheight); return true; } @@ -594,16 +691,6 @@ std::vector Window::getFullscreenSizes(int displayindex) const return sizes; } -int Window::getWidth() const -{ - return curMode.width; -} - -int Window::getHeight() const -{ - return curMode.height; -} - void Window::getDesktopDimensions(int displayindex, int &width, int &height) const { if (displayindex >= 0 && displayindex < getDisplayCount()) @@ -671,7 +758,7 @@ bool Window::isCreated() const void Window::setWindowTitle(const std::string &title) { - windowTitle = title; + this->title = title; if (window) SDL_SetWindowTitle(window, title.c_str()); @@ -679,7 +766,7 @@ void Window::setWindowTitle(const std::string &title) const std::string &Window::getWindowTitle() const { - return windowTitle; + return title; } bool Window::setIcon(love::image::ImageData *imgd) @@ -783,43 +870,39 @@ void Window::setMouseGrab(bool grab) bool Window::isMouseGrabbed() const { if (window) - return (bool) SDL_GetWindowGrab(window); + return SDL_GetWindowGrab(window) != SDL_FALSE; else return mouseGrabbed; } -double Window::getPixelScale() const +void Window::getPixelDimensions(int &w, int &h) const { - double scale = 1.0; - -#ifdef LOVE_ANDROID - scale = love::android::getScreenScale(); - // FIXME: disabled in Linux for runtime SDL 2.0.0 compatibility. -#elif SDL_VERSION_ATLEAST(2,0,1) && !defined(LOVE_LINUX) - if (window) - { - int wheight; - SDL_GetWindowSize(window, nullptr, &wheight); - - int dheight = wheight; - SDL_GL_GetDrawableSize(window, nullptr, &dheight); - - scale = (double) dheight / wheight; - } -#endif - - return scale; + w = curMode.pixelwidth; + h = curMode.pixelheight; } -bool Window::isTouchScreen(int displayindex) const +void Window::windowToPixelCoords(double *x, double *y) const { -#if defined(LOVE_ANDROID) || defined(LOVE_IOS) - // Display 0 is always a touch screen on Android and iOS. - return displayindex == 0; + if (x != nullptr) + *x = (*x) * ((double) curMode.pixelwidth / (double) curMode.width); + if (y != nullptr) + *y = (*y) * ((double) curMode.pixelheight / (double) curMode.height); +} + +void Window::pixelToWindowCoords(double *x, double *y) const +{ + if (x != nullptr) + *x = (*x) * ((double) curMode.width / (double) curMode.pixelwidth); + if (y != nullptr) + *y = (*y) * ((double) curMode.height / (double) curMode.pixelheight); +} + +double Window::getPixelScale() const +{ +#ifdef LOVE_ANDROID + return love::android::getScreenScale(); #else - // TODO: implement for Windows and Linux. - LOVE_UNUSED(displayindex); - return false; + return (double) curMode.pixelheight / (double) curMode.height; #endif } @@ -887,17 +970,17 @@ int Window::showMessageBox(const MessageBoxData &data) std::vector sdlbuttons; - for (size_t i = 0; i < data.buttons.size(); i++) + for (int i = 0; i < (int) data.buttons.size(); i++) { SDL_MessageBoxButtonData sdlbutton = {}; - sdlbutton.buttonid = (int) i; + sdlbutton.buttonid = i; sdlbutton.text = data.buttons[i].c_str(); - if ((int) i == data.enterButtonIndex) + if (i == data.enterButtonIndex) sdlbutton.flags |= SDL_MESSAGEBOX_BUTTON_RETURNKEY_DEFAULT; - if ((int) i == data.escapeButtonIndex) + if (i == data.escapeButtonIndex) sdlbutton.flags |= SDL_MESSAGEBOX_BUTTON_ESCAPEKEY_DEFAULT; sdlbuttons.push_back(sdlbutton); @@ -911,6 +994,46 @@ int Window::showMessageBox(const MessageBoxData &data) return pressedbutton; } +void Window::requestAttention(bool continuous) +{ +#if defined(LOVE_WINDOWS) + + if (hasFocus()) + return; + + SDL_SysWMinfo wminfo = {}; + SDL_VERSION(&wminfo.version); + + if (SDL_GetWindowWMInfo(window, &wminfo)) + { + FLASHWINFO flashinfo = {}; + flashinfo.cbSize = sizeof(FLASHWINFO); + flashinfo.hwnd = wminfo.info.win.window; + flashinfo.uCount = 1; + flashinfo.dwFlags = FLASHW_ALL; + + if (continuous) + { + flashinfo.uCount = 0; + flashinfo.dwFlags |= FLASHW_TIMERNOFG; + } + + FlashWindowEx(&flashinfo); + } + +#elif defined(LOVE_MACOSX) + + love::osx::requestAttention(continuous); + +#else + + LOVE_UNUSED(continuous); + +#endif + + // TODO: Linux? +} + love::window::Window *Window::createSingleton() { if (!singleton) @@ -921,11 +1044,6 @@ love::window::Window *Window::createSingleton() return singleton; } -love::window::Window *Window::getSingleton() -{ - return singleton; -} - const char *Window::getName() const { return "love.window.sdl"; diff --git a/jni/love/src/modules/window/sdl/Window.h b/jni/love/src/modules/window/sdl/Window.h index e8487a50..9f1eda42 100644 --- a/jni/love/src/modules/window/sdl/Window.h +++ b/jni/love/src/modules/window/sdl/Window.h @@ -47,7 +47,7 @@ public: bool setFullscreen(bool fullscreen, FullscreenType fstype); bool setFullscreen(bool fullscreen); - bool onWindowResize(int width, int height); + bool onSizeChanged(int width, int height); int getDisplayCount() const; @@ -55,9 +55,6 @@ public: std::vector getFullscreenSizes(int displayindex) const; - int getWidth() const; - int getHeight() const; - void getDesktopDimensions(int displayindex, int &width, int &height) const; void setPosition(int x, int y, int displayindex); @@ -87,9 +84,11 @@ public: void setMouseGrab(bool grab); bool isMouseGrabbed() const; - double getPixelScale() const; + void getPixelDimensions(int &w, int &h) const; + void windowToPixelCoords(double *x, double *y) const; + void pixelToWindowCoords(double *x, double *y) const; - bool isTouchScreen(int displayindex) const; + double getPixelScale() const; double toPixels(double x) const; void toPixels(double wx, double wy, double &px, double &py) const; @@ -101,29 +100,40 @@ public: bool showMessageBox(const std::string &title, const std::string &message, MessageBoxType type, bool attachtowindow); int showMessageBox(const MessageBoxData &data); + void requestAttention(bool continuous); + static love::window::Window *createSingleton(); - static love::window::Window *getSingleton(); const char *getName() const; private: - bool setContext(int msaa, bool vsync, bool sRGB); - void setWindowGLAttributes(int msaa, bool sRGB) const; + struct ContextAttribs + { + int versionMajor; + int versionMinor; + bool gles; + bool debug; + }; + + void setGLFramebufferAttributes(int msaa, bool sRGB); + void setGLContextAttributes(const ContextAttribs &attribs); + bool checkGLVersion(const ContextAttribs &attribs); + bool createWindowAndContext(int x, int y, int w, int h, Uint32 windowflags, int msaa, bool sRGB); // Update the saved window settings based on the window's actual state. void updateSettings(const WindowSettings &newsettings); SDL_MessageBoxFlags convertMessageBoxType(MessageBoxType type) const; - std::string windowTitle; + std::string title; struct _currentMode { - _currentMode(); - - int width; - int height; + int width = 800; + int height = 600; + int pixelwidth = 800; + int pixelheight = 600; WindowSettings settings; StrongRef icon; @@ -136,6 +146,9 @@ private: SDL_Window *window; SDL_GLContext context; + bool displayedWindowError; + bool displayedContextError; + }; // Window } // sdl diff --git a/jni/love/src/modules/window/wrap_Window.cpp b/jni/love/src/modules/window/wrap_Window.cpp index b1c35143..91406239 100644 --- a/jni/love/src/modules/window/wrap_Window.cpp +++ b/jni/love/src/modules/window/wrap_Window.cpp @@ -36,7 +36,7 @@ int w_getDisplayCount(lua_State *L) int w_getDisplayName(lua_State *L) { - int index = luaL_checkint(L, 1) - 1; + int index = (int) luaL_checknumber(L, 1) - 1; const char *name = nullptr; luax_catchexcept(L, [&](){ name = instance()->getDisplayName(index); }); @@ -54,12 +54,12 @@ static const char *settingName(Window::Setting setting) int w_setMode(lua_State *L) { - int w = luaL_checkint(L, 1); - int h = luaL_checkint(L, 2); + int w = (int) luaL_checknumber(L, 1); + int h = (int) luaL_checknumber(L, 2); if (lua_isnoneornil(L, 3)) { - luax_pushboolean(L, instance()->setWindow(w, h, 0)); + luax_pushboolean(L, instance()->setWindow(w, h, nullptr)); return 1; } @@ -92,8 +92,8 @@ int w_setMode(lua_State *L) } else { - // Default to "normal" fullscreen. - settings.fstype = Window::FULLSCREEN_TYPE_NORMAL; + // Default to desktop fullscreen mode. + settings.fstype = Window::FULLSCREEN_DESKTOP; } lua_pop(L, 1); @@ -114,17 +114,13 @@ int w_setMode(lua_State *L) settings.useposition = !(lua_isnoneornil(L, -2) && lua_isnoneornil(L, -1)); if (settings.useposition) { - settings.x = luaL_optint(L, -2, 0); - settings.y = luaL_optint(L, -1, 0); + settings.x = (int) luaL_optnumber(L, -2, 0); + settings.y = (int) luaL_optnumber(L, -1, 0); } lua_pop(L, 2); // We don't explicitly set the refresh rate, it's "read-only". - // For backward-compatibility. TODO: remove! - int fsaa = luax_intflag(L, 3, settingName(Window::SETTING_FSAA), 0); - if (fsaa > settings.msaa) settings.msaa = fsaa; - luax_catchexcept(L, [&](){ luax_pushboolean(L, instance()->setWindow(w, h, &settings)); } ); @@ -142,7 +138,7 @@ int w_getMode(lua_State *L) lua_newtable(L); - const char *fstypestr = "normal"; + const char *fstypestr = "desktop"; Window::getConstant(settings.fstype, fstypestr); lua_pushstring(L, fstypestr); @@ -157,9 +153,6 @@ int w_getMode(lua_State *L) lua_pushinteger(L, settings.msaa); lua_setfield(L, -2, settingName(Window::SETTING_MSAA)); - lua_pushinteger(L, settings.msaa); - lua_setfield(L, -2, settingName(Window::SETTING_FSAA)); // For backward-compatibility. TODO: remove! - luax_pushboolean(L, settings.resizable); lua_setfield(L, -2, settingName(Window::SETTING_RESIZABLE)); @@ -199,15 +192,22 @@ int w_getMode(lua_State *L) int w_getFullscreenModes(lua_State *L) { - int displayindex = luaL_optint(L, 1, 1) - 1; + int displayindex = 0; + if (!lua_isnoneornil(L, 1)) + displayindex = (int) luaL_checknumber(L, 1); + else + { + int x, y; + instance()->getPosition(x, y, displayindex); + } std::vector modes = instance()->getFullscreenSizes(displayindex); - lua_createtable(L, modes.size(), 0); + lua_createtable(L, (int) modes.size(), 0); for (size_t i = 0; i < modes.size(); i++) { - lua_pushinteger(L, i+1); + lua_pushinteger(L, i + 1); lua_createtable(L, 0, 2); // Inner table attribs. @@ -229,14 +229,14 @@ int w_getFullscreenModes(lua_State *L) int w_setFullscreen(lua_State *L) { bool fullscreen = luax_toboolean(L, 1); - Window::FullscreenType fstype = Window::FULLSCREEN_TYPE_MAX_ENUM; + Window::FullscreenType fstype = Window::FULLSCREEN_MAX_ENUM; const char *typestr = lua_isnoneornil(L, 2) ? 0 : luaL_checkstring(L, 2); if (typestr && !Window::getConstant(typestr, fstype)) return luaL_error(L, "Invalid fullscreen type: %s", typestr); bool success = false; - if (fstype == Window::FULLSCREEN_TYPE_MAX_ENUM) + if (fstype == Window::FULLSCREEN_MAX_ENUM) success = instance()->setFullscreen(fullscreen); else success = instance()->setFullscreen(fullscreen, fstype); @@ -266,29 +266,17 @@ int w_isCreated(lua_State *L) return 1; } -int w_getWidth(lua_State *L) -{ - lua_pushinteger(L, instance()->getWidth()); - return 1; -} - -int w_getHeight(lua_State *L) -{ - lua_pushinteger(L, instance()->getHeight()); - return 1; -} - -int w_getDimensions(lua_State *L) -{ - lua_pushinteger(L, instance()->getWidth()); - lua_pushinteger(L, instance()->getHeight()); - return 2; -} - int w_getDesktopDimensions(lua_State *L) { int width = 0, height = 0; - int displayindex = luaL_optint(L, 1, 1) - 1; + int displayindex = 0; + if (!lua_isnoneornil(L, 1)) + displayindex = (int) luaL_checknumber(L, 1); + else + { + int x, y; + instance()->getPosition(x, y, displayindex); + } instance()->getDesktopDimensions(displayindex, width, height); lua_pushinteger(L, width); lua_pushinteger(L, height); @@ -297,9 +285,18 @@ int w_getDesktopDimensions(lua_State *L) int w_setPosition(lua_State *L) { - int x = luaL_checkint(L, 1); - int y = luaL_checkint(L, 2); - int displayindex = luaL_optint(L, 3, 1) - 1; + int x = (int) luaL_checknumber(L, 1); + int y = (int) luaL_checknumber(L, 2); + + int displayindex = 0; + if (!lua_isnoneornil(L, 3)) + displayindex = (int) luaL_checknumber(L, 3); + else + { + int x_unused, y_unused; + instance()->getPosition(x_unused, y_unused, displayindex); + } + instance()->setPosition(x, y, displayindex); return 0; } @@ -318,7 +315,7 @@ int w_getPosition(lua_State *L) int w_setIcon(lua_State *L) { - image::ImageData *i = luax_checktype(L, 1, "ImageData", IMAGE_IMAGE_DATA_T); + image::ImageData *i = luax_checktype(L, 1, IMAGE_IMAGE_DATA_ID); luax_pushboolean(L, instance()->setIcon(i)); return 1; } @@ -326,10 +323,7 @@ int w_setIcon(lua_State *L) int w_getIcon(lua_State *L) { image::ImageData *i = instance()->getIcon(); - if (i) - luax_pushtype(L, "ImageData", IMAGE_IMAGE_DATA_T, i); - else - lua_pushnil(L); + luax_pushtype(L, IMAGE_IMAGE_DATA_ID, i); return 1; } @@ -370,13 +364,6 @@ int w_getPixelScale(lua_State *L) return 1; } -int w_isTouchScreen(lua_State *L) -{ - int index = luaL_optint(L, 1, 1) - 1; - luax_pushboolean(L, instance()->isTouchScreen(index)); - return 1; -} - int w_toPixels(lua_State *L) { double wx = luaL_checknumber(L, 1); @@ -443,14 +430,14 @@ int w_showMessageBox(lua_State *L) // means we should use the more complex message box API. if (lua_istable(L, 3)) { - size_t numbuttons = lua_objlen(L, 3); + size_t numbuttons = luax_objlen(L, 3); if (numbuttons == 0) return luaL_error(L, "Must have at least one messagebox button."); // Array of button names. for (size_t i = 0; i < numbuttons; i++) { - lua_rawgeti(L, 3, i + 1); + lua_rawgeti(L, 3, (int) i + 1); data.buttons.push_back(luax_checkstring(L, -1)); lua_pop(L, 1); } @@ -458,7 +445,7 @@ int w_showMessageBox(lua_State *L) // Optional table entry specifying the button to use when enter is pressed. lua_getfield(L, 3, "enterbutton"); if (!lua_isnoneornil(L, -1)) - data.enterButtonIndex = luaL_checkint(L, -1) - 1; + data.enterButtonIndex = (int) luaL_checknumber(L, -1) - 1; else data.enterButtonIndex = 0; lua_pop(L, 1); @@ -466,7 +453,7 @@ int w_showMessageBox(lua_State *L) // Optional table entry specifying the button to use when esc is pressed. lua_getfield(L, 3, "escapebutton"); if (!lua_isnoneornil(L, -1)) - data.escapeButtonIndex = luaL_checkint(L, -1) - 1; + data.escapeButtonIndex = (int) luaL_checknumber(L, -1) - 1; else data.escapeButtonIndex = (int) data.buttons.size() - 1; lua_pop(L, 1); @@ -496,6 +483,13 @@ int w_showMessageBox(lua_State *L) return 1; } +int w_requestAttention(lua_State *L) +{ + bool continuous = luax_optboolean(L, 1, false); + instance()->requestAttention(continuous); + return 0; +} + static const luaL_Reg functions[] = { { "getDisplayCount", w_getDisplayCount }, @@ -506,9 +500,6 @@ static const luaL_Reg functions[] = { "setFullscreen", w_setFullscreen }, { "getFullscreen", w_getFullscreen }, { "isCreated", w_isCreated }, - { "getWidth", w_getWidth }, - { "getHeight", w_getHeight }, - { "getDimensions", w_getDimensions }, { "getDesktopDimensions", w_getDesktopDimensions }, { "setPosition", w_setPosition }, { "getPosition", w_getPosition }, @@ -520,12 +511,12 @@ static const luaL_Reg functions[] = { "hasMouseFocus", w_hasMouseFocus }, { "isVisible", w_isVisible }, { "getPixelScale", w_getPixelScale }, - { "isTouchScreen", w_isTouchScreen }, { "toPixels", w_toPixels }, { "fromPixels", w_fromPixels }, { "minimize", w_minimize }, { "maximize", w_maximize }, { "showMessageBox", w_showMessageBox }, + { "requestAttention", w_requestAttention }, { 0, 0 } }; @@ -537,7 +528,7 @@ extern "C" int luaopen_love_window(lua_State *L) WrappedModule w; w.module = instance; w.name = "window"; - w.flags = MODULE_T; + w.type = MODULE_ID; w.functions = functions; w.types = 0; diff --git a/jni/love/src/modules/window/wrap_Window.h b/jni/love/src/modules/window/wrap_Window.h index d58936bb..882be996 100644 --- a/jni/love/src/modules/window/wrap_Window.h +++ b/jni/love/src/modules/window/wrap_Window.h @@ -37,9 +37,6 @@ int w_getFullscreenModes(lua_State *L); int w_setFullscreen(lua_State *L); int w_getFullscreen(lua_State *L); int w_isCreated(lua_State *L); -int w_getWidth(lua_State *L); -int w_getHeight(lua_State *L); -int w_getDimensions(lua_State *L); int w_getDesktopDimensions(lua_State *L); int w_setPosition(lua_State *L); int w_getPosition(lua_State *L); @@ -51,12 +48,12 @@ int w_hasFocus(lua_State *L); int w_hasMouseFocus(lua_State *L); int w_isVisible(lua_State *L); int w_getPixelScale(lua_State *L); -int w_isTouchScreen(lua_State *L); int w_toPixels(lua_State *L); int w_fromPixels(lua_State *L); int w_minimize(lua_State *L); int w_maximize(lua_State *L); int w_showMessageBox(lua_State *L); +int w_requestAttention(lua_State *L); extern "C" LOVE_EXPORT int luaopen_love_window(lua_State *L); } // window diff --git a/jni/love/src/scripts/boot.lua b/jni/love/src/scripts/boot.lua index 014d71ac..24c6824e 100644 --- a/jni/love/src/scripts/boot.lua +++ b/jni/love/src/scripts/boot.lua @@ -154,38 +154,38 @@ function love.createhandlers() -- Standard callback handlers. love.handlers = setmetatable({ - keypressed = function (b, u) - if love.keypressed then return love.keypressed(b, u) end + keypressed = function (b,s,r) + if love.keypressed then return love.keypressed(b,s,r) end end, - keyreleased = function (b) - if love.keyreleased then return love.keyreleased(b) end + keyreleased = function (b,s) + if love.keyreleased then return love.keyreleased(b,s) end end, textinput = function (t) if love.textinput then return love.textinput(t) end end, - textedit = function (t,s,l) - if love.textedit then return love.textedit(t,s,l) end + textedited = function (t,s,l) + if love.textedited then return love.textedited(t,s,l) end + end, + mousemoved = function (x,y,dx,dy,t) + if love.mousemoved then return love.mousemoved(x,y,dx,dy,t) end end, mousepressed = function (x,y,b,t) if love.mousepressed then return love.mousepressed(x,y,b,t) end end, - mousemoved = function (x,y,xrel,yrel) - if love.mousemoved then return love.mousemoved(x,y,xrel,yrel) end - end, mousereleased = function (x,y,b,t) if love.mousereleased then return love.mousereleased(x,y,b,t) end end, - touchpressed = function (id,x,y,p) - if love.touchpressed then return love.touchpressed(id,x,y,p) end + wheelmoved = function (x,y) + if love.wheelmoved then return love.wheelmoved(x,y) end end, - touchreleased = function (id,x,y,p) - if love.touchreleased then return love.touchreleased(id,x,y,p) end + touchpressed = function (id,x,y,dx,dy,p) + if love.touchpressed then return love.touchpressed(id,x,y,dx,dy,p) end end, - touchmoved = function (id,x,y,p) - if love.touchmoved then return love.touchmoved(id,x,y,p) end + touchreleased = function (id,x,y,dx,dy,p) + if love.touchreleased then return love.touchreleased(id,x,y,dx,dy,p) end end, - touchgestured = function (x,y,theta,dist,num) - if love.touchgestured then return love.touchgestured(x,y,theta,dist,num) end + touchmoved = function (id,x,y,dx,dy,p) + if love.touchmoved then return love.touchmoved(id,x,y,dx,dy,p) end end, joystickpressed = function (j,b) if love.joystickpressed then return love.joystickpressed(j,b) end @@ -211,7 +211,7 @@ function love.createhandlers() joystickadded = function (j) if love.joystickadded then return love.joystickadded(j) end end, - joystickremoved = function(j) + joystickremoved = function (j) if love.joystickremoved then return love.joystickremoved(j) end end, focus = function (f) @@ -229,12 +229,17 @@ function love.createhandlers() threaderror = function (t, err) if love.threaderror then return love.threaderror(t, err) end end, - resize = function(w, h) + resize = function (w, h) if love.resize then return love.resize(w, h) end end, - lowmemory = function() - collectgarbage("collect") - collectgarbage("collect") + filedropped = function (f) + if love.filedropped then return love.filedropped(f) end + end, + directorydropped = function (dir) + if love.directorydropped then return love.directorydropped(dir) end + end, + lowmemory = function () + collectgarbage() if love.lowmemory then return love.lowmemory() end end, }, { @@ -266,29 +271,41 @@ function love.boot() local arg0 = love.arg.getLow(arg) love.filesystem.init(arg0) - -- Is this one of those fancy "fused" games? - local can_has_game = pcall(love.filesystem.setSource, arg0) - local is_fused_game = can_has_game - if love.arg.options.fused.set then - is_fused_game = true + local exepath = love.filesystem.getExecutablePath() + if #exepath == 0 then + -- This shouldn't happen, but just in case we'll fall back to arg0. + exepath = arg0 end + -- Is this one of those fancy "fused" games? + local can_has_game = pcall(love.filesystem.setSource, exepath) + local is_fused_game = can_has_game or love.arg.options.fused.set + love.filesystem.setFused(is_fused_game) local identity = "" if not can_has_game and o.game.set and o.game.arg[1] then local nouri = o.game.arg[1] + if nouri:sub(1, 7) == "file://" then nouri = uridecode(nouri:sub(8)) end + local full_source = love.path.getfull(nouri) can_has_game = pcall(love.filesystem.setSource, full_source) - + -- Use the name of the source .love as the identity for now. identity = love.path.leaf(full_source) else -- Use the name of the exe as the identity for now. - identity = love.path.leaf(arg0) + identity = love.path.leaf(exepath) + end + + -- Try to use the archive containing main.lua as the identity name. It + -- might not be available, in which case the fallbacks above are used. + local realdir = love.filesystem.getRealDirectory("main.lua") + if realdir then + identity = love.path.leaf(realdir) end identity = identity:gsub("^([%.]+)", "") -- strip leading "."'s @@ -305,7 +322,8 @@ function love.boot() end if not can_has_game then - love.nogame() + local nogame = require("love.nogame") + nogame() end end @@ -325,11 +343,10 @@ function love.init() minwidth = 1, minheight = 1, fullscreen = false, - fullscreentype = "normal", + fullscreentype = "desktop", display = 1, vsync = true, msaa = 0, - fsaa = 0, -- For backward-compatibility. TODO: remove! borderless = false, resizable = false, centered = true, @@ -342,6 +359,7 @@ function love.init() mouse = true, timer = true, joystick = true, + touch = true, image = true, graphics = true, audio = true, @@ -351,7 +369,6 @@ function love.init() system = true, font = true, thread = true, - touch = true, window = true, }, console = false, -- Only relevant for windows. @@ -419,6 +436,22 @@ function love.init() love.createhandlers() end + -- Check the version + c.version = tostring(c.version) + if not love.isVersionCompatible(c.version) then + local major, minor, revision = c.version:match("^(%d+)%.(%d+)%.(%d+)$") + if (not major or not minor or not revision) or (major ~= love._version_major and minor ~= love._version_minor) then + local msg = "This game was made for a different version of LOVE.\n".. + "It may not be not be compatible with the running version ("..love._version..")." + + print(msg) + + if love.window then + love.window.showMessageBox("Compatibility Warning", msg, "warning") + end + end + end + if not confok and conferr then error(conferr) end @@ -430,7 +463,6 @@ function love.init() fullscreen = c.window.fullscreen, fullscreentype = c.window.fullscreentype, vsync = c.window.vsync, - fsaa = c.window.fsaa, -- For backward-compatibility. TODO: remove! msaa = c.window.msaa, resizable = c.window.resizable, minwidth = c.window.minwidth, @@ -465,37 +497,12 @@ function love.init() if no_game_code then error("No code to run\nYour game might be packaged incorrectly\nMake sure main.lua is at the top level of the zip") end - - -- Check the version - local compat = false - c.version = tostring(c.version) - for i, v in ipairs(love._version_compat) do - if c.version == v then - compat = true - break - end - end - if not compat then - local major, minor, revision = c.version:match("^(%d+)%.(%d+)%.(%d+)$") - if (not major or not minor or not revision) or (major ~= love._version_major and minor ~= love._version_minor) then - local msg = "This game was made for a different version of LÖVE.\n".. - "It may not be not be compatible with the running version ("..love._version..")." - - print(msg) - - if love.window then - love.window.showMessageBox("Compatibility Warning", msg, "warning") - end - end - end - end function love.run() if love.math then love.math.setRandomSeed(os.time()) - for i=1,3 do love.math.random() end end if love.load then love.load(arg) end @@ -510,13 +517,13 @@ function love.run() -- Process events. if love.event then love.event.pump() - for n,a,b,c,d,e in love.event.poll() do - if n == "quit" then + for name, a,b,c,d,e,f in love.event.poll() do + if name == "quit" then if not love.quit or not love.quit() then return end end - love.handlers[n](a,b,c,d,e) + love.handlers[name](a,b,c,d,e,f) end end @@ -529,1019 +536,18 @@ function love.run() -- Call update and draw if love.update then love.update(dt) end -- will pass 0 if love.timer is disabled - if love.window and love.graphics and love.graphics.isActive() then - love.graphics.clear() + if love.graphics and love.graphics.isActive() then + love.graphics.clear(love.graphics.getBackgroundColor()) love.graphics.origin() if love.draw then love.draw() end love.graphics.present() end if love.timer then love.timer.sleep(0.001) end - end end ------------------------------------------------------------ --- Default screen. ------------------------------------------------------------ - -function love.nogame() - - local baby_png = - "iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAL1klEQVR4nO2deZAU1R3HPz3X\ - 3ruzuywEXZVLBJHAilfUpAQNGo1RPDAxKiaKkpQHlZBKhTIRjSaWlCmrrCJBDR7RaMSUBx6x\ - ElmhCIogi8dKFEQEYWGXva+Znunp/NGzbO/szuwc/XZ39r1P1dT2dr/+9a/7ffv1u59mmiYK\ - eXENtwOK4UUJQHKUACRHCUBylAAkRwlAcpQAJEcJQHKUACRHCUBylAAkRwlAcpQAJEcJQHKU\ - ACRHCUBylAAkRwlAcpQAJEcJQHKUACRHCUBylAAkRwlAcpQAJEcJQHKUACRHCUBylAAkRwlA\ - cjzD7UC2YNRWO2LHPWOuI3acwlEBaJrmpLkRQ/iT9T2blwBXAMcATwL/iO6vAJ4GLgQ+A34A\ - 7AImA9cCRcAzwEdOPCMn53RQKUDy3AKstv3/pG37aeCi6PY04FtAEPgYyIvurwK+K9bF1FEC\ - GATb23+bbXcj8HJ0eyG9kQ9QCzwH/IneyAd4TZCLGaEygclxOjDT9v+zWG94MfBwTNglwDjg\ - Ztu+RuAxkQ6mi0oBEmB7+2+KOfR49O89wHjb/jXAJuDvQK5t/++ALgEuZozmZIZitGUCowLI\ - Bw5hZeQAtmGlCFOxkvuel6gNmIL1rX/LZqYmGt7wnDLPEb+yMhNoe5uyjavojXzoffvvpe/z\ - ux8IA3+17dOBGwEDBn8GTgkkFYQLIOam5wInpGmqmOHJs9xu2w4BpcB9WJm/HjoBDagGKm37\ - XwFOjf7smEAr0AE0AQeAw7ECGQpBCP8ERG9Kw8os3eHYxUYfrcAHwH+wShF7ew7ECsHROBMp\ - AJuiVwB3O3ah0U8E61OylGjm0S4CJ+NsKJLUKuCuIbjOaMIFLMaqO3CLvpAQbG//cgTfxChm\ - LlYmVBiiU4ASYIHga4x2zhdpXLQAvo16+zOlcvAg6SO6GHhaMoGONLfy5qatbK75lLqGJgK6\ - ztgyP7OnTebCc+YwY8oEwW6K4UhzK29sfJ93P9zJwfpG9FCYirISqqZPYf45c5gxOakSsS7S\ - R2GlgGgeYDVWK9qAhMJhVj23jideeovuYPz7nHfmbO669VqOHTfGMV9FoofCPPLsyzz1yr8J\ - 6qG44c4/q4rfLvkx4yvKEpl7Bbg8W0sBhfEOdHR1s2j5SlY9vy5h5AOs37KDBXfew4ef7XHc\ - Qadp7+zmht88yKNr30gY+QBvv1fDgjtWULt7b6JgcZ+hE4gWgD/egWUrH+WD2l1JG2pt7+SW\ - ux+mrqHJEcdEYJomSx9YRc3O3Umf09zWweK7H6ahqTVekHGOOBeHoSgF9OOtTduofv/DlI21\ - tHewcs3ajJ0Sxesb32fT9tqUz2tsaWPlE3HvqwLEtaUMiwBWv/B62gZf37iF/Yca0j5fJJnc\ - 16vV73KwoXGgQxUIjCfRAiiN3VHX0ETtF19lZHT9lh0ZnS+CfXX1fL7367TPN02TdwZOFV1A\ - edqGB0GIAGzJVUXssS/212Vsf48DNpxm74HDGdvYve9gvENx81KZIjIF8AO+2J3tnZl3jGlp\ - 78zYhtO0tHdkbKMt/rPJSgEMmHst9xdnbLiidMCsxbAyxgGfEtxXv0+pU4gUwNiBdp40oRK3\ - O7PLzjgx3T4l4pg28ThcGXaJOzl+zaAfxJQEHK8Ktjk5fqDjJUUFnHvqKWzY+lFa9nN8Xuad\ - MTulcw42NLLpg0/4qq6elrYOugJBy5bXi8ulUZCfR2lxIePKSzl+/FimTTyOooK8Qaz2payk\ - iLOrTk6rGAiQl+PjvNNnxTs8C/gnYDgtAkcFYHNuFv170h7lzusuZ+O2j9Oq0vzpggspKSpI\ - OnwoHOby21fQmkK+QdM0Lj3vLFYuW5ySb3dctyBtAdx81fcSiW45cAPwK+B5o7basSFmjn0C\ - bGPnHsDqCTs/XtgZUyZw68JLUr7G9EnHs+SH30/pnKbW9pQiH6wi2avV71Lf1JLSebNOmsTN\ - V140eMAYZk6dyOKrLh4sWCXWaKQJKV8gAU7nAa4Dfo3VBzAhS69fwE1XJP+wZk6dyJr7fkmu\ - r1/BIiHjykupTKMR6Zix5WllNpf95GoWXZb8CLCqaZN5dMVScnzeZILnAA+l7FQCHGsNjKYA\ - 7wFnpnLef2tqWblmLTv37BvwuL+okMVXX8yiyy7A60nvi/WvTVu5849/Tjq8S9NYvWIp3zlt\ - 5uCB47Bx28c89OSL/O/L/QMe9xcVsuSaS7j+0gvweFLqMtEN5Dv1CXBaADqQlJRj2blnH5t3\ - fEpdfRN6KMSY0hKqpk/mzG9Ox+fNPKvyzLq3+cNjz2EYkYThxpb5uff2Rcw9I26GLGlM02Tn\ - nv1srqnl0JFm9FCIijI/s6dNyvS+tJEqgBG9Fv2er+t4/MU3Wb9lB81tvRU3ebk5zDppEvPP\ - nsOV889N+TMzxOwCpo5UAewDjnPEoGCONLcS1EPk5vgcqZwaQm4EnhpxpYAoTzlsTxhjSks4\ - dtyYbIr8IPALHH7GTlcE/R5rTPzP6Ts2XpEZnwIXAHXg7DQzTqcAOrCMJDuDKpJmF9HId3q8\ - oGMCcM+Ya3cua9LVbELEYFFRjUHCmi8lJSjKsBJAdtAtyrDjAjA0NygBOE32CCDgKybozZ8Q\ - 0dT8Uw4i7BPgeH+Azlw/YXfuTN2Tiy/cTU6oM/rrwmsEnL6cLAjrBu24AALeYiIudweA7slH\ - 9+TTnmf1DXWZBr5QFznhLnJCnfjCXXgMoUPfRgsbunLEdINzXAARlxusZsv+xzQ3AV8RAV/v\ - nEuuSBhfuNv268JrBNHMxI022Yjh8hDRPERcHiKaG8PlJqK5ifT81Ty920f3uU00zZ8XjDty\ - KCOGfZ7AiMvTTxQAHkPHawTwGgE8ho7bCOGJ6HgMHZcZRnNwgGSmhN0+Qu5cwm4fhssb/VkR\ - 3RPphiv9lj9gYWdOqZCZRkUJoDlTA2G3j7DbR3ecOiXNjKCl0PiomZE+onGZRmJbpokrQSoU\ - cbkx0Qi5c4ikH7nJUoWgORhFef6lILtHMTVXam3PWlbPU1E0eJD0EFVWWyfIrqwcEGVYlABq\ - gA2CbMvIdlGGHRfAlLFHKwGXO21bYoS9TCKr6zYDLwi0LwsmsFGUcSECsKUCtwFHRFxDIrYD\ - 9aKMi66wbyDBJFGKpHgN+rxUjiJMADaHXwIeFHWdUY6B4H6WQlOAmAzhyJ3cZ+TyOILrVIaq\ - zdYAfoQ1abRq/UmOtVi9gIUl/zAEArA5b2CtqnEi8BcEdnLIYhqBR7BGVy9kCNYZGtI1g3bX\ - 9xltWwpcDVyDNSv26FpwKHkasGpO1wJvY61KAsR/87NmwYh42IVQEGjE33V4VdBb8LMuXwkB\ - XzGjvTeRhtlgor2INenDO0TXFOphsCQ/KxeNsmO/Qb32HVxmRPeGAxR2N2KiEfQWHG0iDnoK\ - MEfBamTecIB8vYX8YCu+cPc1jYWV1R15vcPWRX7nEzHs/QGiTa5H51bVMMkNdZAb6oDOOkxN\ - Q/fk01Iw/m/dvuJC4GwET5/qFLl6O/l6K/nBVjxGn259+8vb9/ONE6YMl2tHGXYBRFmLNays\ - 32ugmaaZE+q8N0fvWKF78jBcXoBjseYhmBP9zWZkiCKQp7d6CwIt7ny9FVckPFCYDcDuVPoy\ - iGTYF460zStUhbXe7rlYwjyEtQDjI1iraeE5ZV5sRtJOGTAdOBlrUcdKLKEcE90esJtamhhY\ - Q7W+whoR/TnWgpLVE+q3P0DfdYbt1ACXAgcyGeWT9ZnAWGJmvvJgrZrVpztOogeWQBR2CrFm\ - Li23/fxYg1iLgILods/07G1YS7nVY+XUD0d/DVjtG/0enL+zDn9nnQ9rlbQbsWZK6wS2Yi0f\ - /zTRXP6oFECm2CaaApwbBftFg5gOlZMr+vbUjfU/Hk6O7s2UESUAxdAzugvcikFRApAcJQDJ\ - UQKQHCUAyVECkBwlAMlRApAcJQDJUQKQHCUAyVECkBwlAMlRApAcJQDJUQKQHCUAyVECkBwl\ - AMlRApAcJQDJUQKQHCUAyVECkBwlAMlRApAcJQDJUQKQHCUAyVECkJz/A7w3h5w1bl6AAAAA\ - AElFTkSuQmCC\ - " - local background_png = - "iVBORw0KGgoAAAANSUhEUgAAAgAAAAIACAYAAAD0eNT6AAAgAElEQVR4nO3deZRedZ3n8Xcq\ - SUWTkAUTILIJRCVsArIoqCjdILYGHRZbARc4Mwg2gij0dGPPabFHPEdEFBdUZhoPAq2yqKgj\ - ArIptiACCgFUaCUCgYQlO4ZQqfnjW0UqSS3Pcu/93eX9Ouc5Wary3E/Q3O/3+f7u/d1x/f39\ - SCqt8cDsIa9ZwObATGA6MAPYDHjpwI8vGfLzCQPfN9Tg14d6DvjrRr/3LPACsGLI1wd/vgJY\ - Ciwb+L5ngKeAJUNefR3/jSUVYpwNgJTMDGC7gde2wDYDP24NbMH6ot+TKmCH+oHFRCOwGHgM\ - +Avw6MCPCwd+fDZVQEk2AFKexhFFfe6Q144DP+5EfEpvshXAw0NeDw15PUo0EpJyYgMgda8H\ - eAWwC7ArMA/YDdgZmJIuVqWtAh4E7gMeABYA9wN/BtaliyXVhw2A1J5eorjvBewN7AnsAUxN\ - GapBVgK/A+4B7gbuIpqE51OGkqrIBkAaWQ/xKf51wP7AfsQn/IkpQ2kTa4npwO0Dr18R0wMn\ - BdIobACk9aYCBwBvIIr+fsSV9qqeZcAdREPwC+A2YnogaYANgJpsBvBG4E0Dr72JW+dUPy8Q\ - ywW3Drx+TtzKKDWWDYCapJf4dP+3wCFEwa/aLXbKxjqiIbgeuIGYEKxJmkgqmA2A6m5n4G1E\ - wT8ImJw2jkpqNXAL0RBcS9x5INWaDYDqppco9G8H3kHcby+162Hgx8CPiMbAuwxUOzYAqoOZ\ - wOHAfOBQ3GBH2VoJ/BT4IXAN7mComrABUFXNAt4FHAH8DfHJX8rbWuAm4Arg+8QzEKRKsgFQ\ - lbwMeDdwFDHmH582jhquj1geuBL4LvB02jhSe2wAVHZTgHcCxxDjfTfhURmtBa4DLieWCdxz\ - QKVnA6AyGg+8FTiWKP7up68qWQX8ALiMuHbARyOrlGwAVCY7AR8ETgBenjaKlInHgYsHXg8n\ - ziJtwAZAqU0BjgaOJ3blG5c2jpSLfmL3wYuJCwhXpY0j2QAonV2Ak4D34377apZlwCXA14iH\ - GElJ2ACoSJOI2/ZOIvbel5ruVqIRuBq3IlbBbABUhK2ADwMnAlsmziKV0ZPAN4CvAk8kzqKG\ - sAFQnvYGTgP+nvj0L2l0a4DvAF8kHlYk5cYGQFnrIbbkPZ3YrEdSZ24Bzie2IF6XOItqyAZA\ - Wekl7ts/E5iXOItUJw8A5xL7CvhQImXGBkDd2gz4H8Qn/m0SZ5Hq7FFiInARsCJxFtWADYA6\ - NR34KHAqsHniLFKTPANcQFwnsDRxFlWYDYDaNZO4sO80YEbiLFKTLSWagC/iI4rVARsAtWom\ - MeY/FTfukcpkGTER+AIxHZBaYgOgsUwlRv0fx0/8UpktBc4jGgGfRqgx2QBoJL3Ejn1n4eY9\ - UpUsBj5N7DDoXQMakQ2ANtYDvA84G9g+cRZJnXsE+CTx3AH3EdAmbAA01GHAZ4A9UweRlJl7\ - gX8Erk0dROViAyCIJ/OdRzQAkurpWuJaHp9AKCDGvWquOcBXgN9i8Zfq7jDi3/rXiX/7ajgn\ - AM00gbid73/hlf1SEy0D/o3YQ+CFxFmUiA1A8xwMfIkY+0tqtvuJDwM/Sx1ExXMJoDm2A64g\ - /qFb/CVBnAtuAK4kzhFqEBuA+psAfIx4othRibNIKqcjiXPEx4lzhhrAJYB6ew3wf4B9UgeR\ - VBl3Ek/4vCd1EOXLCUA9vRQ4h/iHbPGX1I59gF8Te4K8NHEW5cgJQP28mbjN51WJc0iqvj8A\ - HwJuTpxDOXACUB8zgIuAG7H4S8rGq4hzykV4y3DtOAGohyOIW/tenjqIpNpaBJwCXJ06iLJh\ - A1Btgzv5/bfUQSQ1xveBDxMNgSrMBqC6jgIuBGalDiKpcZ4CTib2D1BFeQ1A9UwnHu95BRZ/\ - SWnMIs5BlxDnJFWQE4BqeQtwMbB96iCSNGAh8EHgpsQ51CYnANUwEfgssWWnxV9SmWxHnJs+\ - S5yrVBFOAMpvJ+A/gH1TB5GkMfwaeC/wcOogGpsTgHI7BrgLi7+katiXOGcdkzqIxmYDUE5T\ - gW8ClwHT0kaRpLZMI85d3yTOZSoplwDKZx6x0cbOqYNIUpceJJ40eH/qINqUE4ByORa4A4u/\ - pHrYGbidOLepZGwAymESsaPfpTgyk1QvU4lz21eIc51KwiWA9LYndtPysb2S6u5OYhfTR1IH\ - kROA1A4ibpux+Etqgn2Ic95BqYPIBiClU4Drgdmpg0hSgWYT576PpA7SdC4BFG8S8RCf41MH\ - kaTELiYeKrQmdZAmsgEo1lbA94DXpQ4iSSXxK+KR5k+kDtI0NgDF2QX4EbBD6iCSVDJ/AuYD\ - C1IHaRKvASjGW4BfYPGXpOHsAPwcODh1kCaxAcjfB4BrgZmpg0hSic0EfkKcM1UAG4D8jAM+\ - SVzk0ps2iiRVQi9xzvwkcQ5VjrwGIB+9wEXA+1MHkaSK+hbw34HnUwepKxuA7M0EriLW/SVJ\ - nbsZOAJ4NnGOWrIByNYOwI+JJ/pJkrr3APB24k4BZchrALLzWuA/sfhLUpbmEedWt0zPmA1A\ - Nt4M3AhsmTiHJNXRlsDPiHOtMmID0L35wP8DpqUOIkk1No24TXB+6iB1YQPQnWOBq4GXpg4i\ - SQ3wEuKce1zqIHVgA9C5fyBuU5mQOogkNcgE4BLiHKwu2AB05uPAl3GjCklKYRxxDj4jdZAq\ - swFo3z8Dn0sdQpLEucQ5WR2wAWjPvwLnpA4hSXrROcDZqUNUkRsBte4c7DQlqaw+A5yVOkSV\ - OAFozaex+EtSmf0zca5Wi2wAxvav2FVKUhWcRTxJUC1wCWB0Z2FHKUlV8wm8XmtMNgAj+xhw\ - XuoQkqSOnIHn8FHZAAzvH4h7TCVJ1XUK8JXUIcrKBmBTxxI7/LnJjyRVWz/wPuCy1EHKyAZg\ - Q4cDV+H2vpJUFy8ARwLXpA5SNjYA6x0M/BCYnDqIJClTq4mnCN6YOkiZ2ACEfYHrgempg0iS\ - crEMOBS4I3WQsrABgLnAL4HZqYNIknK1BDgAeCh1kDJo+kZAs4GfYPGXpCbwnD9EkxuAycSa\ - /9zUQSRJhZmL13sBzW0AxgP/AeyfOogkqXD7EzVgfOogKTW1AfgSccufJKmZDidqQWM1sQE4\ - HTg5dQhJUnInE9u+N1LT7gI4HLiaho99JEkv6gOOoIEbBTWpAdgduA3YLHUQSVKprCRuD7w3\ - dZAiNaUB2Ar4NbBN6iCSpFJ6FNgPWJQ6SFGacA1AL/A9LP6SpJFtQ9SK3tRBitKEBuBC4HWp\ - Q0iSSm9/omY0Qt0bgI8AJ6QOIUmqjBOI2lF7db4G4CDgOho0zpEkZeJ54sFBt6QOkqe6NgDb\ - Ar/B/Z4lSZ1ZAuwDLEwdJC91XALoBa7C4i9J6txs4EpqPEWuYwNwPrBv6hCSpMrbl6gptVS3\ - JYD3ApenDiFJqpVjiIcH1UqdGoB5wB3A1NRBJEm1soqYBjyQOkiW6rIEMIVY97f4S5KyVssa\ - U5cG4MvEBECSpDzMo2aPD67DEsAxwGWpQ0iSGuE4alJzqt4A7ATcBUxLHUSS1AjLgb2Bh1MH\ - 6VaVlwB6iasyLf6SpKJMA75NDfYHqHID8L/xfn9JUvH2IWpQpVV1CeAtwA1Uu4GRJFVXP/A3\ - wE2pg3Sqig3ADOC3wHapg0iSGm0h8BpgaeognajiJ+gLsPhLktLbjqhJlVS1CcBRwBWpQ0iS\ - NMTRxIODKqVKDcAc4F7gZamDSJI0xNPA7sCi1EHaUaUlgK9j8Zcklc/LiBpVKVVpAN4DzE8d\ - QpKkEcwndqatjCosAWwBLABmpQ4iSdIongJ2BRanDtKKKkwAvoLFX5JUfrOImlUJZW8Ajhp4\ - SZJUBZWpW2VeApgB3E9c/S9JUlUsAnah5BsElXkCcA4Wf0lS9cwBPpM6xFjKOgF4PfALyt2g\ - SJI0knXAG4Ffpg4ykjI2ABOBO4E9UgeRJKkLvyOeHLg2dZDhlPET9ulY/CVJ1bcH8LHUIUZS\ - tgnAdsADwOTUQSRJysBqYB7x5MBSKdsE4HNY/CVJ9TGZqG2lU6YJwFuAG1OHkCQpB4cAN6QO\ - MVRZGoCJwD3EfZOSJNXNg8Q1AaW5ILAsSwCnYvGXJNXXzkStK40yTAC2BP4ATEsdRJKkHC0H\ - Xg08kToIlGMCcDYWf0lS/U0jal4ppJ4A7Eqs/U9IGUKSpIL0AXsC96UOknoC8Dks/pKk5hgP\ - nJs6BKRtAA4BDkt4fEmSUjgMeGvqEKmWAMYDdwO7pzi4JEmJ3UcsBfSlCpBqAvA+LP6SpOba\ - jaiFyaSYAEwCfg9sX/SBJUkqkUeI2wLXpDh4ignAiVj8JUnaHjgp1cGLngBMAR4mNv+RJKnp\ - FgNzgRVFH7joCcBHsfhLkjRoC+C0FAcucgIwE/gTML2oA0qSVAHLgB2AZ4s8aJETgNOx+EuS\ - tLHpwMeKPmhRE4AZwJ+xAZAkaTiFTwGKmgB8FIu/JEkjmU7UysIUMQGYQaz9z8j7QJIkVdgy\ - 4BXA0iIOVsQE4DQs/pIkjWU6cb1cIfKeAEwFFhJ3AEiSpNEtBbYFVuZ9oLwnACdi8ZckqVUz\ - gA8VcaA8JwC9xK5/2+R1AEmSaugxYEfg+TwPkucE4Fgs/pIktWtr4Li8D5LXBKCHeNbxvDze\ - XJKkmnsQ2BVYl9cB8poAzMfiL0lSp3Ymamlu8moACt3MQJKkGsq1luaxBLAXcFfWbypJUgPt\ - DdydxxvnMQHw078kSdnIraZmPQGYQzz0pzfLN5UkqaGeJ7YHXpT1G2c9AfgwFn9JkrLSS9TW\ - zGU5AegFHgVmZ/WGkiSJJcS+OpluDJTlBOBILP6SJGVtNlFjM5VlA3BShu8lSZLWOznrN8xq\ - CWAXYEEWbyRJkoa1GxnW2qwmAJl3JpIkaQOZTtqzmABMIS7+m9F9HEmSNIKlwLbAyizeLIsJ\ - wNFY/CVJytsMouZmIosG4PgM3kOSJI3thKzeqNslgFcCvwfGZRNHkiSNoh94NfDHbt+o2wnA\ - B7H4S5JUlHFE7e3+jbqYAPQAjxC7E0mSpGI8BmwP9HXzJt1MAA7B4i9JUtG2Bg7t9k26aQDe\ - 3+3BJUlSR47r9g06XQKYAjw58KMkSSrWKmDLgR870ukE4J1Y/CVJSmUKUYs71mkDcEw3B5Uk\ - SV3rqhZ3sgQwC3gcmNjNgSVJUlfWAi8HnurkD3cyATgai78kSalNpIutgTtpAI7q9GCSJClT\ - HdfkdpcAZgOLgPGdHlCSJGWmD5gDLGn3D7Y7ATgci78kSWUxng7vBmi3AXD8L0lSuRzZyR9q\ - ZwlgBrH5T28nB5IkSblYC2wBLG3nD7UzAZiPxV+SpLKZSCzRt6XdBkCSJJVP2zW61SWAScT4\ - f3q7B5AkSblbSWzUt6bVP9DqBOAgLP6SJJXVVKJWt6zVBuDt7WeRJEkFaqtWt7oE8BCwU0dx\ - JElSER4G5rb6za1MAHbG4i9JUtntBOza6je30gC8rfMskiSpQG9t9RtbaQAO6SKIJEkqTss1\ - e6xrACYBTwNTuk0kSZJy9xwwkxZuBxxrAvB6LP6SJFXFS4EDW/nGsRqAQ7vPIkmSCtTSMsBY\ - DYDr/5IkVUtLtXu0awBmEOv/7T4yWJIkpbOO2Bb42dG+abTifuAYX5ckSeXTA7yhlW8aSVt7\ - CkuSpNJ401jfMFoDMOYfliRJpTRmDR/pGoCpxNrBhKwTSZKk3L0AbA6sGOkbRpoAHIjFX5Kk\ - qpoAHDDaN4zUAIz6hyRJUul11AC8PocgkiSpOKPW8uGuAegBngGm55VIkiTlbhlxHcC64b44\ - 3ARgHhZ/SZKqbjpR04c1XAOwX35ZJElSgV430heGawD2zzGIJEkqzr4jfcEJgCRJ9TXih/qN\ - LwKcRGwaMDHvRJIkKXdrgc2ANRt/YeMJwK5Y/CVJqouJwG7DfWHjBmCv/LNIkqQCDVvbbQAk\ - Sao3GwBJkhpo7+F+c+hFgD3AcmBKUYkkSVLuVgHT2GhHwKETgB2x+EuSVDdTgB02/s2hDcCu\ - xWWRJEkF2mXj3xjaAAx7m4AkSaq8TT7kD20ANukOJElSLYzaAIz4xCBJklRpm3zIH7wLoIfY\ - Anhy0YkkSVLuVhNbAr94J8DgBGBrLP6SJNXVZGDbob8x2ADsVHwWSZJUoA1q/WAD8KoEQSRJ\ - UnHmDv3FYAOwY4IgkiSpOMM2AHOH+UZJklQfNgCSJDXQBtcADN4GuJy4PUCSJNXTKmDq4C96\ - gJlY/CVJqrspwOaDv+hho/sCJUlSbb1Y820AJElqDhsASZIaaLvBn/QM/YUkSaq1bQZ/0jP0\ - F5IkqdY2mADMSRhEkiQVZ6vBn/QAWyQMIkmSirPl4E96GNINSJKkWnvxQ/+4/v7+PtZvCSxJ\ - kuprHdAL9PVg8ZckqSl6gFmDP5EkSc0xB2wAJElqGicAkiQ10AywAZAkqWlsACRJaiAbAEmS\ - GsgGQJKkBrIBkCSpgWwAJElqoGlgAyBJUtNMAhsASZKaZjLYAEiS1DRTwQZAkqSmcQlAkqQG\ - mgI2AJIkNY0NgCRJDTQBbAAkSWokGwBJkhrIBkCSpGbpBRjX39/fnzqJJEkq1DgnAJIkNZAN\ - gCRJDWQDIElSA9kASJLULM+BDYAkSU3zPNgASJLUSDYAkiQ1kA2AJEnN8gLYAEiS1DSrwAZA\ - kqSmsQGQJKmB1oANgCRJTbMSbAAkSWqa1WADIElS07gEIElSAy0HGwBJkppmKdgASJLUNDYA\ - kiQ1kA2AJEkNZAMgSVID2QBIktRANgCSJDXQU2ADIElS0zwBMK6/v78PGwFJkppgHdAL9PUw\ - MAqQJEm19xTQB/HJ/8m0WSRJUkEWD/7EBkCSpOZ4seb3AIsSBpEkScV5YvAnPcCjCYNIkqTi\ - LBz8Sc/QX0iSpFp78UO/EwBJkprDCYAkSQ20wQTgLwmDSJKk4rz4oX9cf38/wHJgs2RxJElS\ - 3lYBUwd/MbgF8J+TRJEkSUV5eOgvBhuA/0oQRJIkFWfYBuDhYb5RkiTVx0NDf2EDIElSMwzb\ - APwxQRBJklScYRuAPyQIIkmSirPBtH/wNsAeYAUwOUUiSZKUq9XE7f7rBn9jcAKwDvh9ikSS\ - JCl3DzKk+MP6BgDggWKzSJKkgty/8W/0jPZFSZJUCws2/o2e0b4oSZJqYdQJwH0FBpEkScXZ\ - 5EP+4F0AEM3AcmBKkYkkSVKuNrkDADacAKwDfltkIkmSlLvfsVHxhw0bAIC7i8kiSZIKctdw\ - v2kDIElSvQ1b220AJEmqt3uG+82hFwECTCK2BJ5YRCJJkpSrtcQFgGs2/sLGE4A1eDugJEl1\ - sYBhij9s2gAA3JFvFkmSVJBfj/QFGwBJkurr9pG+MFwDMOI3S5KkSvnVSF/Y+CJAiKbgGWB6\ - nokkSVKulgGbM8wmQDD8BGAdLgNIklR1dzBC8YfhGwAYZWQgSZIqYdRaPlIDcFsOQSRJUnFG\ - reXDXQMAsWnAM8CEPBJJkqRc9QEzic39hjXSBGAFIzw8QJIkld5djFL8YeQGAODWbLNIkqSC\ - 3DLWN4zWAIz5hyVJUimN+SF+pGsAAGYATzN6kyBJksplHTALeHa0bxqtuC/F6wAkSaqauxmj\ - +MPYn+6vzyaLJEkqyA2tfJMNgCRJ9dJS7R7tGgCAScR+AJOzSCRJknL1HHH//5qxvnGsCcAa\ - vBtAkqSquIUWij+0doW/ywCSJFVDyzW7lQbgJ10EkSRJxWm5ARjrGoBBDwE7dRxHkiTl7WFg\ - bqvf3OomPz/uLIskSSpIW7XaBkCSpHpoq1a3ugQwCXgKmNpJIkmSlKuVxPa/Ld0BAK1PANbg\ - xYCSJJXVdbRR/KG9B/38qL0skiSpID9o9w+0ugQA8XTAxcDEdg8iSZJysxbYkhYeADRUOxOA\ - pcDP2nlzSZKUuxtps/hDew0AwFXtHkCSJOWqo9rczhIAwGxgETC+k4NJkqRM9QFzgCXt/sF2\ - JwBL8OFAkiSVxa10UPyh/QYA4MpODiRJkjJ3Rad/sN0lAIiNBh7HuwEkSUppLfByYqO+tnUy\ - AXiK2HBAkiSlcx0dFn/orAEAuLzTA0qSpEx0VYs7WQIAmAI8OfCjJEkq1ipi859Vnb5BpxOA\ - VXSw7aAkScrED+ii+EPnDQDApd0cWJIkdazrGtzpEgBE8/AIsE23ISRJUsseA7YnNgHqWDcT\ - gHXAJd0cXJIkte1bdFn8obsJAMArgd8D47oNIkmSxtQPvBr4Y7dv1M0EgIEAt3UbQpIkteQ2\ - Mij+0H0DAHBxBu8hSZLG9s2s3qjbJQCAqcCjwPTu40iSpBEsIy68X5nFm2UxAVhJXJAgSZLy\ - cykZFX/IZgIAsCtwXxZvJEmShrUbsCCrN8tiAgAR6OcZvZckSdrQz8mw+EN2DQDAhRm+lyRJ\ - Wu9rWb9hVksAAL3ExYCzs3pDSZLEEuLiv+ezfNMsJwDPA1/P8P0kSVLU1kyLP2Q7AQCYA/yZ\ - mAZIkqTuPA+8AliU9RtnOQGACPjtjN9TkqSm+jY5FH/IfgIAsBdwV9ZvKklSA+0N3J3HG2c9\ - AYAIenMO7ytJUpPcTE7FH/JpAAC+kNP7SpLUFF/M883zWAKAaCwWADvn8eaSJNXc74FdgHV5\ - HSCvCcA64Nyc3luSpLo7lxyLP+Q3AYC4FfC/gK3zOoAkSTX0OLADOdz7P1ReEwCI4Ofn+P6S\ - JNXR+eRc/CHfCQDAVGAhMDPPg0iSVBNLgW3J8LG/I8lzAgDxF8j1KkZJkmrkAgoo/pD/BABg\ - BvCngR8lSdLwlhFr/88WcbC8JwAQ44wLCjiOJElVdgEFFX8oZgIAcQ3An4DpRRxMkqSKWU48\ - 9KewBqCICQDEX+hLBR1LkqSqKfTTPxQ3AQDYnJgCTCvqgJIkVcByYu3/mSIPWtQEAOIvdl6B\ - x5MkqQrOo+DiD8VOAAA2Ax4CtijyoJIkldRiYC6wougDFzkBgPgLnlPwMSVJKqtzSFD8ofgJ\ - AMAk4ilH2xd9YEmSSuQR4NXAmhQHL3oCAPEX/WSC40qSVCafJFHxhzQTAIDxwN3A7ikOLklS\ - YvcBewJ9qQKkmABA/IXPSHRsSZJSO5OExR/SNQAA1wHXJjy+JEkp/JQS1L9USwCDdgV+SywJ\ - SJJUd33AXsC9qYOknAAALAD+b+IMkiQV5d8pQfGH9BMAgC2BP+AWwZKkeltO3Pb3ROogkH4C\ - APAk8KnUISRJytmnKEnxh3JMAAAmAr8Ddk4dRJKkHDwI7AGsTR1kUBkmABD/QU5NHUKSpJyc\ - RomKP5SnAQC4HrgidQhJkjJ2NXHre6mUZQlg0HbAA8Dk1EEkScrAamAesDB1kI2VaQIA8R/I\ - CwIlSXXxb5Sw+EP5JgAQFwT+Bp8TIEmqtnuB11Kytf9BZZsAQPyHOglYlzqIJEkd6idqWSmL\ - P5SzAQD4JXBR6hCSJHXoG0QtK60yLgEMmkFcELhV6iCSJLXhSWJfm6Wpg4ymrBMAiP9wH0kd\ - QpKkNp1CyYs/lLsBALhy4CVJUhVUpm6VeQlg0BbEUwNnpQ4iSdIoniHu+V+cOkgryj4BgPgP\ - eXrqEJIkjeE0KlL8oRoTgEHXAPNTh5AkaRg/BA5PHaIdVWoA5gD3AZunDiJJ0hDPALsBi1IH\ - aUcVlgAGLSI2VZAkqUxOomLFH6rVAEA8LfBbqUNIkjTgUir6JNsqLQEMmgH8lnhyoCRJqfwF\ - 2IMK3PM/nKpNACD+Q3+Q2GdZkqQU+olaVMniD9VsAABuAs5LHUKS1FifB25MHaIbVVwCGNQL\ - 3AbskzqIJKlR7gQOBJ5PHaQbVW4AAOYCdwGbpQ4iSWqEFcDewEOpg3SrqksAgx4CTk4dQpLU\ - GCdTg+IP1W8AAC4DLkkdQpJUe98iak4tVH0JYNBU4A7iIQySJGXtQWBfYGXqIFmpwwQA4n+Q\ - o4BVqYNIkmpnFXAkNSr+UJ8GAOB+4MTUISRJtfMhosbUSp0aAIDLga+mDiFJqo0LqdG6/1B1\ - uQZgKPcHkCRloRb3+4+kjg0AxHMC7gRmpw4iSaqkJcQHyYWpg+SlbksAgxYCRwNrUweRJFXO\ - WuDd1Lj4Q30bAIBbgI+nDiFJqpwzgJtTh8hbXZcAhvp34PjUISRJlXAxcELqEEVoQgPQC9wK\ - 7J86iCSp1G4H3kRNL/rbWBMaAIA5xE6B26QOIkkqpUeJD4qPpw5SlDpfAzDUIuDvqNkuTpKk\ - TKwiakRjij80pwEAuBc4FuhLHUSSVBp9wDFEjWiUJjUAANcA/zN1CElSafwTURsapynXAGzs\ - q8QznSVJzXUh8OHUIVJpagMwHrgaODx1EElSEtcAR9DgZeGmNgAAk4Eb8fZASWqa24GDgdWp\ - g6TU5AYA4lkBvwTmpg4iSSrEQ8ABxF7/jda0iwA3tgR4G/4fQZKawHP+EE1vACC6wXcAy1IH\ - kSTlZhkwnzjnCxuAQXcQF4M8lzqIJClzfyXO8benDlImNgDr3Qi8hwZfESpJNdQH/D1xjtcQ\ - NgAbugb4ANDoKyMlqSb6iXN6Izf6GYsNwKYuA05NHUKS1LVTiXO6hmEDMLwvA2emDiFJ6tiZ\ - xLlcI7ABGNnngE+kDiFJatu/EOdwjcIGYHTnAGenDiFJatnZwKdTh6iCpu8E2KpPA2elDiFJ\ - GtVn8FzdMicArfkE8X8sSVI5WfzbZAPQurNwOUCSyuhTWPzb5hJA+/6ZuDZAkpTeJ/Cc3BEb\ - gM6cCXw2dQhJarh/BM5NHaKqbAA6dwpwATAudRBJaph+YpMf7/Pvgg1Ad44DLgYmpA4iSQ3x\ - AnA8cGnqIFVnA9C9w4HvAC9JHUSSau6vxIN93Ns/AzYA2Xgz8X/IzRLnkKS6WkF84Lo5cY7a\ - sAHIzj7Aj4EtUgeRpJpZAvwdcGfqIHViA5CtucBPBn6UJHXvIeBtAz8qQ24ElK2HgAOAO1IH\ - kaQauAM4EIt/LmwAsrcEOBj4UeogklRhP8LM7JEAAAapSURBVCbOpYtTB6krG4B8rALeBVyU\ - OogkVdBFwDuJc6lyYgOQnz7gROCMgZ9LkkbXR+y0eiKeN3PnRYDFmA9cDkxNHUSSSmolcAzw\ - w9RBmsIGoDh7Ev/H3iZ1EEkqmUeJD0r3pA7SJC4BFOceYF/g9tRBJKlEbgf2w+JfOBuAYj1B\ - 7Bp4ceIcklQG3yTOiYvSxmgmG4Di/RU4gXiS1QuJs0hSCi8Q58DjiXOiEvAagLTeDHwXmJ04\ - hyQVZQnxQJ+bUgdpOhuA9LYHriSeJSBJdXYncBTwSOogcgmgDB4B3gB8LXUQScrR14lzncW/\ - JJwAlMuxRCPgfgGS6mIlcBJwWeog2pANQPnsSiwJ7Jw6iCR16UHgaOC+1EG0KZcAymcBsV/A\ - JamDSFIXLiHOZRb/krIBKKeVwAeA9wHLE2eRpHasAN5PnMNWJs6iUbgEUH6vJJ4j4F0Cksru\ - TmI//z+mDqKxOQEovz8CBwLnAXZrksqonzhHHYjFvzKcAFTLwcTWmdsmziFJg/5C7Oj3s9RB\ - 1B4nANVyI7A7cGnqIJJE3Nq3Bxb/SnICUF1HAxcCL0sdRFLjPEPc239F6iDqnA1Atc0hdtea\ - nzqIpMb4IfAhfIJf5bkEUG2LgMOJHQSfTpxFUr09TZxrDsfiXwtOAOpjC+DLxNKAJGXpSuAU\ - 4MnUQZQdJwD1sRh4N/GkrScSZ5FUD08Q55SjsfjXjg1A/VwFzCMeKrQucRZJ1bSOuL5oHnFO\ - UQ25BFBvryf+Ee+eOoikyrgXOBm4LXUQ5csJQL39J7A38E/A6sRZJJXbc8S54rVY/BvBCUBz\ - bAecDxyROoik0vke8FFgYeogKo4NQPP8LfBFYJfUQSQldz9R+K9PHUTFcwmgeW4AXgOcASxL\ - nEVSGsuJc8BeWPwbywlAs80BziYe5DEhcRZJ+XsBuAT4F9zMp/FsAASxHHAecFjqIJJycy3w\ - cWLsL7kEICBOCG8beN2XOIukbA39923x14tsADTUtcT1Acfj1cBS1S0k/i2/hvi3LW3AJQCN\ - pJd43OcniOcMSKqGJcCniceFP584i0rMBkBjmQqcTqwdTk+cRdLIlhHX8pwPrEycRRVgA6BW\ - bU7cL3waMC1xFknrrQAuAD4PPJM4iyrEBkDtmsn6RsCJgJTOcuIR4J8Hnk6cRRVkA6BOzSCa\ - gNOIpkBSMZ4FvkTs6OknfnXMBkDd2gw4kbhOYOvEWaQ6e4xY3/8GMfaXumIDoKz0AscBZwI7\ - J84i1cmDwLnApXhVvzJkA6Cs9QDvJK4TeFPiLFKV3Qp8AfgBsC5xFtWQDYDytDdxjcB7iAmB\ - pNE9D3yHKPx3Jc6imrMBUBG2Aj5MXCuwZeIsUhk9SaztfxV4InEWNYQNgIo0CTiC2GHQ5QEJ\ - fk7s2Hc1sCZxFjWMDYBS2ZVoBN6H+wmoWZYB3wK+BixInEUNZgOg1KYARxMPLXkjMC5tHCkX\ - /cSn/YuBK3GrXpWADYDK5FXACcRU4OWJs0hZeJz4tP9N4nY+qTRsAFRG44G3EvsKvBOYnDaO\ - 1JbVxK17lwI/BfrSxpGGZwOgsptKNAHvBQ4FJqaNIw1rLXA9cDlR/B3xq/RsAFQls4B3D7ze\ - QEwKpFT6gF8A3x14PZU2jtQeGwBV1RbAu4AjgbfgZEDFWAvcBFwFfB9YnDaO1DkbANXBTODw\ - gdehxLKBlJWVwHXANQOvZ9PGkbJhA6C66QXeDLwDeDuwY9I0qqo/AT8aeN2Cm/SohmwAVHe7\ - AIcBhxC7D3pHgYazmrhP/zrgWuD+tHGk/NkAqEleAhxANAOHAnsSTy9U86wD7iEK/vXAL4G/\ - Jk0kFcwGQE02k7ib4CBiOrAXMCFpIuXlBeBu4lP+zcTV+67lq9FsAKT1NiMmBG8E9gf2xecU\ - VNVy4A7gdqLY3wasSJpIKhkbAGlkPcA8ohl4HbAfcU2BtxyWywvEQ3XuAH418OP9xJhf0ghs\ - AKT2vATYjVgu2BPYG9gDLy4symrgXuA3xBr+3cB9uH4vtc0GQOreeGAHYjqwC/Go43kDLxuD\ - zqwGHhh4LSA+0d9P3J7n3vpSBmwApPz0ANsCcwdeOw75+U7Eo5CbbDXw0MDr4YHX4K//giN8\ - KVc2AFI6s4BtiCZhu4GfbwNsTWx1PHvgNS5VwA71A0sGXouBx4BHB14LieL+KO6dLyVlAyCV\ - 23g2bAY2B2YM85oy8JoMTAKmERcrbnwXwzQ2fYhSH3HV/FDLiH3vlxO74K0GVg28lg7zeob1\ - RX8JcWGepBL7/+6JvSCr2fnsAAAAAElFTkSuQmCC\ - " - local bubble_png = - "iVBORw0KGgoAAAANSUhEUgAAAQAAAACACAYAAADktbcKAAAHH0lEQVR4nO3dy89ccxzH8ffz\ - 9F6XXrR9tK6lLXVpVCQkLhGhIWiIRF0SG4S9hJUVGxaWNhb+AItKBGFh04UgIihBVJuWtmir\ - V8VDx+J3Js90OvN0fmfm9Fx+71cyeWaezuXbNt/P73d+58w5Y61WC0lpGi+7AEnlMQCkhM0s\ - uwDVy6pLV0Y9/8cd2wuqRKNgACQqtpG7jAELgGXAcmACWJI9ngCOAS8Bh4arUkUbcxGw3oZs\ - 5HHgLGAhoXGXAYuz23kd9xf1uH+6zce3gQfBWUCVOQOogCGbGGAWoZHPJTTu+cBFhGZtN+yi\ - rsfnAecM+8HTeABYD3xR4GdoSAbACI1gNJ4NzAPOJjTpBHAhsJLQsN1N3L5f1cXcRzAAKs1N\ - gB6GbOQZhBF5LmFUXgAsBVYAlwKrCVPt7iaePcyHVtTnwA3gZkBVNXoGMIIReSahMecTpteL\ - CKPyJcDlwFXABUw18fxhPrCB1hP+HU+UXYh6q00ADNHMY4RReSYwh9CkCwlT6uWEZr4CuIYw\ - 1V5MGME1vHHCv/fRsgtRb6UEwIiauT3FXkiYYi8njMpXEkaeK7LnqlyLMAAqa2QBkKOpxwgj\ - xCzCyNy9vbwSWANcB6yjugtdmt75wK6yi1BvAwfAgA3eXgCbT9jFtJipZl5NmGbfhNvKKbkI\ - +KzsItTbQAHQ0fyzCCvZa4C1hBXeVcDFhJFb6nZ52QWov5hNgHHge8JoLg3q6rILUH8x29Wr\ - sPkVb13ZBai/mABYXVgVajIDoMJiAmCisCrUZDNgJN93UAFiAsBFPuU1VnYB6i0mAJYUVoWa\ - zgCoKANAZ4JHZFZUTACY4srLAKgoD6/VmWAAVFRMAMwprAo1XW2+dZqamACYV1gVajq/Xl1R\ - bgLoTDAAKiomAPYXVoWazgCoqJgA2FlYFWq6Jp7vsBFiAmB3YVWo6SbLLkC9xQTAnsKqUNP9\ - XXYB6i0mALzMk/I6XnYB6i0mAP4orAo1nYNHRRkAKtpx8MIgVRUTAMcKq0JN5inBKywmAFzI\ - UR57yy5A/cUEgLtylIe7jyssJgD+K6wKNdnPZReg/mICwMsIKw+PH6mwgQKgYwXXhUDF2lZ2\ - Aeov9tuAXxRShZrMy4JVWGwAbCmkCjXRb8DrwDdlF6L+Ys/U8mUhVaiOWoQm3wns6Pj5HbCV\ - jt1/HgRUXbEB8EMhVagq/gL2Ab8Szv+wj9Dkv2f3dxMa+5fsd/9O92Y2fvXFBsCOIorQyLUI\ - h24f6PrZef83QlPvZ6rJoxd5bfJ6iw2Ag9ltYQG16GSHBrj9wamNfYDwf5SLDZ2W2ABoAe8B\ - jxVQS5Mc4dRmPdjjd/1uuRu4zUbWIMZarcGP78ku8Hgf8E5RBVXMFmAXoaHbt8OEBj3S49Zu\ - 4KEPmrKBdSbkOV/7u8AnwI0jriWvvwkNOQlcOML3fRl4Me+LbWDVQZ4AaAF3A08ANwCXAWcT\ - 1gXmEq4fcG7H848AJzoeTxIWm7p/Hs+ee5Qwyh7O7h/l5BG2/buDhG3ev7L3fR54Jcffp5fn\ - gNfARlazRW0CQKWv8/45cP2Q73ECeAp4E2x+NV90AFRNFkhrgO+HfKtJYBOwGWx+paEp12zb\ - NOTrjwEbgY/A5lc6aj0D6Ngc+RZYm/Nt9gP3EhY2bX4lpQkzgGvJ3/y/EBY0t4LNr/Q0IQAe\ - zfm6bcAG4Cew+ZWm2m4CdEz/txF2RcbYCtxF9o01m1+pqvvlwW8kvvk/Bm7B5pfqGQAdo//D\ - kS/9ELiT7Eo1Nr9SV8sAyIwDj0Q8/y3gfuBPsPklqHcA3AysGPC5bxAWC/8Bm19qq10AdEz/\ - B/1K8qvAM2TXNbD5pSl13Q04A3hogOe9QAgAwOaXutU1AO4Elk7z5yeAZwlTfxtf6qNWATDg\ - 6v8k8Dhh0c/ml6ZRqwDIzKH/9P848CDwAdj80unUMQA2AAt6/P4QcA/hQB+bXxpAbQLgNKv/\ - ewnB8DXY/NKg6rYbcB7hYJ5O24FbsfmlaHULgI3AWR2PtwK3AT+CzS/FqkUA9Fn9/xS4HfgZ\ - bH4pj1oEQGYB4cw9EE7ddQfhbD42v5RTnQJgI2EX4GbCav8xsPmlYVT+hCAd0//3gT3A03hc\ - vzQSdZkBLAa+Ap7E5pdGpi4zgDE6rrdn80ujUZcDgVpg40ujVvkZgKTi1GUNQFIBDAApYQaA\ - lDADQEqYASAlzACQEmYASAkzAKSEGQBSwgwAKWEGgJQwA0BKmAEgJcwAkBJmAEgJMwCkhBkA\ - UsIMAClhBoCUMANASpgBICXMAJASZgBICTMApIQZAFLCDAApYQaAlDADQEqYASAlzACQEmYA\ - SAkzAKSEGQBSwgwAKWEGgJQwA0BKmAEgJcwAkBJmAEgJMwCkhBkAUsIMAClhBoCUMANASpgB\ - ICXMAJASZgBICTMApIQZAFLCDAApYf8DcD99Gl27kUkAAAAASUVORK5CYII=\ - " - local inspector_png = - "iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAYAAABccqhmAAAgAElEQVR4nOy9ebwlV1Uv/l1V\ - Z7hD973dnR4ydyfdhBAyQBBMCCBDngJRGcWfT1QEUQH1Z+CJgk9BHjjA84GATIrTD5+oPPzJ\ - E0UhAWQMICRkAEJC5nnovt13PPdU7ffHrr1rrbVXndvEO/Tz1urP7VOnag9rr+G71t61qw45\ - 59BSSy1tTso2moGWWmpp46gFgJZa2sTUAkBLLW1iagGgpZY2MbUA0FJLm5haAGippU1MLQC0\ - 1NImphYAWmppE1MLAC21tImpBYCWWtrE1AJASy1tYmoBoKWWNjG1ANBSS5uYWgBoqaVNTC0A\ - tNTSJqYWAFpqaRNTCwAttbSJqQWAllraxNQCQEstbWJqAaClljYxtQDQUkubmFoAaKmlTUwt\ - ALTU0iamFgBaamkTUwsALbW0iakFgJZa2sTUAkBLLW1iagGgpZY2MbUA0FJLm5haAGippU1M\ - LQC01NImphYAWmppE1MLAC21tImpBYCWWtrE1AJASy1tYmoBoKWWNjG1ANBSS5uYWgBoqaVN\ - TC0AtNTSJqYWAFpqaRNTCwAttbSJqQWAllraxNQCQEstbWJqAaClljYxtQDQUkubmFoAaKml\ - TUwtALTU0iamFgBaamkTU2ejGWippf8otH/fvnhMIADADTfftEHcHB21GUBLLa0uPYtA1wOY\ - 3mhGjoZaAGippVUgFv1/yjn3MACXOjgc2HfaxjF1FNQCQEstrR51AVwMAhzcywjUc3AbzdNI\ - agGgpZZWgxxAoMfDYWs1/9/t4H5go9laiVoAaKmlVSLn3NOJqPoCEOgFcMD+vfs2lK9R1AJA\ - Sy39OynM/4nomc5VKb/HgR+GnxYcs9QCQEstrQYR9ju4cyvHBwA4uCkiumjjmFqZWgBoqaVV\ - IAL9iDjh4l6AZ8RpwTFILQC01NK/g0L67+B+BPBO7+BARKimAz/g4MQmoWOJWgBoqaV/P50D\ - 4Hw4IK4BAKgi/7kAdmwQXytSCwAttfQQKWzyIdAvEMg7PAHh1r9zDg6OADxpw5hcgVoAaKml\ - h0gODgTaB+CnnXMi+gMAyE8JCPR968/d0VELAC219BAoRH8H93bnnL/VF9b6/E7AcB0Angjg\ - mFwHaJ8GbKml74LUE3+vcnA/FNL+sABYXQPgAcDBPRr+4aCZdWd4BTomAODAvtOQ7Jm2tlBT\ - wzWqBQ4c+49gtvR/J7EHewjAqxzcW+AQ7bKaEsTyDAwyAE90cP+wjuweFR0TAFAJ7qcd3HkE\ - mnVwQyI67JwrQTgEhwKEIwRaBjDnyC3CYRHAPAgDAs0CGAKYcXBOp1oRjfkcjd+adbDPK+II\ - b7UPtODzH40MW3o4gLc6555BRHDk+DVvHy6e4PQEAMccAFCycLHOxKL/1QQ6O6Bo/HTVPVUm\ - WL6xIjqkQ10OmCHQ0MHNEmgAYB7AEoAF59wSCAvhO4AlAi0455aIaAHAwMHNEyj5rNppOl84\ - uCMjB9sENN+NCiyAOop2b7zl5u+ik81J0dlTeU4AeAaAnwTwQ/42v3J2IN77Z3bIpwKfhsOT\ - ieiYChIbngFUjj4O4BHc+QPFDRWExugs6nggmK6OjwsLMnyDRuy7ajdu3KgUyvvkQBT618DE\ - Aasa02EAjkBzAJYd3CKARSIaOudmq2KHKjZmQRjCYRGERQBDOMwSkXPOzVTTmyPOuQKEBQIt\ - ObiCQEeqMft6PhU9AqDwUsBMNTcdAJjfv2+fnQmNoqZs6GgyJquMcS7Jqo4yG0vKAnzzTXO/\ - mgi6z5yIHu6cOw+ERwH4XgI93sF1I69U206wp2qu74/DNWmXjyWi3MEVK4xqXWnDAQAAHNy5\ - AHLtWAIImPEGJVS3WERbYtslc+DQRjAQIhLKE/wwBYbvuqwFEuz6VFVvmoiiIXC+Q1kOLvE8\ - 1X0YsuJfar5IzT8Dz5K/eQDLFe8zFcgMAcxW50JmBCI6Ap/VlAAOR/mhyqDque8ygDk2Jl+e\ - av4c3AwAx2Q2C2DI9LLg4JYIFJ2LR1Heh4iswRGBjIimtF4q6hLRpHOuC8IkHMJnh4i2OLhp\ - ELbB4XgiOtk5d8CRG+My5rLlIMApyj6sBzhmvz54TTi4swFclSh1A+mYAAACPdrBScVVBkbw\ - 8yyRBfAV11DOSMm4MqJ+yHASdsyVzcFCt6OzBu7c0eGY8ymAkGNMjTaJIiLbMKJP5IkZIs+K\ - qtMTLMuZDmMLsud96PHGfhjPjRQcn5yoE9tzkndr4UzIxwBJrgPejuWcQR4CQHi67tI6/Lrm\ - 05yaWvUZWFXlL3DOHVMAcKzsA3hMo2KdEwaTOBYzxHAtRPf4j6jenVUZO0/lQhmePnLA4UYT\ - 2qjBnUQ6y8cQ2ksyDO5wipfAD2/PnBapNhMncixDIlnOdF51SmdZkZcRjh90lfBAJD65TCLf\ - YTjOHl+UG5MrP6eLJ+1C2lUYSzjHwYPLm7fPbUe3A4c4Xj6+aCde149rFN4G0YYCwP69+4Jg\ - H8UNQiO1nmsD8PWCMiCnDOE8NxatMO4cIlVzdTbA/1nTkdCXSSwq6NRV9KvAI/JJcl6ZGDI3\ - NIOFCC4uXVcR6anFd/h0UpZJO+xf4Jl/arCIZanuJ9EPrxL0weqI1N/VfCbzf0iwE9M55aQ6\ - 6+DP9POMioMYl2G0F/kykGTsAC4Ejq0NQcdCBtAl0Lnhi1CiQ2Jw8SufKrBPEWl4U8HQAlgw\ - 8Ij9MKfVkUYrlBucBhIdwQWfSNNJ1om4rq/pqKZePpH0AZbBaP7FGHnUZuPjRh3TcEsWqAFa\ - 36ExnYzxzOUo+GTOLkCTZWzg0yAG2hZp/iIQ6LFXMtPy10GGZ5XWtFJnlhX/Z4L8+tCxQhsO\ - AER0FoAeR1qNwPG7U9EbdpSpG4eMSgokQvmozBBl+HfWpgajmJ0w/rghiXo803DyGh8jj1DW\ - mERbARQ0KAZZaRAJxUjKz8qIrIzHWvE2+WP1rOyJ88Xn2aJty4+5TtKn7kbyJWTO++TOzuxD\ - Z5Aa3EW/Tuo5dsmymwpoiUDfY4xsw2jDAQDAY/SJBMlFIGUpqbE4x8vFKOJPJMqJBsoMQsw/\ - k6CVpt0RCIKTgJIshn8KwGFtRmfGCim6Ij0fjVGUObIwaOYEcSysTwt8BJAZ6a0AmpCWsz7E\ - OBvGl/TNnZGtk8TzVGdu+poYFwPkyAu7y6QjezImlXnp1D/yEsbIwVjZZNVvYu8bSRsKABUy\ - PtoyhqRspQxRLjyBRaxMQxTWaVroh6N2Ei0NULGiaowUIUXVC5BIMxft8LF9fntSpdz8u3Ao\ - 2OeDs+qsgmcPnB/dh+UUyTFzQnF3wtWO1sSrPhfLWmk5ahvgfYlx6zEZU5tQV2SRoU+dcWqe\ - +TwftU6tvQc8uAS9Vu085iixfV1owwDgwL7TQETI8lzcAQCQpGIQ8pVzL77wIqYK7B9XOl+w\ - Eako6yQ4rpU+x7IaNKiux9N5UQYqKhsLlKEMBzwuAyv6xsjEohN3lghMTHaxrwCiruZf886j\ - JI+eYdwWX6Fvkeob8oxgwR2SlPxZVsHHpgGfg5apO549MFnzdrm8mjIYbjMc+BOggbPG8RgA\ - x8wPhmwYAPTHxuCcyzqd/DH61kpy71UZk3U7CcT+UCtHK0XUqS+or7bymyK/dpLIO7vHbhLZ\ - Bsj7005hpatRZhZeMaPnBimcRdXlDib6apgSRSc06phpsso2eN9JNqhBkjm8uE+vozbbN2Da\ - jbrlqm2Mj5nrlstfgILO8Ji8RMZCOEBhp+oxQBsGALt37cT0tm1nDgaDnjYI7UjVgVQBQ2hS\ - /1DNB/n92agXShXKie870Dw0RReeeQASwEQ5HhFVW4njKGBgFxAzGaTpKueJZzLW7cAIrkZb\ - Gow08euWcwY+9QJdyGb0uo11Szc6uAYMzjsHMS4rgrAZIRslZ3EnxLgtGcdp6ErvMbH443qo\ - 2njM+MSEKdf1pg0DgOP37MHjL3jsC4KD8sighZ2gqjPSxHhZpZ0k20mimr8o22lwClHNMHAO\ - LqHP0F6oExyAp686kwh1NSDqLCn2yeelkIbLxySuQxpnzFga5r8BRMX0ximjHxXlwXRJdcQU\ - IKLlY0RlDWhajpFnJ+XCeY39EdMpCxChrJUthTFpnqLONOAY+Hzy3lOftH3H9vTCBtCGAcDk\ - 5ATK0j2Np7aBtDKj4TPH52mgFrpIDSsnSVJx5cy6H+FATrYDyOvCUNSUwBdN97CHehbp1DgY\ - eXLdSMmtzIHLin9vymQSgAy8skzKWqwMPFlZVXQO5xJHEdG+GreQnZ7KuVQXiaOSMU6nxhhA\ - gk8VHERg4XbD6ySAw65rGepsc8/u3Zds2bo1kfFG0IYBwAMPHsS9993/MCsVBlCn7ghfpbFw\ - lA71dESL7UBGa+6EXOGRB74wxQwk9sMWzTR/NftpRNfTCmsOyinJQFCPWY9PrN4z+Vgr1Lx/\ - kX2osfL2myjKMgyfp8TsrgDbDJOA1KjsL+HbAj/m2KIeG2vgI/Rv8RL6SqaXPNNs4DOZEozI\ - ag8fPnLm1MQ43vf7vzNCsutDGwIA+/ftw9axLr5z083HcaQVEdRK8VmaZt2CSdJ7lR5z5+NR\ - NTqDEQGtaAhAZBhJJHByGiLKOdkGT3Hj+FVGJMbO2hd3QXjKTaidUohPOpaIuNbeA51Gh7oq\ - ynFw5e0KHakpSBKxneJBpfXCAcMfZBCo2bZ3WorphaLYN8sKdJtNx9wGdSDgU5RA37nxxi1P\ - ffxjtw+Gw4SP9aYNexrwc1/+av63f/i7N/U6+cPmlgZwZXAeYHZxKZYbDkvMLy2hrK4vF0MM\ - hkV0ucHSMgZFCarOzC8soqyUWJYl5llby8tDLC7V35eWhxgMBtGA5ubnURYFnAOIgEMzswgg\ - PiyGOHz4cKy7uLCAubk5MaaYhai5dHR85pgmMLm6rrUIGR2GOzuYo6nswJpaJSDAHJSDVhIt\ - Q3vKmZtAQwAgyQzNkpkAODYOwZ+ecqhsRThww9hE9y4dkx6zmJqwejGrANWPb7OxCOBj34kI\ - w+VlzC0uPdc5935sMG0YALzn9ZcWjzptT887Bg9XKmwFb/Rf6mvRCIiVUdfjtXBJaT/YbqJg\ - HX1J9sfrV9dml5YxLFzsd3ZhCaVzIAJKB8wtDmJzy8MSS8vLkdvBsMDSch0N5haWUJRl/D67\ - 4N/34eDgSof5xSUQCCWA4XCIpcFyLLu0PMBwWEYnmV9YQumKyO7c/EJ1jVAUQywsLCIIYmmw\ - jIXFJS8uB8zNzWKwXPN98MGDcEVROwcHpgBa7BVZwhkUyIVjrnJrDUNHeP5dZAjGqj2rVKf7\ - UeeyTugv8BUeC7emmLwtveaQTAcUn2HMR+YWnlaW5eYEgBtvvhnltZ9Erf2Q9sn0qXZEFj61\ - I3KAUNghysXzzHEpWAYHEFUPqj/BJ8XPLX32I7BE2DbZZ0ywDICBRtIu502TADSS407kECJa\ - Q3khZ6OtOG7dfqyE4bDA7GINPMPSYX5pUHXlMBg6xBTXOcwPCxTDIrZ4ZKHOxArncGRuAVnF\ - w2BYYHFpCZRlcHBYWhxguXSgysFmFxarZn36PVd9JyIMyxIL8wtRtoPBAEuDIYIeFxeWMCyW\ - 45APH56NWi/LEodmDkW+lhaXMDc7m2Rg1nqAXggMACLqkotTkAdmZs7dd8IebDRt7AtBooMr\ - Jw3a0c6BcK4CDe5MxOqHlLLJSeKp2oFTPmS0SHhuAgTnmrMTnlhwEBDjU30xkLEd1SAuE34u\ - 6dsYr5AFB8j6KwB08gzbtozJ8W8dGy2XUaCUkOobQMKLGIsxzgQUmwEt7V6BJID5xWUMhvUb\ - vWaXBihLF5s9sjCI/RRliYUlluUVpcjUCDQ3XK5BcKNoYwFAO3w8b6TkOro5di005ipgiDbc\ - EGmbphV1AX+OpbONfASndfw6d66mcRnGmfCl+uVltIys8QnnESmIqk81P1amEasbcuKOqIkD\ - YgRBBs6iKe3oXAaBHyUfDXDOpXqx5ANWRvRPqaxZmYmxDiZQZ3oRAHn9ZEyGXPzYp++dmUuv\ - rTNt/NOAzjrh6gsmOKjvPErG68yo+XXteNoIIk/BuBsiBOdDOIeK9NHodcQ3IjLnSzuc5TDJ\ - d3VO1FefsR+dhWlggXIIsPGofpzSGyDlz8HS6kumcYbu6Oh41tkLXCr7ANhxPKxPp8vzes6W\ - NR8z17lFPgvdvnt60r6+jrQhAFBe9yl/4LArGlikYFhMuUmqHBwbxjWLHFPciExDnG8wetEs\ - zy7Y9cCXcOQRBtHIA+8Do9vQwFhfsHkMUVDIkH2OTM1Z00kxrS9IGerIHM4nqbziy0rzLd3H\ - a6xsbMYpnYmCaTu6jABp3T/YGBrshH93OCb2Am9cBkA0DaIJ02i1Y/P0kYODkHX4oowNgO0Y\ - RkjUEVdHhtiucS6eZuARwC3wIiIL45M7gJ4GiDn5UYAX5zlxIAW0nFcoeekoyykBbAN4zTHU\ - p+o+WVndLnc2rQdrGhTbV32GskEnktHmfvk53bbQrR5DQyCSALcFYMFwg2iDAMABwD4ZGVSU\ - tpQgUlGehmoHhB1RdHtNU4BQ34qq1hw9GpZyajFkpwxQGXIy92RdJFkQ0u/m2BSfvG7SHmtT\ - g4gwcpJ1LH6S9QWjnBUpVyKRzutxKTlq3i0Q1KDOxxAzOBX9dZQ3p2kKaDRf9eeWox/82tAG\ - LgK606vPFaKFS4WcRGNKswbdhjyBkZEtSfcZwFD1X9KEkSHwMWljjEYR2AlZDlIZaN4A2/Ai\ - aLmaT82Tlp+OlMniJCTIjsqELH6E4TOeRpIlB0s+BoCbY1P88LFy/q3y1hhXkh/P1qz+6uu9\ - xmxhnWhjMgAHAHS6vbATyhiCs+bhVnSMKRoglGmht5m+hnoGooviTVGe2GUV3fn1kMHorEAb\ - rJmZqMisx8JZ0/N+nkGlhZVMWCZkyT6Mu0kGAqhYWRHNFWmgEWk/68dcwA0y0eV4G+FiOO9s\ - 2TVlBnr84Twvz6dzwZ6CPdRZzNQG+/8GrgG4KgPQcypZpjpoSLd4xLIQPy4o8nP62CIylGX1\ - zfoz552srJVexqHpyKTKcyBL0kxtkDxKGv1Y6yJmZFeZiwWyvFyUC2tDO0QCDAZw8ba5jqUw\ - ZBkzK2JtrZgZGtHaysKS9lRgigkAA/pgO1wn9RrWuN3J+tFG7gM4EYBC44qsFFJ/MmEuLQ9x\ - 3+F5PHBkHodmF3HoyBzml5awtDzEwuIAswuLGAyGGAyXwffoLywuoSj8xo48zzE+xnfvAUSE\ - yfExgIA8yzDe7wEA+t0uOt0cnbyDiV4XRIStE/6e8Hi/i06WodftoNfJ0e920OtkGO/10Mn9\ - jsFOznHXAD2RyjOj4XNzq644HQzN2WVjWzxjccpolR50PZMHBny1IA0mXf1BhPmlZQyWCywM\ - hlguCswvDVA6YHbRb66ZW1xC6YAj84twzuFItaV5fnEQt0QPlodwzmFh0W/D9uz6T/+MiAeL\ - LMsxMd6vWPPbmMf7PfR6XYz1+9gy3ke/28V4v4ttWyawfcsEdmwdx+7pSfTyTNqsmHYAiZPH\ - okp/vs5UIzitE20kABxvnhWo75SdOczML+ErN9yBa268FTfcegduvOlW3HTTTRgOl6NNJXvN\ - AaUTuaVTPHRS9RW3cargnzwA4yojqs7xevphnHBty5atmN42jamtW7F92zSmp7ZieusUdkxv\ - wa7tW7HnuO04YfsW7N25HVsnukgMzZwjs3M86o+cr44g7ejJfNwgUYRwxwNHcOeDM7jrgRnc\ - e+gI7js4g5kjc5iZncWhQzOYmTmCg4cOYubgQQyHBfQefv6wk34q0HoICWR8RtZYu5DbdJME\ - o6qr7aTb62LfvtNw+r5TcWDvSThn/6n4ngMnYWq8pyI+UG8zD2062YHX1Y4V9bDGtHEAQBYA\ - cCOVGcF1t9+P9/3dZfjnT1wWnT15SksrTTl81Le1T9ulD50AzPiUQfE+OYCE/d6873oY3qnm\ - Zmcxe+QI7ohBPjXqwN/pp+/Hgf2n4eGnnYLzH7YX5552AqYm+nWUj0BQj7dx7UAfC7DlWZUq\ - L1JjNf7q2q33H8HXbrgVX7/xFtxw02247hvfwqGDB1MdMTlwkLQeD9b65I9UWw8I8YePkoSH\ - OTIH+/AAk+iHbH0PBgNcf/238O3rr8c/V+PodLv44Ut+AD99yffhzJN3SdnyDC4BUAcAOzY6\ - A6DGF1auEfmHgAAQLcK5fi3kZiT8/y77Cn7nD96TRAntmNpYwrlYNpBC/MZMgF23jFa0pcpp\ - Y+ZAwh9BtQAieS8AM/g8z3HRRRfiqRecj0se+whMT/SbHZozyNNTnj3ozKBpymXQt+96EB/5\ - 3JX4xKc/jxtvvJGJV2VDirS8w9gTIGzI6KxHjXl71jsVEt2o6ZSVFWpdNZZ1Dr1+D7956Svw\ - o086NzA9WraefgnAO7JHPsWU73rQRgHANgAHZcqk0lsAIOAvP/k1vP4tb4+XkojMIgUyQifv\ - VE3Jl1QEchUy+4c4KgWyR2+rQpBn/GO4FrhoIwt9NBmOalVc087S9Ax9OLd7zx78+i+8GM94\ - zBlKjjp8se86tbeMNDJgO/7cwgC//7cfxwc++CF72sS6tbIqfV6TkB+ALM8AEMqyAGUZqDrm\ - MtLH8bvmj4GD+Vgzd3wVRPg4LBDJshzvetNr8bTzTvcdWmso8vh1cO4Nmw8AiM4A3LcajbKi\ - G+8+iGe//DVYWlwSCut0uxgfH0e330en00GW5VUzJRwcymGJ0vln4l3pUJaF/3QFUCmuLMuY\ - ppWleqtLWECKZQAQoXClGb0ACIMM15NsAbaT6AyGU1N/vNwbf+2X8aNPPC91WLFAxR2dZwFG\ - RhA7T510fnEZr3znX+Lyyz+dOJEFWHmeI8tz5HnOmiVQRpXcgpN5/XlHLytWXPrJwLqMAgwt\ - 1JJxZSn4aZziWZG/atYMIEZWx4HmxJNPwt+99Teww3pQiNu5P/dOwP1idtbGAcDGrAE4tyO9\ - PZOmse/5u09gkT3rjYxw0kmnYHLrVpRlibIoUJQlisI/d14UJcpi6CNGAZTkTSRDjhIFsjKL\ - L9qgLAPKEs4BWeaNLhhg1FWWiewgB8XMgGL6UX2ryurnv/ULPuO1YHRUG5W11mCmxpBtvfFt\ - 78V5p/83nHnyTunooxb9CEb2pcvp6QPw/o99AZdf/mkmg7ro2MQ4+mN99HpjyPIMWd6BK8sI\ - wM45FPGYAXR1jNJV+shQlmXMAvgn8hyuKAAiZEamFrjy+mCgpNcMFFCHMnoKmAB5AAYO2mx6\ - eOcdd+B//etX8dJnXigVyQUf23c7jQLrShu1D2AHANS3uxhV3+96cA7/8I//XJ3zHyedciqm\ - d+xAnuXIsgxZ7j87Hf+IZp5nyLIcROQNEFmMNlmeg7IMebhOBGRh+A5ZloEoQzD66EMZE1Go\ - J6JOzX+WZf5S1K+/HF+R5bxD67fJ6BQzLIj5Lo1UVCQQDkuLi/jjj1zOZOVidpNWqJgKTi2A\ - WAMMAxLncP/hBbz/L/9a9N3r93HiKafiYY84C6fsOw3H7dqDLVNT6I+NI88z5JnXCTI/Jetk\ - OSgjEDHdxOMsyj2r5M7fLxi5yvMIdBllET7rMXiJBd1Z60AOHpACCFsLygl4OyTtxOsBGBzw\ - j5/6fGhAyZ2V95nATgPT15U2BgCItkcDbZiDXnbltzCsIjuB0Ov3sWvnbnTyHJRnNQhk3nj8\ - 3L9yfA4ClFUGR/58ZXCAQ0bkjanSYA0CXkMJCIT7yAwogsFVcccDjTLauHqNGgys98wlaadL\ - jTbU5WDg4PCRf/wY7puZj7yLVDNYqM4OnJY/y8JctPaYun70iqsxNzeH8CaeTt7BgTMfgeN2\ - 7kS/10ee+VTfy7rSTQUCndyDAIg8CGcwQCCrQKDWB5ejSFQCCDiHnOlMg3LQnZ7q6jsF1tuT\ - xRuO4eqmFQCHOiGLuOaaa3DHg0fSzEoACQHOnXD5l6/e0J8JW9cpwIF9p+HNr34Znv3kx+0Q\ - t0eMtPXr3765+upTrN0nnIBOr4tiOASIMMQQWSXw4XBYu6NzyDs5UJCfDnQyYFhNBzI+HchR\ - ugIZAS7PffruXEw/w3vzqIoElGU+9awoi9MBPw7vnNUQsiyuCfgSFRBQHf2T7DD6HgMKI/rr\ - 21nB8FxZ4vPX3YRnXXBWbCu8webI4lIU8aAokREhJz+2TpZjvNdBv9vBeC9Ps7IIFMAXv/5N\ - kfzsOfEkjI31UQxLOAA5aicYsjfelgCoAPIMKFEAJZBnHRQogDLzJTIgKwkl/FTPFb6jpukA\ - 4EHAFYUHZUBNBwI5v95QQiza6bWKxkVJklO2eMuRtSUWF6vzl331m/ieh++z2/QMoHDlCT//\ - +rf2ut3uoLng2tK6rwG8+s3vnr5vobjo9BN3jyx31TXXifnVtu07kGUZXFhM6nQwJKAcFsjz\ - HAV8OtOhLobDZeR5BrjcrxwTIadq/p/JNYHw4k5kBFcCcKUCAYZRFVAEyohQOhf9uZ6B+hXh\ - siykkTEgiPe19Z0CYve7AZEVWAta/Nzb/vSDeP+HtuCBBx7EoUMHsTxYTue7MAy6uj42MYbt\ - 23dg29Q0JrdOYue2bThu+zS2TW3Brm3T+OIVXxa87ti1E3neAdwQBGAIoEMdFEWBTqcTQUA7\ - Vwn/ktIcuQKBDFlJKFyBLIJyyUAgq8bOMupqLYfrAxA5ADwIZHAMlLk8hBzZJ9eZlnVj9lDV\ - eeP/eJe8HcnWEVibOyYmJ07as2vnTdgg2ohFwNPe/I73/iiAxACtVzAHoU1OTsbUPsYWl2PY\ - AWhI0QCpLNHpeBDI4rbNIcqiREaZWhgEsrKsQCBDljmUMfIQyhA1WCYgrM+5yuiAehrgyzv4\ - LaccMPQ9/WgULOon542IJQwpoA8Bd9x+u+grrjtQeitRy9vBYWFuAQvzd+DOO+5IQIPPcQEg\ - y3NMbZnyi3oVKOcACgKyajydjgeDomDLLb3XR8UAACAASURBVBWVZQEQkGccBAogI+TIUbqy\ - cm5rYRBRH3FhMIAAgDJJsRgoF0WM6np84Y3GcVFW6SUCA4/81XcOGoEvkbUEUFesPeuSp+84\ - dPDgpgKAZK7L58caZYMR9/p+7/ZwGchzxxvC0A1BcAg3mhwHgQyA81fKsvRRP0wHKICAX4kO\ - 6wZl4e8GyLsDjGcicYswI0LhwhRARdesvq2llS9SfB7RSRpalJO6h83LWtHLMk5BJEEpvtKb\ - 8xmmuHHs/ly/30en2wHYb1s450Aux7BDoKLw0zF2+y86TtVWPR0IIJBDTgcQI3x9t0beFYhO\ - GqZoRMicBwGekQXZBP2KsUb25Iq+0BUkCDTuDSBmv8aYI6BX1/eesHvHJRecG18Mkp315FRP\ - a0jrAgBh999rfvY/43fe9z8TwQrDVYIPRt7tdNQtap8JODf06SZqJRVgmUAxFCudJSoQqGaM\ - WRamA1RnAjmx9JNQlhnCBqI4HeC3CJ0Ttwj52GIfpRF5AhBSbUB8cU+sfIPEO/d5+7E99slT\ - zv5YH5Nb7HdPPHD//aL/qmGpCwdp0OQBOe/koi0i/6MXnSzHEA65y1EUformb/MByJzXgfMr\ - /oUAgSHLBDKfnYHgshxUFiNvETrn6ikakV+jYQYTsjMHv7Eo/hANVIQ25KtvRY7arxHKb52a\ - Qq96eGwUXXDW6T9+1im7ugA+Befmg6+s1+agNd8IFLf++uzsP339lntf+o4P/sNzQJTxLZ71\ - sU/vPv2vn4m77wDg4qc/EyBCMSxQlP4d80Ux9CnmcBlF6fxiYFGiKAuURYHS+Q0/w+opwLJ0\ - KAs/HXDONWwW8m5cOldFHt8/3ycQeAYQo05ApzT9ZLIoCzO9N9PzkBnojEJFF153//4DeNOl\ - L8HUeB8TvQ62jPf8cwOiYRXhqqYOLwxwZGEJc0vLmF1cxtziIu558DAOHp7FfQcP47a778Vl\ - l30y8jC5dQse/8QnY1gsoyxKLC8vV+l+gXI4ROkchmUBNywxLPxTevG6K/3+gKHfx1G6am9A\ - ae8TKEr/S1B8EbZpsxCAOjuLawKWTpwAASEPa+FPZQfJGgwrQ0R435t/E09+5D45ZWxaaPQD\ - uAdEfwbn3gbgbmB9QGBNMwD2vrOLQfQOAGeeu283/ujXXiKFYtwKfMqN38Htt91Wt1WW6I+N\ - ASBQEYTa8UaSdwAMgU4HBRXAsFLQsAAyoJN3MCyGyHOqhjyspwOwFgZLf3cgpp+OZQJhsxDV\ - UScYZkw/AZFbVlYTopcvWhuQTt1D9aZdhE0r1iecsBvnn86esbLAnar/CELuUxN9TE30UDtK\ - 5QlVmVvuO4xPXHZ55Hl5sIxOx996XcYAHVebkl92KZDDocz9wuBwOPSLuM6BHPksLfer9yiB\ - ggoQsUzAZUAZ1gT8Ym2Z50wfOhNgJhWmA2KNhuvEpzGUebsStwRD9oMUmPnUzFpA5GVOO/64\ - 2qbj2o5LQSCcI9oD4FdBeDEcngzgulR5q09rtg+gvO6TqKz4F0H0LwDO9FcChDZUrARy6skn\ - VaX9GsDi4iLyPEe300HWydHpdP1Gk7zjtwPnHWRU3X/u1PsAwj3pTqcLEMXNQmH/QE56s1C1\ - uSQaU9gPQGyfQHUtLA7luVB22CUQzIgbXty2zIyMRxCRhjsnrofyOv0MILJj23Q8Yzq/qhdB\ - IF4LXsQiZjWuHZNjkRcCYbC05Kc+eY5Op1d9dvzW38xv/80o8zrIs+p8Vm3d9vsz8jxH3vHn\ - c7ZZKM86lU5yhA1CGchvI8hqw7H2CURJM53Um7cI3PAckOgjZAMajDUQ80/A6yrc1dm9ew/2\ - 7pyqZSsyAOMc14HDLhD9AbA+LwxdEwAor/1kGOdzALwdgF+6dbUj+A/1yS4dOO0UAPVC1pHZ\ - I36jSTdHJ8+RBefvdioQyJF3Ov5atUswbEzxBud3oQHwRpd34l2CuBON6s1CedyQQskONTE3\ - D8anlrlz7sw6kmT1tbgzEHUaG92MzU15+WCQvDwA7Ds5RH++YKczEZLf1V0NUT+CAbB1vIv9\ - Bw5EnTjnsLC4iE4l8263h7xTg4B37g5yqnYDRnDI2AauCqAZCFAEgdr5iQiUZ8gor9Zo6s1W\ - NQj4z4zrhukkI66faj2nOg4PGFnbtmPG5aTsY7pfBahQhohw3jmPNKK9ZfsaBCjUuRhEPwis\ - PQis5U7AcTi8yx9WEZ8PWqSaSM6ffuIJVTX/75477vTOTj4L6Ha7yDvByTPkebfKBDxAdDod\ - UMcbVV5FHco8aAB+RdlHqsoIw47BLICAjzpAZVyZNLqjAYEspvDGklGmVpyroTv2T4gltFL5\ - cEhbOUDsP+l43gWYQSly0umJAUMwRm3ARHj4w06vMxUiHHzwQXQ7nej0XZUJ5HmOvNvxOshq\ - R8+yvM4E4rburN7KnXMQQAUUUNuGKbKnQUCwLUCgBmTHPl0AASUrndrzz6A7sZZTXXvs2Q+v\ - ZSsYCnKvPvnUhMvd058CWPO3Bq8dABC9CESVRfLIwy0e6nxNF519ujh17z13Ybg8RLfXRZbl\ - yLPMg0C346cDHZ96xqfPsgyd3E8XYrpZXQ/bhnkmQETy2YGs3nIMIKafR50JVN/zMN8UqadH\ - +yyXKSxiSWZkok5dRpDz/X7PgZPrE4mcZXnGeGqopDIDzwwefeZ+wcudd96OrALjCAIhE+h2\ - 4pOaIRvLqq2+ndxH8gASGWUMoHMf6SsQ6GSdWh8KBJDVdyEyIXeSMmVbuYPB8zQ+WmCYXjiY\ - OuDTMsucQzb31PPPrGWpM98AtkHGsREmfw8QOwG8EGtMqw4AbNX/+fGkMiSZY3FrrFPOfbum\ - cc4558R0k0C49Zab0YnG1fVpfTUd6FTTgE6nMsZOx0edLAN1sgocsrhOIDKBvIM8z0TqX2cC\ - FCNHvVcdsW7Ytw7Ui3OUy9tjPBPg5OegWR1p9BSdqI72MByflfuexz4Gu6bDj80ww0rSe0jj\ - i5HeKWOtyrmKUwIuOueMyIeDw3133YX5uVmfdYWsLK4JsCygmuvnWYZOJ6/e2yCnA3kesrRq\ - HYe87BGmbkQg4iCQe13mQR/VsxxBbuwTqECgGrdfo9H68MdZlrMZlJyG8TaT9ZpKRk964hOw\ - d9c0wDKD6PRivSUcumYdAU/Vul5tWqsMIAPcRf7QpcbGBy1QD+Bo+LSLHlcdeiV889prAPgd\ - ZgEE8rCwVK0J+KgeMoFOzAQoLP7FpwL9wqA3QL/glFVGIhYGw3SA8ooXDgJ8YVClijoT4GXU\ - PDzLcnErtBYHW5jin9Fgamd86uMeXcuYU5A310Hsg+lDRyUduRxw4PhteNSjHiX4ufGGG9Dr\ - df36S8gG8hzdTrfKCLpxYbDT7SAjBgLVNCCZDrCpgnyAKCwMViAQsqs4PfN3a4QeNAhUY671\ - US+vhjEFUBbrL0zWQrwMuAmE51x8EcScTqo66i3Rk/CHWGmvvZi7erQ2AEDYCwd/A9rF/9h1\ - lQGIrKBGw2dfdB76/bF4emF+Htdde10V5XN0ux10uz10wnSgWhPodPIYgTpdnynkeY4sXK9A\ - IEQeMR3IMkDNNeu7AyyyZmyVOVMppwaBSol15OHzS29kYToQrxElxhU+9S7KyckJ/OCF56R6\ - SFaa03m9iFS6DvEyntdnXfwkwc83r7kah2dmJAhUC4Odbi9mBxYIEFG8lVhnA3Vkb1wYDJlA\ - Xj/e7fXhnXokCITsrLpFKPPROqrHKQUXDdNd3H/AMr+zzzkb3//oM6AaTW3cmmLZ067jEiZW\ - mVYfAHxknBbzSZYqeWKGyAceU05//qTjpvBjz392vdBCwNVf/TfMzBxCnneRd7s+E+j2/JpA\ - tRbQyavPcKuw00GnMqisWivghtfp+Fd759VLLPIqFY2ZAIFlAtU5IBoawNcEXBwWoEAgRh6e\ - BdSfVEWeiIGonZNveIkpaXXtR5/7LOzZtoXJG/KYL/TpNLTKZOzNKlwv3oCf+/hzcOrevWIu\ - fMXnPw8Codv1GVan68Ggm3fQqbIynQnkVTYGqm/NikygAuzwXYBApqcDfmoX03zoW4Qyu+IL\ - g3myNlPrxGcMKSBbIAwH/OILn4NeJ4ew+WS6a0yzLFD2Nn8Ia0yrDwB+bKU+EWFRrwEEEoAR\ - qji89JInYPuOHSJt/uTH/wULC/PoVKl+HfE9CGR5WP3P492BvJou5NX7BMLCYFwTCO8QyAgU\ - MgEKawJZsk/AA0O4JVW9X0DsE6iNRKwJxMgjM4Hg1AFI9D6BcMwXnQBg565deOklT0rXUsQq\ - P9L5fTw0sgDGq9bLxFgXL3/h8xmmE+695y584XOfBZCh2/V7MuppWgedvBtT/QACeSdHJ+gj\ - y2MWFdcMqkwgrB0cDQh4UK6nWhGgrbsDQScU3g9RTwLqkdULtQF4+ZoAv1Pz7B++BE85J/za\ - nQZZ7uTs2JJ5OO9B5KbGMqtE+etf//pVbdDddzPggeVVIuoIQ7JAQE8D/PHkWA/bjz8Rl33m\ - i7HkcLCMW276Dnbv3oMtW6eqdlFPNyqBe4fxbYVn+oNyHOrUsH7qi73oozp2jkfrcOyd1j9A\ - xMck003+PbyCLFB4k03t3Kz9wDYTRWw3fK/+venVv4BHnX6CjPZ15yIaLS0XuPzq7+DP/umz\ - +POPfhof+uQV+OqNdwJ5D6funJZpr7gNKPV15sm78e37ZnHDjd+Jpw8++ABmZmZw/PEnotfr\ - eglVfNcj5E/JIUY7yohjGgPAqk5GlTwqOVfj52VAtZaS6RhbX7Guhes1KNe6cGCLuEz2nE4/\ - cABvvfRFmOh3pey1jSvbSLKDdFrwdjj8G+0+DWtFawMARAsgeiWc69VGyIyIKR8Ix2BGDIGa\ - Z52yB4fQxVVXXxcVP1we4sZvX4+Zw4cA+DcC9cb6cYHFL+RAKM2JqEhwBJAj1n0wTv8QkLCv\ - GPIcwjqyB4HKuKg2YqlnZnxsEQqx6dCJBBki8nvVlcHxh1Fe/MIfw0uefoGUrTl3B664/nb8\ - 8u+/H3/+wQ/j2uu+idtuvw133nEXrv3GN/EPl/0rvnj9HTj7jP3YOaV+tl7rpjr83rPPwGev\ - vgH33/9APH/40CF8+1vfBCjD2NgYxsb6UTZxxPqBpiDnIAXLSQIAOtnGKBCQ/Mp3KFjrNR4E\ - MpQIuy+jJqrriLoIYEBE2LHjOLzndZfi1J1TKsgZlGwO4sNMnP8BOPcSAIO1BIBVfxjI71xy\ - APARgH4oifZJZEEKCIAUlHMYFA6v/7O/x4c+/BGBxvyz1+9h2/bjsHV6GuPj4+j1evUtw6za\ - T14MMRz6h4WGReFfLjosUJbVgynVQ0TD4TKA+kWjZVmKF1jWDxCV7GeoyupR4koW7FHiMHQA\ - yWvI+QMrDg6uKOvshK0JeLH48y943rPwup/6YXQ72QjD8hU/cPlX8aa3vhvD4RAn7z0Vz3v6\ - xTj3YadiWJS48vqb8Dcf+Sc8eP8DmJqexn//9f8XTz77NMmwpRMAN983g59/wzvwneo3Afh0\ - hkAYGx/H8SedjKnpaUxObEFvrIdOp4OyLFEMh/HhoOFwWL3gtfC//VCW/qGh0qGoZF+WRaWD\ - EkX1wBecA8rqoaPSwTn/xCDXU/ldPEAU9BAfEoqZYfqoNQAcv+d4vPN1l+K8fXukDuKUSgU5\ - Pg1WAJ3o0LkfA/BBYG0fClqTpwH9cwB0MYCPC2FoEg6fHCRCGSwXeM9HP4s//OO/EK/cStBZ\ - UYj+nTxHt99Hr9/3i0z8xaG53KwDIP6WXHgizbPk/Cunyb/SOrz1pn7m37G3CfknEPn8u+SO\ - brwngEeYOrDVBphnGV7xsz+Fl//gE+s5rk4fmXF98NNX4jd/7w/g4PCfX/A8vOoF318/IViV\ - uf/wAn7jfX+DT1z+SfT7Y/jTt/wGHnvgpFQHqZHi3pl5/Nq7/ic+89nPCfnr47qKw/jEOMbG\ - J9Eb6yHPqlu3mc+Csqx+4WdZDr3oUDlo6eJj2mVRouBPEQY9OH89PFHof/uxemS4enKzrObz\ - 4I7OZO1Vkj6izsdx4YUX4I0v+39wynFhCsptR0UndhdFgIKuV+vxtQB+B1j7JwLXCAA+FVDw\ - D+Hw8kYAAGyEbKJKUVfdfA/e+cGP4tP/+tnqNMshoYAgOFCY5yllW4/W8hRP78PXkVl8hzJ2\ - BkY8Muq2rLLhHD/+3sc9Dq/6yefg0eGJv5iau/qYyXNpMMRP/NY7ceXXrsLLf+Yn8cvPfQqL\ - TtWgq++LgwK/9t6/xT/+07/gBc97Ft74kmdBGq/WQ113eejwV5/6N7z3Ax/CvffekwKammNz\ - 0mMVL4IJulVtRbA3ZKjPj6zP5CvKajNk/nzK3lPx4hc8Cy944qPQ62YiOxNR33Ls0FjUm76G\ - e+DcywF8GFifx4HX7H0A1Y5AAtFvAHgNgDEzUvEUV6RFGj2h6gFX33IPPv6Va3H1N2/E1668\ - EvNz876YMjTLCHW012/bCe0kBtpwrjphAkmCaXG8aaTUkefkU0/BEy94LJ75+PNxwRknHR1Q\ - sk7mB0P805e+iedddLbMxAwjnVtcxv/+0rV4/kXn+s06iXU7o35t0EcWBvjHL12LT33lanz2\ - c1/A4uLCigAQxq3l3ShfAHqdQL+ww3xz0ghwH7XA55zD2Wc/Euec9XA84dGPwBMfcRrG+9Wb\ - pI8mlWfyTW0/nMcigDfA4d2Av/X3f/0LQdiWYMA/E/BjAC4A8MjqbzRZKFq3x8oAAGFxMMTN\ - 9x7CrfcfxE133Ie7HziIu++7H3fdcx9uufkWzM3O+iojopC+LhyyAUCSlHeFzMLMTuBfsX36\ - 6afj1FNPxr6TjseZe0/Cmacej4cdvx1ZTpEjQ1BInHJUxNF1G6/pog1GLqZ4dag8srCM6269\ - B9fcdAe+feuduOX2O3DDt2/EoUOHRAQX0dly2BXkzkHBcmQt63rksr3jTzgBJ59yEk7cvQt7\ - du7A3uN34fQTd2H/CTuwPfz+4qhFPCEXPgWoP2yQcADoC3Du8aGZ9fypsLV/IxB/nNH39WwQ\ - /Z0oJFKvJpRsOOZkGX+l4NmFJdx/ZAGH5hZxaG4Bh2cXMLe4iPmFJSws+TfgzC0sYmFxCXML\ - C1heHmK2Ag2AsLC4iKXBMgh+vn9opt6jsWXLFnSrzUREhK1bJj0LWYatk5PYMjGOyYlxTI6P\ - YWJ8DJNjfUyO97F9agv2bNuKHVvGsXtqAmO9jhyHdWzJi5+rhSFlo9vQ5035BRka7WkjF9ka\ - z1BktnLvoTnce3gW983M496DM5idX8Tc4hLm5hcxu7iIudl5zM7NYbbK5gbLy1hYXPItKblv\ - m94WXzIyPj6GXtffhuv2ehjr97FlfBzjk2PYOj6OifE+Jvo9r4uxHqa2TGD7lnHsnJrEcVvG\ - a9kHngUwsmyUk5aTM66tBBqevg3gjPV+HyCwDgDAqfpdwJ8E8OcAjIilUls9X7XqHE3KNQIY\ - mvs0+ousNDglp4ZFOek4IwCuaepjOrI11WgyOsOhxdiMa1Y2MVL+zBmajF+tI0gAUXwlU0LG\ - oxkcrMzG4Oko1jdEP5xEGdjjFTpnY0zlcghw2wFgvX8ncH1/GYhUn0EI2smBWlBOfY91rCjF\ - ylrGqdtMjg2D0P3xdnlZgnGOUvBw1X+Oj4ldJEjD4m3zfoVBhn4JokFttC44QXCShojmwjXl\ - XFaEqwel+NFldLusnSATAdC6PrcVJeMwlsgr0rZifSOSw6VtCHlCnhcAGMZL6XhrZurx8/o1\ - H9sAdI3Ka04b8NNg3BlGRCNSCm8KaFEJkEIdlXoFJ4OT9eJ5ku1og0wVmAKVaJeUYbHP4Fix\ - Xzbm6KQjoqjlfMZh7DPKRPGkQZjLNY4fTEb8U41X8AckDhfY1iAWLvL2eASNIOTStonX4Uwp\ - J06yHSgRWvbJ6ocyZiBSdTiIRFBS12sf2JAfCt2oHwdNU7dASSocLzQYPKvDo4pIW1VEDcbv\ - dFnVd2xbKU47NQePpgwi8ML74VkD5z06P6TR6ClAKBvlxyKZHo8lN+2A1lRDRH4mM3Yq8ihk\ - otrhsrAyJd6gnmJw+fMMIMqd8a91KQdcy5oDPbcFywairJysJ+RujQVSpryo0LcDgF3NUW7t\ - aAMAwEBOK1InCOtgGzwjbXRBWaFevOZYe+H4KPkOhzrT4IFaTD94tBrRZpK2K2fiqXMwPp5h\ - hDoiauvrDd0n7YABEwcoHXW5g3DekbYljkfx5WS5mG0xpgVQaT6clLOZpSHtW+C0kzrWfYXr\ - wqkVyNpzfQVq4Md70qnJ2tPGTwHMNJE5qXAep5SjkbgiK82WBdR55jh6jm2mtZT2IbIVXVbx\ - ZY1dz7m1QWneefZgjV1EaxVFo2zTZm0jZAYrpgtI5SZOQmUBAbSQyiJ8Ol7fCBa8L2saEOTS\ - 5IBOyVg7JK8TQc+wLw54ISsRQK1sjOvbmkqsw7P/Fm1cBhC/cgdSDqkRN5Y3DD/JBniENvoL\ - jhkMbsV0lUcdA+nD0Hik5kCliTuMmc6jrkeMV53eWyTAiQMlb5cZqAavxGiZzMSnIQcOzKJ9\ - BpzcOXS50L6YtjTInmcocZxKBlouMaNg8kiyG36ByYpnBTwDEHpiPOixCZYS8NqRMrz2tM4A\ - oFCfCx5ojtikFKHntAGBtYE09cvncjpq6fqxPLumAYFnKtEAFL9WpmP1ZUWkOAxm8FbmY7Ub\ - +GbsJO3FcUAaqpVhCDkx5zMzIkO3Sf+QOuB9K/+X7eiLpApq0g7HHZKknHTQt6ZlSRZp8Qgp\ - Q5HdJO1t34AlgA1aBBRRzHBOgexGvWgcwfCYQ5gG6SAdRjuRihzW3C+2hbqNZG5v9KlTXdWE\ - bUDqewIeTsnHsT+osRkNW8DDQTWCnZZbwxhjJaTlV5r2CLmzvrnsCIYtBB5VtrDStE9cZzrU\ - wKerJnJwaVktC2Lnue5FNhZphwn6a0wbAwCm0CCdDQ3CFnMs5fjR8Ks6Ol3mhuRUm1Y0tOaR\ - ei7nGpTN02Qxp2SRyqm2dcqu5SIiiSaS9TiIxgyK9xMHxIzfKGNF7iZQ4P3y9jWwx3J8TEyO\ - DUmHHC7vEzJqC6BllUfPwREzN6fOc/AQ01TDRq0pk5Bvg41hU0wBmJC441kInggYhmIg64jr\ - 4bw2VCe/8rbDZ6OhOHlOtKGcL64rID0WUU+PkbOqQcCKcgwwzOkLb8cZ5xVo8jGFKEuBbw62\ - jNemKQsfT5Lp6Y4gZSl0yhrjmYk1B4cqn+glZScBcWsQWv96KhdE0BTcmsCpLn9c45RuDWld\ - fh5ckhsK5wdSoSVRR19H7SAj1w0gFRMVLbzMBhCrf8fqcscWvDDj1O2Jc8FoVH88CxDvBVOk\ - x55kFwYP3E8F+PJ+2XjjdRKnTVkLJzLGJMBMD4aNOYRyp6+jlleiJ2MsYroEo3+ll1A2maaJ\ - LzD1xjPPaAuhi6BLJQPnZFmH7Voq60EbAAA0K5SijZift+bj4PWUsetyTcfcOIQjN/SnvzdG\ - CqOedgwetURkY2XEMauvsw8dBTnACXBlRgjVjgl4QGK4TbKw1jpEGZaZmFEdSp8atHT7rK4F\ - Xsl0i41HABp3WMUzz3pAil9KeTf7U/Jwqn+mtqr9HfbUbm1pY+4CVCCfRiBu/LwaSYPQxi0c\ - w9VGw9NF3V7gp9HJlfEKxpFe48rV5+PYGupG0ZAyFM4TBy+SMtGgCcV77Fb16dhF4RhKCZaM\ - dNuyUaYDSF55e9y5+TRER2DlxyZoO9VuMr3QQDaCp8ib0a+eVgVgbnJea/qRTM0AgHasGFjW\ - gDZmDQBIjZyf58aeTA/Ysa/AK0M4B7HvGgx0NE1YVUYVizaBR5PjWqQALbRr1Y0GbkRRC0h4\ - H8ZhWp6DqMoUdHluuJw/7XgcjARYuLSNBMQtZ+J9BRmMACUNGLy/BISNdoT9qCIadBWLcixA\ - YgPN17bDrc9PgnPaiJ2A8+KrmHtCGTs7F8sqgzIXtpAaekDpBHgaDD6ZEuhPxquIXiMcqDFN\ - hgQ3q15jm7wxJ+XHTseyVvofIxu7ZgIOjLaVQ+t0nY9LOJUGbhhjNPQb9J/IVYOI4t/Su8W/\ - 6EvJmdtqFBfPXkLBJj2MAGzn+iBa9ycC1xcAfKQbxO9aYSIqsPOxvioTFBDbcraB6bmijkpJ\ - 2+p74IUDkI5yoYwYrHJqfY3LIYxFR50mo4lpJwc2Ne5EFsGAVeQjVU+3w8vx9nSGFvli0VWn\ - x5ZzWVlGwjNnTvHQZCOiTd2uq8edZJkKGIOc+Tmwc5w4kOos0wRyYfNTaYNrS+ufATh3REb9\ - RAhA4hwssojUS0UDx+rqCKGVlkQr1PUcq7fyeGr+Y/1gBOFPRTJhUIx3AUp8zMoJtCOi4Tvn\ - L3ZCzLANQ44yUaCjwUTLTqTgfGwGeImIaRCfjiRAQQ3jZvxZU7OEL64bY3zcJvU4rSDRlKHp\ - c3r6JO1gqyWOtaT1BwCiIk3FtOMbThkjS9JerYzoa0YEiF+dbahNcz7BF+/TUCK/ljiYYaA6\ - bbYiUeKkKnrz8hGMQjkNcGp8ScoL1qcFfisAYqzr2JCJsa4iYWNmw51fyU7UYWPVmRwrIj6b\ - ZJJkhLybEWjFx8zPxXpOlrMyl/r8tuaO1obW+Y1ABACHEkNvikThMzq4ZYANUSFeC/2SKC76\ - 4FmFnjNyZxg1D9bXtJGvZEQmaRComNVt6UgVMgyrywCiSbbVYMDWWKvma8fT5XT2o/jUWVOU\ - v3IWi389VdHptgkuKoCMBB42hKZrukCY5vBAE/XRoAe73f/oGYADAPWLHpAOmKRkYE7LI6WF\ - 1FCRVBmyRuAmQ3O6L3UxMRbVJqcYjdVnY8Ri/TZFoSRyO/ansxPIdkjX52UagMzqOzi4TmM1\ - byo41m2QLCPGayhEp/V8qtKIrY61G+SqxmSBaRyfdb7hnCVrfc0qLwFrE6wBwB3xH0A0IBGR\ - dBbABKudPRTXDsT/ABYhWUVzHslZLTbZ1wAAIABJREFUsBTO+zWMSGcWYpy8AIvYAmSc5FHz\ - Z41Lp8lWNhLaFqk145UUXxz8rDUBKzOI8oXs3wLRpmxIO5EA+iZHVcdi6sMdT9mXzvRW6q8J\ - sDVPTdlcohfVnq+37hnAuu4E/OgXv45LLjhvkFzQU4JwLjHA2sjvfOAwHIC5hSUMBkMMiwJz\ - C/710QePzKMsSywOljEoSsA5zC0uYTj0ycfC0gDLRQEiwsLiAMvDoT8eLGNY+N+cW1wu/Hn4\ - 980vLA1QsN/0IyIMlodYLoqKRc93UTgsLC/LxEUbmat+0pJFSwegk2UY63Wq9vwv6Pa6Obq5\ - /4nsibE+8izHlrEeJsfHMDnew7Ytk9izfQp7T9yJ/SftxrbJvhIuc/AoZpVdaR7jNYcb73oQ\ - cCX2n7QLA+Q4PLuAe+8/iAdnZrGwOMDiYIAjcwsoiTA3v+jlB2C5KLCwNIiy0m+fFu/or65R\ - BZKH5xYA57BlYhzsB51ZXWCs20Mn9z/hTlUb/rcBgG6eY3K8L8Y0OdZHHn+CPMP0lvpHUHud\ - HOP9Xmx7y/g4ut0s6mjXtq3oZpBZoxCxq2Urghm7rvWhp0G+4tQNt9+LM87CutE6A8DVePkf\ - /OXU95/3yHK838kWlpZRlGV0rqXBMpaLAoPC/0jk0vIQQ1f6z6LAclFiqSig4CA55tRURsU0\ - s01dPy3Hv4XfqZW/gGP1b7WXtpaOIeVWnSXC3l078ftv+K94xCMeBqIMoAwgIMtylABuvflW\ - vOvd78UXvvwVLA0GGBZDPO+HfgivfNWl2Do97dt2JTq5N423ve9X8C+f+Qymt07h4Owslqrf\ - 4LPGYo35aMdY10tlqftq0qMde2UbTXaj27P7JGQEjHU7sb9up4NunsXy470essqp+70ucspA\ - 5DDR98BMRNgyPhZ9f2KsDyJgfnGA88/Yt33ZFTjj+19gjmQtaN1+F+Dk8x7nOwTe6YBXNBl5\ - 07kmx+TXmwxupTJWnSYHHNXuKB6ajLWpvtU3p7qd2mHKssT8/BwedvLJ+PKnP27Wmz1yBI+5\ - 8CIcmZP7sX7rNa/BS3/2JeLc/Pw8Tj//QiwMBhjr99Ht9Rg/db/yzMpANqpOE9Xl6pJ2O7Kl\ - USDBHVuDRN2uHGcTGEkuZBnJX8oXa+MTp+za8Z9uve9B3H7Vl7AetC5rAKdUzg/gBwF6hTFw\ - QQT+S71URYK6TmpYTS3xMvX/1jXeNj8vfzZMkjM+CdIEuWHWBpoaJKn6mlPH/iTflTOUJeYX\ - FuCcw/W33YY/fv+fm2P9q7/66/irO5z7N7z5zfjsZz8nyr7+v/0uFgY+jV8aLFU/fS7dRPNf\ - 80bs/3r8ANg5Lbu6LKlyml+trzRIpK7ZDKa284drKoFP9OBGHsmxW/VYexffet+DLwbqgLnW\ - tOYZwCnnPS4o51QAVzr4xx5HI2KK4jDOc2qO3s0RoSlVXTnqjurDjhjc+bURW5Et5YH/Pp7i\ - qywxt7Dgf6Kc/PWpiUl86yufR7fn57YB6Z/7vB/Bl772VbPn7VNb8a+f/wKyLEOWE84+/wIc\ - np+PU9Y8yzAxMZkwoMfI+WyKnLyupQuwtlbKJGy9rZSPHFVEXsEeR2VuTb+GbPUvdL8A4LEA\ - riUAt61xJrAuGQABHQf8NUDbORLzKA9wgaSpZXCrFDXT+CAjgxOoLeNrXVdHI4nYZKiymfOm\ - bMLFf5bBpaDA+236Zd3Sudr5Q10HzMzN4hde/ev4xr0z+Ma9M7jmnoO45t4ZDMoQxVPTnltc\ - wp2zS7htZg6//eY/wOH5ed+zA4hQrdcsCunpjMbOA5rkxkvLHE3LpO5PyqUZtENdx46kbpuj\ - vkVS06kF6cxGttIUVDiPVdvjBPwNARNrG5o9rSkAhOgP4PUALtAKrZUiUzCNqvwcIJVgOZwV\ - LWoF+NZS57SjbuiDg5ZtMDUchfZ02mcZzijDCHxaUclVB/PM+QGwO6eEv//Yx3Dw/vtZxRLP\ - +bEfN3j3dMaBA54nyvChD/8vwWFotxguI6xqB91JffC2tb7TGF3LJM1+LL2GUpauoMppvrjM\ - 04id9pf2TMm1pgwnLZnahXW9qn+WA/4HIKbPa0JrBgAn16n/ExzwGq0wyykAbSJpusXLBEFb\ - KaGuz6MdNyQLcOo2nLimwSAle62C1HXbEHg8tY3U6A5Zlqm7TnWt5eUh/vub3gjnyuqOAOGC\ - Jz8N5z/6fLOHC7/vKXAALv/oR/FA/BVeVsYBE+MTcCSjNe9Z61OO35myVkNKdGIBOj/muvLf\ - NX+kdCFrNjkon35IYJMRXoN94Gel7IfXT8vQzxHwww5rux6w1lOAKQAfoKqfZoMmYSj804qa\ - OsroDMGiOlKlaWnTcRMwpGlgbYI6EkqenFm/jqQuMaTAs24v9DkxNoY843dzKX4QAZ/70pdw\ - 2823iGu/+GuvxeTEBDhNTkzg6c95HgjAn/7Zn8ioXTU51u8jz3MhHz3GlE+b9OKqBOb6vOVE\ - dgYmueA6sO9VIJF3WqL+zuO9tsn6uwwyKb+kvqcZDy/lgPcD2IU1pDUBAJa2/C6AveGLTotq\ - pctUkX8GkVtRgKAVUFNT1NDmkFLKY5MRawPTdyM4/2kdu2crUtmLf/U4JsbHhWOGjp0DClfi\ - 7W/5PZ8FAHCuxAmn7sVPvOSlosXHX/QEbJmaxrVf+xpuvfOuhMFut4tetaC4kqytrI1H5/Sc\ - /cfbtzIqLnW9WJhGZNuJ9Via+NdjlYBVcySdmCBDTnq3wQbKCCc7CXgXAJxy3vdiLWjVAYCl\ - /k8B8DKAC1EeaUcO37TgrbTbdmIyjmwD0mlbfT5dH4CqYwGCBjI5phR0gootA6v7cgmocF5C\ - eZDPBCjLZCE4OOfwpSuvxA3f+EZ9iTJsndoqWh4M/C7K9737XSjK8LiG76WT5Rjvj7EzdmYG\ - 43t6GzXIlztsCgpNIJ3aQVpS60iWSOWZBpzm0jqDC6v9TpznwM3zu9H2w8dU18LzCfRcB7cm\ - U4G1mgL0APwRYKc4QBoJrGgqhRzqNTvxaFWnbq3vN/NSowxQG4rdhp03aGCwDNUx3kIZW4bs\ - XJZhcnwcGT9Z7YEvHfDOt77V16EMzpX46he/KOD4G9dei7tuvw1XfeMbdctEyIgwPjYG0MrG\ - yx26Pu/MsvU4wxhrqY2O+FL+lsx1AJH1naE/21KsIMHb1+MjyD74OMN1vYisxwFRNsrnnVij\ - 5wRWFQBOqXf7XQpgvzZcOUinlKcFz80zzRxSQLASOm5IUuzcREME4ildentLLtDpsaVKtaca\ - aZThW2Z4Obv+yGibZRgbG697iQ04fO3aa/Cd678F5/wdg29+41rw8d97/31419veimG11Te0\ - PTY+DmSZEZmbb41yGLAcMZSQ311STgO9veGLuUlDALDAQktbf7Ns1xqPFZj0dT1Oiw9eTgcQ\ - B5xAwGuB1V8QXFUAqAaxxwG/rq9ZwtLXw+coQ0lTwPDpzYQLzzI+O4JpFLfcr8b7NPMYHaE1\ - WYbPFxADINiZhFwwleko0Ol0KxDwIwkP2JQO+JP3vAdEGQ7dfz/uvPNOaMl+4Sv/5o+q0/3+\ - GDp5bhp1U+oNSPlwJzgaMLCie92Odcs35WZUPykA1+W4jVhjgCqj6zX3T6YcAkwGcNMwpOzs\ - UgCnG6z/u2jVACAsUjjg1QC26kHW//ujJsOoS6ROxo+borEvUxsKxHltBJKv+lO6n+XsTW3z\ - SGGhujQuSs7rMehem25N1RHZodvtot/r+XOs0GeuuAL333M3rvzyFxVUAuj1sTRY8j07v+jX\ - 7XZZ6zLb0mDVlMo26diJ6zof02OyIqkdPTm/+loTIMsem66kZAUxK3tINcUBXmej0jYY730C\ - fhVY3SxgFTMABwKNA/iZ1Ah0vHBKMbUIVkLnugWrlG0M+jxPrnQ0d8nZtL6MDmlvKWCRMAQe\ - vRykfJodKZViLZd0y2y/30enK18yW5QF/uL9f4ybvvUt1qqnZcqrx3IJWZ5jrFr04+OtZZC6\ - swSINJpa37XJ83FLeUndNoHKSs+ENGVrK90OdOpY61dq1c5ArDHrgGQFMWWbP4FVfmnIqgFA\ - pbAnApjSZqLxNXWm+sxoFeoNHSkPVsS2DJBzJFPN5pkmL8/VbQGUjI6pqWsnSdsdvcHJchRd\ - brxK4QHEqcDHL7schw4dBI+9WbeHYtnP/XMijI+Px0ZGyVq67ahNTnUprRM9Rn4tcGg9W8Dr\ - Wzq1+g/XeH96fDoo8fZ0BhKuBau2goTWidWXxWFD+XECnmRWe4i02msA1as7pGmkyU39rVZg\ - E1xwQcr6pK7pCGRFC214dV88LvszNTLr+Vlt8PpsyrcECIsXQBpsDYpW23a2lBoTeYsZG0OW\ - ZXEqcGR+DrffcXes4QAs510UziEjQn98HDmlOrCOrZjX5HhclrJ1i3PesoPmRteodSyBEJDy\ - 1nzw69btyqMBFa3LJkCpy+oFZ6lToJ6cWToHaHZ0kPzuaLVvA17mgBu1sVtqtlIufoanRStF\ - Ck7aRI7mcV5/rG/JcbDRGzhkS2k0lEc61bPqNkX7NKrq6ZMsp/lHlmFifJy9rYr8Rp9Qv9PD\ - YFgABPRYxgCkhtyssxToOIVMSPDFWkqzARkO6rHZm310X7xeU8ag++Yat2Sbjqcpm0hBKrWW\ - VFcyk6nhjAcRAFcD7tPGsB8yrdobgS593sVYGgyHd9x96F8+8uUrX+bP1gPRqTB/1LMumTpA\ - +MbVowWWfmrXXgmd04c3zYiq2rXSNJ398Fq2c0gZydUCDmhpVsWXDq0MI57LMoyPT2BhYR4g\ - 4N5DB9GvIn7Z7aNcXESHLfo1ZSaWJJoymiZgStt0kBO71Ml1WxpYYZQf1a/Fv8w55FhTnv0V\ - vUNTQkpq22mwst9WFDaAaZt8xTOffEW3nzvKdEsPnVbtfQDltZ8EgJ0guvl5r33H5Jdvuk12\ - hCZnlWRFQF1flx1VXvevy+pn+dM4YDmkbZijeEr5r/u1xjjK8TQojAIu3vZwOMT8wgKIgJ4r\ - 0M0yzFMHGYCJsYmYDzbp6WgyFXs8o17tZXPcJAfL9JvsaZQtWfXttlIudEBrArvVsN1w/NRH\ - Phx/9l9fsgy4AwBuzc56ClaDVncKQPRzACZ/72U/iu3j1TvQwJ2pJq1YPmB9W0krRF8L9XWE\ - 4Mda7XXEkEt0dR3eoh11mvm3+pH100zB3lhjRZHgIqMzllQenU4H/X7fPyOQdVCQf+Pm2Pg4\ - XJZGVB2J9Tj5eKzMSsvVkp3eLsv7Dm1ZWYXmB8Z3a4efNSbOmwXCDrLPEDRsQLP5agKz5sBU\ - W97uLZP47Z//EQCuC9DPmYbyEGn1AMBz+0w4hwOn7MavvOASJlgZa7VRpwK3Ixs/KxXSnKpp\ - I+TtNSVSUuEr78jTiq9HO7oe/zZqF9so5w5lnbrGZcqv9Xs9dLpdlM5h2flFQqKmJyQl+DVF\ - tybntgyc9yT1bgcJ2znSZzq10wS7S+3CGk19JrU5a5qaLllb4DQKICzbt2w3J+C3XvQcnLhz\ - ypd07vsTxv8dtHoA4ADAne2PHV749Avw/Mc/Rqkb6siThY5N52sDSAVnOXVzejX6LT+6HYn+\ - /FyTk9gPAEnjsHYcjB4PknO2IesIykHNPziUIyN/zz/d9myPwMo4LGO3SMb5dA2HZwk2L9xZ\ - XNKO5DG1tZrfes2hSbZ6bKNAmNdMga62jmZ7kp/hOFz/mR94Ei656NyqkgMIq/rS8NWdAjhM\ - 8ff5v+nnn49zTz0pKWZFN20QVnSrBWubnXamJuPUffK62gA5P1YE1Pf4rfTSGi836KZswhpH\ - k5M2R+IULhyAyfEJUB7WgO1bXqncKOE13QVoP+SlY7YeU5M8ZF+hJVk3kI7yTUGiCdhW0h3Y\ - 9zTi6yc3U860bize+LUnnrkfv/LCZ7CTBIAmVkTb74JWew2gejeVAwgY62Z476+8CKdsnzYF\ - OGrnVlMEkDukHEgZBC9voW4d/esS+taNNgDp2PbrxDQ1Ob4uMyqCcqfgfI0aWxrx9f75SmIE\ - c5+/dn4ZlVPH0fKwpGHlF9Y6j3TbZsDVctDyqHmy468FlE0Ab13T4wjlbfms3IfV9sNP2IN3\ - vPKn0E1X/AvT4B4irfY+gHt0zDxx5zTe/V9ehG1jfSPK6pFIV1wJNFJAGIXQ/JwTnyEddEb7\ - vJ51XkeNehSpWpsiq44VEhj0a8bsdNLKcqzMhbtQeLWXrp9GZXs5zXaYZA97vO5ECSfqcVC3\ - 1oA4n00OrUGXb7WWTk+iniZCs25r/qWVjgIPOb6Vn5s4fnor/uhXXowdW/qqYQc4d6fB8kOm\ - VZ4CuCsswz/ntBPx3ld6ELCiGVe+/z8Vaq1AnejVRtGssO/mvEuuNRlJ3bekeoYqeec9cCOS\ - 49TRz4nzTkmnaWxaSk1Rk39aEctq3SlN8FzKlqZsT09b9LFF6W45+WBVmjNYoFhzoGXOx98U\ - TPioNJjwPq0gxmtajh+df2or/uK1P4u9J2yH/E3D2MHnsIq02lOA94rv7IcPLzxnP9596Ysw\ - Pe4fMtHRSUc9oBawlSpqhLYEC3ZdG5o2Hvk5+kcsbIdmYjiK/qUR8bJp9NOmpJ8dHDUm6zkE\ - zZcVPS3jtyKmNNHmh5qsB3qaQMsChXStRU5tmvvl11Mb0RvL0gVRCYMpQKSLl9oetS41cIZy\ - J05P4X3/5afx8FP31BWS32vE27GKtIq3AQlw7mNw7p3J+YouOnc/PvDan8Mp26bMiBOoVoj9\ - IM0oJVtldHagnVvX0avLso586IXzxqMSP4Zqx+o/daw0gnBJ6IiVAoYNh5Zzaee0+NbXrWtp\ - +3W7+oGeelohoUbmO2nbzVHZrq35SktrwE0t0gI9fl4CJp8CpU8+WO0AwFkn7MEHX/cKnHfg\ - pNrpk5+bp18F8AVjKA+ZVg0AsrOeHA5/EXAvBPB1/5UNBrj+3P0nvuWVP/KMRxPoXQDmARwB\ - UFgm0ZxkpYrVxmk9UGIZj2Vc/LyO7txgUqPiEVAvvumSKxmnE4bE+xsVKSmpT6IMz6p4tJJ1\ - j44smcm6dktSgymc6mlOc/8SuEINe/rVpAn7CucorZWucwRQkxmcLREruNw9c/i6vSds/yUA\ - l4NohtWYAfAxAE8D8GYQIXvkU8xxPBRa9Z8GK6/7pD9wAIimAOwDUMK5WwAcuf3eg/joFVfj\ - o1/8Oq6stgsT8L8B/GCoVp2rm2Htp4qV5XUdK1rztM9qg9fRZXjZUU6p22jiS49Lt9E0Ps6D\ - 5otfaZIFgTAshvFtwkc73lHnmsYJSOdoIouHpnOaRulsVF3uuNqRm+qtpEdbf3Xr1joWgP//\ - Jy6+4DlvfPFzqgs0XQXNGV/Il2SBdlVozX4bsLzuU/UX1odGr+o9gj/ugA+kSXOzAsDOa6Xx\ - cnrPdjgH2OaonXYlXqDaInU+PZY86PHw2k19H81x3U9z/aIokLNbgd+NJTSPTsq3OYbzXCWt\ - M0oHzaBgA18oMWqdSLZvw+AoPdlA0twvB8Zq3G8B8Orbr/qS950RPrOatGpPA2r67pCKPkxw\ - Mw5uGmiKLPbDF9Kt0ihnPW1lGadlWJYjpQYkjVa2mPJWt9H81BkHkZXS8zBGzYMev9V+RvZO\ - jKORA4zjUc6jxwM4yOcfNEg3jXcUOIQ2rHxDwhV30DRPsSK0fFLTDkhWvsPrWPqM378eaq92\ - lB9F6/LjoKOJALgFAB+QZ/VCkBScLhuuSUdN03zRK2C26pKS6TWXlLONojmqEvvfgovgvCTO\ - 8THy6MJbq51XmmZiuE5znXKn+dPjTrOxNBuq67qkrAbzUfKVY6vbaQLldEzaAXUWtjLvFtiT\ - OuKALK/LWkqOVxksrzltOADcdtUV4fCtAAqNjP44KNp6m0ot8BS3m1fsQyltiLyFFMGtCCjv\ - R3NHszMDzYU8U/eRvj46jUzaXO0xQh1HWRFYq/L5inClHk+6Ml9H/FQnnEiV5XdSoD4tfu1M\ - YzSw223qgCDtpslGmnjV/VtT0JovEnKUeyHoMAHXGcNZc9pwAAjk/JuE/kZHZG6UXMByBVg/\ - HDQq/ko8bjIm3oJsW/evU3nJux0pZD8Ebqgk+pEwpEdVG1NaKo2UuoSVYekx1OVSWerz+tZn\ - qgUX+eVj1ePSQCR5lRZgZQ7aSXUfVt8aZNKobgWYZqDVYMZ3n6bBxH0GLPitJx0TAHDbVV8C\ - ADjgtQQscnNOo30g/hwAV7s8sjfO1uU0wkMd87MWyHBFcmTn4CJbab4WakoHsJ9a5A6vjY33\ - o11ZR7JR2UnIukINi2ferjVNk4Cp92PYP32mx8GP5Y3WpjJ2fQ72TWsjqR1Yb37iOVPa10qg\ - xDPZ6so/ONR+sJ50TAAAo5sB/I5G0KbI6UxzkKWa1w50pE0jFt+ZoOeATake2HWdrYB9t/iR\ - nGuDl05NrI7Vvx257NzIynDquml2kYKHLeNaDmFpzSrnzG9NmZl2WN2X5B2ooYeEPvRGq2ZA\ - 5MCXQrZlm1Z/nC9ez8EVDvh7o5l1oWMGAG6vs4Dfdmq3k5WOj454aTaQpvjNv7nHy3Djd6q8\ - ZTw6LeVOVJt/2p6VTKZgE9a363Z0n8ywkrq6PWssmmQ2kl7T3GtQagKPMBp+tcmZeB8yoxit\ - jyChOvnm/NkbtdIx8XUDCaA60vOx8JWVtC+R1X0YwF3YIDpmAIDREMBzAdy4UkGZoqbO1BTl\ - moyaRyzZ3tE5S7hugZNuT3Kqo6lc7ZfXtDmnjq0Nsk5lJSelS+Vn8cj50UDD6+qsbGVyJq8c\ - yJsyFj4BcOJ8zbHdtudS2gDFduxAkPIXajWV02elvcX+SwLeBNQBcL3pmAIAJoS7HXAxgKst\ - B5corO8A+JJSWU1mzY/Te9Ia7bUj82jMM5OmtNKKhmlan47Jcm4L7NIsR47UngDYmUKAISfq\ - pWPUjqn5tcdXf2qQlXpLd+OlYKq1Jr/pjFHfSAWCvC1HreXQBK41L5SMRZMOIg54swOusq1z\ - feiYAgBAgMDNDrgQcG8DMMfLjBIYN1itLG1w2mAsBeo7DGlviD02pcnaCGXN9Nwog9ORWPcB\ - 9SmjpaqTCWMUsuPr+RYv+lbeSmOqQSgFg9RBeV07G9Lj559N5QDu7HWWt7ID6lGkACdzEnm7\ - 2gBvR8A7UP2I7kYs/gU65gAAECAw5/yvoh5PflrwJwC+DaSGE84FktdGJ6VpjuGPrairgUA6\ - m44sNgiF8tqhiV2x0tom3vQfryejbfPOvxT80t2FenSW7DVfddtNOyZrR9fZBli9lOPR6XgK\ - gikQADYvtsxl27qclHsKGBUddMAfAXiUA34JQDmim3WhNXsWYLWI/xIqE/gOAh43nDvyc3Dl\ - s6nbR97twWWZKNfkrEDtEP7YmfV0lArHipcYLa26si/71pU3fv0TWOlWYcvJ6v44D80mHK47\ - OFDVgObbHqNdLv3kMVHyr3nW7XIeVxpzU/vhW9OmnFF9W7ppGiuHNUtv1bk5AF8E8CkHfIqA\ - KxywHEpuZOQPdMwDgKYACLP33Y2Zu257PYDXhWu9sTGMTUwi7/aQd/vIul3knQ6QdZH/n/bu\ - 3seNIg7j+HfsnO98uuSMlEREShoKoEERFNBR0FMhUdNRISEqav4A0iHEP4AoEJRIUYQiQUSV\ - AqVBRJEShUMoQF7OTozt3R/F7J5n32xfXpRbz/Np7rzel1nvzLOz47W9cQzrFD/5lv8PpYZR\ - mFaet3KQaypU3Xrqz+yLzjZN5axbvrkBFCtqWBZnvi9a3ldXWcfcopALy13ei+Z9LAZGXWgv\ - OxuH21/U6JvK27StplCcl/Xg7eF9/I1s1/F39P1q/tbeG5TO8kel4eee2YeBnpX88sD5L0ro\ - uPx77cyYjMdMxuPGZTvdLr2tPhu9ng+JThe6HTY2t34/tjO4AnbawUmD08Bph+tXB4esUmlz\ - 88pilUYUvi1X7o6GZ5CmwajyvPW9jOJ8Rt6xrjJ848/LWRw2zQKisZzVbTaFR/Huzery5Sa2\ - rAHmpQ1DZXF3nNJ8xX1rOtvPJ6ZYkpDOEiyZks6mpNMJSTIjnU4ZPxze3j515tz2CycbA/15\ - jfCvonUBUDIKezDOORb1aNIkYTwaMh5VnvpycObs5zunzpQatPWAXWAA7LrsL9jAZdMdbhds\ - 12DgYGCw42AL2AE77qAPrl9/9i/3CpoaXf33F1DzOCt3FjZNP60drissgwXPzxtKeVvLLgvC\ - Uq12Rm4eb6jfRv0PfrjSeoJtJMDQ4D7YENwonUxOpNNHr6RpiiVTbJaQpAlpOsNmCbPphP8e\ - PSKZzVhiPP3jJv/eurFsviOp7QFwK3ywyuVMTUiMga/v/Xmbu3vz3zPMLjUmwB3gTrWbfbDV\ - SsOonlkMhzthWN8HAgOgb9iW88GybdDDh8UmPni2ga7B8SwYBtl6jwNd5sv0suXz7fey58ga\ - cM9g24HrOtcFNmZmPSuULnttCv2G4mtZPouHDazutQkeT8E9DOMm+3tvXgISYD/b4n2HM8OG\ - +HtCxs4foyn+mtqA+9k6HhhMHeyb/+ackYMhuBH+8X62zDg8NqO//+Le3s2P8R9AO7RSHdpL\ - 0+c+lvfYWh0Azrlf8gMRXgo0zIuZ1T1/gZo7sZ5mt+3c+bcw7AG+whaULyGaLi3C/8s9gUWx\ - FzZOs+qZttTjwcGuHYwMePXBV7udEdkgV2G7wVZWuRYvh0/dvi56fajZXng8s7pyt35PKMxX\ - V59K0y4vW89R1rpBwFyn08kPxGXg7WXzNxzMH4B3gVlbX4en6dz5NxeGySqO2iBXnSwA3gEu\ - rTp/Q/1IgFeB622tP60NADg4kG/gPzvQO+TiXwEf4bv5K10+yHrI6s0O8A8L6k1Tww+mXwA+\ - gfbWnyN5I9AhXcXfJHTwTarOLey0/oz/htUPUeOP2RD4Bnx9qaszTfUim34R+HTRfG3Q6h4A\ - FBr7i/i7q94DXg5mGTnnrpnoVW89AAABXklEQVTZJeBbfGAA7T5w8mSyenPWOXfVzE6Vpi+r\ - G1/g71Bt/Qmk9QEAtWf8TfxoO/ieQfGt3TXYZ3kyeZ1xzr1mZt8DLy2b38wuAp8BP+XT216X\ - 1iIAQk3d/3XbT3lywUByH/jAOfc+8LqZ/3ZqYA+4BvwIfAf8li+7LvVp7QJA5DCWjBdVrFt7\ - UQCIRGwd3gUQkcekABCJmAJAJGIKAJGIKQBEIqYAEImYAkAkYgoAkYgpAEQipgAQiZgCQCRi\ - CgCRiCkARCKmABCJmAJAJGIKAJGIKQBEIqYAEImYAkAkYgoAkYgpAEQipgAQiZgCQCRiCgCR\ - iCkARCKmABCJmAJAJGIKAJGIKQBEIqYAEImYAkAkYgoAkYgpAEQipgAQiZgCQCRiCgCRiCkA\ - RCKmABCJmAJAJGIKAJGIKQBEIqYAEImYAkAkYgoAkYgpAEQipgAQiZgCQCRiCgCRiP0P8fRM\ - CPaFrsEAAAAASUVORK5CYII=\ - " - local text_png = - "iVBORw0KGgoAAAANSUhEUgAAAIAAAABACAYAAADS1n9/AAAHlElEQVR4nO2be4xdVRXGfzOd\ - aWlLizC0Yh88OykWxQotdAoq1BRESVVSYw1pQgiRgBADxoQYidhExGBJNCgYEtNqUjHW8Eak\ - tcX6AMaqiPahViiVUtsiFKaMLZ3284+1Tu6+Z845d163c4ezv+Rk37PX2nuts/d39ln7cZsk\ - EVFeNA+3AxHDi0iAkiMSoLHRBIwHRtXLQCRAY+MmYD/wlXoZiARobEzw9H31MhAJ0Nh4w9Mp\ - 9TIQCdDY6PL0hHoZiARobOz29MR6GWipV8URmZgLfBiYBLwCPAlsLdB/1dNIgDqiDfgD8G/g\ - I0H+aGABcCrwOvBbYGeq7HQvvx3YV2BjNvAD4LwM2UrgeqA7Q7bH02ZsKni4wMaA0DQCl4JH\ - Ae3ATOA04Fng6ZROE9bY5wNTMaLvwTrwl8DeQHc6sMN/zwU2AnOA1cApgd5h4D7gi8A04MfA\ - fJcJeAC4AdiV8mUh8BAw1u+fBv4JvNftATwIfDrjWcdSIcY44H8ZOoODpJFwHSPpKkmPSupS\ - Nf6e0r1Q0ibl4wlJs1JlNrpsuaTJkvb4fY+kTknPBeUflvSv4P5A8HubpLag3qmSXg9kHSm7\ - i4Oyc3Ke/Q2Xt+XIB3UNd8f25fqMpF2qxmFJO4L741Tp/Lc976CkdZJW+PWwKh15WNLpgY0v\ - ef42SXf67x2SZgY6iyQdCmy+Kmm2pGZJl0na6/k/DMrc5Xn/kTQt5/kS8n0+R77V5afnyBuW\ - AGMkjRpkHTcFDf6ypG9IuljSsZJaJXW7bGGqMTslTc+o76KgvluC/JlBfjLCLM4of2+g9+WU\ - 7BLPPyKp3fN2et497nO6vkkyIknS0pw2eMrl8wbZlv0iwHskvSR7MyZLWiZpraRnJP1MNhy3\ - FlQ8VdJb7vhLklZJ+pTsbemrczNlQ7AkfVfS2AydpMNvcz8TvD+nzu8EOn9JyV4IZAdy7H0o\ - 0El/RsLOul3SRFWjR9Lz3n4rJK2W9JrL3nT/s3z+umzE+mA/2m7QBGh3x7ZL2q1s/E3SGTnl\ - F+eU2SLpgj46d6uXeU5SU47Oatd5StJpgZ3jM3THqPK2JZgfyO8O8jfn2GsPdM7KkF8X+Hxi\ - oNutfLwsG9WK2qKlhnzAV940MFmCTKLgbmwa81fgZOBa4CxgPXAOlfkqwCLgp8H9I1hkvBQ4\ - E9gAXAncXyM+bfN0MxZlZ2G/px3YqlkPFvHPAdakdK/xOt/y55gH3OL+AjwGfMF/7yEb44Pf\ - kzLkGzw9GzjotsYDV2AzjTOBk7Ap5kHgeaATOJRjL0FPDfnAkcOMYwOGHpD0gZR8siz6lqT7\ - U+WSYOhZSTMC2SmqDNndqh3UXO+6uyVNyNFZE/i5UNLjge3Rgd4sVaLpO1w3wRWuc4yk/Z63\ - Mcfe7KDchRnyFtlwLUnnSvq5/15T41mH7coTjA4e9J4cnfkuD4OepZ63V9nDcJsqEf23ajjX\ - Jmmf6z6m3t/kNlVPwW6XdF7QAb+T9AlJN0r6r+dtV4VMSed0qRJgrfS8XTk+nRHYOzVHJ/lk\ - LpK0IND/ao3nnajsOKBF0jclXVmj/JASoDlw/OMFFWxwnTv9PvmOfr+gzNdcZ20fHPxc4Mcm\ - SZ+VdeDJsvl8iHVe5jpVSBDiFVV/t9tUGcW6ZBH5R/3+zYJ2WSXpJ8qPS/7sdXzS738U+LBK\ - lZclJNUyt9mt3nHVXC97qMDmkBOAwOnZBTo3uM4mv1/h90Vv922u83gfnbxK1W96Gslcuyso\ - 0yELELe5b9+W9O6MuqdJ+pMs6BvneUtkRBhoo86SfVaSGc8YSY+kfN4uCxR3pvJflDQlVV+r\ - pAdln6VhIUBRY5wd6J0gG6ok6Rc5+jNUGY5v7Iej7TJyhauAm2VDfBivnDTUDTREV5OkayT9\ - Q71xRNLvJV2r6rjlqFxFewE92Lr7Eqqj+hAt2Pp0C7YuPgr4DRa1Xwz82vXGAlcDy7C97Rew\ - Uy79Xdtuxtb2D1Idqe8DjnMf0vsCjYYZ2OxqAvYMW4HXhsuZot3ATmx61Vag04M9xBRsevMA\ - 8ATwMWAtsM5tzMM2M8B23S5lYBsbR7x8GgkBinxtFGzzqyFQdCCk09PJNepI1gAmeroEm1O3\ - AJdgW6rjsLnufdjWaH8a4HzgLuD4Ap2EXLXm0xEpFI0Az2Bbn0X73GBvfRe2KAS2iHQ5cC5w\ - AdY5LwK/onrBqK+4A7gI28pdniEfR+XIVN4CTkQOimKAVuxt3Uj+StzRwHLgZuzbPj9DvgAj\ - 19vAu6jHnvk7GEWfgEPYSZnhPjGyytMObNk5jas9XU/s/H5jJBwK/SN2HAvgbmwdPUEHFnMA\ - fO9oOvVOwUg5EnYOFpO0Ym/6vdhRrlux6H899imI6CdGCgHAdhBX0vt/cluww5x7e5WIqImR\ - RACwkeBmbL6/BTvguY44/RswRhoBIoYYIyEIjKgjIgFKjkiAkiMSoOSIBCg5IgFKjkiAkiMS\ - oOSIBCg5IgFKjkiAkiMSoOSIBCg5IgFKjkiAkiMSoOSIBCg5IgFKjkiAkiMSoOSIBCg5IgFK\ - jkiAkiMSoOSIBCg5IgFKjkiAkiMSoOSIBCg5IgFKjv8D/zcFVeg+jbUAAAAASUVORK5CYII=\ - " - - local function loadimage(file, name) - return love.graphics.newImage(love.image.newImageData(love.filesystem.newFileData(file, name:gsub("_", "."), "base64"))) - end - - local inspector = {} - local background = {} - local bubble = {} - local text = {} - local rain = {} - local g_time = 0 - - local create_rain - - function love.load() - -- Subtractive blending isn't supported on some ancient systems, so - -- we should make sure it still looks decent in that case. - if love.graphics.isSupported("subtractive") then - love.graphics.setBackgroundColor(137, 194, 218) - else - love.graphics.setBackgroundColor(11, 88, 123) - end - - local win_w = love.graphics.getWidth() - local win_h = love.graphics.getHeight() - - inspector.image = loadimage(inspector_png, "inspector.png") - inspector.img_w = inspector.image:getWidth() - inspector.img_h = inspector.image:getHeight() - inspector.x = win_w * 0.45 - inspector.y = win_h * 0.55 - - background.image = loadimage(background_png, "background.png") - background.img_w = background.image:getWidth() - background.img_h = background.image:getHeight() - background.x = 0 - background.y = 0 - - bubble.image = loadimage(bubble_png, "bubble.png") - bubble.img_w = bubble.image:getWidth() - bubble.img_h = bubble.image:getHeight() - bubble.x = 140 - bubble.y = -80 - - text.image = loadimage(text_png, "text.png") - text.x = 25 - text.y = 9 - - -- Baby Rain - rain.spacing_x = 110 - rain.spacing_y = 80 - rain.image = loadimage(baby_png, "baby.png") - rain.img_w = rain.image:getWidth() - rain.img_h = rain.image:getHeight() - rain.ox = -rain.img_w / 2 - rain.oy = -rain.img_h / 2 - rain.batch = love.graphics.newSpriteBatch(rain.image, 512) - rain.t = 0 - - create_rain() - end - - function create_rain() - local batch = rain.batch - - local sx = rain.spacing_x - local sy = rain.spacing_y - local ox = rain.ox - local oy = rain.oy - - local m = 1 / love.window.getPixelScale() - local batch_w = 2 * math.ceil(m * love.graphics.getWidth() / sx) + 2 - local batch_h = 2 * math.ceil(m * love.graphics.getHeight() / sy) + 2 - - batch:clear() - - if batch:getBufferSize() < batch_w * batch_h then - batch:setBufferSize(batch_w * batch_h) - end - - batch:bind() - - for i = 0, batch_h - 1 do - for j = 0, batch_w - 1 do - local is_even = (j % 2) == 0 - local offset_y = is_even and 0 or sy / 2 - local x = ox + j * sx - local y = oy + i * sy + offset_y - batch:add(x, y) - end - end - - batch:unbind() - end - - local function update_rain(t) - rain.t = t - end - - function love.resize(w, h) - create_rain() - end - - function love.update(dt) - g_time = g_time + dt / 2 - local int, frac = math.modf(g_time) - update_rain(frac) - inspector.x = love.window.fromPixels(love.graphics.getWidth() * 0.45) - inspector.y = love.window.fromPixels(love.graphics.getHeight() * 0.55) - end - - local function draw_grid() - local blendmode = "subtractive" - if not love.graphics.isSupported("subtractive") then - -- We also change the background color in this case, so it looks OK. - blendmode = "additive" - end - - local y = rain.spacing_y * rain.t - - local small_y = -rain.spacing_y + y / 2 - local big_y = -rain.spacing_y + y - - love.graphics.setBlendMode(blendmode) - love.graphics.setColor(255, 255, 255, 128) - love.graphics.draw(rain.batch, -rain.spacing_x, small_y, 0, 0.5, 0.5) - - love.graphics.setBlendMode("alpha") - love.graphics.setColor(255, 255, 255, 255) - love.graphics.draw(rain.batch, -rain.spacing_x, big_y) - end - - local function draw_text(x, y) - local int, frac = math.modf(g_time) - if frac < 0.5 then - return - end - local tx = x + text.x - local ty = y + text.y - love.graphics.draw(text.image, tx, ty, 0, 1, 1, 70, 70) - end - - local function draw_background(x, y) - local intensity = (math.sin(math.pi * g_time * 2) + 1) / 2 - - local bx = x - local by = y - - love.graphics.setColor(255, 255, 255, 64 + 16*intensity) - love.graphics.draw(background.image, bx, by, 0, 0.7, 0.7, 256, 256) - love.graphics.setColor(255, 255, 255, 32 + 16*intensity) - love.graphics.draw(background.image, bx, by, 0, 0.65, 0.65, 256, 256) - love.graphics.setBlendMode("additive") - love.graphics.setColor(255, 255, 255, 16 + 16*intensity) - love.graphics.draw(background.image, bx, by, 0, 0.6, 0.6, 256, 256) - end - - local function draw_bubble(x, y) - local osc = 10 * math.sin(math.pi * g_time) - local bx = x + bubble.x - local by = y + bubble.y + osc - love.graphics.draw(bubble.image, bx, by, 0, 1, 1, 70, 70) - - draw_text(bx, by) - end - - local function draw_inspector() - local x, y = inspector.x, inspector.y - local ox, oy = inspector.img_w / 2, inspector.img_h / 2 - draw_background(x, y) - love.graphics.setColor(255, 255, 255, 255) - love.graphics.setBlendMode("alpha") - love.graphics.draw(inspector.image, x, y, 0, 1, 1, ox, oy) - draw_bubble(x, y) - end - - function love.draw() - love.graphics.setColor(255, 255, 255) - - love.graphics.push() - love.graphics.scale(love.window.getPixelScale()) - - draw_grid() - draw_inspector() - - love.graphics.pop() - end - - function love.keyreleased(key) - if key == "escape" then - love.event.quit() - end - end - - function love.conf(t) - t.title = "L\195\150VE " .. love._version .. " (" .. love._version_codename .. ")" - t.modules.audio = false - t.modules.sound = false - t.modules.physics = false - t.modules.joystick = false - t.window.resizable = true - t.window.highdpi = true - end -end - ----------------------------------------------------------- -- Error screen. ----------------------------------------------------------- @@ -1594,7 +600,7 @@ function love.errhand(msg) local trace = debug.traceback() - love.graphics.clear() + love.graphics.clear(love.graphics.getBackgroundColor()) love.graphics.origin() local err = {} @@ -1616,7 +622,7 @@ function love.errhand(msg) local function draw() local pos = love.window.toPixels(70) - love.graphics.clear() + love.graphics.clear(love.graphics.getBackgroundColor()) love.graphics.printf(p, pos, pos, love.graphics.getWidth() - pos) love.graphics.present() end @@ -1627,9 +633,16 @@ function love.errhand(msg) for e, a, b, c in love.event.poll() do if e == "quit" then return - end - if e == "keypressed" and a == "escape" then + elseif e == "keypressed" and a == "escape" then return + elseif e == "mousereleased" then + local name = love.window.getTitle() + if #name == 0 then name = "Game" end + local buttons = {"OK", "Cancel"} + local pressed = love.window.showMessageBox("Quit "..name.."?", "", buttons) + if pressed == 1 then + return + end end end diff --git a/jni/love/src/scripts/boot.lua.h b/jni/love/src/scripts/boot.lua.h index 81103275..71aaf9b0 100644 --- a/jni/love/src/scripts/boot.lua.h +++ b/jni/love/src/scripts/boot.lua.h @@ -259,18 +259,18 @@ const unsigned char boot_lua[] = 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x73, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x7b, 0x0a, 0x09, 0x09, 0x6b, 0x65, 0x79, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x62, 0x2c, 0x20, 0x75, 0x29, 0x0a, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x62, 0x2c, 0x73, 0x2c, 0x72, 0x29, 0x0a, 0x09, 0x09, 0x09, 0x69, 0x66, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x6b, 0x65, 0x79, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x6f, - 0x76, 0x65, 0x2e, 0x6b, 0x65, 0x79, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x28, 0x62, 0x2c, 0x20, 0x75, - 0x29, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x76, 0x65, 0x2e, 0x6b, 0x65, 0x79, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x28, 0x62, 0x2c, 0x73, 0x2c, + 0x72, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x09, 0x09, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x09, 0x09, 0x6b, 0x65, 0x79, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x66, 0x75, - 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x62, 0x29, 0x0a, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x62, 0x2c, 0x73, 0x29, 0x0a, 0x09, 0x09, 0x09, 0x69, 0x66, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x6b, 0x65, 0x79, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, - 0x6f, 0x76, 0x65, 0x2e, 0x6b, 0x65, 0x79, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x28, 0x62, 0x29, - 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x6f, 0x76, 0x65, 0x2e, 0x6b, 0x65, 0x79, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x28, 0x62, 0x2c, + 0x73, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x09, 0x09, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x09, 0x09, 0x74, 0x65, 0x78, 0x74, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x74, 0x29, 0x0a, @@ -278,12 +278,20 @@ const unsigned char boot_lua[] = 0x75, 0x74, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x74, 0x65, 0x78, 0x74, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x28, 0x74, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x09, 0x09, 0x65, 0x6e, 0x64, 0x2c, 0x0a, - 0x09, 0x09, 0x74, 0x65, 0x78, 0x74, 0x65, 0x64, 0x69, 0x74, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x74, 0x2c, 0x73, 0x2c, 0x6c, 0x29, 0x0a, + 0x09, 0x09, 0x74, 0x65, 0x78, 0x74, 0x65, 0x64, 0x69, 0x74, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x74, 0x2c, 0x73, 0x2c, 0x6c, 0x29, 0x0a, 0x09, 0x09, 0x09, 0x69, 0x66, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x74, 0x65, 0x78, 0x74, 0x65, 0x64, 0x69, - 0x74, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x6f, 0x76, 0x65, - 0x2e, 0x74, 0x65, 0x78, 0x74, 0x65, 0x64, 0x69, 0x74, 0x28, 0x74, 0x2c, 0x73, 0x2c, 0x6c, 0x29, 0x20, 0x65, - 0x6e, 0x64, 0x0a, + 0x74, 0x65, 0x64, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x6f, + 0x76, 0x65, 0x2e, 0x74, 0x65, 0x78, 0x74, 0x65, 0x64, 0x69, 0x74, 0x65, 0x64, 0x28, 0x74, 0x2c, 0x73, 0x2c, + 0x6c, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x09, 0x65, 0x6e, 0x64, 0x2c, 0x0a, + 0x09, 0x09, 0x6d, 0x6f, 0x75, 0x73, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x78, 0x2c, 0x79, 0x2c, 0x64, 0x78, 0x2c, 0x64, 0x79, 0x2c, 0x74, + 0x29, 0x0a, + 0x09, 0x09, 0x09, 0x69, 0x66, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x6d, 0x6f, 0x75, 0x73, 0x65, 0x6d, 0x6f, + 0x76, 0x65, 0x64, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x6f, + 0x76, 0x65, 0x2e, 0x6d, 0x6f, 0x75, 0x73, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x28, 0x78, 0x2c, 0x79, 0x2c, + 0x64, 0x78, 0x2c, 0x64, 0x79, 0x2c, 0x74, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x09, 0x09, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x09, 0x09, 0x6d, 0x6f, 0x75, 0x73, 0x65, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x78, 0x2c, 0x79, 0x2c, 0x62, 0x2c, 0x74, 0x29, 0x0a, @@ -292,14 +300,6 @@ const unsigned char boot_lua[] = 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x6d, 0x6f, 0x75, 0x73, 0x65, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x28, 0x78, 0x2c, 0x79, 0x2c, 0x62, 0x2c, 0x74, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x09, 0x09, 0x65, 0x6e, 0x64, 0x2c, 0x0a, - 0x09, 0x09, 0x6d, 0x6f, 0x75, 0x73, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x78, 0x2c, 0x79, 0x2c, 0x78, 0x72, 0x65, 0x6c, 0x2c, 0x79, 0x72, - 0x65, 0x6c, 0x29, 0x0a, - 0x09, 0x09, 0x09, 0x69, 0x66, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x6d, 0x6f, 0x75, 0x73, 0x65, 0x6d, 0x6f, - 0x76, 0x65, 0x64, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x6f, - 0x76, 0x65, 0x2e, 0x6d, 0x6f, 0x75, 0x73, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x28, 0x78, 0x2c, 0x79, 0x2c, - 0x78, 0x72, 0x65, 0x6c, 0x2c, 0x79, 0x72, 0x65, 0x6c, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x0a, - 0x09, 0x09, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x09, 0x09, 0x6d, 0x6f, 0x75, 0x73, 0x65, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x78, 0x2c, 0x79, 0x2c, 0x62, 0x2c, 0x74, 0x29, 0x0a, 0x09, 0x09, 0x09, 0x69, 0x66, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x6d, 0x6f, 0x75, 0x73, 0x65, 0x72, 0x65, @@ -307,36 +307,38 @@ const unsigned char boot_lua[] = 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x6d, 0x6f, 0x75, 0x73, 0x65, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x28, 0x78, 0x2c, 0x79, 0x2c, 0x62, 0x2c, 0x74, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x09, 0x09, 0x65, 0x6e, 0x64, 0x2c, 0x0a, + 0x09, 0x09, 0x77, 0x68, 0x65, 0x65, 0x6c, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x78, 0x2c, 0x79, 0x29, 0x0a, + 0x09, 0x09, 0x09, 0x69, 0x66, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x77, 0x68, 0x65, 0x65, 0x6c, 0x6d, 0x6f, + 0x76, 0x65, 0x64, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x6f, + 0x76, 0x65, 0x2e, 0x77, 0x68, 0x65, 0x65, 0x6c, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x28, 0x78, 0x2c, 0x79, 0x29, + 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x09, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x09, 0x09, 0x74, 0x6f, 0x75, 0x63, 0x68, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x66, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x69, 0x64, 0x2c, 0x78, 0x2c, 0x79, 0x2c, 0x70, 0x29, 0x0a, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x69, 0x64, 0x2c, 0x78, 0x2c, 0x79, 0x2c, 0x64, 0x78, + 0x2c, 0x64, 0x79, 0x2c, 0x70, 0x29, 0x0a, 0x09, 0x09, 0x09, 0x69, 0x66, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x74, 0x6f, 0x75, 0x63, 0x68, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x74, 0x6f, 0x75, 0x63, 0x68, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x28, - 0x69, 0x64, 0x2c, 0x78, 0x2c, 0x79, 0x2c, 0x70, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x69, 0x64, 0x2c, 0x78, 0x2c, 0x79, 0x2c, 0x64, 0x78, 0x2c, 0x64, 0x79, 0x2c, 0x70, 0x29, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x09, 0x09, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x09, 0x09, 0x74, 0x6f, 0x75, 0x63, 0x68, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x20, 0x3d, 0x20, - 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x69, 0x64, 0x2c, 0x78, 0x2c, 0x79, 0x2c, 0x70, - 0x29, 0x0a, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x69, 0x64, 0x2c, 0x78, 0x2c, 0x79, 0x2c, 0x64, + 0x78, 0x2c, 0x64, 0x79, 0x2c, 0x70, 0x29, 0x0a, 0x09, 0x09, 0x09, 0x69, 0x66, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x74, 0x6f, 0x75, 0x63, 0x68, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x74, 0x6f, 0x75, 0x63, 0x68, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, - 0x64, 0x28, 0x69, 0x64, 0x2c, 0x78, 0x2c, 0x79, 0x2c, 0x70, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x64, 0x28, 0x69, 0x64, 0x2c, 0x78, 0x2c, 0x79, 0x2c, 0x64, 0x78, 0x2c, 0x64, 0x79, 0x2c, 0x70, 0x29, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x09, 0x09, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x09, 0x09, 0x74, 0x6f, 0x75, 0x63, 0x68, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x69, 0x64, 0x2c, 0x78, 0x2c, 0x79, 0x2c, 0x70, 0x29, 0x0a, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x69, 0x64, 0x2c, 0x78, 0x2c, 0x79, 0x2c, 0x64, 0x78, 0x2c, 0x64, + 0x79, 0x2c, 0x70, 0x29, 0x0a, 0x09, 0x09, 0x09, 0x69, 0x66, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x74, 0x6f, 0x75, 0x63, 0x68, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x74, 0x6f, 0x75, 0x63, 0x68, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x28, 0x69, 0x64, 0x2c, 0x78, - 0x2c, 0x79, 0x2c, 0x70, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x0a, - 0x09, 0x09, 0x65, 0x6e, 0x64, 0x2c, 0x0a, - 0x09, 0x09, 0x74, 0x6f, 0x75, 0x63, 0x68, 0x67, 0x65, 0x73, 0x74, 0x75, 0x72, 0x65, 0x64, 0x20, 0x3d, 0x20, - 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x78, 0x2c, 0x79, 0x2c, 0x74, 0x68, 0x65, 0x74, - 0x61, 0x2c, 0x64, 0x69, 0x73, 0x74, 0x2c, 0x6e, 0x75, 0x6d, 0x29, 0x0a, - 0x09, 0x09, 0x09, 0x69, 0x66, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x74, 0x6f, 0x75, 0x63, 0x68, 0x67, 0x65, - 0x73, 0x74, 0x75, 0x72, 0x65, 0x64, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, - 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x74, 0x6f, 0x75, 0x63, 0x68, 0x67, 0x65, 0x73, 0x74, 0x75, 0x72, 0x65, - 0x64, 0x28, 0x78, 0x2c, 0x79, 0x2c, 0x74, 0x68, 0x65, 0x74, 0x61, 0x2c, 0x64, 0x69, 0x73, 0x74, 0x2c, 0x6e, - 0x75, 0x6d, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x2c, 0x79, 0x2c, 0x64, 0x78, 0x2c, 0x64, 0x79, 0x2c, 0x70, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x09, 0x09, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x09, 0x09, 0x6a, 0x6f, 0x79, 0x73, 0x74, 0x69, 0x63, 0x6b, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x6a, 0x2c, 0x62, 0x29, 0x0a, @@ -395,7 +397,7 @@ const unsigned char boot_lua[] = 0x64, 0x28, 0x6a, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x09, 0x09, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x09, 0x09, 0x6a, 0x6f, 0x79, 0x73, 0x74, 0x69, 0x63, 0x6b, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x20, - 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6a, 0x29, 0x0a, + 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x6a, 0x29, 0x0a, 0x09, 0x09, 0x09, 0x69, 0x66, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x6a, 0x6f, 0x79, 0x73, 0x74, 0x69, 0x63, 0x6b, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x6a, 0x6f, 0x79, 0x73, 0x74, 0x69, 0x63, 0x6b, 0x72, 0x65, @@ -432,17 +434,29 @@ const unsigned char boot_lua[] = 0x20, 0x65, 0x72, 0x72, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x09, 0x09, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x09, 0x09, 0x72, 0x65, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x28, 0x77, 0x2c, 0x20, 0x68, 0x29, 0x0a, + 0x6e, 0x20, 0x28, 0x77, 0x2c, 0x20, 0x68, 0x29, 0x0a, 0x09, 0x09, 0x09, 0x69, 0x66, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x72, 0x65, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x72, 0x65, 0x73, 0x69, 0x7a, 0x65, 0x28, 0x77, 0x2c, 0x20, 0x68, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x09, 0x09, 0x65, 0x6e, 0x64, 0x2c, 0x0a, + 0x09, 0x09, 0x66, 0x69, 0x6c, 0x65, 0x64, 0x72, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x66, 0x29, 0x0a, + 0x09, 0x09, 0x09, 0x69, 0x66, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x64, 0x72, 0x6f, + 0x70, 0x70, 0x65, 0x64, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, + 0x6f, 0x76, 0x65, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x64, 0x72, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x28, 0x66, 0x29, + 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x09, 0x65, 0x6e, 0x64, 0x2c, 0x0a, + 0x09, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x64, 0x72, 0x6f, 0x70, 0x70, 0x65, 0x64, + 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x64, 0x69, 0x72, 0x29, 0x0a, + 0x09, 0x09, 0x09, 0x69, 0x66, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x79, 0x64, 0x72, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, + 0x64, 0x72, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x28, 0x64, 0x69, 0x72, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x09, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x09, 0x09, 0x6c, 0x6f, 0x77, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x0a, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x29, 0x0a, 0x09, 0x09, 0x09, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x67, 0x61, 0x72, 0x62, 0x61, 0x67, 0x65, 0x28, - 0x22, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x22, 0x29, 0x0a, - 0x09, 0x09, 0x09, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x67, 0x61, 0x72, 0x62, 0x61, 0x67, 0x65, 0x28, - 0x22, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x22, 0x29, 0x0a, + 0x29, 0x0a, 0x09, 0x09, 0x09, 0x69, 0x66, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x6c, 0x6f, 0x77, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x6c, 0x6f, 0x77, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x28, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x0a, @@ -483,20 +497,28 @@ const unsigned char boot_lua[] = 0x2e, 0x61, 0x72, 0x67, 0x2e, 0x67, 0x65, 0x74, 0x4c, 0x6f, 0x77, 0x28, 0x61, 0x72, 0x67, 0x29, 0x0a, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x28, 0x61, 0x72, 0x67, 0x30, 0x29, 0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x65, 0x78, 0x65, 0x70, 0x61, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x6c, + 0x6f, 0x76, 0x65, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x2e, 0x67, 0x65, 0x74, + 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x68, 0x28, 0x29, 0x0a, + 0x09, 0x69, 0x66, 0x20, 0x23, 0x65, 0x78, 0x65, 0x70, 0x61, 0x74, 0x68, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x09, 0x09, 0x2d, 0x2d, 0x20, 0x54, 0x68, 0x69, 0x73, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x6e, 0x27, + 0x74, 0x20, 0x68, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x2c, 0x20, 0x62, 0x75, 0x74, 0x20, 0x6a, 0x75, 0x73, 0x74, + 0x20, 0x69, 0x6e, 0x20, 0x63, 0x61, 0x73, 0x65, 0x20, 0x77, 0x65, 0x27, 0x6c, 0x6c, 0x20, 0x66, 0x61, 0x6c, + 0x6c, 0x20, 0x62, 0x61, 0x63, 0x6b, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x72, 0x67, 0x30, 0x2e, 0x0a, + 0x09, 0x09, 0x65, 0x78, 0x65, 0x70, 0x61, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x61, 0x72, 0x67, 0x30, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a, 0x09, 0x2d, 0x2d, 0x20, 0x49, 0x73, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x6f, 0x73, 0x65, 0x20, 0x66, 0x61, 0x6e, 0x63, 0x79, 0x20, 0x22, 0x66, 0x75, 0x73, 0x65, 0x64, 0x22, 0x20, 0x67, 0x61, 0x6d, 0x65, 0x73, 0x3f, 0x0a, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x61, 0x6e, 0x5f, 0x68, 0x61, 0x73, 0x5f, 0x67, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x70, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x2e, 0x73, 0x65, 0x74, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2c, - 0x20, 0x61, 0x72, 0x67, 0x30, 0x29, 0x0a, + 0x20, 0x65, 0x78, 0x65, 0x70, 0x61, 0x74, 0x68, 0x29, 0x0a, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x73, 0x5f, 0x66, 0x75, 0x73, 0x65, 0x64, 0x5f, 0x67, 0x61, - 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x63, 0x61, 0x6e, 0x5f, 0x68, 0x61, 0x73, 0x5f, 0x67, 0x61, 0x6d, 0x65, 0x0a, - 0x09, 0x69, 0x66, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x61, 0x72, 0x67, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x2e, 0x66, 0x75, 0x73, 0x65, 0x64, 0x2e, 0x73, 0x65, 0x74, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, - 0x09, 0x09, 0x69, 0x73, 0x5f, 0x66, 0x75, 0x73, 0x65, 0x64, 0x5f, 0x67, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, - 0x74, 0x72, 0x75, 0x65, 0x0a, - 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x63, 0x61, 0x6e, 0x5f, 0x68, 0x61, 0x73, 0x5f, 0x67, 0x61, 0x6d, 0x65, 0x20, + 0x6f, 0x72, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x61, 0x72, 0x67, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x2e, 0x66, 0x75, 0x73, 0x65, 0x64, 0x2e, 0x73, 0x65, 0x74, 0x0a, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x2e, 0x73, 0x65, 0x74, 0x46, 0x75, 0x73, 0x65, 0x64, 0x28, 0x69, 0x73, 0x5f, 0x66, 0x75, 0x73, 0x65, 0x64, 0x5f, 0x67, 0x61, 0x6d, 0x65, 0x29, 0x0a, @@ -521,7 +543,6 @@ const unsigned char boot_lua[] = 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x2e, 0x73, 0x65, 0x74, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2c, 0x20, 0x66, 0x75, 0x6c, 0x6c, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x29, 0x0a, - 0x09, 0x09, 0x0a, 0x09, 0x09, 0x2d, 0x2d, 0x20, 0x55, 0x73, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x2e, 0x6c, 0x6f, 0x76, 0x65, 0x20, 0x61, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, @@ -534,7 +555,23 @@ const unsigned char boot_lua[] = 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x78, 0x65, 0x20, 0x61, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6e, 0x6f, 0x77, 0x2e, 0x0a, 0x09, 0x09, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, - 0x70, 0x61, 0x74, 0x68, 0x2e, 0x6c, 0x65, 0x61, 0x66, 0x28, 0x61, 0x72, 0x67, 0x30, 0x29, 0x0a, + 0x70, 0x61, 0x74, 0x68, 0x2e, 0x6c, 0x65, 0x61, 0x66, 0x28, 0x65, 0x78, 0x65, 0x70, 0x61, 0x74, 0x68, 0x29, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x2d, 0x2d, 0x20, 0x54, 0x72, 0x79, 0x20, 0x74, 0x6f, 0x20, 0x75, 0x73, 0x65, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x69, 0x6e, + 0x67, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x2e, 0x6c, 0x75, 0x61, 0x20, 0x61, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x2e, 0x20, 0x49, 0x74, 0x0a, + 0x09, 0x2d, 0x2d, 0x20, 0x6d, 0x69, 0x67, 0x68, 0x74, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, + 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x2c, 0x20, 0x69, 0x6e, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, + 0x20, 0x63, 0x61, 0x73, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, + 0x73, 0x20, 0x61, 0x62, 0x6f, 0x76, 0x65, 0x20, 0x61, 0x72, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x2e, 0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x61, 0x6c, 0x64, 0x69, 0x72, 0x20, 0x3d, 0x20, 0x6c, + 0x6f, 0x76, 0x65, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x2e, 0x67, 0x65, 0x74, + 0x52, 0x65, 0x61, 0x6c, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x28, 0x22, 0x6d, 0x61, 0x69, + 0x6e, 0x2e, 0x6c, 0x75, 0x61, 0x22, 0x29, 0x0a, + 0x09, 0x69, 0x66, 0x20, 0x72, 0x65, 0x61, 0x6c, 0x64, 0x69, 0x72, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x09, 0x09, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, + 0x70, 0x61, 0x74, 0x68, 0x2e, 0x6c, 0x65, 0x61, 0x66, 0x28, 0x72, 0x65, 0x61, 0x6c, 0x64, 0x69, 0x72, 0x29, 0x0a, 0x09, 0x65, 0x6e, 0x64, 0x0a, 0x09, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x3d, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x3a, 0x67, 0x73, 0x75, 0x62, 0x28, 0x22, 0x5e, 0x28, 0x5b, 0x25, 0x2e, 0x5d, 0x2b, 0x29, 0x22, @@ -573,7 +610,10 @@ const unsigned char boot_lua[] = 0x09, 0x65, 0x6e, 0x64, 0x0a, 0x09, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x63, 0x61, 0x6e, 0x5f, 0x68, 0x61, 0x73, 0x5f, 0x67, 0x61, 0x6d, 0x65, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, - 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x6e, 0x6f, 0x67, 0x61, 0x6d, 0x65, 0x28, 0x29, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x6f, 0x67, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x72, + 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x6e, 0x6f, 0x67, 0x61, 0x6d, + 0x65, 0x22, 0x29, 0x0a, + 0x09, 0x09, 0x6e, 0x6f, 0x67, 0x61, 0x6d, 0x65, 0x28, 0x29, 0x0a, 0x09, 0x65, 0x6e, 0x64, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x69, 0x6e, 0x69, 0x74, @@ -602,14 +642,10 @@ const unsigned char boot_lua[] = 0x09, 0x09, 0x09, 0x66, 0x75, 0x6c, 0x6c, 0x73, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x2c, 0x0a, 0x09, 0x09, 0x09, 0x66, 0x75, 0x6c, 0x6c, 0x73, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x74, 0x79, 0x70, 0x65, 0x20, - 0x3d, 0x20, 0x22, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x22, 0x2c, 0x0a, + 0x3d, 0x20, 0x22, 0x64, 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70, 0x22, 0x2c, 0x0a, 0x09, 0x09, 0x09, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x20, 0x3d, 0x20, 0x31, 0x2c, 0x0a, 0x09, 0x09, 0x09, 0x76, 0x73, 0x79, 0x6e, 0x63, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x0a, 0x09, 0x09, 0x09, 0x6d, 0x73, 0x61, 0x61, 0x20, 0x3d, 0x20, 0x30, 0x2c, 0x0a, - 0x09, 0x09, 0x09, 0x66, 0x73, 0x61, 0x61, 0x20, 0x3d, 0x20, 0x30, 0x2c, 0x20, 0x2d, 0x2d, 0x20, 0x46, 0x6f, - 0x72, 0x20, 0x62, 0x61, 0x63, 0x6b, 0x77, 0x61, 0x72, 0x64, 0x2d, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, - 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x2e, 0x20, 0x54, 0x4f, 0x44, 0x4f, 0x3a, 0x20, 0x72, 0x65, 0x6d, 0x6f, - 0x76, 0x65, 0x21, 0x0a, 0x09, 0x09, 0x09, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x2c, 0x0a, 0x09, 0x09, 0x09, 0x72, 0x65, 0x73, 0x69, 0x7a, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x61, 0x6c, @@ -628,6 +664,7 @@ const unsigned char boot_lua[] = 0x09, 0x09, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x0a, 0x09, 0x09, 0x09, 0x6a, 0x6f, 0x79, 0x73, 0x74, 0x69, 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x0a, + 0x09, 0x09, 0x09, 0x74, 0x6f, 0x75, 0x63, 0x68, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x0a, 0x09, 0x09, 0x09, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x0a, 0x09, 0x09, 0x09, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x0a, @@ -638,7 +675,6 @@ const unsigned char boot_lua[] = 0x09, 0x09, 0x09, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x0a, 0x09, 0x09, 0x09, 0x66, 0x6f, 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x0a, 0x09, 0x09, 0x09, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x0a, - 0x09, 0x09, 0x09, 0x74, 0x6f, 0x75, 0x63, 0x68, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x0a, 0x09, 0x09, 0x09, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x0a, 0x09, 0x09, 0x7d, 0x2c, 0x0a, 0x09, 0x09, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x2c, @@ -753,6 +789,44 @@ const unsigned char boot_lua[] = 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x73, 0x28, 0x29, 0x0a, 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x2d, 0x2d, 0x20, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x0a, + 0x09, 0x63, 0x2e, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x28, 0x63, 0x2e, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x29, 0x0a, + 0x09, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x69, 0x73, 0x56, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x28, 0x63, 0x2e, 0x76, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x61, 0x6a, 0x6f, 0x72, 0x2c, 0x20, 0x6d, 0x69, 0x6e, + 0x6f, 0x72, 0x2c, 0x20, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x63, 0x2e, 0x76, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3a, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x22, 0x5e, 0x28, 0x25, 0x64, + 0x2b, 0x29, 0x25, 0x2e, 0x28, 0x25, 0x64, 0x2b, 0x29, 0x25, 0x2e, 0x28, 0x25, 0x64, 0x2b, 0x29, 0x24, 0x22, + 0x29, 0x0a, + 0x09, 0x09, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x6f, 0x74, 0x20, 0x6d, 0x61, 0x6a, 0x6f, 0x72, 0x20, 0x6f, 0x72, + 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6d, 0x69, 0x6e, 0x6f, 0x72, 0x20, 0x6f, 0x72, 0x20, 0x6e, 0x6f, 0x74, 0x20, + 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x28, 0x6d, 0x61, 0x6a, 0x6f, + 0x72, 0x20, 0x7e, 0x3d, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x5f, 0x6d, 0x61, 0x6a, 0x6f, 0x72, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6d, 0x69, 0x6e, 0x6f, 0x72, 0x20, 0x7e, + 0x3d, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x69, + 0x6e, 0x6f, 0x72, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x09, 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x73, 0x67, 0x20, 0x3d, 0x20, 0x22, 0x54, 0x68, + 0x69, 0x73, 0x20, 0x67, 0x61, 0x6d, 0x65, 0x20, 0x77, 0x61, 0x73, 0x20, 0x6d, 0x61, 0x64, 0x65, 0x20, 0x66, + 0x6f, 0x72, 0x20, 0x61, 0x20, 0x64, 0x69, 0x66, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x76, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x4c, 0x4f, 0x56, 0x45, 0x2e, 0x5c, 0x6e, 0x22, 0x2e, 0x2e, 0x0a, + 0x09, 0x09, 0x09, 0x22, 0x49, 0x74, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x65, 0x20, + 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x20, + 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x76, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x22, 0x2e, 0x2e, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x5f, 0x76, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x2e, 0x22, 0x29, 0x2e, 0x22, 0x0a, + 0x09, 0x09, 0x09, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x28, 0x6d, 0x73, 0x67, 0x29, 0x0a, + 0x09, 0x09, 0x09, 0x69, 0x66, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x09, 0x09, 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x73, 0x68, + 0x6f, 0x77, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x42, 0x6f, 0x78, 0x28, 0x22, 0x43, 0x6f, 0x6d, 0x70, + 0x61, 0x74, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x20, 0x57, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x22, + 0x2c, 0x20, 0x6d, 0x73, 0x67, 0x2c, 0x20, 0x22, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x22, 0x29, 0x0a, + 0x09, 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a, 0x09, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x6f, 0x6b, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x65, 0x72, 0x72, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x09, 0x09, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x63, 0x6f, 0x6e, 0x66, 0x65, 0x72, 0x72, 0x29, 0x0a, @@ -774,10 +848,6 @@ const unsigned char boot_lua[] = 0x65, 0x65, 0x6e, 0x74, 0x79, 0x70, 0x65, 0x2c, 0x0a, 0x09, 0x09, 0x09, 0x76, 0x73, 0x79, 0x6e, 0x63, 0x20, 0x3d, 0x20, 0x63, 0x2e, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x76, 0x73, 0x79, 0x6e, 0x63, 0x2c, 0x0a, - 0x09, 0x09, 0x09, 0x66, 0x73, 0x61, 0x61, 0x20, 0x3d, 0x20, 0x63, 0x2e, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, - 0x2e, 0x66, 0x73, 0x61, 0x61, 0x2c, 0x20, 0x2d, 0x2d, 0x20, 0x46, 0x6f, 0x72, 0x20, 0x62, 0x61, 0x63, 0x6b, - 0x77, 0x61, 0x72, 0x64, 0x2d, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, - 0x2e, 0x20, 0x54, 0x4f, 0x44, 0x4f, 0x3a, 0x20, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x21, 0x0a, 0x09, 0x09, 0x09, 0x6d, 0x73, 0x61, 0x61, 0x20, 0x3d, 0x20, 0x63, 0x2e, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x6d, 0x73, 0x61, 0x61, 0x2c, 0x0a, 0x09, 0x09, 0x09, 0x72, 0x65, 0x73, 0x69, 0x7a, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x63, 0x2e, 0x77, @@ -849,64 +919,12 @@ const unsigned char boot_lua[] = 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x6f, 0x70, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x7a, 0x69, 0x70, 0x22, 0x29, 0x0a, 0x09, 0x65, 0x6e, 0x64, 0x0a, - 0x09, 0x2d, 0x2d, 0x20, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x0a, - 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x20, 0x3d, 0x20, 0x66, 0x61, - 0x6c, 0x73, 0x65, 0x0a, - 0x09, 0x63, 0x2e, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, - 0x69, 0x6e, 0x67, 0x28, 0x63, 0x2e, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x29, 0x0a, - 0x09, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x2c, 0x20, 0x76, 0x20, 0x69, 0x6e, 0x20, 0x69, 0x70, 0x61, 0x69, 0x72, - 0x73, 0x28, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, - 0x6d, 0x70, 0x61, 0x74, 0x29, 0x20, 0x64, 0x6f, 0x0a, - 0x09, 0x09, 0x69, 0x66, 0x20, 0x63, 0x2e, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x3d, 0x20, - 0x76, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, - 0x09, 0x09, 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, - 0x09, 0x09, 0x09, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x0a, - 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, - 0x09, 0x65, 0x6e, 0x64, 0x0a, - 0x09, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, - 0x6e, 0x0a, - 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x61, 0x6a, 0x6f, 0x72, 0x2c, 0x20, 0x6d, 0x69, 0x6e, - 0x6f, 0x72, 0x2c, 0x20, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x63, 0x2e, 0x76, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3a, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x22, 0x5e, 0x28, 0x25, 0x64, - 0x2b, 0x29, 0x25, 0x2e, 0x28, 0x25, 0x64, 0x2b, 0x29, 0x25, 0x2e, 0x28, 0x25, 0x64, 0x2b, 0x29, 0x24, 0x22, - 0x29, 0x0a, - 0x09, 0x09, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x6f, 0x74, 0x20, 0x6d, 0x61, 0x6a, 0x6f, 0x72, 0x20, 0x6f, 0x72, - 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6d, 0x69, 0x6e, 0x6f, 0x72, 0x20, 0x6f, 0x72, 0x20, 0x6e, 0x6f, 0x74, 0x20, - 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x28, 0x6d, 0x61, 0x6a, 0x6f, - 0x72, 0x20, 0x7e, 0x3d, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x5f, 0x6d, 0x61, 0x6a, 0x6f, 0x72, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6d, 0x69, 0x6e, 0x6f, 0x72, 0x20, 0x7e, - 0x3d, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x69, - 0x6e, 0x6f, 0x72, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, - 0x09, 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x73, 0x67, 0x20, 0x3d, 0x20, 0x22, 0x54, 0x68, - 0x69, 0x73, 0x20, 0x67, 0x61, 0x6d, 0x65, 0x20, 0x77, 0x61, 0x73, 0x20, 0x6d, 0x61, 0x64, 0x65, 0x20, 0x66, - 0x6f, 0x72, 0x20, 0x61, 0x20, 0x64, 0x69, 0x66, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x76, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x4c, 0xc3, 0x96, 0x56, 0x45, 0x2e, 0x5c, 0x6e, 0x22, 0x2e, - 0x2e, 0x0a, - 0x09, 0x09, 0x09, 0x09, 0x22, 0x49, 0x74, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x65, - 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, - 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x20, - 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x22, 0x2e, 0x2e, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x5f, - 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x2e, 0x22, 0x29, 0x2e, 0x22, 0x0a, - 0x09, 0x09, 0x09, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x28, 0x6d, 0x73, 0x67, 0x29, 0x0a, - 0x09, 0x09, 0x09, 0x69, 0x66, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x20, - 0x74, 0x68, 0x65, 0x6e, 0x0a, - 0x09, 0x09, 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x73, 0x68, - 0x6f, 0x77, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x42, 0x6f, 0x78, 0x28, 0x22, 0x43, 0x6f, 0x6d, 0x70, - 0x61, 0x74, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x20, 0x57, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x22, - 0x2c, 0x20, 0x6d, 0x73, 0x67, 0x2c, 0x20, 0x22, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x22, 0x29, 0x0a, - 0x09, 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, - 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, - 0x09, 0x65, 0x6e, 0x64, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x72, 0x75, 0x6e, 0x28, 0x29, 0x0a, 0x09, 0x69, 0x66, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x6d, 0x61, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x6d, 0x61, 0x74, 0x68, 0x2e, 0x73, 0x65, 0x74, 0x52, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x53, 0x65, 0x65, 0x64, 0x28, 0x6f, 0x73, 0x2e, 0x74, 0x69, 0x6d, 0x65, 0x28, 0x29, 0x29, 0x0a, - 0x09, 0x09, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x3d, 0x31, 0x2c, 0x33, 0x20, 0x64, 0x6f, 0x20, 0x6c, 0x6f, 0x76, - 0x65, 0x2e, 0x6d, 0x61, 0x74, 0x68, 0x2e, 0x72, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x28, 0x29, 0x20, 0x65, 0x6e, - 0x64, 0x0a, 0x09, 0x65, 0x6e, 0x64, 0x0a, 0x09, 0x69, 0x66, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x6c, 0x6f, 0x61, 0x64, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x6c, 0x6f, 0x61, 0x64, 0x28, 0x61, 0x72, 0x67, 0x29, 0x20, 0x65, 0x6e, @@ -929,11 +947,11 @@ const unsigned char boot_lua[] = 0x65, 0x6e, 0x0a, 0x09, 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x70, 0x75, 0x6d, 0x70, 0x28, 0x29, 0x0a, - 0x09, 0x09, 0x09, 0x66, 0x6f, 0x72, 0x20, 0x6e, 0x2c, 0x61, 0x2c, 0x62, 0x2c, 0x63, 0x2c, 0x64, 0x2c, 0x65, - 0x20, 0x69, 0x6e, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x70, 0x6f, 0x6c, - 0x6c, 0x28, 0x29, 0x20, 0x64, 0x6f, 0x0a, - 0x09, 0x09, 0x09, 0x09, 0x69, 0x66, 0x20, 0x6e, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x71, 0x75, 0x69, 0x74, 0x22, - 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x09, 0x09, 0x09, 0x66, 0x6f, 0x72, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x61, 0x2c, 0x62, 0x2c, 0x63, + 0x2c, 0x64, 0x2c, 0x65, 0x2c, 0x66, 0x20, 0x69, 0x6e, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x2e, 0x70, 0x6f, 0x6c, 0x6c, 0x28, 0x29, 0x20, 0x64, 0x6f, 0x0a, + 0x09, 0x09, 0x09, 0x09, 0x69, 0x66, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x71, 0x75, + 0x69, 0x74, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x71, 0x75, 0x69, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x71, 0x75, 0x69, 0x74, 0x28, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, @@ -941,7 +959,7 @@ const unsigned char boot_lua[] = 0x09, 0x09, 0x09, 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x73, 0x5b, - 0x6e, 0x5d, 0x28, 0x61, 0x2c, 0x62, 0x2c, 0x63, 0x2c, 0x64, 0x2c, 0x65, 0x29, 0x0a, + 0x6e, 0x61, 0x6d, 0x65, 0x5d, 0x28, 0x61, 0x2c, 0x62, 0x2c, 0x63, 0x2c, 0x64, 0x2c, 0x65, 0x2c, 0x66, 0x29, 0x0a, 0x09, 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, 0x09, 0x09, 0x2d, 0x2d, 0x20, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x20, 0x64, 0x74, 0x2c, 0x20, 0x61, 0x73, @@ -961,12 +979,13 @@ const unsigned char boot_lua[] = 0x29, 0x20, 0x65, 0x6e, 0x64, 0x20, 0x2d, 0x2d, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x70, 0x61, 0x73, 0x73, 0x20, 0x30, 0x20, 0x69, 0x66, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x74, 0x69, 0x6d, 0x65, 0x72, 0x20, 0x69, 0x73, 0x20, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x0a, - 0x09, 0x09, 0x69, 0x66, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x20, 0x61, - 0x6e, 0x64, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x20, 0x61, - 0x6e, 0x64, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x69, - 0x73, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x28, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x09, 0x09, 0x69, 0x66, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, + 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, + 0x2e, 0x69, 0x73, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x28, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x09, 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x63, - 0x6c, 0x65, 0x61, 0x72, 0x28, 0x29, 0x0a, + 0x6c, 0x65, 0x61, 0x72, 0x28, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, + 0x2e, 0x67, 0x65, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x6f, 0x6c, 0x6f, + 0x72, 0x28, 0x29, 0x29, 0x0a, 0x09, 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x09, 0x09, 0x09, 0x69, 0x66, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x64, 0x72, 0x61, 0x77, 0x20, 0x74, 0x68, @@ -983,4289 +1002,6 @@ const unsigned char boot_lua[] = 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a, - 0x2d, 0x2d, 0x20, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x73, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x2e, 0x0a, - 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, - 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, - 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, - 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a, - 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x6e, 0x6f, 0x67, 0x61, - 0x6d, 0x65, 0x28, 0x29, 0x0a, - 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x61, 0x62, 0x79, 0x5f, 0x70, 0x6e, 0x67, 0x20, 0x3d, 0x0a, - 0x09, 0x22, 0x69, 0x56, 0x42, 0x4f, 0x52, 0x77, 0x30, 0x4b, 0x47, 0x67, 0x6f, 0x41, 0x41, 0x41, 0x41, 0x4e, - 0x53, 0x55, 0x68, 0x45, 0x55, 0x67, 0x41, 0x41, 0x41, 0x49, 0x41, 0x41, 0x41, 0x41, 0x43, 0x41, 0x43, 0x41, - 0x59, 0x41, 0x41, 0x41, 0x44, 0x44, 0x50, 0x6d, 0x48, 0x4c, 0x41, 0x41, 0x41, 0x4c, 0x31, 0x6b, 0x6c, 0x45, - 0x51, 0x56, 0x52, 0x34, 0x6e, 0x4f, 0x32, 0x64, 0x65, 0x5a, 0x41, 0x55, 0x31, 0x52, 0x33, 0x48, 0x50, 0x7a, - 0x33, 0x58, 0x5c, 0x0a, - 0x09, 0x33, 0x72, 0x75, 0x7a, 0x75, 0x79, 0x77, 0x45, 0x58, 0x5a, 0x56, 0x4c, 0x42, 0x4a, 0x48, 0x41, 0x69, - 0x6c, 0x66, 0x55, 0x70, 0x41, 0x51, 0x4e, 0x47, 0x6f, 0x31, 0x52, 0x50, 0x44, 0x41, 0x78, 0x4b, 0x69, 0x61, - 0x4b, 0x6b, 0x70, 0x51, 0x48, 0x6c, 0x5a, 0x42, 0x4b, 0x68, 0x54, 0x49, 0x52, 0x6a, 0x53, 0x61, 0x57, 0x6c, - 0x43, 0x6d, 0x72, 0x72, 0x43, 0x4a, 0x42, 0x44, 0x52, 0x37, 0x52, 0x61, 0x4d, 0x53, 0x55, 0x42, 0x78, 0x36, - 0x78, 0x5c, 0x0a, - 0x09, 0x45, 0x6c, 0x6d, 0x68, 0x43, 0x49, 0x6f, 0x67, 0x69, 0x38, 0x64, 0x4b, 0x46, 0x45, 0x51, 0x45, 0x59, - 0x57, 0x47, 0x58, 0x76, 0x61, 0x2b, 0x5a, 0x6e, 0x75, 0x6e, 0x70, 0x2f, 0x4e, 0x47, 0x7a, 0x62, 0x4f, 0x2f, - 0x73, 0x7a, 0x75, 0x77, 0x63, 0x2f, 0x58, 0x5a, 0x33, 0x39, 0x72, 0x31, 0x50, 0x31, 0x64, 0x54, 0x32, 0x64, - 0x72, 0x2f, 0x2b, 0x39, 0x61, 0x2f, 0x37, 0x66, 0x66, 0x76, 0x31, 0x75, 0x35, 0x39, 0x6d, 0x6d, 0x69, 0x59, - 0x4b, 0x5c, 0x0a, - 0x09, 0x65, 0x58, 0x45, 0x4e, 0x74, 0x77, 0x4f, 0x4b, 0x34, 0x55, 0x55, 0x4a, 0x51, 0x48, 0x4b, 0x55, 0x41, - 0x43, 0x52, 0x48, 0x43, 0x55, 0x42, 0x79, 0x6c, 0x41, 0x41, 0x6b, 0x52, 0x77, 0x6c, 0x41, 0x63, 0x70, 0x51, - 0x41, 0x4a, 0x45, 0x63, 0x4a, 0x51, 0x48, 0x4b, 0x55, 0x41, 0x43, 0x52, 0x48, 0x43, 0x55, 0x42, 0x79, 0x6c, - 0x41, 0x41, 0x6b, 0x52, 0x77, 0x6c, 0x41, 0x63, 0x70, 0x51, 0x41, 0x4a, 0x45, 0x63, 0x4a, 0x51, 0x48, 0x4b, - 0x55, 0x5c, 0x0a, - 0x09, 0x41, 0x43, 0x52, 0x48, 0x43, 0x55, 0x42, 0x79, 0x6c, 0x41, 0x41, 0x6b, 0x52, 0x77, 0x6c, 0x41, 0x63, - 0x70, 0x51, 0x41, 0x4a, 0x45, 0x63, 0x4a, 0x51, 0x48, 0x4b, 0x55, 0x41, 0x43, 0x52, 0x48, 0x43, 0x55, 0x42, - 0x79, 0x6c, 0x41, 0x41, 0x6b, 0x52, 0x77, 0x6c, 0x41, 0x63, 0x70, 0x51, 0x41, 0x4a, 0x45, 0x63, 0x4a, 0x51, - 0x48, 0x4b, 0x55, 0x41, 0x43, 0x52, 0x48, 0x43, 0x55, 0x42, 0x79, 0x6c, 0x41, 0x41, 0x6b, 0x52, 0x77, 0x6c, - 0x41, 0x5c, 0x0a, - 0x09, 0x63, 0x6a, 0x7a, 0x44, 0x37, 0x55, 0x43, 0x32, 0x59, 0x4e, 0x52, 0x57, 0x4f, 0x32, 0x4c, 0x48, 0x50, - 0x57, 0x4f, 0x75, 0x49, 0x33, 0x61, 0x63, 0x77, 0x6c, 0x45, 0x42, 0x61, 0x4a, 0x72, 0x6d, 0x70, 0x4c, 0x6b, - 0x52, 0x51, 0x2f, 0x69, 0x54, 0x39, 0x54, 0x32, 0x62, 0x6c, 0x77, 0x42, 0x58, 0x41, 0x4d, 0x63, 0x41, 0x54, - 0x77, 0x4c, 0x2f, 0x69, 0x4f, 0x36, 0x76, 0x41, 0x4a, 0x34, 0x47, 0x4c, 0x67, 0x51, 0x2b, 0x41, 0x33, 0x34, - 0x41, 0x5c, 0x0a, - 0x09, 0x37, 0x41, 0x49, 0x6d, 0x41, 0x39, 0x63, 0x43, 0x52, 0x63, 0x41, 0x7a, 0x77, 0x45, 0x64, 0x4f, 0x50, - 0x43, 0x4d, 0x6e, 0x35, 0x33, 0x52, 0x51, 0x4b, 0x55, 0x44, 0x79, 0x33, 0x41, 0x4b, 0x73, 0x74, 0x76, 0x33, - 0x2f, 0x70, 0x47, 0x33, 0x37, 0x61, 0x65, 0x43, 0x69, 0x36, 0x50, 0x59, 0x30, 0x34, 0x46, 0x74, 0x41, 0x45, - 0x50, 0x67, 0x59, 0x79, 0x49, 0x76, 0x75, 0x72, 0x77, 0x4b, 0x2b, 0x4b, 0x39, 0x62, 0x46, 0x31, 0x46, 0x45, - 0x43, 0x5c, 0x0a, - 0x09, 0x47, 0x41, 0x54, 0x62, 0x32, 0x33, 0x2b, 0x62, 0x62, 0x58, 0x63, 0x6a, 0x38, 0x48, 0x4a, 0x30, 0x65, - 0x79, 0x47, 0x39, 0x6b, 0x51, 0x39, 0x51, 0x43, 0x7a, 0x77, 0x48, 0x2f, 0x49, 0x6e, 0x65, 0x79, 0x41, 0x64, - 0x34, 0x54, 0x5a, 0x43, 0x4c, 0x47, 0x61, 0x45, 0x79, 0x67, 0x63, 0x6c, 0x78, 0x4f, 0x6a, 0x44, 0x54, 0x39, - 0x76, 0x2b, 0x7a, 0x57, 0x47, 0x39, 0x34, 0x4d, 0x66, 0x42, 0x77, 0x54, 0x4e, 0x67, 0x6c, 0x77, 0x44, 0x6a, - 0x67, 0x5c, 0x0a, - 0x09, 0x5a, 0x74, 0x75, 0x2b, 0x52, 0x75, 0x41, 0x78, 0x6b, 0x51, 0x36, 0x6d, 0x69, 0x30, 0x6f, 0x42, 0x45, - 0x6d, 0x42, 0x37, 0x2b, 0x32, 0x2b, 0x4b, 0x4f, 0x66, 0x52, 0x34, 0x39, 0x4f, 0x38, 0x39, 0x77, 0x48, 0x6a, - 0x62, 0x2f, 0x6a, 0x58, 0x41, 0x4a, 0x75, 0x44, 0x76, 0x51, 0x4b, 0x35, 0x74, 0x2f, 0x2b, 0x2b, 0x41, 0x4c, - 0x67, 0x45, 0x75, 0x5a, 0x6f, 0x7a, 0x6d, 0x5a, 0x49, 0x5a, 0x69, 0x74, 0x47, 0x55, 0x43, 0x6f, 0x77, 0x4c, - 0x49, 0x5c, 0x0a, - 0x09, 0x42, 0x77, 0x35, 0x68, 0x5a, 0x65, 0x51, 0x41, 0x74, 0x6d, 0x47, 0x6c, 0x43, 0x46, 0x4f, 0x78, 0x6b, - 0x76, 0x75, 0x65, 0x6c, 0x36, 0x67, 0x4e, 0x6d, 0x49, 0x4c, 0x31, 0x72, 0x58, 0x2f, 0x4c, 0x5a, 0x71, 0x59, - 0x6d, 0x47, 0x74, 0x37, 0x77, 0x6e, 0x44, 0x4c, 0x50, 0x45, 0x62, 0x2b, 0x79, 0x4d, 0x68, 0x4e, 0x6f, 0x65, - 0x35, 0x75, 0x79, 0x6a, 0x61, 0x76, 0x6f, 0x6a, 0x58, 0x7a, 0x6f, 0x66, 0x66, 0x76, 0x76, 0x70, 0x65, 0x2f, - 0x7a, 0x5c, 0x0a, - 0x09, 0x75, 0x78, 0x38, 0x49, 0x41, 0x33, 0x2b, 0x31, 0x37, 0x64, 0x4f, 0x42, 0x47, 0x77, 0x45, 0x44, 0x42, - 0x6e, 0x38, 0x47, 0x54, 0x67, 0x6b, 0x6b, 0x46, 0x59, 0x51, 0x4c, 0x49, 0x4f, 0x61, 0x6d, 0x35, 0x77, 0x49, - 0x6e, 0x70, 0x47, 0x6d, 0x71, 0x6d, 0x4f, 0x48, 0x4a, 0x73, 0x39, 0x78, 0x75, 0x32, 0x77, 0x34, 0x42, 0x70, - 0x63, 0x42, 0x39, 0x57, 0x4a, 0x6d, 0x2f, 0x48, 0x6a, 0x6f, 0x42, 0x44, 0x61, 0x67, 0x47, 0x4b, 0x6d, 0x33, - 0x37, 0x5c, 0x0a, - 0x09, 0x58, 0x77, 0x46, 0x4f, 0x6a, 0x66, 0x37, 0x73, 0x6d, 0x45, 0x41, 0x72, 0x30, 0x41, 0x45, 0x30, 0x41, - 0x51, 0x65, 0x41, 0x77, 0x37, 0x45, 0x43, 0x47, 0x51, 0x70, 0x42, 0x43, 0x50, 0x38, 0x45, 0x52, 0x47, 0x39, - 0x4b, 0x77, 0x38, 0x6f, 0x73, 0x33, 0x65, 0x48, 0x59, 0x78, 0x55, 0x59, 0x66, 0x72, 0x63, 0x41, 0x48, 0x77, - 0x48, 0x2b, 0x77, 0x53, 0x68, 0x46, 0x37, 0x65, 0x77, 0x37, 0x45, 0x43, 0x73, 0x48, 0x52, 0x4f, 0x42, 0x4d, - 0x70, 0x5c, 0x0a, - 0x09, 0x41, 0x4a, 0x75, 0x69, 0x56, 0x77, 0x42, 0x33, 0x4f, 0x33, 0x61, 0x68, 0x30, 0x55, 0x38, 0x45, 0x36, - 0x31, 0x4f, 0x79, 0x6c, 0x47, 0x6a, 0x6d, 0x30, 0x53, 0x34, 0x43, 0x4a, 0x2b, 0x4e, 0x73, 0x4b, 0x4a, 0x4c, - 0x55, 0x4b, 0x75, 0x43, 0x75, 0x49, 0x62, 0x6a, 0x4f, 0x61, 0x4d, 0x49, 0x46, 0x4c, 0x4d, 0x61, 0x71, 0x4f, - 0x33, 0x43, 0x4c, 0x76, 0x70, 0x41, 0x51, 0x62, 0x47, 0x2f, 0x2f, 0x63, 0x67, 0x54, 0x66, 0x78, 0x43, 0x68, - 0x6d, 0x5c, 0x0a, - 0x09, 0x4c, 0x6c, 0x59, 0x6d, 0x56, 0x42, 0x69, 0x69, 0x55, 0x34, 0x41, 0x53, 0x59, 0x49, 0x48, 0x67, 0x61, - 0x34, 0x78, 0x32, 0x7a, 0x68, 0x64, 0x70, 0x58, 0x4c, 0x51, 0x41, 0x76, 0x6f, 0x31, 0x36, 0x2b, 0x7a, 0x4f, - 0x6c, 0x63, 0x76, 0x41, 0x67, 0x36, 0x53, 0x4f, 0x36, 0x47, 0x48, 0x68, 0x61, 0x4d, 0x6f, 0x47, 0x4f, 0x4e, - 0x4c, 0x66, 0x79, 0x35, 0x71, 0x61, 0x74, 0x62, 0x4b, 0x37, 0x35, 0x6c, 0x4c, 0x71, 0x47, 0x4a, 0x67, 0x4b, - 0x36, 0x5c, 0x0a, - 0x09, 0x7a, 0x74, 0x67, 0x79, 0x50, 0x37, 0x4f, 0x6e, 0x54, 0x65, 0x62, 0x43, 0x63, 0x2b, 0x59, 0x77, 0x59, - 0x38, 0x6f, 0x45, 0x77, 0x57, 0x36, 0x4b, 0x34, 0x55, 0x68, 0x7a, 0x4b, 0x32, 0x39, 0x73, 0x66, 0x4a, 0x39, - 0x33, 0x50, 0x39, 0x7a, 0x4a, 0x77, 0x66, 0x70, 0x47, 0x39, 0x46, 0x43, 0x59, 0x69, 0x72, 0x49, 0x53, 0x71, - 0x71, 0x5a, 0x50, 0x59, 0x66, 0x34, 0x35, 0x63, 0x35, 0x67, 0x78, 0x4f, 0x61, 0x6b, 0x53, 0x73, 0x53, 0x37, - 0x53, 0x5c, 0x0a, - 0x09, 0x52, 0x32, 0x47, 0x6c, 0x67, 0x47, 0x67, 0x65, 0x59, 0x44, 0x56, 0x57, 0x4b, 0x39, 0x71, 0x41, 0x68, - 0x4d, 0x4a, 0x68, 0x56, 0x6a, 0x32, 0x33, 0x6a, 0x69, 0x64, 0x65, 0x65, 0x6f, 0x76, 0x75, 0x59, 0x50, 0x7a, - 0x37, 0x6e, 0x48, 0x66, 0x6d, 0x62, 0x4f, 0x36, 0x36, 0x39, 0x56, 0x71, 0x4f, 0x48, 0x54, 0x66, 0x47, 0x4d, - 0x56, 0x39, 0x46, 0x6f, 0x6f, 0x66, 0x43, 0x50, 0x50, 0x4c, 0x73, 0x79, 0x7a, 0x7a, 0x31, 0x79, 0x72, 0x38, - 0x4a, 0x5c, 0x0a, - 0x09, 0x36, 0x71, 0x47, 0x34, 0x34, 0x63, 0x34, 0x2f, 0x71, 0x34, 0x72, 0x66, 0x4c, 0x76, 0x6b, 0x78, 0x34, - 0x79, 0x76, 0x4b, 0x45, 0x70, 0x6c, 0x37, 0x42, 0x62, 0x67, 0x38, 0x57, 0x30, 0x73, 0x42, 0x68, 0x66, 0x45, - 0x4f, 0x64, 0x48, 0x52, 0x31, 0x73, 0x32, 0x6a, 0x35, 0x53, 0x6c, 0x59, 0x39, 0x76, 0x79, 0x35, 0x68, 0x35, - 0x41, 0x4f, 0x73, 0x33, 0x37, 0x4b, 0x44, 0x42, 0x58, 0x66, 0x65, 0x77, 0x34, 0x65, 0x66, 0x37, 0x58, 0x48, - 0x63, 0x5c, 0x0a, - 0x09, 0x51, 0x61, 0x64, 0x70, 0x37, 0x2b, 0x7a, 0x6d, 0x68, 0x74, 0x38, 0x38, 0x79, 0x4b, 0x4e, 0x72, 0x33, - 0x30, 0x67, 0x59, 0x2b, 0x51, 0x42, 0x76, 0x76, 0x31, 0x66, 0x44, 0x67, 0x6a, 0x74, 0x57, 0x55, 0x4c, 0x74, - 0x37, 0x62, 0x36, 0x4a, 0x67, 0x63, 0x5a, 0x2b, 0x68, 0x45, 0x34, 0x67, 0x57, 0x67, 0x44, 0x2f, 0x65, 0x67, - 0x57, 0x55, 0x72, 0x48, 0x2b, 0x57, 0x44, 0x32, 0x6c, 0x31, 0x4a, 0x47, 0x32, 0x70, 0x74, 0x37, 0x2b, 0x53, - 0x57, 0x5c, 0x0a, - 0x09, 0x75, 0x78, 0x2b, 0x6d, 0x72, 0x71, 0x48, 0x4a, 0x45, 0x63, 0x64, 0x45, 0x59, 0x4a, 0x6f, 0x6d, 0x53, - 0x78, 0x39, 0x59, 0x52, 0x63, 0x33, 0x4f, 0x33, 0x55, 0x6d, 0x66, 0x30, 0x39, 0x7a, 0x57, 0x77, 0x65, 0x4b, - 0x37, 0x48, 0x36, 0x61, 0x68, 0x71, 0x54, 0x56, 0x65, 0x6b, 0x48, 0x47, 0x4f, 0x4f, 0x42, 0x65, 0x48, 0x6f, - 0x53, 0x67, 0x46, 0x39, 0x4f, 0x4f, 0x74, 0x54, 0x64, 0x75, 0x6f, 0x66, 0x76, 0x2f, 0x44, 0x6c, 0x49, 0x32, - 0x31, 0x5c, 0x0a, - 0x09, 0x74, 0x48, 0x65, 0x77, 0x63, 0x73, 0x33, 0x61, 0x6a, 0x4a, 0x30, 0x53, 0x78, 0x65, 0x73, 0x62, 0x33, - 0x32, 0x66, 0x54, 0x39, 0x74, 0x71, 0x55, 0x7a, 0x32, 0x74, 0x73, 0x61, 0x57, 0x50, 0x6c, 0x45, 0x33, 0x48, - 0x76, 0x71, 0x77, 0x4c, 0x45, 0x74, 0x61, 0x55, 0x4d, 0x69, 0x77, 0x42, 0x57, 0x76, 0x2f, 0x42, 0x36, 0x32, - 0x67, 0x5a, 0x66, 0x33, 0x37, 0x69, 0x46, 0x2f, 0x59, 0x63, 0x61, 0x30, 0x6a, 0x35, 0x66, 0x4a, 0x4a, 0x6e, - 0x63, 0x5c, 0x0a, - 0x09, 0x31, 0x36, 0x76, 0x56, 0x37, 0x33, 0x4b, 0x77, 0x6f, 0x58, 0x47, 0x67, 0x51, 0x78, 0x55, 0x49, 0x6a, - 0x43, 0x66, 0x52, 0x41, 0x69, 0x69, 0x4e, 0x33, 0x56, 0x48, 0x58, 0x30, 0x45, 0x54, 0x74, 0x46, 0x31, 0x39, - 0x6c, 0x5a, 0x48, 0x54, 0x39, 0x6c, 0x68, 0x30, 0x5a, 0x6e, 0x53, 0x2b, 0x43, 0x66, 0x58, 0x58, 0x31, 0x66, - 0x4c, 0x37, 0x33, 0x36, 0x37, 0x54, 0x50, 0x4e, 0x30, 0x32, 0x54, 0x64, 0x77, 0x5a, 0x4f, 0x46, 0x56, 0x31, - 0x41, 0x5c, 0x0a, - 0x09, 0x65, 0x64, 0x71, 0x47, 0x42, 0x30, 0x47, 0x49, 0x41, 0x47, 0x7a, 0x4a, 0x56, 0x55, 0x58, 0x73, 0x73, - 0x53, 0x2f, 0x32, 0x31, 0x32, 0x56, 0x73, 0x66, 0x34, 0x38, 0x44, 0x4e, 0x70, 0x78, 0x6d, 0x37, 0x34, 0x48, - 0x44, 0x47, 0x64, 0x76, 0x59, 0x76, 0x65, 0x39, 0x67, 0x76, 0x45, 0x4e, 0x78, 0x38, 0x31, 0x4b, 0x5a, 0x49, - 0x6a, 0x49, 0x46, 0x38, 0x41, 0x4f, 0x2b, 0x32, 0x4a, 0x33, 0x74, 0x6e, 0x5a, 0x6c, 0x33, 0x6a, 0x47, 0x6c, - 0x70, 0x5c, 0x0a, - 0x09, 0x37, 0x38, 0x7a, 0x59, 0x68, 0x74, 0x4f, 0x30, 0x74, 0x48, 0x64, 0x6b, 0x62, 0x4b, 0x4d, 0x74, 0x2f, - 0x72, 0x50, 0x4a, 0x53, 0x67, 0x45, 0x4d, 0x6d, 0x48, 0x73, 0x74, 0x39, 0x78, 0x64, 0x6e, 0x62, 0x4c, 0x69, - 0x69, 0x64, 0x4d, 0x43, 0x73, 0x78, 0x62, 0x41, 0x79, 0x78, 0x67, 0x47, 0x66, 0x45, 0x74, 0x78, 0x58, 0x76, - 0x30, 0x2b, 0x70, 0x55, 0x34, 0x67, 0x55, 0x77, 0x4e, 0x69, 0x42, 0x64, 0x70, 0x34, 0x30, 0x6f, 0x52, 0x4b, - 0x33, 0x5c, 0x0a, - 0x09, 0x4f, 0x37, 0x50, 0x4c, 0x7a, 0x6a, 0x67, 0x78, 0x33, 0x54, 0x34, 0x6c, 0x34, 0x70, 0x67, 0x32, 0x38, - 0x54, 0x68, 0x63, 0x47, 0x58, 0x61, 0x4a, 0x4f, 0x7a, 0x6c, 0x2b, 0x7a, 0x61, 0x41, 0x66, 0x78, 0x4a, 0x51, - 0x45, 0x48, 0x4b, 0x38, 0x4b, 0x74, 0x6a, 0x6b, 0x35, 0x66, 0x71, 0x44, 0x6a, 0x4a, 0x55, 0x55, 0x46, 0x6e, - 0x48, 0x76, 0x71, 0x4b, 0x57, 0x7a, 0x59, 0x2b, 0x6c, 0x46, 0x61, 0x39, 0x6e, 0x4e, 0x38, 0x58, 0x75, 0x61, - 0x64, 0x5c, 0x0a, - 0x09, 0x4d, 0x54, 0x75, 0x6c, 0x63, 0x77, 0x34, 0x32, 0x4e, 0x4c, 0x4c, 0x70, 0x67, 0x30, 0x2f, 0x34, 0x71, - 0x71, 0x36, 0x65, 0x6c, 0x72, 0x59, 0x4f, 0x75, 0x67, 0x4a, 0x42, 0x79, 0x35, 0x62, 0x58, 0x69, 0x38, 0x75, - 0x6c, 0x55, 0x5a, 0x43, 0x66, 0x52, 0x32, 0x6c, 0x78, 0x49, 0x65, 0x50, 0x4b, 0x53, 0x7a, 0x6c, 0x2b, 0x2f, - 0x46, 0x69, 0x6d, 0x54, 0x54, 0x79, 0x4f, 0x6f, 0x6f, 0x4b, 0x38, 0x51, 0x61, 0x7a, 0x32, 0x70, 0x61, 0x79, - 0x6b, 0x5c, 0x0a, - 0x09, 0x69, 0x4c, 0x4f, 0x72, 0x54, 0x6b, 0x36, 0x72, 0x47, 0x41, 0x69, 0x51, 0x6c, 0x2b, 0x50, 0x6a, 0x76, - 0x4e, 0x4e, 0x6e, 0x78, 0x54, 0x73, 0x38, 0x43, 0x2f, 0x67, 0x6e, 0x59, 0x44, 0x67, 0x74, 0x41, 0x6b, 0x63, - 0x46, 0x59, 0x48, 0x4e, 0x75, 0x46, 0x76, 0x31, 0x37, 0x30, 0x68, 0x37, 0x6c, 0x7a, 0x75, 0x73, 0x75, 0x5a, - 0x2b, 0x4f, 0x32, 0x6a, 0x39, 0x4f, 0x71, 0x30, 0x76, 0x7a, 0x70, 0x67, 0x67, 0x73, 0x70, 0x4b, 0x53, 0x70, - 0x49, 0x5c, 0x0a, - 0x09, 0x4f, 0x6e, 0x77, 0x6f, 0x48, 0x4f, 0x62, 0x79, 0x32, 0x31, 0x66, 0x51, 0x6d, 0x6b, 0x4b, 0x2b, 0x51, - 0x64, 0x4d, 0x30, 0x4c, 0x6a, 0x33, 0x76, 0x4c, 0x46, 0x59, 0x75, 0x57, 0x35, 0x79, 0x53, 0x62, 0x33, 0x64, - 0x63, 0x74, 0x79, 0x42, 0x74, 0x41, 0x64, 0x78, 0x38, 0x31, 0x66, 0x63, 0x53, 0x69, 0x57, 0x34, 0x35, 0x63, - 0x41, 0x50, 0x77, 0x4b, 0x2b, 0x42, 0x35, 0x6f, 0x37, 0x62, 0x61, 0x73, 0x53, 0x46, 0x6d, 0x6a, 0x6e, 0x30, - 0x43, 0x5c, 0x0a, - 0x09, 0x62, 0x47, 0x50, 0x6e, 0x48, 0x73, 0x44, 0x71, 0x43, 0x54, 0x73, 0x2f, 0x58, 0x74, 0x67, 0x5a, 0x55, - 0x79, 0x5a, 0x77, 0x36, 0x38, 0x4a, 0x4c, 0x55, 0x72, 0x37, 0x47, 0x39, 0x45, 0x6e, 0x48, 0x73, 0x2b, 0x53, - 0x48, 0x33, 0x30, 0x2f, 0x70, 0x6e, 0x4b, 0x62, 0x57, 0x39, 0x70, 0x51, 0x69, 0x48, 0x36, 0x77, 0x69, 0x32, - 0x61, 0x76, 0x56, 0x37, 0x31, 0x4c, 0x66, 0x31, 0x4a, 0x4c, 0x53, 0x65, 0x62, 0x4e, 0x4f, 0x6d, 0x73, 0x54, - 0x4e, 0x5c, 0x0a, - 0x09, 0x56, 0x31, 0x34, 0x30, 0x65, 0x4d, 0x41, 0x59, 0x5a, 0x6b, 0x36, 0x64, 0x79, 0x4f, 0x4b, 0x72, 0x4c, - 0x68, 0x34, 0x73, 0x57, 0x43, 0x58, 0x57, 0x61, 0x4b, 0x51, 0x4a, 0x4b, 0x56, 0x38, 0x67, 0x41, 0x55, 0x37, - 0x6e, 0x41, 0x61, 0x34, 0x44, 0x66, 0x6f, 0x33, 0x56, 0x42, 0x7a, 0x41, 0x68, 0x53, 0x36, 0x39, 0x66, 0x77, - 0x45, 0x31, 0x58, 0x4a, 0x50, 0x2b, 0x77, 0x5a, 0x6b, 0x36, 0x64, 0x79, 0x4a, 0x72, 0x37, 0x66, 0x6b, 0x6d, - 0x75, 0x5c, 0x0a, - 0x09, 0x72, 0x31, 0x2f, 0x42, 0x49, 0x69, 0x48, 0x6a, 0x79, 0x6b, 0x75, 0x70, 0x54, 0x4b, 0x4d, 0x52, 0x36, - 0x5a, 0x69, 0x78, 0x35, 0x57, 0x6c, 0x6c, 0x4e, 0x70, 0x66, 0x39, 0x35, 0x47, 0x6f, 0x57, 0x58, 0x5a, 0x62, - 0x38, 0x43, 0x4c, 0x43, 0x71, 0x61, 0x5a, 0x4e, 0x35, 0x64, 0x4d, 0x56, 0x53, 0x63, 0x6e, 0x7a, 0x65, 0x5a, - 0x49, 0x4c, 0x6e, 0x41, 0x41, 0x2b, 0x6c, 0x37, 0x46, 0x51, 0x43, 0x48, 0x47, 0x73, 0x4e, 0x6a, 0x4b, 0x59, - 0x41, 0x5c, 0x0a, - 0x09, 0x37, 0x77, 0x46, 0x6e, 0x70, 0x6e, 0x4c, 0x65, 0x66, 0x32, 0x74, 0x71, 0x57, 0x62, 0x6c, 0x6d, 0x4c, - 0x54, 0x76, 0x33, 0x37, 0x42, 0x76, 0x77, 0x75, 0x4c, 0x2b, 0x6f, 0x6b, 0x4d, 0x56, 0x58, 0x58, 0x38, 0x79, - 0x69, 0x79, 0x79, 0x37, 0x41, 0x36, 0x30, 0x6e, 0x76, 0x69, 0x2f, 0x57, 0x76, 0x54, 0x56, 0x75, 0x35, 0x38, - 0x34, 0x39, 0x2f, 0x54, 0x6a, 0x71, 0x38, 0x53, 0x39, 0x4e, 0x59, 0x76, 0x57, 0x49, 0x70, 0x33, 0x7a, 0x6c, - 0x74, 0x5c, 0x0a, - 0x09, 0x35, 0x75, 0x43, 0x42, 0x34, 0x37, 0x42, 0x78, 0x32, 0x38, 0x63, 0x38, 0x39, 0x4f, 0x53, 0x4c, 0x2f, - 0x4f, 0x2f, 0x4c, 0x2f, 0x51, 0x4d, 0x65, 0x39, 0x78, 0x63, 0x56, 0x73, 0x75, 0x53, 0x61, 0x53, 0x37, 0x6a, - 0x2b, 0x30, 0x67, 0x76, 0x77, 0x65, 0x46, 0x4c, 0x71, 0x4d, 0x74, 0x45, 0x4e, 0x35, 0x44, 0x76, 0x31, 0x43, - 0x58, 0x42, 0x61, 0x41, 0x44, 0x71, 0x51, 0x6c, 0x4a, 0x52, 0x6a, 0x32, 0x62, 0x6c, 0x6e, 0x48, 0x35, 0x74, - 0x33, 0x5c, 0x0a, - 0x09, 0x66, 0x45, 0x70, 0x64, 0x66, 0x52, 0x4e, 0x36, 0x4b, 0x4d, 0x53, 0x59, 0x30, 0x68, 0x4b, 0x71, 0x70, - 0x6b, 0x2f, 0x6d, 0x7a, 0x47, 0x39, 0x4f, 0x78, 0x2b, 0x66, 0x4e, 0x50, 0x4b, 0x76, 0x79, 0x7a, 0x4c, 0x71, - 0x33, 0x2b, 0x63, 0x4e, 0x6a, 0x7a, 0x32, 0x45, 0x59, 0x6b, 0x59, 0x54, 0x68, 0x78, 0x70, 0x62, 0x35, 0x75, - 0x66, 0x66, 0x32, 0x52, 0x63, 0x77, 0x39, 0x49, 0x32, 0x36, 0x47, 0x4c, 0x47, 0x6c, 0x4d, 0x30, 0x32, 0x54, - 0x6e, 0x5c, 0x0a, - 0x09, 0x6e, 0x76, 0x31, 0x73, 0x72, 0x71, 0x6e, 0x6c, 0x30, 0x4a, 0x46, 0x6d, 0x39, 0x46, 0x43, 0x49, 0x69, - 0x6a, 0x49, 0x2f, 0x73, 0x36, 0x64, 0x4e, 0x79, 0x76, 0x53, 0x2b, 0x74, 0x4a, 0x45, 0x71, 0x67, 0x42, 0x47, - 0x39, 0x46, 0x76, 0x32, 0x65, 0x72, 0x2b, 0x74, 0x34, 0x2f, 0x4d, 0x55, 0x33, 0x57, 0x62, 0x39, 0x6c, 0x42, - 0x38, 0x31, 0x74, 0x76, 0x52, 0x55, 0x33, 0x65, 0x62, 0x6b, 0x35, 0x7a, 0x44, 0x70, 0x70, 0x45, 0x76, 0x50, - 0x50, 0x5c, 0x0a, - 0x09, 0x6e, 0x73, 0x4f, 0x56, 0x38, 0x38, 0x39, 0x4e, 0x2b, 0x54, 0x4d, 0x7a, 0x78, 0x4f, 0x77, 0x43, 0x70, - 0x6f, 0x35, 0x55, 0x41, 0x65, 0x77, 0x44, 0x6a, 0x6e, 0x50, 0x45, 0x6f, 0x47, 0x43, 0x4f, 0x4e, 0x4c, 0x63, - 0x53, 0x31, 0x45, 0x50, 0x6b, 0x35, 0x76, 0x67, 0x63, 0x71, 0x5a, 0x77, 0x61, 0x51, 0x6d, 0x34, 0x45, 0x6e, - 0x68, 0x70, 0x78, 0x70, 0x59, 0x41, 0x6f, 0x54, 0x7a, 0x6c, 0x73, 0x54, 0x78, 0x68, 0x6a, 0x53, 0x6b, 0x73, - 0x34, 0x5c, 0x0a, - 0x09, 0x64, 0x74, 0x79, 0x59, 0x62, 0x49, 0x72, 0x38, 0x49, 0x50, 0x41, 0x4c, 0x48, 0x48, 0x37, 0x47, 0x54, - 0x6c, 0x63, 0x45, 0x2f, 0x52, 0x35, 0x72, 0x54, 0x50, 0x7a, 0x50, 0x36, 0x54, 0x73, 0x32, 0x58, 0x70, 0x45, - 0x5a, 0x6e, 0x77, 0x49, 0x58, 0x41, 0x48, 0x58, 0x67, 0x37, 0x44, 0x51, 0x7a, 0x54, 0x71, 0x63, 0x41, 0x4f, - 0x72, 0x43, 0x4d, 0x4a, 0x44, 0x75, 0x44, 0x4b, 0x70, 0x4a, 0x6d, 0x46, 0x39, 0x48, 0x49, 0x64, 0x33, 0x71, - 0x38, 0x5c, 0x0a, - 0x09, 0x6f, 0x47, 0x4d, 0x43, 0x63, 0x4d, 0x2b, 0x59, 0x61, 0x33, 0x63, 0x75, 0x61, 0x39, 0x4c, 0x56, 0x62, - 0x45, 0x4c, 0x45, 0x59, 0x46, 0x46, 0x52, 0x6a, 0x55, 0x48, 0x43, 0x6d, 0x69, 0x38, 0x6c, 0x4a, 0x53, 0x6a, - 0x4b, 0x73, 0x42, 0x4a, 0x41, 0x64, 0x74, 0x41, 0x74, 0x79, 0x72, 0x44, 0x6a, 0x41, 0x6a, 0x41, 0x30, 0x4e, - 0x79, 0x67, 0x42, 0x4f, 0x45, 0x33, 0x32, 0x43, 0x43, 0x44, 0x67, 0x4b, 0x79, 0x62, 0x6f, 0x7a, 0x5a, 0x38, - 0x51, 0x5c, 0x0a, - 0x09, 0x30, 0x64, 0x54, 0x38, 0x55, 0x77, 0x34, 0x69, 0x37, 0x42, 0x50, 0x67, 0x65, 0x48, 0x2b, 0x41, 0x7a, - 0x6c, 0x77, 0x2f, 0x59, 0x58, 0x66, 0x75, 0x54, 0x4e, 0x32, 0x54, 0x69, 0x79, 0x2f, 0x63, 0x54, 0x55, 0x36, - 0x6f, 0x4d, 0x2f, 0x72, 0x72, 0x77, 0x6d, 0x73, 0x45, 0x6e, 0x4c, 0x36, 0x63, 0x4c, 0x41, 0x6a, 0x72, 0x42, - 0x75, 0x32, 0x34, 0x41, 0x41, 0x4c, 0x65, 0x59, 0x69, 0x49, 0x75, 0x64, 0x77, 0x65, 0x41, 0x37, 0x73, 0x6c, - 0x48, 0x5c, 0x0a, - 0x09, 0x39, 0x2b, 0x54, 0x54, 0x6e, 0x6d, 0x66, 0x31, 0x44, 0x58, 0x57, 0x5a, 0x42, 0x72, 0x35, 0x51, 0x46, - 0x7a, 0x6e, 0x68, 0x4c, 0x6e, 0x4a, 0x43, 0x6e, 0x66, 0x6a, 0x43, 0x58, 0x58, 0x67, 0x4d, 0x6f, 0x55, 0x50, - 0x66, 0x52, 0x67, 0x73, 0x62, 0x75, 0x6e, 0x4c, 0x45, 0x64, 0x49, 0x4e, 0x7a, 0x58, 0x41, 0x41, 0x52, 0x6c, - 0x78, 0x75, 0x73, 0x5a, 0x73, 0x76, 0x2b, 0x78, 0x7a, 0x51, 0x33, 0x41, 0x56, 0x38, 0x52, 0x41, 0x56, 0x2f, - 0x76, 0x5c, 0x0a, - 0x09, 0x6e, 0x45, 0x75, 0x75, 0x53, 0x42, 0x68, 0x66, 0x75, 0x4e, 0x76, 0x32, 0x36, 0x38, 0x4a, 0x72, 0x42, - 0x4e, 0x48, 0x4d, 0x78, 0x49, 0x30, 0x32, 0x32, 0x59, 0x6a, 0x68, 0x38, 0x68, 0x44, 0x52, 0x50, 0x45, 0x52, - 0x63, 0x48, 0x69, 0x4b, 0x61, 0x47, 0x38, 0x50, 0x6c, 0x4a, 0x71, 0x4b, 0x35, 0x69, 0x66, 0x54, 0x38, 0x31, - 0x54, 0x79, 0x39, 0x32, 0x30, 0x66, 0x33, 0x75, 0x55, 0x30, 0x30, 0x7a, 0x5a, 0x38, 0x58, 0x6a, 0x44, 0x74, - 0x79, 0x5c, 0x0a, - 0x09, 0x4b, 0x43, 0x4f, 0x47, 0x66, 0x5a, 0x37, 0x41, 0x69, 0x4d, 0x76, 0x54, 0x54, 0x78, 0x51, 0x41, 0x48, - 0x6b, 0x50, 0x48, 0x61, 0x77, 0x54, 0x77, 0x47, 0x67, 0x45, 0x38, 0x68, 0x6f, 0x37, 0x62, 0x43, 0x4f, 0x47, - 0x4a, 0x36, 0x48, 0x67, 0x4d, 0x48, 0x5a, 0x63, 0x5a, 0x52, 0x6e, 0x4e, 0x77, 0x67, 0x47, 0x53, 0x6d, 0x68, - 0x4e, 0x30, 0x2b, 0x51, 0x75, 0x35, 0x63, 0x77, 0x6d, 0x34, 0x66, 0x68, 0x73, 0x73, 0x62, 0x2f, 0x56, 0x6b, - 0x52, 0x5c, 0x0a, - 0x09, 0x33, 0x52, 0x50, 0x70, 0x68, 0x69, 0x76, 0x39, 0x6c, 0x6a, 0x39, 0x67, 0x59, 0x57, 0x64, 0x4f, 0x71, - 0x5a, 0x43, 0x5a, 0x52, 0x6b, 0x55, 0x4a, 0x6f, 0x44, 0x6c, 0x54, 0x41, 0x32, 0x47, 0x33, 0x6a, 0x37, 0x44, - 0x62, 0x52, 0x33, 0x65, 0x63, 0x4f, 0x69, 0x58, 0x4e, 0x6a, 0x4b, 0x43, 0x6c, 0x30, 0x50, 0x69, 0x6f, 0x6d, - 0x5a, 0x45, 0x2b, 0x6f, 0x6e, 0x47, 0x5a, 0x52, 0x6d, 0x4a, 0x62, 0x70, 0x6f, 0x6b, 0x72, 0x51, 0x53, 0x6f, - 0x55, 0x5c, 0x0a, - 0x09, 0x63, 0x62, 0x6b, 0x78, 0x30, 0x51, 0x69, 0x35, 0x63, 0x34, 0x69, 0x6b, 0x48, 0x37, 0x6e, 0x4a, 0x55, - 0x6f, 0x57, 0x67, 0x4f, 0x52, 0x68, 0x46, 0x65, 0x66, 0x36, 0x6c, 0x49, 0x4c, 0x74, 0x48, 0x4d, 0x54, 0x56, - 0x58, 0x61, 0x6d, 0x33, 0x50, 0x57, 0x6c, 0x62, 0x50, 0x55, 0x31, 0x45, 0x30, 0x65, 0x4a, 0x44, 0x30, 0x45, - 0x46, 0x56, 0x57, 0x57, 0x79, 0x66, 0x49, 0x72, 0x71, 0x77, 0x63, 0x45, 0x47, 0x56, 0x59, 0x6c, 0x41, 0x42, - 0x71, 0x5c, 0x0a, - 0x09, 0x67, 0x41, 0x32, 0x43, 0x62, 0x4d, 0x76, 0x49, 0x64, 0x6c, 0x47, 0x47, 0x48, 0x52, 0x66, 0x41, 0x6c, - 0x4c, 0x46, 0x48, 0x4b, 0x77, 0x47, 0x58, 0x4f, 0x32, 0x31, 0x62, 0x59, 0x6f, 0x53, 0x39, 0x54, 0x43, 0x4b, - 0x72, 0x36, 0x7a, 0x59, 0x44, 0x4c, 0x77, 0x69, 0x30, 0x4c, 0x77, 0x73, 0x6d, 0x73, 0x46, 0x47, 0x55, 0x63, - 0x53, 0x45, 0x43, 0x73, 0x4b, 0x55, 0x43, 0x74, 0x77, 0x46, 0x48, 0x52, 0x46, 0x78, 0x44, 0x49, 0x72, 0x59, - 0x44, 0x5c, 0x0a, - 0x09, 0x39, 0x61, 0x4b, 0x4d, 0x69, 0x36, 0x36, 0x77, 0x62, 0x79, 0x44, 0x42, 0x4a, 0x46, 0x47, 0x4b, 0x70, - 0x48, 0x67, 0x4e, 0x2b, 0x72, 0x78, 0x55, 0x6a, 0x69, 0x4a, 0x4d, 0x41, 0x44, 0x61, 0x48, 0x58, 0x77, 0x49, - 0x65, 0x46, 0x48, 0x57, 0x64, 0x55, 0x59, 0x36, 0x42, 0x34, 0x48, 0x36, 0x57, 0x51, 0x6c, 0x4f, 0x41, 0x6d, - 0x41, 0x7a, 0x68, 0x79, 0x4a, 0x33, 0x63, 0x5a, 0x2b, 0x54, 0x79, 0x4f, 0x49, 0x4c, 0x72, 0x56, 0x49, 0x61, - 0x71, 0x5c, 0x0a, - 0x09, 0x7a, 0x64, 0x59, 0x41, 0x66, 0x6f, 0x51, 0x31, 0x61, 0x62, 0x52, 0x71, 0x2f, 0x55, 0x6d, 0x4f, 0x74, - 0x56, 0x69, 0x39, 0x67, 0x49, 0x55, 0x6c, 0x2f, 0x7a, 0x41, 0x45, 0x41, 0x72, 0x41, 0x35, 0x62, 0x32, 0x43, - 0x74, 0x71, 0x6e, 0x45, 0x69, 0x38, 0x42, 0x63, 0x45, 0x64, 0x6e, 0x4c, 0x49, 0x59, 0x68, 0x71, 0x42, 0x52, - 0x37, 0x42, 0x47, 0x56, 0x79, 0x39, 0x6b, 0x43, 0x4e, 0x59, 0x5a, 0x47, 0x74, 0x49, 0x31, 0x67, 0x33, 0x62, - 0x58, 0x5c, 0x0a, - 0x09, 0x39, 0x78, 0x6c, 0x74, 0x57, 0x77, 0x70, 0x63, 0x44, 0x56, 0x79, 0x44, 0x4e, 0x53, 0x76, 0x32, 0x36, - 0x46, 0x70, 0x77, 0x4b, 0x48, 0x6b, 0x61, 0x73, 0x47, 0x70, 0x4f, 0x31, 0x77, 0x4a, 0x76, 0x59, 0x36, 0x31, - 0x4b, 0x41, 0x73, 0x52, 0x2f, 0x38, 0x37, 0x4e, 0x6d, 0x77, 0x59, 0x68, 0x34, 0x32, 0x49, 0x56, 0x51, 0x45, - 0x47, 0x6a, 0x45, 0x33, 0x33, 0x56, 0x34, 0x56, 0x64, 0x42, 0x62, 0x38, 0x4c, 0x4d, 0x75, 0x58, 0x77, 0x6b, - 0x42, 0x5c, 0x0a, - 0x09, 0x58, 0x7a, 0x47, 0x6a, 0x76, 0x54, 0x65, 0x52, 0x68, 0x74, 0x6c, 0x67, 0x6f, 0x72, 0x32, 0x49, 0x4e, - 0x65, 0x6e, 0x44, 0x4f, 0x30, 0x54, 0x58, 0x46, 0x4f, 0x70, 0x68, 0x73, 0x43, 0x51, 0x2f, 0x4b, 0x78, 0x65, - 0x4e, 0x73, 0x6d, 0x4f, 0x2f, 0x51, 0x62, 0x33, 0x32, 0x48, 0x56, 0x78, 0x6d, 0x52, 0x50, 0x65, 0x47, 0x41, - 0x78, 0x52, 0x32, 0x4e, 0x32, 0x4b, 0x69, 0x45, 0x66, 0x51, 0x57, 0x48, 0x47, 0x30, 0x69, 0x44, 0x6e, 0x6f, - 0x4b, 0x5c, 0x0a, - 0x09, 0x4d, 0x45, 0x66, 0x42, 0x61, 0x6d, 0x54, 0x65, 0x63, 0x49, 0x42, 0x38, 0x76, 0x59, 0x58, 0x38, 0x59, - 0x43, 0x75, 0x2b, 0x63, 0x50, 0x63, 0x31, 0x6a, 0x59, 0x57, 0x56, 0x31, 0x52, 0x31, 0x35, 0x76, 0x63, 0x50, - 0x57, 0x52, 0x58, 0x37, 0x6e, 0x45, 0x7a, 0x48, 0x73, 0x2f, 0x51, 0x47, 0x69, 0x54, 0x61, 0x35, 0x48, 0x35, - 0x31, 0x62, 0x56, 0x4d, 0x4d, 0x6b, 0x4e, 0x64, 0x5a, 0x41, 0x62, 0x36, 0x6f, 0x44, 0x4f, 0x4f, 0x6b, 0x78, - 0x4e, 0x5c, 0x0a, - 0x09, 0x51, 0x2f, 0x66, 0x6b, 0x30, 0x31, 0x49, 0x77, 0x2f, 0x6d, 0x2f, 0x64, 0x76, 0x75, 0x4a, 0x43, 0x34, - 0x47, 0x77, 0x45, 0x54, 0x35, 0x2f, 0x71, 0x46, 0x4c, 0x6c, 0x36, 0x4f, 0x2f, 0x6c, 0x36, 0x4b, 0x2f, 0x6e, - 0x42, 0x56, 0x6a, 0x78, 0x47, 0x6e, 0x32, 0x35, 0x39, 0x2b, 0x38, 0x76, 0x62, 0x39, 0x2f, 0x4f, 0x4e, 0x45, - 0x36, 0x59, 0x4d, 0x6c, 0x32, 0x74, 0x48, 0x47, 0x58, 0x59, 0x42, 0x52, 0x46, 0x6d, 0x4c, 0x4e, 0x61, 0x79, - 0x73, 0x5c, 0x0a, - 0x09, 0x33, 0x32, 0x75, 0x67, 0x6d, 0x61, 0x61, 0x5a, 0x45, 0x2b, 0x71, 0x38, 0x4e, 0x30, 0x66, 0x76, 0x57, - 0x4b, 0x46, 0x37, 0x38, 0x6a, 0x42, 0x63, 0x58, 0x6f, 0x42, 0x6a, 0x73, 0x65, 0x59, 0x68, 0x6d, 0x42, 0x50, - 0x39, 0x7a, 0x57, 0x5a, 0x6b, 0x69, 0x43, 0x4b, 0x51, 0x70, 0x37, 0x64, 0x36, 0x43, 0x77, 0x49, 0x74, 0x37, - 0x6e, 0x79, 0x39, 0x46, 0x56, 0x63, 0x6b, 0x50, 0x46, 0x43, 0x59, 0x44, 0x63, 0x44, 0x75, 0x56, 0x50, 0x6f, - 0x79, 0x5c, 0x0a, - 0x09, 0x69, 0x47, 0x54, 0x59, 0x46, 0x34, 0x36, 0x30, 0x7a, 0x53, 0x74, 0x55, 0x68, 0x62, 0x58, 0x65, 0x37, - 0x72, 0x6c, 0x59, 0x77, 0x6a, 0x79, 0x45, 0x74, 0x51, 0x44, 0x6a, 0x49, 0x31, 0x69, 0x72, 0x61, 0x65, 0x45, - 0x35, 0x5a, 0x56, 0x35, 0x73, 0x52, 0x74, 0x4a, 0x4f, 0x47, 0x54, 0x41, 0x64, 0x4f, 0x42, 0x6c, 0x72, 0x55, - 0x63, 0x64, 0x4b, 0x4c, 0x4b, 0x45, 0x63, 0x45, 0x39, 0x30, 0x65, 0x73, 0x4a, 0x74, 0x61, 0x6d, 0x68, 0x68, - 0x59, 0x5c, 0x0a, - 0x09, 0x51, 0x37, 0x57, 0x2b, 0x77, 0x68, 0x6f, 0x52, 0x2f, 0x54, 0x6e, 0x57, 0x67, 0x70, 0x4c, 0x56, 0x45, - 0x2b, 0x71, 0x33, 0x50, 0x30, 0x44, 0x66, 0x64, 0x59, 0x62, 0x74, 0x31, 0x41, 0x43, 0x58, 0x41, 0x67, 0x63, - 0x79, 0x47, 0x65, 0x57, 0x54, 0x39, 0x5a, 0x6e, 0x41, 0x57, 0x47, 0x4a, 0x6d, 0x76, 0x76, 0x4a, 0x67, 0x72, - 0x5a, 0x72, 0x56, 0x70, 0x7a, 0x74, 0x4f, 0x6f, 0x67, 0x65, 0x57, 0x51, 0x42, 0x52, 0x32, 0x43, 0x72, 0x46, - 0x6d, 0x5c, 0x0a, - 0x09, 0x4c, 0x69, 0x32, 0x33, 0x2f, 0x66, 0x78, 0x59, 0x67, 0x31, 0x69, 0x4c, 0x67, 0x49, 0x4c, 0x6f, 0x64, - 0x73, 0x2f, 0x30, 0x37, 0x47, 0x31, 0x59, 0x53, 0x37, 0x6e, 0x56, 0x59, 0x2b, 0x58, 0x55, 0x44, 0x30, 0x64, - 0x2f, 0x44, 0x56, 0x6a, 0x74, 0x47, 0x2f, 0x30, 0x65, 0x6e, 0x4c, 0x2b, 0x7a, 0x44, 0x6e, 0x39, 0x6e, 0x6e, - 0x51, 0x39, 0x72, 0x6c, 0x62, 0x51, 0x62, 0x73, 0x57, 0x5a, 0x4b, 0x36, 0x77, 0x53, 0x32, 0x59, 0x69, 0x30, - 0x66, 0x5c, 0x0a, - 0x09, 0x2f, 0x7a, 0x54, 0x52, 0x58, 0x50, 0x36, 0x6f, 0x46, 0x45, 0x43, 0x6d, 0x32, 0x43, 0x61, 0x61, 0x41, - 0x70, 0x77, 0x62, 0x42, 0x66, 0x74, 0x46, 0x67, 0x35, 0x67, 0x4f, 0x6c, 0x5a, 0x4d, 0x72, 0x2b, 0x76, 0x62, - 0x55, 0x6a, 0x66, 0x55, 0x2f, 0x48, 0x6b, 0x36, 0x4f, 0x37, 0x73, 0x32, 0x55, 0x45, 0x53, 0x55, 0x41, 0x78, - 0x64, 0x41, 0x7a, 0x75, 0x67, 0x76, 0x63, 0x69, 0x6b, 0x46, 0x52, 0x41, 0x70, 0x41, 0x63, 0x4a, 0x51, 0x44, - 0x4a, 0x5c, 0x0a, - 0x09, 0x55, 0x51, 0x4b, 0x51, 0x48, 0x43, 0x55, 0x41, 0x79, 0x56, 0x45, 0x43, 0x6b, 0x42, 0x77, 0x6c, 0x41, - 0x4d, 0x6c, 0x52, 0x41, 0x70, 0x41, 0x63, 0x4a, 0x51, 0x44, 0x4a, 0x55, 0x51, 0x4b, 0x51, 0x48, 0x43, 0x55, - 0x41, 0x79, 0x56, 0x45, 0x43, 0x6b, 0x42, 0x77, 0x6c, 0x41, 0x4d, 0x6c, 0x52, 0x41, 0x70, 0x41, 0x63, 0x4a, - 0x51, 0x44, 0x4a, 0x55, 0x51, 0x4b, 0x51, 0x48, 0x43, 0x55, 0x41, 0x79, 0x56, 0x45, 0x43, 0x6b, 0x42, 0x77, - 0x6c, 0x5c, 0x0a, - 0x09, 0x41, 0x4d, 0x6c, 0x52, 0x41, 0x70, 0x41, 0x63, 0x4a, 0x51, 0x44, 0x4a, 0x55, 0x51, 0x4b, 0x51, 0x48, - 0x43, 0x55, 0x41, 0x79, 0x56, 0x45, 0x43, 0x6b, 0x42, 0x77, 0x6c, 0x41, 0x4d, 0x6c, 0x52, 0x41, 0x70, 0x41, - 0x63, 0x4a, 0x51, 0x44, 0x4a, 0x55, 0x51, 0x4b, 0x51, 0x48, 0x43, 0x55, 0x41, 0x79, 0x56, 0x45, 0x43, 0x6b, - 0x4a, 0x7a, 0x2f, 0x41, 0x37, 0x77, 0x33, 0x68, 0x35, 0x77, 0x31, 0x62, 0x6c, 0x36, 0x41, 0x41, 0x41, 0x41, - 0x41, 0x5c, 0x0a, - 0x09, 0x41, 0x45, 0x6c, 0x46, 0x54, 0x6b, 0x53, 0x75, 0x51, 0x6d, 0x43, 0x43, 0x5c, 0x0a, - 0x09, 0x22, 0x0a, - 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x5f, - 0x70, 0x6e, 0x67, 0x20, 0x3d, 0x0a, - 0x09, 0x22, 0x69, 0x56, 0x42, 0x4f, 0x52, 0x77, 0x30, 0x4b, 0x47, 0x67, 0x6f, 0x41, 0x41, 0x41, 0x41, 0x4e, - 0x53, 0x55, 0x68, 0x45, 0x55, 0x67, 0x41, 0x41, 0x41, 0x67, 0x41, 0x41, 0x41, 0x41, 0x49, 0x41, 0x43, 0x41, - 0x59, 0x41, 0x41, 0x41, 0x44, 0x30, 0x65, 0x4e, 0x54, 0x36, 0x41, 0x41, 0x41, 0x67, 0x41, 0x45, 0x6c, 0x45, - 0x51, 0x56, 0x52, 0x34, 0x6e, 0x4f, 0x33, 0x64, 0x65, 0x5a, 0x52, 0x65, 0x64, 0x5a, 0x33, 0x6e, 0x38, 0x58, - 0x63, 0x71, 0x5c, 0x0a, - 0x09, 0x53, 0x55, 0x57, 0x54, 0x6b, 0x41, 0x55, 0x54, 0x49, 0x4c, 0x49, 0x4a, 0x52, 0x43, 0x56, 0x73, 0x41, - 0x72, 0x49, 0x6f, 0x71, 0x43, 0x6a, 0x64, 0x49, 0x4c, 0x59, 0x47, 0x48, 0x52, 0x5a, 0x62, 0x41, 0x52, 0x63, - 0x34, 0x4d, 0x77, 0x67, 0x32, 0x67, 0x69, 0x6a, 0x30, 0x64, 0x47, 0x50, 0x50, 0x61, 0x62, 0x46, 0x48, 0x50, - 0x45, 0x64, 0x45, 0x46, 0x42, 0x64, 0x55, 0x5a, 0x68, 0x6f, 0x50, 0x41, 0x71, 0x32, 0x79, 0x71, 0x4b, 0x67, - 0x6a, 0x5c, 0x0a, - 0x09, 0x41, 0x72, 0x49, 0x70, 0x74, 0x69, 0x41, 0x43, 0x43, 0x67, 0x46, 0x55, 0x61, 0x43, 0x55, 0x43, 0x67, - 0x59, 0x51, 0x6c, 0x4f, 0x34, 0x5a, 0x51, 0x71, 0x66, 0x6e, 0x6a, 0x57, 0x30, 0x55, 0x71, 0x53, 0x53, 0x33, - 0x50, 0x63, 0x75, 0x2f, 0x39, 0x33, 0x65, 0x58, 0x39, 0x4f, 0x75, 0x63, 0x35, 0x57, 0x61, 0x72, 0x79, 0x33, - 0x45, 0x2f, 0x51, 0x33, 0x4f, 0x2f, 0x33, 0x2b, 0x66, 0x37, 0x75, 0x2f, 0x64, 0x31, 0x78, 0x2f, 0x66, 0x33, - 0x39, 0x5c, 0x0a, - 0x09, 0x53, 0x43, 0x71, 0x74, 0x38, 0x63, 0x44, 0x73, 0x49, 0x61, 0x39, 0x5a, 0x77, 0x4f, 0x62, 0x41, 0x54, - 0x47, 0x41, 0x36, 0x4d, 0x41, 0x50, 0x59, 0x44, 0x48, 0x6a, 0x70, 0x77, 0x49, 0x38, 0x76, 0x47, 0x66, 0x4c, - 0x7a, 0x43, 0x51, 0x50, 0x66, 0x4e, 0x39, 0x54, 0x67, 0x31, 0x34, 0x64, 0x36, 0x44, 0x76, 0x6a, 0x72, 0x52, - 0x72, 0x2f, 0x33, 0x4c, 0x50, 0x41, 0x43, 0x73, 0x47, 0x4c, 0x49, 0x31, 0x77, 0x64, 0x2f, 0x76, 0x67, 0x4a, - 0x59, 0x5c, 0x0a, - 0x09, 0x43, 0x69, 0x77, 0x62, 0x2b, 0x4c, 0x35, 0x6e, 0x67, 0x4b, 0x65, 0x41, 0x4a, 0x55, 0x4e, 0x65, 0x66, - 0x52, 0x33, 0x2f, 0x6a, 0x53, 0x55, 0x56, 0x59, 0x70, 0x77, 0x4e, 0x67, 0x4a, 0x54, 0x4d, 0x44, 0x47, 0x43, - 0x37, 0x67, 0x64, 0x65, 0x32, 0x77, 0x44, 0x59, 0x44, 0x50, 0x32, 0x34, 0x4e, 0x62, 0x4d, 0x48, 0x36, 0x6f, - 0x74, 0x2b, 0x54, 0x4b, 0x6d, 0x43, 0x48, 0x2b, 0x6f, 0x48, 0x46, 0x52, 0x43, 0x4f, 0x77, 0x47, 0x48, 0x67, - 0x4d, 0x5c, 0x0a, - 0x09, 0x2b, 0x41, 0x76, 0x77, 0x36, 0x4d, 0x43, 0x50, 0x43, 0x77, 0x64, 0x2b, 0x66, 0x44, 0x5a, 0x56, 0x51, - 0x45, 0x6b, 0x32, 0x41, 0x46, 0x4b, 0x65, 0x78, 0x68, 0x46, 0x46, 0x66, 0x65, 0x36, 0x51, 0x31, 0x34, 0x34, - 0x44, 0x50, 0x2b, 0x35, 0x45, 0x66, 0x45, 0x70, 0x76, 0x73, 0x68, 0x58, 0x41, 0x77, 0x30, 0x4e, 0x65, 0x44, - 0x77, 0x31, 0x35, 0x50, 0x55, 0x6f, 0x30, 0x45, 0x70, 0x4a, 0x79, 0x59, 0x67, 0x4d, 0x67, 0x64, 0x61, 0x38, - 0x48, 0x5c, 0x0a, - 0x09, 0x65, 0x41, 0x57, 0x77, 0x43, 0x37, 0x41, 0x72, 0x4d, 0x41, 0x2f, 0x59, 0x44, 0x64, 0x67, 0x5a, 0x6d, - 0x4a, 0x49, 0x75, 0x56, 0x71, 0x57, 0x74, 0x41, 0x68, 0x34, 0x45, 0x37, 0x67, 0x4d, 0x65, 0x41, 0x42, 0x59, - 0x41, 0x39, 0x77, 0x4e, 0x2f, 0x42, 0x74, 0x61, 0x6c, 0x69, 0x79, 0x58, 0x56, 0x68, 0x77, 0x32, 0x41, 0x31, - 0x4a, 0x35, 0x65, 0x6f, 0x72, 0x6a, 0x76, 0x42, 0x65, 0x77, 0x4e, 0x37, 0x41, 0x6e, 0x73, 0x41, 0x55, 0x78, - 0x4e, 0x5c, 0x0a, - 0x09, 0x47, 0x61, 0x70, 0x42, 0x56, 0x67, 0x4b, 0x2f, 0x41, 0x2b, 0x34, 0x42, 0x37, 0x67, 0x62, 0x75, 0x49, - 0x70, 0x71, 0x45, 0x35, 0x31, 0x4f, 0x47, 0x6b, 0x71, 0x72, 0x49, 0x42, 0x6b, 0x41, 0x61, 0x57, 0x51, 0x2f, - 0x78, 0x4b, 0x66, 0x35, 0x31, 0x77, 0x50, 0x37, 0x41, 0x66, 0x73, 0x51, 0x6e, 0x2f, 0x49, 0x6b, 0x70, 0x51, - 0x32, 0x6b, 0x54, 0x61, 0x34, 0x6e, 0x70, 0x77, 0x4f, 0x30, 0x44, 0x72, 0x31, 0x38, 0x52, 0x30, 0x77, 0x4d, - 0x6e, 0x5c, 0x0a, - 0x09, 0x42, 0x64, 0x49, 0x6f, 0x62, 0x41, 0x43, 0x6b, 0x39, 0x61, 0x59, 0x43, 0x42, 0x77, 0x42, 0x76, 0x49, - 0x49, 0x72, 0x2b, 0x66, 0x73, 0x53, 0x56, 0x39, 0x71, 0x71, 0x65, 0x5a, 0x63, 0x41, 0x64, 0x52, 0x45, 0x50, - 0x77, 0x43, 0x2b, 0x41, 0x32, 0x59, 0x6e, 0x6f, 0x67, 0x61, 0x59, 0x41, 0x4e, 0x67, 0x4a, 0x70, 0x73, 0x42, - 0x76, 0x42, 0x47, 0x34, 0x45, 0x30, 0x44, 0x72, 0x37, 0x32, 0x4a, 0x57, 0x2b, 0x64, 0x55, 0x50, 0x79, 0x38, - 0x51, 0x5c, 0x0a, - 0x09, 0x79, 0x77, 0x57, 0x33, 0x44, 0x72, 0x78, 0x2b, 0x54, 0x74, 0x7a, 0x4b, 0x4b, 0x44, 0x57, 0x57, 0x44, - 0x59, 0x43, 0x61, 0x70, 0x4a, 0x66, 0x34, 0x64, 0x50, 0x2b, 0x33, 0x77, 0x43, 0x46, 0x45, 0x77, 0x61, 0x2f, - 0x61, 0x4c, 0x58, 0x62, 0x4b, 0x78, 0x6a, 0x71, 0x69, 0x49, 0x62, 0x67, 0x65, 0x75, 0x49, 0x47, 0x59, 0x45, - 0x4b, 0x78, 0x4a, 0x6d, 0x6b, 0x67, 0x71, 0x6d, 0x41, 0x32, 0x41, 0x36, 0x6d, 0x35, 0x6e, 0x34, 0x47, 0x31, - 0x45, 0x5c, 0x0a, - 0x09, 0x77, 0x54, 0x38, 0x49, 0x6d, 0x4a, 0x77, 0x32, 0x6a, 0x6b, 0x70, 0x71, 0x4e, 0x58, 0x41, 0x4c, 0x30, - 0x52, 0x42, 0x63, 0x53, 0x39, 0x78, 0x35, 0x49, 0x4e, 0x57, 0x61, 0x44, 0x59, 0x44, 0x71, 0x70, 0x70, 0x63, - 0x6f, 0x39, 0x47, 0x38, 0x48, 0x33, 0x6b, 0x48, 0x63, 0x62, 0x79, 0x2b, 0x31, 0x36, 0x32, 0x48, 0x67, 0x78, - 0x38, 0x43, 0x50, 0x69, 0x4d, 0x62, 0x41, 0x75, 0x77, 0x78, 0x55, 0x4f, 0x7a, 0x59, 0x41, 0x71, 0x6f, 0x4f, - 0x5a, 0x5c, 0x0a, - 0x09, 0x77, 0x4f, 0x48, 0x41, 0x66, 0x4f, 0x42, 0x51, 0x33, 0x47, 0x42, 0x48, 0x32, 0x56, 0x6f, 0x4a, 0x2f, - 0x42, 0x54, 0x34, 0x49, 0x58, 0x41, 0x4e, 0x37, 0x6d, 0x43, 0x6f, 0x6d, 0x72, 0x41, 0x42, 0x55, 0x46, 0x58, - 0x4e, 0x41, 0x74, 0x34, 0x46, 0x48, 0x41, 0x48, 0x38, 0x44, 0x66, 0x48, 0x4a, 0x58, 0x38, 0x72, 0x62, 0x57, - 0x75, 0x41, 0x6d, 0x34, 0x41, 0x72, 0x67, 0x2b, 0x38, 0x51, 0x7a, 0x45, 0x4b, 0x52, 0x4b, 0x73, 0x67, 0x46, - 0x51, 0x5c, 0x0a, - 0x09, 0x6c, 0x62, 0x77, 0x4d, 0x65, 0x44, 0x64, 0x77, 0x46, 0x44, 0x48, 0x6d, 0x48, 0x35, 0x38, 0x32, 0x6a, - 0x68, 0x71, 0x75, 0x6a, 0x31, 0x67, 0x65, 0x75, 0x42, 0x4c, 0x34, 0x4c, 0x76, 0x42, 0x30, 0x32, 0x6a, 0x68, - 0x53, 0x65, 0x32, 0x77, 0x41, 0x56, 0x48, 0x5a, 0x54, 0x67, 0x48, 0x63, 0x43, 0x78, 0x78, 0x44, 0x6a, 0x66, - 0x54, 0x66, 0x68, 0x55, 0x52, 0x6d, 0x74, 0x42, 0x61, 0x34, 0x44, 0x4c, 0x69, 0x65, 0x57, 0x43, 0x64, 0x78, - 0x7a, 0x5c, 0x0a, - 0x09, 0x51, 0x4b, 0x56, 0x6e, 0x41, 0x36, 0x41, 0x79, 0x47, 0x67, 0x2b, 0x38, 0x46, 0x54, 0x69, 0x57, 0x4b, - 0x50, 0x37, 0x75, 0x70, 0x36, 0x38, 0x71, 0x57, 0x51, 0x58, 0x38, 0x41, 0x4c, 0x69, 0x4d, 0x75, 0x48, 0x62, - 0x41, 0x52, 0x79, 0x4f, 0x72, 0x6c, 0x47, 0x77, 0x41, 0x56, 0x43, 0x59, 0x37, 0x41, 0x52, 0x38, 0x45, 0x54, - 0x67, 0x42, 0x65, 0x6e, 0x6a, 0x61, 0x4b, 0x6c, 0x49, 0x6e, 0x48, 0x67, 0x59, 0x73, 0x48, 0x58, 0x67, 0x38, - 0x6e, 0x5c, 0x0a, - 0x09, 0x7a, 0x69, 0x4a, 0x74, 0x77, 0x41, 0x5a, 0x41, 0x71, 0x55, 0x30, 0x42, 0x6a, 0x67, 0x61, 0x4f, 0x4a, - 0x33, 0x62, 0x6c, 0x47, 0x35, 0x63, 0x32, 0x6a, 0x70, 0x53, 0x4c, 0x66, 0x6d, 0x4c, 0x33, 0x77, 0x59, 0x75, - 0x4a, 0x43, 0x77, 0x68, 0x58, 0x70, 0x59, 0x30, 0x6a, 0x32, 0x51, 0x41, 0x6f, 0x6e, 0x56, 0x32, 0x41, 0x6b, - 0x34, 0x44, 0x33, 0x34, 0x33, 0x37, 0x37, 0x61, 0x70, 0x5a, 0x6c, 0x77, 0x43, 0x58, 0x41, 0x31, 0x34, 0x69, - 0x48, 0x5c, 0x0a, - 0x09, 0x47, 0x45, 0x6c, 0x4a, 0x32, 0x41, 0x43, 0x6f, 0x53, 0x4a, 0x4f, 0x49, 0x32, 0x2f, 0x5a, 0x4f, 0x49, - 0x76, 0x62, 0x65, 0x6c, 0x35, 0x72, 0x75, 0x56, 0x71, 0x49, 0x52, 0x75, 0x42, 0x71, 0x33, 0x49, 0x6c, 0x62, - 0x42, 0x62, 0x41, 0x42, 0x55, 0x68, 0x4b, 0x32, 0x41, 0x44, 0x77, 0x4d, 0x6e, 0x41, 0x6c, 0x73, 0x6d, 0x7a, - 0x69, 0x4b, 0x56, 0x30, 0x5a, 0x50, 0x41, 0x4e, 0x34, 0x43, 0x76, 0x41, 0x6b, 0x38, 0x6b, 0x7a, 0x71, 0x4b, - 0x47, 0x5c, 0x0a, - 0x09, 0x73, 0x41, 0x46, 0x51, 0x6e, 0x76, 0x59, 0x47, 0x54, 0x67, 0x50, 0x2b, 0x6e, 0x76, 0x6a, 0x30, 0x4c, - 0x32, 0x6c, 0x30, 0x61, 0x34, 0x44, 0x76, 0x41, 0x46, 0x38, 0x6b, 0x48, 0x6c, 0x59, 0x6b, 0x35, 0x63, 0x59, - 0x47, 0x51, 0x46, 0x6e, 0x72, 0x49, 0x62, 0x62, 0x6b, 0x50, 0x5a, 0x33, 0x59, 0x72, 0x45, 0x64, 0x53, 0x5a, - 0x32, 0x34, 0x42, 0x7a, 0x69, 0x65, 0x32, 0x49, 0x46, 0x36, 0x58, 0x4f, 0x49, 0x74, 0x71, 0x79, 0x41, 0x5a, - 0x41, 0x5c, 0x0a, - 0x09, 0x57, 0x65, 0x6b, 0x6c, 0x37, 0x74, 0x73, 0x2f, 0x45, 0x35, 0x69, 0x58, 0x4f, 0x49, 0x74, 0x55, 0x4a, - 0x77, 0x38, 0x41, 0x35, 0x78, 0x4c, 0x37, 0x43, 0x76, 0x68, 0x51, 0x49, 0x6d, 0x58, 0x47, 0x42, 0x6b, 0x44, - 0x64, 0x32, 0x67, 0x7a, 0x34, 0x48, 0x38, 0x51, 0x6e, 0x2f, 0x6d, 0x30, 0x53, 0x5a, 0x35, 0x48, 0x71, 0x37, - 0x46, 0x46, 0x69, 0x49, 0x6e, 0x41, 0x52, 0x73, 0x43, 0x4a, 0x78, 0x46, 0x74, 0x57, 0x41, 0x44, 0x59, 0x41, - 0x36, 0x5c, 0x0a, - 0x09, 0x4e, 0x52, 0x33, 0x34, 0x4b, 0x48, 0x41, 0x71, 0x73, 0x48, 0x6e, 0x69, 0x4c, 0x46, 0x4b, 0x54, 0x50, - 0x41, 0x4e, 0x63, 0x51, 0x46, 0x77, 0x6e, 0x73, 0x44, 0x52, 0x78, 0x46, 0x6c, 0x57, 0x59, 0x44, 0x59, 0x44, - 0x61, 0x4e, 0x5a, 0x4f, 0x34, 0x73, 0x4f, 0x38, 0x30, 0x59, 0x45, 0x62, 0x69, 0x4c, 0x46, 0x4b, 0x54, 0x4c, - 0x53, 0x57, 0x61, 0x67, 0x43, 0x2f, 0x69, 0x49, 0x34, 0x72, 0x56, 0x41, 0x52, 0x73, 0x41, 0x74, 0x57, 0x6f, - 0x6d, 0x5c, 0x0a, - 0x09, 0x4d, 0x65, 0x59, 0x2f, 0x46, 0x54, 0x66, 0x75, 0x6b, 0x63, 0x70, 0x6b, 0x47, 0x54, 0x45, 0x52, 0x2b, - 0x41, 0x49, 0x78, 0x48, 0x5a, 0x42, 0x61, 0x59, 0x67, 0x4f, 0x67, 0x73, 0x55, 0x77, 0x6c, 0x52, 0x76, 0x30, - 0x66, 0x78, 0x30, 0x2f, 0x38, 0x55, 0x70, 0x6b, 0x74, 0x42, 0x63, 0x34, 0x6a, 0x47, 0x67, 0x47, 0x66, 0x52, - 0x71, 0x67, 0x78, 0x32, 0x51, 0x42, 0x6f, 0x4a, 0x4c, 0x33, 0x45, 0x6a, 0x6e, 0x31, 0x6e, 0x34, 0x65, 0x59, - 0x39, 0x5c, 0x0a, - 0x09, 0x55, 0x70, 0x55, 0x73, 0x42, 0x6a, 0x35, 0x4e, 0x37, 0x44, 0x44, 0x6f, 0x58, 0x51, 0x4d, 0x61, 0x6b, - 0x51, 0x32, 0x41, 0x4e, 0x74, 0x59, 0x44, 0x76, 0x41, 0x38, 0x34, 0x47, 0x39, 0x67, 0x2b, 0x63, 0x52, 0x5a, - 0x4a, 0x6e, 0x58, 0x73, 0x45, 0x2b, 0x43, 0x54, 0x78, 0x33, 0x41, 0x48, 0x33, 0x45, 0x64, 0x41, 0x6d, 0x62, - 0x41, 0x41, 0x30, 0x31, 0x47, 0x48, 0x41, 0x5a, 0x34, 0x41, 0x39, 0x55, 0x77, 0x65, 0x52, 0x6c, 0x4a, 0x6c, - 0x37, 0x5c, 0x0a, - 0x09, 0x67, 0x58, 0x38, 0x45, 0x72, 0x6b, 0x30, 0x64, 0x52, 0x4f, 0x56, 0x69, 0x41, 0x79, 0x43, 0x49, 0x4a, - 0x2f, 0x4f, 0x64, 0x52, 0x7a, 0x51, 0x41, 0x6b, 0x75, 0x72, 0x70, 0x57, 0x75, 0x4a, 0x61, 0x48, 0x70, 0x39, - 0x41, 0x4b, 0x43, 0x44, 0x47, 0x76, 0x57, 0x71, 0x75, 0x4f, 0x63, 0x42, 0x58, 0x67, 0x4e, 0x39, 0x69, 0x38, - 0x5a, 0x66, 0x71, 0x37, 0x6a, 0x44, 0x69, 0x33, 0x2f, 0x72, 0x58, 0x69, 0x58, 0x2f, 0x37, 0x61, 0x6a, 0x67, - 0x6e, 0x5c, 0x0a, - 0x09, 0x41, 0x4d, 0x30, 0x30, 0x67, 0x62, 0x69, 0x64, 0x37, 0x33, 0x2f, 0x68, 0x6c, 0x66, 0x31, 0x53, 0x45, - 0x79, 0x30, 0x44, 0x2f, 0x6f, 0x33, 0x59, 0x51, 0x2b, 0x43, 0x46, 0x78, 0x46, 0x6d, 0x55, 0x69, 0x41, 0x31, - 0x41, 0x38, 0x78, 0x77, 0x4d, 0x66, 0x49, 0x6b, 0x59, 0x2b, 0x30, 0x74, 0x71, 0x74, 0x76, 0x75, 0x4a, 0x44, - 0x77, 0x4d, 0x2f, 0x53, 0x78, 0x31, 0x45, 0x78, 0x58, 0x4d, 0x4a, 0x6f, 0x44, 0x6d, 0x32, 0x41, 0x36, 0x34, - 0x67, 0x5c, 0x0a, - 0x09, 0x2f, 0x71, 0x46, 0x62, 0x2f, 0x43, 0x56, 0x42, 0x6e, 0x41, 0x74, 0x75, 0x41, 0x4b, 0x34, 0x6b, 0x7a, - 0x68, 0x46, 0x71, 0x45, 0x42, 0x75, 0x41, 0x2b, 0x70, 0x73, 0x41, 0x66, 0x49, 0x78, 0x34, 0x6f, 0x74, 0x68, - 0x52, 0x69, 0x62, 0x4e, 0x49, 0x4b, 0x71, 0x63, 0x6a, 0x69, 0x58, 0x50, 0x45, 0x78, 0x34, 0x6c, 0x7a, 0x68, - 0x68, 0x72, 0x41, 0x4a, 0x59, 0x42, 0x36, 0x65, 0x77, 0x33, 0x77, 0x66, 0x34, 0x42, 0x39, 0x55, 0x67, 0x65, - 0x52, 0x5c, 0x0a, - 0x09, 0x56, 0x42, 0x6c, 0x33, 0x45, 0x6b, 0x2f, 0x34, 0x76, 0x43, 0x64, 0x31, 0x45, 0x4f, 0x58, 0x4c, 0x43, - 0x55, 0x41, 0x39, 0x76, 0x52, 0x51, 0x34, 0x68, 0x2f, 0x69, 0x48, 0x62, 0x50, 0x47, 0x58, 0x31, 0x49, 0x35, - 0x39, 0x67, 0x46, 0x38, 0x54, 0x65, 0x34, 0x4b, 0x38, 0x4e, 0x48, 0x45, 0x57, 0x35, 0x63, 0x67, 0x4a, 0x51, - 0x50, 0x32, 0x38, 0x6d, 0x62, 0x6a, 0x4e, 0x35, 0x31, 0x57, 0x4a, 0x63, 0x30, 0x69, 0x71, 0x76, 0x6a, 0x38, - 0x41, 0x5c, 0x0a, - 0x09, 0x48, 0x77, 0x4a, 0x75, 0x54, 0x70, 0x78, 0x44, 0x4f, 0x58, 0x41, 0x43, 0x55, 0x42, 0x38, 0x7a, 0x67, - 0x49, 0x75, 0x41, 0x47, 0x37, 0x48, 0x34, 0x53, 0x38, 0x72, 0x47, 0x71, 0x34, 0x68, 0x7a, 0x79, 0x6b, 0x56, - 0x34, 0x79, 0x33, 0x44, 0x74, 0x4f, 0x41, 0x47, 0x6f, 0x68, 0x79, 0x4f, 0x49, 0x57, 0x2f, 0x74, 0x65, 0x6e, - 0x6a, 0x71, 0x49, 0x70, 0x4e, 0x70, 0x61, 0x42, 0x4a, 0x77, 0x43, 0x58, 0x4a, 0x30, 0x36, 0x69, 0x4c, 0x4a, - 0x68, 0x5c, 0x0a, - 0x09, 0x41, 0x31, 0x42, 0x74, 0x67, 0x7a, 0x76, 0x35, 0x2f, 0x62, 0x66, 0x55, 0x51, 0x53, 0x51, 0x31, 0x78, - 0x76, 0x65, 0x42, 0x44, 0x78, 0x4d, 0x4e, 0x67, 0x53, 0x72, 0x4d, 0x42, 0x71, 0x43, 0x36, 0x6a, 0x67, 0x49, - 0x75, 0x42, 0x47, 0x61, 0x6c, 0x44, 0x69, 0x4b, 0x70, 0x63, 0x5a, 0x34, 0x43, 0x54, 0x69, 0x62, 0x32, 0x44, - 0x31, 0x42, 0x46, 0x65, 0x51, 0x31, 0x41, 0x39, 0x55, 0x77, 0x6e, 0x48, 0x75, 0x39, 0x35, 0x42, 0x52, 0x5a, - 0x2f, 0x5c, 0x0a, - 0x09, 0x53, 0x57, 0x6e, 0x4d, 0x49, 0x73, 0x35, 0x42, 0x6c, 0x78, 0x44, 0x6e, 0x4a, 0x46, 0x57, 0x51, 0x45, - 0x34, 0x42, 0x71, 0x65, 0x51, 0x74, 0x77, 0x4d, 0x62, 0x42, 0x39, 0x36, 0x69, 0x43, 0x53, 0x4e, 0x47, 0x41, - 0x68, 0x38, 0x45, 0x48, 0x67, 0x70, 0x73, 0x51, 0x35, 0x31, 0x43, 0x59, 0x6e, 0x41, 0x4e, 0x55, 0x77, 0x45, - 0x66, 0x67, 0x73, 0x73, 0x57, 0x57, 0x6e, 0x78, 0x56, 0x39, 0x53, 0x6d, 0x57, 0x78, 0x48, 0x6e, 0x4a, 0x73, - 0x2b, 0x5c, 0x0a, - 0x09, 0x53, 0x35, 0x79, 0x72, 0x56, 0x42, 0x46, 0x4f, 0x41, 0x4d, 0x70, 0x76, 0x4a, 0x2b, 0x41, 0x2f, 0x67, - 0x48, 0x31, 0x54, 0x42, 0x35, 0x47, 0x6b, 0x4d, 0x66, 0x77, 0x61, 0x65, 0x43, 0x2f, 0x77, 0x63, 0x4f, 0x6f, - 0x67, 0x47, 0x70, 0x73, 0x54, 0x67, 0x48, 0x49, 0x37, 0x42, 0x72, 0x67, 0x4c, 0x69, 0x37, 0x2b, 0x6b, 0x61, - 0x74, 0x69, 0x58, 0x4f, 0x47, 0x63, 0x64, 0x6b, 0x7a, 0x71, 0x49, 0x78, 0x6d, 0x59, 0x44, 0x55, 0x45, 0x35, - 0x54, 0x5c, 0x0a, - 0x09, 0x67, 0x57, 0x38, 0x43, 0x6c, 0x77, 0x48, 0x54, 0x30, 0x6b, 0x61, 0x52, 0x70, 0x4c, 0x5a, 0x4d, 0x49, - 0x38, 0x35, 0x64, 0x33, 0x79, 0x54, 0x4f, 0x5a, 0x53, 0x6f, 0x70, 0x6c, 0x77, 0x44, 0x4b, 0x5a, 0x78, 0x36, - 0x78, 0x30, 0x63, 0x62, 0x4f, 0x71, 0x59, 0x4e, 0x49, 0x55, 0x70, 0x63, 0x65, 0x4a, 0x4a, 0x34, 0x30, 0x65, - 0x48, 0x2f, 0x71, 0x49, 0x4e, 0x71, 0x55, 0x45, 0x34, 0x42, 0x79, 0x4f, 0x52, 0x61, 0x34, 0x41, 0x34, 0x75, - 0x2f, 0x5c, 0x0a, - 0x09, 0x70, 0x48, 0x72, 0x59, 0x47, 0x62, 0x69, 0x64, 0x4f, 0x4c, 0x65, 0x70, 0x5a, 0x47, 0x77, 0x41, 0x79, - 0x6d, 0x45, 0x53, 0x73, 0x61, 0x50, 0x66, 0x70, 0x54, 0x67, 0x79, 0x6b, 0x31, 0x51, 0x76, 0x55, 0x34, 0x6c, - 0x7a, 0x32, 0x31, 0x65, 0x49, 0x63, 0x35, 0x31, 0x4b, 0x77, 0x69, 0x57, 0x41, 0x39, 0x4c, 0x59, 0x6e, 0x64, - 0x74, 0x50, 0x79, 0x73, 0x62, 0x32, 0x53, 0x36, 0x75, 0x35, 0x4f, 0x59, 0x68, 0x66, 0x54, 0x52, 0x31, 0x49, - 0x48, 0x5c, 0x0a, - 0x09, 0x6b, 0x52, 0x4f, 0x41, 0x31, 0x41, 0x34, 0x69, 0x62, 0x70, 0x75, 0x78, 0x2b, 0x45, 0x74, 0x71, 0x67, - 0x6e, 0x32, 0x49, 0x63, 0x39, 0x35, 0x42, 0x71, 0x59, 0x50, 0x49, 0x42, 0x69, 0x43, 0x6c, 0x55, 0x34, 0x44, - 0x72, 0x67, 0x64, 0x6d, 0x70, 0x67, 0x30, 0x68, 0x53, 0x67, 0x57, 0x59, 0x54, 0x35, 0x37, 0x36, 0x50, 0x70, - 0x41, 0x37, 0x53, 0x64, 0x43, 0x34, 0x42, 0x46, 0x47, 0x38, 0x53, 0x38, 0x52, 0x43, 0x66, 0x34, 0x31, 0x4d, - 0x48, 0x5c, 0x0a, - 0x09, 0x6b, 0x61, 0x54, 0x45, 0x4c, 0x69, 0x59, 0x65, 0x4b, 0x72, 0x51, 0x6d, 0x64, 0x5a, 0x41, 0x6d, 0x73, - 0x67, 0x45, 0x6f, 0x31, 0x6c, 0x62, 0x41, 0x39, 0x34, 0x44, 0x58, 0x70, 0x51, 0x34, 0x69, 0x53, 0x53, 0x58, - 0x78, 0x4b, 0x2b, 0x4b, 0x52, 0x35, 0x6b, 0x2b, 0x6b, 0x44, 0x74, 0x49, 0x30, 0x4e, 0x67, 0x44, 0x46, 0x32, - 0x51, 0x58, 0x34, 0x45, 0x62, 0x42, 0x44, 0x36, 0x69, 0x43, 0x53, 0x56, 0x44, 0x4a, 0x2f, 0x41, 0x75, 0x59, - 0x44, 0x5c, 0x0a, - 0x09, 0x43, 0x31, 0x49, 0x48, 0x61, 0x52, 0x4b, 0x76, 0x41, 0x53, 0x6a, 0x47, 0x57, 0x34, 0x42, 0x66, 0x59, - 0x50, 0x47, 0x58, 0x70, 0x4f, 0x48, 0x73, 0x41, 0x50, 0x77, 0x63, 0x4f, 0x44, 0x68, 0x31, 0x6b, 0x43, 0x61, - 0x78, 0x41, 0x63, 0x6a, 0x66, 0x42, 0x34, 0x42, 0x72, 0x67, 0x5a, 0x6d, 0x70, 0x67, 0x30, 0x68, 0x53, 0x69, - 0x63, 0x30, 0x45, 0x66, 0x6b, 0x4b, 0x63, 0x4d, 0x31, 0x55, 0x41, 0x47, 0x34, 0x44, 0x38, 0x6a, 0x41, 0x4d, - 0x2b, 0x5c, 0x0a, - 0x09, 0x53, 0x56, 0x7a, 0x6b, 0x30, 0x70, 0x73, 0x32, 0x69, 0x69, 0x52, 0x56, 0x51, 0x69, 0x39, 0x78, 0x7a, - 0x76, 0x77, 0x6b, 0x63, 0x51, 0x35, 0x56, 0x6a, 0x72, 0x77, 0x47, 0x49, 0x42, 0x2b, 0x39, 0x77, 0x45, 0x58, - 0x41, 0x2b, 0x31, 0x4d, 0x48, 0x6b, 0x61, 0x53, 0x4b, 0x2b, 0x68, 0x62, 0x77, 0x33, 0x34, 0x48, 0x6e, 0x55, - 0x77, 0x65, 0x70, 0x4b, 0x78, 0x75, 0x41, 0x37, 0x4d, 0x30, 0x45, 0x72, 0x69, 0x4c, 0x57, 0x2f, 0x53, 0x56, - 0x4a, 0x5c, 0x0a, - 0x09, 0x6e, 0x62, 0x73, 0x5a, 0x4f, 0x41, 0x4a, 0x34, 0x4e, 0x6e, 0x47, 0x4f, 0x57, 0x72, 0x49, 0x42, 0x79, - 0x4e, 0x59, 0x4f, 0x77, 0x49, 0x2b, 0x4a, 0x4a, 0x2f, 0x70, 0x4a, 0x6b, 0x72, 0x72, 0x33, 0x41, 0x50, 0x42, - 0x32, 0x34, 0x6b, 0x34, 0x42, 0x5a, 0x63, 0x68, 0x72, 0x41, 0x4c, 0x4c, 0x7a, 0x57, 0x75, 0x41, 0x2f, 0x73, - 0x66, 0x68, 0x4c, 0x55, 0x70, 0x62, 0x6d, 0x45, 0x65, 0x64, 0x57, 0x74, 0x30, 0x7a, 0x50, 0x6d, 0x41, 0x31, - 0x41, 0x5c, 0x0a, - 0x09, 0x4e, 0x74, 0x34, 0x4d, 0x33, 0x41, 0x68, 0x73, 0x6d, 0x54, 0x69, 0x48, 0x4a, 0x4e, 0x58, 0x52, 0x6c, - 0x73, 0x44, 0x50, 0x69, 0x48, 0x4f, 0x74, 0x4d, 0x6d, 0x49, 0x44, 0x30, 0x4c, 0x33, 0x35, 0x77, 0x50, 0x38, - 0x44, 0x70, 0x71, 0x55, 0x4f, 0x49, 0x6b, 0x6b, 0x31, 0x4e, 0x6f, 0x32, 0x34, 0x54, 0x58, 0x42, 0x2b, 0x36, - 0x69, 0x42, 0x31, 0x59, 0x51, 0x50, 0x51, 0x6e, 0x57, 0x4f, 0x42, 0x71, 0x34, 0x47, 0x58, 0x70, 0x67, 0x34, - 0x69, 0x5c, 0x0a, - 0x09, 0x53, 0x51, 0x33, 0x77, 0x45, 0x75, 0x4b, 0x63, 0x65, 0x31, 0x7a, 0x71, 0x49, 0x48, 0x56, 0x67, 0x41, - 0x39, 0x43, 0x35, 0x66, 0x79, 0x42, 0x75, 0x55, 0x35, 0x6d, 0x51, 0x4f, 0x6f, 0x67, 0x6b, 0x4e, 0x63, 0x67, - 0x45, 0x34, 0x42, 0x4c, 0x69, 0x48, 0x4b, 0x77, 0x75, 0x32, 0x41, 0x42, 0x30, 0x35, 0x75, 0x50, 0x41, 0x6c, - 0x33, 0x47, 0x6a, 0x43, 0x6b, 0x6c, 0x4b, 0x59, 0x52, 0x78, 0x78, 0x44, 0x6a, 0x34, 0x6a, 0x64, 0x5a, 0x41, - 0x71, 0x5c, 0x0a, - 0x09, 0x73, 0x77, 0x46, 0x6f, 0x33, 0x7a, 0x38, 0x44, 0x6e, 0x30, 0x73, 0x64, 0x51, 0x70, 0x4c, 0x45, 0x75, - 0x63, 0x51, 0x35, 0x57, 0x52, 0x32, 0x77, 0x41, 0x57, 0x6a, 0x50, 0x76, 0x77, 0x4c, 0x6e, 0x70, 0x41, 0x34, - 0x68, 0x53, 0x58, 0x72, 0x52, 0x4f, 0x63, 0x44, 0x5a, 0x71, 0x55, 0x4e, 0x55, 0x6b, 0x52, 0x73, 0x42, 0x74, - 0x65, 0x34, 0x63, 0x37, 0x44, 0x51, 0x6c, 0x71, 0x61, 0x77, 0x2b, 0x41, 0x35, 0x79, 0x56, 0x4f, 0x6b, 0x53, - 0x56, 0x5c, 0x0a, - 0x09, 0x4f, 0x41, 0x46, 0x6f, 0x7a, 0x61, 0x65, 0x78, 0x2b, 0x45, 0x74, 0x53, 0x6d, 0x66, 0x30, 0x7a, 0x63, - 0x61, 0x35, 0x57, 0x69, 0x32, 0x77, 0x41, 0x78, 0x76, 0x61, 0x76, 0x32, 0x46, 0x56, 0x4b, 0x55, 0x68, 0x57, - 0x63, 0x52, 0x54, 0x78, 0x4a, 0x55, 0x43, 0x31, 0x77, 0x43, 0x57, 0x42, 0x30, 0x5a, 0x32, 0x46, 0x48, 0x4b, - 0x55, 0x6c, 0x56, 0x38, 0x77, 0x6d, 0x38, 0x58, 0x6d, 0x74, 0x4d, 0x4e, 0x67, 0x41, 0x6a, 0x2b, 0x78, 0x68, - 0x77, 0x5c, 0x0a, - 0x09, 0x58, 0x75, 0x6f, 0x51, 0x6b, 0x71, 0x53, 0x4f, 0x6e, 0x49, 0x48, 0x6e, 0x38, 0x46, 0x48, 0x5a, 0x41, - 0x41, 0x7a, 0x76, 0x48, 0x34, 0x68, 0x37, 0x54, 0x43, 0x56, 0x4a, 0x31, 0x58, 0x55, 0x4b, 0x38, 0x4a, 0x58, - 0x55, 0x49, 0x63, 0x72, 0x4b, 0x42, 0x6d, 0x42, 0x54, 0x78, 0x78, 0x49, 0x37, 0x2f, 0x4c, 0x6e, 0x4a, 0x6a, - 0x79, 0x52, 0x56, 0x57, 0x7a, 0x2f, 0x77, 0x50, 0x75, 0x43, 0x79, 0x31, 0x45, 0x48, 0x4b, 0x79, 0x41, 0x5a, - 0x67, 0x5c, 0x0a, - 0x09, 0x51, 0x34, 0x63, 0x44, 0x56, 0x2b, 0x48, 0x32, 0x76, 0x70, 0x4a, 0x55, 0x46, 0x79, 0x38, 0x41, 0x52, - 0x77, 0x4c, 0x58, 0x70, 0x41, 0x35, 0x53, 0x4e, 0x6a, 0x59, 0x41, 0x36, 0x78, 0x30, 0x4d, 0x2f, 0x42, 0x43, - 0x59, 0x6e, 0x44, 0x71, 0x49, 0x4a, 0x43, 0x6c, 0x54, 0x71, 0x34, 0x6d, 0x6e, 0x43, 0x4e, 0x36, 0x59, 0x4f, - 0x6b, 0x69, 0x5a, 0x32, 0x41, 0x43, 0x45, 0x66, 0x59, 0x48, 0x72, 0x67, 0x65, 0x6d, 0x70, 0x67, 0x30, 0x69, - 0x53, 0x5c, 0x0a, - 0x09, 0x63, 0x72, 0x45, 0x4d, 0x4f, 0x42, 0x53, 0x34, 0x49, 0x33, 0x57, 0x51, 0x73, 0x72, 0x41, 0x42, 0x67, - 0x4c, 0x6e, 0x41, 0x4c, 0x34, 0x48, 0x5a, 0x71, 0x59, 0x4e, 0x49, 0x6b, 0x6e, 0x4b, 0x31, 0x42, 0x44, 0x67, - 0x41, 0x65, 0x43, 0x68, 0x31, 0x6b, 0x44, 0x4a, 0x6f, 0x2b, 0x6b, 0x5a, 0x41, 0x73, 0x34, 0x47, 0x66, 0x59, - 0x50, 0x47, 0x58, 0x70, 0x43, 0x62, 0x77, 0x6e, 0x44, 0x39, 0x45, 0x6b, 0x78, 0x75, 0x41, 0x79, 0x63, 0x53, - 0x61, 0x5c, 0x0a, - 0x09, 0x2f, 0x39, 0x7a, 0x55, 0x51, 0x53, 0x52, 0x4a, 0x68, 0x5a, 0x6d, 0x4c, 0x31, 0x33, 0x73, 0x42, 0x7a, - 0x57, 0x30, 0x41, 0x78, 0x67, 0x50, 0x2f, 0x41, 0x65, 0x79, 0x66, 0x4f, 0x6f, 0x67, 0x6b, 0x71, 0x58, 0x44, - 0x37, 0x45, 0x7a, 0x56, 0x67, 0x66, 0x4f, 0x6f, 0x67, 0x4b, 0x54, 0x57, 0x31, 0x41, 0x66, 0x67, 0x53, 0x63, - 0x63, 0x75, 0x66, 0x4a, 0x4b, 0x6d, 0x5a, 0x44, 0x69, 0x64, 0x71, 0x51, 0x57, 0x4d, 0x31, 0x73, 0x51, 0x45, - 0x34, 0x5c, 0x0a, - 0x09, 0x48, 0x54, 0x67, 0x35, 0x64, 0x51, 0x68, 0x4a, 0x55, 0x6e, 0x49, 0x6e, 0x45, 0x39, 0x75, 0x2b, 0x4e, - 0x31, 0x4c, 0x54, 0x37, 0x67, 0x49, 0x34, 0x48, 0x4c, 0x69, 0x61, 0x68, 0x6f, 0x39, 0x39, 0x4a, 0x45, 0x6b, - 0x76, 0x36, 0x67, 0x4f, 0x4f, 0x6f, 0x49, 0x45, 0x62, 0x42, 0x54, 0x57, 0x70, 0x41, 0x64, 0x67, 0x64, 0x75, - 0x41, 0x33, 0x59, 0x4c, 0x48, 0x55, 0x51, 0x53, 0x56, 0x4b, 0x70, 0x72, 0x43, 0x52, 0x75, 0x44, 0x37, 0x77, - 0x33, 0x5c, 0x0a, - 0x09, 0x64, 0x5a, 0x41, 0x69, 0x4e, 0x61, 0x55, 0x42, 0x32, 0x41, 0x72, 0x34, 0x4e, 0x62, 0x42, 0x4e, 0x36, - 0x69, 0x43, 0x53, 0x70, 0x46, 0x4a, 0x36, 0x46, 0x4e, 0x67, 0x50, 0x57, 0x4a, 0x51, 0x36, 0x53, 0x46, 0x47, - 0x61, 0x63, 0x41, 0x31, 0x41, 0x4c, 0x2f, 0x41, 0x39, 0x4c, 0x50, 0x36, 0x53, 0x70, 0x4a, 0x46, 0x74, 0x51, - 0x39, 0x53, 0x4b, 0x33, 0x74, 0x52, 0x42, 0x69, 0x74, 0x4b, 0x45, 0x42, 0x75, 0x42, 0x43, 0x34, 0x48, 0x57, - 0x70, 0x5c, 0x0a, - 0x09, 0x51, 0x30, 0x69, 0x53, 0x53, 0x6d, 0x39, 0x2f, 0x6f, 0x6d, 0x59, 0x30, 0x51, 0x74, 0x30, 0x62, 0x67, - 0x49, 0x38, 0x41, 0x4a, 0x36, 0x51, 0x4f, 0x49, 0x55, 0x6d, 0x71, 0x6a, 0x42, 0x4f, 0x49, 0x32, 0x6c, 0x46, - 0x37, 0x64, 0x62, 0x34, 0x47, 0x34, 0x43, 0x44, 0x67, 0x4f, 0x68, 0x6f, 0x30, 0x7a, 0x70, 0x45, 0x6b, 0x5a, - 0x65, 0x4a, 0x35, 0x34, 0x73, 0x46, 0x42, 0x74, 0x36, 0x51, 0x4f, 0x6b, 0x71, 0x65, 0x36, 0x4e, 0x67, 0x44, - 0x62, 0x5c, 0x0a, - 0x09, 0x41, 0x72, 0x2f, 0x42, 0x2f, 0x5a, 0x34, 0x6c, 0x53, 0x5a, 0x31, 0x5a, 0x41, 0x75, 0x77, 0x44, 0x4c, - 0x45, 0x77, 0x64, 0x4a, 0x43, 0x39, 0x31, 0x58, 0x41, 0x4c, 0x6f, 0x42, 0x61, 0x37, 0x43, 0x34, 0x69, 0x39, - 0x4a, 0x36, 0x74, 0x78, 0x73, 0x34, 0x45, 0x70, 0x71, 0x50, 0x45, 0x57, 0x75, 0x59, 0x77, 0x4e, 0x77, 0x50, - 0x72, 0x42, 0x76, 0x36, 0x68, 0x43, 0x53, 0x70, 0x4d, 0x72, 0x62, 0x6c, 0x36, 0x67, 0x70, 0x74, 0x56, 0x53, - 0x33, 0x5c, 0x0a, - 0x09, 0x4a, 0x59, 0x44, 0x33, 0x41, 0x70, 0x65, 0x6e, 0x44, 0x69, 0x46, 0x4a, 0x71, 0x70, 0x56, 0x6a, 0x69, - 0x49, 0x63, 0x48, 0x31, 0x55, 0x71, 0x64, 0x47, 0x6f, 0x42, 0x35, 0x77, 0x42, 0x33, 0x41, 0x31, 0x4e, 0x52, - 0x42, 0x4a, 0x45, 0x6d, 0x31, 0x73, 0x6f, 0x71, 0x59, 0x42, 0x6a, 0x79, 0x51, 0x4f, 0x6b, 0x69, 0x57, 0x36, - 0x72, 0x49, 0x45, 0x4d, 0x49, 0x56, 0x59, 0x39, 0x37, 0x66, 0x34, 0x53, 0x35, 0x4b, 0x79, 0x56, 0x73, 0x73, - 0x61, 0x5c, 0x0a, - 0x09, 0x55, 0x35, 0x63, 0x47, 0x34, 0x4d, 0x76, 0x45, 0x42, 0x45, 0x43, 0x53, 0x70, 0x44, 0x7a, 0x4d, 0x6f, - 0x32, 0x61, 0x50, 0x44, 0x36, 0x37, 0x44, 0x45, 0x73, 0x41, 0x78, 0x77, 0x47, 0x57, 0x70, 0x51, 0x30, 0x69, - 0x53, 0x47, 0x75, 0x45, 0x34, 0x61, 0x6c, 0x4a, 0x7a, 0x71, 0x74, 0x34, 0x41, 0x37, 0x41, 0x54, 0x63, 0x42, - 0x55, 0x78, 0x4c, 0x48, 0x55, 0x53, 0x53, 0x31, 0x41, 0x6a, 0x4c, 0x67, 0x62, 0x32, 0x42, 0x68, 0x31, 0x4d, - 0x48, 0x5c, 0x0a, - 0x09, 0x36, 0x56, 0x61, 0x56, 0x6c, 0x77, 0x42, 0x36, 0x69, 0x61, 0x73, 0x79, 0x4c, 0x66, 0x36, 0x53, 0x70, - 0x4b, 0x4a, 0x4d, 0x41, 0x37, 0x35, 0x4e, 0x44, 0x66, 0x59, 0x48, 0x71, 0x48, 0x49, 0x44, 0x38, 0x4c, 0x2f, - 0x78, 0x66, 0x6e, 0x39, 0x4a, 0x55, 0x76, 0x48, 0x32, 0x49, 0x57, 0x70, 0x51, 0x70, 0x56, 0x56, 0x31, 0x43, - 0x65, 0x41, 0x74, 0x77, 0x41, 0x31, 0x55, 0x75, 0x34, 0x47, 0x52, 0x4a, 0x46, 0x56, 0x58, 0x50, 0x2f, 0x41, - 0x33, 0x5c, 0x0a, - 0x09, 0x77, 0x45, 0x32, 0x70, 0x67, 0x33, 0x53, 0x71, 0x69, 0x67, 0x33, 0x41, 0x44, 0x4f, 0x43, 0x33, 0x77, - 0x48, 0x61, 0x70, 0x67, 0x30, 0x69, 0x53, 0x47, 0x6d, 0x30, 0x68, 0x38, 0x42, 0x70, 0x67, 0x61, 0x65, 0x6f, - 0x67, 0x6e, 0x61, 0x6a, 0x69, 0x4a, 0x2b, 0x67, 0x4c, 0x73, 0x50, 0x68, 0x4c, 0x6b, 0x74, 0x4c, 0x62, 0x6a, - 0x71, 0x68, 0x4a, 0x6c, 0x56, 0x53, 0x31, 0x43, 0x63, 0x42, 0x52, 0x77, 0x42, 0x57, 0x70, 0x51, 0x30, 0x69, - 0x53, 0x5c, 0x0a, - 0x09, 0x4e, 0x4d, 0x54, 0x52, 0x78, 0x49, 0x4f, 0x44, 0x4b, 0x71, 0x56, 0x4b, 0x44, 0x63, 0x41, 0x63, 0x34, - 0x46, 0x37, 0x67, 0x5a, 0x61, 0x6d, 0x44, 0x53, 0x4a, 0x49, 0x30, 0x78, 0x4e, 0x50, 0x41, 0x37, 0x73, 0x43, - 0x69, 0x31, 0x45, 0x48, 0x61, 0x55, 0x61, 0x55, 0x6c, 0x67, 0x4b, 0x39, 0x6a, 0x38, 0x5a, 0x63, 0x6b, 0x6c, - 0x63, 0x2f, 0x4c, 0x69, 0x42, 0x70, 0x56, 0x4b, 0x56, 0x56, 0x70, 0x41, 0x4e, 0x34, 0x44, 0x7a, 0x45, 0x38, - 0x64, 0x5c, 0x0a, - 0x09, 0x51, 0x70, 0x4b, 0x6b, 0x45, 0x63, 0x77, 0x6e, 0x64, 0x71, 0x61, 0x74, 0x6a, 0x43, 0x6f, 0x73, 0x41, - 0x57, 0x77, 0x42, 0x4c, 0x41, 0x42, 0x6d, 0x70, 0x51, 0x34, 0x69, 0x53, 0x64, 0x49, 0x6f, 0x6e, 0x67, 0x4a, - 0x32, 0x42, 0x52, 0x61, 0x6e, 0x44, 0x74, 0x4b, 0x4b, 0x4b, 0x6b, 0x77, 0x41, 0x76, 0x6f, 0x4c, 0x46, 0x58, - 0x35, 0x4a, 0x55, 0x66, 0x72, 0x4f, 0x49, 0x6d, 0x6c, 0x55, 0x4a, 0x5a, 0x57, 0x38, 0x41, 0x6a, 0x68, 0x70, - 0x34, 0x5c, 0x0a, - 0x09, 0x53, 0x5a, 0x4a, 0x55, 0x42, 0x5a, 0x57, 0x70, 0x57, 0x32, 0x56, 0x65, 0x41, 0x70, 0x67, 0x42, 0x33, - 0x45, 0x39, 0x63, 0x2f, 0x53, 0x39, 0x4a, 0x55, 0x6c, 0x55, 0x73, 0x41, 0x6e, 0x61, 0x68, 0x35, 0x42, 0x73, - 0x45, 0x6c, 0x58, 0x6b, 0x43, 0x63, 0x41, 0x34, 0x57, 0x66, 0x30, 0x6c, 0x53, 0x39, 0x63, 0x77, 0x42, 0x50, - 0x70, 0x4d, 0x36, 0x78, 0x46, 0x6a, 0x4b, 0x4f, 0x67, 0x46, 0x34, 0x50, 0x66, 0x41, 0x4c, 0x79, 0x74, 0x32, - 0x67, 0x5c, 0x0a, - 0x09, 0x53, 0x4a, 0x49, 0x30, 0x6b, 0x6e, 0x58, 0x41, 0x47, 0x34, 0x46, 0x66, 0x70, 0x67, 0x34, 0x79, 0x6b, - 0x6a, 0x49, 0x32, 0x41, 0x42, 0x4f, 0x42, 0x4f, 0x34, 0x45, 0x39, 0x55, 0x67, 0x65, 0x52, 0x4a, 0x4b, 0x6b, - 0x4c, 0x76, 0x79, 0x4f, 0x65, 0x48, 0x4c, 0x67, 0x32, 0x64, 0x5a, 0x44, 0x68, 0x6c, 0x50, 0x45, 0x54, 0x39, - 0x75, 0x6c, 0x59, 0x2f, 0x43, 0x56, 0x4a, 0x31, 0x62, 0x63, 0x48, 0x38, 0x4c, 0x48, 0x55, 0x49, 0x55, 0x5a, - 0x53, 0x5c, 0x0a, - 0x09, 0x74, 0x67, 0x6e, 0x41, 0x64, 0x73, 0x41, 0x44, 0x77, 0x4f, 0x54, 0x55, 0x51, 0x53, 0x52, 0x4a, 0x79, - 0x73, 0x42, 0x71, 0x59, 0x42, 0x37, 0x78, 0x35, 0x4d, 0x42, 0x53, 0x4b, 0x64, 0x73, 0x45, 0x34, 0x48, 0x4e, - 0x59, 0x2f, 0x43, 0x56, 0x4a, 0x39, 0x54, 0x47, 0x5a, 0x71, 0x47, 0x32, 0x6c, 0x55, 0x36, 0x59, 0x4a, 0x77, - 0x46, 0x75, 0x41, 0x47, 0x31, 0x4f, 0x48, 0x6b, 0x43, 0x51, 0x70, 0x42, 0x34, 0x63, 0x41, 0x4e, 0x36, 0x51, - 0x4f, 0x5c, 0x0a, - 0x09, 0x4d, 0x56, 0x52, 0x5a, 0x47, 0x6f, 0x43, 0x4a, 0x77, 0x44, 0x33, 0x45, 0x66, 0x5a, 0x4f, 0x53, 0x4a, - 0x4e, 0x58, 0x4e, 0x67, 0x38, 0x51, 0x31, 0x41, 0x61, 0x57, 0x35, 0x49, 0x4c, 0x41, 0x73, 0x53, 0x77, 0x43, - 0x6e, 0x59, 0x76, 0x47, 0x58, 0x4a, 0x4e, 0x58, 0x58, 0x7a, 0x6b, 0x53, 0x74, 0x4b, 0x34, 0x30, 0x79, 0x54, - 0x41, 0x43, 0x32, 0x42, 0x50, 0x34, 0x41, 0x54, 0x45, 0x73, 0x64, 0x52, 0x4a, 0x4b, 0x6b, 0x48, 0x43, 0x30, - 0x48, 0x5c, 0x0a, - 0x09, 0x58, 0x67, 0x30, 0x38, 0x6b, 0x54, 0x6f, 0x49, 0x6c, 0x47, 0x4d, 0x43, 0x63, 0x44, 0x59, 0x57, 0x66, - 0x30, 0x6c, 0x53, 0x2f, 0x55, 0x30, 0x6a, 0x61, 0x6c, 0x34, 0x70, 0x70, 0x4a, 0x34, 0x41, 0x37, 0x45, 0x71, - 0x73, 0x2f, 0x55, 0x39, 0x49, 0x47, 0x55, 0x4b, 0x53, 0x70, 0x49, 0x4c, 0x30, 0x41, 0x58, 0x73, 0x43, 0x39, - 0x36, 0x55, 0x4f, 0x6b, 0x6e, 0x6f, 0x43, 0x38, 0x44, 0x6b, 0x73, 0x2f, 0x70, 0x4b, 0x6b, 0x35, 0x68, 0x67, - 0x50, 0x5c, 0x0a, - 0x09, 0x6e, 0x4a, 0x73, 0x36, 0x42, 0x4b, 0x52, 0x74, 0x41, 0x41, 0x34, 0x42, 0x44, 0x6b, 0x74, 0x34, 0x66, - 0x45, 0x6d, 0x53, 0x55, 0x6a, 0x67, 0x4d, 0x65, 0x47, 0x76, 0x71, 0x45, 0x4b, 0x6d, 0x57, 0x41, 0x4d, 0x59, - 0x44, 0x64, 0x77, 0x4f, 0x37, 0x70, 0x7a, 0x69, 0x34, 0x4a, 0x45, 0x6d, 0x4a, 0x33, 0x55, 0x63, 0x73, 0x42, - 0x66, 0x53, 0x6c, 0x43, 0x70, 0x42, 0x71, 0x41, 0x76, 0x41, 0x2b, 0x4c, 0x50, 0x36, 0x53, 0x70, 0x4f, 0x62, - 0x61, 0x5c, 0x0a, - 0x09, 0x6a, 0x61, 0x69, 0x46, 0x79, 0x61, 0x53, 0x59, 0x41, 0x45, 0x77, 0x43, 0x66, 0x67, 0x39, 0x73, 0x58, - 0x2f, 0x53, 0x42, 0x4a, 0x55, 0x6b, 0x71, 0x6b, 0x55, 0x65, 0x49, 0x32, 0x77, 0x4c, 0x58, 0x70, 0x44, 0x68, - 0x34, 0x69, 0x67, 0x6e, 0x41, 0x69, 0x56, 0x6a, 0x38, 0x4a, 0x55, 0x6e, 0x61, 0x48, 0x6a, 0x67, 0x70, 0x31, - 0x63, 0x47, 0x4c, 0x6e, 0x67, 0x42, 0x4d, 0x41, 0x52, 0x34, 0x6d, 0x4e, 0x76, 0x2b, 0x52, 0x4a, 0x4b, 0x6e, - 0x70, 0x5c, 0x0a, - 0x09, 0x46, 0x67, 0x4e, 0x7a, 0x67, 0x52, 0x56, 0x46, 0x48, 0x37, 0x6a, 0x6f, 0x43, 0x63, 0x42, 0x48, 0x73, - 0x66, 0x68, 0x4c, 0x6b, 0x6a, 0x52, 0x6f, 0x43, 0x2b, 0x43, 0x30, 0x46, 0x41, 0x63, 0x75, 0x63, 0x67, 0x49, - 0x77, 0x45, 0x2f, 0x67, 0x54, 0x4d, 0x4c, 0x32, 0x6f, 0x41, 0x30, 0x71, 0x53, 0x56, 0x41, 0x48, 0x4c, 0x67, - 0x42, 0x32, 0x41, 0x5a, 0x34, 0x73, 0x38, 0x61, 0x4a, 0x45, 0x54, 0x67, 0x4e, 0x4f, 0x78, 0x2b, 0x45, 0x75, - 0x53, 0x5c, 0x0a, - 0x09, 0x74, 0x4c, 0x48, 0x70, 0x77, 0x4d, 0x65, 0x4b, 0x50, 0x6d, 0x68, 0x52, 0x45, 0x34, 0x41, 0x5a, 0x77, - 0x4a, 0x2b, 0x78, 0x41, 0x5a, 0x41, 0x6b, 0x61, 0x54, 0x69, 0x46, 0x54, 0x77, 0x47, 0x4b, 0x6d, 0x67, 0x42, - 0x38, 0x46, 0x49, 0x75, 0x2f, 0x4a, 0x45, 0x6b, 0x6a, 0x6d, 0x55, 0x37, 0x55, 0x79, 0x73, 0x49, 0x55, 0x4d, - 0x51, 0x47, 0x59, 0x51, 0x61, 0x7a, 0x39, 0x7a, 0x38, 0x6a, 0x37, 0x51, 0x4a, 0x49, 0x6b, 0x56, 0x64, 0x67, - 0x79, 0x5c, 0x0a, - 0x09, 0x34, 0x42, 0x58, 0x41, 0x30, 0x69, 0x49, 0x4f, 0x56, 0x73, 0x51, 0x45, 0x34, 0x44, 0x51, 0x73, 0x2f, - 0x70, 0x49, 0x6b, 0x6a, 0x57, 0x55, 0x36, 0x63, 0x62, 0x31, 0x63, 0x49, 0x66, 0x4b, 0x65, 0x41, 0x45, 0x77, - 0x46, 0x46, 0x68, 0x4a, 0x33, 0x41, 0x45, 0x69, 0x53, 0x70, 0x4e, 0x45, 0x74, 0x42, 0x62, 0x59, 0x46, 0x56, - 0x75, 0x5a, 0x39, 0x6f, 0x4c, 0x77, 0x6e, 0x41, 0x43, 0x64, 0x69, 0x38, 0x5a, 0x63, 0x6b, 0x71, 0x56, 0x55, - 0x7a, 0x5c, 0x0a, - 0x09, 0x67, 0x41, 0x38, 0x56, 0x63, 0x61, 0x41, 0x38, 0x4a, 0x77, 0x43, 0x39, 0x78, 0x4b, 0x35, 0x2f, 0x32, - 0x2b, 0x52, 0x31, 0x41, 0x45, 0x6d, 0x53, 0x61, 0x75, 0x67, 0x78, 0x59, 0x45, 0x66, 0x67, 0x2b, 0x54, 0x77, - 0x50, 0x6b, 0x75, 0x63, 0x45, 0x34, 0x46, 0x67, 0x73, 0x2f, 0x70, 0x49, 0x6b, 0x74, 0x57, 0x74, 0x72, 0x34, - 0x4c, 0x69, 0x38, 0x44, 0x35, 0x4c, 0x58, 0x42, 0x4b, 0x43, 0x48, 0x65, 0x4e, 0x62, 0x78, 0x76, 0x44, 0x7a, - 0x65, 0x5c, 0x0a, - 0x09, 0x58, 0x4a, 0x4b, 0x6b, 0x6d, 0x6e, 0x73, 0x51, 0x32, 0x42, 0x56, 0x59, 0x6c, 0x39, 0x63, 0x42, 0x38, - 0x70, 0x6f, 0x41, 0x7a, 0x4d, 0x66, 0x69, 0x4c, 0x30, 0x6c, 0x53, 0x70, 0x33, 0x59, 0x6d, 0x61, 0x6d, 0x6c, - 0x75, 0x38, 0x6d, 0x6f, 0x41, 0x43, 0x74, 0x33, 0x4d, 0x51, 0x4a, 0x4b, 0x6b, 0x47, 0x73, 0x71, 0x31, 0x6c, - 0x75, 0x61, 0x78, 0x42, 0x4c, 0x41, 0x58, 0x63, 0x46, 0x66, 0x57, 0x62, 0x79, 0x70, 0x4a, 0x55, 0x67, 0x50, - 0x74, 0x5c, 0x0a, - 0x09, 0x44, 0x64, 0x79, 0x64, 0x78, 0x78, 0x76, 0x6e, 0x4d, 0x51, 0x48, 0x77, 0x30, 0x37, 0x38, 0x6b, 0x53, - 0x64, 0x6e, 0x49, 0x72, 0x61, 0x5a, 0x6d, 0x50, 0x51, 0x47, 0x59, 0x51, 0x7a, 0x7a, 0x30, 0x70, 0x7a, 0x66, - 0x4c, 0x4e, 0x35, 0x55, 0x6b, 0x71, 0x61, 0x47, 0x65, 0x4a, 0x37, 0x59, 0x48, 0x58, 0x70, 0x54, 0x31, 0x47, - 0x32, 0x63, 0x39, 0x41, 0x66, 0x67, 0x77, 0x46, 0x6e, 0x39, 0x4a, 0x6b, 0x72, 0x4c, 0x53, 0x53, 0x39, 0x54, - 0x57, 0x5c, 0x0a, - 0x09, 0x7a, 0x47, 0x55, 0x35, 0x41, 0x65, 0x67, 0x46, 0x48, 0x67, 0x56, 0x6d, 0x5a, 0x2f, 0x57, 0x47, 0x6b, - 0x69, 0x53, 0x4a, 0x4a, 0x63, 0x53, 0x2b, 0x4f, 0x70, 0x6c, 0x75, 0x44, 0x4a, 0x54, 0x6c, 0x42, 0x4f, 0x42, - 0x49, 0x4c, 0x50, 0x36, 0x53, 0x4a, 0x47, 0x56, 0x74, 0x4e, 0x6c, 0x46, 0x6a, 0x4d, 0x35, 0x56, 0x6c, 0x41, - 0x33, 0x42, 0x53, 0x68, 0x75, 0x38, 0x6c, 0x53, 0x5a, 0x4c, 0x57, 0x4f, 0x7a, 0x6e, 0x72, 0x4e, 0x38, 0x78, - 0x71, 0x5c, 0x0a, - 0x09, 0x43, 0x57, 0x41, 0x58, 0x59, 0x45, 0x45, 0x57, 0x62, 0x79, 0x52, 0x4a, 0x6b, 0x6f, 0x61, 0x31, 0x47, - 0x78, 0x6e, 0x57, 0x32, 0x71, 0x77, 0x6d, 0x41, 0x4a, 0x6c, 0x33, 0x4a, 0x70, 0x49, 0x6b, 0x61, 0x51, 0x4f, - 0x5a, 0x54, 0x74, 0x71, 0x7a, 0x6d, 0x41, 0x42, 0x4d, 0x49, 0x53, 0x37, 0x2b, 0x6d, 0x39, 0x46, 0x39, 0x48, - 0x45, 0x6d, 0x53, 0x4e, 0x49, 0x4b, 0x6c, 0x77, 0x4c, 0x62, 0x41, 0x79, 0x69, 0x7a, 0x65, 0x4c, 0x49, 0x73, - 0x4a, 0x5c, 0x0a, - 0x09, 0x77, 0x4e, 0x46, 0x59, 0x2f, 0x43, 0x56, 0x4a, 0x79, 0x74, 0x73, 0x4d, 0x6f, 0x75, 0x5a, 0x6d, 0x49, - 0x6f, 0x73, 0x47, 0x34, 0x50, 0x67, 0x4d, 0x33, 0x6b, 0x4f, 0x53, 0x4a, 0x49, 0x33, 0x74, 0x68, 0x4b, 0x7a, - 0x65, 0x71, 0x4e, 0x73, 0x6c, 0x67, 0x46, 0x63, 0x43, 0x76, 0x77, 0x66, 0x47, 0x5a, 0x52, 0x4e, 0x48, 0x6b, - 0x69, 0x53, 0x4e, 0x6f, 0x68, 0x39, 0x34, 0x4e, 0x66, 0x44, 0x48, 0x62, 0x74, 0x2b, 0x6f, 0x32, 0x77, 0x6e, - 0x41, 0x5c, 0x0a, - 0x09, 0x42, 0x37, 0x48, 0x34, 0x53, 0x35, 0x4a, 0x55, 0x6c, 0x48, 0x46, 0x45, 0x37, 0x65, 0x33, 0x2b, 0x6a, - 0x62, 0x71, 0x59, 0x41, 0x50, 0x51, 0x41, 0x6a, 0x78, 0x43, 0x37, 0x45, 0x30, 0x6d, 0x53, 0x70, 0x47, 0x49, - 0x38, 0x42, 0x6d, 0x77, 0x50, 0x39, 0x48, 0x58, 0x7a, 0x4a, 0x74, 0x31, 0x4d, 0x41, 0x41, 0x37, 0x42, 0x34, - 0x69, 0x39, 0x4a, 0x55, 0x74, 0x47, 0x32, 0x42, 0x67, 0x37, 0x74, 0x39, 0x6b, 0x32, 0x36, 0x61, 0x51, 0x44, - 0x65, 0x5c, 0x0a, - 0x09, 0x33, 0x2b, 0x33, 0x42, 0x4a, 0x55, 0x6c, 0x53, 0x52, 0x34, 0x37, 0x72, 0x39, 0x67, 0x30, 0x36, 0x58, - 0x51, 0x4b, 0x59, 0x41, 0x6a, 0x77, 0x35, 0x38, 0x4b, 0x4d, 0x6b, 0x53, 0x53, 0x72, 0x57, 0x4b, 0x6d, 0x44, - 0x4c, 0x67, 0x52, 0x38, 0x37, 0x30, 0x75, 0x6b, 0x45, 0x34, 0x4a, 0x31, 0x59, 0x2f, 0x43, 0x56, 0x4a, 0x53, - 0x6d, 0x55, 0x4b, 0x55, 0x59, 0x73, 0x37, 0x31, 0x6d, 0x6b, 0x44, 0x63, 0x45, 0x77, 0x33, 0x42, 0x35, 0x55, - 0x6b, 0x5c, 0x0a, - 0x09, 0x53, 0x56, 0x33, 0x72, 0x71, 0x68, 0x5a, 0x33, 0x73, 0x67, 0x51, 0x77, 0x43, 0x33, 0x67, 0x63, 0x6d, - 0x4e, 0x6a, 0x4e, 0x67, 0x53, 0x56, 0x4a, 0x55, 0x6c, 0x66, 0x57, 0x41, 0x69, 0x38, 0x48, 0x6e, 0x75, 0x72, - 0x6b, 0x44, 0x33, 0x63, 0x79, 0x41, 0x54, 0x67, 0x61, 0x69, 0x37, 0x38, 0x6b, 0x53, 0x61, 0x6c, 0x4e, 0x70, - 0x49, 0x75, 0x74, 0x67, 0x54, 0x74, 0x70, 0x41, 0x49, 0x37, 0x71, 0x39, 0x47, 0x43, 0x53, 0x4a, 0x43, 0x6c, - 0x54, 0x5c, 0x0a, - 0x09, 0x48, 0x64, 0x66, 0x6b, 0x64, 0x70, 0x63, 0x41, 0x5a, 0x67, 0x4f, 0x4c, 0x67, 0x50, 0x47, 0x64, 0x48, - 0x6c, 0x43, 0x53, 0x4a, 0x47, 0x57, 0x6d, 0x44, 0x35, 0x67, 0x44, 0x4c, 0x47, 0x6e, 0x33, 0x44, 0x37, 0x59, - 0x37, 0x41, 0x54, 0x67, 0x63, 0x69, 0x37, 0x38, 0x6b, 0x53, 0x57, 0x55, 0x78, 0x6e, 0x67, 0x37, 0x76, 0x42, - 0x6d, 0x69, 0x33, 0x41, 0x58, 0x44, 0x38, 0x4c, 0x30, 0x6c, 0x53, 0x75, 0x52, 0x7a, 0x5a, 0x79, 0x52, 0x39, - 0x71, 0x5c, 0x0a, - 0x09, 0x5a, 0x77, 0x6c, 0x67, 0x42, 0x72, 0x48, 0x35, 0x54, 0x32, 0x38, 0x6e, 0x42, 0x35, 0x49, 0x6b, 0x53, - 0x62, 0x6c, 0x59, 0x43, 0x32, 0x77, 0x42, 0x4c, 0x47, 0x33, 0x6e, 0x44, 0x37, 0x55, 0x7a, 0x41, 0x5a, 0x69, - 0x50, 0x78, 0x56, 0x2b, 0x53, 0x70, 0x4c, 0x4b, 0x5a, 0x53, 0x43, 0x7a, 0x52, 0x74, 0x36, 0x58, 0x64, 0x42, - 0x6b, 0x43, 0x53, 0x4a, 0x4a, 0x56, 0x50, 0x32, 0x7a, 0x57, 0x36, 0x31, 0x53, 0x57, 0x41, 0x53, 0x63, 0x54, - 0x34, 0x5c, 0x0a, - 0x09, 0x66, 0x33, 0x71, 0x37, 0x42, 0x35, 0x41, 0x6b, 0x53, 0x62, 0x6c, 0x62, 0x53, 0x57, 0x7a, 0x55, 0x74, - 0x36, 0x62, 0x56, 0x50, 0x39, 0x44, 0x71, 0x42, 0x4f, 0x41, 0x67, 0x4c, 0x50, 0x36, 0x53, 0x4a, 0x4a, 0x58, - 0x56, 0x56, 0x4b, 0x4a, 0x57, 0x74, 0x36, 0x7a, 0x56, 0x42, 0x75, 0x44, 0x74, 0x37, 0x57, 0x65, 0x52, 0x4a, - 0x45, 0x6b, 0x46, 0x61, 0x71, 0x74, 0x57, 0x74, 0x37, 0x6f, 0x45, 0x38, 0x42, 0x43, 0x77, 0x55, 0x30, 0x64, - 0x78, 0x5c, 0x0a, - 0x09, 0x4a, 0x45, 0x6c, 0x53, 0x45, 0x52, 0x34, 0x47, 0x35, 0x72, 0x62, 0x36, 0x7a, 0x61, 0x31, 0x4d, 0x41, - 0x48, 0x62, 0x47, 0x34, 0x69, 0x39, 0x4a, 0x55, 0x74, 0x6e, 0x74, 0x42, 0x4f, 0x7a, 0x61, 0x36, 0x6a, 0x65, - 0x33, 0x30, 0x67, 0x43, 0x38, 0x72, 0x66, 0x4d, 0x73, 0x6b, 0x69, 0x53, 0x70, 0x51, 0x47, 0x39, 0x74, 0x39, - 0x52, 0x74, 0x62, 0x61, 0x51, 0x41, 0x4f, 0x36, 0x53, 0x4b, 0x49, 0x4a, 0x45, 0x6b, 0x71, 0x54, 0x73, 0x73, - 0x31, 0x5c, 0x0a, - 0x09, 0x65, 0x36, 0x78, 0x72, 0x41, 0x43, 0x59, 0x42, 0x54, 0x77, 0x4e, 0x54, 0x75, 0x6b, 0x30, 0x6b, 0x53, - 0x5a, 0x4a, 0x79, 0x39, 0x78, 0x77, 0x77, 0x6b, 0x78, 0x5a, 0x75, 0x42, 0x78, 0x78, 0x72, 0x41, 0x76, 0x42, - 0x36, 0x4c, 0x50, 0x36, 0x53, 0x4a, 0x46, 0x58, 0x46, 0x53, 0x34, 0x45, 0x44, 0x57, 0x2f, 0x6e, 0x47, 0x73, - 0x52, 0x71, 0x41, 0x51, 0x37, 0x76, 0x50, 0x49, 0x6b, 0x6d, 0x53, 0x43, 0x74, 0x54, 0x53, 0x4d, 0x73, 0x42, - 0x59, 0x5c, 0x0a, - 0x09, 0x44, 0x59, 0x44, 0x72, 0x2f, 0x35, 0x49, 0x6b, 0x56, 0x55, 0x74, 0x4c, 0x74, 0x58, 0x75, 0x30, 0x61, - 0x77, 0x42, 0x6d, 0x45, 0x4f, 0x76, 0x2f, 0x37, 0x54, 0x34, 0x79, 0x57, 0x4a, 0x49, 0x6b, 0x70, 0x62, 0x4f, - 0x4f, 0x32, 0x42, 0x62, 0x34, 0x32, 0x64, 0x47, 0x2b, 0x61, 0x62, 0x54, 0x69, 0x66, 0x75, 0x41, 0x59, 0x58, - 0x35, 0x63, 0x6b, 0x53, 0x65, 0x58, 0x54, 0x41, 0x37, 0x79, 0x68, 0x6c, 0x57, 0x38, 0x61, 0x53, 0x56, 0x74, - 0x37, 0x5c, 0x0a, - 0x09, 0x43, 0x6b, 0x75, 0x53, 0x70, 0x4e, 0x4a, 0x34, 0x30, 0x31, 0x6a, 0x66, 0x4d, 0x46, 0x6f, 0x44, 0x4d, - 0x4f, 0x59, 0x66, 0x6c, 0x69, 0x52, 0x4a, 0x70, 0x54, 0x52, 0x6d, 0x44, 0x52, 0x2f, 0x70, 0x47, 0x6f, 0x43, - 0x70, 0x78, 0x4e, 0x72, 0x42, 0x68, 0x4b, 0x77, 0x54, 0x53, 0x5a, 0x4b, 0x6b, 0x33, 0x4c, 0x30, 0x41, 0x62, - 0x41, 0x36, 0x73, 0x47, 0x4f, 0x6b, 0x62, 0x52, 0x70, 0x6f, 0x41, 0x48, 0x49, 0x6a, 0x46, 0x58, 0x35, 0x4b, - 0x6b, 0x5c, 0x0a, - 0x09, 0x71, 0x70, 0x6f, 0x41, 0x48, 0x44, 0x44, 0x61, 0x4e, 0x34, 0x7a, 0x55, 0x41, 0x49, 0x7a, 0x36, 0x68, - 0x79, 0x52, 0x4a, 0x55, 0x75, 0x6c, 0x31, 0x31, 0x41, 0x43, 0x38, 0x50, 0x6f, 0x63, 0x67, 0x6b, 0x69, 0x53, - 0x70, 0x4f, 0x4b, 0x50, 0x57, 0x38, 0x75, 0x47, 0x75, 0x41, 0x65, 0x67, 0x42, 0x6e, 0x67, 0x47, 0x6d, 0x35, - 0x35, 0x56, 0x49, 0x6b, 0x69, 0x54, 0x6c, 0x62, 0x68, 0x6c, 0x78, 0x48, 0x63, 0x43, 0x36, 0x34, 0x62, 0x34, - 0x34, 0x5c, 0x0a, - 0x09, 0x33, 0x41, 0x52, 0x67, 0x48, 0x68, 0x5a, 0x2f, 0x53, 0x5a, 0x4b, 0x71, 0x62, 0x6a, 0x70, 0x52, 0x30, - 0x34, 0x63, 0x31, 0x58, 0x41, 0x4f, 0x77, 0x58, 0x33, 0x35, 0x5a, 0x4a, 0x45, 0x6c, 0x53, 0x67, 0x56, 0x34, - 0x33, 0x30, 0x68, 0x65, 0x47, 0x61, 0x77, 0x44, 0x32, 0x7a, 0x7a, 0x47, 0x49, 0x4a, 0x45, 0x6b, 0x71, 0x7a, - 0x72, 0x34, 0x6a, 0x66, 0x63, 0x45, 0x4a, 0x67, 0x43, 0x52, 0x4a, 0x39, 0x54, 0x58, 0x69, 0x68, 0x2f, 0x71, - 0x4e, 0x5c, 0x0a, - 0x09, 0x4c, 0x77, 0x4b, 0x63, 0x52, 0x47, 0x77, 0x61, 0x4d, 0x44, 0x48, 0x76, 0x52, 0x4a, 0x49, 0x6b, 0x4b, - 0x58, 0x64, 0x72, 0x67, 0x63, 0x32, 0x41, 0x4e, 0x52, 0x74, 0x2f, 0x59, 0x65, 0x4d, 0x4a, 0x77, 0x4b, 0x35, - 0x59, 0x2f, 0x43, 0x56, 0x4a, 0x71, 0x6f, 0x75, 0x4a, 0x77, 0x47, 0x37, 0x44, 0x66, 0x57, 0x48, 0x6a, 0x42, - 0x6d, 0x43, 0x76, 0x2f, 0x4c, 0x4e, 0x49, 0x6b, 0x71, 0x51, 0x43, 0x44, 0x56, 0x76, 0x62, 0x62, 0x51, 0x41, - 0x6b, 0x5c, 0x0a, - 0x09, 0x53, 0x61, 0x6f, 0x33, 0x47, 0x77, 0x42, 0x4a, 0x6b, 0x68, 0x70, 0x6f, 0x37, 0x2b, 0x46, 0x2b, 0x63, - 0x2b, 0x68, 0x46, 0x67, 0x44, 0x33, 0x41, 0x63, 0x6d, 0x42, 0x4b, 0x55, 0x59, 0x6b, 0x6b, 0x53, 0x56, 0x4c, - 0x75, 0x56, 0x67, 0x48, 0x54, 0x32, 0x47, 0x68, 0x48, 0x77, 0x4b, 0x45, 0x54, 0x67, 0x42, 0x32, 0x78, 0x2b, - 0x45, 0x75, 0x53, 0x56, 0x44, 0x64, 0x54, 0x67, 0x42, 0x30, 0x32, 0x2f, 0x73, 0x32, 0x68, 0x44, 0x63, 0x43, - 0x75, 0x5c, 0x0a, - 0x09, 0x78, 0x57, 0x57, 0x52, 0x4a, 0x45, 0x6b, 0x46, 0x32, 0x6d, 0x58, 0x6a, 0x33, 0x78, 0x6a, 0x61, 0x41, - 0x41, 0x78, 0x37, 0x6d, 0x34, 0x41, 0x6b, 0x53, 0x61, 0x71, 0x38, 0x54, 0x54, 0x37, 0x6b, 0x44, 0x32, 0x30, - 0x41, 0x4e, 0x75, 0x6b, 0x4f, 0x4a, 0x45, 0x6c, 0x53, 0x4c, 0x59, 0x7a, 0x61, 0x41, 0x49, 0x7a, 0x34, 0x78, - 0x43, 0x42, 0x4a, 0x6b, 0x6c, 0x52, 0x70, 0x6d, 0x33, 0x7a, 0x49, 0x48, 0x37, 0x77, 0x4c, 0x6f, 0x49, 0x66, - 0x59, 0x5c, 0x0a, - 0x09, 0x41, 0x6e, 0x68, 0x79, 0x30, 0x59, 0x6b, 0x6b, 0x53, 0x56, 0x4c, 0x75, 0x56, 0x68, 0x4e, 0x62, 0x41, - 0x72, 0x39, 0x34, 0x4a, 0x38, 0x44, 0x67, 0x42, 0x47, 0x42, 0x72, 0x4c, 0x50, 0x36, 0x53, 0x4a, 0x4e, 0x58, - 0x56, 0x5a, 0x47, 0x44, 0x62, 0x6f, 0x62, 0x38, 0x78, 0x32, 0x41, 0x44, 0x73, 0x56, 0x48, 0x77, 0x57, 0x53, - 0x5a, 0x4a, 0x55, 0x6f, 0x41, 0x31, 0x71, 0x2f, 0x57, 0x41, 0x44, 0x38, 0x4b, 0x6f, 0x45, 0x51, 0x53, 0x52, - 0x4a, 0x5c, 0x0a, - 0x09, 0x55, 0x6e, 0x48, 0x6d, 0x44, 0x76, 0x33, 0x46, 0x59, 0x41, 0x4f, 0x77, 0x59, 0x34, 0x49, 0x67, 0x6b, - 0x69, 0x53, 0x70, 0x4f, 0x4d, 0x4d, 0x32, 0x41, 0x48, 0x4f, 0x48, 0x2b, 0x55, 0x5a, 0x4a, 0x6b, 0x6c, 0x51, - 0x66, 0x4e, 0x67, 0x43, 0x53, 0x4a, 0x44, 0x58, 0x51, 0x42, 0x74, 0x63, 0x41, 0x44, 0x4e, 0x34, 0x47, 0x75, - 0x4a, 0x79, 0x34, 0x50, 0x55, 0x43, 0x53, 0x4a, 0x4e, 0x58, 0x54, 0x4b, 0x6d, 0x44, 0x71, 0x34, 0x43, 0x39, - 0x36, 0x5c, 0x0a, - 0x09, 0x67, 0x4a, 0x6c, 0x59, 0x2f, 0x43, 0x56, 0x4a, 0x71, 0x72, 0x73, 0x70, 0x77, 0x4f, 0x61, 0x44, 0x76, - 0x2b, 0x68, 0x68, 0x6f, 0x2f, 0x73, 0x43, 0x4a, 0x55, 0x6c, 0x53, 0x62, 0x62, 0x31, 0x59, 0x38, 0x32, 0x30, - 0x41, 0x4a, 0x45, 0x6c, 0x71, 0x44, 0x68, 0x73, 0x41, 0x53, 0x5a, 0x49, 0x61, 0x61, 0x4c, 0x76, 0x42, 0x6e, - 0x2f, 0x51, 0x4d, 0x2f, 0x59, 0x55, 0x6b, 0x53, 0x61, 0x71, 0x31, 0x62, 0x51, 0x5a, 0x2f, 0x30, 0x6a, 0x50, - 0x30, 0x5c, 0x0a, - 0x09, 0x46, 0x35, 0x49, 0x6b, 0x71, 0x64, 0x59, 0x32, 0x6d, 0x41, 0x44, 0x4d, 0x53, 0x52, 0x68, 0x45, 0x6b, - 0x69, 0x51, 0x56, 0x5a, 0x36, 0x76, 0x42, 0x6e, 0x2f, 0x51, 0x41, 0x57, 0x79, 0x51, 0x4d, 0x49, 0x6b, 0x6d, - 0x53, 0x69, 0x72, 0x50, 0x6c, 0x34, 0x45, 0x39, 0x36, 0x47, 0x4e, 0x49, 0x4e, 0x53, 0x4a, 0x4b, 0x6b, 0x57, - 0x6e, 0x76, 0x78, 0x51, 0x2f, 0x2b, 0x34, 0x2f, 0x76, 0x37, 0x2b, 0x50, 0x74, 0x5a, 0x76, 0x43, 0x53, 0x78, - 0x4a, 0x5c, 0x0a, - 0x09, 0x6b, 0x75, 0x70, 0x72, 0x48, 0x64, 0x41, 0x4c, 0x39, 0x50, 0x56, 0x67, 0x38, 0x5a, 0x63, 0x6b, 0x71, - 0x53, 0x6c, 0x36, 0x67, 0x46, 0x6d, 0x44, 0x50, 0x35, 0x45, 0x6b, 0x53, 0x63, 0x30, 0x78, 0x42, 0x32, 0x77, - 0x41, 0x4a, 0x45, 0x6c, 0x71, 0x47, 0x69, 0x63, 0x41, 0x6b, 0x69, 0x51, 0x31, 0x30, 0x41, 0x79, 0x77, 0x41, - 0x5a, 0x41, 0x6b, 0x71, 0x57, 0x6c, 0x73, 0x41, 0x43, 0x52, 0x4a, 0x61, 0x69, 0x41, 0x62, 0x41, 0x45, 0x6d, - 0x53, 0x5c, 0x0a, - 0x09, 0x47, 0x73, 0x67, 0x47, 0x51, 0x4a, 0x4b, 0x6b, 0x42, 0x72, 0x49, 0x42, 0x6b, 0x43, 0x53, 0x70, 0x67, - 0x57, 0x77, 0x41, 0x4a, 0x45, 0x6c, 0x71, 0x6f, 0x47, 0x6c, 0x67, 0x41, 0x79, 0x42, 0x4a, 0x55, 0x74, 0x4e, - 0x4d, 0x41, 0x68, 0x73, 0x41, 0x53, 0x5a, 0x4b, 0x61, 0x5a, 0x6a, 0x4c, 0x59, 0x41, 0x45, 0x69, 0x53, 0x31, - 0x44, 0x52, 0x54, 0x77, 0x51, 0x5a, 0x41, 0x6b, 0x71, 0x53, 0x6d, 0x63, 0x51, 0x6c, 0x41, 0x6b, 0x71, 0x51, - 0x47, 0x5c, 0x0a, - 0x09, 0x6d, 0x67, 0x49, 0x32, 0x41, 0x4a, 0x49, 0x6b, 0x4e, 0x59, 0x30, 0x4e, 0x67, 0x43, 0x52, 0x4a, 0x44, - 0x54, 0x51, 0x42, 0x62, 0x41, 0x41, 0x6b, 0x53, 0x57, 0x6f, 0x6b, 0x47, 0x77, 0x42, 0x4a, 0x6b, 0x68, 0x72, - 0x49, 0x42, 0x6b, 0x43, 0x53, 0x70, 0x47, 0x62, 0x70, 0x42, 0x52, 0x6a, 0x58, 0x33, 0x39, 0x2f, 0x66, 0x6e, - 0x7a, 0x71, 0x4a, 0x4a, 0x45, 0x6b, 0x71, 0x31, 0x44, 0x67, 0x6e, 0x41, 0x4a, 0x49, 0x6b, 0x4e, 0x5a, 0x41, - 0x4e, 0x5c, 0x0a, - 0x09, 0x67, 0x43, 0x52, 0x4a, 0x44, 0x57, 0x51, 0x44, 0x49, 0x45, 0x6c, 0x53, 0x41, 0x39, 0x6b, 0x41, 0x53, - 0x4a, 0x4c, 0x55, 0x4c, 0x4d, 0x2b, 0x42, 0x44, 0x59, 0x41, 0x6b, 0x53, 0x55, 0x33, 0x7a, 0x50, 0x4e, 0x67, - 0x41, 0x53, 0x4a, 0x4c, 0x55, 0x53, 0x44, 0x59, 0x41, 0x6b, 0x69, 0x51, 0x31, 0x6b, 0x41, 0x32, 0x41, 0x4a, - 0x45, 0x6e, 0x4e, 0x38, 0x67, 0x4c, 0x59, 0x41, 0x45, 0x69, 0x53, 0x31, 0x44, 0x53, 0x72, 0x77, 0x41, 0x5a, - 0x41, 0x5c, 0x0a, - 0x09, 0x6b, 0x71, 0x53, 0x6d, 0x73, 0x51, 0x47, 0x51, 0x4a, 0x4b, 0x6d, 0x42, 0x31, 0x6f, 0x41, 0x4e, 0x67, - 0x43, 0x52, 0x4a, 0x54, 0x62, 0x4d, 0x53, 0x62, 0x41, 0x41, 0x6b, 0x53, 0x57, 0x71, 0x61, 0x31, 0x57, 0x41, - 0x44, 0x49, 0x45, 0x6c, 0x53, 0x30, 0x37, 0x67, 0x45, 0x49, 0x45, 0x6c, 0x53, 0x41, 0x79, 0x30, 0x48, 0x47, - 0x77, 0x42, 0x4a, 0x6b, 0x70, 0x70, 0x6d, 0x4b, 0x64, 0x67, 0x41, 0x53, 0x4a, 0x4c, 0x55, 0x4e, 0x44, 0x59, - 0x41, 0x5c, 0x0a, - 0x09, 0x6b, 0x69, 0x51, 0x31, 0x6b, 0x41, 0x32, 0x41, 0x4a, 0x45, 0x6b, 0x4e, 0x5a, 0x41, 0x4d, 0x67, 0x53, - 0x56, 0x49, 0x44, 0x32, 0x51, 0x42, 0x49, 0x6b, 0x74, 0x52, 0x41, 0x4e, 0x67, 0x43, 0x53, 0x4a, 0x44, 0x58, - 0x51, 0x55, 0x32, 0x41, 0x44, 0x49, 0x45, 0x6c, 0x53, 0x30, 0x7a, 0x77, 0x42, 0x4d, 0x4b, 0x36, 0x2f, 0x76, - 0x37, 0x38, 0x50, 0x47, 0x77, 0x46, 0x4a, 0x6b, 0x70, 0x70, 0x67, 0x48, 0x64, 0x41, 0x4c, 0x39, 0x50, 0x55, - 0x77, 0x5c, 0x0a, - 0x09, 0x4d, 0x41, 0x71, 0x51, 0x4a, 0x45, 0x6d, 0x31, 0x39, 0x78, 0x54, 0x51, 0x42, 0x2f, 0x48, 0x4a, 0x2f, - 0x38, 0x6d, 0x30, 0x57, 0x53, 0x52, 0x4a, 0x55, 0x6b, 0x45, 0x57, 0x44, 0x2f, 0x37, 0x45, 0x42, 0x6b, 0x43, - 0x53, 0x70, 0x4f, 0x5a, 0x34, 0x73, 0x65, 0x62, 0x33, 0x41, 0x49, 0x73, 0x53, 0x42, 0x70, 0x45, 0x6b, 0x53, - 0x63, 0x56, 0x35, 0x59, 0x76, 0x41, 0x6e, 0x50, 0x63, 0x43, 0x6a, 0x43, 0x59, 0x4e, 0x49, 0x6b, 0x71, 0x54, - 0x69, 0x5c, 0x0a, - 0x09, 0x4c, 0x42, 0x7a, 0x38, 0x53, 0x63, 0x2f, 0x51, 0x58, 0x30, 0x69, 0x53, 0x70, 0x46, 0x70, 0x37, 0x38, - 0x55, 0x4f, 0x2f, 0x45, 0x77, 0x42, 0x4a, 0x6b, 0x70, 0x72, 0x44, 0x43, 0x59, 0x41, 0x6b, 0x53, 0x51, 0x32, - 0x30, 0x77, 0x51, 0x54, 0x67, 0x4c, 0x77, 0x6d, 0x44, 0x53, 0x4a, 0x4b, 0x6b, 0x34, 0x72, 0x7a, 0x34, 0x6f, - 0x58, 0x39, 0x63, 0x66, 0x33, 0x38, 0x2f, 0x77, 0x48, 0x4a, 0x67, 0x73, 0x32, 0x52, 0x78, 0x4a, 0x45, 0x6c, - 0x53, 0x5c, 0x0a, - 0x09, 0x33, 0x6c, 0x59, 0x42, 0x55, 0x77, 0x64, 0x2f, 0x4d, 0x62, 0x67, 0x46, 0x38, 0x4a, 0x2b, 0x54, 0x52, - 0x4a, 0x45, 0x6b, 0x53, 0x55, 0x56, 0x35, 0x65, 0x4f, 0x67, 0x76, 0x42, 0x68, 0x75, 0x41, 0x2f, 0x30, 0x6f, - 0x51, 0x52, 0x4a, 0x49, 0x6b, 0x46, 0x57, 0x66, 0x59, 0x42, 0x75, 0x44, 0x68, 0x59, 0x62, 0x35, 0x52, 0x6b, - 0x69, 0x54, 0x56, 0x78, 0x30, 0x4e, 0x44, 0x66, 0x32, 0x45, 0x44, 0x49, 0x45, 0x6c, 0x53, 0x4d, 0x77, 0x7a, - 0x62, 0x5c, 0x0a, - 0x09, 0x41, 0x50, 0x77, 0x78, 0x51, 0x52, 0x42, 0x4a, 0x6b, 0x6c, 0x53, 0x63, 0x59, 0x52, 0x75, 0x41, 0x50, - 0x79, 0x51, 0x49, 0x49, 0x6b, 0x6d, 0x53, 0x69, 0x72, 0x50, 0x42, 0x74, 0x48, 0x2f, 0x77, 0x4e, 0x73, 0x41, - 0x65, 0x59, 0x41, 0x55, 0x77, 0x4f, 0x55, 0x55, 0x69, 0x53, 0x5a, 0x4b, 0x55, 0x71, 0x39, 0x58, 0x45, 0x37, - 0x66, 0x37, 0x72, 0x42, 0x6e, 0x39, 0x6a, 0x63, 0x41, 0x4b, 0x77, 0x44, 0x76, 0x68, 0x39, 0x69, 0x6b, 0x53, - 0x53, 0x5c, 0x0a, - 0x09, 0x4a, 0x43, 0x6c, 0x33, 0x44, 0x7a, 0x4b, 0x6b, 0x2b, 0x4d, 0x50, 0x36, 0x42, 0x67, 0x44, 0x67, 0x67, - 0x57, 0x4b, 0x7a, 0x53, 0x4a, 0x4b, 0x6b, 0x67, 0x74, 0x79, 0x2f, 0x38, 0x57, 0x2f, 0x30, 0x6a, 0x50, 0x5a, - 0x46, 0x53, 0x5a, 0x4a, 0x55, 0x43, 0x77, 0x73, 0x32, 0x2f, 0x6f, 0x32, 0x65, 0x30, 0x62, 0x34, 0x6f, 0x53, - 0x5a, 0x4a, 0x71, 0x59, 0x64, 0x51, 0x4a, 0x77, 0x48, 0x30, 0x46, 0x42, 0x70, 0x45, 0x6b, 0x53, 0x63, 0x58, - 0x5a, 0x5c, 0x0a, - 0x09, 0x35, 0x45, 0x50, 0x2b, 0x34, 0x46, 0x30, 0x41, 0x45, 0x4d, 0x33, 0x41, 0x63, 0x6d, 0x42, 0x4b, 0x6b, - 0x59, 0x6b, 0x6b, 0x53, 0x56, 0x4b, 0x75, 0x4e, 0x72, 0x6b, 0x44, 0x41, 0x44, 0x61, 0x63, 0x41, 0x4b, 0x77, - 0x44, 0x66, 0x6c, 0x74, 0x6b, 0x49, 0x6b, 0x6d, 0x53, 0x6c, 0x4c, 0x76, 0x66, 0x73, 0x56, 0x48, 0x78, 0x68, - 0x77, 0x30, 0x62, 0x41, 0x49, 0x43, 0x37, 0x69, 0x38, 0x6b, 0x69, 0x53, 0x5a, 0x49, 0x4b, 0x63, 0x74, 0x64, - 0x77, 0x5c, 0x0a, - 0x09, 0x76, 0x32, 0x6b, 0x44, 0x49, 0x45, 0x6c, 0x53, 0x76, 0x51, 0x31, 0x62, 0x32, 0x32, 0x30, 0x41, 0x4a, - 0x45, 0x6d, 0x71, 0x74, 0x33, 0x75, 0x47, 0x2b, 0x38, 0x32, 0x68, 0x46, 0x77, 0x45, 0x43, 0x54, 0x43, 0x4b, - 0x32, 0x42, 0x4a, 0x35, 0x59, 0x52, 0x43, 0x4a, 0x4a, 0x6b, 0x70, 0x53, 0x72, 0x74, 0x63, 0x51, 0x46, 0x67, - 0x47, 0x73, 0x32, 0x2f, 0x73, 0x4c, 0x47, 0x45, 0x34, 0x41, 0x31, 0x65, 0x44, 0x75, 0x67, 0x4a, 0x45, 0x6c, - 0x31, 0x5c, 0x0a, - 0x09, 0x73, 0x59, 0x42, 0x68, 0x69, 0x6a, 0x39, 0x73, 0x32, 0x67, 0x41, 0x41, 0x33, 0x4a, 0x46, 0x76, 0x46, - 0x6b, 0x6d, 0x53, 0x56, 0x4a, 0x42, 0x66, 0x6a, 0x2f, 0x51, 0x46, 0x47, 0x77, 0x42, 0x4a, 0x6b, 0x75, 0x72, - 0x72, 0x39, 0x70, 0x47, 0x2b, 0x4d, 0x46, 0x77, 0x44, 0x4d, 0x4f, 0x49, 0x33, 0x53, 0x35, 0x4b, 0x6b, 0x53, - 0x76, 0x6e, 0x56, 0x53, 0x46, 0x2f, 0x59, 0x2b, 0x43, 0x4a, 0x41, 0x69, 0x4b, 0x62, 0x67, 0x47, 0x57, 0x42, - 0x36, 0x5c, 0x0a, - 0x09, 0x6e, 0x6f, 0x6b, 0x6b, 0x53, 0x56, 0x4b, 0x75, 0x6c, 0x67, 0x47, 0x62, 0x4d, 0x38, 0x77, 0x6d, 0x51, - 0x44, 0x44, 0x38, 0x42, 0x47, 0x41, 0x64, 0x4c, 0x67, 0x4e, 0x49, 0x6b, 0x6c, 0x52, 0x31, 0x64, 0x7a, 0x42, - 0x43, 0x38, 0x59, 0x66, 0x68, 0x47, 0x77, 0x41, 0x59, 0x5a, 0x57, 0x51, 0x67, 0x53, 0x5a, 0x49, 0x71, 0x59, - 0x64, 0x52, 0x61, 0x50, 0x6c, 0x49, 0x44, 0x63, 0x46, 0x73, 0x4f, 0x51, 0x53, 0x52, 0x4a, 0x55, 0x6e, 0x46, - 0x47, 0x5c, 0x0a, - 0x09, 0x72, 0x65, 0x58, 0x44, 0x58, 0x51, 0x4d, 0x41, 0x73, 0x57, 0x6e, 0x41, 0x4d, 0x38, 0x43, 0x45, 0x50, - 0x42, 0x4a, 0x4a, 0x6b, 0x71, 0x52, 0x63, 0x39, 0x51, 0x45, 0x7a, 0x69, 0x63, 0x33, 0x39, 0x68, 0x6a, 0x58, - 0x53, 0x42, 0x47, 0x41, 0x46, 0x49, 0x7a, 0x77, 0x38, 0x51, 0x4a, 0x49, 0x6b, 0x6c, 0x64, 0x35, 0x64, 0x6a, - 0x46, 0x4c, 0x38, 0x59, 0x65, 0x51, 0x47, 0x41, 0x4f, 0x44, 0x57, 0x62, 0x4c, 0x4e, 0x49, 0x6b, 0x71, 0x53, - 0x43, 0x5c, 0x0a, - 0x09, 0x33, 0x44, 0x4c, 0x57, 0x4e, 0x34, 0x7a, 0x57, 0x41, 0x49, 0x7a, 0x35, 0x68, 0x79, 0x56, 0x4a, 0x55, - 0x69, 0x6d, 0x4e, 0x2b, 0x53, 0x46, 0x2b, 0x70, 0x47, 0x73, 0x41, 0x41, 0x47, 0x59, 0x41, 0x54, 0x7a, 0x4e, - 0x36, 0x6b, 0x79, 0x42, 0x4a, 0x6b, 0x73, 0x70, 0x6c, 0x48, 0x54, 0x41, 0x4c, 0x65, 0x48, 0x61, 0x30, 0x62, - 0x78, 0x71, 0x74, 0x75, 0x43, 0x2f, 0x46, 0x36, 0x77, 0x41, 0x6b, 0x53, 0x61, 0x71, 0x61, 0x75, 0x78, 0x6d, - 0x6a, 0x5c, 0x0a, - 0x09, 0x2b, 0x4d, 0x50, 0x59, 0x6e, 0x2b, 0x36, 0x76, 0x7a, 0x79, 0x61, 0x4c, 0x4a, 0x45, 0x6b, 0x71, 0x79, - 0x41, 0x32, 0x74, 0x66, 0x4a, 0x4d, 0x4e, 0x67, 0x43, 0x52, 0x4a, 0x39, 0x64, 0x4a, 0x53, 0x37, 0x52, 0x37, - 0x74, 0x47, 0x67, 0x43, 0x41, 0x53, 0x63, 0x52, 0x2b, 0x41, 0x4a, 0x4f, 0x7a, 0x53, 0x43, 0x52, 0x4a, 0x6b, - 0x6e, 0x4c, 0x31, 0x48, 0x48, 0x48, 0x2f, 0x2f, 0x35, 0x71, 0x78, 0x76, 0x6e, 0x47, 0x73, 0x43, 0x63, 0x41, - 0x61, 0x5c, 0x0a, - 0x09, 0x76, 0x42, 0x74, 0x41, 0x6b, 0x71, 0x53, 0x71, 0x75, 0x49, 0x55, 0x57, 0x69, 0x6a, 0x2b, 0x30, 0x64, - 0x6f, 0x57, 0x2f, 0x79, 0x77, 0x43, 0x53, 0x4a, 0x46, 0x56, 0x44, 0x79, 0x7a, 0x57, 0x37, 0x6c, 0x51, 0x62, - 0x67, 0x4a, 0x31, 0x30, 0x45, 0x6b, 0x53, 0x52, 0x4a, 0x78, 0x57, 0x6d, 0x35, 0x41, 0x52, 0x6a, 0x72, 0x47, - 0x6f, 0x42, 0x42, 0x44, 0x77, 0x45, 0x37, 0x64, 0x52, 0x78, 0x48, 0x6b, 0x69, 0x54, 0x6c, 0x37, 0x57, 0x46, - 0x67, 0x5c, 0x0a, - 0x09, 0x62, 0x71, 0x76, 0x66, 0x33, 0x4f, 0x6f, 0x6d, 0x50, 0x7a, 0x2f, 0x75, 0x4c, 0x49, 0x73, 0x6b, 0x53, - 0x53, 0x70, 0x49, 0x57, 0x37, 0x58, 0x61, 0x42, 0x6b, 0x43, 0x53, 0x70, 0x48, 0x70, 0x6f, 0x71, 0x31, 0x61, - 0x33, 0x75, 0x67, 0x51, 0x77, 0x43, 0x58, 0x67, 0x4b, 0x6d, 0x4e, 0x70, 0x4a, 0x49, 0x6b, 0x6d, 0x53, 0x6c, - 0x4b, 0x75, 0x56, 0x78, 0x50, 0x61, 0x2f, 0x4c, 0x64, 0x30, 0x42, 0x41, 0x4b, 0x31, 0x50, 0x41, 0x4e, 0x62, - 0x67, 0x5c, 0x0a, - 0x09, 0x78, 0x59, 0x43, 0x53, 0x4a, 0x4a, 0x58, 0x56, 0x64, 0x62, 0x52, 0x52, 0x2f, 0x4b, 0x47, 0x39, 0x42, - 0x2f, 0x33, 0x38, 0x71, 0x4c, 0x30, 0x73, 0x6b, 0x69, 0x53, 0x70, 0x49, 0x44, 0x39, 0x6f, 0x39, 0x77, 0x2b, - 0x30, 0x75, 0x67, 0x51, 0x41, 0x38, 0x58, 0x54, 0x41, 0x78, 0x63, 0x44, 0x45, 0x64, 0x67, 0x38, 0x69, 0x53, - 0x5a, 0x4a, 0x79, 0x73, 0x78, 0x62, 0x59, 0x6b, 0x68, 0x59, 0x65, 0x41, 0x44, 0x52, 0x55, 0x4f, 0x78, 0x4f, - 0x41, 0x5c, 0x0a, - 0x09, 0x70, 0x63, 0x44, 0x50, 0x32, 0x6e, 0x6c, 0x7a, 0x53, 0x5a, 0x4b, 0x55, 0x75, 0x78, 0x74, 0x70, 0x73, - 0x2f, 0x68, 0x44, 0x65, 0x77, 0x30, 0x41, 0x77, 0x46, 0x58, 0x74, 0x48, 0x6b, 0x43, 0x53, 0x4a, 0x4f, 0x57, - 0x71, 0x6f, 0x39, 0x72, 0x63, 0x7a, 0x68, 0x49, 0x41, 0x77, 0x47, 0x78, 0x67, 0x45, 0x54, 0x43, 0x2b, 0x6b, - 0x34, 0x4e, 0x4a, 0x6b, 0x71, 0x52, 0x4d, 0x39, 0x51, 0x46, 0x7a, 0x67, 0x43, 0x58, 0x74, 0x2f, 0x73, 0x46, - 0x32, 0x5c, 0x0a, - 0x09, 0x4a, 0x77, 0x42, 0x4c, 0x38, 0x4f, 0x46, 0x41, 0x6b, 0x69, 0x53, 0x56, 0x78, 0x61, 0x31, 0x30, 0x55, - 0x50, 0x79, 0x68, 0x2f, 0x51, 0x59, 0x41, 0x34, 0x4d, 0x70, 0x4f, 0x44, 0x69, 0x52, 0x4a, 0x6b, 0x6a, 0x4a, - 0x33, 0x52, 0x61, 0x64, 0x2f, 0x73, 0x4e, 0x30, 0x6c, 0x41, 0x49, 0x69, 0x4e, 0x42, 0x68, 0x37, 0x48, 0x75, - 0x77, 0x45, 0x6b, 0x53, 0x55, 0x70, 0x70, 0x4c, 0x66, 0x42, 0x79, 0x59, 0x71, 0x4f, 0x2b, 0x74, 0x6e, 0x55, - 0x79, 0x5c, 0x0a, - 0x09, 0x41, 0x58, 0x69, 0x4b, 0x32, 0x48, 0x42, 0x41, 0x6b, 0x69, 0x53, 0x6c, 0x63, 0x78, 0x30, 0x64, 0x46, - 0x6e, 0x2f, 0x6f, 0x72, 0x41, 0x45, 0x41, 0x75, 0x4c, 0x7a, 0x54, 0x41, 0x30, 0x71, 0x53, 0x70, 0x45, 0x78, - 0x30, 0x56, 0x59, 0x73, 0x37, 0x57, 0x51, 0x49, 0x41, 0x6d, 0x41, 0x49, 0x38, 0x4f, 0x66, 0x43, 0x6a, 0x4a, - 0x45, 0x6b, 0x71, 0x31, 0x69, 0x70, 0x69, 0x38, 0x35, 0x39, 0x56, 0x6e, 0x62, 0x35, 0x42, 0x70, 0x78, 0x4f, - 0x41, 0x5c, 0x0a, - 0x09, 0x56, 0x58, 0x53, 0x77, 0x37, 0x61, 0x41, 0x6b, 0x53, 0x63, 0x72, 0x45, 0x44, 0x2b, 0x69, 0x69, 0x2b, - 0x45, 0x50, 0x6e, 0x44, 0x51, 0x44, 0x41, 0x70, 0x64, 0x30, 0x63, 0x57, 0x4a, 0x49, 0x6b, 0x64, 0x61, 0x7a, - 0x72, 0x47, 0x74, 0x7a, 0x70, 0x45, 0x67, 0x42, 0x45, 0x38, 0x2f, 0x41, 0x49, 0x73, 0x45, 0x32, 0x33, 0x49, - 0x53, 0x52, 0x4a, 0x55, 0x73, 0x73, 0x65, 0x41, 0x37, 0x59, 0x6e, 0x4e, 0x67, 0x48, 0x71, 0x57, 0x44, 0x63, - 0x54, 0x5c, 0x0a, - 0x09, 0x67, 0x48, 0x58, 0x41, 0x4a, 0x64, 0x30, 0x63, 0x58, 0x4a, 0x49, 0x6b, 0x74, 0x65, 0x31, 0x62, 0x64, - 0x46, 0x6e, 0x38, 0x6f, 0x62, 0x73, 0x4a, 0x41, 0x4d, 0x41, 0x72, 0x67, 0x64, 0x38, 0x44, 0x34, 0x37, 0x6f, - 0x4e, 0x49, 0x6b, 0x6d, 0x53, 0x78, 0x74, 0x51, 0x50, 0x76, 0x42, 0x72, 0x34, 0x59, 0x37, 0x64, 0x76, 0x31, - 0x4d, 0x30, 0x45, 0x67, 0x49, 0x45, 0x41, 0x74, 0x33, 0x55, 0x62, 0x51, 0x70, 0x49, 0x6b, 0x74, 0x65, 0x51, - 0x32, 0x5c, 0x0a, - 0x09, 0x4d, 0x69, 0x6a, 0x2b, 0x30, 0x48, 0x30, 0x44, 0x41, 0x48, 0x42, 0x78, 0x42, 0x75, 0x38, 0x68, 0x53, - 0x5a, 0x4c, 0x47, 0x39, 0x73, 0x32, 0x73, 0x33, 0x71, 0x6a, 0x62, 0x4a, 0x51, 0x43, 0x41, 0x71, 0x63, 0x43, - 0x6a, 0x77, 0x50, 0x54, 0x75, 0x34, 0x30, 0x69, 0x53, 0x70, 0x42, 0x45, 0x73, 0x49, 0x79, 0x36, 0x38, 0x58, - 0x35, 0x6e, 0x46, 0x6d, 0x32, 0x55, 0x78, 0x41, 0x56, 0x68, 0x4a, 0x58, 0x4a, 0x41, 0x67, 0x53, 0x5a, 0x4c, - 0x79, 0x5c, 0x0a, - 0x09, 0x63, 0x79, 0x6b, 0x5a, 0x46, 0x58, 0x2f, 0x49, 0x5a, 0x67, 0x49, 0x41, 0x73, 0x43, 0x74, 0x77, 0x58, - 0x78, 0x5a, 0x76, 0x4a, 0x45, 0x6d, 0x53, 0x68, 0x72, 0x55, 0x62, 0x73, 0x43, 0x43, 0x72, 0x4e, 0x38, 0x74, - 0x69, 0x41, 0x67, 0x41, 0x52, 0x36, 0x4f, 0x63, 0x5a, 0x76, 0x5a, 0x63, 0x6b, 0x53, 0x64, 0x72, 0x51, 0x7a, - 0x38, 0x6d, 0x77, 0x2b, 0x45, 0x4e, 0x32, 0x44, 0x51, 0x44, 0x41, 0x68, 0x52, 0x6d, 0x2b, 0x6c, 0x79, 0x52, - 0x4a, 0x5c, 0x0a, - 0x09, 0x57, 0x75, 0x39, 0x72, 0x57, 0x62, 0x39, 0x68, 0x56, 0x6b, 0x73, 0x41, 0x41, 0x4c, 0x33, 0x45, 0x78, - 0x59, 0x43, 0x7a, 0x73, 0x33, 0x70, 0x44, 0x53, 0x5a, 0x4c, 0x45, 0x45, 0x75, 0x4c, 0x69, 0x76, 0x2b, 0x65, - 0x7a, 0x66, 0x4e, 0x4d, 0x73, 0x4a, 0x77, 0x44, 0x50, 0x41, 0x31, 0x2f, 0x50, 0x38, 0x50, 0x30, 0x6b, 0x53, - 0x56, 0x4c, 0x55, 0x31, 0x6b, 0x79, 0x4c, 0x50, 0x32, 0x51, 0x37, 0x41, 0x51, 0x43, 0x59, 0x41, 0x2f, 0x79, - 0x5a, 0x5c, 0x0a, - 0x09, 0x6d, 0x41, 0x5a, 0x49, 0x6b, 0x71, 0x54, 0x75, 0x50, 0x41, 0x2b, 0x38, 0x41, 0x6c, 0x69, 0x55, 0x39, - 0x52, 0x74, 0x6e, 0x4f, 0x51, 0x47, 0x41, 0x43, 0x50, 0x6a, 0x74, 0x6a, 0x4e, 0x39, 0x54, 0x6b, 0x71, 0x53, - 0x6d, 0x2b, 0x6a, 0x59, 0x35, 0x46, 0x48, 0x2f, 0x49, 0x66, 0x67, 0x49, 0x41, 0x73, 0x42, 0x64, 0x77, 0x56, - 0x39, 0x5a, 0x76, 0x4b, 0x6b, 0x6c, 0x53, 0x41, 0x2b, 0x30, 0x4e, 0x33, 0x4a, 0x33, 0x48, 0x47, 0x32, 0x63, - 0x39, 0x5c, 0x0a, - 0x09, 0x41, 0x59, 0x41, 0x49, 0x65, 0x6e, 0x4d, 0x4f, 0x37, 0x79, 0x74, 0x4a, 0x55, 0x70, 0x50, 0x63, 0x54, - 0x45, 0x37, 0x46, 0x48, 0x2f, 0x4a, 0x70, 0x41, 0x41, 0x43, 0x2b, 0x6b, 0x4e, 0x50, 0x37, 0x53, 0x70, 0x4c, - 0x55, 0x46, 0x46, 0x2f, 0x4d, 0x38, 0x38, 0x33, 0x7a, 0x57, 0x41, 0x4b, 0x41, 0x61, 0x43, 0x77, 0x57, 0x41, - 0x44, 0x76, 0x6e, 0x38, 0x65, 0x61, 0x53, 0x4a, 0x4e, 0x58, 0x63, 0x37, 0x34, 0x46, 0x64, 0x67, 0x48, 0x56, - 0x35, 0x5c, 0x0a, - 0x09, 0x48, 0x53, 0x43, 0x76, 0x43, 0x63, 0x41, 0x36, 0x34, 0x4e, 0x79, 0x63, 0x33, 0x6c, 0x75, 0x53, 0x70, - 0x4c, 0x6f, 0x37, 0x6c, 0x78, 0x79, 0x4c, 0x50, 0x2b, 0x51, 0x33, 0x41, 0x59, 0x43, 0x34, 0x46, 0x66, 0x43, - 0x2f, 0x67, 0x4b, 0x33, 0x7a, 0x4f, 0x6f, 0x41, 0x6b, 0x53, 0x54, 0x58, 0x30, 0x4f, 0x4c, 0x41, 0x44, 0x4f, - 0x64, 0x7a, 0x37, 0x50, 0x31, 0x52, 0x65, 0x45, 0x77, 0x43, 0x49, 0x34, 0x4f, 0x66, 0x6e, 0x2b, 0x50, 0x36, - 0x53, 0x5c, 0x0a, - 0x09, 0x4a, 0x4e, 0x58, 0x52, 0x2b, 0x65, 0x52, 0x63, 0x2f, 0x43, 0x48, 0x66, 0x43, 0x51, 0x44, 0x41, 0x56, - 0x47, 0x41, 0x68, 0x4d, 0x44, 0x50, 0x50, 0x67, 0x30, 0x69, 0x53, 0x56, 0x42, 0x4e, 0x4c, 0x67, 0x57, 0x33, - 0x4a, 0x38, 0x4c, 0x47, 0x2f, 0x49, 0x38, 0x6c, 0x7a, 0x41, 0x67, 0x44, 0x78, 0x46, 0x38, 0x6a, 0x31, 0x4b, - 0x6b, 0x5a, 0x4a, 0x6b, 0x6d, 0x72, 0x6b, 0x41, 0x67, 0x6f, 0x6f, 0x2f, 0x70, 0x44, 0x2f, 0x42, 0x41, 0x42, - 0x67, 0x5c, 0x0a, - 0x09, 0x42, 0x76, 0x43, 0x6e, 0x67, 0x52, 0x38, 0x6c, 0x53, 0x64, 0x4c, 0x77, 0x6c, 0x68, 0x46, 0x72, 0x2f, - 0x38, 0x38, 0x57, 0x63, 0x62, 0x43, 0x38, 0x4a, 0x77, 0x41, 0x51, 0x34, 0x34, 0x77, 0x4c, 0x43, 0x6a, 0x69, - 0x4f, 0x4a, 0x45, 0x6c, 0x56, 0x64, 0x67, 0x45, 0x46, 0x46, 0x58, 0x38, 0x6f, 0x5a, 0x67, 0x49, 0x41, 0x63, - 0x51, 0x33, 0x41, 0x6e, 0x34, 0x44, 0x70, 0x52, 0x52, 0x78, 0x4d, 0x6b, 0x71, 0x53, 0x4b, 0x57, 0x55, 0x34, - 0x38, 0x5c, 0x0a, - 0x09, 0x39, 0x4b, 0x65, 0x77, 0x42, 0x71, 0x43, 0x49, 0x43, 0x51, 0x44, 0x45, 0x58, 0x2b, 0x68, 0x4c, 0x42, - 0x52, 0x31, 0x4c, 0x6b, 0x71, 0x53, 0x71, 0x4b, 0x66, 0x54, 0x54, 0x50, 0x78, 0x51, 0x33, 0x41, 0x51, 0x44, - 0x59, 0x6e, 0x4a, 0x67, 0x43, 0x54, 0x43, 0x76, 0x71, 0x67, 0x4a, 0x49, 0x6b, 0x56, 0x63, 0x42, 0x79, 0x59, - 0x75, 0x33, 0x2f, 0x6d, 0x53, 0x49, 0x50, 0x57, 0x74, 0x51, 0x45, 0x41, 0x4f, 0x49, 0x76, 0x64, 0x6c, 0x36, - 0x42, 0x5c, 0x0a, - 0x09, 0x78, 0x35, 0x4d, 0x6b, 0x71, 0x51, 0x72, 0x4f, 0x6f, 0x2b, 0x44, 0x69, 0x44, 0x38, 0x56, 0x4f, 0x41, - 0x41, 0x41, 0x32, 0x41, 0x78, 0x34, 0x43, 0x74, 0x69, 0x6a, 0x79, 0x6f, 0x4a, 0x49, 0x6b, 0x6c, 0x64, 0x52, - 0x69, 0x59, 0x43, 0x36, 0x77, 0x6f, 0x75, 0x67, 0x44, 0x46, 0x7a, 0x6b, 0x42, 0x67, 0x50, 0x67, 0x4c, 0x6e, - 0x6c, 0x50, 0x77, 0x4d, 0x53, 0x56, 0x4a, 0x4b, 0x71, 0x74, 0x7a, 0x53, 0x46, 0x44, 0x38, 0x6f, 0x66, 0x67, - 0x4a, 0x5c, 0x0a, - 0x09, 0x41, 0x4d, 0x41, 0x6b, 0x34, 0x69, 0x6c, 0x48, 0x32, 0x78, 0x64, 0x39, 0x59, 0x45, 0x6d, 0x53, 0x53, - 0x75, 0x51, 0x52, 0x34, 0x4e, 0x58, 0x41, 0x6d, 0x68, 0x51, 0x48, 0x4c, 0x33, 0x6f, 0x43, 0x41, 0x50, 0x45, - 0x58, 0x2f, 0x57, 0x53, 0x43, 0x34, 0x30, 0x71, 0x53, 0x56, 0x43, 0x61, 0x66, 0x4a, 0x46, 0x48, 0x78, 0x68, - 0x7a, 0x51, 0x54, 0x41, 0x49, 0x44, 0x78, 0x77, 0x4e, 0x33, 0x41, 0x37, 0x69, 0x6b, 0x4f, 0x4c, 0x6b, 0x6c, - 0x53, 0x5c, 0x0a, - 0x09, 0x59, 0x76, 0x63, 0x42, 0x65, 0x77, 0x4a, 0x39, 0x71, 0x51, 0x4b, 0x6b, 0x6d, 0x41, 0x42, 0x41, 0x2f, - 0x49, 0x58, 0x50, 0x53, 0x48, 0x52, 0x73, 0x53, 0x5a, 0x4a, 0x53, 0x4f, 0x35, 0x4f, 0x45, 0x78, 0x52, 0x2f, - 0x53, 0x4e, 0x51, 0x41, 0x41, 0x31, 0x77, 0x48, 0x58, 0x4a, 0x6a, 0x79, 0x2b, 0x4a, 0x45, 0x6b, 0x70, 0x2f, - 0x4a, 0x51, 0x53, 0x31, 0x4c, 0x39, 0x55, 0x53, 0x77, 0x43, 0x44, 0x64, 0x67, 0x56, 0x2b, 0x53, 0x79, 0x77, - 0x4a, 0x5c, 0x0a, - 0x09, 0x53, 0x4a, 0x4a, 0x55, 0x64, 0x33, 0x33, 0x41, 0x58, 0x73, 0x43, 0x39, 0x71, 0x59, 0x4f, 0x6b, 0x6e, - 0x41, 0x41, 0x41, 0x4c, 0x41, 0x44, 0x2b, 0x62, 0x2b, 0x49, 0x4d, 0x6b, 0x69, 0x51, 0x56, 0x35, 0x64, 0x38, - 0x70, 0x51, 0x66, 0x47, 0x48, 0x39, 0x42, 0x4d, 0x41, 0x67, 0x43, 0x32, 0x42, 0x50, 0x2b, 0x41, 0x57, 0x77, - 0x5a, 0x4b, 0x6b, 0x65, 0x6c, 0x74, 0x4f, 0x33, 0x50, 0x62, 0x33, 0x52, 0x4f, 0x6f, 0x67, 0x6b, 0x48, 0x34, - 0x43, 0x5c, 0x0a, - 0x09, 0x41, 0x50, 0x41, 0x6b, 0x38, 0x4b, 0x6e, 0x55, 0x49, 0x53, 0x52, 0x4a, 0x79, 0x74, 0x6d, 0x6e, 0x4b, - 0x45, 0x6e, 0x78, 0x68, 0x33, 0x4a, 0x4d, 0x41, 0x41, 0x41, 0x6d, 0x41, 0x72, 0x38, 0x44, 0x64, 0x6b, 0x34, - 0x64, 0x52, 0x4a, 0x4b, 0x6b, 0x48, 0x44, 0x77, 0x49, 0x37, 0x41, 0x47, 0x73, 0x54, 0x52, 0x31, 0x6b, 0x55, - 0x42, 0x6b, 0x6d, 0x41, 0x42, 0x44, 0x2f, 0x51, 0x55, 0x35, 0x4e, 0x48, 0x55, 0x4b, 0x53, 0x70, 0x4a, 0x79, - 0x63, 0x5c, 0x0a, - 0x09, 0x52, 0x6f, 0x6d, 0x4b, 0x50, 0x35, 0x53, 0x6e, 0x41, 0x51, 0x43, 0x34, 0x48, 0x72, 0x67, 0x69, 0x64, - 0x51, 0x68, 0x4a, 0x6b, 0x6a, 0x4a, 0x32, 0x4e, 0x58, 0x48, 0x72, 0x65, 0x36, 0x6d, 0x55, 0x5a, 0x51, 0x6c, - 0x67, 0x30, 0x48, 0x62, 0x41, 0x41, 0x38, 0x44, 0x6b, 0x31, 0x45, 0x45, 0x6b, 0x53, 0x63, 0x72, 0x41, 0x61, - 0x6d, 0x41, 0x65, 0x73, 0x44, 0x42, 0x31, 0x6b, 0x49, 0x32, 0x56, 0x61, 0x51, 0x49, 0x41, 0x38, 0x52, 0x2f, - 0x49, 0x5c, 0x0a, - 0x09, 0x43, 0x77, 0x49, 0x6c, 0x53, 0x58, 0x58, 0x78, 0x62, 0x35, 0x53, 0x77, 0x2b, 0x45, 0x50, 0x35, 0x4a, - 0x67, 0x41, 0x51, 0x46, 0x77, 0x54, 0x2b, 0x42, 0x70, 0x38, 0x54, 0x49, 0x45, 0x6d, 0x71, 0x74, 0x6e, 0x75, - 0x42, 0x31, 0x31, 0x4b, 0x79, 0x74, 0x66, 0x39, 0x42, 0x5a, 0x5a, 0x73, 0x41, 0x51, 0x50, 0x79, 0x48, 0x4f, - 0x67, 0x6c, 0x59, 0x6c, 0x7a, 0x71, 0x49, 0x4a, 0x45, 0x6b, 0x64, 0x36, 0x69, 0x64, 0x71, 0x57, 0x53, 0x6d, - 0x4c, 0x5c, 0x0a, - 0x09, 0x50, 0x35, 0x53, 0x7a, 0x41, 0x51, 0x44, 0x34, 0x4a, 0x58, 0x42, 0x52, 0x36, 0x68, 0x43, 0x53, 0x4a, - 0x48, 0x58, 0x6f, 0x47, 0x30, 0x51, 0x74, 0x4b, 0x36, 0x30, 0x79, 0x4c, 0x67, 0x45, 0x4d, 0x6d, 0x6b, 0x46, - 0x63, 0x45, 0x4c, 0x68, 0x56, 0x36, 0x69, 0x43, 0x53, 0x4a, 0x4c, 0x58, 0x68, 0x53, 0x57, 0x4a, 0x66, 0x6d, - 0x36, 0x57, 0x70, 0x67, 0x34, 0x79, 0x6d, 0x72, 0x42, 0x4d, 0x41, 0x69, 0x50, 0x39, 0x77, 0x48, 0x30, 0x6b, - 0x64, 0x5c, 0x0a, - 0x09, 0x51, 0x70, 0x4b, 0x6b, 0x4e, 0x70, 0x31, 0x43, 0x79, 0x59, 0x73, 0x2f, 0x6c, 0x4c, 0x73, 0x42, 0x41, - 0x4c, 0x68, 0x79, 0x34, 0x43, 0x56, 0x4a, 0x55, 0x68, 0x56, 0x55, 0x70, 0x6d, 0x36, 0x56, 0x65, 0x51, 0x6c, - 0x67, 0x30, 0x42, 0x62, 0x45, 0x55, 0x77, 0x4e, 0x6e, 0x70, 0x51, 0x34, 0x69, 0x53, 0x64, 0x49, 0x6f, 0x6e, - 0x69, 0x48, 0x75, 0x2b, 0x56, 0x2b, 0x63, 0x4f, 0x6b, 0x67, 0x72, 0x79, 0x6a, 0x34, 0x42, 0x67, 0x50, 0x67, - 0x50, 0x5c, 0x0a, - 0x09, 0x65, 0x58, 0x72, 0x71, 0x45, 0x4a, 0x49, 0x6b, 0x6a, 0x65, 0x45, 0x30, 0x4b, 0x6c, 0x4c, 0x38, 0x6f, - 0x52, 0x6f, 0x54, 0x67, 0x45, 0x48, 0x58, 0x41, 0x50, 0x4e, 0x54, 0x68, 0x35, 0x41, 0x6b, 0x61, 0x52, 0x67, - 0x2f, 0x42, 0x41, 0x35, 0x50, 0x48, 0x61, 0x49, 0x64, 0x56, 0x57, 0x6f, 0x41, 0x35, 0x67, 0x44, 0x33, 0x41, - 0x5a, 0x75, 0x6e, 0x44, 0x69, 0x4a, 0x4a, 0x30, 0x68, 0x44, 0x50, 0x41, 0x4c, 0x73, 0x42, 0x69, 0x31, 0x49, - 0x48, 0x5c, 0x0a, - 0x09, 0x61, 0x55, 0x63, 0x56, 0x6c, 0x67, 0x41, 0x47, 0x4c, 0x53, 0x49, 0x32, 0x56, 0x5a, 0x41, 0x6b, 0x71, - 0x55, 0x78, 0x4f, 0x6f, 0x6d, 0x4c, 0x46, 0x48, 0x36, 0x72, 0x56, 0x41, 0x45, 0x41, 0x38, 0x4c, 0x66, 0x42, - 0x62, 0x71, 0x55, 0x4e, 0x49, 0x6b, 0x6a, 0x54, 0x67, 0x55, 0x69, 0x72, 0x36, 0x4a, 0x4e, 0x73, 0x71, 0x4c, - 0x51, 0x45, 0x4d, 0x6d, 0x67, 0x48, 0x38, 0x6c, 0x6e, 0x68, 0x79, 0x6f, 0x43, 0x52, 0x4a, 0x71, 0x66, 0x77, - 0x46, 0x5c, 0x0a, - 0x09, 0x32, 0x49, 0x4d, 0x4b, 0x33, 0x50, 0x4d, 0x2f, 0x6e, 0x4b, 0x70, 0x4e, 0x41, 0x43, 0x44, 0x2b, 0x51, - 0x33, 0x2b, 0x51, 0x32, 0x47, 0x64, 0x5a, 0x6b, 0x71, 0x51, 0x55, 0x2b, 0x6f, 0x6c, 0x61, 0x56, 0x4d, 0x6e, - 0x69, 0x44, 0x39, 0x56, 0x73, 0x41, 0x41, 0x42, 0x75, 0x41, 0x73, 0x35, 0x4c, 0x48, 0x55, 0x4b, 0x53, 0x31, - 0x46, 0x69, 0x66, 0x42, 0x32, 0x35, 0x4d, 0x48, 0x61, 0x49, 0x62, 0x56, 0x56, 0x77, 0x43, 0x47, 0x4e, 0x51, - 0x4c, 0x5c, 0x0a, - 0x09, 0x33, 0x41, 0x62, 0x73, 0x6b, 0x7a, 0x71, 0x49, 0x4a, 0x4b, 0x6c, 0x52, 0x37, 0x67, 0x51, 0x4f, 0x42, - 0x4a, 0x35, 0x50, 0x48, 0x61, 0x51, 0x62, 0x56, 0x57, 0x34, 0x41, 0x41, 0x4f, 0x59, 0x43, 0x64, 0x77, 0x47, - 0x62, 0x70, 0x51, 0x34, 0x69, 0x53, 0x57, 0x71, 0x45, 0x46, 0x63, 0x44, 0x65, 0x77, 0x45, 0x4f, 0x70, 0x67, - 0x33, 0x53, 0x72, 0x71, 0x6b, 0x73, 0x41, 0x67, 0x78, 0x34, 0x43, 0x54, 0x6b, 0x34, 0x64, 0x51, 0x70, 0x4c, - 0x55, 0x5c, 0x0a, - 0x09, 0x47, 0x43, 0x64, 0x54, 0x67, 0x2b, 0x49, 0x50, 0x31, 0x57, 0x38, 0x41, 0x41, 0x43, 0x34, 0x44, 0x4c, - 0x6b, 0x6b, 0x64, 0x51, 0x70, 0x4a, 0x55, 0x65, 0x39, 0x38, 0x69, 0x61, 0x6b, 0x34, 0x74, 0x56, 0x48, 0x30, - 0x4a, 0x59, 0x4e, 0x42, 0x55, 0x34, 0x41, 0x37, 0x69, 0x49, 0x51, 0x79, 0x53, 0x4a, 0x47, 0x58, 0x74, 0x51, - 0x57, 0x42, 0x66, 0x59, 0x47, 0x58, 0x71, 0x49, 0x46, 0x6d, 0x70, 0x77, 0x77, 0x51, 0x41, 0x34, 0x6e, 0x2b, - 0x51, 0x5c, 0x0a, - 0x09, 0x6f, 0x34, 0x42, 0x56, 0x71, 0x59, 0x4e, 0x49, 0x6b, 0x6d, 0x70, 0x6e, 0x46, 0x58, 0x41, 0x6b, 0x4e, - 0x53, 0x72, 0x2b, 0x55, 0x4a, 0x38, 0x47, 0x41, 0x4f, 0x42, 0x2b, 0x34, 0x4d, 0x54, 0x55, 0x49, 0x53, 0x52, - 0x4a, 0x74, 0x66, 0x4d, 0x68, 0x6f, 0x73, 0x62, 0x55, 0x53, 0x70, 0x30, 0x61, 0x41, 0x49, 0x44, 0x4c, 0x67, - 0x61, 0x2b, 0x6d, 0x44, 0x69, 0x46, 0x4a, 0x71, 0x6f, 0x30, 0x4c, 0x71, 0x64, 0x47, 0x36, 0x2f, 0x31, 0x42, - 0x31, 0x5c, 0x0a, - 0x09, 0x75, 0x51, 0x5a, 0x67, 0x4b, 0x50, 0x63, 0x48, 0x6b, 0x43, 0x52, 0x6c, 0x6f, 0x52, 0x62, 0x33, 0x2b, - 0x34, 0x2b, 0x6b, 0x6a, 0x67, 0x30, 0x41, 0x78, 0x48, 0x4d, 0x43, 0x37, 0x67, 0x52, 0x6d, 0x70, 0x77, 0x34, - 0x69, 0x53, 0x61, 0x71, 0x6b, 0x4a, 0x63, 0x51, 0x48, 0x79, 0x59, 0x57, 0x70, 0x67, 0x2b, 0x53, 0x6c, 0x62, - 0x6b, 0x73, 0x41, 0x67, 0x78, 0x59, 0x43, 0x52, 0x77, 0x4e, 0x72, 0x55, 0x77, 0x65, 0x52, 0x4a, 0x46, 0x58, - 0x4f, 0x5c, 0x0a, - 0x09, 0x57, 0x75, 0x44, 0x64, 0x31, 0x4c, 0x6a, 0x34, 0x51, 0x33, 0x30, 0x62, 0x41, 0x49, 0x42, 0x62, 0x67, - 0x49, 0x2b, 0x6e, 0x44, 0x69, 0x46, 0x4a, 0x71, 0x70, 0x77, 0x7a, 0x67, 0x4a, 0x74, 0x54, 0x68, 0x38, 0x68, - 0x62, 0x58, 0x5a, 0x63, 0x41, 0x68, 0x76, 0x70, 0x33, 0x34, 0x50, 0x6a, 0x55, 0x49, 0x53, 0x52, 0x4a, 0x6c, - 0x58, 0x41, 0x78, 0x63, 0x45, 0x4c, 0x71, 0x45, 0x45, 0x56, 0x6f, 0x51, 0x67, 0x50, 0x51, 0x43, 0x39, 0x77, - 0x4b, 0x5c, 0x0a, - 0x09, 0x37, 0x4a, 0x38, 0x36, 0x69, 0x43, 0x53, 0x70, 0x31, 0x47, 0x34, 0x48, 0x33, 0x6b, 0x52, 0x4e, 0x4c, - 0x2f, 0x72, 0x62, 0x57, 0x42, 0x4d, 0x61, 0x41, 0x49, 0x41, 0x35, 0x78, 0x45, 0x36, 0x42, 0x32, 0x36, 0x51, - 0x4f, 0x49, 0x6b, 0x6b, 0x71, 0x70, 0x55, 0x65, 0x4a, 0x44, 0x34, 0x71, 0x50, 0x70, 0x77, 0x35, 0x53, 0x6c, - 0x44, 0x70, 0x66, 0x41, 0x7a, 0x44, 0x55, 0x49, 0x75, 0x44, 0x76, 0x71, 0x4e, 0x6b, 0x75, 0x54, 0x70, 0x4b, - 0x6b, 0x5c, 0x0a, - 0x09, 0x54, 0x4b, 0x77, 0x69, 0x61, 0x6b, 0x52, 0x6a, 0x69, 0x6a, 0x38, 0x30, 0x70, 0x77, 0x45, 0x41, 0x75, - 0x42, 0x63, 0x34, 0x46, 0x75, 0x68, 0x4c, 0x48, 0x55, 0x53, 0x53, 0x56, 0x42, 0x70, 0x39, 0x77, 0x44, 0x46, - 0x45, 0x6a, 0x57, 0x69, 0x55, 0x4a, 0x6a, 0x55, 0x41, 0x41, 0x4e, 0x63, 0x41, 0x2f, 0x7a, 0x4e, 0x31, 0x43, - 0x45, 0x6c, 0x53, 0x61, 0x66, 0x77, 0x54, 0x55, 0x52, 0x73, 0x61, 0x70, 0x79, 0x6e, 0x58, 0x41, 0x47, 0x7a, - 0x73, 0x5c, 0x0a, - 0x09, 0x71, 0x38, 0x51, 0x7a, 0x6e, 0x53, 0x56, 0x4a, 0x7a, 0x58, 0x55, 0x68, 0x38, 0x4f, 0x48, 0x55, 0x49, - 0x56, 0x4a, 0x70, 0x61, 0x67, 0x4d, 0x77, 0x48, 0x72, 0x67, 0x61, 0x4f, 0x44, 0x78, 0x31, 0x45, 0x45, 0x6c, - 0x53, 0x45, 0x74, 0x63, 0x41, 0x52, 0x39, 0x44, 0x67, 0x5a, 0x65, 0x47, 0x6d, 0x4e, 0x67, 0x41, 0x41, 0x6b, - 0x34, 0x45, 0x62, 0x38, 0x66, 0x5a, 0x41, 0x53, 0x57, 0x71, 0x61, 0x32, 0x34, 0x47, 0x44, 0x67, 0x64, 0x57, - 0x70, 0x5c, 0x0a, - 0x09, 0x67, 0x36, 0x54, 0x55, 0x35, 0x41, 0x59, 0x41, 0x34, 0x6c, 0x6b, 0x42, 0x76, 0x77, 0x54, 0x6d, 0x70, - 0x67, 0x34, 0x69, 0x53, 0x53, 0x72, 0x45, 0x51, 0x38, 0x41, 0x42, 0x78, 0x46, 0x37, 0x2f, 0x6a, 0x64, 0x61, - 0x30, 0x69, 0x77, 0x41, 0x33, 0x74, 0x67, 0x52, 0x34, 0x47, 0x2f, 0x34, 0x66, 0x51, 0x5a, 0x4b, 0x61, 0x77, - 0x48, 0x50, 0x2b, 0x45, 0x45, 0x31, 0x76, 0x41, 0x43, 0x43, 0x36, 0x77, 0x58, 0x63, 0x41, 0x79, 0x31, 0x49, - 0x48, 0x5c, 0x0a, - 0x09, 0x6b, 0x53, 0x54, 0x6c, 0x5a, 0x68, 0x6b, 0x77, 0x6e, 0x7a, 0x6a, 0x6e, 0x43, 0x78, 0x75, 0x41, 0x51, - 0x58, 0x63, 0x51, 0x46, 0x34, 0x4d, 0x38, 0x6c, 0x7a, 0x71, 0x49, 0x4a, 0x43, 0x6c, 0x7a, 0x66, 0x79, 0x58, - 0x4f, 0x38, 0x62, 0x65, 0x6e, 0x44, 0x6c, 0x49, 0x6d, 0x4e, 0x67, 0x44, 0x72, 0x33, 0x51, 0x69, 0x38, 0x68, - 0x77, 0x5a, 0x66, 0x45, 0x53, 0x70, 0x4a, 0x4e, 0x64, 0x51, 0x48, 0x2f, 0x44, 0x31, 0x78, 0x6a, 0x74, 0x63, - 0x51, 0x5c, 0x0a, - 0x09, 0x4e, 0x67, 0x41, 0x62, 0x75, 0x67, 0x62, 0x34, 0x41, 0x4e, 0x44, 0x6f, 0x4b, 0x79, 0x4d, 0x6c, 0x71, - 0x53, 0x62, 0x36, 0x69, 0x58, 0x4e, 0x36, 0x49, 0x7a, 0x66, 0x36, 0x47, 0x59, 0x73, 0x4e, 0x77, 0x4b, 0x59, - 0x75, 0x41, 0x30, 0x35, 0x4e, 0x48, 0x55, 0x4b, 0x53, 0x31, 0x4c, 0x56, 0x54, 0x69, 0x58, 0x4f, 0x36, 0x68, - 0x6d, 0x45, 0x44, 0x4d, 0x4c, 0x77, 0x76, 0x41, 0x32, 0x65, 0x6d, 0x44, 0x69, 0x46, 0x4a, 0x36, 0x74, 0x69, - 0x5a, 0x5c, 0x0a, - 0x09, 0x78, 0x4c, 0x6c, 0x63, 0x49, 0x37, 0x41, 0x42, 0x47, 0x4e, 0x6e, 0x6e, 0x67, 0x45, 0x2b, 0x6b, 0x44, - 0x69, 0x46, 0x4a, 0x61, 0x74, 0x75, 0x2f, 0x45, 0x4f, 0x64, 0x77, 0x6a, 0x63, 0x49, 0x47, 0x59, 0x48, 0x54, - 0x6e, 0x41, 0x47, 0x65, 0x6e, 0x44, 0x69, 0x46, 0x4a, 0x61, 0x74, 0x6e, 0x5a, 0x77, 0x4b, 0x64, 0x54, 0x68, - 0x36, 0x69, 0x43, 0x70, 0x75, 0x38, 0x45, 0x32, 0x4b, 0x70, 0x50, 0x41, 0x32, 0x65, 0x6c, 0x44, 0x69, 0x46, - 0x4a, 0x5c, 0x0a, - 0x09, 0x47, 0x74, 0x56, 0x6e, 0x38, 0x46, 0x7a, 0x64, 0x4d, 0x69, 0x63, 0x41, 0x72, 0x66, 0x6b, 0x45, 0x38, - 0x58, 0x38, 0x73, 0x53, 0x56, 0x49, 0x35, 0x57, 0x66, 0x7a, 0x62, 0x5a, 0x41, 0x50, 0x51, 0x75, 0x72, 0x4e, - 0x77, 0x4f, 0x55, 0x43, 0x53, 0x79, 0x75, 0x68, 0x54, 0x57, 0x50, 0x7a, 0x62, 0x35, 0x68, 0x4a, 0x41, 0x2b, - 0x2f, 0x36, 0x5a, 0x75, 0x44, 0x5a, 0x41, 0x6b, 0x70, 0x54, 0x65, 0x4a, 0x2f, 0x43, 0x63, 0x33, 0x42, 0x45, - 0x62, 0x5c, 0x0a, - 0x09, 0x67, 0x4d, 0x36, 0x63, 0x43, 0x58, 0x77, 0x32, 0x64, 0x51, 0x68, 0x4a, 0x61, 0x72, 0x68, 0x2f, 0x42, - 0x4d, 0x35, 0x4e, 0x48, 0x61, 0x4b, 0x71, 0x62, 0x41, 0x41, 0x36, 0x64, 0x77, 0x70, 0x77, 0x41, 0x54, 0x41, - 0x75, 0x64, 0x52, 0x42, 0x4a, 0x61, 0x70, 0x68, 0x2b, 0x59, 0x70, 0x4d, 0x66, 0x37, 0x2f, 0x50, 0x76, 0x67, - 0x67, 0x31, 0x41, 0x64, 0x34, 0x34, 0x44, 0x4c, 0x67, 0x59, 0x6d, 0x70, 0x41, 0x34, 0x69, 0x53, 0x51, 0x33, - 0x78, 0x5c, 0x0a, - 0x09, 0x41, 0x6e, 0x41, 0x38, 0x63, 0x47, 0x6e, 0x71, 0x49, 0x46, 0x56, 0x6e, 0x41, 0x39, 0x43, 0x39, 0x77, - 0x34, 0x48, 0x76, 0x41, 0x43, 0x39, 0x4a, 0x48, 0x55, 0x53, 0x53, 0x61, 0x75, 0x36, 0x76, 0x78, 0x49, 0x4e, - 0x39, 0x33, 0x4e, 0x73, 0x2f, 0x41, 0x7a, 0x59, 0x41, 0x32, 0x58, 0x67, 0x7a, 0x38, 0x58, 0x2f, 0x49, 0x7a, - 0x52, 0x4c, 0x6e, 0x6b, 0x4b, 0x53, 0x36, 0x57, 0x6b, 0x46, 0x38, 0x34, 0x4c, 0x6f, 0x35, 0x63, 0x59, 0x37, - 0x61, 0x5c, 0x0a, - 0x09, 0x73, 0x41, 0x48, 0x49, 0x7a, 0x6a, 0x37, 0x41, 0x6a, 0x34, 0x45, 0x74, 0x55, 0x67, 0x65, 0x52, 0x70, - 0x4a, 0x70, 0x5a, 0x41, 0x76, 0x77, 0x64, 0x63, 0x47, 0x66, 0x71, 0x49, 0x48, 0x56, 0x69, 0x41, 0x35, 0x43, - 0x74, 0x75, 0x63, 0x42, 0x50, 0x42, 0x6e, 0x36, 0x55, 0x4a, 0x48, 0x58, 0x76, 0x49, 0x65, 0x42, 0x74, 0x41, - 0x7a, 0x38, 0x71, 0x51, 0x32, 0x34, 0x45, 0x6c, 0x4b, 0x32, 0x48, 0x67, 0x41, 0x4f, 0x41, 0x4f, 0x31, 0x49, - 0x48, 0x5c, 0x0a, - 0x09, 0x6b, 0x61, 0x51, 0x61, 0x75, 0x41, 0x4d, 0x34, 0x45, 0x49, 0x74, 0x2f, 0x4c, 0x6d, 0x77, 0x41, 0x73, - 0x72, 0x63, 0x45, 0x4f, 0x42, 0x6a, 0x34, 0x55, 0x65, 0x6f, 0x67, 0x6b, 0x6c, 0x52, 0x68, 0x50, 0x38, 0x4c, - 0x4d, 0x37, 0x4a, 0x45, 0x41, 0x41, 0x41, 0x61, 0x70, 0x53, 0x55, 0x52, 0x42, 0x56, 0x43, 0x62, 0x4f, 0x70, - 0x59, 0x74, 0x54, 0x42, 0x36, 0x6b, 0x72, 0x47, 0x34, 0x42, 0x38, 0x72, 0x41, 0x4c, 0x65, 0x42, 0x56, 0x79, - 0x55, 0x5c, 0x0a, - 0x09, 0x4f, 0x6f, 0x67, 0x6b, 0x56, 0x64, 0x42, 0x46, 0x77, 0x44, 0x75, 0x4a, 0x63, 0x36, 0x6c, 0x79, 0x59, - 0x67, 0x4f, 0x51, 0x6e, 0x7a, 0x37, 0x67, 0x52, 0x4f, 0x43, 0x4d, 0x67, 0x5a, 0x39, 0x4c, 0x6b, 0x6b, 0x62, - 0x58, 0x52, 0x2b, 0x79, 0x30, 0x65, 0x69, 0x4b, 0x65, 0x4e, 0x33, 0x50, 0x6e, 0x52, 0x59, 0x44, 0x46, 0x6d, - 0x41, 0x39, 0x63, 0x44, 0x6b, 0x78, 0x4e, 0x48, 0x55, 0x53, 0x53, 0x53, 0x6d, 0x6f, 0x6c, 0x63, 0x41, 0x7a, - 0x77, 0x5c, 0x0a, - 0x09, 0x77, 0x39, 0x52, 0x42, 0x6d, 0x73, 0x49, 0x47, 0x6f, 0x44, 0x68, 0x37, 0x45, 0x76, 0x2f, 0x48, 0x33, - 0x69, 0x5a, 0x31, 0x45, 0x45, 0x6b, 0x71, 0x6d, 0x55, 0x65, 0x4a, 0x44, 0x30, 0x72, 0x33, 0x70, 0x41, 0x37, - 0x53, 0x4a, 0x43, 0x34, 0x42, 0x46, 0x4f, 0x63, 0x65, 0x59, 0x46, 0x2f, 0x67, 0x39, 0x74, 0x52, 0x42, 0x4a, - 0x4b, 0x6c, 0x45, 0x62, 0x67, 0x66, 0x32, 0x77, 0x2b, 0x4a, 0x66, 0x4f, 0x42, 0x75, 0x41, 0x59, 0x6a, 0x31, - 0x42, 0x5c, 0x0a, - 0x09, 0x37, 0x42, 0x70, 0x34, 0x63, 0x65, 0x49, 0x63, 0x6b, 0x6c, 0x51, 0x47, 0x33, 0x79, 0x54, 0x4f, 0x69, - 0x59, 0x76, 0x53, 0x78, 0x6d, 0x67, 0x6d, 0x47, 0x34, 0x44, 0x69, 0x2f, 0x52, 0x55, 0x34, 0x67, 0x58, 0x69, - 0x53, 0x31, 0x51, 0x75, 0x4a, 0x73, 0x30, 0x68, 0x53, 0x43, 0x69, 0x38, 0x51, 0x35, 0x38, 0x44, 0x6a, 0x69, - 0x58, 0x4f, 0x69, 0x45, 0x76, 0x41, 0x61, 0x67, 0x4c, 0x54, 0x65, 0x44, 0x48, 0x77, 0x58, 0x6d, 0x4a, 0x30, - 0x34, 0x5c, 0x0a, - 0x09, 0x68, 0x79, 0x51, 0x56, 0x5a, 0x51, 0x6e, 0x78, 0x51, 0x4a, 0x2b, 0x62, 0x55, 0x67, 0x64, 0x70, 0x4f, - 0x68, 0x75, 0x41, 0x39, 0x4c, 0x59, 0x48, 0x72, 0x69, 0x53, 0x65, 0x4a, 0x53, 0x42, 0x4a, 0x64, 0x58, 0x59, - 0x6e, 0x63, 0x42, 0x54, 0x77, 0x53, 0x4f, 0x6f, 0x67, 0x63, 0x67, 0x6d, 0x67, 0x44, 0x42, 0x34, 0x42, 0x33, - 0x67, 0x42, 0x38, 0x4c, 0x58, 0x55, 0x51, 0x53, 0x63, 0x72, 0x52, 0x31, 0x34, 0x6c, 0x7a, 0x6e, 0x63, 0x57, - 0x2f, 0x5c, 0x0a, - 0x09, 0x4a, 0x4a, 0x77, 0x41, 0x6c, 0x4d, 0x75, 0x78, 0x52, 0x43, 0x50, 0x67, 0x66, 0x67, 0x47, 0x53, 0x36, - 0x6d, 0x49, 0x6c, 0x63, 0x42, 0x4a, 0x77, 0x57, 0x65, 0x6f, 0x67, 0x32, 0x70, 0x41, 0x4e, 0x51, 0x50, 0x6e, - 0x73, 0x53, 0x69, 0x77, 0x4a, 0x37, 0x4a, 0x77, 0x36, 0x69, 0x43, 0x52, 0x31, 0x36, 0x55, 0x48, 0x67, 0x61, - 0x4f, 0x43, 0x2b, 0x31, 0x45, 0x47, 0x30, 0x4b, 0x5a, 0x63, 0x41, 0x79, 0x6d, 0x63, 0x42, 0x73, 0x56, 0x2f, - 0x41, 0x5c, 0x0a, - 0x09, 0x4a, 0x61, 0x6d, 0x44, 0x53, 0x46, 0x49, 0x58, 0x4c, 0x69, 0x48, 0x4f, 0x5a, 0x52, 0x62, 0x2f, 0x6b, - 0x72, 0x49, 0x42, 0x4b, 0x4b, 0x65, 0x56, 0x77, 0x41, 0x65, 0x41, 0x39, 0x77, 0x48, 0x4c, 0x45, 0x32, 0x65, - 0x52, 0x70, 0x48, 0x61, 0x73, 0x41, 0x4e, 0x35, 0x50, 0x6e, 0x4d, 0x4e, 0x57, 0x4a, 0x73, 0x36, 0x69, 0x55, - 0x62, 0x67, 0x45, 0x55, 0x48, 0x36, 0x76, 0x4a, 0x4a, 0x34, 0x6a, 0x34, 0x46, 0x30, 0x43, 0x6b, 0x73, 0x72, - 0x75, 0x5c, 0x0a, - 0x09, 0x54, 0x6d, 0x49, 0x2f, 0x2f, 0x7a, 0x2b, 0x6d, 0x44, 0x71, 0x4b, 0x78, 0x4f, 0x51, 0x45, 0x6f, 0x76, - 0x7a, 0x38, 0x43, 0x42, 0x77, 0x4c, 0x6e, 0x41, 0x58, 0x5a, 0x72, 0x6b, 0x73, 0x71, 0x6f, 0x6e, 0x7a, 0x68, - 0x48, 0x48, 0x59, 0x6a, 0x46, 0x76, 0x7a, 0x4b, 0x63, 0x41, 0x46, 0x54, 0x4c, 0x77, 0x63, 0x54, 0x57, 0x6d, - 0x64, 0x73, 0x6d, 0x7a, 0x69, 0x46, 0x4a, 0x67, 0x2f, 0x35, 0x43, 0x37, 0x4f, 0x6a, 0x33, 0x73, 0x39, 0x52, - 0x42, 0x5c, 0x0a, - 0x09, 0x31, 0x42, 0x34, 0x6e, 0x41, 0x4e, 0x56, 0x79, 0x49, 0x37, 0x41, 0x37, 0x63, 0x47, 0x6e, 0x71, 0x49, - 0x4a, 0x4a, 0x45, 0x33, 0x4e, 0x71, 0x33, 0x42, 0x78, 0x62, 0x2f, 0x53, 0x6e, 0x49, 0x43, 0x55, 0x46, 0x31, - 0x48, 0x41, 0x78, 0x63, 0x43, 0x4c, 0x30, 0x73, 0x64, 0x52, 0x46, 0x4c, 0x6a, 0x50, 0x45, 0x50, 0x63, 0x32, - 0x33, 0x39, 0x46, 0x36, 0x69, 0x44, 0x71, 0x6e, 0x41, 0x31, 0x41, 0x74, 0x63, 0x30, 0x68, 0x64, 0x74, 0x65, - 0x61, 0x5c, 0x0a, - 0x09, 0x6e, 0x7a, 0x71, 0x49, 0x70, 0x4d, 0x62, 0x34, 0x49, 0x66, 0x41, 0x68, 0x66, 0x49, 0x4a, 0x66, 0x35, - 0x62, 0x6b, 0x45, 0x55, 0x47, 0x32, 0x4c, 0x67, 0x4d, 0x4f, 0x4a, 0x48, 0x51, 0x53, 0x66, 0x54, 0x70, 0x78, - 0x46, 0x55, 0x72, 0x30, 0x39, 0x54, 0x5a, 0x78, 0x72, 0x44, 0x73, 0x66, 0x69, 0x58, 0x77, 0x74, 0x4f, 0x41, - 0x4f, 0x70, 0x6a, 0x43, 0x2b, 0x44, 0x4c, 0x78, 0x4e, 0x4b, 0x41, 0x4a, 0x47, 0x58, 0x70, 0x53, 0x75, 0x41, - 0x55, 0x5c, 0x0a, - 0x09, 0x34, 0x4d, 0x6e, 0x55, 0x51, 0x5a, 0x51, 0x64, 0x4a, 0x77, 0x44, 0x31, 0x73, 0x52, 0x68, 0x34, 0x4e, - 0x2f, 0x47, 0x6b, 0x72, 0x53, 0x63, 0x53, 0x5a, 0x35, 0x46, 0x55, 0x44, 0x30, 0x38, 0x51, 0x35, 0x35, 0x53, - 0x6a, 0x73, 0x66, 0x6a, 0x58, 0x6a, 0x67, 0x31, 0x41, 0x2f, 0x56, 0x77, 0x46, 0x7a, 0x43, 0x4d, 0x65, 0x4b, - 0x72, 0x51, 0x75, 0x63, 0x52, 0x5a, 0x4a, 0x31, 0x62, 0x53, 0x4f, 0x75, 0x4c, 0x35, 0x6f, 0x48, 0x6e, 0x46, - 0x4f, 0x5c, 0x0a, - 0x09, 0x55, 0x51, 0x32, 0x35, 0x42, 0x46, 0x42, 0x76, 0x72, 0x79, 0x66, 0x2b, 0x45, 0x65, 0x2b, 0x65, 0x4f, - 0x6f, 0x69, 0x6b, 0x79, 0x72, 0x67, 0x58, 0x4f, 0x42, 0x6d, 0x34, 0x4c, 0x58, 0x55, 0x51, 0x35, 0x63, 0x73, - 0x4a, 0x51, 0x4c, 0x33, 0x39, 0x4a, 0x37, 0x41, 0x33, 0x38, 0x45, 0x2f, 0x41, 0x36, 0x73, 0x52, 0x5a, 0x4a, - 0x4a, 0x58, 0x62, 0x63, 0x38, 0x53, 0x35, 0x34, 0x72, 0x56, 0x59, 0x2f, 0x42, 0x76, 0x42, 0x43, 0x55, 0x42, - 0x7a, 0x5c, 0x0a, - 0x09, 0x62, 0x41, 0x65, 0x63, 0x44, 0x78, 0x79, 0x52, 0x4f, 0x6f, 0x69, 0x6b, 0x30, 0x76, 0x6b, 0x65, 0x38, - 0x46, 0x46, 0x67, 0x59, 0x65, 0x6f, 0x67, 0x4b, 0x6f, 0x34, 0x4e, 0x51, 0x50, 0x50, 0x38, 0x4c, 0x66, 0x42, - 0x46, 0x59, 0x4a, 0x66, 0x55, 0x51, 0x53, 0x51, 0x6c, 0x64, 0x7a, 0x39, 0x52, 0x2b, 0x4b, 0x39, 0x50, 0x48, - 0x55, 0x54, 0x46, 0x63, 0x77, 0x6d, 0x67, 0x65, 0x57, 0x34, 0x41, 0x58, 0x67, 0x4f, 0x63, 0x41, 0x53, 0x78, - 0x4c, 0x5c, 0x0a, - 0x09, 0x6e, 0x45, 0x56, 0x53, 0x47, 0x73, 0x75, 0x4a, 0x63, 0x38, 0x42, 0x65, 0x57, 0x50, 0x77, 0x62, 0x79, - 0x77, 0x6c, 0x41, 0x73, 0x38, 0x30, 0x42, 0x7a, 0x69, 0x59, 0x65, 0x35, 0x44, 0x45, 0x68, 0x63, 0x52, 0x5a, - 0x4a, 0x2b, 0x58, 0x73, 0x42, 0x75, 0x41, 0x54, 0x34, 0x46, 0x39, 0x7a, 0x4d, 0x70, 0x2f, 0x46, 0x73, 0x41, - 0x41, 0x53, 0x78, 0x48, 0x48, 0x41, 0x65, 0x63, 0x46, 0x6a, 0x71, 0x49, 0x4a, 0x4a, 0x79, 0x63, 0x79, 0x33, - 0x77, 0x5c, 0x0a, - 0x09, 0x63, 0x57, 0x4c, 0x73, 0x4c, 0x37, 0x6b, 0x45, 0x49, 0x43, 0x42, 0x4f, 0x43, 0x47, 0x38, 0x62, 0x65, - 0x4e, 0x32, 0x58, 0x4f, 0x49, 0x75, 0x6b, 0x62, 0x41, 0x33, 0x39, 0x39, 0x32, 0x33, 0x78, 0x31, 0x34, 0x74, - 0x73, 0x41, 0x44, 0x54, 0x55, 0x74, 0x63, 0x54, 0x31, 0x41, 0x63, 0x66, 0x6a, 0x31, 0x63, 0x42, 0x53, 0x31, - 0x53, 0x30, 0x6b, 0x2f, 0x69, 0x32, 0x2f, 0x68, 0x76, 0x69, 0x33, 0x4c, 0x57, 0x33, 0x41, 0x4a, 0x51, 0x43, - 0x4e, 0x5c, 0x0a, - 0x09, 0x70, 0x4a, 0x64, 0x34, 0x33, 0x4f, 0x63, 0x6e, 0x69, 0x4f, 0x63, 0x4d, 0x53, 0x4b, 0x71, 0x47, 0x4a, - 0x63, 0x43, 0x6e, 0x69, 0x63, 0x65, 0x46, 0x50, 0x35, 0x38, 0x34, 0x69, 0x30, 0x72, 0x4d, 0x42, 0x6b, 0x42, - 0x6a, 0x6d, 0x51, 0x71, 0x63, 0x54, 0x71, 0x77, 0x64, 0x54, 0x6b, 0x2b, 0x63, 0x52, 0x64, 0x4c, 0x49, 0x6c, - 0x68, 0x48, 0x58, 0x38, 0x70, 0x77, 0x50, 0x72, 0x45, 0x79, 0x63, 0x52, 0x52, 0x56, 0x67, 0x41, 0x36, 0x42, - 0x57, 0x5c, 0x0a, - 0x09, 0x62, 0x55, 0x37, 0x63, 0x4c, 0x33, 0x77, 0x61, 0x4d, 0x43, 0x31, 0x78, 0x46, 0x6b, 0x6e, 0x72, 0x72, - 0x51, 0x41, 0x75, 0x41, 0x44, 0x34, 0x50, 0x50, 0x4a, 0x4d, 0x34, 0x69, 0x79, 0x72, 0x45, 0x42, 0x6b, 0x44, - 0x74, 0x6d, 0x73, 0x6e, 0x36, 0x52, 0x73, 0x43, 0x4a, 0x67, 0x4a, 0x54, 0x4f, 0x63, 0x75, 0x49, 0x52, 0x34, - 0x4a, 0x38, 0x48, 0x6e, 0x6b, 0x36, 0x63, 0x52, 0x52, 0x56, 0x6b, 0x41, 0x36, 0x42, 0x4f, 0x7a, 0x53, 0x43, - 0x61, 0x5c, 0x0a, - 0x09, 0x67, 0x4e, 0x4f, 0x49, 0x70, 0x6b, 0x42, 0x53, 0x4d, 0x5a, 0x34, 0x46, 0x76, 0x6b, 0x54, 0x73, 0x36, - 0x4f, 0x6b, 0x6e, 0x66, 0x6e, 0x58, 0x4d, 0x42, 0x6b, 0x44, 0x64, 0x32, 0x67, 0x77, 0x34, 0x6b, 0x62, 0x68, - 0x4f, 0x59, 0x4f, 0x76, 0x45, 0x57, 0x61, 0x51, 0x36, 0x65, 0x34, 0x78, 0x59, 0x33, 0x2f, 0x38, 0x47, 0x4d, - 0x66, 0x61, 0x58, 0x75, 0x6d, 0x49, 0x44, 0x6f, 0x4b, 0x7a, 0x30, 0x41, 0x73, 0x63, 0x42, 0x5a, 0x77, 0x49, - 0x37, 0x5c, 0x0a, - 0x09, 0x4a, 0x38, 0x34, 0x69, 0x31, 0x63, 0x6d, 0x44, 0x77, 0x4c, 0x6e, 0x41, 0x70, 0x58, 0x68, 0x56, 0x76, - 0x7a, 0x4a, 0x6b, 0x41, 0x36, 0x43, 0x73, 0x39, 0x51, 0x44, 0x76, 0x4a, 0x4b, 0x34, 0x54, 0x65, 0x46, 0x50, - 0x69, 0x4c, 0x46, 0x4b, 0x56, 0x33, 0x51, 0x70, 0x38, 0x41, 0x66, 0x67, 0x42, 0x73, 0x43, 0x35, 0x78, 0x46, - 0x74, 0x57, 0x51, 0x44, 0x59, 0x44, 0x79, 0x74, 0x44, 0x64, 0x78, 0x6a, 0x63, 0x42, 0x37, 0x69, 0x41, 0x6d, - 0x42, 0x5c, 0x0a, - 0x09, 0x70, 0x4e, 0x45, 0x39, 0x44, 0x33, 0x79, 0x48, 0x4b, 0x50, 0x78, 0x33, 0x4a, 0x63, 0x36, 0x69, 0x6d, - 0x72, 0x4d, 0x42, 0x55, 0x42, 0x47, 0x32, 0x41, 0x6a, 0x35, 0x4d, 0x58, 0x43, 0x75, 0x77, 0x5a, 0x65, 0x49, - 0x73, 0x55, 0x68, 0x6b, 0x39, 0x53, 0x61, 0x7a, 0x74, 0x66, 0x78, 0x56, 0x34, 0x49, 0x6e, 0x45, 0x57, 0x4e, - 0x59, 0x51, 0x4e, 0x67, 0x49, 0x6f, 0x30, 0x43, 0x54, 0x69, 0x43, 0x32, 0x47, 0x48, 0x51, 0x35, 0x51, 0x45, - 0x4a, 0x5c, 0x0a, - 0x09, 0x66, 0x6b, 0x37, 0x73, 0x32, 0x48, 0x63, 0x31, 0x73, 0x43, 0x5a, 0x78, 0x46, 0x6a, 0x57, 0x4d, 0x44, - 0x59, 0x42, 0x53, 0x32, 0x5a, 0x56, 0x6f, 0x42, 0x4e, 0x36, 0x48, 0x2b, 0x77, 0x6d, 0x6f, 0x57, 0x5a, 0x59, - 0x42, 0x33, 0x77, 0x4b, 0x2b, 0x42, 0x69, 0x78, 0x49, 0x6e, 0x45, 0x55, 0x4e, 0x5a, 0x67, 0x4f, 0x67, 0x31, - 0x4b, 0x59, 0x41, 0x52, 0x78, 0x4d, 0x50, 0x4c, 0x58, 0x6b, 0x6a, 0x4d, 0x43, 0x35, 0x74, 0x48, 0x43, 0x6b, - 0x58, 0x5c, 0x0a, - 0x09, 0x2f, 0x63, 0x53, 0x6e, 0x2f, 0x59, 0x75, 0x42, 0x4b, 0x33, 0x47, 0x72, 0x58, 0x70, 0x57, 0x41, 0x44, - 0x59, 0x44, 0x4b, 0x35, 0x46, 0x58, 0x41, 0x43, 0x63, 0x52, 0x55, 0x34, 0x4f, 0x57, 0x4a, 0x73, 0x30, 0x68, - 0x5a, 0x65, 0x4a, 0x7a, 0x34, 0x74, 0x50, 0x39, 0x4e, 0x34, 0x6e, 0x59, 0x2b, 0x71, 0x54, 0x52, 0x73, 0x41, - 0x46, 0x52, 0x47, 0x34, 0x34, 0x47, 0x33, 0x45, 0x76, 0x73, 0x4b, 0x76, 0x42, 0x4f, 0x59, 0x6e, 0x44, 0x61, - 0x4f, 0x5c, 0x0a, - 0x09, 0x31, 0x4a, 0x62, 0x56, 0x78, 0x4b, 0x31, 0x37, 0x6c, 0x77, 0x49, 0x2f, 0x42, 0x66, 0x72, 0x53, 0x78, - 0x70, 0x47, 0x47, 0x5a, 0x77, 0x4f, 0x67, 0x73, 0x70, 0x74, 0x4b, 0x4e, 0x41, 0x48, 0x76, 0x42, 0x51, 0x34, - 0x46, 0x4a, 0x71, 0x61, 0x4e, 0x49, 0x77, 0x31, 0x72, 0x4c, 0x58, 0x41, 0x39, 0x63, 0x44, 0x6c, 0x52, 0x2f, - 0x42, 0x33, 0x78, 0x71, 0x2f, 0x52, 0x73, 0x41, 0x46, 0x51, 0x6c, 0x73, 0x34, 0x42, 0x33, 0x44, 0x37, 0x7a, - 0x65, 0x5c, 0x0a, - 0x09, 0x51, 0x45, 0x77, 0x4b, 0x70, 0x46, 0x54, 0x36, 0x67, 0x46, 0x38, 0x41, 0x33, 0x78, 0x31, 0x34, 0x50, - 0x5a, 0x55, 0x32, 0x6a, 0x74, 0x51, 0x65, 0x47, 0x77, 0x42, 0x56, 0x31, 0x52, 0x62, 0x41, 0x75, 0x34, 0x41, - 0x6a, 0x67, 0x62, 0x66, 0x67, 0x5a, 0x45, 0x44, 0x46, 0x57, 0x41, 0x76, 0x63, 0x42, 0x46, 0x77, 0x46, 0x66, - 0x42, 0x39, 0x59, 0x6e, 0x44, 0x61, 0x4f, 0x31, 0x44, 0x6b, 0x62, 0x41, 0x4e, 0x58, 0x42, 0x54, 0x4f, 0x44, - 0x77, 0x5c, 0x0a, - 0x09, 0x67, 0x64, 0x65, 0x68, 0x78, 0x4c, 0x4b, 0x42, 0x6c, 0x4a, 0x57, 0x56, 0x77, 0x48, 0x58, 0x41, 0x4e, - 0x51, 0x4f, 0x76, 0x5a, 0x39, 0x50, 0x47, 0x6b, 0x62, 0x4a, 0x68, 0x41, 0x36, 0x43, 0x36, 0x36, 0x51, 0x58, - 0x65, 0x44, 0x4c, 0x77, 0x44, 0x65, 0x44, 0x75, 0x77, 0x59, 0x39, 0x49, 0x30, 0x71, 0x71, 0x6f, 0x2f, 0x41, - 0x54, 0x38, 0x61, 0x65, 0x4e, 0x32, 0x43, 0x6d, 0x2f, 0x53, 0x6f, 0x68, 0x6d, 0x77, 0x41, 0x56, 0x48, 0x65, - 0x37, 0x5c, 0x0a, - 0x09, 0x41, 0x49, 0x63, 0x42, 0x68, 0x78, 0x43, 0x37, 0x44, 0x33, 0x70, 0x48, 0x67, 0x59, 0x61, 0x7a, 0x6d, - 0x72, 0x68, 0x50, 0x2f, 0x7a, 0x72, 0x67, 0x57, 0x75, 0x44, 0x2b, 0x74, 0x48, 0x47, 0x6b, 0x2f, 0x4e, 0x6b, - 0x41, 0x71, 0x45, 0x6c, 0x65, 0x41, 0x68, 0x78, 0x41, 0x4e, 0x41, 0x4f, 0x48, 0x41, 0x6e, 0x73, 0x53, 0x54, - 0x79, 0x39, 0x55, 0x38, 0x36, 0x77, 0x44, 0x37, 0x69, 0x45, 0x4b, 0x2f, 0x76, 0x58, 0x41, 0x4c, 0x34, 0x47, - 0x2f, 0x5c, 0x0a, - 0x09, 0x4a, 0x6b, 0x30, 0x6b, 0x46, 0x63, 0x77, 0x47, 0x51, 0x45, 0x30, 0x32, 0x6b, 0x37, 0x69, 0x62, 0x34, - 0x43, 0x42, 0x69, 0x4f, 0x72, 0x41, 0x58, 0x4d, 0x43, 0x46, 0x70, 0x49, 0x75, 0x58, 0x6c, 0x42, 0x65, 0x42, - 0x75, 0x34, 0x6c, 0x50, 0x2b, 0x7a, 0x63, 0x54, 0x56, 0x2b, 0x36, 0x37, 0x6c, 0x71, 0x39, 0x46, 0x73, 0x41, - 0x4b, 0x54, 0x31, 0x4e, 0x69, 0x4d, 0x6d, 0x42, 0x47, 0x38, 0x45, 0x39, 0x67, 0x66, 0x32, 0x78, 0x65, 0x63, - 0x55, 0x5c, 0x0a, - 0x09, 0x56, 0x4e, 0x56, 0x79, 0x34, 0x41, 0x37, 0x67, 0x64, 0x71, 0x4c, 0x59, 0x33, 0x77, 0x61, 0x73, 0x53, - 0x4a, 0x70, 0x49, 0x4b, 0x68, 0x6b, 0x62, 0x41, 0x47, 0x6c, 0x6b, 0x50, 0x63, 0x41, 0x38, 0x6f, 0x68, 0x6c, - 0x34, 0x48, 0x62, 0x41, 0x66, 0x63, 0x55, 0x32, 0x42, 0x74, 0x78, 0x79, 0x57, 0x79, 0x77, 0x76, 0x45, 0x51, - 0x33, 0x58, 0x75, 0x41, 0x48, 0x34, 0x31, 0x38, 0x4f, 0x50, 0x39, 0x78, 0x4a, 0x68, 0x66, 0x30, 0x67, 0x68, - 0x73, 0x5c, 0x0a, - 0x09, 0x41, 0x4b, 0x54, 0x32, 0x76, 0x41, 0x54, 0x59, 0x6a, 0x56, 0x67, 0x75, 0x32, 0x42, 0x50, 0x59, 0x47, - 0x39, 0x67, 0x44, 0x4c, 0x79, 0x34, 0x73, 0x79, 0x6d, 0x72, 0x67, 0x58, 0x75, 0x41, 0x33, 0x78, 0x42, 0x72, - 0x2b, 0x33, 0x63, 0x42, 0x39, 0x75, 0x48, 0x34, 0x76, 0x74, 0x63, 0x30, 0x47, 0x51, 0x4f, 0x72, 0x65, 0x65, - 0x47, 0x41, 0x48, 0x59, 0x6a, 0x71, 0x77, 0x43, 0x2f, 0x47, 0x6f, 0x34, 0x33, 0x6b, 0x44, 0x4c, 0x78, 0x75, - 0x44, 0x5c, 0x0a, - 0x09, 0x7a, 0x71, 0x77, 0x47, 0x48, 0x68, 0x68, 0x34, 0x4c, 0x53, 0x41, 0x2b, 0x30, 0x64, 0x39, 0x50, 0x33, - 0x4a, 0x37, 0x6e, 0x33, 0x76, 0x70, 0x53, 0x42, 0x6d, 0x77, 0x41, 0x70, 0x50, 0x7a, 0x30, 0x41, 0x4e, 0x73, - 0x43, 0x63, 0x77, 0x64, 0x65, 0x4f, 0x77, 0x37, 0x35, 0x2b, 0x55, 0x37, 0x45, 0x6f, 0x35, 0x43, 0x62, 0x62, - 0x44, 0x58, 0x77, 0x30, 0x4d, 0x44, 0x72, 0x34, 0x59, 0x48, 0x58, 0x34, 0x4b, 0x2f, 0x2f, 0x67, 0x69, 0x4e, - 0x38, 0x5c, 0x0a, - 0x09, 0x4b, 0x56, 0x63, 0x32, 0x41, 0x46, 0x49, 0x36, 0x73, 0x34, 0x42, 0x74, 0x69, 0x43, 0x5a, 0x68, 0x75, - 0x34, 0x47, 0x66, 0x62, 0x77, 0x4e, 0x73, 0x54, 0x57, 0x78, 0x31, 0x50, 0x48, 0x76, 0x67, 0x4e, 0x53, 0x35, - 0x56, 0x77, 0x41, 0x37, 0x31, 0x41, 0x30, 0x73, 0x47, 0x58, 0x6f, 0x75, 0x42, 0x78, 0x34, 0x42, 0x48, 0x42, - 0x31, 0x34, 0x4c, 0x69, 0x65, 0x4c, 0x2b, 0x4b, 0x4f, 0x36, 0x64, 0x4c, 0x79, 0x56, 0x6c, 0x41, 0x79, 0x43, - 0x56, 0x5c, 0x0a, - 0x09, 0x32, 0x33, 0x67, 0x32, 0x62, 0x41, 0x59, 0x32, 0x42, 0x32, 0x59, 0x4d, 0x38, 0x35, 0x6f, 0x79, 0x38, - 0x4a, 0x6f, 0x4d, 0x54, 0x41, 0x4b, 0x6d, 0x45, 0x52, 0x63, 0x72, 0x62, 0x6e, 0x77, 0x58, 0x77, 0x7a, 0x51, - 0x32, 0x66, 0x59, 0x68, 0x53, 0x48, 0x33, 0x48, 0x56, 0x2f, 0x46, 0x44, 0x4c, 0x69, 0x48, 0x33, 0x76, 0x6c, - 0x78, 0x4f, 0x37, 0x34, 0x4b, 0x30, 0x47, 0x56, 0x67, 0x32, 0x38, 0x6c, 0x67, 0x37, 0x7a, 0x65, 0x6f, 0x62, - 0x31, 0x5c, 0x0a, - 0x09, 0x52, 0x58, 0x38, 0x4a, 0x63, 0x57, 0x47, 0x65, 0x70, 0x42, 0x4c, 0x37, 0x2f, 0x2b, 0x36, 0x4a, 0x76, - 0x53, 0x43, 0x72, 0x32, 0x66, 0x6e, 0x73, 0x41, 0x41, 0x41, 0x41, 0x41, 0x45, 0x6c, 0x46, 0x54, 0x6b, 0x53, - 0x75, 0x51, 0x6d, 0x43, 0x43, 0x5c, 0x0a, - 0x09, 0x22, 0x0a, - 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x75, 0x62, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x6e, 0x67, 0x20, - 0x3d, 0x0a, - 0x09, 0x22, 0x69, 0x56, 0x42, 0x4f, 0x52, 0x77, 0x30, 0x4b, 0x47, 0x67, 0x6f, 0x41, 0x41, 0x41, 0x41, 0x4e, - 0x53, 0x55, 0x68, 0x45, 0x55, 0x67, 0x41, 0x41, 0x41, 0x51, 0x41, 0x41, 0x41, 0x41, 0x43, 0x41, 0x43, 0x41, - 0x59, 0x41, 0x41, 0x41, 0x44, 0x6b, 0x74, 0x62, 0x63, 0x4b, 0x41, 0x41, 0x41, 0x48, 0x48, 0x30, 0x6c, 0x45, - 0x51, 0x56, 0x52, 0x34, 0x6e, 0x4f, 0x33, 0x64, 0x79, 0x38, 0x39, 0x63, 0x63, 0x78, 0x7a, 0x48, 0x38, 0x66, - 0x66, 0x7a, 0x5c, 0x0a, - 0x09, 0x39, 0x46, 0x36, 0x58, 0x58, 0x72, 0x52, 0x39, 0x74, 0x4b, 0x36, 0x6c, 0x4c, 0x58, 0x56, 0x70, 0x56, - 0x43, 0x51, 0x6b, 0x4c, 0x68, 0x47, 0x68, 0x49, 0x57, 0x69, 0x49, 0x52, 0x46, 0x30, 0x53, 0x47, 0x34, 0x53, - 0x39, 0x68, 0x4a, 0x55, 0x56, 0x47, 0x78, 0x61, 0x57, 0x4e, 0x68, 0x62, 0x2b, 0x41, 0x49, 0x74, 0x4b, 0x42, - 0x47, 0x46, 0x68, 0x30, 0x34, 0x55, 0x67, 0x49, 0x69, 0x68, 0x42, 0x56, 0x4a, 0x75, 0x57, 0x74, 0x6d, 0x69, - 0x72, 0x5c, 0x0a, - 0x09, 0x56, 0x38, 0x56, 0x44, 0x78, 0x2b, 0x4a, 0x33, 0x4a, 0x73, 0x39, 0x30, 0x4f, 0x76, 0x4e, 0x30, 0x66, - 0x6d, 0x66, 0x6d, 0x39, 0x46, 0x78, 0x2b, 0x37, 0x31, 0x63, 0x79, 0x65, 0x57, 0x61, 0x65, 0x7a, 0x75, 0x58, - 0x62, 0x4e, 0x74, 0x2f, 0x50, 0x37, 0x33, 0x64, 0x2b, 0x35, 0x38, 0x77, 0x35, 0x59, 0x36, 0x31, 0x57, 0x43, - 0x30, 0x6c, 0x70, 0x47, 0x69, 0x2b, 0x37, 0x41, 0x45, 0x6e, 0x6c, 0x4d, 0x51, 0x43, 0x6b, 0x68, 0x4d, 0x30, - 0x73, 0x5c, 0x0a, - 0x09, 0x75, 0x77, 0x44, 0x56, 0x79, 0x36, 0x70, 0x4c, 0x56, 0x30, 0x59, 0x39, 0x2f, 0x38, 0x63, 0x64, 0x32, - 0x77, 0x75, 0x71, 0x52, 0x4b, 0x4e, 0x67, 0x41, 0x43, 0x51, 0x71, 0x74, 0x70, 0x47, 0x37, 0x6a, 0x41, 0x45, - 0x4c, 0x67, 0x47, 0x58, 0x41, 0x63, 0x6d, 0x41, 0x43, 0x57, 0x4a, 0x49, 0x39, 0x6e, 0x67, 0x43, 0x4f, 0x41, - 0x53, 0x38, 0x42, 0x68, 0x34, 0x61, 0x72, 0x55, 0x6b, 0x55, 0x62, 0x63, 0x78, 0x47, 0x77, 0x33, 0x6f, 0x5a, - 0x73, 0x5c, 0x0a, - 0x09, 0x35, 0x48, 0x48, 0x67, 0x4c, 0x47, 0x41, 0x68, 0x6f, 0x58, 0x47, 0x58, 0x41, 0x59, 0x75, 0x7a, 0x32, - 0x33, 0x6b, 0x64, 0x39, 0x78, 0x66, 0x31, 0x75, 0x48, 0x2b, 0x36, 0x7a, 0x63, 0x65, 0x33, 0x67, 0x51, 0x66, - 0x42, 0x57, 0x55, 0x43, 0x56, 0x4f, 0x51, 0x4f, 0x6f, 0x67, 0x43, 0x47, 0x62, 0x47, 0x47, 0x41, 0x57, 0x6f, - 0x5a, 0x48, 0x50, 0x4a, 0x54, 0x54, 0x75, 0x2b, 0x63, 0x42, 0x46, 0x68, 0x47, 0x5a, 0x74, 0x4e, 0x2b, 0x79, - 0x69, 0x5c, 0x0a, - 0x09, 0x72, 0x73, 0x66, 0x6e, 0x41, 0x65, 0x63, 0x4d, 0x2b, 0x38, 0x48, 0x54, 0x65, 0x41, 0x42, 0x59, 0x44, - 0x33, 0x78, 0x52, 0x34, 0x47, 0x64, 0x6f, 0x53, 0x41, 0x62, 0x41, 0x43, 0x49, 0x31, 0x67, 0x4e, 0x4a, 0x34, - 0x4e, 0x7a, 0x41, 0x50, 0x4f, 0x4a, 0x6a, 0x54, 0x70, 0x42, 0x48, 0x41, 0x68, 0x73, 0x4a, 0x4c, 0x51, 0x73, - 0x4e, 0x31, 0x4e, 0x33, 0x4c, 0x35, 0x66, 0x31, 0x63, 0x58, 0x63, 0x52, 0x7a, 0x41, 0x41, 0x4b, 0x73, 0x31, - 0x4e, 0x5c, 0x0a, - 0x09, 0x67, 0x42, 0x36, 0x47, 0x62, 0x4f, 0x51, 0x5a, 0x68, 0x42, 0x46, 0x35, 0x4c, 0x6d, 0x46, 0x55, 0x58, - 0x67, 0x41, 0x73, 0x42, 0x56, 0x59, 0x41, 0x6c, 0x77, 0x4b, 0x72, 0x43, 0x56, 0x50, 0x74, 0x37, 0x69, 0x61, - 0x65, 0x50, 0x63, 0x79, 0x48, 0x56, 0x74, 0x54, 0x6e, 0x77, 0x41, 0x33, 0x67, 0x5a, 0x6b, 0x42, 0x56, 0x4e, - 0x58, 0x6f, 0x47, 0x4d, 0x49, 0x49, 0x52, 0x65, 0x53, 0x61, 0x68, 0x4d, 0x65, 0x63, 0x54, 0x70, 0x74, 0x65, - 0x4c, 0x5c, 0x0a, - 0x09, 0x43, 0x4b, 0x50, 0x79, 0x4a, 0x63, 0x44, 0x6c, 0x77, 0x46, 0x58, 0x41, 0x42, 0x55, 0x77, 0x31, 0x38, - 0x66, 0x78, 0x68, 0x50, 0x72, 0x43, 0x42, 0x31, 0x68, 0x50, 0x2b, 0x48, 0x55, 0x2b, 0x55, 0x58, 0x59, 0x68, - 0x36, 0x71, 0x30, 0x30, 0x41, 0x44, 0x4e, 0x48, 0x4d, 0x59, 0x34, 0x52, 0x52, 0x65, 0x53, 0x59, 0x77, 0x68, - 0x39, 0x43, 0x6b, 0x43, 0x77, 0x6c, 0x54, 0x36, 0x75, 0x57, 0x45, 0x5a, 0x72, 0x34, 0x43, 0x75, 0x49, 0x59, - 0x77, 0x5c, 0x0a, - 0x09, 0x31, 0x56, 0x35, 0x4d, 0x47, 0x4d, 0x45, 0x31, 0x76, 0x48, 0x48, 0x43, 0x76, 0x2f, 0x66, 0x52, 0x73, - 0x67, 0x74, 0x52, 0x62, 0x36, 0x55, 0x45, 0x77, 0x49, 0x69, 0x61, 0x75, 0x54, 0x33, 0x46, 0x58, 0x6b, 0x69, - 0x59, 0x59, 0x69, 0x38, 0x6e, 0x6a, 0x4d, 0x70, 0x58, 0x45, 0x6b, 0x61, 0x65, 0x4b, 0x37, 0x4c, 0x6e, 0x71, - 0x6c, 0x79, 0x4c, 0x4d, 0x41, 0x41, 0x71, 0x61, 0x32, 0x51, 0x42, 0x6b, 0x4b, 0x4f, 0x70, 0x78, 0x77, 0x67, - 0x6a, 0x5c, 0x0a, - 0x09, 0x78, 0x43, 0x7a, 0x43, 0x79, 0x4e, 0x79, 0x39, 0x76, 0x62, 0x77, 0x53, 0x57, 0x41, 0x4e, 0x63, 0x42, - 0x36, 0x79, 0x6a, 0x75, 0x67, 0x74, 0x64, 0x6d, 0x74, 0x37, 0x35, 0x77, 0x4b, 0x36, 0x79, 0x69, 0x31, 0x42, - 0x76, 0x41, 0x77, 0x66, 0x41, 0x67, 0x41, 0x33, 0x65, 0x58, 0x67, 0x43, 0x62, 0x54, 0x39, 0x6a, 0x46, 0x74, - 0x4a, 0x69, 0x70, 0x5a, 0x6c, 0x35, 0x4e, 0x6d, 0x47, 0x62, 0x66, 0x68, 0x4e, 0x76, 0x4b, 0x4b, 0x62, 0x6b, - 0x49, 0x5c, 0x0a, - 0x09, 0x2b, 0x4b, 0x7a, 0x73, 0x49, 0x74, 0x54, 0x62, 0x51, 0x41, 0x48, 0x51, 0x30, 0x66, 0x79, 0x7a, 0x43, - 0x43, 0x76, 0x5a, 0x61, 0x34, 0x43, 0x31, 0x68, 0x42, 0x58, 0x65, 0x56, 0x63, 0x44, 0x46, 0x68, 0x4a, 0x46, - 0x62, 0x36, 0x6e, 0x5a, 0x35, 0x32, 0x51, 0x57, 0x6f, 0x76, 0x35, 0x68, 0x4e, 0x67, 0x48, 0x48, 0x67, 0x65, - 0x38, 0x4a, 0x6f, 0x4c, 0x67, 0x33, 0x71, 0x36, 0x72, 0x49, 0x4c, 0x55, 0x48, 0x38, 0x78, 0x32, 0x39, 0x57, - 0x72, 0x5c, 0x0a, - 0x09, 0x73, 0x50, 0x6b, 0x56, 0x62, 0x31, 0x33, 0x5a, 0x42, 0x61, 0x69, 0x2f, 0x6d, 0x41, 0x42, 0x59, 0x58, - 0x56, 0x67, 0x56, 0x61, 0x6a, 0x49, 0x44, 0x6f, 0x4d, 0x4a, 0x69, 0x41, 0x6d, 0x43, 0x69, 0x73, 0x43, 0x72, - 0x55, 0x5a, 0x44, 0x4e, 0x67, 0x4a, 0x4e, 0x39, 0x33, 0x55, 0x41, 0x46, 0x69, 0x41, 0x73, 0x42, 0x46, 0x50, - 0x75, 0x55, 0x31, 0x56, 0x6e, 0x59, 0x42, 0x36, 0x69, 0x30, 0x6d, 0x41, 0x4a, 0x59, 0x55, 0x56, 0x6f, 0x57, - 0x61, 0x5c, 0x0a, - 0x09, 0x7a, 0x67, 0x43, 0x6f, 0x4b, 0x41, 0x4e, 0x41, 0x5a, 0x34, 0x4a, 0x48, 0x5a, 0x46, 0x5a, 0x55, 0x54, - 0x41, 0x43, 0x59, 0x34, 0x73, 0x72, 0x4c, 0x41, 0x4b, 0x67, 0x6f, 0x44, 0x36, 0x2f, 0x56, 0x6d, 0x57, 0x41, - 0x41, 0x56, 0x46, 0x52, 0x4d, 0x41, 0x4d, 0x77, 0x70, 0x72, 0x41, 0x6f, 0x31, 0x58, 0x57, 0x32, 0x2b, 0x64, - 0x5a, 0x71, 0x61, 0x6d, 0x41, 0x43, 0x59, 0x56, 0x31, 0x67, 0x56, 0x61, 0x6a, 0x71, 0x2f, 0x58, 0x6c, 0x31, - 0x52, 0x5c, 0x0a, - 0x09, 0x62, 0x67, 0x4c, 0x6f, 0x54, 0x44, 0x41, 0x41, 0x4b, 0x69, 0x6f, 0x6d, 0x41, 0x50, 0x59, 0x58, 0x56, - 0x6f, 0x57, 0x61, 0x7a, 0x67, 0x43, 0x6f, 0x71, 0x4a, 0x67, 0x41, 0x32, 0x46, 0x6c, 0x59, 0x46, 0x57, 0x71, - 0x36, 0x4a, 0x70, 0x37, 0x76, 0x73, 0x42, 0x46, 0x69, 0x41, 0x6d, 0x42, 0x33, 0x59, 0x56, 0x57, 0x6f, 0x36, - 0x53, 0x62, 0x4c, 0x4c, 0x6b, 0x43, 0x39, 0x78, 0x51, 0x54, 0x41, 0x6e, 0x73, 0x4b, 0x71, 0x55, 0x4e, 0x50, - 0x39, 0x5c, 0x0a, - 0x09, 0x58, 0x58, 0x59, 0x42, 0x36, 0x69, 0x30, 0x6d, 0x41, 0x4c, 0x7a, 0x4d, 0x6b, 0x2f, 0x49, 0x36, 0x58, - 0x6e, 0x59, 0x42, 0x36, 0x69, 0x30, 0x6d, 0x41, 0x50, 0x34, 0x6f, 0x72, 0x41, 0x6f, 0x31, 0x6e, 0x59, 0x4e, - 0x48, 0x52, 0x52, 0x6b, 0x41, 0x4b, 0x74, 0x70, 0x78, 0x38, 0x4d, 0x49, 0x67, 0x56, 0x52, 0x55, 0x54, 0x41, - 0x4d, 0x63, 0x4b, 0x71, 0x30, 0x4a, 0x4e, 0x35, 0x69, 0x6e, 0x42, 0x4b, 0x79, 0x77, 0x6d, 0x41, 0x46, 0x7a, - 0x49, 0x5c, 0x0a, - 0x09, 0x55, 0x52, 0x35, 0x37, 0x79, 0x79, 0x35, 0x41, 0x2f, 0x63, 0x55, 0x45, 0x67, 0x4c, 0x74, 0x79, 0x6c, - 0x49, 0x65, 0x37, 0x6a, 0x79, 0x73, 0x73, 0x4a, 0x67, 0x44, 0x2b, 0x4b, 0x36, 0x77, 0x4b, 0x4e, 0x64, 0x6e, - 0x50, 0x5a, 0x52, 0x65, 0x67, 0x2f, 0x6d, 0x49, 0x43, 0x77, 0x4d, 0x73, 0x49, 0x4b, 0x77, 0x2b, 0x50, 0x48, - 0x36, 0x6d, 0x77, 0x67, 0x51, 0x4b, 0x67, 0x59, 0x77, 0x58, 0x58, 0x68, 0x55, 0x44, 0x46, 0x32, 0x6c, 0x5a, - 0x32, 0x5c, 0x0a, - 0x09, 0x41, 0x65, 0x6f, 0x76, 0x39, 0x74, 0x75, 0x41, 0x58, 0x78, 0x52, 0x53, 0x68, 0x5a, 0x72, 0x4d, 0x79, - 0x34, 0x4a, 0x56, 0x57, 0x47, 0x77, 0x41, 0x62, 0x43, 0x6d, 0x6b, 0x43, 0x6a, 0x58, 0x52, 0x62, 0x38, 0x44, - 0x72, 0x77, 0x44, 0x64, 0x6c, 0x46, 0x36, 0x4c, 0x2b, 0x59, 0x73, 0x2f, 0x55, 0x38, 0x6d, 0x55, 0x68, 0x56, - 0x61, 0x69, 0x4f, 0x57, 0x6f, 0x51, 0x6d, 0x33, 0x77, 0x6e, 0x73, 0x36, 0x50, 0x6a, 0x35, 0x48, 0x62, 0x43, - 0x56, 0x5c, 0x0a, - 0x09, 0x6a, 0x74, 0x31, 0x2f, 0x48, 0x67, 0x52, 0x55, 0x58, 0x62, 0x45, 0x42, 0x38, 0x45, 0x4d, 0x68, 0x56, - 0x61, 0x67, 0x71, 0x2f, 0x67, 0x4c, 0x32, 0x41, 0x62, 0x38, 0x53, 0x7a, 0x76, 0x2b, 0x77, 0x6a, 0x39, 0x44, - 0x6b, 0x76, 0x32, 0x66, 0x33, 0x64, 0x78, 0x4d, 0x61, 0x2b, 0x35, 0x66, 0x73, 0x64, 0x2f, 0x39, 0x4f, 0x39, - 0x32, 0x59, 0x32, 0x66, 0x76, 0x58, 0x46, 0x42, 0x73, 0x43, 0x4f, 0x49, 0x6f, 0x72, 0x51, 0x79, 0x4c, 0x55, - 0x49, 0x5c, 0x0a, - 0x09, 0x68, 0x32, 0x34, 0x66, 0x36, 0x50, 0x72, 0x5a, 0x65, 0x66, 0x38, 0x33, 0x51, 0x6c, 0x50, 0x76, 0x5a, - 0x36, 0x72, 0x4a, 0x6f, 0x78, 0x64, 0x35, 0x62, 0x66, 0x4a, 0x36, 0x69, 0x77, 0x32, 0x41, 0x67, 0x39, 0x6c, - 0x74, 0x59, 0x51, 0x47, 0x31, 0x36, 0x47, 0x53, 0x48, 0x42, 0x72, 0x6a, 0x39, 0x77, 0x61, 0x6d, 0x4e, 0x66, - 0x59, 0x44, 0x77, 0x66, 0x35, 0x53, 0x4c, 0x44, 0x5a, 0x32, 0x57, 0x32, 0x41, 0x42, 0x6f, 0x41, 0x65, 0x38, - 0x42, 0x5c, 0x0a, - 0x09, 0x6a, 0x78, 0x56, 0x51, 0x53, 0x35, 0x4d, 0x63, 0x34, 0x64, 0x52, 0x6d, 0x50, 0x64, 0x6a, 0x6a, 0x64, - 0x2f, 0x31, 0x75, 0x75, 0x52, 0x75, 0x34, 0x7a, 0x55, 0x62, 0x57, 0x49, 0x4d, 0x5a, 0x61, 0x72, 0x63, 0x47, - 0x50, 0x37, 0x38, 0x6b, 0x75, 0x38, 0x48, 0x67, 0x66, 0x38, 0x45, 0x35, 0x52, 0x42, 0x56, 0x58, 0x4d, 0x46, - 0x6d, 0x41, 0x58, 0x6f, 0x61, 0x48, 0x62, 0x74, 0x38, 0x4f, 0x45, 0x42, 0x6a, 0x33, 0x53, 0x34, 0x39, 0x5a, - 0x75, 0x5c, 0x0a, - 0x09, 0x34, 0x4b, 0x45, 0x50, 0x6d, 0x72, 0x4b, 0x42, 0x64, 0x53, 0x62, 0x6b, 0x4f, 0x56, 0x2f, 0x37, 0x75, - 0x38, 0x41, 0x6e, 0x77, 0x49, 0x30, 0x6a, 0x72, 0x69, 0x57, 0x76, 0x76, 0x77, 0x6b, 0x4e, 0x4f, 0x51, 0x6c, - 0x63, 0x4f, 0x4d, 0x4c, 0x33, 0x66, 0x52, 0x6c, 0x34, 0x4d, 0x65, 0x2b, 0x4c, 0x62, 0x57, 0x44, 0x56, 0x51, - 0x5a, 0x34, 0x41, 0x61, 0x41, 0x46, 0x33, 0x41, 0x30, 0x38, 0x41, 0x4e, 0x77, 0x43, 0x58, 0x41, 0x57, 0x63, - 0x54, 0x5c, 0x0a, - 0x09, 0x31, 0x67, 0x58, 0x6d, 0x45, 0x71, 0x34, 0x66, 0x63, 0x47, 0x37, 0x48, 0x38, 0x34, 0x38, 0x41, 0x4a, - 0x7a, 0x6f, 0x65, 0x54, 0x78, 0x49, 0x57, 0x6d, 0x37, 0x70, 0x2f, 0x48, 0x73, 0x2b, 0x65, 0x65, 0x35, 0x51, - 0x77, 0x79, 0x68, 0x37, 0x4f, 0x37, 0x68, 0x2f, 0x6c, 0x35, 0x42, 0x47, 0x32, 0x2f, 0x62, 0x75, 0x44, 0x68, - 0x47, 0x33, 0x65, 0x76, 0x37, 0x4c, 0x33, 0x66, 0x52, 0x35, 0x34, 0x4a, 0x63, 0x66, 0x66, 0x70, 0x35, 0x66, - 0x6e, 0x5c, 0x0a, - 0x09, 0x67, 0x4e, 0x66, 0x41, 0x52, 0x6c, 0x61, 0x7a, 0x52, 0x57, 0x30, 0x43, 0x51, 0x4b, 0x57, 0x76, 0x38, - 0x2f, 0x34, 0x35, 0x63, 0x50, 0x32, 0x51, 0x37, 0x33, 0x45, 0x43, 0x65, 0x41, 0x70, 0x34, 0x45, 0x32, 0x78, - 0x2b, 0x4e, 0x56, 0x39, 0x30, 0x41, 0x46, 0x52, 0x4e, 0x46, 0x6b, 0x68, 0x72, 0x67, 0x4f, 0x2b, 0x48, 0x66, - 0x4b, 0x74, 0x4a, 0x59, 0x42, 0x4f, 0x77, 0x47, 0x57, 0x78, 0x2b, 0x70, 0x61, 0x45, 0x70, 0x31, 0x32, 0x7a, - 0x62, 0x5c, 0x0a, - 0x09, 0x4e, 0x4f, 0x54, 0x72, 0x6a, 0x77, 0x45, 0x62, 0x67, 0x59, 0x2f, 0x41, 0x35, 0x6c, 0x63, 0x36, 0x61, - 0x6a, 0x30, 0x44, 0x36, 0x4e, 0x67, 0x63, 0x2b, 0x52, 0x5a, 0x59, 0x6d, 0x2f, 0x4e, 0x74, 0x39, 0x67, 0x50, - 0x33, 0x45, 0x68, 0x59, 0x32, 0x62, 0x58, 0x34, 0x6c, 0x70, 0x51, 0x6b, 0x7a, 0x67, 0x47, 0x76, 0x4a, 0x33, - 0x2f, 0x79, 0x2f, 0x45, 0x42, 0x59, 0x30, 0x74, 0x34, 0x4c, 0x4e, 0x72, 0x2f, 0x51, 0x30, 0x49, 0x51, 0x41, - 0x65, 0x5c, 0x0a, - 0x09, 0x7a, 0x66, 0x6d, 0x36, 0x62, 0x63, 0x41, 0x47, 0x34, 0x43, 0x65, 0x77, 0x2b, 0x5a, 0x57, 0x6d, 0x32, - 0x6d, 0x34, 0x43, 0x64, 0x45, 0x7a, 0x2f, 0x74, 0x78, 0x46, 0x32, 0x52, 0x63, 0x62, 0x59, 0x43, 0x74, 0x78, - 0x46, 0x39, 0x6f, 0x30, 0x31, 0x6d, 0x31, 0x2b, 0x70, 0x71, 0x76, 0x76, 0x6c, 0x77, 0x57, 0x38, 0x6b, 0x76, - 0x76, 0x6b, 0x2f, 0x42, 0x6d, 0x37, 0x42, 0x35, 0x70, 0x66, 0x71, 0x47, 0x51, 0x41, 0x64, 0x6f, 0x2f, 0x2f, - 0x44, 0x5c, 0x0a, - 0x09, 0x6b, 0x53, 0x2f, 0x39, 0x45, 0x4c, 0x69, 0x54, 0x37, 0x45, 0x6f, 0x31, 0x4e, 0x72, 0x39, 0x53, 0x56, - 0x38, 0x73, 0x41, 0x79, 0x49, 0x77, 0x44, 0x6a, 0x30, 0x51, 0x38, 0x2f, 0x79, 0x33, 0x67, 0x66, 0x75, 0x42, - 0x50, 0x73, 0x50, 0x6b, 0x6c, 0x71, 0x48, 0x63, 0x41, 0x33, 0x41, 0x79, 0x73, 0x47, 0x50, 0x43, 0x35, 0x62, - 0x78, 0x41, 0x57, 0x43, 0x2f, 0x38, 0x42, 0x6d, 0x31, 0x39, 0x71, 0x71, 0x31, 0x30, 0x41, 0x64, 0x45, 0x7a, - 0x2f, 0x5c, 0x0a, - 0x09, 0x42, 0x2f, 0x31, 0x4b, 0x38, 0x71, 0x76, 0x41, 0x4d, 0x32, 0x54, 0x58, 0x4e, 0x62, 0x44, 0x35, 0x70, - 0x53, 0x6c, 0x31, 0x33, 0x51, 0x30, 0x34, 0x41, 0x33, 0x68, 0x6f, 0x67, 0x4f, 0x65, 0x39, 0x51, 0x41, 0x67, - 0x41, 0x77, 0x4f, 0x61, 0x58, 0x75, 0x74, 0x55, 0x31, 0x41, 0x4f, 0x34, 0x45, 0x6c, 0x6b, 0x37, 0x7a, 0x35, - 0x79, 0x65, 0x41, 0x5a, 0x77, 0x6c, 0x54, 0x66, 0x78, 0x74, 0x66, 0x36, 0x71, 0x4e, 0x57, 0x41, 0x54, 0x44, - 0x67, 0x5c, 0x0a, - 0x09, 0x36, 0x76, 0x38, 0x6b, 0x38, 0x44, 0x68, 0x68, 0x30, 0x63, 0x2f, 0x6d, 0x6c, 0x36, 0x5a, 0x52, 0x71, - 0x77, 0x44, 0x49, 0x7a, 0x4b, 0x48, 0x2f, 0x39, 0x50, 0x38, 0x34, 0x38, 0x43, 0x44, 0x77, 0x41, 0x64, 0x6a, - 0x38, 0x30, 0x75, 0x6e, 0x55, 0x4d, 0x51, 0x41, 0x32, 0x41, 0x41, 0x74, 0x36, 0x2f, 0x50, 0x34, 0x51, 0x63, - 0x41, 0x2f, 0x68, 0x51, 0x42, 0x2b, 0x62, 0x58, 0x78, 0x70, 0x41, 0x62, 0x51, 0x4c, 0x67, 0x4e, 0x4b, 0x76, - 0x2f, 0x5c, 0x0a, - 0x09, 0x65, 0x77, 0x6e, 0x42, 0x38, 0x44, 0x58, 0x59, 0x2f, 0x4e, 0x4b, 0x67, 0x36, 0x72, 0x59, 0x62, 0x63, - 0x42, 0x37, 0x68, 0x59, 0x4a, 0x35, 0x4f, 0x32, 0x34, 0x46, 0x62, 0x73, 0x66, 0x6d, 0x6c, 0x61, 0x48, 0x55, - 0x4c, 0x67, 0x49, 0x33, 0x41, 0x57, 0x52, 0x32, 0x50, 0x74, 0x77, 0x4b, 0x33, 0x41, 0x54, 0x2b, 0x43, 0x7a, - 0x53, 0x2f, 0x46, 0x71, 0x6b, 0x55, 0x41, 0x39, 0x46, 0x6e, 0x39, 0x2f, 0x78, 0x53, 0x34, 0x48, 0x66, 0x67, - 0x5a, 0x5c, 0x0a, - 0x09, 0x62, 0x48, 0x34, 0x70, 0x6a, 0x31, 0x6f, 0x45, 0x51, 0x47, 0x59, 0x42, 0x34, 0x63, 0x77, 0x39, 0x45, - 0x45, 0x37, 0x64, 0x64, 0x51, 0x66, 0x68, 0x62, 0x44, 0x34, 0x32, 0x76, 0x35, 0x52, 0x54, 0x6e, 0x51, 0x4a, - 0x67, 0x49, 0x32, 0x45, 0x58, 0x34, 0x47, 0x62, 0x43, 0x61, 0x76, 0x38, 0x78, 0x73, 0x50, 0x6d, 0x6c, 0x59, - 0x56, 0x54, 0x2b, 0x68, 0x43, 0x41, 0x64, 0x30, 0x2f, 0x2f, 0x33, 0x67, 0x54, 0x33, 0x41, 0x30, 0x33, 0x68, - 0x63, 0x5c, 0x0a, - 0x09, 0x76, 0x7a, 0x51, 0x53, 0x64, 0x5a, 0x6b, 0x42, 0x4c, 0x41, 0x61, 0x2b, 0x41, 0x70, 0x37, 0x45, 0x35, - 0x70, 0x64, 0x47, 0x70, 0x69, 0x34, 0x7a, 0x67, 0x44, 0x45, 0x36, 0x72, 0x72, 0x64, 0x6e, 0x38, 0x30, 0x75, - 0x6a, 0x55, 0x5a, 0x63, 0x44, 0x67, 0x56, 0x70, 0x67, 0x34, 0x30, 0x75, 0x6a, 0x56, 0x76, 0x6b, 0x5a, 0x67, - 0x4b, 0x54, 0x69, 0x31, 0x47, 0x55, 0x4e, 0x51, 0x46, 0x49, 0x42, 0x44, 0x41, 0x41, 0x70, 0x59, 0x51, 0x61, - 0x41, 0x5c, 0x0a, - 0x09, 0x6c, 0x44, 0x41, 0x44, 0x51, 0x45, 0x71, 0x59, 0x41, 0x53, 0x41, 0x6c, 0x7a, 0x41, 0x43, 0x51, 0x45, - 0x6d, 0x59, 0x41, 0x53, 0x41, 0x6b, 0x7a, 0x41, 0x4b, 0x53, 0x45, 0x47, 0x51, 0x42, 0x53, 0x77, 0x67, 0x77, - 0x41, 0x4b, 0x57, 0x45, 0x47, 0x67, 0x4a, 0x51, 0x77, 0x41, 0x30, 0x42, 0x4b, 0x6d, 0x41, 0x45, 0x67, 0x4a, - 0x63, 0x77, 0x41, 0x6b, 0x42, 0x4a, 0x6d, 0x41, 0x45, 0x67, 0x4a, 0x4d, 0x77, 0x43, 0x6b, 0x68, 0x42, 0x6b, - 0x41, 0x5c, 0x0a, - 0x09, 0x55, 0x73, 0x49, 0x4d, 0x41, 0x43, 0x6c, 0x68, 0x42, 0x6f, 0x43, 0x55, 0x4d, 0x41, 0x4e, 0x41, 0x53, - 0x70, 0x67, 0x42, 0x49, 0x43, 0x58, 0x4d, 0x41, 0x4a, 0x41, 0x53, 0x5a, 0x67, 0x42, 0x49, 0x43, 0x54, 0x4d, - 0x41, 0x70, 0x49, 0x51, 0x5a, 0x41, 0x46, 0x4c, 0x43, 0x44, 0x41, 0x41, 0x70, 0x59, 0x51, 0x61, 0x41, 0x6c, - 0x44, 0x41, 0x44, 0x51, 0x45, 0x71, 0x59, 0x41, 0x53, 0x41, 0x6c, 0x7a, 0x41, 0x43, 0x51, 0x45, 0x6d, 0x59, - 0x41, 0x5c, 0x0a, - 0x09, 0x53, 0x41, 0x6b, 0x7a, 0x41, 0x4b, 0x53, 0x45, 0x47, 0x51, 0x42, 0x53, 0x77, 0x67, 0x77, 0x41, 0x4b, - 0x57, 0x45, 0x47, 0x67, 0x4a, 0x51, 0x77, 0x41, 0x30, 0x42, 0x4b, 0x6d, 0x41, 0x45, 0x67, 0x4a, 0x63, 0x77, - 0x41, 0x6b, 0x42, 0x4a, 0x6d, 0x41, 0x45, 0x67, 0x4a, 0x4d, 0x77, 0x43, 0x6b, 0x68, 0x42, 0x6b, 0x41, 0x55, - 0x73, 0x49, 0x4d, 0x41, 0x43, 0x6c, 0x68, 0x42, 0x6f, 0x43, 0x55, 0x4d, 0x41, 0x4e, 0x41, 0x53, 0x70, 0x67, - 0x42, 0x5c, 0x0a, - 0x09, 0x49, 0x43, 0x58, 0x4d, 0x41, 0x4a, 0x41, 0x53, 0x5a, 0x67, 0x42, 0x49, 0x43, 0x54, 0x4d, 0x41, 0x70, - 0x49, 0x51, 0x5a, 0x41, 0x46, 0x4c, 0x43, 0x44, 0x41, 0x41, 0x70, 0x59, 0x66, 0x38, 0x44, 0x63, 0x44, 0x39, - 0x39, 0x47, 0x6c, 0x32, 0x37, 0x6b, 0x55, 0x6b, 0x41, 0x41, 0x41, 0x41, 0x41, 0x53, 0x55, 0x56, 0x4f, 0x52, - 0x4b, 0x35, 0x43, 0x59, 0x49, 0x49, 0x3d, 0x5c, 0x0a, - 0x09, 0x22, 0x0a, - 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x5f, 0x70, - 0x6e, 0x67, 0x20, 0x3d, 0x0a, - 0x09, 0x22, 0x69, 0x56, 0x42, 0x4f, 0x52, 0x77, 0x30, 0x4b, 0x47, 0x67, 0x6f, 0x41, 0x41, 0x41, 0x41, 0x4e, - 0x53, 0x55, 0x68, 0x45, 0x55, 0x67, 0x41, 0x41, 0x41, 0x51, 0x41, 0x41, 0x41, 0x41, 0x45, 0x41, 0x43, 0x41, - 0x59, 0x41, 0x41, 0x41, 0x42, 0x63, 0x63, 0x71, 0x68, 0x6d, 0x41, 0x41, 0x41, 0x67, 0x41, 0x45, 0x6c, 0x45, - 0x51, 0x56, 0x52, 0x34, 0x6e, 0x4f, 0x79, 0x39, 0x65, 0x62, 0x77, 0x6c, 0x56, 0x31, 0x55, 0x76, 0x2f, 0x6c, - 0x31, 0x56, 0x5c, 0x0a, - 0x09, 0x5a, 0x37, 0x68, 0x44, 0x39, 0x37, 0x33, 0x64, 0x6e, 0x52, 0x34, 0x79, 0x64, 0x79, 0x66, 0x64, 0x68, - 0x42, 0x41, 0x79, 0x51, 0x42, 0x42, 0x4d, 0x43, 0x43, 0x42, 0x44, 0x6e, 0x67, 0x4a, 0x52, 0x47, 0x63, 0x57, - 0x66, 0x54, 0x31, 0x51, 0x45, 0x55, 0x51, 0x48, 0x31, 0x5a, 0x2b, 0x43, 0x4a, 0x67, 0x6b, 0x39, 0x42, 0x48, - 0x6a, 0x6a, 0x41, 0x38, 0x34, 0x47, 0x41, 0x54, 0x49, 0x72, 0x54, 0x44, 0x35, 0x2b, 0x6f, 0x50, 0x50, 0x7a, - 0x4a, 0x5c, 0x0a, - 0x09, 0x45, 0x30, 0x55, 0x68, 0x41, 0x57, 0x51, 0x4d, 0x49, 0x43, 0x52, 0x6b, 0x41, 0x45, 0x4a, 0x43, 0x35, - 0x6e, 0x6e, 0x6f, 0x76, 0x74, 0x31, 0x33, 0x50, 0x50, 0x64, 0x55, 0x37, 0x66, 0x66, 0x48, 0x72, 0x72, 0x31, - 0x72, 0x72, 0x62, 0x56, 0x58, 0x6e, 0x64, 0x76, 0x45, 0x4f, 0x2f, 0x54, 0x7a, 0x31, 0x75, 0x72, 0x50, 0x37, - 0x56, 0x4f, 0x6e, 0x61, 0x67, 0x39, 0x72, 0x72, 0x2b, 0x47, 0x37, 0x31, 0x74, 0x36, 0x31, 0x71, 0x77, 0x34, - 0x35, 0x5c, 0x0a, - 0x09, 0x35, 0x39, 0x42, 0x53, 0x53, 0x79, 0x31, 0x74, 0x54, 0x73, 0x6f, 0x32, 0x6d, 0x6f, 0x47, 0x57, 0x57, - 0x6d, 0x70, 0x70, 0x34, 0x36, 0x67, 0x46, 0x67, 0x4a, 0x5a, 0x61, 0x32, 0x73, 0x54, 0x55, 0x41, 0x6b, 0x42, - 0x4c, 0x4c, 0x57, 0x31, 0x69, 0x61, 0x67, 0x47, 0x67, 0x70, 0x5a, 0x59, 0x32, 0x4d, 0x62, 0x55, 0x41, 0x30, - 0x46, 0x4a, 0x4c, 0x6d, 0x35, 0x68, 0x61, 0x41, 0x47, 0x69, 0x70, 0x70, 0x55, 0x31, 0x4d, 0x4c, 0x51, 0x43, - 0x30, 0x5c, 0x0a, - 0x09, 0x31, 0x4e, 0x49, 0x6d, 0x70, 0x68, 0x59, 0x41, 0x57, 0x6d, 0x70, 0x70, 0x45, 0x31, 0x4d, 0x4c, 0x41, - 0x43, 0x32, 0x31, 0x74, 0x49, 0x6d, 0x70, 0x42, 0x59, 0x43, 0x57, 0x57, 0x74, 0x72, 0x45, 0x31, 0x41, 0x4a, - 0x41, 0x53, 0x79, 0x31, 0x74, 0x59, 0x6d, 0x6f, 0x42, 0x6f, 0x4b, 0x57, 0x57, 0x4e, 0x6a, 0x47, 0x31, 0x41, - 0x4e, 0x42, 0x53, 0x53, 0x35, 0x75, 0x59, 0x57, 0x67, 0x42, 0x6f, 0x71, 0x61, 0x56, 0x4e, 0x54, 0x43, 0x30, - 0x41, 0x5c, 0x0a, - 0x09, 0x74, 0x4e, 0x54, 0x53, 0x4a, 0x71, 0x59, 0x57, 0x41, 0x46, 0x70, 0x71, 0x61, 0x52, 0x4e, 0x54, 0x43, - 0x77, 0x41, 0x74, 0x74, 0x62, 0x53, 0x4a, 0x71, 0x51, 0x57, 0x41, 0x6c, 0x6c, 0x72, 0x61, 0x78, 0x4e, 0x51, - 0x43, 0x51, 0x45, 0x73, 0x74, 0x62, 0x57, 0x4a, 0x71, 0x41, 0x61, 0x43, 0x6c, 0x6c, 0x6a, 0x59, 0x78, 0x74, - 0x51, 0x44, 0x51, 0x55, 0x6b, 0x75, 0x62, 0x6d, 0x46, 0x6f, 0x41, 0x61, 0x4b, 0x6d, 0x6c, 0x54, 0x55, 0x77, - 0x74, 0x5c, 0x0a, - 0x09, 0x41, 0x4c, 0x54, 0x55, 0x30, 0x69, 0x61, 0x6d, 0x46, 0x67, 0x42, 0x61, 0x61, 0x6d, 0x6b, 0x54, 0x55, - 0x77, 0x73, 0x41, 0x4c, 0x62, 0x57, 0x30, 0x69, 0x61, 0x6b, 0x46, 0x67, 0x4a, 0x5a, 0x61, 0x32, 0x73, 0x54, - 0x55, 0x41, 0x6b, 0x42, 0x4c, 0x4c, 0x57, 0x31, 0x69, 0x61, 0x67, 0x47, 0x67, 0x70, 0x5a, 0x59, 0x32, 0x4d, - 0x62, 0x55, 0x41, 0x30, 0x46, 0x4a, 0x4c, 0x6d, 0x35, 0x68, 0x61, 0x41, 0x47, 0x69, 0x70, 0x70, 0x55, 0x31, - 0x4d, 0x5c, 0x0a, - 0x09, 0x4c, 0x51, 0x43, 0x30, 0x31, 0x4e, 0x49, 0x6d, 0x70, 0x68, 0x59, 0x41, 0x57, 0x6d, 0x70, 0x70, 0x45, - 0x31, 0x4d, 0x4c, 0x41, 0x43, 0x32, 0x31, 0x74, 0x49, 0x6d, 0x70, 0x42, 0x59, 0x43, 0x57, 0x57, 0x74, 0x72, - 0x45, 0x31, 0x41, 0x4a, 0x41, 0x53, 0x79, 0x31, 0x74, 0x59, 0x6d, 0x6f, 0x42, 0x6f, 0x4b, 0x57, 0x57, 0x4e, - 0x6a, 0x47, 0x31, 0x41, 0x4e, 0x42, 0x53, 0x53, 0x35, 0x75, 0x59, 0x57, 0x67, 0x42, 0x6f, 0x71, 0x61, 0x56, - 0x4e, 0x5c, 0x0a, - 0x09, 0x54, 0x43, 0x30, 0x41, 0x74, 0x4e, 0x54, 0x53, 0x4a, 0x71, 0x59, 0x57, 0x41, 0x46, 0x70, 0x71, 0x61, - 0x52, 0x4e, 0x54, 0x43, 0x77, 0x41, 0x74, 0x74, 0x62, 0x53, 0x4a, 0x71, 0x51, 0x57, 0x41, 0x6c, 0x6c, 0x72, - 0x61, 0x78, 0x4e, 0x51, 0x43, 0x51, 0x45, 0x73, 0x74, 0x62, 0x57, 0x4a, 0x71, 0x41, 0x61, 0x43, 0x6c, 0x6c, - 0x6a, 0x59, 0x78, 0x74, 0x51, 0x44, 0x51, 0x55, 0x6b, 0x75, 0x62, 0x6d, 0x46, 0x6f, 0x41, 0x61, 0x4b, 0x6d, - 0x6c, 0x5c, 0x0a, - 0x09, 0x54, 0x55, 0x77, 0x74, 0x41, 0x4c, 0x54, 0x55, 0x30, 0x69, 0x61, 0x6d, 0x46, 0x67, 0x42, 0x61, 0x61, - 0x6d, 0x6b, 0x54, 0x55, 0x32, 0x65, 0x6a, 0x47, 0x57, 0x69, 0x70, 0x70, 0x66, 0x38, 0x6f, 0x74, 0x48, 0x2f, - 0x66, 0x76, 0x6e, 0x68, 0x4d, 0x49, 0x41, 0x44, 0x41, 0x44, 0x54, 0x66, 0x66, 0x74, 0x45, 0x48, 0x63, 0x48, - 0x42, 0x32, 0x31, 0x47, 0x55, 0x42, 0x4c, 0x4c, 0x61, 0x30, 0x75, 0x50, 0x59, 0x74, 0x41, 0x31, 0x77, 0x4f, - 0x59, 0x5c, 0x0a, - 0x09, 0x33, 0x6d, 0x68, 0x47, 0x6a, 0x6f, 0x5a, 0x61, 0x41, 0x47, 0x69, 0x70, 0x70, 0x56, 0x55, 0x67, 0x46, - 0x76, 0x31, 0x2f, 0x79, 0x6a, 0x6e, 0x33, 0x4d, 0x41, 0x43, 0x58, 0x4f, 0x6a, 0x67, 0x63, 0x32, 0x48, 0x66, - 0x61, 0x78, 0x6a, 0x46, 0x31, 0x46, 0x4e, 0x51, 0x43, 0x51, 0x45, 0x73, 0x74, 0x72, 0x52, 0x35, 0x31, 0x41, - 0x56, 0x77, 0x4d, 0x41, 0x68, 0x7a, 0x63, 0x79, 0x77, 0x6a, 0x55, 0x63, 0x33, 0x41, 0x62, 0x7a, 0x64, 0x4e, - 0x49, 0x5c, 0x0a, - 0x09, 0x61, 0x67, 0x47, 0x67, 0x70, 0x5a, 0x5a, 0x57, 0x67, 0x78, 0x78, 0x41, 0x6f, 0x4d, 0x66, 0x44, 0x59, - 0x57, 0x73, 0x31, 0x2f, 0x39, 0x2f, 0x74, 0x34, 0x48, 0x35, 0x67, 0x6f, 0x39, 0x6c, 0x61, 0x69, 0x56, 0x6f, - 0x41, 0x61, 0x4b, 0x6d, 0x6c, 0x56, 0x53, 0x4c, 0x6e, 0x33, 0x4e, 0x4f, 0x4a, 0x71, 0x50, 0x6f, 0x43, 0x45, - 0x4f, 0x67, 0x46, 0x63, 0x4d, 0x44, 0x2b, 0x76, 0x66, 0x73, 0x32, 0x6c, 0x4b, 0x39, 0x52, 0x31, 0x41, 0x4a, - 0x41, 0x5c, 0x0a, - 0x09, 0x53, 0x79, 0x33, 0x39, 0x4f, 0x79, 0x6e, 0x4d, 0x2f, 0x34, 0x6e, 0x6f, 0x6d, 0x63, 0x35, 0x56, 0x4b, - 0x62, 0x2f, 0x48, 0x67, 0x52, 0x2b, 0x47, 0x6e, 0x78, 0x59, 0x63, 0x73, 0x39, 0x51, 0x43, 0x51, 0x45, 0x73, - 0x74, 0x72, 0x51, 0x59, 0x52, 0x39, 0x6a, 0x75, 0x34, 0x63, 0x79, 0x76, 0x48, 0x42, 0x77, 0x41, 0x34, 0x75, - 0x43, 0x6b, 0x69, 0x75, 0x6d, 0x6a, 0x6a, 0x6d, 0x46, 0x71, 0x5a, 0x57, 0x67, 0x42, 0x6f, 0x71, 0x61, 0x56, - 0x56, 0x5c, 0x0a, - 0x09, 0x49, 0x41, 0x4c, 0x39, 0x69, 0x44, 0x6a, 0x68, 0x34, 0x6c, 0x36, 0x41, 0x5a, 0x38, 0x52, 0x70, 0x77, - 0x54, 0x46, 0x49, 0x4c, 0x51, 0x43, 0x30, 0x31, 0x4e, 0x4b, 0x2f, 0x67, 0x30, 0x4c, 0x36, 0x37, 0x2b, 0x42, - 0x2b, 0x42, 0x50, 0x42, 0x4f, 0x37, 0x2b, 0x42, 0x41, 0x52, 0x4b, 0x69, 0x6d, 0x41, 0x7a, 0x2f, 0x67, 0x34, - 0x4d, 0x51, 0x6d, 0x6f, 0x57, 0x4f, 0x4a, 0x57, 0x67, 0x42, 0x6f, 0x71, 0x61, 0x56, 0x2f, 0x50, 0x35, 0x30, - 0x44, 0x5c, 0x0a, - 0x09, 0x34, 0x48, 0x77, 0x34, 0x49, 0x4b, 0x34, 0x42, 0x41, 0x4b, 0x67, 0x69, 0x2f, 0x37, 0x6b, 0x41, 0x64, - 0x6d, 0x77, 0x51, 0x58, 0x79, 0x74, 0x53, 0x43, 0x77, 0x41, 0x74, 0x74, 0x66, 0x51, 0x51, 0x4b, 0x57, 0x7a, - 0x79, 0x49, 0x64, 0x41, 0x76, 0x45, 0x4d, 0x67, 0x37, 0x50, 0x41, 0x48, 0x68, 0x31, 0x72, 0x39, 0x7a, 0x44, - 0x67, 0x36, 0x4f, 0x41, 0x44, 0x78, 0x70, 0x77, 0x35, 0x68, 0x63, 0x67, 0x56, 0x6f, 0x41, 0x61, 0x4b, 0x6d, - 0x6c, 0x5c, 0x0a, - 0x09, 0x68, 0x30, 0x67, 0x4f, 0x44, 0x67, 0x54, 0x61, 0x42, 0x2b, 0x43, 0x6e, 0x6e, 0x58, 0x4d, 0x69, 0x2b, - 0x67, 0x4d, 0x41, 0x79, 0x45, 0x38, 0x4a, 0x43, 0x50, 0x52, 0x39, 0x36, 0x38, 0x2f, 0x64, 0x30, 0x56, 0x45, - 0x4c, 0x41, 0x43, 0x32, 0x31, 0x39, 0x42, 0x41, 0x6f, 0x52, 0x48, 0x38, 0x48, 0x39, 0x33, 0x62, 0x6e, 0x6e, - 0x4c, 0x2f, 0x56, 0x46, 0x39, 0x62, 0x36, 0x2f, 0x45, 0x37, 0x41, 0x63, 0x42, 0x30, 0x41, 0x6e, 0x67, 0x6a, - 0x67, 0x5c, 0x0a, - 0x09, 0x6d, 0x46, 0x77, 0x48, 0x61, 0x4a, 0x38, 0x47, 0x62, 0x4b, 0x6d, 0x6c, 0x37, 0x34, 0x4c, 0x55, 0x45, - 0x33, 0x2b, 0x76, 0x63, 0x6e, 0x41, 0x2f, 0x46, 0x4e, 0x4c, 0x2b, 0x73, 0x41, 0x42, 0x59, 0x58, 0x51, 0x50, - 0x67, 0x41, 0x63, 0x44, 0x42, 0x50, 0x52, 0x72, 0x2b, 0x34, 0x61, 0x43, 0x5a, 0x64, 0x57, 0x64, 0x34, 0x42, - 0x54, 0x6f, 0x6d, 0x41, 0x4f, 0x44, 0x41, 0x76, 0x74, 0x4f, 0x51, 0x37, 0x4a, 0x6d, 0x32, 0x74, 0x6c, 0x42, - 0x54, 0x5c, 0x0a, - 0x09, 0x77, 0x7a, 0x57, 0x71, 0x42, 0x51, 0x34, 0x63, 0x2b, 0x34, 0x39, 0x67, 0x74, 0x76, 0x52, 0x2f, 0x4a, - 0x37, 0x45, 0x48, 0x65, 0x77, 0x6a, 0x41, 0x71, 0x78, 0x7a, 0x63, 0x57, 0x2b, 0x41, 0x51, 0x37, 0x62, 0x4b, - 0x61, 0x45, 0x73, 0x54, 0x79, 0x44, 0x41, 0x77, 0x79, 0x41, 0x45, 0x39, 0x30, 0x63, 0x50, 0x2b, 0x77, 0x6a, - 0x75, 0x77, 0x65, 0x46, 0x52, 0x30, 0x54, 0x41, 0x46, 0x41, 0x4a, 0x37, 0x71, 0x63, 0x64, 0x33, 0x48, 0x6b, - 0x45, 0x5c, 0x0a, - 0x09, 0x6d, 0x6e, 0x56, 0x77, 0x51, 0x79, 0x49, 0x36, 0x37, 0x4a, 0x77, 0x72, 0x51, 0x54, 0x67, 0x45, 0x68, - 0x77, 0x4b, 0x45, 0x49, 0x77, 0x52, 0x61, 0x42, 0x6a, 0x44, 0x6e, 0x79, 0x43, 0x33, 0x43, 0x59, 0x52, 0x48, - 0x41, 0x50, 0x41, 0x67, 0x44, 0x41, 0x73, 0x30, 0x43, 0x47, 0x41, 0x4b, 0x59, 0x63, 0x58, 0x42, 0x4f, 0x70, - 0x31, 0x6f, 0x52, 0x6a, 0x66, 0x6b, 0x63, 0x6a, 0x64, 0x2b, 0x61, 0x64, 0x62, 0x44, 0x50, 0x4b, 0x2b, 0x49, - 0x49, 0x5c, 0x0a, - 0x09, 0x62, 0x37, 0x55, 0x50, 0x74, 0x4f, 0x44, 0x7a, 0x48, 0x34, 0x30, 0x4d, 0x57, 0x33, 0x6f, 0x34, 0x67, - 0x4c, 0x63, 0x36, 0x35, 0x35, 0x35, 0x42, 0x52, 0x48, 0x44, 0x6b, 0x2b, 0x44, 0x56, 0x76, 0x48, 0x79, 0x36, - 0x65, 0x34, 0x50, 0x51, 0x45, 0x41, 0x4d, 0x63, 0x63, 0x41, 0x46, 0x43, 0x79, 0x63, 0x4c, 0x48, 0x4f, 0x78, - 0x4b, 0x4c, 0x2f, 0x31, 0x51, 0x51, 0x36, 0x4f, 0x36, 0x42, 0x6f, 0x2f, 0x48, 0x54, 0x56, 0x50, 0x56, 0x55, - 0x6d, 0x5c, 0x0a, - 0x09, 0x57, 0x4c, 0x36, 0x78, 0x49, 0x6a, 0x71, 0x6b, 0x51, 0x31, 0x30, 0x4f, 0x6d, 0x43, 0x48, 0x51, 0x30, - 0x4d, 0x48, 0x4e, 0x45, 0x6d, 0x67, 0x41, 0x59, 0x42, 0x37, 0x41, 0x45, 0x6f, 0x41, 0x46, 0x35, 0x39, 0x77, - 0x53, 0x43, 0x41, 0x76, 0x68, 0x4f, 0x34, 0x41, 0x6c, 0x41, 0x69, 0x30, 0x34, 0x35, 0x35, 0x61, 0x49, 0x61, - 0x41, 0x48, 0x41, 0x77, 0x4d, 0x48, 0x4e, 0x45, 0x79, 0x6a, 0x35, 0x72, 0x4e, 0x70, 0x70, 0x4f, 0x6c, 0x38, - 0x34, 0x5c, 0x0a, - 0x09, 0x75, 0x43, 0x4d, 0x6a, 0x42, 0x39, 0x73, 0x45, 0x4e, 0x4e, 0x2b, 0x4e, 0x43, 0x69, 0x79, 0x41, 0x4f, - 0x6f, 0x70, 0x32, 0x62, 0x37, 0x7a, 0x6c, 0x35, 0x75, 0x2b, 0x69, 0x6b, 0x38, 0x31, 0x4a, 0x30, 0x64, 0x6c, - 0x54, 0x65, 0x55, 0x34, 0x41, 0x65, 0x41, 0x61, 0x41, 0x6e, 0x77, 0x54, 0x77, 0x51, 0x2f, 0x34, 0x32, 0x76, - 0x33, 0x4a, 0x32, 0x49, 0x4e, 0x37, 0x37, 0x5a, 0x33, 0x62, 0x49, 0x70, 0x77, 0x4b, 0x66, 0x68, 0x73, 0x4f, - 0x54, 0x5c, 0x0a, - 0x09, 0x69, 0x65, 0x69, 0x59, 0x43, 0x68, 0x49, 0x62, 0x6e, 0x67, 0x46, 0x55, 0x6a, 0x6a, 0x34, 0x4f, 0x34, - 0x42, 0x48, 0x63, 0x2b, 0x51, 0x50, 0x46, 0x44, 0x52, 0x57, 0x45, 0x78, 0x75, 0x67, 0x73, 0x36, 0x6e, 0x67, - 0x67, 0x6d, 0x4b, 0x36, 0x4f, 0x6a, 0x77, 0x73, 0x4c, 0x4d, 0x6e, 0x79, 0x44, 0x52, 0x75, 0x79, 0x37, 0x61, - 0x6a, 0x64, 0x75, 0x33, 0x4b, 0x67, 0x55, 0x79, 0x76, 0x76, 0x6b, 0x51, 0x42, 0x54, 0x36, 0x31, 0x38, 0x44, - 0x45, 0x5c, 0x0a, - 0x09, 0x41, 0x61, 0x73, 0x61, 0x30, 0x32, 0x45, 0x41, 0x6a, 0x6b, 0x42, 0x7a, 0x41, 0x4a, 0x59, 0x64, 0x33, - 0x43, 0x4b, 0x41, 0x52, 0x53, 0x49, 0x61, 0x4f, 0x75, 0x64, 0x6d, 0x71, 0x32, 0x4b, 0x48, 0x4b, 0x6a, 0x5a, - 0x6d, 0x51, 0x52, 0x6a, 0x43, 0x59, 0x52, 0x47, 0x45, 0x52, 0x51, 0x42, 0x44, 0x4f, 0x4d, 0x77, 0x53, 0x6b, - 0x58, 0x50, 0x4f, 0x7a, 0x56, 0x54, 0x54, 0x6d, 0x79, 0x50, 0x4f, 0x75, 0x51, 0x4b, 0x45, 0x42, 0x51, 0x49, - 0x74, 0x5c, 0x0a, - 0x09, 0x4f, 0x62, 0x69, 0x43, 0x51, 0x45, 0x65, 0x71, 0x4d, 0x66, 0x74, 0x36, 0x50, 0x68, 0x55, 0x39, 0x41, - 0x71, 0x44, 0x77, 0x55, 0x73, 0x42, 0x4d, 0x4e, 0x54, 0x63, 0x64, 0x41, 0x4a, 0x6a, 0x66, 0x76, 0x32, 0x2b, - 0x66, 0x6e, 0x51, 0x6d, 0x4e, 0x6f, 0x71, 0x5a, 0x73, 0x36, 0x47, 0x67, 0x79, 0x4a, 0x71, 0x75, 0x4d, 0x63, - 0x53, 0x37, 0x4a, 0x71, 0x6f, 0x34, 0x79, 0x47, 0x30, 0x76, 0x4b, 0x41, 0x6e, 0x7a, 0x7a, 0x54, 0x58, 0x4f, - 0x2f, 0x5c, 0x0a, - 0x09, 0x6d, 0x67, 0x69, 0x36, 0x7a, 0x35, 0x79, 0x49, 0x48, 0x75, 0x36, 0x63, 0x4f, 0x77, 0x2b, 0x45, 0x52, - 0x77, 0x48, 0x34, 0x58, 0x67, 0x49, 0x39, 0x33, 0x73, 0x46, 0x31, 0x49, 0x36, 0x39, 0x55, 0x32, 0x30, 0x36, - 0x77, 0x70, 0x32, 0x71, 0x75, 0x37, 0x34, 0x2f, 0x44, 0x4e, 0x57, 0x6d, 0x58, 0x6a, 0x79, 0x57, 0x69, 0x33, - 0x4d, 0x45, 0x56, 0x4b, 0x34, 0x78, 0x71, 0x58, 0x57, 0x6e, 0x44, 0x41, 0x51, 0x41, 0x41, 0x48, 0x4e, 0x79, - 0x35, 0x5c, 0x0a, - 0x09, 0x41, 0x48, 0x4c, 0x74, 0x57, 0x41, 0x49, 0x49, 0x6d, 0x50, 0x45, 0x47, 0x4a, 0x56, 0x53, 0x33, 0x57, - 0x45, 0x52, 0x62, 0x59, 0x74, 0x73, 0x6c, 0x63, 0x2b, 0x44, 0x51, 0x52, 0x6a, 0x41, 0x51, 0x49, 0x68, 0x4c, - 0x4b, 0x45, 0x2f, 0x77, 0x77, 0x42, 0x59, 0x62, 0x76, 0x75, 0x71, 0x77, 0x46, 0x45, 0x75, 0x7a, 0x36, 0x56, - 0x46, 0x56, 0x76, 0x6d, 0x6f, 0x69, 0x69, 0x49, 0x58, 0x43, 0x2b, 0x51, 0x31, 0x6b, 0x4f, 0x4c, 0x76, 0x45, - 0x38, 0x5c, 0x0a, - 0x09, 0x31, 0x58, 0x30, 0x59, 0x73, 0x75, 0x4a, 0x66, 0x61, 0x72, 0x35, 0x49, 0x7a, 0x54, 0x38, 0x44, 0x7a, - 0x35, 0x4b, 0x2f, 0x65, 0x51, 0x44, 0x4c, 0x46, 0x65, 0x38, 0x7a, 0x46, 0x63, 0x67, 0x4d, 0x41, 0x63, 0x78, - 0x57, 0x35, 0x30, 0x4a, 0x6d, 0x42, 0x43, 0x49, 0x36, 0x41, 0x70, 0x2f, 0x56, 0x6c, 0x41, 0x41, 0x4f, 0x52, - 0x2f, 0x6d, 0x68, 0x79, 0x71, 0x44, 0x71, 0x75, 0x65, 0x38, 0x79, 0x67, 0x44, 0x6b, 0x32, 0x4a, 0x6c, 0x2b, - 0x65, 0x5c, 0x0a, - 0x09, 0x61, 0x76, 0x34, 0x63, 0x33, 0x41, 0x77, 0x41, 0x78, 0x32, 0x51, 0x32, 0x43, 0x32, 0x44, 0x49, 0x39, - 0x4c, 0x4c, 0x67, 0x34, 0x4a, 0x59, 0x49, 0x46, 0x4a, 0x32, 0x4c, 0x52, 0x31, 0x48, 0x65, 0x68, 0x34, 0x69, - 0x73, 0x77, 0x52, 0x47, 0x42, 0x6a, 0x49, 0x69, 0x6d, 0x74, 0x46, 0x34, 0x71, 0x36, 0x68, 0x4c, 0x52, 0x70, - 0x48, 0x4f, 0x75, 0x43, 0x38, 0x49, 0x6b, 0x48, 0x4d, 0x4a, 0x6e, 0x68, 0x34, 0x69, 0x32, 0x4f, 0x4c, 0x68, - 0x70, 0x5c, 0x0a, - 0x09, 0x45, 0x4c, 0x62, 0x42, 0x34, 0x58, 0x67, 0x69, 0x4f, 0x74, 0x6b, 0x35, 0x64, 0x38, 0x43, 0x52, 0x47, - 0x2b, 0x4d, 0x79, 0x35, 0x72, 0x4c, 0x6c, 0x49, 0x4d, 0x41, 0x70, 0x79, 0x6a, 0x36, 0x73, 0x42, 0x7a, 0x68, - 0x6d, 0x76, 0x7a, 0x35, 0x34, 0x54, 0x54, 0x69, 0x34, 0x73, 0x77, 0x46, 0x63, 0x6c, 0x53, 0x68, 0x31, 0x41, - 0x2b, 0x6d, 0x59, 0x41, 0x41, 0x41, 0x43, 0x50, 0x64, 0x72, 0x42, 0x53, 0x63, 0x56, 0x56, 0x42, 0x6b, 0x62, - 0x77, 0x5c, 0x0a, - 0x09, 0x38, 0x79, 0x79, 0x52, 0x42, 0x66, 0x41, 0x56, 0x31, 0x31, 0x44, 0x4f, 0x53, 0x4d, 0x6d, 0x34, 0x4d, - 0x71, 0x4a, 0x2b, 0x79, 0x48, 0x41, 0x53, 0x64, 0x73, 0x79, 0x56, 0x7a, 0x63, 0x46, 0x43, 0x74, 0x36, 0x4f, - 0x7a, 0x42, 0x75, 0x37, 0x63, 0x30, 0x65, 0x47, 0x59, 0x38, 0x79, 0x6d, 0x41, 0x6b, 0x47, 0x4e, 0x4d, 0x6a, - 0x54, 0x61, 0x4a, 0x49, 0x69, 0x4c, 0x62, 0x4d, 0x4b, 0x4a, 0x50, 0x35, 0x49, 0x6b, 0x5a, 0x49, 0x73, 0x2b, - 0x4b, 0x5c, 0x0a, - 0x09, 0x71, 0x74, 0x4d, 0x54, 0x4c, 0x4d, 0x75, 0x5a, 0x44, 0x6d, 0x4d, 0x4c, 0x73, 0x75, 0x64, 0x39, 0x36, - 0x50, 0x48, 0x47, 0x66, 0x68, 0x6a, 0x50, 0x6a, 0x52, 0x51, 0x63, 0x6e, 0x35, 0x79, 0x6f, 0x45, 0x39, 0x74, - 0x7a, 0x6b, 0x6e, 0x64, 0x72, 0x34, 0x55, 0x7a, 0x49, 0x78, 0x77, 0x42, 0x4a, 0x72, 0x67, 0x50, 0x65, 0x6a, - 0x75, 0x57, 0x63, 0x51, 0x52, 0x34, 0x43, 0x51, 0x48, 0x69, 0x36, 0x37, 0x74, 0x49, 0x36, 0x2f, 0x4c, 0x72, - 0x6d, 0x5c, 0x0a, - 0x09, 0x30, 0x35, 0x79, 0x61, 0x57, 0x76, 0x55, 0x5a, 0x57, 0x46, 0x58, 0x6c, 0x4c, 0x33, 0x44, 0x4f, 0x48, - 0x56, 0x4d, 0x41, 0x63, 0x4b, 0x7a, 0x73, 0x41, 0x33, 0x68, 0x4d, 0x6f, 0x32, 0x4b, 0x64, 0x45, 0x77, 0x61, - 0x54, 0x4f, 0x42, 0x59, 0x7a, 0x78, 0x48, 0x41, 0x74, 0x52, 0x50, 0x66, 0x34, 0x6a, 0x36, 0x6a, 0x65, 0x6e, - 0x56, 0x55, 0x5a, 0x4f, 0x30, 0x2f, 0x6c, 0x51, 0x68, 0x6d, 0x65, 0x50, 0x6e, 0x4c, 0x41, 0x34, 0x55, 0x59, - 0x54, 0x5c, 0x0a, - 0x09, 0x32, 0x71, 0x6a, 0x42, 0x6e, 0x55, 0x51, 0x36, 0x79, 0x38, 0x63, 0x51, 0x32, 0x6b, 0x73, 0x79, 0x44, - 0x4f, 0x35, 0x77, 0x69, 0x70, 0x66, 0x41, 0x44, 0x32, 0x2f, 0x50, 0x6e, 0x42, 0x61, 0x70, 0x4e, 0x68, 0x4d, - 0x6e, 0x63, 0x69, 0x78, 0x44, 0x49, 0x6c, 0x6e, 0x4f, 0x64, 0x46, 0x35, 0x31, 0x53, 0x6d, 0x64, 0x5a, 0x6b, - 0x5a, 0x63, 0x52, 0x6a, 0x68, 0x39, 0x30, 0x6c, 0x66, 0x42, 0x41, 0x4a, 0x44, 0x36, 0x35, 0x54, 0x43, 0x4c, - 0x66, 0x5c, 0x0a, - 0x09, 0x59, 0x54, 0x6a, 0x4f, 0x48, 0x6c, 0x2b, 0x55, 0x47, 0x35, 0x4d, 0x72, 0x50, 0x36, 0x65, 0x4c, 0x4a, - 0x2b, 0x31, 0x43, 0x32, 0x6c, 0x55, 0x59, 0x53, 0x7a, 0x6a, 0x48, 0x77, 0x59, 0x50, 0x4c, 0x6d, 0x37, 0x66, - 0x50, 0x62, 0x55, 0x65, 0x33, 0x41, 0x34, 0x63, 0x34, 0x58, 0x6a, 0x36, 0x2b, 0x61, 0x43, 0x64, 0x65, 0x31, - 0x34, 0x39, 0x72, 0x46, 0x4e, 0x34, 0x47, 0x30, 0x59, 0x59, 0x43, 0x77, 0x50, 0x36, 0x39, 0x2b, 0x34, 0x4a, - 0x67, 0x5c, 0x0a, - 0x09, 0x48, 0x38, 0x55, 0x4e, 0x51, 0x69, 0x4f, 0x31, 0x6e, 0x6d, 0x73, 0x44, 0x38, 0x50, 0x57, 0x43, 0x4d, - 0x69, 0x43, 0x6e, 0x44, 0x4f, 0x45, 0x38, 0x4e, 0x78, 0x61, 0x74, 0x4d, 0x4f, 0x34, 0x63, 0x49, 0x6c, 0x56, - 0x7a, 0x64, 0x54, 0x62, 0x41, 0x2f, 0x31, 0x6e, 0x54, 0x6b, 0x64, 0x43, 0x58, 0x53, 0x53, 0x77, 0x71, 0x36, - 0x4e, 0x52, 0x56, 0x39, 0x4b, 0x76, 0x41, 0x49, 0x2f, 0x4a, 0x4a, 0x63, 0x6c, 0x36, 0x5a, 0x47, 0x44, 0x49, - 0x33, 0x5c, 0x0a, - 0x09, 0x4e, 0x49, 0x4f, 0x46, 0x43, 0x43, 0x34, 0x75, 0x58, 0x56, 0x63, 0x52, 0x36, 0x61, 0x6e, 0x46, 0x64, - 0x2f, 0x68, 0x30, 0x55, 0x70, 0x5a, 0x4a, 0x4f, 0x2b, 0x78, 0x66, 0x34, 0x4a, 0x6c, 0x2f, 0x61, 0x72, 0x43, - 0x49, 0x5a, 0x61, 0x6e, 0x75, 0x4a, 0x39, 0x45, 0x50, 0x72, 0x78, 0x4c, 0x30, 0x77, 0x65, 0x71, 0x49, 0x31, - 0x4e, 0x2f, 0x56, 0x66, 0x43, 0x62, 0x7a, 0x66, 0x30, 0x69, 0x77, 0x45, 0x39, 0x4d, 0x35, 0x35, 0x61, 0x51, - 0x36, 0x5c, 0x0a, - 0x09, 0x36, 0x2b, 0x44, 0x50, 0x39, 0x50, 0x4f, 0x4d, 0x69, 0x6f, 0x4d, 0x59, 0x6c, 0x32, 0x47, 0x30, 0x46, - 0x2f, 0x6b, 0x79, 0x6b, 0x47, 0x54, 0x73, 0x41, 0x43, 0x34, 0x45, 0x6a, 0x71, 0x30, 0x4e, 0x51, 0x63, 0x64, - 0x43, 0x42, 0x74, 0x41, 0x6c, 0x30, 0x4c, 0x6e, 0x68, 0x69, 0x31, 0x43, 0x69, 0x51, 0x32, 0x4a, 0x77, 0x38, - 0x53, 0x75, 0x66, 0x4b, 0x72, 0x42, 0x50, 0x45, 0x57, 0x6c, 0x34, 0x55, 0x38, 0x48, 0x51, 0x41, 0x6c, 0x67, - 0x77, 0x5c, 0x0a, - 0x09, 0x38, 0x49, 0x6a, 0x39, 0x4d, 0x4b, 0x66, 0x56, 0x6b, 0x55, 0x59, 0x72, 0x6c, 0x42, 0x75, 0x63, 0x42, - 0x68, 0x49, 0x64, 0x77, 0x51, 0x57, 0x66, 0x53, 0x4e, 0x4e, 0x4a, 0x31, 0x6f, 0x6d, 0x34, 0x72, 0x71, 0x2f, - 0x70, 0x71, 0x4b, 0x5a, 0x65, 0x50, 0x70, 0x48, 0x30, 0x41, 0x5a, 0x62, 0x42, 0x61, 0x50, 0x37, 0x46, 0x47, - 0x48, 0x6e, 0x55, 0x5a, 0x75, 0x50, 0x6a, 0x52, 0x68, 0x33, 0x54, 0x63, 0x45, 0x73, 0x57, 0x71, 0x41, 0x46, - 0x61, 0x5c, 0x0a, - 0x09, 0x33, 0x36, 0x45, 0x78, 0x6e, 0x59, 0x7a, 0x78, 0x7a, 0x4f, 0x55, 0x6f, 0x2b, 0x47, 0x54, 0x4f, 0x4c, - 0x6b, 0x43, 0x54, 0x5a, 0x57, 0x7a, 0x67, 0x30, 0x79, 0x41, 0x47, 0x32, 0x68, 0x5a, 0x70, 0x2f, 0x69, 0x49, - 0x51, 0x36, 0x4c, 0x46, 0x58, 0x4d, 0x74, 0x50, 0x79, 0x31, 0x30, 0x47, 0x47, 0x5a, 0x35, 0x58, 0x57, 0x74, - 0x46, 0x4a, 0x6e, 0x6c, 0x68, 0x58, 0x2f, 0x5a, 0x34, 0x4c, 0x38, 0x2b, 0x74, 0x43, 0x78, 0x51, 0x68, 0x73, - 0x4f, 0x5c, 0x0a, - 0x09, 0x41, 0x45, 0x52, 0x30, 0x46, 0x6f, 0x41, 0x65, 0x52, 0x31, 0x71, 0x4e, 0x77, 0x50, 0x47, 0x37, 0x55, - 0x39, 0x45, 0x62, 0x64, 0x70, 0x53, 0x70, 0x47, 0x34, 0x65, 0x4d, 0x53, 0x67, 0x6f, 0x6b, 0x51, 0x76, 0x6d, - 0x6f, 0x7a, 0x42, 0x42, 0x6c, 0x2b, 0x48, 0x66, 0x57, 0x70, 0x67, 0x61, 0x6a, 0x6d, 0x4a, 0x30, 0x77, 0x2f, - 0x72, 0x67, 0x68, 0x69, 0x58, 0x6f, 0x38, 0x30, 0x33, 0x44, 0x79, 0x47, 0x68, 0x38, 0x6a, 0x6a, 0x31, 0x44, - 0x57, 0x5c, 0x0a, - 0x09, 0x6d, 0x45, 0x52, 0x62, 0x41, 0x52, 0x51, 0x30, 0x4b, 0x41, 0x5a, 0x5a, 0x61, 0x52, 0x41, 0x4a, 0x78, - 0x55, 0x6a, 0x4b, 0x7a, 0x38, 0x71, 0x49, 0x72, 0x49, 0x7a, 0x48, 0x57, 0x76, 0x45, 0x32, 0x2b, 0x57, 0x50, - 0x31, 0x72, 0x4f, 0x79, 0x4a, 0x38, 0x38, 0x58, 0x6e, 0x32, 0x61, 0x4a, 0x74, 0x79, 0x34, 0x2b, 0x35, 0x54, - 0x74, 0x4b, 0x6e, 0x37, 0x6b, 0x62, 0x79, 0x4a, 0x57, 0x54, 0x4f, 0x2b, 0x2b, 0x54, 0x4f, 0x7a, 0x75, 0x78, - 0x44, 0x5c, 0x0a, - 0x09, 0x5a, 0x35, 0x41, 0x61, 0x33, 0x45, 0x57, 0x2f, 0x54, 0x75, 0x6f, 0x35, 0x64, 0x73, 0x6d, 0x79, 0x6d, - 0x77, 0x70, 0x6f, 0x69, 0x55, 0x44, 0x66, 0x59, 0x34, 0x78, 0x73, 0x77, 0x32, 0x6a, 0x44, 0x41, 0x51, 0x44, - 0x41, 0x59, 0x2f, 0x53, 0x4a, 0x42, 0x4d, 0x6c, 0x46, 0x49, 0x47, 0x55, 0x70, 0x71, 0x62, 0x45, 0x34, 0x78, - 0x38, 0x76, 0x46, 0x4b, 0x4f, 0x4a, 0x50, 0x4a, 0x4d, 0x71, 0x4a, 0x42, 0x73, 0x6f, 0x4d, 0x51, 0x73, 0x77, - 0x2f, 0x5c, 0x0a, - 0x09, 0x6b, 0x36, 0x43, 0x56, 0x70, 0x74, 0x30, 0x52, 0x43, 0x49, 0x4b, 0x54, 0x67, 0x4a, 0x49, 0x73, 0x68, - 0x6e, 0x38, 0x4b, 0x77, 0x47, 0x46, 0x74, 0x52, 0x6d, 0x66, 0x47, 0x43, 0x69, 0x6d, 0x36, 0x49, 0x6a, 0x30, - 0x66, 0x6a, 0x56, 0x47, 0x55, 0x4f, 0x62, 0x49, 0x77, 0x61, 0x4f, 0x59, 0x45, 0x63, 0x53, 0x79, 0x73, 0x54, - 0x77, 0x74, 0x38, 0x42, 0x4a, 0x41, 0x5a, 0x36, 0x61, 0x30, 0x41, 0x6d, 0x70, 0x43, 0x57, 0x73, 0x7a, 0x37, - 0x45, 0x5c, 0x0a, - 0x09, 0x4f, 0x42, 0x76, 0x47, 0x6c, 0x2f, 0x54, 0x4e, 0x6e, 0x5a, 0x47, 0x74, 0x6b, 0x38, 0x54, 0x7a, 0x56, - 0x47, 0x64, 0x75, 0x2b, 0x70, 0x6f, 0x59, 0x46, 0x77, 0x50, 0x6b, 0x79, 0x41, 0x75, 0x37, 0x79, 0x36, 0x51, - 0x6a, 0x65, 0x7a, 0x49, 0x6d, 0x6c, 0x58, 0x6e, 0x70, 0x31, 0x44, 0x2f, 0x79, 0x45, 0x73, 0x62, 0x49, 0x77, - 0x56, 0x6a, 0x5a, 0x5a, 0x4e, 0x56, 0x76, 0x59, 0x75, 0x38, 0x62, 0x53, 0x52, 0x73, 0x4b, 0x41, 0x42, 0x55, - 0x79, 0x5c, 0x0a, - 0x09, 0x50, 0x74, 0x6f, 0x79, 0x68, 0x71, 0x52, 0x73, 0x70, 0x51, 0x78, 0x52, 0x4c, 0x6a, 0x79, 0x42, 0x52, - 0x61, 0x78, 0x4d, 0x51, 0x78, 0x54, 0x57, 0x61, 0x56, 0x72, 0x6f, 0x68, 0x36, 0x4e, 0x32, 0x45, 0x69, 0x30, - 0x4e, 0x55, 0x4c, 0x47, 0x69, 0x61, 0x6f, 0x77, 0x55, 0x49, 0x55, 0x58, 0x56, 0x43, 0x35, 0x42, 0x49, 0x4d, - 0x78, 0x66, 0x74, 0x38, 0x4c, 0x46, 0x39, 0x66, 0x6e, 0x74, 0x53, 0x70, 0x64, 0x7a, 0x38, 0x75, 0x33, 0x41, - 0x6f, 0x5c, 0x0a, - 0x09, 0x32, 0x4f, 0x65, 0x44, 0x73, 0x2b, 0x71, 0x73, 0x67, 0x6d, 0x63, 0x50, 0x6e, 0x42, 0x2f, 0x64, 0x68, - 0x2b, 0x55, 0x55, 0x79, 0x54, 0x46, 0x7a, 0x51, 0x6e, 0x46, 0x33, 0x77, 0x74, 0x57, 0x4f, 0x31, 0x73, 0x53, - 0x72, 0x50, 0x68, 0x66, 0x4c, 0x57, 0x6d, 0x6b, 0x35, 0x61, 0x68, 0x76, 0x67, 0x66, 0x59, 0x6c, 0x78, 0x36, - 0x7a, 0x45, 0x5a, 0x55, 0x35, 0x74, 0x51, 0x56, 0x32, 0x53, 0x52, 0x6f, 0x55, 0x2b, 0x64, 0x63, 0x57, 0x71, - 0x65, 0x5c, 0x0a, - 0x09, 0x2b, 0x54, 0x77, 0x66, 0x74, 0x55, 0x36, 0x74, 0x76, 0x51, 0x63, 0x38, 0x75, 0x41, 0x53, 0x39, 0x56, - 0x75, 0x30, 0x38, 0x35, 0x69, 0x69, 0x78, 0x66, 0x56, 0x31, 0x6f, 0x77, 0x77, 0x44, 0x67, 0x77, 0x4c, 0x37, - 0x54, 0x51, 0x45, 0x54, 0x49, 0x38, 0x6c, 0x7a, 0x63, 0x41, 0x51, 0x43, 0x51, 0x70, 0x47, 0x49, 0x51, 0x38, - 0x70, 0x56, 0x7a, 0x4c, 0x37, 0x37, 0x77, 0x49, 0x71, 0x59, 0x4b, 0x37, 0x42, 0x39, 0x58, 0x4f, 0x6c, 0x2b, - 0x77, 0x5c, 0x0a, - 0x09, 0x45, 0x61, 0x6b, 0x6f, 0x36, 0x79, 0x51, 0x34, 0x72, 0x70, 0x55, 0x2b, 0x78, 0x37, 0x49, 0x61, 0x4e, - 0x4b, 0x69, 0x75, 0x78, 0x39, 0x4e, 0x35, 0x55, 0x51, 0x59, 0x71, 0x4b, 0x68, 0x73, 0x4c, 0x6c, 0x4b, 0x45, - 0x4d, 0x42, 0x7a, 0x77, 0x75, 0x41, 0x79, 0x76, 0x36, 0x78, 0x73, 0x6a, 0x45, 0x6f, 0x68, 0x4e, 0x33, 0x6c, - 0x67, 0x68, 0x4d, 0x54, 0x48, 0x61, 0x78, 0x72, 0x77, 0x43, 0x69, 0x72, 0x75, 0x5a, 0x66, 0x38, 0x38, 0x36, - 0x6a, 0x5c, 0x0a, - 0x09, 0x4a, 0x49, 0x2b, 0x65, 0x59, 0x64, 0x77, 0x57, 0x58, 0x36, 0x46, 0x76, 0x6b, 0x65, 0x6f, 0x62, 0x38, - 0x6f, 0x78, 0x67, 0x77, 0x52, 0x32, 0x53, 0x6c, 0x50, 0x78, 0x5a, 0x56, 0x73, 0x48, 0x48, 0x70, 0x67, 0x47, - 0x66, 0x67, 0x35, 0x61, 0x70, 0x4f, 0x35, 0x34, 0x39, 0x4d, 0x46, 0x6e, 0x7a, 0x64, 0x72, 0x6d, 0x38, 0x6d, - 0x6a, 0x49, 0x59, 0x62, 0x6a, 0x4d, 0x63, 0x2b, 0x42, 0x4f, 0x67, 0x67, 0x62, 0x50, 0x47, 0x38, 0x52, 0x67, - 0x41, 0x5c, 0x0a, - 0x09, 0x78, 0x38, 0x77, 0x50, 0x68, 0x6d, 0x77, 0x59, 0x41, 0x50, 0x54, 0x48, 0x78, 0x75, 0x43, 0x63, 0x79, - 0x7a, 0x71, 0x64, 0x2f, 0x44, 0x48, 0x36, 0x31, 0x6b, 0x70, 0x79, 0x37, 0x31, 0x55, 0x5a, 0x6b, 0x33, 0x55, - 0x37, 0x43, 0x63, 0x54, 0x2b, 0x55, 0x43, 0x74, 0x48, 0x4b, 0x30, 0x58, 0x55, 0x71, 0x53, 0x2b, 0x6f, 0x72, - 0x37, 0x62, 0x79, 0x6d, 0x79, 0x4b, 0x2f, 0x64, 0x70, 0x4c, 0x49, 0x4f, 0x37, 0x76, 0x48, 0x62, 0x68, 0x4c, - 0x5a, 0x5c, 0x0a, - 0x09, 0x42, 0x73, 0x6a, 0x37, 0x30, 0x30, 0x35, 0x68, 0x70, 0x61, 0x74, 0x52, 0x5a, 0x68, 0x5a, 0x65, 0x4d, - 0x61, 0x50, 0x6e, 0x42, 0x69, 0x6d, 0x63, 0x52, 0x64, 0x58, 0x6c, 0x44, 0x69, 0x62, 0x36, 0x61, 0x70, 0x67, - 0x53, 0x52, 0x53, 0x63, 0x30, 0x36, 0x70, 0x68, 0x70, 0x73, 0x73, 0x6f, 0x32, 0x65, 0x4e, 0x39, 0x4a, 0x4e, - 0x71, 0x68, 0x42, 0x6b, 0x6a, 0x6d, 0x38, 0x75, 0x45, 0x2b, 0x76, 0x6f, 0x7a, 0x62, 0x62, 0x4e, 0x32, 0x44, - 0x61, 0x5c, 0x0a, - 0x09, 0x6a, 0x62, 0x72, 0x6c, 0x71, 0x6d, 0x32, 0x4d, 0x6a, 0x35, 0x6e, 0x72, 0x6c, 0x73, 0x74, 0x66, 0x67, - 0x49, 0x4c, 0x4f, 0x38, 0x4a, 0x69, 0x38, 0x52, 0x4d, 0x5a, 0x43, 0x4f, 0x45, 0x42, 0x68, 0x70, 0x2b, 0x6f, - 0x78, 0x51, 0x42, 0x73, 0x47, 0x41, 0x4c, 0x74, 0x33, 0x37, 0x63, 0x54, 0x30, 0x74, 0x6d, 0x31, 0x6e, 0x44, - 0x67, 0x61, 0x44, 0x6e, 0x6a, 0x59, 0x49, 0x37, 0x55, 0x6a, 0x56, 0x67, 0x56, 0x51, 0x42, 0x51, 0x32, 0x68, - 0x53, 0x5c, 0x0a, - 0x09, 0x2f, 0x31, 0x44, 0x4e, 0x42, 0x2f, 0x6e, 0x39, 0x32, 0x61, 0x67, 0x58, 0x53, 0x68, 0x58, 0x4b, 0x69, - 0x65, 0x38, 0x37, 0x30, 0x44, 0x77, 0x30, 0x52, 0x52, 0x65, 0x65, 0x65, 0x51, 0x41, 0x53, 0x77, 0x45, 0x51, - 0x35, 0x48, 0x68, 0x46, 0x56, 0x57, 0x34, 0x6e, 0x6a, 0x4b, 0x47, 0x42, 0x67, 0x46, 0x78, 0x41, 0x7a, 0x47, - 0x61, 0x54, 0x70, 0x4b, 0x75, 0x65, 0x4a, 0x5a, 0x7a, 0x4c, 0x57, 0x37, 0x63, 0x41, 0x49, 0x72, 0x6b, 0x5a, - 0x62, 0x5c, 0x0a, - 0x09, 0x47, 0x6f, 0x77, 0x30, 0x38, 0x65, 0x75, 0x57, 0x63, 0x77, 0x59, 0x2b, 0x39, 0x51, 0x4a, 0x64, 0x79, - 0x47, 0x62, 0x30, 0x75, 0x6f, 0x31, 0x31, 0x53, 0x7a, 0x63, 0x36, 0x75, 0x41, 0x59, 0x4d, 0x7a, 0x6a, 0x73, - 0x48, 0x4d, 0x53, 0x34, 0x72, 0x67, 0x72, 0x41, 0x5a, 0x49, 0x52, 0x73, 0x6c, 0x5a, 0x33, 0x45, 0x6e, 0x78, - 0x4c, 0x67, 0x74, 0x47, 0x63, 0x64, 0x70, 0x36, 0x45, 0x72, 0x76, 0x4d, 0x62, 0x48, 0x34, 0x34, 0x33, 0x71, - 0x6f, 0x5c, 0x0a, - 0x09, 0x32, 0x6e, 0x6a, 0x4d, 0x2b, 0x4d, 0x53, 0x45, 0x4b, 0x64, 0x66, 0x31, 0x70, 0x67, 0x30, 0x44, 0x67, - 0x4f, 0x50, 0x33, 0x37, 0x4d, 0x48, 0x6a, 0x4c, 0x33, 0x6a, 0x73, 0x43, 0x34, 0x4b, 0x44, 0x38, 0x73, 0x69, - 0x67, 0x68, 0x5a, 0x32, 0x67, 0x71, 0x6a, 0x50, 0x53, 0x78, 0x48, 0x68, 0x5a, 0x70, 0x5a, 0x30, 0x6b, 0x32, - 0x30, 0x6d, 0x69, 0x6d, 0x72, 0x38, 0x6f, 0x32, 0x32, 0x6c, 0x77, 0x43, 0x6c, 0x48, 0x4e, 0x4d, 0x48, 0x41, - 0x4f, 0x5c, 0x0a, - 0x09, 0x4c, 0x71, 0x48, 0x50, 0x30, 0x46, 0x36, 0x6f, 0x45, 0x78, 0x79, 0x41, 0x70, 0x36, 0x38, 0x36, 0x6b, - 0x77, 0x68, 0x31, 0x4e, 0x53, 0x44, 0x71, 0x4c, 0x43, 0x6e, 0x32, 0x79, 0x65, 0x65, 0x6c, 0x6b, 0x49, 0x62, - 0x4c, 0x78, 0x79, 0x53, 0x75, 0x51, 0x78, 0x70, 0x6e, 0x7a, 0x46, 0x67, 0x61, 0x35, 0x72, 0x38, 0x42, 0x52, - 0x4d, 0x58, 0x30, 0x78, 0x69, 0x6d, 0x6a, 0x48, 0x78, 0x58, 0x6c, 0x77, 0x58, 0x52, 0x4a, 0x64, 0x63, 0x51, - 0x55, 0x5c, 0x0a, - 0x09, 0x49, 0x4b, 0x4c, 0x6c, 0x59, 0x30, 0x52, 0x6c, 0x44, 0x57, 0x68, 0x61, 0x6a, 0x70, 0x46, 0x6e, 0x4a, - 0x2b, 0x58, 0x43, 0x65, 0x59, 0x33, 0x39, 0x45, 0x64, 0x4d, 0x70, 0x43, 0x78, 0x43, 0x68, 0x72, 0x4a, 0x55, - 0x74, 0x68, 0x54, 0x46, 0x70, 0x6e, 0x71, 0x4c, 0x4f, 0x4e, 0x4f, 0x41, 0x59, 0x2b, 0x48, 0x7a, 0x79, 0x33, - 0x6c, 0x4f, 0x66, 0x74, 0x48, 0x33, 0x48, 0x39, 0x76, 0x54, 0x43, 0x42, 0x74, 0x43, 0x47, 0x41, 0x63, 0x44, - 0x6b, 0x5c, 0x0a, - 0x09, 0x35, 0x41, 0x54, 0x4b, 0x30, 0x6a, 0x32, 0x4e, 0x70, 0x37, 0x61, 0x42, 0x74, 0x44, 0x4b, 0x6a, 0x34, - 0x54, 0x50, 0x48, 0x35, 0x32, 0x6d, 0x67, 0x46, 0x72, 0x70, 0x49, 0x44, 0x53, 0x73, 0x6e, 0x53, 0x56, 0x4a, - 0x78, 0x35, 0x63, 0x79, 0x36, 0x48, 0x2b, 0x46, 0x41, 0x54, 0x72, 0x59, 0x44, 0x79, 0x4f, 0x76, 0x43, 0x55, - 0x4e, 0x53, 0x55, 0x77, 0x42, 0x64, 0x4e, 0x39, 0x37, 0x43, 0x48, 0x65, 0x68, 0x62, 0x70, 0x31, 0x44, 0x67, - 0x59, 0x5c, 0x0a, - 0x09, 0x65, 0x58, 0x4c, 0x64, 0x53, 0x4d, 0x6d, 0x74, 0x7a, 0x49, 0x48, 0x4c, 0x69, 0x6e, 0x39, 0x76, 0x79, - 0x6d, 0x51, 0x53, 0x67, 0x41, 0x79, 0x38, 0x73, 0x6b, 0x7a, 0x4b, 0x57, 0x71, 0x77, 0x4d, 0x50, 0x46, 0x6c, - 0x5a, 0x56, 0x58, 0x51, 0x4f, 0x35, 0x78, 0x4a, 0x48, 0x45, 0x64, 0x47, 0x2b, 0x47, 0x72, 0x65, 0x51, 0x6e, - 0x5a, 0x37, 0x4b, 0x75, 0x56, 0x51, 0x58, 0x69, 0x61, 0x4f, 0x53, 0x4d, 0x55, 0x36, 0x6e, 0x78, 0x68, 0x68, - 0x41, 0x5c, 0x0a, - 0x09, 0x67, 0x6b, 0x38, 0x56, 0x48, 0x45, 0x52, 0x67, 0x34, 0x58, 0x62, 0x44, 0x36, 0x79, 0x53, 0x41, 0x77, - 0x36, 0x35, 0x72, 0x47, 0x65, 0x70, 0x73, 0x63, 0x38, 0x2f, 0x75, 0x33, 0x5a, 0x64, 0x73, 0x32, 0x62, 0x6f, - 0x31, 0x6b, 0x66, 0x46, 0x47, 0x30, 0x49, 0x59, 0x42, 0x77, 0x41, 0x4d, 0x50, 0x48, 0x73, 0x53, 0x39, 0x39, - 0x39, 0x33, 0x2f, 0x4d, 0x43, 0x73, 0x56, 0x42, 0x6c, 0x43, 0x6e, 0x37, 0x67, 0x68, 0x66, 0x70, 0x62, 0x46, - 0x77, 0x5c, 0x0a, - 0x09, 0x6c, 0x41, 0x37, 0x31, 0x64, 0x45, 0x53, 0x4c, 0x37, 0x55, 0x42, 0x47, 0x61, 0x2b, 0x36, 0x45, 0x58, - 0x4f, 0x47, 0x52, 0x42, 0x37, 0x34, 0x77, 0x78, 0x51, 0x77, 0x6b, 0x39, 0x73, 0x4d, 0x57, 0x7a, 0x54, 0x52, - 0x2f, 0x4e, 0x66, 0x74, 0x70, 0x52, 0x4e, 0x66, 0x54, 0x43, 0x6d, 0x73, 0x4f, 0x79, 0x69, 0x6e, 0x4a, 0x51, - 0x46, 0x43, 0x50, 0x57, 0x59, 0x39, 0x50, 0x72, 0x4e, 0x34, 0x7a, 0x2b, 0x56, 0x67, 0x72, 0x31, 0x4c, 0x78, - 0x2f, 0x5c, 0x0a, - 0x09, 0x6b, 0x58, 0x32, 0x6f, 0x73, 0x66, 0x4c, 0x32, 0x6d, 0x79, 0x6a, 0x4b, 0x4d, 0x67, 0x79, 0x66, 0x70, - 0x38, 0x54, 0x73, 0x72, 0x67, 0x44, 0x62, 0x44, 0x4a, 0x4f, 0x41, 0x31, 0x4b, 0x6a, 0x73, 0x4c, 0x2b, 0x48, - 0x62, 0x41, 0x6a, 0x2f, 0x6d, 0x32, 0x4b, 0x49, 0x65, 0x47, 0x32, 0x76, 0x67, 0x49, 0x2f, 0x52, 0x76, 0x38, - 0x52, 0x4c, 0x36, 0x53, 0x71, 0x61, 0x58, 0x50, 0x4e, 0x4e, 0x73, 0x34, 0x44, 0x4f, 0x5a, 0x45, 0x6f, 0x7a, - 0x49, 0x5c, 0x0a, - 0x09, 0x61, 0x67, 0x38, 0x66, 0x50, 0x6e, 0x4c, 0x6d, 0x31, 0x4d, 0x51, 0x34, 0x33, 0x76, 0x66, 0x37, 0x76, - 0x7a, 0x4e, 0x43, 0x73, 0x75, 0x74, 0x44, 0x47, 0x77, 0x49, 0x41, 0x2b, 0x2f, 0x66, 0x74, 0x77, 0x39, 0x61, - 0x78, 0x4c, 0x72, 0x35, 0x7a, 0x30, 0x38, 0x33, 0x48, 0x63, 0x61, 0x51, 0x56, 0x45, 0x64, 0x52, 0x4b, 0x38, - 0x56, 0x6d, 0x61, 0x5a, 0x74, 0x32, 0x43, 0x53, 0x64, 0x4a, 0x37, 0x6c, 0x52, 0x35, 0x7a, 0x35, 0x2b, 0x4e, - 0x52, 0x5c, 0x0a, - 0x09, 0x4e, 0x54, 0x71, 0x44, 0x45, 0x51, 0x47, 0x74, 0x61, 0x41, 0x68, 0x41, 0x5a, 0x42, 0x68, 0x4a, 0x4a, - 0x48, 0x42, 0x79, 0x47, 0x69, 0x4c, 0x4b, 0x4f, 0x64, 0x6b, 0x47, 0x54, 0x33, 0x48, 0x6a, 0x2b, 0x46, 0x56, - 0x47, 0x4a, 0x4d, 0x62, 0x4f, 0x32, 0x68, 0x64, 0x33, 0x51, 0x58, 0x6a, 0x4b, 0x54, 0x61, 0x69, 0x64, 0x55, - 0x6f, 0x68, 0x50, 0x4f, 0x70, 0x61, 0x49, 0x75, 0x4e, 0x62, 0x65, 0x41, 0x35, 0x31, 0x47, 0x68, 0x37, 0x6f, - 0x71, 0x5c, 0x0a, - 0x09, 0x79, 0x6e, 0x46, 0x77, 0x35, 0x65, 0x30, 0x4b, 0x48, 0x61, 0x6b, 0x70, 0x53, 0x42, 0x4b, 0x78, 0x6e, - 0x65, 0x4a, 0x42, 0x70, 0x66, 0x58, 0x43, 0x41, 0x63, 0x4d, 0x66, 0x5a, 0x42, 0x43, 0x6f, 0x32, 0x62, 0x5a, - 0x33, 0x57, 0x6f, 0x72, 0x70, 0x68, 0x61, 0x4c, 0x59, 0x4e, 0x38, 0x73, 0x4b, 0x64, 0x4a, 0x74, 0x4e, 0x78, - 0x39, 0x77, 0x47, 0x64, 0x53, 0x44, 0x67, 0x55, 0x35, 0x52, 0x41, 0x33, 0x37, 0x6e, 0x78, 0x78, 0x69, 0x31, - 0x50, 0x5c, 0x0a, - 0x09, 0x66, 0x66, 0x78, 0x6a, 0x74, 0x77, 0x2b, 0x47, 0x77, 0x34, 0x53, 0x50, 0x39, 0x61, 0x59, 0x4e, 0x65, - 0x78, 0x72, 0x77, 0x63, 0x31, 0x2f, 0x2b, 0x61, 0x76, 0x36, 0x33, 0x66, 0x2f, 0x69, 0x37, 0x4e, 0x2f, 0x55, - 0x36, 0x2b, 0x63, 0x50, 0x6d, 0x6c, 0x67, 0x5a, 0x77, 0x5a, 0x58, 0x41, 0x65, 0x59, 0x48, 0x5a, 0x78, 0x4b, - 0x5a, 0x59, 0x62, 0x44, 0x6b, 0x76, 0x4d, 0x4c, 0x79, 0x32, 0x68, 0x72, 0x4b, 0x34, 0x76, 0x46, 0x30, 0x4d, - 0x4d, 0x5c, 0x0a, - 0x09, 0x68, 0x6b, 0x56, 0x30, 0x75, 0x63, 0x48, 0x53, 0x4d, 0x67, 0x5a, 0x46, 0x43, 0x61, 0x72, 0x4f, 0x7a, - 0x43, 0x38, 0x73, 0x6f, 0x71, 0x79, 0x55, 0x57, 0x4a, 0x59, 0x6c, 0x35, 0x6c, 0x6c, 0x62, 0x79, 0x38, 0x74, - 0x44, 0x4c, 0x43, 0x37, 0x56, 0x33, 0x35, 0x65, 0x57, 0x68, 0x78, 0x67, 0x4d, 0x42, 0x74, 0x47, 0x41, 0x35, - 0x75, 0x62, 0x6e, 0x55, 0x52, 0x59, 0x46, 0x6e, 0x41, 0x4f, 0x49, 0x67, 0x45, 0x4d, 0x7a, 0x73, 0x77, 0x67, - 0x67, 0x5c, 0x0a, - 0x09, 0x50, 0x69, 0x79, 0x47, 0x4f, 0x48, 0x7a, 0x34, 0x63, 0x4b, 0x79, 0x37, 0x75, 0x4c, 0x43, 0x41, 0x75, - 0x62, 0x6b, 0x35, 0x4d, 0x61, 0x61, 0x59, 0x68, 0x61, 0x69, 0x35, 0x64, 0x48, 0x52, 0x38, 0x35, 0x70, 0x67, - 0x6d, 0x4d, 0x4c, 0x6d, 0x36, 0x72, 0x72, 0x55, 0x49, 0x47, 0x52, 0x32, 0x47, 0x4f, 0x7a, 0x75, 0x59, 0x6f, - 0x36, 0x6e, 0x73, 0x77, 0x4a, 0x70, 0x61, 0x4a, 0x53, 0x44, 0x41, 0x48, 0x4a, 0x53, 0x44, 0x56, 0x68, 0x49, - 0x74, 0x5c, 0x0a, - 0x09, 0x51, 0x33, 0x76, 0x4b, 0x6d, 0x5a, 0x74, 0x41, 0x51, 0x77, 0x41, 0x67, 0x79, 0x51, 0x7a, 0x4e, 0x6b, - 0x70, 0x6b, 0x41, 0x4f, 0x44, 0x59, 0x4f, 0x77, 0x5a, 0x2b, 0x65, 0x63, 0x71, 0x68, 0x73, 0x52, 0x54, 0x68, - 0x77, 0x77, 0x39, 0x68, 0x45, 0x39, 0x79, 0x34, 0x64, 0x6b, 0x78, 0x36, 0x7a, 0x6d, 0x4a, 0x71, 0x77, 0x65, - 0x6a, 0x47, 0x72, 0x41, 0x4e, 0x57, 0x50, 0x62, 0x37, 0x4f, 0x78, 0x43, 0x4f, 0x42, 0x6a, 0x33, 0x34, 0x6b, - 0x49, 0x5c, 0x0a, - 0x09, 0x77, 0x2b, 0x56, 0x6c, 0x7a, 0x43, 0x30, 0x75, 0x50, 0x64, 0x63, 0x35, 0x39, 0x33, 0x35, 0x73, 0x4d, - 0x47, 0x30, 0x59, 0x41, 0x4c, 0x7a, 0x6e, 0x39, 0x5a, 0x63, 0x57, 0x6a, 0x7a, 0x70, 0x74, 0x54, 0x38, 0x38, - 0x37, 0x42, 0x67, 0x39, 0x58, 0x4b, 0x6d, 0x77, 0x46, 0x62, 0x2f, 0x52, 0x66, 0x36, 0x6d, 0x76, 0x52, 0x43, - 0x49, 0x69, 0x56, 0x55, 0x64, 0x66, 0x6a, 0x74, 0x58, 0x42, 0x4a, 0x61, 0x54, 0x2f, 0x59, 0x62, 0x71, 0x4a, - 0x67, 0x5c, 0x0a, - 0x09, 0x48, 0x58, 0x31, 0x4a, 0x39, 0x73, 0x66, 0x72, 0x56, 0x39, 0x64, 0x6d, 0x6c, 0x35, 0x59, 0x78, 0x4c, - 0x46, 0x7a, 0x73, 0x64, 0x33, 0x5a, 0x68, 0x43, 0x61, 0x56, 0x7a, 0x49, 0x41, 0x4a, 0x4b, 0x42, 0x38, 0x77, - 0x74, 0x44, 0x6d, 0x4a, 0x7a, 0x79, 0x38, 0x4d, 0x53, 0x53, 0x38, 0x76, 0x4c, 0x6b, 0x64, 0x76, 0x42, 0x73, - 0x4d, 0x44, 0x53, 0x63, 0x68, 0x30, 0x4e, 0x35, 0x68, 0x61, 0x57, 0x55, 0x4a, 0x52, 0x6c, 0x2f, 0x44, 0x36, - 0x37, 0x5c, 0x0a, - 0x09, 0x34, 0x4e, 0x2f, 0x33, 0x34, 0x65, 0x44, 0x67, 0x53, 0x6f, 0x66, 0x35, 0x78, 0x53, 0x55, 0x51, 0x43, - 0x43, 0x57, 0x41, 0x34, 0x58, 0x43, 0x49, 0x70, 0x63, 0x46, 0x79, 0x4c, 0x4c, 0x75, 0x30, 0x50, 0x4d, 0x42, - 0x77, 0x57, 0x45, 0x59, 0x6e, 0x6d, 0x56, 0x39, 0x59, 0x51, 0x75, 0x6d, 0x4b, 0x79, 0x4f, 0x37, 0x63, 0x2f, - 0x45, 0x4a, 0x31, 0x6a, 0x56, 0x41, 0x55, 0x51, 0x79, 0x77, 0x73, 0x4c, 0x43, 0x49, 0x49, 0x59, 0x6d, 0x6d, - 0x77, 0x5c, 0x0a, - 0x09, 0x6a, 0x49, 0x58, 0x46, 0x4a, 0x53, 0x38, 0x75, 0x42, 0x38, 0x7a, 0x4e, 0x7a, 0x57, 0x4b, 0x77, 0x58, - 0x50, 0x4e, 0x39, 0x38, 0x4d, 0x47, 0x44, 0x63, 0x45, 0x56, 0x52, 0x4f, 0x77, 0x63, 0x48, 0x70, 0x67, 0x42, - 0x61, 0x37, 0x42, 0x56, 0x5a, 0x77, 0x68, 0x6b, 0x55, 0x79, 0x49, 0x56, 0x6a, 0x72, 0x6e, 0x4a, 0x72, 0x44, - 0x55, 0x4e, 0x48, 0x65, 0x50, 0x35, 0x64, 0x5a, 0x41, 0x6a, 0x47, 0x71, 0x6a, 0x32, 0x72, 0x56, 0x4b, 0x66, - 0x37, 0x5c, 0x0a, - 0x09, 0x55, 0x65, 0x65, 0x79, 0x54, 0x75, 0x67, 0x76, 0x38, 0x42, 0x55, 0x65, 0x43, 0x37, 0x65, 0x6d, 0x6d, - 0x4c, 0x77, 0x74, 0x76, 0x65, 0x61, 0x51, 0x54, 0x41, 0x63, 0x55, 0x6e, 0x32, 0x48, 0x4d, 0x52, 0x2b, 0x59, - 0x57, 0x6e, 0x6c, 0x61, 0x57, 0x35, 0x65, 0x59, 0x45, 0x67, 0x42, 0x74, 0x76, 0x76, 0x68, 0x6e, 0x6c, 0x74, - 0x5a, 0x39, 0x45, 0x72, 0x66, 0x32, 0x51, 0x39, 0x73, 0x6e, 0x30, 0x71, 0x58, 0x5a, 0x45, 0x46, 0x6a, 0x36, - 0x31, 0x5c, 0x0a, - 0x09, 0x49, 0x33, 0x4b, 0x41, 0x55, 0x4e, 0x67, 0x68, 0x79, 0x73, 0x58, 0x7a, 0x7a, 0x48, 0x45, 0x70, 0x57, - 0x41, 0x59, 0x48, 0x45, 0x46, 0x55, 0x50, 0x71, 0x6a, 0x2f, 0x42, 0x4a, 0x38, 0x58, 0x50, 0x4c, 0x58, 0x33, - 0x32, 0x49, 0x37, 0x42, 0x45, 0x32, 0x44, 0x62, 0x5a, 0x5a, 0x30, 0x79, 0x77, 0x44, 0x49, 0x43, 0x42, 0x52, - 0x74, 0x49, 0x75, 0x35, 0x30, 0x32, 0x54, 0x41, 0x44, 0x53, 0x53, 0x34, 0x30, 0x37, 0x6b, 0x45, 0x43, 0x4a, - 0x61, 0x5c, 0x0a, - 0x09, 0x51, 0x33, 0x6b, 0x68, 0x5a, 0x36, 0x4f, 0x74, 0x4f, 0x47, 0x37, 0x64, 0x66, 0x71, 0x79, 0x45, 0x34, - 0x62, 0x44, 0x41, 0x37, 0x47, 0x49, 0x4e, 0x50, 0x4d, 0x50, 0x53, 0x59, 0x58, 0x35, 0x70, 0x55, 0x48, 0x58, - 0x6c, 0x4d, 0x42, 0x67, 0x36, 0x78, 0x42, 0x54, 0x58, 0x4f, 0x63, 0x77, 0x50, 0x43, 0x78, 0x54, 0x44, 0x49, - 0x72, 0x5a, 0x34, 0x5a, 0x4b, 0x48, 0x4f, 0x78, 0x41, 0x72, 0x6e, 0x63, 0x47, 0x52, 0x75, 0x41, 0x56, 0x6e, - 0x46, 0x5c, 0x0a, - 0x09, 0x77, 0x32, 0x42, 0x59, 0x59, 0x48, 0x46, 0x70, 0x43, 0x5a, 0x52, 0x6c, 0x63, 0x48, 0x42, 0x59, 0x57, - 0x68, 0x78, 0x67, 0x75, 0x58, 0x53, 0x67, 0x79, 0x73, 0x46, 0x6d, 0x46, 0x78, 0x61, 0x72, 0x5a, 0x6e, 0x33, - 0x36, 0x50, 0x56, 0x64, 0x39, 0x4a, 0x79, 0x49, 0x4d, 0x79, 0x78, 0x49, 0x4c, 0x38, 0x77, 0x74, 0x52, 0x74, - 0x6f, 0x50, 0x42, 0x41, 0x45, 0x75, 0x44, 0x49, 0x59, 0x49, 0x65, 0x46, 0x78, 0x65, 0x57, 0x4d, 0x43, 0x79, - 0x57, 0x5c, 0x0a, - 0x09, 0x34, 0x35, 0x41, 0x50, 0x48, 0x35, 0x36, 0x4e, 0x57, 0x69, 0x2f, 0x4c, 0x45, 0x6f, 0x64, 0x6d, 0x44, - 0x6b, 0x57, 0x2b, 0x6c, 0x68, 0x61, 0x58, 0x4d, 0x44, 0x63, 0x37, 0x6d, 0x32, 0x52, 0x67, 0x31, 0x6e, 0x71, - 0x41, 0x58, 0x67, 0x67, 0x4d, 0x41, 0x43, 0x4c, 0x71, 0x6b, 0x6f, 0x74, 0x54, 0x6b, 0x41, 0x64, 0x6d, 0x5a, - 0x73, 0x37, 0x64, 0x64, 0x38, 0x49, 0x65, 0x62, 0x44, 0x52, 0x74, 0x37, 0x41, 0x74, 0x42, 0x6f, 0x6f, 0x4d, - 0x72, 0x5c, 0x0a, - 0x09, 0x4a, 0x77, 0x33, 0x61, 0x30, 0x63, 0x36, 0x42, 0x63, 0x4b, 0x34, 0x43, 0x44, 0x65, 0x35, 0x4d, 0x78, - 0x4f, 0x71, 0x48, 0x6c, 0x4c, 0x4c, 0x4a, 0x53, 0x65, 0x4b, 0x70, 0x32, 0x6f, 0x46, 0x54, 0x50, 0x6d, 0x53, - 0x30, 0x53, 0x48, 0x68, 0x75, 0x41, 0x67, 0x54, 0x6e, 0x6d, 0x72, 0x4d, 0x54, 0x6e, 0x6c, 0x68, 0x77, 0x45, - 0x42, 0x44, 0x6a, 0x55, 0x33, 0x30, 0x78, 0x6b, 0x4c, 0x45, 0x64, 0x31, 0x53, 0x41, 0x75, 0x45, 0x33, 0x34, - 0x75, 0x5c, 0x0a, - 0x09, 0x36, 0x64, 0x73, 0x59, 0x72, 0x35, 0x41, 0x46, 0x42, 0x38, 0x6a, 0x36, 0x4b, 0x77, 0x42, 0x30, 0x38, - 0x67, 0x7a, 0x62, 0x74, 0x6f, 0x7a, 0x4a, 0x38, 0x57, 0x38, 0x64, 0x47, 0x79, 0x32, 0x58, 0x55, 0x61, 0x43, - 0x55, 0x6b, 0x4f, 0x6f, 0x62, 0x51, 0x4d, 0x4b, 0x4c, 0x47, 0x49, 0x73, 0x78, 0x7a, 0x67, 0x51, 0x55, 0x6d, - 0x77, 0x45, 0x74, 0x37, 0x56, 0x36, 0x42, 0x4a, 0x49, 0x44, 0x35, 0x78, 0x57, 0x55, 0x4d, 0x68, 0x76, 0x55, - 0x62, 0x5c, 0x0a, - 0x09, 0x76, 0x57, 0x61, 0x58, 0x42, 0x69, 0x68, 0x4c, 0x46, 0x35, 0x73, 0x39, 0x73, 0x6a, 0x43, 0x49, 0x2f, - 0x52, 0x52, 0x6c, 0x69, 0x59, 0x55, 0x6c, 0x6c, 0x75, 0x55, 0x56, 0x70, 0x63, 0x6a, 0x55, 0x43, 0x44, 0x51, - 0x33, 0x58, 0x4b, 0x35, 0x42, 0x63, 0x4b, 0x4e, 0x6f, 0x59, 0x77, 0x46, 0x41, 0x4f, 0x33, 0x77, 0x38, 0x62, - 0x36, 0x54, 0x6b, 0x4f, 0x72, 0x6f, 0x35, 0x64, 0x69, 0x30, 0x30, 0x35, 0x69, 0x70, 0x67, 0x69, 0x44, 0x62, - 0x63, 0x5c, 0x0a, - 0x09, 0x45, 0x47, 0x6d, 0x62, 0x70, 0x68, 0x56, 0x31, 0x41, 0x58, 0x2b, 0x4f, 0x70, 0x62, 0x4f, 0x4e, 0x66, - 0x41, 0x53, 0x6e, 0x64, 0x66, 0x77, 0x36, 0x64, 0x36, 0x36, 0x6d, 0x63, 0x52, 0x6e, 0x47, 0x6d, 0x66, 0x43, - 0x6c, 0x2b, 0x75, 0x56, 0x6c, 0x74, 0x49, 0x79, 0x73, 0x38, 0x51, 0x6e, 0x6e, 0x45, 0x53, 0x6d, 0x49, 0x71, - 0x6b, 0x38, 0x31, 0x50, 0x31, 0x61, 0x6d, 0x45, 0x61, 0x73, 0x62, 0x63, 0x75, 0x4b, 0x4f, 0x71, 0x49, 0x6b, - 0x44, 0x5c, 0x0a, - 0x09, 0x59, 0x67, 0x52, 0x42, 0x42, 0x73, 0x36, 0x69, 0x4b, 0x65, 0x33, 0x6f, 0x58, 0x41, 0x61, 0x42, 0x48, - 0x79, 0x55, 0x66, 0x44, 0x58, 0x44, 0x4f, 0x70, 0x58, 0x71, 0x78, 0x35, 0x41, 0x4e, 0x57, 0x52, 0x76, 0x52, - 0x50, 0x71, 0x61, 0x78, 0x5a, 0x6d, 0x59, 0x6d, 0x78, 0x44, 0x69, 0x5a, 0x51, 0x5a, 0x33, 0x6f, 0x52, 0x41, - 0x48, 0x6e, 0x39, 0x5a, 0x45, 0x79, 0x47, 0x58, 0x50, 0x7a, 0x59, 0x70, 0x2b, 0x2b, 0x64, 0x6d, 0x55, 0x75, - 0x76, 0x5c, 0x0a, - 0x09, 0x72, 0x54, 0x4e, 0x74, 0x2f, 0x4e, 0x4f, 0x41, 0x7a, 0x6a, 0x72, 0x68, 0x36, 0x67, 0x73, 0x6d, 0x4f, - 0x4b, 0x6a, 0x76, 0x50, 0x45, 0x72, 0x47, 0x36, 0x38, 0x79, 0x6f, 0x2b, 0x58, 0x58, 0x74, 0x65, 0x4e, 0x6f, - 0x49, 0x49, 0x6b, 0x2f, 0x42, 0x75, 0x42, 0x73, 0x69, 0x42, 0x4f, 0x64, 0x44, 0x4f, 0x49, 0x65, 0x4b, 0x39, - 0x4e, 0x48, 0x6f, 0x64, 0x63, 0x51, 0x33, 0x49, 0x6a, 0x4c, 0x6e, 0x53, 0x7a, 0x75, 0x63, 0x35, 0x54, 0x44, - 0x4a, 0x5c, 0x0a, - 0x09, 0x64, 0x33, 0x56, 0x4f, 0x31, 0x46, 0x65, 0x66, 0x73, 0x52, 0x2b, 0x64, 0x68, 0x57, 0x6c, 0x67, 0x67, - 0x58, 0x49, 0x49, 0x73, 0x50, 0x47, 0x6f, 0x66, 0x70, 0x7a, 0x53, 0x47, 0x79, 0x44, 0x6c, 0x7a, 0x38, 0x48, - 0x53, 0x36, 0x6b, 0x75, 0x6d, 0x63, 0x59, 0x62, 0x75, 0x36, 0x4f, 0x68, 0x34, 0x31, 0x74, 0x6b, 0x4c, 0x58, - 0x43, 0x72, 0x37, 0x41, 0x4e, 0x68, 0x78, 0x50, 0x4b, 0x78, 0x50, 0x70, 0x38, 0x76, 0x7a, 0x65, 0x73, 0x36, - 0x57, 0x5c, 0x0a, - 0x09, 0x4e, 0x52, 0x38, 0x7a, 0x31, 0x37, 0x6c, 0x46, 0x50, 0x67, 0x76, 0x64, 0x76, 0x6e, 0x74, 0x36, 0x30, - 0x72, 0x36, 0x2b, 0x6a, 0x72, 0x51, 0x68, 0x41, 0x46, 0x42, 0x65, 0x39, 0x79, 0x6c, 0x2f, 0x34, 0x4c, 0x41, - 0x72, 0x47, 0x6c, 0x69, 0x6b, 0x59, 0x46, 0x68, 0x4d, 0x75, 0x55, 0x6d, 0x71, 0x48, 0x42, 0x77, 0x62, 0x78, - 0x6a, 0x57, 0x4c, 0x48, 0x46, 0x50, 0x63, 0x69, 0x45, 0x78, 0x44, 0x6e, 0x47, 0x38, 0x77, 0x65, 0x74, 0x45, - 0x73, 0x5c, 0x0a, - 0x09, 0x7a, 0x79, 0x37, 0x59, 0x39, 0x63, 0x43, 0x58, 0x63, 0x4f, 0x51, 0x52, 0x42, 0x74, 0x48, 0x49, 0x41, - 0x2b, 0x38, 0x44, 0x6f, 0x39, 0x76, 0x51, 0x77, 0x46, 0x68, 0x66, 0x73, 0x48, 0x6b, 0x4d, 0x55, 0x56, 0x44, - 0x49, 0x6b, 0x48, 0x32, 0x4f, 0x54, 0x4d, 0x31, 0x5a, 0x30, 0x30, 0x6b, 0x78, 0x72, 0x53, 0x39, 0x49, 0x47, - 0x65, 0x72, 0x49, 0x48, 0x4d, 0x34, 0x6e, 0x71, 0x62, 0x7a, 0x69, 0x79, 0x30, 0x72, 0x7a, 0x4c, 0x64, 0x33, - 0x48, 0x5c, 0x0a, - 0x09, 0x61, 0x36, 0x78, 0x73, 0x62, 0x4d, 0x59, 0x70, 0x6e, 0x59, 0x6d, 0x43, 0x61, 0x54, 0x75, 0x36, 0x6a, - 0x41, 0x42, 0x70, 0x33, 0x54, 0x2f, 0x59, 0x47, 0x42, 0x72, 0x73, 0x68, 0x48, 0x39, 0x33, 0x4f, 0x43, 0x62, - 0x32, 0x41, 0x6d, 0x39, 0x63, 0x42, 0x6b, 0x41, 0x30, 0x44, 0x61, 0x49, 0x4a, 0x30, 0x32, 0x69, 0x31, 0x59, - 0x2f, 0x50, 0x30, 0x6b, 0x59, 0x4f, 0x44, 0x6b, 0x48, 0x58, 0x34, 0x6f, 0x6f, 0x77, 0x4e, 0x67, 0x4f, 0x30, - 0x59, 0x5c, 0x0a, - 0x09, 0x52, 0x6b, 0x6a, 0x55, 0x45, 0x56, 0x64, 0x48, 0x68, 0x74, 0x69, 0x75, 0x63, 0x53, 0x36, 0x65, 0x5a, - 0x75, 0x41, 0x52, 0x77, 0x43, 0x33, 0x77, 0x49, 0x69, 0x49, 0x4c, 0x34, 0x35, 0x4d, 0x37, 0x67, 0x4a, 0x34, - 0x47, 0x69, 0x44, 0x6e, 0x35, 0x55, 0x59, 0x41, 0x58, 0x35, 0x7a, 0x6c, 0x78, 0x49, 0x41, 0x57, 0x30, 0x6e, - 0x46, 0x63, 0x6f, 0x65, 0x65, 0x6b, 0x6f, 0x79, 0x79, 0x6b, 0x42, 0x62, 0x41, 0x4e, 0x34, 0x7a, 0x54, 0x48, - 0x55, 0x5c, 0x0a, - 0x09, 0x70, 0x2b, 0x6f, 0x2b, 0x57, 0x56, 0x6e, 0x64, 0x4c, 0x6e, 0x63, 0x32, 0x72, 0x51, 0x64, 0x72, 0x47, - 0x68, 0x54, 0x62, 0x56, 0x33, 0x32, 0x47, 0x73, 0x6b, 0x45, 0x6e, 0x6b, 0x74, 0x48, 0x6d, 0x66, 0x76, 0x6b, - 0x35, 0x33, 0x62, 0x62, 0x51, 0x72, 0x52, 0x35, 0x44, 0x51, 0x79, 0x43, 0x53, 0x41, 0x4c, 0x63, 0x46, 0x59, - 0x4d, 0x46, 0x77, 0x67, 0x32, 0x69, 0x44, 0x41, 0x4d, 0x41, 0x42, 0x77, 0x44, 0x34, 0x5a, 0x47, 0x56, 0x53, - 0x55, 0x5c, 0x0a, - 0x09, 0x74, 0x70, 0x51, 0x67, 0x55, 0x6c, 0x47, 0x65, 0x68, 0x6d, 0x6f, 0x48, 0x68, 0x42, 0x31, 0x52, 0x64, - 0x48, 0x74, 0x4e, 0x55, 0x34, 0x42, 0x51, 0x33, 0x34, 0x71, 0x71, 0x31, 0x68, 0x77, 0x39, 0x47, 0x70, 0x5a, - 0x79, 0x61, 0x6a, 0x46, 0x6b, 0x70, 0x77, 0x78, 0x51, 0x47, 0x58, 0x49, 0x79, 0x39, 0x32, 0x52, 0x64, 0x4a, - 0x46, 0x6b, 0x51, 0x30, 0x75, 0x2f, 0x6d, 0x32, 0x42, 0x53, 0x66, 0x76, 0x47, 0x37, 0x53, 0x48, 0x6d, 0x74, - 0x54, 0x5c, 0x0a, - 0x09, 0x67, 0x34, 0x67, 0x77, 0x63, 0x70, 0x4a, 0x31, 0x4c, 0x48, 0x36, 0x53, 0x39, 0x51, 0x57, 0x6a, 0x6e, - 0x42, 0x55, 0x70, 0x56, 0x79, 0x4b, 0x52, 0x7a, 0x75, 0x74, 0x78, 0x4b, 0x54, 0x6c, 0x71, 0x33, 0x69, 0x30, - 0x51, 0x31, 0x4b, 0x44, 0x4f, 0x78, 0x78, 0x41, 0x7a, 0x4f, 0x42, 0x58, 0x39, 0x64, 0x5a, 0x51, 0x33, 0x70, - 0x32, 0x6b, 0x4b, 0x61, 0x44, 0x52, 0x66, 0x39, 0x65, 0x65, 0x57, 0x6f, 0x78, 0x2f, 0x38, 0x32, 0x74, 0x41, - 0x47, 0x5c, 0x0a, - 0x09, 0x4c, 0x67, 0x4b, 0x36, 0x30, 0x36, 0x76, 0x50, 0x46, 0x61, 0x4b, 0x46, 0x53, 0x34, 0x57, 0x63, 0x52, - 0x47, 0x4e, 0x4b, 0x73, 0x77, 0x62, 0x64, 0x68, 0x6a, 0x79, 0x42, 0x6b, 0x5a, 0x45, 0x74, 0x53, 0x66, 0x63, - 0x5a, 0x77, 0x46, 0x44, 0x31, 0x58, 0x39, 0x4b, 0x45, 0x6b, 0x53, 0x48, 0x77, 0x4d, 0x57, 0x6c, 0x6a, 0x6a, - 0x45, 0x59, 0x52, 0x32, 0x41, 0x6c, 0x5a, 0x44, 0x6c, 0x49, 0x5a, 0x61, 0x4e, 0x34, 0x41, 0x32, 0x2f, 0x41, - 0x69, 0x5c, 0x0a, - 0x09, 0x61, 0x4c, 0x6d, 0x61, 0x54, 0x38, 0x32, 0x54, 0x6c, 0x70, 0x2b, 0x4f, 0x6c, 0x4d, 0x6e, 0x69, 0x4a, - 0x43, 0x54, 0x49, 0x6a, 0x73, 0x71, 0x45, 0x4c, 0x48, 0x36, 0x45, 0x34, 0x54, 0x4f, 0x65, 0x52, 0x70, 0x49, - 0x6c, 0x42, 0x30, 0x73, 0x2b, 0x42, 0x6f, 0x43, 0x62, 0x59, 0x31, 0x50, 0x38, 0x38, 0x4c, 0x46, 0x79, 0x2f, - 0x71, 0x33, 0x79, 0x31, 0x68, 0x68, 0x58, 0x6b, 0x68, 0x2f, 0x50, 0x31, 0x71, 0x7a, 0x2b, 0x36, 0x75, 0x75, - 0x39, 0x5c, 0x0a, - 0x09, 0x78, 0x6d, 0x78, 0x68, 0x6e, 0x57, 0x68, 0x6a, 0x4d, 0x67, 0x41, 0x48, 0x41, 0x48, 0x53, 0x36, 0x76, - 0x62, 0x41, 0x54, 0x79, 0x68, 0x69, 0x43, 0x73, 0x2b, 0x62, 0x68, 0x56, 0x6e, 0x53, 0x4d, 0x4b, 0x52, 0x6f, - 0x67, 0x6c, 0x47, 0x6d, 0x68, 0x74, 0x35, 0x6d, 0x2b, 0x68, 0x6e, 0x6f, 0x47, 0x6f, 0x6f, 0x76, 0x69, 0x54, - 0x56, 0x47, 0x65, 0x32, 0x47, 0x55, 0x56, 0x33, 0x66, 0x6e, 0x31, 0x6b, 0x4d, 0x48, 0x6f, 0x72, 0x45, 0x41, - 0x62, 0x5c, 0x0a, - 0x09, 0x72, 0x4a, 0x6d, 0x5a, 0x71, 0x4d, 0x69, 0x73, 0x78, 0x38, 0x4a, 0x5a, 0x30, 0x2f, 0x4e, 0x2b, 0x6e, - 0x6b, 0x47, 0x6c, 0x68, 0x5a, 0x56, 0x4d, 0x57, 0x43, 0x5a, 0x6b, 0x79, 0x54, 0x36, 0x4d, 0x75, 0x30, 0x6b, - 0x47, 0x41, 0x71, 0x68, 0x59, 0x57, 0x52, 0x48, 0x4e, 0x46, 0x57, 0x6d, 0x67, 0x45, 0x57, 0x6b, 0x2f, 0x36, - 0x38, 0x64, 0x63, 0x77, 0x41, 0x30, 0x79, 0x30, 0x65, 0x56, 0x34, 0x47, 0x2b, 0x46, 0x69, 0x4f, 0x4f, 0x39, - 0x73, 0x5c, 0x0a, - 0x09, 0x32, 0x54, 0x56, 0x6c, 0x42, 0x6e, 0x72, 0x38, 0x34, 0x54, 0x77, 0x76, 0x7a, 0x36, 0x64, 0x7a, 0x77, - 0x5a, 0x36, 0x43, 0x50, 0x64, 0x52, 0x5a, 0x7a, 0x4e, 0x51, 0x47, 0x2b, 0x2f, 0x38, 0x47, 0x72, 0x67, 0x47, - 0x34, 0x4b, 0x67, 0x50, 0x51, 0x63, 0x79, 0x70, 0x5a, 0x70, 0x6a, 0x70, 0x6f, 0x53, 0x4c, 0x64, 0x34, 0x78, - 0x4c, 0x49, 0x51, 0x50, 0x79, 0x34, 0x6f, 0x38, 0x6e, 0x50, 0x36, 0x32, 0x43, 0x49, 0x79, 0x6c, 0x47, 0x58, - 0x31, 0x5c, 0x0a, - 0x09, 0x7a, 0x66, 0x6f, 0x7a, 0x35, 0x35, 0x32, 0x73, 0x72, 0x4a, 0x56, 0x65, 0x78, 0x71, 0x48, 0x70, 0x79, - 0x4b, 0x54, 0x4b, 0x63, 0x79, 0x42, 0x4c, 0x30, 0x6b, 0x78, 0x74, 0x6b, 0x44, 0x78, 0x4b, 0x47, 0x76, 0x31, - 0x59, 0x36, 0x79, 0x4a, 0x6d, 0x5a, 0x46, 0x65, 0x5a, 0x69, 0x77, 0x57, 0x79, 0x76, 0x46, 0x79, 0x55, 0x43, - 0x32, 0x74, 0x44, 0x4f, 0x30, 0x51, 0x43, 0x44, 0x41, 0x5a, 0x77, 0x38, 0x62, 0x61, 0x35, 0x6a, 0x71, 0x55, - 0x77, 0x5c, 0x0a, - 0x09, 0x5a, 0x42, 0x6b, 0x7a, 0x4b, 0x32, 0x4a, 0x74, 0x72, 0x5a, 0x67, 0x5a, 0x47, 0x74, 0x48, 0x61, 0x79, - 0x73, 0x4b, 0x53, 0x39, 0x6c, 0x52, 0x67, 0x69, 0x67, 0x6b, 0x41, 0x41, 0x2f, 0x70, 0x67, 0x4f, 0x31, 0x77, - 0x6e, 0x39, 0x52, 0x72, 0x57, 0x75, 0x4e, 0x33, 0x4a, 0x2b, 0x74, 0x46, 0x47, 0x37, 0x67, 0x4d, 0x34, 0x45, - 0x59, 0x42, 0x43, 0x34, 0x34, 0x71, 0x73, 0x46, 0x46, 0x4a, 0x2f, 0x4d, 0x6d, 0x45, 0x75, 0x4c, 0x51, 0x39, - 0x78, 0x5c, 0x0a, - 0x09, 0x33, 0x2b, 0x46, 0x35, 0x50, 0x48, 0x42, 0x6b, 0x48, 0x6f, 0x64, 0x6d, 0x46, 0x33, 0x48, 0x6f, 0x79, - 0x42, 0x7a, 0x6d, 0x6c, 0x35, 0x61, 0x77, 0x74, 0x44, 0x7a, 0x45, 0x77, 0x75, 0x49, 0x41, 0x73, 0x77, 0x75, - 0x4c, 0x47, 0x41, 0x79, 0x47, 0x47, 0x41, 0x79, 0x58, 0x77, 0x66, 0x66, 0x6f, 0x4c, 0x79, 0x77, 0x75, 0x6f, - 0x53, 0x6a, 0x38, 0x78, 0x6f, 0x34, 0x38, 0x7a, 0x7a, 0x45, 0x2b, 0x78, 0x6e, 0x66, 0x76, 0x41, 0x55, 0x53, - 0x45, 0x5c, 0x0a, - 0x09, 0x79, 0x66, 0x45, 0x78, 0x67, 0x49, 0x41, 0x38, 0x79, 0x7a, 0x44, 0x65, 0x37, 0x77, 0x45, 0x41, 0x2b, - 0x74, 0x30, 0x75, 0x4f, 0x74, 0x30, 0x63, 0x6e, 0x62, 0x79, 0x44, 0x69, 0x56, 0x34, 0x58, 0x52, 0x49, 0x53, - 0x74, 0x45, 0x2f, 0x36, 0x65, 0x38, 0x48, 0x69, 0x2f, 0x69, 0x30, 0x36, 0x57, 0x6f, 0x64, 0x66, 0x74, 0x6f, - 0x4e, 0x66, 0x4a, 0x30, 0x65, 0x39, 0x32, 0x30, 0x4f, 0x74, 0x6b, 0x47, 0x4f, 0x2f, 0x31, 0x30, 0x4d, 0x6e, - 0x39, 0x5c, 0x0a, - 0x09, 0x6a, 0x73, 0x46, 0x4f, 0x7a, 0x6e, 0x48, 0x58, 0x41, 0x44, 0x32, 0x52, 0x79, 0x6a, 0x4f, 0x6a, 0x34, - 0x58, 0x4e, 0x7a, 0x71, 0x36, 0x34, 0x34, 0x48, 0x51, 0x7a, 0x4e, 0x32, 0x57, 0x56, 0x6a, 0x57, 0x7a, 0x78, - 0x6a, 0x63, 0x63, 0x70, 0x6f, 0x6c, 0x52, 0x35, 0x30, 0x50, 0x5a, 0x4d, 0x48, 0x42, 0x6e, 0x79, 0x31, 0x49, - 0x41, 0x30, 0x6d, 0x58, 0x66, 0x31, 0x42, 0x68, 0x50, 0x6d, 0x6c, 0x5a, 0x51, 0x79, 0x57, 0x43, 0x79, 0x77, - 0x4d, 0x5c, 0x0a, - 0x09, 0x68, 0x6c, 0x67, 0x75, 0x43, 0x73, 0x77, 0x76, 0x44, 0x56, 0x41, 0x36, 0x59, 0x48, 0x62, 0x52, 0x62, - 0x36, 0x36, 0x5a, 0x57, 0x31, 0x78, 0x43, 0x36, 0x59, 0x41, 0x6a, 0x38, 0x34, 0x74, 0x77, 0x7a, 0x75, 0x46, - 0x49, 0x74, 0x61, 0x56, 0x35, 0x66, 0x6e, 0x45, 0x51, 0x74, 0x30, 0x51, 0x50, 0x6c, 0x6f, 0x64, 0x77, 0x7a, - 0x6d, 0x46, 0x68, 0x30, 0x57, 0x2f, 0x44, 0x39, 0x75, 0x7a, 0x36, 0x54, 0x2f, 0x2b, 0x4d, 0x69, 0x41, 0x65, - 0x4c, 0x5c, 0x0a, - 0x09, 0x4c, 0x4d, 0x73, 0x78, 0x4d, 0x64, 0x36, 0x76, 0x57, 0x50, 0x50, 0x62, 0x6d, 0x4d, 0x66, 0x37, 0x50, - 0x66, 0x52, 0x36, 0x58, 0x59, 0x7a, 0x31, 0x2b, 0x39, 0x67, 0x79, 0x33, 0x6b, 0x65, 0x2f, 0x32, 0x38, 0x56, - 0x34, 0x76, 0x34, 0x74, 0x74, 0x57, 0x79, 0x61, 0x77, 0x66, 0x63, 0x73, 0x45, 0x64, 0x6d, 0x77, 0x64, 0x78, - 0x2b, 0x37, 0x70, 0x53, 0x66, 0x54, 0x79, 0x54, 0x4e, 0x71, 0x73, 0x6d, 0x48, 0x59, 0x41, 0x69, 0x5a, 0x50, - 0x48, 0x5c, 0x0a, - 0x09, 0x6f, 0x6b, 0x70, 0x2f, 0x76, 0x73, 0x35, 0x55, 0x49, 0x7a, 0x69, 0x74, 0x45, 0x32, 0x30, 0x6b, 0x41, - 0x42, 0x78, 0x76, 0x6e, 0x68, 0x57, 0x6f, 0x37, 0x35, 0x53, 0x64, 0x4f, 0x63, 0x7a, 0x4d, 0x4c, 0x2b, 0x45, - 0x72, 0x4e, 0x39, 0x79, 0x42, 0x61, 0x32, 0x36, 0x38, 0x46, 0x54, 0x66, 0x63, 0x65, 0x67, 0x64, 0x75, 0x76, - 0x4f, 0x6c, 0x57, 0x33, 0x48, 0x54, 0x54, 0x54, 0x52, 0x67, 0x4f, 0x6c, 0x36, 0x4e, 0x4e, 0x4a, 0x58, 0x76, - 0x4e, 0x5c, 0x0a, - 0x09, 0x41, 0x61, 0x55, 0x54, 0x75, 0x61, 0x56, 0x54, 0x50, 0x48, 0x52, 0x53, 0x39, 0x52, 0x57, 0x33, 0x63, - 0x61, 0x72, 0x67, 0x6e, 0x7a, 0x77, 0x41, 0x34, 0x79, 0x6f, 0x6a, 0x71, 0x73, 0x37, 0x78, 0x65, 0x76, 0x70, - 0x68, 0x6e, 0x48, 0x42, 0x74, 0x79, 0x35, 0x61, 0x74, 0x6d, 0x4e, 0x34, 0x32, 0x6a, 0x61, 0x6d, 0x74, 0x57, - 0x37, 0x46, 0x39, 0x32, 0x7a, 0x53, 0x6d, 0x70, 0x37, 0x5a, 0x69, 0x65, 0x75, 0x73, 0x55, 0x64, 0x6b, 0x78, - 0x76, 0x5c, 0x0a, - 0x09, 0x77, 0x61, 0x37, 0x74, 0x57, 0x37, 0x48, 0x6e, 0x75, 0x4f, 0x30, 0x34, 0x59, 0x66, 0x73, 0x57, 0x37, - 0x4e, 0x32, 0x35, 0x48, 0x56, 0x73, 0x6e, 0x75, 0x6b, 0x67, 0x4d, 0x7a, 0x5a, 0x77, 0x6a, 0x73, 0x33, 0x4d, - 0x38, 0x36, 0x6f, 0x2b, 0x63, 0x72, 0x34, 0x34, 0x67, 0x37, 0x65, 0x6a, 0x4a, 0x66, 0x4e, 0x77, 0x67, 0x55, - 0x59, 0x52, 0x77, 0x78, 0x77, 0x4e, 0x48, 0x63, 0x4f, 0x65, 0x44, 0x4d, 0x37, 0x6a, 0x72, 0x67, 0x52, 0x6e, - 0x63, 0x5c, 0x0a, - 0x09, 0x65, 0x2b, 0x67, 0x49, 0x37, 0x6a, 0x73, 0x34, 0x67, 0x35, 0x6b, 0x6a, 0x63, 0x35, 0x69, 0x5a, 0x6e, - 0x63, 0x57, 0x68, 0x51, 0x7a, 0x4f, 0x59, 0x6d, 0x54, 0x6d, 0x43, 0x67, 0x34, 0x63, 0x4f, 0x59, 0x75, 0x62, - 0x67, 0x51, 0x51, 0x79, 0x48, 0x42, 0x66, 0x51, 0x65, 0x66, 0x76, 0x36, 0x77, 0x6b, 0x33, 0x34, 0x71, 0x30, - 0x48, 0x6f, 0x49, 0x43, 0x57, 0x52, 0x38, 0x52, 0x74, 0x5a, 0x59, 0x75, 0x35, 0x44, 0x62, 0x64, 0x4a, 0x4d, - 0x45, 0x5c, 0x0a, - 0x09, 0x6f, 0x36, 0x71, 0x72, 0x37, 0x61, 0x54, 0x62, 0x36, 0x32, 0x4c, 0x66, 0x76, 0x74, 0x4e, 0x77, 0x2b, - 0x72, 0x35, 0x54, 0x63, 0x57, 0x44, 0x76, 0x53, 0x54, 0x68, 0x6e, 0x2f, 0x36, 0x6e, 0x34, 0x6e, 0x67, 0x4d, - 0x6e, 0x59, 0x57, 0x71, 0x38, 0x70, 0x79, 0x49, 0x2b, 0x55, 0x47, 0x38, 0x7a, 0x44, 0x32, 0x30, 0x36, 0x32, - 0x59, 0x48, 0x58, 0x31, 0x59, 0x34, 0x56, 0x39, 0x62, 0x44, 0x47, 0x74, 0x48, 0x45, 0x41, 0x51, 0x42, 0x59, - 0x41, 0x5c, 0x0a, - 0x09, 0x63, 0x43, 0x4f, 0x56, 0x47, 0x63, 0x46, 0x31, 0x74, 0x39, 0x2b, 0x50, 0x39, 0x2f, 0x33, 0x64, 0x5a, - 0x66, 0x6a, 0x6e, 0x54, 0x31, 0x77, 0x57, 0x6e, 0x54, 0x31, 0x35, 0x53, 0x6b, 0x73, 0x72, 0x54, 0x54, 0x6c, - 0x38, 0x31, 0x4c, 0x65, 0x31, 0x54, 0x39, 0x75, 0x6c, 0x44, 0x35, 0x30, 0x41, 0x7a, 0x50, 0x69, 0x55, 0x51, - 0x66, 0x45, 0x2b, 0x4f, 0x59, 0x43, 0x45, 0x2f, 0x64, 0x36, 0x38, 0x37, 0x33, 0x6f, 0x59, 0x33, 0x71, 0x6e, - 0x6d, 0x5c, 0x0a, - 0x09, 0x5a, 0x6d, 0x63, 0x78, 0x65, 0x2b, 0x51, 0x49, 0x37, 0x6f, 0x68, 0x42, 0x50, 0x6a, 0x58, 0x71, 0x77, - 0x4e, 0x2f, 0x70, 0x70, 0x2b, 0x2f, 0x48, 0x67, 0x66, 0x32, 0x6e, 0x34, 0x65, 0x47, 0x6e, 0x6e, 0x59, 0x4c, - 0x7a, 0x48, 0x37, 0x59, 0x58, 0x35, 0x35, 0x35, 0x32, 0x41, 0x71, 0x59, 0x6d, 0x2b, 0x6e, 0x57, 0x55, 0x6a, - 0x30, 0x42, 0x51, 0x6a, 0x37, 0x64, 0x78, 0x37, 0x55, 0x41, 0x66, 0x43, 0x37, 0x44, 0x6c, 0x57, 0x5a, 0x55, - 0x71, 0x5c, 0x0a, - 0x09, 0x4c, 0x31, 0x4a, 0x6a, 0x4e, 0x66, 0x37, 0x71, 0x32, 0x71, 0x33, 0x33, 0x48, 0x38, 0x48, 0x58, 0x62, - 0x72, 0x67, 0x56, 0x58, 0x37, 0x2f, 0x78, 0x46, 0x74, 0x78, 0x77, 0x30, 0x32, 0x32, 0x34, 0x37, 0x68, 0x76, - 0x66, 0x77, 0x71, 0x47, 0x44, 0x42, 0x31, 0x4d, 0x64, 0x4d, 0x54, 0x6c, 0x77, 0x6b, 0x4c, 0x51, 0x65, 0x44, - 0x39, 0x62, 0x36, 0x35, 0x49, 0x39, 0x55, 0x57, 0x77, 0x38, 0x49, 0x38, 0x59, 0x65, 0x50, 0x6b, 0x6f, 0x53, - 0x48, 0x5c, 0x0a, - 0x09, 0x4f, 0x54, 0x49, 0x48, 0x2b, 0x2f, 0x41, 0x41, 0x6b, 0x2b, 0x69, 0x48, 0x62, 0x48, 0x30, 0x50, 0x42, - 0x67, 0x4e, 0x63, 0x66, 0x2f, 0x32, 0x33, 0x38, 0x4f, 0x33, 0x72, 0x72, 0x38, 0x63, 0x2f, 0x56, 0x2b, 0x50, - 0x6f, 0x64, 0x4c, 0x76, 0x34, 0x34, 0x55, 0x74, 0x2b, 0x41, 0x44, 0x39, 0x39, 0x79, 0x66, 0x66, 0x68, 0x7a, - 0x4a, 0x4e, 0x33, 0x53, 0x64, 0x6e, 0x79, 0x44, 0x43, 0x34, 0x42, 0x55, 0x41, 0x63, 0x41, 0x4f, 0x7a, 0x59, - 0x36, 0x5c, 0x0a, - 0x09, 0x41, 0x36, 0x44, 0x47, 0x46, 0x31, 0x61, 0x75, 0x45, 0x66, 0x6d, 0x48, 0x67, 0x41, 0x41, 0x51, 0x4c, - 0x63, 0x4b, 0x35, 0x66, 0x69, 0x33, 0x6b, 0x5a, 0x69, 0x54, 0x38, 0x2f, 0x79, 0x37, 0x37, 0x43, 0x6e, 0x37, - 0x6e, 0x44, 0x39, 0x36, 0x54, 0x52, 0x41, 0x6e, 0x74, 0x6d, 0x4e, 0x70, 0x59, 0x77, 0x72, 0x6c, 0x59, 0x4e, - 0x70, 0x42, 0x43, 0x2f, 0x4d, 0x5a, 0x4d, 0x67, 0x46, 0x32, 0x33, 0x6a, 0x46, 0x61, 0x30, 0x70, 0x63, 0x70, - 0x70, 0x5c, 0x0a, - 0x09, 0x59, 0x2b, 0x5a, 0x41, 0x77, 0x68, 0x39, 0x42, 0x74, 0x51, 0x41, 0x69, 0x65, 0x53, 0x38, 0x41, 0x4d, - 0x2f, 0x67, 0x38, 0x7a, 0x33, 0x48, 0x52, 0x52, 0x52, 0x66, 0x69, 0x71, 0x52, 0x65, 0x63, 0x6a, 0x30, 0x73, - 0x65, 0x2b, 0x77, 0x68, 0x4d, 0x54, 0x2f, 0x53, 0x62, 0x48, 0x5a, 0x6f, 0x7a, 0x79, 0x4e, 0x4e, 0x54, 0x6e, - 0x6a, 0x33, 0x6f, 0x7a, 0x4b, 0x42, 0x70, 0x79, 0x6d, 0x58, 0x51, 0x74, 0x2b, 0x39, 0x36, 0x45, 0x42, 0x2f, - 0x35, 0x5c, 0x0a, - 0x09, 0x33, 0x4a, 0x58, 0x34, 0x78, 0x4b, 0x63, 0x2f, 0x6a, 0x78, 0x74, 0x76, 0x76, 0x4a, 0x47, 0x4a, 0x56, - 0x32, 0x56, 0x44, 0x69, 0x72, 0x53, 0x38, 0x77, 0x39, 0x67, 0x54, 0x49, 0x47, 0x7a, 0x49, 0x36, 0x4b, 0x78, - 0x48, 0x6a, 0x58, 0x6c, 0x37, 0x31, 0x6a, 0x73, 0x56, 0x45, 0x74, 0x32, 0x6f, 0x36, 0x5a, 0x53, 0x56, 0x46, - 0x57, 0x70, 0x64, 0x4e, 0x5a, 0x5a, 0x31, 0x44, 0x72, 0x31, 0x2b, 0x44, 0x37, 0x39, 0x35, 0x36, 0x53, 0x76, - 0x77, 0x5c, 0x0a, - 0x09, 0x6f, 0x30, 0x38, 0x36, 0x4e, 0x7a, 0x41, 0x39, 0x57, 0x72, 0x61, 0x65, 0x66, 0x67, 0x6e, 0x41, 0x4f, - 0x37, 0x4a, 0x48, 0x50, 0x73, 0x57, 0x55, 0x37, 0x33, 0x72, 0x51, 0x52, 0x67, 0x48, 0x41, 0x4e, 0x67, 0x41, - 0x48, 0x5a, 0x63, 0x71, 0x6b, 0x30, 0x6c, 0x73, 0x41, 0x49, 0x4f, 0x41, 0x76, 0x50, 0x2f, 0x6b, 0x31, 0x76, - 0x50, 0x34, 0x74, 0x62, 0x34, 0x2b, 0x58, 0x6b, 0x6f, 0x6a, 0x4d, 0x49, 0x67, 0x55, 0x79, 0x51, 0x69, 0x66, - 0x76, 0x5c, 0x0a, - 0x09, 0x56, 0x45, 0x33, 0x4a, 0x6c, 0x31, 0x51, 0x45, 0x63, 0x68, 0x55, 0x79, 0x2b, 0x34, 0x63, 0x34, 0x4b, - 0x67, 0x57, 0x79, 0x52, 0x32, 0x2b, 0x72, 0x51, 0x70, 0x42, 0x6e, 0x2f, 0x47, 0x4f, 0x34, 0x46, 0x72, 0x68, - 0x6f, 0x49, 0x77, 0x74, 0x39, 0x4e, 0x42, 0x6d, 0x4f, 0x61, 0x6c, 0x56, 0x63, 0x30, 0x38, 0x37, 0x53, 0x39, - 0x41, 0x78, 0x39, 0x4f, 0x4c, 0x64, 0x37, 0x7a, 0x78, 0x37, 0x38, 0x2b, 0x69, 0x2b, 0x38, 0x47, 0x4d, 0x39, - 0x34, 0x5c, 0x0a, - 0x09, 0x7a, 0x42, 0x6c, 0x4b, 0x6a, 0x6a, 0x70, 0x38, 0x73, 0x65, 0x38, 0x36, 0x74, 0x62, 0x65, 0x4d, 0x4e, - 0x44, 0x4a, 0x67, 0x4f, 0x2f, 0x37, 0x63, 0x77, 0x67, 0x43, 0x2f, 0x2f, 0x37, 0x63, 0x66, 0x78, 0x77, 0x63, - 0x2b, 0x2b, 0x43, 0x46, 0x37, 0x32, 0x73, 0x53, 0x36, 0x74, 0x62, 0x49, 0x71, 0x66, 0x56, 0x36, 0x54, 0x6b, - 0x42, 0x2b, 0x41, 0x4c, 0x4d, 0x38, 0x41, 0x45, 0x4d, 0x71, 0x79, 0x41, 0x47, 0x55, 0x5a, 0x71, 0x44, 0x72, - 0x6d, 0x5c, 0x0a, - 0x09, 0x4d, 0x74, 0x4c, 0x48, 0x38, 0x62, 0x76, 0x6d, 0x6a, 0x34, 0x47, 0x44, 0x2b, 0x56, 0x67, 0x7a, 0x64, - 0x33, 0x77, 0x56, 0x52, 0x50, 0x67, 0x34, 0x4c, 0x42, 0x44, 0x4a, 0x73, 0x68, 0x7a, 0x76, 0x65, 0x74, 0x4e, - 0x72, 0x38, 0x62, 0x54, 0x7a, 0x54, 0x76, 0x63, 0x64, 0x57, 0x6d, 0x73, 0x6f, 0x38, 0x76, 0x68, 0x31, 0x63, - 0x4f, 0x34, 0x4e, 0x6d, 0x77, 0x38, 0x41, 0x69, 0x4d, 0x34, 0x41, 0x33, 0x4c, 0x63, 0x61, 0x6a, 0x62, 0x4b, - 0x69, 0x5c, 0x0a, - 0x09, 0x47, 0x2b, 0x38, 0x2b, 0x69, 0x47, 0x65, 0x2f, 0x2f, 0x44, 0x56, 0x59, 0x57, 0x6c, 0x77, 0x53, 0x43, - 0x75, 0x74, 0x30, 0x75, 0x78, 0x67, 0x66, 0x48, 0x30, 0x65, 0x33, 0x33, 0x30, 0x65, 0x6e, 0x30, 0x30, 0x47, - 0x57, 0x35, 0x56, 0x55, 0x7a, 0x4a, 0x52, 0x77, 0x63, 0x79, 0x6d, 0x47, 0x4a, 0x30, 0x76, 0x6c, 0x6e, 0x34, - 0x6c, 0x33, 0x70, 0x55, 0x4a, 0x61, 0x46, 0x2f, 0x33, 0x51, 0x46, 0x55, 0x43, 0x6d, 0x75, 0x4c, 0x4d, 0x75, - 0x59, 0x5c, 0x0a, - 0x09, 0x70, 0x70, 0x57, 0x6c, 0x65, 0x71, 0x74, 0x4c, 0x57, 0x45, 0x43, 0x4b, 0x5a, 0x51, 0x41, 0x51, 0x6f, - 0x58, 0x43, 0x6c, 0x47, 0x62, 0x30, 0x41, 0x43, 0x49, 0x4d, 0x4d, 0x31, 0x35, 0x4e, 0x73, 0x41, 0x62, 0x61, - 0x54, 0x36, 0x41, 0x79, 0x47, 0x55, 0x31, 0x4e, 0x2f, 0x76, 0x4e, 0x77, 0x62, 0x66, 0x2b, 0x32, 0x58, 0x38, - 0x61, 0x4e, 0x50, 0x50, 0x43, 0x39, 0x31, 0x57, 0x4c, 0x46, 0x41, 0x78, 0x52, 0x32, 0x64, 0x5a, 0x77, 0x46, - 0x47, 0x5c, 0x0a, - 0x09, 0x52, 0x68, 0x41, 0x37, 0x54, 0x35, 0x31, 0x30, 0x66, 0x6e, 0x45, 0x5a, 0x72, 0x33, 0x7a, 0x6e, 0x58, - 0x2b, 0x4c, 0x79, 0x79, 0x7a, 0x2b, 0x64, 0x4f, 0x4a, 0x45, 0x46, 0x57, 0x48, 0x6d, 0x65, 0x49, 0x38, 0x74, - 0x7a, 0x35, 0x48, 0x6e, 0x4f, 0x6d, 0x69, 0x56, 0x51, 0x52, 0x70, 0x58, 0x63, 0x67, 0x70, 0x4e, 0x35, 0x2f, - 0x58, 0x6c, 0x48, 0x4c, 0x79, 0x74, 0x57, 0x58, 0x50, 0x72, 0x4a, 0x77, 0x4c, 0x71, 0x4d, 0x41, 0x67, 0x77, - 0x74, 0x5c, 0x0a, - 0x09, 0x31, 0x4a, 0x4a, 0x78, 0x5a, 0x53, 0x6e, 0x34, 0x61, 0x5a, 0x7a, 0x69, 0x57, 0x5a, 0x47, 0x2f, 0x61, - 0x74, 0x59, 0x4d, 0x49, 0x45, 0x5a, 0x57, 0x78, 0x34, 0x48, 0x6d, 0x78, 0x4a, 0x4e, 0x50, 0x77, 0x74, 0x2b, - 0x39, 0x39, 0x54, 0x65, 0x77, 0x77, 0x33, 0x70, 0x51, 0x69, 0x4e, 0x75, 0x35, 0x50, 0x2f, 0x64, 0x4f, 0x77, - 0x50, 0x31, 0x69, 0x64, 0x74, 0x62, 0x47, 0x41, 0x63, 0x44, 0x47, 0x72, 0x41, 0x45, 0x34, 0x74, 0x79, 0x4f, - 0x39, 0x5c, 0x0a, - 0x09, 0x50, 0x5a, 0x4f, 0x6d, 0x73, 0x65, 0x2f, 0x35, 0x75, 0x30, 0x39, 0x67, 0x6b, 0x54, 0x33, 0x72, 0x6a, - 0x59, 0x78, 0x77, 0x30, 0x6b, 0x6d, 0x6e, 0x59, 0x48, 0x4c, 0x72, 0x56, 0x70, 0x52, 0x6c, 0x69, 0x62, 0x49, - 0x6f, 0x55, 0x4a, 0x51, 0x6c, 0x69, 0x73, 0x49, 0x2f, 0x64, 0x31, 0x34, 0x55, 0x4a, 0x63, 0x70, 0x69, 0x36, - 0x43, 0x4e, 0x47, 0x41, 0x5a, 0x54, 0x6b, 0x54, 0x53, 0x52, 0x44, 0x6a, 0x68, 0x49, 0x46, 0x73, 0x6a, 0x4b, - 0x4c, 0x5c, 0x0a, - 0x09, 0x4c, 0x39, 0x71, 0x67, 0x4c, 0x41, 0x50, 0x4b, 0x45, 0x73, 0x34, 0x42, 0x57, 0x65, 0x61, 0x4e, 0x4c, - 0x68, 0x68, 0x67, 0x31, 0x46, 0x57, 0x57, 0x69, 0x65, 0x77, 0x67, 0x42, 0x38, 0x58, 0x4d, 0x67, 0x47, 0x4c, - 0x36, 0x55, 0x58, 0x32, 0x72, 0x79, 0x75, 0x72, 0x6e, 0x76, 0x2f, 0x55, 0x4c, 0x50, 0x75, 0x4f, 0x31, 0x59, - 0x48, 0x52, 0x55, 0x47, 0x35, 0x57, 0x31, 0x31, 0x6d, 0x43, 0x6d, 0x78, 0x70, 0x42, 0x74, 0x76, 0x66, 0x46, - 0x74, 0x5c, 0x0a, - 0x09, 0x37, 0x38, 0x56, 0x35, 0x70, 0x2f, 0x38, 0x33, 0x6e, 0x48, 0x6e, 0x79, 0x54, 0x75, 0x6e, 0x6f, 0x6f, - 0x78, 0x62, 0x39, 0x43, 0x45, 0x62, 0x32, 0x70, 0x63, 0x76, 0x70, 0x36, 0x51, 0x50, 0x77, 0x2f, 0x6f, 0x39, - 0x39, 0x41, 0x5a, 0x64, 0x66, 0x2f, 0x6d, 0x6b, 0x6d, 0x67, 0x37, 0x72, 0x6f, 0x32, 0x4d, 0x51, 0x34, 0x2b, - 0x6d, 0x4e, 0x39, 0x39, 0x48, 0x70, 0x6a, 0x79, 0x50, 0x49, 0x4d, 0x57, 0x64, 0x36, 0x42, 0x4b, 0x38, 0x73, - 0x49, 0x5c, 0x0a, - 0x09, 0x77, 0x4d, 0x34, 0x35, 0x46, 0x50, 0x47, 0x59, 0x41, 0x58, 0x52, 0x31, 0x6a, 0x4e, 0x4a, 0x56, 0x2b, - 0x73, 0x68, 0x51, 0x6c, 0x6d, 0x58, 0x4d, 0x41, 0x76, 0x67, 0x6e, 0x38, 0x68, 0x79, 0x75, 0x4b, 0x41, 0x41, - 0x69, 0x5a, 0x45, 0x61, 0x6d, 0x46, 0x72, 0x6a, 0x79, 0x2b, 0x6d, 0x43, 0x67, 0x70, 0x4e, 0x63, 0x4d, 0x46, - 0x46, 0x43, 0x48, 0x4d, 0x6e, 0x6f, 0x4b, 0x6d, 0x41, 0x42, 0x35, 0x41, 0x41, 0x59, 0x4f, 0x32, 0x6d, 0x78, - 0x36, 0x5c, 0x0a, - 0x09, 0x65, 0x4f, 0x63, 0x64, 0x64, 0x2b, 0x42, 0x2f, 0x2f, 0x65, 0x74, 0x58, 0x38, 0x64, 0x4a, 0x6e, 0x58, - 0x69, 0x67, 0x56, 0x79, 0x51, 0x55, 0x66, 0x32, 0x33, 0x63, 0x37, 0x6a, 0x51, 0x4c, 0x72, 0x53, 0x68, 0x75, - 0x31, 0x44, 0x32, 0x41, 0x48, 0x41, 0x4e, 0x53, 0x33, 0x75, 0x78, 0x68, 0x56, 0x33, 0x2b, 0x39, 0x36, 0x63, - 0x41, 0x37, 0x2f, 0x38, 0x49, 0x2f, 0x2f, 0x58, 0x4a, 0x33, 0x7a, 0x48, 0x79, 0x65, 0x64, 0x63, 0x69, 0x71, - 0x6d, 0x5c, 0x0a, - 0x09, 0x64, 0x2b, 0x78, 0x41, 0x6e, 0x75, 0x58, 0x49, 0x73, 0x67, 0x78, 0x5a, 0x37, 0x6a, 0x38, 0x37, 0x48, - 0x66, 0x2b, 0x49, 0x5a, 0x70, 0x35, 0x6e, 0x79, 0x4c, 0x49, 0x63, 0x52, 0x4f, 0x51, 0x4e, 0x45, 0x46, 0x6d, - 0x4d, 0x4e, 0x6c, 0x6d, 0x65, 0x67, 0x37, 0x49, 0x4d, 0x65, 0x62, 0x68, 0x4f, 0x42, 0x47, 0x52, 0x68, 0x2b, - 0x41, 0x35, 0x5a, 0x6c, 0x6f, 0x45, 0x6f, 0x51, 0x7a, 0x44, 0x36, 0x36, 0x45, 0x4d, 0x5a, 0x45, 0x31, 0x47, - 0x6f, 0x5c, 0x0a, - 0x09, 0x4a, 0x36, 0x4a, 0x4f, 0x7a, 0x58, 0x2b, 0x57, 0x5a, 0x66, 0x35, 0x53, 0x31, 0x4b, 0x2b, 0x2f, 0x48, - 0x46, 0x2b, 0x52, 0x35, 0x62, 0x78, 0x44, 0x36, 0x37, 0x66, 0x4a, 0x36, 0x42, 0x51, 0x7a, 0x4c, 0x49, 0x6a, - 0x35, 0x4c, 0x6f, 0x31, 0x55, 0x56, 0x43, 0x51, 0x51, 0x44, 0x6b, 0x75, 0x4c, 0x69, 0x2f, 0x6a, 0x6a, 0x6a, - 0x31, 0x7a, 0x4f, 0x5a, 0x4f, 0x56, 0x69, 0x64, 0x70, 0x4e, 0x57, 0x71, 0x4a, 0x67, 0x4b, 0x54, 0x69, 0x32, - 0x41, 0x5c, 0x0a, - 0x09, 0x57, 0x41, 0x4d, 0x4d, 0x41, 0x78, 0x4c, 0x6e, 0x63, 0x50, 0x2f, 0x68, 0x42, 0x62, 0x7a, 0x2f, 0x4c, - 0x2f, 0x39, 0x61, 0x39, 0x4e, 0x33, 0x72, 0x39, 0x33, 0x48, 0x69, 0x4b, 0x61, 0x66, 0x69, 0x59, 0x59, 0x38, - 0x34, 0x43, 0x36, 0x66, 0x73, 0x4f, 0x77, 0x33, 0x48, 0x37, 0x64, 0x71, 0x44, 0x4c, 0x56, 0x4e, 0x54, 0x36, - 0x49, 0x2b, 0x4e, 0x49, 0x38, 0x38, 0x7a, 0x35, 0x4a, 0x6e, 0x58, 0x43, 0x54, 0x49, 0x2f, 0x4a, 0x65, 0x74, - 0x6b, 0x5c, 0x0a, - 0x09, 0x4f, 0x53, 0x67, 0x6a, 0x45, 0x44, 0x48, 0x64, 0x78, 0x4f, 0x4d, 0x73, 0x79, 0x6a, 0x32, 0x72, 0x35, - 0x4d, 0x37, 0x66, 0x4c, 0x78, 0x69, 0x35, 0x79, 0x76, 0x4d, 0x49, 0x64, 0x42, 0x6c, 0x6c, 0x45, 0x54, 0x37, - 0x72, 0x4d, 0x58, 0x69, 0x4a, 0x42, 0x64, 0x31, 0x5a, 0x36, 0x30, 0x41, 0x4f, 0x48, 0x70, 0x41, 0x43, 0x43, - 0x46, 0x73, 0x4c, 0x79, 0x67, 0x6c, 0x34, 0x4f, 0x79, 0x54, 0x74, 0x78, 0x4f, 0x73, 0x42, 0x47, 0x42, 0x7a, - 0x77, 0x5c, 0x0a, - 0x09, 0x6a, 0x35, 0x2f, 0x36, 0x66, 0x47, 0x68, 0x41, 0x79, 0x5a, 0x32, 0x56, 0x39, 0x35, 0x6e, 0x41, 0x54, - 0x67, 0x50, 0x54, 0x31, 0x35, 0x55, 0x32, 0x42, 0x67, 0x43, 0x49, 0x74, 0x6b, 0x63, 0x44, 0x62, 0x5a, 0x69, - 0x44, 0x58, 0x6e, 0x62, 0x6c, 0x74, 0x7a, 0x43, 0x73, 0x49, 0x6a, 0x75, 0x42, 0x30, 0x4f, 0x76, 0x33, 0x73, - 0x57, 0x76, 0x6e, 0x62, 0x6e, 0x54, 0x79, 0x48, 0x4a, 0x52, 0x6e, 0x4e, 0x51, 0x68, 0x6b, 0x33, 0x6e, 0x6a, - 0x38, 0x5c, 0x0a, - 0x09, 0x33, 0x4c, 0x39, 0x79, 0x66, 0x41, 0x34, 0x43, 0x6c, 0x46, 0x55, 0x47, 0x52, 0x2f, 0x35, 0x38, 0x5a, - 0x58, 0x43, 0x41, 0x51, 0x30, 0x62, 0x6b, 0x6a, 0x61, 0x6e, 0x53, 0x59, 0x41, 0x30, 0x43, 0x58, 0x6b, 0x4d, - 0x4a, 0x43, 0x49, 0x54, 0x37, 0x79, 0x41, 0x77, 0x6f, 0x67, 0x73, 0x46, 0x56, 0x63, 0x63, 0x63, 0x44, 0x6a, - 0x54, 0x4c, 0x61, 0x75, 0x48, 0x71, 0x4e, 0x47, 0x67, 0x79, 0x73, 0x39, 0x38, 0x77, 0x6c, 0x61, 0x61, 0x64, - 0x4c, 0x5c, 0x0a, - 0x09, 0x6a, 0x54, 0x62, 0x55, 0x35, 0x57, 0x44, 0x67, 0x34, 0x50, 0x43, 0x52, 0x66, 0x2f, 0x77, 0x59, 0x37, - 0x70, 0x75, 0x5a, 0x6a, 0x37, 0x79, 0x4c, 0x56, 0x44, 0x4e, 0x59, 0x71, 0x4d, 0x34, 0x4f, 0x6e, 0x4a, 0x59, - 0x2f, 0x79, 0x38, 0x4a, 0x63, 0x74, 0x50, 0x61, 0x59, 0x75, 0x6e, 0x37, 0x30, 0x69, 0x71, 0x73, 0x78, 0x4e, - 0x7a, 0x65, 0x48, 0x38, 0x43, 0x61, 0x65, 0x54, 0x74, 0x37, 0x42, 0x67, 0x54, 0x4d, 0x66, 0x67, 0x65, 0x4e, - 0x32, 0x5c, 0x0a, - 0x09, 0x37, 0x6b, 0x53, 0x2f, 0x31, 0x30, 0x65, 0x65, 0x2b, 0x56, 0x54, 0x66, 0x79, 0x37, 0x72, 0x53, 0x54, - 0x51, 0x55, 0x43, 0x6e, 0x64, 0x79, 0x44, 0x41, 0x49, 0x67, 0x38, 0x43, 0x47, 0x63, 0x77, 0x51, 0x43, 0x43, - 0x72, 0x51, 0x4b, 0x44, 0x57, 0x42, 0x35, 0x65, 0x6a, 0x53, 0x46, 0x51, 0x43, 0x43, 0x44, 0x69, 0x48, 0x6e, - 0x4f, 0x6c, 0x4d, 0x67, 0x33, 0x4c, 0x51, 0x6e, 0x5a, 0x37, 0x71, 0x36, 0x6a, 0x73, 0x46, 0x31, 0x74, 0x75, - 0x54, 0x5c, 0x0a, - 0x09, 0x78, 0x52, 0x75, 0x4f, 0x34, 0x65, 0x71, 0x6d, 0x46, 0x51, 0x43, 0x48, 0x4f, 0x69, 0x47, 0x4c, 0x75, - 0x4f, 0x61, 0x61, 0x61, 0x33, 0x44, 0x48, 0x67, 0x30, 0x66, 0x53, 0x7a, 0x45, 0x6f, 0x41, 0x43, 0x51, 0x48, - 0x4f, 0x6e, 0x58, 0x44, 0x35, 0x6c, 0x36, 0x2f, 0x65, 0x30, 0x4a, 0x38, 0x4a, 0x57, 0x39, 0x63, 0x70, 0x77, - 0x49, 0x46, 0x39, 0x70, 0x2b, 0x48, 0x4e, 0x72, 0x33, 0x34, 0x5a, 0x6e, 0x76, 0x33, 0x6b, 0x78, 0x2b, 0x30, - 0x51, 0x5c, 0x0a, - 0x09, 0x74, 0x30, 0x65, 0x4d, 0x74, 0x50, 0x58, 0x72, 0x33, 0x37, 0x36, 0x35, 0x2b, 0x75, 0x70, 0x54, 0x72, - 0x4e, 0x30, 0x6e, 0x6e, 0x49, 0x42, 0x4f, 0x72, 0x34, 0x74, 0x69, 0x4f, 0x41, 0x53, 0x49, 0x4d, 0x4d, 0x51, - 0x51, 0x57, 0x53, 0x58, 0x77, 0x34, 0x58, 0x42, 0x59, 0x75, 0x36, 0x4e, 0x7a, 0x79, 0x44, 0x73, 0x35, 0x55, - 0x4a, 0x43, 0x66, 0x44, 0x6e, 0x51, 0x79, 0x59, 0x46, 0x68, 0x4e, 0x42, 0x7a, 0x49, 0x2b, 0x48, 0x63, 0x68, - 0x52, 0x5c, 0x0a, - 0x09, 0x75, 0x67, 0x49, 0x5a, 0x41, 0x53, 0x37, 0x50, 0x66, 0x66, 0x72, 0x75, 0x58, 0x45, 0x77, 0x2f, 0x77, - 0x33, 0x76, 0x7a, 0x71, 0x49, 0x6f, 0x45, 0x6c, 0x47, 0x55, 0x2b, 0x39, 0x61, 0x77, 0x6f, 0x69, 0x39, 0x4d, - 0x42, 0x50, 0x77, 0x37, 0x76, 0x6e, 0x4e, 0x55, 0x51, 0x73, 0x69, 0x79, 0x75, 0x43, 0x66, 0x67, 0x53, 0x46, - 0x52, 0x42, 0x51, 0x48, 0x66, 0x32, 0x54, 0x37, 0x44, 0x44, 0x36, 0x48, 0x67, 0x4d, 0x4b, 0x49, 0x2f, 0x72, - 0x72, 0x5c, 0x0a, - 0x09, 0x32, 0x31, 0x6e, 0x42, 0x38, 0x46, 0x78, 0x5a, 0x34, 0x76, 0x50, 0x58, 0x33, 0x59, 0x52, 0x6e, 0x58, - 0x58, 0x42, 0x57, 0x62, 0x43, 0x75, 0x38, 0x77, 0x65, 0x62, 0x49, 0x34, 0x6c, 0x49, 0x55, 0x38, 0x61, 0x41, - 0x6f, 0x6b, 0x52, 0x45, 0x68, 0x4a, 0x7a, 0x2b, 0x32, 0x54, 0x70, 0x5a, 0x6a, 0x76, 0x4e, 0x64, 0x42, 0x76, - 0x39, 0x76, 0x42, 0x65, 0x43, 0x39, 0x50, 0x73, 0x37, 0x49, 0x49, 0x46, 0x4d, 0x41, 0x58, 0x76, 0x2f, 0x35, - 0x4e, 0x5c, 0x0a, - 0x09, 0x6b, 0x66, 0x7a, 0x73, 0x4f, 0x66, 0x45, 0x6b, 0x6a, 0x49, 0x33, 0x31, 0x55, 0x51, 0x78, 0x4c, 0x4f, - 0x41, 0x41, 0x35, 0x61, 0x69, 0x63, 0x59, 0x73, 0x6a, 0x66, 0x65, 0x6c, 0x67, 0x43, 0x6f, 0x41, 0x50, 0x49, - 0x4d, 0x4b, 0x46, 0x45, 0x41, 0x4a, 0x5a, 0x42, 0x6e, 0x48, 0x52, 0x51, 0x6f, 0x67, 0x44, 0x4c, 0x7a, 0x4a, - 0x54, 0x49, 0x67, 0x4b, 0x77, 0x6b, 0x6c, 0x2f, 0x46, 0x54, 0x50, 0x46, 0x62, 0x36, 0x6a, 0x70, 0x75, 0x6b, - 0x41, 0x5c, 0x0a, - 0x09, 0x34, 0x45, 0x48, 0x41, 0x46, 0x59, 0x55, 0x48, 0x5a, 0x55, 0x42, 0x4e, 0x42, 0x77, 0x49, 0x35, 0x76, - 0x39, 0x35, 0x51, 0x51, 0x69, 0x7a, 0x61, 0x36, 0x62, 0x57, 0x4b, 0x78, 0x6b, 0x56, 0x4a, 0x6b, 0x6c, 0x4f, - 0x32, 0x65, 0x4d, 0x75, 0x52, 0x74, 0x53, 0x55, 0x57, 0x46, 0x36, 0x76, 0x7a, 0x6c, 0x33, 0x33, 0x31, 0x6d, - 0x2f, 0x69, 0x65, 0x68, 0x2b, 0x2b, 0x7a, 0x32, 0x2f, 0x51, 0x4d, 0x6f, 0x48, 0x44, 0x6c, 0x43, 0x54, 0x2f, - 0x2f, 0x5c, 0x0a, - 0x09, 0x2b, 0x72, 0x66, 0x32, 0x75, 0x74, 0x33, 0x75, 0x6f, 0x4c, 0x6e, 0x67, 0x32, 0x74, 0x4b, 0x36, 0x72, - 0x77, 0x47, 0x38, 0x2b, 0x73, 0x33, 0x76, 0x6e, 0x72, 0x35, 0x76, 0x6f, 0x62, 0x6a, 0x6f, 0x39, 0x42, 0x4e, - 0x33, 0x6a, 0x79, 0x78, 0x33, 0x31, 0x54, 0x58, 0x58, 0x69, 0x66, 0x6e, 0x56, 0x74, 0x75, 0x30, 0x37, 0x6b, - 0x47, 0x55, 0x5a, 0x58, 0x46, 0x68, 0x4d, 0x36, 0x6e, 0x51, 0x77, 0x4a, 0x4b, 0x41, 0x63, 0x46, 0x73, 0x6a, - 0x7a, 0x5c, 0x0a, - 0x09, 0x48, 0x41, 0x56, 0x38, 0x4f, 0x74, 0x4f, 0x68, 0x4c, 0x6f, 0x62, 0x44, 0x5a, 0x65, 0x52, 0x35, 0x42, - 0x72, 0x6a, 0x63, 0x72, 0x78, 0x77, 0x54, 0x49, 0x61, 0x64, 0x71, 0x2f, 0x70, 0x2f, 0x4a, 0x4e, 0x59, 0x48, - 0x77, 0x34, 0x6b, 0x35, 0x6b, 0x42, 0x46, 0x63, 0x43, 0x63, 0x4b, 0x55, 0x43, 0x41, 0x59, 0x5a, 0x52, 0x46, - 0x56, 0x41, 0x45, 0x79, 0x6f, 0x68, 0x51, 0x4f, 0x68, 0x66, 0x39, 0x75, 0x5a, 0x36, 0x42, 0x2b, 0x68, 0x58, - 0x68, 0x5c, 0x0a, - 0x09, 0x73, 0x69, 0x79, 0x6b, 0x6b, 0x54, 0x45, 0x67, 0x69, 0x50, 0x65, 0x31, 0x39, 0x5a, 0x30, 0x43, 0x59, - 0x76, 0x65, 0x37, 0x41, 0x5a, 0x45, 0x56, 0x57, 0x41, 0x74, 0x61, 0x2f, 0x4e, 0x7a, 0x62, 0x2f, 0x76, 0x53, - 0x44, 0x65, 0x50, 0x2b, 0x48, 0x74, 0x75, 0x43, 0x42, 0x42, 0x78, 0x37, 0x45, 0x6f, 0x55, 0x4d, 0x48, 0x73, - 0x54, 0x78, 0x59, 0x54, 0x75, 0x65, 0x37, 0x4d, 0x41, 0x79, 0x36, 0x75, 0x6a, 0x34, 0x32, 0x4d, 0x59, 0x62, - 0x74, 0x5c, 0x0a, - 0x09, 0x32, 0x33, 0x64, 0x67, 0x32, 0x39, 0x51, 0x30, 0x4a, 0x72, 0x64, 0x4f, 0x59, 0x75, 0x65, 0x32, 0x62, - 0x54, 0x68, 0x75, 0x2b, 0x7a, 0x53, 0x32, 0x54, 0x57, 0x33, 0x42, 0x72, 0x6d, 0x33, 0x54, 0x2b, 0x4f, 0x49, - 0x56, 0x58, 0x78, 0x61, 0x38, 0x37, 0x74, 0x69, 0x31, 0x45, 0x33, 0x6e, 0x65, 0x41, 0x64, 0x77, 0x51, 0x42, - 0x47, 0x41, 0x49, 0x6f, 0x45, 0x4d, 0x64, 0x46, 0x45, 0x57, 0x42, 0x54, 0x71, 0x63, 0x54, 0x51, 0x55, 0x41, - 0x37, 0x5c, 0x0a, - 0x09, 0x56, 0x77, 0x6e, 0x2f, 0x6b, 0x74, 0x49, 0x63, 0x75, 0x51, 0x4b, 0x42, 0x44, 0x46, 0x6c, 0x4a, 0x4b, - 0x46, 0x79, 0x42, 0x4c, 0x49, 0x4a, 0x79, 0x79, 0x55, 0x41, 0x67, 0x71, 0x38, 0x62, 0x4f, 0x4d, 0x75, 0x70, - 0x71, 0x4c, 0x59, 0x66, 0x72, 0x41, 0x78, 0x41, 0x35, 0x41, 0x44, 0x77, 0x49, 0x5a, 0x48, 0x41, 0x4d, 0x6c, - 0x4c, 0x6b, 0x38, 0x68, 0x42, 0x7a, 0x5a, 0x4a, 0x39, 0x65, 0x5a, 0x6c, 0x6e, 0x56, 0x6a, 0x39, 0x6c, 0x44, - 0x56, 0x5c, 0x0a, - 0x09, 0x65, 0x65, 0x50, 0x2f, 0x65, 0x4a, 0x65, 0x38, 0x48, 0x63, 0x6e, 0x57, 0x45, 0x56, 0x69, 0x62, 0x4f, - 0x79, 0x59, 0x6d, 0x4a, 0x30, 0x37, 0x61, 0x73, 0x32, 0x76, 0x6e, 0x54, 0x64, 0x67, 0x67, 0x32, 0x6f, 0x68, - 0x46, 0x77, 0x4e, 0x50, 0x65, 0x2f, 0x49, 0x37, 0x33, 0x2f, 0x69, 0x69, 0x41, 0x78, 0x41, 0x43, 0x74, 0x56, - 0x7a, 0x41, 0x48, 0x6f, 0x55, 0x31, 0x4f, 0x54, 0x73, 0x62, 0x55, 0x50, 0x73, 0x59, 0x57, 0x6c, 0x32, 0x50, - 0x59, 0x5c, 0x0a, - 0x09, 0x41, 0x57, 0x68, 0x49, 0x30, 0x51, 0x43, 0x70, 0x4c, 0x4e, 0x48, 0x70, 0x65, 0x42, 0x44, 0x49, 0x34, - 0x72, 0x62, 0x4e, 0x49, 0x63, 0x71, 0x69, 0x52, 0x45, 0x61, 0x5a, 0x57, 0x68, 0x67, 0x45, 0x73, 0x72, 0x4b, - 0x73, 0x51, 0x43, 0x42, 0x44, 0x6c, 0x6a, 0x6d, 0x55, 0x4d, 0x66, 0x49, 0x51, 0x79, 0x68, 0x41, 0x31, 0x57, - 0x43, 0x59, 0x67, 0x72, 0x4d, 0x2b, 0x35, 0x79, 0x75, 0x69, 0x41, 0x65, 0x68, 0x72, 0x67, 0x79, 0x7a, 0x76, - 0x34, 0x5c, 0x0a, - 0x09, 0x4c, 0x61, 0x63, 0x63, 0x4d, 0x50, 0x51, 0x39, 0x2f, 0x57, 0x67, 0x55, 0x4c, 0x4f, 0x6f, 0x6e, 0x35, - 0x34, 0x32, 0x49, 0x4a, 0x51, 0x77, 0x70, 0x6f, 0x41, 0x38, 0x42, 0x64, 0x39, 0x78, 0x2b, 0x75, 0x2b, 0x67, - 0x72, 0x72, 0x6a, 0x74, 0x51, 0x65, 0x69, 0x74, 0x52, 0x79, 0x39, 0x76, 0x42, 0x59, 0x57, 0x46, 0x75, 0x41, - 0x51, 0x76, 0x7a, 0x64, 0x2b, 0x44, 0x4f, 0x4f, 0x2b, 0x35, 0x49, 0x51, 0x49, 0x50, 0x50, 0x63, 0x51, 0x45, - 0x67, 0x5c, 0x0a, - 0x09, 0x79, 0x33, 0x4e, 0x4d, 0x62, 0x5a, 0x6e, 0x79, 0x69, 0x33, 0x6f, 0x56, 0x4b, 0x4f, 0x63, 0x41, 0x43, - 0x67, 0x4b, 0x79, 0x61, 0x6a, 0x79, 0x64, 0x6a, 0x67, 0x65, 0x44, 0x6f, 0x6d, 0x44, 0x4c, 0x4c, 0x62, 0x33, - 0x58, 0x52, 0x38, 0x55, 0x41, 0x41, 0x43, 0x41, 0x41, 0x53, 0x55, 0x52, 0x42, 0x56, 0x42, 0x57, 0x56, 0x5a, - 0x51, 0x45, 0x51, 0x6b, 0x47, 0x63, 0x63, 0x42, 0x41, 0x6f, 0x67, 0x49, 0x2b, 0x54, 0x49, 0x55, 0x62, 0x71, - 0x79, 0x5c, 0x0a, - 0x09, 0x63, 0x6d, 0x35, 0x72, 0x59, 0x52, 0x42, 0x52, 0x48, 0x33, 0x46, 0x68, 0x4d, 0x49, 0x41, 0x41, 0x67, - 0x44, 0x4a, 0x4a, 0x73, 0x52, 0x67, 0x6f, 0x46, 0x30, 0x57, 0x4d, 0x36, 0x6e, 0x70, 0x38, 0x34, 0x59, 0x33, - 0x47, 0x63, 0x56, 0x46, 0x57, 0x36, 0x53, 0x55, 0x43, 0x41, 0x34, 0x2f, 0x38, 0x31, 0x58, 0x63, 0x4f, 0x47, - 0x6f, 0x45, 0x76, 0x6b, 0x62, 0x55, 0x45, 0x55, 0x46, 0x65, 0x73, 0x50, 0x65, 0x75, 0x53, 0x70, 0x2b, 0x38, - 0x34, 0x5c, 0x0a, - 0x09, 0x64, 0x50, 0x44, 0x67, 0x70, 0x67, 0x4b, 0x41, 0x5a, 0x4b, 0x37, 0x4c, 0x35, 0x38, 0x63, 0x61, 0x5a, - 0x59, 0x4d, 0x52, 0x39, 0x2f, 0x70, 0x2b, 0x37, 0x2f, 0x5a, 0x77, 0x47, 0x63, 0x68, 0x7a, 0x78, 0x78, 0x76, - 0x43, 0x30, 0x41, 0x31, 0x42, 0x63, 0x41, 0x67, 0x33, 0x6d, 0x68, 0x77, 0x48, 0x67, 0x51, 0x79, 0x41, 0x38, - 0x31, 0x66, 0x4b, 0x73, 0x76, 0x52, 0x52, 0x50, 0x30, 0x77, 0x48, 0x4b, 0x49, 0x43, 0x41, 0x58, 0x34, 0x6b, - 0x4f, 0x5c, 0x0a, - 0x09, 0x36, 0x77, 0x5a, 0x6c, 0x34, 0x65, 0x38, 0x47, 0x79, 0x4c, 0x73, 0x44, 0x6a, 0x47, 0x63, 0x69, 0x63, - 0x59, 0x73, 0x77, 0x49, 0x30, 0x4c, 0x68, 0x77, 0x68, 0x52, 0x41, 0x52, 0x64, 0x65, 0x73, 0x76, 0x71, 0x32, - 0x6c, 0x6c, 0x53, 0x39, 0x53, 0x66, 0x42, 0x37, 0x52, 0x53, 0x52, 0x70, 0x61, 0x6c, 0x4a, 0x4f, 0x36, 0x68, - 0x38, 0x33, 0x4c, 0x57, 0x74, 0x48, 0x4c, 0x4d, 0x6b, 0x35, 0x42, 0x4a, 0x45, 0x45, 0x70, 0x76, 0x74, 0x4b, - 0x62, 0x5c, 0x0a, - 0x09, 0x38, 0x78, 0x6d, 0x6d, 0x75, 0x48, 0x48, 0x73, 0x2f, 0x6c, 0x79, 0x2f, 0x33, 0x30, 0x65, 0x6e, 0x32, - 0x77, 0x48, 0x59, 0x62, 0x31, 0x73, 0x34, 0x35, 0x30, 0x41, 0x75, 0x78, 0x37, 0x42, 0x44, 0x6f, 0x4b, 0x4c, - 0x77, 0x30, 0x7a, 0x46, 0x32, 0x2b, 0x79, 0x38, 0x36, 0x54, 0x74, 0x56, 0x57, 0x50, 0x52, 0x30, 0x49, 0x49, - 0x4a, 0x42, 0x44, 0x54, 0x67, 0x63, 0x51, 0x49, 0x33, 0x78, 0x39, 0x74, 0x30, 0x62, 0x65, 0x46, 0x59, 0x68, - 0x4f, 0x5c, 0x0a, - 0x09, 0x47, 0x71, 0x5a, 0x6f, 0x52, 0x4d, 0x69, 0x63, 0x42, 0x77, 0x47, 0x65, 0x6b, 0x51, 0x58, 0x5a, 0x42, - 0x50, 0x32, 0x4b, 0x73, 0x55, 0x62, 0x32, 0x35, 0x49, 0x71, 0x2b, 0x30, 0x42, 0x55, 0x6b, 0x43, 0x44, 0x54, - 0x75, 0x44, 0x53, 0x42, 0x6d, 0x76, 0x38, 0x61, 0x59, 0x49, 0x36, 0x42, 0x58, 0x31, 0x2f, 0x65, 0x65, 0x73, - 0x48, 0x76, 0x48, 0x4a, 0x52, 0x65, 0x63, 0x47, 0x31, 0x38, 0x4d, 0x6b, 0x70, 0x33, 0x31, 0x35, 0x46, 0x52, - 0x50, 0x5c, 0x0a, - 0x09, 0x61, 0x30, 0x6a, 0x72, 0x41, 0x67, 0x42, 0x68, 0x39, 0x39, 0x39, 0x72, 0x66, 0x76, 0x59, 0x2f, 0x34, - 0x33, 0x66, 0x65, 0x39, 0x7a, 0x38, 0x54, 0x77, 0x51, 0x72, 0x44, 0x56, 0x59, 0x49, 0x50, 0x52, 0x74, 0x37, - 0x74, 0x64, 0x4e, 0x51, 0x74, 0x61, 0x70, 0x38, 0x4a, 0x4f, 0x44, 0x66, 0x30, 0x36, 0x53, 0x5a, 0x71, 0x4a, - 0x52, 0x56, 0x67, 0x6d, 0x55, 0x41, 0x78, 0x46, 0x43, 0x75, 0x64, 0x4a, 0x53, 0x6f, 0x51, 0x71, 0x47, 0x61, - 0x4d, 0x5c, 0x0a, - 0x09, 0x57, 0x52, 0x61, 0x6d, 0x41, 0x31, 0x52, 0x6e, 0x41, 0x6a, 0x6d, 0x78, 0x39, 0x4a, 0x4e, 0x51, 0x6c, - 0x68, 0x6e, 0x43, 0x42, 0x71, 0x49, 0x34, 0x48, 0x65, 0x43, 0x33, 0x43, 0x4a, 0x30, 0x54, 0x74, 0x77, 0x6a, - 0x35, 0x32, 0x47, 0x49, 0x66, 0x70, 0x52, 0x46, 0x35, 0x41, 0x68, 0x42, 0x53, 0x62, 0x55, 0x42, 0x38, 0x63, - 0x55, 0x2b, 0x73, 0x66, 0x49, 0x50, 0x45, 0x4f, 0x2f, 0x64, 0x35, 0x2b, 0x37, 0x45, 0x39, 0x39, 0x73, 0x6c, - 0x54, 0x5c, 0x0a, - 0x09, 0x7a, 0x76, 0x35, 0x59, 0x48, 0x35, 0x4e, 0x62, 0x37, 0x48, 0x64, 0x50, 0x50, 0x48, 0x44, 0x2f, 0x2f, - 0x61, 0x4c, 0x2f, 0x71, 0x6d, 0x47, 0x70, 0x43, 0x77, 0x64, 0x70, 0x30, 0x4f, 0x51, 0x42, 0x4f, 0x65, 0x2f, - 0x6b, 0x6f, 0x69, 0x30, 0x69, 0x2f, 0x36, 0x4d, 0x58, 0x6e, 0x53, 0x7a, 0x48, 0x45, 0x41, 0x36, 0x35, 0x79, - 0x31, 0x45, 0x55, 0x66, 0x6f, 0x72, 0x6d, 0x62, 0x2f, 0x4d, 0x42, 0x79, 0x4a, 0x7a, 0x58, 0x67, 0x66, 0x4d, - 0x72, 0x5c, 0x0a, - 0x09, 0x2f, 0x6f, 0x55, 0x41, 0x67, 0x53, 0x48, 0x4c, 0x42, 0x44, 0x4b, 0x66, 0x6e, 0x59, 0x48, 0x67, 0x73, - 0x68, 0x78, 0x55, 0x46, 0x69, 0x4e, 0x76, 0x45, 0x54, 0x72, 0x6e, 0x36, 0x69, 0x6b, 0x61, 0x6b, 0x56, 0x2b, - 0x6a, 0x59, 0x51, 0x59, 0x54, 0x73, 0x6a, 0x4d, 0x48, 0x76, 0x37, 0x45, 0x6f, 0x2f, 0x68, 0x41, 0x4e, 0x56, - 0x49, 0x51, 0x32, 0x35, 0x4b, 0x74, 0x76, 0x52, 0x59, 0x37, 0x61, 0x72, 0x78, 0x48, 0x4b, 0x62, 0x35, 0x32, - 0x61, 0x5c, 0x0a, - 0x09, 0x51, 0x71, 0x39, 0x36, 0x65, 0x47, 0x77, 0x55, 0x58, 0x58, 0x44, 0x57, 0x36, 0x54, 0x39, 0x2b, 0x31, - 0x69, 0x6d, 0x37, 0x75, 0x67, 0x41, 0x2b, 0x42, 0x65, 0x66, 0x6d, 0x67, 0x36, 0x2b, 0x73, 0x31, 0x2b, 0x61, - 0x67, 0x4e, 0x64, 0x38, 0x49, 0x46, 0x4c, 0x66, 0x2b, 0x2b, 0x75, 0x7a, 0x73, 0x50, 0x33, 0x33, 0x39, 0x6c, - 0x6e, 0x74, 0x66, 0x2b, 0x6f, 0x34, 0x50, 0x2f, 0x73, 0x4e, 0x7a, 0x51, 0x4a, 0x54, 0x78, 0x4c, 0x5a, 0x37, - 0x31, 0x5c, 0x0a, - 0x09, 0x73, 0x55, 0x2f, 0x76, 0x50, 0x76, 0x32, 0x76, 0x6e, 0x34, 0x6d, 0x37, 0x37, 0x77, 0x44, 0x67, 0x34, - 0x71, 0x63, 0x2f, 0x45, 0x79, 0x42, 0x43, 0x4d, 0x53, 0x78, 0x51, 0x6c, 0x50, 0x34, 0x64, 0x38, 0x30, 0x55, - 0x78, 0x39, 0x43, 0x6e, 0x6d, 0x63, 0x42, 0x6c, 0x46, 0x36, 0x66, 0x78, 0x69, 0x59, 0x46, 0x47, 0x69, 0x4b, - 0x41, 0x75, 0x55, 0x52, 0x59, 0x48, 0x53, 0x2b, 0x51, 0x30, 0x2f, 0x77, 0x2b, 0x6f, 0x70, 0x77, 0x4c, 0x4a, - 0x30, 0x5c, 0x0a, - 0x09, 0x4b, 0x41, 0x73, 0x2f, 0x48, 0x58, 0x44, 0x4f, 0x4e, 0x57, 0x77, 0x57, 0x38, 0x6d, 0x35, 0x63, 0x4f, - 0x6c, 0x64, 0x46, 0x48, 0x74, 0x38, 0x2f, 0x33, 0x79, 0x63, 0x51, 0x65, 0x41, 0x59, 0x51, 0x6f, 0x30, 0x35, - 0x41, 0x70, 0x7a, 0x54, 0x39, 0x5a, 0x4c, 0x49, 0x6f, 0x43, 0x7a, 0x4f, 0x39, 0x4e, 0x39, 0x50, 0x7a, 0x6b, - 0x42, 0x6e, 0x6f, 0x6a, 0x45, 0x4a, 0x46, 0x46, 0x31, 0x35, 0x33, 0x2f, 0x2f, 0x34, 0x44, 0x65, 0x4e, 0x4f, - 0x6c, 0x5c, 0x0a, - 0x09, 0x4c, 0x38, 0x48, 0x55, 0x65, 0x42, 0x38, 0x54, 0x76, 0x51, 0x36, 0x32, 0x6a, 0x50, 0x66, 0x38, 0x63, - 0x77, 0x4f, 0x69, 0x59, 0x52, 0x58, 0x68, 0x71, 0x71, 0x59, 0x4f, 0x4c, 0x77, 0x78, 0x77, 0x5a, 0x47, 0x45, - 0x4a, 0x63, 0x30, 0x76, 0x4c, 0x6d, 0x46, 0x31, 0x63, 0x78, 0x74, 0x7a, 0x69, 0x49, 0x75, 0x35, 0x35, 0x38, - 0x44, 0x41, 0x4f, 0x48, 0x70, 0x37, 0x46, 0x66, 0x51, 0x63, 0x50, 0x34, 0x37, 0x61, 0x37, 0x37, 0x38, 0x56, - 0x6c, 0x5c, 0x0a, - 0x09, 0x6c, 0x33, 0x30, 0x79, 0x38, 0x6a, 0x43, 0x35, 0x64, 0x51, 0x73, 0x65, 0x2f, 0x38, 0x51, 0x6e, 0x59, - 0x31, 0x67, 0x73, 0x6f, 0x79, 0x78, 0x4b, 0x4c, 0x43, 0x38, 0x76, 0x56, 0x2b, 0x6c, 0x2b, 0x67, 0x58, 0x49, - 0x34, 0x52, 0x4f, 0x6b, 0x63, 0x68, 0x6d, 0x55, 0x42, 0x4e, 0x79, 0x77, 0x78, 0x4c, 0x50, 0x78, 0x54, 0x65, - 0x76, 0x47, 0x36, 0x4b, 0x2f, 0x33, 0x2b, 0x67, 0x4b, 0x48, 0x66, 0x78, 0x31, 0x47, 0x36, 0x61, 0x6d, 0x39, - 0x41, 0x5c, 0x0a, - 0x09, 0x61, 0x65, 0x38, 0x54, 0x4b, 0x45, 0x72, 0x2f, 0x53, 0x31, 0x42, 0x38, 0x45, 0x62, 0x5a, 0x70, 0x73, - 0x78, 0x43, 0x41, 0x4f, 0x6a, 0x75, 0x4c, 0x61, 0x77, 0x4b, 0x57, 0x54, 0x70, 0x77, 0x41, 0x41, 0x53, 0x45, - 0x50, 0x61, 0x2b, 0x46, 0x50, 0x5a, 0x51, 0x66, 0x4a, 0x47, 0x67, 0x77, 0x72, 0x51, 0x30, 0x52, 0x34, 0x33, - 0x35, 0x74, 0x2f, 0x45, 0x30, 0x39, 0x2b, 0x35, 0x44, 0x34, 0x35, 0x5a, 0x57, 0x78, 0x61, 0x61, 0x50, 0x51, - 0x44, 0x5c, 0x0a, - 0x09, 0x75, 0x41, 0x64, 0x45, 0x66, 0x77, 0x62, 0x6e, 0x33, 0x67, 0x62, 0x67, 0x62, 0x6d, 0x42, 0x39, 0x51, - 0x47, 0x42, 0x4e, 0x4d, 0x77, 0x44, 0x32, 0x76, 0x72, 0x4f, 0x4c, 0x51, 0x66, 0x51, 0x4f, 0x41, 0x47, 0x65, - 0x65, 0x75, 0x32, 0x38, 0x33, 0x2f, 0x75, 0x6a, 0x58, 0x58, 0x69, 0x4b, 0x46, 0x59, 0x74, 0x77, 0x4b, 0x66, - 0x4d, 0x71, 0x4e, 0x33, 0x38, 0x48, 0x74, 0x74, 0x39, 0x31, 0x57, 0x74, 0x31, 0x57, 0x57, 0x36, 0x49, 0x2b, - 0x4e, 0x5c, 0x0a, - 0x09, 0x41, 0x53, 0x42, 0x51, 0x45, 0x59, 0x54, 0x61, 0x38, 0x55, 0x61, 0x53, 0x64, 0x77, 0x41, 0x4d, 0x67, - 0x55, 0x34, 0x48, 0x42, 0x52, 0x58, 0x41, 0x73, 0x46, 0x4c, 0x51, 0x73, 0x41, 0x41, 0x79, 0x6f, 0x4a, 0x4e, - 0x33, 0x4d, 0x43, 0x79, 0x47, 0x79, 0x48, 0x4f, 0x71, 0x68, 0x6a, 0x79, 0x73, 0x70, 0x77, 0x4f, 0x77, 0x46, - 0x67, 0x5a, 0x4c, 0x66, 0x33, 0x63, 0x67, 0x70, 0x70, 0x2b, 0x4f, 0x5a, 0x51, 0x4a, 0x68, 0x73, 0x78, 0x44, - 0x56, 0x5c, 0x0a, - 0x09, 0x55, 0x53, 0x63, 0x59, 0x5a, 0x6b, 0x77, 0x2f, 0x41, 0x5a, 0x46, 0x62, 0x56, 0x6c, 0x59, 0x54, 0x6f, - 0x70, 0x63, 0x76, 0x57, 0x68, 0x75, 0x51, 0x54, 0x74, 0x31, 0x44, 0x39, 0x61, 0x5a, 0x64, 0x68, 0x45, 0x30, - 0x72, 0x31, 0x69, 0x65, 0x63, 0x73, 0x42, 0x76, 0x6e, 0x6e, 0x38, 0x36, 0x65, 0x73, 0x62, 0x4c, 0x41, 0x6e, - 0x61, 0x72, 0x2f, 0x43, 0x45, 0x4c, 0x75, 0x55, 0x78, 0x4e, 0x39, 0x54, 0x45, 0x33, 0x30, 0x55, 0x44, 0x74, - 0x4b, 0x5c, 0x0a, - 0x09, 0x35, 0x51, 0x6c, 0x56, 0x6d, 0x56, 0x76, 0x75, 0x4f, 0x34, 0x78, 0x50, 0x58, 0x48, 0x5a, 0x35, 0x35, - 0x48, 0x6c, 0x35, 0x73, 0x49, 0x78, 0x4f, 0x78, 0x39, 0x39, 0x36, 0x58, 0x63, 0x59, 0x41, 0x48, 0x56, 0x65, - 0x62, 0x6b, 0x6c, 0x39, 0x32, 0x4b, 0x5a, 0x44, 0x44, 0x6f, 0x63, 0x7a, 0x39, 0x77, 0x75, 0x42, 0x77, 0x4f, - 0x50, 0x53, 0x4c, 0x75, 0x4d, 0x36, 0x42, 0x48, 0x50, 0x6b, 0x73, 0x4c, 0x66, 0x65, 0x72, 0x39, 0x79, 0x69, - 0x42, 0x5c, 0x0a, - 0x09, 0x67, 0x67, 0x6f, 0x51, 0x73, 0x55, 0x7a, 0x41, 0x5a, 0x55, 0x41, 0x5a, 0x31, 0x67, 0x54, 0x38, 0x59, - 0x6d, 0x32, 0x5a, 0x35, 0x30, 0x77, 0x66, 0x4f, 0x68, 0x4e, 0x67, 0x4a, 0x68, 0x57, 0x6d, 0x41, 0x32, 0x4b, - 0x4e, 0x68, 0x75, 0x76, 0x45, 0x70, 0x7a, 0x47, 0x55, 0x65, 0x62, 0x73, 0x53, 0x74, 0x77, 0x52, 0x44, 0x39, - 0x6f, 0x4d, 0x55, 0x6d, 0x50, 0x6e, 0x55, 0x7a, 0x46, 0x70, 0x41, 0x35, 0x47, 0x56, 0x4f, 0x4f, 0x2f, 0x36, - 0x34, 0x5c, 0x0a, - 0x09, 0x32, 0x71, 0x62, 0x6a, 0x32, 0x6f, 0x35, 0x4c, 0x51, 0x53, 0x43, 0x63, 0x49, 0x39, 0x6f, 0x44, 0x34, - 0x46, 0x64, 0x42, 0x65, 0x44, 0x45, 0x63, 0x6e, 0x67, 0x7a, 0x67, 0x75, 0x6c, 0x52, 0x35, 0x71, 0x30, 0x39, - 0x72, 0x74, 0x67, 0x2b, 0x67, 0x76, 0x4f, 0x36, 0x54, 0x71, 0x4b, 0x7a, 0x34, 0x46, 0x30, 0x48, 0x30, 0x4c, - 0x77, 0x44, 0x4f, 0x39, 0x46, 0x63, 0x43, 0x68, 0x44, 0x5a, 0x55, 0x72, 0x41, 0x52, 0x79, 0x36, 0x73, 0x6b, - 0x6e, 0x5c, 0x0a, - 0x09, 0x56, 0x61, 0x58, 0x39, 0x47, 0x73, 0x44, 0x69, 0x34, 0x69, 0x4c, 0x79, 0x50, 0x45, 0x65, 0x33, 0x30, - 0x30, 0x48, 0x57, 0x79, 0x64, 0x48, 0x70, 0x64, 0x50, 0x31, 0x47, 0x6b, 0x37, 0x7a, 0x6a, 0x74, 0x77, 0x50, - 0x6e, 0x48, 0x57, 0x52, 0x55, 0x33, 0x58, 0x2f, 0x75, 0x31, 0x50, 0x73, 0x41, 0x77, 0x6a, 0x33, 0x70, 0x54, - 0x71, 0x63, 0x4c, 0x45, 0x4d, 0x58, 0x4e, 0x51, 0x6d, 0x48, 0x2f, 0x51, 0x45, 0x35, 0x36, 0x73, 0x31, 0x43, - 0x31, 0x5c, 0x0a, - 0x09, 0x75, 0x53, 0x51, 0x61, 0x55, 0x39, 0x67, 0x50, 0x51, 0x47, 0x79, 0x66, 0x51, 0x48, 0x55, 0x74, 0x4c, - 0x41, 0x37, 0x6c, 0x75, 0x56, 0x42, 0x32, 0x32, 0x43, 0x55, 0x51, 0x7a, 0x49, 0x67, 0x62, 0x58, 0x74, 0x79, - 0x32, 0x7a, 0x49, 0x79, 0x4d, 0x52, 0x78, 0x43, 0x52, 0x68, 0x6a, 0x73, 0x6e, 0x72, 0x6f, 0x66, 0x79, 0x4f, - 0x76, 0x30, 0x4d, 0x49, 0x4c, 0x4a, 0x6a, 0x32, 0x33, 0x51, 0x38, 0x59, 0x7a, 0x71, 0x2f, 0x71, 0x68, 0x64, - 0x42, 0x5c, 0x0a, - 0x09, 0x49, 0x46, 0x34, 0x4c, 0x58, 0x73, 0x51, 0x69, 0x5a, 0x6a, 0x57, 0x75, 0x48, 0x5a, 0x4e, 0x6a, 0x6b, - 0x52, 0x63, 0x43, 0x59, 0x62, 0x43, 0x30, 0x35, 0x4b, 0x63, 0x2b, 0x65, 0x59, 0x35, 0x4f, 0x70, 0x31, 0x64, - 0x39, 0x64, 0x76, 0x7a, 0x57, 0x33, 0x38, 0x78, 0x76, 0x2f, 0x38, 0x30, 0x6f, 0x38, 0x7a, 0x72, 0x49, 0x73, - 0x2b, 0x70, 0x38, 0x56, 0x6d, 0x33, 0x64, 0x39, 0x76, 0x73, 0x7a, 0x38, 0x6a, 0x78, 0x48, 0x33, 0x76, 0x48, - 0x6e, 0x5c, 0x0a, - 0x09, 0x63, 0x37, 0x5a, 0x5a, 0x4b, 0x4d, 0x38, 0x36, 0x6c, 0x55, 0x35, 0x79, 0x68, 0x41, 0x31, 0x43, 0x47, - 0x63, 0x68, 0x76, 0x49, 0x38, 0x68, 0x71, 0x77, 0x37, 0x48, 0x32, 0x43, 0x55, 0x52, 0x4a, 0x4d, 0x35, 0x33, - 0x55, 0x6d, 0x37, 0x63, 0x49, 0x33, 0x50, 0x41, 0x63, 0x6b, 0x4f, 0x67, 0x6a, 0x5a, 0x41, 0x4d, 0x61, 0x6a, - 0x44, 0x55, 0x51, 0x38, 0x30, 0x2f, 0x41, 0x36, 0x79, 0x72, 0x63, 0x31, 0x64, 0x6d, 0x39, 0x65, 0x77, 0x2f, - 0x32, 0x5c, 0x0a, - 0x09, 0x37, 0x70, 0x79, 0x71, 0x5a, 0x53, 0x73, 0x79, 0x41, 0x4f, 0x4d, 0x63, 0x31, 0x34, 0x48, 0x44, 0x4c, - 0x68, 0x44, 0x39, 0x41, 0x62, 0x41, 0x2b, 0x4c, 0x77, 0x78, 0x64, 0x45, 0x77, 0x41, 0x6f, 0x72, 0x2f, 0x31, - 0x6b, 0x47, 0x4f, 0x64, 0x7a, 0x41, 0x4c, 0x77, 0x64, 0x67, 0x46, 0x2b, 0x36, 0x64, 0x62, 0x55, 0x6a, 0x2b, - 0x41, 0x2f, 0x31, 0x79, 0x53, 0x34, 0x64, 0x4f, 0x4f, 0x30, 0x55, 0x41, 0x50, 0x56, 0x43, 0x31, 0x70, 0x48, - 0x5a, 0x5c, 0x0a, - 0x09, 0x49, 0x33, 0x36, 0x6a, 0x53, 0x54, 0x64, 0x48, 0x4a, 0x38, 0x2b, 0x52, 0x42, 0x65, 0x66, 0x76, 0x64, - 0x69, 0x6f, 0x51, 0x79, 0x4a, 0x46, 0x33, 0x4f, 0x76, 0x35, 0x61, 0x74, 0x55, 0x73, 0x77, 0x62, 0x45, 0x7a, - 0x78, 0x42, 0x75, 0x64, 0x33, 0x6f, 0x51, 0x48, 0x77, 0x52, 0x70, 0x64, 0x33, 0x34, 0x6c, 0x32, 0x43, 0x75, - 0x42, 0x4f, 0x4e, 0x36, 0x73, 0x31, 0x43, 0x65, 0x64, 0x79, 0x51, 0x51, 0x73, 0x6b, 0x4f, 0x4e, 0x54, 0x45, - 0x33, 0x5c, 0x0a, - 0x09, 0x44, 0x38, 0x61, 0x6e, 0x6c, 0x72, 0x6c, 0x7a, 0x37, 0x73, 0x77, 0x36, 0x6b, 0x6d, 0x54, 0x31, 0x74, - 0x62, 0x67, 0x7a, 0x45, 0x48, 0x55, 0x61, 0x47, 0x39, 0x32, 0x4d, 0x7a, 0x55, 0x31, 0x35, 0x2b, 0x57, 0x43, - 0x51, 0x76, 0x44, 0x77, 0x41, 0x37, 0x44, 0x73, 0x35, 0x52, 0x48, 0x2b, 0x2b, 0x59, 0x4b, 0x63, 0x7a, 0x45, - 0x5a, 0x4c, 0x66, 0x31, 0x56, 0x30, 0x4e, 0x55, 0x54, 0x2b, 0x43, 0x41, 0x62, 0x42, 0x31, 0x76, 0x49, 0x76, - 0x39, 0x5c, 0x0a, - 0x09, 0x42, 0x77, 0x35, 0x45, 0x6e, 0x54, 0x6a, 0x6e, 0x73, 0x4c, 0x43, 0x34, 0x69, 0x45, 0x34, 0x6c, 0x38, - 0x32, 0x36, 0x33, 0x68, 0x37, 0x78, 0x54, 0x67, 0x34, 0x42, 0x33, 0x37, 0x67, 0x35, 0x79, 0x71, 0x6e, 0x59, - 0x44, 0x52, 0x6e, 0x44, 0x49, 0x32, 0x41, 0x61, 0x75, 0x43, 0x71, 0x41, 0x5a, 0x43, 0x46, 0x41, 0x45, 0x67, - 0x64, 0x72, 0x35, 0x69, 0x51, 0x69, 0x55, 0x5a, 0x38, 0x67, 0x6f, 0x72, 0x39, 0x5a, 0x6f, 0x36, 0x73, 0x31, - 0x57, 0x5c, 0x0a, - 0x09, 0x4e, 0x51, 0x6a, 0x34, 0x7a, 0x34, 0x7a, 0x72, 0x68, 0x75, 0x6b, 0x6b, 0x49, 0x36, 0x36, 0x66, 0x61, - 0x6a, 0x32, 0x6e, 0x4f, 0x67, 0x34, 0x50, 0x47, 0x46, 0x6e, 0x62, 0x74, 0x6d, 0x50, 0x47, 0x35, 0x61, 0x54, - 0x73, 0x59, 0x37, 0x70, 0x66, 0x42, 0x61, 0x68, 0x51, 0x68, 0x6f, 0x68, 0x77, 0x33, 0x6a, 0x6d, 0x50, 0x4e, - 0x4b, 0x4b, 0x39, 0x5a, 0x66, 0x73, 0x61, 0x42, 0x43, 0x6a, 0x55, 0x75, 0x52, 0x68, 0x45, 0x50, 0x77, 0x69, - 0x73, 0x5c, 0x0a, - 0x09, 0x50, 0x51, 0x69, 0x73, 0x35, 0x55, 0x37, 0x41, 0x63, 0x54, 0x69, 0x38, 0x79, 0x78, 0x39, 0x57, 0x45, - 0x5a, 0x38, 0x50, 0x57, 0x71, 0x53, 0x61, 0x53, 0x4d, 0x36, 0x66, 0x66, 0x75, 0x49, 0x4a, 0x56, 0x54, 0x58, - 0x2f, 0x37, 0x35, 0x34, 0x37, 0x37, 0x76, 0x54, 0x4f, 0x54, 0x6a, 0x34, 0x4c, 0x36, 0x48, 0x61, 0x37, 0x79, - 0x44, 0x76, 0x42, 0x79, 0x54, 0x50, 0x6b, 0x65, 0x62, 0x66, 0x4b, 0x42, 0x44, 0x78, 0x41, 0x64, 0x44, 0x6f, - 0x64, 0x5c, 0x0a, - 0x09, 0x55, 0x4d, 0x63, 0x62, 0x56, 0x56, 0x35, 0x46, 0x48, 0x63, 0x6f, 0x38, 0x61, 0x41, 0x42, 0x2b, 0x52, - 0x64, 0x6c, 0x48, 0x71, 0x73, 0x6f, 0x49, 0x77, 0x34, 0x37, 0x42, 0x4c, 0x49, 0x43, 0x41, 0x6a, 0x7a, 0x70, - 0x41, 0x5a, 0x56, 0x79, 0x5a, 0x4e, 0x4c, 0x71, 0x6a, 0x41, 0x59, 0x45, 0x73, 0x70, 0x76, 0x44, 0x47, 0x6b, - 0x6c, 0x47, 0x6d, 0x56, 0x70, 0x79, 0x72, 0x6f, 0x54, 0x76, 0x32, 0x54, 0x34, 0x67, 0x6c, 0x74, 0x46, 0x4c, - 0x35, 0x5c, 0x0a, - 0x09, 0x63, 0x45, 0x68, 0x62, 0x4f, 0x55, 0x44, 0x73, 0x50, 0x2b, 0x6c, 0x34, 0x33, 0x67, 0x57, 0x59, 0x51, - 0x53, 0x6c, 0x79, 0x30, 0x75, 0x6d, 0x4a, 0x41, 0x55, 0x4d, 0x77, 0x52, 0x6d, 0x33, 0x41, 0x52, 0x48, 0x6a, - 0x34, 0x77, 0x30, 0x36, 0x76, 0x4d, 0x78, 0x55, 0x69, 0x48, 0x48, 0x7a, 0x77, 0x51, 0x58, 0x51, 0x37, 0x6e, - 0x65, 0x6a, 0x30, 0x58, 0x5a, 0x55, 0x4a, 0x35, 0x48, 0x6d, 0x4f, 0x76, 0x4e, 0x76, 0x78, 0x4f, 0x73, 0x68, - 0x71, 0x5c, 0x0a, - 0x09, 0x52, 0x38, 0x2b, 0x79, 0x76, 0x4d, 0x34, 0x45, 0x34, 0x72, 0x62, 0x75, 0x72, 0x4e, 0x37, 0x4b, 0x6e, - 0x58, 0x4d, 0x51, 0x51, 0x41, 0x55, 0x55, 0x55, 0x4e, 0x75, 0x47, 0x4b, 0x62, 0x4b, 0x6e, 0x51, 0x55, 0x43, - 0x77, 0x4c, 0x55, 0x43, 0x67, 0x42, 0x6d, 0x54, 0x48, 0x50, 0x6c, 0x30, 0x41, 0x41, 0x53, 0x55, 0x72, 0x6e, - 0x64, 0x72, 0x7a, 0x7a, 0x36, 0x41, 0x37, 0x73, 0x5a, 0x5a, 0x54, 0x58, 0x58, 0x76, 0x73, 0x32, 0x51, 0x2b, - 0x76, 0x5c, 0x0a, - 0x09, 0x5a, 0x53, 0x73, 0x59, 0x43, 0x6e, 0x4b, 0x76, 0x50, 0x76, 0x6e, 0x55, 0x68, 0x4d, 0x76, 0x64, 0x30, - 0x35, 0x38, 0x43, 0x57, 0x50, 0x4f, 0x33, 0x42, 0x71, 0x38, 0x64, 0x41, 0x42, 0x43, 0x39, 0x43, 0x45, 0x53, - 0x56, 0x52, 0x66, 0x4c, 0x49, 0x77, 0x79, 0x30, 0x65, 0x36, 0x6e, 0x78, 0x4e, 0x46, 0x35, 0x31, 0x39, 0x75, - 0x6a, 0x68, 0x31, 0x37, 0x7a, 0x31, 0x33, 0x59, 0x62, 0x67, 0x38, 0x52, 0x4c, 0x66, 0x58, 0x52, 0x5a, 0x62, - 0x6c, 0x5c, 0x0a, - 0x09, 0x79, 0x4c, 0x50, 0x4d, 0x67, 0x30, 0x43, 0x33, 0x34, 0x36, 0x63, 0x44, 0x48, 0x5a, 0x39, 0x36, 0x78, - 0x71, 0x66, 0x50, 0x73, 0x67, 0x79, 0x64, 0x33, 0x45, 0x38, 0x58, 0x59, 0x72, 0x70, 0x5a, 0x58, 0x51, 0x2f, - 0x62, 0x68, 0x6e, 0x6b, 0x6d, 0x51, 0x45, 0x54, 0x79, 0x32, 0x59, 0x47, 0x73, 0x33, 0x6e, 0x49, 0x4d, 0x49, - 0x4b, 0x61, 0x66, 0x52, 0x35, 0x30, 0x4a, 0x56, 0x4e, 0x2f, 0x7a, 0x4d, 0x4e, 0x38, 0x55, 0x71, 0x61, 0x64, - 0x48, 0x5c, 0x0a, - 0x09, 0x2b, 0x79, 0x79, 0x58, 0x4b, 0x53, 0x78, 0x69, 0x53, 0x57, 0x5a, 0x6b, 0x6f, 0x6b, 0x35, 0x64, 0x52, - 0x70, 0x44, 0x7a, 0x2f, 0x58, 0x37, 0x50, 0x67, 0x5a, 0x50, 0x72, 0x45, 0x34, 0x6d, 0x63, 0x5a, 0x58, 0x6e, - 0x47, 0x65, 0x47, 0x71, 0x6f, 0x70, 0x44, 0x49, 0x44, 0x7a, 0x77, 0x77, 0x65, 0x66, 0x65, 0x5a, 0x2b, 0x77, - 0x63, 0x75, 0x64, 0x64, 0x39, 0x36, 0x4f, 0x72, 0x41, 0x4c, 0x6a, 0x43, 0x41, 0x49, 0x68, 0x45, 0x2b, 0x68, - 0x32, 0x5c, 0x0a, - 0x09, 0x34, 0x70, 0x4f, 0x61, 0x49, 0x52, 0x76, 0x4c, 0x71, 0x71, 0x32, 0x2b, 0x6e, 0x64, 0x78, 0x48, 0x38, - 0x67, 0x41, 0x53, 0x47, 0x57, 0x55, 0x4d, 0x6f, 0x48, 0x4d, 0x66, 0x36, 0x53, 0x73, 0x51, 0x36, 0x47, 0x53, - 0x64, 0x57, 0x68, 0x38, 0x4b, 0x42, 0x4a, 0x44, 0x56, 0x64, 0x79, 0x45, 0x79, 0x49, 0x58, 0x65, 0x53, 0x4d, - 0x6d, 0x56, 0x62, 0x75, 0x59, 0x50, 0x42, 0x38, 0x7a, 0x51, 0x2b, 0x57, 0x6d, 0x43, 0x59, 0x58, 0x6a, 0x69, - 0x59, 0x5c, 0x0a, - 0x09, 0x4f, 0x75, 0x44, 0x54, 0x4d, 0x73, 0x75, 0x63, 0x51, 0x7a, 0x62, 0x33, 0x31, 0x50, 0x50, 0x50, 0x72, - 0x47, 0x57, 0x70, 0x4d, 0x39, 0x38, 0x41, 0x74, 0x6b, 0x48, 0x47, 0x73, 0x52, 0x45, 0x6d, 0x66, 0x77, 0x38, - 0x51, 0x4f, 0x77, 0x47, 0x38, 0x45, 0x47, 0x74, 0x4d, 0x71, 0x77, 0x34, 0x41, 0x62, 0x4e, 0x58, 0x2f, 0x2b, - 0x66, 0x47, 0x6b, 0x4d, 0x69, 0x53, 0x5a, 0x59, 0x33, 0x46, 0x72, 0x72, 0x46, 0x50, 0x4f, 0x66, 0x62, 0x75, - 0x6d, 0x5c, 0x0a, - 0x09, 0x63, 0x63, 0x34, 0x35, 0x35, 0x38, 0x52, 0x30, 0x6b, 0x30, 0x43, 0x34, 0x39, 0x5a, 0x61, 0x62, 0x30, - 0x59, 0x6e, 0x47, 0x31, 0x66, 0x56, 0x70, 0x66, 0x54, 0x55, 0x64, 0x36, 0x46, 0x54, 0x54, 0x67, 0x45, 0x36, - 0x6e, 0x4d, 0x73, 0x5a, 0x4f, 0x78, 0x30, 0x65, 0x64, 0x4c, 0x41, 0x4e, 0x31, 0x73, 0x67, 0x6f, 0x63, 0x73, - 0x72, 0x68, 0x4f, 0x49, 0x44, 0x4b, 0x42, 0x76, 0x49, 0x4d, 0x38, 0x7a, 0x30, 0x54, 0x71, 0x58, 0x32, 0x63, - 0x43, 0x5c, 0x0a, - 0x09, 0x46, 0x43, 0x4e, 0x48, 0x76, 0x56, 0x63, 0x64, 0x73, 0x57, 0x37, 0x59, 0x74, 0x77, 0x37, 0x55, 0x69, - 0x33, 0x4f, 0x55, 0x79, 0x39, 0x74, 0x6a, 0x50, 0x42, 0x50, 0x67, 0x35, 0x4f, 0x65, 0x67, 0x57, 0x52, 0x31, - 0x70, 0x39, 0x42, 0x53, 0x64, 0x71, 0x49, 0x37, 0x32, 0x4d, 0x42, 0x79, 0x66, 0x6c, 0x66, 0x75, 0x65, 0x78, - 0x7a, 0x34, 0x47, 0x75, 0x36, 0x62, 0x44, 0x6a, 0x38, 0x30, 0x77, 0x77, 0x30, 0x72, 0x53, 0x65, 0x30, 0x6a, - 0x6a, 0x5c, 0x0a, - 0x09, 0x69, 0x35, 0x48, 0x65, 0x4b, 0x57, 0x4f, 0x74, 0x79, 0x72, 0x6d, 0x4b, 0x55, 0x77, 0x49, 0x75, 0x4f, - 0x75, 0x65, 0x4d, 0x79, 0x49, 0x65, 0x44, 0x77, 0x33, 0x31, 0x33, 0x33, 0x59, 0x58, 0x35, 0x75, 0x56, 0x6d, - 0x66, 0x64, 0x59, 0x57, 0x73, 0x4c, 0x4b, 0x34, 0x4a, 0x73, 0x43, 0x79, 0x67, 0x6d, 0x75, 0x76, 0x6e, 0x57, - 0x59, 0x5a, 0x4f, 0x4a, 0x36, 0x2f, 0x65, 0x32, 0x79, 0x43, 0x6e, 0x41, 0x33, 0x6b, 0x65, 0x73, 0x72, 0x52, - 0x71, 0x5c, 0x0a, - 0x09, 0x48, 0x59, 0x65, 0x38, 0x37, 0x42, 0x47, 0x6d, 0x62, 0x6b, 0x51, 0x67, 0x34, 0x69, 0x43, 0x51, 0x65, - 0x31, 0x33, 0x6d, 0x51, 0x52, 0x2f, 0x56, 0x73, 0x78, 0x78, 0x42, 0x62, 0x75, 0x77, 0x54, 0x71, 0x45, 0x43, - 0x67, 0x47, 0x72, 0x64, 0x66, 0x6f, 0x39, 0x48, 0x36, 0x38, 0x4d, 0x64, 0x5a, 0x6c, 0x72, 0x4d, 0x5a, 0x6c, - 0x4a, 0x79, 0x47, 0x38, 0x54, 0x61, 0x54, 0x39, 0x5a, 0x70, 0x4b, 0x52, 0x6b, 0x39, 0x36, 0x34, 0x68, 0x4f, - 0x77, 0x5c, 0x0a, - 0x09, 0x64, 0x39, 0x63, 0x30, 0x77, 0x44, 0x4b, 0x44, 0x36, 0x50, 0x52, 0x69, 0x76, 0x53, 0x55, 0x63, 0x75, - 0x6d, 0x59, 0x64, 0x41, 0x55, 0x2f, 0x56, 0x75, 0x6c, 0x35, 0x74, 0x57, 0x71, 0x73, 0x4d, 0x49, 0x41, 0x50, - 0x63, 0x52, 0x66, 0x37, 0x51, 0x70, 0x63, 0x62, 0x47, 0x42, 0x79, 0x31, 0x51, 0x44, 0x2b, 0x42, 0x6f, 0x2b, - 0x4c, 0x53, 0x4c, 0x48, 0x6c, 0x63, 0x64, 0x65, 0x69, 0x56, 0x38, 0x38, 0x39, 0x70, 0x72, 0x41, 0x50, 0x67, - 0x64, 0x5c, 0x0a, - 0x09, 0x5a, 0x67, 0x45, 0x45, 0x38, 0x72, 0x43, 0x77, 0x56, 0x4b, 0x30, 0x4a, 0x2b, 0x4b, 0x67, 0x65, 0x4d, - 0x6f, 0x46, 0x4f, 0x7a, 0x41, 0x51, 0x6f, 0x4c, 0x50, 0x37, 0x46, 0x70, 0x77, 0x4c, 0x39, 0x77, 0x71, 0x41, - 0x33, 0x51, 0x4c, 0x2f, 0x67, 0x6c, 0x46, 0x56, 0x47, 0x49, 0x68, 0x59, 0x47, 0x77, 0x33, 0x53, 0x41, 0x38, - 0x6f, 0x6f, 0x58, 0x44, 0x67, 0x4a, 0x38, 0x59, 0x56, 0x43, 0x6c, 0x69, 0x6a, 0x6f, 0x54, 0x34, 0x47, 0x58, - 0x55, 0x5c, 0x0a, - 0x09, 0x50, 0x44, 0x7a, 0x4c, 0x63, 0x6e, 0x45, 0x72, 0x74, 0x42, 0x59, 0x48, 0x57, 0x35, 0x6a, 0x69, 0x6e, - 0x39, 0x46, 0x67, 0x61, 0x6d, 0x64, 0x38, 0x36, 0x75, 0x4d, 0x65, 0x58, 0x63, 0x75, 0x59, 0x55, 0x35, 0x41, - 0x33, 0x31, 0x30, 0x48, 0x73, 0x67, 0x2b, 0x6c, 0x44, 0x52, 0x79, 0x55, 0x64, 0x75, 0x52, 0x78, 0x77, 0x34, - 0x50, 0x68, 0x74, 0x65, 0x4e, 0x53, 0x6a, 0x48, 0x69, 0x58, 0x34, 0x75, 0x66, 0x47, 0x47, 0x47, 0x39, 0x44, - 0x72, 0x5c, 0x0a, - 0x09, 0x64, 0x66, 0x33, 0x36, 0x53, 0x38, 0x67, 0x47, 0x38, 0x68, 0x7a, 0x64, 0x54, 0x72, 0x66, 0x4b, 0x43, - 0x4c, 0x70, 0x78, 0x59, 0x62, 0x44, 0x54, 0x37, 0x53, 0x41, 0x6a, 0x42, 0x67, 0x4c, 0x56, 0x4e, 0x43, 0x43, - 0x5a, 0x44, 0x72, 0x43, 0x70, 0x67, 0x6e, 0x79, 0x41, 0x4b, 0x43, 0x77, 0x4d, 0x56, 0x69, 0x41, 0x51, 0x73, - 0x71, 0x73, 0x34, 0x50, 0x66, 0x4e, 0x33, 0x61, 0x34, 0x51, 0x65, 0x4e, 0x41, 0x68, 0x55, 0x59, 0x36, 0x37, - 0x31, 0x5c, 0x0a, - 0x09, 0x55, 0x53, 0x2b, 0x76, 0x68, 0x6a, 0x45, 0x46, 0x55, 0x42, 0x62, 0x72, 0x4c, 0x30, 0x7a, 0x57, 0x51, - 0x72, 0x77, 0x4d, 0x75, 0x41, 0x6d, 0x45, 0x35, 0x31, 0x78, 0x38, 0x45, 0x63, 0x53, 0x63, 0x54, 0x71, 0x6f, - 0x36, 0x36, 0x69, 0x33, 0x52, 0x6b, 0x2f, 0x43, 0x48, 0x57, 0x47, 0x6d, 0x76, 0x76, 0x5a, 0x69, 0x37, 0x65, - 0x72, 0x51, 0x32, 0x41, 0x45, 0x44, 0x59, 0x43, 0x77, 0x64, 0x2f, 0x41, 0x39, 0x72, 0x46, 0x2f, 0x39, 0x68, - 0x31, 0x5c, 0x0a, - 0x09, 0x6c, 0x51, 0x47, 0x49, 0x72, 0x4b, 0x42, 0x47, 0x77, 0x32, 0x64, 0x66, 0x64, 0x42, 0x37, 0x36, 0x2f, - 0x62, 0x46, 0x34, 0x65, 0x6d, 0x46, 0x2b, 0x48, 0x74, 0x64, 0x64, 0x65, 0x31, 0x30, 0x56, 0x35, 0x58, 0x4e, - 0x30, 0x75, 0x78, 0x31, 0x30, 0x75, 0x7a, 0x31, 0x30, 0x77, 0x6e, 0x53, 0x67, 0x57, 0x68, 0x50, 0x6f, 0x64, - 0x50, 0x49, 0x59, 0x67, 0x54, 0x70, 0x64, 0x6e, 0x79, 0x6e, 0x6b, 0x65, 0x59, 0x34, 0x73, 0x58, 0x4b, 0x39, - 0x41, 0x5c, 0x0a, - 0x09, 0x49, 0x45, 0x51, 0x65, 0x4d, 0x52, 0x33, 0x49, 0x4d, 0x6b, 0x44, 0x4e, 0x4e, 0x65, 0x75, 0x37, 0x41, - 0x79, 0x79, 0x79, 0x5a, 0x6d, 0x79, 0x56, 0x4f, 0x56, 0x4d, 0x70, 0x70, 0x77, 0x61, 0x42, 0x53, 0x6f, 0x6c, - 0x31, 0x35, 0x4f, 0x48, 0x7a, 0x53, 0x32, 0x39, 0x6b, 0x59, 0x54, 0x6f, 0x51, 0x72, 0x78, 0x45, 0x6c, 0x78, - 0x68, 0x55, 0x2b, 0x39, 0x53, 0x37, 0x4b, 0x79, 0x63, 0x6b, 0x4a, 0x2f, 0x4f, 0x43, 0x46, 0x35, 0x36, 0x52, - 0x36, 0x5c, 0x0a, - 0x09, 0x53, 0x46, 0x61, 0x61, 0x30, 0x33, 0x6d, 0x39, 0x69, 0x46, 0x53, 0x36, 0x44, 0x76, 0x45, 0x79, 0x6e, - 0x74, 0x64, 0x6e, 0x58, 0x66, 0x77, 0x6b, 0x77, 0x63, 0x38, 0x33, 0x72, 0x37, 0x6b, 0x61, 0x68, 0x32, 0x64, - 0x6d, 0x4a, 0x41, 0x68, 0x55, 0x43, 0x34, 0x4f, 0x64, 0x62, 0x69, 0x39, 0x6d, 0x42, 0x78, 0x59, 0x49, 0x45, - 0x46, 0x47, 0x38, 0x6c, 0x56, 0x68, 0x6e, 0x41, 0x33, 0x56, 0x6b, 0x62, 0x31, 0x77, 0x59, 0x44, 0x4a, 0x6c, - 0x41, 0x5c, 0x0a, - 0x09, 0x58, 0x6a, 0x2f, 0x65, 0x37, 0x66, 0x58, 0x68, 0x6e, 0x58, 0x6f, 0x6b, 0x43, 0x49, 0x54, 0x73, 0x72, - 0x4c, 0x70, 0x46, 0x4b, 0x50, 0x50, 0x52, 0x4f, 0x71, 0x72, 0x48, 0x4b, 0x51, 0x55, 0x58, 0x44, 0x64, 0x4e, - 0x64, 0x33, 0x48, 0x2f, 0x41, 0x4d, 0x72, 0x2b, 0x7a, 0x7a, 0x7a, 0x6b, 0x62, 0x33, 0x2f, 0x2f, 0x6f, 0x4d, - 0x36, 0x41, 0x61, 0x54, 0x57, 0x33, 0x63, 0x6d, 0x6d, 0x4c, 0x5a, 0x30, 0x36, 0x37, 0x6a, 0x45, 0x69, 0x5a, - 0x57, 0x5c, 0x0a, - 0x09, 0x6d, 0x56, 0x59, 0x66, 0x41, 0x48, 0x78, 0x6b, 0x6e, 0x42, 0x62, 0x7a, 0x53, 0x5a, 0x59, 0x71, 0x65, - 0x57, 0x4b, 0x47, 0x79, 0x41, 0x63, 0x65, 0x55, 0x30, 0x35, 0x2f, 0x2f, 0x71, 0x54, 0x6a, 0x70, 0x76, 0x42, - 0x6a, 0x7a, 0x33, 0x39, 0x32, 0x76, 0x64, 0x42, 0x43, 0x77, 0x4e, 0x56, 0x66, 0x2f, 0x54, 0x66, 0x4d, 0x7a, - 0x42, 0x78, 0x43, 0x6e, 0x6e, 0x65, 0x52, 0x64, 0x37, 0x73, 0x2b, 0x45, 0x2b, 0x6a, 0x32, 0x2f, 0x4a, 0x70, - 0x41, 0x5c, 0x0a, - 0x09, 0x74, 0x52, 0x62, 0x51, 0x79, 0x61, 0x76, 0x50, 0x63, 0x4b, 0x75, 0x77, 0x30, 0x30, 0x47, 0x6e, 0x4d, - 0x71, 0x69, 0x73, 0x57, 0x69, 0x76, 0x67, 0x68, 0x74, 0x66, 0x70, 0x2b, 0x46, 0x64, 0x37, 0x35, 0x39, 0x56, - 0x4c, 0x4c, 0x50, 0x49, 0x71, 0x46, 0x59, 0x32, 0x5a, 0x41, 0x49, 0x46, 0x6c, 0x41, 0x74, 0x55, 0x35, 0x49, - 0x42, 0x6f, 0x61, 0x77, 0x4e, 0x63, 0x45, 0x58, 0x42, 0x77, 0x57, 0x6f, 0x45, 0x41, 0x67, 0x52, 0x68, 0x36, - 0x65, 0x5c, 0x0a, - 0x09, 0x42, 0x64, 0x53, 0x66, 0x56, 0x45, 0x57, 0x65, 0x69, 0x49, 0x47, 0x6f, 0x6e, 0x5a, 0x4e, 0x76, 0x65, - 0x49, 0x6b, 0x70, 0x61, 0x58, 0x58, 0x74, 0x52, 0x35, 0x2f, 0x37, 0x4c, 0x4f, 0x7a, 0x5a, 0x74, 0x6f, 0x58, - 0x4a, 0x47, 0x2f, 0x4b, 0x59, 0x4c, 0x2f, 0x54, 0x70, 0x4e, 0x4c, 0x54, 0x4b, 0x5a, 0x4f, 0x7a, 0x4e, 0x4b, - 0x6c, 0x77, 0x76, 0x33, 0x6f, 0x43, 0x66, 0x2b, 0x2f, 0x68, 0x7a, 0x63, 0x4f, 0x72, 0x65, 0x76, 0x57, 0x49, - 0x75, 0x5c, 0x0a, - 0x09, 0x66, 0x4d, 0x58, 0x6e, 0x50, 0x77, 0x38, 0x43, 0x6f, 0x64, 0x76, 0x31, 0x47, 0x56, 0x61, 0x6e, 0x36, - 0x38, 0x47, 0x67, 0x6d, 0x33, 0x66, 0x51, 0x71, 0x62, 0x49, 0x79, 0x6e, 0x51, 0x6e, 0x6b, 0x56, 0x54, 0x59, - 0x47, 0x71, 0x6d, 0x2f, 0x4e, 0x69, 0x6b, 0x79, 0x67, 0x41, 0x75, 0x7a, 0x77, 0x58, 0x59, 0x42, 0x41, 0x70, - 0x71, 0x63, 0x44, 0x66, 0x6d, 0x6f, 0x58, 0x30, 0x33, 0x7a, 0x6f, 0x57, 0x34, 0x51, 0x79, 0x75, 0x2b, 0x49, - 0x4c, 0x5c, 0x0a, - 0x09, 0x67, 0x33, 0x6d, 0x79, 0x4e, 0x6c, 0x50, 0x72, 0x78, 0x47, 0x63, 0x4d, 0x4b, 0x53, 0x42, 0x62, 0x49, - 0x41, 0x77, 0x48, 0x2f, 0x4f, 0x49, 0x4c, 0x6e, 0x34, 0x4e, 0x65, 0x4a, 0x34, 0x65, 0x77, 0x2b, 0x57, 0x53, - 0x36, 0x61, 0x30, 0x79, 0x7a, 0x4c, 0x46, 0x44, 0x32, 0x4e, 0x6e, 0x38, 0x49, 0x61, 0x30, 0x79, 0x72, 0x44, - 0x77, 0x42, 0x2b, 0x62, 0x4b, 0x55, 0x2b, 0x45, 0x57, 0x46, 0x52, 0x72, 0x77, 0x45, 0x45, 0x45, 0x6f, 0x41, - 0x52, 0x5c, 0x0a, - 0x09, 0x71, 0x6a, 0x69, 0x38, 0x39, 0x4a, 0x49, 0x6e, 0x59, 0x50, 0x75, 0x4f, 0x48, 0x53, 0x4a, 0x74, 0x2f, - 0x75, 0x54, 0x48, 0x2f, 0x77, 0x55, 0x4c, 0x43, 0x2f, 0x50, 0x6f, 0x56, 0x4b, 0x6c, 0x2b, 0x48, 0x66, 0x45, - 0x39, 0x43, 0x47, 0x52, 0x35, 0x57, 0x50, 0x33, 0x50, 0x34, 0x39, 0x32, 0x42, 0x76, 0x4a, 0x6f, 0x75, 0x35, - 0x4e, 0x58, 0x37, 0x42, 0x4d, 0x4c, 0x43, 0x59, 0x46, 0x77, 0x54, 0x43, 0x4f, 0x38, 0x51, 0x79, 0x41, 0x67, - 0x55, 0x5c, 0x0a, - 0x09, 0x4d, 0x67, 0x45, 0x4b, 0x61, 0x77, 0x4a, 0x5a, 0x73, 0x6b, 0x2f, 0x41, 0x41, 0x30, 0x4f, 0x34, 0x4a, - 0x56, 0x57, 0x39, 0x58, 0x30, 0x44, 0x73, 0x45, 0x36, 0x69, 0x4e, 0x52, 0x4b, 0x77, 0x4a, 0x78, 0x4d, 0x67, - 0x6a, 0x4d, 0x34, 0x48, 0x67, 0x31, 0x41, 0x46, 0x49, 0x39, 0x44, 0x36, 0x42, 0x63, 0x4d, 0x77, 0x58, 0x6e, - 0x51, 0x42, 0x67, 0x35, 0x36, 0x35, 0x64, 0x65, 0x4f, 0x6b, 0x6c, 0x54, 0x30, 0x72, 0x58, 0x55, 0x73, 0x51, - 0x71, 0x5c, 0x0a, - 0x09, 0x50, 0x39, 0x4c, 0x35, 0x66, 0x54, 0x77, 0x30, 0x73, 0x67, 0x44, 0x47, 0x71, 0x39, 0x62, 0x4c, 0x78, - 0x46, 0x67, 0x58, 0x4c, 0x33, 0x2f, 0x68, 0x38, 0x78, 0x6d, 0x6d, 0x45, 0x2b, 0x36, 0x39, 0x35, 0x79, 0x35, - 0x38, 0x34, 0x58, 0x4f, 0x66, 0x42, 0x5a, 0x43, 0x68, 0x32, 0x2f, 0x56, 0x37, 0x4d, 0x75, 0x70, 0x70, 0x57, - 0x67, 0x65, 0x64, 0x76, 0x42, 0x74, 0x54, 0x2f, 0x51, 0x41, 0x43, 0x65, 0x53, 0x64, 0x48, 0x4a, 0x2b, 0x67, - 0x6a, 0x5c, 0x0a, - 0x09, 0x79, 0x32, 0x4d, 0x57, 0x46, 0x64, 0x63, 0x4d, 0x71, 0x6b, 0x77, 0x67, 0x72, 0x42, 0x30, 0x63, 0x44, - 0x51, 0x68, 0x34, 0x55, 0x4b, 0x36, 0x6e, 0x57, 0x68, 0x47, 0x67, 0x72, 0x62, 0x73, 0x44, 0x51, 0x53, 0x63, - 0x55, 0x33, 0x67, 0x39, 0x52, 0x54, 0x77, 0x4c, 0x71, 0x6b, 0x64, 0x55, 0x4c, 0x74, 0x51, 0x46, 0x34, 0x2b, - 0x5a, 0x6f, 0x41, 0x76, 0x31, 0x50, 0x7a, 0x37, 0x42, 0x2b, 0x2b, 0x42, 0x45, 0x38, 0x35, 0x4a, 0x2f, 0x7a, - 0x61, 0x5c, 0x0a, - 0x09, 0x6e, 0x51, 0x5a, 0x5a, 0x37, 0x75, 0x54, 0x73, 0x32, 0x4a, 0x4a, 0x35, 0x4f, 0x4f, 0x39, 0x42, 0x35, - 0x4b, 0x62, 0x47, 0x4d, 0x71, 0x74, 0x45, 0x2b, 0x65, 0x74, 0x66, 0x2f, 0x2f, 0x70, 0x56, 0x62, 0x64, 0x44, - 0x64, 0x64, 0x7a, 0x50, 0x67, 0x67, 0x65, 0x56, 0x56, 0x49, 0x75, 0x6f, 0x49, 0x51, 0x37, 0x4a, 0x41, 0x51, - 0x45, 0x38, 0x44, 0x2f, 0x50, 0x48, 0x6b, 0x57, 0x41, 0x2f, 0x62, 0x6a, 0x7a, 0x38, 0x52, 0x6c, 0x33, 0x33, - 0x6d, 0x5c, 0x0a, - 0x09, 0x69, 0x37, 0x48, 0x6b, 0x63, 0x4c, 0x43, 0x4d, 0x57, 0x32, 0x37, 0x36, 0x44, 0x6e, 0x62, 0x76, 0x33, - 0x6f, 0x4d, 0x74, 0x57, 0x36, 0x65, 0x71, 0x64, 0x6c, 0x46, 0x50, 0x4e, 0x79, 0x71, 0x42, 0x65, 0x34, 0x66, - 0x78, 0x62, 0x59, 0x56, 0x6e, 0x2b, 0x6f, 0x4e, 0x79, 0x48, 0x4f, 0x72, 0x55, 0x73, 0x48, 0x37, 0x71, 0x69, - 0x37, 0x33, 0x6f, 0x6f, 0x7a, 0x70, 0x32, 0x6a, 0x6b, 0x66, 0x72, 0x63, 0x4f, 0x79, 0x64, 0x31, 0x6a, 0x39, - 0x41, 0x5c, 0x0a, - 0x09, 0x78, 0x4d, 0x63, 0x6b, 0x30, 0x30, 0x33, 0x2b, 0x50, 0x62, 0x79, 0x43, 0x4c, 0x46, 0x42, 0x34, 0x6b, - 0x30, 0x33, 0x74, 0x33, 0x4b, 0x7a, 0x39, 0x77, 0x44, 0x59, 0x54, 0x52, 0x57, 0x77, 0x33, 0x66, 0x4b, 0x2f, - 0x2b, 0x76, 0x65, 0x6e, 0x56, 0x76, 0x34, 0x42, 0x48, 0x6e, 0x58, 0x36, 0x43, 0x6a, 0x50, 0x5a, 0x31, 0x35, - 0x79, 0x49, 0x61, 0x4c, 0x53, 0x30, 0x58, 0x75, 0x50, 0x7a, 0x71, 0x37, 0x2b, 0x44, 0x50, 0x2f, 0x75, 0x6d, - 0x7a, 0x5c, 0x0a, - 0x09, 0x2b, 0x50, 0x4f, 0x50, 0x66, 0x68, 0x6f, 0x66, 0x2b, 0x75, 0x51, 0x56, 0x2b, 0x4f, 0x71, 0x4e, 0x64, - 0x77, 0x4a, 0x35, 0x44, 0x36, 0x66, 0x75, 0x6e, 0x4a, 0x5a, 0x70, 0x72, 0x37, 0x67, 0x4e, 0x4b, 0x50, 0x56, - 0x31, 0x35, 0x73, 0x6d, 0x37, 0x38, 0x65, 0x33, 0x37, 0x5a, 0x6e, 0x48, 0x44, 0x6a, 0x64, 0x2b, 0x4a, 0x70, - 0x77, 0x38, 0x2b, 0x2b, 0x41, 0x42, 0x6d, 0x5a, 0x6d, 0x5a, 0x77, 0x2f, 0x50, 0x45, 0x6e, 0x6f, 0x74, 0x66, - 0x72, 0x5c, 0x0a, - 0x09, 0x65, 0x67, 0x6c, 0x56, 0x66, 0x4e, 0x63, 0x6a, 0x35, 0x45, 0x2f, 0x4a, 0x49, 0x55, 0x59, 0x37, 0x79, - 0x6f, 0x68, 0x6a, 0x47, 0x67, 0x50, 0x41, 0x71, 0x6b, 0x35, 0x47, 0x6c, 0x54, 0x77, 0x71, 0x4f, 0x56, 0x66, - 0x6a, 0x35, 0x32, 0x56, 0x41, 0x74, 0x5a, 0x61, 0x53, 0x36, 0x52, 0x68, 0x62, 0x58, 0x37, 0x47, 0x75, 0x68, - 0x65, 0x73, 0x31, 0x4b, 0x4e, 0x65, 0x36, 0x63, 0x47, 0x43, 0x4c, 0x75, 0x45, 0x7a, 0x32, 0x6e, 0x45, 0x34, - 0x2f, 0x5c, 0x0a, - 0x09, 0x63, 0x41, 0x42, 0x76, 0x76, 0x66, 0x52, 0x46, 0x6d, 0x4f, 0x68, 0x33, 0x70, 0x65, 0x79, 0x31, 0x6a, - 0x53, 0x76, 0x62, 0x53, 0x4c, 0x4b, 0x44, 0x64, 0x46, 0x72, 0x77, 0x64, 0x6a, 0x6a, 0x38, 0x47, 0x2b, 0x30, - 0x2b, 0x44, 0x57, 0x74, 0x46, 0x61, 0x77, 0x4d, 0x41, 0x52, 0x41, 0x73, 0x67, 0x65, 0x69, 0x57, 0x63, 0x36, - 0x39, 0x56, 0x47, 0x79, 0x49, 0x79, 0x49, 0x4b, 0x52, 0x38, 0x49, 0x78, 0x32, 0x42, 0x47, 0x44, 0x49, 0x47, - 0x61, 0x5c, 0x0a, - 0x09, 0x5a, 0x35, 0x32, 0x79, 0x42, 0x34, 0x66, 0x51, 0x78, 0x56, 0x56, 0x58, 0x58, 0x78, 0x63, 0x56, 0x50, - 0x31, 0x77, 0x65, 0x34, 0x73, 0x5a, 0x76, 0x58, 0x34, 0x2b, 0x5a, 0x77, 0x34, 0x63, 0x41, 0x2b, 0x44, 0x63, - 0x43, 0x39, 0x63, 0x62, 0x36, 0x63, 0x59, 0x48, 0x46, 0x4c, 0x2b, 0x52, 0x41, 0x4b, 0x4d, 0x32, 0x4a, 0x71, - 0x45, 0x68, 0x77, 0x42, 0x4a, 0x41, 0x6a, 0x31, 0x6e, 0x30, 0x77, 0x54, 0x76, 0x38, 0x51, 0x6b, 0x4c, 0x43, - 0x76, 0x5c, 0x0a, - 0x09, 0x47, 0x50, 0x49, 0x63, 0x77, 0x6a, 0x71, 0x79, 0x42, 0x34, 0x48, 0x4b, 0x75, 0x4b, 0x67, 0x32, 0x59, - 0x71, 0x6c, 0x6e, 0x5a, 0x6e, 0x78, 0x73, 0x45, 0x51, 0x71, 0x78, 0x36, 0x64, 0x43, 0x4a, 0x42, 0x42, 0x6b, - 0x69, 0x38, 0x6e, 0x76, 0x56, 0x6c, 0x63, 0x48, 0x78, 0x68, 0x31, 0x46, 0x65, 0x2f, 0x4d, 0x49, 0x66, 0x77, - 0x30, 0x75, 0x65, 0x66, 0x6f, 0x47, 0x55, 0x72, 0x54, 0x6c, 0x33, 0x42, 0x36, 0x36, 0x34, 0x2f, 0x6e, 0x62, - 0x38, 0x5c, 0x0a, - 0x09, 0x38, 0x75, 0x2b, 0x2f, 0x48, 0x33, 0x2f, 0x2b, 0x77, 0x51, 0x2f, 0x6a, 0x32, 0x75, 0x75, 0x2b, 0x69, - 0x64, 0x74, 0x75, 0x76, 0x77, 0x31, 0x33, 0x33, 0x6e, 0x45, 0x58, 0x72, 0x76, 0x33, 0x47, 0x4e, 0x2f, 0x45, - 0x50, 0x6c, 0x2f, 0x30, 0x72, 0x76, 0x6e, 0x6a, 0x39, 0x48, 0x54, 0x6a, 0x37, 0x6a, 0x50, 0x33, 0x59, 0x4f, - 0x61, 0x56, 0x2b, 0x74, 0x6c, 0x37, 0x72, 0x70, 0x6a, 0x72, 0x38, 0x33, 0x72, 0x50, 0x50, 0x77, 0x47, 0x65, - 0x76, 0x5c, 0x0a, - 0x09, 0x76, 0x67, 0x48, 0x33, 0x33, 0x2f, 0x39, 0x41, 0x50, 0x48, 0x2f, 0x34, 0x30, 0x43, 0x46, 0x38, 0x2b, - 0x31, 0x76, 0x66, 0x42, 0x43, 0x6a, 0x44, 0x32, 0x4e, 0x67, 0x59, 0x78, 0x73, 0x62, 0x36, 0x55, 0x54, 0x5a, - 0x78, 0x78, 0x50, 0x71, 0x42, 0x70, 0x69, 0x44, 0x6e, 0x49, 0x41, 0x58, 0x4c, 0x53, 0x51, 0x49, 0x41, 0x4f, - 0x74, 0x6e, 0x47, 0x4b, 0x42, 0x43, 0x51, 0x2f, 0x4d, 0x70, 0x33, 0x4b, 0x46, 0x6a, 0x72, 0x4e, 0x52, 0x34, - 0x45, 0x5c, 0x0a, - 0x09, 0x4d, 0x70, 0x51, 0x49, 0x75, 0x79, 0x2b, 0x6a, 0x4a, 0x71, 0x72, 0x72, 0x69, 0x4c, 0x6f, 0x49, 0x59, - 0x45, 0x42, 0x45, 0x32, 0x4c, 0x48, 0x6a, 0x4f, 0x4c, 0x7a, 0x6e, 0x64, 0x5a, 0x66, 0x69, 0x31, 0x4a, 0x31, - 0x54, 0x4b, 0x73, 0x67, 0x5a, 0x6c, 0x47, 0x77, 0x4f, 0x34, 0x73, 0x4e, 0x4d, 0x6e, 0x50, 0x38, 0x42, 0x4f, - 0x50, 0x63, 0x53, 0x41, 0x49, 0x4f, 0x31, 0x42, 0x49, 0x42, 0x56, 0x66, 0x78, 0x6a, 0x49, 0x37, 0x31, 0x78, - 0x79, 0x5c, 0x0a, - 0x09, 0x41, 0x50, 0x41, 0x52, 0x67, 0x48, 0x34, 0x6f, 0x69, 0x66, 0x5a, 0x4a, 0x5a, 0x45, 0x45, 0x4b, 0x43, - 0x49, 0x41, 0x55, 0x6c, 0x48, 0x4d, 0x59, 0x46, 0x41, 0x36, 0x76, 0x2f, 0x37, 0x4f, 0x2f, 0x78, 0x34, 0x63, - 0x2b, 0x2f, 0x42, 0x47, 0x42, 0x78, 0x76, 0x79, 0x7a, 0x31, 0x2b, 0x39, 0x68, 0x32, 0x2f, 0x62, 0x6a, 0x73, - 0x48, 0x56, 0x36, 0x47, 0x75, 0x50, 0x6a, 0x34, 0x2b, 0x6a, 0x31, 0x65, 0x76, 0x55, 0x74, 0x77, 0x36, 0x7a, - 0x61, 0x5c, 0x0a, - 0x09, 0x54, 0x31, 0x34, 0x4d, 0x4d, 0x52, 0x7a, 0x36, 0x68, 0x34, 0x57, 0x47, 0x52, 0x65, 0x46, 0x66, 0x4c, - 0x6a, 0x6f, 0x73, 0x55, 0x4a, 0x62, 0x56, 0x67, 0x79, 0x6e, 0x56, 0x51, 0x30, 0x54, 0x44, 0x34, 0x54, 0x4b, - 0x41, 0x2b, 0x6b, 0x57, 0x6a, 0x5a, 0x56, 0x6d, 0x4b, 0x46, 0x31, 0x6a, 0x57, 0x44, 0x78, 0x43, 0x56, 0x37, - 0x47, 0x65, 0x6f, 0x79, 0x75, 0x70, 0x52, 0x34, 0x6b, 0x6f, 0x57, 0x37, 0x46, 0x48, 0x69, 0x4d, 0x48, 0x51, - 0x41, 0x5c, 0x0a, - 0x09, 0x79, 0x57, 0x76, 0x49, 0x2b, 0x51, 0x4d, 0x72, 0x44, 0x67, 0x36, 0x75, 0x4b, 0x4f, 0x76, 0x73, 0x68, - 0x4b, 0x30, 0x4a, 0x65, 0x4c, 0x48, 0x34, 0x38, 0x79, 0x39, 0x34, 0x33, 0x72, 0x50, 0x77, 0x75, 0x70, 0x2f, - 0x36, 0x59, 0x58, 0x51, 0x37, 0x32, 0x51, 0x6a, 0x44, 0x38, 0x68, 0x55, 0x2f, 0x63, 0x50, 0x6c, 0x58, 0x38, - 0x61, 0x61, 0x33, 0x76, 0x68, 0x76, 0x44, 0x34, 0x52, 0x41, 0x6e, 0x37, 0x7a, 0x30, 0x56, 0x7a, 0x33, 0x76, - 0x36, 0x5c, 0x0a, - 0x09, 0x78, 0x54, 0x6a, 0x33, 0x59, 0x61, 0x64, 0x69, 0x57, 0x4a, 0x53, 0x34, 0x38, 0x76, 0x71, 0x62, 0x38, - 0x44, 0x63, 0x66, 0x2b, 0x53, 0x63, 0x38, 0x65, 0x50, 0x38, 0x44, 0x6d, 0x4a, 0x71, 0x65, 0x78, 0x6e, 0x2f, - 0x2f, 0x39, 0x66, 0x38, 0x58, 0x54, 0x7a, 0x37, 0x37, 0x4e, 0x4d, 0x6d, 0x77, 0x70, 0x52, 0x4d, 0x41, 0x4e, - 0x39, 0x38, 0x33, 0x67, 0x35, 0x39, 0x2f, 0x77, 0x7a, 0x76, 0x77, 0x6e, 0x65, 0x6f, 0x33, 0x41, 0x66, 0x68, - 0x30, 0x5c, 0x0a, - 0x09, 0x68, 0x6b, 0x41, 0x59, 0x47, 0x78, 0x2f, 0x48, 0x38, 0x53, 0x65, 0x64, 0x6a, 0x4b, 0x6e, 0x70, 0x61, - 0x55, 0x78, 0x4f, 0x62, 0x45, 0x46, 0x76, 0x72, 0x49, 0x64, 0x4f, 0x70, 0x34, 0x4f, 0x79, 0x4c, 0x46, 0x45, - 0x4d, 0x68, 0x2f, 0x48, 0x68, 0x6f, 0x4f, 0x46, 0x77, 0x57, 0x4c, 0x33, 0x67, 0x74, 0x66, 0x43, 0x2f, 0x2f, - 0x56, 0x43, 0x57, 0x2f, 0x71, 0x47, 0x68, 0x30, 0x71, 0x47, 0x6f, 0x5a, 0x46, 0x2b, 0x57, 0x52, 0x61, 0x57, - 0x44, 0x5c, 0x0a, - 0x09, 0x45, 0x6b, 0x58, 0x31, 0x77, 0x42, 0x65, 0x63, 0x41, 0x38, 0x72, 0x71, 0x6f, 0x61, 0x50, 0x53, 0x77, - 0x54, 0x6e, 0x2f, 0x78, 0x43, 0x44, 0x58, 0x55, 0x2f, 0x6c, 0x64, 0x50, 0x45, 0x41, 0x55, 0x39, 0x42, 0x41, - 0x66, 0x45, 0x6f, 0x71, 0x5a, 0x59, 0x66, 0x71, 0x6f, 0x4e, 0x51, 0x41, 0x63, 0x76, 0x2b, 0x64, 0x34, 0x76, - 0x50, 0x4e, 0x31, 0x6c, 0x2b, 0x4b, 0x38, 0x66, 0x58, 0x75, 0x6b, 0x44, 0x75, 0x4b, 0x55, 0x53, 0x67, 0x55, - 0x35, 0x5c, 0x0a, - 0x09, 0x50, 0x67, 0x31, 0x57, 0x41, 0x4a, 0x33, 0x6f, 0x30, 0x4c, 0x6b, 0x66, 0x41, 0x2f, 0x42, 0x42, 0x59, - 0x47, 0x30, 0x66, 0x43, 0x6c, 0x71, 0x54, 0x70, 0x77, 0x48, 0x39, 0x63, 0x77, 0x42, 0x30, 0x4d, 0x59, 0x43, - 0x50, 0x43, 0x32, 0x46, 0x6f, 0x45, 0x67, 0x36, 0x66, 0x48, 0x43, 0x52, 0x43, 0x47, 0x53, 0x77, 0x58, 0x65, - 0x4d, 0x39, 0x48, 0x50, 0x34, 0x73, 0x2f, 0x2f, 0x4f, 0x4f, 0x2f, 0x45, 0x4b, 0x2f, 0x63, 0x53, 0x74, 0x42, - 0x5a, 0x5c, 0x0a, - 0x09, 0x55, 0x59, 0x6a, 0x2b, 0x6e, 0x54, 0x78, 0x48, 0x74, 0x39, 0x39, 0x48, 0x72, 0x39, 0x2f, 0x33, 0x69, - 0x30, 0x7a, 0x38, 0x78, 0x61, 0x47, 0x35, 0x33, 0x4b, 0x77, 0x44, 0x49, 0x50, 0x36, 0x57, 0x58, 0x48, 0x67, - 0x69, 0x7a, 0x62, 0x50, 0x6b, 0x2f, 0x43, 0x75, 0x6e, 0x79, 0x62, 0x2f, 0x53, 0x4f, 0x72, 0x7a, 0x31, 0x70, - 0x6e, 0x37, 0x6d, 0x33, 0x37, 0x47, 0x33, 0x43, 0x66, 0x6b, 0x6e, 0x45, 0x50, 0x6e, 0x38, 0x75, 0x2b, 0x53, - 0x4f, 0x5c, 0x0a, - 0x09, 0x62, 0x72, 0x77, 0x6e, 0x67, 0x45, 0x65, 0x59, 0x4f, 0x72, 0x44, 0x56, 0x42, 0x70, 0x68, 0x6e, 0x47, - 0x56, 0x37, 0x78, 0x73, 0x7a, 0x2b, 0x46, 0x6c, 0x2f, 0x2f, 0x67, 0x45, 0x2b, 0x73, 0x35, 0x72, 0x6b, 0x34, - 0x66, 0x6d, 0x58, 0x46, 0x39, 0x38, 0x4e, 0x4e, 0x58, 0x34, 0x6a, 0x64, 0x2f, 0x37, 0x77, 0x2f, 0x67, 0x34, - 0x50, 0x43, 0x66, 0x58, 0x2f, 0x41, 0x38, 0x76, 0x4f, 0x6f, 0x46, 0x33, 0x31, 0x38, 0x2f, 0x49, 0x56, 0x69, - 0x56, 0x5c, 0x0a, - 0x09, 0x75, 0x66, 0x2f, 0x77, 0x41, 0x6e, 0x37, 0x6a, 0x66, 0x58, 0x2b, 0x44, 0x54, 0x31, 0x7a, 0x2b, 0x53, - 0x66, 0x54, 0x37, 0x59, 0x2f, 0x6a, 0x54, 0x74, 0x2f, 0x77, 0x47, 0x48, 0x6e, 0x76, 0x67, 0x70, 0x46, 0x51, - 0x48, 0x71, 0x5a, 0x48, 0x69, 0x33, 0x70, 0x6c, 0x35, 0x2f, 0x4e, 0x71, 0x37, 0x2f, 0x69, 0x63, 0x2b, 0x38, - 0x39, 0x6e, 0x50, 0x43, 0x66, 0x6e, 0x72, 0x34, 0x37, 0x71, 0x4b, 0x77, 0x2f, 0x6a, 0x45, 0x4f, 0x4d, 0x62, - 0x47, 0x5c, 0x0a, - 0x09, 0x4a, 0x39, 0x45, 0x62, 0x36, 0x79, 0x48, 0x50, 0x71, 0x6c, 0x75, 0x33, 0x6d, 0x63, 0x2b, 0x43, 0x73, - 0x71, 0x78, 0x2b, 0x34, 0x57, 0x64, 0x5a, 0x44, 0x72, 0x33, 0x6f, 0x55, 0x44, 0x6c, 0x6f, 0x36, 0x65, 0x4a, - 0x6a, 0x32, 0x6d, 0x56, 0x52, 0x6f, 0x75, 0x42, 0x50, 0x45, 0x51, 0x59, 0x39, 0x4f, 0x48, 0x38, 0x39, 0x50, - 0x46, 0x48, 0x6f, 0x66, 0x2f, 0x75, 0x78, 0x65, 0x6d, 0x53, 0x34, 0x65, 0x6e, 0x4b, 0x7a, 0x72, 0x4f, 0x62, - 0x7a, 0x5c, 0x0a, - 0x09, 0x34, 0x49, 0x37, 0x4f, 0x5a, 0x4f, 0x31, 0x56, 0x6b, 0x6a, 0x36, 0x69, 0x7a, 0x73, 0x64, 0x78, 0x34, - 0x59, 0x55, 0x58, 0x34, 0x49, 0x30, 0x76, 0x2b, 0x33, 0x39, 0x77, 0x79, 0x6e, 0x46, 0x68, 0x43, 0x73, 0x70, - 0x74, 0x52, 0x30, 0x55, 0x6e, 0x64, 0x68, 0x64, 0x46, 0x67, 0x49, 0x4b, 0x75, 0x56, 0x2b, 0x76, 0x78, 0x74, - 0x51, 0x42, 0x2b, 0x42, 0x31, 0x6a, 0x37, 0x4a, 0x77, 0x4c, 0x58, 0x43, 0x41, 0x41, 0x2b, 0x46, 0x56, 0x44, - 0x77, 0x5c, 0x0a, - 0x09, 0x44, 0x2b, 0x48, 0x77, 0x38, 0x6b, 0x59, 0x41, 0x41, 0x47, 0x79, 0x45, 0x62, 0x4b, 0x4a, 0x4b, 0x55, - 0x56, 0x66, 0x64, 0x66, 0x41, 0x2f, 0x65, 0x2b, 0x63, 0x47, 0x50, 0x34, 0x74, 0x50, 0x2f, 0x2b, 0x74, 0x6e, - 0x71, 0x4e, 0x4d, 0x73, 0x68, 0x6f, 0x59, 0x41, 0x67, 0x4f, 0x46, 0x43, 0x59, 0x35, 0x79, 0x6c, 0x6c, 0x57, - 0x34, 0x2f, 0x57, 0x38, 0x68, 0x52, 0x50, 0x37, 0x38, 0x50, 0x58, 0x6b, 0x56, 0x6c, 0x38, 0x68, 0x7a, 0x4a, - 0x32, 0x5c, 0x0a, - 0x09, 0x42, 0x6b, 0x59, 0x38, 0x4d, 0x75, 0x71, 0x32, 0x72, 0x4c, 0x4c, 0x68, 0x48, 0x44, 0x2f, 0x2b, 0x33, - 0x73, 0x63, 0x39, 0x44, 0x71, 0x2f, 0x36, 0x79, 0x65, 0x66, 0x67, 0x30, 0x65, 0x47, 0x4a, 0x76, 0x35, 0x69, - 0x61, 0x75, 0x2f, 0x71, 0x59, 0x79, 0x58, 0x4e, 0x70, 0x4d, 0x4d, 0x52, 0x50, 0x2f, 0x4e, 0x59, 0x37, 0x63, - 0x65, 0x58, 0x58, 0x72, 0x73, 0x4c, 0x4c, 0x66, 0x2b, 0x59, 0x6e, 0x38, 0x63, 0x76, 0x50, 0x66, 0x51, 0x71, - 0x4c, 0x5c, 0x0a, - 0x09, 0x54, 0x74, 0x57, 0x67, 0x71, 0x2b, 0x2b, 0x4c, 0x67, 0x77, 0x4b, 0x2f, 0x39, 0x74, 0x36, 0x2f, 0x78, - 0x54, 0x2f, 0x2b, 0x30, 0x37, 0x2f, 0x67, 0x42, 0x63, 0x39, 0x37, 0x46, 0x74, 0x37, 0x34, 0x6b, 0x6d, 0x64, - 0x42, 0x47, 0x71, 0x2f, 0x57, 0x51, 0x31, 0x31, 0x33, 0x65, 0x65, 0x6a, 0x77, 0x56, 0x35, 0x2f, 0x36, 0x4e, - 0x37, 0x7a, 0x33, 0x41, 0x78, 0x2f, 0x43, 0x76, 0x66, 0x66, 0x65, 0x6b, 0x77, 0x4b, 0x61, 0x6d, 0x6d, 0x4e, - 0x7a, 0x5c, 0x0a, - 0x09, 0x30, 0x6d, 0x4d, 0x56, 0x4c, 0x34, 0x49, 0x4a, 0x75, 0x6c, 0x56, 0x74, 0x52, 0x62, 0x41, 0x33, 0x5a, - 0x4b, 0x6a, 0x50, 0x6a, 0x36, 0x7a, 0x50, 0x35, 0x43, 0x76, 0x4b, 0x61, 0x6a, 0x4e, 0x6b, 0x2f, 0x6e, 0x7a, - 0x4b, 0x33, 0x6c, 0x50, 0x78, 0x34, 0x68, 0x63, 0x38, 0x43, 0x79, 0x39, 0x34, 0x34, 0x71, 0x50, 0x51, 0x36, - 0x32, 0x59, 0x69, 0x4f, 0x78, 0x4e, 0x52, 0x33, 0x33, 0x4c, 0x73, 0x30, 0x46, 0x6a, 0x55, 0x6d, 0x37, 0x36, - 0x47, 0x5c, 0x0a, - 0x09, 0x65, 0x2b, 0x44, 0x63, 0x79, 0x77, 0x46, 0x38, 0x47, 0x46, 0x69, 0x66, 0x78, 0x34, 0x48, 0x58, 0x37, - 0x48, 0x30, 0x41, 0x31, 0x59, 0x35, 0x41, 0x41, 0x74, 0x46, 0x76, 0x41, 0x48, 0x67, 0x4e, 0x67, 0x44, 0x45, - 0x7a, 0x55, 0x76, 0x45, 0x55, 0x56, 0x36, 0x52, 0x46, 0x47, 0x6a, 0x32, 0x68, 0x36, 0x67, 0x46, 0x58, 0x33, - 0x33, 0x49, 0x50, 0x50, 0x76, 0x36, 0x56, 0x61, 0x33, 0x48, 0x31, 0x4e, 0x32, 0x2f, 0x45, 0x31, 0x36, 0x36, - 0x38, 0x5c, 0x0a, - 0x09, 0x45, 0x76, 0x4e, 0x7a, 0x38, 0x37, 0x36, 0x59, 0x4d, 0x6a, 0x54, 0x4c, 0x43, 0x48, 0x57, 0x30, 0x31, - 0x32, 0x2f, 0x62, 0x43, 0x65, 0x30, 0x6b, 0x42, 0x74, 0x70, 0x77, 0x72, 0x6a, 0x70, 0x68, 0x41, 0x6b, 0x6d, - 0x43, 0x61, 0x58, 0x47, 0x38, 0x61, 0x61, 0x54, 0x55, 0x6b, 0x65, 0x66, 0x6b, 0x55, 0x30, 0x2f, 0x42, 0x45, - 0x79, 0x39, 0x34, 0x4c, 0x4a, 0x37, 0x35, 0x2b, 0x50, 0x4e, 0x78, 0x77, 0x52, 0x6b, 0x6e, 0x48, 0x52, 0x31, - 0x51, 0x5c, 0x0a, - 0x09, 0x73, 0x6b, 0x37, 0x6d, 0x42, 0x30, 0x50, 0x38, 0x30, 0x35, 0x65, 0x2b, 0x69, 0x65, 0x64, 0x64, 0x64, - 0x4c, 0x62, 0x4d, 0x78, 0x41, 0x77, 0x6a, 0x6e, 0x56, 0x74, 0x63, 0x78, 0x76, 0x2f, 0x2b, 0x30, 0x72, 0x56, - 0x34, 0x2f, 0x6b, 0x58, 0x6e, 0x2b, 0x73, 0x30, 0x36, 0x69, 0x58, 0x55, 0x37, 0x6f, 0x33, 0x35, 0x74, 0x30, - 0x45, 0x63, 0x57, 0x42, 0x76, 0x6a, 0x48, 0x4c, 0x31, 0x32, 0x4c, 0x54, 0x33, 0x33, 0x6c, 0x61, 0x6e, 0x7a, - 0x32, 0x5c, 0x0a, - 0x09, 0x63, 0x31, 0x2f, 0x41, 0x34, 0x75, 0x4c, 0x43, 0x69, 0x67, 0x41, 0x51, 0x78, 0x71, 0x33, 0x6c, 0x33, - 0x53, 0x68, 0x66, 0x41, 0x48, 0x71, 0x64, 0x51, 0x4c, 0x2b, 0x77, 0x77, 0x33, 0x78, 0x7a, 0x30, 0x67, 0x68, - 0x77, 0x48, 0x37, 0x58, 0x41, 0x35, 0x35, 0x7a, 0x44, 0x32, 0x57, 0x63, 0x2f, 0x45, 0x75, 0x65, 0x63, 0x39, - 0x58, 0x41, 0x38, 0x34, 0x64, 0x47, 0x50, 0x77, 0x42, 0x4d, 0x66, 0x63, 0x52, 0x72, 0x47, 0x2b, 0x39, 0x57, - 0x62, 0x5c, 0x0a, - 0x09, 0x70, 0x49, 0x38, 0x6d, 0x6c, 0x57, 0x66, 0x79, 0x54, 0x57, 0x30, 0x2f, 0x6e, 0x4d, 0x63, 0x69, 0x67, - 0x44, 0x66, 0x41, 0x34, 0x64, 0x32, 0x41, 0x76, 0x2f, 0x58, 0x33, 0x66, 0x2f, 0x30, 0x4c, 0x51, 0x64, 0x69, - 0x57, 0x59, 0x4d, 0x41, 0x2f, 0x45, 0x2f, 0x42, 0x6a, 0x41, 0x43, 0x34, 0x41, 0x38, 0x4d, 0x6a, 0x71, 0x62, - 0x7a, 0x52, 0x5a, 0x4b, 0x46, 0x71, 0x33, 0x78, 0x38, 0x6f, 0x41, 0x41, 0x47, 0x46, 0x78, 0x4d, 0x4d, 0x54, - 0x4e, 0x5c, 0x0a, - 0x09, 0x39, 0x78, 0x37, 0x43, 0x72, 0x66, 0x63, 0x66, 0x78, 0x45, 0x31, 0x33, 0x33, 0x49, 0x65, 0x37, 0x48, - 0x7a, 0x69, 0x49, 0x75, 0x2b, 0x2b, 0x37, 0x48, 0x33, 0x66, 0x64, 0x63, 0x78, 0x39, 0x75, 0x75, 0x66, 0x6b, - 0x57, 0x7a, 0x4d, 0x33, 0x4f, 0x2b, 0x69, 0x6f, 0x6a, 0x6f, 0x70, 0x43, 0x2b, 0x4c, 0x68, 0x79, 0x79, 0x41, - 0x55, 0x43, 0x53, 0x6c, 0x48, 0x65, 0x46, 0x7a, 0x4d, 0x4c, 0x4d, 0x54, 0x75, 0x42, 0x66, 0x73, 0x58, 0x33, - 0x36, 0x5c, 0x0a, - 0x09, 0x36, 0x61, 0x66, 0x6a, 0x31, 0x46, 0x4e, 0x50, 0x78, 0x72, 0x36, 0x54, 0x6a, 0x73, 0x65, 0x5a, 0x65, - 0x30, 0x2f, 0x43, 0x6d, 0x61, 0x63, 0x65, 0x6a, 0x34, 0x63, 0x64, 0x76, 0x78, 0x31, 0x5a, 0x54, 0x70, 0x45, - 0x6a, 0x51, 0x31, 0x42, 0x49, 0x6e, 0x48, 0x4a, 0x55, 0x78, 0x4e, 0x46, 0x31, 0x47, 0x36, 0x2f, 0x70, 0x6f, - 0x67, 0x31, 0x47, 0x4c, 0x71, 0x5a, 0x34, 0x64, 0x61, 0x67, 0x38, 0x73, 0x72, 0x43, 0x4d, 0x36, 0x32, 0x36, - 0x39, 0x5c, 0x0a, - 0x09, 0x42, 0x39, 0x66, 0x63, 0x64, 0x41, 0x65, 0x2b, 0x66, 0x65, 0x75, 0x64, 0x75, 0x4f, 0x58, 0x32, 0x4f, - 0x33, 0x44, 0x44, 0x74, 0x32, 0x2f, 0x45, 0x6f, 0x55, 0x4f, 0x48, 0x52, 0x41, 0x51, 0x58, 0x30, 0x64, 0x6c, - 0x79, 0x32, 0x42, 0x58, 0x6b, 0x7a, 0x6b, 0x48, 0x42, 0x63, 0x6d, 0x51, 0x74, 0x36, 0x33, 0x72, 0x6b, 0x73, - 0x72, 0x33, 0x6a, 0x54, 0x7a, 0x67, 0x42, 0x4a, 0x35, 0x39, 0x79, 0x45, 0x6b, 0x37, 0x63, 0x76, 0x51, 0x74, - 0x37, 0x5c, 0x0a, - 0x09, 0x64, 0x75, 0x37, 0x41, 0x33, 0x75, 0x4e, 0x33, 0x34, 0x66, 0x51, 0x54, 0x64, 0x32, 0x48, 0x2f, 0x43, - 0x54, 0x75, 0x77, 0x50, 0x66, 0x7a, 0x2b, 0x34, 0x71, 0x68, 0x46, 0x50, 0x43, 0x45, 0x58, 0x50, 0x67, 0x57, - 0x6f, 0x50, 0x32, 0x79, 0x51, 0x63, 0x41, 0x44, 0x6f, 0x43, 0x33, 0x44, 0x75, 0x38, 0x61, 0x47, 0x5a, 0x39, - 0x66, 0x79, 0x70, 0x73, 0x4c, 0x56, 0x2f, 0x49, 0x78, 0x42, 0x2f, 0x6e, 0x4e, 0x48, 0x33, 0x39, 0x57, 0x77, - 0x51, 0x5c, 0x0a, - 0x09, 0x2f, 0x5a, 0x30, 0x6f, 0x4a, 0x46, 0x4b, 0x76, 0x4a, 0x70, 0x52, 0x73, 0x4f, 0x4f, 0x5a, 0x6b, 0x47, - 0x58, 0x2b, 0x6c, 0x34, 0x4e, 0x6d, 0x46, 0x4a, 0x64, 0x78, 0x2f, 0x5a, 0x41, 0x47, 0x48, 0x35, 0x68, 0x5a, - 0x78, 0x61, 0x47, 0x34, 0x42, 0x68, 0x32, 0x63, 0x58, 0x4d, 0x4c, 0x65, 0x34, 0x69, 0x50, 0x6d, 0x46, 0x4a, - 0x53, 0x77, 0x73, 0x2b, 0x54, 0x66, 0x67, 0x7a, 0x43, 0x30, 0x73, 0x59, 0x6d, 0x46, 0x78, 0x43, 0x58, 0x4d, - 0x4c, 0x5c, 0x0a, - 0x09, 0x43, 0x31, 0x68, 0x65, 0x48, 0x6d, 0x4b, 0x32, 0x41, 0x67, 0x32, 0x41, 0x73, 0x4c, 0x43, 0x34, 0x69, - 0x4b, 0x58, 0x42, 0x4d, 0x67, 0x68, 0x2b, 0x76, 0x6e, 0x39, 0x6f, 0x70, 0x74, 0x36, 0x6a, 0x73, 0x57, 0x58, - 0x4c, 0x46, 0x6e, 0x53, 0x72, 0x7a, 0x55, 0x52, 0x45, 0x68, 0x4b, 0x31, 0x62, 0x4a, 0x6a, 0x30, 0x4c, 0x57, - 0x59, 0x61, 0x74, 0x6b, 0x35, 0x50, 0x59, 0x4d, 0x6a, 0x47, 0x4f, 0x79, 0x59, 0x6c, 0x78, 0x54, 0x49, 0x36, - 0x50, 0x5c, 0x0a, - 0x09, 0x59, 0x57, 0x4a, 0x38, 0x44, 0x4a, 0x4e, 0x6a, 0x66, 0x55, 0x79, 0x4f, 0x39, 0x37, 0x46, 0x39, 0x61, - 0x67, 0x76, 0x32, 0x62, 0x4e, 0x75, 0x4b, 0x48, 0x56, 0x76, 0x47, 0x73, 0x58, 0x74, 0x71, 0x41, 0x6d, 0x4f, - 0x39, 0x6a, 0x68, 0x79, 0x48, 0x64, 0x57, 0x7a, 0x4a, 0x69, 0x35, 0x2b, 0x72, 0x68, 0x53, 0x46, 0x6c, 0x6f, - 0x39, 0x76, 0x51, 0x35, 0x30, 0x33, 0x35, 0x42, 0x52, 0x6b, 0x61, 0x37, 0x57, 0x6b, 0x6a, 0x46, 0x39, 0x6b, - 0x61, 0x5c, 0x0a, - 0x09, 0x7a, 0x31, 0x42, 0x6b, 0x74, 0x6e, 0x4c, 0x76, 0x6f, 0x54, 0x6e, 0x63, 0x65, 0x33, 0x67, 0x57, 0x39, - 0x38, 0x33, 0x4d, 0x34, 0x39, 0x36, 0x44, 0x4d, 0x35, 0x69, 0x64, 0x58, 0x38, 0x54, 0x63, 0x34, 0x68, 0x4c, - 0x6d, 0x35, 0x68, 0x63, 0x78, 0x75, 0x37, 0x69, 0x49, 0x75, 0x64, 0x6c, 0x35, 0x7a, 0x4d, 0x37, 0x4e, 0x59, - 0x62, 0x62, 0x4b, 0x35, 0x67, 0x62, 0x4c, 0x79, 0x31, 0x68, 0x59, 0x58, 0x50, 0x49, 0x74, 0x4b, 0x62, 0x6c, - 0x76, 0x5c, 0x0a, - 0x09, 0x6d, 0x39, 0x34, 0x57, 0x58, 0x7a, 0x49, 0x79, 0x50, 0x6a, 0x36, 0x47, 0x58, 0x74, 0x66, 0x66, 0x68, - 0x75, 0x76, 0x32, 0x65, 0x68, 0x6a, 0x72, 0x39, 0x37, 0x46, 0x6c, 0x66, 0x42, 0x7a, 0x6a, 0x6b, 0x32, 0x50, - 0x59, 0x4f, 0x6a, 0x36, 0x4f, 0x69, 0x66, 0x45, 0x2b, 0x4a, 0x76, 0x6f, 0x39, 0x72, 0x34, 0x75, 0x78, 0x48, - 0x71, 0x61, 0x32, 0x54, 0x47, 0x44, 0x37, 0x6c, 0x6e, 0x48, 0x73, 0x6e, 0x4a, 0x72, 0x45, 0x63, 0x56, 0x76, - 0x47, 0x5c, 0x0a, - 0x09, 0x61, 0x39, 0x6b, 0x48, 0x6e, 0x67, 0x55, 0x77, 0x73, 0x6d, 0x79, 0x55, 0x6b, 0x35, 0x61, 0x54, 0x4d, - 0x36, 0x36, 0x74, 0x42, 0x42, 0x71, 0x65, 0x76, 0x67, 0x33, 0x67, 0x6a, 0x50, 0x56, 0x2b, 0x48, 0x79, 0x43, - 0x77, 0x44, 0x67, 0x44, 0x41, 0x71, 0x66, 0x70, 0x64, 0x77, 0x4a, 0x38, 0x45, 0x38, 0x4f, 0x63, 0x41, 0x6a, - 0x49, 0x69, 0x6c, 0x55, 0x6c, 0x73, 0x39, 0x58, 0x37, 0x58, 0x71, 0x48, 0x45, 0x33, 0x4b, 0x4e, 0x51, 0x49, - 0x59, 0x5c, 0x0a, - 0x09, 0x6d, 0x76, 0x73, 0x30, 0x2b, 0x6f, 0x75, 0x73, 0x4e, 0x44, 0x67, 0x6c, 0x70, 0x34, 0x5a, 0x46, 0x4f, - 0x65, 0x6b, 0x34, 0x49, 0x77, 0x43, 0x75, 0x61, 0x65, 0x70, 0x6a, 0x4f, 0x72, 0x49, 0x31, 0x31, 0x57, 0x67, - 0x79, 0x4f, 0x73, 0x4f, 0x68, 0x78, 0x64, 0x69, 0x4d, 0x61, 0x31, 0x59, 0x32, 0x4d, 0x56, 0x4c, 0x2b, 0x7a, - 0x42, 0x6d, 0x61, 0x6a, 0x46, 0x2b, 0x74, 0x49, 0x30, 0x67, 0x41, 0x55, 0x58, 0x77, 0x6c, 0x55, 0x30, 0x4c, - 0x47, 0x5c, 0x0a, - 0x09, 0x6f, 0x78, 0x6b, 0x63, 0x72, 0x4d, 0x7a, 0x47, 0x34, 0x4f, 0x6b, 0x6f, 0x31, 0x6a, 0x64, 0x45, 0x50, - 0x35, 0x78, 0x45, 0x47, 0x64, 0x6a, 0x6a, 0x46, 0x54, 0x70, 0x6e, 0x59, 0x30, 0x7a, 0x6c, 0x63, 0x67, 0x68, - 0x77, 0x32, 0x77, 0x46, 0x67, 0x76, 0x58, 0x38, 0x6e, 0x63, 0x48, 0x31, 0x2f, 0x47, 0x59, 0x68, 0x55, 0x6e, - 0x30, 0x45, 0x49, 0x32, 0x73, 0x6d, 0x42, 0x57, 0x6c, 0x42, 0x4f, 0x66, 0x59, 0x39, 0x31, 0x72, 0x43, 0x6a, - 0x46, 0x5c, 0x0a, - 0x09, 0x79, 0x6c, 0x72, 0x47, 0x71, 0x64, 0x74, 0x4d, 0x6a, 0x67, 0x32, 0x44, 0x30, 0x50, 0x33, 0x78, 0x64, - 0x6e, 0x6c, 0x5a, 0x67, 0x6e, 0x47, 0x4f, 0x55, 0x76, 0x42, 0x77, 0x31, 0x58, 0x2b, 0x4f, 0x6a, 0x34, 0x6c, - 0x64, 0x4a, 0x45, 0x6a, 0x44, 0x34, 0x6d, 0x33, 0x7a, 0x66, 0x6f, 0x56, 0x42, 0x68, 0x6e, 0x34, 0x4a, 0x6f, - 0x6b, 0x46, 0x74, 0x74, 0x43, 0x34, 0x34, 0x51, 0x58, 0x43, 0x53, 0x68, 0x6f, 0x6a, 0x6d, 0x77, 0x6a, 0x58, - 0x6c, 0x5c, 0x0a, - 0x09, 0x58, 0x46, 0x61, 0x45, 0x71, 0x77, 0x65, 0x6c, 0x2b, 0x4e, 0x46, 0x6c, 0x64, 0x4c, 0x75, 0x73, 0x6e, - 0x53, 0x41, 0x54, 0x41, 0x64, 0x43, 0x36, 0x50, 0x72, 0x63, 0x56, 0x4a, 0x65, 0x4d, 0x77, 0x6c, 0x73, 0x67, - 0x72, 0x30, 0x72, 0x5a, 0x69, 0x66, 0x53, 0x4f, 0x53, 0x77, 0x36, 0x56, 0x74, 0x43, 0x48, 0x6c, 0x43, 0x6e, - 0x68, 0x63, 0x41, 0x47, 0x4d, 0x5a, 0x4c, 0x36, 0x58, 0x68, 0x72, 0x5a, 0x75, 0x72, 0x78, 0x38, 0x2f, 0x6f, - 0x31, 0x5c, 0x0a, - 0x09, 0x48, 0x39, 0x73, 0x41, 0x64, 0x49, 0x33, 0x4b, 0x61, 0x30, 0x34, 0x62, 0x38, 0x4e, 0x4e, 0x67, 0x33, - 0x42, 0x6c, 0x47, 0x52, 0x43, 0x4e, 0x53, 0x43, 0x6d, 0x38, 0x4b, 0x61, 0x46, 0x45, 0x4a, 0x6b, 0x45, 0x49, - 0x64, 0x6c, 0x58, 0x6f, 0x46, 0x4a, 0x34, 0x4f, 0x54, 0x39, 0x65, 0x4a, 0x35, 0x6b, 0x75, 0x31, 0x6f, 0x67, - 0x30, 0x77, 0x56, 0x6d, 0x41, 0x4b, 0x56, 0x61, 0x4a, 0x65, 0x55, 0x59, 0x62, 0x48, 0x50, 0x34, 0x46, 0x69, - 0x78, 0x5c, 0x0a, - 0x09, 0x58, 0x7a, 0x62, 0x6d, 0x36, 0x4b, 0x51, 0x6a, 0x6f, 0x71, 0x6a, 0x6c, 0x66, 0x4d, 0x5a, 0x68, 0x37, - 0x44, 0x50, 0x4b, 0x52, 0x50, 0x47, 0x6b, 0x51, 0x5a, 0x6a, 0x4c, 0x4e, 0x59, 0x34, 0x66, 0x54, 0x45, 0x62, - 0x38, 0x55, 0x34, 0x31, 0x58, 0x38, 0x41, 0x63, 0x6b, 0x44, 0x68, 0x66, 0x59, 0x31, 0x69, 0x41, 0x57, 0x4c, - 0x76, 0x4c, 0x32, 0x65, 0x41, 0x53, 0x4e, 0x49, 0x4f, 0x54, 0x53, 0x74, 0x6f, 0x6e, 0x58, 0x34, 0x55, 0x77, - 0x70, 0x5c, 0x0a, - 0x09, 0x4a, 0x30, 0x36, 0x79, 0x48, 0x53, 0x67, 0x52, 0x57, 0x76, 0x62, 0x4a, 0x36, 0x6f, 0x63, 0x79, 0x5a, - 0x69, 0x42, 0x53, 0x64, 0x54, 0x69, 0x49, 0x52, 0x46, 0x42, 0x53, 0x31, 0x32, 0x73, 0x66, 0x32, 0x4a, 0x41, - 0x66, 0x43, 0x74, 0x32, 0x6f, 0x48, 0x77, 0x64, 0x4e, 0x55, 0x37, 0x64, 0x41, 0x53, 0x53, 0x6f, 0x63, 0x4c, - 0x7a, 0x51, 0x59, 0x50, 0x4b, 0x76, 0x44, 0x6f, 0x34, 0x70, 0x49, 0x57, 0x31, 0x56, 0x45, 0x44, 0x63, 0x62, - 0x76, 0x5c, 0x0a, - 0x09, 0x64, 0x46, 0x6e, 0x56, 0x64, 0x32, 0x78, 0x62, 0x4b, 0x55, 0x34, 0x37, 0x4e, 0x51, 0x65, 0x50, 0x70, - 0x67, 0x77, 0x69, 0x38, 0x4d, 0x4c, 0x37, 0x34, 0x56, 0x6b, 0x44, 0x35, 0x7a, 0x30, 0x36, 0x50, 0x36, 0x54, - 0x52, 0x36, 0x43, 0x6c, 0x41, 0x4b, 0x42, 0x76, 0x6c, 0x78, 0x79, 0x4b, 0x5a, 0x48, 0x6f, 0x38, 0x6c, 0x4e, - 0x2b, 0x32, 0x41, 0x31, 0x6c, 0x52, 0x44, 0x52, 0x48, 0x34, 0x6d, 0x4d, 0x33, 0x59, 0x71, 0x38, 0x69, 0x68, - 0x6b, 0x5c, 0x0a, - 0x09, 0x6f, 0x74, 0x72, 0x68, 0x73, 0x72, 0x41, 0x79, 0x4a, 0x64, 0x36, 0x67, 0x6e, 0x6d, 0x4a, 0x77, 0x2b, - 0x66, 0x4d, 0x4d, 0x49, 0x4d, 0x71, 0x64, 0x38, 0x61, 0x39, 0x31, 0x4b, 0x51, 0x64, 0x63, 0x79, 0x35, 0x6f, - 0x44, 0x50, 0x62, 0x63, 0x46, 0x79, 0x77, 0x61, 0x69, 0x72, 0x4a, 0x79, 0x73, 0x4a, 0x2b, 0x52, 0x75, 0x6a, - 0x51, 0x56, 0x53, 0x70, 0x72, 0x79, 0x6f, 0x30, 0x4c, 0x63, 0x44, 0x67, 0x46, 0x33, 0x4e, 0x55, 0x57, 0x37, - 0x74, 0x5c, 0x0a, - 0x09, 0x61, 0x41, 0x4d, 0x41, 0x77, 0x45, 0x42, 0x4f, 0x4b, 0x31, 0x49, 0x6e, 0x43, 0x4f, 0x74, 0x67, 0x47, - 0x7a, 0x77, 0x6a, 0x62, 0x58, 0x52, 0x42, 0x57, 0x61, 0x46, 0x65, 0x76, 0x4f, 0x5a, 0x59, 0x65, 0x2b, 0x48, - 0x34, 0x4b, 0x50, 0x6b, 0x4f, 0x68, 0x7a, 0x72, 0x54, 0x34, 0x49, 0x46, 0x61, 0x54, 0x44, 0x39, 0x34, 0x74, - 0x42, 0x72, 0x52, 0x5a, 0x70, 0x4b, 0x32, 0x4b, 0x32, 0x66, 0x69, 0x71, 0x58, 0x4d, 0x77, 0x50, 0x70, 0x35, - 0x68, 0x5c, 0x0a, - 0x09, 0x68, 0x44, 0x6f, 0x69, 0x61, 0x75, 0x76, 0x72, 0x44, 0x64, 0x30, 0x6e, 0x37, 0x59, 0x41, 0x42, 0x45, - 0x77, 0x63, 0x6f, 0x48, 0x58, 0x57, 0x35, 0x67, 0x33, 0x44, 0x65, 0x6b, 0x62, 0x59, 0x6c, 0x6a, 0x6b, 0x66, - 0x78, 0x35, 0x57, 0x53, 0x35, 0x6d, 0x47, 0x30, 0x78, 0x70, 0x67, 0x56, 0x51, 0x61, 0x54, 0x36, 0x63, 0x6c, - 0x4c, 0x4f, 0x5a, 0x70, 0x53, 0x48, 0x74, 0x57, 0x2b, 0x43, 0x30, 0x6b, 0x7a, 0x72, 0x57, 0x66, 0x59, 0x58, - 0x72, 0x5c, 0x0a, - 0x09, 0x77, 0x71, 0x6b, 0x56, 0x79, 0x4e, 0x70, 0x7a, 0x66, 0x51, 0x56, 0x71, 0x34, 0x4d, 0x64, 0x37, 0x30, - 0x71, 0x6e, 0x4a, 0x32, 0x74, 0x50, 0x47, 0x54, 0x77, 0x48, 0x4d, 0x4e, 0x4a, 0x45, 0x35, 0x71, 0x58, 0x41, - 0x65, 0x70, 0x35, 0x53, 0x6a, 0x6b, 0x62, 0x67, 0x69, 0x4b, 0x38, 0x32, 0x57, 0x42, 0x64, 0x52, 0x35, 0x35, - 0x6a, 0x68, 0x36, 0x6a, 0x6d, 0x32, 0x6d, 0x74, 0x5a, 0x54, 0x32, 0x49, 0x62, 0x49, 0x56, 0x58, 0x56, 0x62, - 0x78, 0x5c, 0x0a, - 0x09, 0x5a, 0x59, 0x31, 0x64, 0x7a, 0x37, 0x6d, 0x31, 0x51, 0x57, 0x6e, 0x65, 0x65, 0x66, 0x5a, 0x67, 0x6a, - 0x56, 0x31, 0x45, 0x61, 0x78, 0x56, 0x46, 0x6f, 0x32, 0x7a, 0x54, 0x5a, 0x6d, 0x30, 0x6a, 0x5a, 0x41, 0x59, - 0x72, 0x70, 0x67, 0x74, 0x49, 0x35, 0x53, 0x5a, 0x4f, 0x51, 0x6d, 0x55, 0x42, 0x41, 0x62, 0x53, 0x51, 0x79, - 0x69, 0x4a, 0x38, 0x4f, 0x6c, 0x37, 0x66, 0x43, 0x42, 0x61, 0x38, 0x4c, 0x32, 0x73, 0x61, 0x45, 0x4f, 0x54, - 0x53, 0x5c, 0x0a, - 0x09, 0x35, 0x49, 0x42, 0x4f, 0x79, 0x56, 0x67, 0x37, 0x4a, 0x4b, 0x38, 0x54, 0x51, 0x63, 0x2b, 0x77, 0x4c, - 0x77, 0x35, 0x34, 0x49, 0x53, 0x73, 0x52, 0x51, 0x4b, 0x31, 0x73, 0x6a, 0x4f, 0x76, 0x62, 0x6d, 0x6b, 0x71, - 0x73, 0x77, 0x37, 0x50, 0x2f, 0x46, 0x6d, 0x31, 0x63, 0x42, 0x68, 0x43, 0x2f, 0x63, 0x67, 0x64, 0x53, 0x44, - 0x71, 0x6b, 0x52, 0x4e, 0x35, 0x59, 0x33, 0x44, 0x44, 0x2f, 0x4a, 0x42, 0x6e, 0x69, 0x45, 0x4e, 0x76, 0x6f, - 0x4c, 0x5c, 0x0a, - 0x09, 0x6a, 0x68, 0x6b, 0x4d, 0x62, 0x73, 0x56, 0x30, 0x6c, 0x55, 0x63, 0x64, 0x41, 0x2b, 0x6e, 0x44, 0x30, - 0x48, 0x69, 0x6b, 0x35, 0x6b, 0x43, 0x6c, 0x69, 0x54, 0x75, 0x4d, 0x6d, 0x63, 0x36, 0x6a, 0x72, 0x6b, 0x65, - 0x4d, 0x56, 0x35, 0x33, 0x65, 0x57, 0x79, 0x54, 0x41, 0x69, 0x51, 0x4d, 0x6c, 0x62, 0x35, 0x63, 0x5a, 0x71, - 0x41, 0x61, 0x76, 0x78, 0x47, 0x69, 0x5a, 0x7a, 0x4d, 0x53, 0x6e, 0x49, 0x51, 0x63, 0x4f, 0x7a, 0x4b, 0x4a, - 0x39, 0x5c, 0x0a, - 0x09, 0x42, 0x70, 0x7a, 0x63, 0x4f, 0x58, 0x53, 0x35, 0x30, 0x4c, 0x36, 0x59, 0x74, 0x6a, 0x54, 0x49, 0x6e, - 0x6d, 0x63, 0x6f, 0x63, 0x5a, 0x78, 0x4b, 0x42, 0x6c, 0x6f, 0x75, 0x4d, 0x61, 0x4e, 0x67, 0x38, 0x6b, 0x69, - 0x79, 0x47, 0x33, 0x36, 0x42, 0x79, 0x59, 0x70, 0x6e, 0x42, 0x54, 0x77, 0x44, 0x45, 0x48, 0x70, 0x69, 0x50, - 0x4f, 0x69, 0x78, 0x43, 0x5a, 0x59, 0x53, 0x38, 0x4e, 0x71, 0x52, 0x4d, 0x72, 0x7a, 0x32, 0x74, 0x4d, 0x34, - 0x41, 0x5c, 0x0a, - 0x09, 0x6f, 0x46, 0x43, 0x66, 0x43, 0x78, 0x35, 0x6f, 0x6a, 0x74, 0x69, 0x6b, 0x46, 0x4b, 0x48, 0x6e, 0x74, - 0x41, 0x47, 0x42, 0x74, 0x59, 0x45, 0x30, 0x39, 0x63, 0x76, 0x6e, 0x63, 0x6a, 0x70, 0x71, 0x36, 0x66, 0x71, - 0x78, 0x50, 0x4c, 0x75, 0x6d, 0x41, 0x59, 0x46, 0x6e, 0x4b, 0x74, 0x45, 0x41, 0x46, 0x4c, 0x39, 0x57, 0x70, - 0x6d, 0x50, 0x31, 0x5a, 0x55, 0x57, 0x6b, 0x4f, 0x41, 0x78, 0x6d, 0x38, 0x46, 0x62, 0x6d, 0x59, 0x37, 0x55, - 0x62, 0x5c, 0x0a, - 0x09, 0x2b, 0x47, 0x62, 0x73, 0x4a, 0x4f, 0x33, 0x46, 0x63, 0x55, 0x41, 0x61, 0x71, 0x70, 0x56, 0x68, 0x43, - 0x44, 0x6b, 0x78, 0x35, 0x7a, 0x4d, 0x7a, 0x49, 0x6b, 0x4f, 0x33, 0x53, 0x66, 0x2b, 0x51, 0x4f, 0x75, 0x42, - 0x39, 0x4b, 0x2f, 0x2b, 0x58, 0x37, 0x65, 0x69, 0x4c, 0x70, 0x41, 0x70, 0x71, 0x30, 0x67, 0x37, 0x48, 0x48, - 0x5a, 0x4b, 0x6b, 0x6e, 0x48, 0x54, 0x51, 0x74, 0x36, 0x5a, 0x6c, 0x53, 0x52, 0x5a, 0x70, 0x38, 0x51, 0x67, - 0x70, 0x5c, 0x0a, - 0x09, 0x51, 0x35, 0x48, 0x64, 0x4a, 0x4f, 0x31, 0x74, 0x33, 0x34, 0x41, 0x6c, 0x67, 0x41, 0x31, 0x61, 0x42, - 0x42, 0x52, 0x52, 0x7a, 0x48, 0x42, 0x4f, 0x67, 0x65, 0x78, 0x47, 0x76, 0x57, 0x67, 0x63, 0x77, 0x66, 0x43, - 0x59, 0x51, 0x35, 0x67, 0x47, 0x36, 0x53, 0x41, 0x64, 0x52, 0x6a, 0x75, 0x52, 0x69, 0x68, 0x7a, 0x57, 0x33, - 0x43, 0x2b, 0x32, 0x68, 0x62, 0x71, 0x4e, 0x5a, 0x47, 0x35, 0x76, 0x39, 0x4b, 0x6c, 0x54, 0x58, 0x64, 0x57, - 0x45, 0x5c, 0x0a, - 0x09, 0x62, 0x55, 0x44, 0x71, 0x65, 0x77, 0x49, 0x65, 0x54, 0x73, 0x6e, 0x48, 0x73, 0x54, 0x2b, 0x6f, 0x73, - 0x52, 0x6b, 0x4e, 0x57, 0x38, 0x44, 0x44, 0x51, 0x54, 0x57, 0x43, 0x6e, 0x5a, 0x5a, 0x62, 0x77, 0x78, 0x68, - 0x6a, 0x4a, 0x61, 0x54, 0x6c, 0x56, 0x35, 0x72, 0x32, 0x43, 0x4c, 0x6d, 0x7a, 0x76, 0x72, 0x6e, 0x73, 0x43, - 0x49, 0x59, 0x74, 0x42, 0x42, 0x35, 0x56, 0x74, 0x72, 0x44, 0x53, 0x74, 0x45, 0x39, 0x63, 0x5a, 0x7a, 0x72, - 0x55, 0x5c, 0x0a, - 0x09, 0x77, 0x4b, 0x65, 0x72, 0x4a, 0x6e, 0x4a, 0x77, 0x61, 0x56, 0x6b, 0x74, 0x43, 0x32, 0x4c, 0x6e, 0x75, - 0x65, 0x35, 0x46, 0x4e, 0x68, 0x5a, 0x70, 0x68, 0x77, 0x6e, 0x36, 0x61, 0x30, 0x77, 0x62, 0x41, 0x77, 0x43, - 0x6d, 0x30, 0x43, 0x43, 0x64, 0x44, 0x51, 0x33, 0x43, 0x46, 0x6e, 0x4d, 0x73, 0x35, 0x66, 0x6a, 0x52, 0x38, - 0x4b, 0x73, 0x36, 0x4f, 0x6c, 0x33, 0x6d, 0x68, 0x75, 0x52, 0x55, 0x6d, 0x31, 0x59, 0x30, 0x74, 0x4f, 0x61, - 0x52, 0x5c, 0x0a, - 0x09, 0x65, 0x69, 0x37, 0x6e, 0x47, 0x70, 0x54, 0x4e, 0x30, 0x32, 0x51, 0x78, 0x70, 0x32, 0x53, 0x52, 0x79, - 0x71, 0x6d, 0x32, 0x64, 0x63, 0x71, 0x75, 0x35, 0x53, 0x49, 0x69, 0x69, 0x53, 0x61, 0x53, 0x39, 0x54, 0x69, - 0x49, 0x78, 0x67, 0x79, 0x4b, 0x39, 0x78, 0x4d, 0x48, 0x78, 0x49, 0x7a, 0x66, 0x4b, 0x47, 0x4e, 0x46, 0x37, - 0x69, 0x5a, 0x51, 0x34, 0x50, 0x33, 0x79, 0x39, 0x6a, 0x57, 0x77, 0x78, 0x33, 0x4a, 0x38, 0x54, 0x45, 0x79, - 0x4f, 0x5c, 0x0a, - 0x09, 0x44, 0x55, 0x6d, 0x48, 0x48, 0x43, 0x37, 0x76, 0x45, 0x7a, 0x4a, 0x71, 0x43, 0x36, 0x42, 0x6c, 0x6c, - 0x55, 0x66, 0x50, 0x77, 0x52, 0x45, 0x7a, 0x4e, 0x36, 0x66, 0x4f, 0x63, 0x2f, 0x41, 0x51, 0x30, 0x31, 0x54, - 0x44, 0x52, 0x71, 0x30, 0x70, 0x6b, 0x35, 0x42, 0x76, 0x67, 0x34, 0x31, 0x68, 0x55, 0x30, 0x77, 0x42, 0x6d, - 0x4a, 0x43, 0x34, 0x34, 0x31, 0x6b, 0x49, 0x6e, 0x67, 0x67, 0x59, 0x68, 0x6d, 0x49, 0x67, 0x36, 0x34, 0x6a, - 0x72, 0x5c, 0x0a, - 0x09, 0x34, 0x62, 0x77, 0x32, 0x56, 0x43, 0x65, 0x2f, 0x38, 0x72, 0x62, 0x44, 0x5a, 0x36, 0x4f, 0x68, 0x4f, - 0x48, 0x6c, 0x4f, 0x74, 0x4b, 0x47, 0x63, 0x4c, 0x36, 0x34, 0x72, 0x49, 0x44, 0x30, 0x57, 0x55, 0x55, 0x2b, - 0x50, 0x6b, 0x62, 0x4f, 0x71, 0x51, 0x63, 0x43, 0x4b, 0x63, 0x67, 0x77, 0x77, 0x7a, 0x4f, 0x6b, 0x4c, 0x62, - 0x38, 0x63, 0x5a, 0x35, 0x78, 0x56, 0x6f, 0x38, 0x6a, 0x47, 0x46, 0x4b, 0x45, 0x75, 0x42, 0x62, 0x77, 0x36, - 0x32, 0x5c, 0x0a, - 0x09, 0x6a, 0x4e, 0x65, 0x6d, 0x4b, 0x51, 0x73, 0x66, 0x54, 0x35, 0x4c, 0x70, 0x36, 0x59, 0x34, 0x67, 0x5a, - 0x53, 0x6c, 0x30, 0x79, 0x68, 0x72, 0x6a, 0x6d, 0x59, 0x6b, 0x31, 0x42, 0x34, 0x63, 0x71, 0x6e, 0x2b, 0x67, - 0x6c, 0x5a, 0x53, 0x63, 0x42, 0x63, 0x57, 0x73, 0x51, 0x57, 0x76, 0x39, 0x36, 0x4b, 0x68, 0x64, 0x45, 0x30, - 0x42, 0x54, 0x63, 0x6d, 0x73, 0x43, 0x70, 0x4c, 0x6e, 0x39, 0x63, 0x34, 0x35, 0x52, 0x75, 0x44, 0x57, 0x6c, - 0x64, 0x5c, 0x0a, - 0x09, 0x66, 0x68, 0x35, 0x63, 0x6b, 0x68, 0x73, 0x4b, 0x35, 0x77, 0x64, 0x53, 0x6f, 0x53, 0x56, 0x52, 0x52, - 0x31, 0x39, 0x48, 0x37, 0x53, 0x41, 0x6a, 0x31, 0x77, 0x30, 0x67, 0x46, 0x52, 0x4d, 0x56, 0x4c, 0x62, 0x7a, - 0x4d, 0x42, 0x68, 0x43, 0x72, 0x66, 0x38, 0x66, 0x71, 0x63, 0x73, 0x63, 0x57, 0x76, 0x44, 0x44, 0x6a, 0x31, - 0x4f, 0x32, 0x4a, 0x63, 0x38, 0x46, 0x6f, 0x56, 0x48, 0x38, 0x38, 0x43, 0x78, 0x44, 0x76, 0x42, 0x56, 0x4f, - 0x6b, 0x5c, 0x0a, - 0x09, 0x78, 0x35, 0x35, 0x6b, 0x46, 0x77, 0x59, 0x50, 0x33, 0x45, 0x38, 0x46, 0x2b, 0x50, 0x4a, 0x2b, 0x32, - 0x58, 0x6a, 0x6a, 0x64, 0x52, 0x4b, 0x6e, 0x54, 0x56, 0x6b, 0x4c, 0x4a, 0x7a, 0x4c, 0x47, 0x4a, 0x4d, 0x42, - 0x4d, 0x44, 0x34, 0x61, 0x4e, 0x4f, 0x59, 0x52, 0x79, 0x70, 0x36, 0x2b, 0x6a, 0x6c, 0x6c, 0x65, 0x69, 0x4a, - 0x32, 0x4d, 0x73, 0x59, 0x72, 0x6f, 0x45, 0x6f, 0x33, 0x2b, 0x6c, 0x6c, 0x31, 0x41, 0x32, 0x6d, 0x61, 0x61, - 0x4a, 0x5c, 0x0a, - 0x09, 0x4c, 0x7a, 0x44, 0x31, 0x78, 0x6a, 0x50, 0x50, 0x61, 0x41, 0x75, 0x68, 0x69, 0x36, 0x42, 0x4c, 0x4a, - 0x51, 0x50, 0x6e, 0x5a, 0x46, 0x6d, 0x48, 0x37, 0x56, 0x6f, 0x71, 0x36, 0x30, 0x45, 0x62, 0x41, 0x41, 0x41, - 0x30, 0x4b, 0x35, 0x53, 0x69, 0x6a, 0x5a, 0x69, 0x66, 0x74, 0x2b, 0x62, 0x6a, 0x34, 0x50, 0x57, 0x55, 0x73, - 0x65, 0x74, 0x79, 0x54, 0x63, 0x66, 0x63, 0x4f, 0x49, 0x51, 0x6a, 0x4e, 0x2f, 0x53, 0x6e, 0x76, 0x7a, 0x64, - 0x47, 0x5c, 0x0a, - 0x09, 0x43, 0x71, 0x4f, 0x65, 0x64, 0x67, 0x77, 0x65, 0x74, 0x55, 0x52, 0x6b, 0x59, 0x32, 0x58, 0x45, 0x4d, - 0x61, 0x75, 0x76, 0x73, 0x77, 0x38, 0x64, 0x42, 0x54, 0x6e, 0x41, 0x43, 0x58, 0x42, 0x6c, 0x52, 0x67, 0x6a, - 0x56, 0x6a, 0x67, 0x6c, 0x34, 0x51, 0x47, 0x4b, 0x34, 0x54, 0x62, 0x4b, 0x77, 0x31, 0x6a, 0x70, 0x45, 0x47, - 0x5a, 0x61, 0x5a, 0x6d, 0x46, 0x45, 0x64, 0x53, 0x70, 0x38, 0x61, 0x74, 0x48, 0x54, 0x37, 0x72, 0x4b, 0x34, - 0x46, 0x5c, 0x0a, - 0x09, 0x58, 0x73, 0x6c, 0x30, 0x69, 0x34, 0x31, 0x48, 0x41, 0x42, 0x70, 0x33, 0x57, 0x4d, 0x55, 0x7a, 0x7a, - 0x33, 0x70, 0x41, 0x69, 0x6c, 0x39, 0x4b, 0x65, 0x54, 0x66, 0x37, 0x55, 0x2f, 0x4a, 0x77, 0x71, 0x6e, 0x2b, - 0x6d, 0x74, 0x71, 0x72, 0x39, 0x48, 0x66, 0x62, 0x55, 0x62, 0x6d, 0x31, 0x70, 0x59, 0x2b, 0x34, 0x43, 0x56, - 0x43, 0x43, 0x66, 0x52, 0x69, 0x42, 0x75, 0x2f, 0x4c, 0x77, 0x61, 0x53, 0x59, 0x50, 0x51, 0x78, 0x69, 0x30, - 0x63, 0x5c, 0x0a, - 0x09, 0x77, 0x39, 0x56, 0x47, 0x77, 0x39, 0x4e, 0x46, 0x33, 0x56, 0x37, 0x67, 0x70, 0x39, 0x48, 0x4a, 0x6c, - 0x66, 0x45, 0x4b, 0x78, 0x70, 0x46, 0x65, 0x34, 0x38, 0x72, 0x56, 0x35, 0x2b, 0x50, 0x59, 0x47, 0x75, 0x70, - 0x47, 0x30, 0x5a, 0x41, 0x79, 0x46, 0x4d, 0x34, 0x54, 0x42, 0x79, 0x2b, 0x53, 0x4d, 0x74, 0x47, 0x67, 0x43, - 0x63, 0x56, 0x37, 0x37, 0x46, 0x62, 0x31, 0x36, 0x64, 0x68, 0x46, 0x34, 0x52, 0x68, 0x4b, 0x43, 0x5a, 0x61, - 0x4d, 0x5c, 0x0a, - 0x09, 0x64, 0x4e, 0x75, 0x79, 0x55, 0x61, 0x59, 0x44, 0x53, 0x46, 0x35, 0x35, 0x65, 0x39, 0x79, 0x35, 0x2b, - 0x54, 0x52, 0x45, 0x52, 0x32, 0x44, 0x6c, 0x78, 0x79, 0x5a, 0x6f, 0x4f, 0x39, 0x56, 0x75, 0x4d, 0x72, 0x33, - 0x51, 0x51, 0x44, 0x61, 0x43, 0x70, 0x38, 0x69, 0x62, 0x30, 0x61, 0x2b, 0x65, 0x56, 0x67, 0x56, 0x67, 0x62, - 0x6e, 0x4a, 0x65, 0x61, 0x2f, 0x71, 0x52, 0x54, 0x4d, 0x30, 0x41, 0x67, 0x48, 0x61, 0x73, 0x47, 0x46, 0x6a, - 0x57, 0x5c, 0x0a, - 0x09, 0x67, 0x44, 0x5a, 0x6d, 0x44, 0x51, 0x42, 0x49, 0x6a, 0x5a, 0x79, 0x66, 0x35, 0x38, 0x61, 0x65, 0x54, - 0x41, 0x2f, 0x59, 0x73, 0x61, 0x2f, 0x41, 0x4b, 0x30, 0x4d, 0x34, 0x42, 0x37, 0x48, 0x76, 0x47, 0x67, 0x78, - 0x30, 0x4e, 0x45, 0x31, 0x59, 0x56, 0x55, 0x59, 0x56, 0x69, 0x7a, 0x61, 0x42, 0x52, 0x35, 0x50, 0x6a, 0x57, - 0x71, 0x51, 0x41, 0x4c, 0x62, 0x52, 0x72, 0x31, 0x59, 0x30, 0x47, 0x62, 0x6b, 0x52, 0x52, 0x43, 0x30, 0x68, - 0x34, 0x5c, 0x0a, - 0x09, 0x48, 0x38, 0x5a, 0x68, 0x57, 0x70, 0x36, 0x44, 0x71, 0x4d, 0x6f, 0x55, 0x64, 0x48, 0x6c, 0x75, 0x75, - 0x4a, 0x77, 0x2f, 0x37, 0x58, 0x67, 0x63, 0x6a, 0x41, 0x52, 0x59, 0x75, 0x4c, 0x53, 0x4e, 0x42, 0x4d, 0x51, - 0x74, 0x5a, 0x2b, 0x4a, 0x39, 0x42, 0x52, 0x6d, 0x4d, 0x41, 0x43, 0x55, 0x4e, 0x47, 0x4c, 0x79, 0x2f, 0x42, - 0x49, 0x53, 0x4e, 0x64, 0x6f, 0x54, 0x39, 0x71, 0x43, 0x49, 0x61, 0x64, 0x42, 0x57, 0x4c, 0x63, 0x69, 0x78, - 0x41, 0x5c, 0x0a, - 0x09, 0x59, 0x67, 0x50, 0x4e, 0x31, 0x37, 0x62, 0x44, 0x72, 0x63, 0x39, 0x50, 0x67, 0x6e, 0x50, 0x61, 0x69, - 0x4a, 0x32, 0x41, 0x38, 0x2b, 0x4b, 0x72, 0x6d, 0x48, 0x74, 0x43, 0x47, 0x54, 0x73, 0x37, 0x46, 0x38, 0x73, - 0x71, 0x67, 0x7a, 0x49, 0x58, 0x74, 0x70, 0x41, 0x61, 0x65, 0x6b, 0x44, 0x70, 0x42, 0x48, 0x67, 0x61, 0x44, - 0x44, 0x36, 0x5a, 0x45, 0x75, 0x68, 0x50, 0x78, 0x71, 0x75, 0x49, 0x58, 0x69, 0x4d, 0x63, 0x71, 0x44, 0x46, - 0x4e, 0x5c, 0x0a, - 0x09, 0x68, 0x67, 0x51, 0x33, 0x71, 0x31, 0x35, 0x6a, 0x6d, 0x37, 0x77, 0x78, 0x4a, 0x2b, 0x58, 0x48, 0x54, - 0x73, 0x65, 0x79, 0x56, 0x76, 0x6f, 0x66, 0x49, 0x78, 0x75, 0x37, 0x5a, 0x67, 0x49, 0x4f, 0x6a, 0x4c, 0x61, - 0x56, 0x51, 0x2b, 0x74, 0x30, 0x6e, 0x59, 0x39, 0x4c, 0x4f, 0x4a, 0x55, 0x47, 0x62, 0x68, 0x68, 0x6a, 0x4e, - 0x50, 0x51, 0x62, 0x39, 0x4a, 0x2f, 0x49, 0x56, 0x59, 0x4f, 0x49, 0x34, 0x74, 0x2f, 0x53, 0x75, 0x38, 0x57, - 0x2f, 0x5c, 0x0a, - 0x09, 0x36, 0x45, 0x76, 0x4a, 0x6d, 0x64, 0x74, 0x71, 0x46, 0x42, 0x66, 0x50, 0x58, 0x6b, 0x4c, 0x42, 0x4a, - 0x6a, 0x32, 0x4d, 0x41, 0x47, 0x7a, 0x6e, 0x2b, 0x69, 0x42, 0x61, 0x39, 0x79, 0x63, 0x43, 0x31, 0x78, 0x63, - 0x41, 0x66, 0x4b, 0x51, 0x62, 0x78, 0x4f, 0x39, 0x61, 0x59, 0x53, 0x49, 0x71, 0x73, 0x50, 0x4f, 0x78, 0x76, - 0x69, 0x6f, 0x54, 0x46, 0x42, 0x44, 0x62, 0x63, 0x72, 0x61, 0x42, 0x36, 0x62, 0x6d, 0x69, 0x6a, 0x6b, 0x70, - 0x4a, 0x5c, 0x0a, - 0x09, 0x32, 0x2b, 0x70, 0x37, 0x34, 0x49, 0x55, 0x44, 0x6b, 0x49, 0x35, 0x79, 0x6f, 0x59, 0x77, 0x59, 0x72, - 0x48, 0x4a, 0x71, 0x66, 0x59, 0x33, 0x4c, 0x49, 0x59, 0x78, 0x46, 0x52, 0x35, 0x30, 0x6d, 0x6f, 0x34, 0x6c, - 0x70, 0x4a, 0x77, 0x63, 0x32, 0x4e, 0x65, 0x35, 0x45, 0x46, 0x73, 0x47, 0x41, 0x56, 0x65, 0x51, 0x6a, 0x56, - 0x55, 0x2b, 0x33, 0x77, 0x38, 0x76, 0x78, 0x39, 0x6e, 0x53, 0x47, 0x46, 0x76, 0x6c, 0x69, 0x30, 0x56, 0x57, - 0x6e, 0x5c, 0x0a, - 0x09, 0x78, 0x35, 0x5a, 0x7a, 0x57, 0x56, 0x6c, 0x47, 0x77, 0x6a, 0x4e, 0x6e, 0x54, 0x76, 0x48, 0x51, 0x5a, - 0x43, 0x4f, 0x69, 0x54, 0x64, 0x32, 0x75, 0x71, 0x38, 0x65, 0x64, 0x5a, 0x4a, 0x6b, 0x4b, 0x47, 0x49, 0x4f, - 0x63, 0x2b, 0x54, 0x6d, 0x77, 0x63, 0x35, 0x77, 0x34, 0x6b, 0x4f, 0x6f, 0x73, 0x30, 0x77, 0x52, 0x79, 0x59, - 0x66, 0x4e, 0x54, 0x61, 0x59, 0x4e, 0x72, 0x53, 0x2b, 0x75, 0x66, 0x41, 0x54, 0x68, 0x33, 0x52, 0x45, 0x62, - 0x39, 0x5c, 0x0a, - 0x09, 0x52, 0x41, 0x68, 0x41, 0x34, 0x68, 0x77, 0x73, 0x73, 0x6f, 0x6a, 0x55, 0x53, 0x30, 0x55, 0x44, 0x78, - 0x2b, 0x72, 0x71, 0x43, 0x4b, 0x47, 0x56, 0x6c, 0x6b, 0x51, 0x72, 0x31, 0x50, 0x55, 0x63, 0x71, 0x37, 0x66, - 0x79, 0x65, 0x47, 0x72, 0x2b, 0x59, 0x2f, 0x31, 0x67, 0x42, 0x4f, 0x46, 0x50, 0x52, 0x54, 0x4a, 0x68, 0x55, - 0x49, 0x78, 0x33, 0x41, 0x55, 0x70, 0x38, 0x7a, 0x4d, 0x6f, 0x4a, 0x74, 0x43, 0x4f, 0x69, 0x34, 0x54, 0x76, - 0x6e, 0x5c, 0x0a, - 0x09, 0x4c, 0x33, 0x5a, 0x43, 0x7a, 0x4c, 0x41, 0x4e, 0x51, 0x34, 0x34, 0x79, 0x55, 0x61, 0x43, 0x6a, 0x77, - 0x55, 0x54, 0x4c, 0x54, 0x71, 0x54, 0x67, 0x66, 0x47, 0x77, 0x47, 0x65, 0x49, 0x6d, 0x49, 0x61, 0x52, 0x43, - 0x66, 0x6a, 0x69, 0x52, 0x41, 0x51, 0x51, 0x33, 0x6a, 0x5a, 0x76, 0x78, 0x5a, 0x55, 0x37, 0x4f, 0x45, 0x4c, - 0x36, 0x34, 0x62, 0x59, 0x33, 0x7a, 0x63, 0x4a, 0x76, 0x55, 0x34, 0x72, 0x53, 0x44, 0x52, 0x6c, 0x4b, 0x48, - 0x70, 0x5c, 0x0a, - 0x09, 0x63, 0x33, 0x72, 0x36, 0x4a, 0x4f, 0x31, 0x67, 0x71, 0x79, 0x57, 0x4f, 0x74, 0x61, 0x54, 0x31, 0x42, - 0x77, 0x43, 0x69, 0x49, 0x6b, 0x33, 0x46, 0x74, 0x4f, 0x4d, 0x62, 0x54, 0x68, 0x6b, 0x6a, 0x53, 0x39, 0x4a, - 0x65, 0x72, 0x59, 0x7a, 0x6f, 0x61, 0x30, 0x59, 0x45, 0x69, 0x46, 0x2b, 0x64, 0x62, 0x61, 0x68, 0x4e, 0x63, - 0x7a, 0x37, 0x42, 0x46, 0x2b, 0x2f, 0x54, 0x55, 0x43, 0x4b, 0x2f, 0x6c, 0x6a, 0x69, 0x59, 0x59, 0x61, 0x41, - 0x36, 0x5c, 0x0a, - 0x09, 0x62, 0x62, 0x59, 0x69, 0x55, 0x65, 0x4b, 0x6b, 0x4b, 0x6e, 0x72, 0x7a, 0x38, 0x68, 0x47, 0x4d, 0x51, - 0x6a, 0x6b, 0x4e, 0x63, 0x47, 0x70, 0x38, 0x53, 0x63, 0x6f, 0x4c, 0x31, 0x71, 0x63, 0x46, 0x66, 0x69, 0x73, - 0x41, 0x59, 0x71, 0x7a, 0x72, 0x32, 0x4a, 0x43, 0x4a, 0x73, 0x61, 0x34, 0x69, 0x59, 0x57, 0x4e, 0x6d, 0x77, - 0x35, 0x31, 0x66, 0x79, 0x55, 0x37, 0x55, 0x59, 0x57, 0x50, 0x56, 0x6d, 0x52, 0x77, 0x72, 0x49, 0x6a, 0x36, - 0x62, 0x5c, 0x0a, - 0x09, 0x5a, 0x4a, 0x4a, 0x6b, 0x68, 0x4c, 0x79, 0x62, 0x45, 0x57, 0x6a, 0x46, 0x78, 0x38, 0x7a, 0x50, 0x78, - 0x58, 0x70, 0x4f, 0x6c, 0x72, 0x4d, 0x79, 0x6c, 0x2f, 0x72, 0x38, 0x74, 0x75, 0x61, 0x4f, 0x31, 0x6f, 0x62, - 0x57, 0x2b, 0x59, 0x31, 0x41, 0x42, 0x41, 0x43, 0x48, 0x45, 0x6b, 0x4e, 0x76, 0x69, 0x6b, 0x54, 0x68, 0x4d, - 0x7a, 0x71, 0x34, 0x5a, 0x59, 0x41, 0x4e, 0x55, 0x53, 0x46, 0x65, 0x43, 0x2f, 0x32, 0x53, 0x4b, 0x43, 0x37, - 0x36, 0x5c, 0x0a, - 0x09, 0x34, 0x46, 0x6d, 0x46, 0x6e, 0x6a, 0x4e, 0x79, 0x5a, 0x78, 0x67, 0x31, 0x44, 0x39, 0x62, 0x58, 0x74, - 0x4a, 0x47, 0x76, 0x5a, 0x45, 0x51, 0x6d, 0x61, 0x52, 0x43, 0x6f, 0x6d, 0x4e, 0x56, 0x74, 0x36, 0x55, 0x67, - 0x56, 0x4d, 0x67, 0x79, 0x72, 0x79, 0x77, 0x43, 0x69, 0x53, 0x62, 0x62, 0x56, 0x59, 0x4d, 0x44, 0x57, 0x57, - 0x4b, 0x76, 0x6d, 0x61, 0x38, 0x66, 0x54, 0x35, 0x58, 0x54, 0x32, 0x6f, 0x2f, 0x6a, 0x55, 0x57, 0x56, 0x4f, - 0x55, 0x5c, 0x0a, - 0x09, 0x76, 0x33, 0x49, 0x57, 0x69, 0x33, 0x38, 0x39, 0x56, 0x64, 0x48, 0x70, 0x74, 0x67, 0x6b, 0x75, 0x4b, - 0x6f, 0x43, 0x4d, 0x42, 0x42, 0x34, 0x32, 0x68, 0x4b, 0x5a, 0x72, 0x75, 0x6b, 0x43, 0x59, 0x35, 0x76, 0x42, - 0x41, 0x45, 0x2f, 0x58, 0x52, 0x6f, 0x41, 0x65, 0x37, 0x33, 0x66, 0x2f, 0x6f, 0x47, 0x59, 0x41, 0x44, 0x41, - 0x50, 0x57, 0x4c, 0x48, 0x70, 0x41, 0x4f, 0x6d, 0x4b, 0x52, 0x6b, 0x59, 0x45, 0x37, 0x4c, 0x49, 0x36, 0x57, - 0x46, 0x5c, 0x0a, - 0x09, 0x31, 0x46, 0x43, 0x52, 0x56, 0x42, 0x6d, 0x79, 0x52, 0x75, 0x41, 0x6d, 0x51, 0x33, 0x4f, 0x36, 0x4c, - 0x33, 0x55, 0x78, 0x4d, 0x52, 0x62, 0x56, 0x4a, 0x71, 0x63, 0x59, 0x6a, 0x64, 0x56, 0x6e, 0x59, 0x38, 0x52, - 0x69, 0x2f, 0x54, 0x5a, 0x46, 0x6f, 0x53, 0x52, 0x79, 0x4f, 0x2f, 0x61, 0x6e, 0x73, 0x78, 0x50, 0x49, 0x64, - 0x6b, 0x6a, 0x58, 0x35, 0x32, 0x55, 0x61, 0x67, 0x4d, 0x7a, 0x71, 0x4f, 0x7a, 0x69, 0x34, 0x54, 0x6d, 0x4d, - 0x31, 0x5c, 0x0a, - 0x09, 0x62, 0x79, 0x6f, 0x34, 0x31, 0x6d, 0x32, 0x51, 0x4c, 0x43, 0x50, 0x47, 0x61, 0x79, 0x68, 0x45, 0x70, - 0x2f, 0x56, 0x38, 0x71, 0x74, 0x4b, 0x49, 0x72, 0x59, 0x36, 0x31, 0x47, 0x2b, 0x53, 0x71, 0x78, 0x6d, 0x53, - 0x42, 0x61, 0x52, 0x79, 0x66, 0x64, 0x62, 0x37, 0x68, 0x6e, 0x43, 0x56, 0x72, 0x66, 0x63, 0x30, 0x71, 0x4c, - 0x77, 0x46, 0x72, 0x45, 0x36, 0x77, 0x42, 0x77, 0x42, 0x33, 0x78, 0x48, 0x30, 0x41, 0x30, 0x49, 0x42, 0x47, - 0x52, 0x5c, 0x0a, - 0x09, 0x64, 0x42, 0x62, 0x41, 0x42, 0x4b, 0x75, 0x64, 0x50, 0x52, 0x54, 0x58, 0x44, 0x73, 0x54, 0x2f, 0x41, - 0x42, 0x59, 0x68, 0x57, 0x55, 0x56, 0x7a, 0x48, 0x73, 0x6c, 0x5a, 0x4c, 0x54, 0x62, 0x5a, 0x31, 0x77, 0x41, - 0x41, 0x49, 0x41, 0x42, 0x4a, 0x52, 0x45, 0x46, 0x55, 0x73, 0x42, 0x54, 0x4f, 0x2b, 0x7a, 0x57, 0x4d, 0x53, - 0x47, 0x63, 0x57, 0x59, 0x70, 0x79, 0x38, 0x41, 0x49, 0x76, 0x59, 0x41, 0x6d, 0x53, 0x63, 0x35, 0x46, 0x48, - 0x7a, 0x5c, 0x0a, - 0x09, 0x5a, 0x34, 0x31, 0x4c, 0x70, 0x38, 0x6c, 0x57, 0x4e, 0x68, 0x4c, 0x61, 0x46, 0x71, 0x6b, 0x31, 0x34, - 0x35, 0x55, 0x55, 0x58, 0x78, 0x7a, 0x38, 0x72, 0x44, 0x55, 0x42, 0x4b, 0x7a, 0x4f, 0x49, 0x38, 0x6f, 0x58, - 0x73, 0x33, 0x77, 0x4c, 0x52, 0x70, 0x6d, 0x78, 0x49, 0x4f, 0x35, 0x45, 0x41, 0x2b, 0x69, 0x5a, 0x48, 0x56, - 0x63, 0x64, 0x69, 0x36, 0x73, 0x4d, 0x64, 0x54, 0x39, 0x6d, 0x58, 0x7a, 0x76, 0x52, 0x57, 0x36, 0x71, 0x38, - 0x4a, 0x5c, 0x0a, - 0x09, 0x73, 0x44, 0x56, 0x50, 0x54, 0x64, 0x6c, 0x63, 0x6f, 0x68, 0x66, 0x56, 0x6e, 0x71, 0x2b, 0x33, 0x37, - 0x68, 0x6e, 0x41, 0x75, 0x75, 0x34, 0x45, 0x2f, 0x4f, 0x67, 0x58, 0x76, 0x34, 0x35, 0x4c, 0x4c, 0x6a, 0x68, - 0x76, 0x6b, 0x46, 0x7a, 0x51, 0x55, 0x34, 0x4a, 0x77, 0x4c, 0x6a, 0x48, 0x41, 0x32, 0x73, 0x6a, 0x76, 0x66, - 0x4f, 0x41, 0x77, 0x48, 0x49, 0x43, 0x35, 0x68, 0x53, 0x55, 0x4d, 0x42, 0x6b, 0x4d, 0x4d, 0x69, 0x77, 0x4a, - 0x7a, 0x5c, 0x0a, - 0x09, 0x43, 0x2f, 0x37, 0x31, 0x30, 0x51, 0x65, 0x50, 0x7a, 0x4b, 0x4d, 0x73, 0x53, 0x79, 0x77, 0x4f, 0x6c, - 0x6a, 0x45, 0x6f, 0x53, 0x73, 0x41, 0x35, 0x7a, 0x43, 0x30, 0x75, 0x59, 0x54, 0x6a, 0x30, 0x79, 0x63, 0x66, - 0x43, 0x30, 0x67, 0x44, 0x4c, 0x52, 0x51, 0x45, 0x69, 0x77, 0x73, 0x4c, 0x69, 0x41, 0x4d, 0x76, 0x44, 0x6f, - 0x54, 0x38, 0x65, 0x4c, 0x47, 0x4e, 0x59, 0x2b, 0x4e, 0x2b, 0x63, 0x57, 0x31, 0x77, 0x75, 0x2f, 0x48, 0x6e, - 0x34, 0x5c, 0x0a, - 0x09, 0x39, 0x38, 0x30, 0x76, 0x4c, 0x41, 0x31, 0x51, 0x73, 0x4e, 0x2f, 0x30, 0x49, 0x79, 0x49, 0x4d, 0x6c, - 0x6f, 0x64, 0x59, 0x4c, 0x6f, 0x71, 0x4b, 0x52, 0x63, 0x39, 0x33, 0x55, 0x54, 0x67, 0x73, 0x4c, 0x43, 0x2f, - 0x4c, 0x78, 0x45, 0x55, 0x62, 0x6d, 0x61, 0x74, 0x2b, 0x30, 0x70, 0x4a, 0x46, 0x53, 0x77, 0x65, 0x67, 0x6b, - 0x32, 0x55, 0x59, 0x36, 0x33, 0x57, 0x71, 0x39, 0x76, 0x77, 0x76, 0x36, 0x50, 0x61, 0x36, 0x4f, 0x62, 0x71, - 0x35, 0x5c, 0x0a, - 0x09, 0x2f, 0x34, 0x6e, 0x73, 0x69, 0x62, 0x45, 0x2b, 0x38, 0x69, 0x7a, 0x48, 0x6c, 0x72, 0x45, 0x65, 0x4a, - 0x73, 0x66, 0x48, 0x4d, 0x44, 0x6e, 0x65, 0x77, 0x37, 0x59, 0x74, 0x6b, 0x39, 0x69, 0x7a, 0x66, 0x51, 0x70, - 0x37, 0x54, 0x39, 0x79, 0x4a, 0x2f, 0x53, 0x66, 0x74, 0x78, 0x72, 0x62, 0x4a, 0x76, 0x68, 0x49, 0x75, 0x63, - 0x2f, 0x41, 0x6f, 0x5a, 0x70, 0x56, 0x64, 0x61, 0x52, 0x37, 0x6a, 0x4e, 0x59, 0x63, 0x62, 0x37, 0x33, 0x6f, - 0x51, 0x5c, 0x0a, - 0x09, 0x63, 0x43, 0x58, 0x32, 0x6e, 0x37, 0x51, 0x4c, 0x41, 0x2b, 0x51, 0x34, 0x50, 0x4c, 0x75, 0x41, 0x65, - 0x2b, 0x38, 0x2f, 0x69, 0x41, 0x64, 0x6e, 0x5a, 0x72, 0x47, 0x77, 0x4f, 0x4d, 0x44, 0x69, 0x59, 0x49, 0x41, - 0x6a, 0x63, 0x77, 0x73, 0x6f, 0x69, 0x54, 0x41, 0x33, 0x76, 0x2b, 0x6a, 0x6c, 0x42, 0x32, 0x43, 0x35, 0x4b, - 0x4c, 0x43, 0x77, 0x4e, 0x49, 0x69, 0x79, 0x30, 0x6d, 0x2b, 0x66, 0x46, 0x75, 0x2f, 0x6f, 0x72, 0x36, 0x35, - 0x52, 0x5c, 0x0a, - 0x09, 0x42, 0x5a, 0x4b, 0x48, 0x35, 0x78, 0x59, 0x41, 0x35, 0x37, 0x42, 0x6c, 0x59, 0x68, 0x7a, 0x73, 0x42, - 0x35, 0x31, 0x5a, 0x58, 0x57, 0x43, 0x73, 0x32, 0x30, 0x4d, 0x6e, 0x39, 0x7a, 0x2f, 0x68, 0x54, 0x6c, 0x55, - 0x62, 0x2f, 0x72, 0x63, 0x42, 0x67, 0x47, 0x36, 0x65, 0x59, 0x33, 0x4b, 0x38, 0x4c, 0x38, 0x59, 0x30, 0x4f, - 0x64, 0x5a, 0x48, 0x48, 0x6e, 0x2b, 0x43, 0x50, 0x4d, 0x50, 0x30, 0x6c, 0x76, 0x70, 0x48, 0x55, 0x48, 0x75, - 0x64, 0x5c, 0x0a, - 0x09, 0x48, 0x4f, 0x50, 0x39, 0x58, 0x6d, 0x78, 0x37, 0x79, 0x2f, 0x67, 0x34, 0x75, 0x74, 0x30, 0x73, 0x36, - 0x6d, 0x6a, 0x58, 0x74, 0x71, 0x33, 0x6f, 0x5a, 0x70, 0x42, 0x5a, 0x6f, 0x78, 0x43, 0x78, 0x71, 0x32, 0x55, - 0x72, 0x67, 0x68, 0x6d, 0x37, 0x72, 0x76, 0x57, 0x68, 0x70, 0x30, 0x47, 0x2b, 0x34, 0x74, 0x51, 0x4e, 0x74, - 0x39, 0x2b, 0x4c, 0x4d, 0x38, 0x37, 0x43, 0x75, 0x74, 0x45, 0x36, 0x41, 0x38, 0x44, 0x56, 0x65, 0x50, 0x6b, - 0x66, 0x5c, 0x0a, - 0x09, 0x2f, 0x4f, 0x58, 0x55, 0x39, 0x35, 0x2f, 0x33, 0x79, 0x48, 0x4b, 0x38, 0x33, 0x38, 0x6b, 0x57, 0x6c, - 0x70, 0x5a, 0x52, 0x6c, 0x47, 0x56, 0x30, 0x72, 0x71, 0x58, 0x42, 0x4d, 0x70, 0x61, 0x4c, 0x41, 0x6f, 0x50, - 0x43, 0x2f, 0x30, 0x6a, 0x6b, 0x30, 0x76, 0x49, 0x51, 0x51, 0x31, 0x66, 0x36, 0x7a, 0x36, 0x4c, 0x41, 0x63, - 0x6c, 0x46, 0x69, 0x71, 0x53, 0x69, 0x67, 0x34, 0x43, 0x41, 0x35, 0x35, 0x74, 0x52, 0x55, 0x52, 0x73, 0x55, - 0x30, 0x5c, 0x0a, - 0x09, 0x73, 0x30, 0x31, 0x64, 0x50, 0x79, 0x33, 0x48, 0x76, 0x34, 0x58, 0x66, 0x71, 0x5a, 0x57, 0x2f, 0x67, - 0x47, 0x50, 0x31, 0x62, 0x37, 0x57, 0x58, 0x74, 0x70, 0x61, 0x4f, 0x49, 0x65, 0x56, 0x57, 0x6e, 0x53, 0x58, - 0x43, 0x33, 0x6c, 0x30, 0x37, 0x38, 0x66, 0x74, 0x76, 0x2b, 0x4b, 0x39, 0x34, 0x78, 0x43, 0x4d, 0x65, 0x42, - 0x71, 0x49, 0x4d, 0x6f, 0x41, 0x77, 0x67, 0x49, 0x4d, 0x74, 0x79, 0x6c, 0x41, 0x42, 0x75, 0x76, 0x66, 0x6c, - 0x57, 0x5c, 0x0a, - 0x09, 0x76, 0x4f, 0x76, 0x64, 0x37, 0x38, 0x55, 0x58, 0x76, 0x76, 0x77, 0x56, 0x4c, 0x41, 0x30, 0x47, 0x47, - 0x42, 0x5a, 0x44, 0x50, 0x4f, 0x2b, 0x48, 0x66, 0x67, 0x69, 0x76, 0x66, 0x4e, 0x57, 0x6c, 0x32, 0x44, 0x6f, - 0x39, 0x37, 0x64, 0x74, 0x32, 0x4a, 0x54, 0x71, 0x35, 0x4e, 0x34, 0x32, 0x33, 0x76, 0x65, 0x39, 0x58, 0x38, - 0x43, 0x2b, 0x66, 0x2b, 0x51, 0x79, 0x6d, 0x74, 0x30, 0x37, 0x68, 0x34, 0x4f, 0x77, 0x73, 0x6c, 0x71, 0x72, - 0x66, 0x5c, 0x0a, - 0x09, 0x34, 0x4c, 0x50, 0x47, 0x59, 0x6f, 0x33, 0x35, 0x61, 0x4d, 0x64, 0x59, 0x31, 0x30, 0x74, 0x6c, 0x71, - 0x66, 0x74, 0x71, 0x30, 0x71, 0x4d, 0x64, 0x65, 0x32, 0x55, 0x62, 0x54, 0x58, 0x61, 0x6a, 0x32, 0x37, 0x50, - 0x37, 0x4a, 0x47, 0x51, 0x45, 0x6a, 0x48, 0x55, 0x37, 0x73, 0x62, 0x39, 0x75, 0x70, 0x34, 0x4e, 0x75, 0x6e, - 0x73, 0x58, 0x79, 0x34, 0x37, 0x30, 0x65, 0x73, 0x73, 0x71, 0x70, 0x2b, 0x37, 0x30, 0x75, 0x63, 0x73, 0x70, - 0x41, 0x5c, 0x0a, - 0x09, 0x35, 0x44, 0x44, 0x52, 0x39, 0x38, 0x42, 0x4d, 0x52, 0x4e, 0x67, 0x79, 0x50, 0x68, 0x5a, 0x39, 0x66, - 0x32, 0x4b, 0x73, 0x44, 0x79, 0x4a, 0x67, 0x66, 0x6e, 0x47, 0x41, 0x38, 0x38, 0x2f, 0x59, 0x74, 0x33, 0x33, - 0x5a, 0x46, 0x54, 0x6a, 0x6a, 0x2b, 0x31, 0x39, 0x67, 0x6a, 0x6d, 0x51, 0x74, 0x61, 0x4e, 0x31, 0x2b, 0x46, - 0x2b, 0x44, 0x6b, 0x38, 0x78, 0x37, 0x6e, 0x4f, 0x77, 0x54, 0x65, 0x36, 0x59, 0x42, 0x58, 0x4e, 0x42, 0x6c, - 0x35, 0x5c, 0x0a, - 0x09, 0x30, 0x37, 0x6b, 0x6d, 0x78, 0x2b, 0x54, 0x58, 0x6d, 0x77, 0x78, 0x75, 0x70, 0x54, 0x4a, 0x57, 0x6e, - 0x53, 0x59, 0x48, 0x48, 0x4e, 0x58, 0x75, 0x4b, 0x42, 0x36, 0x61, 0x6a, 0x4c, 0x57, 0x70, 0x76, 0x74, 0x55, - 0x33, 0x70, 0x37, 0x71, 0x64, 0x32, 0x6d, 0x48, 0x4b, 0x73, 0x73, 0x54, 0x38, 0x2f, 0x42, 0x77, 0x65, 0x64, - 0x76, 0x4c, 0x4a, 0x2b, 0x50, 0x4b, 0x6e, 0x50, 0x32, 0x37, 0x57, 0x6d, 0x7a, 0x31, 0x79, 0x42, 0x49, 0x2b, - 0x35, 0x5c, 0x0a, - 0x09, 0x38, 0x43, 0x49, 0x63, 0x6d, 0x5a, 0x50, 0x37, 0x73, 0x58, 0x37, 0x72, 0x4e, 0x61, 0x2f, 0x42, 0x53, - 0x33, 0x2f, 0x32, 0x4a, 0x65, 0x4c, 0x63, 0x2f, 0x50, 0x77, 0x38, 0x54, 0x6a, 0x2f, 0x2f, 0x51, 0x69, 0x77, - 0x4d, 0x42, 0x68, 0x6a, 0x72, 0x39, 0x39, 0x48, 0x74, 0x39, 0x52, 0x67, 0x2f, 0x64, 0x62, 0x2f, 0x79, 0x7a, - 0x4d, 0x70, 0x41, 0x4e, 0x71, 0x70, 0x4f, 0x45, 0x39, 0x58, 0x6c, 0x36, 0x70, 0x4a, 0x32, 0x4f, 0x37, 0x4b, - 0x6c, 0x5c, 0x0a, - 0x09, 0x55, 0x53, 0x44, 0x42, 0x48, 0x56, 0x75, 0x44, 0x52, 0x4e, 0x32, 0x75, 0x48, 0x47, 0x63, 0x54, 0x47, - 0x45, 0x6b, 0x75, 0x5a, 0x42, 0x6e, 0x4a, 0x58, 0x38, 0x6f, 0x58, 0x61, 0x2b, 0x4d, 0x54, 0x70, 0x2b, 0x7a, - 0x61, 0x38, 0x5a, 0x39, 0x75, 0x76, 0x65, 0x39, 0x42, 0x33, 0x48, 0x37, 0x56, 0x6c, 0x37, 0x41, 0x65, 0x74, - 0x43, 0x35, 0x72, 0x41, 0x4b, 0x64, 0x55, 0x7a, 0x67, 0x2f, 0x67, 0x42, 0x77, 0x46, 0x36, 0x68, 0x54, 0x46, - 0x77, 0x5c, 0x0a, - 0x09, 0x51, 0x51, 0x54, 0x2b, 0x53, 0x37, 0x31, 0x55, 0x52, 0x59, 0x4b, 0x36, 0x54, 0x6d, 0x70, 0x59, 0x54, - 0x53, 0x33, 0x78, 0x4d, 0x76, 0x58, 0x2f, 0x31, 0x6a, 0x58, 0x65, 0x4e, 0x6a, 0x38, 0x76, 0x66, 0x7a, 0x5a, - 0x4d, 0x6b, 0x6a, 0x4d, 0x2b, 0x43, 0x64, 0x49, 0x45, 0x75, 0x57, 0x48, 0x57, 0x42, 0x70, 0x6f, 0x61, 0x4a, - 0x4b, 0x6e, 0x36, 0x6d, 0x6c, 0x50, 0x48, 0x2f, 0x69, 0x54, 0x66, 0x6c, 0x54, 0x4f, 0x55, 0x4a, 0x65, 0x59, - 0x58, 0x5c, 0x0a, - 0x09, 0x46, 0x75, 0x43, 0x63, 0x77, 0x2f, 0x57, 0x33, 0x33, 0x59, 0x59, 0x2f, 0x66, 0x76, 0x2b, 0x66, 0x6d, - 0x32, 0x50, 0x39, 0x71, 0x37, 0x2f, 0x36, 0x36, 0x2f, 0x69, 0x72, 0x4f, 0x35, 0x7a, 0x37, 0x4e, 0x37, 0x7a, - 0x35, 0x7a, 0x66, 0x6a, 0x73, 0x5a, 0x7a, 0x38, 0x6e, 0x79, 0x72, 0x37, 0x2b, 0x76, 0x2f, 0x30, 0x75, 0x46, - 0x67, 0x59, 0x2b, 0x6a, 0x56, 0x38, 0x61, 0x4c, 0x46, 0x55, 0x2f, 0x66, 0x53, 0x37, 0x64, 0x52, 0x50, 0x4e, - 0x66, 0x5c, 0x0a, - 0x09, 0x38, 0x30, 0x62, 0x73, 0x2f, 0x33, 0x72, 0x38, 0x41, 0x4e, 0x67, 0x35, 0x4c, 0x62, 0x75, 0x36, 0x4c, - 0x4b, 0x6c, 0x79, 0x6d, 0x6c, 0x2b, 0x74, 0x72, 0x7a, 0x52, 0x49, 0x70, 0x4b, 0x37, 0x5a, 0x44, 0x4b, 0x61, - 0x32, 0x38, 0x34, 0x64, 0x72, 0x4b, 0x6f, 0x46, 0x50, 0x39, 0x4f, 0x42, 0x47, 0x48, 0x73, 0x6d, 0x78, 0x57, - 0x2f, 0x56, 0x59, 0x65, 0x78, 0x66, 0x66, 0x65, 0x74, 0x2b, 0x44, 0x4c, 0x77, 0x62, 0x71, 0x67, 0x4c, 0x6e, - 0x57, 0x5c, 0x0a, - 0x09, 0x74, 0x4f, 0x59, 0x5a, 0x77, 0x43, 0x6e, 0x6e, 0x50, 0x53, 0x34, 0x6f, 0x35, 0x31, 0x51, 0x41, 0x56, - 0x7a, 0x72, 0x34, 0x78, 0x78, 0x35, 0x48, 0x49, 0x32, 0x4b, 0x4b, 0x34, 0x6a, 0x44, 0x4f, 0x63, 0x32, 0x71, - 0x4f, 0x33, 0x73, 0x30, 0x52, 0x6f, 0x53, 0x6c, 0x56, 0x58, 0x54, 0x6e, 0x71, 0x6a, 0x75, 0x72, 0x44, 0x6a, - 0x68, 0x6a, 0x63, 0x2b, 0x62, 0x55, 0x52, 0x57, 0x35, 0x45, 0x74, 0x35, 0x59, 0x48, 0x2f, 0x50, 0x70, 0x37, - 0x69, 0x5c, 0x0a, - 0x09, 0x71, 0x79, 0x77, 0x78, 0x74, 0x37, 0x44, 0x67, 0x66, 0x36, 0x4b, 0x63, 0x2f, 0x50, 0x57, 0x70, 0x69, - 0x55, 0x6c, 0x38, 0x36, 0x79, 0x75, 0x66, 0x52, 0x37, 0x66, 0x6e, 0x35, 0x37, 0x59, 0x42, 0x36, 0x5a, 0x2f, - 0x37, 0x76, 0x42, 0x2f, 0x42, 0x6c, 0x37, 0x37, 0x32, 0x56, 0x62, 0x50, 0x6e, 0x37, 0x56, 0x4e, 0x62, 0x38, - 0x61, 0x2b, 0x66, 0x2f, 0x77, 0x4b, 0x79, 0x4c, 0x45, 0x4f, 0x57, 0x45, 0x38, 0x34, 0x2b, 0x2f, 0x77, 0x49, - 0x63, 0x5c, 0x0a, - 0x09, 0x6e, 0x70, 0x2b, 0x50, 0x55, 0x39, 0x59, 0x38, 0x79, 0x7a, 0x41, 0x78, 0x4d, 0x5a, 0x6b, 0x77, 0x6f, - 0x4d, 0x66, 0x49, 0x2b, 0x57, 0x79, 0x4b, 0x6e, 0x4c, 0x79, 0x75, 0x70, 0x51, 0x75, 0x77, 0x74, 0x6c, 0x62, - 0x4b, 0x4a, 0x47, 0x79, 0x39, 0x72, 0x5a, 0x53, 0x50, 0x48, 0x46, 0x56, 0x45, 0x58, 0x73, 0x45, 0x65, 0x52, - 0x32, 0x56, 0x75, 0x54, 0x62, 0x2b, 0x47, 0x62, 0x50, 0x55, 0x76, 0x64, 0x4c, 0x38, 0x41, 0x34, 0x4c, 0x45, - 0x41, 0x5c, 0x0a, - 0x09, 0x72, 0x69, 0x55, 0x41, 0x74, 0x36, 0x31, 0x78, 0x4a, 0x72, 0x41, 0x75, 0x47, 0x51, 0x41, 0x42, 0x48, - 0x51, 0x66, 0x38, 0x4e, 0x55, 0x44, 0x62, 0x4f, 0x52, 0x4c, 0x7a, 0x4b, 0x41, 0x39, 0x77, 0x67, 0x61, 0x53, - 0x70, 0x5a, 0x58, 0x43, 0x72, 0x46, 0x44, 0x58, 0x54, 0x2b, 0x43, 0x41, 0x6a, 0x67, 0x78, 0x4f, 0x6f, 0x4c, - 0x65, 0x4e, 0x72, 0x58, 0x56, 0x64, 0x48, 0x49, 0x34, 0x6e, 0x59, 0x5a, 0x4b, 0x69, 0x79, 0x6d, 0x66, 0x4f, - 0x6d, 0x5c, 0x0a, - 0x09, 0x62, 0x4d, 0x4c, 0x46, 0x66, 0x35, 0x62, 0x42, 0x70, 0x61, 0x44, 0x41, 0x2b, 0x32, 0x33, 0x36, 0x5a, - 0x64, 0x33, 0x53, 0x75, 0x64, 0x72, 0x35, 0x51, 0x31, 0x30, 0x48, 0x7a, 0x4d, 0x7a, 0x4e, 0x34, 0x68, 0x64, - 0x65, 0x2f, 0x65, 0x76, 0x34, 0x78, 0x72, 0x30, 0x7a, 0x2b, 0x4d, 0x61, 0x39, 0x4d, 0x37, 0x6a, 0x6d, 0x6e, - 0x6f, 0x4f, 0x34, 0x35, 0x74, 0x34, 0x5a, 0x44, 0x4d, 0x6f, 0x51, 0x78, 0x56, 0x50, 0x54, 0x6e, 0x6c, 0x74, - 0x63, 0x5c, 0x0a, - 0x09, 0x77, 0x70, 0x32, 0x7a, 0x53, 0x37, 0x68, 0x74, 0x5a, 0x67, 0x36, 0x2f, 0x2f, 0x65, 0x59, 0x2f, 0x77, - 0x4f, 0x48, 0x35, 0x65, 0x64, 0x2b, 0x7a, 0x41, 0x34, 0x68, 0x51, 0x72, 0x64, 0x63, 0x73, 0x43, 0x75, 0x6e, - 0x70, 0x6a, 0x4d, 0x62, 0x4f, 0x41, 0x35, 0x72, 0x6b, 0x78, 0x6b, 0x76, 0x4c, 0x48, 0x45, 0x33, 0x4c, 0x70, - 0x4f, 0x35, 0x50, 0x79, 0x71, 0x55, 0x5a, 0x74, 0x45, 0x4e, 0x64, 0x78, 0x34, 0x36, 0x6b, 0x62, 0x70, 0x75, - 0x6a, 0x5c, 0x0a, - 0x09, 0x76, 0x6b, 0x56, 0x53, 0x30, 0x36, 0x6b, 0x46, 0x36, 0x63, 0x78, 0x47, 0x74, 0x74, 0x49, 0x55, 0x56, - 0x44, 0x69, 0x50, 0x56, 0x64, 0x76, 0x6a, 0x42, 0x50, 0x77, 0x4e, 0x41, 0x52, 0x4e, 0x72, 0x47, 0x35, 0x6f, - 0x39, 0x72, 0x53, 0x6b, 0x41, 0x68, 0x4f, 0x67, 0x50, 0x34, 0x50, 0x55, 0x41, 0x4c, 0x74, 0x41, 0x4b, 0x72, - 0x5a, 0x55, 0x69, 0x55, 0x7a, 0x43, 0x4e, 0x71, 0x76, 0x77, 0x63, 0x49, 0x4a, 0x56, 0x67, 0x4f, 0x5a, 0x77, - 0x56, 0x5c, 0x0a, - 0x09, 0x4c, 0x57, 0x6f, 0x46, 0x2b, 0x4e, 0x5a, 0x53, 0x35, 0x37, 0x53, 0x6a, 0x62, 0x75, 0x69, 0x44, 0x67, - 0x35, 0x5a, 0x74, 0x4d, 0x44, 0x55, 0x63, 0x68, 0x66, 0x5a, 0x30, 0x32, 0x6d, 0x63, 0x5a, 0x7a, 0x69, 0x6a, - 0x44, 0x43, 0x48, 0x78, 0x61, 0x55, 0x63, 0x6c, 0x56, 0x42, 0x2f, 0x50, 0x4d, 0x2b, 0x51, 0x47, 0x77, 0x4f, - 0x36, 0x65, 0x45, 0x76, 0x2f, 0x2f, 0x59, 0x78, 0x33, 0x44, 0x77, 0x2f, 0x76, 0x74, 0x5a, 0x78, 0x52, 0x4c, - 0x50, 0x5c, 0x0a, - 0x09, 0x2b, 0x62, 0x45, 0x66, 0x4e, 0x33, 0x6a, 0x33, 0x64, 0x4d, 0x61, 0x42, 0x41, 0x35, 0x34, 0x6e, 0x79, - 0x76, 0x43, 0x68, 0x44, 0x2f, 0x38, 0x76, 0x77, 0x57, 0x46, 0x6f, 0x74, 0x78, 0x67, 0x75, 0x49, 0x36, 0x78, - 0x71, 0x42, 0x39, 0x31, 0x4a, 0x66, 0x66, 0x43, 0x32, 0x74, 0x62, 0x37, 0x54, 0x47, 0x46, 0x33, 0x4c, 0x4a, - 0x4d, 0x31, 0x2b, 0x4c, 0x4c, 0x32, 0x47, 0x55, 0x70, 0x61, 0x75, 0x6f, 0x4d, 0x70, 0x70, 0x76, 0x72, 0x6a, - 0x4d, 0x5c, 0x0a, - 0x09, 0x30, 0x34, 0x69, 0x64, 0x39, 0x70, 0x66, 0x32, 0x54, 0x4d, 0x6d, 0x31, 0x70, 0x67, 0x77, 0x6e, 0x4c, - 0x5a, 0x6e, 0x61, 0x68, 0x58, 0x57, 0x39, 0x71, 0x6e, 0x2b, 0x57, 0x41, 0x2f, 0x34, 0x48, 0x49, 0x4b, 0x62, - 0x50, 0x61, 0x30, 0x4a, 0x72, 0x42, 0x67, 0x41, 0x6e, 0x31, 0x36, 0x6e, 0x2f, 0x45, 0x78, 0x7a, 0x77, 0x47, - 0x71, 0x30, 0x77, 0x79, 0x79, 0x6b, 0x41, 0x62, 0x53, 0x4a, 0x70, 0x75, 0x73, 0x58, 0x4c, 0x42, 0x45, 0x46, - 0x62, 0x5c, 0x0a, - 0x09, 0x4b, 0x61, 0x47, 0x75, 0x7a, 0x36, 0x4d, 0x64, 0x4e, 0x79, 0x51, 0x4c, 0x63, 0x4f, 0x6f, 0x32, 0x6e, - 0x4c, 0x69, 0x6d, 0x77, 0x53, 0x41, 0x6c, 0x65, 0x36, 0x32, 0x43, 0x31, 0x48, 0x58, 0x62, 0x45, 0x48, 0x67, - 0x38, 0x74, 0x59, 0x33, 0x55, 0x36, 0x41, 0x35, 0x5a, 0x6c, 0x71, 0x6d, 0x37, 0x54, 0x6e, 0x57, 0x74, 0x35, - 0x65, 0x55, 0x68, 0x2f, 0x76, 0x75, 0x62, 0x33, 0x67, 0x6a, 0x6e, 0x79, 0x75, 0x71, 0x4f, 0x41, 0x4f, 0x47, - 0x43, 0x5c, 0x0a, - 0x09, 0x4a, 0x7a, 0x38, 0x4e, 0x35, 0x7a, 0x2f, 0x36, 0x66, 0x4c, 0x4f, 0x48, 0x43, 0x37, 0x2f, 0x76, 0x4b, - 0x58, 0x41, 0x41, 0x4c, 0x76, 0x2f, 0x6f, 0x52, 0x2f, 0x46, 0x41, 0x2f, 0x42, 0x56, 0x65, 0x56, 0x73, 0x59, - 0x42, 0x45, 0x2b, 0x4d, 0x54, 0x63, 0x43, 0x53, 0x6a, 0x4e, 0x65, 0x39, 0x5a, 0x36, 0x31, 0x4f, 0x4f, 0x33, - 0x35, 0x6d, 0x79, 0x56, 0x6b, 0x4e, 0x4b, 0x64, 0x47, 0x49, 0x42, 0x4f, 0x6a, 0x2f, 0x6d, 0x75, 0x76, 0x4c, - 0x66, 0x5c, 0x0a, - 0x09, 0x4e, 0x58, 0x2b, 0x6b, 0x64, 0x43, 0x46, 0x72, 0x4e, 0x6a, 0x6b, 0x6f, 0x6e, 0x33, 0x35, 0x49, 0x59, - 0x4a, 0x4d, 0x52, 0x58, 0x6f, 0x4e, 0x39, 0x34, 0x47, 0x65, 0x6c, 0x37, 0x49, 0x66, 0x58, 0x54, 0x38, 0x76, - 0x51, 0x7a, 0x78, 0x48, 0x77, 0x77, 0x77, 0x35, 0x72, 0x75, 0x78, 0x36, 0x77, 0x31, 0x6c, 0x4f, 0x41, 0x4b, - 0x51, 0x41, 0x66, 0x6f, 0x4b, 0x71, 0x66, 0x5a, 0x6f, 0x4d, 0x6d, 0x59, 0x53, 0x6a, 0x38, 0x30, 0x34, 0x71, - 0x61, 0x5c, 0x0a, - 0x09, 0x4f, 0x73, 0x72, 0x6f, 0x44, 0x4d, 0x47, 0x69, 0x4f, 0x6c, 0x4b, 0x6c, 0x61, 0x57, 0x6e, 0x54, 0x63, - 0x52, 0x4d, 0x77, 0x70, 0x47, 0x6c, 0x67, 0x62, 0x59, 0x49, 0x36, 0x45, 0x6b, 0x71, 0x65, 0x6e, 0x46, 0x6d, - 0x2f, 0x6a, 0x71, 0x51, 0x75, 0x4d, 0x61, 0x54, 0x41, 0x73, 0x32, 0x34, 0x76, 0x39, 0x44, 0x6b, 0x78, 0x4e, - 0x6f, 0x59, 0x38, 0x34, 0x33, 0x64, 0x7a, 0x4b, 0x58, 0x34, 0x51, 0x41, 0x5a, 0x2f, 0x37, 0x30, 0x70, 0x64, - 0x77, 0x5c, 0x0a, - 0x09, 0x32, 0x38, 0x32, 0x33, 0x69, 0x47, 0x75, 0x2f, 0x2b, 0x47, 0x75, 0x76, 0x78, 0x65, 0x54, 0x45, 0x42, - 0x44, 0x68, 0x4e, 0x54, 0x6b, 0x7a, 0x67, 0x36, 0x63, 0x39, 0x35, 0x48, 0x67, 0x6a, 0x41, 0x6e, 0x2f, 0x37, - 0x5a, 0x6e, 0x38, 0x69, 0x6f, 0x58, 0x54, 0x55, 0x35, 0x31, 0x75, 0x38, 0x6a, 0x7a, 0x33, 0x4d, 0x68, 0x48, - 0x7a, 0x33, 0x47, 0x6c, 0x45, 0x2b, 0x62, 0x39, 0x4f, 0x4b, 0x71, 0x42, 0x4f, 0x62, 0x36, 0x76, 0x4f, 0x56, - 0x45, 0x5c, 0x0a, - 0x09, 0x64, 0x67, 0x59, 0x6d, 0x75, 0x65, 0x41, 0x36, 0x73, 0x4f, 0x39, 0x56, 0x49, 0x4a, 0x46, 0x33, 0x57, - 0x71, 0x4c, 0x2b, 0x7a, 0x75, 0x4f, 0x39, 0x74, 0x73, 0x6e, 0x36, 0x75, 0x77, 0x77, 0x79, 0x4b, 0x62, 0x2b, - 0x6b, 0x76, 0x71, 0x63, 0x5a, 0x44, 0x79, 0x2f, 0x6c, 0x67, 0x50, 0x63, 0x44, 0x32, 0x49, 0x55, 0x31, 0x70, - 0x44, 0x55, 0x42, 0x41, 0x4a, 0x61, 0x32, 0x2f, 0x43, 0x36, 0x41, 0x76, 0x65, 0x47, 0x4c, 0x54, 0x6f, 0x74, - 0x71, 0x5c, 0x0a, - 0x09, 0x70, 0x63, 0x74, 0x55, 0x6b, 0x58, 0x38, 0x47, 0x6b, 0x56, 0x74, 0x52, 0x67, 0x4b, 0x41, 0x56, 0x55, - 0x46, 0x4e, 0x54, 0x31, 0x4e, 0x44, 0x6d, 0x6b, 0x46, 0x4c, 0x4b, 0x59, 0x35, 0x4d, 0x52, 0x61, 0x77, 0x50, - 0x54, 0x64, 0x79, 0x4d, 0x34, 0x2f, 0x32, 0x6b, 0x64, 0x75, 0x32, 0x63, 0x72, 0x55, 0x74, 0x6d, 0x4c, 0x66, - 0x2f, 0x55, 0x34, 0x4a, 0x73, 0x62, 0x48, 0x68, 0x57, 0x4f, 0x47, 0x6a, 0x70, 0x30, 0x44, 0x43, 0x6c, 0x66, - 0x69, 0x5c, 0x0a, - 0x09, 0x37, 0x57, 0x2f, 0x35, 0x50, 0x5a, 0x38, 0x46, 0x41, 0x48, 0x43, 0x75, 0x78, 0x41, 0x6d, 0x6e, 0x37, - 0x73, 0x56, 0x50, 0x76, 0x4f, 0x53, 0x6c, 0x6f, 0x73, 0x58, 0x48, 0x58, 0x2f, 0x51, 0x45, 0x62, 0x4a, 0x6d, - 0x61, 0x78, 0x72, 0x56, 0x66, 0x2b, 0x78, 0x70, 0x75, 0x76, 0x66, 0x4f, 0x75, 0x68, 0x4d, 0x46, 0x75, 0x74, - 0x34, 0x74, 0x65, 0x74, 0x61, 0x43, 0x34, 0x6b, 0x71, 0x79, 0x74, 0x72, 0x49, 0x31, 0x48, 0x35, 0x2f, 0x53, - 0x63, 0x5c, 0x0a, - 0x09, 0x2f, 0x63, 0x66, 0x62, 0x74, 0x7a, 0x49, 0x71, 0x4c, 0x6e, 0x57, 0x39, 0x57, 0x4a, 0x68, 0x47, 0x5a, - 0x4e, 0x75, 0x4a, 0x39, 0x56, 0x69, 0x61, 0x2b, 0x4e, 0x64, 0x6a, 0x6c, 0x59, 0x42, 0x56, 0x63, 0x79, 0x53, - 0x64, 0x6d, 0x43, 0x42, 0x44, 0x54, 0x6e, 0x71, 0x33, 0x77, 0x51, 0x62, 0x4b, 0x43, 0x43, 0x63, 0x37, 0x43, - 0x58, 0x67, 0x58, 0x41, 0x4a, 0x78, 0x79, 0x33, 0x76, 0x64, 0x69, 0x4c, 0x57, 0x6a, 0x56, 0x41, 0x59, 0x43, - 0x6c, 0x5c, 0x0a, - 0x09, 0x2f, 0x6b, 0x38, 0x42, 0x38, 0x44, 0x4b, 0x41, 0x43, 0x31, 0x45, 0x65, 0x61, 0x55, 0x63, 0x4f, 0x33, - 0x37, 0x54, 0x67, 0x72, 0x62, 0x54, 0x62, 0x64, 0x6d, 0x49, 0x79, 0x6a, 0x6d, 0x77, 0x44, 0x30, 0x6d, 0x6c, - 0x62, 0x66, 0x54, 0x35, 0x64, 0x48, 0x34, 0x43, 0x71, 0x59, 0x77, 0x47, 0x43, 0x42, 0x6a, 0x49, 0x35, 0x70, - 0x68, 0x52, 0x30, 0x67, 0x6f, 0x6f, 0x74, 0x41, 0x36, 0x76, 0x37, 0x63, 0x67, 0x6d, 0x6f, 0x63, 0x46, 0x35, - 0x43, 0x5c, 0x0a, - 0x09, 0x65, 0x5a, 0x44, 0x50, 0x42, 0x43, 0x6a, 0x4c, 0x5a, 0x43, 0x45, 0x34, 0x4f, 0x4f, 0x66, 0x77, 0x70, - 0x53, 0x75, 0x76, 0x78, 0x41, 0x33, 0x66, 0x2b, 0x45, 0x5a, 0x39, 0x69, 0x54, 0x4a, 0x73, 0x6e, 0x64, 0x6f, - 0x71, 0x57, 0x68, 0x34, 0x4d, 0x2f, 0x43, 0x37, 0x4b, 0x39, 0x37, 0x33, 0x37, 0x58, 0x53, 0x6a, 0x4b, 0x38, - 0x4c, 0x69, 0x47, 0x37, 0x36, 0x57, 0x54, 0x35, 0x52, 0x6a, 0x76, 0x6a, 0x37, 0x45, 0x7a, 0x64, 0x6d, 0x59, - 0x47, 0x5c, 0x0a, - 0x09, 0x34, 0x33, 0x74, 0x36, 0x47, 0x7a, 0x58, 0x49, 0x6c, 0x7a, 0x74, 0x73, 0x43, 0x67, 0x70, 0x4e, 0x49, - 0x4a, 0x33, 0x61, 0x51, 0x56, 0x70, 0x53, 0x36, 0x30, 0x69, 0x57, 0x53, 0x4f, 0x57, 0x5a, 0x42, 0x70, 0x7a, - 0x6d, 0x30, 0x6a, 0x71, 0x44, 0x43, 0x36, 0x76, 0x39, 0x54, 0x70, 0x7a, 0x6e, 0x77, 0x4d, 0x33, 0x7a, 0x75, - 0x39, 0x48, 0x32, 0x77, 0x38, 0x64, 0x55, 0x31, 0x38, 0x4c, 0x7a, 0x43, 0x66, 0x52, 0x63, 0x42, 0x37, 0x63, - 0x6d, 0x5c, 0x0a, - 0x09, 0x55, 0x34, 0x47, 0x31, 0x6d, 0x67, 0x4c, 0x30, 0x41, 0x50, 0x77, 0x52, 0x59, 0x4b, 0x63, 0x34, 0x51, - 0x42, 0x6f, 0x4a, 0x72, 0x47, 0x67, 0x71, 0x68, 0x52, 0x7a, 0x71, 0x4e, 0x54, 0x76, 0x78, 0x61, 0x46, 0x57, - 0x6e, 0x62, 0x71, 0x33, 0x76, 0x4e, 0x2f, 0x4e, 0x53, 0x6f, 0x77, 0x78, 0x51, 0x47, 0x34, 0x72, 0x64, 0x68, - 0x70, 0x30, 0x33, 0x61, 0x47, 0x43, 0x77, 0x44, 0x4e, 0x55, 0x78, 0x33, 0x6b, 0x49, 0x5a, 0x57, 0x34, 0x62, - 0x73, 0x5c, 0x0a, - 0x09, 0x58, 0x4a, 0x5a, 0x68, 0x63, 0x6e, 0x77, 0x63, 0x47, 0x54, 0x39, 0x5a, 0x37, 0x59, 0x45, 0x76, 0x48, - 0x66, 0x44, 0x4f, 0x74, 0x37, 0x37, 0x56, 0x31, 0x36, 0x45, 0x4d, 0x7a, 0x70, 0x58, 0x34, 0x36, 0x68, 0x65, - 0x2f, 0x4b, 0x4f, 0x44, 0x34, 0x47, 0x39, 0x64, 0x65, 0x69, 0x37, 0x74, 0x75, 0x76, 0x77, 0x31, 0x58, 0x66, - 0x65, 0x4d, 0x62, 0x64, 0x63, 0x74, 0x45, 0x79, 0x49, 0x67, 0x77, 0x50, 0x6a, 0x59, 0x47, 0x30, 0x4d, 0x72, - 0x47, 0x5c, 0x0a, - 0x09, 0x79, 0x78, 0x32, 0x36, 0x50, 0x75, 0x2f, 0x4d, 0x73, 0x76, 0x55, 0x34, 0x77, 0x78, 0x68, 0x72, 0x71, - 0x59, 0x32, 0x4f, 0x2b, 0x46, 0x4c, 0x2b, 0x6c, 0x73, 0x78, 0x31, 0x41, 0x4a, 0x48, 0x31, 0x6e, 0x61, 0x45, - 0x2f, 0x32, 0x31, 0x4b, 0x73, 0x49, 0x4d, 0x48, 0x62, 0x31, 0x2b, 0x4d, 0x6a, 0x79, 0x44, 0x37, 0x34, 0x4f, - 0x4d, 0x4e, 0x31, 0x76, 0x59, 0x69, 0x73, 0x78, 0x77, 0x46, 0x52, 0x4e, 0x73, 0x72, 0x6e, 0x6e, 0x56, 0x69, - 0x6a, 0x5c, 0x0a, - 0x09, 0x35, 0x77, 0x52, 0x57, 0x46, 0x51, 0x42, 0x4f, 0x71, 0x58, 0x66, 0x37, 0x58, 0x51, 0x70, 0x67, 0x76, - 0x7a, 0x5a, 0x63, 0x4f, 0x55, 0x69, 0x6e, 0x6c, 0x4b, 0x63, 0x46, 0x7a, 0x38, 0x30, 0x7a, 0x7a, 0x52, 0x78, - 0x53, 0x51, 0x4c, 0x41, 0x53, 0x4f, 0x6d, 0x35, 0x49, 0x55, 0x75, 0x7a, 0x63, 0x52, 0x45, 0x4d, 0x45, 0x34, - 0x69, 0x6c, 0x64, 0x65, 0x6e, 0x74, 0x4c, 0x4c, 0x74, 0x44, 0x70, 0x73, 0x61, 0x56, 0x4b, 0x74, 0x61, 0x63, - 0x61, 0x5c, 0x0a, - 0x09, 0x61, 0x5a, 0x54, 0x68, 0x57, 0x32, 0x5a, 0x34, 0x4f, 0x62, 0x76, 0x2b, 0x79, 0x47, 0x69, 0x62, 0x5a, - 0x52, 0x67, 0x62, 0x47, 0x36, 0x39, 0x37, 0x69, 0x51, 0x30, 0x34, 0x66, 0x4f, 0x33, 0x61, 0x61, 0x2f, 0x43, - 0x64, 0x36, 0x37, 0x38, 0x46, 0x35, 0x2f, 0x77, 0x64, 0x67, 0x32, 0x39, 0x2b, 0x34, 0x31, 0x72, 0x77, 0x38, - 0x64, 0x39, 0x37, 0x2f, 0x33, 0x31, 0x34, 0x31, 0x39, 0x76, 0x65, 0x69, 0x6d, 0x47, 0x31, 0x31, 0x54, 0x65, - 0x30, 0x5c, 0x0a, - 0x09, 0x50, 0x54, 0x59, 0x2b, 0x44, 0x6d, 0x53, 0x5a, 0x45, 0x5a, 0x6d, 0x62, 0x62, 0x34, 0x31, 0x79, 0x47, - 0x4c, 0x41, 0x63, 0x4d, 0x5a, 0x53, 0x51, 0x33, 0x31, 0x31, 0x53, 0x54, 0x67, 0x4f, 0x39, 0x76, 0x65, 0x47, - 0x4c, 0x75, 0x55, 0x6c, 0x44, 0x41, 0x4c, 0x44, 0x41, 0x51, 0x6b, 0x74, 0x62, 0x66, 0x37, 0x4e, 0x73, 0x31, - 0x78, 0x71, 0x50, 0x46, 0x5a, 0x6a, 0x30, 0x64, 0x54, 0x31, 0x4f, 0x69, 0x77, 0x39, 0x65, 0x54, 0x67, 0x63, - 0x51, 0x5c, 0x0a, - 0x09, 0x42, 0x35, 0x78, 0x41, 0x77, 0x47, 0x75, 0x42, 0x31, 0x56, 0x38, 0x51, 0x58, 0x46, 0x55, 0x41, 0x71, - 0x41, 0x61, 0x78, 0x78, 0x77, 0x47, 0x2f, 0x72, 0x71, 0x39, 0x5a, 0x77, 0x74, 0x4c, 0x58, 0x77, 0x2b, 0x63, - 0x6f, 0x51, 0x30, 0x6c, 0x54, 0x77, 0x50, 0x44, 0x70, 0x7a, 0x59, 0x51, 0x4c, 0x7a, 0x7a, 0x49, 0x2b, 0x4f, - 0x34, 0x4a, 0x70, 0x46, 0x4c, 0x66, 0x63, 0x72, 0x38, 0x62, 0x37, 0x4e, 0x50, 0x4d, 0x59, 0x48, 0x61, 0x45, - 0x31, 0x5c, 0x0a, - 0x09, 0x57, 0x59, 0x62, 0x50, 0x46, 0x78, 0x41, 0x44, 0x49, 0x4e, 0x69, 0x5a, 0x68, 0x46, 0x77, 0x77, 0x6c, - 0x65, 0x6b, 0x6f, 0x30, 0x4f, 0x6c, 0x30, 0x4b, 0x78, 0x44, 0x77, 0x49, 0x77, 0x6b, 0x50, 0x32, 0x4a, 0x51, - 0x4f, 0x2b, 0x4a, 0x50, 0x33, 0x76, 0x41, 0x64, 0x45, 0x47, 0x51, 0x37, 0x64, 0x66, 0x7a, 0x2f, 0x75, 0x76, - 0x50, 0x4e, 0x4f, 0x61, 0x4d, 0x6c, 0x2b, 0x34, 0x53, 0x76, 0x2f, 0x35, 0x6f, 0x2b, 0x71, 0x30, 0x2f, 0x33, - 0x2b, 0x5c, 0x0a, - 0x09, 0x47, 0x44, 0x70, 0x35, 0x62, 0x68, 0x70, 0x31, 0x55, 0x2b, 0x6f, 0x4e, 0x53, 0x50, 0x6c, 0x77, 0x4a, - 0x7a, 0x67, 0x61, 0x4d, 0x4c, 0x43, 0x69, 0x65, 0x39, 0x32, 0x4f, 0x64, 0x63, 0x73, 0x33, 0x35, 0x57, 0x5a, - 0x55, 0x50, 0x79, 0x6b, 0x41, 0x31, 0x2b, 0x57, 0x34, 0x6a, 0x56, 0x68, 0x6a, 0x67, 0x43, 0x71, 0x6a, 0x36, - 0x7a, 0x58, 0x33, 0x54, 0x36, 0x59, 0x63, 0x41, 0x6b, 0x77, 0x47, 0x63, 0x4e, 0x4d, 0x77, 0x70, 0x4f, 0x7a, - 0x73, 0x5c, 0x0a, - 0x09, 0x55, 0x67, 0x43, 0x6e, 0x47, 0x36, 0x7a, 0x2f, 0x75, 0x32, 0x6a, 0x56, 0x41, 0x43, 0x41, 0x73, 0x55, - 0x6a, 0x6a, 0x67, 0x31, 0x51, 0x43, 0x32, 0x36, 0x6b, 0x48, 0x57, 0x2f, 0x2f, 0x75, 0x6a, 0x4a, 0x73, 0x4f, - 0x6f, 0x53, 0x36, 0x52, 0x4f, 0x78, 0x6f, 0x2b, 0x62, 0x6f, 0x72, 0x45, 0x76, 0x55, 0x78, 0x73, 0x4b, 0x78, - 0x48, 0x6c, 0x74, 0x42, 0x4a, 0x4b, 0x76, 0x2b, 0x6c, 0x4f, 0x36, 0x6e, 0x2b, 0x58, 0x73, 0x54, 0x57, 0x33, - 0x7a, 0x5c, 0x0a, - 0x09, 0x53, 0x47, 0x47, 0x68, 0x75, 0x6a, 0x51, 0x75, 0x53, 0x73, 0x37, 0x72, 0x4d, 0x65, 0x68, 0x65, 0x6d, - 0x32, 0x35, 0x4e, 0x31, 0x52, 0x48, 0x5a, 0x6f, 0x64, 0x76, 0x74, 0x6f, 0x74, 0x2f, 0x72, 0x2b, 0x58, 0x4f, - 0x73, 0x30, 0x47, 0x65, 0x75, 0x75, 0x41, 0x4c, 0x33, 0x33, 0x33, 0x4d, 0x33, 0x72, 0x76, 0x7a, 0x79, 0x46, - 0x78, 0x56, 0x55, 0x41, 0x75, 0x6a, 0x31, 0x73, 0x54, 0x52, 0x59, 0x38, 0x6a, 0x30, 0x37, 0x76, 0x2b, 0x6a, - 0x58, 0x5c, 0x0a, - 0x09, 0x37, 0x58, 0x5a, 0x5a, 0x36, 0x7a, 0x4c, 0x62, 0x30, 0x6d, 0x44, 0x56, 0x6c, 0x4d, 0x6f, 0x32, 0x36, - 0x64, 0x69, 0x4a, 0x36, 0x7a, 0x6f, 0x66, 0x30, 0x32, 0x4f, 0x79, 0x49, 0x71, 0x6b, 0x64, 0x50, 0x54, 0x6d, - 0x2f, 0x2b, 0x6c, 0x6f, 0x54, 0x49, 0x4d, 0x73, 0x65, 0x6d, 0x36, 0x36, 0x6b, 0x5a, 0x41, 0x55, 0x78, 0x4b, - 0x33, 0x74, 0x49, 0x4e, 0x63, 0x55, 0x42, 0x58, 0x6d, 0x65, 0x6a, 0x30, 0x6a, 0x59, 0x59, 0x37, 0x33, 0x30, - 0x43, 0x5c, 0x0a, - 0x09, 0x66, 0x68, 0x56, 0x59, 0x33, 0x53, 0x78, 0x67, 0x46, 0x54, 0x4d, 0x41, 0x42, 0x77, 0x4b, 0x4e, 0x41, - 0x2f, 0x69, 0x5a, 0x31, 0x41, 0x68, 0x30, 0x76, 0x48, 0x42, 0x4b, 0x4d, 0x62, 0x55, 0x49, 0x56, 0x6b, 0x4c, - 0x6e, 0x75, 0x67, 0x57, 0x72, 0x6c, 0x47, 0x30, 0x4d, 0x2b, 0x6a, 0x78, 0x50, 0x72, 0x6e, 0x51, 0x30, 0x64, - 0x38, 0x6e, 0x5a, 0x74, 0x4c, 0x36, 0x4d, 0x44, 0x6d, 0x6c, 0x76, 0x4b, 0x57, 0x43, 0x52, 0x4d, 0x41, 0x51, - 0x65, 0x5c, 0x0a, - 0x09, 0x76, 0x52, 0x79, 0x6b, 0x66, 0x4a, 0x6f, 0x64, 0x4b, 0x5a, 0x56, 0x69, 0x4c, 0x5a, 0x64, 0x30, 0x79, - 0x32, 0x79, 0x2f, 0x33, 0x30, 0x65, 0x6e, 0x4b, 0x31, 0x38, 0x79, 0x57, 0x35, 0x51, 0x46, 0x2f, 0x75, 0x4c, - 0x39, 0x66, 0x34, 0x79, 0x62, 0x76, 0x76, 0x55, 0x74, 0x31, 0x71, 0x71, 0x6e, 0x5a, 0x63, 0x71, 0x72, 0x78, - 0x33, 0x49, 0x4a, 0x57, 0x5a, 0x35, 0x6a, 0x72, 0x46, 0x72, 0x30, 0x34, 0x2b, 0x4f, 0x74, 0x5a, 0x5a, 0x43, - 0x36, 0x5c, 0x0a, - 0x09, 0x73, 0x77, 0x53, 0x49, 0x4e, 0x4a, 0x70, 0x61, 0x33, 0x37, 0x58, 0x4a, 0x38, 0x33, 0x46, 0x4c, 0x65, - 0x55, 0x6e, 0x64, 0x4e, 0x6f, 0x48, 0x4b, 0x53, 0x73, 0x2b, 0x45, 0x4e, 0x47, 0x56, 0x72, 0x4b, 0x39, 0x30, - 0x4f, 0x64, 0x4f, 0x70, 0x59, 0x36, 0x31, 0x64, 0x71, 0x31, 0x63, 0x35, 0x41, 0x72, 0x44, 0x48, 0x72, 0x67, - 0x47, 0x51, 0x46, 0x4d, 0x57, 0x57, 0x62, 0x50, 0x34, 0x46, 0x56, 0x66, 0x6d, 0x6e, 0x49, 0x71, 0x67, 0x46, - 0x41, 0x5c, 0x0a, - 0x09, 0x70, 0x62, 0x41, 0x6e, 0x41, 0x70, 0x6a, 0x53, 0x5a, 0x71, 0x4c, 0x78, 0x4e, 0x58, 0x57, 0x6d, 0x2b, - 0x73, 0x78, 0x6f, 0x46, 0x65, 0x6f, 0x4e, 0x48, 0x53, 0x6b, 0x50, 0x56, 0x73, 0x53, 0x32, 0x44, 0x4a, 0x42, - 0x7a, 0x4a, 0x46, 0x50, 0x4e, 0x35, 0x70, 0x6b, 0x6d, 0x4c, 0x38, 0x2f, 0x56, 0x62, 0x51, 0x47, 0x55, 0x6a, - 0x49, 0x36, 0x70, 0x71, 0x57, 0x73, 0x6e, 0x53, 0x64, 0x73, 0x64, 0x76, 0x63, 0x48, 0x4a, 0x63, 0x68, 0x52, - 0x64, 0x5c, 0x0a, - 0x09, 0x62, 0x72, 0x78, 0x4b, 0x34, 0x51, 0x48, 0x45, 0x71, 0x63, 0x44, 0x48, 0x4c, 0x37, 0x73, 0x63, 0x68, - 0x77, 0x34, 0x64, 0x42, 0x49, 0x2b, 0x39, 0x57, 0x62, 0x65, 0x48, 0x59, 0x74, 0x6e, 0x50, 0x2f, 0x58, 0x4d, - 0x69, 0x6a, 0x49, 0x2b, 0x50, 0x78, 0x30, 0x5a, 0x47, 0x79, 0x56, 0x71, 0x36, 0x37, 0x61, 0x68, 0x4e, 0x54, - 0x6e, 0x55, 0x70, 0x72, 0x52, 0x4d, 0x39, 0x52, 0x6e, 0x34, 0x74, 0x63, 0x47, 0x67, 0x39, 0x57, 0x38, 0x44, - 0x72, 0x5c, 0x0a, - 0x09, 0x57, 0x7a, 0x71, 0x31, 0x2b, 0x67, 0x2f, 0x58, 0x65, 0x48, 0x39, 0x36, 0x66, 0x44, 0x6f, 0x6f, 0x38, - 0x66, 0x5a, 0x30, 0x42, 0x68, 0x4b, 0x75, 0x42, 0x61, 0x75, 0x32, 0x67, 0x6f, 0x54, 0x57, 0x69, 0x64, 0x57, - 0x58, 0x78, 0x57, 0x46, 0x44, 0x2b, 0x58, 0x45, 0x43, 0x6e, 0x6d, 0x52, 0x57, 0x65, 0x34, 0x69, 0x30, 0x32, - 0x6d, 0x73, 0x41, 0x31, 0x61, 0x73, 0x37, 0x70, 0x47, 0x6d, 0x6b, 0x79, 0x55, 0x33, 0x39, 0x72, 0x56, 0x5a, - 0x67, 0x5c, 0x0a, - 0x09, 0x45, 0x31, 0x78, 0x77, 0x51, 0x63, 0x72, 0x36, 0x70, 0x4b, 0x37, 0x70, 0x43, 0x47, 0x52, 0x46, 0x43, - 0x32, 0x31, 0x34, 0x64, 0x56, 0x38, 0x38, 0x4c, 0x76, 0x73, 0x7a, 0x4e, 0x54, 0x4c, 0x72, 0x2b, 0x56, 0x6c, - 0x74, 0x38, 0x50, 0x70, 0x73, 0x79, 0x72, 0x63, 0x45, 0x43, 0x49, 0x73, 0x58, 0x51, 0x42, 0x70, 0x73, 0x44, - 0x59, 0x70, 0x57, 0x32, 0x33, 0x61, 0x32, 0x6c, 0x42, 0x6f, 0x54, 0x65, 0x59, 0x73, 0x5a, 0x47, 0x30, 0x4f, - 0x57, 0x5c, 0x0a, - 0x09, 0x5a, 0x58, 0x45, 0x71, 0x63, 0x47, 0x52, 0x2b, 0x44, 0x72, 0x66, 0x66, 0x63, 0x58, 0x65, 0x73, 0x34, - 0x51, 0x41, 0x73, 0x35, 0x31, 0x30, 0x55, 0x7a, 0x69, 0x45, 0x6a, 0x51, 0x6e, 0x39, 0x38, 0x48, 0x44, 0x6d, - 0x6c, 0x4f, 0x72, 0x43, 0x4f, 0x72, 0x5a, 0x6a, 0x58, 0x35, 0x48, 0x68, 0x63, 0x6c, 0x72, 0x4a, 0x31, 0x69, - 0x33, 0x50, 0x65, 0x73, 0x6f, 0x50, 0x6d, 0x52, 0x74, 0x65, 0x6f, 0x64, 0x53, 0x79, 0x42, 0x45, 0x4a, 0x44, - 0x79, 0x5c, 0x0a, - 0x09, 0x31, 0x6e, 0x7a, 0x77, 0x36, 0x39, 0x62, 0x74, 0x79, 0x71, 0x4d, 0x42, 0x46, 0x61, 0x33, 0x4c, 0x4a, - 0x6b, 0x43, 0x70, 0x79, 0x2b, 0x6f, 0x46, 0x5a, 0x36, 0x6c, 0x54, 0x6f, 0x4a, 0x36, 0x63, 0x57, 0x54, 0x6f, - 0x48, 0x61, 0x48, 0x5a, 0x30, 0x6b, 0x50, 0x7a, 0x75, 0x61, 0x4c, 0x56, 0x76, 0x41, 0x31, 0x37, 0x6d, 0x67, - 0x42, 0x75, 0x31, 0x73, 0x56, 0x74, 0x71, 0x74, 0x6c, 0x49, 0x75, 0x66, 0x6f, 0x61, 0x6e, 0x52, 0x53, 0x74, - 0x46, 0x5c, 0x0a, - 0x09, 0x43, 0x6b, 0x37, 0x61, 0x52, 0x49, 0x37, 0x6d, 0x63, 0x56, 0x35, 0x2f, 0x72, 0x47, 0x2f, 0x4a, 0x63, - 0x62, 0x44, 0x52, 0x47, 0x7a, 0x68, 0x6b, 0x53, 0x32, 0x6b, 0x30, 0x6c, 0x45, 0x63, 0x36, 0x31, 0x62, 0x50, - 0x71, 0x4e, 0x6b, 0x58, 0x37, 0x4e, 0x4b, 0x72, 0x71, 0x36, 0x5a, 0x4d, 0x73, 0x70, 0x2f, 0x6c, 0x48, 0x6c, - 0x6d, 0x46, 0x69, 0x66, 0x4a, 0x79, 0x39, 0x72, 0x59, 0x72, 0x38, 0x52, 0x70, 0x39, 0x51, 0x76, 0x39, 0x50, - 0x44, 0x5c, 0x0a, - 0x09, 0x59, 0x46, 0x67, 0x41, 0x42, 0x50, 0x52, 0x59, 0x78, 0x67, 0x43, 0x6b, 0x68, 0x74, 0x79, 0x73, 0x73, - 0x78, 0x54, 0x6f, 0x4f, 0x49, 0x56, 0x4d, 0x53, 0x50, 0x44, 0x46, 0x57, 0x6b, 0x71, 0x7a, 0x41, 0x52, 0x6b, - 0x4f, 0x36, 0x72, 0x48, 0x5a, 0x6d, 0x33, 0x31, 0x30, 0x58, 0x37, 0x78, 0x65, 0x55, 0x38, 0x61, 0x67, 0x2b, - 0x2b, 0x59, 0x61, 0x74, 0x32, 0x53, 0x62, 0x6a, 0x71, 0x63, 0x70, 0x6d, 0x30, 0x68, 0x42, 0x4b, 0x72, 0x57, - 0x57, 0x5c, 0x0a, - 0x09, 0x56, 0x46, 0x63, 0x79, 0x6b, 0x36, 0x6e, 0x68, 0x6a, 0x41, 0x63, 0x52, 0x41, 0x46, 0x63, 0x44, 0x37, - 0x74, 0x50, 0x47, 0x73, 0x42, 0x38, 0x79, 0x72, 0x64, 0x6f, 0x62, 0x67, 0x53, 0x35, 0x39, 0x33, 0x73, 0x56, - 0x59, 0x47, 0x67, 0x79, 0x48, 0x64, 0x39, 0x78, 0x39, 0x36, 0x46, 0x38, 0x2b, 0x38, 0x75, 0x55, 0x72, 0x58, - 0x2b, 0x62, 0x50, 0x31, 0x67, 0x50, 0x52, 0x71, 0x54, 0x42, 0x2f, 0x31, 0x4c, 0x4d, 0x75, 0x6d, 0x54, 0x70, - 0x41, 0x5c, 0x0a, - 0x09, 0x2b, 0x4d, 0x62, 0x56, 0x6f, 0x77, 0x57, 0x57, 0x66, 0x6d, 0x72, 0x58, 0x58, 0x67, 0x6d, 0x64, 0x30, - 0x34, 0x63, 0x33, 0x7a, 0x59, 0x69, 0x71, 0x32, 0x72, 0x58, 0x53, 0x4e, 0x4a, 0x33, 0x39, 0x38, 0x46, 0x71, - 0x32, 0x63, 0x30, 0x67, 0x5a, 0x79, 0x64, 0x55, 0x43, 0x44, 0x6d, 0x68, 0x70, 0x56, 0x73, 0x57, 0x58, 0x44, - 0x71, 0x30, 0x4d, 0x49, 0x35, 0x37, 0x4c, 0x4d, 0x6f, 0x79, 0x50, 0x54, 0x32, 0x42, 0x68, 0x59, 0x52, 0x34, - 0x67, 0x5c, 0x0a, - 0x09, 0x34, 0x4e, 0x35, 0x44, 0x42, 0x39, 0x47, 0x76, 0x49, 0x6e, 0x37, 0x5a, 0x37, 0x61, 0x4e, 0x63, 0x58, - 0x45, 0x53, 0x48, 0x4c, 0x66, 0x6f, 0x31, 0x5a, 0x53, 0x61, 0x57, 0x4a, 0x4a, 0x6f, 0x79, 0x6d, 0x69, 0x5a, - 0x67, 0x53, 0x74, 0x74, 0x30, 0x6b, 0x42, 0x4f, 0x37, 0x31, 0x4d, 0x6c, 0x31, 0x57, 0x78, 0x70, 0x59, 0x59, - 0x5a, 0x51, 0x66, 0x31, 0x61, 0x2f, 0x46, 0x76, 0x38, 0x77, 0x35, 0x35, 0x46, 0x68, 0x54, 0x6e, 0x76, 0x30, - 0x56, 0x5c, 0x0a, - 0x09, 0x76, 0x55, 0x4e, 0x54, 0x51, 0x6b, 0x70, 0x71, 0x32, 0x32, 0x6d, 0x77, 0x73, 0x74, 0x39, 0x57, 0x46, - 0x44, 0x61, 0x41, 0x61, 0x5a, 0x74, 0x38, 0x78, 0x54, 0x4f, 0x66, 0x66, 0x45, 0x57, 0x33, 0x6e, 0x7a, 0x76, - 0x4b, 0x64, 0x45, 0x73, 0x50, 0x6e, 0x56, 0x62, 0x74, 0x66, 0x51, 0x44, 0x6c, 0x74, 0x5a, 0x38, 0x45, 0x67, - 0x4a, 0x30, 0x67, 0x75, 0x76, 0x6c, 0x35, 0x72, 0x33, 0x33, 0x48, 0x35, 0x4a, 0x64, 0x76, 0x75, 0x6b, 0x31, - 0x32, 0x5c, 0x0a, - 0x09, 0x68, 0x43, 0x5a, 0x6e, 0x6c, 0x57, 0x52, 0x46, 0x51, 0x46, 0x31, 0x66, 0x6c, 0x78, 0x31, 0x56, 0x58, - 0x76, 0x65, 0x76, 0x79, 0x2b, 0x70, 0x6e, 0x2b, 0x64, 0x4d, 0x34, 0x59, 0x44, 0x6d, 0x6b, 0x62, 0x5a, 0x69, - 0x6a, 0x65, 0x45, 0x72, 0x35, 0x72, 0x2f, 0x75, 0x31, 0x78, 0x6a, 0x6a, 0x4b, 0x38, 0x54, 0x51, 0x6f, 0x6a, - 0x41, 0x49, 0x75, 0x33, 0x76, 0x5a, 0x77, 0x4f, 0x4d, 0x54, 0x38, 0x77, 0x67, 0x4b, 0x49, 0x67, 0x4a, 0x34, - 0x72, 0x5c, 0x0a, - 0x09, 0x30, 0x4d, 0x30, 0x79, 0x7a, 0x46, 0x4d, 0x48, 0x47, 0x59, 0x43, 0x4a, 0x73, 0x59, 0x6d, 0x59, 0x44, - 0x7a, 0x62, 0x70, 0x36, 0x57, 0x67, 0x79, 0x46, 0x58, 0x73, 0x38, 0x6f, 0x31, 0x37, 0x74, 0x5a, 0x58, 0x50, - 0x63, 0x4a, 0x41, 0x66, 0x4c, 0x39, 0x4a, 0x76, 0x73, 0x61, 0x5a, 0x51, 0x74, 0x57, 0x66, 0x58, 0x74, 0x74, - 0x6c, 0x49, 0x75, 0x64, 0x45, 0x42, 0x72, 0x41, 0x72, 0x76, 0x56, 0x73, 0x4e, 0x31, 0x77, 0x2f, 0x4e, 0x52, - 0x48, 0x5c, 0x0a, - 0x09, 0x50, 0x68, 0x78, 0x2f, 0x39, 0x6c, 0x39, 0x66, 0x73, 0x67, 0x79, 0x34, 0x41, 0x77, 0x42, 0x75, 0x7a, - 0x63, 0x35, 0x36, 0x43, 0x6c, 0x61, 0x44, 0x56, 0x6e, 0x63, 0x4b, 0x51, 0x50, 0x52, 0x7a, 0x41, 0x43, 0x5a, - 0x2f, 0x37, 0x32, 0x55, 0x2f, 0x69, 0x75, 0x33, 0x6a, 0x31, 0x54, 0x76, 0x51, 0x77, 0x4a, 0x32, 0x70, 0x4a, - 0x71, 0x31, 0x59, 0x50, 0x6d, 0x42, 0x39, 0x57, 0x30, 0x6b, 0x72, 0x52, 0x46, 0x38, 0x4c, 0x39, 0x58, 0x57, - 0x45, 0x5c, 0x0a, - 0x09, 0x34, 0x4d, 0x64, 0x61, 0x37, 0x58, 0x58, 0x45, 0x6b, 0x45, 0x74, 0x30, 0x64, 0x52, 0x33, 0x65, 0x6f, - 0x68, 0x31, 0x31, 0x6d, 0x76, 0x6d, 0x33, 0x2b, 0x70, 0x48, 0x31, 0x30, 0x30, 0x7a, 0x42, 0x33, 0x6c, 0x68, - 0x6a, 0x52, 0x5a, 0x48, 0x67, 0x49, 0x71, 0x4d, 0x7a, 0x6c, 0x6c, 0x51, 0x65, 0x6e, 0x55, 0x34, 0x48, 0x2f, - 0x58, 0x37, 0x66, 0x50, 0x79, 0x4f, 0x51, 0x64, 0x56, 0x43, 0x51, 0x66, 0x2b, 0x50, 0x6d, 0x32, 0x50, 0x67, - 0x34, 0x5c, 0x0a, - 0x09, 0x58, 0x4a, 0x5a, 0x47, 0x56, 0x42, 0x32, 0x4a, 0x39, 0x54, 0x6a, 0x35, 0x65, 0x4b, 0x7a, 0x4d, 0x53, - 0x73, 0x76, 0x56, 0x6b, 0x70, 0x33, 0x65, 0x4c, 0x73, 0x76, 0x37, 0x44, 0x6d, 0x31, 0x5a, 0x57, 0x59, 0x58, - 0x6d, 0x42, 0x38, 0x5a, 0x33, 0x61, 0x34, 0x65, 0x66, 0x4e, 0x53, 0x62, 0x4f, 0x6d, 0x77, 0x58, 0x43, 0x44, - 0x72, 0x4c, 0x50, 0x45, 0x44, 0x52, 0x73, 0x51, 0x4c, 0x50, 0x35, 0x61, 0x67, 0x4b, 0x7a, 0x35, 0x73, 0x42, - 0x55, 0x5c, 0x0a, - 0x09, 0x57, 0x39, 0x37, 0x75, 0x4c, 0x5a, 0x50, 0x34, 0x37, 0x5a, 0x2f, 0x2f, 0x45, 0x51, 0x43, 0x75, 0x43, - 0x39, 0x44, 0x50, 0x6d, 0x59, 0x62, 0x79, 0x45, 0x47, 0x6e, 0x31, 0x41, 0x4d, 0x42, 0x7a, 0x2b, 0x30, 0x77, - 0x34, 0x68, 0x77, 0x4f, 0x6e, 0x37, 0x4d, 0x61, 0x76, 0x76, 0x4f, 0x41, 0x53, 0x4a, 0x6c, 0x67, 0x5a, 0x61, - 0x37, 0x56, 0x52, 0x70, 0x77, 0x4b, 0x33, 0x49, 0x78, 0x73, 0x2f, 0x4b, 0x78, 0x58, 0x53, 0x6e, 0x4b, 0x70, - 0x70, 0x5c, 0x0a, - 0x09, 0x49, 0x2b, 0x54, 0x74, 0x4e, 0x53, 0x56, 0x53, 0x55, 0x75, 0x45, 0x72, 0x37, 0x38, 0x6a, 0x54, 0x69, - 0x71, 0x39, 0x48, 0x4f, 0x37, 0x6f, 0x65, 0x2f, 0x7a, 0x5a, 0x71, 0x46, 0x39, 0x73, 0x6f, 0x35, 0x77, 0x35, - 0x6c, 0x6e, 0x62, 0x72, 0x47, 0x5a, 0x63, 0x71, 0x76, 0x39, 0x58, 0x73, 0x39, 0x64, 0x4c, 0x70, 0x64, 0x6c, - 0x4d, 0x35, 0x68, 0x32, 0x66, 0x6c, 0x46, 0x51, 0x71, 0x4b, 0x6d, 0x4a, 0x79, 0x51, 0x6c, 0x2b, 0x44, 0x56, - 0x46, 0x5c, 0x0a, - 0x09, 0x74, 0x79, 0x62, 0x6e, 0x74, 0x67, 0x79, 0x63, 0x39, 0x79, 0x54, 0x31, 0x62, 0x67, 0x63, 0x4a, 0x32, - 0x7a, 0x6e, 0x53, 0x5a, 0x7a, 0x71, 0x31, 0x30, 0x77, 0x53, 0x37, 0x53, 0x2b, 0x33, 0x43, 0x47, 0x6b, 0x31, - 0x39, 0x4a, 0x72, 0x55, 0x35, 0x61, 0x35, 0x71, 0x61, 0x4c, 0x6c, 0x6c, 0x62, 0x34, 0x44, 0x51, 0x4b, 0x49, - 0x43, 0x7a, 0x62, 0x74, 0x32, 0x77, 0x33, 0x4a, 0x2b, 0x43, 0x33, 0x58, 0x76, 0x51, 0x63, 0x6e, 0x4c, 0x68, - 0x7a, 0x5c, 0x0a, - 0x09, 0x79, 0x70, 0x64, 0x30, 0x37, 0x76, 0x73, 0x54, 0x78, 0x76, 0x38, 0x64, 0x74, 0x48, 0x6f, 0x41, 0x34, - 0x41, 0x44, 0x41, 0x6e, 0x65, 0x32, 0x50, 0x48, 0x56, 0x37, 0x34, 0x39, 0x41, 0x76, 0x77, 0x2f, 0x4d, 0x63, - 0x2f, 0x52, 0x71, 0x6b, 0x62, 0x36, 0x73, 0x69, 0x54, 0x68, 0x59, 0x35, 0x4e, 0x35, 0x32, 0x73, 0x44, 0x53, - 0x41, 0x56, 0x6e, 0x4f, 0x58, 0x56, 0x7a, 0x65, 0x6a, 0x58, 0x36, 0x4c, 0x54, 0x2b, 0x36, 0x48, 0x59, 0x6e, - 0x2b, 0x5c, 0x0a, - 0x09, 0x2f, 0x46, 0x79, 0x54, 0x6b, 0x39, 0x67, 0x50, 0x41, 0x45, 0x6e, 0x6a, 0x73, 0x48, 0x59, 0x63, 0x6a, - 0x42, 0x34, 0x50, 0x6b, 0x6e, 0x4f, 0x32, 0x49, 0x65, 0x73, 0x49, 0x79, 0x6b, 0x48, 0x4e, 0x50, 0x7a, 0x69, - 0x55, 0x49, 0x79, 0x4e, 0x2f, 0x7a, 0x7a, 0x2f, 0x64, 0x39, 0x6d, 0x79, 0x50, 0x77, 0x4d, 0x6f, 0x34, 0x4c, - 0x47, 0x4f, 0x33, 0x53, 0x4d, 0x62, 0x35, 0x64, 0x41, 0x32, 0x48, 0x5a, 0x77, 0x6b, 0x32, 0x4c, 0x39, 0x78, - 0x5a, 0x5c, 0x0a, - 0x09, 0x58, 0x4e, 0x4b, 0x4f, 0x35, 0x44, 0x47, 0x31, 0x74, 0x5a, 0x72, 0x66, 0x65, 0x73, 0x32, 0x68, 0x53, - 0x62, 0x5a, 0x36, 0x62, 0x4b, 0x4e, 0x41, 0x6d, 0x4e, 0x64, 0x4d, 0x67, 0x61, 0x36, 0x32, 0x6a, 0x6d, 0x5a, - 0x37, 0x6b, 0x70, 0x2f, 0x68, 0x4f, 0x46, 0x7a, 0x2f, 0x6d, 0x52, 0x39, 0x34, 0x45, 0x69, 0x36, 0x35, 0x36, - 0x4e, 0x79, 0x71, 0x6b, 0x67, 0x4d, 0x49, 0x71, 0x2f, 0x72, 0x53, 0x38, 0x4e, 0x57, 0x64, 0x41, 0x6a, 0x68, - 0x4d, 0x5c, 0x0a, - 0x09, 0x38, 0x66, 0x66, 0x35, 0x76, 0x2b, 0x6e, 0x6e, 0x6e, 0x34, 0x39, 0x7a, 0x54, 0x7a, 0x30, 0x70, 0x4b, - 0x57, 0x5a, 0x46, 0x4e, 0x32, 0x30, 0x51, 0x56, 0x6e, 0x53, 0x72, 0x42, 0x57, 0x75, 0x62, 0x6e, 0x58, 0x61, - 0x6d, 0x4a, 0x75, 0x50, 0x55, 0x66, 0x66, 0x4b, 0x36, 0x32, 0x67, 0x41, 0x35, 0x50, 0x31, 0x59, 0x45, 0x31, - 0x50, 0x66, 0x34, 0x72, 0x66, 0x54, 0x53, 0x47, 0x69, 0x38, 0x33, 0x36, 0x4b, 0x5a, 0x73, 0x77, 0x68, 0x70, - 0x48, 0x5c, 0x0a, - 0x09, 0x6b, 0x35, 0x4d, 0x32, 0x52, 0x2b, 0x49, 0x55, 0x4c, 0x68, 0x79, 0x41, 0x79, 0x66, 0x45, 0x4a, 0x55, - 0x42, 0x37, 0x57, 0x67, 0x4f, 0x31, 0x62, 0x58, 0x71, 0x6e, 0x63, 0x4b, 0x4f, 0x45, 0x31, 0x33, 0x51, 0x56, - 0x6f, 0x50, 0x2b, 0x53, 0x6c, 0x59, 0x37, 0x59, 0x65, 0x55, 0x35, 0x4d, 0x38, 0x5a, 0x46, 0x2b, 0x68, 0x4a, - 0x56, 0x6b, 0x33, 0x6b, 0x49, 0x37, 0x79, 0x54, 0x55, 0x47, 0x69, 0x43, 0x64, 0x68, 0x57, 0x30, 0x68, 0x33, - 0x59, 0x5c, 0x0a, - 0x09, 0x39, 0x7a, 0x54, 0x69, 0x36, 0x79, 0x63, 0x33, 0x55, 0x38, 0x36, 0x30, 0x62, 0x69, 0x7a, 0x65, 0x2b, - 0x4c, 0x55, 0x6e, 0x6e, 0x72, 0x6b, 0x66, 0x76, 0x2f, 0x4c, 0x43, 0x5a, 0x37, 0x43, 0x54, 0x42, 0x49, 0x41, - 0x6d, 0x56, 0x6b, 0x54, 0x62, 0x37, 0x34, 0x4a, 0x57, 0x65, 0x77, 0x32, 0x67, 0x65, 0x6a, 0x65, 0x56, 0x41, - 0x77, 0x67, 0x59, 0x36, 0x32, 0x5a, 0x34, 0x37, 0x36, 0x2b, 0x38, 0x43, 0x4b, 0x64, 0x73, 0x6e, 0x7a, 0x59, - 0x46, 0x5c, 0x0a, - 0x09, 0x4f, 0x47, 0x72, 0x6e, 0x56, 0x6c, 0x4d, 0x45, 0x6b, 0x44, 0x75, 0x6b, 0x48, 0x45, 0x67, 0x5a, 0x42, - 0x43, 0x39, 0x76, 0x6f, 0x57, 0x34, 0x64, 0x2f, 0x65, 0x73, 0x53, 0x2b, 0x74, 0x61, 0x4e, 0x4e, 0x67, 0x44, - 0x70, 0x32, 0x50, 0x62, 0x72, 0x78, 0x44, 0x51, 0x31, 0x4f, 0x62, 0x34, 0x75, 0x4d, 0x79, 0x71, 0x43, 0x63, - 0x71, 0x66, 0x67, 0x66, 0x49, 0x30, 0x61, 0x57, 0x78, 0x72, 0x78, 0x39, 0x66, 0x37, 0x35, 0x53, 0x6d, 0x49, - 0x45, 0x5c, 0x0a, - 0x09, 0x63, 0x35, 0x2b, 0x2f, 0x64, 0x6e, 0x34, 0x5a, 0x6c, 0x56, 0x50, 0x48, 0x30, 0x66, 0x4b, 0x77, 0x70, - 0x47, 0x48, 0x6c, 0x46, 0x39, 0x59, 0x36, 0x6a, 0x33, 0x54, 0x62, 0x5a, 0x73, 0x44, 0x56, 0x63, 0x74, 0x44, - 0x79, 0x71, 0x48, 0x6d, 0x79, 0x34, 0x36, 0x38, 0x46, 0x6c, 0x45, 0x30, 0x41, 0x62, 0x31, 0x33, 0x54, 0x34, - 0x77, 0x6a, 0x6c, 0x62, 0x66, 0x6d, 0x73, 0x33, 0x49, 0x66, 0x56, 0x39, 0x73, 0x4e, 0x50, 0x32, 0x49, 0x4e, - 0x33, 0x5c, 0x0a, - 0x09, 0x76, 0x50, 0x4b, 0x6e, 0x30, 0x45, 0x31, 0x58, 0x2f, 0x41, 0x76, 0x54, 0x34, 0x42, 0x34, 0x69, 0x72, - 0x66, 0x59, 0x2b, 0x67, 0x48, 0x74, 0x30, 0x7a, 0x44, 0x78, 0x78, 0x35, 0x7a, 0x54, 0x65, 0x2f, 0x56, 0x39, - 0x65, 0x68, 0x47, 0x31, 0x6a, 0x66, 0x53, 0x50, 0x4b, 0x36, 0x70, 0x46, 0x49, 0x56, 0x31, 0x77, 0x4a, 0x4e, - 0x46, 0x4a, 0x41, 0x47, 0x49, 0x58, 0x51, 0x2f, 0x4a, 0x77, 0x54, 0x6e, 0x79, 0x45, 0x64, 0x64, 0x45, 0x62, - 0x37, 0x5c, 0x0a, - 0x09, 0x76, 0x4a, 0x35, 0x31, 0x58, 0x6b, 0x65, 0x4e, 0x65, 0x68, 0x53, 0x70, 0x57, 0x70, 0x73, 0x69, 0x71, - 0x34, 0x34, 0x56, 0x45, 0x68, 0x6a, 0x30, 0x61, 0x38, 0x62, 0x73, 0x64, 0x4e, 0x4c, 0x4b, 0x63, 0x71, 0x7a, - 0x4d, 0x68, 0x62, 0x74, 0x51, 0x65, 0x4c, 0x57, 0x58, 0x72, 0x70, 0x39, 0x47, 0x5a, 0x58, 0x73, 0x35, 0x7a, - 0x58, 0x61, 0x59, 0x5a, 0x41, 0x39, 0x37, 0x76, 0x4f, 0x35, 0x45, 0x43, 0x53, 0x66, 0x71, 0x63, 0x56, 0x43, - 0x33, 0x5c, 0x0a, - 0x09, 0x31, 0x6f, 0x41, 0x34, 0x6e, 0x30, 0x30, 0x4f, 0x72, 0x55, 0x47, 0x58, 0x62, 0x37, 0x57, 0x57, 0x54, - 0x6b, 0x2b, 0x69, 0x6e, 0x69, 0x5a, 0x43, 0x73, 0x32, 0x35, 0x72, 0x2f, 0x71, 0x57, 0x56, 0x6a, 0x67, 0x49, - 0x50, 0x4f, 0x62, 0x36, 0x56, 0x6e, 0x35, 0x73, 0x34, 0x66, 0x6e, 0x6f, 0x72, 0x2f, 0x75, 0x68, 0x58, 0x58, - 0x6f, 0x77, 0x64, 0x57, 0x2f, 0x71, 0x71, 0x59, 0x51, 0x63, 0x34, 0x64, 0x36, 0x66, 0x42, 0x38, 0x6b, 0x4f, - 0x6d, 0x5c, 0x0a, - 0x09, 0x56, 0x5a, 0x34, 0x43, 0x75, 0x43, 0x73, 0x73, 0x77, 0x7a, 0x2f, 0x6e, 0x74, 0x42, 0x50, 0x78, 0x33, - 0x6c, 0x64, 0x36, 0x45, 0x4c, 0x43, 0x69, 0x47, 0x56, 0x65, 0x2b, 0x2f, 0x7a, 0x38, 0x56, 0x61, 0x71, 0x31, - 0x41, 0x6e, 0x65, 0x6a, 0x56, 0x52, 0x74, 0x47, 0x73, 0x73, 0x4f, 0x2f, 0x6d, 0x76, 0x45, 0x75, 0x75, 0x4e, - 0x52, 0x6c, 0x4a, 0x33, 0x62, 0x65, 0x6b, 0x65, 0x6f, 0x59, 0x71, 0x65, 0x65, 0x63, 0x39, 0x63, 0x43, 0x4f, - 0x53, 0x5c, 0x0a, - 0x09, 0x34, 0x39, 0x54, 0x52, 0x7a, 0x34, 0x6e, 0x7a, 0x54, 0x6b, 0x6d, 0x6e, 0x61, 0x57, 0x78, 0x61, 0x53, - 0x6b, 0x31, 0x52, 0x6b, 0x33, 0x39, 0x61, 0x45, 0x63, 0x74, 0x71, 0x33, 0x53, 0x6c, 0x4e, 0x38, 0x46, 0x7a, - 0x4b, 0x6c, 0x71, 0x5a, 0x73, 0x54, 0x30, 0x39, 0x62, 0x39, 0x4c, 0x46, 0x46, 0x36, 0x57, 0x34, 0x35, 0x2b, - 0x57, 0x42, 0x56, 0x6d, 0x6a, 0x4e, 0x59, 0x6f, 0x46, 0x68, 0x7a, 0x6f, 0x47, 0x58, 0x4f, 0x78, 0x39, 0x38, - 0x55, 0x5c, 0x0a, - 0x09, 0x54, 0x50, 0x69, 0x6f, 0x4e, 0x4a, 0x6a, 0x77, 0x50, 0x71, 0x30, 0x67, 0x78, 0x6d, 0x74, 0x61, 0x6a, - 0x68, 0x2b, 0x64, 0x66, 0x32, 0x6f, 0x72, 0x2f, 0x75, 0x4b, 0x31, 0x50, 0x34, 0x75, 0x39, 0x4a, 0x32, 0x79, - 0x48, 0x2f, 0x45, 0x33, 0x44, 0x32, 0x4d, 0x48, 0x6e, 0x73, 0x49, 0x71, 0x30, 0x32, 0x6c, 0x4f, 0x41, 0x39, - 0x34, 0x72, 0x76, 0x37, 0x49, 0x63, 0x50, 0x4c, 0x7a, 0x78, 0x6e, 0x50, 0x39, 0x35, 0x39, 0x36, 0x59, 0x73, - 0x77, 0x5c, 0x0a, - 0x09, 0x50, 0x65, 0x34, 0x66, 0x4d, 0x74, 0x48, 0x52, 0x53, 0x55, 0x63, 0x39, 0x6f, 0x42, 0x61, 0x77, 0x6c, - 0x53, 0x70, 0x71, 0x68, 0x4c, 0x59, 0x45, 0x43, 0x33, 0x5a, 0x64, 0x47, 0x35, 0x6f, 0x32, 0x48, 0x76, 0x6b, - 0x35, 0x2b, 0x6b, 0x63, 0x73, 0x62, 0x49, 0x64, 0x6d, 0x59, 0x6a, 0x69, 0x4b, 0x2f, 0x71, 0x55, 0x52, 0x38, - 0x62, 0x4a, 0x70, 0x39, 0x4e, 0x4f, 0x6d, 0x70, 0x4a, 0x38, 0x64, 0x48, 0x44, 0x55, 0x6d, 0x36, 0x7a, 0x6b, - 0x45, 0x5c, 0x0a, - 0x09, 0x7a, 0x5a, 0x63, 0x56, 0x50, 0x53, 0x33, 0x6a, 0x74, 0x79, 0x4b, 0x6d, 0x4e, 0x4e, 0x48, 0x6d, 0x68, - 0x35, 0x71, 0x73, 0x42, 0x33, 0x71, 0x61, 0x51, 0x4d, 0x73, 0x43, 0x68, 0x58, 0x53, 0x74, 0x52, 0x55, 0x35, - 0x74, 0x6d, 0x76, 0x76, 0x6c, 0x31, 0x31, 0x4d, 0x62, 0x30, 0x52, 0x76, 0x4c, 0x30, 0x67, 0x56, 0x52, 0x43, - 0x59, 0x4d, 0x70, 0x51, 0x4b, 0x53, 0x4c, 0x6c, 0x39, 0x6f, 0x65, 0x74, 0x53, 0x34, 0x31, 0x63, 0x49, 0x5a, - 0x79, 0x5c, 0x0a, - 0x09, 0x4a, 0x30, 0x35, 0x50, 0x34, 0x58, 0x33, 0x2f, 0x35, 0x61, 0x66, 0x78, 0x38, 0x46, 0x50, 0x33, 0x31, - 0x42, 0x57, 0x53, 0x33, 0x32, 0x76, 0x45, 0x32, 0x37, 0x47, 0x4b, 0x74, 0x49, 0x71, 0x33, 0x41, 0x51, 0x6c, - 0x77, 0x37, 0x6d, 0x4e, 0x77, 0x37, 0x70, 0x33, 0x4a, 0x2b, 0x59, 0x6f, 0x75, 0x4f, 0x6e, 0x63, 0x2f, 0x50, - 0x76, 0x44, 0x61, 0x6e, 0x38, 0x4d, 0x70, 0x32, 0x36, 0x62, 0x4d, 0x69, 0x42, 0x4f, 0x6f, 0x56, 0x6f, 0x6a, - 0x39, 0x5c, 0x0a, - 0x09, 0x49, 0x4d, 0x30, 0x6f, 0x4a, 0x56, 0x74, 0x6c, 0x64, 0x48, 0x61, 0x67, 0x6e, 0x56, 0x76, 0x58, 0x30, - 0x61, 0x76, 0x4c, 0x73, 0x6f, 0x35, 0x38, 0x36, 0x49, 0x58, 0x7a, 0x78, 0x71, 0x4d, 0x53, 0x50, 0x34, 0x5a, - 0x71, 0x78, 0x2b, 0x6f, 0x2f, 0x64, 0x61, 0x77, 0x30, 0x67, 0x6e, 0x42, 0x4a, 0x36, 0x49, 0x69, 0x56, 0x41, - 0x6f, 0x59, 0x4e, 0x68, 0x35, 0x5a, 0x7a, 0x61, 0x65, 0x65, 0x30, 0x2b, 0x4e, 0x62, 0x58, 0x72, 0x57, 0x74, - 0x70, 0x5c, 0x0a, - 0x09, 0x2b, 0x33, 0x57, 0x37, 0x2b, 0x6f, 0x47, 0x65, 0x65, 0x6c, 0x6f, 0x68, 0x6f, 0x55, 0x62, 0x6d, 0x4f, - 0x32, 0x6e, 0x62, 0x7a, 0x56, 0x48, 0x5a, 0x72, 0x71, 0x33, 0x35, 0x53, 0x6b, 0x74, 0x72, 0x77, 0x45, 0x30, - 0x74, 0x30, 0x67, 0x49, 0x39, 0x66, 0x6c, 0x34, 0x43, 0x4a, 0x70, 0x38, 0x43, 0x70, 0x55, 0x38, 0x2b, 0x57, - 0x4f, 0x30, 0x41, 0x77, 0x46, 0x6b, 0x6e, 0x37, 0x4d, 0x45, 0x48, 0x58, 0x2f, 0x63, 0x4b, 0x6e, 0x48, 0x66, - 0x67, 0x5c, 0x0a, - 0x09, 0x70, 0x4e, 0x72, 0x70, 0x6b, 0x35, 0x2b, 0x62, 0x70, 0x31, 0x38, 0x46, 0x38, 0x41, 0x56, 0x6a, 0x4b, - 0x41, 0x2b, 0x5a, 0x56, 0x67, 0x30, 0x41, 0x73, 0x72, 0x4f, 0x65, 0x48, 0x41, 0x35, 0x2f, 0x45, 0x58, 0x41, - 0x76, 0x42, 0x50, 0x42, 0x31, 0x2f, 0x35, 0x55, 0x4e, 0x42, 0x72, 0x6a, 0x2b, 0x33, 0x50, 0x30, 0x6e, 0x76, - 0x75, 0x57, 0x56, 0x50, 0x2f, 0x4b, 0x4d, 0x52, 0x78, 0x50, 0x6f, 0x58, 0x51, 0x44, 0x6d, 0x41, 0x52, 0x77, - 0x42, 0x5c, 0x0a, - 0x09, 0x55, 0x46, 0x67, 0x6d, 0x30, 0x5a, 0x78, 0x6b, 0x70, 0x59, 0x72, 0x56, 0x78, 0x6d, 0x6b, 0x39, 0x55, - 0x47, 0x49, 0x5a, 0x6a, 0x32, 0x56, 0x63, 0x2f, 0x4c, 0x79, 0x4f, 0x37, 0x74, 0x78, 0x67, 0x55, 0x71, 0x50, - 0x69, 0x45, 0x56, 0x41, 0x76, 0x76, 0x75, 0x6d, 0x53, 0x4b, 0x78, 0x6d, 0x6e, 0x45, 0x34, 0x62, 0x45, 0x2b, - 0x78, 0x73, 0x56, 0x4b, 0x53, 0x6d, 0x70, 0x54, 0x36, 0x49, 0x4d, 0x7a, 0x36, 0x70, 0x34, 0x74, 0x4a, 0x4a, - 0x31, 0x5c, 0x0a, - 0x09, 0x6a, 0x34, 0x34, 0x73, 0x6d, 0x63, 0x6d, 0x36, 0x64, 0x6b, 0x74, 0x53, 0x67, 0x79, 0x6d, 0x63, 0x36, - 0x6d, 0x6c, 0x4f, 0x63, 0x2f, 0x38, 0x53, 0x75, 0x45, 0x49, 0x4e, 0x65, 0x2f, 0x72, 0x56, 0x70, 0x41, 0x6e, - 0x37, 0x43, 0x75, 0x63, 0x6f, 0x72, 0x5a, 0x57, 0x75, 0x63, 0x77, 0x52, 0x51, 0x6b, 0x78, 0x6d, 0x63, 0x4c, - 0x52, 0x45, 0x72, 0x75, 0x4e, 0x77, 0x39, 0x63, 0x2f, 0x69, 0x36, 0x76, 0x53, 0x64, 0x73, 0x2f, 0x79, 0x55, - 0x41, 0x5c, 0x0a, - 0x09, 0x6c, 0x34, 0x4e, 0x6f, 0x68, 0x74, 0x57, 0x59, 0x41, 0x66, 0x41, 0x78, 0x41, 0x45, 0x38, 0x44, 0x38, - 0x47, 0x59, 0x51, 0x49, 0x58, 0x76, 0x6b, 0x55, 0x38, 0x78, 0x78, 0x50, 0x42, 0x52, 0x61, 0x39, 0x5a, 0x38, - 0x47, 0x4b, 0x36, 0x2f, 0x37, 0x70, 0x44, 0x39, 0x77, 0x41, 0x49, 0x69, 0x6d, 0x41, 0x4f, 0x77, 0x44, 0x55, - 0x4d, 0x4b, 0x35, 0x57, 0x77, 0x41, 0x63, 0x75, 0x66, 0x33, 0x65, 0x67, 0x2f, 0x6a, 0x6f, 0x46, 0x56, 0x66, - 0x6a, 0x5c, 0x0a, - 0x09, 0x6f, 0x31, 0x2f, 0x38, 0x4f, 0x71, 0x36, 0x73, 0x74, 0x67, 0x73, 0x54, 0x38, 0x4c, 0x38, 0x42, 0x2f, - 0x47, 0x43, 0x6f, 0x56, 0x70, 0x32, 0x72, 0x6d, 0x32, 0x48, 0x74, 0x70, 0x34, 0x71, 0x56, 0x35, 0x58, 0x55, - 0x64, 0x4b, 0x31, 0x72, 0x7a, 0x74, 0x4d, 0x39, 0x71, 0x67, 0x39, 0x66, 0x52, 0x5a, 0x58, 0x6a, 0x5a, 0x55, - 0x55, 0x36, 0x70, 0x32, 0x32, 0x6a, 0x69, 0x53, 0x34, 0x39, 0x4c, 0x74, 0x39, 0x45, 0x30, 0x50, 0x73, 0x36, - 0x44, 0x5c, 0x0a, - 0x09, 0x35, 0x6f, 0x74, 0x66, 0x61, 0x5a, 0x49, 0x46, 0x67, 0x54, 0x41, 0x73, 0x68, 0x76, 0x46, 0x74, 0x77, - 0x6b, 0x63, 0x37, 0x33, 0x6c, 0x48, 0x6e, 0x6d, 0x73, 0x59, 0x4a, 0x53, 0x4f, 0x64, 0x6f, 0x49, 0x6f, 0x75, - 0x48, 0x70, 0x6e, 0x4f, 0x61, 0x52, 0x75, 0x6c, 0x73, 0x56, 0x46, 0x33, 0x75, 0x75, 0x4e, 0x71, 0x52, 0x6d, - 0x2b, 0x71, 0x74, 0x70, 0x45, 0x64, 0x62, 0x66, 0x33, 0x58, 0x72, 0x31, 0x6a, 0x6f, 0x57, 0x67, 0x50, 0x2f, - 0x2f, 0x5c, 0x0a, - 0x09, 0x4a, 0x79, 0x36, 0x2b, 0x34, 0x44, 0x6c, 0x76, 0x66, 0x50, 0x46, 0x7a, 0x71, 0x67, 0x73, 0x30, 0x58, - 0x51, 0x58, 0x4e, 0x47, 0x56, 0x2f, 0x49, 0x6c, 0x32, 0x53, 0x42, 0x64, 0x6c, 0x56, 0x6f, 0x7a, 0x58, 0x34, - 0x62, 0x73, 0x4c, 0x7a, 0x75, 0x55, 0x2f, 0x55, 0x58, 0x31, 0x6f, 0x64, 0x47, 0x72, 0x2b, 0x6f, 0x39, 0x67, - 0x6a, 0x2f, 0x75, 0x67, 0x41, 0x2b, 0x6b, 0x53, 0x58, 0x4f, 0x7a, 0x41, 0x73, 0x44, 0x4f, 0x61, 0x36, 0x58, - 0x78, 0x5c, 0x0a, - 0x09, 0x63, 0x6e, 0x72, 0x50, 0x64, 0x6a, 0x67, 0x48, 0x32, 0x4f, 0x61, 0x6f, 0x6e, 0x58, 0x59, 0x6c, 0x58, - 0x71, 0x44, 0x61, 0x49, 0x6e, 0x55, 0x2b, 0x50, 0x5a, 0x59, 0x38, 0x36, 0x50, 0x48, 0x77, 0x32, 0x6b, 0x31, - 0x39, 0x48, 0x38, 0x31, 0x78, 0x33, 0x55, 0x39, 0x7a, 0x2f, 0x61, 0x49, 0x6f, 0x6b, 0x4c, 0x4e, 0x62, 0x67, - 0x64, 0x2b, 0x4e, 0x4a, 0x54, 0x53, 0x50, 0x54, 0x73, 0x71, 0x33, 0x4f, 0x59, 0x62, 0x7a, 0x58, 0x43, 0x57, - 0x74, 0x5c, 0x0a, - 0x09, 0x4d, 0x30, 0x6f, 0x48, 0x7a, 0x61, 0x42, 0x67, 0x41, 0x31, 0x38, 0x6f, 0x4d, 0x57, 0x71, 0x64, 0x53, - 0x4c, 0x5a, 0x76, 0x77, 0x2b, 0x41, 0x6f, 0x50, 0x64, 0x6c, 0x41, 0x30, 0x74, 0x77, 0x76, 0x42, 0x38, 0x5a, - 0x71, 0x33, 0x47, 0x38, 0x42, 0x38, 0x4f, 0x72, 0x62, 0x72, 0x2f, 0x71, 0x53, 0x39, 0x35, 0x30, 0x52, 0x50, - 0x72, 0x4f, 0x61, 0x74, 0x47, 0x70, 0x50, 0x41, 0x32, 0x72, 0x36, 0x37, 0x70, 0x43, 0x4b, 0x50, 0x6b, 0x78, - 0x77, 0x5c, 0x0a, - 0x09, 0x4d, 0x77, 0x35, 0x75, 0x47, 0x6d, 0x69, 0x4b, 0x4c, 0x50, 0x62, 0x44, 0x46, 0x39, 0x4b, 0x74, 0x30, - 0x69, 0x68, 0x6e, 0x50, 0x57, 0x31, 0x6c, 0x47, 0x61, 0x64, 0x6c, 0x57, 0x4a, 0x59, 0x6a, 0x70, 0x51, 0x59, - 0x6b, 0x6a, 0x56, 0x61, 0x32, 0x6d, 0x50, 0x4a, 0x57, 0x74, 0x39, 0x48, 0x38, 0x31, 0x42, 0x6b, 0x48, 0x6b, - 0x5a, 0x58, 0x53, 0x38, 0x7a, 0x42, 0x47, 0x7a, 0x59, 0x4d, 0x65, 0x76, 0x39, 0x56, 0x2b, 0x52, 0x76, 0x5a, - 0x4f, 0x5c, 0x0a, - 0x09, 0x6a, 0x4b, 0x4f, 0x52, 0x41, 0x34, 0x7a, 0x6a, 0x55, 0x63, 0x36, 0x6a, 0x78, 0x77, 0x4d, 0x34, 0x79, - 0x4f, 0x63, 0x66, 0x4e, 0x45, 0x67, 0x33, 0x6a, 0x58, 0x63, 0x55, 0x4f, 0x49, 0x51, 0x32, 0x72, 0x48, 0x78, - 0x44, 0x77, 0x68, 0x56, 0x33, 0x30, 0x44, 0x52, 0x50, 0x73, 0x53, 0x4b, 0x30, 0x66, 0x46, 0x4c, 0x54, 0x44, - 0x6b, 0x68, 0x57, 0x76, 0x73, 0x50, 0x72, 0x57, 0x50, 0x71, 0x4d, 0x33, 0x37, 0x38, 0x65, 0x61, 0x71, 0x39, - 0x32, 0x5c, 0x0a, - 0x09, 0x6c, 0x42, 0x39, 0x46, 0x36, 0x2f, 0x4c, 0x6a, 0x6f, 0x4b, 0x4f, 0x4a, 0x41, 0x4c, 0x67, 0x46, 0x41, - 0x42, 0x2b, 0x51, 0x5a, 0x2f, 0x56, 0x43, 0x6b, 0x42, 0x53, 0x63, 0x4c, 0x68, 0x75, 0x75, 0x53, 0x55, 0x64, - 0x4e, 0x30, 0x33, 0x7a, 0x52, 0x4b, 0x32, 0x43, 0x32, 0x36, 0x70, 0x4b, 0x53, 0x36, 0x54, 0x57, 0x58, 0x6c, - 0x4c, 0x4f, 0x4e, 0x6f, 0x6a, 0x6d, 0x71, 0x45, 0x76, 0x76, 0x66, 0x67, 0x6f, 0x76, 0x67, 0x76, 0x43, 0x54, - 0x4f, 0x5c, 0x0a, - 0x09, 0x38, 0x54, 0x48, 0x79, 0x36, 0x4d, 0x4a, 0x62, 0x71, 0x35, 0x31, 0x58, 0x6d, 0x6d, 0x5a, 0x69, 0x75, - 0x45, 0x35, 0x7a, 0x6e, 0x58, 0x4b, 0x6e, 0x2b, 0x64, 0x50, 0x6a, 0x54, 0x72, 0x4f, 0x78, 0x4e, 0x42, 0x75, - 0x71, 0x36, 0x37, 0x71, 0x6b, 0x72, 0x41, 0x62, 0x7a, 0x55, 0x66, 0x4b, 0x56, 0x59, 0x36, 0x76, 0x62, 0x61, - 0x51, 0x4c, 0x6c, 0x64, 0x45, 0x7a, 0x61, 0x41, 0x58, 0x55, 0x57, 0x74, 0x6a, 0x4c, 0x76, 0x46, 0x74, 0x69, - 0x54, 0x5c, 0x0a, - 0x09, 0x4f, 0x75, 0x4b, 0x41, 0x4c, 0x4b, 0x2f, 0x4c, 0x57, 0x6b, 0x71, 0x4f, 0x56, 0x78, 0x6b, 0x73, 0x72, - 0x7a, 0x6c, 0x74, 0x4f, 0x41, 0x44, 0x63, 0x64, 0x74, 0x55, 0x56, 0x34, 0x66, 0x43, 0x74, 0x41, 0x41, 0x71, - 0x4e, 0x6a, 0x50, 0x34, 0x34, 0x4b, 0x4e, 0x70, 0x36, 0x6d, 0x30, 0x6f, 0x74, 0x38, 0x42, 0x53, 0x33, 0x6d, - 0x31, 0x66, 0x73, 0x51, 0x79, 0x6c, 0x74, 0x69, 0x4c, 0x79, 0x46, 0x46, 0x4d, 0x47, 0x74, 0x43, 0x43, 0x6a, - 0x76, 0x5c, 0x0a, - 0x09, 0x52, 0x33, 0x4e, 0x48, 0x73, 0x7a, 0x4d, 0x44, 0x7a, 0x59, 0x55, 0x38, 0x55, 0x2f, 0x65, 0x52, 0x76, - 0x6a, 0x34, 0x36, 0x6a, 0x55, 0x7a, 0x61, 0x58, 0x4f, 0x30, 0x78, 0x51, 0x68, 0x31, 0x48, 0x57, 0x52, 0x46, - 0x59, 0x71, 0x2f, 0x4c, 0x35, 0x69, 0x6e, 0x43, 0x6c, 0x48, 0x6b, 0x2b, 0x36, 0x4d, 0x6c, 0x39, 0x48, 0x2f, - 0x46, 0x51, 0x6e, 0x6e, 0x45, 0x69, 0x56, 0x35, 0x58, 0x64, 0x53, 0x6f, 0x44, 0x34, 0x74, 0x66, 0x75, 0x31, - 0x4d, 0x5c, 0x0a, - 0x09, 0x59, 0x7a, 0x53, 0x77, 0x32, 0x32, 0x33, 0x71, 0x67, 0x43, 0x44, 0x74, 0x70, 0x73, 0x6c, 0x47, 0x6d, - 0x6e, 0x6a, 0x56, 0x2f, 0x56, 0x74, 0x54, 0x30, 0x4a, 0x6f, 0x76, 0x45, 0x6e, 0x4b, 0x55, 0x65, 0x79, 0x48, - 0x6f, 0x4d, 0x41, 0x48, 0x58, 0x47, 0x63, 0x4e, 0x5a, 0x63, 0x39, 0x70, 0x77, 0x41, 0x41, 0x6a, 0x6b, 0x2f, - 0x4a, 0x75, 0x45, 0x2f, 0x6b, 0x5a, 0x48, 0x5a, 0x47, 0x36, 0x55, 0x58, 0x4d, 0x42, 0x79, 0x42, 0x56, 0x67, - 0x2f, 0x5c, 0x0a, - 0x09, 0x48, 0x44, 0x51, 0x71, 0x2f, 0x6b, 0x6f, 0x38, 0x62, 0x6a, 0x49, 0x6d, 0x33, 0x6f, 0x4a, 0x73, 0x57, - 0x2f, 0x65, 0x76, 0x55, 0x33, 0x6e, 0x4a, 0x75, 0x78, 0x30, 0x70, 0x5a, 0x44, 0x38, 0x45, 0x62, 0x71, 0x67, - 0x6b, 0x2b, 0x70, 0x45, 0x77, 0x70, 0x45, 0x64, 0x56, 0x47, 0x31, 0x4e, 0x61, 0x4b, 0x6f, 0x32, 0x55, 0x75, - 0x6f, 0x53, 0x56, 0x59, 0x65, 0x6b, 0x78, 0x31, 0x4f, 0x56, 0x53, 0x57, 0x65, 0x72, 0x7a, 0x2b, 0x74, 0x5a, - 0x6e, 0x5c, 0x0a, - 0x09, 0x71, 0x67, 0x55, 0x58, 0x2b, 0x65, 0x56, 0x6a, 0x31, 0x65, 0x50, 0x53, 0x51, 0x43, 0x52, 0x35, 0x6c, - 0x52, 0x5a, 0x67, 0x5a, 0x51, 0x37, 0x61, 0x53, 0x58, 0x55, 0x66, 0x56, 0x74, 0x38, 0x61, 0x5a, 0x4e, 0x4b, - 0x6f, 0x62, 0x67, 0x57, 0x59, 0x5a, 0x71, 0x44, 0x56, 0x59, 0x4d, 0x5a, 0x33, 0x6e, 0x36, 0x62, 0x42, 0x78, - 0x48, 0x30, 0x47, 0x4c, 0x50, 0x69, 0x74, 0x4a, 0x78, 0x30, 0x54, 0x41, 0x48, 0x44, 0x62, 0x56, 0x56, 0x38, - 0x43, 0x5c, 0x0a, - 0x09, 0x41, 0x44, 0x6a, 0x67, 0x74, 0x51, 0x51, 0x73, 0x63, 0x6e, 0x4e, 0x4f, 0x6f, 0x33, 0x30, 0x67, 0x2f, - 0x68, 0x77, 0x41, 0x56, 0x37, 0x73, 0x38, 0x73, 0x6a, 0x66, 0x4f, 0x31, 0x75, 0x55, 0x30, 0x77, 0x6b, 0x4d, - 0x64, 0x38, 0x37, 0x4d, 0x57, 0x79, 0x48, 0x42, 0x46, 0x63, 0x6d, 0x54, 0x6e, 0x34, 0x43, 0x4a, 0x62, 0x61, - 0x62, 0x34, 0x57, 0x61, 0x6b, 0x6f, 0x48, 0x73, 0x4a, 0x39, 0x61, 0x35, 0x41, 0x36, 0x76, 0x6a, 0x59, 0x33, - 0x33, 0x5c, 0x0a, - 0x09, 0x6f, 0x31, 0x31, 0x5a, 0x52, 0x37, 0x4a, 0x52, 0x32, 0x55, 0x6e, 0x49, 0x75, 0x6b, 0x49, 0x4e, 0x69, - 0x32, 0x66, 0x65, 0x72, 0x6a, 0x56, 0x4e, 0x6b, 0x34, 0x43, 0x70, 0x39, 0x32, 0x50, 0x59, 0x50, 0x33, 0x32, - 0x6d, 0x78, 0x38, 0x47, 0x50, 0x35, 0x59, 0x33, 0x57, 0x70, 0x6a, 0x4a, 0x32, 0x66, 0x51, 0x37, 0x32, 0x54, - 0x57, 0x73, 0x6a, 0x71, 0x52, 0x31, 0x59, 0x62, 0x33, 0x37, 0x69, 0x4f, 0x56, 0x50, 0x61, 0x31, 0x30, 0x71, - 0x67, 0x5c, 0x0a, - 0x09, 0x78, 0x44, 0x50, 0x5a, 0x36, 0x73, 0x6f, 0x2f, 0x4f, 0x4e, 0x52, 0x2b, 0x73, 0x4a, 0x35, 0x30, 0x54, - 0x41, 0x41, 0x41, 0x6f, 0x35, 0x73, 0x42, 0x2f, 0x49, 0x35, 0x47, 0x30, 0x4b, 0x62, 0x49, 0x36, 0x55, 0x78, - 0x7a, 0x6b, 0x4b, 0x57, 0x61, 0x31, 0x77, 0x35, 0x30, 0x70, 0x45, 0x30, 0x6a, 0x46, 0x74, 0x2b, 0x5a, 0x6f, - 0x4f, 0x65, 0x41, 0x54, 0x61, 0x6b, 0x65, 0x32, 0x48, 0x57, 0x64, 0x72, 0x59, 0x42, 0x39, 0x74, 0x2f, 0x69, - 0x52, 0x5c, 0x0a, - 0x09, 0x6e, 0x47, 0x75, 0x44, 0x6c, 0x30, 0x35, 0x4e, 0x72, 0x49, 0x37, 0x56, 0x76, 0x78, 0x32, 0x35, 0x37, - 0x4e, 0x7a, 0x49, 0x79, 0x6e, 0x44, 0x71, 0x75, 0x6d, 0x6c, 0x32, 0x6b, 0x59, 0x4b, 0x48, 0x4c, 0x65, 0x4e, - 0x61, 0x44, 0x6d, 0x46, 0x70, 0x7a, 0x53, 0x72, 0x6e, 0x7a, 0x47, 0x39, 0x4e, 0x6d, 0x5a, 0x6c, 0x32, 0x57, - 0x4e, 0x32, 0x58, 0x35, 0x42, 0x32, 0x6f, 0x6f, 0x59, 0x65, 0x45, 0x50, 0x76, 0x52, 0x47, 0x71, 0x32, 0x5a, - 0x41, 0x5c, 0x0a, - 0x09, 0x35, 0x4d, 0x43, 0x58, 0x51, 0x72, 0x5a, 0x6c, 0x6d, 0x31, 0x5a, 0x2f, 0x6e, 0x43, 0x39, 0x65, 0x7a, - 0x38, 0x45, 0x56, 0x44, 0x76, 0x68, 0x37, 0x6f, 0x35, 0x6c, 0x31, 0x6f, 0x57, 0x4d, 0x47, 0x41, 0x47, 0x36, - 0x76, 0x73, 0x34, 0x44, 0x66, 0x64, 0x6d, 0x71, 0x33, 0x6b, 0x35, 0x57, 0x4f, 0x6a, 0x34, 0x35, 0x34, 0x61, - 0x54, 0x61, 0x51, 0x70, 0x76, 0x6a, 0x4e, 0x76, 0x37, 0x6e, 0x48, 0x79, 0x33, 0x44, 0x6a, 0x64, 0x36, 0x71, - 0x38, 0x5c, 0x0a, - 0x09, 0x5a, 0x54, 0x77, 0x36, 0x4c, 0x65, 0x56, 0x4f, 0x56, 0x4a, 0x74, 0x2f, 0x32, 0x70, 0x36, 0x56, 0x54, - 0x4b, 0x5a, 0x67, 0x45, 0x39, 0x61, 0x33, 0x36, 0x33, 0x5a, 0x30, 0x6e, 0x38, 0x79, 0x77, 0x6b, 0x72, 0x71, - 0x36, 0x50, 0x57, 0x73, 0x73, 0x6d, 0x6d, 0x51, 0x32, 0x6b, 0x6c, 0x37, 0x54, 0x33, 0x47, 0x74, 0x51, 0x61, - 0x67, 0x4b, 0x50, 0x4d, 0x42, 0x70, 0x2b, 0x74, 0x63, 0x6d, 0x5a, 0x65, 0x42, 0x38, 0x79, 0x6f, 0x78, 0x69, - 0x74, 0x5c, 0x0a, - 0x09, 0x6a, 0x79, 0x43, 0x68, 0x4f, 0x76, 0x6e, 0x6d, 0x2f, 0x4e, 0x6b, 0x62, 0x74, 0x64, 0x49, 0x78, 0x38, - 0x58, 0x55, 0x44, 0x43, 0x61, 0x41, 0x36, 0x30, 0x76, 0x4f, 0x78, 0x38, 0x4a, 0x57, 0x56, 0x74, 0x43, 0x2b, - 0x52, 0x31, 0x58, 0x30, 0x59, 0x77, 0x46, 0x33, 0x59, 0x49, 0x44, 0x70, 0x6d, 0x41, 0x49, 0x44, 0x52, 0x45, - 0x4d, 0x42, 0x7a, 0x41, 0x64, 0x79, 0x34, 0x55, 0x6b, 0x47, 0x5a, 0x6f, 0x71, 0x62, 0x4f, 0x31, 0x42, 0x54, - 0x6c, 0x5c, 0x0a, - 0x09, 0x6d, 0x6f, 0x79, 0x61, 0x52, 0x79, 0x7a, 0x5a, 0x33, 0x74, 0x45, 0x35, 0x53, 0x37, 0x68, 0x75, 0x67, - 0x5a, 0x4e, 0x75, 0x54, 0x33, 0x4b, 0x71, 0x6f, 0x36, 0x6c, 0x63, 0x37, 0x5a, 0x66, 0x58, 0x74, 0x44, 0x6d, - 0x6e, 0x6a, 0x71, 0x30, 0x4e, 0x73, 0x6b, 0x35, 0x6c, 0x4a, 0x53, 0x65, 0x6c, 0x53, 0x2b, 0x56, 0x6e, 0x38, - 0x63, 0x6a, 0x35, 0x30, 0x55, 0x44, 0x44, 0x36, 0x2b, 0x71, 0x73, 0x62, 0x47, 0x56, 0x79, 0x4a, 0x71, 0x38, - 0x63, 0x5c, 0x0a, - 0x09, 0x79, 0x4a, 0x73, 0x79, 0x46, 0x6a, 0x34, 0x42, 0x63, 0x4f, 0x4a, 0x38, 0x7a, 0x62, 0x48, 0x64, 0x74, - 0x75, 0x64, 0x53, 0x32, 0x67, 0x44, 0x46, 0x64, 0x75, 0x78, 0x41, 0x6b, 0x50, 0x49, 0x58, 0x61, 0x6a, 0x57, - 0x56, 0x30, 0x32, 0x65, 0x6c, 0x76, 0x63, 0x58, 0x2b, 0x53, 0x77, 0x4c, 0x65, 0x42, 0x4e, 0x51, 0x42, 0x63, - 0x4c, 0x33, 0x70, 0x6d, 0x41, 0x49, 0x41, 0x4a, 0x6f, 0x53, 0x37, 0x48, 0x58, 0x41, 0x78, 0x67, 0x4b, 0x73, - 0x74, 0x5c, 0x0a, - 0x09, 0x42, 0x35, 0x63, 0x6f, 0x72, 0x4f, 0x38, 0x41, 0x2b, 0x4a, 0x4a, 0x53, 0x57, 0x55, 0x31, 0x6d, 0x7a, - 0x59, 0x2f, 0x54, 0x65, 0x39, 0x49, 0x61, 0x37, 0x62, 0x55, 0x6a, 0x38, 0x32, 0x6a, 0x4d, 0x4d, 0x35, 0x4f, - 0x6d, 0x74, 0x4e, 0x4b, 0x4b, 0x68, 0x6d, 0x6c, 0x61, 0x6e, 0x34, 0x37, 0x4a, 0x63, 0x6d, 0x34, 0x4c, 0x37, - 0x4e, 0x49, 0x73, 0x52, 0x34, 0x37, 0x55, 0x6e, 0x67, 0x44, 0x59, 0x6d, 0x55, 0x4b, 0x41, 0x49, 0x53, 0x66, - 0x71, 0x5c, 0x0a, - 0x09, 0x70, 0x57, 0x50, 0x55, 0x6a, 0x71, 0x6e, 0x35, 0x74, 0x63, 0x64, 0x58, 0x66, 0x32, 0x71, 0x51, 0x6c, - 0x58, 0x70, 0x4c, 0x64, 0x2b, 0x4f, 0x6c, 0x59, 0x4b, 0x71, 0x31, 0x4a, 0x72, 0x2f, 0x70, 0x6a, 0x46, 0x48, - 0x66, 0x53, 0x41, 0x57, 0x43, 0x76, 0x43, 0x31, 0x48, 0x72, 0x65, 0x58, 0x51, 0x42, 0x4b, 0x34, 0x31, 0x4c, - 0x35, 0x53, 0x4d, 0x52, 0x5a, 0x4d, 0x4f, 0x49, 0x67, 0x35, 0x34, 0x73, 0x77, 0x4f, 0x75, 0x73, 0x71, 0x31, - 0x7a, 0x5c, 0x0a, - 0x09, 0x66, 0x65, 0x69, 0x59, 0x41, 0x67, 0x42, 0x41, 0x67, 0x4d, 0x44, 0x4e, 0x44, 0x72, 0x67, 0x51, 0x63, - 0x47, 0x38, 0x44, 0x4d, 0x4d, 0x66, 0x4c, 0x6a, 0x42, 0x49, 0x59, 0x4e, 0x31, 0x69, 0x74, 0x4c, 0x47, 0x31, - 0x77, 0x32, 0x6d, 0x41, 0x73, 0x42, 0x65, 0x6f, 0x37, 0x44, 0x47, 0x6c, 0x76, 0x69, 0x44, 0x30, 0x32, 0x70, - 0x63, 0x6e, 0x61, 0x43, 0x47, 0x58, 0x4e, 0x39, 0x4e, 0x77, 0x6f, 0x67, 0x39, 0x4f, 0x52, 0x57, 0x50, 0x63, - 0x42, 0x5c, 0x0a, - 0x09, 0x39, 0x53, 0x6d, 0x6a, 0x70, 0x61, 0x71, 0x54, 0x43, 0x57, 0x4d, 0x55, 0x73, 0x75, 0x50, 0x72, 0x2b, - 0x52, 0x59, 0x76, 0x2b, 0x6c, 0x62, 0x65, 0x53, 0x6d, 0x4f, 0x71, 0x51, 0x53, 0x67, 0x46, 0x67, 0x39, 0x52, - 0x42, 0x65, 0x56, 0x30, 0x37, 0x47, 0x39, 0x4c, 0x6a, 0x35, 0x35, 0x39, 0x4e, 0x35, 0x51, 0x44, 0x75, 0x37, - 0x48, 0x57, 0x57, 0x74, 0x37, 0x49, 0x44, 0x36, 0x6c, 0x47, 0x6b, 0x41, 0x43, 0x64, 0x7a, 0x45, 0x6e, 0x6d, - 0x37, 0x5c, 0x0a, - 0x09, 0x32, 0x67, 0x42, 0x76, 0x52, 0x38, 0x41, 0x37, 0x55, 0x50, 0x32, 0x49, 0x37, 0x6b, 0x59, 0x73, 0x2f, - 0x67, 0x55, 0x36, 0x35, 0x67, 0x41, 0x41, 0x45, 0x43, 0x41, 0x77, 0x35, 0x2f, 0x79, 0x76, 0x6f, 0x68, 0x35, - 0x50, 0x66, 0x6c, 0x72, 0x77, 0x4a, 0x77, 0x43, 0x2b, 0x44, 0x61, 0x53, 0x47, 0x45, 0x38, 0x34, 0x46, 0x6b, - 0x74, 0x64, 0x47, 0x4a, 0x36, 0x56, 0x70, 0x6a, 0x75, 0x47, 0x50, 0x72, 0x61, 0x69, 0x72, 0x67, 0x55, 0x41, - 0x36, 0x5c, 0x0a, - 0x09, 0x6d, 0x34, 0x34, 0x73, 0x4e, 0x67, 0x69, 0x46, 0x38, 0x74, 0x71, 0x68, 0x69, 0x56, 0x32, 0x78, 0x30, - 0x74, 0x6f, 0x6d, 0x33, 0x76, 0x51, 0x66, 0x72, 0x79, 0x65, 0x6a, 0x62, 0x66, 0x50, 0x4f, 0x76, 0x78, 0x54, - 0x38, 0x30, 0x74, 0x32, 0x46, 0x65, 0x6e, 0x53, 0x57, 0x37, 0x44, 0x56, 0x66, 0x64, 0x64, 0x74, 0x4e, 0x4f, - 0x79, 0x5a, 0x72, 0x52, 0x39, 0x66, 0x5a, 0x42, 0x6c, 0x69, 0x39, 0x6c, 0x4f, 0x50, 0x52, 0x36, 0x58, 0x67, - 0x4b, 0x5c, 0x0a, - 0x09, 0x67, 0x69, 0x6b, 0x51, 0x41, 0x44, 0x59, 0x76, 0x74, 0x73, 0x78, 0x6c, 0x32, 0x37, 0x71, 0x63, 0x6c, - 0x48, 0x73, 0x4b, 0x47, 0x42, 0x55, 0x64, 0x64, 0x4d, 0x41, 0x66, 0x41, 0x58, 0x69, 0x55, 0x41, 0x33, 0x34, - 0x4a, 0x51, 0x44, 0x6d, 0x69, 0x6d, 0x33, 0x57, 0x68, 0x4e, 0x58, 0x73, 0x57, 0x59, 0x4c, 0x57, 0x49, 0x2f, - 0x78, 0x49, 0x71, 0x45, 0x2f, 0x67, 0x4f, 0x41, 0x68, 0x34, 0x33, 0x6e, 0x44, 0x76, 0x79, 0x63, 0x33, 0x44, - 0x6c, 0x5c, 0x0a, - 0x09, 0x73, 0x36, 0x6e, 0x62, 0x52, 0x39, 0x37, 0x74, 0x77, 0x57, 0x57, 0x5a, 0x4b, 0x4e, 0x66, 0x6b, 0x72, - 0x45, 0x44, 0x74, 0x45, 0x50, 0x37, 0x59, 0x6d, 0x66, 0x56, 0x30, 0x6c, 0x41, 0x72, 0x48, 0x69, 0x70, 0x63, - 0x59, 0x4c, 0x61, 0x32, 0x36, 0x73, 0x69, 0x2f, 0x37, 0x31, 0x70, 0x55, 0x33, 0x66, 0x76, 0x30, 0x54, 0x57, - 0x4f, 0x6c, 0x57, 0x59, 0x63, 0x76, 0x4a, 0x36, 0x76, 0x34, 0x34, 0x44, 0x38, 0x30, 0x6d, 0x48, 0x4b, 0x34, - 0x37, 0x5c, 0x0a, - 0x09, 0x4f, 0x46, 0x44, 0x56, 0x67, 0x4f, 0x62, 0x62, 0x48, 0x71, 0x4e, 0x64, 0x4c, 0x76, 0x33, 0x6b, 0x4d, - 0x56, 0x48, 0x79, 0x72, 0x33, 0x6e, 0x57, 0x37, 0x58, 0x49, 0x65, 0x56, 0x78, 0x70, 0x7a, 0x55, 0x2f, 0x76, - 0x68, 0x57, 0x39, 0x4f, 0x6d, 0x6e, 0x46, 0x46, 0x39, 0x57, 0x37, 0x70, 0x70, 0x47, 0x69, 0x75, 0x48, 0x4e, - 0x55, 0x74, 0x76, 0x31, 0x62, 0x6b, 0x35, 0x41, 0x46, 0x38, 0x45, 0x38, 0x43, 0x6b, 0x48, 0x66, 0x49, 0x71, - 0x41, 0x5c, 0x0a, - 0x09, 0x4b, 0x78, 0x79, 0x77, 0x48, 0x45, 0x70, 0x75, 0x5a, 0x4f, 0x51, 0x50, 0x64, 0x4d, 0x77, 0x44, 0x67, - 0x4b, 0x59, 0x41, 0x43, 0x4c, 0x50, 0x33, 0x33, 0x59, 0x32, 0x5a, 0x75, 0x32, 0x35, 0x37, 0x50, 0x59, 0x44, - 0x58, 0x68, 0x57, 0x75, 0x39, 0x73, 0x54, 0x47, 0x4d, 0x54, 0x55, 0x77, 0x69, 0x37, 0x2f, 0x61, 0x51, 0x64, - 0x2f, 0x76, 0x49, 0x75, 0x6c, 0x33, 0x6b, 0x6e, 0x51, 0x36, 0x51, 0x64, 0x5a, 0x48, 0x2f, 0x6e, 0x2f, 0x62, - 0x75, 0x5c, 0x0a, - 0x09, 0x33, 0x73, 0x65, 0x4e, 0x49, 0x67, 0x37, 0x6a, 0x2b, 0x48, 0x66, 0x73, 0x6e, 0x4f, 0x39, 0x38, 0x75, - 0x75, 0x53, 0x4d, 0x6c, 0x45, 0x52, 0x45, 0x53, 0x68, 0x6f, 0x4b, 0x6f, 0x45, 0x45, 0x52, 0x46, 0x4e, 0x42, - 0x52, 0x30, 0x46, 0x4d, 0x68, 0x55, 0x64, 0x4e, 0x52, 0x49, 0x53, 0x45, 0x71, 0x61, 0x76, 0x34, 0x41, 0x30, - 0x69, 0x48, 0x45, 0x50, 0x34, 0x41, 0x6f, 0x45, 0x4a, 0x52, 0x49, 0x55, 0x59, 0x51, 0x69, 0x51, 0x55, 0x53, - 0x56, 0x5c, 0x0a, - 0x09, 0x41, 0x71, 0x56, 0x42, 0x52, 0x4a, 0x45, 0x53, 0x68, 0x55, 0x4d, 0x6f, 0x51, 0x46, 0x37, 0x4f, 0x54, - 0x6f, 0x7a, 0x74, 0x33, 0x52, 0x2f, 0x46, 0x37, 0x4a, 0x35, 0x6e, 0x33, 0x32, 0x78, 0x66, 0x58, 0x70, 0x52, - 0x62, 0x7a, 0x2f, 0x4e, 0x70, 0x37, 0x72, 0x7a, 0x65, 0x6c, 0x31, 0x6e, 0x76, 0x7a, 0x4c, 0x4f, 0x7a, 0x34, - 0x37, 0x57, 0x39, 0x63, 0x51, 0x7a, 0x72, 0x46, 0x44, 0x2f, 0x35, 0x6c, 0x76, 0x38, 0x50, 0x70, 0x59, 0x5a, - 0x52, 0x5c, 0x0a, - 0x09, 0x6d, 0x46, 0x61, 0x65, 0x74, 0x33, 0x4b, 0x51, 0x61, 0x79, 0x70, 0x55, 0x33, 0x58, 0x72, 0x71, 0x7a, - 0x2b, 0x79, 0x4c, 0x7a, 0x6a, 0x5a, 0x4e, 0x35, 0x61, 0x78, 0x62, 0x76, 0x72, 0x6b, 0x42, 0x46, 0x43, 0x74, - 0x71, 0x57, 0x42, 0x5a, 0x6e, 0x76, 0x69, 0x39, 0x61, 0x33, 0x6c, 0x64, 0x58, 0x57, 0x63, 0x66, 0x63, 0x6f, - 0x70, 0x41, 0x4c, 0x79, 0x31, 0x33, 0x65, 0x69, 0x2b, 0x5a, 0x39, 0x4c, 0x41, 0x5a, 0x47, 0x58, 0x57, 0x67, - 0x76, 0x5c, 0x0a, - 0x09, 0x4f, 0x78, 0x75, 0x48, 0x32, 0x31, 0x2f, 0x55, 0x36, 0x4a, 0x76, 0x4b, 0x32, 0x37, 0x53, 0x74, 0x70, - 0x6c, 0x43, 0x63, 0x6c, 0x2f, 0x58, 0x67, 0x37, 0x65, 0x46, 0x39, 0x2f, 0x49, 0x31, 0x73, 0x31, 0x2f, 0x46, - 0x33, 0x39, 0x50, 0x31, 0x71, 0x2f, 0x74, 0x62, 0x65, 0x47, 0x35, 0x54, 0x4f, 0x38, 0x6b, 0x65, 0x6c, 0x34, - 0x65, 0x65, 0x65, 0x32, 0x59, 0x65, 0x42, 0x6e, 0x70, 0x58, 0x38, 0x38, 0x73, 0x44, 0x35, 0x4c, 0x30, 0x72, - 0x6f, 0x5c, 0x0a, - 0x09, 0x75, 0x50, 0x78, 0x37, 0x37, 0x63, 0x79, 0x59, 0x6a, 0x4d, 0x64, 0x4d, 0x78, 0x75, 0x50, 0x47, 0x5a, - 0x54, 0x76, 0x64, 0x4c, 0x72, 0x32, 0x74, 0x50, 0x68, 0x75, 0x39, 0x6e, 0x67, 0x2b, 0x4a, 0x54, 0x68, 0x65, - 0x36, 0x48, 0x54, 0x59, 0x32, 0x74, 0x33, 0x34, 0x2f, 0x74, 0x6a, 0x4f, 0x34, 0x41, 0x6e, 0x62, 0x61, 0x77, - 0x55, 0x6d, 0x44, 0x30, 0x38, 0x42, 0x70, 0x68, 0x2b, 0x74, 0x58, 0x42, 0x34, 0x65, 0x73, 0x55, 0x6d, 0x6c, - 0x7a, 0x5c, 0x0a, - 0x09, 0x38, 0x38, 0x70, 0x69, 0x6c, 0x55, 0x59, 0x55, 0x76, 0x69, 0x31, 0x58, 0x37, 0x6f, 0x36, 0x47, 0x5a, - 0x35, 0x43, 0x6d, 0x77, 0x61, 0x6a, 0x79, 0x76, 0x50, 0x57, 0x39, 0x6a, 0x4f, 0x4a, 0x38, 0x52, 0x74, 0x36, - 0x78, 0x72, 0x6a, 0x4a, 0x38, 0x34, 0x38, 0x2f, 0x4c, 0x57, 0x52, 0x77, 0x32, 0x7a, 0x51, 0x4b, 0x69, 0x73, - 0x5a, 0x7a, 0x56, 0x62, 0x54, 0x61, 0x46, 0x52, 0x2f, 0x48, 0x75, 0x7a, 0x65, 0x72, 0x79, 0x35, 0x53, 0x61, - 0x32, 0x5c, 0x0a, - 0x09, 0x72, 0x41, 0x48, 0x6d, 0x70, 0x51, 0x31, 0x44, 0x5a, 0x58, 0x46, 0x33, 0x6e, 0x4e, 0x4a, 0x38, 0x78, - 0x58, 0x31, 0x72, 0x4f, 0x74, 0x76, 0x50, 0x4a, 0x36, 0x5a, 0x59, 0x6b, 0x70, 0x44, 0x4f, 0x45, 0x69, 0x79, - 0x5a, 0x6b, 0x73, 0x36, 0x6d, 0x70, 0x4e, 0x4d, 0x4a, 0x53, 0x54, 0x49, 0x6a, 0x6e, 0x55, 0x34, 0x5a, 0x50, - 0x78, 0x7a, 0x65, 0x33, 0x6a, 0x35, 0x31, 0x35, 0x74, 0x7a, 0x32, 0x43, 0x79, 0x63, 0x62, 0x41, 0x2f, 0x31, - 0x35, 0x5c, 0x0a, - 0x09, 0x6a, 0x66, 0x43, 0x76, 0x6f, 0x6e, 0x55, 0x42, 0x55, 0x44, 0x49, 0x4b, 0x65, 0x7a, 0x44, 0x4f, 0x4f, - 0x52, 0x62, 0x31, 0x61, 0x4e, 0x49, 0x6b, 0x59, 0x54, 0x77, 0x61, 0x4d, 0x68, 0x35, 0x56, 0x6e, 0x76, 0x70, - 0x79, 0x63, 0x4f, 0x62, 0x73, 0x35, 0x7a, 0x75, 0x6e, 0x7a, 0x70, 0x51, 0x61, 0x74, 0x50, 0x57, 0x41, 0x58, - 0x57, 0x41, 0x41, 0x37, 0x4c, 0x72, 0x73, 0x4c, 0x39, 0x6a, 0x41, 0x5a, 0x64, 0x4d, 0x64, 0x62, 0x68, 0x64, - 0x73, 0x5c, 0x0a, - 0x09, 0x31, 0x32, 0x44, 0x67, 0x59, 0x47, 0x43, 0x77, 0x34, 0x32, 0x41, 0x4c, 0x32, 0x41, 0x45, 0x37, 0x37, - 0x71, 0x41, 0x50, 0x72, 0x6c, 0x39, 0x2f, 0x39, 0x69, 0x2f, 0x33, 0x43, 0x70, 0x6f, 0x61, 0x58, 0x66, 0x33, - 0x33, 0x46, 0x31, 0x44, 0x7a, 0x4f, 0x43, 0x74, 0x33, 0x46, 0x6a, 0x5a, 0x4e, 0x50, 0x36, 0x30, 0x64, 0x72, - 0x69, 0x73, 0x73, 0x67, 0x77, 0x58, 0x50, 0x7a, 0x78, 0x74, 0x4b, 0x65, 0x56, 0x76, 0x4c, 0x4c, 0x67, 0x76, - 0x43, 0x5c, 0x0a, - 0x09, 0x55, 0x71, 0x31, 0x32, 0x52, 0x6d, 0x34, 0x65, 0x62, 0x36, 0x6a, 0x66, 0x52, 0x76, 0x30, 0x50, 0x66, - 0x72, 0x6a, 0x53, 0x65, 0x6f, 0x4a, 0x74, 0x4a, 0x4d, 0x44, 0x51, 0x34, 0x44, 0x37, 0x59, 0x45, 0x4e, 0x77, - 0x6f, 0x6e, 0x55, 0x78, 0x4f, 0x70, 0x4e, 0x4e, 0x48, 0x72, 0x36, 0x52, 0x70, 0x69, 0x69, 0x56, 0x54, 0x62, - 0x4a, 0x61, 0x51, 0x70, 0x41, 0x6c, 0x70, 0x4f, 0x73, 0x4e, 0x6d, 0x43, 0x62, 0x50, 0x70, 0x68, 0x50, 0x38, - 0x65, 0x5c, 0x0a, - 0x09, 0x50, 0x53, 0x4b, 0x5a, 0x7a, 0x56, 0x68, 0x69, 0x50, 0x50, 0x33, 0x6a, 0x4a, 0x76, 0x2f, 0x65, 0x75, - 0x72, 0x46, 0x73, 0x76, 0x69, 0x4f, 0x70, 0x37, 0x51, 0x46, 0x77, 0x4b, 0x33, 0x79, 0x77, 0x79, 0x75, 0x56, - 0x4d, 0x54, 0x55, 0x69, 0x4d, 0x67, 0x61, 0x2f, 0x76, 0x2f, 0x58, 0x6d, 0x62, 0x75, 0x33, 0x76, 0x7a, 0x33, - 0x7a, 0x50, 0x4d, 0x4c, 0x6a, 0x55, 0x6d, 0x77, 0x42, 0x33, 0x67, 0x54, 0x72, 0x57, 0x62, 0x66, 0x62, 0x44, - 0x56, 0x5c, 0x0a, - 0x09, 0x53, 0x73, 0x4f, 0x6f, 0x6e, 0x6c, 0x6b, 0x4d, 0x68, 0x7a, 0x74, 0x68, 0x57, 0x4e, 0x38, 0x48, 0x41, - 0x67, 0x4f, 0x67, 0x62, 0x39, 0x69, 0x57, 0x38, 0x38, 0x47, 0x79, 0x62, 0x64, 0x44, 0x44, 0x68, 0x38, 0x55, - 0x6d, 0x50, 0x6e, 0x69, 0x32, 0x67, 0x61, 0x37, 0x42, 0x38, 0x53, 0x77, 0x59, 0x42, 0x74, 0x6c, 0x36, 0x6a, - 0x77, 0x4e, 0x64, 0x35, 0x73, 0x76, 0x30, 0x73, 0x75, 0x58, 0x7a, 0x37, 0x66, 0x65, 0x79, 0x35, 0x38, 0x67, - 0x61, 0x5c, 0x0a, - 0x09, 0x63, 0x4d, 0x39, 0x67, 0x32, 0x34, 0x48, 0x72, 0x4f, 0x74, 0x63, 0x46, 0x4e, 0x6d, 0x5a, 0x6d, 0x50, - 0x53, 0x75, 0x55, 0x4c, 0x6e, 0x74, 0x74, 0x43, 0x76, 0x32, 0x47, 0x34, 0x6d, 0x74, 0x5a, 0x50, 0x6f, 0x75, - 0x48, 0x44, 0x61, 0x7a, 0x75, 0x74, 0x51, 0x6b, 0x65, 0x54, 0x38, 0x45, 0x39, 0x44, 0x4f, 0x4d, 0x6d, 0x2b, - 0x33, 0x74, 0x76, 0x58, 0x67, 0x49, 0x53, 0x59, 0x44, 0x2f, 0x62, 0x34, 0x6e, 0x32, 0x48, 0x4d, 0x38, 0x4f, - 0x47, 0x5c, 0x0a, - 0x09, 0x2b, 0x48, 0x74, 0x43, 0x78, 0x73, 0x34, 0x66, 0x6f, 0x79, 0x6e, 0x2b, 0x6d, 0x74, 0x71, 0x41, 0x2b, - 0x39, 0x6b, 0x36, 0x48, 0x68, 0x68, 0x4d, 0x48, 0x65, 0x79, 0x62, 0x2f, 0x2b, 0x61, 0x63, 0x6b, 0x59, 0x4d, - 0x68, 0x75, 0x42, 0x48, 0x2b, 0x38, 0x58, 0x36, 0x32, 0x7a, 0x44, 0x67, 0x38, 0x4e, 0x71, 0x4f, 0x2f, 0x2f, - 0x2b, 0x4c, 0x65, 0x33, 0x73, 0x32, 0x50, 0x38, 0x52, 0x39, 0x41, 0x4f, 0x37, 0x52, 0x53, 0x48, 0x64, 0x70, - 0x4c, 0x5c, 0x0a, - 0x09, 0x30, 0x2b, 0x63, 0x2b, 0x6c, 0x76, 0x66, 0x59, 0x57, 0x68, 0x30, 0x41, 0x7a, 0x72, 0x6c, 0x66, 0x38, - 0x67, 0x4d, 0x52, 0x58, 0x67, 0x6f, 0x30, 0x7a, 0x49, 0x75, 0x5a, 0x31, 0x54, 0x31, 0x2f, 0x67, 0x5a, 0x6f, - 0x37, 0x73, 0x5a, 0x35, 0x6d, 0x74, 0x2b, 0x33, 0x63, 0x2b, 0x62, 0x63, 0x77, 0x37, 0x41, 0x47, 0x2b, 0x77, - 0x68, 0x61, 0x55, 0x4c, 0x79, 0x47, 0x61, 0x4c, 0x69, 0x33, 0x43, 0x2f, 0x38, 0x73, 0x39, 0x67, 0x55, 0x57, - 0x78, 0x5c, 0x0a, - 0x09, 0x46, 0x7a, 0x5a, 0x4f, 0x73, 0x2b, 0x71, 0x5a, 0x74, 0x74, 0x54, 0x6a, 0x77, 0x63, 0x47, 0x75, 0x48, - 0x59, 0x77, 0x4d, 0x65, 0x50, 0x58, 0x42, 0x56, 0x37, 0x75, 0x64, 0x45, 0x64, 0x6b, 0x67, 0x56, 0x32, 0x47, - 0x37, 0x77, 0x56, 0x5a, 0x57, 0x75, 0x52, 0x59, 0x76, 0x68, 0x30, 0x2f, 0x64, 0x76, 0x69, 0x35, 0x36, 0x66, - 0x61, 0x6a, 0x5a, 0x58, 0x6e, 0x67, 0x38, 0x73, 0x37, 0x70, 0x79, 0x74, 0x33, 0x35, 0x50, 0x4b, 0x4d, 0x78, - 0x58, 0x5c, 0x0a, - 0x09, 0x56, 0x35, 0x39, 0x4b, 0x30, 0x79, 0x34, 0x76, 0x57, 0x38, 0x39, 0x52, 0x31, 0x72, 0x70, 0x42, 0x77, - 0x46, 0x79, 0x6e, 0x30, 0x38, 0x6b, 0x50, 0x78, 0x47, 0x58, 0x67, 0x37, 0x57, 0x58, 0x7a, 0x4e, 0x78, 0x7a, - 0x4d, 0x48, 0x34, 0x42, 0x33, 0x67, 0x56, 0x6c, 0x62, 0x58, 0x34, 0x65, 0x6e, 0x36, 0x64, 0x7a, 0x35, 0x4e, - 0x78, 0x65, 0x47, 0x79, 0x53, 0x71, 0x4f, 0x32, 0x69, 0x42, 0x58, 0x6e, 0x53, 0x77, 0x41, 0x33, 0x67, 0x45, - 0x75, 0x5c, 0x0a, - 0x09, 0x72, 0x54, 0x70, 0x2f, 0x51, 0x2f, 0x31, 0x49, 0x67, 0x46, 0x65, 0x42, 0x36, 0x32, 0x32, 0x74, 0x50, - 0x36, 0x30, 0x4e, 0x41, 0x44, 0x67, 0x34, 0x6b, 0x47, 0x2f, 0x67, 0x50, 0x7a, 0x76, 0x51, 0x4f, 0x2b, 0x54, - 0x69, 0x58, 0x77, 0x45, 0x66, 0x34, 0x62, 0x76, 0x35, 0x4b, 0x31, 0x30, 0x2b, 0x79, 0x48, 0x72, 0x49, 0x36, - 0x73, 0x30, 0x4f, 0x38, 0x41, 0x38, 0x4c, 0x36, 0x6b, 0x31, 0x54, 0x77, 0x77, 0x2b, 0x6d, 0x58, 0x77, 0x41, - 0x2b, 0x5c, 0x0a, - 0x09, 0x67, 0x66, 0x62, 0x57, 0x6e, 0x79, 0x4e, 0x35, 0x49, 0x39, 0x41, 0x68, 0x58, 0x63, 0x58, 0x66, 0x4a, - 0x48, 0x54, 0x77, 0x54, 0x61, 0x72, 0x4f, 0x4c, 0x65, 0x79, 0x30, 0x2f, 0x6f, 0x7a, 0x2f, 0x68, 0x74, 0x55, - 0x50, 0x55, 0x65, 0x4f, 0x50, 0x32, 0x52, 0x44, 0x34, 0x42, 0x6e, 0x78, 0x39, 0x71, 0x61, 0x73, 0x7a, 0x54, - 0x66, 0x55, 0x69, 0x6d, 0x33, 0x34, 0x52, 0x2b, 0x48, 0x54, 0x52, 0x66, 0x47, 0x33, 0x51, 0x36, 0x68, 0x34, - 0x41, 0x5c, 0x0a, - 0x09, 0x46, 0x42, 0x72, 0x37, 0x69, 0x2f, 0x69, 0x37, 0x71, 0x39, 0x34, 0x44, 0x58, 0x67, 0x35, 0x6d, 0x47, - 0x54, 0x6e, 0x6e, 0x72, 0x70, 0x6e, 0x6f, 0x56, 0x57, 0x38, 0x39, 0x41, 0x41, 0x41, 0x42, 0x58, 0x6b, 0x6c, - 0x45, 0x51, 0x56, 0x54, 0x5a, 0x4a, 0x65, 0x42, 0x62, 0x66, 0x47, 0x41, 0x41, 0x37, 0x54, 0x35, 0x77, 0x38, - 0x6d, 0x53, 0x79, 0x65, 0x6e, 0x50, 0x57, 0x4f, 0x58, 0x66, 0x56, 0x7a, 0x45, 0x36, 0x56, 0x70, 0x69, 0x2b, - 0x72, 0x5c, 0x0a, - 0x09, 0x47, 0x31, 0x2f, 0x67, 0x37, 0x31, 0x42, 0x74, 0x2f, 0x51, 0x6d, 0x6b, 0x39, 0x51, 0x45, 0x41, 0x74, - 0x57, 0x66, 0x38, 0x54, 0x66, 0x78, 0x6f, 0x4f, 0x2f, 0x69, 0x65, 0x51, 0x66, 0x47, 0x74, 0x33, 0x54, 0x58, - 0x59, 0x5a, 0x33, 0x6b, 0x79, 0x65, 0x5a, 0x31, 0x78, 0x7a, 0x72, 0x31, 0x6d, 0x5a, 0x74, 0x38, 0x44, 0x4c, - 0x79, 0x32, 0x62, 0x33, 0x38, 0x77, 0x75, 0x41, 0x70, 0x38, 0x42, 0x50, 0x2b, 0x58, 0x54, 0x32, 0x31, 0x36, - 0x58, 0x5c, 0x0a, - 0x09, 0x31, 0x69, 0x49, 0x41, 0x51, 0x6b, 0x33, 0x64, 0x2f, 0x33, 0x58, 0x62, 0x54, 0x33, 0x6c, 0x79, 0x77, - 0x55, 0x42, 0x79, 0x48, 0x2f, 0x6a, 0x41, 0x4f, 0x66, 0x63, 0x2b, 0x38, 0x4c, 0x71, 0x5a, 0x2f, 0x33, 0x5a, - 0x71, 0x59, 0x41, 0x2b, 0x34, 0x42, 0x76, 0x77, 0x49, 0x66, 0x41, 0x66, 0x38, 0x6c, 0x69, 0x2b, 0x37, 0x4c, - 0x76, 0x56, 0x70, 0x37, 0x51, 0x4a, 0x41, 0x35, 0x44, 0x43, 0x57, 0x6a, 0x42, 0x64, 0x56, 0x72, 0x46, 0x74, - 0x37, 0x5c, 0x0a, - 0x09, 0x55, 0x51, 0x43, 0x49, 0x52, 0x47, 0x77, 0x64, 0x33, 0x67, 0x55, 0x51, 0x6b, 0x63, 0x65, 0x6b, 0x41, - 0x42, 0x43, 0x4a, 0x6d, 0x41, 0x4a, 0x41, 0x4a, 0x47, 0x49, 0x4b, 0x41, 0x4a, 0x47, 0x49, 0x4b, 0x51, 0x42, - 0x45, 0x49, 0x71, 0x59, 0x41, 0x45, 0x49, 0x6d, 0x59, 0x41, 0x6b, 0x41, 0x6b, 0x59, 0x67, 0x6f, 0x41, 0x6b, - 0x59, 0x67, 0x70, 0x41, 0x45, 0x51, 0x69, 0x70, 0x67, 0x41, 0x51, 0x69, 0x5a, 0x67, 0x43, 0x51, 0x43, 0x52, - 0x69, 0x5c, 0x0a, - 0x09, 0x43, 0x67, 0x43, 0x52, 0x69, 0x43, 0x6b, 0x41, 0x52, 0x43, 0x4b, 0x6d, 0x41, 0x42, 0x43, 0x4a, 0x6d, - 0x41, 0x4a, 0x41, 0x4a, 0x47, 0x49, 0x4b, 0x41, 0x4a, 0x47, 0x49, 0x4b, 0x51, 0x42, 0x45, 0x49, 0x71, 0x59, - 0x41, 0x45, 0x49, 0x6d, 0x59, 0x41, 0x6b, 0x41, 0x6b, 0x59, 0x67, 0x6f, 0x41, 0x6b, 0x59, 0x67, 0x70, 0x41, - 0x45, 0x51, 0x69, 0x70, 0x67, 0x41, 0x51, 0x69, 0x5a, 0x67, 0x43, 0x51, 0x43, 0x52, 0x69, 0x43, 0x67, 0x43, - 0x52, 0x5c, 0x0a, - 0x09, 0x69, 0x43, 0x6b, 0x41, 0x52, 0x43, 0x4b, 0x6d, 0x41, 0x42, 0x43, 0x4a, 0x6d, 0x41, 0x4a, 0x41, 0x4a, - 0x47, 0x49, 0x4b, 0x41, 0x4a, 0x47, 0x49, 0x4b, 0x51, 0x42, 0x45, 0x49, 0x71, 0x59, 0x41, 0x45, 0x49, 0x6d, - 0x59, 0x41, 0x6b, 0x41, 0x6b, 0x59, 0x67, 0x6f, 0x41, 0x6b, 0x59, 0x67, 0x70, 0x41, 0x45, 0x51, 0x69, 0x70, - 0x67, 0x41, 0x51, 0x69, 0x5a, 0x67, 0x43, 0x51, 0x43, 0x52, 0x69, 0x43, 0x67, 0x43, 0x52, 0x69, 0x43, 0x6b, - 0x41, 0x5c, 0x0a, - 0x09, 0x52, 0x43, 0x4b, 0x6d, 0x41, 0x42, 0x43, 0x4a, 0x6d, 0x41, 0x4a, 0x41, 0x4a, 0x47, 0x49, 0x4b, 0x41, - 0x4a, 0x47, 0x49, 0x4b, 0x51, 0x42, 0x45, 0x49, 0x71, 0x59, 0x41, 0x45, 0x49, 0x6d, 0x59, 0x41, 0x6b, 0x41, - 0x6b, 0x59, 0x67, 0x6f, 0x41, 0x6b, 0x59, 0x67, 0x70, 0x41, 0x45, 0x51, 0x69, 0x70, 0x67, 0x41, 0x51, 0x69, - 0x5a, 0x67, 0x43, 0x51, 0x43, 0x52, 0x69, 0x43, 0x67, 0x43, 0x52, 0x69, 0x50, 0x30, 0x50, 0x38, 0x66, 0x52, - 0x4d, 0x5c, 0x0a, - 0x09, 0x43, 0x50, 0x61, 0x46, 0x72, 0x73, 0x45, 0x41, 0x41, 0x41, 0x41, 0x41, 0x53, 0x55, 0x56, 0x4f, 0x52, - 0x4b, 0x35, 0x43, 0x59, 0x49, 0x49, 0x3d, 0x5c, 0x0a, - 0x09, 0x22, 0x0a, - 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x6e, 0x67, 0x20, 0x3d, 0x0a, - 0x09, 0x22, 0x69, 0x56, 0x42, 0x4f, 0x52, 0x77, 0x30, 0x4b, 0x47, 0x67, 0x6f, 0x41, 0x41, 0x41, 0x41, 0x4e, - 0x53, 0x55, 0x68, 0x45, 0x55, 0x67, 0x41, 0x41, 0x41, 0x49, 0x41, 0x41, 0x41, 0x41, 0x42, 0x41, 0x43, 0x41, - 0x59, 0x41, 0x41, 0x41, 0x44, 0x53, 0x31, 0x6e, 0x39, 0x2f, 0x41, 0x41, 0x41, 0x48, 0x6c, 0x45, 0x6c, 0x45, - 0x51, 0x56, 0x52, 0x34, 0x6e, 0x4f, 0x32, 0x62, 0x65, 0x34, 0x78, 0x64, 0x56, 0x52, 0x58, 0x47, 0x66, 0x7a, - 0x4f, 0x64, 0x5c, 0x0a, - 0x09, 0x61, 0x57, 0x6c, 0x4c, 0x69, 0x7a, 0x43, 0x30, 0x59, 0x68, 0x38, 0x38, 0x4f, 0x79, 0x6b, 0x57, 0x78, - 0x51, 0x6f, 0x74, 0x64, 0x41, 0x6f, 0x71, 0x31, 0x42, 0x52, 0x45, 0x53, 0x56, 0x56, 0x53, 0x59, 0x77, 0x31, - 0x70, 0x51, 0x67, 0x69, 0x52, 0x67, 0x42, 0x41, 0x44, 0x78, 0x6f, 0x51, 0x59, 0x69, 0x64, 0x68, 0x45, 0x78, - 0x47, 0x42, 0x4a, 0x4e, 0x43, 0x67, 0x59, 0x45, 0x74, 0x4e, 0x71, 0x55, 0x6a, 0x48, 0x57, 0x38, 0x45, 0x61, - 0x6b, 0x5c, 0x0a, - 0x09, 0x74, 0x63, 0x58, 0x36, 0x41, 0x4d, 0x61, 0x71, 0x69, 0x50, 0x61, 0x68, 0x56, 0x69, 0x69, 0x56, 0x55, - 0x74, 0x73, 0x69, 0x46, 0x4b, 0x61, 0x4d, 0x4c, 0x5a, 0x33, 0x32, 0x38, 0x34, 0x2b, 0x31, 0x54, 0x75, 0x36, - 0x2b, 0x5a, 0x38, 0x34, 0x35, 0x64, 0x31, 0x36, 0x33, 0x63, 0x34, 0x65, 0x7a, 0x76, 0x2b, 0x52, 0x6b, 0x33, - 0x37, 0x50, 0x58, 0x32, 0x6e, 0x75, 0x74, 0x73, 0x2f, 0x64, 0x33, 0x39, 0x6c, 0x6e, 0x37, 0x63, 0x5a, 0x73, - 0x6b, 0x5c, 0x0a, - 0x09, 0x45, 0x56, 0x46, 0x65, 0x4e, 0x41, 0x2b, 0x33, 0x41, 0x78, 0x48, 0x44, 0x69, 0x30, 0x69, 0x41, 0x6b, - 0x69, 0x4d, 0x53, 0x6f, 0x4c, 0x48, 0x52, 0x42, 0x49, 0x77, 0x48, 0x52, 0x74, 0x58, 0x4c, 0x51, 0x43, 0x52, - 0x41, 0x59, 0x2b, 0x4d, 0x6d, 0x59, 0x44, 0x2f, 0x77, 0x6c, 0x58, 0x6f, 0x5a, 0x69, 0x41, 0x52, 0x6f, 0x62, - 0x45, 0x7a, 0x77, 0x39, 0x48, 0x33, 0x31, 0x4d, 0x68, 0x41, 0x4a, 0x30, 0x4e, 0x68, 0x34, 0x77, 0x39, 0x4d, - 0x70, 0x5c, 0x0a, - 0x09, 0x39, 0x54, 0x49, 0x51, 0x43, 0x64, 0x44, 0x59, 0x36, 0x50, 0x4c, 0x30, 0x68, 0x48, 0x6f, 0x5a, 0x69, - 0x41, 0x52, 0x6f, 0x62, 0x4f, 0x7a, 0x32, 0x39, 0x4d, 0x52, 0x36, 0x47, 0x57, 0x69, 0x70, 0x56, 0x38, 0x55, - 0x52, 0x6d, 0x5a, 0x67, 0x4c, 0x66, 0x42, 0x69, 0x59, 0x42, 0x4c, 0x77, 0x43, 0x50, 0x41, 0x6c, 0x73, 0x4c, - 0x64, 0x42, 0x2f, 0x31, 0x64, 0x4e, 0x49, 0x67, 0x44, 0x71, 0x69, 0x44, 0x66, 0x67, 0x44, 0x38, 0x47, 0x2f, - 0x67, 0x5c, 0x0a, - 0x09, 0x49, 0x30, 0x48, 0x2b, 0x61, 0x47, 0x41, 0x42, 0x63, 0x43, 0x72, 0x77, 0x4f, 0x76, 0x42, 0x62, 0x59, - 0x47, 0x65, 0x71, 0x37, 0x48, 0x51, 0x76, 0x76, 0x78, 0x33, 0x59, 0x56, 0x32, 0x42, 0x6a, 0x4e, 0x76, 0x41, - 0x44, 0x34, 0x4c, 0x77, 0x4d, 0x32, 0x55, 0x72, 0x67, 0x65, 0x71, 0x41, 0x37, 0x51, 0x37, 0x62, 0x48, 0x30, - 0x32, 0x5a, 0x73, 0x4b, 0x6e, 0x69, 0x34, 0x77, 0x4d, 0x61, 0x41, 0x30, 0x44, 0x51, 0x43, 0x6c, 0x34, 0x4a, - 0x48, 0x5c, 0x0a, - 0x09, 0x41, 0x65, 0x33, 0x41, 0x54, 0x4f, 0x41, 0x30, 0x34, 0x46, 0x6e, 0x67, 0x36, 0x5a, 0x52, 0x4f, 0x45, - 0x39, 0x62, 0x59, 0x35, 0x77, 0x4e, 0x54, 0x4d, 0x61, 0x4c, 0x76, 0x77, 0x54, 0x72, 0x77, 0x6c, 0x38, 0x44, - 0x65, 0x51, 0x48, 0x63, 0x36, 0x73, 0x4d, 0x4e, 0x2f, 0x7a, 0x77, 0x55, 0x32, 0x41, 0x6e, 0x4f, 0x41, 0x31, - 0x63, 0x41, 0x70, 0x67, 0x64, 0x35, 0x68, 0x34, 0x44, 0x37, 0x67, 0x69, 0x38, 0x41, 0x30, 0x34, 0x4d, 0x66, - 0x41, 0x5c, 0x0a, - 0x09, 0x66, 0x4a, 0x63, 0x4a, 0x65, 0x41, 0x43, 0x34, 0x41, 0x64, 0x69, 0x56, 0x38, 0x6d, 0x55, 0x68, 0x38, - 0x42, 0x41, 0x77, 0x31, 0x75, 0x2b, 0x66, 0x42, 0x76, 0x34, 0x4a, 0x76, 0x4e, 0x66, 0x74, 0x41, 0x54, 0x77, - 0x49, 0x66, 0x44, 0x72, 0x6a, 0x57, 0x63, 0x64, 0x53, 0x49, 0x63, 0x59, 0x34, 0x34, 0x48, 0x38, 0x5a, 0x4f, - 0x6f, 0x4f, 0x44, 0x70, 0x4a, 0x46, 0x77, 0x48, 0x53, 0x50, 0x70, 0x4b, 0x6b, 0x6d, 0x50, 0x53, 0x75, 0x70, - 0x53, 0x5c, 0x0a, - 0x09, 0x4e, 0x66, 0x36, 0x65, 0x30, 0x72, 0x31, 0x51, 0x30, 0x69, 0x62, 0x6c, 0x34, 0x77, 0x6c, 0x4a, 0x73, - 0x31, 0x4a, 0x6c, 0x4e, 0x72, 0x70, 0x73, 0x75, 0x61, 0x54, 0x4a, 0x6b, 0x76, 0x62, 0x34, 0x66, 0x59, 0x2b, - 0x6b, 0x54, 0x6b, 0x6e, 0x50, 0x42, 0x65, 0x55, 0x66, 0x6c, 0x76, 0x53, 0x76, 0x34, 0x50, 0x35, 0x41, 0x38, - 0x48, 0x75, 0x62, 0x70, 0x4c, 0x61, 0x67, 0x33, 0x71, 0x6d, 0x53, 0x58, 0x67, 0x39, 0x6b, 0x48, 0x53, 0x6d, - 0x37, 0x5c, 0x0a, - 0x09, 0x69, 0x34, 0x4f, 0x79, 0x63, 0x33, 0x4b, 0x65, 0x2f, 0x51, 0x32, 0x58, 0x74, 0x2b, 0x58, 0x49, 0x42, - 0x33, 0x55, 0x4e, 0x64, 0x38, 0x66, 0x32, 0x35, 0x66, 0x71, 0x4d, 0x70, 0x46, 0x32, 0x71, 0x78, 0x6d, 0x46, - 0x4a, 0x4f, 0x34, 0x4c, 0x37, 0x34, 0x31, 0x54, 0x70, 0x2f, 0x4c, 0x63, 0x39, 0x37, 0x36, 0x43, 0x6b, 0x64, - 0x5a, 0x4a, 0x57, 0x2b, 0x50, 0x57, 0x77, 0x4b, 0x68, 0x31, 0x35, 0x57, 0x4e, 0x4c, 0x70, 0x67, 0x59, 0x30, - 0x76, 0x5c, 0x0a, - 0x09, 0x65, 0x66, 0x34, 0x32, 0x53, 0x58, 0x66, 0x36, 0x37, 0x78, 0x32, 0x53, 0x5a, 0x67, 0x59, 0x36, 0x69, - 0x79, 0x51, 0x64, 0x43, 0x6d, 0x79, 0x2b, 0x4b, 0x6d, 0x6d, 0x32, 0x70, 0x47, 0x5a, 0x4a, 0x6c, 0x30, 0x6e, - 0x61, 0x36, 0x2f, 0x6b, 0x2f, 0x44, 0x4d, 0x72, 0x63, 0x35, 0x58, 0x6e, 0x2f, 0x6b, 0x54, 0x51, 0x74, 0x35, - 0x2f, 0x6b, 0x53, 0x38, 0x6e, 0x30, 0x2b, 0x52, 0x37, 0x37, 0x56, 0x35, 0x61, 0x66, 0x6e, 0x79, 0x42, 0x75, - 0x57, 0x5c, 0x0a, - 0x09, 0x41, 0x47, 0x4d, 0x6b, 0x6a, 0x52, 0x70, 0x6b, 0x48, 0x54, 0x63, 0x46, 0x44, 0x66, 0x36, 0x79, 0x70, - 0x47, 0x39, 0x49, 0x75, 0x6c, 0x6a, 0x53, 0x73, 0x5a, 0x4a, 0x61, 0x4a, 0x58, 0x57, 0x37, 0x62, 0x47, 0x47, - 0x71, 0x4d, 0x54, 0x73, 0x6c, 0x54, 0x63, 0x2b, 0x6f, 0x37, 0x36, 0x4b, 0x67, 0x76, 0x6c, 0x75, 0x43, 0x2f, - 0x4a, 0x6c, 0x42, 0x66, 0x6a, 0x4c, 0x43, 0x4c, 0x4d, 0x34, 0x6f, 0x66, 0x32, 0x2b, 0x67, 0x39, 0x2b, 0x57, - 0x55, 0x5c, 0x0a, - 0x09, 0x37, 0x42, 0x4c, 0x50, 0x50, 0x79, 0x4b, 0x70, 0x33, 0x66, 0x4e, 0x32, 0x65, 0x74, 0x34, 0x39, 0x37, - 0x6e, 0x4f, 0x36, 0x76, 0x6b, 0x6b, 0x79, 0x49, 0x6b, 0x6e, 0x53, 0x30, 0x70, 0x77, 0x32, 0x65, 0x4d, 0x72, - 0x6c, 0x38, 0x77, 0x62, 0x5a, 0x6c, 0x76, 0x30, 0x69, 0x77, 0x48, 0x73, 0x6b, 0x76, 0x53, 0x52, 0x37, 0x4d, - 0x79, 0x5a, 0x4c, 0x57, 0x69, 0x5a, 0x70, 0x72, 0x61, 0x52, 0x6e, 0x4a, 0x50, 0x31, 0x4d, 0x4e, 0x68, 0x79, - 0x33, 0x5c, 0x0a, - 0x09, 0x46, 0x6c, 0x51, 0x38, 0x56, 0x64, 0x4a, 0x62, 0x37, 0x76, 0x68, 0x4c, 0x6b, 0x6c, 0x5a, 0x4a, 0x2b, - 0x70, 0x54, 0x73, 0x62, 0x65, 0x6d, 0x72, 0x63, 0x7a, 0x4e, 0x6c, 0x51, 0x37, 0x41, 0x6b, 0x66, 0x56, 0x66, - 0x53, 0x32, 0x41, 0x79, 0x64, 0x70, 0x4d, 0x4e, 0x76, 0x63, 0x7a, 0x38, 0x54, 0x76, 0x44, 0x2b, 0x6e, 0x7a, - 0x75, 0x38, 0x45, 0x4f, 0x6e, 0x39, 0x4a, 0x79, 0x56, 0x34, 0x49, 0x5a, 0x41, 0x64, 0x79, 0x37, 0x48, 0x30, - 0x6f, 0x5c, 0x0a, - 0x09, 0x30, 0x45, 0x6c, 0x2f, 0x52, 0x73, 0x4c, 0x4f, 0x75, 0x6c, 0x33, 0x53, 0x52, 0x46, 0x57, 0x6a, 0x52, - 0x39, 0x4c, 0x7a, 0x33, 0x6e, 0x34, 0x72, 0x4a, 0x4b, 0x32, 0x57, 0x39, 0x4a, 0x72, 0x4c, 0x33, 0x6e, 0x54, - 0x2f, 0x73, 0x33, 0x7a, 0x2b, 0x75, 0x6d, 0x7a, 0x45, 0x2b, 0x6d, 0x41, 0x2f, 0x32, 0x6d, 0x37, 0x51, 0x42, - 0x47, 0x68, 0x33, 0x78, 0x37, 0x5a, 0x4c, 0x32, 0x71, 0x31, 0x73, 0x2f, 0x45, 0x33, 0x53, 0x47, 0x54, 0x6e, - 0x6c, 0x5c, 0x0a, - 0x09, 0x46, 0x2b, 0x65, 0x55, 0x32, 0x53, 0x4c, 0x70, 0x67, 0x6a, 0x34, 0x36, 0x64, 0x36, 0x75, 0x58, 0x65, - 0x55, 0x35, 0x53, 0x55, 0x34, 0x37, 0x4f, 0x61, 0x74, 0x64, 0x35, 0x53, 0x74, 0x4a, 0x70, 0x67, 0x5a, 0x33, - 0x6a, 0x4d, 0x33, 0x54, 0x48, 0x71, 0x50, 0x4b, 0x32, 0x4a, 0x5a, 0x67, 0x66, 0x79, 0x4f, 0x38, 0x4f, 0x38, - 0x6a, 0x66, 0x6e, 0x32, 0x47, 0x73, 0x50, 0x64, 0x4d, 0x37, 0x4b, 0x6b, 0x46, 0x38, 0x58, 0x2b, 0x48, 0x78, - 0x69, 0x5c, 0x0a, - 0x09, 0x6f, 0x4e, 0x75, 0x74, 0x66, 0x4c, 0x77, 0x73, 0x47, 0x39, 0x57, 0x4b, 0x32, 0x71, 0x4b, 0x6c, 0x68, - 0x6e, 0x7a, 0x41, 0x56, 0x39, 0x34, 0x30, 0x4d, 0x46, 0x6d, 0x43, 0x54, 0x4b, 0x4c, 0x67, 0x62, 0x6d, 0x77, - 0x61, 0x38, 0x31, 0x66, 0x67, 0x5a, 0x4f, 0x42, 0x61, 0x34, 0x43, 0x78, 0x67, 0x50, 0x58, 0x41, 0x4f, 0x6c, - 0x66, 0x6b, 0x71, 0x77, 0x43, 0x4c, 0x67, 0x70, 0x38, 0x48, 0x39, 0x49, 0x31, 0x68, 0x6b, 0x76, 0x42, 0x51, - 0x34, 0x5c, 0x0a, - 0x09, 0x45, 0x39, 0x67, 0x41, 0x58, 0x41, 0x6e, 0x63, 0x58, 0x79, 0x4d, 0x2b, 0x62, 0x66, 0x4e, 0x30, 0x4d, - 0x78, 0x5a, 0x6c, 0x5a, 0x32, 0x47, 0x2f, 0x70, 0x78, 0x33, 0x59, 0x71, 0x6c, 0x6b, 0x50, 0x46, 0x76, 0x48, - 0x50, 0x41, 0x64, 0x61, 0x6b, 0x64, 0x4b, 0x2f, 0x78, 0x4f, 0x74, 0x2f, 0x79, 0x35, 0x35, 0x67, 0x48, 0x33, - 0x4f, 0x4c, 0x2b, 0x41, 0x6a, 0x77, 0x47, 0x66, 0x4d, 0x46, 0x2f, 0x37, 0x79, 0x45, 0x62, 0x34, 0x34, 0x50, - 0x66, 0x5c, 0x0a, - 0x09, 0x6b, 0x7a, 0x4c, 0x6b, 0x47, 0x7a, 0x77, 0x39, 0x47, 0x7a, 0x6a, 0x6f, 0x74, 0x73, 0x59, 0x44, 0x56, - 0x32, 0x41, 0x7a, 0x6a, 0x54, 0x4f, 0x42, 0x6b, 0x37, 0x41, 0x70, 0x35, 0x6b, 0x48, 0x67, 0x65, 0x61, 0x41, - 0x54, 0x4f, 0x4a, 0x52, 0x6a, 0x4c, 0x30, 0x46, 0x50, 0x44, 0x66, 0x6e, 0x41, 0x6b, 0x63, 0x4f, 0x4d, 0x59, - 0x77, 0x4f, 0x47, 0x48, 0x70, 0x44, 0x30, 0x67, 0x5a, 0x52, 0x38, 0x73, 0x69, 0x7a, 0x36, 0x6c, 0x71, 0x54, - 0x37, 0x5c, 0x0a, - 0x09, 0x55, 0x2b, 0x57, 0x53, 0x59, 0x4f, 0x68, 0x5a, 0x53, 0x54, 0x4d, 0x43, 0x32, 0x53, 0x6d, 0x71, 0x44, - 0x4e, 0x6e, 0x64, 0x71, 0x68, 0x33, 0x55, 0x58, 0x4f, 0x2b, 0x36, 0x75, 0x79, 0x56, 0x4e, 0x79, 0x4e, 0x46, - 0x5a, 0x45, 0x2f, 0x69, 0x35, 0x55, 0x4e, 0x4c, 0x6a, 0x67, 0x65, 0x33, 0x52, 0x67, 0x64, 0x34, 0x73, 0x56, - 0x61, 0x4c, 0x70, 0x4f, 0x31, 0x77, 0x33, 0x77, 0x52, 0x57, 0x75, 0x63, 0x34, 0x79, 0x6b, 0x2f, 0x5a, 0x36, - 0x33, 0x5c, 0x0a, - 0x09, 0x4d, 0x63, 0x66, 0x65, 0x37, 0x4b, 0x44, 0x63, 0x68, 0x52, 0x6e, 0x79, 0x46, 0x74, 0x6c, 0x77, 0x4c, - 0x55, 0x6e, 0x6e, 0x53, 0x76, 0x71, 0x35, 0x2f, 0x31, 0x35, 0x54, 0x34, 0x31, 0x6d, 0x48, 0x37, 0x63, 0x6f, - 0x54, 0x6a, 0x41, 0x34, 0x65, 0x39, 0x4a, 0x34, 0x63, 0x6e, 0x66, 0x6b, 0x75, 0x44, 0x34, 0x4f, 0x65, 0x70, - 0x5a, 0x36, 0x33, 0x56, 0x39, 0x6e, 0x44, 0x63, 0x4a, 0x73, 0x71, 0x45, 0x66, 0x32, 0x33, 0x61, 0x6a, 0x6a, - 0x58, 0x5c, 0x0a, - 0x09, 0x4a, 0x6d, 0x6d, 0x66, 0x36, 0x7a, 0x36, 0x6d, 0x33, 0x74, 0x2f, 0x6b, 0x4e, 0x6c, 0x56, 0x50, 0x77, - 0x57, 0x36, 0x58, 0x64, 0x46, 0x37, 0x51, 0x41, 0x62, 0x2b, 0x54, 0x39, 0x41, 0x6c, 0x4a, 0x4e, 0x30, 0x72, - 0x36, 0x72, 0x2b, 0x64, 0x74, 0x56, 0x34, 0x56, 0x4d, 0x53, 0x65, 0x64, 0x30, 0x71, 0x52, 0x4a, 0x67, 0x72, - 0x66, 0x53, 0x38, 0x58, 0x54, 0x6b, 0x2b, 0x6e, 0x52, 0x48, 0x59, 0x4f, 0x7a, 0x56, 0x48, 0x4a, 0x2f, 0x6c, - 0x6b, 0x5c, 0x0a, - 0x09, 0x4c, 0x70, 0x4b, 0x30, 0x49, 0x4e, 0x44, 0x2f, 0x61, 0x6f, 0x33, 0x6e, 0x6e, 0x61, 0x6a, 0x73, 0x4f, - 0x4b, 0x42, 0x46, 0x30, 0x6a, 0x63, 0x6c, 0x58, 0x56, 0x6d, 0x6a, 0x2f, 0x4a, 0x41, 0x53, 0x6f, 0x44, 0x6c, - 0x77, 0x2f, 0x4f, 0x4d, 0x46, 0x46, 0x57, 0x78, 0x77, 0x6e, 0x54, 0x76, 0x39, 0x50, 0x76, 0x6d, 0x4f, 0x66, - 0x72, 0x2b, 0x67, 0x7a, 0x4e, 0x64, 0x63, 0x5a, 0x32, 0x30, 0x66, 0x48, 0x50, 0x78, 0x63, 0x34, 0x4d, 0x63, - 0x6d, 0x5c, 0x0a, - 0x09, 0x53, 0x5a, 0x2b, 0x56, 0x64, 0x65, 0x44, 0x4a, 0x73, 0x76, 0x6c, 0x38, 0x69, 0x48, 0x56, 0x65, 0x35, - 0x6a, 0x70, 0x56, 0x53, 0x42, 0x44, 0x69, 0x46, 0x56, 0x56, 0x2f, 0x74, 0x39, 0x74, 0x55, 0x47, 0x63, 0x57, - 0x36, 0x5a, 0x42, 0x48, 0x35, 0x52, 0x2f, 0x33, 0x2b, 0x7a, 0x59, 0x4a, 0x32, 0x57, 0x53, 0x58, 0x70, 0x4a, - 0x38, 0x71, 0x50, 0x53, 0x2f, 0x37, 0x73, 0x64, 0x58, 0x7a, 0x53, 0x37, 0x33, 0x38, 0x55, 0x2b, 0x4c, 0x42, - 0x4b, 0x5c, 0x0a, - 0x09, 0x6c, 0x5a, 0x63, 0x6c, 0x4a, 0x4e, 0x55, 0x79, 0x74, 0x39, 0x6d, 0x74, 0x33, 0x6e, 0x48, 0x56, 0x58, - 0x43, 0x39, 0x37, 0x71, 0x4d, 0x44, 0x6d, 0x6b, 0x42, 0x4f, 0x41, 0x77, 0x4f, 0x6e, 0x5a, 0x42, 0x54, 0x6f, - 0x33, 0x75, 0x4d, 0x34, 0x6d, 0x76, 0x31, 0x2f, 0x68, 0x39, 0x30, 0x56, 0x76, 0x39, 0x32, 0x32, 0x75, 0x38, - 0x33, 0x67, 0x66, 0x6e, 0x62, 0x78, 0x4b, 0x31, 0x57, 0x39, 0x36, 0x47, 0x73, 0x6c, 0x63, 0x75, 0x79, 0x73, - 0x6f, 0x5c, 0x0a, - 0x09, 0x30, 0x79, 0x45, 0x4c, 0x45, 0x4c, 0x65, 0x35, 0x62, 0x39, 0x2b, 0x57, 0x39, 0x4f, 0x36, 0x4d, 0x75, - 0x71, 0x64, 0x4a, 0x2b, 0x70, 0x4d, 0x73, 0x36, 0x42, 0x76, 0x6e, 0x65, 0x55, 0x74, 0x6b, 0x52, 0x42, 0x68, - 0x6f, 0x6f, 0x38, 0x36, 0x53, 0x66, 0x56, 0x61, 0x53, 0x47, 0x63, 0x38, 0x59, 0x53, 0x59, 0x2b, 0x6b, 0x66, - 0x4e, 0x34, 0x75, 0x43, 0x78, 0x52, 0x33, 0x70, 0x76, 0x4a, 0x66, 0x6c, 0x44, 0x51, 0x6c, 0x56, 0x56, 0x2b, - 0x72, 0x5c, 0x0a, - 0x09, 0x70, 0x41, 0x64, 0x6c, 0x6e, 0x36, 0x56, 0x68, 0x49, 0x55, 0x42, 0x52, 0x59, 0x35, 0x77, 0x64, 0x36, - 0x4a, 0x30, 0x67, 0x47, 0x36, 0x6f, 0x6b, 0x36, 0x52, 0x63, 0x35, 0x2b, 0x6a, 0x4e, 0x55, 0x47, 0x59, 0x35, - 0x76, 0x37, 0x49, 0x65, 0x6a, 0x37, 0x54, 0x4a, 0x79, 0x68, 0x61, 0x75, 0x41, 0x6d, 0x32, 0x56, 0x44, 0x66, - 0x42, 0x69, 0x76, 0x6e, 0x44, 0x54, 0x55, 0x44, 0x54, 0x52, 0x45, 0x56, 0x35, 0x4f, 0x6b, 0x61, 0x79, 0x54, - 0x39, 0x5c, 0x0a, - 0x09, 0x51, 0x37, 0x31, 0x78, 0x52, 0x4e, 0x4c, 0x76, 0x4a, 0x56, 0x32, 0x72, 0x36, 0x72, 0x6a, 0x6c, 0x71, - 0x46, 0x78, 0x46, 0x65, 0x77, 0x45, 0x39, 0x32, 0x4c, 0x72, 0x37, 0x45, 0x71, 0x71, 0x6a, 0x2b, 0x68, 0x41, - 0x74, 0x32, 0x50, 0x70, 0x30, 0x43, 0x37, 0x59, 0x75, 0x50, 0x67, 0x72, 0x34, 0x44, 0x52, 0x61, 0x31, 0x58, - 0x77, 0x7a, 0x38, 0x32, 0x76, 0x58, 0x47, 0x41, 0x6c, 0x63, 0x44, 0x79, 0x37, 0x43, 0x39, 0x37, 0x52, 0x65, - 0x77, 0x5c, 0x0a, - 0x09, 0x55, 0x79, 0x37, 0x39, 0x58, 0x64, 0x74, 0x75, 0x78, 0x74, 0x62, 0x32, 0x44, 0x31, 0x49, 0x64, 0x71, - 0x65, 0x38, 0x44, 0x6a, 0x6e, 0x4d, 0x66, 0x30, 0x76, 0x73, 0x43, 0x6a, 0x59, 0x59, 0x5a, 0x32, 0x4f, 0x78, - 0x71, 0x41, 0x76, 0x59, 0x4d, 0x57, 0x34, 0x48, 0x58, 0x68, 0x73, 0x75, 0x5a, 0x6f, 0x74, 0x33, 0x41, 0x54, - 0x6d, 0x78, 0x36, 0x31, 0x56, 0x61, 0x67, 0x30, 0x34, 0x4d, 0x39, 0x78, 0x42, 0x52, 0x73, 0x65, 0x76, 0x4d, - 0x41, 0x5c, 0x0a, - 0x09, 0x38, 0x41, 0x54, 0x77, 0x4d, 0x57, 0x41, 0x74, 0x73, 0x4d, 0x35, 0x74, 0x7a, 0x4d, 0x4d, 0x32, 0x4d, - 0x38, 0x42, 0x32, 0x33, 0x53, 0x35, 0x6c, 0x59, 0x42, 0x73, 0x62, 0x52, 0x37, 0x78, 0x38, 0x47, 0x67, 0x6b, - 0x42, 0x69, 0x6e, 0x78, 0x74, 0x46, 0x47, 0x7a, 0x7a, 0x71, 0x79, 0x46, 0x51, 0x64, 0x43, 0x43, 0x6b, 0x30, - 0x39, 0x50, 0x4a, 0x4e, 0x65, 0x70, 0x49, 0x31, 0x67, 0x41, 0x6d, 0x65, 0x72, 0x6f, 0x45, 0x6d, 0x31, 0x4f, - 0x33, 0x5c, 0x0a, - 0x09, 0x41, 0x4a, 0x64, 0x67, 0x57, 0x36, 0x72, 0x6a, 0x73, 0x4c, 0x6e, 0x75, 0x66, 0x64, 0x6a, 0x57, 0x61, - 0x48, 0x38, 0x61, 0x34, 0x48, 0x7a, 0x67, 0x4c, 0x75, 0x44, 0x34, 0x41, 0x70, 0x32, 0x45, 0x58, 0x4c, 0x58, - 0x6d, 0x30, 0x78, 0x45, 0x70, 0x46, 0x49, 0x30, 0x41, 0x7a, 0x32, 0x42, 0x62, 0x6e, 0x30, 0x58, 0x37, 0x33, - 0x47, 0x42, 0x76, 0x66, 0x52, 0x65, 0x32, 0x4b, 0x41, 0x53, 0x32, 0x69, 0x48, 0x51, 0x35, 0x63, 0x43, 0x35, - 0x77, 0x5c, 0x0a, - 0x09, 0x41, 0x64, 0x59, 0x35, 0x4c, 0x77, 0x4b, 0x2f, 0x6f, 0x6e, 0x72, 0x42, 0x71, 0x4b, 0x2b, 0x34, 0x41, - 0x37, 0x67, 0x49, 0x32, 0x38, 0x70, 0x64, 0x6e, 0x69, 0x45, 0x66, 0x52, 0x2b, 0x58, 0x49, 0x56, 0x4e, 0x34, - 0x43, 0x54, 0x6b, 0x51, 0x4f, 0x69, 0x6d, 0x4b, 0x41, 0x56, 0x75, 0x78, 0x74, 0x33, 0x55, 0x6a, 0x2b, 0x53, - 0x74, 0x7a, 0x52, 0x77, 0x48, 0x4c, 0x67, 0x5a, 0x75, 0x7a, 0x62, 0x50, 0x6a, 0x39, 0x44, 0x76, 0x67, 0x41, - 0x6a, 0x5c, 0x0a, - 0x09, 0x31, 0x39, 0x76, 0x41, 0x75, 0x36, 0x6a, 0x48, 0x6e, 0x76, 0x6b, 0x37, 0x47, 0x45, 0x57, 0x66, 0x67, - 0x45, 0x50, 0x59, 0x53, 0x5a, 0x6e, 0x68, 0x50, 0x6a, 0x47, 0x79, 0x79, 0x74, 0x4d, 0x4f, 0x62, 0x4e, 0x6b, - 0x35, 0x6a, 0x61, 0x73, 0x39, 0x58, 0x55, 0x2f, 0x73, 0x2f, 0x48, 0x35, 0x6a, 0x4a, 0x42, 0x77, 0x4b, 0x2f, - 0x53, 0x4e, 0x32, 0x48, 0x41, 0x76, 0x67, 0x62, 0x6d, 0x77, 0x64, 0x50, 0x55, 0x45, 0x48, 0x46, 0x6e, 0x4d, - 0x41, 0x5c, 0x0a, - 0x09, 0x66, 0x4f, 0x39, 0x6f, 0x4f, 0x76, 0x56, 0x4f, 0x77, 0x55, 0x67, 0x35, 0x45, 0x6e, 0x59, 0x4f, 0x46, - 0x70, 0x4f, 0x30, 0x59, 0x6d, 0x2f, 0x36, 0x76, 0x64, 0x68, 0x52, 0x72, 0x6c, 0x75, 0x78, 0x36, 0x48, 0x38, - 0x39, 0x39, 0x69, 0x6d, 0x49, 0x36, 0x43, 0x64, 0x47, 0x43, 0x67, 0x48, 0x41, 0x64, 0x68, 0x42, 0x58, 0x30, - 0x76, 0x74, 0x2f, 0x63, 0x6c, 0x75, 0x77, 0x77, 0x35, 0x78, 0x37, 0x65, 0x35, 0x57, 0x49, 0x71, 0x49, 0x6d, - 0x52, 0x5c, 0x0a, - 0x09, 0x52, 0x41, 0x43, 0x77, 0x6b, 0x65, 0x42, 0x6d, 0x62, 0x4c, 0x36, 0x2f, 0x42, 0x54, 0x76, 0x67, 0x75, - 0x59, 0x34, 0x34, 0x2f, 0x52, 0x73, 0x77, 0x52, 0x68, 0x6f, 0x42, 0x49, 0x6f, 0x59, 0x59, 0x49, 0x79, 0x45, - 0x49, 0x6a, 0x4b, 0x67, 0x6a, 0x49, 0x67, 0x46, 0x4b, 0x6a, 0x6b, 0x69, 0x41, 0x6b, 0x69, 0x4d, 0x53, 0x6f, - 0x4f, 0x53, 0x49, 0x42, 0x43, 0x67, 0x35, 0x49, 0x67, 0x46, 0x4b, 0x6a, 0x6b, 0x69, 0x41, 0x6b, 0x69, 0x4d, - 0x53, 0x5c, 0x0a, - 0x09, 0x6f, 0x4f, 0x53, 0x49, 0x42, 0x43, 0x67, 0x35, 0x49, 0x67, 0x46, 0x4b, 0x6a, 0x6b, 0x69, 0x41, 0x6b, - 0x69, 0x4d, 0x53, 0x6f, 0x4f, 0x53, 0x49, 0x42, 0x43, 0x67, 0x35, 0x49, 0x67, 0x46, 0x4b, 0x6a, 0x6b, 0x69, - 0x41, 0x6b, 0x69, 0x4d, 0x53, 0x6f, 0x4f, 0x53, 0x49, 0x42, 0x43, 0x67, 0x35, 0x49, 0x67, 0x46, 0x4b, 0x6a, - 0x6b, 0x69, 0x41, 0x6b, 0x69, 0x4d, 0x53, 0x6f, 0x4f, 0x53, 0x49, 0x42, 0x43, 0x67, 0x35, 0x49, 0x67, 0x46, - 0x4b, 0x5c, 0x0a, - 0x09, 0x6a, 0x6b, 0x69, 0x41, 0x6b, 0x69, 0x4d, 0x53, 0x6f, 0x4f, 0x53, 0x49, 0x42, 0x43, 0x67, 0x35, 0x49, - 0x67, 0x46, 0x4b, 0x6a, 0x6b, 0x69, 0x41, 0x6b, 0x69, 0x4d, 0x53, 0x6f, 0x4f, 0x53, 0x49, 0x42, 0x43, 0x67, - 0x35, 0x49, 0x67, 0x46, 0x4b, 0x6a, 0x76, 0x38, 0x44, 0x2f, 0x7a, 0x63, 0x46, 0x56, 0x65, 0x67, 0x2b, 0x6a, - 0x62, 0x55, 0x41, 0x41, 0x41, 0x41, 0x41, 0x53, 0x55, 0x56, 0x4f, 0x52, 0x4b, 0x35, 0x43, 0x59, 0x49, 0x49, - 0x3d, 0x5c, 0x0a, - 0x09, 0x22, 0x0a, - 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x6f, - 0x61, 0x64, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x2c, 0x20, 0x6e, 0x61, 0x6d, 0x65, - 0x29, 0x0a, - 0x09, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, - 0x68, 0x69, 0x63, 0x73, 0x2e, 0x6e, 0x65, 0x77, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x28, 0x6c, 0x6f, 0x76, 0x65, - 0x2e, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2e, 0x6e, 0x65, 0x77, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x44, 0x61, 0x74, - 0x61, 0x28, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x2e, - 0x6e, 0x65, 0x77, 0x46, 0x69, 0x6c, 0x65, 0x44, 0x61, 0x74, 0x61, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x2c, 0x20, - 0x6e, 0x61, 0x6d, 0x65, 0x3a, 0x67, 0x73, 0x75, 0x62, 0x28, 0x22, 0x5f, 0x22, 0x2c, 0x20, 0x22, 0x2e, 0x22, - 0x29, 0x2c, 0x20, 0x22, 0x62, 0x61, 0x73, 0x65, 0x36, 0x34, 0x22, 0x29, 0x29, 0x29, 0x0a, - 0x09, 0x65, 0x6e, 0x64, 0x0a, - 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x3d, - 0x20, 0x7b, 0x7d, 0x0a, - 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x20, - 0x3d, 0x20, 0x7b, 0x7d, 0x0a, - 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x75, 0x62, 0x62, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, - 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x65, 0x78, 0x74, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, - 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x61, 0x69, 0x6e, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, - 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x67, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x30, 0x0a, - 0x09, 0x0a, - 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x72, 0x61, 0x69, 0x6e, 0x0a, - 0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x6c, 0x6f, 0x61, - 0x64, 0x28, 0x29, 0x0a, - 0x09, 0x09, 0x2d, 0x2d, 0x20, 0x53, 0x75, 0x62, 0x74, 0x72, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x20, 0x62, - 0x6c, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x69, 0x73, 0x6e, 0x27, 0x74, 0x20, 0x73, 0x75, 0x70, 0x70, - 0x6f, 0x72, 0x74, 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x20, 0x73, 0x6f, 0x6d, 0x65, 0x20, 0x61, 0x6e, 0x63, 0x69, - 0x65, 0x6e, 0x74, 0x20, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x2c, 0x20, 0x73, 0x6f, 0x0a, - 0x09, 0x09, 0x2d, 0x2d, 0x20, 0x77, 0x65, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x6d, 0x61, 0x6b, - 0x65, 0x20, 0x73, 0x75, 0x72, 0x65, 0x20, 0x69, 0x74, 0x20, 0x73, 0x74, 0x69, 0x6c, 0x6c, 0x20, 0x6c, 0x6f, - 0x6f, 0x6b, 0x73, 0x20, 0x64, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x61, 0x74, - 0x20, 0x63, 0x61, 0x73, 0x65, 0x2e, 0x0a, - 0x09, 0x09, 0x69, 0x66, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, - 0x2e, 0x69, 0x73, 0x53, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x28, 0x22, 0x73, 0x75, 0x62, 0x74, - 0x72, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, - 0x09, 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x73, - 0x65, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, - 0x31, 0x33, 0x37, 0x2c, 0x20, 0x31, 0x39, 0x34, 0x2c, 0x20, 0x32, 0x31, 0x38, 0x29, 0x0a, - 0x09, 0x09, 0x65, 0x6c, 0x73, 0x65, 0x0a, - 0x09, 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x73, - 0x65, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, - 0x31, 0x31, 0x2c, 0x20, 0x38, 0x38, 0x2c, 0x20, 0x31, 0x32, 0x33, 0x29, 0x0a, - 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, - 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x77, 0x69, 0x6e, 0x5f, 0x77, 0x20, 0x3d, 0x20, 0x6c, 0x6f, - 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x67, 0x65, 0x74, 0x57, 0x69, 0x64, - 0x74, 0x68, 0x28, 0x29, 0x0a, - 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x77, 0x69, 0x6e, 0x5f, 0x68, 0x20, 0x3d, 0x20, 0x6c, 0x6f, - 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x67, 0x65, 0x74, 0x48, 0x65, 0x69, - 0x67, 0x68, 0x74, 0x28, 0x29, 0x0a, - 0x09, 0x09, 0x69, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x20, - 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x28, 0x69, 0x6e, 0x73, 0x70, 0x65, 0x63, - 0x74, 0x6f, 0x72, 0x5f, 0x70, 0x6e, 0x67, 0x2c, 0x20, 0x22, 0x69, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x2e, 0x70, 0x6e, 0x67, 0x22, 0x29, 0x0a, - 0x09, 0x09, 0x69, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x69, 0x6d, 0x67, 0x5f, 0x77, 0x20, - 0x3d, 0x20, 0x69, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x3a, - 0x67, 0x65, 0x74, 0x57, 0x69, 0x64, 0x74, 0x68, 0x28, 0x29, 0x0a, - 0x09, 0x09, 0x69, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x69, 0x6d, 0x67, 0x5f, 0x68, 0x20, - 0x3d, 0x20, 0x69, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x3a, - 0x67, 0x65, 0x74, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x28, 0x29, 0x0a, - 0x09, 0x09, 0x69, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x77, 0x69, - 0x6e, 0x5f, 0x77, 0x20, 0x2a, 0x20, 0x30, 0x2e, 0x34, 0x35, 0x0a, - 0x09, 0x09, 0x69, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x77, 0x69, - 0x6e, 0x5f, 0x68, 0x20, 0x2a, 0x20, 0x30, 0x2e, 0x35, 0x35, 0x0a, - 0x09, 0x09, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x69, 0x6d, 0x61, 0x67, 0x65, - 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x28, 0x62, 0x61, 0x63, 0x6b, 0x67, - 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x70, 0x6e, 0x67, 0x2c, 0x20, 0x22, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, - 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x70, 0x6e, 0x67, 0x22, 0x29, 0x0a, - 0x09, 0x09, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x69, 0x6d, 0x67, 0x5f, 0x77, - 0x20, 0x3d, 0x20, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x69, 0x6d, 0x61, 0x67, - 0x65, 0x3a, 0x67, 0x65, 0x74, 0x57, 0x69, 0x64, 0x74, 0x68, 0x28, 0x29, 0x0a, - 0x09, 0x09, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x69, 0x6d, 0x67, 0x5f, 0x68, - 0x20, 0x3d, 0x20, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x69, 0x6d, 0x61, 0x67, - 0x65, 0x3a, 0x67, 0x65, 0x74, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x28, 0x29, 0x0a, - 0x09, 0x09, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x30, 0x0a, - 0x09, 0x09, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x30, 0x0a, - 0x09, 0x09, 0x62, 0x75, 0x62, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x20, 0x3d, 0x20, 0x6c, - 0x6f, 0x61, 0x64, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x28, 0x62, 0x75, 0x62, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x6e, - 0x67, 0x2c, 0x20, 0x22, 0x62, 0x75, 0x62, 0x62, 0x6c, 0x65, 0x2e, 0x70, 0x6e, 0x67, 0x22, 0x29, 0x0a, - 0x09, 0x09, 0x62, 0x75, 0x62, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6d, 0x67, 0x5f, 0x77, 0x20, 0x3d, 0x20, 0x62, - 0x75, 0x62, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x3a, 0x67, 0x65, 0x74, 0x57, 0x69, 0x64, - 0x74, 0x68, 0x28, 0x29, 0x0a, - 0x09, 0x09, 0x62, 0x75, 0x62, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6d, 0x67, 0x5f, 0x68, 0x20, 0x3d, 0x20, 0x62, - 0x75, 0x62, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x3a, 0x67, 0x65, 0x74, 0x48, 0x65, 0x69, - 0x67, 0x68, 0x74, 0x28, 0x29, 0x0a, - 0x09, 0x09, 0x62, 0x75, 0x62, 0x62, 0x6c, 0x65, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x31, 0x34, 0x30, 0x0a, - 0x09, 0x09, 0x62, 0x75, 0x62, 0x62, 0x6c, 0x65, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x2d, 0x38, 0x30, 0x0a, - 0x09, 0x09, 0x74, 0x65, 0x78, 0x74, 0x2e, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, - 0x64, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x28, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x6e, 0x67, 0x2c, 0x20, 0x22, - 0x74, 0x65, 0x78, 0x74, 0x2e, 0x70, 0x6e, 0x67, 0x22, 0x29, 0x0a, - 0x09, 0x09, 0x74, 0x65, 0x78, 0x74, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x32, 0x35, 0x0a, - 0x09, 0x09, 0x74, 0x65, 0x78, 0x74, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x39, 0x0a, - 0x09, 0x09, 0x2d, 0x2d, 0x20, 0x42, 0x61, 0x62, 0x79, 0x20, 0x52, 0x61, 0x69, 0x6e, 0x0a, - 0x09, 0x09, 0x72, 0x61, 0x69, 0x6e, 0x2e, 0x73, 0x70, 0x61, 0x63, 0x69, 0x6e, 0x67, 0x5f, 0x78, 0x20, 0x3d, - 0x20, 0x31, 0x31, 0x30, 0x0a, - 0x09, 0x09, 0x72, 0x61, 0x69, 0x6e, 0x2e, 0x73, 0x70, 0x61, 0x63, 0x69, 0x6e, 0x67, 0x5f, 0x79, 0x20, 0x3d, - 0x20, 0x38, 0x30, 0x0a, - 0x09, 0x09, 0x72, 0x61, 0x69, 0x6e, 0x2e, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, - 0x64, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x28, 0x62, 0x61, 0x62, 0x79, 0x5f, 0x70, 0x6e, 0x67, 0x2c, 0x20, 0x22, - 0x62, 0x61, 0x62, 0x79, 0x2e, 0x70, 0x6e, 0x67, 0x22, 0x29, 0x0a, - 0x09, 0x09, 0x72, 0x61, 0x69, 0x6e, 0x2e, 0x69, 0x6d, 0x67, 0x5f, 0x77, 0x20, 0x3d, 0x20, 0x72, 0x61, 0x69, - 0x6e, 0x2e, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x3a, 0x67, 0x65, 0x74, 0x57, 0x69, 0x64, 0x74, 0x68, 0x28, 0x29, 0x0a, - 0x09, 0x09, 0x72, 0x61, 0x69, 0x6e, 0x2e, 0x69, 0x6d, 0x67, 0x5f, 0x68, 0x20, 0x3d, 0x20, 0x72, 0x61, 0x69, - 0x6e, 0x2e, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x3a, 0x67, 0x65, 0x74, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x28, - 0x29, 0x0a, - 0x09, 0x09, 0x72, 0x61, 0x69, 0x6e, 0x2e, 0x6f, 0x78, 0x20, 0x3d, 0x20, 0x2d, 0x72, 0x61, 0x69, 0x6e, 0x2e, - 0x69, 0x6d, 0x67, 0x5f, 0x77, 0x20, 0x2f, 0x20, 0x32, 0x0a, - 0x09, 0x09, 0x72, 0x61, 0x69, 0x6e, 0x2e, 0x6f, 0x79, 0x20, 0x3d, 0x20, 0x2d, 0x72, 0x61, 0x69, 0x6e, 0x2e, - 0x69, 0x6d, 0x67, 0x5f, 0x68, 0x20, 0x2f, 0x20, 0x32, 0x0a, - 0x09, 0x09, 0x72, 0x61, 0x69, 0x6e, 0x2e, 0x62, 0x61, 0x74, 0x63, 0x68, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x76, - 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x6e, 0x65, 0x77, 0x53, 0x70, 0x72, 0x69, - 0x74, 0x65, 0x42, 0x61, 0x74, 0x63, 0x68, 0x28, 0x72, 0x61, 0x69, 0x6e, 0x2e, 0x69, 0x6d, 0x61, 0x67, 0x65, - 0x2c, 0x20, 0x35, 0x31, 0x32, 0x29, 0x0a, - 0x09, 0x09, 0x72, 0x61, 0x69, 0x6e, 0x2e, 0x74, 0x20, 0x3d, 0x20, 0x30, 0x0a, - 0x09, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x72, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, - 0x09, 0x65, 0x6e, 0x64, 0x0a, - 0x09, 0x0a, - 0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x72, - 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, - 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x61, 0x74, 0x63, 0x68, 0x20, 0x3d, 0x20, 0x72, 0x61, - 0x69, 0x6e, 0x2e, 0x62, 0x61, 0x74, 0x63, 0x68, 0x0a, - 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x78, 0x20, 0x3d, 0x20, 0x72, 0x61, 0x69, 0x6e, 0x2e, - 0x73, 0x70, 0x61, 0x63, 0x69, 0x6e, 0x67, 0x5f, 0x78, 0x0a, - 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x79, 0x20, 0x3d, 0x20, 0x72, 0x61, 0x69, 0x6e, 0x2e, - 0x73, 0x70, 0x61, 0x63, 0x69, 0x6e, 0x67, 0x5f, 0x79, 0x0a, - 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x78, 0x20, 0x3d, 0x20, 0x72, 0x61, 0x69, 0x6e, 0x2e, - 0x6f, 0x78, 0x0a, - 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x79, 0x20, 0x3d, 0x20, 0x72, 0x61, 0x69, 0x6e, 0x2e, - 0x6f, 0x79, 0x0a, - 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x20, 0x3d, 0x20, 0x31, 0x20, 0x2f, 0x20, 0x6c, 0x6f, - 0x76, 0x65, 0x2e, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x67, 0x65, 0x74, 0x50, 0x69, 0x78, 0x65, 0x6c, - 0x53, 0x63, 0x61, 0x6c, 0x65, 0x28, 0x29, 0x0a, - 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x77, 0x20, 0x3d, 0x20, - 0x32, 0x20, 0x2a, 0x20, 0x6d, 0x61, 0x74, 0x68, 0x2e, 0x63, 0x65, 0x69, 0x6c, 0x28, 0x6d, 0x20, 0x2a, 0x20, - 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x67, 0x65, 0x74, 0x57, - 0x69, 0x64, 0x74, 0x68, 0x28, 0x29, 0x20, 0x2f, 0x20, 0x73, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x32, 0x0a, - 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x68, 0x20, 0x3d, 0x20, - 0x32, 0x20, 0x2a, 0x20, 0x6d, 0x61, 0x74, 0x68, 0x2e, 0x63, 0x65, 0x69, 0x6c, 0x28, 0x6d, 0x20, 0x2a, 0x20, - 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x67, 0x65, 0x74, 0x48, - 0x65, 0x69, 0x67, 0x68, 0x74, 0x28, 0x29, 0x20, 0x2f, 0x20, 0x73, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x32, 0x0a, - 0x09, 0x09, 0x62, 0x61, 0x74, 0x63, 0x68, 0x3a, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x28, 0x29, 0x0a, - 0x09, 0x09, 0x69, 0x66, 0x20, 0x62, 0x61, 0x74, 0x63, 0x68, 0x3a, 0x67, 0x65, 0x74, 0x42, 0x75, 0x66, 0x66, - 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x28, 0x29, 0x20, 0x3c, 0x20, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x77, - 0x20, 0x2a, 0x20, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x68, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, - 0x09, 0x09, 0x09, 0x62, 0x61, 0x74, 0x63, 0x68, 0x3a, 0x73, 0x65, 0x74, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, - 0x53, 0x69, 0x7a, 0x65, 0x28, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x77, 0x20, 0x2a, 0x20, 0x62, 0x61, 0x74, - 0x63, 0x68, 0x5f, 0x68, 0x29, 0x0a, - 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, - 0x09, 0x09, 0x62, 0x61, 0x74, 0x63, 0x68, 0x3a, 0x62, 0x69, 0x6e, 0x64, 0x28, 0x29, 0x0a, - 0x09, 0x09, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x30, 0x2c, 0x20, 0x62, 0x61, 0x74, 0x63, 0x68, - 0x5f, 0x68, 0x20, 0x2d, 0x20, 0x31, 0x20, 0x64, 0x6f, 0x0a, - 0x09, 0x09, 0x09, 0x66, 0x6f, 0x72, 0x20, 0x6a, 0x20, 0x3d, 0x20, 0x30, 0x2c, 0x20, 0x62, 0x61, 0x74, 0x63, - 0x68, 0x5f, 0x77, 0x20, 0x2d, 0x20, 0x31, 0x20, 0x64, 0x6f, 0x0a, - 0x09, 0x09, 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x73, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x20, - 0x3d, 0x20, 0x28, 0x6a, 0x20, 0x25, 0x20, 0x32, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x0a, - 0x09, 0x09, 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x5f, 0x79, - 0x20, 0x3d, 0x20, 0x69, 0x73, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x30, 0x20, 0x6f, - 0x72, 0x20, 0x73, 0x79, 0x20, 0x2f, 0x20, 0x32, 0x0a, - 0x09, 0x09, 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x78, 0x20, 0x3d, 0x20, 0x6f, 0x78, 0x20, 0x2b, - 0x20, 0x6a, 0x20, 0x2a, 0x20, 0x73, 0x78, 0x0a, - 0x09, 0x09, 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x79, 0x20, 0x3d, 0x20, 0x6f, 0x79, 0x20, 0x2b, - 0x20, 0x69, 0x20, 0x2a, 0x20, 0x73, 0x79, 0x20, 0x2b, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x5f, 0x79, 0x0a, - 0x09, 0x09, 0x09, 0x09, 0x62, 0x61, 0x74, 0x63, 0x68, 0x3a, 0x61, 0x64, 0x64, 0x28, 0x78, 0x2c, 0x20, 0x79, - 0x29, 0x0a, - 0x09, 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, - 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, - 0x09, 0x09, 0x62, 0x61, 0x74, 0x63, 0x68, 0x3a, 0x75, 0x6e, 0x62, 0x69, 0x6e, 0x64, 0x28, 0x29, 0x0a, - 0x09, 0x65, 0x6e, 0x64, 0x0a, - 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x75, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x5f, 0x72, 0x61, 0x69, 0x6e, 0x28, 0x74, 0x29, 0x09, 0x09, 0x0a, - 0x09, 0x09, 0x72, 0x61, 0x69, 0x6e, 0x2e, 0x74, 0x20, 0x3d, 0x20, 0x74, 0x0a, - 0x09, 0x65, 0x6e, 0x64, 0x0a, - 0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x72, 0x65, 0x73, - 0x69, 0x7a, 0x65, 0x28, 0x77, 0x2c, 0x20, 0x68, 0x29, 0x0a, - 0x09, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x72, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, - 0x09, 0x65, 0x6e, 0x64, 0x0a, - 0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x75, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x28, 0x64, 0x74, 0x29, 0x0a, - 0x09, 0x09, 0x67, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x67, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x20, - 0x2b, 0x20, 0x64, 0x74, 0x20, 0x2f, 0x20, 0x32, 0x0a, - 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x74, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x63, 0x20, - 0x3d, 0x20, 0x6d, 0x61, 0x74, 0x68, 0x2e, 0x6d, 0x6f, 0x64, 0x66, 0x28, 0x67, 0x5f, 0x74, 0x69, 0x6d, 0x65, - 0x29, 0x0a, - 0x09, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x72, 0x61, 0x69, 0x6e, 0x28, 0x66, 0x72, 0x61, 0x63, - 0x29, 0x0a, - 0x09, 0x09, 0x69, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x6c, 0x6f, - 0x76, 0x65, 0x2e, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x66, 0x72, 0x6f, 0x6d, 0x50, 0x69, 0x78, 0x65, - 0x6c, 0x73, 0x28, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x67, - 0x65, 0x74, 0x57, 0x69, 0x64, 0x74, 0x68, 0x28, 0x29, 0x20, 0x2a, 0x20, 0x30, 0x2e, 0x34, 0x35, 0x29, 0x0a, - 0x09, 0x09, 0x69, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x6c, 0x6f, - 0x76, 0x65, 0x2e, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x66, 0x72, 0x6f, 0x6d, 0x50, 0x69, 0x78, 0x65, - 0x6c, 0x73, 0x28, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x67, - 0x65, 0x74, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x28, 0x29, 0x20, 0x2a, 0x20, 0x30, 0x2e, 0x35, 0x35, 0x29, 0x0a, - 0x09, 0x65, 0x6e, 0x64, 0x0a, - 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x72, - 0x61, 0x77, 0x5f, 0x67, 0x72, 0x69, 0x64, 0x28, 0x29, 0x0a, - 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x6c, 0x65, 0x6e, 0x64, 0x6d, 0x6f, 0x64, 0x65, 0x20, - 0x3d, 0x20, 0x22, 0x73, 0x75, 0x62, 0x74, 0x72, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x22, 0x0a, - 0x09, 0x09, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, - 0x68, 0x69, 0x63, 0x73, 0x2e, 0x69, 0x73, 0x53, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x28, 0x22, - 0x73, 0x75, 0x62, 0x74, 0x72, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, - 0x09, 0x09, 0x09, 0x2d, 0x2d, 0x20, 0x57, 0x65, 0x20, 0x61, 0x6c, 0x73, 0x6f, 0x20, 0x63, 0x68, 0x61, 0x6e, - 0x67, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x20, - 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x63, 0x61, 0x73, 0x65, - 0x2c, 0x20, 0x73, 0x6f, 0x20, 0x69, 0x74, 0x20, 0x6c, 0x6f, 0x6f, 0x6b, 0x73, 0x20, 0x4f, 0x4b, 0x2e, 0x0a, - 0x09, 0x09, 0x09, 0x62, 0x6c, 0x65, 0x6e, 0x64, 0x6d, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x22, 0x61, 0x64, - 0x64, 0x69, 0x74, 0x69, 0x76, 0x65, 0x22, 0x0a, - 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, - 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x79, 0x20, 0x3d, 0x20, 0x72, 0x61, 0x69, 0x6e, 0x2e, 0x73, - 0x70, 0x61, 0x63, 0x69, 0x6e, 0x67, 0x5f, 0x79, 0x20, 0x2a, 0x20, 0x72, 0x61, 0x69, 0x6e, 0x2e, 0x74, 0x0a, - 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x5f, 0x79, 0x20, 0x3d, 0x20, - 0x2d, 0x72, 0x61, 0x69, 0x6e, 0x2e, 0x73, 0x70, 0x61, 0x63, 0x69, 0x6e, 0x67, 0x5f, 0x79, 0x20, 0x2b, 0x20, - 0x79, 0x20, 0x2f, 0x20, 0x32, 0x0a, - 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x69, 0x67, 0x5f, 0x79, 0x20, 0x3d, 0x20, 0x2d, 0x72, - 0x61, 0x69, 0x6e, 0x2e, 0x73, 0x70, 0x61, 0x63, 0x69, 0x6e, 0x67, 0x5f, 0x79, 0x20, 0x2b, 0x20, 0x79, 0x0a, - 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x73, 0x65, - 0x74, 0x42, 0x6c, 0x65, 0x6e, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x28, 0x62, 0x6c, 0x65, 0x6e, 0x64, 0x6d, 0x6f, - 0x64, 0x65, 0x29, 0x0a, - 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x73, 0x65, - 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x32, 0x35, 0x35, 0x2c, 0x20, 0x32, 0x35, 0x35, 0x2c, 0x20, 0x32, - 0x35, 0x35, 0x2c, 0x20, 0x31, 0x32, 0x38, 0x29, 0x0a, - 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x64, 0x72, - 0x61, 0x77, 0x28, 0x72, 0x61, 0x69, 0x6e, 0x2e, 0x62, 0x61, 0x74, 0x63, 0x68, 0x2c, 0x20, 0x2d, 0x72, 0x61, - 0x69, 0x6e, 0x2e, 0x73, 0x70, 0x61, 0x63, 0x69, 0x6e, 0x67, 0x5f, 0x78, 0x2c, 0x20, 0x73, 0x6d, 0x61, 0x6c, - 0x6c, 0x5f, 0x79, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x35, 0x29, 0x0a, - 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x73, 0x65, - 0x74, 0x42, 0x6c, 0x65, 0x6e, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x28, 0x22, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x22, - 0x29, 0x0a, - 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x73, 0x65, - 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x32, 0x35, 0x35, 0x2c, 0x20, 0x32, 0x35, 0x35, 0x2c, 0x20, 0x32, - 0x35, 0x35, 0x2c, 0x20, 0x32, 0x35, 0x35, 0x29, 0x0a, - 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x64, 0x72, - 0x61, 0x77, 0x28, 0x72, 0x61, 0x69, 0x6e, 0x2e, 0x62, 0x61, 0x74, 0x63, 0x68, 0x2c, 0x20, 0x2d, 0x72, 0x61, - 0x69, 0x6e, 0x2e, 0x73, 0x70, 0x61, 0x63, 0x69, 0x6e, 0x67, 0x5f, 0x78, 0x2c, 0x20, 0x62, 0x69, 0x67, 0x5f, - 0x79, 0x29, 0x0a, - 0x09, 0x65, 0x6e, 0x64, 0x0a, - 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x72, - 0x61, 0x77, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x28, 0x78, 0x2c, 0x20, 0x79, 0x29, 0x0a, - 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x74, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x63, 0x20, - 0x3d, 0x20, 0x6d, 0x61, 0x74, 0x68, 0x2e, 0x6d, 0x6f, 0x64, 0x66, 0x28, 0x67, 0x5f, 0x74, 0x69, 0x6d, 0x65, - 0x29, 0x0a, - 0x09, 0x09, 0x69, 0x66, 0x20, 0x66, 0x72, 0x61, 0x63, 0x20, 0x3c, 0x20, 0x30, 0x2e, 0x35, 0x20, 0x74, 0x68, - 0x65, 0x6e, 0x0a, - 0x09, 0x09, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x0a, - 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, - 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x78, 0x20, 0x3d, 0x20, 0x78, 0x20, 0x2b, 0x20, 0x74, - 0x65, 0x78, 0x74, 0x2e, 0x78, 0x0a, - 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x79, 0x20, 0x3d, 0x20, 0x79, 0x20, 0x2b, 0x20, 0x74, - 0x65, 0x78, 0x74, 0x2e, 0x79, 0x0a, - 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x64, 0x72, - 0x61, 0x77, 0x28, 0x74, 0x65, 0x78, 0x74, 0x2e, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x74, 0x78, 0x2c, - 0x20, 0x74, 0x79, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x37, 0x30, 0x2c, 0x20, - 0x37, 0x30, 0x29, 0x0a, - 0x09, 0x65, 0x6e, 0x64, 0x0a, - 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x72, - 0x61, 0x77, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x28, 0x78, 0x2c, 0x20, 0x79, - 0x29, 0x0a, - 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x79, 0x20, - 0x3d, 0x20, 0x28, 0x6d, 0x61, 0x74, 0x68, 0x2e, 0x73, 0x69, 0x6e, 0x28, 0x6d, 0x61, 0x74, 0x68, 0x2e, 0x70, - 0x69, 0x20, 0x2a, 0x20, 0x67, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x2a, 0x20, 0x32, 0x29, 0x20, 0x2b, 0x20, - 0x31, 0x29, 0x20, 0x2f, 0x20, 0x32, 0x0a, - 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x78, 0x20, 0x3d, 0x20, 0x78, 0x0a, - 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x79, 0x20, 0x3d, 0x20, 0x79, 0x0a, - 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x73, 0x65, - 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x32, 0x35, 0x35, 0x2c, 0x20, 0x32, 0x35, 0x35, 0x2c, 0x20, 0x32, - 0x35, 0x35, 0x2c, 0x20, 0x36, 0x34, 0x20, 0x2b, 0x20, 0x31, 0x36, 0x2a, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x73, - 0x69, 0x74, 0x79, 0x29, 0x0a, - 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x64, 0x72, - 0x61, 0x77, 0x28, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x69, 0x6d, 0x61, 0x67, - 0x65, 0x2c, 0x20, 0x62, 0x78, 0x2c, 0x20, 0x62, 0x79, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x37, 0x2c, - 0x20, 0x30, 0x2e, 0x37, 0x2c, 0x20, 0x32, 0x35, 0x36, 0x2c, 0x20, 0x32, 0x35, 0x36, 0x29, 0x0a, - 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x73, 0x65, - 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x32, 0x35, 0x35, 0x2c, 0x20, 0x32, 0x35, 0x35, 0x2c, 0x20, 0x32, - 0x35, 0x35, 0x2c, 0x20, 0x33, 0x32, 0x20, 0x2b, 0x20, 0x31, 0x36, 0x2a, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x73, - 0x69, 0x74, 0x79, 0x29, 0x0a, - 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x64, 0x72, - 0x61, 0x77, 0x28, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x69, 0x6d, 0x61, 0x67, - 0x65, 0x2c, 0x20, 0x62, 0x78, 0x2c, 0x20, 0x62, 0x79, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x36, 0x35, - 0x2c, 0x20, 0x30, 0x2e, 0x36, 0x35, 0x2c, 0x20, 0x32, 0x35, 0x36, 0x2c, 0x20, 0x32, 0x35, 0x36, 0x29, 0x0a, - 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x73, 0x65, - 0x74, 0x42, 0x6c, 0x65, 0x6e, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x28, 0x22, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, - 0x76, 0x65, 0x22, 0x29, 0x0a, - 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x73, 0x65, - 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x32, 0x35, 0x35, 0x2c, 0x20, 0x32, 0x35, 0x35, 0x2c, 0x20, 0x32, - 0x35, 0x35, 0x2c, 0x20, 0x31, 0x36, 0x20, 0x2b, 0x20, 0x31, 0x36, 0x2a, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x73, - 0x69, 0x74, 0x79, 0x29, 0x0a, - 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x64, 0x72, - 0x61, 0x77, 0x28, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x69, 0x6d, 0x61, 0x67, - 0x65, 0x2c, 0x20, 0x62, 0x78, 0x2c, 0x20, 0x62, 0x79, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x36, 0x2c, - 0x20, 0x30, 0x2e, 0x36, 0x2c, 0x20, 0x32, 0x35, 0x36, 0x2c, 0x20, 0x32, 0x35, 0x36, 0x29, 0x0a, - 0x09, 0x65, 0x6e, 0x64, 0x0a, - 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x72, - 0x61, 0x77, 0x5f, 0x62, 0x75, 0x62, 0x62, 0x6c, 0x65, 0x28, 0x78, 0x2c, 0x20, 0x79, 0x29, 0x0a, - 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x73, 0x63, 0x20, 0x3d, 0x20, 0x31, 0x30, 0x20, 0x2a, - 0x20, 0x6d, 0x61, 0x74, 0x68, 0x2e, 0x73, 0x69, 0x6e, 0x28, 0x6d, 0x61, 0x74, 0x68, 0x2e, 0x70, 0x69, 0x20, - 0x2a, 0x20, 0x67, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x29, 0x0a, - 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x78, 0x20, 0x3d, 0x20, 0x78, 0x20, 0x2b, 0x20, 0x62, - 0x75, 0x62, 0x62, 0x6c, 0x65, 0x2e, 0x78, 0x0a, - 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x79, 0x20, 0x3d, 0x20, 0x79, 0x20, 0x2b, 0x20, 0x62, - 0x75, 0x62, 0x62, 0x6c, 0x65, 0x2e, 0x79, 0x20, 0x2b, 0x20, 0x6f, 0x73, 0x63, 0x0a, - 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x64, 0x72, - 0x61, 0x77, 0x28, 0x62, 0x75, 0x62, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x62, - 0x78, 0x2c, 0x20, 0x62, 0x79, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x37, 0x30, - 0x2c, 0x20, 0x37, 0x30, 0x29, 0x0a, - 0x09, 0x09, 0x64, 0x72, 0x61, 0x77, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x28, 0x62, 0x78, 0x2c, 0x20, 0x62, 0x79, - 0x29, 0x0a, - 0x09, 0x65, 0x6e, 0x64, 0x0a, - 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x72, - 0x61, 0x77, 0x5f, 0x69, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x28, 0x29, 0x0a, - 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x78, 0x2c, 0x20, 0x79, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x73, - 0x70, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x78, 0x2c, 0x20, 0x69, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x2e, 0x79, 0x0a, - 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x78, 0x2c, 0x20, 0x6f, 0x79, 0x20, 0x3d, 0x20, 0x69, - 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x69, 0x6d, 0x67, 0x5f, 0x77, 0x20, 0x2f, 0x20, 0x32, - 0x2c, 0x20, 0x69, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x69, 0x6d, 0x67, 0x5f, 0x68, 0x20, - 0x2f, 0x20, 0x32, 0x0a, - 0x09, 0x09, 0x64, 0x72, 0x61, 0x77, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x28, - 0x78, 0x2c, 0x20, 0x79, 0x29, 0x0a, - 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x73, 0x65, - 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x32, 0x35, 0x35, 0x2c, 0x20, 0x32, 0x35, 0x35, 0x2c, 0x20, 0x32, - 0x35, 0x35, 0x2c, 0x20, 0x32, 0x35, 0x35, 0x29, 0x0a, - 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x73, 0x65, - 0x74, 0x42, 0x6c, 0x65, 0x6e, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x28, 0x22, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x22, - 0x29, 0x0a, - 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x64, 0x72, - 0x61, 0x77, 0x28, 0x69, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x69, 0x6d, 0x61, 0x67, 0x65, - 0x2c, 0x20, 0x78, 0x2c, 0x20, 0x79, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x6f, - 0x78, 0x2c, 0x20, 0x6f, 0x79, 0x29, 0x0a, - 0x09, 0x09, 0x64, 0x72, 0x61, 0x77, 0x5f, 0x62, 0x75, 0x62, 0x62, 0x6c, 0x65, 0x28, 0x78, 0x2c, 0x20, 0x79, - 0x29, 0x0a, - 0x09, 0x65, 0x6e, 0x64, 0x0a, - 0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x64, 0x72, 0x61, - 0x77, 0x28, 0x29, 0x0a, - 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x73, 0x65, - 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x32, 0x35, 0x35, 0x2c, 0x20, 0x32, 0x35, 0x35, 0x2c, 0x20, 0x32, - 0x35, 0x35, 0x29, 0x0a, - 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x70, 0x75, - 0x73, 0x68, 0x28, 0x29, 0x0a, - 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x73, 0x63, - 0x61, 0x6c, 0x65, 0x28, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x67, 0x65, - 0x74, 0x50, 0x69, 0x78, 0x65, 0x6c, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x28, 0x29, 0x29, 0x0a, - 0x09, 0x09, 0x64, 0x72, 0x61, 0x77, 0x5f, 0x67, 0x72, 0x69, 0x64, 0x28, 0x29, 0x0a, - 0x09, 0x09, 0x64, 0x72, 0x61, 0x77, 0x5f, 0x69, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x28, 0x29, 0x0a, - 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x70, 0x6f, - 0x70, 0x28, 0x29, 0x0a, - 0x09, 0x65, 0x6e, 0x64, 0x0a, - 0x09, 0x0a, - 0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x6b, 0x65, 0x79, - 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x28, 0x6b, 0x65, 0x79, 0x29, 0x0a, - 0x09, 0x09, 0x69, 0x66, 0x20, 0x6b, 0x65, 0x79, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x65, 0x73, 0x63, 0x61, 0x70, - 0x65, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, - 0x09, 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x71, 0x75, 0x69, 0x74, - 0x28, 0x29, 0x0a, - 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, - 0x09, 0x65, 0x6e, 0x64, 0x0a, - 0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x63, 0x6f, 0x6e, - 0x66, 0x28, 0x74, 0x29, 0x0a, - 0x09, 0x09, 0x74, 0x2e, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x22, 0x4c, 0x5c, 0x31, 0x39, 0x35, - 0x5c, 0x31, 0x35, 0x30, 0x56, 0x45, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x5f, - 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x20, 0x28, 0x22, 0x20, 0x2e, 0x2e, - 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x64, - 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x29, 0x22, 0x0a, - 0x09, 0x09, 0x74, 0x2e, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x20, - 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x0a, - 0x09, 0x09, 0x74, 0x2e, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x73, 0x6f, 0x75, 0x6e, 0x64, 0x20, - 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x0a, - 0x09, 0x09, 0x74, 0x2e, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x70, 0x68, 0x79, 0x73, 0x69, 0x63, - 0x73, 0x20, 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x0a, - 0x09, 0x09, 0x74, 0x2e, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6a, 0x6f, 0x79, 0x73, 0x74, 0x69, - 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x0a, - 0x09, 0x09, 0x74, 0x2e, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x72, 0x65, 0x73, 0x69, 0x7a, 0x61, 0x62, - 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, - 0x09, 0x09, 0x74, 0x2e, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x68, 0x69, 0x67, 0x68, 0x64, 0x70, 0x69, - 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, - 0x09, 0x65, 0x6e, 0x64, 0x0a, - 0x65, 0x6e, 0x64, 0x0a, - 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, - 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, - 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, - 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a, 0x2d, 0x2d, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x73, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x2e, 0x0a, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, @@ -5358,7 +1094,9 @@ const unsigned char boot_lua[] = 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x72, 0x61, 0x63, 0x65, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x62, 0x75, 0x67, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x62, 0x61, 0x63, 0x6b, 0x28, 0x29, 0x0a, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x63, 0x6c, 0x65, - 0x61, 0x72, 0x28, 0x29, 0x0a, + 0x61, 0x72, 0x28, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x67, + 0x65, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, + 0x29, 0x29, 0x0a, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x65, 0x72, 0x72, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, @@ -5393,7 +1131,9 @@ const unsigned char boot_lua[] = 0x2e, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x74, 0x6f, 0x50, 0x69, 0x78, 0x65, 0x6c, 0x73, 0x28, 0x37, 0x30, 0x29, 0x0a, 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x63, 0x6c, - 0x65, 0x61, 0x72, 0x28, 0x29, 0x0a, + 0x65, 0x61, 0x72, 0x28, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, + 0x67, 0x65, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x6f, 0x6c, 0x6f, 0x72, + 0x28, 0x29, 0x29, 0x0a, 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x66, 0x28, 0x70, 0x2c, 0x20, 0x70, 0x6f, 0x73, 0x2c, 0x20, 0x70, 0x6f, 0x73, 0x2c, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x67, 0x65, 0x74, 0x57, @@ -5410,11 +1150,29 @@ const unsigned char boot_lua[] = 0x09, 0x09, 0x09, 0x69, 0x66, 0x20, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x71, 0x75, 0x69, 0x74, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x0a, - 0x09, 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, - 0x09, 0x09, 0x09, 0x69, 0x66, 0x20, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x6b, 0x65, 0x79, 0x70, 0x72, 0x65, - 0x73, 0x73, 0x65, 0x64, 0x22, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x61, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x65, 0x73, - 0x63, 0x61, 0x70, 0x65, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x09, 0x09, 0x09, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x6b, 0x65, + 0x79, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x22, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x61, 0x20, 0x3d, 0x3d, + 0x20, 0x22, 0x65, 0x73, 0x63, 0x61, 0x70, 0x65, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x0a, + 0x09, 0x09, 0x09, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x6d, 0x6f, + 0x75, 0x73, 0x65, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x09, 0x09, 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x6c, + 0x6f, 0x76, 0x65, 0x2e, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x67, 0x65, 0x74, 0x54, 0x69, 0x74, 0x6c, + 0x65, 0x28, 0x29, 0x0a, + 0x09, 0x09, 0x09, 0x09, 0x69, 0x66, 0x20, 0x23, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x22, 0x47, 0x61, 0x6d, 0x65, 0x22, + 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x09, 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x73, 0x20, + 0x3d, 0x20, 0x7b, 0x22, 0x4f, 0x4b, 0x22, 0x2c, 0x20, 0x22, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x22, 0x7d, 0x0a, + 0x09, 0x09, 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x20, + 0x3d, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x73, 0x68, 0x6f, 0x77, + 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x42, 0x6f, 0x78, 0x28, 0x22, 0x51, 0x75, 0x69, 0x74, 0x20, 0x22, + 0x2e, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x2e, 0x2e, 0x22, 0x3f, 0x22, 0x2c, 0x20, 0x22, 0x22, 0x2c, 0x20, 0x62, + 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x73, 0x29, 0x0a, + 0x09, 0x09, 0x09, 0x09, 0x69, 0x66, 0x20, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x20, 0x3d, 0x3d, 0x20, + 0x31, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x09, 0x09, 0x09, 0x09, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x0a, + 0x09, 0x09, 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, 0x09, 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, 0x09, 0x09, 0x64, 0x72, 0x61, 0x77, 0x28, 0x29, 0x0a, diff --git a/jni/love/src/scripts/graphics.lua b/jni/love/src/scripts/graphics.lua deleted file mode 100644 index 6bed08a9..00000000 --- a/jni/love/src/scripts/graphics.lua +++ /dev/null @@ -1,308 +0,0 @@ ---[[ -Copyright (c) 2006-2015 LOVE Development Team - -This software is provided 'as-is', without any express or implied -warranty. In no event will the authors be held liable for any damages -arising from the use of this software. - -Permission is granted to anyone to use this software for any purpose, -including commercial applications, and to alter it and redistribute it -freely, subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must not -claim that you wrote the original software. If you use this software -in a product, an acknowledgment in the product documentation would be -appreciated but is not required. -2. Altered source versions must be plainly marked as such, and must not be -misrepresented as being the original software. -3. This notice may not be removed or altered from any source distribution. ---]] - -do - local table_concat = table.concat - - -- SHADERS - - local GLSL = {} - local GLSLES = {} - - GLSL.VERSION = "#version 120" - GLSLES.VERSION = "#version 100" - - GLSL.SYNTAX = [[ -#ifndef GL_ES -#define lowp -#define mediump -#define highp -#endif -#define number float -#define Image sampler2D -#define extern uniform -#define Texel texture2D -#pragma optionNV(strict on)]] - - GLSLES.SYNTAX = GLSL.SYNTAX - - GLSL.UNIFORMS = [[ -#define TransformMatrix gl_ModelViewMatrix -#define ProjectionMatrix gl_ProjectionMatrix -#define TransformProjectionMatrix gl_ModelViewProjectionMatrix -#define NormalMatrix gl_NormalMatrix -uniform sampler2D _tex0_; -uniform vec4 love_ScreenSize;]] - - GLSLES.UNIFORMS = [[ -uniform mat4 TransformMatrix; -uniform mat4 ProjectionMatrix; -uniform mat4 TransformProjectionMatrix; -// uniform mat4 NormalMatrix; -uniform sampler2D _tex0_; -uniform mediump vec4 love_ScreenSize; -uniform mediump float love_PointSize;]] - - GLSL.VERTEX = { - HEADER = [[ -#define VERTEX - -#define VertexPosition gl_Vertex -#define VertexTexCoord gl_MultiTexCoord0 -#define VertexColor gl_Color - -#define VaryingTexCoord gl_TexCoord[0] -#define VaryingColor gl_FrontColor]], - - FOOTER = [[ -void main() { - VaryingTexCoord = VertexTexCoord; - VaryingColor = VertexColor; - gl_Position = position(TransformProjectionMatrix, VertexPosition); -}]], - } - - GLSLES.VERTEX = { - HEADER = [[ -#define VERTEX - -attribute vec4 VertexPosition; -attribute vec4 VertexTexCoord; -attribute vec4 VertexColor; - -varying vec4 VaryingTexCoord; -varying vec4 VaryingColor; - -//#if defined(GL_EXT_draw_instanced) -// #extension GL_EXT_draw_instanced : enable -// #define love_InstanceID gl_InstanceIDEXT -//#else -// attribute float love_PseudoInstanceID; -// int love_InstanceID = int(love_PseudoInstanceID); -//#endif -]], - - FOOTER = [[ -void main() { - VaryingTexCoord = VertexTexCoord; - VaryingColor = VertexColor; - gl_PointSize = love_PointSize; - gl_Position = position(TransformProjectionMatrix, VertexPosition); -}]], - } - - GLSL.PIXEL = { - HEADER = [[ -#define PIXEL - -#define VaryingTexCoord gl_TexCoord[0] -#define VaryingColor gl_Color - -#define love_Canvases gl_FragData]], - - FOOTER = [[ -void main() { - // fix crashing issue in OSX when _tex0_ is unused within effect() - float dummy = Texel(_tex0_, vec2(.5)).r; - - // See Shader::checkSetScreenParams in Shader.cpp. - vec2 pixelcoord = vec2(gl_FragCoord.x, (gl_FragCoord.y * love_ScreenSize.z) + love_ScreenSize.w); - - gl_FragColor = effect(VaryingColor, _tex0_, VaryingTexCoord.st, pixelcoord); -}]], - - FOOTER_MULTI_CANVAS = [[ -void main() { - // fix crashing issue in OSX when _tex0_ is unused within effect() - float dummy = Texel(_tex0_, vec2(.5)).r; - - // See Shader::checkSetScreenParams in Shader.cpp. - vec2 pixelcoord = vec2(gl_FragCoord.x, (gl_FragCoord.y * love_ScreenSize.z) + love_ScreenSize.w); - - effects(VaryingColor, _tex0_, VaryingTexCoord.st, pixelcoord); -}]], - } - - GLSLES.PIXEL = { - HEADER = [[ -#define PIXEL - -precision mediump float; - -varying mediump vec4 VaryingTexCoord; -varying lowp vec4 VaryingColor; - -#define love_Canvases gl_FragData;]], - - FOOTER = GLSL.PIXEL.FOOTER, - FOOTER_MULTI_CANVAS = GLSL.PIXEL.FOOTER_MULTI_CANVAS, - } - - -- Unfortunately, GLSL 1.20 can't deal with precision qualifier statements. - local function stripPrecision(code) - -- Remove "precision mediump float;", etc. - code = code:gsub("precision(%s+)lowp(%s+)(%w+)(%s*);", "") - code = code:gsub("precision(%s+)mediump(%s+)(%w+)(%s*);", "") - code = code:gsub("precision(%s+)highp(%s+)(%w+)(%s*);", "") - - -- Remove all remaining "lowp", "mediump", "highp". - code = code:gsub("(%W+)lowp(%s+)", "%1"):gsub("^lowp(%s+)", "") - code = code:gsub("(%W+)mediump(%s+)", "%1"):gsub("^mediump(%s+)", "") - code = code:gsub("(%W+)highp(%s+)", "%1"):gsub("^highp(%s+)", "") - - return code - end - - local function createVertexCode(vertexcode, lang) - if lang == GLSL then - vertexcode = stripPrecision(vertexcode) - end - local vertexcodes = { - lang.VERSION, - lang.SYNTAX, lang.VERTEX.HEADER, lang.UNIFORMS, - lang == GLSLES and "#line 1" or "#line 0", -- specification differences for #line... - vertexcode, - lang.VERTEX.FOOTER, - } - return table_concat(vertexcodes, "\n") - end - - local function createPixelCode(pixelcode, lang, is_multicanvas) - if lang == GLSL then - pixelcode = stripPrecision(pixelcode) - end - local pixelcodes = { - lang.VERSION, - lang.SYNTAX, lang.PIXEL.HEADER, lang.UNIFORMS, - lang == GLSLES and "#line 1" or "#line 0", - pixelcode, - is_multicanvas and lang.PIXEL.FOOTER_MULTI_CANVAS or lang.PIXEL.FOOTER, - } - return table_concat(pixelcodes, "\n") - end - - local function isVertexCode(code) - return code:match("vec4%s+position%s*%(") ~= nil - end - - local function isPixelCode(code) - if code:match("vec4%s+effect%s*%(") then - return true - elseif code:match("void%s+effects%s*%(") then - -- function for rendering to multiple canvases simultaneously - return true, true - else - return false, false - end - end - - function love.graphics._shaderCodeToGLSL(arg1, arg2) - local vertexcode, pixelcode - local is_multicanvas = false -- whether pixel code has "effects" function instead of "effect" - - local lang = GLSL - if (love.graphics.getRendererInfo()) == "OpenGL ES" then - lang = GLSLES - end - - if arg1 then - if isVertexCode(arg1) then - vertexcode = arg1 -- first arg contains vertex shader code - end - - local ispixel, isMultiCanvas = isPixelCode(arg1) - if ispixel then - pixelcode = arg1 -- first arg contains pixel shader code - is_multicanvas = isMultiCanvas - end - end - - if arg2 then - if isVertexCode(arg2) then - vertexcode = arg2 -- second arg contains vertex shader code - end - - local ispixel, isMultiCanvas = isPixelCode(arg2) - if ispixel then - pixelcode = arg2 -- second arg contains pixel shader code - is_multicanvas = isMultiCanvas - end - end - - if vertexcode then - vertexcode = createVertexCode(vertexcode, lang) - end - if pixelcode then - pixelcode = createPixelCode(pixelcode, lang, is_multicanvas) - end - - return vertexcode, pixelcode - end - - function love.graphics._transformGLSLErrorMessages(message) - local shadertype = message:match("Cannot compile (%a+) shader code") - if not shadertype then return message end - local lines = {"Cannot compile "..shadertype.." shader code:"} - for l in message:gmatch("[^\n]+") do - -- nvidia compiler message: - -- 0() : error/warning [NUMBER]: - local linenumber, what, message = l:match("^0%((%d+)%)%s*:%s*(%w+)[^:]+:%s*(.+)$") - if not linenumber then - -- ati compiler message: - -- ERROR 0:: error/warning(#[NUMBER]) [ERRORNAME]: - linenumber, what, message = l:match("^%w+: 0:(%d+):%s*(%w+)%([^%)]+%)%s*(.+)$") - if not linenumber then - -- OSX compiler message (?): - -- ERROR: 0:: - what, linenumber, message = l:match("^(%w+): %d+:(%d+): (.+)$") - end - end - if linenumber and what and message then - lines[#lines+1] = ("Line %d: %s: %s"):format(linenumber, what, message) - end - end - -- did not match any known error messages - if #lines == 1 then return message end - return table_concat(lines, "\n") - end - - local defaultcode = { - vertex = [[ -vec4 position(mat4 transform_proj, vec4 vertpos) { - return transform_proj * vertpos; -}]], - pixel = [[ -vec4 effect(lowp vec4 vcolor, Image texture, vec2 texcoord, vec2 pixcoord) { - return Texel(texture, texcoord) * vcolor; -}]] - } - - local defaults = {} - defaults["opengl"] = { - createVertexCode(defaultcode.vertex, GLSL), - createPixelCode(defaultcode.pixel, GLSL, false) - } - defaults["opengles"] = { - createVertexCode(defaultcode.vertex, GLSLES), - createPixelCode(defaultcode.pixel, GLSLES, false) - } - - love.graphics._setDefaultShaderCode(defaults) -end diff --git a/jni/love/src/scripts/graphics.lua.h b/jni/love/src/scripts/graphics.lua.h deleted file mode 100644 index 2a38f265..00000000 --- a/jni/love/src/scripts/graphics.lua.h +++ /dev/null @@ -1,618 +0,0 @@ -/** - * Copyright (c) 2006-2015 LOVE Development Team - * - * This software is provided 'as-is', without any express or implied - * warranty. In no event will the authors be held liable for any damages - * arising from the use of this software. - * - * Permission is granted to anyone to use this software for any purpose, - * including commercial applications, and to alter it and redistribute it - * freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; you must not - * claim that you wrote the original software. If you use this software - * in a product, an acknowledgment in the product documentation would be - * appreciated but is not required. - * 2. Altered source versions must be plainly marked as such, and must not be - * misrepresented as being the original software. - * 3. This notice may not be removed or altered from any source distribution. - **/ - -namespace love -{ - -// [graphics.lua] -const unsigned char graphics_lua[] = -{ - - 0x2d, 0x2d, 0x5b, 0x5b, 0x0a, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x28, 0x63, 0x29, 0x20, 0x32, 0x30, 0x30, 0x36, - 0x2d, 0x32, 0x30, 0x31, 0x35, 0x20, 0x4c, 0x4f, 0x56, 0x45, 0x20, 0x44, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, - 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x54, 0x65, 0x61, 0x6d, 0x0a, - 0x54, 0x68, 0x69, 0x73, 0x20, 0x73, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x20, 0x69, 0x73, 0x20, 0x70, - 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, 0x20, 0x27, 0x61, 0x73, 0x2d, 0x69, 0x73, 0x27, 0x2c, 0x20, 0x77, - 0x69, 0x74, 0x68, 0x6f, 0x75, 0x74, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, - 0x20, 0x6f, 0x72, 0x20, 0x69, 0x6d, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x0a, - 0x77, 0x61, 0x72, 0x72, 0x61, 0x6e, 0x74, 0x79, 0x2e, 0x20, 0x20, 0x49, 0x6e, 0x20, 0x6e, 0x6f, 0x20, 0x65, - 0x76, 0x65, 0x6e, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x75, 0x74, 0x68, - 0x6f, 0x72, 0x73, 0x20, 0x62, 0x65, 0x20, 0x68, 0x65, 0x6c, 0x64, 0x20, 0x6c, 0x69, 0x61, 0x62, 0x6c, 0x65, - 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x64, 0x61, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x0a, - 0x61, 0x72, 0x69, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x75, - 0x73, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x73, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, - 0x65, 0x2e, 0x0a, - 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x73, 0x20, 0x67, 0x72, 0x61, 0x6e, - 0x74, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x6e, 0x79, 0x6f, 0x6e, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x75, - 0x73, 0x65, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x73, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x20, 0x66, - 0x6f, 0x72, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x70, 0x75, 0x72, 0x70, 0x6f, 0x73, 0x65, 0x2c, 0x0a, - 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x72, 0x63, 0x69, - 0x61, 0x6c, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2c, 0x20, 0x61, - 0x6e, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x6c, 0x74, 0x65, 0x72, 0x20, 0x69, 0x74, 0x20, 0x61, 0x6e, 0x64, - 0x20, 0x72, 0x65, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x69, 0x74, 0x0a, - 0x66, 0x72, 0x65, 0x65, 0x6c, 0x79, 0x2c, 0x20, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x74, 0x6f, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x20, 0x72, 0x65, 0x73, - 0x74, 0x72, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3a, 0x0a, - 0x31, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x20, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, - 0x68, 0x69, 0x73, 0x20, 0x73, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, - 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x65, 0x20, 0x6d, 0x69, 0x73, 0x72, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, - 0x74, 0x65, 0x64, 0x3b, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x6e, 0x6f, 0x74, 0x0a, - 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x77, 0x72, 0x6f, - 0x74, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x20, 0x73, 0x6f, - 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x2e, 0x20, 0x49, 0x66, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x75, 0x73, 0x65, - 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x73, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x0a, - 0x69, 0x6e, 0x20, 0x61, 0x20, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x2c, 0x20, 0x61, 0x6e, 0x20, 0x61, - 0x63, 0x6b, 0x6e, 0x6f, 0x77, 0x6c, 0x65, 0x64, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x62, 0x65, 0x0a, - 0x61, 0x70, 0x70, 0x72, 0x65, 0x63, 0x69, 0x61, 0x74, 0x65, 0x64, 0x20, 0x62, 0x75, 0x74, 0x20, 0x69, 0x73, - 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x2e, 0x0a, - 0x32, 0x2e, 0x20, 0x41, 0x6c, 0x74, 0x65, 0x72, 0x65, 0x64, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, - 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x70, - 0x6c, 0x61, 0x69, 0x6e, 0x6c, 0x79, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x64, 0x20, 0x61, 0x73, 0x20, 0x73, - 0x75, 0x63, 0x68, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x6e, 0x6f, 0x74, 0x20, - 0x62, 0x65, 0x0a, - 0x6d, 0x69, 0x73, 0x72, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x65, 0x64, 0x20, 0x61, 0x73, 0x20, - 0x62, 0x65, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, - 0x20, 0x73, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x2e, 0x0a, - 0x33, 0x2e, 0x20, 0x54, 0x68, 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x69, 0x63, 0x65, 0x20, 0x6d, 0x61, 0x79, - 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x65, 0x20, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x20, 0x6f, 0x72, - 0x20, 0x61, 0x6c, 0x74, 0x65, 0x72, 0x65, 0x64, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x61, 0x6e, 0x79, 0x20, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, - 0x6e, 0x2e, 0x0a, - 0x2d, 0x2d, 0x5d, 0x5d, 0x0a, - 0x64, 0x6f, 0x0a, - 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x63, 0x61, - 0x74, 0x20, 0x3d, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x0a, - 0x09, 0x2d, 0x2d, 0x20, 0x53, 0x48, 0x41, 0x44, 0x45, 0x52, 0x53, 0x0a, - 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x47, 0x4c, 0x53, 0x4c, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, - 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x47, 0x4c, 0x53, 0x4c, 0x45, 0x53, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, - 0x09, 0x47, 0x4c, 0x53, 0x4c, 0x2e, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x20, 0x3d, 0x20, 0x22, 0x23, - 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x31, 0x32, 0x30, 0x22, 0x0a, - 0x09, 0x47, 0x4c, 0x53, 0x4c, 0x45, 0x53, 0x2e, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x20, 0x3d, 0x20, - 0x22, 0x23, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x31, 0x30, 0x30, 0x22, 0x0a, - 0x09, 0x47, 0x4c, 0x53, 0x4c, 0x2e, 0x53, 0x59, 0x4e, 0x54, 0x41, 0x58, 0x20, 0x3d, 0x20, 0x5b, 0x5b, 0x0a, - 0x23, 0x69, 0x66, 0x6e, 0x64, 0x65, 0x66, 0x20, 0x47, 0x4c, 0x5f, 0x45, 0x53, 0x0a, - 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x6c, 0x6f, 0x77, 0x70, 0x0a, - 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x0a, - 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x0a, - 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, 0x0a, - 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x66, 0x6c, 0x6f, - 0x61, 0x74, 0x0a, - 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x20, 0x73, 0x61, 0x6d, 0x70, - 0x6c, 0x65, 0x72, 0x32, 0x44, 0x0a, - 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x75, 0x6e, 0x69, - 0x66, 0x6f, 0x72, 0x6d, 0x0a, - 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x54, 0x65, 0x78, 0x65, 0x6c, 0x20, 0x74, 0x65, 0x78, 0x74, - 0x75, 0x72, 0x65, 0x32, 0x44, 0x0a, - 0x23, 0x70, 0x72, 0x61, 0x67, 0x6d, 0x61, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x56, 0x28, 0x73, - 0x74, 0x72, 0x69, 0x63, 0x74, 0x20, 0x6f, 0x6e, 0x29, 0x5d, 0x5d, 0x0a, - 0x09, 0x47, 0x4c, 0x53, 0x4c, 0x45, 0x53, 0x2e, 0x53, 0x59, 0x4e, 0x54, 0x41, 0x58, 0x20, 0x3d, 0x20, 0x47, - 0x4c, 0x53, 0x4c, 0x2e, 0x53, 0x59, 0x4e, 0x54, 0x41, 0x58, 0x0a, - 0x09, 0x47, 0x4c, 0x53, 0x4c, 0x2e, 0x55, 0x4e, 0x49, 0x46, 0x4f, 0x52, 0x4d, 0x53, 0x20, 0x3d, 0x20, 0x5b, - 0x5b, 0x0a, - 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x4d, - 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x67, 0x6c, 0x5f, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, - 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x0a, - 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x67, 0x6c, 0x5f, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x0a, - 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x50, - 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x67, 0x6c, - 0x5f, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x0a, - 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x4d, 0x61, 0x74, 0x72, - 0x69, 0x78, 0x20, 0x67, 0x6c, 0x5f, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x0a, - 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x32, 0x44, 0x20, - 0x5f, 0x74, 0x65, 0x78, 0x30, 0x5f, 0x3b, 0x0a, - 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x5f, - 0x53, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x53, 0x69, 0x7a, 0x65, 0x3b, 0x5d, 0x5d, 0x0a, - 0x09, 0x47, 0x4c, 0x53, 0x4c, 0x45, 0x53, 0x2e, 0x55, 0x4e, 0x49, 0x46, 0x4f, 0x52, 0x4d, 0x53, 0x20, 0x3d, - 0x20, 0x5b, 0x5b, 0x0a, - 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x54, 0x72, 0x61, 0x6e, 0x73, - 0x66, 0x6f, 0x72, 0x6d, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, 0x0a, - 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x50, 0x72, 0x6f, 0x6a, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, 0x0a, - 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x54, 0x72, 0x61, 0x6e, 0x73, - 0x66, 0x6f, 0x72, 0x6d, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x72, - 0x69, 0x78, 0x3b, 0x0a, - 0x2f, 0x2f, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x4e, 0x6f, - 0x72, 0x6d, 0x61, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, 0x0a, - 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x32, 0x44, 0x20, - 0x5f, 0x74, 0x65, 0x78, 0x30, 0x5f, 0x3b, 0x0a, - 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x76, 0x65, - 0x63, 0x34, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x5f, 0x53, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x53, 0x69, 0x7a, 0x65, - 0x3b, 0x0a, - 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, - 0x6f, 0x61, 0x74, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x5f, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x53, 0x69, 0x7a, 0x65, - 0x3b, 0x5d, 0x5d, 0x0a, - 0x09, 0x47, 0x4c, 0x53, 0x4c, 0x2e, 0x56, 0x45, 0x52, 0x54, 0x45, 0x58, 0x20, 0x3d, 0x20, 0x7b, 0x0a, - 0x09, 0x09, 0x48, 0x45, 0x41, 0x44, 0x45, 0x52, 0x20, 0x3d, 0x20, 0x5b, 0x5b, 0x0a, - 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x56, 0x45, 0x52, 0x54, 0x45, 0x58, 0x0a, - 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x50, 0x6f, 0x73, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x6c, 0x5f, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x0a, - 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x54, 0x65, 0x78, 0x43, - 0x6f, 0x6f, 0x72, 0x64, 0x20, 0x67, 0x6c, 0x5f, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x54, 0x65, 0x78, 0x43, 0x6f, - 0x6f, 0x72, 0x64, 0x30, 0x0a, - 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, - 0x72, 0x20, 0x67, 0x6c, 0x5f, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x0a, - 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x56, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x54, 0x65, 0x78, - 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x20, 0x67, 0x6c, 0x5f, 0x54, 0x65, 0x78, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x5b, - 0x30, 0x5d, 0x0a, - 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x56, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6c, - 0x6f, 0x72, 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x6f, 0x6e, 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x5d, 0x5d, - 0x2c, 0x0a, - 0x09, 0x09, 0x46, 0x4f, 0x4f, 0x54, 0x45, 0x52, 0x20, 0x3d, 0x20, 0x5b, 0x5b, 0x0a, - 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x20, 0x7b, 0x0a, - 0x09, 0x56, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x54, 0x65, 0x78, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x20, 0x3d, - 0x20, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x54, 0x65, 0x78, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x3b, 0x0a, - 0x09, 0x56, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x56, 0x65, - 0x72, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, - 0x09, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x70, 0x6f, 0x73, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x50, 0x72, 0x6f, - 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x2c, 0x20, 0x56, 0x65, 0x72, - 0x74, 0x65, 0x78, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x3b, 0x0a, - 0x7d, 0x5d, 0x5d, 0x2c, 0x0a, - 0x09, 0x7d, 0x0a, - 0x09, 0x0a, - 0x09, 0x47, 0x4c, 0x53, 0x4c, 0x45, 0x53, 0x2e, 0x56, 0x45, 0x52, 0x54, 0x45, 0x58, 0x20, 0x3d, 0x20, 0x7b, 0x0a, - 0x09, 0x09, 0x48, 0x45, 0x41, 0x44, 0x45, 0x52, 0x20, 0x3d, 0x20, 0x5b, 0x5b, 0x0a, - 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x56, 0x45, 0x52, 0x54, 0x45, 0x58, 0x0a, - 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x56, 0x65, 0x72, - 0x74, 0x65, 0x78, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, - 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x56, 0x65, 0x72, - 0x74, 0x65, 0x78, 0x54, 0x65, 0x78, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x3b, 0x0a, - 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x56, 0x65, 0x72, - 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, - 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x56, 0x61, 0x72, 0x79, 0x69, - 0x6e, 0x67, 0x54, 0x65, 0x78, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x3b, 0x0a, - 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x56, 0x61, 0x72, 0x79, 0x69, - 0x6e, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, - 0x2f, 0x2f, 0x23, 0x69, 0x66, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x28, 0x47, 0x4c, 0x5f, 0x45, - 0x58, 0x54, 0x5f, 0x64, 0x72, 0x61, 0x77, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x29, 0x0a, - 0x2f, 0x2f, 0x09, 0x23, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x47, 0x4c, 0x5f, 0x45, - 0x58, 0x54, 0x5f, 0x64, 0x72, 0x61, 0x77, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x20, - 0x3a, 0x20, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x0a, - 0x2f, 0x2f, 0x09, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x5f, 0x49, 0x6e, - 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x44, 0x20, 0x67, 0x6c, 0x5f, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, - 0x63, 0x65, 0x49, 0x44, 0x45, 0x58, 0x54, 0x0a, - 0x2f, 0x2f, 0x23, 0x65, 0x6c, 0x73, 0x65, 0x0a, - 0x2f, 0x2f, 0x09, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, - 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x5f, 0x50, 0x73, 0x65, 0x75, 0x64, 0x6f, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, - 0x63, 0x65, 0x49, 0x44, 0x3b, 0x0a, - 0x2f, 0x2f, 0x09, 0x69, 0x6e, 0x74, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x5f, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, - 0x63, 0x65, 0x49, 0x44, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x74, 0x28, 0x6c, 0x6f, 0x76, 0x65, 0x5f, 0x50, 0x73, - 0x65, 0x75, 0x64, 0x6f, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x44, 0x29, 0x3b, 0x0a, - 0x2f, 0x2f, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, 0x0a, - 0x5d, 0x5d, 0x2c, 0x0a, - 0x09, 0x09, 0x46, 0x4f, 0x4f, 0x54, 0x45, 0x52, 0x20, 0x3d, 0x20, 0x5b, 0x5b, 0x0a, - 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x20, 0x7b, 0x0a, - 0x09, 0x56, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x54, 0x65, 0x78, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x20, 0x3d, - 0x20, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x54, 0x65, 0x78, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x3b, 0x0a, - 0x09, 0x56, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x56, 0x65, - 0x72, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, - 0x09, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x53, 0x69, 0x7a, 0x65, 0x20, 0x3d, 0x20, 0x6c, 0x6f, - 0x76, 0x65, 0x5f, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x53, 0x69, 0x7a, 0x65, 0x3b, 0x0a, - 0x09, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x70, 0x6f, 0x73, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x50, 0x72, 0x6f, - 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x2c, 0x20, 0x56, 0x65, 0x72, - 0x74, 0x65, 0x78, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x3b, 0x0a, - 0x7d, 0x5d, 0x5d, 0x2c, 0x0a, - 0x09, 0x7d, 0x0a, - 0x09, 0x47, 0x4c, 0x53, 0x4c, 0x2e, 0x50, 0x49, 0x58, 0x45, 0x4c, 0x20, 0x3d, 0x20, 0x7b, 0x0a, - 0x09, 0x09, 0x48, 0x45, 0x41, 0x44, 0x45, 0x52, 0x20, 0x3d, 0x20, 0x5b, 0x5b, 0x0a, - 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x50, 0x49, 0x58, 0x45, 0x4c, 0x0a, - 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x56, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x54, 0x65, 0x78, - 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x20, 0x67, 0x6c, 0x5f, 0x54, 0x65, 0x78, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x5b, - 0x30, 0x5d, 0x0a, - 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x56, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6c, - 0x6f, 0x72, 0x20, 0x67, 0x6c, 0x5f, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x0a, - 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x5f, 0x43, 0x61, 0x6e, 0x76, 0x61, - 0x73, 0x65, 0x73, 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, 0x61, 0x74, 0x61, 0x5d, 0x5d, 0x2c, 0x0a, - 0x09, 0x09, 0x46, 0x4f, 0x4f, 0x54, 0x45, 0x52, 0x20, 0x3d, 0x20, 0x5b, 0x5b, 0x0a, - 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x20, 0x7b, 0x0a, - 0x09, 0x2f, 0x2f, 0x20, 0x66, 0x69, 0x78, 0x20, 0x63, 0x72, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x20, 0x69, - 0x73, 0x73, 0x75, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x4f, 0x53, 0x58, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x5f, - 0x74, 0x65, 0x78, 0x30, 0x5f, 0x20, 0x69, 0x73, 0x20, 0x75, 0x6e, 0x75, 0x73, 0x65, 0x64, 0x20, 0x77, 0x69, - 0x74, 0x68, 0x69, 0x6e, 0x20, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x28, 0x29, 0x0a, - 0x09, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x64, 0x75, 0x6d, 0x6d, 0x79, 0x20, 0x3d, 0x20, 0x54, 0x65, 0x78, - 0x65, 0x6c, 0x28, 0x5f, 0x74, 0x65, 0x78, 0x30, 0x5f, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x2e, 0x35, - 0x29, 0x29, 0x2e, 0x72, 0x3b, 0x0a, - 0x09, 0x2f, 0x2f, 0x20, 0x53, 0x65, 0x65, 0x20, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x3a, 0x3a, 0x63, 0x68, - 0x65, 0x63, 0x6b, 0x53, 0x65, 0x74, 0x53, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, - 0x20, 0x69, 0x6e, 0x20, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x2e, 0x63, 0x70, 0x70, 0x2e, 0x0a, - 0x09, 0x76, 0x65, 0x63, 0x32, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x20, 0x3d, - 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6f, 0x72, 0x64, - 0x2e, 0x78, 0x2c, 0x20, 0x28, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x2e, - 0x79, 0x20, 0x2a, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x5f, 0x53, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x53, 0x69, 0x7a, - 0x65, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x5f, 0x53, 0x63, 0x72, 0x65, 0x65, 0x6e, - 0x53, 0x69, 0x7a, 0x65, 0x2e, 0x77, 0x29, 0x3b, 0x0a, - 0x09, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x65, 0x66, - 0x66, 0x65, 0x63, 0x74, 0x28, 0x56, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, - 0x20, 0x5f, 0x74, 0x65, 0x78, 0x30, 0x5f, 0x2c, 0x20, 0x56, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x54, 0x65, - 0x78, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x2e, 0x73, 0x74, 0x2c, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x63, 0x6f, - 0x6f, 0x72, 0x64, 0x29, 0x3b, 0x0a, - 0x7d, 0x5d, 0x5d, 0x2c, 0x0a, - 0x09, 0x09, 0x46, 0x4f, 0x4f, 0x54, 0x45, 0x52, 0x5f, 0x4d, 0x55, 0x4c, 0x54, 0x49, 0x5f, 0x43, 0x41, 0x4e, - 0x56, 0x41, 0x53, 0x20, 0x3d, 0x20, 0x5b, 0x5b, 0x0a, - 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x20, 0x7b, 0x0a, - 0x09, 0x2f, 0x2f, 0x20, 0x66, 0x69, 0x78, 0x20, 0x63, 0x72, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x20, 0x69, - 0x73, 0x73, 0x75, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x4f, 0x53, 0x58, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x5f, - 0x74, 0x65, 0x78, 0x30, 0x5f, 0x20, 0x69, 0x73, 0x20, 0x75, 0x6e, 0x75, 0x73, 0x65, 0x64, 0x20, 0x77, 0x69, - 0x74, 0x68, 0x69, 0x6e, 0x20, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x28, 0x29, 0x0a, - 0x09, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x64, 0x75, 0x6d, 0x6d, 0x79, 0x20, 0x3d, 0x20, 0x54, 0x65, 0x78, - 0x65, 0x6c, 0x28, 0x5f, 0x74, 0x65, 0x78, 0x30, 0x5f, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x2e, 0x35, - 0x29, 0x29, 0x2e, 0x72, 0x3b, 0x0a, - 0x09, 0x2f, 0x2f, 0x20, 0x53, 0x65, 0x65, 0x20, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x3a, 0x3a, 0x63, 0x68, - 0x65, 0x63, 0x6b, 0x53, 0x65, 0x74, 0x53, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, - 0x20, 0x69, 0x6e, 0x20, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x2e, 0x63, 0x70, 0x70, 0x2e, 0x0a, - 0x09, 0x76, 0x65, 0x63, 0x32, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x20, 0x3d, - 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6f, 0x72, 0x64, - 0x2e, 0x78, 0x2c, 0x20, 0x28, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x2e, - 0x79, 0x20, 0x2a, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x5f, 0x53, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x53, 0x69, 0x7a, - 0x65, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x5f, 0x53, 0x63, 0x72, 0x65, 0x65, 0x6e, - 0x53, 0x69, 0x7a, 0x65, 0x2e, 0x77, 0x29, 0x3b, 0x0a, - 0x09, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x73, 0x28, 0x56, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x43, 0x6f, - 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x5f, 0x74, 0x65, 0x78, 0x30, 0x5f, 0x2c, 0x20, 0x56, 0x61, 0x72, 0x79, 0x69, - 0x6e, 0x67, 0x54, 0x65, 0x78, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x2e, 0x73, 0x74, 0x2c, 0x20, 0x70, 0x69, 0x78, - 0x65, 0x6c, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x29, 0x3b, 0x0a, - 0x7d, 0x5d, 0x5d, 0x2c, 0x0a, - 0x09, 0x7d, 0x0a, - 0x09, 0x47, 0x4c, 0x53, 0x4c, 0x45, 0x53, 0x2e, 0x50, 0x49, 0x58, 0x45, 0x4c, 0x20, 0x3d, 0x20, 0x7b, 0x0a, - 0x09, 0x09, 0x48, 0x45, 0x41, 0x44, 0x45, 0x52, 0x20, 0x3d, 0x20, 0x5b, 0x5b, 0x0a, - 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x50, 0x49, 0x58, 0x45, 0x4c, 0x0a, - 0x70, 0x72, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, - 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3b, 0x0a, - 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x76, 0x65, - 0x63, 0x34, 0x20, 0x56, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x54, 0x65, 0x78, 0x43, 0x6f, 0x6f, 0x72, 0x64, - 0x3b, 0x0a, - 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x6c, 0x6f, 0x77, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, - 0x56, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, - 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x5f, 0x43, 0x61, 0x6e, 0x76, 0x61, - 0x73, 0x65, 0x73, 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, 0x61, 0x74, 0x61, 0x3b, 0x5d, 0x5d, - 0x2c, 0x0a, - 0x09, 0x09, 0x46, 0x4f, 0x4f, 0x54, 0x45, 0x52, 0x20, 0x3d, 0x20, 0x47, 0x4c, 0x53, 0x4c, 0x2e, 0x50, 0x49, - 0x58, 0x45, 0x4c, 0x2e, 0x46, 0x4f, 0x4f, 0x54, 0x45, 0x52, 0x2c, 0x0a, - 0x09, 0x09, 0x46, 0x4f, 0x4f, 0x54, 0x45, 0x52, 0x5f, 0x4d, 0x55, 0x4c, 0x54, 0x49, 0x5f, 0x43, 0x41, 0x4e, - 0x56, 0x41, 0x53, 0x20, 0x3d, 0x20, 0x47, 0x4c, 0x53, 0x4c, 0x2e, 0x50, 0x49, 0x58, 0x45, 0x4c, 0x2e, 0x46, - 0x4f, 0x4f, 0x54, 0x45, 0x52, 0x5f, 0x4d, 0x55, 0x4c, 0x54, 0x49, 0x5f, 0x43, 0x41, 0x4e, 0x56, 0x41, 0x53, - 0x2c, 0x0a, - 0x09, 0x7d, 0x0a, - 0x09, 0x2d, 0x2d, 0x20, 0x55, 0x6e, 0x66, 0x6f, 0x72, 0x74, 0x75, 0x6e, 0x61, 0x74, 0x65, 0x6c, 0x79, 0x2c, - 0x20, 0x47, 0x4c, 0x53, 0x4c, 0x20, 0x31, 0x2e, 0x32, 0x30, 0x20, 0x63, 0x61, 0x6e, 0x27, 0x74, 0x20, 0x64, - 0x65, 0x61, 0x6c, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x70, 0x72, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x20, 0x71, 0x75, 0x61, 0x6c, 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x2e, 0x0a, - 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x74, - 0x72, 0x69, 0x70, 0x50, 0x72, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x28, 0x63, 0x6f, 0x64, 0x65, 0x29, 0x0a, - 0x09, 0x09, 0x2d, 0x2d, 0x20, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x20, 0x22, 0x70, 0x72, 0x65, 0x63, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, - 0x3b, 0x22, 0x2c, 0x20, 0x65, 0x74, 0x63, 0x2e, 0x0a, - 0x09, 0x09, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x3a, 0x67, 0x73, 0x75, 0x62, - 0x28, 0x22, 0x70, 0x72, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x28, 0x25, 0x73, 0x2b, 0x29, 0x6c, 0x6f, - 0x77, 0x70, 0x28, 0x25, 0x73, 0x2b, 0x29, 0x28, 0x25, 0x77, 0x2b, 0x29, 0x28, 0x25, 0x73, 0x2a, 0x29, 0x3b, - 0x22, 0x2c, 0x20, 0x22, 0x22, 0x29, 0x0a, - 0x09, 0x09, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x3a, 0x67, 0x73, 0x75, 0x62, - 0x28, 0x22, 0x70, 0x72, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x28, 0x25, 0x73, 0x2b, 0x29, 0x6d, 0x65, - 0x64, 0x69, 0x75, 0x6d, 0x70, 0x28, 0x25, 0x73, 0x2b, 0x29, 0x28, 0x25, 0x77, 0x2b, 0x29, 0x28, 0x25, 0x73, - 0x2a, 0x29, 0x3b, 0x22, 0x2c, 0x20, 0x22, 0x22, 0x29, 0x0a, - 0x09, 0x09, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x3a, 0x67, 0x73, 0x75, 0x62, - 0x28, 0x22, 0x70, 0x72, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x28, 0x25, 0x73, 0x2b, 0x29, 0x68, 0x69, - 0x67, 0x68, 0x70, 0x28, 0x25, 0x73, 0x2b, 0x29, 0x28, 0x25, 0x77, 0x2b, 0x29, 0x28, 0x25, 0x73, 0x2a, 0x29, - 0x3b, 0x22, 0x2c, 0x20, 0x22, 0x22, 0x29, 0x0a, - 0x09, 0x09, 0x2d, 0x2d, 0x20, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x72, 0x65, - 0x6d, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x22, 0x6c, 0x6f, 0x77, 0x70, 0x22, 0x2c, 0x20, 0x22, 0x6d, - 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x22, 0x2c, 0x20, 0x22, 0x68, 0x69, 0x67, 0x68, 0x70, 0x22, 0x2e, 0x0a, - 0x09, 0x09, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x3a, 0x67, 0x73, 0x75, 0x62, - 0x28, 0x22, 0x28, 0x25, 0x57, 0x2b, 0x29, 0x6c, 0x6f, 0x77, 0x70, 0x28, 0x25, 0x73, 0x2b, 0x29, 0x22, 0x2c, - 0x20, 0x22, 0x25, 0x31, 0x22, 0x29, 0x3a, 0x67, 0x73, 0x75, 0x62, 0x28, 0x22, 0x5e, 0x6c, 0x6f, 0x77, 0x70, - 0x28, 0x25, 0x73, 0x2b, 0x29, 0x22, 0x2c, 0x20, 0x22, 0x22, 0x29, 0x0a, - 0x09, 0x09, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x3a, 0x67, 0x73, 0x75, 0x62, - 0x28, 0x22, 0x28, 0x25, 0x57, 0x2b, 0x29, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x28, 0x25, 0x73, 0x2b, - 0x29, 0x22, 0x2c, 0x20, 0x22, 0x25, 0x31, 0x22, 0x29, 0x3a, 0x67, 0x73, 0x75, 0x62, 0x28, 0x22, 0x5e, 0x6d, - 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x28, 0x25, 0x73, 0x2b, 0x29, 0x22, 0x2c, 0x20, 0x22, 0x22, 0x29, 0x0a, - 0x09, 0x09, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x3a, 0x67, 0x73, 0x75, 0x62, - 0x28, 0x22, 0x28, 0x25, 0x57, 0x2b, 0x29, 0x68, 0x69, 0x67, 0x68, 0x70, 0x28, 0x25, 0x73, 0x2b, 0x29, 0x22, - 0x2c, 0x20, 0x22, 0x25, 0x31, 0x22, 0x29, 0x3a, 0x67, 0x73, 0x75, 0x62, 0x28, 0x22, 0x5e, 0x68, 0x69, 0x67, - 0x68, 0x70, 0x28, 0x25, 0x73, 0x2b, 0x29, 0x22, 0x2c, 0x20, 0x22, 0x22, 0x29, 0x0a, - 0x09, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x0a, - 0x09, 0x65, 0x6e, 0x64, 0x0a, - 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x64, 0x65, 0x28, 0x76, 0x65, 0x72, - 0x74, 0x65, 0x78, 0x63, 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x6c, 0x61, 0x6e, 0x67, 0x29, 0x0a, - 0x09, 0x09, 0x69, 0x66, 0x20, 0x6c, 0x61, 0x6e, 0x67, 0x20, 0x3d, 0x3d, 0x20, 0x47, 0x4c, 0x53, 0x4c, 0x20, - 0x74, 0x68, 0x65, 0x6e, 0x0a, - 0x09, 0x09, 0x09, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x73, 0x74, - 0x72, 0x69, 0x70, 0x50, 0x72, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x28, 0x76, 0x65, 0x72, 0x74, 0x65, - 0x78, 0x63, 0x6f, 0x64, 0x65, 0x29, 0x0a, - 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, - 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x64, 0x65, - 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x0a, - 0x09, 0x09, 0x09, 0x6c, 0x61, 0x6e, 0x67, 0x2e, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x2c, 0x0a, - 0x09, 0x09, 0x09, 0x6c, 0x61, 0x6e, 0x67, 0x2e, 0x53, 0x59, 0x4e, 0x54, 0x41, 0x58, 0x2c, 0x20, 0x6c, 0x61, - 0x6e, 0x67, 0x2e, 0x56, 0x45, 0x52, 0x54, 0x45, 0x58, 0x2e, 0x48, 0x45, 0x41, 0x44, 0x45, 0x52, 0x2c, 0x20, - 0x6c, 0x61, 0x6e, 0x67, 0x2e, 0x55, 0x4e, 0x49, 0x46, 0x4f, 0x52, 0x4d, 0x53, 0x2c, 0x0a, - 0x09, 0x09, 0x09, 0x6c, 0x61, 0x6e, 0x67, 0x20, 0x3d, 0x3d, 0x20, 0x47, 0x4c, 0x53, 0x4c, 0x45, 0x53, 0x20, - 0x61, 0x6e, 0x64, 0x20, 0x22, 0x23, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x31, 0x22, 0x20, 0x6f, 0x72, 0x20, 0x22, - 0x23, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x30, 0x22, 0x2c, 0x20, 0x2d, 0x2d, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, - 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x69, 0x66, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x23, 0x6c, 0x69, 0x6e, 0x65, 0x2e, 0x2e, 0x2e, 0x0a, - 0x09, 0x09, 0x09, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x64, 0x65, 0x2c, 0x0a, - 0x09, 0x09, 0x09, 0x6c, 0x61, 0x6e, 0x67, 0x2e, 0x56, 0x45, 0x52, 0x54, 0x45, 0x58, 0x2e, 0x46, 0x4f, 0x4f, - 0x54, 0x45, 0x52, 0x2c, 0x0a, - 0x09, 0x09, 0x7d, 0x0a, - 0x09, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6e, - 0x63, 0x61, 0x74, 0x28, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x64, 0x65, 0x73, 0x2c, 0x20, 0x22, - 0x5c, 0x6e, 0x22, 0x29, 0x0a, - 0x09, 0x65, 0x6e, 0x64, 0x0a, - 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x50, 0x69, 0x78, 0x65, 0x6c, 0x43, 0x6f, 0x64, 0x65, 0x28, 0x70, 0x69, 0x78, 0x65, - 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x6c, 0x61, 0x6e, 0x67, 0x2c, 0x20, 0x69, 0x73, 0x5f, 0x6d, 0x75, - 0x6c, 0x74, 0x69, 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x29, 0x0a, - 0x09, 0x09, 0x69, 0x66, 0x20, 0x6c, 0x61, 0x6e, 0x67, 0x20, 0x3d, 0x3d, 0x20, 0x47, 0x4c, 0x53, 0x4c, 0x20, - 0x74, 0x68, 0x65, 0x6e, 0x0a, - 0x09, 0x09, 0x09, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, - 0x69, 0x70, 0x50, 0x72, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x28, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x63, - 0x6f, 0x64, 0x65, 0x29, 0x0a, - 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, - 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x73, - 0x20, 0x3d, 0x20, 0x7b, 0x0a, - 0x09, 0x09, 0x09, 0x6c, 0x61, 0x6e, 0x67, 0x2e, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x2c, 0x0a, - 0x09, 0x09, 0x09, 0x6c, 0x61, 0x6e, 0x67, 0x2e, 0x53, 0x59, 0x4e, 0x54, 0x41, 0x58, 0x2c, 0x20, 0x6c, 0x61, - 0x6e, 0x67, 0x2e, 0x50, 0x49, 0x58, 0x45, 0x4c, 0x2e, 0x48, 0x45, 0x41, 0x44, 0x45, 0x52, 0x2c, 0x20, 0x6c, - 0x61, 0x6e, 0x67, 0x2e, 0x55, 0x4e, 0x49, 0x46, 0x4f, 0x52, 0x4d, 0x53, 0x2c, 0x0a, - 0x09, 0x09, 0x09, 0x6c, 0x61, 0x6e, 0x67, 0x20, 0x3d, 0x3d, 0x20, 0x47, 0x4c, 0x53, 0x4c, 0x45, 0x53, 0x20, - 0x61, 0x6e, 0x64, 0x20, 0x22, 0x23, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x31, 0x22, 0x20, 0x6f, 0x72, 0x20, 0x22, - 0x23, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x30, 0x22, 0x2c, 0x0a, - 0x09, 0x09, 0x09, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x2c, 0x0a, - 0x09, 0x09, 0x09, 0x69, 0x73, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x20, - 0x61, 0x6e, 0x64, 0x20, 0x6c, 0x61, 0x6e, 0x67, 0x2e, 0x50, 0x49, 0x58, 0x45, 0x4c, 0x2e, 0x46, 0x4f, 0x4f, - 0x54, 0x45, 0x52, 0x5f, 0x4d, 0x55, 0x4c, 0x54, 0x49, 0x5f, 0x43, 0x41, 0x4e, 0x56, 0x41, 0x53, 0x20, 0x6f, - 0x72, 0x20, 0x6c, 0x61, 0x6e, 0x67, 0x2e, 0x50, 0x49, 0x58, 0x45, 0x4c, 0x2e, 0x46, 0x4f, 0x4f, 0x54, 0x45, - 0x52, 0x2c, 0x0a, - 0x09, 0x09, 0x7d, 0x0a, - 0x09, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6e, - 0x63, 0x61, 0x74, 0x28, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x73, 0x2c, 0x20, 0x22, 0x5c, - 0x6e, 0x22, 0x29, 0x0a, - 0x09, 0x65, 0x6e, 0x64, 0x0a, - 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x73, - 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x64, 0x65, 0x28, 0x63, 0x6f, 0x64, 0x65, 0x29, 0x0a, - 0x09, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x3a, 0x6d, 0x61, 0x74, 0x63, - 0x68, 0x28, 0x22, 0x76, 0x65, 0x63, 0x34, 0x25, 0x73, 0x2b, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x25, 0x73, 0x2a, 0x25, 0x28, 0x22, 0x29, 0x20, 0x7e, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, - 0x09, 0x65, 0x6e, 0x64, 0x0a, - 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x73, - 0x50, 0x69, 0x78, 0x65, 0x6c, 0x43, 0x6f, 0x64, 0x65, 0x28, 0x63, 0x6f, 0x64, 0x65, 0x29, 0x0a, - 0x09, 0x09, 0x69, 0x66, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x3a, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x22, 0x76, - 0x65, 0x63, 0x34, 0x25, 0x73, 0x2b, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x25, 0x73, 0x2a, 0x25, 0x28, 0x22, - 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, - 0x09, 0x09, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, - 0x09, 0x09, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x3a, 0x6d, 0x61, 0x74, 0x63, - 0x68, 0x28, 0x22, 0x76, 0x6f, 0x69, 0x64, 0x25, 0x73, 0x2b, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x73, 0x25, - 0x73, 0x2a, 0x25, 0x28, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, - 0x09, 0x09, 0x09, 0x2d, 0x2d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x6f, 0x72, - 0x20, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x6f, 0x20, 0x6d, 0x75, 0x6c, 0x74, - 0x69, 0x70, 0x6c, 0x65, 0x20, 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x65, 0x73, 0x20, 0x73, 0x69, 0x6d, 0x75, - 0x6c, 0x74, 0x61, 0x6e, 0x65, 0x6f, 0x75, 0x73, 0x6c, 0x79, 0x0a, - 0x09, 0x09, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x74, 0x72, - 0x75, 0x65, 0x0a, - 0x09, 0x09, 0x65, 0x6c, 0x73, 0x65, 0x0a, - 0x09, 0x09, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x2c, 0x20, 0x66, - 0x61, 0x6c, 0x73, 0x65, 0x0a, - 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, - 0x09, 0x65, 0x6e, 0x64, 0x0a, - 0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, - 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x64, 0x65, 0x54, - 0x6f, 0x47, 0x4c, 0x53, 0x4c, 0x28, 0x61, 0x72, 0x67, 0x31, 0x2c, 0x20, 0x61, 0x72, 0x67, 0x32, 0x29, 0x0a, - 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x64, 0x65, - 0x2c, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x0a, - 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x73, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x63, 0x61, - 0x6e, 0x76, 0x61, 0x73, 0x20, 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x20, 0x2d, 0x2d, 0x20, 0x77, 0x68, - 0x65, 0x74, 0x68, 0x65, 0x72, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x68, - 0x61, 0x73, 0x20, 0x22, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x73, 0x22, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x65, 0x61, 0x64, 0x20, 0x6f, 0x66, 0x20, 0x22, 0x65, 0x66, - 0x66, 0x65, 0x63, 0x74, 0x22, 0x0a, - 0x09, 0x09, 0x0a, - 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x61, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x47, 0x4c, 0x53, - 0x4c, 0x0a, - 0x09, 0x09, 0x69, 0x66, 0x20, 0x28, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, - 0x73, 0x2e, 0x67, 0x65, 0x74, 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x28, - 0x29, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x4f, 0x70, 0x65, 0x6e, 0x47, 0x4c, 0x20, 0x45, 0x53, 0x22, 0x20, - 0x74, 0x68, 0x65, 0x6e, 0x0a, - 0x09, 0x09, 0x09, 0x6c, 0x61, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x47, 0x4c, 0x53, 0x4c, 0x45, 0x53, 0x0a, - 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, - 0x09, 0x09, 0x69, 0x66, 0x20, 0x61, 0x72, 0x67, 0x31, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, - 0x09, 0x09, 0x09, 0x69, 0x66, 0x20, 0x69, 0x73, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x64, 0x65, - 0x28, 0x61, 0x72, 0x67, 0x31, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, - 0x09, 0x09, 0x09, 0x09, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x61, - 0x72, 0x67, 0x31, 0x20, 0x2d, 0x2d, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x61, 0x72, 0x67, 0x20, 0x63, - 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x20, 0x73, 0x68, 0x61, - 0x64, 0x65, 0x72, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x0a, - 0x09, 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, - 0x09, 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x73, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x2c, 0x20, - 0x69, 0x73, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x43, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x20, 0x3d, 0x20, 0x69, 0x73, - 0x50, 0x69, 0x78, 0x65, 0x6c, 0x43, 0x6f, 0x64, 0x65, 0x28, 0x61, 0x72, 0x67, 0x31, 0x29, 0x0a, - 0x09, 0x09, 0x09, 0x69, 0x66, 0x20, 0x69, 0x73, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, - 0x09, 0x09, 0x09, 0x09, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x61, 0x72, - 0x67, 0x31, 0x20, 0x2d, 0x2d, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x61, 0x72, 0x67, 0x20, 0x63, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x20, 0x73, 0x68, 0x61, 0x64, 0x65, - 0x72, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x0a, - 0x09, 0x09, 0x09, 0x09, 0x69, 0x73, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, - 0x20, 0x3d, 0x20, 0x69, 0x73, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x43, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x0a, - 0x09, 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, - 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, - 0x09, 0x09, 0x69, 0x66, 0x20, 0x61, 0x72, 0x67, 0x32, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, - 0x09, 0x09, 0x09, 0x69, 0x66, 0x20, 0x69, 0x73, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x64, 0x65, - 0x28, 0x61, 0x72, 0x67, 0x32, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, - 0x09, 0x09, 0x09, 0x09, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x61, - 0x72, 0x67, 0x32, 0x20, 0x2d, 0x2d, 0x20, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x61, 0x72, 0x67, 0x20, - 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x20, 0x73, 0x68, - 0x61, 0x64, 0x65, 0x72, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x0a, - 0x09, 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, - 0x09, 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x73, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x2c, 0x20, - 0x69, 0x73, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x43, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x20, 0x3d, 0x20, 0x69, 0x73, - 0x50, 0x69, 0x78, 0x65, 0x6c, 0x43, 0x6f, 0x64, 0x65, 0x28, 0x61, 0x72, 0x67, 0x32, 0x29, 0x0a, - 0x09, 0x09, 0x09, 0x69, 0x66, 0x20, 0x69, 0x73, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, - 0x09, 0x09, 0x09, 0x09, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x61, 0x72, - 0x67, 0x32, 0x20, 0x2d, 0x2d, 0x20, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x61, 0x72, 0x67, 0x20, 0x63, - 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x20, 0x73, 0x68, 0x61, 0x64, - 0x65, 0x72, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x0a, - 0x09, 0x09, 0x09, 0x09, 0x69, 0x73, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, - 0x20, 0x3d, 0x20, 0x69, 0x73, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x43, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x0a, - 0x09, 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, - 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, - 0x09, 0x09, 0x69, 0x66, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x74, 0x68, - 0x65, 0x6e, 0x0a, - 0x09, 0x09, 0x09, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x63, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x64, 0x65, 0x28, 0x76, 0x65, 0x72, - 0x74, 0x65, 0x78, 0x63, 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x6c, 0x61, 0x6e, 0x67, 0x29, 0x0a, - 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, - 0x09, 0x09, 0x69, 0x66, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x74, 0x68, 0x65, - 0x6e, 0x0a, - 0x09, 0x09, 0x09, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x63, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x50, 0x69, 0x78, 0x65, 0x6c, 0x43, 0x6f, 0x64, 0x65, 0x28, 0x70, 0x69, 0x78, 0x65, 0x6c, - 0x63, 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x6c, 0x61, 0x6e, 0x67, 0x2c, 0x20, 0x69, 0x73, 0x5f, 0x6d, 0x75, 0x6c, - 0x74, 0x69, 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x29, 0x0a, - 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, - 0x09, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x64, - 0x65, 0x2c, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x0a, - 0x09, 0x65, 0x6e, 0x64, 0x0a, - 0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, - 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x47, 0x4c, - 0x53, 0x4c, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x28, 0x6d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x29, 0x0a, - 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x68, 0x61, 0x64, 0x65, 0x72, 0x74, 0x79, 0x70, 0x65, - 0x20, 0x3d, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x3a, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x22, - 0x43, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x20, 0x28, 0x25, 0x61, - 0x2b, 0x29, 0x20, 0x73, 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x22, 0x29, 0x0a, - 0x09, 0x09, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x68, 0x61, 0x64, 0x65, 0x72, 0x74, 0x79, 0x70, - 0x65, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x20, 0x65, 0x6e, 0x64, 0x0a, - 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x22, - 0x43, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x20, 0x22, 0x2e, 0x2e, - 0x73, 0x68, 0x61, 0x64, 0x65, 0x72, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x2e, 0x22, 0x20, 0x73, 0x68, 0x61, 0x64, - 0x65, 0x72, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x3a, 0x22, 0x7d, 0x0a, - 0x09, 0x09, 0x66, 0x6f, 0x72, 0x20, 0x6c, 0x20, 0x69, 0x6e, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x3a, 0x67, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x22, 0x5b, 0x5e, 0x5c, 0x6e, 0x5d, 0x2b, 0x22, 0x29, 0x20, - 0x64, 0x6f, 0x0a, - 0x09, 0x09, 0x09, 0x2d, 0x2d, 0x20, 0x6e, 0x76, 0x69, 0x64, 0x69, 0x61, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, - 0x6c, 0x65, 0x72, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x3a, 0x0a, - 0x09, 0x09, 0x09, 0x2d, 0x2d, 0x20, 0x30, 0x28, 0x3c, 0x6c, 0x69, 0x6e, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x65, - 0x72, 0x3e, 0x29, 0x20, 0x3a, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2f, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, - 0x67, 0x20, 0x5b, 0x4e, 0x55, 0x4d, 0x42, 0x45, 0x52, 0x5d, 0x3a, 0x20, 0x3c, 0x65, 0x72, 0x72, 0x6f, 0x72, - 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x3e, 0x0a, - 0x09, 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x65, - 0x72, 0x2c, 0x20, 0x77, 0x68, 0x61, 0x74, 0x2c, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x20, 0x3d, - 0x20, 0x6c, 0x3a, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x22, 0x5e, 0x30, 0x25, 0x28, 0x28, 0x25, 0x64, 0x2b, - 0x29, 0x25, 0x29, 0x25, 0x73, 0x2a, 0x3a, 0x25, 0x73, 0x2a, 0x28, 0x25, 0x77, 0x2b, 0x29, 0x5b, 0x5e, 0x3a, - 0x5d, 0x2b, 0x3a, 0x25, 0x73, 0x2a, 0x28, 0x2e, 0x2b, 0x29, 0x24, 0x22, 0x29, 0x0a, - 0x09, 0x09, 0x09, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x6e, 0x75, 0x6d, 0x62, - 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, - 0x09, 0x09, 0x09, 0x09, 0x2d, 0x2d, 0x20, 0x61, 0x74, 0x69, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, - 0x72, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x3a, 0x0a, - 0x09, 0x09, 0x09, 0x09, 0x2d, 0x2d, 0x20, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x20, 0x30, 0x3a, 0x3c, 0x6c, 0x69, - 0x6e, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x3e, 0x3a, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2f, 0x77, - 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x28, 0x23, 0x5b, 0x4e, 0x55, 0x4d, 0x42, 0x45, 0x52, 0x5d, 0x29, 0x20, - 0x5b, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x4e, 0x41, 0x4d, 0x45, 0x5d, 0x3a, 0x20, 0x3c, 0x65, 0x72, 0x72, 0x6f, - 0x72, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x3e, 0x0a, - 0x09, 0x09, 0x09, 0x09, 0x6c, 0x69, 0x6e, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x2c, 0x20, 0x77, 0x68, - 0x61, 0x74, 0x2c, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x20, 0x3d, 0x20, 0x6c, 0x3a, 0x6d, 0x61, - 0x74, 0x63, 0x68, 0x28, 0x22, 0x5e, 0x25, 0x77, 0x2b, 0x3a, 0x20, 0x30, 0x3a, 0x28, 0x25, 0x64, 0x2b, 0x29, - 0x3a, 0x25, 0x73, 0x2a, 0x28, 0x25, 0x77, 0x2b, 0x29, 0x25, 0x28, 0x5b, 0x5e, 0x25, 0x29, 0x5d, 0x2b, 0x25, - 0x29, 0x25, 0x73, 0x2a, 0x28, 0x2e, 0x2b, 0x29, 0x24, 0x22, 0x29, 0x0a, - 0x09, 0x09, 0x09, 0x09, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x6e, 0x75, 0x6d, - 0x62, 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, - 0x09, 0x09, 0x09, 0x09, 0x09, 0x2d, 0x2d, 0x20, 0x4f, 0x53, 0x58, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, - 0x65, 0x72, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x20, 0x28, 0x3f, 0x29, 0x3a, 0x0a, - 0x09, 0x09, 0x09, 0x09, 0x09, 0x2d, 0x2d, 0x20, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x3a, 0x20, 0x30, 0x3a, 0x3c, - 0x6c, 0x69, 0x6e, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x3e, 0x3a, 0x20, 0x3c, 0x65, 0x72, 0x72, 0x6f, - 0x72, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x3e, 0x0a, - 0x09, 0x09, 0x09, 0x09, 0x09, 0x77, 0x68, 0x61, 0x74, 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x6e, 0x75, 0x6d, - 0x62, 0x65, 0x72, 0x2c, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x20, 0x3d, 0x20, 0x6c, 0x3a, 0x6d, - 0x61, 0x74, 0x63, 0x68, 0x28, 0x22, 0x5e, 0x28, 0x25, 0x77, 0x2b, 0x29, 0x3a, 0x20, 0x25, 0x64, 0x2b, 0x3a, - 0x28, 0x25, 0x64, 0x2b, 0x29, 0x3a, 0x20, 0x28, 0x2e, 0x2b, 0x29, 0x24, 0x22, 0x29, 0x0a, - 0x09, 0x09, 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, - 0x09, 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, - 0x09, 0x09, 0x09, 0x69, 0x66, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x61, - 0x6e, 0x64, 0x20, 0x77, 0x68, 0x61, 0x74, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, - 0x09, 0x09, 0x09, 0x09, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x5b, 0x23, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2b, 0x31, - 0x5d, 0x20, 0x3d, 0x20, 0x28, 0x22, 0x4c, 0x69, 0x6e, 0x65, 0x20, 0x25, 0x64, 0x3a, 0x20, 0x25, 0x73, 0x3a, - 0x20, 0x25, 0x73, 0x22, 0x29, 0x3a, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x6c, 0x69, 0x6e, 0x65, 0x6e, - 0x75, 0x6d, 0x62, 0x65, 0x72, 0x2c, 0x20, 0x77, 0x68, 0x61, 0x74, 0x2c, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x29, 0x0a, - 0x09, 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, - 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, - 0x09, 0x09, 0x2d, 0x2d, 0x20, 0x64, 0x69, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, - 0x20, 0x61, 0x6e, 0x79, 0x20, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x6d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x0a, - 0x09, 0x09, 0x69, 0x66, 0x20, 0x23, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x20, 0x3d, 0x3d, 0x20, 0x31, 0x20, 0x74, - 0x68, 0x65, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x20, 0x65, 0x6e, 0x64, 0x0a, - 0x09, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6e, - 0x63, 0x61, 0x74, 0x28, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2c, 0x20, 0x22, 0x5c, 0x6e, 0x22, 0x29, 0x0a, - 0x09, 0x65, 0x6e, 0x64, 0x0a, - 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x63, 0x6f, 0x64, 0x65, - 0x20, 0x3d, 0x20, 0x7b, 0x0a, - 0x09, 0x09, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x5b, 0x5b, 0x0a, - 0x76, 0x65, 0x63, 0x34, 0x20, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6d, 0x61, 0x74, 0x34, - 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x5f, 0x70, 0x72, 0x6f, 0x6a, 0x2c, 0x20, 0x76, - 0x65, 0x63, 0x34, 0x20, 0x76, 0x65, 0x72, 0x74, 0x70, 0x6f, 0x73, 0x29, 0x20, 0x7b, 0x0a, - 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x5f, - 0x70, 0x72, 0x6f, 0x6a, 0x20, 0x2a, 0x20, 0x76, 0x65, 0x72, 0x74, 0x70, 0x6f, 0x73, 0x3b, 0x09, 0x0a, - 0x7d, 0x5d, 0x5d, 0x2c, 0x0a, - 0x09, 0x09, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x20, 0x3d, 0x20, 0x5b, 0x5b, 0x0a, - 0x76, 0x65, 0x63, 0x34, 0x20, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x28, 0x6c, 0x6f, 0x77, 0x70, 0x20, 0x76, - 0x65, 0x63, 0x34, 0x20, 0x76, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x20, - 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x74, 0x65, 0x78, 0x63, - 0x6f, 0x6f, 0x72, 0x64, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x70, 0x69, 0x78, 0x63, 0x6f, 0x6f, 0x72, - 0x64, 0x29, 0x20, 0x7b, 0x0a, - 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x54, 0x65, 0x78, 0x65, 0x6c, 0x28, 0x74, 0x65, 0x78, 0x74, - 0x75, 0x72, 0x65, 0x2c, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x29, 0x20, 0x2a, 0x20, 0x76, - 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x09, 0x0a, - 0x7d, 0x5d, 0x5d, 0x0a, - 0x09, 0x7d, 0x0a, - 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x20, 0x3d, 0x20, - 0x7b, 0x7d, 0x0a, - 0x09, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x5b, 0x22, 0x6f, 0x70, 0x65, 0x6e, 0x67, 0x6c, 0x22, - 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x0a, - 0x09, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x64, 0x65, - 0x28, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x63, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, - 0x78, 0x2c, 0x20, 0x47, 0x4c, 0x53, 0x4c, 0x29, 0x2c, 0x0a, - 0x09, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x69, 0x78, 0x65, 0x6c, 0x43, 0x6f, 0x64, 0x65, 0x28, - 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x63, 0x6f, 0x64, 0x65, 0x2e, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x2c, - 0x20, 0x47, 0x4c, 0x53, 0x4c, 0x2c, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x0a, - 0x09, 0x7d, 0x0a, - 0x09, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x5b, 0x22, 0x6f, 0x70, 0x65, 0x6e, 0x67, 0x6c, 0x65, - 0x73, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x0a, - 0x09, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x64, 0x65, - 0x28, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x63, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, - 0x78, 0x2c, 0x20, 0x47, 0x4c, 0x53, 0x4c, 0x45, 0x53, 0x29, 0x2c, 0x0a, - 0x09, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x69, 0x78, 0x65, 0x6c, 0x43, 0x6f, 0x64, 0x65, 0x28, - 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x63, 0x6f, 0x64, 0x65, 0x2e, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x2c, - 0x20, 0x47, 0x4c, 0x53, 0x4c, 0x45, 0x53, 0x2c, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x0a, - 0x09, 0x7d, 0x0a, - 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x5f, 0x73, 0x65, - 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x64, 0x65, - 0x28, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x29, 0x0a, - 0x65, 0x6e, 0x64, 0x0a, -}; // [graphics.lua] -} // love diff --git a/jni/love/src/scripts/nogame.lua b/jni/love/src/scripts/nogame.lua new file mode 100644 index 00000000..7b6b8e68 --- /dev/null +++ b/jni/love/src/scripts/nogame.lua @@ -0,0 +1,1006 @@ +--[[ +Copyright (c) 2006-2015 LOVE Development Team + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +--]] + +-- Make sure love exists. +local love = require("love") + +function love.nogame() + + local baby_png = + "iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAL1klEQVR4nO2deZAU1R3HPz3X\ + 3ruzuywEXZVLBJHAilfUpAQNGo1RPDAxKiaKkpQHlZBKhTIRjSaWlCmrrCJBDR7RaMSUBx6x\ + ElmhCIogi8dKFEQEYWGXva+Znunp/NGzbO/szuwc/XZ39r1P1dT2dr/+9a/7ffv1u59mmiYK\ + eXENtwOK4UUJQHKUACRHCUBylAAkRwlAcpQAJEcJQHKUACRHCUBylAAkRwlAcpQAJEcJQHKU\ + ACRHCUBylAAkRwlAcpQAJEcJQHKUACRHCUBylAAkRwlAcpQAJEcJQHKUACRHCUBylAAkRwlA\ + cjzD7UC2YNRWO2LHPWOuI3acwlEBaJrmpLkRQ/iT9T2blwBXAMcATwL/iO6vAJ4GLgQ+A34A\ + 7AImA9cCRcAzwEdOPCMn53RQKUDy3AKstv3/pG37aeCi6PY04FtAEPgYyIvurwK+K9bF1FEC\ + GATb23+bbXcj8HJ0eyG9kQ9QCzwH/IneyAd4TZCLGaEygclxOjDT9v+zWG94MfBwTNglwDjg\ + Ztu+RuAxkQ6mi0oBEmB7+2+KOfR49O89wHjb/jXAJuDvQK5t/++ALgEuZozmZIZitGUCowLI\ + Bw5hZeQAtmGlCFOxkvuel6gNmIL1rX/LZqYmGt7wnDLPEb+yMhNoe5uyjavojXzoffvvpe/z\ + ux8IA3+17dOBGwEDBn8GTgkkFYQLIOam5wInpGmqmOHJs9xu2w4BpcB9WJm/HjoBDagGKm37\ + XwFOjf7smEAr0AE0AQeAw7ECGQpBCP8ERG9Kw8os3eHYxUYfrcAHwH+wShF7ew7ECsHROBMp\ + AJuiVwB3O3ah0U8E61OylGjm0S4CJ+NsKJLUKuCuIbjOaMIFLMaqO3CLvpAQbG//cgTfxChm\ + LlYmVBiiU4ASYIHga4x2zhdpXLQAvo16+zOlcvAg6SO6GHhaMoGONLfy5qatbK75lLqGJgK6\ + ztgyP7OnTebCc+YwY8oEwW6K4UhzK29sfJ93P9zJwfpG9FCYirISqqZPYf45c5gxOakSsS7S\ + R2GlgGgeYDVWK9qAhMJhVj23jideeovuYPz7nHfmbO669VqOHTfGMV9FoofCPPLsyzz1yr8J\ + 6qG44c4/q4rfLvkx4yvKEpl7Bbg8W0sBhfEOdHR1s2j5SlY9vy5h5AOs37KDBXfew4ef7XHc\ + Qadp7+zmht88yKNr30gY+QBvv1fDgjtWULt7b6JgcZ+hE4gWgD/egWUrH+WD2l1JG2pt7+SW\ + ux+mrqHJEcdEYJomSx9YRc3O3Umf09zWweK7H6ahqTVekHGOOBeHoSgF9OOtTduofv/DlI21\ + tHewcs3ajJ0Sxesb32fT9tqUz2tsaWPlE3HvqwLEtaUMiwBWv/B62gZf37iF/Yca0j5fJJnc\ + 16vV73KwoXGgQxUIjCfRAiiN3VHX0ETtF19lZHT9lh0ZnS+CfXX1fL7367TPN02TdwZOFV1A\ + edqGB0GIAGzJVUXssS/212Vsf48DNpxm74HDGdvYve9gvENx81KZIjIF8AO+2J3tnZl3jGlp\ + 78zYhtO0tHdkbKMt/rPJSgEMmHst9xdnbLiidMCsxbAyxgGfEtxXv0+pU4gUwNiBdp40oRK3\ + O7PLzjgx3T4l4pg28ThcGXaJOzl+zaAfxJQEHK8Ktjk5fqDjJUUFnHvqKWzY+lFa9nN8Xuad\ + MTulcw42NLLpg0/4qq6elrYOugJBy5bXi8ulUZCfR2lxIePKSzl+/FimTTyOooK8Qaz2payk\ + iLOrTk6rGAiQl+PjvNNnxTs8C/gnYDgtAkcFYHNuFv170h7lzusuZ+O2j9Oq0vzpggspKSpI\ + OnwoHOby21fQmkK+QdM0Lj3vLFYuW5ySb3dctyBtAdx81fcSiW45cAPwK+B5o7basSFmjn0C\ + bGPnHsDqCTs/XtgZUyZw68JLUr7G9EnHs+SH30/pnKbW9pQiH6wi2avV71Lf1JLSebNOmsTN\ + V140eMAYZk6dyOKrLh4sWCXWaKQJKV8gAU7nAa4Dfo3VBzAhS69fwE1XJP+wZk6dyJr7fkmu\ + r1/BIiHjykupTKMR6Zix5WllNpf95GoWXZb8CLCqaZN5dMVScnzeZILnAA+l7FQCHGsNjKYA\ + 7wFnpnLef2tqWblmLTv37BvwuL+okMVXX8yiyy7A60nvi/WvTVu5849/Tjq8S9NYvWIp3zlt\ + 5uCB47Bx28c89OSL/O/L/QMe9xcVsuSaS7j+0gvweFLqMtEN5Dv1CXBaADqQlJRj2blnH5t3\ + fEpdfRN6KMSY0hKqpk/mzG9Ox+fNPKvyzLq3+cNjz2EYkYThxpb5uff2Rcw9I26GLGlM02Tn\ + nv1srqnl0JFm9FCIijI/s6dNyvS+tJEqgBG9Fv2er+t4/MU3Wb9lB81tvRU3ebk5zDppEvPP\ + nsOV889N+TMzxOwCpo5UAewDjnPEoGCONLcS1EPk5vgcqZwaQm4EnhpxpYAoTzlsTxhjSks4\ + dtyYbIr8IPALHH7GTlcE/R5rTPzP6Ts2XpEZnwIXAHXg7DQzTqcAOrCMJDuDKpJmF9HId3q8\ + oGMCcM+Ya3cua9LVbELEYFFRjUHCmi8lJSjKsBJAdtAtyrDjAjA0NygBOE32CCDgKybozZ8Q\ + 0dT8Uw4i7BPgeH+Azlw/YXfuTN2Tiy/cTU6oM/rrwmsEnL6cLAjrBu24AALeYiIudweA7slH\ + 9+TTnmf1DXWZBr5QFznhLnJCnfjCXXgMoUPfRgsbunLEdINzXAARlxusZsv+xzQ3AV8RAV/v\ + nEuuSBhfuNv268JrBNHMxI022Yjh8hDRPERcHiKaG8PlJqK5ifT81Ty920f3uU00zZ8XjDty\ + KCOGfZ7AiMvTTxQAHkPHawTwGgE8ho7bCOGJ6HgMHZcZRnNwgGSmhN0+Qu5cwm4fhssb/VkR\ + 3RPphiv9lj9gYWdOqZCZRkUJoDlTA2G3j7DbR3ecOiXNjKCl0PiomZE+onGZRmJbpokrQSoU\ + cbkx0Qi5c4ikH7nJUoWgORhFef6lILtHMTVXam3PWlbPU1E0eJD0EFVWWyfIrqwcEGVYlABq\ + gA2CbMvIdlGGHRfAlLFHKwGXO21bYoS9TCKr6zYDLwi0LwsmsFGUcSECsKUCtwFHRFxDIrYD\ + 9aKMi66wbyDBJFGKpHgN+rxUjiJMADaHXwIeFHWdUY6B4H6WQlOAmAzhyJ3cZ+TyOILrVIaq\ + zdYAfoQ1abRq/UmOtVi9gIUl/zAEArA5b2CtqnEi8BcEdnLIYhqBR7BGVy9kCNYZGtI1g3bX\ + 9xltWwpcDVyDNSv26FpwKHkasGpO1wJvY61KAsR/87NmwYh42IVQEGjE33V4VdBb8LMuXwkB\ + XzGjvTeRhtlgor2INenDO0TXFOphsCQ/KxeNsmO/Qb32HVxmRPeGAxR2N2KiEfQWHG0iDnoK\ + MEfBamTecIB8vYX8YCu+cPc1jYWV1R15vcPWRX7nEzHs/QGiTa5H51bVMMkNdZAb6oDOOkxN\ + Q/fk01Iw/m/dvuJC4GwET5/qFLl6O/l6K/nBVjxGn259+8vb9/ONE6YMl2tHGXYBRFmLNays\ + 32ugmaaZE+q8N0fvWKF78jBcXoBjseYhmBP9zWZkiCKQp7d6CwIt7ny9FVckPFCYDcDuVPoy\ + iGTYF460zStUhbXe7rlYwjyEtQDjI1iraeE5ZV5sRtJOGTAdOBlrUcdKLKEcE90esJtamhhY\ + Q7W+whoR/TnWgpLVE+q3P0DfdYbt1ACXAgcyGeWT9ZnAWGJmvvJgrZrVpztOogeWQBR2CrFm\ + Li23/fxYg1iLgILods/07G1YS7nVY+XUD0d/DVjtG/0enL+zDn9nnQ9rlbQbsWZK6wS2Yi0f\ + /zTRXP6oFECm2CaaApwbBftFg5gOlZMr+vbUjfU/Hk6O7s2UESUAxdAzugvcikFRApAcJQDJ\ + UQKQHCUAyVECkBwlAMlRApAcJQDJUQKQHCUAyVECkBwlAMlRApAcJQDJUQKQHCUAyVECkBwl\ + AMlRApAcJQDJUQKQHCUAyVECkBwlAMlRApAcJQDJUQKQHCUAyVECkJz/A7w3h5w1bl6AAAAA\ + AElFTkSuQmCC\ + " + local background_png = + "iVBORw0KGgoAAAANSUhEUgAAAgAAAAIACAYAAAD0eNT6AAAgAElEQVR4nO3deZRedZ3n8Xcq\ + SUWTkAUTILIJRCVsArIoqCjdILYGHRZbARc4Mwg2gij0dGPPabFHPEdEFBdUZhoPAq2yqKgj\ + ArIptiACCgFUaCUCgYQlO4ZQqfnjW0UqSS3Pcu/93eX9Ouc5Wary3E/Q3O/3+f7u/d1x/f39\ + SCqt8cDsIa9ZwObATGA6MAPYDHjpwI8vGfLzCQPfN9Tg14d6DvjrRr/3LPACsGLI1wd/vgJY\ + Ciwb+L5ngKeAJUNefR3/jSUVYpwNgJTMDGC7gde2wDYDP24NbMH6ot+TKmCH+oHFRCOwGHgM\ + +Avw6MCPCwd+fDZVQEk2AFKexhFFfe6Q144DP+5EfEpvshXAw0NeDw15PUo0EpJyYgMgda8H\ + eAWwC7ArMA/YDdgZmJIuVqWtAh4E7gMeABYA9wN/BtaliyXVhw2A1J5eorjvBewN7AnsAUxN\ + GapBVgK/A+4B7gbuIpqE51OGkqrIBkAaWQ/xKf51wP7AfsQn/IkpQ2kTa4npwO0Dr18R0wMn\ + BdIobACk9aYCBwBvIIr+fsSV9qqeZcAdREPwC+A2YnogaYANgJpsBvBG4E0Dr72JW+dUPy8Q\ + ywW3Drx+TtzKKDWWDYCapJf4dP+3wCFEwa/aLXbKxjqiIbgeuIGYEKxJmkgqmA2A6m5n4G1E\ + wT8ImJw2jkpqNXAL0RBcS9x5INWaDYDqppco9G8H3kHcby+162Hgx8CPiMbAuwxUOzYAqoOZ\ + wOHAfOBQ3GBH2VoJ/BT4IXAN7mComrABUFXNAt4FHAH8DfHJX8rbWuAm4Arg+8QzEKRKsgFQ\ + lbwMeDdwFDHmH582jhquj1geuBL4LvB02jhSe2wAVHZTgHcCxxDjfTfhURmtBa4DLieWCdxz\ + QKVnA6AyGg+8FTiWKP7up68qWQX8ALiMuHbARyOrlGwAVCY7AR8ETgBenjaKlInHgYsHXg8n\ + ziJtwAZAqU0BjgaOJ3blG5c2jpSLfmL3wYuJCwhXpY0j2QAonV2Ak4D34377apZlwCXA14iH\ + GElJ2ACoSJOI2/ZOIvbel5ruVqIRuBq3IlbBbABUhK2ADwMnAlsmziKV0ZPAN4CvAk8kzqKG\ + sAFQnvYGTgP+nvj0L2l0a4DvAF8kHlYk5cYGQFnrIbbkPZ3YrEdSZ24Bzie2IF6XOItqyAZA\ + Wekl7ts/E5iXOItUJw8A5xL7CvhQImXGBkDd2gz4H8Qn/m0SZ5Hq7FFiInARsCJxFtWADYA6\ + NR34KHAqsHniLFKTPANcQFwnsDRxFlWYDYDaNZO4sO80YEbiLFKTLSWagC/iI4rVARsAtWom\ + MeY/FTfukcpkGTER+AIxHZBaYgOgsUwlRv0fx0/8UpktBc4jGgGfRqgx2QBoJL3Ejn1n4eY9\ + UpUsBj5N7DDoXQMakQ2ANtYDvA84G9g+cRZJnXsE+CTx3AH3EdAmbAA01GHAZ4A9UweRlJl7\ + gX8Erk0dROViAyCIJ/OdRzQAkurpWuJaHp9AKCDGvWquOcBXgN9i8Zfq7jDi3/rXiX/7ajgn\ + AM00gbid73/hlf1SEy0D/o3YQ+CFxFmUiA1A8xwMfIkY+0tqtvuJDwM/Sx1ExXMJoDm2A64g\ + /qFb/CVBnAtuAK4kzhFqEBuA+psAfIx4othRibNIKqcjiXPEx4lzhhrAJYB6ew3wf4B9UgeR\ + VBl3Ek/4vCd1EOXLCUA9vRQ4h/iHbPGX1I59gF8Te4K8NHEW5cgJQP28mbjN51WJc0iqvj8A\ + HwJuTpxDOXACUB8zgIuAG7H4S8rGq4hzykV4y3DtOAGohyOIW/tenjqIpNpaBJwCXJ06iLJh\ + A1Btgzv5/bfUQSQ1xveBDxMNgSrMBqC6jgIuBGalDiKpcZ4CTib2D1BFeQ1A9UwnHu95BRZ/\ + SWnMIs5BlxDnJFWQE4BqeQtwMbB96iCSNGAh8EHgpsQ51CYnANUwEfgssWWnxV9SmWxHnJs+\ + S5yrVBFOAMpvJ+A/gH1TB5GkMfwaeC/wcOogGpsTgHI7BrgLi7+katiXOGcdkzqIxmYDUE5T\ + gW8ClwHT0kaRpLZMI85d3yTOZSoplwDKZx6x0cbOqYNIUpceJJ40eH/qINqUE4ByORa4A4u/\ + pHrYGbidOLepZGwAymESsaPfpTgyk1QvU4lz21eIc51KwiWA9LYndtPysb2S6u5OYhfTR1IH\ + kROA1A4ibpux+Etqgn2Ic95BqYPIBiClU4Drgdmpg0hSgWYT576PpA7SdC4BFG8S8RCf41MH\ + kaTELiYeKrQmdZAmsgEo1lbA94DXpQ4iSSXxK+KR5k+kDtI0NgDF2QX4EbBD6iCSVDJ/AuYD\ + C1IHaRKvASjGW4BfYPGXpOHsAPwcODh1kCaxAcjfB4BrgZmpg0hSic0EfkKcM1UAG4D8jAM+\ + SVzk0ps2iiRVQi9xzvwkcQ5VjrwGIB+9wEXA+1MHkaSK+hbw34HnUwepKxuA7M0EriLW/SVJ\ + nbsZOAJ4NnGOWrIByNYOwI+JJ/pJkrr3APB24k4BZchrALLzWuA/sfhLUpbmEedWt0zPmA1A\ + Nt4M3AhsmTiHJNXRlsDPiHOtMmID0L35wP8DpqUOIkk1No24TXB+6iB1YQPQnWOBq4GXpg4i\ + SQ3wEuKce1zqIHVgA9C5fyBuU5mQOogkNcgE4BLiHKwu2AB05uPAl3GjCklKYRxxDj4jdZAq\ + swFo3z8Dn0sdQpLEucQ5WR2wAWjPvwLnpA4hSXrROcDZqUNUkRsBte4c7DQlqaw+A5yVOkSV\ + OAFozaex+EtSmf0zca5Wi2wAxvav2FVKUhWcRTxJUC1wCWB0Z2FHKUlV8wm8XmtMNgAj+xhw\ + XuoQkqSOnIHn8FHZAAzvH4h7TCVJ1XUK8JXUIcrKBmBTxxI7/LnJjyRVWz/wPuCy1EHKyAZg\ + Q4cDV+H2vpJUFy8ARwLXpA5SNjYA6x0M/BCYnDqIJClTq4mnCN6YOkiZ2ACEfYHrgempg0iS\ + crEMOBS4I3WQsrABgLnAL4HZqYNIknK1BDgAeCh1kDJo+kZAs4GfYPGXpCbwnD9EkxuAycSa\ + /9zUQSRJhZmL13sBzW0AxgP/AeyfOogkqXD7EzVgfOogKTW1AfgSccufJKmZDidqQWM1sQE4\ + HTg5dQhJUnInE9u+N1LT7gI4HLiaho99JEkv6gOOoIEbBTWpAdgduA3YLHUQSVKprCRuD7w3\ + dZAiNaUB2Ar4NbBN6iCSpFJ6FNgPWJQ6SFGacA1AL/A9LP6SpJFtQ9SK3tRBitKEBuBC4HWp\ + Q0iSSm9/omY0Qt0bgI8AJ6QOIUmqjBOI2lF7db4G4CDgOho0zpEkZeJ54sFBt6QOkqe6NgDb\ + Ar/B/Z4lSZ1ZAuwDLEwdJC91XALoBa7C4i9J6txs4EpqPEWuYwNwPrBv6hCSpMrbl6gptVS3\ + JYD3ApenDiFJqpVjiIcH1UqdGoB5wB3A1NRBJEm1soqYBjyQOkiW6rIEMIVY97f4S5KyVssa\ + U5cG4MvEBECSpDzMo2aPD67DEsAxwGWpQ0iSGuE4alJzqt4A7ATcBUxLHUSS1AjLgb2Bh1MH\ + 6VaVlwB6iasyLf6SpKJMA75NDfYHqHID8L/xfn9JUvH2IWpQpVV1CeAtwA1Uu4GRJFVXP/A3\ + wE2pg3Sqig3ADOC3wHapg0iSGm0h8BpgaeognajiJ+gLsPhLktLbjqhJlVS1CcBRwBWpQ0iS\ + NMTRxIODKqVKDcAc4F7gZamDSJI0xNPA7sCi1EHaUaUlgK9j8Zcklc/LiBpVKVVpAN4DzE8d\ + QpKkEcwndqatjCosAWwBLABmpQ4iSdIongJ2BRanDtKKKkwAvoLFX5JUfrOImlUJZW8Ajhp4\ + SZJUBZWpW2VeApgB3E9c/S9JUlUsAnah5BsElXkCcA4Wf0lS9cwBPpM6xFjKOgF4PfALyt2g\ + SJI0knXAG4Ffpg4ykjI2ABOBO4E9UgeRJKkLvyOeHLg2dZDhlPET9ulY/CVJ1bcH8LHUIUZS\ + tgnAdsADwOTUQSRJysBqYB7x5MBSKdsE4HNY/CVJ9TGZqG2lU6YJwFuAG1OHkCQpB4cAN6QO\ + MVRZGoCJwD3EfZOSJNXNg8Q1AaW5ILAsSwCnYvGXJNXXzkStK40yTAC2BP4ATEsdRJKkHC0H\ + Xg08kToIlGMCcDYWf0lS/U0jal4ppJ4A7Eqs/U9IGUKSpIL0AXsC96UOknoC8Dks/pKk5hgP\ + nJs6BKRtAA4BDkt4fEmSUjgMeGvqEKmWAMYDdwO7pzi4JEmJ3UcsBfSlCpBqAvA+LP6SpOba\ + jaiFyaSYAEwCfg9sX/SBJUkqkUeI2wLXpDh4ignAiVj8JUnaHjgp1cGLngBMAR4mNv+RJKnp\ + FgNzgRVFH7joCcBHsfhLkjRoC+C0FAcucgIwE/gTML2oA0qSVAHLgB2AZ4s8aJETgNOx+EuS\ + tLHpwMeKPmhRE4AZwJ+xAZAkaTiFTwGKmgB8FIu/JEkjmU7UysIUMQGYQaz9z8j7QJIkVdgy\ + 4BXA0iIOVsQE4DQs/pIkjWU6cb1cIfKeAEwFFhJ3AEiSpNEtBbYFVuZ9oLwnACdi8ZckqVUz\ + gA8VcaA8JwC9xK5/2+R1AEmSaugxYEfg+TwPkucE4Fgs/pIktWtr4Li8D5LXBKCHeNbxvDze\ + XJKkmnsQ2BVYl9cB8poAzMfiL0lSp3Ymamlu8moACt3MQJKkGsq1luaxBLAXcFfWbypJUgPt\ + DdydxxvnMQHw078kSdnIraZmPQGYQzz0pzfLN5UkqaGeJ7YHXpT1G2c9AfgwFn9JkrLSS9TW\ + zGU5AegFHgVmZ/WGkiSJJcS+OpluDJTlBOBILP6SJGVtNlFjM5VlA3BShu8lSZLWOznrN8xq\ + CWAXYEEWbyRJkoa1GxnW2qwmAJl3JpIkaQOZTtqzmABMIS7+m9F9HEmSNIKlwLbAyizeLIsJ\ + wNFY/CVJytsMouZmIosG4PgM3kOSJI3thKzeqNslgFcCvwfGZRNHkiSNoh94NfDHbt+o2wnA\ + B7H4S5JUlHFE7e3+jbqYAPQAjxC7E0mSpGI8BmwP9HXzJt1MAA7B4i9JUtG2Bg7t9k26aQDe\ + 3+3BJUlSR47r9g06XQKYAjw58KMkSSrWKmDLgR870ukE4J1Y/CVJSmUKUYs71mkDcEw3B5Uk\ + SV3rqhZ3sgQwC3gcmNjNgSVJUlfWAi8HnurkD3cyATgai78kSalNpIutgTtpAI7q9GCSJClT\ + HdfkdpcAZgOLgPGdHlCSJGWmD5gDLGn3D7Y7ATgci78kSWUxng7vBmi3AXD8L0lSuRzZyR9q\ + ZwlgBrH5T28nB5IkSblYC2wBLG3nD7UzAZiPxV+SpLKZSCzRt6XdBkCSJJVP2zW61SWAScT4\ + f3q7B5AkSblbSWzUt6bVP9DqBOAgLP6SJJXVVKJWt6zVBuDt7WeRJEkFaqtWt7oE8BCwU0dx\ + JElSER4G5rb6za1MAHbG4i9JUtntBOza6je30gC8rfMskiSpQG9t9RtbaQAO6SKIJEkqTss1\ + e6xrACYBTwNTuk0kSZJy9xwwkxZuBxxrAvB6LP6SJFXFS4EDW/nGsRqAQ7vPIkmSCtTSMsBY\ + DYDr/5IkVUtLtXu0awBmEOv/7T4yWJIkpbOO2Bb42dG+abTifuAYX5ckSeXTA7yhlW8aSVt7\ + CkuSpNJ401jfMFoDMOYfliRJpTRmDR/pGoCpxNrBhKwTSZKk3L0AbA6sGOkbRpoAHIjFX5Kk\ + qpoAHDDaN4zUAIz6hyRJUul11AC8PocgkiSpOKPW8uGuAegBngGm55VIkiTlbhlxHcC64b44\ + 3ARgHhZ/SZKqbjpR04c1XAOwX35ZJElSgV430heGawD2zzGIJEkqzr4jfcEJgCRJ9TXih/qN\ + LwKcRGwaMDHvRJIkKXdrgc2ANRt/YeMJwK5Y/CVJqouJwG7DfWHjBmCv/LNIkqQCDVvbbQAk\ + Sao3GwBJkhpo7+F+c+hFgD3AcmBKUYkkSVLuVgHT2GhHwKETgB2x+EuSVDdTgB02/s2hDcCu\ + xWWRJEkF2mXj3xjaAAx7m4AkSaq8TT7kD20ANukOJElSLYzaAIz4xCBJklRpm3zIH7wLoIfY\ + Anhy0YkkSVLuVhNbAr94J8DgBGBrLP6SJNXVZGDbob8x2ADsVHwWSZJUoA1q/WAD8KoEQSRJ\ + UnHmDv3FYAOwY4IgkiSpOMM2AHOH+UZJklQfNgCSJDXQBtcADN4GuJy4PUCSJNXTKmDq4C96\ + gJlY/CVJqrspwOaDv+hho/sCJUlSbb1Y820AJElqDhsASZIaaLvBn/QM/YUkSaq1bQZ/0jP0\ + F5IkqdY2mADMSRhEkiQVZ6vBn/QAWyQMIkmSirPl4E96GNINSJKkWnvxQ/+4/v7+PtZvCSxJ\ + kuprHdAL9PVg8ZckqSl6gFmDP5EkSc0xB2wAJElqGicAkiQ10AywAZAkqWlsACRJaiAbAEmS\ + GsgGQJKkBrIBkCSpgWwAJElqoGlgAyBJUtNMAhsASZKaZjLYAEiS1DRTwQZAkqSmcQlAkqQG\ + mgI2AJIkNY0NgCRJDTQBbAAkSWokGwBJkhrIBkCSpGbpBRjX39/fnzqJJEkq1DgnAJIkNZAN\ + gCRJDWQDIElSA9kASJLULM+BDYAkSU3zPNgASJLUSDYAkiQ1kA2AJEnN8gLYAEiS1DSrwAZA\ + kqSmsQGQJKmB1oANgCRJTbMSbAAkSWqa1WADIElS07gEIElSAy0HGwBJkppmKdgASJLUNDYA\ + kiQ1kA2AJEkNZAMgSVID2QBIktRANgCSJDXQU2ADIElS0zwBMK6/v78PGwFJkppgHdAL9PUw\ + MAqQJEm19xTQB/HJ/8m0WSRJUkEWD/7EBkCSpOZ4seb3AIsSBpEkScV5YvAnPcCjCYNIkqTi\ + LBz8Sc/QX0iSpFp78UO/EwBJkprDCYAkSQ20wQTgLwmDSJKk4rz4oX9cf38/wHJgs2RxJElS\ + 3lYBUwd/MbgF8J+TRJEkSUV5eOgvBhuA/0oQRJIkFWfYBuDhYb5RkiTVx0NDf2EDIElSMwzb\ + APwxQRBJklScYRuAPyQIIkmSirPBtH/wNsAeYAUwOUUiSZKUq9XE7f7rBn9jcAKwDvh9ikSS\ + JCl3DzKk+MP6BgDggWKzSJKkgty/8W/0jPZFSZJUCws2/o2e0b4oSZJqYdQJwH0FBpEkScXZ\ + 5EP+4F0AEM3AcmBKkYkkSVKuNrkDADacAKwDfltkIkmSlLvfsVHxhw0bAIC7i8kiSZIKctdw\ + v2kDIElSvQ1b220AJEmqt3uG+82hFwECTCK2BJ5YRCJJkpSrtcQFgGs2/sLGE4A1eDugJEl1\ + sYBhij9s2gAA3JFvFkmSVJBfj/QFGwBJkurr9pG+MFwDMOI3S5KkSvnVSF/Y+CJAiKbgGWB6\ + nokkSVKulgGbM8wmQDD8BGAdLgNIklR1dzBC8YfhGwAYZWQgSZIqYdRaPlIDcFsOQSRJUnFG\ + reXDXQMAsWnAM8CEPBJJkqRc9QEzic39hjXSBGAFIzw8QJIkld5djFL8YeQGAODWbLNIkqSC\ + 3DLWN4zWAIz5hyVJUimN+SF+pGsAAGYATzN6kyBJksplHTALeHa0bxqtuC/F6wAkSaqauxmj\ + +MPYn+6vzyaLJEkqyA2tfJMNgCRJ9dJS7R7tGgCAScR+AJOzSCRJknL1HHH//5qxvnGsCcAa\ + vBtAkqSquIUWij+0doW/ywCSJFVDyzW7lQbgJ10EkSRJxWm5ARjrGoBBDwE7dRxHkiTl7WFg\ + bqvf3OomPz/uLIskSSpIW7XaBkCSpHpoq1a3ugQwCXgKmNpJIkmSlKuVxPa/Ld0BAK1PANbg\ + xYCSJJXVdbRR/KG9B/38qL0skiSpID9o9w+0ugQA8XTAxcDEdg8iSZJysxbYkhYeADRUOxOA\ + pcDP2nlzSZKUuxtps/hDew0AwFXtHkCSJOWqo9rczhIAwGxgETC+k4NJkqRM9QFzgCXt/sF2\ + JwBL8OFAkiSVxa10UPyh/QYA4MpODiRJkjJ3Rad/sN0lAIiNBh7HuwEkSUppLfByYqO+tnUy\ + AXiK2HBAkiSlcx0dFn/orAEAuLzTA0qSpEx0VYs7WQIAmAI8OfCjJEkq1ipi859Vnb5BpxOA\ + VXSw7aAkScrED+ii+EPnDQDApd0cWJIkdazrGtzpEgBE8/AIsE23ISRJUsseA7YnNgHqWDcT\ + gHXAJd0cXJIkte1bdFn8obsJAMArgd8D47oNIkmSxtQPvBr4Y7dv1M0EgIEAt3UbQpIkteQ2\ + Mij+0H0DAHBxBu8hSZLG9s2s3qjbJQCAqcCjwPTu40iSpBEsIy68X5nFm2UxAVhJXJAgSZLy\ + cykZFX/IZgIAsCtwXxZvJEmShrUbsCCrN8tiAgAR6OcZvZckSdrQz8mw+EN2DQDAhRm+lyRJ\ + Wu9rWb9hVksAAL3ExYCzs3pDSZLEEuLiv+ezfNMsJwDPA1/P8P0kSVLU1kyLP2Q7AQCYA/yZ\ + mAZIkqTuPA+8AliU9RtnOQGACPjtjN9TkqSm+jY5FH/IfgIAsBdwV9ZvKklSA+0N3J3HG2c9\ + AYAIenMO7ytJUpPcTE7FH/JpAAC+kNP7SpLUFF/M883zWAKAaCwWADvn8eaSJNXc74FdgHV5\ + HSCvCcA64Nyc3luSpLo7lxyLP+Q3AYC4FfC/gK3zOoAkSTX0OLADOdz7P1ReEwCI4Ofn+P6S\ + JNXR+eRc/CHfCQDAVGAhMDPPg0iSVBNLgW3J8LG/I8lzAgDxF8j1KkZJkmrkAgoo/pD/BABg\ + BvCngR8lSdLwlhFr/88WcbC8JwAQ44wLCjiOJElVdgEFFX8oZgIAcQ3An4DpRRxMkqSKWU48\ + 9KewBqCICQDEX+hLBR1LkqSqKfTTPxQ3AQDYnJgCTCvqgJIkVcByYu3/mSIPWtQEAOIvdl6B\ + x5MkqQrOo+DiD8VOAAA2Ax4CtijyoJIkldRiYC6wougDFzkBgPgLnlPwMSVJKqtzSFD8ofgJ\ + AMAk4ilH2xd9YEmSSuQR4NXAmhQHL3oCAPEX/WSC40qSVCafJFHxhzQTAIDxwN3A7ikOLklS\ + YvcBewJ9qQKkmABA/IXPSHRsSZJSO5OExR/SNQAA1wHXJjy+JEkp/JQS1L9USwCDdgV+SywJ\ + SJJUd33AXsC9qYOknAAALAD+b+IMkiQV5d8pQfGH9BMAgC2BP+AWwZKkeltO3Pb3ROogkH4C\ + APAk8KnUISRJytmnKEnxh3JMAAAmAr8Ddk4dRJKkHDwI7AGsTR1kUBkmABD/QU5NHUKSpJyc\ + RomKP5SnAQC4HrgidQhJkjJ2NXHre6mUZQlg0HbAA8Dk1EEkScrAamAesDB1kI2VaQIA8R/I\ + CwIlSXXxb5Sw+EP5JgAQFwT+Bp8TIEmqtnuB11Kytf9BZZsAQPyHOglYlzqIJEkd6idqWSmL\ + P5SzAQD4JXBR6hCSJHXoG0QtK60yLgEMmkFcELhV6iCSJLXhSWJfm6Wpg4ymrBMAiP9wH0kd\ + QpKkNp1CyYs/lLsBALhy4CVJUhVUpm6VeQlg0BbEUwNnpQ4iSdIoniHu+V+cOkgryj4BgPgP\ + eXrqEJIkjeE0KlL8oRoTgEHXAPNTh5AkaRg/BA5PHaIdVWoA5gD3AZunDiJJ0hDPALsBi1IH\ + aUcVlgAGLSI2VZAkqUxOomLFH6rVAEA8LfBbqUNIkjTgUir6JNsqLQEMmgH8lnhyoCRJqfwF\ + 2IMK3PM/nKpNACD+Q3+Q2GdZkqQU+olaVMniD9VsAABuAs5LHUKS1FifB25MHaIbVVwCGNQL\ + 3AbskzqIJKlR7gQOBJ5PHaQbVW4AAOYCdwGbpQ4iSWqEFcDewEOpg3SrqksAgx4CTk4dQpLU\ + GCdTg+IP1W8AAC4DLkkdQpJUe98iak4tVH0JYNBU4A7iIQySJGXtQWBfYGXqIFmpwwQA4n+Q\ + o4BVqYNIkmpnFXAkNSr+UJ8GAOB+4MTUISRJtfMhosbUSp0aAIDLga+mDiFJqo0LqdG6/1B1\ + uQZgKPcHkCRloRb3+4+kjg0AxHMC7gRmpw4iSaqkJcQHyYWpg+SlbksAgxYCRwNrUweRJFXO\ + WuDd1Lj4Q30bAIBbgI+nDiFJqpwzgJtTh8hbXZcAhvp34PjUISRJlXAxcELqEEVoQgPQC9wK\ + 7J86iCSp1G4H3kRNL/rbWBMaAIA5xE6B26QOIkkqpUeJD4qPpw5SlDpfAzDUIuDvqNkuTpKk\ + TKwiakRjij80pwEAuBc4FuhLHUSSVBp9wDFEjWiUJjUAANcA/zN1CElSafwTURsapynXAGzs\ + q8QznSVJzXUh8OHUIVJpagMwHrgaODx1EElSEtcAR9DgZeGmNgAAk4Eb8fZASWqa24GDgdWp\ + g6TU5AYA4lkBvwTmpg4iSSrEQ8ABxF7/jda0iwA3tgR4G/4fQZKawHP+EE1vACC6wXcAy1IH\ + kSTlZhkwnzjnCxuAQXcQF4M8lzqIJClzfyXO8benDlImNgDr3Qi8hwZfESpJNdQH/D1xjtcQ\ + NgAbugb4ANDoKyMlqSb6iXN6Izf6GYsNwKYuA05NHUKS1LVTiXO6hmEDMLwvA2emDiFJ6tiZ\ + xLlcI7ABGNnngE+kDiFJatu/EOdwjcIGYHTnAGenDiFJatnZwKdTh6iCpu8E2KpPA2elDiFJ\ + GtVn8FzdMicArfkE8X8sSVI5WfzbZAPQurNwOUCSyuhTWPzb5hJA+/6ZuDZAkpTeJ/Cc3BEb\ + gM6cCXw2dQhJarh/BM5NHaKqbAA6dwpwATAudRBJaph+YpMf7/Pvgg1Ad44DLgYmpA4iSQ3x\ + AnA8cGnqIFVnA9C9w4HvAC9JHUSSau6vxIN93Ns/AzYA2Xgz8X/IzRLnkKS6WkF84Lo5cY7a\ + sAHIzj7Aj4EtUgeRpJpZAvwdcGfqIHViA5CtucBPBn6UJHXvIeBtAz8qQ24ElK2HgAOAO1IH\ + kaQauAM4EIt/LmwAsrcEOBj4UeogklRhP8LM7JEAAAapSURBVCbOpYtTB6krG4B8rALeBVyU\ + OogkVdBFwDuJc6lyYgOQnz7gROCMgZ9LkkbXR+y0eiKeN3PnRYDFmA9cDkxNHUSSSmolcAzw\ + w9RBmsIGoDh7Ev/H3iZ1EEkqmUeJD0r3pA7SJC4BFOceYF/g9tRBJKlEbgf2w+JfOBuAYj1B\ + 7Bp4ceIcklQG3yTOiYvSxmgmG4Di/RU4gXiS1QuJs0hSCi8Q58DjiXOiEvAagLTeDHwXmJ04\ + hyQVZQnxQJ+bUgdpOhuA9LYHriSeJSBJdXYncBTwSOogcgmgDB4B3gB8LXUQScrR14lzncW/\ + JJwAlMuxRCPgfgGS6mIlcBJwWeog2pANQPnsSiwJ7Jw6iCR16UHgaOC+1EG0KZcAymcBsV/A\ + JamDSFIXLiHOZRb/krIBKKeVwAeA9wHLE2eRpHasAN5PnMNWJs6iUbgEUH6vJJ4j4F0Cksru\ + TmI//z+mDqKxOQEovz8CBwLnAXZrksqonzhHHYjFvzKcAFTLwcTWmdsmziFJg/5C7Oj3s9RB\ + 1B4nANVyI7A7cGnqIJJE3Nq3Bxb/SnICUF1HAxcCL0sdRFLjPEPc239F6iDqnA1Atc0hdtea\ + nzqIpMb4IfAhfIJf5bkEUG2LgMOJHQSfTpxFUr09TZxrDsfiXwtOAOpjC+DLxNKAJGXpSuAU\ + 4MnUQZQdJwD1sRh4N/GkrScSZ5FUD08Q55SjsfjXjg1A/VwFzCMeKrQucRZJ1bSOuL5oHnFO\ + UQ25BFBvryf+Ee+eOoikyrgXOBm4LXUQ5csJQL39J7A38E/A6sRZJJXbc8S54rVY/BvBCUBz\ + bAecDxyROoik0vke8FFgYeogKo4NQPP8LfBFYJfUQSQldz9R+K9PHUTFcwmgeW4AXgOcASxL\ + nEVSGsuJc8BeWPwbywlAs80BziYe5DEhcRZJ+XsBuAT4F9zMp/FsAASxHHAecFjqIJJycy3w\ + cWLsL7kEICBOCG8beN2XOIukbA39923x14tsADTUtcT1Acfj1cBS1S0k/i2/hvi3LW3AJQCN\ + pJd43OcniOcMSKqGJcCniceFP584i0rMBkBjmQqcTqwdTk+cRdLIlhHX8pwPrEycRRVgA6BW\ + bU7cL3waMC1xFknrrQAuAD4PPJM4iyrEBkDtmsn6RsCJgJTOcuIR4J8Hnk6cRRVkA6BOzSCa\ + gNOIpkBSMZ4FvkTs6OknfnXMBkDd2gw4kbhOYOvEWaQ6e4xY3/8GMfaXumIDoKz0AscBZwI7\ + J84i1cmDwLnApXhVvzJkA6Cs9QDvJK4TeFPiLFKV3Qp8AfgBsC5xFtWQDYDytDdxjcB7iAmB\ + pNE9D3yHKPx3Jc6imrMBUBG2Aj5MXCuwZeIsUhk9SaztfxV4InEWNYQNgIo0CTiC2GHQ5QEJ\ + fk7s2Hc1sCZxFjWMDYBS2ZVoBN6H+wmoWZYB3wK+BixInEUNZgOg1KYARxMPLXkjMC5tHCkX\ + /cSn/YuBK3GrXpWADYDK5FXACcRU4OWJs0hZeJz4tP9N4nY+qTRsAFRG44G3EvsKvBOYnDaO\ + 1JbVxK17lwI/BfrSxpGGZwOgsptKNAHvBQ4FJqaNIw1rLXA9cDlR/B3xq/RsAFQls4B3D7ze\ + QEwKpFT6gF8A3x14PZU2jtQeGwBV1RbAu4AjgbfgZEDFWAvcBFwFfB9YnDaO1DkbANXBTODw\ + gdehxLKBlJWVwHXANQOvZ9PGkbJhA6C66QXeDLwDeDuwY9I0qqo/AT8aeN2Cm/SohmwAVHe7\ + AIcBhxC7D3pHgYazmrhP/zrgWuD+tHGk/NkAqEleAhxANAOHAnsSTy9U86wD7iEK/vXAL4G/\ + Jk0kFcwGQE02k7ib4CBiOrAXMCFpIuXlBeBu4lP+zcTV+67lq9FsAKT1NiMmBG8E9gf2xecU\ + VNVy4A7gdqLY3wasSJpIKhkbAGlkPcA8ohl4HbAfcU2BtxyWywvEQ3XuAH418OP9xJhf0ghs\ + AKT2vATYjVgu2BPYG9gDLy4symrgXuA3xBr+3cB9uH4vtc0GQOreeGAHYjqwC/Go43kDLxuD\ + zqwGHhh4LSA+0d9P3J7n3vpSBmwApPz0ANsCcwdeOw75+U7Eo5CbbDXw0MDr4YHX4K//giN8\ + KVc2AFI6s4BtiCZhu4GfbwNsTWx1PHvgNS5VwA71A0sGXouBx4BHB14LieL+KO6dLyVlAyCV\ + 23g2bAY2B2YM85oy8JoMTAKmERcrbnwXwzQ2fYhSH3HV/FDLiH3vlxO74K0GVg28lg7zeob1\ + RX8JcWGepBL7/+6JvSCr2fnsAAAAAElFTkSuQmCC\ + " + local bubble_png = + "iVBORw0KGgoAAAANSUhEUgAAAQAAAACACAYAAADktbcKAAAHH0lEQVR4nO3dy89ccxzH8ffz\ + 9F6XXrR9tK6lLXVpVCQkLhGhIWiIRF0SG4S9hJUVGxaWNhb+AItKBGFh04UgIihBVJuWtmir\ + V8VDx+J3Js90OvN0fmfm9Fx+71cyeWaezuXbNt/P73d+58w5Y61WC0lpGi+7AEnlMQCkhM0s\ + uwDVy6pLV0Y9/8cd2wuqRKNgACQqtpG7jAELgGXAcmACWJI9ngCOAS8Bh4arUkUbcxGw3oZs\ + 5HHgLGAhoXGXAYuz23kd9xf1uH+6zce3gQfBWUCVOQOogCGbGGAWoZHPJTTu+cBFhGZtN+yi\ + rsfnAecM+8HTeABYD3xR4GdoSAbACI1gNJ4NzAPOJjTpBHAhsJLQsN1N3L5f1cXcRzAAKs1N\ + gB6GbOQZhBF5LmFUXgAsBVYAlwKrCVPt7iaePcyHVtTnwA3gZkBVNXoGMIIReSahMecTpteL\ + CKPyJcDlwFXABUw18fxhPrCB1hP+HU+UXYh6q00ADNHMY4RReSYwh9CkCwlT6uWEZr4CuIYw\ + 1V5MGME1vHHCv/fRsgtRb6UEwIiauT3FXkiYYi8njMpXEkaeK7LnqlyLMAAqa2QBkKOpxwgj\ + xCzCyNy9vbwSWANcB6yjugtdmt75wK6yi1BvAwfAgA3eXgCbT9jFtJipZl5NmGbfhNvKKbkI\ + +KzsItTbQAHQ0fyzCCvZa4C1hBXeVcDFhJFb6nZ52QWov5hNgHHge8JoLg3q6rILUH8x29Wr\ + sPkVb13ZBai/mABYXVgVajIDoMJiAmCisCrUZDNgJN93UAFiAsBFPuU1VnYB6i0mAJYUVoWa\ + zgCoKANAZ4JHZFZUTACY4srLAKgoD6/VmWAAVFRMAMwprAo1XW2+dZqamACYV1gVajq/Xl1R\ + bgLoTDAAKiomAPYXVoWazgCoqJgA2FlYFWq6Jp7vsBFiAmB3YVWo6SbLLkC9xQTAnsKqUNP9\ + XXYB6i0mALzMk/I6XnYB6i0mAP4orAo1nYNHRRkAKtpx8MIgVRUTAMcKq0JN5inBKywmAFzI\ + UR57yy5A/cUEgLtylIe7jyssJgD+K6wKNdnPZReg/mICwMsIKw+PH6mwgQKgYwXXhUDF2lZ2\ + Aeov9tuAXxRShZrMy4JVWGwAbCmkCjXRb8DrwDdlF6L+Ys/U8mUhVaiOWoQm3wns6Pj5HbCV\ + jt1/HgRUXbEB8EMhVagq/gL2Ab8Szv+wj9Dkv2f3dxMa+5fsd/9O92Y2fvXFBsCOIorQyLUI\ + h24f6PrZef83QlPvZ6rJoxd5bfJ6iw2Ag9ltYQG16GSHBrj9wamNfYDwf5SLDZ2W2ABoAe8B\ + jxVQS5Mc4dRmPdjjd/1uuRu4zUbWIMZarcGP78ku8Hgf8E5RBVXMFmAXoaHbt8OEBj3S49Zu\ + 4KEPmrKBdSbkOV/7u8AnwI0jriWvvwkNOQlcOML3fRl4Me+LbWDVQZ4AaAF3A08ANwCXAWcT\ + 1gXmEq4fcG7H848AJzoeTxIWm7p/Hs+ee5Qwyh7O7h/l5BG2/buDhG3ev7L3fR54Jcffp5fn\ + gNfARlazRW0CQKWv8/45cP2Q73ECeAp4E2x+NV90AFRNFkhrgO+HfKtJYBOwGWx+paEp12zb\ + NOTrjwEbgY/A5lc6aj0D6Ngc+RZYm/Nt9gP3EhY2bX4lpQkzgGvJ3/y/EBY0t4LNr/Q0IQAe\ + zfm6bcAG4Cew+ZWm2m4CdEz/txF2RcbYCtxF9o01m1+pqvvlwW8kvvk/Bm7B5pfqGQAdo//D\ + kS/9ELiT7Eo1Nr9SV8sAyIwDj0Q8/y3gfuBPsPklqHcA3AysGPC5bxAWC/8Bm19qq10AdEz/\ + B/1K8qvAM2TXNbD5pSl13Q04A3hogOe9QAgAwOaXutU1AO4Elk7z5yeAZwlTfxtf6qNWATDg\ + 6v8k8Dhh0c/ml6ZRqwDIzKH/9P848CDwAdj80unUMQA2AAt6/P4QcA/hQB+bXxpAbQLgNKv/\ + ewnB8DXY/NKg6rYbcB7hYJ5O24FbsfmlaHULgI3AWR2PtwK3AT+CzS/FqkUA9Fn9/xS4HfgZ\ + bH4pj1oEQGYB4cw9EE7ddQfhbD42v5RTnQJgI2EX4GbCav8xsPmlYVT+hCAd0//3gT3A03hc\ + vzQSdZkBLAa+Ap7E5pdGpi4zgDE6rrdn80ujUZcDgVpg40ujVvkZgKTi1GUNQFIBDAApYQaA\ + lDADQEqYASAlzACQEmYASAkzAKSEGQBSwgwAKWEGgJQwA0BKmAEgJcwAkBJmAEgJMwCkhBkA\ + UsIMAClhBoCUMANASpgBICXMAJASZgBICTMApIQZAFLCDAApYQaAlDADQEqYASAlzACQEmYA\ + SAkzAKSEGQBSwgwAKWEGgJQwA0BKmAEgJcwAkBJmAEgJMwCkhBkAUsIMAClhBoCUMANASpgB\ + ICXMAJASZgBICTMApIQZAFLCDAApYf8DcD99Gl27kUkAAAAASUVORK5CYII=\ + " + local inspector_png = + "iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAYAAABccqhmAAAgAElEQVR4nOy9ebwlV1Uv/l1V\ + Z7hD973dnR4ydyfdhBAyQBBMCCBDngJRGcWfT1QEUQH1Z+CJgk9BHjjA84GATIrTD5+oPPzJ\ + E0UhAWQMICRkAEJC5nnovt13PPdU7ffHrr1rrbVXndvEO/Tz1urP7VOnag9rr+G71t61qw45\ + 59BSSy1tTso2moGWWmpp46gFgJZa2sTUAkBLLW1iagGgpZY2MbUA0FJLm5haAGippU1MLQC0\ + 1NImphYAWmppE1MLAC21tImpBYCWWtrE1AJASy1tYmoBoKWWNjG1ANBSS5uYWgBoqaVNTC0A\ + tNTSJqYWAFpqaRNTCwAttbSJqQWAllraxNQCQEstbWJqAaClljYxtQDQUkubmFoAaKmlTUwt\ + ALTU0iamFgBaamkTUwsALbW0iakFgJZa2sTUAkBLLW1iagGgpZY2MbUA0FJLm5haAGippU1M\ + LQC01NImphYAWmppE1MLAC21tImpBYCWWtrE1AJASy1tYmoBoKWWNjG1ANBSS5uYWgBoqaVN\ + TC0AtNTSJqYWAFpqaRNTCwAttbSJqQWAllraxNQCQEstbWJqAaClljYxtQDQUkubmFoAaKml\ + TUwtALTU0iamFgBaamkTU2ejGWippf8otH/fvnhMIADADTfftEHcHB21GUBLLa0uPYtA1wOY\ + 3mhGjoZaAGippVUgFv1/yjn3MACXOjgc2HfaxjF1FNQCQEstrR51AVwMAhzcywjUc3AbzdNI\ + agGgpZZWgxxAoMfDYWs1/9/t4H5go9laiVoAaKmlVSLn3NOJqPoCEOgFcMD+vfs2lK9R1AJA\ + Sy39OynM/4nomc5VKb/HgR+GnxYcs9QCQEstrQYR9ju4cyvHBwA4uCkiumjjmFqZWgBoqaVV\ + IAL9iDjh4l6AZ8RpwTFILQC01NK/g0L67+B+BPBO7+BARKimAz/g4MQmoWOJWgBoqaV/P50D\ + 4Hw4IK4BAKgi/7kAdmwQXytSCwAttfQQKWzyIdAvEMg7PAHh1r9zDg6OADxpw5hcgVoAaKml\ + h0gODgTaB+CnnXMi+gMAyE8JCPR968/d0VELAC219BAoRH8H93bnnL/VF9b6/E7AcB0Angjg\ + mFwHaJ8GbKml74LUE3+vcnA/FNL+sABYXQPgAcDBPRr+4aCZdWd4BTomAODAvtOQ7Jm2tlBT\ + wzWqBQ4c+49gtvR/J7EHewjAqxzcW+AQ7bKaEsTyDAwyAE90cP+wjuweFR0TAFAJ7qcd3HkE\ + mnVwQyI67JwrQTgEhwKEIwRaBjDnyC3CYRHAPAgDAs0CGAKYcXBOp1oRjfkcjd+adbDPK+II\ + b7UPtODzH40MW3o4gLc6555BRHDk+DVvHy6e4PQEAMccAFCycLHOxKL/1QQ6O6Bo/HTVPVUm\ + WL6xIjqkQ10OmCHQ0MHNEmgAYB7AEoAF59wSCAvhO4AlAi0455aIaAHAwMHNEyj5rNppOl84\ + uCMjB9sENN+NCiyAOop2b7zl5u+ik81J0dlTeU4AeAaAnwTwQ/42v3J2IN77Z3bIpwKfhsOT\ + ieiYChIbngFUjj4O4BHc+QPFDRWExugs6nggmK6OjwsLMnyDRuy7ajdu3KgUyvvkQBT618DE\ + Aasa02EAjkBzAJYd3CKARSIaOudmq2KHKjZmQRjCYRGERQBDOMwSkXPOzVTTmyPOuQKEBQIt\ + ObiCQEeqMft6PhU9AqDwUsBMNTcdAJjfv2+fnQmNoqZs6GgyJquMcS7Jqo4yG0vKAnzzTXO/\ + mgi6z5yIHu6cOw+ERwH4XgI93sF1I69U206wp2qu74/DNWmXjyWi3MEVK4xqXWnDAQAAHNy5\ + AHLtWAIImPEGJVS3WERbYtslc+DQRjAQIhLKE/wwBYbvuqwFEuz6VFVvmoiiIXC+Q1kOLvE8\ + 1X0YsuJfar5IzT8Dz5K/eQDLFe8zFcgMAcxW50JmBCI6Ap/VlAAOR/mhyqDque8ygDk2Jl+e\ + av4c3AwAx2Q2C2DI9LLg4JYIFJ2LR1Heh4iswRGBjIimtF4q6hLRpHOuC8IkHMJnh4i2OLhp\ + ELbB4XgiOtk5d8CRG+My5rLlIMApyj6sBzhmvz54TTi4swFclSh1A+mYAAACPdrBScVVBkbw\ + 8yyRBfAV11DOSMm4MqJ+yHASdsyVzcFCt6OzBu7c0eGY8ymAkGNMjTaJIiLbMKJP5IkZIs+K\ + qtMTLMuZDmMLsud96PHGfhjPjRQcn5yoE9tzkndr4UzIxwBJrgPejuWcQR4CQHi67tI6/Lrm\ + 05yaWvUZWFXlL3DOHVMAcKzsA3hMo2KdEwaTOBYzxHAtRPf4j6jenVUZO0/lQhmePnLA4UYT\ + 2qjBnUQ6y8cQ2ksyDO5wipfAD2/PnBapNhMncixDIlnOdF51SmdZkZcRjh90lfBAJD65TCLf\ + YTjOHl+UG5MrP6eLJ+1C2lUYSzjHwYPLm7fPbUe3A4c4Xj6+aCde149rFN4G0YYCwP69+4Jg\ + H8UNQiO1nmsD8PWCMiCnDOE8NxatMO4cIlVzdTbA/1nTkdCXSSwq6NRV9KvAI/JJcl6ZGDI3\ + NIOFCC4uXVcR6anFd/h0UpZJO+xf4Jl/arCIZanuJ9EPrxL0weqI1N/VfCbzf0iwE9M55aQ6\ + 6+DP9POMioMYl2G0F/kykGTsAC4Ejq0NQcdCBtAl0Lnhi1CiQ2Jw8SufKrBPEWl4U8HQAlgw\ + 8Ij9MKfVkUYrlBucBhIdwQWfSNNJ1om4rq/pqKZePpH0AZbBaP7FGHnUZuPjRh3TcEsWqAFa\ + 36ExnYzxzOUo+GTOLkCTZWzg0yAG2hZp/iIQ6LFXMtPy10GGZ5XWtFJnlhX/Z4L8+tCxQhsO\ + AER0FoAeR1qNwPG7U9EbdpSpG4eMSgokQvmozBBl+HfWpgajmJ0w/rghiXo803DyGh8jj1DW\ + mERbARQ0KAZZaRAJxUjKz8qIrIzHWvE2+WP1rOyJ88Xn2aJty4+5TtKn7kbyJWTO++TOzuxD\ + Z5Aa3EW/Tuo5dsmymwpoiUDfY4xsw2jDAQDAY/SJBMlFIGUpqbE4x8vFKOJPJMqJBsoMQsw/\ + k6CVpt0RCIKTgJIshn8KwGFtRmfGCim6Ij0fjVGUObIwaOYEcSysTwt8BJAZ6a0AmpCWsz7E\ + OBvGl/TNnZGtk8TzVGdu+poYFwPkyAu7y6QjezImlXnp1D/yEsbIwVjZZNVvYu8bSRsKABUy\ + PtoyhqRspQxRLjyBRaxMQxTWaVroh6N2Ei0NULGiaowUIUXVC5BIMxft8LF9fntSpdz8u3Ao\ + 2OeDs+qsgmcPnB/dh+UUyTFzQnF3wtWO1sSrPhfLWmk5ahvgfYlx6zEZU5tQV2SRoU+dcWqe\ + +TwftU6tvQc8uAS9Vu085iixfV1owwDgwL7TQETI8lzcAQCQpGIQ8pVzL77wIqYK7B9XOl+w\ + Eako6yQ4rpU+x7IaNKiux9N5UQYqKhsLlKEMBzwuAyv6xsjEohN3lghMTHaxrwCiruZf886j\ + JI+eYdwWX6Fvkeob8oxgwR2SlPxZVsHHpgGfg5apO549MFnzdrm8mjIYbjMc+BOggbPG8RgA\ + x8wPhmwYAPTHxuCcyzqd/DH61kpy71UZk3U7CcT+UCtHK0XUqS+or7bymyK/dpLIO7vHbhLZ\ + Bsj7005hpatRZhZeMaPnBimcRdXlDib6apgSRSc06phpsso2eN9JNqhBkjm8uE+vozbbN2Da\ + jbrlqm2Mj5nrlstfgILO8Ji8RMZCOEBhp+oxQBsGALt37cT0tm1nDgaDnjYI7UjVgVQBQ2hS\ + /1DNB/n92agXShXKie870Dw0RReeeQASwEQ5HhFVW4njKGBgFxAzGaTpKueJZzLW7cAIrkZb\ + Gow08euWcwY+9QJdyGb0uo11Szc6uAYMzjsHMS4rgrAZIRslZ3EnxLgtGcdp6ErvMbH443qo\ + 2njM+MSEKdf1pg0DgOP37MHjL3jsC4KD8sighZ2gqjPSxHhZpZ0k20mimr8o22lwClHNMHAO\ + LqHP0F6oExyAp686kwh1NSDqLCn2yeelkIbLxySuQxpnzFga5r8BRMX0ximjHxXlwXRJdcQU\ + IKLlY0RlDWhajpFnJ+XCeY39EdMpCxChrJUthTFpnqLONOAY+Hzy3lOftH3H9vTCBtCGAcDk\ + 5ATK0j2Np7aBtDKj4TPH52mgFrpIDSsnSVJx5cy6H+FATrYDyOvCUNSUwBdN97CHehbp1DgY\ + eXLdSMmtzIHLin9vymQSgAy8skzKWqwMPFlZVXQO5xJHEdG+GreQnZ7KuVQXiaOSMU6nxhhA\ + gk8VHERg4XbD6ySAw65rGepsc8/u3Zds2bo1kfFG0IYBwAMPHsS9993/MCsVBlCn7ghfpbFw\ + lA71dESL7UBGa+6EXOGRB74wxQwk9sMWzTR/NftpRNfTCmsOyinJQFCPWY9PrN4z+Vgr1Lx/\ + kX2osfL2myjKMgyfp8TsrgDbDJOA1KjsL+HbAj/m2KIeG2vgI/Rv8RL6SqaXPNNs4DOZEozI\ + ag8fPnLm1MQ43vf7vzNCsutDGwIA+/ftw9axLr5z083HcaQVEdRK8VmaZt2CSdJ7lR5z5+NR\ + NTqDEQGtaAhAZBhJJHByGiLKOdkGT3Hj+FVGJMbO2hd3QXjKTaidUohPOpaIuNbeA51Gh7oq\ + ynFw5e0KHakpSBKxneJBpfXCAcMfZBCo2bZ3WorphaLYN8sKdJtNx9wGdSDgU5RA37nxxi1P\ + ffxjtw+Gw4SP9aYNexrwc1/+av63f/i7N/U6+cPmlgZwZXAeYHZxKZYbDkvMLy2hrK4vF0MM\ + hkV0ucHSMgZFCarOzC8soqyUWJYl5llby8tDLC7V35eWhxgMBtGA5ubnURYFnAOIgEMzswgg\ + PiyGOHz4cKy7uLCAubk5MaaYhai5dHR85pgmMLm6rrUIGR2GOzuYo6nswJpaJSDAHJSDVhIt\ + Q3vKmZtAQwAgyQzNkpkAODYOwZ+ecqhsRThww9hE9y4dkx6zmJqwejGrANWPb7OxCOBj34kI\ + w+VlzC0uPdc5935sMG0YALzn9ZcWjzptT887Bg9XKmwFb/Rf6mvRCIiVUdfjtXBJaT/YbqJg\ + HX1J9sfrV9dml5YxLFzsd3ZhCaVzIAJKB8wtDmJzy8MSS8vLkdvBsMDSch0N5haWUJRl/D67\ + 4N/34eDgSof5xSUQCCWA4XCIpcFyLLu0PMBwWEYnmV9YQumKyO7c/EJ1jVAUQywsLCIIYmmw\ + jIXFJS8uB8zNzWKwXPN98MGDcEVROwcHpgBa7BVZwhkUyIVjrnJrDUNHeP5dZAjGqj2rVKf7\ + UeeyTugv8BUeC7emmLwtveaQTAcUn2HMR+YWnlaW5eYEgBtvvhnltZ9Erf2Q9sn0qXZEFj61\ + I3KAUNghysXzzHEpWAYHEFUPqj/BJ8XPLX32I7BE2DbZZ0ywDICBRtIu502TADSS407kECJa\ + Q3khZ6OtOG7dfqyE4bDA7GINPMPSYX5pUHXlMBg6xBTXOcwPCxTDIrZ4ZKHOxArncGRuAVnF\ + w2BYYHFpCZRlcHBYWhxguXSgysFmFxarZn36PVd9JyIMyxIL8wtRtoPBAEuDIYIeFxeWMCyW\ + 45APH56NWi/LEodmDkW+lhaXMDc7m2Rg1nqAXggMACLqkotTkAdmZs7dd8IebDRt7AtBooMr\ + Jw3a0c6BcK4CDe5MxOqHlLLJSeKp2oFTPmS0SHhuAgTnmrMTnlhwEBDjU30xkLEd1SAuE34u\ + 6dsYr5AFB8j6KwB08gzbtozJ8W8dGy2XUaCUkOobQMKLGIsxzgQUmwEt7V6BJID5xWUMhvUb\ + vWaXBihLF5s9sjCI/RRliYUlluUVpcjUCDQ3XK5BcKNoYwFAO3w8b6TkOro5di005ipgiDbc\ + EGmbphV1AX+OpbONfASndfw6d66mcRnGmfCl+uVltIys8QnnESmIqk81P1amEasbcuKOqIkD\ + YgRBBs6iKe3oXAaBHyUfDXDOpXqx5ANWRvRPqaxZmYmxDiZQZ3oRAHn9ZEyGXPzYp++dmUuv\ + rTNt/NOAzjrh6gsmOKjvPErG68yo+XXteNoIIk/BuBsiBOdDOIeK9NHodcQ3IjLnSzuc5TDJ\ + d3VO1FefsR+dhWlggXIIsPGofpzSGyDlz8HS6kumcYbu6Oh41tkLXCr7ANhxPKxPp8vzes6W\ + NR8z17lFPgvdvnt60r6+jrQhAFBe9yl/4LArGlikYFhMuUmqHBwbxjWLHFPciExDnG8wetEs\ + zy7Y9cCXcOQRBtHIA+8Do9vQwFhfsHkMUVDIkH2OTM1Z00kxrS9IGerIHM4nqbziy0rzLd3H\ + a6xsbMYpnYmCaTu6jABp3T/YGBrshH93OCb2Am9cBkA0DaIJ02i1Y/P0kYODkHX4oowNgO0Y\ + RkjUEVdHhtiucS6eZuARwC3wIiIL45M7gJ4GiDn5UYAX5zlxIAW0nFcoeekoyykBbAN4zTHU\ + p+o+WVndLnc2rQdrGhTbV32GskEnktHmfvk53bbQrR5DQyCSALcFYMFwg2iDAMABwD4ZGVSU\ + tpQgUlGehmoHhB1RdHtNU4BQ34qq1hw9GpZyajFkpwxQGXIy92RdJFkQ0u/m2BSfvG7SHmtT\ + g4gwcpJ1LH6S9QWjnBUpVyKRzutxKTlq3i0Q1KDOxxAzOBX9dZQ3p2kKaDRf9eeWox/82tAG\ + LgK606vPFaKFS4WcRGNKswbdhjyBkZEtSfcZwFD1X9KEkSHwMWljjEYR2AlZDlIZaN4A2/Ai\ + aLmaT82Tlp+OlMniJCTIjsqELH6E4TOeRpIlB0s+BoCbY1P88LFy/q3y1hhXkh/P1qz+6uu9\ + xmxhnWhjMgAHAHS6vbATyhiCs+bhVnSMKRoglGmht5m+hnoGooviTVGe2GUV3fn1kMHorEAb\ + rJmZqMisx8JZ0/N+nkGlhZVMWCZkyT6Mu0kGAqhYWRHNFWmgEWk/68dcwA0y0eV4G+FiOO9s\ + 2TVlBnr84Twvz6dzwZ6CPdRZzNQG+/8GrgG4KgPQcypZpjpoSLd4xLIQPy4o8nP62CIylGX1\ + zfoz552srJVexqHpyKTKcyBL0kxtkDxKGv1Y6yJmZFeZiwWyvFyUC2tDO0QCDAZw8ba5jqUw\ + ZBkzK2JtrZgZGtHaysKS9lRgigkAA/pgO1wn9RrWuN3J+tFG7gM4EYBC44qsFFJ/MmEuLQ9x\ + 3+F5PHBkHodmF3HoyBzml5awtDzEwuIAswuLGAyGGAyXwffoLywuoSj8xo48zzE+xnfvAUSE\ + yfExgIA8yzDe7wEA+t0uOt0cnbyDiV4XRIStE/6e8Hi/i06WodftoNfJ0e920OtkGO/10Mn9\ + jsFOznHXAD2RyjOj4XNzq644HQzN2WVjWzxjccpolR50PZMHBny1IA0mXf1BhPmlZQyWCywM\ + hlguCswvDVA6YHbRb66ZW1xC6YAj84twzuFItaV5fnEQt0QPlodwzmFh0W/D9uz6T/+MiAeL\ + LMsxMd6vWPPbmMf7PfR6XYz1+9gy3ke/28V4v4ttWyawfcsEdmwdx+7pSfTyTNqsmHYAiZPH\ + okp/vs5UIzitE20kABxvnhWo75SdOczML+ErN9yBa268FTfcegduvOlW3HTTTRgOl6NNJXvN\ + AaUTuaVTPHRS9RW3cargnzwA4yojqs7xevphnHBty5atmN42jamtW7F92zSmp7ZieusUdkxv\ + wa7tW7HnuO04YfsW7N25HVsnukgMzZwjs3M86o+cr44g7ejJfNwgUYRwxwNHcOeDM7jrgRnc\ + e+gI7js4g5kjc5iZncWhQzOYmTmCg4cOYubgQQyHBfQefv6wk34q0HoICWR8RtZYu5DbdJME\ + o6qr7aTb62LfvtNw+r5TcWDvSThn/6n4ngMnYWq8pyI+UG8zD2062YHX1Y4V9bDGtHEAQBYA\ + cCOVGcF1t9+P9/3dZfjnT1wWnT15SksrTTl81Le1T9ulD50AzPiUQfE+OYCE/d6873oY3qnm\ + Zmcxe+QI7ohBPjXqwN/pp+/Hgf2n4eGnnYLzH7YX5552AqYm+nWUj0BQj7dx7UAfC7DlWZUq\ + L1JjNf7q2q33H8HXbrgVX7/xFtxw02247hvfwqGDB1MdMTlwkLQeD9b65I9UWw8I8YePkoSH\ + OTIH+/AAk+iHbH0PBgNcf/238O3rr8c/V+PodLv44Ut+AD99yffhzJN3SdnyDC4BUAcAOzY6\ + A6DGF1auEfmHgAAQLcK5fi3kZiT8/y77Cn7nD96TRAntmNpYwrlYNpBC/MZMgF23jFa0pcpp\ + Y+ZAwh9BtQAieS8AM/g8z3HRRRfiqRecj0se+whMT/SbHZozyNNTnj3ozKBpymXQt+96EB/5\ + 3JX4xKc/jxtvvJGJV2VDirS8w9gTIGzI6KxHjXl71jsVEt2o6ZSVFWpdNZZ1Dr1+D7956Svw\ + o086NzA9WraefgnAO7JHPsWU73rQRgHANgAHZcqk0lsAIOAvP/k1vP4tb4+XkojMIgUyQifv\ + VE3Jl1QEchUy+4c4KgWyR2+rQpBn/GO4FrhoIwt9NBmOalVc087S9Ax9OLd7zx78+i+8GM94\ + zBlKjjp8se86tbeMNDJgO/7cwgC//7cfxwc++CF72sS6tbIqfV6TkB+ALM8AEMqyAGUZqDrm\ + MtLH8bvmj4GD+Vgzd3wVRPg4LBDJshzvetNr8bTzTvcdWmso8vh1cO4Nmw8AiM4A3LcajbKi\ + G+8+iGe//DVYWlwSCut0uxgfH0e330en00GW5VUzJRwcymGJ0vln4l3pUJaF/3QFUCmuLMuY\ + ppWleqtLWECKZQAQoXClGb0ACIMM15NsAbaT6AyGU1N/vNwbf+2X8aNPPC91WLFAxR2dZwFG\ + RhA7T510fnEZr3znX+Lyyz+dOJEFWHmeI8tz5HnOmiVQRpXcgpN5/XlHLytWXPrJwLqMAgwt\ + 1JJxZSn4aZziWZG/atYMIEZWx4HmxJNPwt+99Teww3pQiNu5P/dOwP1idtbGAcDGrAE4tyO9\ + PZOmse/5u09gkT3rjYxw0kmnYHLrVpRlibIoUJQlisI/d14UJcpi6CNGAZTkTSRDjhIFsjKL\ + L9qgLAPKEs4BWeaNLhhg1FWWiewgB8XMgGL6UX2ryurnv/ULPuO1YHRUG5W11mCmxpBtvfFt\ + 78V5p/83nHnyTunooxb9CEb2pcvp6QPw/o99AZdf/mkmg7ro2MQ4+mN99HpjyPIMWd6BK8sI\ + wM45FPGYAXR1jNJV+shQlmXMAvgn8hyuKAAiZEamFrjy+mCgpNcMFFCHMnoKmAB5AAYO2mx6\ + eOcdd+B//etX8dJnXigVyQUf23c7jQLrShu1D2AHANS3uxhV3+96cA7/8I//XJ3zHyedciqm\ + d+xAnuXIsgxZ7j87Hf+IZp5nyLIcROQNEFmMNlmeg7IMebhOBGRh+A5ZloEoQzD66EMZE1Go\ + J6JOzX+WZf5S1K+/HF+R5bxD67fJ6BQzLIj5Lo1UVCQQDkuLi/jjj1zOZOVidpNWqJgKTi2A\ + WAMMAxLncP/hBbz/L/9a9N3r93HiKafiYY84C6fsOw3H7dqDLVNT6I+NI88z5JnXCTI/Jetk\ + OSgjEDHdxOMsyj2r5M7fLxi5yvMIdBllET7rMXiJBd1Z60AOHpACCFsLygl4OyTtxOsBGBzw\ + j5/6fGhAyZ2V95nATgPT15U2BgCItkcDbZiDXnbltzCsIjuB0Ov3sWvnbnTyHJRnNQhk3nj8\ + 3L9yfA4ClFUGR/58ZXCAQ0bkjanSYA0CXkMJCIT7yAwogsFVcccDjTLauHqNGgys98wlaadL\ + jTbU5WDg4PCRf/wY7puZj7yLVDNYqM4OnJY/y8JctPaYun70iqsxNzeH8CaeTt7BgTMfgeN2\ + 7kS/10ee+VTfy7rSTQUCndyDAIg8CGcwQCCrQKDWB5ejSFQCCDiHnOlMg3LQnZ7q6jsF1tuT\ + xRuO4eqmFQCHOiGLuOaaa3DHg0fSzEoACQHOnXD5l6/e0J8JW9cpwIF9p+HNr34Znv3kx+0Q\ + t0eMtPXr3765+upTrN0nnIBOr4tiOASIMMQQWSXw4XBYu6NzyDs5UJCfDnQyYFhNBzI+HchR\ + ugIZAS7PffruXEw/w3vzqIoElGU+9awoi9MBPw7vnNUQsiyuCfgSFRBQHf2T7DD6HgMKI/rr\ + 21nB8FxZ4vPX3YRnXXBWbCu8webI4lIU8aAokREhJz+2TpZjvNdBv9vBeC9Ps7IIFMAXv/5N\ + kfzsOfEkjI31UQxLOAA5aicYsjfelgCoAPIMKFEAJZBnHRQogDLzJTIgKwkl/FTPFb6jpukA\ + 4EHAFYUHZUBNBwI5v95QQiza6bWKxkVJklO2eMuRtSUWF6vzl331m/ieh++z2/QMoHDlCT//\ + +rf2ut3uoLng2tK6rwG8+s3vnr5vobjo9BN3jyx31TXXifnVtu07kGUZXFhM6nQwJKAcFsjz\ + HAV8OtOhLobDZeR5BrjcrxwTIadq/p/JNYHw4k5kBFcCcKUCAYZRFVAEyohQOhf9uZ6B+hXh\ + siykkTEgiPe19Z0CYve7AZEVWAta/Nzb/vSDeP+HtuCBBx7EoUMHsTxYTue7MAy6uj42MYbt\ + 23dg29Q0JrdOYue2bThu+zS2TW3Brm3T+OIVXxa87ti1E3neAdwQBGAIoEMdFEWBTqcTQUA7\ + Vwn/ktIcuQKBDFlJKFyBLIJyyUAgq8bOMupqLYfrAxA5ADwIZHAMlLk8hBzZJ9eZlnVj9lDV\ + eeP/eJe8HcnWEVibOyYmJ07as2vnTdgg2ohFwNPe/I73/iiAxACtVzAHoU1OTsbUPsYWl2PY\ + AWhI0QCpLNHpeBDI4rbNIcqiREaZWhgEsrKsQCBDljmUMfIQyhA1WCYgrM+5yuiAehrgyzv4\ + LaccMPQ9/WgULOon542IJQwpoA8Bd9x+u+grrjtQeitRy9vBYWFuAQvzd+DOO+5IQIPPcQEg\ + y3NMbZnyi3oVKOcACgKyajydjgeDomDLLb3XR8UAACAASURBVBWVZQEQkGccBAogI+TIUbqy\ + cm5rYRBRH3FhMIAAgDJJsRgoF0WM6np84Y3GcVFW6SUCA4/81XcOGoEvkbUEUFesPeuSp+84\ + dPDgpgKAZK7L58caZYMR9/p+7/ZwGchzxxvC0A1BcAg3mhwHgQyA81fKsvRRP0wHKICAX4kO\ + 6wZl4e8GyLsDjGcicYswI0LhwhRARdesvq2llS9SfB7RSRpalJO6h83LWtHLMk5BJEEpvtKb\ + 8xmmuHHs/ly/30en2wHYb1s450Aux7BDoKLw0zF2+y86TtVWPR0IIJBDTgcQI3x9t0beFYhO\ + GqZoRMicBwGekQXZBP2KsUb25Iq+0BUkCDTuDSBmv8aYI6BX1/eesHvHJRecG18Mkp315FRP\ + a0jrAgBh999rfvY/43fe9z8TwQrDVYIPRt7tdNQtap8JODf06SZqJRVgmUAxFCudJSoQqGaM\ + WRamA1RnAjmx9JNQlhnCBqI4HeC3CJ0Ttwj52GIfpRF5AhBSbUB8cU+sfIPEO/d5+7E99slT\ + zv5YH5Nb7HdPPHD//aL/qmGpCwdp0OQBOe/koi0i/6MXnSzHEA65y1EUformb/MByJzXgfMr\ + /oUAgSHLBDKfnYHgshxUFiNvETrn6ikakV+jYQYTsjMHv7Eo/hANVIQ25KtvRY7arxHKb52a\ + Qq96eGwUXXDW6T9+1im7ugA+Befmg6+s1+agNd8IFLf++uzsP339lntf+o4P/sNzQJTxLZ71\ + sU/vPv2vn4m77wDg4qc/EyBCMSxQlP4d80Ux9CnmcBlF6fxiYFGiKAuURYHS+Q0/w+opwLJ0\ + KAs/HXDONWwW8m5cOldFHt8/3ycQeAYQo05ApzT9ZLIoCzO9N9PzkBnojEJFF153//4DeNOl\ + L8HUeB8TvQ62jPf8cwOiYRXhqqYOLwxwZGEJc0vLmF1cxtziIu558DAOHp7FfQcP47a778Vl\ + l30y8jC5dQse/8QnY1gsoyxKLC8vV+l+gXI4ROkchmUBNywxLPxTevG6K/3+gKHfx1G6am9A\ + ae8TKEr/S1B8EbZpsxCAOjuLawKWTpwAASEPa+FPZQfJGgwrQ0R435t/E09+5D45ZWxaaPQD\ + uAdEfwbn3gbgbmB9QGBNMwD2vrOLQfQOAGeeu283/ujXXiKFYtwKfMqN38Htt91Wt1WW6I+N\ + ASBQEYTa8UaSdwAMgU4HBRXAsFLQsAAyoJN3MCyGyHOqhjyspwOwFgZLf3cgpp+OZQJhsxDV\ + UScYZkw/AZFbVlYTopcvWhuQTt1D9aZdhE0r1iecsBvnn86esbLAnar/CELuUxN9TE30UDtK\ + 5QlVmVvuO4xPXHZ55Hl5sIxOx996XcYAHVebkl92KZDDocz9wuBwOPSLuM6BHPksLfer9yiB\ + ggoQsUzAZUAZ1gT8Ym2Z50wfOhNgJhWmA2KNhuvEpzGUebsStwRD9oMUmPnUzFpA5GVOO/64\ + 2qbj2o5LQSCcI9oD4FdBeDEcngzgulR5q09rtg+gvO6TqKz4F0H0LwDO9FcChDZUrARy6skn\ + VaX9GsDi4iLyPEe300HWydHpdP1Gk7zjtwPnHWRU3X/u1PsAwj3pTqcLEMXNQmH/QE56s1C1\ + uSQaU9gPQGyfQHUtLA7luVB22CUQzIgbXty2zIyMRxCRhjsnrofyOv0MILJj23Q8Yzq/qhdB\ + IF4LXsQiZjWuHZNjkRcCYbC05Kc+eY5Op1d9dvzW38xv/80o8zrIs+p8Vm3d9vsz8jxH3vHn\ + c7ZZKM86lU5yhA1CGchvI8hqw7H2CURJM53Um7cI3PAckOgjZAMajDUQ80/A6yrc1dm9ew/2\ + 7pyqZSsyAOMc14HDLhD9AbA+LwxdEwAor/1kGOdzALwdgF+6dbUj+A/1yS4dOO0UAPVC1pHZ\ + I36jSTdHJ8+RBefvdioQyJF3Ov5atUswbEzxBud3oQHwRpd34l2CuBON6s1CedyQQskONTE3\ + D8anlrlz7sw6kmT1tbgzEHUaG92MzU15+WCQvDwA7Ds5RH++YKczEZLf1V0NUT+CAbB1vIv9\ + Bw5EnTjnsLC4iE4l8263h7xTg4B37g5yqnYDRnDI2AauCqAZCFAEgdr5iQiUZ8gor9Zo6s1W\ + NQj4z4zrhukkI66faj2nOg4PGFnbtmPG5aTsY7pfBahQhohw3jmPNKK9ZfsaBCjUuRhEPwis\ + PQis5U7AcTi8yx9WEZ8PWqSaSM6ffuIJVTX/75477vTOTj4L6Ha7yDvByTPkebfKBDxAdDod\ + UMcbVV5FHco8aAB+RdlHqsoIw47BLICAjzpAZVyZNLqjAYEspvDGklGmVpyroTv2T4gltFL5\ + cEhbOUDsP+l43gWYQSly0umJAUMwRm3ARHj4w06vMxUiHHzwQXQ7nej0XZUJ5HmOvNvxOshq\ + R8+yvM4E4rburN7KnXMQQAUUUNuGKbKnQUCwLUCgBmTHPl0AASUrndrzz6A7sZZTXXvs2Q+v\ + ZSsYCnKvPvnUhMvd058CWPO3Bq8dABC9CESVRfLIwy0e6nxNF519ujh17z13Ybg8RLfXRZbl\ + yLPMg0C346cDHZ96xqfPsgyd3E8XYrpZXQ/bhnkmQETy2YGs3nIMIKafR50JVN/zMN8UqadH\ + +yyXKSxiSWZkok5dRpDz/X7PgZPrE4mcZXnGeGqopDIDzwwefeZ+wcudd96OrALjCAIhE+h2\ + 4pOaIRvLqq2+ndxH8gASGWUMoHMf6SsQ6GSdWh8KBJDVdyEyIXeSMmVbuYPB8zQ+WmCYXjiY\ + OuDTMsucQzb31PPPrGWpM98AtkHGsREmfw8QOwG8EGtMqw4AbNX/+fGkMiSZY3FrrFPOfbum\ + cc4558R0k0C49Zab0YnG1fVpfTUd6FTTgE6nMsZOx0edLAN1sgocsrhOIDKBvIM8z0TqX2cC\ + FCNHvVcdsW7Ytw7Ui3OUy9tjPBPg5OegWR1p9BSdqI72MByflfuexz4Gu6bDj80ww0rSe0jj\ + i5HeKWOtyrmKUwIuOueMyIeDw3133YX5uVmfdYWsLK4JsCygmuvnWYZOJ6/e2yCnA3kesrRq\ + HYe87BGmbkQg4iCQe13mQR/VsxxBbuwTqECgGrdfo9H68MdZlrMZlJyG8TaT9ZpKRk964hOw\ + d9c0wDKD6PRivSUcumYdAU/Vul5tWqsMIAPcRf7QpcbGBy1QD+Bo+LSLHlcdeiV889prAPgd\ + ZgEE8rCwVK0J+KgeMoFOzAQoLP7FpwL9wqA3QL/glFVGIhYGw3SA8ooXDgJ8YVClijoT4GXU\ + PDzLcnErtBYHW5jin9Fgamd86uMeXcuYU5A310Hsg+lDRyUduRxw4PhteNSjHiX4ufGGG9Dr\ + df36S8gG8hzdTrfKCLpxYbDT7SAjBgLVNCCZDrCpgnyAKCwMViAQsqs4PfN3a4QeNAhUY671\ + US+vhjEFUBbrL0zWQrwMuAmE51x8EcScTqo66i3Rk/CHWGmvvZi7erQ2AEDYCwd/A9rF/9h1\ + lQGIrKBGw2dfdB76/bF4emF+Htdde10V5XN0ux10uz10wnSgWhPodPIYgTpdnynkeY4sXK9A\ + IEQeMR3IMkDNNeu7AyyyZmyVOVMppwaBSol15OHzS29kYToQrxElxhU+9S7KyckJ/OCF56R6\ + SFaa03m9iFS6DvEyntdnXfwkwc83r7kah2dmJAhUC4Odbi9mBxYIEFG8lVhnA3Vkb1wYDJlA\ + Xj/e7fXhnXokCITsrLpFKPPROqrHKQUXDdNd3H/AMr+zzzkb3//oM6AaTW3cmmLZ067jEiZW\ + mVYfAHxknBbzSZYqeWKGyAceU05//qTjpvBjz392vdBCwNVf/TfMzBxCnneRd7s+E+j2/JpA\ + tRbQyavPcKuw00GnMqisWivghtfp+Fd759VLLPIqFY2ZAIFlAtU5IBoawNcEXBwWoEAgRh6e\ + BdSfVEWeiIGonZNveIkpaXXtR5/7LOzZtoXJG/KYL/TpNLTKZOzNKlwv3oCf+/hzcOrevWIu\ + fMXnPw8Codv1GVan68Ggm3fQqbIynQnkVTYGqm/NikygAuzwXYBApqcDfmoX03zoW4Qyu+IL\ + g3myNlPrxGcMKSBbIAwH/OILn4NeJ4ew+WS6a0yzLFD2Nn8Ia0yrDwB+bKU+EWFRrwEEEoAR\ + qji89JInYPuOHSJt/uTH/wULC/PoVKl+HfE9CGR5WP3P492BvJou5NX7BMLCYFwTCO8QyAgU\ + MgEKawJZsk/AA0O4JVW9X0DsE6iNRKwJxMgjM4Hg1AFI9D6BcMwXnQBg565deOklT0rXUsQq\ + P9L5fTw0sgDGq9bLxFgXL3/h8xmmE+695y584XOfBZCh2/V7MuppWgedvBtT/QACeSdHJ+gj\ + y2MWFdcMqkwgrB0cDQh4UK6nWhGgrbsDQScU3g9RTwLqkdULtQF4+ZoAv1Pz7B++BE85J/za\ + nQZZ7uTs2JJ5OO9B5KbGMqtE+etf//pVbdDddzPggeVVIuoIQ7JAQE8D/PHkWA/bjz8Rl33m\ + i7HkcLCMW276Dnbv3oMtW6eqdlFPNyqBe4fxbYVn+oNyHOrUsH7qi73oozp2jkfrcOyd1j9A\ + xMck003+PbyCLFB4k03t3Kz9wDYTRWw3fK/+venVv4BHnX6CjPZ15yIaLS0XuPzq7+DP/umz\ + +POPfhof+uQV+OqNdwJ5D6funJZpr7gNKPV15sm78e37ZnHDjd+Jpw8++ABmZmZw/PEnotfr\ + eglVfNcj5E/JIUY7yohjGgPAqk5GlTwqOVfj52VAtZaS6RhbX7Guhes1KNe6cGCLuEz2nE4/\ + cABvvfRFmOh3pey1jSvbSLKDdFrwdjj8G+0+DWtFawMARAsgeiWc69VGyIyIKR8Ix2BGDIGa\ + Z52yB4fQxVVXXxcVP1we4sZvX4+Zw4cA+DcC9cb6cYHFL+RAKM2JqEhwBJAj1n0wTv8QkLCv\ + GPIcwjqyB4HKuKg2YqlnZnxsEQqx6dCJBBki8nvVlcHxh1Fe/MIfw0uefoGUrTl3B664/nb8\ + 8u+/H3/+wQ/j2uu+idtuvw133nEXrv3GN/EPl/0rvnj9HTj7jP3YOaV+tl7rpjr83rPPwGev\ + vgH33/9APH/40CF8+1vfBCjD2NgYxsb6UTZxxPqBpiDnIAXLSQIAOtnGKBCQ/Mp3KFjrNR4E\ + MpQIuy+jJqrriLoIYEBE2LHjOLzndZfi1J1TKsgZlGwO4sNMnP8BOPcSAIO1BIBVfxjI71xy\ + APARgH4oifZJZEEKCIAUlHMYFA6v/7O/x4c+/BGBxvyz1+9h2/bjsHV6GuPj4+j1evUtw6za\ + T14MMRz6h4WGReFfLjosUJbVgynVQ0TD4TKA+kWjZVmKF1jWDxCV7GeoyupR4koW7FHiMHQA\ + yWvI+QMrDg6uKOvshK0JeLH48y943rPwup/6YXQ72QjD8hU/cPlX8aa3vhvD4RAn7z0Vz3v6\ + xTj3YadiWJS48vqb8Dcf+Sc8eP8DmJqexn//9f8XTz77NMmwpRMAN983g59/wzvwneo3Afh0\ + hkAYGx/H8SedjKnpaUxObEFvrIdOp4OyLFEMh/HhoOFwWL3gtfC//VCW/qGh0qGoZF+WRaWD\ + EkX1wBecA8rqoaPSwTn/xCDXU/ldPEAU9BAfEoqZYfqoNQAcv+d4vPN1l+K8fXukDuKUSgU5\ + Pg1WAJ3o0LkfA/BBYG0fClqTpwH9cwB0MYCPC2FoEg6fHCRCGSwXeM9HP4s//OO/EK/cStBZ\ + UYj+nTxHt99Hr9/3i0z8xaG53KwDIP6WXHgizbPk/Cunyb/SOrz1pn7m37G3CfknEPn8u+SO\ + brwngEeYOrDVBphnGV7xsz+Fl//gE+s5rk4fmXF98NNX4jd/7w/g4PCfX/A8vOoF318/IViV\ + uf/wAn7jfX+DT1z+SfT7Y/jTt/wGHnvgpFQHqZHi3pl5/Nq7/ic+89nPCfnr47qKw/jEOMbG\ + J9Eb6yHPqlu3mc+Csqx+4WdZDr3oUDlo6eJj2mVRouBPEQY9OH89PFHof/uxemS4enKzrObz\ + 4I7OZO1Vkj6izsdx4YUX4I0v+39wynFhCsptR0UndhdFgIKuV+vxtQB+B1j7JwLXCAA+FVDw\ + D+Hw8kYAAGyEbKJKUVfdfA/e+cGP4tP/+tnqNMshoYAgOFCY5yllW4/W8hRP78PXkVl8hzJ2\ + BkY8Muq2rLLhHD/+3sc9Dq/6yefg0eGJv5iau/qYyXNpMMRP/NY7ceXXrsLLf+Yn8cvPfQqL\ + TtWgq++LgwK/9t6/xT/+07/gBc97Ft74kmdBGq/WQ113eejwV5/6N7z3Ax/CvffekwKammNz\ + 0mMVL4IJulVtRbA3ZKjPj6zP5CvKajNk/nzK3lPx4hc8Cy944qPQ62YiOxNR33Ls0FjUm76G\ + e+DcywF8GFifx4HX7H0A1Y5AAtFvAHgNgDEzUvEUV6RFGj2h6gFX33IPPv6Va3H1N2/E1668\ + EvNz876YMjTLCHW012/bCe0kBtpwrjphAkmCaXG8aaTUkefkU0/BEy94LJ75+PNxwRknHR1Q\ + sk7mB0P805e+iedddLbMxAwjnVtcxv/+0rV4/kXn+s06iXU7o35t0EcWBvjHL12LT33lanz2\ + c1/A4uLCigAQxq3l3ShfAHqdQL+ww3xz0ghwH7XA55zD2Wc/Euec9XA84dGPwBMfcRrG+9Wb\ + pI8mlWfyTW0/nMcigDfA4d2Av/X3f/0LQdiWYMA/E/BjAC4A8MjqbzRZKFq3x8oAAGFxMMTN\ + 9x7CrfcfxE133Ie7HziIu++7H3fdcx9uufkWzM3O+iojopC+LhyyAUCSlHeFzMLMTuBfsX36\ + 6afj1FNPxr6TjseZe0/Cmacej4cdvx1ZTpEjQ1BInHJUxNF1G6/pog1GLqZ4dag8srCM6269\ + B9fcdAe+feuduOX2O3DDt2/EoUOHRAQX0dly2BXkzkHBcmQt63rksr3jTzgBJ59yEk7cvQt7\ + du7A3uN34fQTd2H/CTuwPfz+4qhFPCEXPgWoP2yQcADoC3Du8aGZ9fypsLV/IxB/nNH39WwQ\ + /Z0oJFKvJpRsOOZkGX+l4NmFJdx/ZAGH5hZxaG4Bh2cXMLe4iPmFJSws+TfgzC0sYmFxCXML\ + C1heHmK2Ag2AsLC4iKXBMgh+vn9opt6jsWXLFnSrzUREhK1bJj0LWYatk5PYMjGOyYlxTI6P\ + YWJ8DJNjfUyO97F9agv2bNuKHVvGsXtqAmO9jhyHdWzJi5+rhSFlo9vQ5035BRka7WkjF9ka\ + z1BktnLvoTnce3gW983M496DM5idX8Tc4hLm5hcxu7iIudl5zM7NYbbK5gbLy1hYXPItKblv\ + m94WXzIyPj6GXtffhuv2ehjr97FlfBzjk2PYOj6OifE+Jvo9r4uxHqa2TGD7lnHsnJrEcVvG\ + a9kHngUwsmyUk5aTM66tBBqevg3gjPV+HyCwDgDAqfpdwJ8E8OcAjIilUls9X7XqHE3KNQIY\ + mvs0+ousNDglp4ZFOek4IwCuaepjOrI11WgyOsOhxdiMa1Y2MVL+zBmajF+tI0gAUXwlU0LG\ + oxkcrMzG4Oko1jdEP5xEGdjjFTpnY0zlcghw2wFgvX8ncH1/GYhUn0EI2smBWlBOfY91rCjF\ + ylrGqdtMjg2D0P3xdnlZgnGOUvBw1X+Oj4ldJEjD4m3zfoVBhn4JokFttC44QXCShojmwjXl\ + XFaEqwel+NFldLusnSATAdC6PrcVJeMwlsgr0rZifSOSw6VtCHlCnhcAGMZL6XhrZurx8/o1\ + H9sAdI3Ka04b8NNg3BlGRCNSCm8KaFEJkEIdlXoFJ4OT9eJ5ku1og0wVmAKVaJeUYbHP4Fix\ + Xzbm6KQjoqjlfMZh7DPKRPGkQZjLNY4fTEb8U41X8AckDhfY1iAWLvL2eASNIOTStonX4Uwp\ + J06yHSgRWvbJ6ocyZiBSdTiIRFBS12sf2JAfCt2oHwdNU7dASSocLzQYPKvDo4pIW1VEDcbv\ + dFnVd2xbKU47NQePpgwi8ML74VkD5z06P6TR6ClAKBvlxyKZHo8lN+2A1lRDRH4mM3Yq8ihk\ + otrhsrAyJd6gnmJw+fMMIMqd8a91KQdcy5oDPbcFywairJysJ+RujQVSpryo0LcDgF3NUW7t\ + aAMAwEBOK1InCOtgGzwjbXRBWaFevOZYe+H4KPkOhzrT4IFaTD94tBrRZpK2K2fiqXMwPp5h\ + hDoiauvrDd0n7YABEwcoHXW5g3DekbYljkfx5WS5mG0xpgVQaT6clLOZpSHtW+C0kzrWfYXr\ + wqkVyNpzfQVq4Md70qnJ2tPGTwHMNJE5qXAep5SjkbgiK82WBdR55jh6jm2mtZT2IbIVXVbx\ + ZY1dz7m1QWneefZgjV1EaxVFo2zTZm0jZAYrpgtI5SZOQmUBAbSQyiJ8Ol7fCBa8L2saEOTS\ + 5IBOyVg7JK8TQc+wLw54ISsRQK1sjOvbmkqsw7P/Fm1cBhC/cgdSDqkRN5Y3DD/JBniENvoL\ + jhkMbsV0lUcdA+nD0Hik5kCliTuMmc6jrkeMV53eWyTAiQMlb5cZqAavxGiZzMSnIQcOzKJ9\ + BpzcOXS50L6YtjTInmcocZxKBlouMaNg8kiyG36ByYpnBTwDEHpiPOixCZYS8NqRMrz2tM4A\ + oFCfCx5ojtikFKHntAGBtYE09cvncjpq6fqxPLumAYFnKtEAFL9WpmP1ZUWkOAxm8FbmY7Ub\ + +GbsJO3FcUAaqpVhCDkx5zMzIkO3Sf+QOuB9K/+X7eiLpApq0g7HHZKknHTQt6ZlSRZp8Qgp\ + Q5HdJO1t34AlgA1aBBRRzHBOgexGvWgcwfCYQ5gG6SAdRjuRihzW3C+2hbqNZG5v9KlTXdWE\ + bUDqewIeTsnHsT+osRkNW8DDQTWCnZZbwxhjJaTlV5r2CLmzvrnsCIYtBB5VtrDStE9cZzrU\ + wKerJnJwaVktC2Lnue5FNhZphwn6a0wbAwCm0CCdDQ3CFnMs5fjR8Ks6Ol3mhuRUm1Y0tOaR\ + ei7nGpTN02Qxp2SRyqm2dcqu5SIiiSaS9TiIxgyK9xMHxIzfKGNF7iZQ4P3y9jWwx3J8TEyO\ + DUmHHC7vEzJqC6BllUfPwREzN6fOc/AQ01TDRq0pk5Bvg41hU0wBmJC441kInggYhmIg64jr\ + 4bw2VCe/8rbDZ6OhOHlOtKGcL64rID0WUU+PkbOqQcCKcgwwzOkLb8cZ5xVo8jGFKEuBbw62\ + jNemKQsfT5Lp6Y4gZSl0yhrjmYk1B4cqn+glZScBcWsQWv96KhdE0BTcmsCpLn9c45RuDWld\ + fh5ckhsK5wdSoSVRR19H7SAj1w0gFRMVLbzMBhCrf8fqcscWvDDj1O2Jc8FoVH88CxDvBVOk\ + x55kFwYP3E8F+PJ+2XjjdRKnTVkLJzLGJMBMD4aNOYRyp6+jlleiJ2MsYroEo3+ll1A2maaJ\ + LzD1xjPPaAuhi6BLJQPnZFmH7Voq60EbAAA0K5SijZift+bj4PWUsetyTcfcOIQjN/SnvzdG\ + CqOedgwetURkY2XEMauvsw8dBTnACXBlRgjVjgl4QGK4TbKw1jpEGZaZmFEdSp8atHT7rK4F\ + Xsl0i41HABp3WMUzz3pAil9KeTf7U/Jwqn+mtqr9HfbUbm1pY+4CVCCfRiBu/LwaSYPQxi0c\ + w9VGw9NF3V7gp9HJlfEKxpFe48rV5+PYGupG0ZAyFM4TBy+SMtGgCcV77Fb16dhF4RhKCZaM\ + dNuyUaYDSF55e9y5+TRER2DlxyZoO9VuMr3QQDaCp8ib0a+eVgVgbnJea/qRTM0AgHasGFjW\ + gDZmDQBIjZyf58aeTA/Ysa/AK0M4B7HvGgx0NE1YVUYVizaBR5PjWqQALbRr1Y0GbkRRC0h4\ + H8ZhWp6DqMoUdHluuJw/7XgcjARYuLSNBMQtZ+J9BRmMACUNGLy/BISNdoT9qCIadBWLcixA\ + YgPN17bDrc9PgnPaiJ2A8+KrmHtCGTs7F8sqgzIXtpAaekDpBHgaDD6ZEuhPxquIXiMcqDFN\ + hgQ3q15jm7wxJ+XHTseyVvofIxu7ZgIOjLaVQ+t0nY9LOJUGbhhjNPQb9J/IVYOI4t/Su8W/\ + 6EvJmdtqFBfPXkLBJj2MAGzn+iBa9ycC1xcAfKQbxO9aYSIqsPOxvioTFBDbcraB6bmijkpJ\ + 2+p74IUDkI5yoYwYrHJqfY3LIYxFR50mo4lpJwc2Ne5EFsGAVeQjVU+3w8vx9nSGFvli0VWn\ + x5ZzWVlGwjNnTvHQZCOiTd2uq8edZJkKGIOc+Tmwc5w4kOos0wRyYfNTaYNrS+ufATh3REb9\ + RAhA4hwssojUS0UDx+rqCKGVlkQr1PUcq7fyeGr+Y/1gBOFPRTJhUIx3AUp8zMoJtCOi4Tvn\ + L3ZCzLANQ44yUaCjwUTLTqTgfGwGeImIaRCfjiRAQQ3jZvxZU7OEL64bY3zcJvU4rSDRlKHp\ + c3r6JO1gqyWOtaT1BwCiIk3FtOMbThkjS9JerYzoa0YEiF+dbahNcz7BF+/TUCK/ljiYYaA6\ + bbYiUeKkKnrz8hGMQjkNcGp8ScoL1qcFfisAYqzr2JCJsa4iYWNmw51fyU7UYWPVmRwrIj6b\ + ZJJkhLybEWjFx8zPxXpOlrMyl/r8tuaO1obW+Y1ABACHEkNvikThMzq4ZYANUSFeC/2SKC76\ + 4FmFnjNyZxg1D9bXtJGvZEQmaRComNVt6UgVMgyrywCiSbbVYMDWWKvma8fT5XT2o/jUWVOU\ + v3IWi389VdHptgkuKoCMBB42hKZrukCY5vBAE/XRoAe73f/oGYADAPWLHpAOmKRkYE7LI6WF\ + 1FCRVBmyRuAmQ3O6L3UxMRbVJqcYjdVnY8Ri/TZFoSRyO/ansxPIdkjX52UagMzqOzi4TmM1\ + byo41m2QLCPGayhEp/V8qtKIrY61G+SqxmSBaRyfdb7hnCVrfc0qLwFrE6wBwB3xH0A0IBGR\ + dBbABKudPRTXDsT/ABYhWUVzHslZLTbZ1wAAIABJREFUsBTO+zWMSGcWYpy8AIvYAmSc5FHz\ + Z41Lp8lWNhLaFqk145UUXxz8rDUBKzOI8oXs3wLRpmxIO5EA+iZHVcdi6sMdT9mXzvRW6q8J\ + sDVPTdlcohfVnq+37hnAuu4E/OgXv45LLjhvkFzQU4JwLjHA2sjvfOAwHIC5hSUMBkMMiwJz\ + C/710QePzKMsSywOljEoSsA5zC0uYTj0ycfC0gDLRQEiwsLiAMvDoT8eLGNY+N+cW1wu/Hn4\ + 980vLA1QsN/0IyIMlodYLoqKRc93UTgsLC/LxEUbmat+0pJFSwegk2UY63Wq9vwv6Pa6Obq5\ + /4nsibE+8izHlrEeJsfHMDnew7Ytk9izfQp7T9yJ/SftxrbJvhIuc/AoZpVdaR7jNYcb73oQ\ + cCX2n7QLA+Q4PLuAe+8/iAdnZrGwOMDiYIAjcwsoiTA3v+jlB2C5KLCwNIiy0m+fFu/or65R\ + BZKH5xYA57BlYhzsB51ZXWCs20Mn9z/hTlUb/rcBgG6eY3K8L8Y0OdZHHn+CPMP0lvpHUHud\ + HOP9Xmx7y/g4ut0s6mjXtq3oZpBZoxCxq2Urghm7rvWhp0G+4tQNt9+LM87CutE6A8DVePkf\ + /OXU95/3yHK838kWlpZRlGV0rqXBMpaLAoPC/0jk0vIQQ1f6z6LAclFiqSig4CA55tRURsU0\ + s01dPy3Hv4XfqZW/gGP1b7WXtpaOIeVWnSXC3l078ftv+K94xCMeBqIMoAwgIMtylABuvflW\ + vOvd78UXvvwVLA0GGBZDPO+HfgivfNWl2Do97dt2JTq5N423ve9X8C+f+Qymt07h4Owslqrf\ + 4LPGYo35aMdY10tlqftq0qMde2UbTXaj27P7JGQEjHU7sb9up4NunsXy470essqp+70ucspA\ + 5DDR98BMRNgyPhZ9f2KsDyJgfnGA88/Yt33ZFTjj+19gjmQtaN1+F+Dk8x7nOwTe6YBXNBl5\ + 07kmx+TXmwxupTJWnSYHHNXuKB6ajLWpvtU3p7qd2mHKssT8/BwedvLJ+PKnP27Wmz1yBI+5\ + 8CIcmZP7sX7rNa/BS3/2JeLc/Pw8Tj//QiwMBhjr99Ht9Rg/db/yzMpANqpOE9Xl6pJ2O7Kl\ + USDBHVuDRN2uHGcTGEkuZBnJX8oXa+MTp+za8Z9uve9B3H7Vl7AetC5rAKdUzg/gBwF6hTFw\ + QQT+S71URYK6TmpYTS3xMvX/1jXeNj8vfzZMkjM+CdIEuWHWBpoaJKn6mlPH/iTflTOUJeYX\ + FuCcw/W33YY/fv+fm2P9q7/66/irO5z7N7z5zfjsZz8nyr7+v/0uFgY+jV8aLFU/fS7dRPNf\ + 80bs/3r8ANg5Lbu6LKlyml+trzRIpK7ZDKa284drKoFP9OBGHsmxW/VYexffet+DLwbqgLnW\ + tOYZwCnnPS4o51QAVzr4xx5HI2KK4jDOc2qO3s0RoSlVXTnqjurDjhjc+bURW5Et5YH/Pp7i\ + qywxt7Dgf6Kc/PWpiUl86yufR7fn57YB6Z/7vB/Bl772VbPn7VNb8a+f/wKyLEOWE84+/wIc\ + np+PU9Y8yzAxMZkwoMfI+WyKnLyupQuwtlbKJGy9rZSPHFVEXsEeR2VuTb+GbPUvdL8A4LEA\ + riUAt61xJrAuGQABHQf8NUDbORLzKA9wgaSpZXCrFDXT+CAjgxOoLeNrXVdHI4nYZKiymfOm\ + bMLFf5bBpaDA+236Zd3Sudr5Q10HzMzN4hde/ev4xr0z+Ma9M7jmnoO45t4ZDMoQxVPTnltc\ + wp2zS7htZg6//eY/wOH5ed+zA4hQrdcsCunpjMbOA5rkxkvLHE3LpO5PyqUZtENdx46kbpuj\ + vkVS06kF6cxGttIUVDiPVdvjBPwNARNrG5o9rSkAhOgP4PUALtAKrZUiUzCNqvwcIJVgOZwV\ + LWoF+NZS57SjbuiDg5ZtMDUchfZ02mcZzijDCHxaUclVB/PM+QGwO6eEv//Yx3Dw/vtZxRLP\ + +bEfN3j3dMaBA54nyvChD/8vwWFotxguI6xqB91JffC2tb7TGF3LJM1+LL2GUpauoMppvrjM\ + 04id9pf2TMm1pgwnLZnahXW9qn+WA/4HIKbPa0JrBgAn16n/ExzwGq0wyykAbSJpusXLBEFb\ + KaGuz6MdNyQLcOo2nLimwSAle62C1HXbEHg8tY3U6A5Zlqm7TnWt5eUh/vub3gjnyuqOAOGC\ + Jz8N5z/6fLOHC7/vKXAALv/oR/FA/BVeVsYBE+MTcCSjNe9Z61OO35myVkNKdGIBOj/muvLf\ + NX+kdCFrNjkon35IYJMRXoN94Gel7IfXT8vQzxHwww5rux6w1lOAKQAfoKqfZoMmYSj804qa\ + OsroDMGiOlKlaWnTcRMwpGlgbYI6EkqenFm/jqQuMaTAs24v9DkxNoY843dzKX4QAZ/70pdw\ + 2823iGu/+GuvxeTEBDhNTkzg6c95HgjAn/7Zn8ioXTU51u8jz3MhHz3GlE+b9OKqBOb6vOVE\ + dgYmueA6sO9VIJF3WqL+zuO9tsn6uwwyKb+kvqcZDy/lgPcD2IU1pDUBAJa2/C6AveGLTotq\ + pctUkX8GkVtRgKAVUFNT1NDmkFLKY5MRawPTdyM4/2kdu2crUtmLf/U4JsbHhWOGjp0DClfi\ + 7W/5PZ8FAHCuxAmn7sVPvOSlosXHX/QEbJmaxrVf+xpuvfOuhMFut4tetaC4kqytrI1H5/Sc\ + /cfbtzIqLnW9WJhGZNuJ9Via+NdjlYBVcySdmCBDTnq3wQbKCCc7CXgXAJxy3vdiLWjVAYCl\ + /k8B8DKAC1EeaUcO37TgrbTbdmIyjmwD0mlbfT5dH4CqYwGCBjI5phR0gootA6v7cgmocF5C\ + eZDPBCjLZCE4OOfwpSuvxA3f+EZ9iTJsndoqWh4M/C7K9737XSjK8LiG76WT5Rjvj7EzdmYG\ + 43t6GzXIlztsCgpNIJ3aQVpS60iWSOWZBpzm0jqDC6v9TpznwM3zu9H2w8dU18LzCfRcB7cm\ + U4G1mgL0APwRYKc4QBoJrGgqhRzqNTvxaFWnbq3vN/NSowxQG4rdhp03aGCwDNUx3kIZW4bs\ + XJZhcnwcGT9Z7YEvHfDOt77V16EMzpX46he/KOD4G9dei7tuvw1XfeMbdctEyIgwPjYG0MrG\ + yx26Pu/MsvU4wxhrqY2O+FL+lsx1AJH1naE/21KsIMHb1+MjyD74OMN1vYisxwFRNsrnnVij\ + 5wRWFQBOqXf7XQpgvzZcOUinlKcFz80zzRxSQLASOm5IUuzcREME4ildentLLtDpsaVKtaca\ + aZThW2Z4Obv+yGibZRgbG697iQ04fO3aa/Cd678F5/wdg29+41rw8d97/31419veimG11Te0\ + PTY+DmSZEZmbb41yGLAcMZSQ311STgO9veGLuUlDALDAQktbf7Ns1xqPFZj0dT1Oiw9eTgcQ\ + B5xAwGuB1V8QXFUAqAaxxwG/rq9ZwtLXw+coQ0lTwPDpzYQLzzI+O4JpFLfcr8b7NPMYHaE1\ + WYbPFxADINiZhFwwleko0Ol0KxDwIwkP2JQO+JP3vAdEGQ7dfz/uvPNOaMl+4Sv/5o+q0/3+\ + GDp5bhp1U+oNSPlwJzgaMLCie92Odcs35WZUPykA1+W4jVhjgCqj6zX3T6YcAkwGcNMwpOzs\ + UgCnG6z/u2jVACAsUjjg1QC26kHW//ujJsOoS6ROxo+borEvUxsKxHltBJKv+lO6n+XsTW3z\ + SGGhujQuSs7rMehem25N1RHZodvtot/r+XOs0GeuuAL333M3rvzyFxVUAuj1sTRY8j07v+jX\ + 7XZZ6zLb0mDVlMo26diJ6zof02OyIqkdPTm/+loTIMsem66kZAUxK3tINcUBXmej0jYY730C\ + fhVY3SxgFTMABwKNA/iZ1Ah0vHBKMbUIVkLnugWrlG0M+jxPrnQ0d8nZtL6MDmlvKWCRMAQe\ + vRykfJodKZViLZd0y2y/30enK18yW5QF/uL9f4ybvvUt1qqnZcqrx3IJWZ5jrFr04+OtZZC6\ + swSINJpa37XJ83FLeUndNoHKSs+ENGVrK90OdOpY61dq1c5ArDHrgGQFMWWbP4FVfmnIqgFA\ + pbAnApjSZqLxNXWm+sxoFeoNHSkPVsS2DJBzJFPN5pkmL8/VbQGUjI6pqWsnSdsdvcHJchRd\ + brxK4QHEqcDHL7schw4dBI+9WbeHYtnP/XMijI+Px0ZGyVq67ahNTnUprRM9Rn4tcGg9W8Dr\ + Wzq1+g/XeH96fDoo8fZ0BhKuBau2goTWidWXxWFD+XECnmRWe4i02msA1as7pGmkyU39rVZg\ + E1xwQcr6pK7pCGRFC214dV88LvszNTLr+Vlt8PpsyrcECIsXQBpsDYpW23a2lBoTeYsZG0OW\ + ZXEqcGR+DrffcXes4QAs510UziEjQn98HDmlOrCOrZjX5HhclrJ1i3PesoPmRteodSyBEJDy\ + 1nzw69btyqMBFa3LJkCpy+oFZ6lToJ6cWToHaHZ0kPzuaLVvA17mgBu1sVtqtlIufoanRStF\ + Ck7aRI7mcV5/rG/JcbDRGzhkS2k0lEc61bPqNkX7NKrq6ZMsp/lHlmFifJy9rYr8Rp9Qv9PD\ + YFgABPRYxgCkhtyssxToOIVMSPDFWkqzARkO6rHZm310X7xeU8ag++Yat2Sbjqcpm0hBKrWW\ + VFcyk6nhjAcRAFcD7tPGsB8yrdobgS593sVYGgyHd9x96F8+8uUrX+bP1gPRqTB/1LMumTpA\ + +MbVowWWfmrXXgmd04c3zYiq2rXSNJ398Fq2c0gZydUCDmhpVsWXDq0MI57LMoyPT2BhYR4g\ + 4N5DB9GvIn7Z7aNcXESHLfo1ZSaWJJoymiZgStt0kBO71Ml1WxpYYZQf1a/Fv8w55FhTnv0V\ + vUNTQkpq22mwst9WFDaAaZt8xTOffEW3nzvKdEsPnVbtfQDltZ8EgJ0guvl5r33H5Jdvuk12\ + hCZnlWRFQF1flx1VXvevy+pn+dM4YDmkbZijeEr5r/u1xjjK8TQojAIu3vZwOMT8wgKIgJ4r\ + 0M0yzFMHGYCJsYmYDzbp6WgyFXs8o17tZXPcJAfL9JvsaZQtWfXttlIudEBrArvVsN1w/NRH\ + Phx/9l9fsgy4AwBuzc56ClaDVncKQPRzACZ/72U/iu3j1TvQwJ2pJq1YPmB9W0krRF8L9XWE\ + 4Mda7XXEkEt0dR3eoh11mvm3+pH100zB3lhjRZHgIqMzllQenU4H/X7fPyOQdVCQf+Pm2Pg4\ + XJZGVB2J9Tj5eKzMSsvVkp3eLsv7Dm1ZWYXmB8Z3a4efNSbOmwXCDrLPEDRsQLP5agKz5sBU\ + W97uLZP47Z//EQCuC9DPmYbyEGn1AMBz+0w4hwOn7MavvOASJlgZa7VRpwK3Ixs/KxXSnKpp\ + I+TtNSVSUuEr78jTiq9HO7oe/zZqF9so5w5lnbrGZcqv9Xs9dLpdlM5h2flFQqKmJyQl+DVF\ + tybntgyc9yT1bgcJ2znSZzq10wS7S+3CGk19JrU5a5qaLllb4DQKICzbt2w3J+C3XvQcnLhz\ + ypd07vsTxv8dtHoA4ADAne2PHV749Avw/Mc/Rqkb6siThY5N52sDSAVnOXVzejX6LT+6HYn+\ + /FyTk9gPAEnjsHYcjB4PknO2IesIykHNPziUIyN/zz/d9myPwMo4LGO3SMb5dA2HZwk2L9xZ\ + XNKO5DG1tZrfes2hSbZ6bKNAmNdMga62jmZ7kp/hOFz/mR94Ei656NyqkgMIq/rS8NWdAjhM\ + 8ff5v+nnn49zTz0pKWZFN20QVnSrBWubnXamJuPUffK62gA5P1YE1Pf4rfTSGi836KZswhpH\ + k5M2R+IULhyAyfEJUB7WgO1bXqncKOE13QVoP+SlY7YeU5M8ZF+hJVk3kI7yTUGiCdhW0h3Y\ + 9zTi6yc3U860bize+LUnnrkfv/LCZ7CTBIAmVkTb74JWew2gejeVAwgY62Z476+8CKdsnzYF\ + OGrnVlMEkDukHEgZBC9voW4d/esS+taNNgDp2PbrxDQ1Ob4uMyqCcqfgfI0aWxrx9f75SmIE\ + c5+/dn4ZlVPH0fKwpGHlF9Y6j3TbZsDVctDyqHmy468FlE0Ab13T4wjlbfms3IfV9sNP2IN3\ + vPKn0E1X/AvT4B4irfY+gHt0zDxx5zTe/V9ehG1jfSPK6pFIV1wJNFJAGIXQ/JwTnyEddEb7\ + vJ51XkeNehSpWpsiq44VEhj0a8bsdNLKcqzMhbtQeLWXrp9GZXs5zXaYZA97vO5ECSfqcVC3\ + 1oA4n00OrUGXb7WWTk+iniZCs25r/qWVjgIPOb6Vn5s4fnor/uhXXowdW/qqYQc4d6fB8kOm\ + VZ4CuCsswz/ntBPx3ld6ELCiGVe+/z8Vaq1AnejVRtGssO/mvEuuNRlJ3bekeoYqeec9cCOS\ + 49TRz4nzTkmnaWxaSk1Rk39aEctq3SlN8FzKlqZsT09b9LFF6W45+WBVmjNYoFhzoGXOx98U\ + TPioNJjwPq0gxmtajh+df2or/uK1P4u9J2yH/E3D2MHnsIq02lOA94rv7IcPLzxnP9596Ysw\ + Pe4fMtHRSUc9oBawlSpqhLYEC3ZdG5o2Hvk5+kcsbIdmYjiK/qUR8bJp9NOmpJ8dHDUm6zkE\ + zZcVPS3jtyKmNNHmh5qsB3qaQMsChXStRU5tmvvl11Mb0RvL0gVRCYMpQKSLl9oetS41cIZy\ + J05P4X3/5afx8FP31BWS32vE27GKtIq3AQlw7mNw7p3J+YouOnc/PvDan8Mp26bMiBOoVoj9\ + IM0oJVtldHagnVvX0avLso586IXzxqMSP4Zqx+o/daw0gnBJ6IiVAoYNh5Zzaee0+NbXrWtp\ + +3W7+oGeelohoUbmO2nbzVHZrq35SktrwE0t0gI9fl4CJp8CpU8+WO0AwFkn7MEHX/cKnHfg\ + pNrpk5+bp18F8AVjKA+ZVg0AsrOeHA5/EXAvBPB1/5UNBrj+3P0nvuWVP/KMRxPoXQDmARwB\ + UFgm0ZxkpYrVxmk9UGIZj2Vc/LyO7txgUqPiEVAvvumSKxmnE4bE+xsVKSmpT6IMz6p4tJJ1\ + j44smcm6dktSgymc6mlOc/8SuEINe/rVpAn7CucorZWucwRQkxmcLREruNw9c/i6vSds/yUA\ + l4NohtWYAfAxAE8D8GYQIXvkU8xxPBRa9Z8GK6/7pD9wAIimAOwDUMK5WwAcuf3eg/joFVfj\ + o1/8Oq6stgsT8L8B/GCoVp2rm2Htp4qV5XUdK1rztM9qg9fRZXjZUU6p22jiS49Lt9E0Ps6D\ + 5otfaZIFgTAshvFtwkc73lHnmsYJSOdoIouHpnOaRulsVF3uuNqRm+qtpEdbf3Xr1joWgP//\ + Jy6+4DlvfPFzqgs0XQXNGV/Il2SBdlVozX4bsLzuU/UX1odGr+o9gj/ugA+kSXOzAsDOa6Xx\ + cnrPdjgH2OaonXYlXqDaInU+PZY86PHw2k19H81x3U9z/aIokLNbgd+NJTSPTsq3OYbzXCWt\ + M0oHzaBgA18oMWqdSLZvw+AoPdlA0twvB8Zq3G8B8Orbr/qS950RPrOatGpPA2r67pCKPkxw\ + Mw5uGmiKLPbDF9Kt0ihnPW1lGadlWJYjpQYkjVa2mPJWt9H81BkHkZXS8zBGzYMev9V+RvZO\ + jKORA4zjUc6jxwM4yOcfNEg3jXcUOIQ2rHxDwhV30DRPsSK0fFLTDkhWvsPrWPqM378eaq92\ + lB9F6/LjoKOJALgFAB+QZ/VCkBScLhuuSUdN03zRK2C26pKS6TWXlLONojmqEvvfgovgvCTO\ + 8THy6MJbq51XmmZiuE5znXKn+dPjTrOxNBuq67qkrAbzUfKVY6vbaQLldEzaAXUWtjLvFtiT\ + OuKALK/LWkqOVxksrzltOADcdtUV4fCtAAqNjP44KNp6m0ot8BS3m1fsQyltiLyFFMGtCCjv\ + R3NHszMDzYU8U/eRvj46jUzaXO0xQh1HWRFYq/L5inClHk+6Ml9H/FQnnEiV5XdSoD4tfu1M\ + YzSw223qgCDtpslGmnjV/VtT0JovEnKUeyHoMAHXGcNZc9pwAAjk/JuE/kZHZG6UXMByBVg/\ + HDQq/ko8bjIm3oJsW/evU3nJux0pZD8Ebqgk+pEwpEdVG1NaKo2UuoSVYekx1OVSWerz+tZn\ + qgUX+eVj1ePSQCR5lRZgZQ7aSXUfVt8aZNKobgWYZqDVYMZ3n6bBxH0GLPitJx0TAHDbVV8C\ + ADjgtQQscnNOo30g/hwAV7s8sjfO1uU0wkMd87MWyHBFcmTn4CJbab4WakoHsJ9a5A6vjY33\ + o11ZR7JR2UnIukINi2ferjVNk4Cp92PYP32mx8GP5Y3WpjJ2fQ72TWsjqR1Yb37iOVPa10qg\ + xDPZ6so/ONR+sJ50TAAAo5sB/I5G0KbI6UxzkKWa1w50pE0jFt+ZoOeATake2HWdrYB9t/iR\ + nGuDl05NrI7Vvx257NzIynDquml2kYKHLeNaDmFpzSrnzG9NmZl2WN2X5B2ooYeEPvRGq2ZA\ + 5MCXQrZlm1Z/nC9ez8EVDvh7o5l1oWMGAG6vs4Dfdmq3k5WOj454aTaQpvjNv7nHy3Djd6q8\ + ZTw6LeVOVJt/2p6VTKZgE9a363Z0n8ywkrq6PWssmmQ2kl7T3GtQagKPMBp+tcmZeB8yoxit\ + jyChOvnm/NkbtdIx8XUDCaA60vOx8JWVtC+R1X0YwF3YIDpmAIDREMBzAdy4UkGZoqbO1BTl\ + moyaRyzZ3tE5S7hugZNuT3Kqo6lc7ZfXtDmnjq0Nsk5lJSelS+Vn8cj50UDD6+qsbGVyJq8c\ + yJsyFj4BcOJ8zbHdtudS2gDFduxAkPIXajWV02elvcX+SwLeBNQBcL3pmAIAJoS7HXAxgKst\ + B5corO8A+JJSWU1mzY/Te9Ia7bUj82jMM5OmtNKKhmlan47Jcm4L7NIsR47UngDYmUKAISfq\ + pWPUjqn5tcdXf2qQlXpLd+OlYKq1Jr/pjFHfSAWCvC1HreXQBK41L5SMRZMOIg54swOusq1z\ + feiYAgBAgMDNDrgQcG8DMMfLjBIYN1itLG1w2mAsBeo7DGlviD02pcnaCGXN9Nwog9ORWPcB\ + 9SmjpaqTCWMUsuPr+RYv+lbeSmOqQSgFg9RBeV07G9Lj559N5QDu7HWWt7ID6lGkACdzEnm7\ + 2gBvR8A7UP2I7kYs/gU65gAAECAw5/yvoh5PflrwJwC+DaSGE84FktdGJ6VpjuGPrairgUA6\ + m44sNgiF8tqhiV2x0tom3vQfryejbfPOvxT80t2FenSW7DVfddtNOyZrR9fZBli9lOPR6XgK\ + gikQADYvtsxl27qclHsKGBUddMAfAXiUA34JQDmim3WhNXsWYLWI/xIqE/gOAh43nDvyc3Dl\ + s6nbR97twWWZKNfkrEDtEP7YmfV0lArHipcYLa26si/71pU3fv0TWOlWYcvJ6v44D80mHK47\ + OFDVgObbHqNdLv3kMVHyr3nW7XIeVxpzU/vhW9OmnFF9W7ppGiuHNUtv1bk5AF8E8CkHfIqA\ + KxywHEpuZOQPdMwDgKYACLP33Y2Zu257PYDXhWu9sTGMTUwi7/aQd/vIul3knQ6QdZH/n/bu\ + 3seNIg7j+HfsnO98uuSMlEREShoKoEERFNBR0FMhUdNRISEqav4A0iHEP4AoEJRIUYQiQUSV\ + AqVBRJEShUMoQF7OTozt3R/F7J5n32xfXpRbz/Np7rzel1nvzLOz47W9cQzrFD/5lv8PpYZR\ + mFaet3KQaypU3Xrqz+yLzjZN5axbvrkBFCtqWBZnvi9a3ldXWcfcopALy13ei+Z9LAZGXWgv\ + OxuH21/U6JvK27StplCcl/Xg7eF9/I1s1/F39P1q/tbeG5TO8kel4eee2YeBnpX88sD5L0ro\ + uPx77cyYjMdMxuPGZTvdLr2tPhu9ng+JThe6HTY2t34/tjO4AnbawUmD08Bph+tXB4esUmlz\ + 88pilUYUvi1X7o6GZ5CmwajyvPW9jOJ8Rt6xrjJ848/LWRw2zQKisZzVbTaFR/Huzery5Sa2\ + rAHmpQ1DZXF3nNJ8xX1rOtvPJ6ZYkpDOEiyZks6mpNMJSTIjnU4ZPxze3j515tz2CycbA/15\ + jfCvonUBUDIKezDOORb1aNIkYTwaMh5VnvpycObs5zunzpQatPWAXWAA7LrsL9jAZdMdbhds\ + 12DgYGCw42AL2AE77qAPrl9/9i/3CpoaXf33F1DzOCt3FjZNP60drissgwXPzxtKeVvLLgvC\ + Uq12Rm4eb6jfRv0PfrjSeoJtJMDQ4D7YENwonUxOpNNHr6RpiiVTbJaQpAlpOsNmCbPphP8e\ + PSKZzVhiPP3jJv/eurFsviOp7QFwK3ywyuVMTUiMga/v/Xmbu3vz3zPMLjUmwB3gTrWbfbDV\ + SsOonlkMhzthWN8HAgOgb9iW88GybdDDh8UmPni2ga7B8SwYBtl6jwNd5sv0suXz7fey58ga\ + cM9g24HrOtcFNmZmPSuULnttCv2G4mtZPouHDazutQkeT8E9DOMm+3tvXgISYD/b4n2HM8OG\ + +HtCxs4foyn+mtqA+9k6HhhMHeyb/+ackYMhuBH+8X62zDg8NqO//+Le3s2P8R9AO7RSHdpL\ + 0+c+lvfYWh0Azrlf8gMRXgo0zIuZ1T1/gZo7sZ5mt+3c+bcw7AG+whaULyGaLi3C/8s9gUWx\ + FzZOs+qZttTjwcGuHYwMePXBV7udEdkgV2G7wVZWuRYvh0/dvi56fajZXng8s7pyt35PKMxX\ + V59K0y4vW89R1rpBwFyn08kPxGXg7WXzNxzMH4B3gVlbX4en6dz5NxeGySqO2iBXnSwA3gEu\ + rTp/Q/1IgFeB622tP60NADg4kG/gPzvQO+TiXwEf4bv5K10+yHrI6s0O8A8L6k1Tww+mXwA+\ + gfbWnyN5I9AhXcXfJHTwTarOLey0/oz/htUPUeOP2RD4Bnx9qaszTfUim34R+HTRfG3Q6h4A\ + FBr7i/i7q94DXg5mGTnnrpnoVW89AAABXklEQVTZJeBbfGAA7T5w8mSyenPWOXfVzE6Vpi+r\ + G1/g71Bt/Qmk9QEAtWf8TfxoO/ieQfGt3TXYZ3kyeZ1xzr1mZt8DLy2b38wuAp8BP+XT216X\ + 1iIAQk3d/3XbT3lywUByH/jAOfc+8LqZ/3ZqYA+4BvwIfAf8li+7LvVp7QJA5DCWjBdVrFt7\ + UQCIRGwd3gUQkcekABCJmAJAJGIKAJGIKQBEIqYAEImYAkAkYgoAkYgpAEQipgAQiZgCQCRi\ + CgCRiCkARCKmABCJmAJAJGIKAJGIKQBEIqYAEImYAkAkYgoAkYgpAEQipgAQiZgCQCRiCgCR\ + iCkARCKmABCJmAJAJGIKAJGIKQBEIqYAEImYAkAkYgoAkYgpAEQipgAQiZgCQCRiCgCRiCkA\ + RCKmABCJmAJAJGIKAJGIKQBEIqYAEImYAkAkYgoAkYgpAEQipgAQiZgCQCRiCgCRiP0P8fRM\ + CPaFrsEAAAAASUVORK5CYII=\ + " + local text_png = + "iVBORw0KGgoAAAANSUhEUgAAAIAAAABACAYAAADS1n9/AAAHlElEQVR4nO2be4xdVRXGfzOd\ + aWlLizC0Yh88OykWxQotdAoq1BRESVVSYw1pQgiRgBADxoQYidhExGBJNCgYEtNqUjHW8Eak\ + tcX6AMaqiPahViiVUtsiFKaMLZ3284+1Tu6+Z845d163c4ezv+Rk37PX2nuts/d39ln7cZsk\ + EVFeNA+3AxHDi0iAkiMSoLHRBIwHRtXLQCRAY+MmYD/wlXoZiARobEzw9H31MhAJ0Nh4w9Mp\ + 9TIQCdDY6PL0hHoZiARobOz29MR6GWipV8URmZgLfBiYBLwCPAlsLdB/1dNIgDqiDfgD8G/g\ + I0H+aGABcCrwOvBbYGeq7HQvvx3YV2BjNvAD4LwM2UrgeqA7Q7bH02ZsKni4wMaA0DQCl4JH\ + Ae3ATOA04Fng6ZROE9bY5wNTMaLvwTrwl8DeQHc6sMN/zwU2AnOA1cApgd5h4D7gi8A04MfA\ + fJcJeAC4AdiV8mUh8BAw1u+fBv4JvNftATwIfDrjWcdSIcY44H8ZOoODpJFwHSPpKkmPSupS\ + Nf6e0r1Q0ibl4wlJs1JlNrpsuaTJkvb4fY+kTknPBeUflvSv4P5A8HubpLag3qmSXg9kHSm7\ + i4Oyc3Ke/Q2Xt+XIB3UNd8f25fqMpF2qxmFJO4L741Tp/Lc976CkdZJW+PWwKh15WNLpgY0v\ + ef42SXf67x2SZgY6iyQdCmy+Kmm2pGZJl0na6/k/DMrc5Xn/kTQt5/kS8n0+R77V5afnyBuW\ + AGMkjRpkHTcFDf6ypG9IuljSsZJaJXW7bGGqMTslTc+o76KgvluC/JlBfjLCLM4of2+g9+WU\ + 7BLPPyKp3fN2et497nO6vkkyIknS0pw2eMrl8wbZlv0iwHskvSR7MyZLWiZpraRnJP1MNhy3\ + FlQ8VdJb7vhLklZJ+pTsbemrczNlQ7AkfVfS2AydpMNvcz8TvD+nzu8EOn9JyV4IZAdy7H0o\ + 0El/RsLOul3SRFWjR9Lz3n4rJK2W9JrL3nT/s3z+umzE+mA/2m7QBGh3x7ZL2q1s/E3SGTnl\ + F+eU2SLpgj46d6uXeU5SU47Oatd5StJpgZ3jM3THqPK2JZgfyO8O8jfn2GsPdM7KkF8X+Hxi\ + oNutfLwsG9WK2qKlhnzAV940MFmCTKLgbmwa81fgZOBa4CxgPXAOlfkqwCLgp8H9I1hkvBQ4\ + E9gAXAncXyM+bfN0MxZlZ2G/px3YqlkPFvHPAdakdK/xOt/y55gH3OL+AjwGfMF/7yEb44Pf\ + kzLkGzw9GzjotsYDV2AzjTOBk7Ap5kHgeaATOJRjL0FPDfnAkcOMYwOGHpD0gZR8siz6lqT7\ + U+WSYOhZSTMC2SmqDNndqh3UXO+6uyVNyNFZE/i5UNLjge3Rgd4sVaLpO1w3wRWuc4yk/Z63\ + Mcfe7KDchRnyFtlwLUnnSvq5/15T41mH7coTjA4e9J4cnfkuD4OepZ63V9nDcJsqEf23ajjX\ + Jmmf6z6m3t/kNlVPwW6XdF7QAb+T9AlJN0r6r+dtV4VMSed0qRJgrfS8XTk+nRHYOzVHJ/lk\ + LpK0IND/ao3nnajsOKBF0jclXVmj/JASoDlw/OMFFWxwnTv9PvmOfr+gzNdcZ20fHPxc4Mcm\ + SZ+VdeDJsvl8iHVe5jpVSBDiFVV/t9tUGcW6ZBH5R/3+zYJ2WSXpJ8qPS/7sdXzS738U+LBK\ + lZclJNUyt9mt3nHVXC97qMDmkBOAwOnZBTo3uM4mv1/h90Vv922u83gfnbxK1W96Gslcuyso\ + 0yELELe5b9+W9O6MuqdJ+pMs6BvneUtkRBhoo86SfVaSGc8YSY+kfN4uCxR3pvJflDQlVV+r\ + pAdln6VhIUBRY5wd6J0gG6ok6Rc5+jNUGY5v7Iej7TJyhauAm2VDfBivnDTUDTREV5OkayT9\ + Q71xRNLvJV2r6rjlqFxFewE92Lr7Eqqj+hAt2Pp0C7YuPgr4DRa1Xwz82vXGAlcDy7C97Rew\ + Uy79Xdtuxtb2D1Idqe8DjnMf0vsCjYYZ2OxqAvYMW4HXhsuZot3ATmx61Vag04M9xBRsevMA\ + 8ATwMWAtsM5tzMM2M8B23S5lYBsbR7x8GgkBinxtFGzzqyFQdCCk09PJNepI1gAmeroEm1O3\ + AJdgW6rjsLnufdjWaH8a4HzgLuD4Ap2EXLXm0xEpFI0Az2Bbn0X73GBvfRe2KAS2iHQ5cC5w\ + AdY5LwK/onrBqK+4A7gI28pdniEfR+XIVN4CTkQOimKAVuxt3Uj+StzRwHLgZuzbPj9DvgAj\ + 19vAu6jHnvk7GEWfgEPYSZnhPjGyytMObNk5jas9XU/s/H5jJBwK/SN2HAvgbmwdPUEHFnMA\ + fO9oOvVOwUg5EnYOFpO0Ym/6vdhRrlux6H899imI6CdGCgHAdhBX0vt/cluww5x7e5WIqImR\ + RACwkeBmbL6/BTvguY44/RswRhoBIoYYIyEIjKgjIgFKjkiAkiMSoOSIBCg5IgFKjkiAkiMS\ + oOSIBCg5IgFKjkiAkiMSoOSIBCg5IgFKjkiAkiMSoOSIBCg5IgFKjkiAkiMSoOSIBCg5IgFK\ + jkiAkiMSoOSIBCg5IgFKjkiAkiMSoOSIBCg5IgFKjv8D/zcFVeg+jbUAAAAASUVORK5CYII=\ + " + + local function loadimage(file, name) + return love.graphics.newImage(love.image.newImageData(love.filesystem.newFileData(file, name:gsub("_", "."), "base64"))) + end + + local inspector = {} + local background = {} + local bubble = {} + local text = {} + local rain = {} + local g_time = 0 + + local create_rain + + function love.load() + love.graphics.setBackgroundColor(137, 194, 218) + + local win_w = love.graphics.getWidth() + local win_h = love.graphics.getHeight() + + inspector.image = loadimage(inspector_png, "inspector.png") + inspector.img_w = inspector.image:getWidth() + inspector.img_h = inspector.image:getHeight() + inspector.x = win_w * 0.45 + inspector.y = win_h * 0.55 + + background.image = loadimage(background_png, "background.png") + background.img_w = background.image:getWidth() + background.img_h = background.image:getHeight() + background.x = 0 + background.y = 0 + + bubble.image = loadimage(bubble_png, "bubble.png") + bubble.img_w = bubble.image:getWidth() + bubble.img_h = bubble.image:getHeight() + bubble.x = 140 + bubble.y = -80 + + text.image = loadimage(text_png, "text.png") + text.x = 25 + text.y = 9 + + -- Baby Rain + rain.spacing_x = 110 + rain.spacing_y = 80 + rain.image = loadimage(baby_png, "baby.png") + rain.img_w = rain.image:getWidth() + rain.img_h = rain.image:getHeight() + rain.ox = -rain.img_w / 2 + rain.oy = -rain.img_h / 2 + rain.batch = love.graphics.newSpriteBatch(rain.image, 512) + rain.t = 0 + + create_rain() + end + + function create_rain() + local batch = rain.batch + + local sx = rain.spacing_x + local sy = rain.spacing_y + local ox = rain.ox + local oy = rain.oy + + local m = 1 / love.window.getPixelScale() + local batch_w = 2 * math.ceil(m * love.graphics.getWidth() / sx) + 2 + local batch_h = 2 * math.ceil(m * love.graphics.getHeight() / sy) + 2 + + batch:clear() + + if batch:getBufferSize() < batch_w * batch_h then + batch:setBufferSize(batch_w * batch_h) + end + + for i = 0, batch_h - 1 do + for j = 0, batch_w - 1 do + local is_even = (j % 2) == 0 + local offset_y = is_even and 0 or sy / 2 + local x = ox + j * sx + local y = oy + i * sy + offset_y + batch:add(x, y) + end + end + + batch:flush() + end + + local function update_rain(t) + rain.t = t + end + + function love.resize(w, h) + create_rain() + end + + function love.update(dt) + g_time = g_time + dt / 2 + local int, frac = math.modf(g_time) + update_rain(frac) + inspector.x = love.window.fromPixels(love.graphics.getWidth() * 0.45) + inspector.y = love.window.fromPixels(love.graphics.getHeight() * 0.55) + end + + local function draw_grid() + local y = rain.spacing_y * rain.t + + local small_y = -rain.spacing_y + y / 2 + local big_y = -rain.spacing_y + y + + love.graphics.setBlendMode("subtract") + love.graphics.setColor(255, 255, 255, 128) + love.graphics.draw(rain.batch, -rain.spacing_x, small_y, 0, 0.5, 0.5) + + love.graphics.setBlendMode("alpha") + love.graphics.setColor(255, 255, 255, 255) + love.graphics.draw(rain.batch, -rain.spacing_x, big_y) + end + + local function draw_text(x, y) + local int, frac = math.modf(g_time) + if frac < 0.5 then + return + end + local tx = x + text.x + local ty = y + text.y + love.graphics.draw(text.image, tx, ty, 0, 1, 1, 70, 70) + end + + local function draw_background(x, y) + local intensity = (math.sin(math.pi * g_time * 2) + 1) / 2 + + local bx = x + local by = y + + love.graphics.setColor(255, 255, 255, 64 + 16*intensity) + love.graphics.draw(background.image, bx, by, 0, 0.7, 0.7, 256, 256) + love.graphics.setColor(255, 255, 255, 32 + 16*intensity) + love.graphics.draw(background.image, bx, by, 0, 0.65, 0.65, 256, 256) + love.graphics.setBlendMode("add") + love.graphics.setColor(255, 255, 255, 16 + 16*intensity) + love.graphics.draw(background.image, bx, by, 0, 0.6, 0.6, 256, 256) + end + + local function draw_bubble(x, y) + local osc = 10 * math.sin(math.pi * g_time) + local bx = x + bubble.x + local by = y + bubble.y + osc + love.graphics.draw(bubble.image, bx, by, 0, 1, 1, 70, 70) + + draw_text(bx, by) + end + + local function draw_inspector() + local x, y = inspector.x, inspector.y + local ox, oy = inspector.img_w / 2, inspector.img_h / 2 + draw_background(x, y) + love.graphics.setColor(255, 255, 255, 255) + love.graphics.setBlendMode("alpha") + love.graphics.draw(inspector.image, x, y, 0, 1, 1, ox, oy) + draw_bubble(x, y) + end + + function love.draw() + love.graphics.setColor(255, 255, 255) + + love.graphics.push() + love.graphics.scale(love.window.getPixelScale()) + + draw_grid() + draw_inspector() + + love.graphics.pop() + end + + function love.keyreleased(key) + if key == "escape" then + love.event.quit() + end + end + + function love.conf(t) + t.title = "L\195\150VE " .. love._version .. " (" .. love._version_codename .. ")" + t.modules.audio = false + t.modules.sound = false + t.modules.physics = false + t.modules.joystick = false + t.window.resizable = true + t.window.highdpi = true + end +end + +return love.nogame diff --git a/jni/love/src/scripts/nogame.lua.h b/jni/love/src/scripts/nogame.lua.h new file mode 100644 index 00000000..92ef83e7 --- /dev/null +++ b/jni/love/src/scripts/nogame.lua.h @@ -0,0 +1,4332 @@ +/** + * Copyright (c) 2006-2015 LOVE Development Team + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. + **/ + +namespace love +{ + +// [nogame.lua] +const unsigned char nogame_lua[] = +{ + + 0x2d, 0x2d, 0x5b, 0x5b, 0x0a, + 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x28, 0x63, 0x29, 0x20, 0x32, 0x30, 0x30, 0x36, + 0x2d, 0x32, 0x30, 0x31, 0x35, 0x20, 0x4c, 0x4f, 0x56, 0x45, 0x20, 0x44, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, + 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x54, 0x65, 0x61, 0x6d, 0x0a, + 0x54, 0x68, 0x69, 0x73, 0x20, 0x73, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x20, 0x69, 0x73, 0x20, 0x70, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, 0x20, 0x27, 0x61, 0x73, 0x2d, 0x69, 0x73, 0x27, 0x2c, 0x20, 0x77, + 0x69, 0x74, 0x68, 0x6f, 0x75, 0x74, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, + 0x20, 0x6f, 0x72, 0x20, 0x69, 0x6d, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x0a, + 0x77, 0x61, 0x72, 0x72, 0x61, 0x6e, 0x74, 0x79, 0x2e, 0x20, 0x20, 0x49, 0x6e, 0x20, 0x6e, 0x6f, 0x20, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x75, 0x74, 0x68, + 0x6f, 0x72, 0x73, 0x20, 0x62, 0x65, 0x20, 0x68, 0x65, 0x6c, 0x64, 0x20, 0x6c, 0x69, 0x61, 0x62, 0x6c, 0x65, + 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x64, 0x61, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x0a, + 0x61, 0x72, 0x69, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x75, + 0x73, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x73, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, + 0x65, 0x2e, 0x0a, + 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x73, 0x20, 0x67, 0x72, 0x61, 0x6e, + 0x74, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x6e, 0x79, 0x6f, 0x6e, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x75, + 0x73, 0x65, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x73, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x20, 0x66, + 0x6f, 0x72, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x70, 0x75, 0x72, 0x70, 0x6f, 0x73, 0x65, 0x2c, 0x0a, + 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x72, 0x63, 0x69, + 0x61, 0x6c, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2c, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x6c, 0x74, 0x65, 0x72, 0x20, 0x69, 0x74, 0x20, 0x61, 0x6e, 0x64, + 0x20, 0x72, 0x65, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x69, 0x74, 0x0a, + 0x66, 0x72, 0x65, 0x65, 0x6c, 0x79, 0x2c, 0x20, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x74, 0x6f, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x20, 0x72, 0x65, 0x73, + 0x74, 0x72, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3a, 0x0a, + 0x31, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x20, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, + 0x68, 0x69, 0x73, 0x20, 0x73, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, + 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x65, 0x20, 0x6d, 0x69, 0x73, 0x72, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, + 0x74, 0x65, 0x64, 0x3b, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x6e, 0x6f, 0x74, 0x0a, + 0x20, 0x20, 0x20, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x79, 0x6f, 0x75, 0x20, + 0x77, 0x72, 0x6f, 0x74, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, + 0x20, 0x73, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x2e, 0x20, 0x49, 0x66, 0x20, 0x79, 0x6f, 0x75, 0x20, + 0x75, 0x73, 0x65, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x73, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x0a, + 0x20, 0x20, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x20, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x2c, 0x20, 0x61, + 0x6e, 0x20, 0x61, 0x63, 0x6b, 0x6e, 0x6f, 0x77, 0x6c, 0x65, 0x64, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x69, + 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x20, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x62, 0x65, 0x0a, + 0x20, 0x20, 0x20, 0x61, 0x70, 0x70, 0x72, 0x65, 0x63, 0x69, 0x61, 0x74, 0x65, 0x64, 0x20, 0x62, 0x75, 0x74, + 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x2e, 0x0a, + 0x32, 0x2e, 0x20, 0x41, 0x6c, 0x74, 0x65, 0x72, 0x65, 0x64, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, + 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x70, + 0x6c, 0x61, 0x69, 0x6e, 0x6c, 0x79, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x64, 0x20, 0x61, 0x73, 0x20, 0x73, + 0x75, 0x63, 0x68, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x6e, 0x6f, 0x74, 0x20, + 0x62, 0x65, 0x0a, + 0x20, 0x20, 0x20, 0x6d, 0x69, 0x73, 0x72, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x65, 0x64, 0x20, + 0x61, 0x73, 0x20, 0x62, 0x65, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x72, 0x69, 0x67, 0x69, + 0x6e, 0x61, 0x6c, 0x20, 0x73, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x2e, 0x0a, + 0x33, 0x2e, 0x20, 0x54, 0x68, 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x69, 0x63, 0x65, 0x20, 0x6d, 0x61, 0x79, + 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x65, 0x20, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x20, 0x6f, 0x72, + 0x20, 0x61, 0x6c, 0x74, 0x65, 0x72, 0x65, 0x64, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x61, 0x6e, 0x79, 0x20, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, + 0x6e, 0x2e, 0x0a, + 0x2d, 0x2d, 0x5d, 0x5d, 0x0a, + 0x2d, 0x2d, 0x20, 0x4d, 0x61, 0x6b, 0x65, 0x20, 0x73, 0x75, 0x72, 0x65, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x20, + 0x65, 0x78, 0x69, 0x73, 0x74, 0x73, 0x2e, 0x0a, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, + 0x72, 0x65, 0x28, 0x22, 0x6c, 0x6f, 0x76, 0x65, 0x22, 0x29, 0x0a, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x6e, 0x6f, 0x67, 0x61, + 0x6d, 0x65, 0x28, 0x29, 0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x61, 0x62, 0x79, 0x5f, 0x70, 0x6e, 0x67, 0x20, 0x3d, 0x0a, + 0x09, 0x22, 0x69, 0x56, 0x42, 0x4f, 0x52, 0x77, 0x30, 0x4b, 0x47, 0x67, 0x6f, 0x41, 0x41, 0x41, 0x41, 0x4e, + 0x53, 0x55, 0x68, 0x45, 0x55, 0x67, 0x41, 0x41, 0x41, 0x49, 0x41, 0x41, 0x41, 0x41, 0x43, 0x41, 0x43, 0x41, + 0x59, 0x41, 0x41, 0x41, 0x44, 0x44, 0x50, 0x6d, 0x48, 0x4c, 0x41, 0x41, 0x41, 0x4c, 0x31, 0x6b, 0x6c, 0x45, + 0x51, 0x56, 0x52, 0x34, 0x6e, 0x4f, 0x32, 0x64, 0x65, 0x5a, 0x41, 0x55, 0x31, 0x52, 0x33, 0x48, 0x50, 0x7a, + 0x33, 0x58, 0x5c, 0x0a, + 0x09, 0x33, 0x72, 0x75, 0x7a, 0x75, 0x79, 0x77, 0x45, 0x58, 0x5a, 0x56, 0x4c, 0x42, 0x4a, 0x48, 0x41, 0x69, + 0x6c, 0x66, 0x55, 0x70, 0x41, 0x51, 0x4e, 0x47, 0x6f, 0x31, 0x52, 0x50, 0x44, 0x41, 0x78, 0x4b, 0x69, 0x61, + 0x4b, 0x6b, 0x70, 0x51, 0x48, 0x6c, 0x5a, 0x42, 0x4b, 0x68, 0x54, 0x49, 0x52, 0x6a, 0x53, 0x61, 0x57, 0x6c, + 0x43, 0x6d, 0x72, 0x72, 0x43, 0x4a, 0x42, 0x44, 0x52, 0x37, 0x52, 0x61, 0x4d, 0x53, 0x55, 0x42, 0x78, 0x36, + 0x78, 0x5c, 0x0a, + 0x09, 0x45, 0x6c, 0x6d, 0x68, 0x43, 0x49, 0x6f, 0x67, 0x69, 0x38, 0x64, 0x4b, 0x46, 0x45, 0x51, 0x45, 0x59, + 0x57, 0x47, 0x58, 0x76, 0x61, 0x2b, 0x5a, 0x6e, 0x75, 0x6e, 0x70, 0x2f, 0x4e, 0x47, 0x7a, 0x62, 0x4f, 0x2f, + 0x73, 0x7a, 0x75, 0x77, 0x63, 0x2f, 0x58, 0x5a, 0x33, 0x39, 0x72, 0x31, 0x50, 0x31, 0x64, 0x54, 0x32, 0x64, + 0x72, 0x2f, 0x2b, 0x39, 0x61, 0x2f, 0x37, 0x66, 0x66, 0x76, 0x31, 0x75, 0x35, 0x39, 0x6d, 0x6d, 0x69, 0x59, + 0x4b, 0x5c, 0x0a, + 0x09, 0x65, 0x58, 0x45, 0x4e, 0x74, 0x77, 0x4f, 0x4b, 0x34, 0x55, 0x55, 0x4a, 0x51, 0x48, 0x4b, 0x55, 0x41, + 0x43, 0x52, 0x48, 0x43, 0x55, 0x42, 0x79, 0x6c, 0x41, 0x41, 0x6b, 0x52, 0x77, 0x6c, 0x41, 0x63, 0x70, 0x51, + 0x41, 0x4a, 0x45, 0x63, 0x4a, 0x51, 0x48, 0x4b, 0x55, 0x41, 0x43, 0x52, 0x48, 0x43, 0x55, 0x42, 0x79, 0x6c, + 0x41, 0x41, 0x6b, 0x52, 0x77, 0x6c, 0x41, 0x63, 0x70, 0x51, 0x41, 0x4a, 0x45, 0x63, 0x4a, 0x51, 0x48, 0x4b, + 0x55, 0x5c, 0x0a, + 0x09, 0x41, 0x43, 0x52, 0x48, 0x43, 0x55, 0x42, 0x79, 0x6c, 0x41, 0x41, 0x6b, 0x52, 0x77, 0x6c, 0x41, 0x63, + 0x70, 0x51, 0x41, 0x4a, 0x45, 0x63, 0x4a, 0x51, 0x48, 0x4b, 0x55, 0x41, 0x43, 0x52, 0x48, 0x43, 0x55, 0x42, + 0x79, 0x6c, 0x41, 0x41, 0x6b, 0x52, 0x77, 0x6c, 0x41, 0x63, 0x70, 0x51, 0x41, 0x4a, 0x45, 0x63, 0x4a, 0x51, + 0x48, 0x4b, 0x55, 0x41, 0x43, 0x52, 0x48, 0x43, 0x55, 0x42, 0x79, 0x6c, 0x41, 0x41, 0x6b, 0x52, 0x77, 0x6c, + 0x41, 0x5c, 0x0a, + 0x09, 0x63, 0x6a, 0x7a, 0x44, 0x37, 0x55, 0x43, 0x32, 0x59, 0x4e, 0x52, 0x57, 0x4f, 0x32, 0x4c, 0x48, 0x50, + 0x57, 0x4f, 0x75, 0x49, 0x33, 0x61, 0x63, 0x77, 0x6c, 0x45, 0x42, 0x61, 0x4a, 0x72, 0x6d, 0x70, 0x4c, 0x6b, + 0x52, 0x51, 0x2f, 0x69, 0x54, 0x39, 0x54, 0x32, 0x62, 0x6c, 0x77, 0x42, 0x58, 0x41, 0x4d, 0x63, 0x41, 0x54, + 0x77, 0x4c, 0x2f, 0x69, 0x4f, 0x36, 0x76, 0x41, 0x4a, 0x34, 0x47, 0x4c, 0x67, 0x51, 0x2b, 0x41, 0x33, 0x34, + 0x41, 0x5c, 0x0a, + 0x09, 0x37, 0x41, 0x49, 0x6d, 0x41, 0x39, 0x63, 0x43, 0x52, 0x63, 0x41, 0x7a, 0x77, 0x45, 0x64, 0x4f, 0x50, + 0x43, 0x4d, 0x6e, 0x35, 0x33, 0x52, 0x51, 0x4b, 0x55, 0x44, 0x79, 0x33, 0x41, 0x4b, 0x73, 0x74, 0x76, 0x33, + 0x2f, 0x70, 0x47, 0x33, 0x37, 0x61, 0x65, 0x43, 0x69, 0x36, 0x50, 0x59, 0x30, 0x34, 0x46, 0x74, 0x41, 0x45, + 0x50, 0x67, 0x59, 0x79, 0x49, 0x76, 0x75, 0x72, 0x77, 0x4b, 0x2b, 0x4b, 0x39, 0x62, 0x46, 0x31, 0x46, 0x45, + 0x43, 0x5c, 0x0a, + 0x09, 0x47, 0x41, 0x54, 0x62, 0x32, 0x33, 0x2b, 0x62, 0x62, 0x58, 0x63, 0x6a, 0x38, 0x48, 0x4a, 0x30, 0x65, + 0x79, 0x47, 0x39, 0x6b, 0x51, 0x39, 0x51, 0x43, 0x7a, 0x77, 0x48, 0x2f, 0x49, 0x6e, 0x65, 0x79, 0x41, 0x64, + 0x34, 0x54, 0x5a, 0x43, 0x4c, 0x47, 0x61, 0x45, 0x79, 0x67, 0x63, 0x6c, 0x78, 0x4f, 0x6a, 0x44, 0x54, 0x39, + 0x76, 0x2b, 0x7a, 0x57, 0x47, 0x39, 0x34, 0x4d, 0x66, 0x42, 0x77, 0x54, 0x4e, 0x67, 0x6c, 0x77, 0x44, 0x6a, + 0x67, 0x5c, 0x0a, + 0x09, 0x5a, 0x74, 0x75, 0x2b, 0x52, 0x75, 0x41, 0x78, 0x6b, 0x51, 0x36, 0x6d, 0x69, 0x30, 0x6f, 0x42, 0x45, + 0x6d, 0x42, 0x37, 0x2b, 0x32, 0x2b, 0x4b, 0x4f, 0x66, 0x52, 0x34, 0x39, 0x4f, 0x38, 0x39, 0x77, 0x48, 0x6a, + 0x62, 0x2f, 0x6a, 0x58, 0x41, 0x4a, 0x75, 0x44, 0x76, 0x51, 0x4b, 0x35, 0x74, 0x2f, 0x2b, 0x2b, 0x41, 0x4c, + 0x67, 0x45, 0x75, 0x5a, 0x6f, 0x7a, 0x6d, 0x5a, 0x49, 0x5a, 0x69, 0x74, 0x47, 0x55, 0x43, 0x6f, 0x77, 0x4c, + 0x49, 0x5c, 0x0a, + 0x09, 0x42, 0x77, 0x35, 0x68, 0x5a, 0x65, 0x51, 0x41, 0x74, 0x6d, 0x47, 0x6c, 0x43, 0x46, 0x4f, 0x78, 0x6b, + 0x76, 0x75, 0x65, 0x6c, 0x36, 0x67, 0x4e, 0x6d, 0x49, 0x4c, 0x31, 0x72, 0x58, 0x2f, 0x4c, 0x5a, 0x71, 0x59, + 0x6d, 0x47, 0x74, 0x37, 0x77, 0x6e, 0x44, 0x4c, 0x50, 0x45, 0x62, 0x2b, 0x79, 0x4d, 0x68, 0x4e, 0x6f, 0x65, + 0x35, 0x75, 0x79, 0x6a, 0x61, 0x76, 0x6f, 0x6a, 0x58, 0x7a, 0x6f, 0x66, 0x66, 0x76, 0x76, 0x70, 0x65, 0x2f, + 0x7a, 0x5c, 0x0a, + 0x09, 0x75, 0x78, 0x38, 0x49, 0x41, 0x33, 0x2b, 0x31, 0x37, 0x64, 0x4f, 0x42, 0x47, 0x77, 0x45, 0x44, 0x42, + 0x6e, 0x38, 0x47, 0x54, 0x67, 0x6b, 0x6b, 0x46, 0x59, 0x51, 0x4c, 0x49, 0x4f, 0x61, 0x6d, 0x35, 0x77, 0x49, + 0x6e, 0x70, 0x47, 0x6d, 0x71, 0x6d, 0x4f, 0x48, 0x4a, 0x73, 0x39, 0x78, 0x75, 0x32, 0x77, 0x34, 0x42, 0x70, + 0x63, 0x42, 0x39, 0x57, 0x4a, 0x6d, 0x2f, 0x48, 0x6a, 0x6f, 0x42, 0x44, 0x61, 0x67, 0x47, 0x4b, 0x6d, 0x33, + 0x37, 0x5c, 0x0a, + 0x09, 0x58, 0x77, 0x46, 0x4f, 0x6a, 0x66, 0x37, 0x73, 0x6d, 0x45, 0x41, 0x72, 0x30, 0x41, 0x45, 0x30, 0x41, + 0x51, 0x65, 0x41, 0x77, 0x37, 0x45, 0x43, 0x47, 0x51, 0x70, 0x42, 0x43, 0x50, 0x38, 0x45, 0x52, 0x47, 0x39, + 0x4b, 0x77, 0x38, 0x6f, 0x73, 0x33, 0x65, 0x48, 0x59, 0x78, 0x55, 0x59, 0x66, 0x72, 0x63, 0x41, 0x48, 0x77, + 0x48, 0x2b, 0x77, 0x53, 0x68, 0x46, 0x37, 0x65, 0x77, 0x37, 0x45, 0x43, 0x73, 0x48, 0x52, 0x4f, 0x42, 0x4d, + 0x70, 0x5c, 0x0a, + 0x09, 0x41, 0x4a, 0x75, 0x69, 0x56, 0x77, 0x42, 0x33, 0x4f, 0x33, 0x61, 0x68, 0x30, 0x55, 0x38, 0x45, 0x36, + 0x31, 0x4f, 0x79, 0x6c, 0x47, 0x6a, 0x6d, 0x30, 0x53, 0x34, 0x43, 0x4a, 0x2b, 0x4e, 0x73, 0x4b, 0x4a, 0x4c, + 0x55, 0x4b, 0x75, 0x43, 0x75, 0x49, 0x62, 0x6a, 0x4f, 0x61, 0x4d, 0x49, 0x46, 0x4c, 0x4d, 0x61, 0x71, 0x4f, + 0x33, 0x43, 0x4c, 0x76, 0x70, 0x41, 0x51, 0x62, 0x47, 0x2f, 0x2f, 0x63, 0x67, 0x54, 0x66, 0x78, 0x43, 0x68, + 0x6d, 0x5c, 0x0a, + 0x09, 0x4c, 0x6c, 0x59, 0x6d, 0x56, 0x42, 0x69, 0x69, 0x55, 0x34, 0x41, 0x53, 0x59, 0x49, 0x48, 0x67, 0x61, + 0x34, 0x78, 0x32, 0x7a, 0x68, 0x64, 0x70, 0x58, 0x4c, 0x51, 0x41, 0x76, 0x6f, 0x31, 0x36, 0x2b, 0x7a, 0x4f, + 0x6c, 0x63, 0x76, 0x41, 0x67, 0x36, 0x53, 0x4f, 0x36, 0x47, 0x48, 0x68, 0x61, 0x4d, 0x6f, 0x47, 0x4f, 0x4e, + 0x4c, 0x66, 0x79, 0x35, 0x71, 0x61, 0x74, 0x62, 0x4b, 0x37, 0x35, 0x6c, 0x4c, 0x71, 0x47, 0x4a, 0x67, 0x4b, + 0x36, 0x5c, 0x0a, + 0x09, 0x7a, 0x74, 0x67, 0x79, 0x50, 0x37, 0x4f, 0x6e, 0x54, 0x65, 0x62, 0x43, 0x63, 0x2b, 0x59, 0x77, 0x59, + 0x38, 0x6f, 0x45, 0x77, 0x57, 0x36, 0x4b, 0x34, 0x55, 0x68, 0x7a, 0x4b, 0x32, 0x39, 0x73, 0x66, 0x4a, 0x39, + 0x33, 0x50, 0x39, 0x7a, 0x4a, 0x77, 0x66, 0x70, 0x47, 0x39, 0x46, 0x43, 0x59, 0x69, 0x72, 0x49, 0x53, 0x71, + 0x71, 0x5a, 0x50, 0x59, 0x66, 0x34, 0x35, 0x63, 0x35, 0x67, 0x78, 0x4f, 0x61, 0x6b, 0x53, 0x73, 0x53, 0x37, + 0x53, 0x5c, 0x0a, + 0x09, 0x52, 0x32, 0x47, 0x6c, 0x67, 0x47, 0x67, 0x65, 0x59, 0x44, 0x56, 0x57, 0x4b, 0x39, 0x71, 0x41, 0x68, + 0x4d, 0x4a, 0x68, 0x56, 0x6a, 0x32, 0x33, 0x6a, 0x69, 0x64, 0x65, 0x65, 0x6f, 0x76, 0x75, 0x59, 0x50, 0x7a, + 0x37, 0x6e, 0x48, 0x66, 0x6d, 0x62, 0x4f, 0x36, 0x36, 0x39, 0x56, 0x71, 0x4f, 0x48, 0x54, 0x66, 0x47, 0x4d, + 0x56, 0x39, 0x46, 0x6f, 0x6f, 0x66, 0x43, 0x50, 0x50, 0x4c, 0x73, 0x79, 0x7a, 0x7a, 0x31, 0x79, 0x72, 0x38, + 0x4a, 0x5c, 0x0a, + 0x09, 0x36, 0x71, 0x47, 0x34, 0x34, 0x63, 0x34, 0x2f, 0x71, 0x34, 0x72, 0x66, 0x4c, 0x76, 0x6b, 0x78, 0x34, + 0x79, 0x76, 0x4b, 0x45, 0x70, 0x6c, 0x37, 0x42, 0x62, 0x67, 0x38, 0x57, 0x30, 0x73, 0x42, 0x68, 0x66, 0x45, + 0x4f, 0x64, 0x48, 0x52, 0x31, 0x73, 0x32, 0x6a, 0x35, 0x53, 0x6c, 0x59, 0x39, 0x76, 0x79, 0x35, 0x68, 0x35, + 0x41, 0x4f, 0x73, 0x33, 0x37, 0x4b, 0x44, 0x42, 0x58, 0x66, 0x65, 0x77, 0x34, 0x65, 0x66, 0x37, 0x58, 0x48, + 0x63, 0x5c, 0x0a, + 0x09, 0x51, 0x61, 0x64, 0x70, 0x37, 0x2b, 0x7a, 0x6d, 0x68, 0x74, 0x38, 0x38, 0x79, 0x4b, 0x4e, 0x72, 0x33, + 0x30, 0x67, 0x59, 0x2b, 0x51, 0x42, 0x76, 0x76, 0x31, 0x66, 0x44, 0x67, 0x6a, 0x74, 0x57, 0x55, 0x4c, 0x74, + 0x37, 0x62, 0x36, 0x4a, 0x67, 0x63, 0x5a, 0x2b, 0x68, 0x45, 0x34, 0x67, 0x57, 0x67, 0x44, 0x2f, 0x65, 0x67, + 0x57, 0x55, 0x72, 0x48, 0x2b, 0x57, 0x44, 0x32, 0x6c, 0x31, 0x4a, 0x47, 0x32, 0x70, 0x74, 0x37, 0x2b, 0x53, + 0x57, 0x5c, 0x0a, + 0x09, 0x75, 0x78, 0x2b, 0x6d, 0x72, 0x71, 0x48, 0x4a, 0x45, 0x63, 0x64, 0x45, 0x59, 0x4a, 0x6f, 0x6d, 0x53, + 0x78, 0x39, 0x59, 0x52, 0x63, 0x33, 0x4f, 0x33, 0x55, 0x6d, 0x66, 0x30, 0x39, 0x7a, 0x57, 0x77, 0x65, 0x4b, + 0x37, 0x48, 0x36, 0x61, 0x68, 0x71, 0x54, 0x56, 0x65, 0x6b, 0x48, 0x47, 0x4f, 0x4f, 0x42, 0x65, 0x48, 0x6f, + 0x53, 0x67, 0x46, 0x39, 0x4f, 0x4f, 0x74, 0x54, 0x64, 0x75, 0x6f, 0x66, 0x76, 0x2f, 0x44, 0x6c, 0x49, 0x32, + 0x31, 0x5c, 0x0a, + 0x09, 0x74, 0x48, 0x65, 0x77, 0x63, 0x73, 0x33, 0x61, 0x6a, 0x4a, 0x30, 0x53, 0x78, 0x65, 0x73, 0x62, 0x33, + 0x32, 0x66, 0x54, 0x39, 0x74, 0x71, 0x55, 0x7a, 0x32, 0x74, 0x73, 0x61, 0x57, 0x50, 0x6c, 0x45, 0x33, 0x48, + 0x76, 0x71, 0x77, 0x4c, 0x45, 0x74, 0x61, 0x55, 0x4d, 0x69, 0x77, 0x42, 0x57, 0x76, 0x2f, 0x42, 0x36, 0x32, + 0x67, 0x5a, 0x66, 0x33, 0x37, 0x69, 0x46, 0x2f, 0x59, 0x63, 0x61, 0x30, 0x6a, 0x35, 0x66, 0x4a, 0x4a, 0x6e, + 0x63, 0x5c, 0x0a, + 0x09, 0x31, 0x36, 0x76, 0x56, 0x37, 0x33, 0x4b, 0x77, 0x6f, 0x58, 0x47, 0x67, 0x51, 0x78, 0x55, 0x49, 0x6a, + 0x43, 0x66, 0x52, 0x41, 0x69, 0x69, 0x4e, 0x33, 0x56, 0x48, 0x58, 0x30, 0x45, 0x54, 0x74, 0x46, 0x31, 0x39, + 0x6c, 0x5a, 0x48, 0x54, 0x39, 0x6c, 0x68, 0x30, 0x5a, 0x6e, 0x53, 0x2b, 0x43, 0x66, 0x58, 0x58, 0x31, 0x66, + 0x4c, 0x37, 0x33, 0x36, 0x37, 0x54, 0x50, 0x4e, 0x30, 0x32, 0x54, 0x64, 0x77, 0x5a, 0x4f, 0x46, 0x56, 0x31, + 0x41, 0x5c, 0x0a, + 0x09, 0x65, 0x64, 0x71, 0x47, 0x42, 0x30, 0x47, 0x49, 0x41, 0x47, 0x7a, 0x4a, 0x56, 0x55, 0x58, 0x73, 0x73, + 0x53, 0x2f, 0x32, 0x31, 0x32, 0x56, 0x73, 0x66, 0x34, 0x38, 0x44, 0x4e, 0x70, 0x78, 0x6d, 0x37, 0x34, 0x48, + 0x44, 0x47, 0x64, 0x76, 0x59, 0x76, 0x65, 0x39, 0x67, 0x76, 0x45, 0x4e, 0x78, 0x38, 0x31, 0x4b, 0x5a, 0x49, + 0x6a, 0x49, 0x46, 0x38, 0x41, 0x4f, 0x2b, 0x32, 0x4a, 0x33, 0x74, 0x6e, 0x5a, 0x6c, 0x33, 0x6a, 0x47, 0x6c, + 0x70, 0x5c, 0x0a, + 0x09, 0x37, 0x38, 0x7a, 0x59, 0x68, 0x74, 0x4f, 0x30, 0x74, 0x48, 0x64, 0x6b, 0x62, 0x4b, 0x4d, 0x74, 0x2f, + 0x72, 0x50, 0x4a, 0x53, 0x67, 0x45, 0x4d, 0x6d, 0x48, 0x73, 0x74, 0x39, 0x78, 0x64, 0x6e, 0x62, 0x4c, 0x69, + 0x69, 0x64, 0x4d, 0x43, 0x73, 0x78, 0x62, 0x41, 0x79, 0x78, 0x67, 0x47, 0x66, 0x45, 0x74, 0x78, 0x58, 0x76, + 0x30, 0x2b, 0x70, 0x55, 0x34, 0x67, 0x55, 0x77, 0x4e, 0x69, 0x42, 0x64, 0x70, 0x34, 0x30, 0x6f, 0x52, 0x4b, + 0x33, 0x5c, 0x0a, + 0x09, 0x4f, 0x37, 0x50, 0x4c, 0x7a, 0x6a, 0x67, 0x78, 0x33, 0x54, 0x34, 0x6c, 0x34, 0x70, 0x67, 0x32, 0x38, + 0x54, 0x68, 0x63, 0x47, 0x58, 0x61, 0x4a, 0x4f, 0x7a, 0x6c, 0x2b, 0x7a, 0x61, 0x41, 0x66, 0x78, 0x4a, 0x51, + 0x45, 0x48, 0x4b, 0x38, 0x4b, 0x74, 0x6a, 0x6b, 0x35, 0x66, 0x71, 0x44, 0x6a, 0x4a, 0x55, 0x55, 0x46, 0x6e, + 0x48, 0x76, 0x71, 0x4b, 0x57, 0x7a, 0x59, 0x2b, 0x6c, 0x46, 0x61, 0x39, 0x6e, 0x4e, 0x38, 0x58, 0x75, 0x61, + 0x64, 0x5c, 0x0a, + 0x09, 0x4d, 0x54, 0x75, 0x6c, 0x63, 0x77, 0x34, 0x32, 0x4e, 0x4c, 0x4c, 0x70, 0x67, 0x30, 0x2f, 0x34, 0x71, + 0x71, 0x36, 0x65, 0x6c, 0x72, 0x59, 0x4f, 0x75, 0x67, 0x4a, 0x42, 0x79, 0x35, 0x62, 0x58, 0x69, 0x38, 0x75, + 0x6c, 0x55, 0x5a, 0x43, 0x66, 0x52, 0x32, 0x6c, 0x78, 0x49, 0x65, 0x50, 0x4b, 0x53, 0x7a, 0x6c, 0x2b, 0x2f, + 0x46, 0x69, 0x6d, 0x54, 0x54, 0x79, 0x4f, 0x6f, 0x6f, 0x4b, 0x38, 0x51, 0x61, 0x7a, 0x32, 0x70, 0x61, 0x79, + 0x6b, 0x5c, 0x0a, + 0x09, 0x69, 0x4c, 0x4f, 0x72, 0x54, 0x6b, 0x36, 0x72, 0x47, 0x41, 0x69, 0x51, 0x6c, 0x2b, 0x50, 0x6a, 0x76, + 0x4e, 0x4e, 0x6e, 0x78, 0x54, 0x73, 0x38, 0x43, 0x2f, 0x67, 0x6e, 0x59, 0x44, 0x67, 0x74, 0x41, 0x6b, 0x63, + 0x46, 0x59, 0x48, 0x4e, 0x75, 0x46, 0x76, 0x31, 0x37, 0x30, 0x68, 0x37, 0x6c, 0x7a, 0x75, 0x73, 0x75, 0x5a, + 0x2b, 0x4f, 0x32, 0x6a, 0x39, 0x4f, 0x71, 0x30, 0x76, 0x7a, 0x70, 0x67, 0x67, 0x73, 0x70, 0x4b, 0x53, 0x70, + 0x49, 0x5c, 0x0a, + 0x09, 0x4f, 0x6e, 0x77, 0x6f, 0x48, 0x4f, 0x62, 0x79, 0x32, 0x31, 0x66, 0x51, 0x6d, 0x6b, 0x4b, 0x2b, 0x51, + 0x64, 0x4d, 0x30, 0x4c, 0x6a, 0x33, 0x76, 0x4c, 0x46, 0x59, 0x75, 0x57, 0x35, 0x79, 0x53, 0x62, 0x33, 0x64, + 0x63, 0x74, 0x79, 0x42, 0x74, 0x41, 0x64, 0x78, 0x38, 0x31, 0x66, 0x63, 0x53, 0x69, 0x57, 0x34, 0x35, 0x63, + 0x41, 0x50, 0x77, 0x4b, 0x2b, 0x42, 0x35, 0x6f, 0x37, 0x62, 0x61, 0x73, 0x53, 0x46, 0x6d, 0x6a, 0x6e, 0x30, + 0x43, 0x5c, 0x0a, + 0x09, 0x62, 0x47, 0x50, 0x6e, 0x48, 0x73, 0x44, 0x71, 0x43, 0x54, 0x73, 0x2f, 0x58, 0x74, 0x67, 0x5a, 0x55, + 0x79, 0x5a, 0x77, 0x36, 0x38, 0x4a, 0x4c, 0x55, 0x72, 0x37, 0x47, 0x39, 0x45, 0x6e, 0x48, 0x73, 0x2b, 0x53, + 0x48, 0x33, 0x30, 0x2f, 0x70, 0x6e, 0x4b, 0x62, 0x57, 0x39, 0x70, 0x51, 0x69, 0x48, 0x36, 0x77, 0x69, 0x32, + 0x61, 0x76, 0x56, 0x37, 0x31, 0x4c, 0x66, 0x31, 0x4a, 0x4c, 0x53, 0x65, 0x62, 0x4e, 0x4f, 0x6d, 0x73, 0x54, + 0x4e, 0x5c, 0x0a, + 0x09, 0x56, 0x31, 0x34, 0x30, 0x65, 0x4d, 0x41, 0x59, 0x5a, 0x6b, 0x36, 0x64, 0x79, 0x4f, 0x4b, 0x72, 0x4c, + 0x68, 0x34, 0x73, 0x57, 0x43, 0x58, 0x57, 0x61, 0x4b, 0x51, 0x4a, 0x4b, 0x56, 0x38, 0x67, 0x41, 0x55, 0x37, + 0x6e, 0x41, 0x61, 0x34, 0x44, 0x66, 0x6f, 0x33, 0x56, 0x42, 0x7a, 0x41, 0x68, 0x53, 0x36, 0x39, 0x66, 0x77, + 0x45, 0x31, 0x58, 0x4a, 0x50, 0x2b, 0x77, 0x5a, 0x6b, 0x36, 0x64, 0x79, 0x4a, 0x72, 0x37, 0x66, 0x6b, 0x6d, + 0x75, 0x5c, 0x0a, + 0x09, 0x72, 0x31, 0x2f, 0x42, 0x49, 0x69, 0x48, 0x6a, 0x79, 0x6b, 0x75, 0x70, 0x54, 0x4b, 0x4d, 0x52, 0x36, + 0x5a, 0x69, 0x78, 0x35, 0x57, 0x6c, 0x6c, 0x4e, 0x70, 0x66, 0x39, 0x35, 0x47, 0x6f, 0x57, 0x58, 0x5a, 0x62, + 0x38, 0x43, 0x4c, 0x43, 0x71, 0x61, 0x5a, 0x4e, 0x35, 0x64, 0x4d, 0x56, 0x53, 0x63, 0x6e, 0x7a, 0x65, 0x5a, + 0x49, 0x4c, 0x6e, 0x41, 0x41, 0x2b, 0x6c, 0x37, 0x46, 0x51, 0x43, 0x48, 0x47, 0x73, 0x4e, 0x6a, 0x4b, 0x59, + 0x41, 0x5c, 0x0a, + 0x09, 0x37, 0x77, 0x46, 0x6e, 0x70, 0x6e, 0x4c, 0x65, 0x66, 0x32, 0x74, 0x71, 0x57, 0x62, 0x6c, 0x6d, 0x4c, + 0x54, 0x76, 0x33, 0x37, 0x42, 0x76, 0x77, 0x75, 0x4c, 0x2b, 0x6f, 0x6b, 0x4d, 0x56, 0x58, 0x58, 0x38, 0x79, + 0x69, 0x79, 0x79, 0x37, 0x41, 0x36, 0x30, 0x6e, 0x76, 0x69, 0x2f, 0x57, 0x76, 0x54, 0x56, 0x75, 0x35, 0x38, + 0x34, 0x39, 0x2f, 0x54, 0x6a, 0x71, 0x38, 0x53, 0x39, 0x4e, 0x59, 0x76, 0x57, 0x49, 0x70, 0x33, 0x7a, 0x6c, + 0x74, 0x5c, 0x0a, + 0x09, 0x35, 0x75, 0x43, 0x42, 0x34, 0x37, 0x42, 0x78, 0x32, 0x38, 0x63, 0x38, 0x39, 0x4f, 0x53, 0x4c, 0x2f, + 0x4f, 0x2f, 0x4c, 0x2f, 0x51, 0x4d, 0x65, 0x39, 0x78, 0x63, 0x56, 0x73, 0x75, 0x53, 0x61, 0x53, 0x37, 0x6a, + 0x2b, 0x30, 0x67, 0x76, 0x77, 0x65, 0x46, 0x4c, 0x71, 0x4d, 0x74, 0x45, 0x4e, 0x35, 0x44, 0x76, 0x31, 0x43, + 0x58, 0x42, 0x61, 0x41, 0x44, 0x71, 0x51, 0x6c, 0x4a, 0x52, 0x6a, 0x32, 0x62, 0x6c, 0x6e, 0x48, 0x35, 0x74, + 0x33, 0x5c, 0x0a, + 0x09, 0x66, 0x45, 0x70, 0x64, 0x66, 0x52, 0x4e, 0x36, 0x4b, 0x4d, 0x53, 0x59, 0x30, 0x68, 0x4b, 0x71, 0x70, + 0x6b, 0x2f, 0x6d, 0x7a, 0x47, 0x39, 0x4f, 0x78, 0x2b, 0x66, 0x4e, 0x50, 0x4b, 0x76, 0x79, 0x7a, 0x4c, 0x71, + 0x33, 0x2b, 0x63, 0x4e, 0x6a, 0x7a, 0x32, 0x45, 0x59, 0x6b, 0x59, 0x54, 0x68, 0x78, 0x70, 0x62, 0x35, 0x75, + 0x66, 0x66, 0x32, 0x52, 0x63, 0x77, 0x39, 0x49, 0x32, 0x36, 0x47, 0x4c, 0x47, 0x6c, 0x4d, 0x30, 0x32, 0x54, + 0x6e, 0x5c, 0x0a, + 0x09, 0x6e, 0x76, 0x31, 0x73, 0x72, 0x71, 0x6e, 0x6c, 0x30, 0x4a, 0x46, 0x6d, 0x39, 0x46, 0x43, 0x49, 0x69, + 0x6a, 0x49, 0x2f, 0x73, 0x36, 0x64, 0x4e, 0x79, 0x76, 0x53, 0x2b, 0x74, 0x4a, 0x45, 0x71, 0x67, 0x42, 0x47, + 0x39, 0x46, 0x76, 0x32, 0x65, 0x72, 0x2b, 0x74, 0x34, 0x2f, 0x4d, 0x55, 0x33, 0x57, 0x62, 0x39, 0x6c, 0x42, + 0x38, 0x31, 0x74, 0x76, 0x52, 0x55, 0x33, 0x65, 0x62, 0x6b, 0x35, 0x7a, 0x44, 0x70, 0x70, 0x45, 0x76, 0x50, + 0x50, 0x5c, 0x0a, + 0x09, 0x6e, 0x73, 0x4f, 0x56, 0x38, 0x38, 0x39, 0x4e, 0x2b, 0x54, 0x4d, 0x7a, 0x78, 0x4f, 0x77, 0x43, 0x70, + 0x6f, 0x35, 0x55, 0x41, 0x65, 0x77, 0x44, 0x6a, 0x6e, 0x50, 0x45, 0x6f, 0x47, 0x43, 0x4f, 0x4e, 0x4c, 0x63, + 0x53, 0x31, 0x45, 0x50, 0x6b, 0x35, 0x76, 0x67, 0x63, 0x71, 0x5a, 0x77, 0x61, 0x51, 0x6d, 0x34, 0x45, 0x6e, + 0x68, 0x70, 0x78, 0x70, 0x59, 0x41, 0x6f, 0x54, 0x7a, 0x6c, 0x73, 0x54, 0x78, 0x68, 0x6a, 0x53, 0x6b, 0x73, + 0x34, 0x5c, 0x0a, + 0x09, 0x64, 0x74, 0x79, 0x59, 0x62, 0x49, 0x72, 0x38, 0x49, 0x50, 0x41, 0x4c, 0x48, 0x48, 0x37, 0x47, 0x54, + 0x6c, 0x63, 0x45, 0x2f, 0x52, 0x35, 0x72, 0x54, 0x50, 0x7a, 0x50, 0x36, 0x54, 0x73, 0x32, 0x58, 0x70, 0x45, + 0x5a, 0x6e, 0x77, 0x49, 0x58, 0x41, 0x48, 0x58, 0x67, 0x37, 0x44, 0x51, 0x7a, 0x54, 0x71, 0x63, 0x41, 0x4f, + 0x72, 0x43, 0x4d, 0x4a, 0x44, 0x75, 0x44, 0x4b, 0x70, 0x4a, 0x6d, 0x46, 0x39, 0x48, 0x49, 0x64, 0x33, 0x71, + 0x38, 0x5c, 0x0a, + 0x09, 0x6f, 0x47, 0x4d, 0x43, 0x63, 0x4d, 0x2b, 0x59, 0x61, 0x33, 0x63, 0x75, 0x61, 0x39, 0x4c, 0x56, 0x62, + 0x45, 0x4c, 0x45, 0x59, 0x46, 0x46, 0x52, 0x6a, 0x55, 0x48, 0x43, 0x6d, 0x69, 0x38, 0x6c, 0x4a, 0x53, 0x6a, + 0x4b, 0x73, 0x42, 0x4a, 0x41, 0x64, 0x74, 0x41, 0x74, 0x79, 0x72, 0x44, 0x6a, 0x41, 0x6a, 0x41, 0x30, 0x4e, + 0x79, 0x67, 0x42, 0x4f, 0x45, 0x33, 0x32, 0x43, 0x43, 0x44, 0x67, 0x4b, 0x79, 0x62, 0x6f, 0x7a, 0x5a, 0x38, + 0x51, 0x5c, 0x0a, + 0x09, 0x30, 0x64, 0x54, 0x38, 0x55, 0x77, 0x34, 0x69, 0x37, 0x42, 0x50, 0x67, 0x65, 0x48, 0x2b, 0x41, 0x7a, + 0x6c, 0x77, 0x2f, 0x59, 0x58, 0x66, 0x75, 0x54, 0x4e, 0x32, 0x54, 0x69, 0x79, 0x2f, 0x63, 0x54, 0x55, 0x36, + 0x6f, 0x4d, 0x2f, 0x72, 0x72, 0x77, 0x6d, 0x73, 0x45, 0x6e, 0x4c, 0x36, 0x63, 0x4c, 0x41, 0x6a, 0x72, 0x42, + 0x75, 0x32, 0x34, 0x41, 0x41, 0x4c, 0x65, 0x59, 0x69, 0x49, 0x75, 0x64, 0x77, 0x65, 0x41, 0x37, 0x73, 0x6c, + 0x48, 0x5c, 0x0a, + 0x09, 0x39, 0x2b, 0x54, 0x54, 0x6e, 0x6d, 0x66, 0x31, 0x44, 0x58, 0x57, 0x5a, 0x42, 0x72, 0x35, 0x51, 0x46, + 0x7a, 0x6e, 0x68, 0x4c, 0x6e, 0x4a, 0x43, 0x6e, 0x66, 0x6a, 0x43, 0x58, 0x58, 0x67, 0x4d, 0x6f, 0x55, 0x50, + 0x66, 0x52, 0x67, 0x73, 0x62, 0x75, 0x6e, 0x4c, 0x45, 0x64, 0x49, 0x4e, 0x7a, 0x58, 0x41, 0x41, 0x52, 0x6c, + 0x78, 0x75, 0x73, 0x5a, 0x73, 0x76, 0x2b, 0x78, 0x7a, 0x51, 0x33, 0x41, 0x56, 0x38, 0x52, 0x41, 0x56, 0x2f, + 0x76, 0x5c, 0x0a, + 0x09, 0x6e, 0x45, 0x75, 0x75, 0x53, 0x42, 0x68, 0x66, 0x75, 0x4e, 0x76, 0x32, 0x36, 0x38, 0x4a, 0x72, 0x42, + 0x4e, 0x48, 0x4d, 0x78, 0x49, 0x30, 0x32, 0x32, 0x59, 0x6a, 0x68, 0x38, 0x68, 0x44, 0x52, 0x50, 0x45, 0x52, + 0x63, 0x48, 0x69, 0x4b, 0x61, 0x47, 0x38, 0x50, 0x6c, 0x4a, 0x71, 0x4b, 0x35, 0x69, 0x66, 0x54, 0x38, 0x31, + 0x54, 0x79, 0x39, 0x32, 0x30, 0x66, 0x33, 0x75, 0x55, 0x30, 0x30, 0x7a, 0x5a, 0x38, 0x58, 0x6a, 0x44, 0x74, + 0x79, 0x5c, 0x0a, + 0x09, 0x4b, 0x43, 0x4f, 0x47, 0x66, 0x5a, 0x37, 0x41, 0x69, 0x4d, 0x76, 0x54, 0x54, 0x78, 0x51, 0x41, 0x48, + 0x6b, 0x50, 0x48, 0x61, 0x77, 0x54, 0x77, 0x47, 0x67, 0x45, 0x38, 0x68, 0x6f, 0x37, 0x62, 0x43, 0x4f, 0x47, + 0x4a, 0x36, 0x48, 0x67, 0x4d, 0x48, 0x5a, 0x63, 0x5a, 0x52, 0x6e, 0x4e, 0x77, 0x67, 0x47, 0x53, 0x6d, 0x68, + 0x4e, 0x30, 0x2b, 0x51, 0x75, 0x35, 0x63, 0x77, 0x6d, 0x34, 0x66, 0x68, 0x73, 0x73, 0x62, 0x2f, 0x56, 0x6b, + 0x52, 0x5c, 0x0a, + 0x09, 0x33, 0x52, 0x50, 0x70, 0x68, 0x69, 0x76, 0x39, 0x6c, 0x6a, 0x39, 0x67, 0x59, 0x57, 0x64, 0x4f, 0x71, + 0x5a, 0x43, 0x5a, 0x52, 0x6b, 0x55, 0x4a, 0x6f, 0x44, 0x6c, 0x54, 0x41, 0x32, 0x47, 0x33, 0x6a, 0x37, 0x44, + 0x62, 0x52, 0x33, 0x65, 0x63, 0x4f, 0x69, 0x58, 0x4e, 0x6a, 0x4b, 0x43, 0x6c, 0x30, 0x50, 0x69, 0x6f, 0x6d, + 0x5a, 0x45, 0x2b, 0x6f, 0x6e, 0x47, 0x5a, 0x52, 0x6d, 0x4a, 0x62, 0x70, 0x6f, 0x6b, 0x72, 0x51, 0x53, 0x6f, + 0x55, 0x5c, 0x0a, + 0x09, 0x63, 0x62, 0x6b, 0x78, 0x30, 0x51, 0x69, 0x35, 0x63, 0x34, 0x69, 0x6b, 0x48, 0x37, 0x6e, 0x4a, 0x55, + 0x6f, 0x57, 0x67, 0x4f, 0x52, 0x68, 0x46, 0x65, 0x66, 0x36, 0x6c, 0x49, 0x4c, 0x74, 0x48, 0x4d, 0x54, 0x56, + 0x58, 0x61, 0x6d, 0x33, 0x50, 0x57, 0x6c, 0x62, 0x50, 0x55, 0x31, 0x45, 0x30, 0x65, 0x4a, 0x44, 0x30, 0x45, + 0x46, 0x56, 0x57, 0x57, 0x79, 0x66, 0x49, 0x72, 0x71, 0x77, 0x63, 0x45, 0x47, 0x56, 0x59, 0x6c, 0x41, 0x42, + 0x71, 0x5c, 0x0a, + 0x09, 0x67, 0x41, 0x32, 0x43, 0x62, 0x4d, 0x76, 0x49, 0x64, 0x6c, 0x47, 0x47, 0x48, 0x52, 0x66, 0x41, 0x6c, + 0x4c, 0x46, 0x48, 0x4b, 0x77, 0x47, 0x58, 0x4f, 0x32, 0x31, 0x62, 0x59, 0x6f, 0x53, 0x39, 0x54, 0x43, 0x4b, + 0x72, 0x36, 0x7a, 0x59, 0x44, 0x4c, 0x77, 0x69, 0x30, 0x4c, 0x77, 0x73, 0x6d, 0x73, 0x46, 0x47, 0x55, 0x63, + 0x53, 0x45, 0x43, 0x73, 0x4b, 0x55, 0x43, 0x74, 0x77, 0x46, 0x48, 0x52, 0x46, 0x78, 0x44, 0x49, 0x72, 0x59, + 0x44, 0x5c, 0x0a, + 0x09, 0x39, 0x61, 0x4b, 0x4d, 0x69, 0x36, 0x36, 0x77, 0x62, 0x79, 0x44, 0x42, 0x4a, 0x46, 0x47, 0x4b, 0x70, + 0x48, 0x67, 0x4e, 0x2b, 0x72, 0x78, 0x55, 0x6a, 0x69, 0x4a, 0x4d, 0x41, 0x44, 0x61, 0x48, 0x58, 0x77, 0x49, + 0x65, 0x46, 0x48, 0x57, 0x64, 0x55, 0x59, 0x36, 0x42, 0x34, 0x48, 0x36, 0x57, 0x51, 0x6c, 0x4f, 0x41, 0x6d, + 0x41, 0x7a, 0x68, 0x79, 0x4a, 0x33, 0x63, 0x5a, 0x2b, 0x54, 0x79, 0x4f, 0x49, 0x4c, 0x72, 0x56, 0x49, 0x61, + 0x71, 0x5c, 0x0a, + 0x09, 0x7a, 0x64, 0x59, 0x41, 0x66, 0x6f, 0x51, 0x31, 0x61, 0x62, 0x52, 0x71, 0x2f, 0x55, 0x6d, 0x4f, 0x74, + 0x56, 0x69, 0x39, 0x67, 0x49, 0x55, 0x6c, 0x2f, 0x7a, 0x41, 0x45, 0x41, 0x72, 0x41, 0x35, 0x62, 0x32, 0x43, + 0x74, 0x71, 0x6e, 0x45, 0x69, 0x38, 0x42, 0x63, 0x45, 0x64, 0x6e, 0x4c, 0x49, 0x59, 0x68, 0x71, 0x42, 0x52, + 0x37, 0x42, 0x47, 0x56, 0x79, 0x39, 0x6b, 0x43, 0x4e, 0x59, 0x5a, 0x47, 0x74, 0x49, 0x31, 0x67, 0x33, 0x62, + 0x58, 0x5c, 0x0a, + 0x09, 0x39, 0x78, 0x6c, 0x74, 0x57, 0x77, 0x70, 0x63, 0x44, 0x56, 0x79, 0x44, 0x4e, 0x53, 0x76, 0x32, 0x36, + 0x46, 0x70, 0x77, 0x4b, 0x48, 0x6b, 0x61, 0x73, 0x47, 0x70, 0x4f, 0x31, 0x77, 0x4a, 0x76, 0x59, 0x36, 0x31, + 0x4b, 0x41, 0x73, 0x52, 0x2f, 0x38, 0x37, 0x4e, 0x6d, 0x77, 0x59, 0x68, 0x34, 0x32, 0x49, 0x56, 0x51, 0x45, + 0x47, 0x6a, 0x45, 0x33, 0x33, 0x56, 0x34, 0x56, 0x64, 0x42, 0x62, 0x38, 0x4c, 0x4d, 0x75, 0x58, 0x77, 0x6b, + 0x42, 0x5c, 0x0a, + 0x09, 0x58, 0x7a, 0x47, 0x6a, 0x76, 0x54, 0x65, 0x52, 0x68, 0x74, 0x6c, 0x67, 0x6f, 0x72, 0x32, 0x49, 0x4e, + 0x65, 0x6e, 0x44, 0x4f, 0x30, 0x54, 0x58, 0x46, 0x4f, 0x70, 0x68, 0x73, 0x43, 0x51, 0x2f, 0x4b, 0x78, 0x65, + 0x4e, 0x73, 0x6d, 0x4f, 0x2f, 0x51, 0x62, 0x33, 0x32, 0x48, 0x56, 0x78, 0x6d, 0x52, 0x50, 0x65, 0x47, 0x41, + 0x78, 0x52, 0x32, 0x4e, 0x32, 0x4b, 0x69, 0x45, 0x66, 0x51, 0x57, 0x48, 0x47, 0x30, 0x69, 0x44, 0x6e, 0x6f, + 0x4b, 0x5c, 0x0a, + 0x09, 0x4d, 0x45, 0x66, 0x42, 0x61, 0x6d, 0x54, 0x65, 0x63, 0x49, 0x42, 0x38, 0x76, 0x59, 0x58, 0x38, 0x59, + 0x43, 0x75, 0x2b, 0x63, 0x50, 0x63, 0x31, 0x6a, 0x59, 0x57, 0x56, 0x31, 0x52, 0x31, 0x35, 0x76, 0x63, 0x50, + 0x57, 0x52, 0x58, 0x37, 0x6e, 0x45, 0x7a, 0x48, 0x73, 0x2f, 0x51, 0x47, 0x69, 0x54, 0x61, 0x35, 0x48, 0x35, + 0x31, 0x62, 0x56, 0x4d, 0x4d, 0x6b, 0x4e, 0x64, 0x5a, 0x41, 0x62, 0x36, 0x6f, 0x44, 0x4f, 0x4f, 0x6b, 0x78, + 0x4e, 0x5c, 0x0a, + 0x09, 0x51, 0x2f, 0x66, 0x6b, 0x30, 0x31, 0x49, 0x77, 0x2f, 0x6d, 0x2f, 0x64, 0x76, 0x75, 0x4a, 0x43, 0x34, + 0x47, 0x77, 0x45, 0x54, 0x35, 0x2f, 0x71, 0x46, 0x4c, 0x6c, 0x36, 0x4f, 0x2f, 0x6c, 0x36, 0x4b, 0x2f, 0x6e, + 0x42, 0x56, 0x6a, 0x78, 0x47, 0x6e, 0x32, 0x35, 0x39, 0x2b, 0x38, 0x76, 0x62, 0x39, 0x2f, 0x4f, 0x4e, 0x45, + 0x36, 0x59, 0x4d, 0x6c, 0x32, 0x74, 0x48, 0x47, 0x58, 0x59, 0x42, 0x52, 0x46, 0x6d, 0x4c, 0x4e, 0x61, 0x79, + 0x73, 0x5c, 0x0a, + 0x09, 0x33, 0x32, 0x75, 0x67, 0x6d, 0x61, 0x61, 0x5a, 0x45, 0x2b, 0x71, 0x38, 0x4e, 0x30, 0x66, 0x76, 0x57, + 0x4b, 0x46, 0x37, 0x38, 0x6a, 0x42, 0x63, 0x58, 0x6f, 0x42, 0x6a, 0x73, 0x65, 0x59, 0x68, 0x6d, 0x42, 0x50, + 0x39, 0x7a, 0x57, 0x5a, 0x6b, 0x69, 0x43, 0x4b, 0x51, 0x70, 0x37, 0x64, 0x36, 0x43, 0x77, 0x49, 0x74, 0x37, + 0x6e, 0x79, 0x39, 0x46, 0x56, 0x63, 0x6b, 0x50, 0x46, 0x43, 0x59, 0x44, 0x63, 0x44, 0x75, 0x56, 0x50, 0x6f, + 0x79, 0x5c, 0x0a, + 0x09, 0x69, 0x47, 0x54, 0x59, 0x46, 0x34, 0x36, 0x30, 0x7a, 0x53, 0x74, 0x55, 0x68, 0x62, 0x58, 0x65, 0x37, + 0x72, 0x6c, 0x59, 0x77, 0x6a, 0x79, 0x45, 0x74, 0x51, 0x44, 0x6a, 0x49, 0x31, 0x69, 0x72, 0x61, 0x65, 0x45, + 0x35, 0x5a, 0x56, 0x35, 0x73, 0x52, 0x74, 0x4a, 0x4f, 0x47, 0x54, 0x41, 0x64, 0x4f, 0x42, 0x6c, 0x72, 0x55, + 0x63, 0x64, 0x4b, 0x4c, 0x4b, 0x45, 0x63, 0x45, 0x39, 0x30, 0x65, 0x73, 0x4a, 0x74, 0x61, 0x6d, 0x68, 0x68, + 0x59, 0x5c, 0x0a, + 0x09, 0x51, 0x37, 0x57, 0x2b, 0x77, 0x68, 0x6f, 0x52, 0x2f, 0x54, 0x6e, 0x57, 0x67, 0x70, 0x4c, 0x56, 0x45, + 0x2b, 0x71, 0x33, 0x50, 0x30, 0x44, 0x66, 0x64, 0x59, 0x62, 0x74, 0x31, 0x41, 0x43, 0x58, 0x41, 0x67, 0x63, + 0x79, 0x47, 0x65, 0x57, 0x54, 0x39, 0x5a, 0x6e, 0x41, 0x57, 0x47, 0x4a, 0x6d, 0x76, 0x76, 0x4a, 0x67, 0x72, + 0x5a, 0x72, 0x56, 0x70, 0x7a, 0x74, 0x4f, 0x6f, 0x67, 0x65, 0x57, 0x51, 0x42, 0x52, 0x32, 0x43, 0x72, 0x46, + 0x6d, 0x5c, 0x0a, + 0x09, 0x4c, 0x69, 0x32, 0x33, 0x2f, 0x66, 0x78, 0x59, 0x67, 0x31, 0x69, 0x4c, 0x67, 0x49, 0x4c, 0x6f, 0x64, + 0x73, 0x2f, 0x30, 0x37, 0x47, 0x31, 0x59, 0x53, 0x37, 0x6e, 0x56, 0x59, 0x2b, 0x58, 0x55, 0x44, 0x30, 0x64, + 0x2f, 0x44, 0x56, 0x6a, 0x74, 0x47, 0x2f, 0x30, 0x65, 0x6e, 0x4c, 0x2b, 0x7a, 0x44, 0x6e, 0x39, 0x6e, 0x6e, + 0x51, 0x39, 0x72, 0x6c, 0x62, 0x51, 0x62, 0x73, 0x57, 0x5a, 0x4b, 0x36, 0x77, 0x53, 0x32, 0x59, 0x69, 0x30, + 0x66, 0x5c, 0x0a, + 0x09, 0x2f, 0x7a, 0x54, 0x52, 0x58, 0x50, 0x36, 0x6f, 0x46, 0x45, 0x43, 0x6d, 0x32, 0x43, 0x61, 0x61, 0x41, + 0x70, 0x77, 0x62, 0x42, 0x66, 0x74, 0x46, 0x67, 0x35, 0x67, 0x4f, 0x6c, 0x5a, 0x4d, 0x72, 0x2b, 0x76, 0x62, + 0x55, 0x6a, 0x66, 0x55, 0x2f, 0x48, 0x6b, 0x36, 0x4f, 0x37, 0x73, 0x32, 0x55, 0x45, 0x53, 0x55, 0x41, 0x78, + 0x64, 0x41, 0x7a, 0x75, 0x67, 0x76, 0x63, 0x69, 0x6b, 0x46, 0x52, 0x41, 0x70, 0x41, 0x63, 0x4a, 0x51, 0x44, + 0x4a, 0x5c, 0x0a, + 0x09, 0x55, 0x51, 0x4b, 0x51, 0x48, 0x43, 0x55, 0x41, 0x79, 0x56, 0x45, 0x43, 0x6b, 0x42, 0x77, 0x6c, 0x41, + 0x4d, 0x6c, 0x52, 0x41, 0x70, 0x41, 0x63, 0x4a, 0x51, 0x44, 0x4a, 0x55, 0x51, 0x4b, 0x51, 0x48, 0x43, 0x55, + 0x41, 0x79, 0x56, 0x45, 0x43, 0x6b, 0x42, 0x77, 0x6c, 0x41, 0x4d, 0x6c, 0x52, 0x41, 0x70, 0x41, 0x63, 0x4a, + 0x51, 0x44, 0x4a, 0x55, 0x51, 0x4b, 0x51, 0x48, 0x43, 0x55, 0x41, 0x79, 0x56, 0x45, 0x43, 0x6b, 0x42, 0x77, + 0x6c, 0x5c, 0x0a, + 0x09, 0x41, 0x4d, 0x6c, 0x52, 0x41, 0x70, 0x41, 0x63, 0x4a, 0x51, 0x44, 0x4a, 0x55, 0x51, 0x4b, 0x51, 0x48, + 0x43, 0x55, 0x41, 0x79, 0x56, 0x45, 0x43, 0x6b, 0x42, 0x77, 0x6c, 0x41, 0x4d, 0x6c, 0x52, 0x41, 0x70, 0x41, + 0x63, 0x4a, 0x51, 0x44, 0x4a, 0x55, 0x51, 0x4b, 0x51, 0x48, 0x43, 0x55, 0x41, 0x79, 0x56, 0x45, 0x43, 0x6b, + 0x4a, 0x7a, 0x2f, 0x41, 0x37, 0x77, 0x33, 0x68, 0x35, 0x77, 0x31, 0x62, 0x6c, 0x36, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x5c, 0x0a, + 0x09, 0x41, 0x45, 0x6c, 0x46, 0x54, 0x6b, 0x53, 0x75, 0x51, 0x6d, 0x43, 0x43, 0x5c, 0x0a, + 0x09, 0x22, 0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x5f, + 0x70, 0x6e, 0x67, 0x20, 0x3d, 0x0a, + 0x09, 0x22, 0x69, 0x56, 0x42, 0x4f, 0x52, 0x77, 0x30, 0x4b, 0x47, 0x67, 0x6f, 0x41, 0x41, 0x41, 0x41, 0x4e, + 0x53, 0x55, 0x68, 0x45, 0x55, 0x67, 0x41, 0x41, 0x41, 0x67, 0x41, 0x41, 0x41, 0x41, 0x49, 0x41, 0x43, 0x41, + 0x59, 0x41, 0x41, 0x41, 0x44, 0x30, 0x65, 0x4e, 0x54, 0x36, 0x41, 0x41, 0x41, 0x67, 0x41, 0x45, 0x6c, 0x45, + 0x51, 0x56, 0x52, 0x34, 0x6e, 0x4f, 0x33, 0x64, 0x65, 0x5a, 0x52, 0x65, 0x64, 0x5a, 0x33, 0x6e, 0x38, 0x58, + 0x63, 0x71, 0x5c, 0x0a, + 0x09, 0x53, 0x55, 0x57, 0x54, 0x6b, 0x41, 0x55, 0x54, 0x49, 0x4c, 0x49, 0x4a, 0x52, 0x43, 0x56, 0x73, 0x41, + 0x72, 0x49, 0x6f, 0x71, 0x43, 0x6a, 0x64, 0x49, 0x4c, 0x59, 0x47, 0x48, 0x52, 0x5a, 0x62, 0x41, 0x52, 0x63, + 0x34, 0x4d, 0x77, 0x67, 0x32, 0x67, 0x69, 0x6a, 0x30, 0x64, 0x47, 0x50, 0x50, 0x61, 0x62, 0x46, 0x48, 0x50, + 0x45, 0x64, 0x45, 0x46, 0x42, 0x64, 0x55, 0x5a, 0x68, 0x6f, 0x50, 0x41, 0x71, 0x32, 0x79, 0x71, 0x4b, 0x67, + 0x6a, 0x5c, 0x0a, + 0x09, 0x41, 0x72, 0x49, 0x70, 0x74, 0x69, 0x41, 0x43, 0x43, 0x67, 0x46, 0x55, 0x61, 0x43, 0x55, 0x43, 0x67, + 0x59, 0x51, 0x6c, 0x4f, 0x34, 0x5a, 0x51, 0x71, 0x66, 0x6e, 0x6a, 0x57, 0x30, 0x55, 0x71, 0x53, 0x53, 0x33, + 0x50, 0x63, 0x75, 0x2f, 0x39, 0x33, 0x65, 0x58, 0x39, 0x4f, 0x75, 0x63, 0x35, 0x57, 0x61, 0x72, 0x79, 0x33, + 0x45, 0x2f, 0x51, 0x33, 0x4f, 0x2f, 0x33, 0x2b, 0x66, 0x37, 0x75, 0x2f, 0x64, 0x31, 0x78, 0x2f, 0x66, 0x33, + 0x39, 0x5c, 0x0a, + 0x09, 0x53, 0x43, 0x71, 0x74, 0x38, 0x63, 0x44, 0x73, 0x49, 0x61, 0x39, 0x5a, 0x77, 0x4f, 0x62, 0x41, 0x54, + 0x47, 0x41, 0x36, 0x4d, 0x41, 0x50, 0x59, 0x44, 0x48, 0x6a, 0x70, 0x77, 0x49, 0x38, 0x76, 0x47, 0x66, 0x4c, + 0x7a, 0x43, 0x51, 0x50, 0x66, 0x4e, 0x39, 0x54, 0x67, 0x31, 0x34, 0x64, 0x36, 0x44, 0x76, 0x6a, 0x72, 0x52, + 0x72, 0x2f, 0x33, 0x4c, 0x50, 0x41, 0x43, 0x73, 0x47, 0x4c, 0x49, 0x31, 0x77, 0x64, 0x2f, 0x76, 0x67, 0x4a, + 0x59, 0x5c, 0x0a, + 0x09, 0x43, 0x69, 0x77, 0x62, 0x2b, 0x4c, 0x35, 0x6e, 0x67, 0x4b, 0x65, 0x41, 0x4a, 0x55, 0x4e, 0x65, 0x66, + 0x52, 0x33, 0x2f, 0x6a, 0x53, 0x55, 0x56, 0x59, 0x70, 0x77, 0x4e, 0x67, 0x4a, 0x54, 0x4d, 0x44, 0x47, 0x43, + 0x37, 0x67, 0x64, 0x65, 0x32, 0x77, 0x44, 0x59, 0x44, 0x50, 0x32, 0x34, 0x4e, 0x62, 0x4d, 0x48, 0x36, 0x6f, + 0x74, 0x2b, 0x54, 0x4b, 0x6d, 0x43, 0x48, 0x2b, 0x6f, 0x48, 0x46, 0x52, 0x43, 0x4f, 0x77, 0x47, 0x48, 0x67, + 0x4d, 0x5c, 0x0a, + 0x09, 0x2b, 0x41, 0x76, 0x77, 0x36, 0x4d, 0x43, 0x50, 0x43, 0x77, 0x64, 0x2b, 0x66, 0x44, 0x5a, 0x56, 0x51, + 0x45, 0x6b, 0x32, 0x41, 0x46, 0x4b, 0x65, 0x78, 0x68, 0x46, 0x46, 0x66, 0x65, 0x36, 0x51, 0x31, 0x34, 0x34, + 0x44, 0x50, 0x2b, 0x35, 0x45, 0x66, 0x45, 0x70, 0x76, 0x73, 0x68, 0x58, 0x41, 0x77, 0x30, 0x4e, 0x65, 0x44, + 0x77, 0x31, 0x35, 0x50, 0x55, 0x6f, 0x30, 0x45, 0x70, 0x4a, 0x79, 0x59, 0x67, 0x4d, 0x67, 0x64, 0x61, 0x38, + 0x48, 0x5c, 0x0a, + 0x09, 0x65, 0x41, 0x57, 0x77, 0x43, 0x37, 0x41, 0x72, 0x4d, 0x41, 0x2f, 0x59, 0x44, 0x64, 0x67, 0x5a, 0x6d, + 0x4a, 0x49, 0x75, 0x56, 0x71, 0x57, 0x74, 0x41, 0x68, 0x34, 0x45, 0x37, 0x67, 0x4d, 0x65, 0x41, 0x42, 0x59, + 0x41, 0x39, 0x77, 0x4e, 0x2f, 0x42, 0x74, 0x61, 0x6c, 0x69, 0x79, 0x58, 0x56, 0x68, 0x77, 0x32, 0x41, 0x31, + 0x4a, 0x35, 0x65, 0x6f, 0x72, 0x6a, 0x76, 0x42, 0x65, 0x77, 0x4e, 0x37, 0x41, 0x6e, 0x73, 0x41, 0x55, 0x78, + 0x4e, 0x5c, 0x0a, + 0x09, 0x47, 0x61, 0x70, 0x42, 0x56, 0x67, 0x4b, 0x2f, 0x41, 0x2b, 0x34, 0x42, 0x37, 0x67, 0x62, 0x75, 0x49, + 0x70, 0x71, 0x45, 0x35, 0x31, 0x4f, 0x47, 0x6b, 0x71, 0x72, 0x49, 0x42, 0x6b, 0x41, 0x61, 0x57, 0x51, 0x2f, + 0x78, 0x4b, 0x66, 0x35, 0x31, 0x77, 0x50, 0x37, 0x41, 0x66, 0x73, 0x51, 0x6e, 0x2f, 0x49, 0x6b, 0x70, 0x51, + 0x32, 0x6b, 0x54, 0x61, 0x34, 0x6e, 0x70, 0x77, 0x4f, 0x30, 0x44, 0x72, 0x31, 0x38, 0x52, 0x30, 0x77, 0x4d, + 0x6e, 0x5c, 0x0a, + 0x09, 0x42, 0x64, 0x49, 0x6f, 0x62, 0x41, 0x43, 0x6b, 0x39, 0x61, 0x59, 0x43, 0x42, 0x77, 0x42, 0x76, 0x49, + 0x49, 0x72, 0x2b, 0x66, 0x73, 0x53, 0x56, 0x39, 0x71, 0x71, 0x65, 0x5a, 0x63, 0x41, 0x64, 0x52, 0x45, 0x50, + 0x77, 0x43, 0x2b, 0x41, 0x32, 0x59, 0x6e, 0x6f, 0x67, 0x61, 0x59, 0x41, 0x4e, 0x67, 0x4a, 0x70, 0x73, 0x42, + 0x76, 0x42, 0x47, 0x34, 0x45, 0x30, 0x44, 0x72, 0x37, 0x32, 0x4a, 0x57, 0x2b, 0x64, 0x55, 0x50, 0x79, 0x38, + 0x51, 0x5c, 0x0a, + 0x09, 0x79, 0x77, 0x57, 0x33, 0x44, 0x72, 0x78, 0x2b, 0x54, 0x74, 0x7a, 0x4b, 0x4b, 0x44, 0x57, 0x57, 0x44, + 0x59, 0x43, 0x61, 0x70, 0x4a, 0x66, 0x34, 0x64, 0x50, 0x2b, 0x33, 0x77, 0x43, 0x46, 0x45, 0x77, 0x61, 0x2f, + 0x61, 0x4c, 0x58, 0x62, 0x4b, 0x78, 0x6a, 0x71, 0x69, 0x49, 0x62, 0x67, 0x65, 0x75, 0x49, 0x47, 0x59, 0x45, + 0x4b, 0x78, 0x4a, 0x6d, 0x6b, 0x67, 0x71, 0x6d, 0x41, 0x32, 0x41, 0x36, 0x6d, 0x35, 0x6e, 0x34, 0x47, 0x31, + 0x45, 0x5c, 0x0a, + 0x09, 0x77, 0x54, 0x38, 0x49, 0x6d, 0x4a, 0x77, 0x32, 0x6a, 0x6b, 0x70, 0x71, 0x4e, 0x58, 0x41, 0x4c, 0x30, + 0x52, 0x42, 0x63, 0x53, 0x39, 0x78, 0x35, 0x49, 0x4e, 0x57, 0x61, 0x44, 0x59, 0x44, 0x71, 0x70, 0x70, 0x63, + 0x6f, 0x39, 0x47, 0x38, 0x48, 0x33, 0x6b, 0x48, 0x63, 0x62, 0x79, 0x2b, 0x31, 0x36, 0x32, 0x48, 0x67, 0x78, + 0x38, 0x43, 0x50, 0x69, 0x4d, 0x62, 0x41, 0x75, 0x77, 0x78, 0x55, 0x4f, 0x7a, 0x59, 0x41, 0x71, 0x6f, 0x4f, + 0x5a, 0x5c, 0x0a, + 0x09, 0x77, 0x4f, 0x48, 0x41, 0x66, 0x4f, 0x42, 0x51, 0x33, 0x47, 0x42, 0x48, 0x32, 0x56, 0x6f, 0x4a, 0x2f, + 0x42, 0x54, 0x34, 0x49, 0x58, 0x41, 0x4e, 0x37, 0x6d, 0x43, 0x6f, 0x6d, 0x72, 0x41, 0x42, 0x55, 0x46, 0x58, + 0x4e, 0x41, 0x74, 0x34, 0x46, 0x48, 0x41, 0x48, 0x38, 0x44, 0x66, 0x48, 0x4a, 0x58, 0x38, 0x72, 0x62, 0x57, + 0x75, 0x41, 0x6d, 0x34, 0x41, 0x72, 0x67, 0x2b, 0x38, 0x51, 0x7a, 0x45, 0x4b, 0x52, 0x4b, 0x73, 0x67, 0x46, + 0x51, 0x5c, 0x0a, + 0x09, 0x6c, 0x62, 0x77, 0x4d, 0x65, 0x44, 0x64, 0x77, 0x46, 0x44, 0x48, 0x6d, 0x48, 0x35, 0x38, 0x32, 0x6a, + 0x68, 0x71, 0x75, 0x6a, 0x31, 0x67, 0x65, 0x75, 0x42, 0x4c, 0x34, 0x4c, 0x76, 0x42, 0x30, 0x32, 0x6a, 0x68, + 0x53, 0x65, 0x32, 0x77, 0x41, 0x56, 0x48, 0x5a, 0x54, 0x67, 0x48, 0x63, 0x43, 0x78, 0x78, 0x44, 0x6a, 0x66, + 0x54, 0x66, 0x68, 0x55, 0x52, 0x6d, 0x74, 0x42, 0x61, 0x34, 0x44, 0x4c, 0x69, 0x65, 0x57, 0x43, 0x64, 0x78, + 0x7a, 0x5c, 0x0a, + 0x09, 0x51, 0x4b, 0x56, 0x6e, 0x41, 0x36, 0x41, 0x79, 0x47, 0x67, 0x2b, 0x38, 0x46, 0x54, 0x69, 0x57, 0x4b, + 0x50, 0x37, 0x75, 0x70, 0x36, 0x38, 0x71, 0x57, 0x51, 0x58, 0x38, 0x41, 0x4c, 0x69, 0x4d, 0x75, 0x48, 0x62, + 0x41, 0x52, 0x79, 0x4f, 0x72, 0x6c, 0x47, 0x77, 0x41, 0x56, 0x43, 0x59, 0x37, 0x41, 0x52, 0x38, 0x45, 0x54, + 0x67, 0x42, 0x65, 0x6e, 0x6a, 0x61, 0x4b, 0x6c, 0x49, 0x6e, 0x48, 0x67, 0x59, 0x73, 0x48, 0x58, 0x67, 0x38, + 0x6e, 0x5c, 0x0a, + 0x09, 0x7a, 0x69, 0x4a, 0x74, 0x77, 0x41, 0x5a, 0x41, 0x71, 0x55, 0x30, 0x42, 0x6a, 0x67, 0x61, 0x4f, 0x4a, + 0x33, 0x62, 0x6c, 0x47, 0x35, 0x63, 0x32, 0x6a, 0x70, 0x53, 0x4c, 0x66, 0x6d, 0x4c, 0x33, 0x77, 0x59, 0x75, + 0x4a, 0x43, 0x77, 0x68, 0x58, 0x70, 0x59, 0x30, 0x6a, 0x32, 0x51, 0x41, 0x6f, 0x6e, 0x56, 0x32, 0x41, 0x6b, + 0x34, 0x44, 0x33, 0x34, 0x33, 0x37, 0x37, 0x61, 0x70, 0x5a, 0x6c, 0x77, 0x43, 0x58, 0x41, 0x31, 0x34, 0x69, + 0x48, 0x5c, 0x0a, + 0x09, 0x47, 0x45, 0x6c, 0x4a, 0x32, 0x41, 0x43, 0x6f, 0x53, 0x4a, 0x4f, 0x49, 0x32, 0x2f, 0x5a, 0x4f, 0x49, + 0x76, 0x62, 0x65, 0x6c, 0x35, 0x72, 0x75, 0x56, 0x71, 0x49, 0x52, 0x75, 0x42, 0x71, 0x33, 0x49, 0x6c, 0x62, + 0x42, 0x62, 0x41, 0x42, 0x55, 0x68, 0x4b, 0x32, 0x41, 0x44, 0x77, 0x4d, 0x6e, 0x41, 0x6c, 0x73, 0x6d, 0x7a, + 0x69, 0x4b, 0x56, 0x30, 0x5a, 0x50, 0x41, 0x4e, 0x34, 0x43, 0x76, 0x41, 0x6b, 0x38, 0x6b, 0x7a, 0x71, 0x4b, + 0x47, 0x5c, 0x0a, + 0x09, 0x73, 0x41, 0x46, 0x51, 0x6e, 0x76, 0x59, 0x47, 0x54, 0x67, 0x50, 0x2b, 0x6e, 0x76, 0x6a, 0x30, 0x4c, + 0x32, 0x6c, 0x30, 0x61, 0x34, 0x44, 0x76, 0x41, 0x46, 0x38, 0x6b, 0x48, 0x6c, 0x59, 0x6b, 0x35, 0x63, 0x59, + 0x47, 0x51, 0x46, 0x6e, 0x72, 0x49, 0x62, 0x62, 0x6b, 0x50, 0x5a, 0x33, 0x59, 0x72, 0x45, 0x64, 0x53, 0x5a, + 0x32, 0x34, 0x42, 0x7a, 0x69, 0x65, 0x32, 0x49, 0x46, 0x36, 0x58, 0x4f, 0x49, 0x74, 0x71, 0x79, 0x41, 0x5a, + 0x41, 0x5c, 0x0a, + 0x09, 0x57, 0x65, 0x6b, 0x6c, 0x37, 0x74, 0x73, 0x2f, 0x45, 0x35, 0x69, 0x58, 0x4f, 0x49, 0x74, 0x55, 0x4a, + 0x77, 0x38, 0x41, 0x35, 0x78, 0x4c, 0x37, 0x43, 0x76, 0x68, 0x51, 0x49, 0x6d, 0x58, 0x47, 0x42, 0x6b, 0x44, + 0x64, 0x32, 0x67, 0x7a, 0x34, 0x48, 0x38, 0x51, 0x6e, 0x2f, 0x6d, 0x30, 0x53, 0x5a, 0x35, 0x48, 0x71, 0x37, + 0x46, 0x46, 0x69, 0x49, 0x6e, 0x41, 0x52, 0x73, 0x43, 0x4a, 0x78, 0x46, 0x74, 0x57, 0x41, 0x44, 0x59, 0x41, + 0x36, 0x5c, 0x0a, + 0x09, 0x4e, 0x52, 0x33, 0x34, 0x4b, 0x48, 0x41, 0x71, 0x73, 0x48, 0x6e, 0x69, 0x4c, 0x46, 0x4b, 0x54, 0x50, + 0x41, 0x4e, 0x63, 0x51, 0x46, 0x77, 0x6e, 0x73, 0x44, 0x52, 0x78, 0x46, 0x6c, 0x57, 0x59, 0x44, 0x59, 0x44, + 0x61, 0x4e, 0x5a, 0x4f, 0x34, 0x73, 0x4f, 0x38, 0x30, 0x59, 0x45, 0x62, 0x69, 0x4c, 0x46, 0x4b, 0x54, 0x4c, + 0x53, 0x57, 0x61, 0x67, 0x43, 0x2f, 0x69, 0x49, 0x34, 0x72, 0x56, 0x41, 0x52, 0x73, 0x41, 0x74, 0x57, 0x6f, + 0x6d, 0x5c, 0x0a, + 0x09, 0x4d, 0x65, 0x59, 0x2f, 0x46, 0x54, 0x66, 0x75, 0x6b, 0x63, 0x70, 0x6b, 0x47, 0x54, 0x45, 0x52, 0x2b, + 0x41, 0x49, 0x78, 0x48, 0x5a, 0x42, 0x61, 0x59, 0x67, 0x4f, 0x67, 0x73, 0x55, 0x77, 0x6c, 0x52, 0x76, 0x30, + 0x66, 0x78, 0x30, 0x2f, 0x38, 0x55, 0x70, 0x6b, 0x74, 0x42, 0x63, 0x34, 0x6a, 0x47, 0x67, 0x47, 0x66, 0x52, + 0x71, 0x67, 0x78, 0x32, 0x51, 0x42, 0x6f, 0x4a, 0x4c, 0x33, 0x45, 0x6a, 0x6e, 0x31, 0x6e, 0x34, 0x65, 0x59, + 0x39, 0x5c, 0x0a, + 0x09, 0x55, 0x70, 0x55, 0x73, 0x42, 0x6a, 0x35, 0x4e, 0x37, 0x44, 0x44, 0x6f, 0x58, 0x51, 0x4d, 0x61, 0x6b, + 0x51, 0x32, 0x41, 0x4e, 0x74, 0x59, 0x44, 0x76, 0x41, 0x38, 0x34, 0x47, 0x39, 0x67, 0x2b, 0x63, 0x52, 0x5a, + 0x4a, 0x6e, 0x58, 0x73, 0x45, 0x2b, 0x43, 0x54, 0x78, 0x33, 0x41, 0x48, 0x33, 0x45, 0x64, 0x41, 0x6d, 0x62, + 0x41, 0x41, 0x30, 0x31, 0x47, 0x48, 0x41, 0x5a, 0x34, 0x41, 0x39, 0x55, 0x77, 0x65, 0x52, 0x6c, 0x4a, 0x6c, + 0x37, 0x5c, 0x0a, + 0x09, 0x67, 0x58, 0x38, 0x45, 0x72, 0x6b, 0x30, 0x64, 0x52, 0x4f, 0x56, 0x69, 0x41, 0x79, 0x43, 0x49, 0x4a, + 0x2f, 0x4f, 0x64, 0x52, 0x7a, 0x51, 0x41, 0x6b, 0x75, 0x72, 0x70, 0x57, 0x75, 0x4a, 0x61, 0x48, 0x70, 0x39, + 0x41, 0x4b, 0x43, 0x44, 0x47, 0x76, 0x57, 0x71, 0x75, 0x4f, 0x63, 0x42, 0x58, 0x67, 0x4e, 0x39, 0x69, 0x38, + 0x5a, 0x66, 0x71, 0x37, 0x6a, 0x44, 0x69, 0x33, 0x2f, 0x72, 0x58, 0x69, 0x58, 0x2f, 0x37, 0x61, 0x6a, 0x67, + 0x6e, 0x5c, 0x0a, + 0x09, 0x41, 0x4d, 0x30, 0x30, 0x67, 0x62, 0x69, 0x64, 0x37, 0x33, 0x2f, 0x68, 0x6c, 0x66, 0x31, 0x53, 0x45, + 0x79, 0x30, 0x44, 0x2f, 0x6f, 0x33, 0x59, 0x51, 0x2b, 0x43, 0x46, 0x78, 0x46, 0x6d, 0x55, 0x69, 0x41, 0x31, + 0x41, 0x38, 0x78, 0x77, 0x4d, 0x66, 0x49, 0x6b, 0x59, 0x2b, 0x30, 0x74, 0x71, 0x74, 0x76, 0x75, 0x4a, 0x44, + 0x77, 0x4d, 0x2f, 0x53, 0x78, 0x31, 0x45, 0x78, 0x58, 0x4d, 0x4a, 0x6f, 0x44, 0x6d, 0x32, 0x41, 0x36, 0x34, + 0x67, 0x5c, 0x0a, + 0x09, 0x2f, 0x71, 0x46, 0x62, 0x2f, 0x43, 0x56, 0x42, 0x6e, 0x41, 0x74, 0x75, 0x41, 0x4b, 0x34, 0x6b, 0x7a, + 0x68, 0x46, 0x71, 0x45, 0x42, 0x75, 0x41, 0x2b, 0x70, 0x73, 0x41, 0x66, 0x49, 0x78, 0x34, 0x6f, 0x74, 0x68, + 0x52, 0x69, 0x62, 0x4e, 0x49, 0x4b, 0x71, 0x63, 0x6a, 0x69, 0x58, 0x50, 0x45, 0x78, 0x34, 0x6c, 0x7a, 0x68, + 0x68, 0x72, 0x41, 0x4a, 0x59, 0x42, 0x36, 0x65, 0x77, 0x33, 0x77, 0x66, 0x34, 0x42, 0x39, 0x55, 0x67, 0x65, + 0x52, 0x5c, 0x0a, + 0x09, 0x56, 0x42, 0x6c, 0x33, 0x45, 0x6b, 0x2f, 0x34, 0x76, 0x43, 0x64, 0x31, 0x45, 0x4f, 0x58, 0x4c, 0x43, + 0x55, 0x41, 0x39, 0x76, 0x52, 0x51, 0x34, 0x68, 0x2f, 0x69, 0x48, 0x62, 0x50, 0x47, 0x58, 0x31, 0x49, 0x35, + 0x39, 0x67, 0x46, 0x38, 0x54, 0x65, 0x34, 0x4b, 0x38, 0x4e, 0x48, 0x45, 0x57, 0x35, 0x63, 0x67, 0x4a, 0x51, + 0x50, 0x32, 0x38, 0x6d, 0x62, 0x6a, 0x4e, 0x35, 0x31, 0x57, 0x4a, 0x63, 0x30, 0x69, 0x71, 0x76, 0x6a, 0x38, + 0x41, 0x5c, 0x0a, + 0x09, 0x48, 0x77, 0x4a, 0x75, 0x54, 0x70, 0x78, 0x44, 0x4f, 0x58, 0x41, 0x43, 0x55, 0x42, 0x38, 0x7a, 0x67, + 0x49, 0x75, 0x41, 0x47, 0x37, 0x48, 0x34, 0x53, 0x38, 0x72, 0x47, 0x71, 0x34, 0x68, 0x7a, 0x79, 0x6b, 0x56, + 0x34, 0x79, 0x33, 0x44, 0x74, 0x4f, 0x41, 0x47, 0x6f, 0x68, 0x79, 0x4f, 0x49, 0x57, 0x2f, 0x74, 0x65, 0x6e, + 0x6a, 0x71, 0x49, 0x70, 0x4e, 0x70, 0x61, 0x42, 0x4a, 0x77, 0x43, 0x58, 0x4a, 0x30, 0x36, 0x69, 0x4c, 0x4a, + 0x68, 0x5c, 0x0a, + 0x09, 0x41, 0x31, 0x42, 0x74, 0x67, 0x7a, 0x76, 0x35, 0x2f, 0x62, 0x66, 0x55, 0x51, 0x53, 0x51, 0x31, 0x78, + 0x76, 0x65, 0x42, 0x44, 0x78, 0x4d, 0x4e, 0x67, 0x53, 0x72, 0x4d, 0x42, 0x71, 0x43, 0x36, 0x6a, 0x67, 0x49, + 0x75, 0x42, 0x47, 0x61, 0x6c, 0x44, 0x69, 0x4b, 0x70, 0x63, 0x5a, 0x34, 0x43, 0x54, 0x69, 0x62, 0x32, 0x44, + 0x31, 0x42, 0x46, 0x65, 0x51, 0x31, 0x41, 0x39, 0x55, 0x77, 0x6e, 0x48, 0x75, 0x39, 0x35, 0x42, 0x52, 0x5a, + 0x2f, 0x5c, 0x0a, + 0x09, 0x53, 0x57, 0x6e, 0x4d, 0x49, 0x73, 0x35, 0x42, 0x6c, 0x78, 0x44, 0x6e, 0x4a, 0x46, 0x57, 0x51, 0x45, + 0x34, 0x42, 0x71, 0x65, 0x51, 0x74, 0x77, 0x4d, 0x62, 0x42, 0x39, 0x36, 0x69, 0x43, 0x53, 0x4e, 0x47, 0x41, + 0x68, 0x38, 0x45, 0x48, 0x67, 0x70, 0x73, 0x51, 0x35, 0x31, 0x43, 0x59, 0x6e, 0x41, 0x4e, 0x55, 0x77, 0x45, + 0x66, 0x67, 0x73, 0x73, 0x57, 0x57, 0x6e, 0x78, 0x56, 0x39, 0x53, 0x6d, 0x57, 0x78, 0x48, 0x6e, 0x4a, 0x73, + 0x2b, 0x5c, 0x0a, + 0x09, 0x53, 0x35, 0x79, 0x72, 0x56, 0x42, 0x46, 0x4f, 0x41, 0x4d, 0x70, 0x76, 0x4a, 0x2b, 0x41, 0x2f, 0x67, + 0x48, 0x31, 0x54, 0x42, 0x35, 0x47, 0x6b, 0x4d, 0x66, 0x77, 0x61, 0x65, 0x43, 0x2f, 0x77, 0x63, 0x4f, 0x6f, + 0x67, 0x47, 0x70, 0x73, 0x54, 0x67, 0x48, 0x49, 0x37, 0x42, 0x72, 0x67, 0x4c, 0x69, 0x37, 0x2b, 0x6b, 0x61, + 0x74, 0x69, 0x58, 0x4f, 0x47, 0x63, 0x64, 0x6b, 0x7a, 0x71, 0x49, 0x78, 0x6d, 0x59, 0x44, 0x55, 0x45, 0x35, + 0x54, 0x5c, 0x0a, + 0x09, 0x67, 0x57, 0x38, 0x43, 0x6c, 0x77, 0x48, 0x54, 0x30, 0x6b, 0x61, 0x52, 0x70, 0x4c, 0x5a, 0x4d, 0x49, + 0x38, 0x35, 0x64, 0x33, 0x79, 0x54, 0x4f, 0x5a, 0x53, 0x6f, 0x70, 0x6c, 0x77, 0x44, 0x4b, 0x5a, 0x78, 0x36, + 0x78, 0x30, 0x63, 0x62, 0x4f, 0x71, 0x59, 0x4e, 0x49, 0x55, 0x70, 0x63, 0x65, 0x4a, 0x4a, 0x34, 0x30, 0x65, + 0x48, 0x2f, 0x71, 0x49, 0x4e, 0x71, 0x55, 0x45, 0x34, 0x42, 0x79, 0x4f, 0x52, 0x61, 0x34, 0x41, 0x34, 0x75, + 0x2f, 0x5c, 0x0a, + 0x09, 0x70, 0x48, 0x72, 0x59, 0x47, 0x62, 0x69, 0x64, 0x4f, 0x4c, 0x65, 0x70, 0x5a, 0x47, 0x77, 0x41, 0x79, + 0x6d, 0x45, 0x53, 0x73, 0x61, 0x50, 0x66, 0x70, 0x54, 0x67, 0x79, 0x6b, 0x31, 0x51, 0x76, 0x55, 0x34, 0x6c, + 0x7a, 0x32, 0x31, 0x65, 0x49, 0x63, 0x35, 0x31, 0x4b, 0x77, 0x69, 0x57, 0x41, 0x39, 0x4c, 0x59, 0x6e, 0x64, + 0x74, 0x50, 0x79, 0x73, 0x62, 0x32, 0x53, 0x36, 0x75, 0x35, 0x4f, 0x59, 0x68, 0x66, 0x54, 0x52, 0x31, 0x49, + 0x48, 0x5c, 0x0a, + 0x09, 0x6b, 0x52, 0x4f, 0x41, 0x31, 0x41, 0x34, 0x69, 0x62, 0x70, 0x75, 0x78, 0x2b, 0x45, 0x74, 0x71, 0x67, + 0x6e, 0x32, 0x49, 0x63, 0x39, 0x35, 0x42, 0x71, 0x59, 0x50, 0x49, 0x42, 0x69, 0x43, 0x6c, 0x55, 0x34, 0x44, + 0x72, 0x67, 0x64, 0x6d, 0x70, 0x67, 0x30, 0x68, 0x53, 0x67, 0x57, 0x59, 0x54, 0x35, 0x37, 0x36, 0x50, 0x70, + 0x41, 0x37, 0x53, 0x64, 0x43, 0x34, 0x42, 0x46, 0x47, 0x38, 0x53, 0x38, 0x52, 0x43, 0x66, 0x34, 0x31, 0x4d, + 0x48, 0x5c, 0x0a, + 0x09, 0x6b, 0x61, 0x54, 0x45, 0x4c, 0x69, 0x59, 0x65, 0x4b, 0x72, 0x51, 0x6d, 0x64, 0x5a, 0x41, 0x6d, 0x73, + 0x67, 0x45, 0x6f, 0x31, 0x6c, 0x62, 0x41, 0x39, 0x34, 0x44, 0x58, 0x70, 0x51, 0x34, 0x69, 0x53, 0x53, 0x58, + 0x78, 0x4b, 0x2b, 0x4b, 0x52, 0x35, 0x6b, 0x2b, 0x6b, 0x44, 0x74, 0x49, 0x30, 0x4e, 0x67, 0x44, 0x46, 0x32, + 0x51, 0x58, 0x34, 0x45, 0x62, 0x42, 0x44, 0x36, 0x69, 0x43, 0x53, 0x56, 0x44, 0x4a, 0x2f, 0x41, 0x75, 0x59, + 0x44, 0x5c, 0x0a, + 0x09, 0x43, 0x31, 0x49, 0x48, 0x61, 0x52, 0x4b, 0x76, 0x41, 0x53, 0x6a, 0x47, 0x57, 0x34, 0x42, 0x66, 0x59, + 0x50, 0x47, 0x58, 0x70, 0x4f, 0x48, 0x73, 0x41, 0x50, 0x77, 0x63, 0x4f, 0x44, 0x68, 0x31, 0x6b, 0x43, 0x61, + 0x78, 0x41, 0x63, 0x6a, 0x66, 0x42, 0x34, 0x42, 0x72, 0x67, 0x5a, 0x6d, 0x70, 0x67, 0x30, 0x68, 0x53, 0x69, + 0x63, 0x30, 0x45, 0x66, 0x6b, 0x4b, 0x63, 0x4d, 0x31, 0x55, 0x41, 0x47, 0x34, 0x44, 0x38, 0x6a, 0x41, 0x4d, + 0x2b, 0x5c, 0x0a, + 0x09, 0x53, 0x56, 0x7a, 0x6b, 0x30, 0x70, 0x73, 0x32, 0x69, 0x69, 0x52, 0x56, 0x51, 0x69, 0x39, 0x78, 0x7a, + 0x76, 0x77, 0x6b, 0x63, 0x51, 0x35, 0x56, 0x6a, 0x72, 0x77, 0x47, 0x49, 0x42, 0x2b, 0x39, 0x77, 0x45, 0x58, + 0x41, 0x2b, 0x31, 0x4d, 0x48, 0x6b, 0x61, 0x53, 0x4b, 0x2b, 0x68, 0x62, 0x77, 0x33, 0x34, 0x48, 0x6e, 0x55, + 0x77, 0x65, 0x70, 0x4b, 0x78, 0x75, 0x41, 0x37, 0x4d, 0x30, 0x45, 0x72, 0x69, 0x4c, 0x57, 0x2f, 0x53, 0x56, + 0x4a, 0x5c, 0x0a, + 0x09, 0x6e, 0x62, 0x73, 0x5a, 0x4f, 0x41, 0x4a, 0x34, 0x4e, 0x6e, 0x47, 0x4f, 0x57, 0x72, 0x49, 0x42, 0x79, + 0x4e, 0x59, 0x4f, 0x77, 0x49, 0x2b, 0x4a, 0x4a, 0x2f, 0x70, 0x4a, 0x6b, 0x72, 0x72, 0x33, 0x41, 0x50, 0x42, + 0x32, 0x34, 0x6b, 0x34, 0x42, 0x5a, 0x63, 0x68, 0x72, 0x41, 0x4c, 0x4c, 0x7a, 0x57, 0x75, 0x41, 0x2f, 0x73, + 0x66, 0x68, 0x4c, 0x55, 0x70, 0x62, 0x6d, 0x45, 0x65, 0x64, 0x57, 0x74, 0x30, 0x7a, 0x50, 0x6d, 0x41, 0x31, + 0x41, 0x5c, 0x0a, + 0x09, 0x4e, 0x74, 0x34, 0x4d, 0x33, 0x41, 0x68, 0x73, 0x6d, 0x54, 0x69, 0x48, 0x4a, 0x4e, 0x58, 0x52, 0x6c, + 0x73, 0x44, 0x50, 0x69, 0x48, 0x4f, 0x74, 0x4d, 0x6d, 0x49, 0x44, 0x30, 0x4c, 0x33, 0x35, 0x77, 0x50, 0x38, + 0x44, 0x70, 0x71, 0x55, 0x4f, 0x49, 0x6b, 0x6b, 0x31, 0x4e, 0x6f, 0x32, 0x34, 0x54, 0x58, 0x42, 0x2b, 0x36, + 0x69, 0x42, 0x31, 0x59, 0x51, 0x50, 0x51, 0x6e, 0x57, 0x4f, 0x42, 0x71, 0x34, 0x47, 0x58, 0x70, 0x67, 0x34, + 0x69, 0x5c, 0x0a, + 0x09, 0x53, 0x51, 0x33, 0x77, 0x45, 0x75, 0x4b, 0x63, 0x65, 0x31, 0x7a, 0x71, 0x49, 0x48, 0x56, 0x67, 0x41, + 0x39, 0x43, 0x35, 0x66, 0x79, 0x42, 0x75, 0x55, 0x35, 0x6d, 0x51, 0x4f, 0x6f, 0x67, 0x6b, 0x4e, 0x63, 0x67, + 0x45, 0x34, 0x42, 0x4c, 0x69, 0x48, 0x4b, 0x77, 0x75, 0x32, 0x41, 0x42, 0x30, 0x35, 0x75, 0x50, 0x41, 0x6c, + 0x33, 0x47, 0x6a, 0x43, 0x6b, 0x6c, 0x4b, 0x59, 0x52, 0x78, 0x78, 0x44, 0x6a, 0x34, 0x6a, 0x64, 0x5a, 0x41, + 0x71, 0x5c, 0x0a, + 0x09, 0x73, 0x77, 0x46, 0x6f, 0x33, 0x7a, 0x38, 0x44, 0x6e, 0x30, 0x73, 0x64, 0x51, 0x70, 0x4c, 0x45, 0x75, + 0x63, 0x51, 0x35, 0x57, 0x52, 0x32, 0x77, 0x41, 0x57, 0x6a, 0x50, 0x76, 0x77, 0x4c, 0x6e, 0x70, 0x41, 0x34, + 0x68, 0x53, 0x58, 0x72, 0x52, 0x4f, 0x63, 0x44, 0x5a, 0x71, 0x55, 0x4e, 0x55, 0x6b, 0x52, 0x73, 0x42, 0x74, + 0x65, 0x34, 0x63, 0x37, 0x44, 0x51, 0x6c, 0x71, 0x61, 0x77, 0x2b, 0x41, 0x35, 0x79, 0x56, 0x4f, 0x6b, 0x53, + 0x56, 0x5c, 0x0a, + 0x09, 0x4f, 0x41, 0x46, 0x6f, 0x7a, 0x61, 0x65, 0x78, 0x2b, 0x45, 0x74, 0x53, 0x6d, 0x66, 0x30, 0x7a, 0x63, + 0x61, 0x35, 0x57, 0x69, 0x32, 0x77, 0x41, 0x78, 0x76, 0x61, 0x76, 0x32, 0x46, 0x56, 0x4b, 0x55, 0x68, 0x57, + 0x63, 0x52, 0x54, 0x78, 0x4a, 0x55, 0x43, 0x31, 0x77, 0x43, 0x57, 0x42, 0x30, 0x5a, 0x32, 0x46, 0x48, 0x4b, + 0x55, 0x6c, 0x56, 0x38, 0x77, 0x6d, 0x38, 0x58, 0x6d, 0x74, 0x4d, 0x4e, 0x67, 0x41, 0x6a, 0x2b, 0x78, 0x68, + 0x77, 0x5c, 0x0a, + 0x09, 0x58, 0x75, 0x6f, 0x51, 0x6b, 0x71, 0x53, 0x4f, 0x6e, 0x49, 0x48, 0x6e, 0x38, 0x46, 0x48, 0x5a, 0x41, + 0x41, 0x7a, 0x76, 0x48, 0x34, 0x68, 0x37, 0x54, 0x43, 0x56, 0x4a, 0x31, 0x58, 0x55, 0x4b, 0x38, 0x4a, 0x58, + 0x55, 0x49, 0x63, 0x72, 0x4b, 0x42, 0x6d, 0x42, 0x54, 0x78, 0x78, 0x49, 0x37, 0x2f, 0x4c, 0x6e, 0x4a, 0x6a, + 0x79, 0x52, 0x56, 0x57, 0x7a, 0x2f, 0x77, 0x50, 0x75, 0x43, 0x79, 0x31, 0x45, 0x48, 0x4b, 0x79, 0x41, 0x5a, + 0x67, 0x5c, 0x0a, + 0x09, 0x51, 0x34, 0x63, 0x44, 0x56, 0x2b, 0x48, 0x32, 0x76, 0x70, 0x4a, 0x55, 0x46, 0x79, 0x38, 0x41, 0x52, + 0x77, 0x4c, 0x58, 0x70, 0x41, 0x35, 0x53, 0x4e, 0x6a, 0x59, 0x41, 0x36, 0x78, 0x30, 0x4d, 0x2f, 0x42, 0x43, + 0x59, 0x6e, 0x44, 0x71, 0x49, 0x4a, 0x43, 0x6c, 0x54, 0x71, 0x34, 0x6d, 0x6e, 0x43, 0x4e, 0x36, 0x59, 0x4f, + 0x6b, 0x69, 0x5a, 0x32, 0x41, 0x43, 0x45, 0x66, 0x59, 0x48, 0x72, 0x67, 0x65, 0x6d, 0x70, 0x67, 0x30, 0x69, + 0x53, 0x5c, 0x0a, + 0x09, 0x63, 0x72, 0x45, 0x4d, 0x4f, 0x42, 0x53, 0x34, 0x49, 0x33, 0x57, 0x51, 0x73, 0x72, 0x41, 0x42, 0x67, + 0x4c, 0x6e, 0x41, 0x4c, 0x34, 0x48, 0x5a, 0x71, 0x59, 0x4e, 0x49, 0x6b, 0x6e, 0x4b, 0x31, 0x42, 0x44, 0x67, + 0x41, 0x65, 0x43, 0x68, 0x31, 0x6b, 0x44, 0x4a, 0x6f, 0x2b, 0x6b, 0x5a, 0x41, 0x73, 0x34, 0x47, 0x66, 0x59, + 0x50, 0x47, 0x58, 0x70, 0x43, 0x62, 0x77, 0x6e, 0x44, 0x39, 0x45, 0x6b, 0x78, 0x75, 0x41, 0x79, 0x63, 0x53, + 0x61, 0x5c, 0x0a, + 0x09, 0x2f, 0x39, 0x7a, 0x55, 0x51, 0x53, 0x52, 0x4a, 0x68, 0x5a, 0x6d, 0x4c, 0x31, 0x33, 0x73, 0x42, 0x7a, + 0x57, 0x30, 0x41, 0x78, 0x67, 0x50, 0x2f, 0x41, 0x65, 0x79, 0x66, 0x4f, 0x6f, 0x67, 0x6b, 0x71, 0x58, 0x44, + 0x37, 0x45, 0x7a, 0x56, 0x67, 0x66, 0x4f, 0x6f, 0x67, 0x4b, 0x54, 0x57, 0x31, 0x41, 0x66, 0x67, 0x53, 0x63, + 0x63, 0x75, 0x66, 0x4a, 0x4b, 0x6d, 0x5a, 0x44, 0x69, 0x64, 0x71, 0x51, 0x57, 0x4d, 0x31, 0x73, 0x51, 0x45, + 0x34, 0x5c, 0x0a, + 0x09, 0x48, 0x54, 0x67, 0x35, 0x64, 0x51, 0x68, 0x4a, 0x55, 0x6e, 0x49, 0x6e, 0x45, 0x39, 0x75, 0x2b, 0x4e, + 0x31, 0x4c, 0x54, 0x37, 0x67, 0x49, 0x34, 0x48, 0x4c, 0x69, 0x61, 0x68, 0x6f, 0x39, 0x39, 0x4a, 0x45, 0x6b, + 0x76, 0x36, 0x67, 0x4f, 0x4f, 0x6f, 0x49, 0x45, 0x62, 0x42, 0x54, 0x57, 0x70, 0x41, 0x64, 0x67, 0x64, 0x75, + 0x41, 0x33, 0x59, 0x4c, 0x48, 0x55, 0x51, 0x53, 0x56, 0x4b, 0x70, 0x72, 0x43, 0x52, 0x75, 0x44, 0x37, 0x77, + 0x33, 0x5c, 0x0a, + 0x09, 0x64, 0x5a, 0x41, 0x69, 0x4e, 0x61, 0x55, 0x42, 0x32, 0x41, 0x72, 0x34, 0x4e, 0x62, 0x42, 0x4e, 0x36, + 0x69, 0x43, 0x53, 0x70, 0x46, 0x4a, 0x36, 0x46, 0x4e, 0x67, 0x50, 0x57, 0x4a, 0x51, 0x36, 0x53, 0x46, 0x47, + 0x61, 0x63, 0x41, 0x31, 0x41, 0x4c, 0x2f, 0x41, 0x39, 0x4c, 0x50, 0x36, 0x53, 0x70, 0x4a, 0x46, 0x74, 0x51, + 0x39, 0x53, 0x4b, 0x33, 0x74, 0x52, 0x42, 0x69, 0x74, 0x4b, 0x45, 0x42, 0x75, 0x42, 0x43, 0x34, 0x48, 0x57, + 0x70, 0x5c, 0x0a, + 0x09, 0x51, 0x30, 0x69, 0x53, 0x53, 0x6d, 0x39, 0x2f, 0x6f, 0x6d, 0x59, 0x30, 0x51, 0x74, 0x30, 0x62, 0x67, + 0x49, 0x38, 0x41, 0x4a, 0x36, 0x51, 0x4f, 0x49, 0x55, 0x6d, 0x71, 0x6a, 0x42, 0x4f, 0x49, 0x32, 0x6c, 0x46, + 0x37, 0x64, 0x62, 0x34, 0x47, 0x34, 0x43, 0x44, 0x67, 0x4f, 0x68, 0x6f, 0x30, 0x7a, 0x70, 0x45, 0x6b, 0x5a, + 0x65, 0x4a, 0x35, 0x34, 0x73, 0x46, 0x42, 0x74, 0x36, 0x51, 0x4f, 0x6b, 0x71, 0x65, 0x36, 0x4e, 0x67, 0x44, + 0x62, 0x5c, 0x0a, + 0x09, 0x41, 0x72, 0x2f, 0x42, 0x2f, 0x5a, 0x34, 0x6c, 0x53, 0x5a, 0x31, 0x5a, 0x41, 0x75, 0x77, 0x44, 0x4c, + 0x45, 0x77, 0x64, 0x4a, 0x43, 0x39, 0x31, 0x58, 0x41, 0x4c, 0x6f, 0x42, 0x61, 0x37, 0x43, 0x34, 0x69, 0x39, + 0x4a, 0x36, 0x74, 0x78, 0x73, 0x34, 0x45, 0x70, 0x71, 0x50, 0x45, 0x57, 0x75, 0x59, 0x77, 0x4e, 0x77, 0x50, + 0x72, 0x42, 0x76, 0x36, 0x68, 0x43, 0x53, 0x70, 0x4d, 0x72, 0x62, 0x6c, 0x36, 0x67, 0x70, 0x74, 0x56, 0x53, + 0x33, 0x5c, 0x0a, + 0x09, 0x4a, 0x59, 0x44, 0x33, 0x41, 0x70, 0x65, 0x6e, 0x44, 0x69, 0x46, 0x4a, 0x71, 0x70, 0x56, 0x6a, 0x69, + 0x49, 0x63, 0x48, 0x31, 0x55, 0x71, 0x64, 0x47, 0x6f, 0x42, 0x35, 0x77, 0x42, 0x33, 0x41, 0x31, 0x4e, 0x52, + 0x42, 0x4a, 0x45, 0x6d, 0x31, 0x73, 0x6f, 0x71, 0x59, 0x42, 0x6a, 0x79, 0x51, 0x4f, 0x6b, 0x69, 0x57, 0x36, + 0x72, 0x49, 0x45, 0x4d, 0x49, 0x56, 0x59, 0x39, 0x37, 0x66, 0x34, 0x53, 0x35, 0x4b, 0x79, 0x56, 0x73, 0x73, + 0x61, 0x5c, 0x0a, + 0x09, 0x55, 0x35, 0x63, 0x47, 0x34, 0x4d, 0x76, 0x45, 0x42, 0x45, 0x43, 0x53, 0x70, 0x44, 0x7a, 0x4d, 0x6f, + 0x32, 0x61, 0x50, 0x44, 0x36, 0x37, 0x44, 0x45, 0x73, 0x41, 0x78, 0x77, 0x47, 0x57, 0x70, 0x51, 0x30, 0x69, + 0x53, 0x47, 0x75, 0x45, 0x34, 0x61, 0x6c, 0x4a, 0x7a, 0x71, 0x74, 0x34, 0x41, 0x37, 0x41, 0x54, 0x63, 0x42, + 0x55, 0x78, 0x4c, 0x48, 0x55, 0x53, 0x53, 0x31, 0x41, 0x6a, 0x4c, 0x67, 0x62, 0x32, 0x42, 0x68, 0x31, 0x4d, + 0x48, 0x5c, 0x0a, + 0x09, 0x36, 0x56, 0x61, 0x56, 0x6c, 0x77, 0x42, 0x36, 0x69, 0x61, 0x73, 0x79, 0x4c, 0x66, 0x36, 0x53, 0x70, + 0x4b, 0x4a, 0x4d, 0x41, 0x37, 0x35, 0x4e, 0x44, 0x66, 0x59, 0x48, 0x71, 0x48, 0x49, 0x44, 0x38, 0x4c, 0x2f, + 0x78, 0x66, 0x6e, 0x39, 0x4a, 0x55, 0x76, 0x48, 0x32, 0x49, 0x57, 0x70, 0x51, 0x70, 0x56, 0x56, 0x31, 0x43, + 0x65, 0x41, 0x74, 0x77, 0x41, 0x31, 0x55, 0x75, 0x34, 0x47, 0x52, 0x4a, 0x46, 0x56, 0x58, 0x50, 0x2f, 0x41, + 0x33, 0x5c, 0x0a, + 0x09, 0x77, 0x45, 0x32, 0x70, 0x67, 0x33, 0x53, 0x71, 0x69, 0x67, 0x33, 0x41, 0x44, 0x4f, 0x43, 0x33, 0x77, + 0x48, 0x61, 0x70, 0x67, 0x30, 0x69, 0x53, 0x47, 0x6d, 0x30, 0x68, 0x38, 0x42, 0x70, 0x67, 0x61, 0x65, 0x6f, + 0x67, 0x6e, 0x61, 0x6a, 0x69, 0x4a, 0x2b, 0x67, 0x4c, 0x73, 0x50, 0x68, 0x4c, 0x6b, 0x74, 0x4c, 0x62, 0x6a, + 0x71, 0x68, 0x4a, 0x6c, 0x56, 0x53, 0x31, 0x43, 0x63, 0x42, 0x52, 0x77, 0x42, 0x57, 0x70, 0x51, 0x30, 0x69, + 0x53, 0x5c, 0x0a, + 0x09, 0x4e, 0x4d, 0x54, 0x52, 0x78, 0x49, 0x4f, 0x44, 0x4b, 0x71, 0x56, 0x4b, 0x44, 0x63, 0x41, 0x63, 0x34, + 0x46, 0x37, 0x67, 0x5a, 0x61, 0x6d, 0x44, 0x53, 0x4a, 0x49, 0x30, 0x78, 0x4e, 0x50, 0x41, 0x37, 0x73, 0x43, + 0x69, 0x31, 0x45, 0x48, 0x61, 0x55, 0x61, 0x55, 0x6c, 0x67, 0x4b, 0x39, 0x6a, 0x38, 0x5a, 0x63, 0x6b, 0x6c, + 0x63, 0x2f, 0x4c, 0x69, 0x42, 0x70, 0x56, 0x4b, 0x56, 0x56, 0x70, 0x41, 0x4e, 0x34, 0x44, 0x7a, 0x45, 0x38, + 0x64, 0x5c, 0x0a, + 0x09, 0x51, 0x70, 0x4b, 0x6b, 0x45, 0x63, 0x77, 0x6e, 0x64, 0x71, 0x61, 0x74, 0x6a, 0x43, 0x6f, 0x73, 0x41, + 0x57, 0x77, 0x42, 0x4c, 0x41, 0x42, 0x6d, 0x70, 0x51, 0x34, 0x69, 0x53, 0x64, 0x49, 0x6f, 0x6e, 0x67, 0x4a, + 0x32, 0x42, 0x52, 0x61, 0x6e, 0x44, 0x74, 0x4b, 0x4b, 0x4b, 0x6b, 0x77, 0x41, 0x76, 0x6f, 0x4c, 0x46, 0x58, + 0x35, 0x4a, 0x55, 0x66, 0x72, 0x4f, 0x49, 0x6d, 0x6c, 0x55, 0x4a, 0x5a, 0x57, 0x38, 0x41, 0x6a, 0x68, 0x70, + 0x34, 0x5c, 0x0a, + 0x09, 0x53, 0x5a, 0x4a, 0x55, 0x42, 0x5a, 0x57, 0x70, 0x57, 0x32, 0x56, 0x65, 0x41, 0x70, 0x67, 0x42, 0x33, + 0x45, 0x39, 0x63, 0x2f, 0x53, 0x39, 0x4a, 0x55, 0x6c, 0x55, 0x73, 0x41, 0x6e, 0x61, 0x68, 0x35, 0x42, 0x73, + 0x45, 0x6c, 0x58, 0x6b, 0x43, 0x63, 0x41, 0x34, 0x57, 0x66, 0x30, 0x6c, 0x53, 0x39, 0x63, 0x77, 0x42, 0x50, + 0x70, 0x4d, 0x36, 0x78, 0x46, 0x6a, 0x4b, 0x4f, 0x67, 0x46, 0x34, 0x50, 0x66, 0x41, 0x4c, 0x79, 0x74, 0x32, + 0x67, 0x5c, 0x0a, + 0x09, 0x53, 0x4a, 0x49, 0x30, 0x6b, 0x6e, 0x58, 0x41, 0x47, 0x34, 0x46, 0x66, 0x70, 0x67, 0x34, 0x79, 0x6b, + 0x6a, 0x49, 0x32, 0x41, 0x42, 0x4f, 0x42, 0x4f, 0x34, 0x45, 0x39, 0x55, 0x67, 0x65, 0x52, 0x4a, 0x4b, 0x6b, + 0x4c, 0x76, 0x79, 0x4f, 0x65, 0x48, 0x4c, 0x67, 0x32, 0x64, 0x5a, 0x44, 0x68, 0x6c, 0x50, 0x45, 0x54, 0x39, + 0x75, 0x6c, 0x59, 0x2f, 0x43, 0x56, 0x4a, 0x31, 0x62, 0x63, 0x48, 0x38, 0x4c, 0x48, 0x55, 0x49, 0x55, 0x5a, + 0x53, 0x5c, 0x0a, + 0x09, 0x74, 0x67, 0x6e, 0x41, 0x64, 0x73, 0x41, 0x44, 0x77, 0x4f, 0x54, 0x55, 0x51, 0x53, 0x52, 0x4a, 0x79, + 0x73, 0x42, 0x71, 0x59, 0x42, 0x37, 0x78, 0x35, 0x4d, 0x42, 0x53, 0x4b, 0x64, 0x73, 0x45, 0x34, 0x48, 0x4e, + 0x59, 0x2f, 0x43, 0x56, 0x4a, 0x39, 0x54, 0x47, 0x5a, 0x71, 0x47, 0x32, 0x6c, 0x55, 0x36, 0x59, 0x4a, 0x77, + 0x46, 0x75, 0x41, 0x47, 0x31, 0x4f, 0x48, 0x6b, 0x43, 0x51, 0x70, 0x42, 0x34, 0x63, 0x41, 0x4e, 0x36, 0x51, + 0x4f, 0x5c, 0x0a, + 0x09, 0x4d, 0x56, 0x52, 0x5a, 0x47, 0x6f, 0x43, 0x4a, 0x77, 0x44, 0x33, 0x45, 0x66, 0x5a, 0x4f, 0x53, 0x4a, + 0x4e, 0x58, 0x4e, 0x67, 0x38, 0x51, 0x31, 0x41, 0x61, 0x57, 0x35, 0x49, 0x4c, 0x41, 0x73, 0x53, 0x77, 0x43, + 0x6e, 0x59, 0x76, 0x47, 0x58, 0x4a, 0x4e, 0x58, 0x58, 0x7a, 0x6b, 0x53, 0x74, 0x4b, 0x34, 0x30, 0x79, 0x54, + 0x41, 0x43, 0x32, 0x42, 0x50, 0x34, 0x41, 0x54, 0x45, 0x73, 0x64, 0x52, 0x4a, 0x4b, 0x6b, 0x48, 0x43, 0x30, + 0x48, 0x5c, 0x0a, + 0x09, 0x58, 0x67, 0x30, 0x38, 0x6b, 0x54, 0x6f, 0x49, 0x6c, 0x47, 0x4d, 0x43, 0x63, 0x44, 0x59, 0x57, 0x66, + 0x30, 0x6c, 0x53, 0x2f, 0x55, 0x30, 0x6a, 0x61, 0x6c, 0x34, 0x70, 0x70, 0x4a, 0x34, 0x41, 0x37, 0x45, 0x71, + 0x73, 0x2f, 0x55, 0x39, 0x49, 0x47, 0x55, 0x4b, 0x53, 0x70, 0x49, 0x4c, 0x30, 0x41, 0x58, 0x73, 0x43, 0x39, + 0x36, 0x55, 0x4f, 0x6b, 0x6e, 0x6f, 0x43, 0x38, 0x44, 0x6b, 0x73, 0x2f, 0x70, 0x4b, 0x6b, 0x35, 0x68, 0x67, + 0x50, 0x5c, 0x0a, + 0x09, 0x6e, 0x4a, 0x73, 0x36, 0x42, 0x4b, 0x52, 0x74, 0x41, 0x41, 0x34, 0x42, 0x44, 0x6b, 0x74, 0x34, 0x66, + 0x45, 0x6d, 0x53, 0x55, 0x6a, 0x67, 0x4d, 0x65, 0x47, 0x76, 0x71, 0x45, 0x4b, 0x6d, 0x57, 0x41, 0x4d, 0x59, + 0x44, 0x64, 0x77, 0x4f, 0x37, 0x70, 0x7a, 0x69, 0x34, 0x4a, 0x45, 0x6d, 0x4a, 0x33, 0x55, 0x63, 0x73, 0x42, + 0x66, 0x53, 0x6c, 0x43, 0x70, 0x42, 0x71, 0x41, 0x76, 0x41, 0x2b, 0x4c, 0x50, 0x36, 0x53, 0x70, 0x4f, 0x62, + 0x61, 0x5c, 0x0a, + 0x09, 0x6a, 0x61, 0x69, 0x46, 0x79, 0x61, 0x53, 0x59, 0x41, 0x45, 0x77, 0x43, 0x66, 0x67, 0x39, 0x73, 0x58, + 0x2f, 0x53, 0x42, 0x4a, 0x55, 0x6b, 0x71, 0x6b, 0x55, 0x65, 0x49, 0x32, 0x77, 0x4c, 0x58, 0x70, 0x44, 0x68, + 0x34, 0x69, 0x67, 0x6e, 0x41, 0x69, 0x56, 0x6a, 0x38, 0x4a, 0x55, 0x6e, 0x61, 0x48, 0x6a, 0x67, 0x70, 0x31, + 0x63, 0x47, 0x4c, 0x6e, 0x67, 0x42, 0x4d, 0x41, 0x52, 0x34, 0x6d, 0x4e, 0x76, 0x2b, 0x52, 0x4a, 0x4b, 0x6e, + 0x70, 0x5c, 0x0a, + 0x09, 0x46, 0x67, 0x4e, 0x7a, 0x67, 0x52, 0x56, 0x46, 0x48, 0x37, 0x6a, 0x6f, 0x43, 0x63, 0x42, 0x48, 0x73, + 0x66, 0x68, 0x4c, 0x6b, 0x6a, 0x52, 0x6f, 0x43, 0x2b, 0x43, 0x30, 0x46, 0x41, 0x63, 0x75, 0x63, 0x67, 0x49, + 0x77, 0x45, 0x2f, 0x67, 0x54, 0x4d, 0x4c, 0x32, 0x6f, 0x41, 0x30, 0x71, 0x53, 0x56, 0x41, 0x48, 0x4c, 0x67, + 0x42, 0x32, 0x41, 0x5a, 0x34, 0x73, 0x38, 0x61, 0x4a, 0x45, 0x54, 0x67, 0x4e, 0x4f, 0x78, 0x2b, 0x45, 0x75, + 0x53, 0x5c, 0x0a, + 0x09, 0x74, 0x4c, 0x48, 0x70, 0x77, 0x4d, 0x65, 0x4b, 0x50, 0x6d, 0x68, 0x52, 0x45, 0x34, 0x41, 0x5a, 0x77, + 0x4a, 0x2b, 0x78, 0x41, 0x5a, 0x41, 0x6b, 0x61, 0x54, 0x69, 0x46, 0x54, 0x77, 0x47, 0x4b, 0x6d, 0x67, 0x42, + 0x38, 0x46, 0x49, 0x75, 0x2f, 0x4a, 0x45, 0x6b, 0x6a, 0x6d, 0x55, 0x37, 0x55, 0x79, 0x73, 0x49, 0x55, 0x4d, + 0x51, 0x47, 0x59, 0x51, 0x61, 0x7a, 0x39, 0x7a, 0x38, 0x6a, 0x37, 0x51, 0x4a, 0x49, 0x6b, 0x56, 0x64, 0x67, + 0x79, 0x5c, 0x0a, + 0x09, 0x34, 0x42, 0x58, 0x41, 0x30, 0x69, 0x49, 0x4f, 0x56, 0x73, 0x51, 0x45, 0x34, 0x44, 0x51, 0x73, 0x2f, + 0x70, 0x49, 0x6b, 0x6a, 0x57, 0x55, 0x36, 0x63, 0x62, 0x31, 0x63, 0x49, 0x66, 0x4b, 0x65, 0x41, 0x45, 0x77, + 0x46, 0x46, 0x68, 0x4a, 0x33, 0x41, 0x45, 0x69, 0x53, 0x70, 0x4e, 0x45, 0x74, 0x42, 0x62, 0x59, 0x46, 0x56, + 0x75, 0x5a, 0x39, 0x6f, 0x4c, 0x77, 0x6e, 0x41, 0x43, 0x64, 0x69, 0x38, 0x5a, 0x63, 0x6b, 0x71, 0x56, 0x55, + 0x7a, 0x5c, 0x0a, + 0x09, 0x67, 0x41, 0x38, 0x56, 0x63, 0x61, 0x41, 0x38, 0x4a, 0x77, 0x43, 0x39, 0x78, 0x4b, 0x35, 0x2f, 0x32, + 0x2b, 0x52, 0x31, 0x41, 0x45, 0x6d, 0x53, 0x61, 0x75, 0x67, 0x78, 0x59, 0x45, 0x66, 0x67, 0x2b, 0x54, 0x77, + 0x50, 0x6b, 0x75, 0x63, 0x45, 0x34, 0x46, 0x67, 0x73, 0x2f, 0x70, 0x49, 0x6b, 0x74, 0x57, 0x74, 0x72, 0x34, + 0x4c, 0x69, 0x38, 0x44, 0x35, 0x4c, 0x58, 0x42, 0x4b, 0x43, 0x48, 0x65, 0x4e, 0x62, 0x78, 0x76, 0x44, 0x7a, + 0x65, 0x5c, 0x0a, + 0x09, 0x58, 0x4a, 0x4b, 0x6b, 0x6d, 0x6e, 0x73, 0x51, 0x32, 0x42, 0x56, 0x59, 0x6c, 0x39, 0x63, 0x42, 0x38, + 0x70, 0x6f, 0x41, 0x7a, 0x4d, 0x66, 0x69, 0x4c, 0x30, 0x6c, 0x53, 0x70, 0x33, 0x59, 0x6d, 0x61, 0x6d, 0x6c, + 0x75, 0x38, 0x6d, 0x6f, 0x41, 0x43, 0x74, 0x33, 0x4d, 0x51, 0x4a, 0x4b, 0x6b, 0x47, 0x73, 0x71, 0x31, 0x6c, + 0x75, 0x61, 0x78, 0x42, 0x4c, 0x41, 0x58, 0x63, 0x46, 0x66, 0x57, 0x62, 0x79, 0x70, 0x4a, 0x55, 0x67, 0x50, + 0x74, 0x5c, 0x0a, + 0x09, 0x44, 0x64, 0x79, 0x64, 0x78, 0x78, 0x76, 0x6e, 0x4d, 0x51, 0x48, 0x77, 0x30, 0x37, 0x38, 0x6b, 0x53, + 0x64, 0x6e, 0x49, 0x72, 0x61, 0x5a, 0x6d, 0x50, 0x51, 0x47, 0x59, 0x51, 0x7a, 0x7a, 0x30, 0x70, 0x7a, 0x66, + 0x4c, 0x4e, 0x35, 0x55, 0x6b, 0x71, 0x61, 0x47, 0x65, 0x4a, 0x37, 0x59, 0x48, 0x58, 0x70, 0x54, 0x31, 0x47, + 0x32, 0x63, 0x39, 0x41, 0x66, 0x67, 0x77, 0x46, 0x6e, 0x39, 0x4a, 0x6b, 0x72, 0x4c, 0x53, 0x53, 0x39, 0x54, + 0x57, 0x5c, 0x0a, + 0x09, 0x7a, 0x47, 0x55, 0x35, 0x41, 0x65, 0x67, 0x46, 0x48, 0x67, 0x56, 0x6d, 0x5a, 0x2f, 0x57, 0x47, 0x6b, + 0x69, 0x53, 0x4a, 0x4a, 0x63, 0x53, 0x2b, 0x4f, 0x70, 0x6c, 0x75, 0x44, 0x4a, 0x54, 0x6c, 0x42, 0x4f, 0x42, + 0x49, 0x4c, 0x50, 0x36, 0x53, 0x4a, 0x47, 0x56, 0x74, 0x4e, 0x6c, 0x46, 0x6a, 0x4d, 0x35, 0x56, 0x6c, 0x41, + 0x33, 0x42, 0x53, 0x68, 0x75, 0x38, 0x6c, 0x53, 0x5a, 0x4c, 0x57, 0x4f, 0x7a, 0x6e, 0x72, 0x4e, 0x38, 0x78, + 0x71, 0x5c, 0x0a, + 0x09, 0x43, 0x57, 0x41, 0x58, 0x59, 0x45, 0x45, 0x57, 0x62, 0x79, 0x52, 0x4a, 0x6b, 0x6f, 0x61, 0x31, 0x47, + 0x78, 0x6e, 0x57, 0x32, 0x71, 0x77, 0x6d, 0x41, 0x4a, 0x6c, 0x33, 0x4a, 0x70, 0x49, 0x6b, 0x61, 0x51, 0x4f, + 0x5a, 0x54, 0x74, 0x71, 0x7a, 0x6d, 0x41, 0x42, 0x4d, 0x49, 0x53, 0x37, 0x2b, 0x6d, 0x39, 0x46, 0x39, 0x48, + 0x45, 0x6d, 0x53, 0x4e, 0x49, 0x4b, 0x6c, 0x77, 0x4c, 0x62, 0x41, 0x79, 0x69, 0x7a, 0x65, 0x4c, 0x49, 0x73, + 0x4a, 0x5c, 0x0a, + 0x09, 0x77, 0x4e, 0x46, 0x59, 0x2f, 0x43, 0x56, 0x4a, 0x79, 0x74, 0x73, 0x4d, 0x6f, 0x75, 0x5a, 0x6d, 0x49, + 0x6f, 0x73, 0x47, 0x34, 0x50, 0x67, 0x4d, 0x33, 0x6b, 0x4f, 0x53, 0x4a, 0x49, 0x33, 0x74, 0x68, 0x4b, 0x7a, + 0x65, 0x71, 0x4e, 0x73, 0x6c, 0x67, 0x46, 0x63, 0x43, 0x76, 0x77, 0x66, 0x47, 0x5a, 0x52, 0x4e, 0x48, 0x6b, + 0x69, 0x53, 0x4e, 0x6f, 0x68, 0x39, 0x34, 0x4e, 0x66, 0x44, 0x48, 0x62, 0x74, 0x2b, 0x6f, 0x32, 0x77, 0x6e, + 0x41, 0x5c, 0x0a, + 0x09, 0x42, 0x37, 0x48, 0x34, 0x53, 0x35, 0x4a, 0x55, 0x6c, 0x48, 0x46, 0x45, 0x37, 0x65, 0x33, 0x2b, 0x6a, + 0x62, 0x71, 0x59, 0x41, 0x50, 0x51, 0x41, 0x6a, 0x78, 0x43, 0x37, 0x45, 0x30, 0x6d, 0x53, 0x70, 0x47, 0x49, + 0x38, 0x42, 0x6d, 0x77, 0x50, 0x39, 0x48, 0x58, 0x7a, 0x4a, 0x74, 0x31, 0x4d, 0x41, 0x41, 0x37, 0x42, 0x34, + 0x69, 0x39, 0x4a, 0x55, 0x74, 0x47, 0x32, 0x42, 0x67, 0x37, 0x74, 0x39, 0x6b, 0x32, 0x36, 0x61, 0x51, 0x44, + 0x65, 0x5c, 0x0a, + 0x09, 0x33, 0x2b, 0x33, 0x42, 0x4a, 0x55, 0x6c, 0x53, 0x52, 0x34, 0x37, 0x72, 0x39, 0x67, 0x30, 0x36, 0x58, + 0x51, 0x4b, 0x59, 0x41, 0x6a, 0x77, 0x35, 0x38, 0x4b, 0x4d, 0x6b, 0x53, 0x53, 0x72, 0x57, 0x4b, 0x6d, 0x44, + 0x4c, 0x67, 0x52, 0x38, 0x37, 0x30, 0x75, 0x6b, 0x45, 0x34, 0x4a, 0x31, 0x59, 0x2f, 0x43, 0x56, 0x4a, 0x53, + 0x6d, 0x55, 0x4b, 0x55, 0x59, 0x73, 0x37, 0x31, 0x6d, 0x6b, 0x44, 0x63, 0x45, 0x77, 0x33, 0x42, 0x35, 0x55, + 0x6b, 0x5c, 0x0a, + 0x09, 0x53, 0x56, 0x33, 0x72, 0x71, 0x68, 0x5a, 0x33, 0x73, 0x67, 0x51, 0x77, 0x43, 0x33, 0x67, 0x63, 0x6d, + 0x4e, 0x6a, 0x4e, 0x67, 0x53, 0x56, 0x4a, 0x55, 0x6c, 0x66, 0x57, 0x41, 0x69, 0x38, 0x48, 0x6e, 0x75, 0x72, + 0x6b, 0x44, 0x33, 0x63, 0x79, 0x41, 0x54, 0x67, 0x61, 0x69, 0x37, 0x38, 0x6b, 0x53, 0x61, 0x6c, 0x4e, 0x70, + 0x49, 0x75, 0x74, 0x67, 0x54, 0x74, 0x70, 0x41, 0x49, 0x37, 0x71, 0x39, 0x47, 0x43, 0x53, 0x4a, 0x43, 0x6c, + 0x54, 0x5c, 0x0a, + 0x09, 0x48, 0x64, 0x66, 0x6b, 0x64, 0x70, 0x63, 0x41, 0x5a, 0x67, 0x4f, 0x4c, 0x67, 0x50, 0x47, 0x64, 0x48, + 0x6c, 0x43, 0x53, 0x4a, 0x47, 0x57, 0x6d, 0x44, 0x35, 0x67, 0x44, 0x4c, 0x47, 0x6e, 0x33, 0x44, 0x37, 0x59, + 0x37, 0x41, 0x54, 0x67, 0x63, 0x69, 0x37, 0x38, 0x6b, 0x53, 0x57, 0x55, 0x78, 0x6e, 0x67, 0x37, 0x76, 0x42, + 0x6d, 0x69, 0x33, 0x41, 0x58, 0x44, 0x38, 0x4c, 0x30, 0x6c, 0x53, 0x75, 0x52, 0x7a, 0x5a, 0x79, 0x52, 0x39, + 0x71, 0x5c, 0x0a, + 0x09, 0x5a, 0x77, 0x6c, 0x67, 0x42, 0x72, 0x48, 0x35, 0x54, 0x32, 0x38, 0x6e, 0x42, 0x35, 0x49, 0x6b, 0x53, + 0x62, 0x6c, 0x59, 0x43, 0x32, 0x77, 0x42, 0x4c, 0x47, 0x33, 0x6e, 0x44, 0x37, 0x55, 0x7a, 0x41, 0x5a, 0x69, + 0x50, 0x78, 0x56, 0x2b, 0x53, 0x70, 0x4c, 0x4b, 0x5a, 0x53, 0x43, 0x7a, 0x52, 0x74, 0x36, 0x58, 0x64, 0x42, + 0x6b, 0x43, 0x53, 0x4a, 0x4a, 0x56, 0x50, 0x32, 0x7a, 0x57, 0x36, 0x31, 0x53, 0x57, 0x41, 0x53, 0x63, 0x54, + 0x34, 0x5c, 0x0a, + 0x09, 0x66, 0x33, 0x71, 0x37, 0x42, 0x35, 0x41, 0x6b, 0x53, 0x62, 0x6c, 0x62, 0x53, 0x57, 0x7a, 0x55, 0x74, + 0x36, 0x62, 0x56, 0x50, 0x39, 0x44, 0x71, 0x42, 0x4f, 0x41, 0x67, 0x4c, 0x50, 0x36, 0x53, 0x4a, 0x4a, 0x58, + 0x56, 0x56, 0x4b, 0x4a, 0x57, 0x74, 0x36, 0x7a, 0x56, 0x42, 0x75, 0x44, 0x74, 0x37, 0x57, 0x65, 0x52, 0x4a, + 0x45, 0x6b, 0x46, 0x61, 0x71, 0x74, 0x57, 0x74, 0x37, 0x6f, 0x45, 0x38, 0x42, 0x43, 0x77, 0x55, 0x30, 0x64, + 0x78, 0x5c, 0x0a, + 0x09, 0x4a, 0x45, 0x6c, 0x53, 0x45, 0x52, 0x34, 0x47, 0x35, 0x72, 0x62, 0x36, 0x7a, 0x61, 0x31, 0x4d, 0x41, + 0x48, 0x62, 0x47, 0x34, 0x69, 0x39, 0x4a, 0x55, 0x74, 0x6e, 0x74, 0x42, 0x4f, 0x7a, 0x61, 0x36, 0x6a, 0x65, + 0x33, 0x30, 0x67, 0x43, 0x38, 0x72, 0x66, 0x4d, 0x73, 0x6b, 0x69, 0x53, 0x70, 0x51, 0x47, 0x39, 0x74, 0x39, + 0x52, 0x74, 0x62, 0x61, 0x51, 0x41, 0x4f, 0x36, 0x53, 0x4b, 0x49, 0x4a, 0x45, 0x6b, 0x71, 0x54, 0x73, 0x73, + 0x31, 0x5c, 0x0a, + 0x09, 0x65, 0x36, 0x78, 0x72, 0x41, 0x43, 0x59, 0x42, 0x54, 0x77, 0x4e, 0x54, 0x75, 0x6b, 0x30, 0x6b, 0x53, + 0x5a, 0x4a, 0x79, 0x39, 0x78, 0x77, 0x77, 0x6b, 0x78, 0x5a, 0x75, 0x42, 0x78, 0x78, 0x72, 0x41, 0x76, 0x42, + 0x36, 0x4c, 0x50, 0x36, 0x53, 0x4a, 0x46, 0x58, 0x46, 0x53, 0x34, 0x45, 0x44, 0x57, 0x2f, 0x6e, 0x47, 0x73, + 0x52, 0x71, 0x41, 0x51, 0x37, 0x76, 0x50, 0x49, 0x6b, 0x6d, 0x53, 0x43, 0x74, 0x54, 0x53, 0x4d, 0x73, 0x42, + 0x59, 0x5c, 0x0a, + 0x09, 0x44, 0x59, 0x44, 0x72, 0x2f, 0x35, 0x49, 0x6b, 0x56, 0x55, 0x74, 0x4c, 0x74, 0x58, 0x75, 0x30, 0x61, + 0x77, 0x42, 0x6d, 0x45, 0x4f, 0x76, 0x2f, 0x37, 0x54, 0x34, 0x79, 0x57, 0x4a, 0x49, 0x6b, 0x70, 0x62, 0x4f, + 0x4f, 0x32, 0x42, 0x62, 0x34, 0x32, 0x64, 0x47, 0x2b, 0x61, 0x62, 0x54, 0x69, 0x66, 0x75, 0x41, 0x59, 0x58, + 0x35, 0x63, 0x6b, 0x53, 0x65, 0x58, 0x54, 0x41, 0x37, 0x79, 0x68, 0x6c, 0x57, 0x38, 0x61, 0x53, 0x56, 0x74, + 0x37, 0x5c, 0x0a, + 0x09, 0x43, 0x6b, 0x75, 0x53, 0x70, 0x4e, 0x4a, 0x34, 0x30, 0x31, 0x6a, 0x66, 0x4d, 0x46, 0x6f, 0x44, 0x4d, + 0x4f, 0x59, 0x66, 0x6c, 0x69, 0x52, 0x4a, 0x70, 0x54, 0x52, 0x6d, 0x44, 0x52, 0x2f, 0x70, 0x47, 0x6f, 0x43, + 0x70, 0x78, 0x4e, 0x72, 0x42, 0x68, 0x4b, 0x77, 0x54, 0x53, 0x5a, 0x4b, 0x6b, 0x33, 0x4c, 0x30, 0x41, 0x62, + 0x41, 0x36, 0x73, 0x47, 0x4f, 0x6b, 0x62, 0x52, 0x70, 0x6f, 0x41, 0x48, 0x49, 0x6a, 0x46, 0x58, 0x35, 0x4b, + 0x6b, 0x5c, 0x0a, + 0x09, 0x71, 0x70, 0x6f, 0x41, 0x48, 0x44, 0x44, 0x61, 0x4e, 0x34, 0x7a, 0x55, 0x41, 0x49, 0x7a, 0x36, 0x68, + 0x79, 0x52, 0x4a, 0x55, 0x75, 0x6c, 0x31, 0x31, 0x41, 0x43, 0x38, 0x50, 0x6f, 0x63, 0x67, 0x6b, 0x69, 0x53, + 0x70, 0x4f, 0x4b, 0x50, 0x57, 0x38, 0x75, 0x47, 0x75, 0x41, 0x65, 0x67, 0x42, 0x6e, 0x67, 0x47, 0x6d, 0x35, + 0x35, 0x56, 0x49, 0x6b, 0x69, 0x54, 0x6c, 0x62, 0x68, 0x6c, 0x78, 0x48, 0x63, 0x43, 0x36, 0x34, 0x62, 0x34, + 0x34, 0x5c, 0x0a, + 0x09, 0x33, 0x41, 0x52, 0x67, 0x48, 0x68, 0x5a, 0x2f, 0x53, 0x5a, 0x4b, 0x71, 0x62, 0x6a, 0x70, 0x52, 0x30, + 0x34, 0x63, 0x31, 0x58, 0x41, 0x4f, 0x77, 0x58, 0x33, 0x35, 0x5a, 0x4a, 0x45, 0x6c, 0x53, 0x67, 0x56, 0x34, + 0x33, 0x30, 0x68, 0x65, 0x47, 0x61, 0x77, 0x44, 0x32, 0x7a, 0x7a, 0x47, 0x49, 0x4a, 0x45, 0x6b, 0x71, 0x7a, + 0x72, 0x34, 0x6a, 0x66, 0x63, 0x45, 0x4a, 0x67, 0x43, 0x52, 0x4a, 0x39, 0x54, 0x58, 0x69, 0x68, 0x2f, 0x71, + 0x4e, 0x5c, 0x0a, + 0x09, 0x4c, 0x77, 0x4b, 0x63, 0x52, 0x47, 0x77, 0x61, 0x4d, 0x44, 0x48, 0x76, 0x52, 0x4a, 0x49, 0x6b, 0x4b, + 0x58, 0x64, 0x72, 0x67, 0x63, 0x32, 0x41, 0x4e, 0x52, 0x74, 0x2f, 0x59, 0x65, 0x4d, 0x4a, 0x77, 0x4b, 0x35, + 0x59, 0x2f, 0x43, 0x56, 0x4a, 0x71, 0x6f, 0x75, 0x4a, 0x77, 0x47, 0x37, 0x44, 0x66, 0x57, 0x48, 0x6a, 0x42, + 0x6d, 0x43, 0x76, 0x2f, 0x4c, 0x4e, 0x49, 0x6b, 0x71, 0x51, 0x43, 0x44, 0x56, 0x76, 0x62, 0x62, 0x51, 0x41, + 0x6b, 0x5c, 0x0a, + 0x09, 0x53, 0x61, 0x6f, 0x33, 0x47, 0x77, 0x42, 0x4a, 0x6b, 0x68, 0x70, 0x6f, 0x37, 0x2b, 0x46, 0x2b, 0x63, + 0x2b, 0x68, 0x46, 0x67, 0x44, 0x33, 0x41, 0x63, 0x6d, 0x42, 0x4b, 0x55, 0x59, 0x6b, 0x6b, 0x53, 0x56, 0x4c, + 0x75, 0x56, 0x67, 0x48, 0x54, 0x32, 0x47, 0x68, 0x48, 0x77, 0x4b, 0x45, 0x54, 0x67, 0x42, 0x32, 0x78, 0x2b, + 0x45, 0x75, 0x53, 0x56, 0x44, 0x64, 0x54, 0x67, 0x42, 0x30, 0x32, 0x2f, 0x73, 0x32, 0x68, 0x44, 0x63, 0x43, + 0x75, 0x5c, 0x0a, + 0x09, 0x78, 0x57, 0x57, 0x52, 0x4a, 0x45, 0x6b, 0x46, 0x32, 0x6d, 0x58, 0x6a, 0x33, 0x78, 0x6a, 0x61, 0x41, + 0x41, 0x78, 0x37, 0x6d, 0x34, 0x41, 0x6b, 0x53, 0x61, 0x71, 0x38, 0x54, 0x54, 0x37, 0x6b, 0x44, 0x32, 0x30, + 0x41, 0x4e, 0x75, 0x6b, 0x4f, 0x4a, 0x45, 0x6c, 0x53, 0x4c, 0x59, 0x7a, 0x61, 0x41, 0x49, 0x7a, 0x34, 0x78, + 0x43, 0x42, 0x4a, 0x6b, 0x6c, 0x52, 0x70, 0x6d, 0x33, 0x7a, 0x49, 0x48, 0x37, 0x77, 0x4c, 0x6f, 0x49, 0x66, + 0x59, 0x5c, 0x0a, + 0x09, 0x41, 0x6e, 0x68, 0x79, 0x30, 0x59, 0x6b, 0x6b, 0x53, 0x56, 0x4c, 0x75, 0x56, 0x68, 0x4e, 0x62, 0x41, + 0x72, 0x39, 0x34, 0x4a, 0x38, 0x44, 0x67, 0x42, 0x47, 0x42, 0x72, 0x4c, 0x50, 0x36, 0x53, 0x4a, 0x4e, 0x58, + 0x56, 0x5a, 0x47, 0x44, 0x62, 0x6f, 0x62, 0x38, 0x78, 0x32, 0x41, 0x44, 0x73, 0x56, 0x48, 0x77, 0x57, 0x53, + 0x5a, 0x4a, 0x55, 0x6f, 0x41, 0x31, 0x71, 0x2f, 0x57, 0x41, 0x44, 0x38, 0x4b, 0x6f, 0x45, 0x51, 0x53, 0x52, + 0x4a, 0x5c, 0x0a, + 0x09, 0x55, 0x6e, 0x48, 0x6d, 0x44, 0x76, 0x33, 0x46, 0x59, 0x41, 0x4f, 0x77, 0x59, 0x34, 0x49, 0x67, 0x6b, + 0x69, 0x53, 0x70, 0x4f, 0x4d, 0x4d, 0x32, 0x41, 0x48, 0x4f, 0x48, 0x2b, 0x55, 0x5a, 0x4a, 0x6b, 0x6c, 0x51, + 0x66, 0x4e, 0x67, 0x43, 0x53, 0x4a, 0x44, 0x58, 0x51, 0x42, 0x74, 0x63, 0x41, 0x44, 0x4e, 0x34, 0x47, 0x75, + 0x4a, 0x79, 0x34, 0x50, 0x55, 0x43, 0x53, 0x4a, 0x4e, 0x58, 0x54, 0x4b, 0x6d, 0x44, 0x71, 0x34, 0x43, 0x39, + 0x36, 0x5c, 0x0a, + 0x09, 0x67, 0x4a, 0x6c, 0x59, 0x2f, 0x43, 0x56, 0x4a, 0x71, 0x72, 0x73, 0x70, 0x77, 0x4f, 0x61, 0x44, 0x76, + 0x2b, 0x68, 0x68, 0x6f, 0x2f, 0x73, 0x43, 0x4a, 0x55, 0x6c, 0x53, 0x62, 0x62, 0x31, 0x59, 0x38, 0x32, 0x30, + 0x41, 0x4a, 0x45, 0x6c, 0x71, 0x44, 0x68, 0x73, 0x41, 0x53, 0x5a, 0x49, 0x61, 0x61, 0x4c, 0x76, 0x42, 0x6e, + 0x2f, 0x51, 0x4d, 0x2f, 0x59, 0x55, 0x6b, 0x53, 0x61, 0x71, 0x31, 0x62, 0x51, 0x5a, 0x2f, 0x30, 0x6a, 0x50, + 0x30, 0x5c, 0x0a, + 0x09, 0x46, 0x35, 0x49, 0x6b, 0x71, 0x64, 0x59, 0x32, 0x6d, 0x41, 0x44, 0x4d, 0x53, 0x52, 0x68, 0x45, 0x6b, + 0x69, 0x51, 0x56, 0x5a, 0x36, 0x76, 0x42, 0x6e, 0x2f, 0x51, 0x41, 0x57, 0x79, 0x51, 0x4d, 0x49, 0x6b, 0x6d, + 0x53, 0x69, 0x72, 0x50, 0x6c, 0x34, 0x45, 0x39, 0x36, 0x47, 0x4e, 0x49, 0x4e, 0x53, 0x4a, 0x4b, 0x6b, 0x57, + 0x6e, 0x76, 0x78, 0x51, 0x2f, 0x2b, 0x34, 0x2f, 0x76, 0x37, 0x2b, 0x50, 0x74, 0x5a, 0x76, 0x43, 0x53, 0x78, + 0x4a, 0x5c, 0x0a, + 0x09, 0x6b, 0x75, 0x70, 0x72, 0x48, 0x64, 0x41, 0x4c, 0x39, 0x50, 0x56, 0x67, 0x38, 0x5a, 0x63, 0x6b, 0x71, + 0x53, 0x6c, 0x36, 0x67, 0x46, 0x6d, 0x44, 0x50, 0x35, 0x45, 0x6b, 0x53, 0x63, 0x30, 0x78, 0x42, 0x32, 0x77, + 0x41, 0x4a, 0x45, 0x6c, 0x71, 0x47, 0x69, 0x63, 0x41, 0x6b, 0x69, 0x51, 0x31, 0x30, 0x41, 0x79, 0x77, 0x41, + 0x5a, 0x41, 0x6b, 0x71, 0x57, 0x6c, 0x73, 0x41, 0x43, 0x52, 0x4a, 0x61, 0x69, 0x41, 0x62, 0x41, 0x45, 0x6d, + 0x53, 0x5c, 0x0a, + 0x09, 0x47, 0x73, 0x67, 0x47, 0x51, 0x4a, 0x4b, 0x6b, 0x42, 0x72, 0x49, 0x42, 0x6b, 0x43, 0x53, 0x70, 0x67, + 0x57, 0x77, 0x41, 0x4a, 0x45, 0x6c, 0x71, 0x6f, 0x47, 0x6c, 0x67, 0x41, 0x79, 0x42, 0x4a, 0x55, 0x74, 0x4e, + 0x4d, 0x41, 0x68, 0x73, 0x41, 0x53, 0x5a, 0x4b, 0x61, 0x5a, 0x6a, 0x4c, 0x59, 0x41, 0x45, 0x69, 0x53, 0x31, + 0x44, 0x52, 0x54, 0x77, 0x51, 0x5a, 0x41, 0x6b, 0x71, 0x53, 0x6d, 0x63, 0x51, 0x6c, 0x41, 0x6b, 0x71, 0x51, + 0x47, 0x5c, 0x0a, + 0x09, 0x6d, 0x67, 0x49, 0x32, 0x41, 0x4a, 0x49, 0x6b, 0x4e, 0x59, 0x30, 0x4e, 0x67, 0x43, 0x52, 0x4a, 0x44, + 0x54, 0x51, 0x42, 0x62, 0x41, 0x41, 0x6b, 0x53, 0x57, 0x6f, 0x6b, 0x47, 0x77, 0x42, 0x4a, 0x6b, 0x68, 0x72, + 0x49, 0x42, 0x6b, 0x43, 0x53, 0x70, 0x47, 0x62, 0x70, 0x42, 0x52, 0x6a, 0x58, 0x33, 0x39, 0x2f, 0x66, 0x6e, + 0x7a, 0x71, 0x4a, 0x4a, 0x45, 0x6b, 0x71, 0x31, 0x44, 0x67, 0x6e, 0x41, 0x4a, 0x49, 0x6b, 0x4e, 0x5a, 0x41, + 0x4e, 0x5c, 0x0a, + 0x09, 0x67, 0x43, 0x52, 0x4a, 0x44, 0x57, 0x51, 0x44, 0x49, 0x45, 0x6c, 0x53, 0x41, 0x39, 0x6b, 0x41, 0x53, + 0x4a, 0x4c, 0x55, 0x4c, 0x4d, 0x2b, 0x42, 0x44, 0x59, 0x41, 0x6b, 0x53, 0x55, 0x33, 0x7a, 0x50, 0x4e, 0x67, + 0x41, 0x53, 0x4a, 0x4c, 0x55, 0x53, 0x44, 0x59, 0x41, 0x6b, 0x69, 0x51, 0x31, 0x6b, 0x41, 0x32, 0x41, 0x4a, + 0x45, 0x6e, 0x4e, 0x38, 0x67, 0x4c, 0x59, 0x41, 0x45, 0x69, 0x53, 0x31, 0x44, 0x53, 0x72, 0x77, 0x41, 0x5a, + 0x41, 0x5c, 0x0a, + 0x09, 0x6b, 0x71, 0x53, 0x6d, 0x73, 0x51, 0x47, 0x51, 0x4a, 0x4b, 0x6d, 0x42, 0x31, 0x6f, 0x41, 0x4e, 0x67, + 0x43, 0x52, 0x4a, 0x54, 0x62, 0x4d, 0x53, 0x62, 0x41, 0x41, 0x6b, 0x53, 0x57, 0x71, 0x61, 0x31, 0x57, 0x41, + 0x44, 0x49, 0x45, 0x6c, 0x53, 0x30, 0x37, 0x67, 0x45, 0x49, 0x45, 0x6c, 0x53, 0x41, 0x79, 0x30, 0x48, 0x47, + 0x77, 0x42, 0x4a, 0x6b, 0x70, 0x70, 0x6d, 0x4b, 0x64, 0x67, 0x41, 0x53, 0x4a, 0x4c, 0x55, 0x4e, 0x44, 0x59, + 0x41, 0x5c, 0x0a, + 0x09, 0x6b, 0x69, 0x51, 0x31, 0x6b, 0x41, 0x32, 0x41, 0x4a, 0x45, 0x6b, 0x4e, 0x5a, 0x41, 0x4d, 0x67, 0x53, + 0x56, 0x49, 0x44, 0x32, 0x51, 0x42, 0x49, 0x6b, 0x74, 0x52, 0x41, 0x4e, 0x67, 0x43, 0x53, 0x4a, 0x44, 0x58, + 0x51, 0x55, 0x32, 0x41, 0x44, 0x49, 0x45, 0x6c, 0x53, 0x30, 0x7a, 0x77, 0x42, 0x4d, 0x4b, 0x36, 0x2f, 0x76, + 0x37, 0x38, 0x50, 0x47, 0x77, 0x46, 0x4a, 0x6b, 0x70, 0x70, 0x67, 0x48, 0x64, 0x41, 0x4c, 0x39, 0x50, 0x55, + 0x77, 0x5c, 0x0a, + 0x09, 0x4d, 0x41, 0x71, 0x51, 0x4a, 0x45, 0x6d, 0x31, 0x39, 0x78, 0x54, 0x51, 0x42, 0x2f, 0x48, 0x4a, 0x2f, + 0x38, 0x6d, 0x30, 0x57, 0x53, 0x52, 0x4a, 0x55, 0x6b, 0x45, 0x57, 0x44, 0x2f, 0x37, 0x45, 0x42, 0x6b, 0x43, + 0x53, 0x70, 0x4f, 0x5a, 0x34, 0x73, 0x65, 0x62, 0x33, 0x41, 0x49, 0x73, 0x53, 0x42, 0x70, 0x45, 0x6b, 0x53, + 0x63, 0x56, 0x35, 0x59, 0x76, 0x41, 0x6e, 0x50, 0x63, 0x43, 0x6a, 0x43, 0x59, 0x4e, 0x49, 0x6b, 0x71, 0x54, + 0x69, 0x5c, 0x0a, + 0x09, 0x4c, 0x42, 0x7a, 0x38, 0x53, 0x63, 0x2f, 0x51, 0x58, 0x30, 0x69, 0x53, 0x70, 0x46, 0x70, 0x37, 0x38, + 0x55, 0x4f, 0x2f, 0x45, 0x77, 0x42, 0x4a, 0x6b, 0x70, 0x72, 0x44, 0x43, 0x59, 0x41, 0x6b, 0x53, 0x51, 0x32, + 0x30, 0x77, 0x51, 0x54, 0x67, 0x4c, 0x77, 0x6d, 0x44, 0x53, 0x4a, 0x4b, 0x6b, 0x34, 0x72, 0x7a, 0x34, 0x6f, + 0x58, 0x39, 0x63, 0x66, 0x33, 0x38, 0x2f, 0x77, 0x48, 0x4a, 0x67, 0x73, 0x32, 0x52, 0x78, 0x4a, 0x45, 0x6c, + 0x53, 0x5c, 0x0a, + 0x09, 0x33, 0x6c, 0x59, 0x42, 0x55, 0x77, 0x64, 0x2f, 0x4d, 0x62, 0x67, 0x46, 0x38, 0x4a, 0x2b, 0x54, 0x52, + 0x4a, 0x45, 0x6b, 0x53, 0x55, 0x56, 0x35, 0x65, 0x4f, 0x67, 0x76, 0x42, 0x68, 0x75, 0x41, 0x2f, 0x30, 0x6f, + 0x51, 0x52, 0x4a, 0x49, 0x6b, 0x46, 0x57, 0x66, 0x59, 0x42, 0x75, 0x44, 0x68, 0x59, 0x62, 0x35, 0x52, 0x6b, + 0x69, 0x54, 0x56, 0x78, 0x30, 0x4e, 0x44, 0x66, 0x32, 0x45, 0x44, 0x49, 0x45, 0x6c, 0x53, 0x4d, 0x77, 0x7a, + 0x62, 0x5c, 0x0a, + 0x09, 0x41, 0x50, 0x77, 0x78, 0x51, 0x52, 0x42, 0x4a, 0x6b, 0x6c, 0x53, 0x63, 0x59, 0x52, 0x75, 0x41, 0x50, + 0x79, 0x51, 0x49, 0x49, 0x6b, 0x6d, 0x53, 0x69, 0x72, 0x50, 0x42, 0x74, 0x48, 0x2f, 0x77, 0x4e, 0x73, 0x41, + 0x65, 0x59, 0x41, 0x55, 0x77, 0x4f, 0x55, 0x55, 0x69, 0x53, 0x5a, 0x4b, 0x55, 0x71, 0x39, 0x58, 0x45, 0x37, + 0x66, 0x37, 0x72, 0x42, 0x6e, 0x39, 0x6a, 0x63, 0x41, 0x4b, 0x77, 0x44, 0x76, 0x68, 0x39, 0x69, 0x6b, 0x53, + 0x53, 0x5c, 0x0a, + 0x09, 0x4a, 0x43, 0x6c, 0x33, 0x44, 0x7a, 0x4b, 0x6b, 0x2b, 0x4d, 0x50, 0x36, 0x42, 0x67, 0x44, 0x67, 0x67, + 0x57, 0x4b, 0x7a, 0x53, 0x4a, 0x4b, 0x6b, 0x67, 0x74, 0x79, 0x2f, 0x38, 0x57, 0x2f, 0x30, 0x6a, 0x50, 0x5a, + 0x46, 0x53, 0x5a, 0x4a, 0x55, 0x43, 0x77, 0x73, 0x32, 0x2f, 0x6f, 0x32, 0x65, 0x30, 0x62, 0x34, 0x6f, 0x53, + 0x5a, 0x4a, 0x71, 0x59, 0x64, 0x51, 0x4a, 0x77, 0x48, 0x30, 0x46, 0x42, 0x70, 0x45, 0x6b, 0x53, 0x63, 0x58, + 0x5a, 0x5c, 0x0a, + 0x09, 0x35, 0x45, 0x50, 0x2b, 0x34, 0x46, 0x30, 0x41, 0x45, 0x4d, 0x33, 0x41, 0x63, 0x6d, 0x42, 0x4b, 0x6b, + 0x59, 0x6b, 0x6b, 0x53, 0x56, 0x4b, 0x75, 0x4e, 0x72, 0x6b, 0x44, 0x41, 0x44, 0x61, 0x63, 0x41, 0x4b, 0x77, + 0x44, 0x66, 0x6c, 0x74, 0x6b, 0x49, 0x6b, 0x6d, 0x53, 0x6c, 0x4c, 0x76, 0x66, 0x73, 0x56, 0x48, 0x78, 0x68, + 0x77, 0x30, 0x62, 0x41, 0x49, 0x43, 0x37, 0x69, 0x38, 0x6b, 0x69, 0x53, 0x5a, 0x49, 0x4b, 0x63, 0x74, 0x64, + 0x77, 0x5c, 0x0a, + 0x09, 0x76, 0x32, 0x6b, 0x44, 0x49, 0x45, 0x6c, 0x53, 0x76, 0x51, 0x31, 0x62, 0x32, 0x32, 0x30, 0x41, 0x4a, + 0x45, 0x6d, 0x71, 0x74, 0x33, 0x75, 0x47, 0x2b, 0x38, 0x32, 0x68, 0x46, 0x77, 0x45, 0x43, 0x54, 0x43, 0x4b, + 0x32, 0x42, 0x4a, 0x35, 0x59, 0x52, 0x43, 0x4a, 0x4a, 0x6b, 0x70, 0x53, 0x72, 0x74, 0x63, 0x51, 0x46, 0x67, + 0x47, 0x73, 0x32, 0x2f, 0x73, 0x4c, 0x47, 0x45, 0x34, 0x41, 0x31, 0x65, 0x44, 0x75, 0x67, 0x4a, 0x45, 0x6c, + 0x31, 0x5c, 0x0a, + 0x09, 0x73, 0x59, 0x42, 0x68, 0x69, 0x6a, 0x39, 0x73, 0x32, 0x67, 0x41, 0x41, 0x33, 0x4a, 0x46, 0x76, 0x46, + 0x6b, 0x6d, 0x53, 0x56, 0x4a, 0x42, 0x66, 0x6a, 0x2f, 0x51, 0x46, 0x47, 0x77, 0x42, 0x4a, 0x6b, 0x75, 0x72, + 0x72, 0x39, 0x70, 0x47, 0x2b, 0x4d, 0x46, 0x77, 0x44, 0x4d, 0x4f, 0x49, 0x33, 0x53, 0x35, 0x4b, 0x6b, 0x53, + 0x76, 0x6e, 0x56, 0x53, 0x46, 0x2f, 0x59, 0x2b, 0x43, 0x4a, 0x41, 0x69, 0x4b, 0x62, 0x67, 0x47, 0x57, 0x42, + 0x36, 0x5c, 0x0a, + 0x09, 0x6e, 0x6f, 0x6b, 0x6b, 0x53, 0x56, 0x4b, 0x75, 0x6c, 0x67, 0x47, 0x62, 0x4d, 0x38, 0x77, 0x6d, 0x51, + 0x44, 0x44, 0x38, 0x42, 0x47, 0x41, 0x64, 0x4c, 0x67, 0x4e, 0x49, 0x6b, 0x6c, 0x52, 0x31, 0x64, 0x7a, 0x42, + 0x43, 0x38, 0x59, 0x66, 0x68, 0x47, 0x77, 0x41, 0x59, 0x5a, 0x57, 0x51, 0x67, 0x53, 0x5a, 0x49, 0x71, 0x59, + 0x64, 0x52, 0x61, 0x50, 0x6c, 0x49, 0x44, 0x63, 0x46, 0x73, 0x4f, 0x51, 0x53, 0x52, 0x4a, 0x55, 0x6e, 0x46, + 0x47, 0x5c, 0x0a, + 0x09, 0x72, 0x65, 0x58, 0x44, 0x58, 0x51, 0x4d, 0x41, 0x73, 0x57, 0x6e, 0x41, 0x4d, 0x38, 0x43, 0x45, 0x50, + 0x42, 0x4a, 0x4a, 0x6b, 0x71, 0x52, 0x63, 0x39, 0x51, 0x45, 0x7a, 0x69, 0x63, 0x33, 0x39, 0x68, 0x6a, 0x58, + 0x53, 0x42, 0x47, 0x41, 0x46, 0x49, 0x7a, 0x77, 0x38, 0x51, 0x4a, 0x49, 0x6b, 0x6c, 0x64, 0x35, 0x64, 0x6a, + 0x46, 0x4c, 0x38, 0x59, 0x65, 0x51, 0x47, 0x41, 0x4f, 0x44, 0x57, 0x62, 0x4c, 0x4e, 0x49, 0x6b, 0x71, 0x53, + 0x43, 0x5c, 0x0a, + 0x09, 0x33, 0x44, 0x4c, 0x57, 0x4e, 0x34, 0x7a, 0x57, 0x41, 0x49, 0x7a, 0x35, 0x68, 0x79, 0x56, 0x4a, 0x55, + 0x69, 0x6d, 0x4e, 0x2b, 0x53, 0x46, 0x2b, 0x70, 0x47, 0x73, 0x41, 0x41, 0x47, 0x59, 0x41, 0x54, 0x7a, 0x4e, + 0x36, 0x6b, 0x79, 0x42, 0x4a, 0x6b, 0x73, 0x70, 0x6c, 0x48, 0x54, 0x41, 0x4c, 0x65, 0x48, 0x61, 0x30, 0x62, + 0x78, 0x71, 0x74, 0x75, 0x43, 0x2f, 0x46, 0x36, 0x77, 0x41, 0x6b, 0x53, 0x61, 0x71, 0x61, 0x75, 0x78, 0x6d, + 0x6a, 0x5c, 0x0a, + 0x09, 0x2b, 0x4d, 0x50, 0x59, 0x6e, 0x2b, 0x36, 0x76, 0x7a, 0x79, 0x61, 0x4c, 0x4a, 0x45, 0x6b, 0x71, 0x79, + 0x41, 0x32, 0x74, 0x66, 0x4a, 0x4d, 0x4e, 0x67, 0x43, 0x52, 0x4a, 0x39, 0x64, 0x4a, 0x53, 0x37, 0x52, 0x37, + 0x74, 0x47, 0x67, 0x43, 0x41, 0x53, 0x63, 0x52, 0x2b, 0x41, 0x4a, 0x4f, 0x7a, 0x53, 0x43, 0x52, 0x4a, 0x6b, + 0x6e, 0x4c, 0x31, 0x48, 0x48, 0x48, 0x2f, 0x2f, 0x35, 0x71, 0x78, 0x76, 0x6e, 0x47, 0x73, 0x43, 0x63, 0x41, + 0x61, 0x5c, 0x0a, + 0x09, 0x76, 0x42, 0x74, 0x41, 0x6b, 0x71, 0x53, 0x71, 0x75, 0x49, 0x55, 0x57, 0x69, 0x6a, 0x2b, 0x30, 0x64, + 0x6f, 0x57, 0x2f, 0x79, 0x77, 0x43, 0x53, 0x4a, 0x46, 0x56, 0x44, 0x79, 0x7a, 0x57, 0x37, 0x6c, 0x51, 0x62, + 0x67, 0x4a, 0x31, 0x30, 0x45, 0x6b, 0x53, 0x52, 0x4a, 0x78, 0x57, 0x6d, 0x35, 0x41, 0x52, 0x6a, 0x72, 0x47, + 0x6f, 0x42, 0x42, 0x44, 0x77, 0x45, 0x37, 0x64, 0x52, 0x78, 0x48, 0x6b, 0x69, 0x54, 0x6c, 0x37, 0x57, 0x46, + 0x67, 0x5c, 0x0a, + 0x09, 0x62, 0x71, 0x76, 0x66, 0x33, 0x4f, 0x6f, 0x6d, 0x50, 0x7a, 0x2f, 0x75, 0x4c, 0x49, 0x73, 0x6b, 0x53, + 0x53, 0x70, 0x49, 0x57, 0x37, 0x58, 0x61, 0x42, 0x6b, 0x43, 0x53, 0x70, 0x48, 0x70, 0x6f, 0x71, 0x31, 0x61, + 0x33, 0x75, 0x67, 0x51, 0x77, 0x43, 0x58, 0x67, 0x4b, 0x6d, 0x4e, 0x70, 0x4a, 0x49, 0x6b, 0x6d, 0x53, 0x6c, + 0x4b, 0x75, 0x56, 0x78, 0x50, 0x61, 0x2f, 0x4c, 0x64, 0x30, 0x42, 0x41, 0x4b, 0x31, 0x50, 0x41, 0x4e, 0x62, + 0x67, 0x5c, 0x0a, + 0x09, 0x78, 0x59, 0x43, 0x53, 0x4a, 0x4a, 0x58, 0x56, 0x64, 0x62, 0x52, 0x52, 0x2f, 0x4b, 0x47, 0x39, 0x42, + 0x2f, 0x33, 0x38, 0x71, 0x4c, 0x30, 0x73, 0x6b, 0x69, 0x53, 0x70, 0x49, 0x44, 0x39, 0x6f, 0x39, 0x77, 0x2b, + 0x30, 0x75, 0x67, 0x51, 0x41, 0x38, 0x58, 0x54, 0x41, 0x78, 0x63, 0x44, 0x45, 0x64, 0x67, 0x38, 0x69, 0x53, + 0x5a, 0x4a, 0x79, 0x73, 0x78, 0x62, 0x59, 0x6b, 0x68, 0x59, 0x65, 0x41, 0x44, 0x52, 0x55, 0x4f, 0x78, 0x4f, + 0x41, 0x5c, 0x0a, + 0x09, 0x70, 0x63, 0x44, 0x50, 0x32, 0x6e, 0x6c, 0x7a, 0x53, 0x5a, 0x4b, 0x55, 0x75, 0x78, 0x74, 0x70, 0x73, + 0x2f, 0x68, 0x44, 0x65, 0x77, 0x30, 0x41, 0x77, 0x46, 0x58, 0x74, 0x48, 0x6b, 0x43, 0x53, 0x4a, 0x4f, 0x57, + 0x71, 0x6f, 0x39, 0x72, 0x63, 0x7a, 0x68, 0x49, 0x41, 0x77, 0x47, 0x78, 0x67, 0x45, 0x54, 0x43, 0x2b, 0x6b, + 0x34, 0x4e, 0x4a, 0x6b, 0x71, 0x52, 0x4d, 0x39, 0x51, 0x46, 0x7a, 0x67, 0x43, 0x58, 0x74, 0x2f, 0x73, 0x46, + 0x32, 0x5c, 0x0a, + 0x09, 0x4a, 0x77, 0x42, 0x4c, 0x38, 0x4f, 0x46, 0x41, 0x6b, 0x69, 0x53, 0x56, 0x78, 0x61, 0x31, 0x30, 0x55, + 0x50, 0x79, 0x68, 0x2f, 0x51, 0x59, 0x41, 0x34, 0x4d, 0x70, 0x4f, 0x44, 0x69, 0x52, 0x4a, 0x6b, 0x6a, 0x4a, + 0x33, 0x52, 0x61, 0x64, 0x2f, 0x73, 0x4e, 0x30, 0x6c, 0x41, 0x49, 0x69, 0x4e, 0x42, 0x68, 0x37, 0x48, 0x75, + 0x77, 0x45, 0x6b, 0x53, 0x55, 0x70, 0x70, 0x4c, 0x66, 0x42, 0x79, 0x59, 0x71, 0x4f, 0x2b, 0x74, 0x6e, 0x55, + 0x79, 0x5c, 0x0a, + 0x09, 0x41, 0x58, 0x69, 0x4b, 0x32, 0x48, 0x42, 0x41, 0x6b, 0x69, 0x53, 0x6c, 0x63, 0x78, 0x30, 0x64, 0x46, + 0x6e, 0x2f, 0x6f, 0x72, 0x41, 0x45, 0x41, 0x75, 0x4c, 0x7a, 0x54, 0x41, 0x30, 0x71, 0x53, 0x70, 0x45, 0x78, + 0x30, 0x56, 0x59, 0x73, 0x37, 0x57, 0x51, 0x49, 0x41, 0x6d, 0x41, 0x49, 0x38, 0x4f, 0x66, 0x43, 0x6a, 0x4a, + 0x45, 0x6b, 0x71, 0x31, 0x69, 0x70, 0x69, 0x38, 0x35, 0x39, 0x56, 0x6e, 0x62, 0x35, 0x42, 0x70, 0x78, 0x4f, + 0x41, 0x5c, 0x0a, + 0x09, 0x56, 0x58, 0x53, 0x77, 0x37, 0x61, 0x41, 0x6b, 0x53, 0x63, 0x72, 0x45, 0x44, 0x2b, 0x69, 0x69, 0x2b, + 0x45, 0x50, 0x6e, 0x44, 0x51, 0x44, 0x41, 0x70, 0x64, 0x30, 0x63, 0x57, 0x4a, 0x49, 0x6b, 0x64, 0x61, 0x7a, + 0x72, 0x47, 0x74, 0x7a, 0x70, 0x45, 0x67, 0x42, 0x45, 0x38, 0x2f, 0x41, 0x49, 0x73, 0x45, 0x32, 0x33, 0x49, + 0x53, 0x52, 0x4a, 0x55, 0x73, 0x73, 0x65, 0x41, 0x37, 0x59, 0x6e, 0x4e, 0x67, 0x48, 0x71, 0x57, 0x44, 0x63, + 0x54, 0x5c, 0x0a, + 0x09, 0x67, 0x48, 0x58, 0x41, 0x4a, 0x64, 0x30, 0x63, 0x58, 0x4a, 0x49, 0x6b, 0x74, 0x65, 0x31, 0x62, 0x64, + 0x46, 0x6e, 0x38, 0x6f, 0x62, 0x73, 0x4a, 0x41, 0x4d, 0x41, 0x72, 0x67, 0x64, 0x38, 0x44, 0x34, 0x37, 0x6f, + 0x4e, 0x49, 0x6b, 0x6d, 0x53, 0x78, 0x74, 0x51, 0x50, 0x76, 0x42, 0x72, 0x34, 0x59, 0x37, 0x64, 0x76, 0x31, + 0x4d, 0x30, 0x45, 0x67, 0x49, 0x45, 0x41, 0x74, 0x33, 0x55, 0x62, 0x51, 0x70, 0x49, 0x6b, 0x74, 0x65, 0x51, + 0x32, 0x5c, 0x0a, + 0x09, 0x4d, 0x69, 0x6a, 0x2b, 0x30, 0x48, 0x30, 0x44, 0x41, 0x48, 0x42, 0x78, 0x42, 0x75, 0x38, 0x68, 0x53, + 0x5a, 0x4c, 0x47, 0x39, 0x73, 0x32, 0x73, 0x33, 0x71, 0x6a, 0x62, 0x4a, 0x51, 0x43, 0x41, 0x71, 0x63, 0x43, + 0x6a, 0x77, 0x50, 0x54, 0x75, 0x34, 0x30, 0x69, 0x53, 0x70, 0x42, 0x45, 0x73, 0x49, 0x79, 0x36, 0x38, 0x58, + 0x35, 0x6e, 0x46, 0x6d, 0x32, 0x55, 0x78, 0x41, 0x56, 0x68, 0x4a, 0x58, 0x4a, 0x41, 0x67, 0x53, 0x5a, 0x4c, + 0x79, 0x5c, 0x0a, + 0x09, 0x63, 0x79, 0x6b, 0x5a, 0x46, 0x58, 0x2f, 0x49, 0x5a, 0x67, 0x49, 0x41, 0x73, 0x43, 0x74, 0x77, 0x58, + 0x78, 0x5a, 0x76, 0x4a, 0x45, 0x6d, 0x53, 0x68, 0x72, 0x55, 0x62, 0x73, 0x43, 0x43, 0x72, 0x4e, 0x38, 0x74, + 0x69, 0x41, 0x67, 0x41, 0x52, 0x36, 0x4f, 0x63, 0x5a, 0x76, 0x5a, 0x63, 0x6b, 0x53, 0x64, 0x72, 0x51, 0x7a, + 0x38, 0x6d, 0x77, 0x2b, 0x45, 0x4e, 0x32, 0x44, 0x51, 0x44, 0x41, 0x68, 0x52, 0x6d, 0x2b, 0x6c, 0x79, 0x52, + 0x4a, 0x5c, 0x0a, + 0x09, 0x57, 0x75, 0x39, 0x72, 0x57, 0x62, 0x39, 0x68, 0x56, 0x6b, 0x73, 0x41, 0x41, 0x4c, 0x33, 0x45, 0x78, + 0x59, 0x43, 0x7a, 0x73, 0x33, 0x70, 0x44, 0x53, 0x5a, 0x4c, 0x45, 0x45, 0x75, 0x4c, 0x69, 0x76, 0x2b, 0x65, + 0x7a, 0x66, 0x4e, 0x4d, 0x73, 0x4a, 0x77, 0x44, 0x50, 0x41, 0x31, 0x2f, 0x50, 0x38, 0x50, 0x30, 0x6b, 0x53, + 0x56, 0x4c, 0x55, 0x31, 0x6b, 0x79, 0x4c, 0x50, 0x32, 0x51, 0x37, 0x41, 0x51, 0x43, 0x59, 0x41, 0x2f, 0x79, + 0x5a, 0x5c, 0x0a, + 0x09, 0x6d, 0x41, 0x5a, 0x49, 0x6b, 0x71, 0x54, 0x75, 0x50, 0x41, 0x2b, 0x38, 0x41, 0x6c, 0x69, 0x55, 0x39, + 0x52, 0x74, 0x6e, 0x4f, 0x51, 0x47, 0x41, 0x43, 0x50, 0x6a, 0x74, 0x6a, 0x4e, 0x39, 0x54, 0x6b, 0x71, 0x53, + 0x6d, 0x2b, 0x6a, 0x59, 0x35, 0x46, 0x48, 0x2f, 0x49, 0x66, 0x67, 0x49, 0x41, 0x73, 0x42, 0x64, 0x77, 0x56, + 0x39, 0x5a, 0x76, 0x4b, 0x6b, 0x6c, 0x53, 0x41, 0x2b, 0x30, 0x4e, 0x33, 0x4a, 0x33, 0x48, 0x47, 0x32, 0x63, + 0x39, 0x5c, 0x0a, + 0x09, 0x41, 0x59, 0x41, 0x49, 0x65, 0x6e, 0x4d, 0x4f, 0x37, 0x79, 0x74, 0x4a, 0x55, 0x70, 0x50, 0x63, 0x54, + 0x45, 0x37, 0x46, 0x48, 0x2f, 0x4a, 0x70, 0x41, 0x41, 0x43, 0x2b, 0x6b, 0x4e, 0x50, 0x37, 0x53, 0x70, 0x4c, + 0x55, 0x46, 0x46, 0x2f, 0x4d, 0x38, 0x38, 0x33, 0x7a, 0x57, 0x41, 0x4b, 0x41, 0x61, 0x43, 0x77, 0x57, 0x41, + 0x44, 0x76, 0x6e, 0x38, 0x65, 0x61, 0x53, 0x4a, 0x4e, 0x58, 0x63, 0x37, 0x34, 0x46, 0x64, 0x67, 0x48, 0x56, + 0x35, 0x5c, 0x0a, + 0x09, 0x48, 0x53, 0x43, 0x76, 0x43, 0x63, 0x41, 0x36, 0x34, 0x4e, 0x79, 0x63, 0x33, 0x6c, 0x75, 0x53, 0x70, + 0x4c, 0x6f, 0x37, 0x6c, 0x78, 0x79, 0x4c, 0x50, 0x2b, 0x51, 0x33, 0x41, 0x59, 0x43, 0x34, 0x46, 0x66, 0x43, + 0x2f, 0x67, 0x4b, 0x33, 0x7a, 0x4f, 0x6f, 0x41, 0x6b, 0x53, 0x54, 0x58, 0x30, 0x4f, 0x4c, 0x41, 0x44, 0x4f, + 0x64, 0x7a, 0x37, 0x50, 0x31, 0x52, 0x65, 0x45, 0x77, 0x43, 0x49, 0x34, 0x4f, 0x66, 0x6e, 0x2b, 0x50, 0x36, + 0x53, 0x5c, 0x0a, + 0x09, 0x4a, 0x4e, 0x58, 0x52, 0x2b, 0x65, 0x52, 0x63, 0x2f, 0x43, 0x48, 0x66, 0x43, 0x51, 0x44, 0x41, 0x56, + 0x47, 0x41, 0x68, 0x4d, 0x44, 0x50, 0x50, 0x67, 0x30, 0x69, 0x53, 0x56, 0x42, 0x4e, 0x4c, 0x67, 0x57, 0x33, + 0x4a, 0x38, 0x4c, 0x47, 0x2f, 0x49, 0x38, 0x6c, 0x7a, 0x41, 0x67, 0x44, 0x78, 0x46, 0x38, 0x6a, 0x31, 0x4b, + 0x6b, 0x5a, 0x4a, 0x6b, 0x6d, 0x72, 0x6b, 0x41, 0x67, 0x6f, 0x6f, 0x2f, 0x70, 0x44, 0x2f, 0x42, 0x41, 0x42, + 0x67, 0x5c, 0x0a, + 0x09, 0x42, 0x76, 0x43, 0x6e, 0x67, 0x52, 0x38, 0x6c, 0x53, 0x64, 0x4c, 0x77, 0x6c, 0x68, 0x46, 0x72, 0x2f, + 0x38, 0x38, 0x57, 0x63, 0x62, 0x43, 0x38, 0x4a, 0x77, 0x41, 0x51, 0x34, 0x34, 0x77, 0x4c, 0x43, 0x6a, 0x69, + 0x4f, 0x4a, 0x45, 0x6c, 0x56, 0x64, 0x67, 0x45, 0x46, 0x46, 0x58, 0x38, 0x6f, 0x5a, 0x67, 0x49, 0x41, 0x63, + 0x51, 0x33, 0x41, 0x6e, 0x34, 0x44, 0x70, 0x52, 0x52, 0x78, 0x4d, 0x6b, 0x71, 0x53, 0x4b, 0x57, 0x55, 0x34, + 0x38, 0x5c, 0x0a, + 0x09, 0x39, 0x4b, 0x65, 0x77, 0x42, 0x71, 0x43, 0x49, 0x43, 0x51, 0x44, 0x45, 0x58, 0x2b, 0x68, 0x4c, 0x42, + 0x52, 0x31, 0x4c, 0x6b, 0x71, 0x53, 0x71, 0x4b, 0x66, 0x54, 0x54, 0x50, 0x78, 0x51, 0x33, 0x41, 0x51, 0x44, + 0x59, 0x6e, 0x4a, 0x67, 0x43, 0x54, 0x43, 0x76, 0x71, 0x67, 0x4a, 0x49, 0x6b, 0x56, 0x63, 0x42, 0x79, 0x59, + 0x75, 0x33, 0x2f, 0x6d, 0x53, 0x49, 0x50, 0x57, 0x74, 0x51, 0x45, 0x41, 0x4f, 0x49, 0x76, 0x64, 0x6c, 0x36, + 0x42, 0x5c, 0x0a, + 0x09, 0x78, 0x35, 0x4d, 0x6b, 0x71, 0x51, 0x72, 0x4f, 0x6f, 0x2b, 0x44, 0x69, 0x44, 0x38, 0x56, 0x4f, 0x41, + 0x41, 0x41, 0x32, 0x41, 0x78, 0x34, 0x43, 0x74, 0x69, 0x6a, 0x79, 0x6f, 0x4a, 0x49, 0x6b, 0x6c, 0x64, 0x52, + 0x69, 0x59, 0x43, 0x36, 0x77, 0x6f, 0x75, 0x67, 0x44, 0x46, 0x7a, 0x6b, 0x42, 0x67, 0x50, 0x67, 0x4c, 0x6e, + 0x6c, 0x50, 0x77, 0x4d, 0x53, 0x56, 0x4a, 0x4b, 0x71, 0x74, 0x7a, 0x53, 0x46, 0x44, 0x38, 0x6f, 0x66, 0x67, + 0x4a, 0x5c, 0x0a, + 0x09, 0x41, 0x4d, 0x41, 0x6b, 0x34, 0x69, 0x6c, 0x48, 0x32, 0x78, 0x64, 0x39, 0x59, 0x45, 0x6d, 0x53, 0x53, + 0x75, 0x51, 0x52, 0x34, 0x4e, 0x58, 0x41, 0x6d, 0x68, 0x51, 0x48, 0x4c, 0x33, 0x6f, 0x43, 0x41, 0x50, 0x45, + 0x58, 0x2f, 0x57, 0x53, 0x43, 0x34, 0x30, 0x71, 0x53, 0x56, 0x43, 0x61, 0x66, 0x4a, 0x46, 0x48, 0x78, 0x68, + 0x7a, 0x51, 0x54, 0x41, 0x49, 0x44, 0x78, 0x77, 0x4e, 0x33, 0x41, 0x37, 0x69, 0x6b, 0x4f, 0x4c, 0x6b, 0x6c, + 0x53, 0x5c, 0x0a, + 0x09, 0x59, 0x76, 0x63, 0x42, 0x65, 0x77, 0x4a, 0x39, 0x71, 0x51, 0x4b, 0x6b, 0x6d, 0x41, 0x42, 0x41, 0x2f, + 0x49, 0x58, 0x50, 0x53, 0x48, 0x52, 0x73, 0x53, 0x5a, 0x4a, 0x53, 0x4f, 0x35, 0x4f, 0x45, 0x78, 0x52, 0x2f, + 0x53, 0x4e, 0x51, 0x41, 0x41, 0x31, 0x77, 0x48, 0x58, 0x4a, 0x6a, 0x79, 0x2b, 0x4a, 0x45, 0x6b, 0x70, 0x2f, + 0x4a, 0x51, 0x53, 0x31, 0x4c, 0x39, 0x55, 0x53, 0x77, 0x43, 0x44, 0x64, 0x67, 0x56, 0x2b, 0x53, 0x79, 0x77, + 0x4a, 0x5c, 0x0a, + 0x09, 0x53, 0x4a, 0x4a, 0x55, 0x64, 0x33, 0x33, 0x41, 0x58, 0x73, 0x43, 0x39, 0x71, 0x59, 0x4f, 0x6b, 0x6e, + 0x41, 0x41, 0x41, 0x4c, 0x41, 0x44, 0x2b, 0x62, 0x2b, 0x49, 0x4d, 0x6b, 0x69, 0x51, 0x56, 0x35, 0x64, 0x38, + 0x70, 0x51, 0x66, 0x47, 0x48, 0x39, 0x42, 0x4d, 0x41, 0x67, 0x43, 0x32, 0x42, 0x50, 0x2b, 0x41, 0x57, 0x77, + 0x5a, 0x4b, 0x6b, 0x65, 0x6c, 0x74, 0x4f, 0x33, 0x50, 0x62, 0x33, 0x52, 0x4f, 0x6f, 0x67, 0x6b, 0x48, 0x34, + 0x43, 0x5c, 0x0a, + 0x09, 0x41, 0x50, 0x41, 0x6b, 0x38, 0x4b, 0x6e, 0x55, 0x49, 0x53, 0x52, 0x4a, 0x79, 0x74, 0x6d, 0x6e, 0x4b, + 0x45, 0x6e, 0x78, 0x68, 0x33, 0x4a, 0x4d, 0x41, 0x41, 0x41, 0x6d, 0x41, 0x72, 0x38, 0x44, 0x64, 0x6b, 0x34, + 0x64, 0x52, 0x4a, 0x4b, 0x6b, 0x48, 0x44, 0x77, 0x49, 0x37, 0x41, 0x47, 0x73, 0x54, 0x52, 0x31, 0x6b, 0x55, + 0x42, 0x6b, 0x6d, 0x41, 0x42, 0x44, 0x2f, 0x51, 0x55, 0x35, 0x4e, 0x48, 0x55, 0x4b, 0x53, 0x70, 0x4a, 0x79, + 0x63, 0x5c, 0x0a, + 0x09, 0x52, 0x6f, 0x6d, 0x4b, 0x50, 0x35, 0x53, 0x6e, 0x41, 0x51, 0x43, 0x34, 0x48, 0x72, 0x67, 0x69, 0x64, + 0x51, 0x68, 0x4a, 0x6b, 0x6a, 0x4a, 0x32, 0x4e, 0x58, 0x48, 0x72, 0x65, 0x36, 0x6d, 0x55, 0x5a, 0x51, 0x6c, + 0x67, 0x30, 0x48, 0x62, 0x41, 0x41, 0x38, 0x44, 0x6b, 0x31, 0x45, 0x45, 0x6b, 0x53, 0x63, 0x72, 0x41, 0x61, + 0x6d, 0x41, 0x65, 0x73, 0x44, 0x42, 0x31, 0x6b, 0x49, 0x32, 0x56, 0x61, 0x51, 0x49, 0x41, 0x38, 0x52, 0x2f, + 0x49, 0x5c, 0x0a, + 0x09, 0x43, 0x77, 0x49, 0x6c, 0x53, 0x58, 0x58, 0x78, 0x62, 0x35, 0x53, 0x77, 0x2b, 0x45, 0x50, 0x35, 0x4a, + 0x67, 0x41, 0x51, 0x46, 0x77, 0x54, 0x2b, 0x42, 0x70, 0x38, 0x54, 0x49, 0x45, 0x6d, 0x71, 0x74, 0x6e, 0x75, + 0x42, 0x31, 0x31, 0x4b, 0x79, 0x74, 0x66, 0x39, 0x42, 0x5a, 0x5a, 0x73, 0x41, 0x51, 0x50, 0x79, 0x48, 0x4f, + 0x67, 0x6c, 0x59, 0x6c, 0x7a, 0x71, 0x49, 0x4a, 0x45, 0x6b, 0x64, 0x36, 0x69, 0x64, 0x71, 0x57, 0x53, 0x6d, + 0x4c, 0x5c, 0x0a, + 0x09, 0x50, 0x35, 0x53, 0x7a, 0x41, 0x51, 0x44, 0x34, 0x4a, 0x58, 0x42, 0x52, 0x36, 0x68, 0x43, 0x53, 0x4a, + 0x48, 0x58, 0x6f, 0x47, 0x30, 0x51, 0x74, 0x4b, 0x36, 0x30, 0x79, 0x4c, 0x67, 0x45, 0x4d, 0x6d, 0x6b, 0x46, + 0x63, 0x45, 0x4c, 0x68, 0x56, 0x36, 0x69, 0x43, 0x53, 0x4a, 0x4c, 0x58, 0x68, 0x53, 0x57, 0x4a, 0x66, 0x6d, + 0x36, 0x57, 0x70, 0x67, 0x34, 0x79, 0x6d, 0x72, 0x42, 0x4d, 0x41, 0x69, 0x50, 0x39, 0x77, 0x48, 0x30, 0x6b, + 0x64, 0x5c, 0x0a, + 0x09, 0x51, 0x70, 0x4b, 0x6b, 0x4e, 0x70, 0x31, 0x43, 0x79, 0x59, 0x73, 0x2f, 0x6c, 0x4c, 0x73, 0x42, 0x41, + 0x4c, 0x68, 0x79, 0x34, 0x43, 0x56, 0x4a, 0x55, 0x68, 0x56, 0x55, 0x70, 0x6d, 0x36, 0x56, 0x65, 0x51, 0x6c, + 0x67, 0x30, 0x42, 0x62, 0x45, 0x55, 0x77, 0x4e, 0x6e, 0x70, 0x51, 0x34, 0x69, 0x53, 0x64, 0x49, 0x6f, 0x6e, + 0x69, 0x48, 0x75, 0x2b, 0x56, 0x2b, 0x63, 0x4f, 0x6b, 0x67, 0x72, 0x79, 0x6a, 0x34, 0x42, 0x67, 0x50, 0x67, + 0x50, 0x5c, 0x0a, + 0x09, 0x65, 0x58, 0x72, 0x71, 0x45, 0x4a, 0x49, 0x6b, 0x6a, 0x65, 0x45, 0x30, 0x4b, 0x6c, 0x4c, 0x38, 0x6f, + 0x52, 0x6f, 0x54, 0x67, 0x45, 0x48, 0x58, 0x41, 0x50, 0x4e, 0x54, 0x68, 0x35, 0x41, 0x6b, 0x61, 0x52, 0x67, + 0x2f, 0x42, 0x41, 0x35, 0x50, 0x48, 0x61, 0x49, 0x64, 0x56, 0x57, 0x6f, 0x41, 0x35, 0x67, 0x44, 0x33, 0x41, + 0x5a, 0x75, 0x6e, 0x44, 0x69, 0x4a, 0x4a, 0x30, 0x68, 0x44, 0x50, 0x41, 0x4c, 0x73, 0x42, 0x69, 0x31, 0x49, + 0x48, 0x5c, 0x0a, + 0x09, 0x61, 0x55, 0x63, 0x56, 0x6c, 0x67, 0x41, 0x47, 0x4c, 0x53, 0x49, 0x32, 0x56, 0x5a, 0x41, 0x6b, 0x71, + 0x55, 0x78, 0x4f, 0x6f, 0x6d, 0x4c, 0x46, 0x48, 0x36, 0x72, 0x56, 0x41, 0x45, 0x41, 0x38, 0x4c, 0x66, 0x42, + 0x62, 0x71, 0x55, 0x4e, 0x49, 0x6b, 0x6a, 0x54, 0x67, 0x55, 0x69, 0x72, 0x36, 0x4a, 0x4e, 0x73, 0x71, 0x4c, + 0x51, 0x45, 0x4d, 0x6d, 0x67, 0x48, 0x38, 0x6c, 0x6e, 0x68, 0x79, 0x6f, 0x43, 0x52, 0x4a, 0x71, 0x66, 0x77, + 0x46, 0x5c, 0x0a, + 0x09, 0x32, 0x49, 0x4d, 0x4b, 0x33, 0x50, 0x4d, 0x2f, 0x6e, 0x4b, 0x70, 0x4e, 0x41, 0x43, 0x44, 0x2b, 0x51, + 0x33, 0x2b, 0x51, 0x32, 0x47, 0x64, 0x5a, 0x6b, 0x71, 0x51, 0x55, 0x2b, 0x6f, 0x6c, 0x61, 0x56, 0x4d, 0x6e, + 0x69, 0x44, 0x39, 0x56, 0x73, 0x41, 0x41, 0x42, 0x75, 0x41, 0x73, 0x35, 0x4c, 0x48, 0x55, 0x4b, 0x53, 0x31, + 0x46, 0x69, 0x66, 0x42, 0x32, 0x35, 0x4d, 0x48, 0x61, 0x49, 0x62, 0x56, 0x56, 0x77, 0x43, 0x47, 0x4e, 0x51, + 0x4c, 0x5c, 0x0a, + 0x09, 0x33, 0x41, 0x62, 0x73, 0x6b, 0x7a, 0x71, 0x49, 0x4a, 0x4b, 0x6c, 0x52, 0x37, 0x67, 0x51, 0x4f, 0x42, + 0x4a, 0x35, 0x50, 0x48, 0x61, 0x51, 0x62, 0x56, 0x57, 0x34, 0x41, 0x41, 0x4f, 0x59, 0x43, 0x64, 0x77, 0x47, + 0x62, 0x70, 0x51, 0x34, 0x69, 0x53, 0x57, 0x71, 0x45, 0x46, 0x63, 0x44, 0x65, 0x77, 0x45, 0x4f, 0x70, 0x67, + 0x33, 0x53, 0x72, 0x71, 0x6b, 0x73, 0x41, 0x67, 0x78, 0x34, 0x43, 0x54, 0x6b, 0x34, 0x64, 0x51, 0x70, 0x4c, + 0x55, 0x5c, 0x0a, + 0x09, 0x47, 0x43, 0x64, 0x54, 0x67, 0x2b, 0x49, 0x50, 0x31, 0x57, 0x38, 0x41, 0x41, 0x43, 0x34, 0x44, 0x4c, + 0x6b, 0x6b, 0x64, 0x51, 0x70, 0x4a, 0x55, 0x65, 0x39, 0x38, 0x69, 0x61, 0x6b, 0x34, 0x74, 0x56, 0x48, 0x30, + 0x4a, 0x59, 0x4e, 0x42, 0x55, 0x34, 0x41, 0x37, 0x69, 0x49, 0x51, 0x79, 0x53, 0x4a, 0x47, 0x58, 0x74, 0x51, + 0x57, 0x42, 0x66, 0x59, 0x47, 0x58, 0x71, 0x49, 0x46, 0x6d, 0x70, 0x77, 0x77, 0x51, 0x41, 0x34, 0x6e, 0x2b, + 0x51, 0x5c, 0x0a, + 0x09, 0x6f, 0x34, 0x42, 0x56, 0x71, 0x59, 0x4e, 0x49, 0x6b, 0x6d, 0x70, 0x6e, 0x46, 0x58, 0x41, 0x6b, 0x4e, + 0x53, 0x72, 0x2b, 0x55, 0x4a, 0x38, 0x47, 0x41, 0x4f, 0x42, 0x2b, 0x34, 0x4d, 0x54, 0x55, 0x49, 0x53, 0x52, + 0x4a, 0x74, 0x66, 0x4d, 0x68, 0x6f, 0x73, 0x62, 0x55, 0x53, 0x70, 0x30, 0x61, 0x41, 0x49, 0x44, 0x4c, 0x67, + 0x61, 0x2b, 0x6d, 0x44, 0x69, 0x46, 0x4a, 0x71, 0x6f, 0x30, 0x4c, 0x71, 0x64, 0x47, 0x36, 0x2f, 0x31, 0x42, + 0x31, 0x5c, 0x0a, + 0x09, 0x75, 0x51, 0x5a, 0x67, 0x4b, 0x50, 0x63, 0x48, 0x6b, 0x43, 0x52, 0x6c, 0x6f, 0x52, 0x62, 0x33, 0x2b, + 0x34, 0x2b, 0x6b, 0x6a, 0x67, 0x30, 0x41, 0x78, 0x48, 0x4d, 0x43, 0x37, 0x67, 0x52, 0x6d, 0x70, 0x77, 0x34, + 0x69, 0x53, 0x61, 0x71, 0x6b, 0x4a, 0x63, 0x51, 0x48, 0x79, 0x59, 0x57, 0x70, 0x67, 0x2b, 0x53, 0x6c, 0x62, + 0x6b, 0x73, 0x41, 0x67, 0x78, 0x59, 0x43, 0x52, 0x77, 0x4e, 0x72, 0x55, 0x77, 0x65, 0x52, 0x4a, 0x46, 0x58, + 0x4f, 0x5c, 0x0a, + 0x09, 0x57, 0x75, 0x44, 0x64, 0x31, 0x4c, 0x6a, 0x34, 0x51, 0x33, 0x30, 0x62, 0x41, 0x49, 0x42, 0x62, 0x67, + 0x49, 0x2b, 0x6e, 0x44, 0x69, 0x46, 0x4a, 0x71, 0x70, 0x77, 0x7a, 0x67, 0x4a, 0x74, 0x54, 0x68, 0x38, 0x68, + 0x62, 0x58, 0x5a, 0x63, 0x41, 0x68, 0x76, 0x70, 0x33, 0x34, 0x50, 0x6a, 0x55, 0x49, 0x53, 0x52, 0x4a, 0x6c, + 0x58, 0x41, 0x78, 0x63, 0x45, 0x4c, 0x71, 0x45, 0x45, 0x56, 0x6f, 0x51, 0x67, 0x50, 0x51, 0x43, 0x39, 0x77, + 0x4b, 0x5c, 0x0a, + 0x09, 0x37, 0x4a, 0x38, 0x36, 0x69, 0x43, 0x53, 0x70, 0x31, 0x47, 0x34, 0x48, 0x33, 0x6b, 0x52, 0x4e, 0x4c, + 0x2f, 0x72, 0x62, 0x57, 0x42, 0x4d, 0x61, 0x41, 0x49, 0x41, 0x35, 0x78, 0x45, 0x36, 0x42, 0x32, 0x36, 0x51, + 0x4f, 0x49, 0x6b, 0x6b, 0x71, 0x70, 0x55, 0x65, 0x4a, 0x44, 0x34, 0x71, 0x50, 0x70, 0x77, 0x35, 0x53, 0x6c, + 0x44, 0x70, 0x66, 0x41, 0x7a, 0x44, 0x55, 0x49, 0x75, 0x44, 0x76, 0x71, 0x4e, 0x6b, 0x75, 0x54, 0x70, 0x4b, + 0x6b, 0x5c, 0x0a, + 0x09, 0x54, 0x4b, 0x77, 0x69, 0x61, 0x6b, 0x52, 0x6a, 0x69, 0x6a, 0x38, 0x30, 0x70, 0x77, 0x45, 0x41, 0x75, + 0x42, 0x63, 0x34, 0x46, 0x75, 0x68, 0x4c, 0x48, 0x55, 0x53, 0x53, 0x56, 0x42, 0x70, 0x39, 0x77, 0x44, 0x46, + 0x45, 0x6a, 0x57, 0x69, 0x55, 0x4a, 0x6a, 0x55, 0x41, 0x41, 0x4e, 0x63, 0x41, 0x2f, 0x7a, 0x4e, 0x31, 0x43, + 0x45, 0x6c, 0x53, 0x61, 0x66, 0x77, 0x54, 0x55, 0x52, 0x73, 0x61, 0x70, 0x79, 0x6e, 0x58, 0x41, 0x47, 0x7a, + 0x73, 0x5c, 0x0a, + 0x09, 0x71, 0x38, 0x51, 0x7a, 0x6e, 0x53, 0x56, 0x4a, 0x7a, 0x58, 0x55, 0x68, 0x38, 0x4f, 0x48, 0x55, 0x49, + 0x56, 0x4a, 0x70, 0x61, 0x67, 0x4d, 0x77, 0x48, 0x72, 0x67, 0x61, 0x4f, 0x44, 0x78, 0x31, 0x45, 0x45, 0x6c, + 0x53, 0x45, 0x74, 0x63, 0x41, 0x52, 0x39, 0x44, 0x67, 0x5a, 0x65, 0x47, 0x6d, 0x4e, 0x67, 0x41, 0x41, 0x6b, + 0x34, 0x45, 0x62, 0x38, 0x66, 0x5a, 0x41, 0x53, 0x57, 0x71, 0x61, 0x32, 0x34, 0x47, 0x44, 0x67, 0x64, 0x57, + 0x70, 0x5c, 0x0a, + 0x09, 0x67, 0x36, 0x54, 0x55, 0x35, 0x41, 0x59, 0x41, 0x34, 0x6c, 0x6b, 0x42, 0x76, 0x77, 0x54, 0x6d, 0x70, + 0x67, 0x34, 0x69, 0x53, 0x53, 0x72, 0x45, 0x51, 0x38, 0x41, 0x42, 0x78, 0x46, 0x37, 0x2f, 0x6a, 0x64, 0x61, + 0x30, 0x69, 0x77, 0x41, 0x33, 0x74, 0x67, 0x52, 0x34, 0x47, 0x2f, 0x34, 0x66, 0x51, 0x5a, 0x4b, 0x61, 0x77, + 0x48, 0x50, 0x2b, 0x45, 0x45, 0x31, 0x76, 0x41, 0x43, 0x43, 0x36, 0x77, 0x58, 0x63, 0x41, 0x79, 0x31, 0x49, + 0x48, 0x5c, 0x0a, + 0x09, 0x6b, 0x53, 0x54, 0x6c, 0x5a, 0x68, 0x6b, 0x77, 0x6e, 0x7a, 0x6a, 0x6e, 0x43, 0x78, 0x75, 0x41, 0x51, + 0x58, 0x63, 0x51, 0x46, 0x34, 0x4d, 0x38, 0x6c, 0x7a, 0x71, 0x49, 0x4a, 0x43, 0x6c, 0x7a, 0x66, 0x79, 0x58, + 0x4f, 0x38, 0x62, 0x65, 0x6e, 0x44, 0x6c, 0x49, 0x6d, 0x4e, 0x67, 0x44, 0x72, 0x33, 0x51, 0x69, 0x38, 0x68, + 0x77, 0x5a, 0x66, 0x45, 0x53, 0x70, 0x4a, 0x4e, 0x64, 0x51, 0x48, 0x2f, 0x44, 0x31, 0x78, 0x6a, 0x74, 0x63, + 0x51, 0x5c, 0x0a, + 0x09, 0x4e, 0x67, 0x41, 0x62, 0x75, 0x67, 0x62, 0x34, 0x41, 0x4e, 0x44, 0x6f, 0x4b, 0x79, 0x4d, 0x6c, 0x71, + 0x53, 0x62, 0x36, 0x69, 0x58, 0x4e, 0x36, 0x49, 0x7a, 0x66, 0x36, 0x47, 0x59, 0x73, 0x4e, 0x77, 0x4b, 0x59, + 0x75, 0x41, 0x30, 0x35, 0x4e, 0x48, 0x55, 0x4b, 0x53, 0x31, 0x4c, 0x56, 0x54, 0x69, 0x58, 0x4f, 0x36, 0x68, + 0x6d, 0x45, 0x44, 0x4d, 0x4c, 0x77, 0x76, 0x41, 0x32, 0x65, 0x6d, 0x44, 0x69, 0x46, 0x4a, 0x36, 0x74, 0x69, + 0x5a, 0x5c, 0x0a, + 0x09, 0x78, 0x4c, 0x6c, 0x63, 0x49, 0x37, 0x41, 0x42, 0x47, 0x4e, 0x6e, 0x6e, 0x67, 0x45, 0x2b, 0x6b, 0x44, + 0x69, 0x46, 0x4a, 0x61, 0x74, 0x75, 0x2f, 0x45, 0x4f, 0x64, 0x77, 0x6a, 0x63, 0x49, 0x47, 0x59, 0x48, 0x54, + 0x6e, 0x41, 0x47, 0x65, 0x6e, 0x44, 0x69, 0x46, 0x4a, 0x61, 0x74, 0x6e, 0x5a, 0x77, 0x4b, 0x64, 0x54, 0x68, + 0x36, 0x69, 0x43, 0x70, 0x75, 0x38, 0x45, 0x32, 0x4b, 0x70, 0x50, 0x41, 0x32, 0x65, 0x6c, 0x44, 0x69, 0x46, + 0x4a, 0x5c, 0x0a, + 0x09, 0x47, 0x74, 0x56, 0x6e, 0x38, 0x46, 0x7a, 0x64, 0x4d, 0x69, 0x63, 0x41, 0x72, 0x66, 0x6b, 0x45, 0x38, + 0x58, 0x38, 0x73, 0x53, 0x56, 0x49, 0x35, 0x57, 0x66, 0x7a, 0x62, 0x5a, 0x41, 0x50, 0x51, 0x75, 0x72, 0x4e, + 0x77, 0x4f, 0x55, 0x43, 0x53, 0x79, 0x75, 0x68, 0x54, 0x57, 0x50, 0x7a, 0x62, 0x35, 0x68, 0x4a, 0x41, 0x2b, + 0x2f, 0x36, 0x5a, 0x75, 0x44, 0x5a, 0x41, 0x6b, 0x70, 0x54, 0x65, 0x4a, 0x2f, 0x43, 0x63, 0x33, 0x42, 0x45, + 0x62, 0x5c, 0x0a, + 0x09, 0x67, 0x4d, 0x36, 0x63, 0x43, 0x58, 0x77, 0x32, 0x64, 0x51, 0x68, 0x4a, 0x61, 0x72, 0x68, 0x2f, 0x42, + 0x4d, 0x35, 0x4e, 0x48, 0x61, 0x4b, 0x71, 0x62, 0x41, 0x41, 0x36, 0x64, 0x77, 0x70, 0x77, 0x41, 0x54, 0x41, + 0x75, 0x64, 0x52, 0x42, 0x4a, 0x61, 0x70, 0x68, 0x2b, 0x59, 0x70, 0x4d, 0x66, 0x37, 0x2f, 0x50, 0x76, 0x67, + 0x67, 0x31, 0x41, 0x64, 0x34, 0x34, 0x44, 0x4c, 0x67, 0x59, 0x6d, 0x70, 0x41, 0x34, 0x69, 0x53, 0x51, 0x33, + 0x78, 0x5c, 0x0a, + 0x09, 0x41, 0x6e, 0x41, 0x38, 0x63, 0x47, 0x6e, 0x71, 0x49, 0x46, 0x56, 0x6e, 0x41, 0x39, 0x43, 0x39, 0x77, + 0x34, 0x48, 0x76, 0x41, 0x43, 0x39, 0x4a, 0x48, 0x55, 0x53, 0x53, 0x61, 0x75, 0x36, 0x76, 0x78, 0x49, 0x4e, + 0x39, 0x33, 0x4e, 0x73, 0x2f, 0x41, 0x7a, 0x59, 0x41, 0x32, 0x58, 0x67, 0x7a, 0x38, 0x58, 0x2f, 0x49, 0x7a, + 0x52, 0x4c, 0x6e, 0x6b, 0x4b, 0x53, 0x36, 0x57, 0x6b, 0x46, 0x38, 0x34, 0x4c, 0x6f, 0x35, 0x63, 0x59, 0x37, + 0x61, 0x5c, 0x0a, + 0x09, 0x73, 0x41, 0x48, 0x49, 0x7a, 0x6a, 0x37, 0x41, 0x6a, 0x34, 0x45, 0x74, 0x55, 0x67, 0x65, 0x52, 0x70, + 0x4a, 0x70, 0x5a, 0x41, 0x76, 0x77, 0x64, 0x63, 0x47, 0x66, 0x71, 0x49, 0x48, 0x56, 0x69, 0x41, 0x35, 0x43, + 0x74, 0x75, 0x63, 0x42, 0x50, 0x42, 0x6e, 0x36, 0x55, 0x4a, 0x48, 0x58, 0x76, 0x49, 0x65, 0x42, 0x74, 0x41, + 0x7a, 0x38, 0x71, 0x51, 0x32, 0x34, 0x45, 0x6c, 0x4b, 0x32, 0x48, 0x67, 0x41, 0x4f, 0x41, 0x4f, 0x31, 0x49, + 0x48, 0x5c, 0x0a, + 0x09, 0x6b, 0x61, 0x51, 0x61, 0x75, 0x41, 0x4d, 0x34, 0x45, 0x49, 0x74, 0x2f, 0x4c, 0x6d, 0x77, 0x41, 0x73, + 0x72, 0x63, 0x45, 0x4f, 0x42, 0x6a, 0x34, 0x55, 0x65, 0x6f, 0x67, 0x6b, 0x6c, 0x52, 0x68, 0x50, 0x38, 0x4c, + 0x4d, 0x37, 0x4a, 0x45, 0x41, 0x41, 0x41, 0x61, 0x70, 0x53, 0x55, 0x52, 0x42, 0x56, 0x43, 0x62, 0x4f, 0x70, + 0x59, 0x74, 0x54, 0x42, 0x36, 0x6b, 0x72, 0x47, 0x34, 0x42, 0x38, 0x72, 0x41, 0x4c, 0x65, 0x42, 0x56, 0x79, + 0x55, 0x5c, 0x0a, + 0x09, 0x4f, 0x6f, 0x67, 0x6b, 0x56, 0x64, 0x42, 0x46, 0x77, 0x44, 0x75, 0x4a, 0x63, 0x36, 0x6c, 0x79, 0x59, + 0x67, 0x4f, 0x51, 0x6e, 0x7a, 0x37, 0x67, 0x52, 0x4f, 0x43, 0x4d, 0x67, 0x5a, 0x39, 0x4c, 0x6b, 0x6b, 0x62, + 0x58, 0x52, 0x2b, 0x79, 0x30, 0x65, 0x69, 0x4b, 0x65, 0x4e, 0x33, 0x50, 0x6e, 0x52, 0x59, 0x44, 0x46, 0x6d, + 0x41, 0x39, 0x63, 0x44, 0x6b, 0x78, 0x4e, 0x48, 0x55, 0x53, 0x53, 0x53, 0x6d, 0x6f, 0x6c, 0x63, 0x41, 0x7a, + 0x77, 0x5c, 0x0a, + 0x09, 0x77, 0x39, 0x52, 0x42, 0x6d, 0x73, 0x49, 0x47, 0x6f, 0x44, 0x68, 0x37, 0x45, 0x76, 0x2f, 0x48, 0x33, + 0x69, 0x5a, 0x31, 0x45, 0x45, 0x6b, 0x71, 0x6d, 0x55, 0x65, 0x4a, 0x44, 0x30, 0x72, 0x33, 0x70, 0x41, 0x37, + 0x53, 0x4a, 0x43, 0x34, 0x42, 0x46, 0x4f, 0x63, 0x65, 0x59, 0x46, 0x2f, 0x67, 0x39, 0x74, 0x52, 0x42, 0x4a, + 0x4b, 0x6c, 0x45, 0x62, 0x67, 0x66, 0x32, 0x77, 0x2b, 0x4a, 0x66, 0x4f, 0x42, 0x75, 0x41, 0x59, 0x6a, 0x31, + 0x42, 0x5c, 0x0a, + 0x09, 0x37, 0x42, 0x70, 0x34, 0x63, 0x65, 0x49, 0x63, 0x6b, 0x6c, 0x51, 0x47, 0x33, 0x79, 0x54, 0x4f, 0x69, + 0x59, 0x76, 0x53, 0x78, 0x6d, 0x67, 0x6d, 0x47, 0x34, 0x44, 0x69, 0x2f, 0x52, 0x55, 0x34, 0x67, 0x58, 0x69, + 0x53, 0x31, 0x51, 0x75, 0x4a, 0x73, 0x30, 0x68, 0x53, 0x43, 0x69, 0x38, 0x51, 0x35, 0x38, 0x44, 0x6a, 0x69, + 0x58, 0x4f, 0x69, 0x45, 0x76, 0x41, 0x61, 0x67, 0x4c, 0x54, 0x65, 0x44, 0x48, 0x77, 0x58, 0x6d, 0x4a, 0x30, + 0x34, 0x5c, 0x0a, + 0x09, 0x68, 0x79, 0x51, 0x56, 0x5a, 0x51, 0x6e, 0x78, 0x51, 0x4a, 0x2b, 0x62, 0x55, 0x67, 0x64, 0x70, 0x4f, + 0x68, 0x75, 0x41, 0x39, 0x4c, 0x59, 0x48, 0x72, 0x69, 0x53, 0x65, 0x4a, 0x53, 0x42, 0x4a, 0x64, 0x58, 0x59, + 0x6e, 0x63, 0x42, 0x54, 0x77, 0x53, 0x4f, 0x6f, 0x67, 0x63, 0x67, 0x6d, 0x67, 0x44, 0x42, 0x34, 0x42, 0x33, + 0x67, 0x42, 0x38, 0x4c, 0x58, 0x55, 0x51, 0x53, 0x63, 0x72, 0x52, 0x31, 0x34, 0x6c, 0x7a, 0x6e, 0x63, 0x57, + 0x2f, 0x5c, 0x0a, + 0x09, 0x4a, 0x4a, 0x77, 0x41, 0x6c, 0x4d, 0x75, 0x78, 0x52, 0x43, 0x50, 0x67, 0x66, 0x67, 0x47, 0x53, 0x36, + 0x6d, 0x49, 0x6c, 0x63, 0x42, 0x4a, 0x77, 0x57, 0x65, 0x6f, 0x67, 0x32, 0x70, 0x41, 0x4e, 0x51, 0x50, 0x6e, + 0x73, 0x53, 0x69, 0x77, 0x4a, 0x37, 0x4a, 0x77, 0x36, 0x69, 0x43, 0x52, 0x31, 0x36, 0x55, 0x48, 0x67, 0x61, + 0x4f, 0x43, 0x2b, 0x31, 0x45, 0x47, 0x30, 0x4b, 0x5a, 0x63, 0x41, 0x79, 0x6d, 0x63, 0x42, 0x73, 0x56, 0x2f, + 0x41, 0x5c, 0x0a, + 0x09, 0x4a, 0x61, 0x6d, 0x44, 0x53, 0x46, 0x49, 0x58, 0x4c, 0x69, 0x48, 0x4f, 0x5a, 0x52, 0x62, 0x2f, 0x6b, + 0x72, 0x49, 0x42, 0x4b, 0x4b, 0x65, 0x56, 0x77, 0x41, 0x65, 0x41, 0x39, 0x77, 0x48, 0x4c, 0x45, 0x32, 0x65, + 0x52, 0x70, 0x48, 0x61, 0x73, 0x41, 0x4e, 0x35, 0x50, 0x6e, 0x4d, 0x4e, 0x57, 0x4a, 0x73, 0x36, 0x69, 0x55, + 0x62, 0x67, 0x45, 0x55, 0x48, 0x36, 0x76, 0x4a, 0x4a, 0x34, 0x6a, 0x34, 0x46, 0x30, 0x43, 0x6b, 0x73, 0x72, + 0x75, 0x5c, 0x0a, + 0x09, 0x54, 0x6d, 0x49, 0x2f, 0x2f, 0x7a, 0x2b, 0x6d, 0x44, 0x71, 0x4b, 0x78, 0x4f, 0x51, 0x45, 0x6f, 0x76, + 0x7a, 0x38, 0x43, 0x42, 0x77, 0x4c, 0x6e, 0x41, 0x58, 0x5a, 0x72, 0x6b, 0x73, 0x71, 0x6f, 0x6e, 0x7a, 0x68, + 0x48, 0x48, 0x59, 0x6a, 0x46, 0x76, 0x7a, 0x4b, 0x63, 0x41, 0x46, 0x54, 0x4c, 0x77, 0x63, 0x54, 0x57, 0x6d, + 0x64, 0x73, 0x6d, 0x7a, 0x69, 0x46, 0x4a, 0x67, 0x2f, 0x35, 0x43, 0x37, 0x4f, 0x6a, 0x33, 0x73, 0x39, 0x52, + 0x42, 0x5c, 0x0a, + 0x09, 0x31, 0x42, 0x34, 0x6e, 0x41, 0x4e, 0x56, 0x79, 0x49, 0x37, 0x41, 0x37, 0x63, 0x47, 0x6e, 0x71, 0x49, + 0x4a, 0x4a, 0x45, 0x33, 0x4e, 0x71, 0x33, 0x42, 0x78, 0x62, 0x2f, 0x53, 0x6e, 0x49, 0x43, 0x55, 0x46, 0x31, + 0x48, 0x41, 0x78, 0x63, 0x43, 0x4c, 0x30, 0x73, 0x64, 0x52, 0x46, 0x4c, 0x6a, 0x50, 0x45, 0x50, 0x63, 0x32, + 0x33, 0x39, 0x46, 0x36, 0x69, 0x44, 0x71, 0x6e, 0x41, 0x31, 0x41, 0x74, 0x63, 0x30, 0x68, 0x64, 0x74, 0x65, + 0x61, 0x5c, 0x0a, + 0x09, 0x6e, 0x7a, 0x71, 0x49, 0x70, 0x4d, 0x62, 0x34, 0x49, 0x66, 0x41, 0x68, 0x66, 0x49, 0x4a, 0x66, 0x35, + 0x62, 0x6b, 0x45, 0x55, 0x47, 0x32, 0x4c, 0x67, 0x4d, 0x4f, 0x4a, 0x48, 0x51, 0x53, 0x66, 0x54, 0x70, 0x78, + 0x46, 0x55, 0x72, 0x30, 0x39, 0x54, 0x5a, 0x78, 0x72, 0x44, 0x73, 0x66, 0x69, 0x58, 0x77, 0x74, 0x4f, 0x41, + 0x4f, 0x70, 0x6a, 0x43, 0x2b, 0x44, 0x4c, 0x78, 0x4e, 0x4b, 0x41, 0x4a, 0x47, 0x58, 0x70, 0x53, 0x75, 0x41, + 0x55, 0x5c, 0x0a, + 0x09, 0x34, 0x4d, 0x6e, 0x55, 0x51, 0x5a, 0x51, 0x64, 0x4a, 0x77, 0x44, 0x31, 0x73, 0x52, 0x68, 0x34, 0x4e, + 0x2f, 0x47, 0x6b, 0x72, 0x53, 0x63, 0x53, 0x5a, 0x35, 0x46, 0x55, 0x44, 0x30, 0x38, 0x51, 0x35, 0x35, 0x53, + 0x6a, 0x73, 0x66, 0x6a, 0x58, 0x6a, 0x67, 0x31, 0x41, 0x2f, 0x56, 0x77, 0x46, 0x7a, 0x43, 0x4d, 0x65, 0x4b, + 0x72, 0x51, 0x75, 0x63, 0x52, 0x5a, 0x4a, 0x31, 0x62, 0x53, 0x4f, 0x75, 0x4c, 0x35, 0x6f, 0x48, 0x6e, 0x46, + 0x4f, 0x5c, 0x0a, + 0x09, 0x55, 0x51, 0x32, 0x35, 0x42, 0x46, 0x42, 0x76, 0x72, 0x79, 0x66, 0x2b, 0x45, 0x65, 0x2b, 0x65, 0x4f, + 0x6f, 0x69, 0x6b, 0x79, 0x72, 0x67, 0x58, 0x4f, 0x42, 0x6d, 0x34, 0x4c, 0x58, 0x55, 0x51, 0x35, 0x63, 0x73, + 0x4a, 0x51, 0x4c, 0x33, 0x39, 0x4a, 0x37, 0x41, 0x33, 0x38, 0x45, 0x2f, 0x41, 0x36, 0x73, 0x52, 0x5a, 0x4a, + 0x4a, 0x58, 0x62, 0x63, 0x38, 0x53, 0x35, 0x34, 0x72, 0x56, 0x59, 0x2f, 0x42, 0x76, 0x42, 0x43, 0x55, 0x42, + 0x7a, 0x5c, 0x0a, + 0x09, 0x62, 0x41, 0x65, 0x63, 0x44, 0x78, 0x79, 0x52, 0x4f, 0x6f, 0x69, 0x6b, 0x30, 0x76, 0x6b, 0x65, 0x38, + 0x46, 0x46, 0x67, 0x59, 0x65, 0x6f, 0x67, 0x4b, 0x6f, 0x34, 0x4e, 0x51, 0x50, 0x50, 0x38, 0x4c, 0x66, 0x42, + 0x46, 0x59, 0x4a, 0x66, 0x55, 0x51, 0x53, 0x51, 0x6c, 0x64, 0x7a, 0x39, 0x52, 0x2b, 0x4b, 0x39, 0x50, 0x48, + 0x55, 0x54, 0x46, 0x63, 0x77, 0x6d, 0x67, 0x65, 0x57, 0x34, 0x41, 0x58, 0x67, 0x4f, 0x63, 0x41, 0x53, 0x78, + 0x4c, 0x5c, 0x0a, + 0x09, 0x6e, 0x45, 0x56, 0x53, 0x47, 0x73, 0x75, 0x4a, 0x63, 0x38, 0x42, 0x65, 0x57, 0x50, 0x77, 0x62, 0x79, + 0x77, 0x6c, 0x41, 0x73, 0x38, 0x30, 0x42, 0x7a, 0x69, 0x59, 0x65, 0x35, 0x44, 0x45, 0x68, 0x63, 0x52, 0x5a, + 0x4a, 0x2b, 0x58, 0x73, 0x42, 0x75, 0x41, 0x54, 0x34, 0x46, 0x39, 0x7a, 0x4d, 0x70, 0x2f, 0x46, 0x73, 0x41, + 0x41, 0x53, 0x78, 0x48, 0x48, 0x41, 0x65, 0x63, 0x46, 0x6a, 0x71, 0x49, 0x4a, 0x4a, 0x79, 0x63, 0x79, 0x33, + 0x77, 0x5c, 0x0a, + 0x09, 0x63, 0x57, 0x4c, 0x73, 0x4c, 0x37, 0x6b, 0x45, 0x49, 0x43, 0x42, 0x4f, 0x43, 0x47, 0x38, 0x62, 0x65, + 0x4e, 0x32, 0x58, 0x4f, 0x49, 0x75, 0x6b, 0x62, 0x41, 0x33, 0x39, 0x39, 0x32, 0x33, 0x78, 0x31, 0x34, 0x74, + 0x73, 0x41, 0x44, 0x54, 0x55, 0x74, 0x63, 0x54, 0x31, 0x41, 0x63, 0x66, 0x6a, 0x31, 0x63, 0x42, 0x53, 0x31, + 0x53, 0x30, 0x6b, 0x2f, 0x69, 0x32, 0x2f, 0x68, 0x76, 0x69, 0x33, 0x4c, 0x57, 0x33, 0x41, 0x4a, 0x51, 0x43, + 0x4e, 0x5c, 0x0a, + 0x09, 0x70, 0x4a, 0x64, 0x34, 0x33, 0x4f, 0x63, 0x6e, 0x69, 0x4f, 0x63, 0x4d, 0x53, 0x4b, 0x71, 0x47, 0x4a, + 0x63, 0x43, 0x6e, 0x69, 0x63, 0x65, 0x46, 0x50, 0x35, 0x38, 0x34, 0x69, 0x30, 0x72, 0x4d, 0x42, 0x6b, 0x42, + 0x6a, 0x6d, 0x51, 0x71, 0x63, 0x54, 0x71, 0x77, 0x64, 0x54, 0x6b, 0x2b, 0x63, 0x52, 0x64, 0x4c, 0x49, 0x6c, + 0x68, 0x48, 0x58, 0x38, 0x70, 0x77, 0x50, 0x72, 0x45, 0x79, 0x63, 0x52, 0x52, 0x56, 0x67, 0x41, 0x36, 0x42, + 0x57, 0x5c, 0x0a, + 0x09, 0x62, 0x55, 0x37, 0x63, 0x4c, 0x33, 0x77, 0x61, 0x4d, 0x43, 0x31, 0x78, 0x46, 0x6b, 0x6e, 0x72, 0x72, + 0x51, 0x41, 0x75, 0x41, 0x44, 0x34, 0x50, 0x50, 0x4a, 0x4d, 0x34, 0x69, 0x79, 0x72, 0x45, 0x42, 0x6b, 0x44, + 0x74, 0x6d, 0x73, 0x6e, 0x36, 0x52, 0x73, 0x43, 0x4a, 0x67, 0x4a, 0x54, 0x4f, 0x63, 0x75, 0x49, 0x52, 0x34, + 0x4a, 0x38, 0x48, 0x6e, 0x6b, 0x36, 0x63, 0x52, 0x52, 0x56, 0x6b, 0x41, 0x36, 0x42, 0x4f, 0x7a, 0x53, 0x43, + 0x61, 0x5c, 0x0a, + 0x09, 0x67, 0x4e, 0x4f, 0x49, 0x70, 0x6b, 0x42, 0x53, 0x4d, 0x5a, 0x34, 0x46, 0x76, 0x6b, 0x54, 0x73, 0x36, + 0x4f, 0x6b, 0x6e, 0x66, 0x6e, 0x58, 0x4d, 0x42, 0x6b, 0x44, 0x64, 0x32, 0x67, 0x77, 0x34, 0x6b, 0x62, 0x68, + 0x4f, 0x59, 0x4f, 0x76, 0x45, 0x57, 0x61, 0x51, 0x36, 0x65, 0x34, 0x78, 0x59, 0x33, 0x2f, 0x38, 0x47, 0x4d, + 0x66, 0x61, 0x58, 0x75, 0x6d, 0x49, 0x44, 0x6f, 0x4b, 0x7a, 0x30, 0x41, 0x73, 0x63, 0x42, 0x5a, 0x77, 0x49, + 0x37, 0x5c, 0x0a, + 0x09, 0x4a, 0x38, 0x34, 0x69, 0x31, 0x63, 0x6d, 0x44, 0x77, 0x4c, 0x6e, 0x41, 0x70, 0x58, 0x68, 0x56, 0x76, + 0x7a, 0x4a, 0x6b, 0x41, 0x36, 0x43, 0x73, 0x39, 0x51, 0x44, 0x76, 0x4a, 0x4b, 0x34, 0x54, 0x65, 0x46, 0x50, + 0x69, 0x4c, 0x46, 0x4b, 0x56, 0x33, 0x51, 0x70, 0x38, 0x41, 0x66, 0x67, 0x42, 0x73, 0x43, 0x35, 0x78, 0x46, + 0x74, 0x57, 0x51, 0x44, 0x59, 0x44, 0x79, 0x74, 0x44, 0x64, 0x78, 0x6a, 0x63, 0x42, 0x37, 0x69, 0x41, 0x6d, + 0x42, 0x5c, 0x0a, + 0x09, 0x70, 0x4e, 0x45, 0x39, 0x44, 0x33, 0x79, 0x48, 0x4b, 0x50, 0x78, 0x33, 0x4a, 0x63, 0x36, 0x69, 0x6d, + 0x72, 0x4d, 0x42, 0x55, 0x42, 0x47, 0x32, 0x41, 0x6a, 0x35, 0x4d, 0x58, 0x43, 0x75, 0x77, 0x5a, 0x65, 0x49, + 0x73, 0x55, 0x68, 0x6b, 0x39, 0x53, 0x61, 0x7a, 0x74, 0x66, 0x78, 0x56, 0x34, 0x49, 0x6e, 0x45, 0x57, 0x4e, + 0x59, 0x51, 0x4e, 0x67, 0x49, 0x6f, 0x30, 0x43, 0x54, 0x69, 0x43, 0x32, 0x47, 0x48, 0x51, 0x35, 0x51, 0x45, + 0x4a, 0x5c, 0x0a, + 0x09, 0x66, 0x6b, 0x37, 0x73, 0x32, 0x48, 0x63, 0x31, 0x73, 0x43, 0x5a, 0x78, 0x46, 0x6a, 0x57, 0x4d, 0x44, + 0x59, 0x42, 0x53, 0x32, 0x5a, 0x56, 0x6f, 0x42, 0x4e, 0x36, 0x48, 0x2b, 0x77, 0x6d, 0x6f, 0x57, 0x5a, 0x59, + 0x42, 0x33, 0x77, 0x4b, 0x2b, 0x42, 0x69, 0x78, 0x49, 0x6e, 0x45, 0x55, 0x4e, 0x5a, 0x67, 0x4f, 0x67, 0x31, + 0x4b, 0x59, 0x41, 0x52, 0x78, 0x4d, 0x50, 0x4c, 0x58, 0x6b, 0x6a, 0x4d, 0x43, 0x35, 0x74, 0x48, 0x43, 0x6b, + 0x58, 0x5c, 0x0a, + 0x09, 0x2f, 0x63, 0x53, 0x6e, 0x2f, 0x59, 0x75, 0x42, 0x4b, 0x33, 0x47, 0x72, 0x58, 0x70, 0x57, 0x41, 0x44, + 0x59, 0x44, 0x4b, 0x35, 0x46, 0x58, 0x41, 0x43, 0x63, 0x52, 0x55, 0x34, 0x4f, 0x57, 0x4a, 0x73, 0x30, 0x68, + 0x5a, 0x65, 0x4a, 0x7a, 0x34, 0x74, 0x50, 0x39, 0x4e, 0x34, 0x6e, 0x59, 0x2b, 0x71, 0x54, 0x52, 0x73, 0x41, + 0x46, 0x52, 0x47, 0x34, 0x34, 0x47, 0x33, 0x45, 0x76, 0x73, 0x4b, 0x76, 0x42, 0x4f, 0x59, 0x6e, 0x44, 0x61, + 0x4f, 0x5c, 0x0a, + 0x09, 0x31, 0x4a, 0x62, 0x56, 0x78, 0x4b, 0x31, 0x37, 0x6c, 0x77, 0x49, 0x2f, 0x42, 0x66, 0x72, 0x53, 0x78, + 0x70, 0x47, 0x47, 0x5a, 0x77, 0x4f, 0x67, 0x73, 0x70, 0x74, 0x4b, 0x4e, 0x41, 0x48, 0x76, 0x42, 0x51, 0x34, + 0x46, 0x4a, 0x71, 0x61, 0x4e, 0x49, 0x77, 0x31, 0x72, 0x4c, 0x58, 0x41, 0x39, 0x63, 0x44, 0x6c, 0x52, 0x2f, + 0x42, 0x33, 0x78, 0x71, 0x2f, 0x52, 0x73, 0x41, 0x46, 0x51, 0x6c, 0x73, 0x34, 0x42, 0x33, 0x44, 0x37, 0x7a, + 0x65, 0x5c, 0x0a, + 0x09, 0x51, 0x45, 0x77, 0x4b, 0x70, 0x46, 0x54, 0x36, 0x67, 0x46, 0x38, 0x41, 0x33, 0x78, 0x31, 0x34, 0x50, + 0x5a, 0x55, 0x32, 0x6a, 0x74, 0x51, 0x65, 0x47, 0x77, 0x42, 0x56, 0x31, 0x52, 0x62, 0x41, 0x75, 0x34, 0x41, + 0x6a, 0x67, 0x62, 0x66, 0x67, 0x5a, 0x45, 0x44, 0x46, 0x57, 0x41, 0x76, 0x63, 0x42, 0x46, 0x77, 0x46, 0x66, + 0x42, 0x39, 0x59, 0x6e, 0x44, 0x61, 0x4f, 0x31, 0x44, 0x6b, 0x62, 0x41, 0x4e, 0x58, 0x42, 0x54, 0x4f, 0x44, + 0x77, 0x5c, 0x0a, + 0x09, 0x67, 0x64, 0x65, 0x68, 0x78, 0x4c, 0x4b, 0x42, 0x6c, 0x4a, 0x57, 0x56, 0x77, 0x48, 0x58, 0x41, 0x4e, + 0x51, 0x4f, 0x76, 0x5a, 0x39, 0x50, 0x47, 0x6b, 0x62, 0x4a, 0x68, 0x41, 0x36, 0x43, 0x36, 0x36, 0x51, 0x58, + 0x65, 0x44, 0x4c, 0x77, 0x44, 0x65, 0x44, 0x75, 0x77, 0x59, 0x39, 0x49, 0x30, 0x71, 0x71, 0x6f, 0x2f, 0x41, + 0x54, 0x38, 0x61, 0x65, 0x4e, 0x32, 0x43, 0x6d, 0x2f, 0x53, 0x6f, 0x68, 0x6d, 0x77, 0x41, 0x56, 0x48, 0x65, + 0x37, 0x5c, 0x0a, + 0x09, 0x41, 0x49, 0x63, 0x42, 0x68, 0x78, 0x43, 0x37, 0x44, 0x33, 0x70, 0x48, 0x67, 0x59, 0x61, 0x7a, 0x6d, + 0x72, 0x68, 0x50, 0x2f, 0x7a, 0x72, 0x67, 0x57, 0x75, 0x44, 0x2b, 0x74, 0x48, 0x47, 0x6b, 0x2f, 0x4e, 0x6b, + 0x41, 0x71, 0x45, 0x6c, 0x65, 0x41, 0x68, 0x78, 0x41, 0x4e, 0x41, 0x4f, 0x48, 0x41, 0x6e, 0x73, 0x53, 0x54, + 0x79, 0x39, 0x55, 0x38, 0x36, 0x77, 0x44, 0x37, 0x69, 0x45, 0x4b, 0x2f, 0x76, 0x58, 0x41, 0x4c, 0x34, 0x47, + 0x2f, 0x5c, 0x0a, + 0x09, 0x4a, 0x6b, 0x30, 0x6b, 0x46, 0x63, 0x77, 0x47, 0x51, 0x45, 0x30, 0x32, 0x6b, 0x37, 0x69, 0x62, 0x34, + 0x43, 0x42, 0x69, 0x4f, 0x72, 0x41, 0x58, 0x4d, 0x43, 0x46, 0x70, 0x49, 0x75, 0x58, 0x6c, 0x42, 0x65, 0x42, + 0x75, 0x34, 0x6c, 0x50, 0x2b, 0x7a, 0x63, 0x54, 0x56, 0x2b, 0x36, 0x37, 0x6c, 0x71, 0x39, 0x46, 0x73, 0x41, + 0x4b, 0x54, 0x31, 0x4e, 0x69, 0x4d, 0x6d, 0x42, 0x47, 0x38, 0x45, 0x39, 0x67, 0x66, 0x32, 0x78, 0x65, 0x63, + 0x55, 0x5c, 0x0a, + 0x09, 0x56, 0x4e, 0x56, 0x79, 0x34, 0x41, 0x37, 0x67, 0x64, 0x71, 0x4c, 0x59, 0x33, 0x77, 0x61, 0x73, 0x53, + 0x4a, 0x70, 0x49, 0x4b, 0x68, 0x6b, 0x62, 0x41, 0x47, 0x6c, 0x6b, 0x50, 0x63, 0x41, 0x38, 0x6f, 0x68, 0x6c, + 0x34, 0x48, 0x62, 0x41, 0x66, 0x63, 0x55, 0x32, 0x42, 0x74, 0x78, 0x79, 0x57, 0x79, 0x77, 0x76, 0x45, 0x51, + 0x33, 0x58, 0x75, 0x41, 0x48, 0x34, 0x31, 0x38, 0x4f, 0x50, 0x39, 0x78, 0x4a, 0x68, 0x66, 0x30, 0x67, 0x68, + 0x73, 0x5c, 0x0a, + 0x09, 0x41, 0x4b, 0x54, 0x32, 0x76, 0x41, 0x54, 0x59, 0x6a, 0x56, 0x67, 0x75, 0x32, 0x42, 0x50, 0x59, 0x47, + 0x39, 0x67, 0x44, 0x4c, 0x79, 0x34, 0x73, 0x79, 0x6d, 0x72, 0x67, 0x58, 0x75, 0x41, 0x33, 0x78, 0x42, 0x72, + 0x2b, 0x33, 0x63, 0x42, 0x39, 0x75, 0x48, 0x34, 0x76, 0x74, 0x63, 0x30, 0x47, 0x51, 0x4f, 0x72, 0x65, 0x65, + 0x47, 0x41, 0x48, 0x59, 0x6a, 0x71, 0x77, 0x43, 0x2f, 0x47, 0x6f, 0x34, 0x33, 0x6b, 0x44, 0x4c, 0x78, 0x75, + 0x44, 0x5c, 0x0a, + 0x09, 0x7a, 0x71, 0x77, 0x47, 0x48, 0x68, 0x68, 0x34, 0x4c, 0x53, 0x41, 0x2b, 0x30, 0x64, 0x39, 0x50, 0x33, + 0x4a, 0x37, 0x6e, 0x33, 0x76, 0x70, 0x53, 0x42, 0x6d, 0x77, 0x41, 0x70, 0x50, 0x7a, 0x30, 0x41, 0x4e, 0x73, + 0x43, 0x63, 0x77, 0x64, 0x65, 0x4f, 0x77, 0x37, 0x35, 0x2b, 0x55, 0x37, 0x45, 0x6f, 0x35, 0x43, 0x62, 0x62, + 0x44, 0x58, 0x77, 0x30, 0x4d, 0x44, 0x72, 0x34, 0x59, 0x48, 0x58, 0x34, 0x4b, 0x2f, 0x2f, 0x67, 0x69, 0x4e, + 0x38, 0x5c, 0x0a, + 0x09, 0x4b, 0x56, 0x63, 0x32, 0x41, 0x46, 0x49, 0x36, 0x73, 0x34, 0x42, 0x74, 0x69, 0x43, 0x5a, 0x68, 0x75, + 0x34, 0x47, 0x66, 0x62, 0x77, 0x4e, 0x73, 0x54, 0x57, 0x78, 0x31, 0x50, 0x48, 0x76, 0x67, 0x4e, 0x53, 0x35, + 0x56, 0x77, 0x41, 0x37, 0x31, 0x41, 0x30, 0x73, 0x47, 0x58, 0x6f, 0x75, 0x42, 0x78, 0x34, 0x42, 0x48, 0x42, + 0x31, 0x34, 0x4c, 0x69, 0x65, 0x4c, 0x2b, 0x4b, 0x4f, 0x36, 0x64, 0x4c, 0x79, 0x56, 0x6c, 0x41, 0x79, 0x43, + 0x56, 0x5c, 0x0a, + 0x09, 0x32, 0x33, 0x67, 0x32, 0x62, 0x41, 0x59, 0x32, 0x42, 0x32, 0x59, 0x4d, 0x38, 0x35, 0x6f, 0x79, 0x38, + 0x4a, 0x6f, 0x4d, 0x54, 0x41, 0x4b, 0x6d, 0x45, 0x52, 0x63, 0x72, 0x62, 0x6e, 0x77, 0x58, 0x77, 0x7a, 0x51, + 0x32, 0x66, 0x59, 0x68, 0x53, 0x48, 0x33, 0x48, 0x56, 0x2f, 0x46, 0x44, 0x4c, 0x69, 0x48, 0x33, 0x76, 0x6c, + 0x78, 0x4f, 0x37, 0x34, 0x4b, 0x30, 0x47, 0x56, 0x67, 0x32, 0x38, 0x6c, 0x67, 0x37, 0x7a, 0x65, 0x6f, 0x62, + 0x31, 0x5c, 0x0a, + 0x09, 0x52, 0x58, 0x38, 0x4a, 0x63, 0x57, 0x47, 0x65, 0x70, 0x42, 0x4c, 0x37, 0x2f, 0x2b, 0x36, 0x4a, 0x76, + 0x53, 0x43, 0x72, 0x32, 0x66, 0x6e, 0x73, 0x41, 0x41, 0x41, 0x41, 0x41, 0x45, 0x6c, 0x46, 0x54, 0x6b, 0x53, + 0x75, 0x51, 0x6d, 0x43, 0x43, 0x5c, 0x0a, + 0x09, 0x22, 0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x75, 0x62, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x6e, 0x67, 0x20, + 0x3d, 0x0a, + 0x09, 0x22, 0x69, 0x56, 0x42, 0x4f, 0x52, 0x77, 0x30, 0x4b, 0x47, 0x67, 0x6f, 0x41, 0x41, 0x41, 0x41, 0x4e, + 0x53, 0x55, 0x68, 0x45, 0x55, 0x67, 0x41, 0x41, 0x41, 0x51, 0x41, 0x41, 0x41, 0x41, 0x43, 0x41, 0x43, 0x41, + 0x59, 0x41, 0x41, 0x41, 0x44, 0x6b, 0x74, 0x62, 0x63, 0x4b, 0x41, 0x41, 0x41, 0x48, 0x48, 0x30, 0x6c, 0x45, + 0x51, 0x56, 0x52, 0x34, 0x6e, 0x4f, 0x33, 0x64, 0x79, 0x38, 0x39, 0x63, 0x63, 0x78, 0x7a, 0x48, 0x38, 0x66, + 0x66, 0x7a, 0x5c, 0x0a, + 0x09, 0x39, 0x46, 0x36, 0x58, 0x58, 0x72, 0x52, 0x39, 0x74, 0x4b, 0x36, 0x6c, 0x4c, 0x58, 0x56, 0x70, 0x56, + 0x43, 0x51, 0x6b, 0x4c, 0x68, 0x47, 0x68, 0x49, 0x57, 0x69, 0x49, 0x52, 0x46, 0x30, 0x53, 0x47, 0x34, 0x53, + 0x39, 0x68, 0x4a, 0x55, 0x56, 0x47, 0x78, 0x61, 0x57, 0x4e, 0x68, 0x62, 0x2b, 0x41, 0x49, 0x74, 0x4b, 0x42, + 0x47, 0x46, 0x68, 0x30, 0x34, 0x55, 0x67, 0x49, 0x69, 0x68, 0x42, 0x56, 0x4a, 0x75, 0x57, 0x74, 0x6d, 0x69, + 0x72, 0x5c, 0x0a, + 0x09, 0x56, 0x38, 0x56, 0x44, 0x78, 0x2b, 0x4a, 0x33, 0x4a, 0x73, 0x39, 0x30, 0x4f, 0x76, 0x4e, 0x30, 0x66, + 0x6d, 0x66, 0x6d, 0x39, 0x46, 0x78, 0x2b, 0x37, 0x31, 0x63, 0x79, 0x65, 0x57, 0x61, 0x65, 0x7a, 0x75, 0x58, + 0x62, 0x4e, 0x74, 0x2f, 0x50, 0x37, 0x33, 0x64, 0x2b, 0x35, 0x38, 0x77, 0x35, 0x59, 0x36, 0x31, 0x57, 0x43, + 0x30, 0x6c, 0x70, 0x47, 0x69, 0x2b, 0x37, 0x41, 0x45, 0x6e, 0x6c, 0x4d, 0x51, 0x43, 0x6b, 0x68, 0x4d, 0x30, + 0x73, 0x5c, 0x0a, + 0x09, 0x75, 0x77, 0x44, 0x56, 0x79, 0x36, 0x70, 0x4c, 0x56, 0x30, 0x59, 0x39, 0x2f, 0x38, 0x63, 0x64, 0x32, + 0x77, 0x75, 0x71, 0x52, 0x4b, 0x4e, 0x67, 0x41, 0x43, 0x51, 0x71, 0x74, 0x70, 0x47, 0x37, 0x6a, 0x41, 0x45, + 0x4c, 0x67, 0x47, 0x58, 0x41, 0x63, 0x6d, 0x41, 0x43, 0x57, 0x4a, 0x49, 0x39, 0x6e, 0x67, 0x43, 0x4f, 0x41, + 0x53, 0x38, 0x42, 0x68, 0x34, 0x61, 0x72, 0x55, 0x6b, 0x55, 0x62, 0x63, 0x78, 0x47, 0x77, 0x33, 0x6f, 0x5a, + 0x73, 0x5c, 0x0a, + 0x09, 0x35, 0x48, 0x48, 0x67, 0x4c, 0x47, 0x41, 0x68, 0x6f, 0x58, 0x47, 0x58, 0x41, 0x59, 0x75, 0x7a, 0x32, + 0x33, 0x6b, 0x64, 0x39, 0x78, 0x66, 0x31, 0x75, 0x48, 0x2b, 0x36, 0x7a, 0x63, 0x65, 0x33, 0x67, 0x51, 0x66, + 0x42, 0x57, 0x55, 0x43, 0x56, 0x4f, 0x51, 0x4f, 0x6f, 0x67, 0x43, 0x47, 0x62, 0x47, 0x47, 0x41, 0x57, 0x6f, + 0x5a, 0x48, 0x50, 0x4a, 0x54, 0x54, 0x75, 0x2b, 0x63, 0x42, 0x46, 0x68, 0x47, 0x5a, 0x74, 0x4e, 0x2b, 0x79, + 0x69, 0x5c, 0x0a, + 0x09, 0x72, 0x73, 0x66, 0x6e, 0x41, 0x65, 0x63, 0x4d, 0x2b, 0x38, 0x48, 0x54, 0x65, 0x41, 0x42, 0x59, 0x44, + 0x33, 0x78, 0x52, 0x34, 0x47, 0x64, 0x6f, 0x53, 0x41, 0x62, 0x41, 0x43, 0x49, 0x31, 0x67, 0x4e, 0x4a, 0x34, + 0x4e, 0x7a, 0x41, 0x50, 0x4f, 0x4a, 0x6a, 0x54, 0x70, 0x42, 0x48, 0x41, 0x68, 0x73, 0x4a, 0x4c, 0x51, 0x73, + 0x4e, 0x31, 0x4e, 0x33, 0x4c, 0x35, 0x66, 0x31, 0x63, 0x58, 0x63, 0x52, 0x7a, 0x41, 0x41, 0x4b, 0x73, 0x31, + 0x4e, 0x5c, 0x0a, + 0x09, 0x67, 0x42, 0x36, 0x47, 0x62, 0x4f, 0x51, 0x5a, 0x68, 0x42, 0x46, 0x35, 0x4c, 0x6d, 0x46, 0x55, 0x58, + 0x67, 0x41, 0x73, 0x42, 0x56, 0x59, 0x41, 0x6c, 0x77, 0x4b, 0x72, 0x43, 0x56, 0x50, 0x74, 0x37, 0x69, 0x61, + 0x65, 0x50, 0x63, 0x79, 0x48, 0x56, 0x74, 0x54, 0x6e, 0x77, 0x41, 0x33, 0x67, 0x5a, 0x6b, 0x42, 0x56, 0x4e, + 0x58, 0x6f, 0x47, 0x4d, 0x49, 0x49, 0x52, 0x65, 0x53, 0x61, 0x68, 0x4d, 0x65, 0x63, 0x54, 0x70, 0x74, 0x65, + 0x4c, 0x5c, 0x0a, + 0x09, 0x43, 0x4b, 0x50, 0x79, 0x4a, 0x63, 0x44, 0x6c, 0x77, 0x46, 0x58, 0x41, 0x42, 0x55, 0x77, 0x31, 0x38, + 0x66, 0x78, 0x68, 0x50, 0x72, 0x43, 0x42, 0x31, 0x68, 0x50, 0x2b, 0x48, 0x55, 0x2b, 0x55, 0x58, 0x59, 0x68, + 0x36, 0x71, 0x30, 0x30, 0x41, 0x44, 0x4e, 0x48, 0x4d, 0x59, 0x34, 0x52, 0x52, 0x65, 0x53, 0x59, 0x77, 0x68, + 0x39, 0x43, 0x6b, 0x43, 0x77, 0x6c, 0x54, 0x36, 0x75, 0x57, 0x45, 0x5a, 0x72, 0x34, 0x43, 0x75, 0x49, 0x59, + 0x77, 0x5c, 0x0a, + 0x09, 0x31, 0x56, 0x35, 0x4d, 0x47, 0x4d, 0x45, 0x31, 0x76, 0x48, 0x48, 0x43, 0x76, 0x2f, 0x66, 0x52, 0x73, + 0x67, 0x74, 0x52, 0x62, 0x36, 0x55, 0x45, 0x77, 0x49, 0x69, 0x61, 0x75, 0x54, 0x33, 0x46, 0x58, 0x6b, 0x69, + 0x59, 0x59, 0x69, 0x38, 0x6e, 0x6a, 0x4d, 0x70, 0x58, 0x45, 0x6b, 0x61, 0x65, 0x4b, 0x37, 0x4c, 0x6e, 0x71, + 0x6c, 0x79, 0x4c, 0x4d, 0x41, 0x41, 0x71, 0x61, 0x32, 0x51, 0x42, 0x6b, 0x4b, 0x4f, 0x70, 0x78, 0x77, 0x67, + 0x6a, 0x5c, 0x0a, + 0x09, 0x78, 0x43, 0x7a, 0x43, 0x79, 0x4e, 0x79, 0x39, 0x76, 0x62, 0x77, 0x53, 0x57, 0x41, 0x4e, 0x63, 0x42, + 0x36, 0x79, 0x6a, 0x75, 0x67, 0x74, 0x64, 0x6d, 0x74, 0x37, 0x35, 0x77, 0x4b, 0x36, 0x79, 0x69, 0x31, 0x42, + 0x76, 0x41, 0x77, 0x66, 0x41, 0x67, 0x41, 0x33, 0x65, 0x58, 0x67, 0x43, 0x62, 0x54, 0x39, 0x6a, 0x46, 0x74, + 0x4a, 0x69, 0x70, 0x5a, 0x6c, 0x35, 0x4e, 0x6d, 0x47, 0x62, 0x66, 0x68, 0x4e, 0x76, 0x4b, 0x4b, 0x62, 0x6b, + 0x49, 0x5c, 0x0a, + 0x09, 0x2b, 0x4b, 0x7a, 0x73, 0x49, 0x74, 0x54, 0x62, 0x51, 0x41, 0x48, 0x51, 0x30, 0x66, 0x79, 0x7a, 0x43, + 0x43, 0x76, 0x5a, 0x61, 0x34, 0x43, 0x31, 0x68, 0x42, 0x58, 0x65, 0x56, 0x63, 0x44, 0x46, 0x68, 0x4a, 0x46, + 0x62, 0x36, 0x6e, 0x5a, 0x35, 0x32, 0x51, 0x57, 0x6f, 0x76, 0x35, 0x68, 0x4e, 0x67, 0x48, 0x48, 0x67, 0x65, + 0x38, 0x4a, 0x6f, 0x4c, 0x67, 0x33, 0x71, 0x36, 0x72, 0x49, 0x4c, 0x55, 0x48, 0x38, 0x78, 0x32, 0x39, 0x57, + 0x72, 0x5c, 0x0a, + 0x09, 0x73, 0x50, 0x6b, 0x56, 0x62, 0x31, 0x33, 0x5a, 0x42, 0x61, 0x69, 0x2f, 0x6d, 0x41, 0x42, 0x59, 0x58, + 0x56, 0x67, 0x56, 0x61, 0x6a, 0x49, 0x44, 0x6f, 0x4d, 0x4a, 0x69, 0x41, 0x6d, 0x43, 0x69, 0x73, 0x43, 0x72, + 0x55, 0x5a, 0x44, 0x4e, 0x67, 0x4a, 0x4e, 0x39, 0x33, 0x55, 0x41, 0x46, 0x69, 0x41, 0x73, 0x42, 0x46, 0x50, + 0x75, 0x55, 0x31, 0x56, 0x6e, 0x59, 0x42, 0x36, 0x69, 0x30, 0x6d, 0x41, 0x4a, 0x59, 0x55, 0x56, 0x6f, 0x57, + 0x61, 0x5c, 0x0a, + 0x09, 0x7a, 0x67, 0x43, 0x6f, 0x4b, 0x41, 0x4e, 0x41, 0x5a, 0x34, 0x4a, 0x48, 0x5a, 0x46, 0x5a, 0x55, 0x54, + 0x41, 0x43, 0x59, 0x34, 0x73, 0x72, 0x4c, 0x41, 0x4b, 0x67, 0x6f, 0x44, 0x36, 0x2f, 0x56, 0x6d, 0x57, 0x41, + 0x41, 0x56, 0x46, 0x52, 0x4d, 0x41, 0x4d, 0x77, 0x70, 0x72, 0x41, 0x6f, 0x31, 0x58, 0x57, 0x32, 0x2b, 0x64, + 0x5a, 0x71, 0x61, 0x6d, 0x41, 0x43, 0x59, 0x56, 0x31, 0x67, 0x56, 0x61, 0x6a, 0x71, 0x2f, 0x58, 0x6c, 0x31, + 0x52, 0x5c, 0x0a, + 0x09, 0x62, 0x67, 0x4c, 0x6f, 0x54, 0x44, 0x41, 0x41, 0x4b, 0x69, 0x6f, 0x6d, 0x41, 0x50, 0x59, 0x58, 0x56, + 0x6f, 0x57, 0x61, 0x7a, 0x67, 0x43, 0x6f, 0x71, 0x4a, 0x67, 0x41, 0x32, 0x46, 0x6c, 0x59, 0x46, 0x57, 0x71, + 0x36, 0x4a, 0x70, 0x37, 0x76, 0x73, 0x42, 0x46, 0x69, 0x41, 0x6d, 0x42, 0x33, 0x59, 0x56, 0x57, 0x6f, 0x36, + 0x53, 0x62, 0x4c, 0x4c, 0x6b, 0x43, 0x39, 0x78, 0x51, 0x54, 0x41, 0x6e, 0x73, 0x4b, 0x71, 0x55, 0x4e, 0x50, + 0x39, 0x5c, 0x0a, + 0x09, 0x58, 0x58, 0x59, 0x42, 0x36, 0x69, 0x30, 0x6d, 0x41, 0x4c, 0x7a, 0x4d, 0x6b, 0x2f, 0x49, 0x36, 0x58, + 0x6e, 0x59, 0x42, 0x36, 0x69, 0x30, 0x6d, 0x41, 0x50, 0x34, 0x6f, 0x72, 0x41, 0x6f, 0x31, 0x6e, 0x59, 0x4e, + 0x48, 0x52, 0x52, 0x6b, 0x41, 0x4b, 0x74, 0x70, 0x78, 0x38, 0x4d, 0x49, 0x67, 0x56, 0x52, 0x55, 0x54, 0x41, + 0x4d, 0x63, 0x4b, 0x71, 0x30, 0x4a, 0x4e, 0x35, 0x69, 0x6e, 0x42, 0x4b, 0x79, 0x77, 0x6d, 0x41, 0x46, 0x7a, + 0x49, 0x5c, 0x0a, + 0x09, 0x55, 0x52, 0x35, 0x37, 0x79, 0x79, 0x35, 0x41, 0x2f, 0x63, 0x55, 0x45, 0x67, 0x4c, 0x74, 0x79, 0x6c, + 0x49, 0x65, 0x37, 0x6a, 0x79, 0x73, 0x73, 0x4a, 0x67, 0x44, 0x2b, 0x4b, 0x36, 0x77, 0x4b, 0x4e, 0x64, 0x6e, + 0x50, 0x5a, 0x52, 0x65, 0x67, 0x2f, 0x6d, 0x49, 0x43, 0x77, 0x4d, 0x73, 0x49, 0x4b, 0x77, 0x2b, 0x50, 0x48, + 0x36, 0x6d, 0x77, 0x67, 0x51, 0x4b, 0x67, 0x59, 0x77, 0x58, 0x58, 0x68, 0x55, 0x44, 0x46, 0x32, 0x6c, 0x5a, + 0x32, 0x5c, 0x0a, + 0x09, 0x41, 0x65, 0x6f, 0x76, 0x39, 0x74, 0x75, 0x41, 0x58, 0x78, 0x52, 0x53, 0x68, 0x5a, 0x72, 0x4d, 0x79, + 0x34, 0x4a, 0x56, 0x57, 0x47, 0x77, 0x41, 0x62, 0x43, 0x6d, 0x6b, 0x43, 0x6a, 0x58, 0x52, 0x62, 0x38, 0x44, + 0x72, 0x77, 0x44, 0x64, 0x6c, 0x46, 0x36, 0x4c, 0x2b, 0x59, 0x73, 0x2f, 0x55, 0x38, 0x6d, 0x55, 0x68, 0x56, + 0x61, 0x69, 0x4f, 0x57, 0x6f, 0x51, 0x6d, 0x33, 0x77, 0x6e, 0x73, 0x36, 0x50, 0x6a, 0x35, 0x48, 0x62, 0x43, + 0x56, 0x5c, 0x0a, + 0x09, 0x6a, 0x74, 0x31, 0x2f, 0x48, 0x67, 0x52, 0x55, 0x58, 0x62, 0x45, 0x42, 0x38, 0x45, 0x4d, 0x68, 0x56, + 0x61, 0x67, 0x71, 0x2f, 0x67, 0x4c, 0x32, 0x41, 0x62, 0x38, 0x53, 0x7a, 0x76, 0x2b, 0x77, 0x6a, 0x39, 0x44, + 0x6b, 0x76, 0x32, 0x66, 0x33, 0x64, 0x78, 0x4d, 0x61, 0x2b, 0x35, 0x66, 0x73, 0x64, 0x2f, 0x39, 0x4f, 0x39, + 0x32, 0x59, 0x32, 0x66, 0x76, 0x58, 0x46, 0x42, 0x73, 0x43, 0x4f, 0x49, 0x6f, 0x72, 0x51, 0x79, 0x4c, 0x55, + 0x49, 0x5c, 0x0a, + 0x09, 0x68, 0x32, 0x34, 0x66, 0x36, 0x50, 0x72, 0x5a, 0x65, 0x66, 0x38, 0x33, 0x51, 0x6c, 0x50, 0x76, 0x5a, + 0x36, 0x72, 0x4a, 0x6f, 0x78, 0x64, 0x35, 0x62, 0x66, 0x4a, 0x36, 0x69, 0x77, 0x32, 0x41, 0x67, 0x39, 0x6c, + 0x74, 0x59, 0x51, 0x47, 0x31, 0x36, 0x47, 0x53, 0x48, 0x42, 0x72, 0x6a, 0x39, 0x77, 0x61, 0x6d, 0x4e, 0x66, + 0x59, 0x44, 0x77, 0x66, 0x35, 0x53, 0x4c, 0x44, 0x5a, 0x32, 0x57, 0x32, 0x41, 0x42, 0x6f, 0x41, 0x65, 0x38, + 0x42, 0x5c, 0x0a, + 0x09, 0x6a, 0x78, 0x56, 0x51, 0x53, 0x35, 0x4d, 0x63, 0x34, 0x64, 0x52, 0x6d, 0x50, 0x64, 0x6a, 0x6a, 0x64, + 0x2f, 0x31, 0x75, 0x75, 0x52, 0x75, 0x34, 0x7a, 0x55, 0x62, 0x57, 0x49, 0x4d, 0x5a, 0x61, 0x72, 0x63, 0x47, + 0x50, 0x37, 0x38, 0x6b, 0x75, 0x38, 0x48, 0x67, 0x66, 0x38, 0x45, 0x35, 0x52, 0x42, 0x56, 0x58, 0x4d, 0x46, + 0x6d, 0x41, 0x58, 0x6f, 0x61, 0x48, 0x62, 0x74, 0x38, 0x4f, 0x45, 0x42, 0x6a, 0x33, 0x53, 0x34, 0x39, 0x5a, + 0x75, 0x5c, 0x0a, + 0x09, 0x34, 0x4b, 0x45, 0x50, 0x6d, 0x72, 0x4b, 0x42, 0x64, 0x53, 0x62, 0x6b, 0x4f, 0x56, 0x2f, 0x37, 0x75, + 0x38, 0x41, 0x6e, 0x77, 0x49, 0x30, 0x6a, 0x72, 0x69, 0x57, 0x76, 0x76, 0x77, 0x6b, 0x4e, 0x4f, 0x51, 0x6c, + 0x63, 0x4f, 0x4d, 0x4c, 0x33, 0x66, 0x52, 0x6c, 0x34, 0x4d, 0x65, 0x2b, 0x4c, 0x62, 0x57, 0x44, 0x56, 0x51, + 0x5a, 0x34, 0x41, 0x61, 0x41, 0x46, 0x33, 0x41, 0x30, 0x38, 0x41, 0x4e, 0x77, 0x43, 0x58, 0x41, 0x57, 0x63, + 0x54, 0x5c, 0x0a, + 0x09, 0x31, 0x67, 0x58, 0x6d, 0x45, 0x71, 0x34, 0x66, 0x63, 0x47, 0x37, 0x48, 0x38, 0x34, 0x38, 0x41, 0x4a, + 0x7a, 0x6f, 0x65, 0x54, 0x78, 0x49, 0x57, 0x6d, 0x37, 0x70, 0x2f, 0x48, 0x73, 0x2b, 0x65, 0x65, 0x35, 0x51, + 0x77, 0x79, 0x68, 0x37, 0x4f, 0x37, 0x68, 0x2f, 0x6c, 0x35, 0x42, 0x47, 0x32, 0x2f, 0x62, 0x75, 0x44, 0x68, + 0x47, 0x33, 0x65, 0x76, 0x37, 0x4c, 0x33, 0x66, 0x52, 0x35, 0x34, 0x4a, 0x63, 0x66, 0x66, 0x70, 0x35, 0x66, + 0x6e, 0x5c, 0x0a, + 0x09, 0x67, 0x4e, 0x66, 0x41, 0x52, 0x6c, 0x61, 0x7a, 0x52, 0x57, 0x30, 0x43, 0x51, 0x4b, 0x57, 0x76, 0x38, + 0x2f, 0x34, 0x35, 0x63, 0x50, 0x32, 0x51, 0x37, 0x33, 0x45, 0x43, 0x65, 0x41, 0x70, 0x34, 0x45, 0x32, 0x78, + 0x2b, 0x4e, 0x56, 0x39, 0x30, 0x41, 0x46, 0x52, 0x4e, 0x46, 0x6b, 0x68, 0x72, 0x67, 0x4f, 0x2b, 0x48, 0x66, + 0x4b, 0x74, 0x4a, 0x59, 0x42, 0x4f, 0x77, 0x47, 0x57, 0x78, 0x2b, 0x70, 0x61, 0x45, 0x70, 0x31, 0x32, 0x7a, + 0x62, 0x5c, 0x0a, + 0x09, 0x4e, 0x4f, 0x54, 0x72, 0x6a, 0x77, 0x45, 0x62, 0x67, 0x59, 0x2f, 0x41, 0x35, 0x6c, 0x63, 0x36, 0x61, + 0x6a, 0x30, 0x44, 0x36, 0x4e, 0x67, 0x63, 0x2b, 0x52, 0x5a, 0x59, 0x6d, 0x2f, 0x4e, 0x74, 0x39, 0x67, 0x50, + 0x33, 0x45, 0x68, 0x59, 0x32, 0x62, 0x58, 0x34, 0x6c, 0x70, 0x51, 0x6b, 0x7a, 0x67, 0x47, 0x76, 0x4a, 0x33, + 0x2f, 0x79, 0x2f, 0x45, 0x42, 0x59, 0x30, 0x74, 0x34, 0x4c, 0x4e, 0x72, 0x2f, 0x51, 0x30, 0x49, 0x51, 0x41, + 0x65, 0x5c, 0x0a, + 0x09, 0x7a, 0x66, 0x6d, 0x36, 0x62, 0x63, 0x41, 0x47, 0x34, 0x43, 0x65, 0x77, 0x2b, 0x5a, 0x57, 0x6d, 0x32, + 0x6d, 0x34, 0x43, 0x64, 0x45, 0x7a, 0x2f, 0x74, 0x78, 0x46, 0x32, 0x52, 0x63, 0x62, 0x59, 0x43, 0x74, 0x78, + 0x46, 0x39, 0x6f, 0x30, 0x31, 0x6d, 0x31, 0x2b, 0x70, 0x71, 0x76, 0x76, 0x6c, 0x77, 0x57, 0x38, 0x6b, 0x76, + 0x76, 0x6b, 0x2f, 0x42, 0x6d, 0x37, 0x42, 0x35, 0x70, 0x66, 0x71, 0x47, 0x51, 0x41, 0x64, 0x6f, 0x2f, 0x2f, + 0x44, 0x5c, 0x0a, + 0x09, 0x6b, 0x53, 0x2f, 0x39, 0x45, 0x4c, 0x69, 0x54, 0x37, 0x45, 0x6f, 0x31, 0x4e, 0x72, 0x39, 0x53, 0x56, + 0x38, 0x73, 0x41, 0x79, 0x49, 0x77, 0x44, 0x6a, 0x30, 0x51, 0x38, 0x2f, 0x79, 0x33, 0x67, 0x66, 0x75, 0x42, + 0x50, 0x73, 0x50, 0x6b, 0x6c, 0x71, 0x48, 0x63, 0x41, 0x33, 0x41, 0x79, 0x73, 0x47, 0x50, 0x43, 0x35, 0x62, + 0x78, 0x41, 0x57, 0x43, 0x2f, 0x38, 0x42, 0x6d, 0x31, 0x39, 0x71, 0x71, 0x31, 0x30, 0x41, 0x64, 0x45, 0x7a, + 0x2f, 0x5c, 0x0a, + 0x09, 0x42, 0x2f, 0x31, 0x4b, 0x38, 0x71, 0x76, 0x41, 0x4d, 0x32, 0x54, 0x58, 0x4e, 0x62, 0x44, 0x35, 0x70, + 0x53, 0x6c, 0x31, 0x33, 0x51, 0x30, 0x34, 0x41, 0x33, 0x68, 0x6f, 0x67, 0x4f, 0x65, 0x39, 0x51, 0x41, 0x67, + 0x41, 0x77, 0x4f, 0x61, 0x58, 0x75, 0x74, 0x55, 0x31, 0x41, 0x4f, 0x34, 0x45, 0x6c, 0x6b, 0x37, 0x7a, 0x35, + 0x79, 0x65, 0x41, 0x5a, 0x77, 0x6c, 0x54, 0x66, 0x78, 0x74, 0x66, 0x36, 0x71, 0x4e, 0x57, 0x41, 0x54, 0x44, + 0x67, 0x5c, 0x0a, + 0x09, 0x36, 0x76, 0x38, 0x6b, 0x38, 0x44, 0x68, 0x68, 0x30, 0x63, 0x2f, 0x6d, 0x6c, 0x36, 0x5a, 0x52, 0x71, + 0x77, 0x44, 0x49, 0x7a, 0x4b, 0x48, 0x2f, 0x39, 0x50, 0x38, 0x34, 0x38, 0x43, 0x44, 0x77, 0x41, 0x64, 0x6a, + 0x38, 0x30, 0x75, 0x6e, 0x55, 0x4d, 0x51, 0x41, 0x32, 0x41, 0x41, 0x74, 0x36, 0x2f, 0x50, 0x34, 0x51, 0x63, + 0x41, 0x2f, 0x68, 0x51, 0x42, 0x2b, 0x62, 0x58, 0x78, 0x70, 0x41, 0x62, 0x51, 0x4c, 0x67, 0x4e, 0x4b, 0x76, + 0x2f, 0x5c, 0x0a, + 0x09, 0x65, 0x77, 0x6e, 0x42, 0x38, 0x44, 0x58, 0x59, 0x2f, 0x4e, 0x4b, 0x67, 0x36, 0x72, 0x59, 0x62, 0x63, + 0x42, 0x37, 0x68, 0x59, 0x4a, 0x35, 0x4f, 0x32, 0x34, 0x46, 0x62, 0x73, 0x66, 0x6d, 0x6c, 0x61, 0x48, 0x55, + 0x4c, 0x67, 0x49, 0x33, 0x41, 0x57, 0x52, 0x32, 0x50, 0x74, 0x77, 0x4b, 0x33, 0x41, 0x54, 0x2b, 0x43, 0x7a, + 0x53, 0x2f, 0x46, 0x71, 0x6b, 0x55, 0x41, 0x39, 0x46, 0x6e, 0x39, 0x2f, 0x78, 0x53, 0x34, 0x48, 0x66, 0x67, + 0x5a, 0x5c, 0x0a, + 0x09, 0x62, 0x48, 0x34, 0x70, 0x6a, 0x31, 0x6f, 0x45, 0x51, 0x47, 0x59, 0x42, 0x34, 0x63, 0x77, 0x39, 0x45, + 0x45, 0x37, 0x64, 0x64, 0x51, 0x66, 0x68, 0x62, 0x44, 0x34, 0x32, 0x76, 0x35, 0x52, 0x54, 0x6e, 0x51, 0x4a, + 0x67, 0x49, 0x32, 0x45, 0x58, 0x34, 0x47, 0x62, 0x43, 0x61, 0x76, 0x38, 0x78, 0x73, 0x50, 0x6d, 0x6c, 0x59, + 0x56, 0x54, 0x2b, 0x68, 0x43, 0x41, 0x64, 0x30, 0x2f, 0x2f, 0x33, 0x67, 0x54, 0x33, 0x41, 0x30, 0x33, 0x68, + 0x63, 0x5c, 0x0a, + 0x09, 0x76, 0x7a, 0x51, 0x53, 0x64, 0x5a, 0x6b, 0x42, 0x4c, 0x41, 0x61, 0x2b, 0x41, 0x70, 0x37, 0x45, 0x35, + 0x70, 0x64, 0x47, 0x70, 0x69, 0x34, 0x7a, 0x67, 0x44, 0x45, 0x36, 0x72, 0x72, 0x64, 0x6e, 0x38, 0x30, 0x75, + 0x6a, 0x55, 0x5a, 0x63, 0x44, 0x67, 0x56, 0x70, 0x67, 0x34, 0x30, 0x75, 0x6a, 0x56, 0x76, 0x6b, 0x5a, 0x67, + 0x4b, 0x54, 0x69, 0x31, 0x47, 0x55, 0x4e, 0x51, 0x46, 0x49, 0x42, 0x44, 0x41, 0x41, 0x70, 0x59, 0x51, 0x61, + 0x41, 0x5c, 0x0a, + 0x09, 0x6c, 0x44, 0x41, 0x44, 0x51, 0x45, 0x71, 0x59, 0x41, 0x53, 0x41, 0x6c, 0x7a, 0x41, 0x43, 0x51, 0x45, + 0x6d, 0x59, 0x41, 0x53, 0x41, 0x6b, 0x7a, 0x41, 0x4b, 0x53, 0x45, 0x47, 0x51, 0x42, 0x53, 0x77, 0x67, 0x77, + 0x41, 0x4b, 0x57, 0x45, 0x47, 0x67, 0x4a, 0x51, 0x77, 0x41, 0x30, 0x42, 0x4b, 0x6d, 0x41, 0x45, 0x67, 0x4a, + 0x63, 0x77, 0x41, 0x6b, 0x42, 0x4a, 0x6d, 0x41, 0x45, 0x67, 0x4a, 0x4d, 0x77, 0x43, 0x6b, 0x68, 0x42, 0x6b, + 0x41, 0x5c, 0x0a, + 0x09, 0x55, 0x73, 0x49, 0x4d, 0x41, 0x43, 0x6c, 0x68, 0x42, 0x6f, 0x43, 0x55, 0x4d, 0x41, 0x4e, 0x41, 0x53, + 0x70, 0x67, 0x42, 0x49, 0x43, 0x58, 0x4d, 0x41, 0x4a, 0x41, 0x53, 0x5a, 0x67, 0x42, 0x49, 0x43, 0x54, 0x4d, + 0x41, 0x70, 0x49, 0x51, 0x5a, 0x41, 0x46, 0x4c, 0x43, 0x44, 0x41, 0x41, 0x70, 0x59, 0x51, 0x61, 0x41, 0x6c, + 0x44, 0x41, 0x44, 0x51, 0x45, 0x71, 0x59, 0x41, 0x53, 0x41, 0x6c, 0x7a, 0x41, 0x43, 0x51, 0x45, 0x6d, 0x59, + 0x41, 0x5c, 0x0a, + 0x09, 0x53, 0x41, 0x6b, 0x7a, 0x41, 0x4b, 0x53, 0x45, 0x47, 0x51, 0x42, 0x53, 0x77, 0x67, 0x77, 0x41, 0x4b, + 0x57, 0x45, 0x47, 0x67, 0x4a, 0x51, 0x77, 0x41, 0x30, 0x42, 0x4b, 0x6d, 0x41, 0x45, 0x67, 0x4a, 0x63, 0x77, + 0x41, 0x6b, 0x42, 0x4a, 0x6d, 0x41, 0x45, 0x67, 0x4a, 0x4d, 0x77, 0x43, 0x6b, 0x68, 0x42, 0x6b, 0x41, 0x55, + 0x73, 0x49, 0x4d, 0x41, 0x43, 0x6c, 0x68, 0x42, 0x6f, 0x43, 0x55, 0x4d, 0x41, 0x4e, 0x41, 0x53, 0x70, 0x67, + 0x42, 0x5c, 0x0a, + 0x09, 0x49, 0x43, 0x58, 0x4d, 0x41, 0x4a, 0x41, 0x53, 0x5a, 0x67, 0x42, 0x49, 0x43, 0x54, 0x4d, 0x41, 0x70, + 0x49, 0x51, 0x5a, 0x41, 0x46, 0x4c, 0x43, 0x44, 0x41, 0x41, 0x70, 0x59, 0x66, 0x38, 0x44, 0x63, 0x44, 0x39, + 0x39, 0x47, 0x6c, 0x32, 0x37, 0x6b, 0x55, 0x6b, 0x41, 0x41, 0x41, 0x41, 0x41, 0x53, 0x55, 0x56, 0x4f, 0x52, + 0x4b, 0x35, 0x43, 0x59, 0x49, 0x49, 0x3d, 0x5c, 0x0a, + 0x09, 0x22, 0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x5f, 0x70, + 0x6e, 0x67, 0x20, 0x3d, 0x0a, + 0x09, 0x22, 0x69, 0x56, 0x42, 0x4f, 0x52, 0x77, 0x30, 0x4b, 0x47, 0x67, 0x6f, 0x41, 0x41, 0x41, 0x41, 0x4e, + 0x53, 0x55, 0x68, 0x45, 0x55, 0x67, 0x41, 0x41, 0x41, 0x51, 0x41, 0x41, 0x41, 0x41, 0x45, 0x41, 0x43, 0x41, + 0x59, 0x41, 0x41, 0x41, 0x42, 0x63, 0x63, 0x71, 0x68, 0x6d, 0x41, 0x41, 0x41, 0x67, 0x41, 0x45, 0x6c, 0x45, + 0x51, 0x56, 0x52, 0x34, 0x6e, 0x4f, 0x79, 0x39, 0x65, 0x62, 0x77, 0x6c, 0x56, 0x31, 0x55, 0x76, 0x2f, 0x6c, + 0x31, 0x56, 0x5c, 0x0a, + 0x09, 0x5a, 0x37, 0x68, 0x44, 0x39, 0x37, 0x33, 0x64, 0x6e, 0x52, 0x34, 0x79, 0x64, 0x79, 0x66, 0x64, 0x68, + 0x42, 0x41, 0x79, 0x51, 0x42, 0x42, 0x4d, 0x43, 0x43, 0x42, 0x44, 0x6e, 0x67, 0x4a, 0x52, 0x47, 0x63, 0x57, + 0x66, 0x54, 0x31, 0x51, 0x45, 0x55, 0x51, 0x48, 0x31, 0x5a, 0x2b, 0x43, 0x4a, 0x67, 0x6b, 0x39, 0x42, 0x48, + 0x6a, 0x6a, 0x41, 0x38, 0x34, 0x47, 0x41, 0x54, 0x49, 0x72, 0x54, 0x44, 0x35, 0x2b, 0x6f, 0x50, 0x50, 0x7a, + 0x4a, 0x5c, 0x0a, + 0x09, 0x45, 0x30, 0x55, 0x68, 0x41, 0x57, 0x51, 0x4d, 0x49, 0x43, 0x52, 0x6b, 0x41, 0x45, 0x4a, 0x43, 0x35, + 0x6e, 0x6e, 0x6f, 0x76, 0x74, 0x31, 0x33, 0x50, 0x50, 0x64, 0x55, 0x37, 0x66, 0x66, 0x48, 0x72, 0x72, 0x31, + 0x72, 0x72, 0x62, 0x56, 0x58, 0x6e, 0x64, 0x76, 0x45, 0x4f, 0x2f, 0x54, 0x7a, 0x31, 0x75, 0x72, 0x50, 0x37, + 0x56, 0x4f, 0x6e, 0x61, 0x67, 0x39, 0x72, 0x72, 0x2b, 0x47, 0x37, 0x31, 0x74, 0x36, 0x31, 0x71, 0x77, 0x34, + 0x35, 0x5c, 0x0a, + 0x09, 0x35, 0x39, 0x42, 0x53, 0x53, 0x79, 0x31, 0x74, 0x54, 0x73, 0x6f, 0x32, 0x6d, 0x6f, 0x47, 0x57, 0x57, + 0x6d, 0x70, 0x70, 0x34, 0x36, 0x67, 0x46, 0x67, 0x4a, 0x5a, 0x61, 0x32, 0x73, 0x54, 0x55, 0x41, 0x6b, 0x42, + 0x4c, 0x4c, 0x57, 0x31, 0x69, 0x61, 0x67, 0x47, 0x67, 0x70, 0x5a, 0x59, 0x32, 0x4d, 0x62, 0x55, 0x41, 0x30, + 0x46, 0x4a, 0x4c, 0x6d, 0x35, 0x68, 0x61, 0x41, 0x47, 0x69, 0x70, 0x70, 0x55, 0x31, 0x4d, 0x4c, 0x51, 0x43, + 0x30, 0x5c, 0x0a, + 0x09, 0x31, 0x4e, 0x49, 0x6d, 0x70, 0x68, 0x59, 0x41, 0x57, 0x6d, 0x70, 0x70, 0x45, 0x31, 0x4d, 0x4c, 0x41, + 0x43, 0x32, 0x31, 0x74, 0x49, 0x6d, 0x70, 0x42, 0x59, 0x43, 0x57, 0x57, 0x74, 0x72, 0x45, 0x31, 0x41, 0x4a, + 0x41, 0x53, 0x79, 0x31, 0x74, 0x59, 0x6d, 0x6f, 0x42, 0x6f, 0x4b, 0x57, 0x57, 0x4e, 0x6a, 0x47, 0x31, 0x41, + 0x4e, 0x42, 0x53, 0x53, 0x35, 0x75, 0x59, 0x57, 0x67, 0x42, 0x6f, 0x71, 0x61, 0x56, 0x4e, 0x54, 0x43, 0x30, + 0x41, 0x5c, 0x0a, + 0x09, 0x74, 0x4e, 0x54, 0x53, 0x4a, 0x71, 0x59, 0x57, 0x41, 0x46, 0x70, 0x71, 0x61, 0x52, 0x4e, 0x54, 0x43, + 0x77, 0x41, 0x74, 0x74, 0x62, 0x53, 0x4a, 0x71, 0x51, 0x57, 0x41, 0x6c, 0x6c, 0x72, 0x61, 0x78, 0x4e, 0x51, + 0x43, 0x51, 0x45, 0x73, 0x74, 0x62, 0x57, 0x4a, 0x71, 0x41, 0x61, 0x43, 0x6c, 0x6c, 0x6a, 0x59, 0x78, 0x74, + 0x51, 0x44, 0x51, 0x55, 0x6b, 0x75, 0x62, 0x6d, 0x46, 0x6f, 0x41, 0x61, 0x4b, 0x6d, 0x6c, 0x54, 0x55, 0x77, + 0x74, 0x5c, 0x0a, + 0x09, 0x41, 0x4c, 0x54, 0x55, 0x30, 0x69, 0x61, 0x6d, 0x46, 0x67, 0x42, 0x61, 0x61, 0x6d, 0x6b, 0x54, 0x55, + 0x77, 0x73, 0x41, 0x4c, 0x62, 0x57, 0x30, 0x69, 0x61, 0x6b, 0x46, 0x67, 0x4a, 0x5a, 0x61, 0x32, 0x73, 0x54, + 0x55, 0x41, 0x6b, 0x42, 0x4c, 0x4c, 0x57, 0x31, 0x69, 0x61, 0x67, 0x47, 0x67, 0x70, 0x5a, 0x59, 0x32, 0x4d, + 0x62, 0x55, 0x41, 0x30, 0x46, 0x4a, 0x4c, 0x6d, 0x35, 0x68, 0x61, 0x41, 0x47, 0x69, 0x70, 0x70, 0x55, 0x31, + 0x4d, 0x5c, 0x0a, + 0x09, 0x4c, 0x51, 0x43, 0x30, 0x31, 0x4e, 0x49, 0x6d, 0x70, 0x68, 0x59, 0x41, 0x57, 0x6d, 0x70, 0x70, 0x45, + 0x31, 0x4d, 0x4c, 0x41, 0x43, 0x32, 0x31, 0x74, 0x49, 0x6d, 0x70, 0x42, 0x59, 0x43, 0x57, 0x57, 0x74, 0x72, + 0x45, 0x31, 0x41, 0x4a, 0x41, 0x53, 0x79, 0x31, 0x74, 0x59, 0x6d, 0x6f, 0x42, 0x6f, 0x4b, 0x57, 0x57, 0x4e, + 0x6a, 0x47, 0x31, 0x41, 0x4e, 0x42, 0x53, 0x53, 0x35, 0x75, 0x59, 0x57, 0x67, 0x42, 0x6f, 0x71, 0x61, 0x56, + 0x4e, 0x5c, 0x0a, + 0x09, 0x54, 0x43, 0x30, 0x41, 0x74, 0x4e, 0x54, 0x53, 0x4a, 0x71, 0x59, 0x57, 0x41, 0x46, 0x70, 0x71, 0x61, + 0x52, 0x4e, 0x54, 0x43, 0x77, 0x41, 0x74, 0x74, 0x62, 0x53, 0x4a, 0x71, 0x51, 0x57, 0x41, 0x6c, 0x6c, 0x72, + 0x61, 0x78, 0x4e, 0x51, 0x43, 0x51, 0x45, 0x73, 0x74, 0x62, 0x57, 0x4a, 0x71, 0x41, 0x61, 0x43, 0x6c, 0x6c, + 0x6a, 0x59, 0x78, 0x74, 0x51, 0x44, 0x51, 0x55, 0x6b, 0x75, 0x62, 0x6d, 0x46, 0x6f, 0x41, 0x61, 0x4b, 0x6d, + 0x6c, 0x5c, 0x0a, + 0x09, 0x54, 0x55, 0x77, 0x74, 0x41, 0x4c, 0x54, 0x55, 0x30, 0x69, 0x61, 0x6d, 0x46, 0x67, 0x42, 0x61, 0x61, + 0x6d, 0x6b, 0x54, 0x55, 0x32, 0x65, 0x6a, 0x47, 0x57, 0x69, 0x70, 0x70, 0x66, 0x38, 0x6f, 0x74, 0x48, 0x2f, + 0x66, 0x76, 0x6e, 0x68, 0x4d, 0x49, 0x41, 0x44, 0x41, 0x44, 0x54, 0x66, 0x66, 0x74, 0x45, 0x48, 0x63, 0x48, + 0x42, 0x32, 0x31, 0x47, 0x55, 0x42, 0x4c, 0x4c, 0x61, 0x30, 0x75, 0x50, 0x59, 0x74, 0x41, 0x31, 0x77, 0x4f, + 0x59, 0x5c, 0x0a, + 0x09, 0x33, 0x6d, 0x68, 0x47, 0x6a, 0x6f, 0x5a, 0x61, 0x41, 0x47, 0x69, 0x70, 0x70, 0x56, 0x55, 0x67, 0x46, + 0x76, 0x31, 0x2f, 0x79, 0x6a, 0x6e, 0x33, 0x4d, 0x41, 0x43, 0x58, 0x4f, 0x6a, 0x67, 0x63, 0x32, 0x48, 0x66, + 0x61, 0x78, 0x6a, 0x46, 0x31, 0x46, 0x4e, 0x51, 0x43, 0x51, 0x45, 0x73, 0x74, 0x72, 0x52, 0x35, 0x31, 0x41, + 0x56, 0x77, 0x4d, 0x41, 0x68, 0x7a, 0x63, 0x79, 0x77, 0x6a, 0x55, 0x63, 0x33, 0x41, 0x62, 0x7a, 0x64, 0x4e, + 0x49, 0x5c, 0x0a, + 0x09, 0x61, 0x67, 0x47, 0x67, 0x70, 0x5a, 0x5a, 0x57, 0x67, 0x78, 0x78, 0x41, 0x6f, 0x4d, 0x66, 0x44, 0x59, + 0x57, 0x73, 0x31, 0x2f, 0x39, 0x2f, 0x74, 0x34, 0x48, 0x35, 0x67, 0x6f, 0x39, 0x6c, 0x61, 0x69, 0x56, 0x6f, + 0x41, 0x61, 0x4b, 0x6d, 0x6c, 0x56, 0x53, 0x4c, 0x6e, 0x33, 0x4e, 0x4f, 0x4a, 0x71, 0x50, 0x6f, 0x43, 0x45, + 0x4f, 0x67, 0x46, 0x63, 0x4d, 0x44, 0x2b, 0x76, 0x66, 0x73, 0x32, 0x6c, 0x4b, 0x39, 0x52, 0x31, 0x41, 0x4a, + 0x41, 0x5c, 0x0a, + 0x09, 0x53, 0x79, 0x33, 0x39, 0x4f, 0x79, 0x6e, 0x4d, 0x2f, 0x34, 0x6e, 0x6f, 0x6d, 0x63, 0x35, 0x56, 0x4b, + 0x62, 0x2f, 0x48, 0x67, 0x52, 0x2b, 0x47, 0x6e, 0x78, 0x59, 0x63, 0x73, 0x39, 0x51, 0x43, 0x51, 0x45, 0x73, + 0x74, 0x72, 0x51, 0x59, 0x52, 0x39, 0x6a, 0x75, 0x34, 0x63, 0x79, 0x76, 0x48, 0x42, 0x77, 0x41, 0x34, 0x75, + 0x43, 0x6b, 0x69, 0x75, 0x6d, 0x6a, 0x6a, 0x6d, 0x46, 0x71, 0x5a, 0x57, 0x67, 0x42, 0x6f, 0x71, 0x61, 0x56, + 0x56, 0x5c, 0x0a, + 0x09, 0x49, 0x41, 0x4c, 0x39, 0x69, 0x44, 0x6a, 0x68, 0x34, 0x6c, 0x36, 0x41, 0x5a, 0x38, 0x52, 0x70, 0x77, + 0x54, 0x46, 0x49, 0x4c, 0x51, 0x43, 0x30, 0x31, 0x4e, 0x4b, 0x2f, 0x67, 0x30, 0x4c, 0x36, 0x37, 0x2b, 0x42, + 0x2b, 0x42, 0x50, 0x42, 0x4f, 0x37, 0x2b, 0x42, 0x41, 0x52, 0x4b, 0x69, 0x6d, 0x41, 0x7a, 0x2f, 0x67, 0x34, + 0x4d, 0x51, 0x6d, 0x6f, 0x57, 0x4f, 0x4a, 0x57, 0x67, 0x42, 0x6f, 0x71, 0x61, 0x56, 0x2f, 0x50, 0x35, 0x30, + 0x44, 0x5c, 0x0a, + 0x09, 0x34, 0x48, 0x77, 0x34, 0x49, 0x4b, 0x34, 0x42, 0x41, 0x4b, 0x67, 0x69, 0x2f, 0x37, 0x6b, 0x41, 0x64, + 0x6d, 0x77, 0x51, 0x58, 0x79, 0x74, 0x53, 0x43, 0x77, 0x41, 0x74, 0x74, 0x66, 0x51, 0x51, 0x4b, 0x57, 0x7a, + 0x79, 0x49, 0x64, 0x41, 0x76, 0x45, 0x4d, 0x67, 0x37, 0x50, 0x41, 0x48, 0x68, 0x31, 0x72, 0x39, 0x7a, 0x44, + 0x67, 0x36, 0x4f, 0x41, 0x44, 0x78, 0x70, 0x77, 0x35, 0x68, 0x63, 0x67, 0x56, 0x6f, 0x41, 0x61, 0x4b, 0x6d, + 0x6c, 0x5c, 0x0a, + 0x09, 0x68, 0x30, 0x67, 0x4f, 0x44, 0x67, 0x54, 0x61, 0x42, 0x2b, 0x43, 0x6e, 0x6e, 0x58, 0x4d, 0x69, 0x2b, + 0x67, 0x4d, 0x41, 0x79, 0x45, 0x38, 0x4a, 0x43, 0x50, 0x52, 0x39, 0x36, 0x38, 0x2f, 0x64, 0x30, 0x56, 0x45, + 0x4c, 0x41, 0x43, 0x32, 0x31, 0x39, 0x42, 0x41, 0x6f, 0x52, 0x48, 0x38, 0x48, 0x39, 0x33, 0x62, 0x6e, 0x6e, + 0x4c, 0x2f, 0x56, 0x46, 0x39, 0x62, 0x36, 0x2f, 0x45, 0x37, 0x41, 0x63, 0x42, 0x30, 0x41, 0x6e, 0x67, 0x6a, + 0x67, 0x5c, 0x0a, + 0x09, 0x6d, 0x46, 0x77, 0x48, 0x61, 0x4a, 0x38, 0x47, 0x62, 0x4b, 0x6d, 0x6c, 0x37, 0x34, 0x4c, 0x55, 0x45, + 0x33, 0x2b, 0x76, 0x63, 0x6e, 0x41, 0x2f, 0x46, 0x4e, 0x4c, 0x2b, 0x73, 0x41, 0x42, 0x59, 0x58, 0x51, 0x50, + 0x67, 0x41, 0x63, 0x44, 0x42, 0x50, 0x52, 0x72, 0x2b, 0x34, 0x61, 0x43, 0x5a, 0x64, 0x57, 0x64, 0x34, 0x42, + 0x54, 0x6f, 0x6d, 0x41, 0x4f, 0x44, 0x41, 0x76, 0x74, 0x4f, 0x51, 0x37, 0x4a, 0x6d, 0x32, 0x74, 0x6c, 0x42, + 0x54, 0x5c, 0x0a, + 0x09, 0x77, 0x7a, 0x57, 0x71, 0x42, 0x51, 0x34, 0x63, 0x2b, 0x34, 0x39, 0x67, 0x74, 0x76, 0x52, 0x2f, 0x4a, + 0x37, 0x45, 0x48, 0x65, 0x77, 0x6a, 0x41, 0x71, 0x78, 0x7a, 0x63, 0x57, 0x2b, 0x41, 0x51, 0x37, 0x62, 0x4b, + 0x61, 0x45, 0x73, 0x54, 0x79, 0x44, 0x41, 0x77, 0x79, 0x41, 0x45, 0x39, 0x30, 0x63, 0x50, 0x2b, 0x77, 0x6a, + 0x75, 0x77, 0x65, 0x46, 0x52, 0x30, 0x54, 0x41, 0x46, 0x41, 0x4a, 0x37, 0x71, 0x63, 0x64, 0x33, 0x48, 0x6b, + 0x45, 0x5c, 0x0a, + 0x09, 0x6d, 0x6e, 0x56, 0x77, 0x51, 0x79, 0x49, 0x36, 0x37, 0x4a, 0x77, 0x72, 0x51, 0x54, 0x67, 0x45, 0x68, + 0x77, 0x4b, 0x45, 0x49, 0x77, 0x52, 0x61, 0x42, 0x6a, 0x44, 0x6e, 0x79, 0x43, 0x33, 0x43, 0x59, 0x52, 0x48, + 0x41, 0x50, 0x41, 0x67, 0x44, 0x41, 0x73, 0x30, 0x43, 0x47, 0x41, 0x4b, 0x59, 0x63, 0x58, 0x42, 0x4f, 0x70, + 0x31, 0x6f, 0x52, 0x6a, 0x66, 0x6b, 0x63, 0x6a, 0x64, 0x2b, 0x61, 0x64, 0x62, 0x44, 0x50, 0x4b, 0x2b, 0x49, + 0x49, 0x5c, 0x0a, + 0x09, 0x62, 0x37, 0x55, 0x50, 0x74, 0x4f, 0x44, 0x7a, 0x48, 0x34, 0x30, 0x4d, 0x57, 0x33, 0x6f, 0x34, 0x67, + 0x4c, 0x63, 0x36, 0x35, 0x35, 0x35, 0x42, 0x52, 0x48, 0x44, 0x6b, 0x2b, 0x44, 0x56, 0x76, 0x48, 0x79, 0x36, + 0x65, 0x34, 0x50, 0x51, 0x45, 0x41, 0x4d, 0x63, 0x63, 0x41, 0x46, 0x43, 0x79, 0x63, 0x4c, 0x48, 0x4f, 0x78, + 0x4b, 0x4c, 0x2f, 0x31, 0x51, 0x51, 0x36, 0x4f, 0x36, 0x42, 0x6f, 0x2f, 0x48, 0x54, 0x56, 0x50, 0x56, 0x55, + 0x6d, 0x5c, 0x0a, + 0x09, 0x57, 0x4c, 0x36, 0x78, 0x49, 0x6a, 0x71, 0x6b, 0x51, 0x31, 0x30, 0x4f, 0x6d, 0x43, 0x48, 0x51, 0x30, + 0x4d, 0x48, 0x4e, 0x45, 0x6d, 0x67, 0x41, 0x59, 0x42, 0x37, 0x41, 0x45, 0x6f, 0x41, 0x46, 0x35, 0x39, 0x77, + 0x53, 0x43, 0x41, 0x76, 0x68, 0x4f, 0x34, 0x41, 0x6c, 0x41, 0x69, 0x30, 0x34, 0x35, 0x35, 0x61, 0x49, 0x61, + 0x41, 0x48, 0x41, 0x77, 0x4d, 0x48, 0x4e, 0x45, 0x79, 0x6a, 0x35, 0x72, 0x4e, 0x70, 0x70, 0x4f, 0x6c, 0x38, + 0x34, 0x5c, 0x0a, + 0x09, 0x75, 0x43, 0x4d, 0x6a, 0x42, 0x39, 0x73, 0x45, 0x4e, 0x4e, 0x2b, 0x4e, 0x43, 0x69, 0x79, 0x41, 0x4f, + 0x6f, 0x70, 0x32, 0x62, 0x37, 0x7a, 0x6c, 0x35, 0x75, 0x2b, 0x69, 0x6b, 0x38, 0x31, 0x4a, 0x30, 0x64, 0x6c, + 0x54, 0x65, 0x55, 0x34, 0x41, 0x65, 0x41, 0x61, 0x41, 0x6e, 0x77, 0x54, 0x77, 0x51, 0x2f, 0x34, 0x32, 0x76, + 0x33, 0x4a, 0x32, 0x49, 0x4e, 0x37, 0x37, 0x5a, 0x33, 0x62, 0x49, 0x70, 0x77, 0x4b, 0x66, 0x68, 0x73, 0x4f, + 0x54, 0x5c, 0x0a, + 0x09, 0x69, 0x65, 0x69, 0x59, 0x43, 0x68, 0x49, 0x62, 0x6e, 0x67, 0x46, 0x55, 0x6a, 0x6a, 0x34, 0x4f, 0x34, + 0x42, 0x48, 0x63, 0x2b, 0x51, 0x50, 0x46, 0x44, 0x52, 0x57, 0x45, 0x78, 0x75, 0x67, 0x73, 0x36, 0x6e, 0x67, + 0x67, 0x6d, 0x4b, 0x36, 0x4f, 0x6a, 0x77, 0x73, 0x4c, 0x4d, 0x6e, 0x79, 0x44, 0x52, 0x75, 0x79, 0x37, 0x61, + 0x6a, 0x64, 0x75, 0x33, 0x4b, 0x67, 0x55, 0x79, 0x76, 0x76, 0x6b, 0x51, 0x42, 0x54, 0x36, 0x31, 0x38, 0x44, + 0x45, 0x5c, 0x0a, + 0x09, 0x41, 0x61, 0x73, 0x61, 0x30, 0x32, 0x45, 0x41, 0x6a, 0x6b, 0x42, 0x7a, 0x41, 0x4a, 0x59, 0x64, 0x33, + 0x43, 0x4b, 0x41, 0x52, 0x53, 0x49, 0x61, 0x4f, 0x75, 0x64, 0x6d, 0x71, 0x32, 0x4b, 0x48, 0x4b, 0x6a, 0x5a, + 0x6d, 0x51, 0x52, 0x6a, 0x43, 0x59, 0x52, 0x47, 0x45, 0x52, 0x51, 0x42, 0x44, 0x4f, 0x4d, 0x77, 0x53, 0x6b, + 0x58, 0x50, 0x4f, 0x7a, 0x56, 0x54, 0x54, 0x6d, 0x79, 0x50, 0x4f, 0x75, 0x51, 0x4b, 0x45, 0x42, 0x51, 0x49, + 0x74, 0x5c, 0x0a, + 0x09, 0x4f, 0x62, 0x69, 0x43, 0x51, 0x45, 0x65, 0x71, 0x4d, 0x66, 0x74, 0x36, 0x50, 0x68, 0x55, 0x39, 0x41, + 0x71, 0x44, 0x77, 0x55, 0x73, 0x42, 0x4d, 0x4e, 0x54, 0x63, 0x64, 0x41, 0x4a, 0x6a, 0x66, 0x76, 0x32, 0x2b, + 0x66, 0x6e, 0x51, 0x6d, 0x4e, 0x6f, 0x71, 0x5a, 0x73, 0x36, 0x47, 0x67, 0x79, 0x4a, 0x71, 0x75, 0x4d, 0x63, + 0x53, 0x37, 0x4a, 0x71, 0x6f, 0x34, 0x79, 0x47, 0x30, 0x76, 0x4b, 0x41, 0x6e, 0x7a, 0x7a, 0x54, 0x58, 0x4f, + 0x2f, 0x5c, 0x0a, + 0x09, 0x6d, 0x67, 0x69, 0x36, 0x7a, 0x35, 0x79, 0x49, 0x48, 0x75, 0x36, 0x63, 0x4f, 0x77, 0x2b, 0x45, 0x52, + 0x77, 0x48, 0x34, 0x58, 0x67, 0x49, 0x39, 0x33, 0x73, 0x46, 0x31, 0x49, 0x36, 0x39, 0x55, 0x32, 0x30, 0x36, + 0x77, 0x70, 0x32, 0x71, 0x75, 0x37, 0x34, 0x2f, 0x44, 0x4e, 0x57, 0x6d, 0x58, 0x6a, 0x79, 0x57, 0x69, 0x33, + 0x4d, 0x45, 0x56, 0x4b, 0x34, 0x78, 0x71, 0x58, 0x57, 0x6e, 0x44, 0x41, 0x51, 0x41, 0x41, 0x48, 0x4e, 0x79, + 0x35, 0x5c, 0x0a, + 0x09, 0x41, 0x48, 0x4c, 0x74, 0x57, 0x41, 0x49, 0x49, 0x6d, 0x50, 0x45, 0x47, 0x4a, 0x56, 0x53, 0x33, 0x57, + 0x45, 0x52, 0x62, 0x59, 0x74, 0x73, 0x6c, 0x63, 0x2b, 0x44, 0x51, 0x52, 0x6a, 0x41, 0x51, 0x49, 0x68, 0x4c, + 0x4b, 0x45, 0x2f, 0x77, 0x77, 0x42, 0x59, 0x62, 0x76, 0x75, 0x71, 0x77, 0x46, 0x45, 0x75, 0x7a, 0x36, 0x56, + 0x46, 0x56, 0x76, 0x6d, 0x6f, 0x69, 0x69, 0x49, 0x58, 0x43, 0x2b, 0x51, 0x31, 0x6b, 0x4f, 0x4c, 0x76, 0x45, + 0x38, 0x5c, 0x0a, + 0x09, 0x31, 0x58, 0x30, 0x59, 0x73, 0x75, 0x4a, 0x66, 0x61, 0x72, 0x35, 0x49, 0x7a, 0x54, 0x38, 0x44, 0x7a, + 0x35, 0x4b, 0x2f, 0x65, 0x51, 0x44, 0x4c, 0x46, 0x65, 0x38, 0x7a, 0x46, 0x63, 0x67, 0x4d, 0x41, 0x63, 0x78, + 0x57, 0x35, 0x30, 0x4a, 0x6d, 0x42, 0x43, 0x49, 0x36, 0x41, 0x70, 0x2f, 0x56, 0x6c, 0x41, 0x41, 0x4f, 0x52, + 0x2f, 0x6d, 0x68, 0x79, 0x71, 0x44, 0x71, 0x75, 0x65, 0x38, 0x79, 0x67, 0x44, 0x6b, 0x32, 0x4a, 0x6c, 0x2b, + 0x65, 0x5c, 0x0a, + 0x09, 0x61, 0x76, 0x34, 0x63, 0x33, 0x41, 0x77, 0x41, 0x78, 0x32, 0x51, 0x32, 0x43, 0x32, 0x44, 0x49, 0x39, + 0x4c, 0x4c, 0x67, 0x34, 0x4a, 0x59, 0x49, 0x46, 0x4a, 0x32, 0x4c, 0x52, 0x31, 0x48, 0x65, 0x68, 0x34, 0x69, + 0x73, 0x77, 0x52, 0x47, 0x42, 0x6a, 0x49, 0x69, 0x6d, 0x74, 0x46, 0x34, 0x71, 0x36, 0x68, 0x4c, 0x52, 0x70, + 0x48, 0x4f, 0x75, 0x43, 0x38, 0x49, 0x6b, 0x48, 0x4d, 0x4a, 0x6e, 0x68, 0x34, 0x69, 0x32, 0x4f, 0x4c, 0x68, + 0x70, 0x5c, 0x0a, + 0x09, 0x45, 0x4c, 0x62, 0x42, 0x34, 0x58, 0x67, 0x69, 0x4f, 0x74, 0x6b, 0x35, 0x64, 0x38, 0x43, 0x52, 0x47, + 0x2b, 0x4d, 0x79, 0x35, 0x72, 0x4c, 0x6c, 0x49, 0x4d, 0x41, 0x70, 0x79, 0x6a, 0x36, 0x73, 0x42, 0x7a, 0x68, + 0x6d, 0x76, 0x7a, 0x35, 0x34, 0x54, 0x54, 0x69, 0x34, 0x73, 0x77, 0x46, 0x63, 0x6c, 0x53, 0x68, 0x31, 0x41, + 0x2b, 0x6d, 0x59, 0x41, 0x41, 0x41, 0x43, 0x50, 0x64, 0x72, 0x42, 0x53, 0x63, 0x56, 0x56, 0x42, 0x6b, 0x62, + 0x77, 0x5c, 0x0a, + 0x09, 0x38, 0x79, 0x79, 0x52, 0x42, 0x66, 0x41, 0x56, 0x31, 0x31, 0x44, 0x4f, 0x53, 0x4d, 0x6d, 0x34, 0x4d, + 0x71, 0x4a, 0x2b, 0x79, 0x48, 0x41, 0x53, 0x64, 0x73, 0x79, 0x56, 0x7a, 0x63, 0x46, 0x43, 0x74, 0x36, 0x4f, + 0x7a, 0x42, 0x75, 0x37, 0x63, 0x30, 0x65, 0x47, 0x59, 0x38, 0x79, 0x6d, 0x41, 0x6b, 0x47, 0x4e, 0x4d, 0x6a, + 0x54, 0x61, 0x4a, 0x49, 0x69, 0x4c, 0x62, 0x4d, 0x4b, 0x4a, 0x50, 0x35, 0x49, 0x6b, 0x5a, 0x49, 0x73, 0x2b, + 0x4b, 0x5c, 0x0a, + 0x09, 0x71, 0x74, 0x4d, 0x54, 0x4c, 0x4d, 0x75, 0x5a, 0x44, 0x6d, 0x4d, 0x4c, 0x73, 0x75, 0x64, 0x39, 0x36, + 0x50, 0x48, 0x47, 0x66, 0x68, 0x6a, 0x50, 0x6a, 0x52, 0x51, 0x63, 0x6e, 0x35, 0x79, 0x6f, 0x45, 0x39, 0x74, + 0x7a, 0x6b, 0x6e, 0x64, 0x72, 0x34, 0x55, 0x7a, 0x49, 0x78, 0x77, 0x42, 0x4a, 0x72, 0x67, 0x50, 0x65, 0x6a, + 0x75, 0x57, 0x63, 0x51, 0x52, 0x34, 0x43, 0x51, 0x48, 0x69, 0x36, 0x37, 0x74, 0x49, 0x36, 0x2f, 0x4c, 0x72, + 0x6d, 0x5c, 0x0a, + 0x09, 0x30, 0x35, 0x79, 0x61, 0x57, 0x76, 0x55, 0x5a, 0x57, 0x46, 0x58, 0x6c, 0x4c, 0x33, 0x44, 0x4f, 0x48, + 0x56, 0x4d, 0x41, 0x63, 0x4b, 0x7a, 0x73, 0x41, 0x33, 0x68, 0x4d, 0x6f, 0x32, 0x4b, 0x64, 0x45, 0x77, 0x61, + 0x54, 0x4f, 0x42, 0x59, 0x7a, 0x78, 0x48, 0x41, 0x74, 0x52, 0x50, 0x66, 0x34, 0x6a, 0x36, 0x6a, 0x65, 0x6e, + 0x56, 0x55, 0x5a, 0x4f, 0x30, 0x2f, 0x6c, 0x51, 0x68, 0x6d, 0x65, 0x50, 0x6e, 0x4c, 0x41, 0x34, 0x55, 0x59, + 0x54, 0x5c, 0x0a, + 0x09, 0x32, 0x71, 0x6a, 0x42, 0x6e, 0x55, 0x51, 0x36, 0x79, 0x38, 0x63, 0x51, 0x32, 0x6b, 0x73, 0x79, 0x44, + 0x4f, 0x35, 0x77, 0x69, 0x70, 0x66, 0x41, 0x44, 0x32, 0x2f, 0x50, 0x6e, 0x42, 0x61, 0x70, 0x4e, 0x68, 0x4d, + 0x6e, 0x63, 0x69, 0x78, 0x44, 0x49, 0x6c, 0x6e, 0x4f, 0x64, 0x46, 0x35, 0x31, 0x53, 0x6d, 0x64, 0x5a, 0x6b, + 0x5a, 0x63, 0x52, 0x6a, 0x68, 0x39, 0x30, 0x6c, 0x66, 0x42, 0x41, 0x4a, 0x44, 0x36, 0x35, 0x54, 0x43, 0x4c, + 0x66, 0x5c, 0x0a, + 0x09, 0x59, 0x54, 0x6a, 0x4f, 0x48, 0x6c, 0x2b, 0x55, 0x47, 0x35, 0x4d, 0x72, 0x50, 0x36, 0x65, 0x4c, 0x4a, + 0x2b, 0x31, 0x43, 0x32, 0x6c, 0x55, 0x59, 0x53, 0x7a, 0x6a, 0x48, 0x77, 0x59, 0x50, 0x4c, 0x6d, 0x37, 0x66, + 0x50, 0x62, 0x55, 0x65, 0x33, 0x41, 0x34, 0x63, 0x34, 0x58, 0x6a, 0x36, 0x2b, 0x61, 0x43, 0x64, 0x65, 0x31, + 0x34, 0x39, 0x72, 0x46, 0x4e, 0x34, 0x47, 0x30, 0x59, 0x59, 0x43, 0x77, 0x50, 0x36, 0x39, 0x2b, 0x34, 0x4a, + 0x67, 0x5c, 0x0a, + 0x09, 0x48, 0x38, 0x55, 0x4e, 0x51, 0x69, 0x4f, 0x31, 0x6e, 0x6d, 0x73, 0x44, 0x38, 0x50, 0x57, 0x43, 0x4d, + 0x69, 0x43, 0x6e, 0x44, 0x4f, 0x45, 0x38, 0x4e, 0x78, 0x61, 0x74, 0x4d, 0x4f, 0x34, 0x63, 0x49, 0x6c, 0x56, + 0x7a, 0x64, 0x54, 0x62, 0x41, 0x2f, 0x31, 0x6e, 0x54, 0x6b, 0x64, 0x43, 0x58, 0x53, 0x53, 0x77, 0x71, 0x36, + 0x4e, 0x52, 0x56, 0x39, 0x4b, 0x76, 0x41, 0x49, 0x2f, 0x4a, 0x4a, 0x63, 0x6c, 0x36, 0x5a, 0x47, 0x44, 0x49, + 0x33, 0x5c, 0x0a, + 0x09, 0x4e, 0x49, 0x4f, 0x46, 0x43, 0x43, 0x34, 0x75, 0x58, 0x56, 0x63, 0x52, 0x36, 0x61, 0x6e, 0x46, 0x64, + 0x2f, 0x68, 0x30, 0x55, 0x70, 0x5a, 0x4a, 0x4f, 0x2b, 0x78, 0x66, 0x34, 0x4a, 0x6c, 0x2f, 0x61, 0x72, 0x43, + 0x49, 0x5a, 0x61, 0x6e, 0x75, 0x4a, 0x39, 0x45, 0x50, 0x72, 0x78, 0x4c, 0x30, 0x77, 0x65, 0x71, 0x49, 0x31, + 0x4e, 0x2f, 0x56, 0x66, 0x43, 0x62, 0x7a, 0x66, 0x30, 0x69, 0x77, 0x45, 0x39, 0x4d, 0x35, 0x35, 0x61, 0x51, + 0x36, 0x5c, 0x0a, + 0x09, 0x36, 0x2b, 0x44, 0x50, 0x39, 0x50, 0x4f, 0x4d, 0x69, 0x6f, 0x4d, 0x59, 0x6c, 0x32, 0x47, 0x30, 0x46, + 0x2f, 0x6b, 0x79, 0x6b, 0x47, 0x54, 0x73, 0x41, 0x43, 0x34, 0x45, 0x6a, 0x71, 0x30, 0x4e, 0x51, 0x63, 0x64, + 0x43, 0x42, 0x74, 0x41, 0x6c, 0x30, 0x4c, 0x6e, 0x68, 0x69, 0x31, 0x43, 0x69, 0x51, 0x32, 0x4a, 0x77, 0x38, + 0x53, 0x75, 0x66, 0x4b, 0x72, 0x42, 0x50, 0x45, 0x57, 0x6c, 0x34, 0x55, 0x38, 0x48, 0x51, 0x41, 0x6c, 0x67, + 0x77, 0x5c, 0x0a, + 0x09, 0x38, 0x49, 0x6a, 0x39, 0x4d, 0x4b, 0x66, 0x56, 0x6b, 0x55, 0x59, 0x72, 0x6c, 0x42, 0x75, 0x63, 0x42, + 0x68, 0x49, 0x64, 0x77, 0x51, 0x57, 0x66, 0x53, 0x4e, 0x4e, 0x4a, 0x31, 0x6f, 0x6d, 0x34, 0x72, 0x71, 0x2f, + 0x70, 0x71, 0x4b, 0x5a, 0x65, 0x50, 0x70, 0x48, 0x30, 0x41, 0x5a, 0x62, 0x42, 0x61, 0x50, 0x37, 0x46, 0x47, + 0x48, 0x6e, 0x55, 0x5a, 0x75, 0x50, 0x6a, 0x52, 0x68, 0x33, 0x54, 0x63, 0x45, 0x73, 0x57, 0x71, 0x41, 0x46, + 0x61, 0x5c, 0x0a, + 0x09, 0x33, 0x36, 0x45, 0x78, 0x6e, 0x59, 0x7a, 0x78, 0x7a, 0x4f, 0x55, 0x6f, 0x2b, 0x47, 0x54, 0x4f, 0x4c, + 0x6b, 0x43, 0x54, 0x5a, 0x57, 0x7a, 0x67, 0x30, 0x79, 0x41, 0x47, 0x32, 0x68, 0x5a, 0x70, 0x2f, 0x69, 0x49, + 0x51, 0x36, 0x4c, 0x46, 0x58, 0x4d, 0x74, 0x50, 0x79, 0x31, 0x30, 0x47, 0x47, 0x5a, 0x35, 0x58, 0x57, 0x74, + 0x46, 0x4a, 0x6e, 0x6c, 0x68, 0x58, 0x2f, 0x5a, 0x34, 0x4c, 0x38, 0x2b, 0x74, 0x43, 0x78, 0x51, 0x68, 0x73, + 0x4f, 0x5c, 0x0a, + 0x09, 0x41, 0x45, 0x52, 0x30, 0x46, 0x6f, 0x41, 0x65, 0x52, 0x31, 0x71, 0x4e, 0x77, 0x50, 0x47, 0x37, 0x55, + 0x39, 0x45, 0x62, 0x64, 0x70, 0x53, 0x70, 0x47, 0x34, 0x65, 0x4d, 0x53, 0x67, 0x6f, 0x6b, 0x51, 0x76, 0x6d, + 0x6f, 0x7a, 0x42, 0x42, 0x6c, 0x2b, 0x48, 0x66, 0x57, 0x70, 0x67, 0x61, 0x6a, 0x6d, 0x4a, 0x30, 0x77, 0x2f, + 0x72, 0x67, 0x68, 0x69, 0x58, 0x6f, 0x38, 0x30, 0x33, 0x44, 0x79, 0x47, 0x68, 0x38, 0x6a, 0x6a, 0x31, 0x44, + 0x57, 0x5c, 0x0a, + 0x09, 0x6d, 0x45, 0x52, 0x62, 0x41, 0x52, 0x51, 0x30, 0x4b, 0x41, 0x5a, 0x5a, 0x61, 0x52, 0x41, 0x4a, 0x78, + 0x55, 0x6a, 0x4b, 0x7a, 0x38, 0x71, 0x49, 0x72, 0x49, 0x7a, 0x48, 0x57, 0x76, 0x45, 0x32, 0x2b, 0x57, 0x50, + 0x31, 0x72, 0x4f, 0x79, 0x4a, 0x38, 0x38, 0x58, 0x6e, 0x32, 0x61, 0x4a, 0x74, 0x79, 0x34, 0x2b, 0x35, 0x54, + 0x74, 0x4b, 0x6e, 0x37, 0x6b, 0x62, 0x79, 0x4a, 0x57, 0x54, 0x4f, 0x2b, 0x2b, 0x54, 0x4f, 0x7a, 0x75, 0x78, + 0x44, 0x5c, 0x0a, + 0x09, 0x5a, 0x35, 0x41, 0x61, 0x33, 0x45, 0x57, 0x2f, 0x54, 0x75, 0x6f, 0x35, 0x64, 0x73, 0x6d, 0x79, 0x6d, + 0x77, 0x70, 0x6f, 0x69, 0x55, 0x44, 0x66, 0x59, 0x34, 0x78, 0x73, 0x77, 0x32, 0x6a, 0x44, 0x41, 0x51, 0x44, + 0x41, 0x59, 0x2f, 0x53, 0x4a, 0x42, 0x4d, 0x6c, 0x46, 0x49, 0x47, 0x55, 0x70, 0x71, 0x62, 0x45, 0x34, 0x78, + 0x38, 0x76, 0x46, 0x4b, 0x4f, 0x4a, 0x50, 0x4a, 0x4d, 0x71, 0x4a, 0x42, 0x73, 0x6f, 0x4d, 0x51, 0x73, 0x77, + 0x2f, 0x5c, 0x0a, + 0x09, 0x6b, 0x36, 0x43, 0x56, 0x70, 0x74, 0x30, 0x52, 0x43, 0x49, 0x4b, 0x54, 0x67, 0x4a, 0x49, 0x73, 0x68, + 0x6e, 0x38, 0x4b, 0x77, 0x47, 0x46, 0x74, 0x52, 0x6d, 0x66, 0x47, 0x43, 0x69, 0x6d, 0x36, 0x49, 0x6a, 0x30, + 0x66, 0x6a, 0x56, 0x47, 0x55, 0x4f, 0x62, 0x49, 0x77, 0x61, 0x4f, 0x59, 0x45, 0x63, 0x53, 0x79, 0x73, 0x54, + 0x77, 0x74, 0x38, 0x42, 0x4a, 0x41, 0x5a, 0x36, 0x61, 0x30, 0x41, 0x6d, 0x70, 0x43, 0x57, 0x73, 0x7a, 0x37, + 0x45, 0x5c, 0x0a, + 0x09, 0x4f, 0x42, 0x76, 0x47, 0x6c, 0x2f, 0x54, 0x4e, 0x6e, 0x5a, 0x47, 0x74, 0x6b, 0x38, 0x54, 0x7a, 0x56, + 0x47, 0x64, 0x75, 0x2b, 0x70, 0x6f, 0x59, 0x46, 0x77, 0x50, 0x6b, 0x79, 0x41, 0x75, 0x37, 0x79, 0x36, 0x51, + 0x6a, 0x65, 0x7a, 0x49, 0x6d, 0x6c, 0x58, 0x6e, 0x70, 0x31, 0x44, 0x2f, 0x79, 0x45, 0x73, 0x62, 0x49, 0x77, + 0x56, 0x6a, 0x5a, 0x5a, 0x4e, 0x56, 0x76, 0x59, 0x75, 0x38, 0x62, 0x53, 0x52, 0x73, 0x4b, 0x41, 0x42, 0x55, + 0x79, 0x5c, 0x0a, + 0x09, 0x50, 0x74, 0x6f, 0x79, 0x68, 0x71, 0x52, 0x73, 0x70, 0x51, 0x78, 0x52, 0x4c, 0x6a, 0x79, 0x42, 0x52, + 0x61, 0x78, 0x4d, 0x51, 0x78, 0x54, 0x57, 0x61, 0x56, 0x72, 0x6f, 0x68, 0x36, 0x4e, 0x32, 0x45, 0x69, 0x30, + 0x4e, 0x55, 0x4c, 0x47, 0x69, 0x61, 0x6f, 0x77, 0x55, 0x49, 0x55, 0x58, 0x56, 0x43, 0x35, 0x42, 0x49, 0x4d, + 0x78, 0x66, 0x74, 0x38, 0x4c, 0x46, 0x39, 0x66, 0x6e, 0x74, 0x53, 0x70, 0x64, 0x7a, 0x38, 0x75, 0x33, 0x41, + 0x6f, 0x5c, 0x0a, + 0x09, 0x32, 0x4f, 0x65, 0x44, 0x73, 0x2b, 0x71, 0x73, 0x67, 0x6d, 0x63, 0x50, 0x6e, 0x42, 0x2f, 0x64, 0x68, + 0x2b, 0x55, 0x55, 0x79, 0x54, 0x46, 0x7a, 0x51, 0x6e, 0x46, 0x33, 0x77, 0x74, 0x57, 0x4f, 0x31, 0x73, 0x53, + 0x72, 0x50, 0x68, 0x66, 0x4c, 0x57, 0x6d, 0x6b, 0x35, 0x61, 0x68, 0x76, 0x67, 0x66, 0x59, 0x6c, 0x78, 0x36, + 0x7a, 0x45, 0x5a, 0x55, 0x35, 0x74, 0x51, 0x56, 0x32, 0x53, 0x52, 0x6f, 0x55, 0x2b, 0x64, 0x63, 0x57, 0x71, + 0x65, 0x5c, 0x0a, + 0x09, 0x2b, 0x54, 0x77, 0x66, 0x74, 0x55, 0x36, 0x74, 0x76, 0x51, 0x63, 0x38, 0x75, 0x41, 0x53, 0x39, 0x56, + 0x75, 0x30, 0x38, 0x35, 0x69, 0x69, 0x78, 0x66, 0x56, 0x31, 0x6f, 0x77, 0x77, 0x44, 0x67, 0x77, 0x4c, 0x37, + 0x54, 0x51, 0x45, 0x54, 0x49, 0x38, 0x6c, 0x7a, 0x63, 0x41, 0x51, 0x43, 0x51, 0x70, 0x47, 0x49, 0x51, 0x38, + 0x70, 0x56, 0x7a, 0x4c, 0x37, 0x37, 0x77, 0x49, 0x71, 0x59, 0x4b, 0x37, 0x42, 0x39, 0x58, 0x4f, 0x6c, 0x2b, + 0x77, 0x5c, 0x0a, + 0x09, 0x45, 0x61, 0x6b, 0x6f, 0x36, 0x79, 0x51, 0x34, 0x72, 0x70, 0x55, 0x2b, 0x78, 0x37, 0x49, 0x61, 0x4e, + 0x4b, 0x69, 0x75, 0x78, 0x39, 0x4e, 0x35, 0x55, 0x51, 0x59, 0x71, 0x4b, 0x68, 0x73, 0x4c, 0x6c, 0x4b, 0x45, + 0x4d, 0x42, 0x7a, 0x77, 0x75, 0x41, 0x79, 0x76, 0x36, 0x78, 0x73, 0x6a, 0x45, 0x6f, 0x68, 0x4e, 0x33, 0x6c, + 0x67, 0x68, 0x4d, 0x54, 0x48, 0x61, 0x78, 0x72, 0x77, 0x43, 0x69, 0x72, 0x75, 0x5a, 0x66, 0x38, 0x38, 0x36, + 0x6a, 0x5c, 0x0a, + 0x09, 0x4a, 0x49, 0x2b, 0x65, 0x59, 0x64, 0x77, 0x57, 0x58, 0x36, 0x46, 0x76, 0x6b, 0x65, 0x6f, 0x62, 0x38, + 0x6f, 0x78, 0x67, 0x77, 0x52, 0x32, 0x53, 0x6c, 0x50, 0x78, 0x5a, 0x56, 0x73, 0x48, 0x48, 0x70, 0x67, 0x47, + 0x66, 0x67, 0x35, 0x61, 0x70, 0x4f, 0x35, 0x34, 0x39, 0x4d, 0x46, 0x6e, 0x7a, 0x64, 0x72, 0x6d, 0x38, 0x6d, + 0x6a, 0x49, 0x59, 0x62, 0x6a, 0x4d, 0x63, 0x2b, 0x42, 0x4f, 0x67, 0x67, 0x62, 0x50, 0x47, 0x38, 0x52, 0x67, + 0x41, 0x5c, 0x0a, + 0x09, 0x78, 0x38, 0x77, 0x50, 0x68, 0x6d, 0x77, 0x59, 0x41, 0x50, 0x54, 0x48, 0x78, 0x75, 0x43, 0x63, 0x79, + 0x7a, 0x71, 0x64, 0x2f, 0x44, 0x48, 0x36, 0x31, 0x6b, 0x70, 0x79, 0x37, 0x31, 0x55, 0x5a, 0x6b, 0x33, 0x55, + 0x37, 0x43, 0x63, 0x54, 0x2b, 0x55, 0x43, 0x74, 0x48, 0x4b, 0x30, 0x58, 0x55, 0x71, 0x53, 0x2b, 0x6f, 0x72, + 0x37, 0x62, 0x79, 0x6d, 0x79, 0x4b, 0x2f, 0x64, 0x70, 0x4c, 0x49, 0x4f, 0x37, 0x76, 0x48, 0x62, 0x68, 0x4c, + 0x5a, 0x5c, 0x0a, + 0x09, 0x42, 0x73, 0x6a, 0x37, 0x30, 0x30, 0x35, 0x68, 0x70, 0x61, 0x74, 0x52, 0x5a, 0x68, 0x5a, 0x65, 0x4d, + 0x61, 0x50, 0x6e, 0x42, 0x69, 0x6d, 0x63, 0x52, 0x64, 0x58, 0x6c, 0x44, 0x69, 0x62, 0x36, 0x61, 0x70, 0x67, + 0x53, 0x52, 0x53, 0x63, 0x30, 0x36, 0x70, 0x68, 0x70, 0x73, 0x73, 0x6f, 0x32, 0x65, 0x4e, 0x39, 0x4a, 0x4e, + 0x71, 0x68, 0x42, 0x6b, 0x6a, 0x6d, 0x38, 0x75, 0x45, 0x2b, 0x76, 0x6f, 0x7a, 0x62, 0x62, 0x4e, 0x32, 0x44, + 0x61, 0x5c, 0x0a, + 0x09, 0x6a, 0x62, 0x72, 0x6c, 0x71, 0x6d, 0x32, 0x4d, 0x6a, 0x35, 0x6e, 0x72, 0x6c, 0x73, 0x74, 0x66, 0x67, + 0x49, 0x4c, 0x4f, 0x38, 0x4a, 0x69, 0x38, 0x52, 0x4d, 0x5a, 0x43, 0x4f, 0x45, 0x42, 0x68, 0x70, 0x2b, 0x6f, + 0x78, 0x51, 0x42, 0x73, 0x47, 0x41, 0x4c, 0x74, 0x33, 0x37, 0x63, 0x54, 0x30, 0x74, 0x6d, 0x31, 0x6e, 0x44, + 0x67, 0x61, 0x44, 0x6e, 0x6a, 0x59, 0x49, 0x37, 0x55, 0x6a, 0x56, 0x67, 0x56, 0x51, 0x42, 0x51, 0x32, 0x68, + 0x53, 0x5c, 0x0a, + 0x09, 0x2f, 0x31, 0x44, 0x4e, 0x42, 0x2f, 0x6e, 0x39, 0x32, 0x61, 0x67, 0x58, 0x53, 0x68, 0x58, 0x4b, 0x69, + 0x65, 0x38, 0x37, 0x30, 0x44, 0x77, 0x30, 0x52, 0x52, 0x65, 0x65, 0x65, 0x51, 0x41, 0x53, 0x77, 0x45, 0x51, + 0x35, 0x48, 0x68, 0x46, 0x56, 0x57, 0x34, 0x6e, 0x6a, 0x4b, 0x47, 0x42, 0x67, 0x46, 0x78, 0x41, 0x7a, 0x47, + 0x61, 0x54, 0x70, 0x4b, 0x75, 0x65, 0x4a, 0x5a, 0x7a, 0x4c, 0x57, 0x37, 0x63, 0x41, 0x49, 0x72, 0x6b, 0x5a, + 0x62, 0x5c, 0x0a, + 0x09, 0x47, 0x6f, 0x77, 0x30, 0x38, 0x65, 0x75, 0x57, 0x63, 0x77, 0x59, 0x2b, 0x39, 0x51, 0x4a, 0x64, 0x79, + 0x47, 0x62, 0x30, 0x75, 0x6f, 0x31, 0x31, 0x53, 0x7a, 0x63, 0x36, 0x75, 0x41, 0x59, 0x4d, 0x7a, 0x6a, 0x73, + 0x48, 0x4d, 0x53, 0x34, 0x72, 0x67, 0x72, 0x41, 0x5a, 0x49, 0x52, 0x73, 0x6c, 0x5a, 0x33, 0x45, 0x6e, 0x78, + 0x4c, 0x67, 0x74, 0x47, 0x63, 0x64, 0x70, 0x36, 0x45, 0x72, 0x76, 0x4d, 0x62, 0x48, 0x34, 0x34, 0x33, 0x71, + 0x6f, 0x5c, 0x0a, + 0x09, 0x32, 0x6e, 0x6a, 0x4d, 0x2b, 0x4d, 0x53, 0x45, 0x4b, 0x64, 0x66, 0x31, 0x70, 0x67, 0x30, 0x44, 0x67, + 0x4f, 0x50, 0x33, 0x37, 0x4d, 0x48, 0x6a, 0x4c, 0x33, 0x6a, 0x73, 0x43, 0x34, 0x4b, 0x44, 0x38, 0x73, 0x69, + 0x67, 0x68, 0x5a, 0x32, 0x67, 0x71, 0x6a, 0x50, 0x53, 0x78, 0x48, 0x68, 0x5a, 0x70, 0x5a, 0x30, 0x6b, 0x32, + 0x30, 0x6d, 0x69, 0x6d, 0x72, 0x38, 0x6f, 0x32, 0x32, 0x6c, 0x77, 0x43, 0x6c, 0x48, 0x4e, 0x4d, 0x48, 0x41, + 0x4f, 0x5c, 0x0a, + 0x09, 0x4c, 0x71, 0x48, 0x50, 0x30, 0x46, 0x36, 0x6f, 0x45, 0x78, 0x79, 0x41, 0x70, 0x36, 0x38, 0x36, 0x6b, + 0x77, 0x68, 0x31, 0x4e, 0x53, 0x44, 0x71, 0x4c, 0x43, 0x6e, 0x32, 0x79, 0x65, 0x65, 0x6c, 0x6b, 0x49, 0x62, + 0x4c, 0x78, 0x79, 0x53, 0x75, 0x51, 0x78, 0x70, 0x6e, 0x7a, 0x46, 0x67, 0x61, 0x35, 0x72, 0x38, 0x42, 0x52, + 0x4d, 0x58, 0x30, 0x78, 0x69, 0x6d, 0x6a, 0x48, 0x78, 0x58, 0x6c, 0x77, 0x58, 0x52, 0x4a, 0x64, 0x63, 0x51, + 0x55, 0x5c, 0x0a, + 0x09, 0x49, 0x4b, 0x4c, 0x6c, 0x59, 0x30, 0x52, 0x6c, 0x44, 0x57, 0x68, 0x61, 0x6a, 0x70, 0x46, 0x6e, 0x4a, + 0x2b, 0x58, 0x43, 0x65, 0x59, 0x33, 0x39, 0x45, 0x64, 0x4d, 0x70, 0x43, 0x78, 0x43, 0x68, 0x72, 0x4a, 0x55, + 0x74, 0x68, 0x54, 0x46, 0x70, 0x6e, 0x71, 0x4c, 0x4f, 0x4e, 0x4f, 0x41, 0x59, 0x2b, 0x48, 0x7a, 0x79, 0x33, + 0x6c, 0x4f, 0x66, 0x74, 0x48, 0x33, 0x48, 0x39, 0x76, 0x54, 0x43, 0x42, 0x74, 0x43, 0x47, 0x41, 0x63, 0x44, + 0x6b, 0x5c, 0x0a, + 0x09, 0x35, 0x41, 0x54, 0x4b, 0x30, 0x6a, 0x32, 0x4e, 0x70, 0x37, 0x61, 0x42, 0x74, 0x44, 0x4b, 0x6a, 0x34, + 0x54, 0x50, 0x48, 0x35, 0x32, 0x6d, 0x67, 0x46, 0x72, 0x70, 0x49, 0x44, 0x53, 0x73, 0x6e, 0x53, 0x56, 0x4a, + 0x78, 0x35, 0x63, 0x79, 0x36, 0x48, 0x2b, 0x46, 0x41, 0x54, 0x72, 0x59, 0x44, 0x79, 0x4f, 0x76, 0x43, 0x55, + 0x4e, 0x53, 0x55, 0x77, 0x42, 0x64, 0x4e, 0x39, 0x37, 0x43, 0x48, 0x65, 0x68, 0x62, 0x70, 0x31, 0x44, 0x67, + 0x59, 0x5c, 0x0a, + 0x09, 0x65, 0x58, 0x4c, 0x64, 0x53, 0x4d, 0x6d, 0x74, 0x7a, 0x49, 0x48, 0x4c, 0x69, 0x6e, 0x39, 0x76, 0x79, + 0x6d, 0x51, 0x53, 0x67, 0x41, 0x79, 0x38, 0x73, 0x6b, 0x7a, 0x4b, 0x57, 0x71, 0x77, 0x4d, 0x50, 0x46, 0x6c, + 0x5a, 0x56, 0x58, 0x51, 0x4f, 0x35, 0x78, 0x4a, 0x48, 0x45, 0x64, 0x47, 0x2b, 0x47, 0x72, 0x65, 0x51, 0x6e, + 0x5a, 0x37, 0x4b, 0x75, 0x56, 0x51, 0x58, 0x69, 0x61, 0x4f, 0x53, 0x4d, 0x55, 0x36, 0x6e, 0x78, 0x68, 0x68, + 0x41, 0x5c, 0x0a, + 0x09, 0x67, 0x6b, 0x38, 0x56, 0x48, 0x45, 0x52, 0x67, 0x34, 0x58, 0x62, 0x44, 0x36, 0x79, 0x53, 0x41, 0x77, + 0x36, 0x35, 0x72, 0x47, 0x65, 0x70, 0x73, 0x63, 0x38, 0x2f, 0x75, 0x33, 0x5a, 0x64, 0x73, 0x32, 0x62, 0x6f, + 0x31, 0x6b, 0x66, 0x46, 0x47, 0x30, 0x49, 0x59, 0x42, 0x77, 0x41, 0x4d, 0x50, 0x48, 0x73, 0x53, 0x39, 0x39, + 0x39, 0x33, 0x2f, 0x4d, 0x43, 0x73, 0x56, 0x42, 0x6c, 0x43, 0x6e, 0x37, 0x67, 0x68, 0x66, 0x70, 0x62, 0x46, + 0x77, 0x5c, 0x0a, + 0x09, 0x6c, 0x41, 0x37, 0x31, 0x64, 0x45, 0x53, 0x4c, 0x37, 0x55, 0x42, 0x47, 0x61, 0x2b, 0x36, 0x45, 0x58, + 0x4f, 0x47, 0x52, 0x42, 0x37, 0x34, 0x77, 0x78, 0x51, 0x77, 0x6b, 0x39, 0x73, 0x4d, 0x57, 0x7a, 0x54, 0x52, + 0x2f, 0x4e, 0x66, 0x74, 0x70, 0x52, 0x4e, 0x66, 0x54, 0x43, 0x6d, 0x73, 0x4f, 0x79, 0x69, 0x6e, 0x4a, 0x51, + 0x46, 0x43, 0x50, 0x57, 0x59, 0x39, 0x50, 0x72, 0x4e, 0x34, 0x7a, 0x2b, 0x56, 0x67, 0x72, 0x31, 0x4c, 0x78, + 0x2f, 0x5c, 0x0a, + 0x09, 0x6b, 0x58, 0x32, 0x6f, 0x73, 0x66, 0x4c, 0x32, 0x6d, 0x79, 0x6a, 0x4b, 0x4d, 0x67, 0x79, 0x66, 0x70, + 0x38, 0x54, 0x73, 0x72, 0x67, 0x44, 0x62, 0x44, 0x4a, 0x4f, 0x41, 0x31, 0x4b, 0x6a, 0x73, 0x4c, 0x2b, 0x48, + 0x62, 0x41, 0x6a, 0x2f, 0x6d, 0x32, 0x4b, 0x49, 0x65, 0x47, 0x32, 0x76, 0x67, 0x49, 0x2f, 0x52, 0x76, 0x38, + 0x52, 0x4c, 0x36, 0x53, 0x71, 0x61, 0x58, 0x50, 0x4e, 0x4e, 0x73, 0x34, 0x44, 0x4f, 0x5a, 0x45, 0x6f, 0x7a, + 0x49, 0x5c, 0x0a, + 0x09, 0x61, 0x67, 0x38, 0x66, 0x50, 0x6e, 0x4c, 0x6d, 0x31, 0x4d, 0x51, 0x34, 0x33, 0x76, 0x66, 0x37, 0x76, + 0x7a, 0x4e, 0x43, 0x73, 0x75, 0x74, 0x44, 0x47, 0x77, 0x49, 0x41, 0x2b, 0x2f, 0x66, 0x74, 0x77, 0x39, 0x61, + 0x78, 0x4c, 0x72, 0x35, 0x7a, 0x30, 0x38, 0x33, 0x48, 0x63, 0x61, 0x51, 0x56, 0x45, 0x64, 0x52, 0x4b, 0x38, + 0x56, 0x6d, 0x61, 0x5a, 0x74, 0x32, 0x43, 0x53, 0x64, 0x4a, 0x37, 0x6c, 0x52, 0x35, 0x7a, 0x35, 0x2b, 0x4e, + 0x52, 0x5c, 0x0a, + 0x09, 0x4e, 0x54, 0x71, 0x44, 0x45, 0x51, 0x47, 0x74, 0x61, 0x41, 0x68, 0x41, 0x5a, 0x42, 0x68, 0x4a, 0x4a, + 0x48, 0x42, 0x79, 0x47, 0x69, 0x4c, 0x4b, 0x4f, 0x64, 0x6b, 0x47, 0x54, 0x33, 0x48, 0x6a, 0x2b, 0x46, 0x56, + 0x47, 0x4a, 0x4d, 0x62, 0x4f, 0x32, 0x68, 0x64, 0x33, 0x51, 0x58, 0x6a, 0x4b, 0x54, 0x61, 0x69, 0x64, 0x55, + 0x6f, 0x68, 0x50, 0x4f, 0x70, 0x61, 0x49, 0x75, 0x4e, 0x62, 0x65, 0x41, 0x35, 0x31, 0x47, 0x68, 0x37, 0x6f, + 0x71, 0x5c, 0x0a, + 0x09, 0x79, 0x6e, 0x46, 0x77, 0x35, 0x65, 0x30, 0x4b, 0x48, 0x61, 0x6b, 0x70, 0x53, 0x42, 0x4b, 0x78, 0x6e, + 0x65, 0x4a, 0x42, 0x70, 0x66, 0x58, 0x43, 0x41, 0x63, 0x4d, 0x66, 0x5a, 0x42, 0x43, 0x6f, 0x32, 0x62, 0x5a, + 0x33, 0x57, 0x6f, 0x72, 0x70, 0x68, 0x61, 0x4c, 0x59, 0x4e, 0x38, 0x73, 0x4b, 0x64, 0x4a, 0x74, 0x4e, 0x78, + 0x39, 0x77, 0x47, 0x64, 0x53, 0x44, 0x67, 0x55, 0x35, 0x52, 0x41, 0x33, 0x37, 0x6e, 0x78, 0x78, 0x69, 0x31, + 0x50, 0x5c, 0x0a, + 0x09, 0x66, 0x66, 0x78, 0x6a, 0x74, 0x77, 0x2b, 0x47, 0x77, 0x34, 0x53, 0x50, 0x39, 0x61, 0x59, 0x4e, 0x65, + 0x78, 0x72, 0x77, 0x63, 0x31, 0x2f, 0x2b, 0x61, 0x76, 0x36, 0x33, 0x66, 0x2f, 0x69, 0x37, 0x4e, 0x2f, 0x55, + 0x36, 0x2b, 0x63, 0x50, 0x6d, 0x6c, 0x67, 0x5a, 0x77, 0x5a, 0x58, 0x41, 0x65, 0x59, 0x48, 0x5a, 0x78, 0x4b, + 0x5a, 0x59, 0x62, 0x44, 0x6b, 0x76, 0x4d, 0x4c, 0x79, 0x32, 0x68, 0x72, 0x4b, 0x34, 0x76, 0x46, 0x30, 0x4d, + 0x4d, 0x5c, 0x0a, + 0x09, 0x68, 0x6b, 0x56, 0x30, 0x75, 0x63, 0x48, 0x53, 0x4d, 0x67, 0x5a, 0x46, 0x43, 0x61, 0x72, 0x4f, 0x7a, + 0x43, 0x38, 0x73, 0x6f, 0x71, 0x79, 0x55, 0x57, 0x4a, 0x59, 0x6c, 0x35, 0x6c, 0x6c, 0x62, 0x79, 0x38, 0x74, + 0x44, 0x4c, 0x43, 0x37, 0x56, 0x33, 0x35, 0x65, 0x57, 0x68, 0x78, 0x67, 0x4d, 0x42, 0x74, 0x47, 0x41, 0x35, + 0x75, 0x62, 0x6e, 0x55, 0x52, 0x59, 0x46, 0x6e, 0x41, 0x4f, 0x49, 0x67, 0x45, 0x4d, 0x7a, 0x73, 0x77, 0x67, + 0x67, 0x5c, 0x0a, + 0x09, 0x50, 0x69, 0x79, 0x47, 0x4f, 0x48, 0x7a, 0x34, 0x63, 0x4b, 0x79, 0x37, 0x75, 0x4c, 0x43, 0x41, 0x75, + 0x62, 0x6b, 0x35, 0x4d, 0x61, 0x61, 0x59, 0x68, 0x61, 0x69, 0x35, 0x64, 0x48, 0x52, 0x38, 0x35, 0x70, 0x67, + 0x6d, 0x4d, 0x4c, 0x6d, 0x36, 0x72, 0x72, 0x55, 0x49, 0x47, 0x52, 0x32, 0x47, 0x4f, 0x7a, 0x75, 0x59, 0x6f, + 0x36, 0x6e, 0x73, 0x77, 0x4a, 0x70, 0x61, 0x4a, 0x53, 0x44, 0x41, 0x48, 0x4a, 0x53, 0x44, 0x56, 0x68, 0x49, + 0x74, 0x5c, 0x0a, + 0x09, 0x51, 0x33, 0x76, 0x4b, 0x6d, 0x5a, 0x74, 0x41, 0x51, 0x77, 0x41, 0x67, 0x79, 0x51, 0x7a, 0x4e, 0x6b, + 0x70, 0x6b, 0x41, 0x4f, 0x44, 0x59, 0x4f, 0x77, 0x5a, 0x2b, 0x65, 0x63, 0x71, 0x68, 0x73, 0x52, 0x54, 0x68, + 0x77, 0x77, 0x39, 0x68, 0x45, 0x39, 0x79, 0x34, 0x64, 0x6b, 0x78, 0x36, 0x7a, 0x6d, 0x4a, 0x71, 0x77, 0x65, + 0x6a, 0x47, 0x72, 0x41, 0x4e, 0x57, 0x50, 0x62, 0x37, 0x4f, 0x78, 0x43, 0x4f, 0x42, 0x6a, 0x33, 0x34, 0x6b, + 0x49, 0x5c, 0x0a, + 0x09, 0x77, 0x2b, 0x56, 0x6c, 0x7a, 0x43, 0x30, 0x75, 0x50, 0x64, 0x63, 0x35, 0x39, 0x33, 0x35, 0x73, 0x4d, + 0x47, 0x30, 0x59, 0x41, 0x4c, 0x7a, 0x6e, 0x39, 0x5a, 0x63, 0x57, 0x6a, 0x7a, 0x70, 0x74, 0x54, 0x38, 0x38, + 0x37, 0x42, 0x67, 0x39, 0x58, 0x4b, 0x6d, 0x77, 0x46, 0x62, 0x2f, 0x52, 0x66, 0x36, 0x6d, 0x76, 0x52, 0x43, + 0x49, 0x69, 0x56, 0x55, 0x64, 0x66, 0x6a, 0x74, 0x58, 0x42, 0x4a, 0x61, 0x54, 0x2f, 0x59, 0x62, 0x71, 0x4a, + 0x67, 0x5c, 0x0a, + 0x09, 0x48, 0x58, 0x31, 0x4a, 0x39, 0x73, 0x66, 0x72, 0x56, 0x39, 0x64, 0x6d, 0x6c, 0x35, 0x59, 0x78, 0x4c, + 0x46, 0x7a, 0x73, 0x64, 0x33, 0x5a, 0x68, 0x43, 0x61, 0x56, 0x7a, 0x49, 0x41, 0x4a, 0x4b, 0x42, 0x38, 0x77, + 0x74, 0x44, 0x6d, 0x4a, 0x7a, 0x79, 0x38, 0x4d, 0x53, 0x53, 0x38, 0x76, 0x4c, 0x6b, 0x64, 0x76, 0x42, 0x73, + 0x4d, 0x44, 0x53, 0x63, 0x68, 0x30, 0x4e, 0x35, 0x68, 0x61, 0x57, 0x55, 0x4a, 0x52, 0x6c, 0x2f, 0x44, 0x36, + 0x37, 0x5c, 0x0a, + 0x09, 0x34, 0x4e, 0x2f, 0x33, 0x34, 0x65, 0x44, 0x67, 0x53, 0x6f, 0x66, 0x35, 0x78, 0x53, 0x55, 0x51, 0x43, + 0x43, 0x57, 0x41, 0x34, 0x58, 0x43, 0x49, 0x70, 0x63, 0x46, 0x79, 0x4c, 0x4c, 0x75, 0x30, 0x50, 0x4d, 0x42, + 0x77, 0x57, 0x45, 0x59, 0x6e, 0x6d, 0x56, 0x39, 0x59, 0x51, 0x75, 0x6d, 0x4b, 0x79, 0x4f, 0x37, 0x63, 0x2f, + 0x45, 0x4a, 0x31, 0x6a, 0x56, 0x41, 0x55, 0x51, 0x79, 0x77, 0x73, 0x4c, 0x43, 0x49, 0x49, 0x59, 0x6d, 0x6d, + 0x77, 0x5c, 0x0a, + 0x09, 0x6a, 0x49, 0x58, 0x46, 0x4a, 0x53, 0x38, 0x75, 0x42, 0x38, 0x7a, 0x4e, 0x7a, 0x57, 0x4b, 0x77, 0x58, + 0x50, 0x4e, 0x39, 0x38, 0x4d, 0x47, 0x44, 0x63, 0x45, 0x56, 0x52, 0x4f, 0x77, 0x63, 0x48, 0x70, 0x67, 0x42, + 0x61, 0x37, 0x42, 0x56, 0x5a, 0x77, 0x68, 0x6b, 0x55, 0x79, 0x49, 0x56, 0x6a, 0x72, 0x6e, 0x4a, 0x72, 0x44, + 0x55, 0x4e, 0x48, 0x65, 0x50, 0x35, 0x64, 0x5a, 0x41, 0x6a, 0x47, 0x71, 0x6a, 0x32, 0x72, 0x56, 0x4b, 0x66, + 0x37, 0x5c, 0x0a, + 0x09, 0x55, 0x65, 0x65, 0x79, 0x54, 0x75, 0x67, 0x76, 0x38, 0x42, 0x55, 0x65, 0x43, 0x37, 0x65, 0x6d, 0x6d, + 0x4c, 0x77, 0x74, 0x76, 0x65, 0x61, 0x51, 0x54, 0x41, 0x63, 0x55, 0x6e, 0x32, 0x48, 0x4d, 0x52, 0x2b, 0x59, + 0x57, 0x6e, 0x6c, 0x61, 0x57, 0x35, 0x65, 0x59, 0x45, 0x67, 0x42, 0x74, 0x76, 0x76, 0x68, 0x6e, 0x6c, 0x74, + 0x5a, 0x39, 0x45, 0x72, 0x66, 0x32, 0x51, 0x39, 0x73, 0x6e, 0x30, 0x71, 0x58, 0x5a, 0x45, 0x46, 0x6a, 0x36, + 0x31, 0x5c, 0x0a, + 0x09, 0x49, 0x33, 0x4b, 0x41, 0x55, 0x4e, 0x67, 0x68, 0x79, 0x73, 0x58, 0x7a, 0x7a, 0x48, 0x45, 0x70, 0x57, + 0x41, 0x59, 0x48, 0x45, 0x46, 0x55, 0x50, 0x71, 0x6a, 0x2f, 0x42, 0x4a, 0x38, 0x58, 0x50, 0x4c, 0x58, 0x33, + 0x32, 0x49, 0x37, 0x42, 0x45, 0x32, 0x44, 0x62, 0x5a, 0x5a, 0x30, 0x79, 0x77, 0x44, 0x49, 0x43, 0x42, 0x52, + 0x74, 0x49, 0x75, 0x35, 0x30, 0x32, 0x54, 0x41, 0x44, 0x53, 0x53, 0x34, 0x30, 0x37, 0x6b, 0x45, 0x43, 0x4a, + 0x61, 0x5c, 0x0a, + 0x09, 0x51, 0x33, 0x6b, 0x68, 0x5a, 0x36, 0x4f, 0x74, 0x4f, 0x47, 0x37, 0x64, 0x66, 0x71, 0x79, 0x45, 0x34, + 0x62, 0x44, 0x41, 0x37, 0x47, 0x49, 0x4e, 0x50, 0x4d, 0x50, 0x53, 0x59, 0x58, 0x35, 0x70, 0x55, 0x48, 0x58, + 0x6c, 0x4d, 0x42, 0x67, 0x36, 0x78, 0x42, 0x54, 0x58, 0x4f, 0x63, 0x77, 0x50, 0x43, 0x78, 0x54, 0x44, 0x49, + 0x72, 0x5a, 0x34, 0x5a, 0x4b, 0x48, 0x4f, 0x78, 0x41, 0x72, 0x6e, 0x63, 0x47, 0x52, 0x75, 0x41, 0x56, 0x6e, + 0x46, 0x5c, 0x0a, + 0x09, 0x77, 0x32, 0x42, 0x59, 0x59, 0x48, 0x46, 0x70, 0x43, 0x5a, 0x52, 0x6c, 0x63, 0x48, 0x42, 0x59, 0x57, + 0x68, 0x78, 0x67, 0x75, 0x58, 0x53, 0x67, 0x79, 0x73, 0x46, 0x6d, 0x46, 0x78, 0x61, 0x72, 0x5a, 0x6e, 0x33, + 0x36, 0x50, 0x56, 0x64, 0x39, 0x4a, 0x79, 0x49, 0x4d, 0x79, 0x78, 0x49, 0x4c, 0x38, 0x77, 0x74, 0x52, 0x74, + 0x6f, 0x50, 0x42, 0x41, 0x45, 0x75, 0x44, 0x49, 0x59, 0x49, 0x65, 0x46, 0x78, 0x65, 0x57, 0x4d, 0x43, 0x79, + 0x57, 0x5c, 0x0a, + 0x09, 0x34, 0x35, 0x41, 0x50, 0x48, 0x35, 0x36, 0x4e, 0x57, 0x69, 0x2f, 0x4c, 0x45, 0x6f, 0x64, 0x6d, 0x44, + 0x6b, 0x57, 0x2b, 0x6c, 0x68, 0x61, 0x58, 0x4d, 0x44, 0x63, 0x37, 0x6d, 0x32, 0x52, 0x67, 0x31, 0x6e, 0x71, + 0x41, 0x58, 0x67, 0x67, 0x4d, 0x41, 0x43, 0x4c, 0x71, 0x6b, 0x6f, 0x74, 0x54, 0x6b, 0x41, 0x64, 0x6d, 0x5a, + 0x73, 0x37, 0x64, 0x64, 0x38, 0x49, 0x65, 0x62, 0x44, 0x52, 0x74, 0x37, 0x41, 0x74, 0x42, 0x6f, 0x6f, 0x4d, + 0x72, 0x5c, 0x0a, + 0x09, 0x4a, 0x77, 0x33, 0x61, 0x30, 0x63, 0x36, 0x42, 0x63, 0x4b, 0x34, 0x43, 0x44, 0x65, 0x35, 0x4d, 0x78, + 0x4f, 0x71, 0x48, 0x6c, 0x4c, 0x4c, 0x4a, 0x53, 0x65, 0x4b, 0x70, 0x32, 0x6f, 0x46, 0x54, 0x50, 0x6d, 0x53, + 0x30, 0x53, 0x48, 0x68, 0x75, 0x41, 0x67, 0x54, 0x6e, 0x6d, 0x72, 0x4d, 0x54, 0x6e, 0x6c, 0x68, 0x77, 0x45, + 0x42, 0x44, 0x6a, 0x55, 0x33, 0x30, 0x78, 0x6b, 0x4c, 0x45, 0x64, 0x31, 0x53, 0x41, 0x75, 0x45, 0x33, 0x34, + 0x75, 0x5c, 0x0a, + 0x09, 0x36, 0x64, 0x73, 0x59, 0x72, 0x35, 0x41, 0x46, 0x42, 0x38, 0x6a, 0x36, 0x4b, 0x77, 0x42, 0x30, 0x38, + 0x67, 0x7a, 0x62, 0x74, 0x6f, 0x7a, 0x4a, 0x38, 0x57, 0x38, 0x64, 0x47, 0x79, 0x32, 0x58, 0x55, 0x61, 0x43, + 0x55, 0x6b, 0x4f, 0x6f, 0x62, 0x51, 0x4d, 0x4b, 0x4c, 0x47, 0x49, 0x73, 0x78, 0x7a, 0x67, 0x51, 0x55, 0x6d, + 0x77, 0x45, 0x74, 0x37, 0x56, 0x36, 0x42, 0x4a, 0x49, 0x44, 0x35, 0x78, 0x57, 0x55, 0x4d, 0x68, 0x76, 0x55, + 0x62, 0x5c, 0x0a, + 0x09, 0x76, 0x57, 0x61, 0x58, 0x42, 0x69, 0x68, 0x4c, 0x46, 0x35, 0x73, 0x39, 0x73, 0x6a, 0x43, 0x49, 0x2f, + 0x52, 0x52, 0x6c, 0x69, 0x59, 0x55, 0x6c, 0x6c, 0x75, 0x55, 0x56, 0x70, 0x63, 0x6a, 0x55, 0x43, 0x44, 0x51, + 0x33, 0x58, 0x4b, 0x35, 0x42, 0x63, 0x4b, 0x4e, 0x6f, 0x59, 0x77, 0x46, 0x41, 0x4f, 0x33, 0x77, 0x38, 0x62, + 0x36, 0x54, 0x6b, 0x4f, 0x72, 0x6f, 0x35, 0x64, 0x69, 0x30, 0x30, 0x35, 0x69, 0x70, 0x67, 0x69, 0x44, 0x62, + 0x63, 0x5c, 0x0a, + 0x09, 0x45, 0x47, 0x6d, 0x62, 0x70, 0x68, 0x56, 0x31, 0x41, 0x58, 0x2b, 0x4f, 0x70, 0x62, 0x4f, 0x4e, 0x66, + 0x41, 0x53, 0x6e, 0x64, 0x66, 0x77, 0x36, 0x64, 0x36, 0x36, 0x6d, 0x63, 0x52, 0x6e, 0x47, 0x6d, 0x66, 0x43, + 0x6c, 0x2b, 0x75, 0x56, 0x6c, 0x74, 0x49, 0x79, 0x73, 0x38, 0x51, 0x6e, 0x6e, 0x45, 0x53, 0x6d, 0x49, 0x71, + 0x6b, 0x38, 0x31, 0x50, 0x31, 0x61, 0x6d, 0x45, 0x61, 0x73, 0x62, 0x63, 0x75, 0x4b, 0x4f, 0x71, 0x49, 0x6b, + 0x44, 0x5c, 0x0a, + 0x09, 0x59, 0x67, 0x52, 0x42, 0x42, 0x73, 0x36, 0x69, 0x4b, 0x65, 0x33, 0x6f, 0x58, 0x41, 0x61, 0x42, 0x48, + 0x79, 0x55, 0x66, 0x44, 0x58, 0x44, 0x4f, 0x70, 0x58, 0x71, 0x78, 0x35, 0x41, 0x4e, 0x57, 0x52, 0x76, 0x52, + 0x50, 0x71, 0x61, 0x78, 0x5a, 0x6d, 0x59, 0x6d, 0x78, 0x44, 0x69, 0x5a, 0x51, 0x5a, 0x33, 0x6f, 0x52, 0x41, + 0x48, 0x6e, 0x39, 0x5a, 0x45, 0x79, 0x47, 0x58, 0x50, 0x7a, 0x59, 0x70, 0x2b, 0x2b, 0x64, 0x6d, 0x55, 0x75, + 0x76, 0x5c, 0x0a, + 0x09, 0x72, 0x54, 0x4e, 0x74, 0x2f, 0x4e, 0x4f, 0x41, 0x7a, 0x6a, 0x72, 0x68, 0x36, 0x67, 0x73, 0x6d, 0x4f, + 0x4b, 0x6a, 0x76, 0x50, 0x45, 0x72, 0x47, 0x36, 0x38, 0x79, 0x6f, 0x2b, 0x58, 0x58, 0x74, 0x65, 0x4e, 0x6f, + 0x49, 0x49, 0x6b, 0x2f, 0x42, 0x75, 0x42, 0x73, 0x69, 0x42, 0x4f, 0x64, 0x44, 0x4f, 0x49, 0x65, 0x4b, 0x39, + 0x4e, 0x48, 0x6f, 0x64, 0x63, 0x51, 0x33, 0x49, 0x6a, 0x4c, 0x6e, 0x53, 0x7a, 0x75, 0x63, 0x35, 0x54, 0x44, + 0x4a, 0x5c, 0x0a, + 0x09, 0x64, 0x33, 0x56, 0x4f, 0x31, 0x46, 0x65, 0x66, 0x73, 0x52, 0x2b, 0x64, 0x68, 0x57, 0x6c, 0x67, 0x67, + 0x58, 0x49, 0x49, 0x73, 0x50, 0x47, 0x6f, 0x66, 0x70, 0x7a, 0x53, 0x47, 0x79, 0x44, 0x6c, 0x7a, 0x38, 0x48, + 0x53, 0x36, 0x6b, 0x75, 0x6d, 0x63, 0x59, 0x62, 0x75, 0x36, 0x4f, 0x68, 0x34, 0x31, 0x74, 0x6b, 0x4c, 0x58, + 0x43, 0x72, 0x37, 0x41, 0x4e, 0x68, 0x78, 0x50, 0x4b, 0x78, 0x50, 0x70, 0x38, 0x76, 0x7a, 0x65, 0x73, 0x36, + 0x57, 0x5c, 0x0a, + 0x09, 0x4e, 0x52, 0x38, 0x7a, 0x31, 0x37, 0x6c, 0x46, 0x50, 0x67, 0x76, 0x64, 0x76, 0x6e, 0x74, 0x36, 0x30, + 0x72, 0x36, 0x2b, 0x6a, 0x72, 0x51, 0x68, 0x41, 0x46, 0x42, 0x65, 0x39, 0x79, 0x6c, 0x2f, 0x34, 0x4c, 0x41, + 0x72, 0x47, 0x6c, 0x69, 0x6b, 0x59, 0x46, 0x68, 0x4d, 0x75, 0x55, 0x6d, 0x71, 0x48, 0x42, 0x77, 0x62, 0x78, + 0x6a, 0x57, 0x4c, 0x48, 0x46, 0x50, 0x63, 0x69, 0x45, 0x78, 0x44, 0x6e, 0x47, 0x38, 0x77, 0x65, 0x74, 0x45, + 0x73, 0x5c, 0x0a, + 0x09, 0x7a, 0x79, 0x37, 0x59, 0x39, 0x63, 0x43, 0x58, 0x63, 0x4f, 0x51, 0x52, 0x42, 0x74, 0x48, 0x49, 0x41, + 0x2b, 0x38, 0x44, 0x6f, 0x39, 0x76, 0x51, 0x77, 0x46, 0x68, 0x66, 0x73, 0x48, 0x6b, 0x4d, 0x55, 0x56, 0x44, + 0x49, 0x6b, 0x48, 0x32, 0x4f, 0x54, 0x4d, 0x31, 0x5a, 0x30, 0x30, 0x6b, 0x78, 0x72, 0x53, 0x39, 0x49, 0x47, + 0x65, 0x72, 0x49, 0x48, 0x4d, 0x34, 0x6e, 0x71, 0x62, 0x7a, 0x69, 0x79, 0x30, 0x72, 0x7a, 0x4c, 0x64, 0x33, + 0x48, 0x5c, 0x0a, + 0x09, 0x61, 0x36, 0x78, 0x73, 0x62, 0x4d, 0x59, 0x70, 0x6e, 0x59, 0x6d, 0x43, 0x61, 0x54, 0x75, 0x36, 0x6a, + 0x41, 0x42, 0x70, 0x33, 0x54, 0x2f, 0x59, 0x47, 0x42, 0x72, 0x73, 0x68, 0x48, 0x39, 0x33, 0x4f, 0x43, 0x62, + 0x32, 0x41, 0x6d, 0x39, 0x63, 0x42, 0x6b, 0x41, 0x30, 0x44, 0x61, 0x49, 0x4a, 0x30, 0x32, 0x69, 0x31, 0x59, + 0x2f, 0x50, 0x30, 0x6b, 0x59, 0x4f, 0x44, 0x6b, 0x48, 0x58, 0x34, 0x6f, 0x6f, 0x77, 0x4e, 0x67, 0x4f, 0x30, + 0x59, 0x5c, 0x0a, + 0x09, 0x52, 0x6b, 0x6a, 0x55, 0x45, 0x56, 0x64, 0x48, 0x68, 0x74, 0x69, 0x75, 0x63, 0x53, 0x36, 0x65, 0x5a, + 0x75, 0x41, 0x52, 0x77, 0x43, 0x33, 0x77, 0x49, 0x69, 0x49, 0x4c, 0x34, 0x35, 0x4d, 0x37, 0x67, 0x4a, 0x34, + 0x47, 0x69, 0x44, 0x6e, 0x35, 0x55, 0x59, 0x41, 0x58, 0x35, 0x7a, 0x6c, 0x78, 0x49, 0x41, 0x57, 0x30, 0x6e, + 0x46, 0x63, 0x6f, 0x65, 0x65, 0x6b, 0x6f, 0x79, 0x79, 0x6b, 0x42, 0x62, 0x41, 0x4e, 0x34, 0x7a, 0x54, 0x48, + 0x55, 0x5c, 0x0a, + 0x09, 0x70, 0x2b, 0x6f, 0x2b, 0x57, 0x56, 0x6e, 0x64, 0x4c, 0x6e, 0x63, 0x32, 0x72, 0x51, 0x64, 0x72, 0x47, + 0x68, 0x54, 0x62, 0x56, 0x33, 0x32, 0x47, 0x73, 0x6b, 0x45, 0x6e, 0x6b, 0x74, 0x48, 0x6d, 0x66, 0x76, 0x6b, + 0x35, 0x33, 0x62, 0x62, 0x51, 0x72, 0x52, 0x35, 0x44, 0x51, 0x79, 0x43, 0x53, 0x41, 0x4c, 0x63, 0x46, 0x59, + 0x4d, 0x46, 0x77, 0x67, 0x32, 0x69, 0x44, 0x41, 0x4d, 0x41, 0x42, 0x77, 0x44, 0x34, 0x5a, 0x47, 0x56, 0x53, + 0x55, 0x5c, 0x0a, + 0x09, 0x74, 0x70, 0x51, 0x67, 0x55, 0x6c, 0x47, 0x65, 0x68, 0x6d, 0x6f, 0x48, 0x68, 0x42, 0x31, 0x52, 0x64, + 0x48, 0x74, 0x4e, 0x55, 0x34, 0x42, 0x51, 0x33, 0x34, 0x71, 0x71, 0x31, 0x68, 0x77, 0x39, 0x47, 0x70, 0x5a, + 0x79, 0x61, 0x6a, 0x46, 0x6b, 0x70, 0x77, 0x78, 0x51, 0x47, 0x58, 0x49, 0x79, 0x39, 0x32, 0x52, 0x64, 0x4a, + 0x46, 0x6b, 0x51, 0x30, 0x75, 0x2f, 0x6d, 0x32, 0x42, 0x53, 0x66, 0x76, 0x47, 0x37, 0x53, 0x48, 0x6d, 0x74, + 0x54, 0x5c, 0x0a, + 0x09, 0x67, 0x34, 0x67, 0x77, 0x63, 0x70, 0x4a, 0x31, 0x4c, 0x48, 0x36, 0x53, 0x39, 0x51, 0x57, 0x6a, 0x6e, + 0x42, 0x55, 0x70, 0x56, 0x79, 0x4b, 0x52, 0x7a, 0x75, 0x74, 0x78, 0x4b, 0x54, 0x6c, 0x71, 0x33, 0x69, 0x30, + 0x51, 0x31, 0x4b, 0x44, 0x4f, 0x78, 0x78, 0x41, 0x7a, 0x4f, 0x42, 0x58, 0x39, 0x64, 0x5a, 0x51, 0x33, 0x70, + 0x32, 0x6b, 0x4b, 0x61, 0x44, 0x52, 0x66, 0x39, 0x65, 0x65, 0x57, 0x6f, 0x78, 0x2f, 0x38, 0x32, 0x74, 0x41, + 0x47, 0x5c, 0x0a, + 0x09, 0x4c, 0x67, 0x4b, 0x36, 0x30, 0x36, 0x76, 0x50, 0x46, 0x61, 0x4b, 0x46, 0x53, 0x34, 0x57, 0x63, 0x52, + 0x47, 0x4e, 0x4b, 0x73, 0x77, 0x62, 0x64, 0x68, 0x6a, 0x79, 0x42, 0x6b, 0x5a, 0x45, 0x74, 0x53, 0x66, 0x63, + 0x5a, 0x77, 0x46, 0x44, 0x31, 0x58, 0x39, 0x4b, 0x45, 0x6b, 0x53, 0x48, 0x77, 0x4d, 0x57, 0x6c, 0x6a, 0x6a, + 0x45, 0x59, 0x52, 0x32, 0x41, 0x6c, 0x5a, 0x44, 0x6c, 0x49, 0x5a, 0x61, 0x4e, 0x34, 0x41, 0x32, 0x2f, 0x41, + 0x69, 0x5c, 0x0a, + 0x09, 0x61, 0x4c, 0x6d, 0x61, 0x54, 0x38, 0x32, 0x54, 0x6c, 0x70, 0x2b, 0x4f, 0x6c, 0x4d, 0x6e, 0x69, 0x4a, + 0x43, 0x54, 0x49, 0x6a, 0x73, 0x71, 0x45, 0x4c, 0x48, 0x36, 0x45, 0x34, 0x54, 0x4f, 0x65, 0x52, 0x70, 0x49, + 0x6c, 0x42, 0x30, 0x73, 0x2b, 0x42, 0x6f, 0x43, 0x62, 0x59, 0x31, 0x50, 0x38, 0x38, 0x4c, 0x46, 0x79, 0x2f, + 0x71, 0x33, 0x79, 0x31, 0x68, 0x68, 0x58, 0x6b, 0x68, 0x2f, 0x50, 0x31, 0x71, 0x7a, 0x2b, 0x36, 0x75, 0x75, + 0x39, 0x5c, 0x0a, + 0x09, 0x78, 0x6d, 0x78, 0x68, 0x6e, 0x57, 0x68, 0x6a, 0x4d, 0x67, 0x41, 0x48, 0x41, 0x48, 0x53, 0x36, 0x76, + 0x62, 0x41, 0x54, 0x79, 0x68, 0x69, 0x43, 0x73, 0x2b, 0x62, 0x68, 0x56, 0x6e, 0x53, 0x4d, 0x4b, 0x52, 0x6f, + 0x67, 0x6c, 0x47, 0x6d, 0x68, 0x74, 0x35, 0x6d, 0x2b, 0x68, 0x6e, 0x6f, 0x47, 0x6f, 0x6f, 0x76, 0x69, 0x54, + 0x56, 0x47, 0x65, 0x32, 0x47, 0x55, 0x56, 0x33, 0x66, 0x6e, 0x31, 0x6b, 0x4d, 0x48, 0x6f, 0x72, 0x45, 0x41, + 0x62, 0x5c, 0x0a, + 0x09, 0x72, 0x4a, 0x6d, 0x5a, 0x71, 0x4d, 0x69, 0x73, 0x78, 0x38, 0x4a, 0x5a, 0x30, 0x2f, 0x4e, 0x2b, 0x6e, + 0x6b, 0x47, 0x6c, 0x68, 0x5a, 0x56, 0x4d, 0x57, 0x43, 0x5a, 0x6b, 0x79, 0x54, 0x36, 0x4d, 0x75, 0x30, 0x6b, + 0x47, 0x41, 0x71, 0x68, 0x59, 0x57, 0x52, 0x48, 0x4e, 0x46, 0x57, 0x6d, 0x67, 0x45, 0x57, 0x6b, 0x2f, 0x36, + 0x38, 0x64, 0x63, 0x77, 0x41, 0x30, 0x79, 0x30, 0x65, 0x56, 0x34, 0x47, 0x2b, 0x46, 0x69, 0x4f, 0x4f, 0x39, + 0x73, 0x5c, 0x0a, + 0x09, 0x32, 0x54, 0x56, 0x6c, 0x42, 0x6e, 0x72, 0x38, 0x34, 0x54, 0x77, 0x76, 0x7a, 0x36, 0x64, 0x7a, 0x77, + 0x5a, 0x36, 0x43, 0x50, 0x64, 0x52, 0x5a, 0x7a, 0x4e, 0x51, 0x47, 0x2b, 0x2f, 0x38, 0x47, 0x72, 0x67, 0x47, + 0x34, 0x4b, 0x67, 0x50, 0x51, 0x63, 0x79, 0x70, 0x5a, 0x70, 0x6a, 0x70, 0x6f, 0x53, 0x4c, 0x64, 0x34, 0x78, + 0x4c, 0x49, 0x51, 0x50, 0x79, 0x34, 0x6f, 0x38, 0x6e, 0x50, 0x36, 0x32, 0x43, 0x49, 0x79, 0x6c, 0x47, 0x58, + 0x31, 0x5c, 0x0a, + 0x09, 0x7a, 0x66, 0x6f, 0x7a, 0x35, 0x35, 0x32, 0x73, 0x72, 0x4a, 0x56, 0x65, 0x78, 0x71, 0x48, 0x70, 0x79, + 0x4b, 0x54, 0x4b, 0x63, 0x79, 0x42, 0x4c, 0x30, 0x6b, 0x78, 0x74, 0x6b, 0x44, 0x78, 0x4b, 0x47, 0x76, 0x31, + 0x59, 0x36, 0x79, 0x4a, 0x6d, 0x5a, 0x46, 0x65, 0x5a, 0x69, 0x77, 0x57, 0x79, 0x76, 0x46, 0x79, 0x55, 0x43, + 0x32, 0x74, 0x44, 0x4f, 0x30, 0x51, 0x43, 0x44, 0x41, 0x5a, 0x77, 0x38, 0x62, 0x61, 0x35, 0x6a, 0x71, 0x55, + 0x77, 0x5c, 0x0a, + 0x09, 0x5a, 0x42, 0x6b, 0x7a, 0x4b, 0x32, 0x4a, 0x74, 0x72, 0x5a, 0x67, 0x5a, 0x47, 0x74, 0x48, 0x61, 0x79, + 0x73, 0x4b, 0x53, 0x39, 0x6c, 0x52, 0x67, 0x69, 0x67, 0x6b, 0x41, 0x41, 0x2f, 0x70, 0x67, 0x4f, 0x31, 0x77, + 0x6e, 0x39, 0x52, 0x72, 0x57, 0x75, 0x4e, 0x33, 0x4a, 0x2b, 0x74, 0x46, 0x47, 0x37, 0x67, 0x4d, 0x34, 0x45, + 0x59, 0x42, 0x43, 0x34, 0x34, 0x71, 0x73, 0x46, 0x46, 0x4a, 0x2f, 0x4d, 0x6d, 0x45, 0x75, 0x4c, 0x51, 0x39, + 0x78, 0x5c, 0x0a, + 0x09, 0x33, 0x2b, 0x46, 0x35, 0x50, 0x48, 0x42, 0x6b, 0x48, 0x6f, 0x64, 0x6d, 0x46, 0x33, 0x48, 0x6f, 0x79, + 0x42, 0x7a, 0x6d, 0x6c, 0x35, 0x61, 0x77, 0x74, 0x44, 0x7a, 0x45, 0x77, 0x75, 0x49, 0x41, 0x73, 0x77, 0x75, + 0x4c, 0x47, 0x41, 0x79, 0x47, 0x47, 0x41, 0x79, 0x58, 0x77, 0x66, 0x66, 0x6f, 0x4c, 0x79, 0x77, 0x75, 0x6f, + 0x53, 0x6a, 0x38, 0x78, 0x6f, 0x34, 0x38, 0x7a, 0x7a, 0x45, 0x2b, 0x78, 0x6e, 0x66, 0x76, 0x41, 0x55, 0x53, + 0x45, 0x5c, 0x0a, + 0x09, 0x79, 0x66, 0x45, 0x78, 0x67, 0x49, 0x41, 0x38, 0x79, 0x7a, 0x44, 0x65, 0x37, 0x77, 0x45, 0x41, 0x2b, + 0x74, 0x30, 0x75, 0x4f, 0x74, 0x30, 0x63, 0x6e, 0x62, 0x79, 0x44, 0x69, 0x56, 0x34, 0x58, 0x52, 0x49, 0x53, + 0x74, 0x45, 0x2f, 0x36, 0x65, 0x38, 0x48, 0x69, 0x2f, 0x69, 0x30, 0x36, 0x57, 0x6f, 0x64, 0x66, 0x74, 0x6f, + 0x4e, 0x66, 0x4a, 0x30, 0x65, 0x39, 0x32, 0x30, 0x4f, 0x74, 0x6b, 0x47, 0x4f, 0x2f, 0x31, 0x30, 0x4d, 0x6e, + 0x39, 0x5c, 0x0a, + 0x09, 0x6a, 0x73, 0x46, 0x4f, 0x7a, 0x6e, 0x48, 0x58, 0x41, 0x44, 0x32, 0x52, 0x79, 0x6a, 0x4f, 0x6a, 0x34, + 0x58, 0x4e, 0x7a, 0x71, 0x36, 0x34, 0x34, 0x48, 0x51, 0x7a, 0x4e, 0x32, 0x57, 0x56, 0x6a, 0x57, 0x7a, 0x78, + 0x6a, 0x63, 0x63, 0x70, 0x6f, 0x6c, 0x52, 0x35, 0x30, 0x50, 0x5a, 0x4d, 0x48, 0x42, 0x6e, 0x79, 0x31, 0x49, + 0x41, 0x30, 0x6d, 0x58, 0x66, 0x31, 0x42, 0x68, 0x50, 0x6d, 0x6c, 0x5a, 0x51, 0x79, 0x57, 0x43, 0x79, 0x77, + 0x4d, 0x5c, 0x0a, + 0x09, 0x68, 0x6c, 0x67, 0x75, 0x43, 0x73, 0x77, 0x76, 0x44, 0x56, 0x41, 0x36, 0x59, 0x48, 0x62, 0x52, 0x62, + 0x36, 0x36, 0x5a, 0x57, 0x31, 0x78, 0x43, 0x36, 0x59, 0x41, 0x6a, 0x38, 0x34, 0x74, 0x77, 0x7a, 0x75, 0x46, + 0x49, 0x74, 0x61, 0x56, 0x35, 0x66, 0x6e, 0x45, 0x51, 0x74, 0x30, 0x51, 0x50, 0x6c, 0x6f, 0x64, 0x77, 0x7a, + 0x6d, 0x46, 0x68, 0x30, 0x57, 0x2f, 0x44, 0x39, 0x75, 0x7a, 0x36, 0x54, 0x2f, 0x2b, 0x4d, 0x69, 0x41, 0x65, + 0x4c, 0x5c, 0x0a, + 0x09, 0x4c, 0x4d, 0x73, 0x78, 0x4d, 0x64, 0x36, 0x76, 0x57, 0x50, 0x50, 0x62, 0x6d, 0x4d, 0x66, 0x37, 0x50, + 0x66, 0x52, 0x36, 0x58, 0x59, 0x7a, 0x31, 0x2b, 0x39, 0x67, 0x79, 0x33, 0x6b, 0x65, 0x2f, 0x32, 0x38, 0x56, + 0x34, 0x76, 0x34, 0x74, 0x74, 0x57, 0x79, 0x61, 0x77, 0x66, 0x63, 0x73, 0x45, 0x64, 0x6d, 0x77, 0x64, 0x78, + 0x2b, 0x37, 0x70, 0x53, 0x66, 0x54, 0x79, 0x54, 0x4e, 0x71, 0x73, 0x6d, 0x48, 0x59, 0x41, 0x69, 0x5a, 0x50, + 0x48, 0x5c, 0x0a, + 0x09, 0x6f, 0x6b, 0x70, 0x2f, 0x76, 0x73, 0x35, 0x55, 0x49, 0x7a, 0x69, 0x74, 0x45, 0x32, 0x30, 0x6b, 0x41, + 0x42, 0x78, 0x76, 0x6e, 0x68, 0x57, 0x6f, 0x37, 0x35, 0x53, 0x64, 0x4f, 0x63, 0x7a, 0x4d, 0x4c, 0x2b, 0x45, + 0x72, 0x4e, 0x39, 0x79, 0x42, 0x61, 0x32, 0x36, 0x38, 0x46, 0x54, 0x66, 0x63, 0x65, 0x67, 0x64, 0x75, 0x76, + 0x4f, 0x6c, 0x57, 0x33, 0x48, 0x54, 0x54, 0x54, 0x52, 0x67, 0x4f, 0x6c, 0x36, 0x4e, 0x4e, 0x4a, 0x58, 0x76, + 0x4e, 0x5c, 0x0a, + 0x09, 0x41, 0x61, 0x55, 0x54, 0x75, 0x61, 0x56, 0x54, 0x50, 0x48, 0x52, 0x53, 0x39, 0x52, 0x57, 0x33, 0x63, + 0x61, 0x72, 0x67, 0x6e, 0x7a, 0x77, 0x41, 0x34, 0x79, 0x6f, 0x6a, 0x71, 0x73, 0x37, 0x78, 0x65, 0x76, 0x70, + 0x68, 0x6e, 0x48, 0x42, 0x74, 0x79, 0x35, 0x61, 0x74, 0x6d, 0x4e, 0x34, 0x32, 0x6a, 0x61, 0x6d, 0x74, 0x57, + 0x37, 0x46, 0x39, 0x32, 0x7a, 0x53, 0x6d, 0x70, 0x37, 0x5a, 0x69, 0x65, 0x75, 0x73, 0x55, 0x64, 0x6b, 0x78, + 0x76, 0x5c, 0x0a, + 0x09, 0x77, 0x61, 0x37, 0x74, 0x57, 0x37, 0x48, 0x6e, 0x75, 0x4f, 0x30, 0x34, 0x59, 0x66, 0x73, 0x57, 0x37, + 0x4e, 0x32, 0x35, 0x48, 0x56, 0x73, 0x6e, 0x75, 0x6b, 0x67, 0x4d, 0x7a, 0x5a, 0x77, 0x6a, 0x73, 0x33, 0x4d, + 0x38, 0x36, 0x6f, 0x2b, 0x63, 0x72, 0x34, 0x34, 0x67, 0x37, 0x65, 0x6a, 0x4a, 0x66, 0x4e, 0x77, 0x67, 0x55, + 0x59, 0x52, 0x77, 0x78, 0x77, 0x4e, 0x48, 0x63, 0x4f, 0x65, 0x44, 0x4d, 0x37, 0x6a, 0x72, 0x67, 0x52, 0x6e, + 0x63, 0x5c, 0x0a, + 0x09, 0x65, 0x2b, 0x67, 0x49, 0x37, 0x6a, 0x73, 0x34, 0x67, 0x35, 0x6b, 0x6a, 0x63, 0x35, 0x69, 0x5a, 0x6e, + 0x63, 0x57, 0x68, 0x51, 0x7a, 0x4f, 0x59, 0x6d, 0x54, 0x6d, 0x43, 0x67, 0x34, 0x63, 0x4f, 0x59, 0x75, 0x62, + 0x67, 0x51, 0x51, 0x79, 0x48, 0x42, 0x66, 0x51, 0x65, 0x66, 0x76, 0x36, 0x77, 0x6b, 0x33, 0x34, 0x71, 0x30, + 0x48, 0x6f, 0x49, 0x43, 0x57, 0x52, 0x38, 0x52, 0x74, 0x5a, 0x59, 0x75, 0x35, 0x44, 0x62, 0x64, 0x4a, 0x4d, + 0x45, 0x5c, 0x0a, + 0x09, 0x6f, 0x36, 0x71, 0x72, 0x37, 0x61, 0x54, 0x62, 0x36, 0x32, 0x4c, 0x66, 0x76, 0x74, 0x4e, 0x77, 0x2b, + 0x72, 0x35, 0x54, 0x63, 0x57, 0x44, 0x76, 0x53, 0x54, 0x68, 0x6e, 0x2f, 0x36, 0x6e, 0x34, 0x6e, 0x67, 0x4d, + 0x6e, 0x59, 0x57, 0x71, 0x38, 0x70, 0x79, 0x49, 0x2b, 0x55, 0x47, 0x38, 0x7a, 0x44, 0x32, 0x30, 0x36, 0x32, + 0x59, 0x48, 0x58, 0x31, 0x59, 0x34, 0x56, 0x39, 0x62, 0x44, 0x47, 0x74, 0x48, 0x45, 0x41, 0x51, 0x42, 0x59, + 0x41, 0x5c, 0x0a, + 0x09, 0x63, 0x43, 0x4f, 0x56, 0x47, 0x63, 0x46, 0x31, 0x74, 0x39, 0x2b, 0x50, 0x39, 0x2f, 0x33, 0x64, 0x5a, + 0x66, 0x6a, 0x6e, 0x54, 0x31, 0x77, 0x57, 0x6e, 0x54, 0x31, 0x35, 0x53, 0x6b, 0x73, 0x72, 0x54, 0x54, 0x6c, + 0x38, 0x31, 0x4c, 0x65, 0x31, 0x54, 0x39, 0x75, 0x6c, 0x44, 0x35, 0x30, 0x41, 0x7a, 0x50, 0x69, 0x55, 0x51, + 0x66, 0x45, 0x2b, 0x4f, 0x59, 0x43, 0x45, 0x2f, 0x64, 0x36, 0x38, 0x37, 0x33, 0x6f, 0x59, 0x33, 0x71, 0x6e, + 0x6d, 0x5c, 0x0a, + 0x09, 0x5a, 0x6d, 0x63, 0x78, 0x65, 0x2b, 0x51, 0x49, 0x37, 0x6f, 0x68, 0x42, 0x50, 0x6a, 0x58, 0x71, 0x77, + 0x4e, 0x2f, 0x70, 0x70, 0x2b, 0x2f, 0x48, 0x67, 0x66, 0x32, 0x6e, 0x34, 0x65, 0x47, 0x6e, 0x6e, 0x59, 0x4c, + 0x7a, 0x48, 0x37, 0x59, 0x58, 0x35, 0x35, 0x35, 0x32, 0x41, 0x71, 0x59, 0x6d, 0x2b, 0x6e, 0x57, 0x55, 0x6a, + 0x30, 0x42, 0x51, 0x6a, 0x37, 0x64, 0x78, 0x37, 0x55, 0x41, 0x66, 0x43, 0x37, 0x44, 0x6c, 0x57, 0x5a, 0x55, + 0x71, 0x5c, 0x0a, + 0x09, 0x4c, 0x31, 0x4a, 0x6a, 0x4e, 0x66, 0x37, 0x71, 0x32, 0x71, 0x33, 0x33, 0x48, 0x38, 0x48, 0x58, 0x62, + 0x72, 0x67, 0x56, 0x58, 0x37, 0x2f, 0x78, 0x46, 0x74, 0x78, 0x77, 0x30, 0x32, 0x32, 0x34, 0x37, 0x68, 0x76, + 0x66, 0x77, 0x71, 0x47, 0x44, 0x42, 0x31, 0x4d, 0x64, 0x4d, 0x54, 0x6c, 0x77, 0x6b, 0x4c, 0x51, 0x65, 0x44, + 0x39, 0x62, 0x36, 0x35, 0x49, 0x39, 0x55, 0x57, 0x77, 0x38, 0x49, 0x38, 0x59, 0x65, 0x50, 0x6b, 0x6f, 0x53, + 0x48, 0x5c, 0x0a, + 0x09, 0x4f, 0x54, 0x49, 0x48, 0x2b, 0x2f, 0x41, 0x41, 0x6b, 0x2b, 0x69, 0x48, 0x62, 0x48, 0x30, 0x50, 0x42, + 0x67, 0x4e, 0x63, 0x66, 0x2f, 0x32, 0x33, 0x38, 0x4f, 0x33, 0x72, 0x72, 0x38, 0x63, 0x2f, 0x56, 0x2b, 0x50, + 0x6f, 0x64, 0x4c, 0x76, 0x34, 0x34, 0x55, 0x74, 0x2b, 0x41, 0x44, 0x39, 0x39, 0x79, 0x66, 0x66, 0x68, 0x7a, + 0x4a, 0x4e, 0x33, 0x53, 0x64, 0x6e, 0x79, 0x44, 0x43, 0x34, 0x42, 0x55, 0x41, 0x63, 0x41, 0x4f, 0x7a, 0x59, + 0x36, 0x5c, 0x0a, + 0x09, 0x41, 0x36, 0x44, 0x47, 0x46, 0x31, 0x61, 0x75, 0x45, 0x66, 0x6d, 0x48, 0x67, 0x41, 0x41, 0x51, 0x4c, + 0x63, 0x4b, 0x35, 0x66, 0x69, 0x33, 0x6b, 0x5a, 0x69, 0x54, 0x38, 0x2f, 0x79, 0x37, 0x37, 0x43, 0x6e, 0x37, + 0x6e, 0x44, 0x39, 0x36, 0x54, 0x52, 0x41, 0x6e, 0x74, 0x6d, 0x4e, 0x70, 0x59, 0x77, 0x72, 0x6c, 0x59, 0x4e, + 0x70, 0x42, 0x43, 0x2f, 0x4d, 0x5a, 0x4d, 0x67, 0x46, 0x32, 0x33, 0x6a, 0x46, 0x61, 0x30, 0x70, 0x63, 0x70, + 0x70, 0x5c, 0x0a, + 0x09, 0x59, 0x2b, 0x5a, 0x41, 0x77, 0x68, 0x39, 0x42, 0x74, 0x51, 0x41, 0x69, 0x65, 0x53, 0x38, 0x41, 0x4d, + 0x2f, 0x67, 0x38, 0x7a, 0x33, 0x48, 0x52, 0x52, 0x52, 0x66, 0x69, 0x71, 0x52, 0x65, 0x63, 0x6a, 0x30, 0x73, + 0x65, 0x2b, 0x77, 0x68, 0x4d, 0x54, 0x2f, 0x53, 0x62, 0x48, 0x5a, 0x6f, 0x7a, 0x79, 0x4e, 0x4e, 0x54, 0x6e, + 0x6a, 0x33, 0x6f, 0x7a, 0x4b, 0x42, 0x70, 0x79, 0x6d, 0x58, 0x51, 0x74, 0x2b, 0x39, 0x36, 0x45, 0x42, 0x2f, + 0x35, 0x5c, 0x0a, + 0x09, 0x33, 0x4a, 0x58, 0x34, 0x78, 0x4b, 0x63, 0x2f, 0x6a, 0x78, 0x74, 0x76, 0x76, 0x4a, 0x47, 0x4a, 0x56, + 0x32, 0x56, 0x44, 0x69, 0x72, 0x53, 0x38, 0x77, 0x39, 0x67, 0x54, 0x49, 0x47, 0x7a, 0x49, 0x36, 0x4b, 0x78, + 0x48, 0x6a, 0x58, 0x6c, 0x37, 0x31, 0x6a, 0x73, 0x56, 0x45, 0x74, 0x32, 0x6f, 0x36, 0x5a, 0x53, 0x56, 0x46, + 0x57, 0x70, 0x64, 0x4e, 0x5a, 0x5a, 0x31, 0x44, 0x72, 0x31, 0x2b, 0x44, 0x37, 0x39, 0x35, 0x36, 0x53, 0x76, + 0x77, 0x5c, 0x0a, + 0x09, 0x6f, 0x30, 0x38, 0x36, 0x4e, 0x7a, 0x41, 0x39, 0x57, 0x72, 0x61, 0x65, 0x66, 0x67, 0x6e, 0x41, 0x4f, + 0x37, 0x4a, 0x48, 0x50, 0x73, 0x57, 0x55, 0x37, 0x33, 0x72, 0x51, 0x52, 0x67, 0x48, 0x41, 0x4e, 0x67, 0x41, + 0x48, 0x5a, 0x63, 0x71, 0x6b, 0x30, 0x6c, 0x73, 0x41, 0x49, 0x4f, 0x41, 0x76, 0x50, 0x2f, 0x6b, 0x31, 0x76, + 0x50, 0x34, 0x74, 0x62, 0x34, 0x2b, 0x58, 0x6b, 0x6f, 0x6a, 0x4d, 0x49, 0x67, 0x55, 0x79, 0x51, 0x69, 0x66, + 0x76, 0x5c, 0x0a, + 0x09, 0x56, 0x45, 0x33, 0x4a, 0x6c, 0x31, 0x51, 0x45, 0x63, 0x68, 0x55, 0x79, 0x2b, 0x34, 0x63, 0x34, 0x4b, + 0x67, 0x57, 0x79, 0x52, 0x32, 0x2b, 0x72, 0x51, 0x70, 0x42, 0x6e, 0x2f, 0x47, 0x4f, 0x34, 0x46, 0x72, 0x68, + 0x6f, 0x49, 0x77, 0x74, 0x39, 0x4e, 0x42, 0x6d, 0x4f, 0x61, 0x6c, 0x56, 0x63, 0x30, 0x38, 0x37, 0x53, 0x39, + 0x41, 0x78, 0x39, 0x4f, 0x4c, 0x64, 0x37, 0x7a, 0x78, 0x37, 0x38, 0x2b, 0x69, 0x2b, 0x38, 0x47, 0x4d, 0x39, + 0x34, 0x5c, 0x0a, + 0x09, 0x7a, 0x42, 0x6c, 0x4b, 0x6a, 0x6a, 0x70, 0x38, 0x73, 0x65, 0x38, 0x36, 0x74, 0x62, 0x65, 0x4d, 0x4e, + 0x44, 0x4a, 0x67, 0x4f, 0x2f, 0x37, 0x63, 0x77, 0x67, 0x43, 0x2f, 0x2f, 0x37, 0x63, 0x66, 0x78, 0x77, 0x63, + 0x2b, 0x2b, 0x43, 0x46, 0x37, 0x32, 0x73, 0x53, 0x36, 0x74, 0x62, 0x49, 0x71, 0x66, 0x56, 0x36, 0x54, 0x6b, + 0x42, 0x2b, 0x41, 0x4c, 0x4d, 0x38, 0x41, 0x45, 0x4d, 0x71, 0x79, 0x41, 0x47, 0x55, 0x5a, 0x71, 0x44, 0x72, + 0x6d, 0x5c, 0x0a, + 0x09, 0x4d, 0x74, 0x4c, 0x48, 0x38, 0x62, 0x76, 0x6d, 0x6a, 0x34, 0x47, 0x44, 0x2b, 0x56, 0x67, 0x7a, 0x64, + 0x33, 0x77, 0x56, 0x52, 0x50, 0x67, 0x34, 0x4c, 0x42, 0x44, 0x4a, 0x73, 0x68, 0x7a, 0x76, 0x65, 0x74, 0x4e, + 0x72, 0x38, 0x62, 0x54, 0x7a, 0x54, 0x76, 0x63, 0x64, 0x57, 0x6d, 0x73, 0x6f, 0x38, 0x76, 0x68, 0x31, 0x63, + 0x4f, 0x34, 0x4e, 0x6d, 0x77, 0x38, 0x41, 0x69, 0x4d, 0x34, 0x41, 0x33, 0x4c, 0x63, 0x61, 0x6a, 0x62, 0x4b, + 0x69, 0x5c, 0x0a, + 0x09, 0x47, 0x2b, 0x38, 0x2b, 0x69, 0x47, 0x65, 0x2f, 0x2f, 0x44, 0x56, 0x59, 0x57, 0x6c, 0x77, 0x53, 0x43, + 0x75, 0x74, 0x30, 0x75, 0x78, 0x67, 0x66, 0x48, 0x30, 0x65, 0x33, 0x33, 0x30, 0x65, 0x6e, 0x30, 0x30, 0x47, + 0x57, 0x35, 0x56, 0x55, 0x7a, 0x4a, 0x52, 0x77, 0x63, 0x79, 0x6d, 0x47, 0x4a, 0x30, 0x76, 0x6c, 0x6e, 0x34, + 0x6c, 0x33, 0x70, 0x55, 0x4a, 0x61, 0x46, 0x2f, 0x33, 0x51, 0x46, 0x55, 0x43, 0x6d, 0x75, 0x4c, 0x4d, 0x75, + 0x59, 0x5c, 0x0a, + 0x09, 0x70, 0x70, 0x57, 0x6c, 0x65, 0x71, 0x74, 0x4c, 0x57, 0x45, 0x43, 0x4b, 0x5a, 0x51, 0x41, 0x51, 0x6f, + 0x58, 0x43, 0x6c, 0x47, 0x62, 0x30, 0x41, 0x43, 0x49, 0x4d, 0x4d, 0x31, 0x35, 0x4e, 0x73, 0x41, 0x62, 0x61, + 0x54, 0x36, 0x41, 0x79, 0x47, 0x55, 0x31, 0x4e, 0x2f, 0x76, 0x4e, 0x77, 0x62, 0x66, 0x2b, 0x32, 0x58, 0x38, + 0x61, 0x4e, 0x50, 0x50, 0x43, 0x39, 0x31, 0x57, 0x4c, 0x46, 0x41, 0x78, 0x52, 0x32, 0x64, 0x5a, 0x77, 0x46, + 0x47, 0x5c, 0x0a, + 0x09, 0x52, 0x68, 0x41, 0x37, 0x54, 0x35, 0x31, 0x30, 0x66, 0x6e, 0x45, 0x5a, 0x72, 0x33, 0x7a, 0x6e, 0x58, + 0x2b, 0x4c, 0x79, 0x79, 0x7a, 0x2b, 0x64, 0x4f, 0x4a, 0x45, 0x46, 0x57, 0x48, 0x6d, 0x65, 0x49, 0x38, 0x74, + 0x7a, 0x35, 0x48, 0x6e, 0x4f, 0x6d, 0x69, 0x56, 0x51, 0x52, 0x70, 0x58, 0x63, 0x67, 0x70, 0x4e, 0x35, 0x2f, + 0x58, 0x6c, 0x48, 0x4c, 0x79, 0x74, 0x57, 0x58, 0x50, 0x72, 0x4a, 0x77, 0x4c, 0x71, 0x4d, 0x41, 0x67, 0x77, + 0x74, 0x5c, 0x0a, + 0x09, 0x31, 0x4a, 0x4a, 0x78, 0x5a, 0x53, 0x6e, 0x34, 0x61, 0x5a, 0x7a, 0x69, 0x57, 0x5a, 0x47, 0x2f, 0x61, + 0x74, 0x59, 0x4d, 0x49, 0x45, 0x5a, 0x57, 0x78, 0x34, 0x48, 0x6d, 0x78, 0x4a, 0x4e, 0x50, 0x77, 0x74, 0x2b, + 0x39, 0x39, 0x54, 0x65, 0x77, 0x77, 0x33, 0x70, 0x51, 0x69, 0x4e, 0x75, 0x35, 0x50, 0x2f, 0x64, 0x4f, 0x77, + 0x50, 0x31, 0x69, 0x64, 0x74, 0x62, 0x47, 0x41, 0x63, 0x44, 0x47, 0x72, 0x41, 0x45, 0x34, 0x74, 0x79, 0x4f, + 0x39, 0x5c, 0x0a, + 0x09, 0x50, 0x5a, 0x4f, 0x6d, 0x73, 0x65, 0x2f, 0x35, 0x75, 0x30, 0x39, 0x67, 0x6b, 0x54, 0x33, 0x72, 0x6a, + 0x59, 0x78, 0x77, 0x30, 0x6b, 0x6d, 0x6e, 0x59, 0x48, 0x4c, 0x72, 0x56, 0x70, 0x52, 0x6c, 0x69, 0x62, 0x49, + 0x6f, 0x55, 0x4a, 0x51, 0x6c, 0x69, 0x73, 0x49, 0x2f, 0x64, 0x31, 0x34, 0x55, 0x4a, 0x63, 0x70, 0x69, 0x36, + 0x43, 0x4e, 0x47, 0x41, 0x5a, 0x54, 0x6b, 0x54, 0x53, 0x52, 0x44, 0x6a, 0x68, 0x49, 0x46, 0x73, 0x6a, 0x4b, + 0x4c, 0x5c, 0x0a, + 0x09, 0x4c, 0x39, 0x71, 0x67, 0x4c, 0x41, 0x50, 0x4b, 0x45, 0x73, 0x34, 0x42, 0x57, 0x65, 0x61, 0x4e, 0x4c, + 0x68, 0x68, 0x67, 0x31, 0x46, 0x57, 0x57, 0x69, 0x65, 0x77, 0x67, 0x42, 0x38, 0x58, 0x4d, 0x67, 0x47, 0x4c, + 0x36, 0x55, 0x58, 0x32, 0x72, 0x79, 0x75, 0x72, 0x6e, 0x76, 0x2f, 0x55, 0x4c, 0x50, 0x75, 0x4f, 0x31, 0x59, + 0x48, 0x52, 0x55, 0x47, 0x35, 0x57, 0x31, 0x31, 0x6d, 0x43, 0x6d, 0x78, 0x70, 0x42, 0x74, 0x76, 0x66, 0x46, + 0x74, 0x5c, 0x0a, + 0x09, 0x37, 0x38, 0x56, 0x35, 0x70, 0x2f, 0x38, 0x33, 0x6e, 0x48, 0x6e, 0x79, 0x54, 0x75, 0x6e, 0x6f, 0x6f, + 0x78, 0x62, 0x39, 0x43, 0x45, 0x62, 0x32, 0x70, 0x63, 0x76, 0x70, 0x36, 0x51, 0x50, 0x77, 0x2f, 0x6f, 0x39, + 0x39, 0x41, 0x5a, 0x64, 0x66, 0x2f, 0x6d, 0x6b, 0x6d, 0x67, 0x37, 0x72, 0x6f, 0x32, 0x4d, 0x51, 0x34, 0x2b, + 0x6d, 0x4e, 0x39, 0x39, 0x48, 0x70, 0x6a, 0x79, 0x50, 0x49, 0x4d, 0x57, 0x64, 0x36, 0x42, 0x4b, 0x38, 0x73, + 0x49, 0x5c, 0x0a, + 0x09, 0x77, 0x4d, 0x34, 0x35, 0x46, 0x50, 0x47, 0x59, 0x41, 0x58, 0x52, 0x31, 0x6a, 0x4e, 0x4a, 0x56, 0x2b, + 0x73, 0x68, 0x51, 0x6c, 0x6d, 0x58, 0x4d, 0x41, 0x76, 0x67, 0x6e, 0x38, 0x68, 0x79, 0x75, 0x4b, 0x41, 0x41, + 0x69, 0x5a, 0x45, 0x61, 0x6d, 0x46, 0x72, 0x6a, 0x79, 0x2b, 0x6d, 0x43, 0x67, 0x70, 0x4e, 0x63, 0x4d, 0x46, + 0x46, 0x43, 0x48, 0x4d, 0x6e, 0x6f, 0x4b, 0x6d, 0x41, 0x42, 0x35, 0x41, 0x41, 0x59, 0x4f, 0x32, 0x6d, 0x78, + 0x36, 0x5c, 0x0a, + 0x09, 0x65, 0x4f, 0x63, 0x64, 0x64, 0x2b, 0x42, 0x2f, 0x2f, 0x65, 0x74, 0x58, 0x38, 0x64, 0x4a, 0x6e, 0x58, + 0x69, 0x67, 0x56, 0x79, 0x51, 0x55, 0x66, 0x32, 0x33, 0x63, 0x37, 0x6a, 0x51, 0x4c, 0x72, 0x53, 0x68, 0x75, + 0x31, 0x44, 0x32, 0x41, 0x48, 0x41, 0x4e, 0x53, 0x33, 0x75, 0x78, 0x68, 0x56, 0x33, 0x2b, 0x39, 0x36, 0x63, + 0x41, 0x37, 0x2f, 0x38, 0x49, 0x2f, 0x2f, 0x58, 0x4a, 0x33, 0x7a, 0x48, 0x79, 0x65, 0x64, 0x63, 0x69, 0x71, + 0x6d, 0x5c, 0x0a, + 0x09, 0x64, 0x2b, 0x78, 0x41, 0x6e, 0x75, 0x58, 0x49, 0x73, 0x67, 0x78, 0x5a, 0x37, 0x6a, 0x38, 0x37, 0x48, + 0x66, 0x2b, 0x49, 0x5a, 0x70, 0x35, 0x6e, 0x79, 0x4c, 0x49, 0x63, 0x52, 0x4f, 0x51, 0x4e, 0x45, 0x46, 0x6d, + 0x4d, 0x4e, 0x6c, 0x6d, 0x65, 0x67, 0x37, 0x49, 0x4d, 0x65, 0x62, 0x68, 0x4f, 0x42, 0x47, 0x52, 0x68, 0x2b, + 0x41, 0x35, 0x5a, 0x6c, 0x6f, 0x45, 0x6f, 0x51, 0x7a, 0x44, 0x36, 0x36, 0x45, 0x4d, 0x5a, 0x45, 0x31, 0x47, + 0x6f, 0x5c, 0x0a, + 0x09, 0x4a, 0x36, 0x4a, 0x4f, 0x7a, 0x58, 0x2b, 0x57, 0x5a, 0x66, 0x35, 0x53, 0x31, 0x4b, 0x2b, 0x2f, 0x48, + 0x46, 0x2b, 0x52, 0x35, 0x62, 0x78, 0x44, 0x36, 0x37, 0x66, 0x4a, 0x36, 0x42, 0x51, 0x7a, 0x4c, 0x49, 0x6a, + 0x35, 0x4c, 0x6f, 0x31, 0x55, 0x56, 0x43, 0x51, 0x51, 0x44, 0x6b, 0x75, 0x4c, 0x69, 0x2f, 0x6a, 0x6a, 0x6a, + 0x31, 0x7a, 0x4f, 0x5a, 0x4f, 0x56, 0x69, 0x64, 0x70, 0x4e, 0x57, 0x71, 0x4a, 0x67, 0x4b, 0x54, 0x69, 0x32, + 0x41, 0x5c, 0x0a, + 0x09, 0x57, 0x41, 0x4d, 0x4d, 0x41, 0x78, 0x4c, 0x6e, 0x63, 0x50, 0x2f, 0x68, 0x42, 0x62, 0x7a, 0x2f, 0x4c, + 0x2f, 0x39, 0x61, 0x39, 0x4e, 0x33, 0x72, 0x39, 0x33, 0x48, 0x69, 0x4b, 0x61, 0x66, 0x69, 0x59, 0x59, 0x38, + 0x34, 0x43, 0x36, 0x66, 0x73, 0x4f, 0x77, 0x33, 0x48, 0x37, 0x64, 0x71, 0x44, 0x4c, 0x56, 0x4e, 0x54, 0x36, + 0x49, 0x2b, 0x4e, 0x49, 0x38, 0x38, 0x7a, 0x35, 0x4a, 0x6e, 0x58, 0x43, 0x54, 0x49, 0x2f, 0x4a, 0x65, 0x74, + 0x6b, 0x5c, 0x0a, + 0x09, 0x4f, 0x53, 0x67, 0x6a, 0x45, 0x44, 0x48, 0x64, 0x78, 0x4f, 0x4d, 0x73, 0x79, 0x6a, 0x32, 0x72, 0x35, + 0x4d, 0x37, 0x66, 0x4c, 0x78, 0x69, 0x35, 0x79, 0x76, 0x4d, 0x49, 0x64, 0x42, 0x6c, 0x6c, 0x45, 0x54, 0x37, + 0x72, 0x4d, 0x58, 0x69, 0x4a, 0x42, 0x64, 0x31, 0x5a, 0x36, 0x30, 0x41, 0x4f, 0x48, 0x70, 0x41, 0x43, 0x43, + 0x46, 0x73, 0x4c, 0x79, 0x67, 0x6c, 0x34, 0x4f, 0x79, 0x54, 0x74, 0x78, 0x4f, 0x73, 0x42, 0x47, 0x42, 0x7a, + 0x77, 0x5c, 0x0a, + 0x09, 0x6a, 0x35, 0x2f, 0x36, 0x66, 0x47, 0x68, 0x41, 0x79, 0x5a, 0x32, 0x56, 0x39, 0x35, 0x6e, 0x41, 0x54, + 0x67, 0x50, 0x54, 0x31, 0x35, 0x55, 0x32, 0x42, 0x67, 0x43, 0x49, 0x74, 0x6b, 0x63, 0x44, 0x62, 0x5a, 0x69, + 0x44, 0x58, 0x6e, 0x62, 0x6c, 0x74, 0x7a, 0x43, 0x73, 0x49, 0x6a, 0x75, 0x42, 0x30, 0x4f, 0x76, 0x33, 0x73, + 0x57, 0x76, 0x6e, 0x62, 0x6e, 0x54, 0x79, 0x48, 0x4a, 0x52, 0x6e, 0x4e, 0x51, 0x68, 0x6b, 0x33, 0x6e, 0x6a, + 0x38, 0x5c, 0x0a, + 0x09, 0x33, 0x4c, 0x39, 0x79, 0x66, 0x41, 0x34, 0x43, 0x6c, 0x46, 0x55, 0x47, 0x52, 0x2f, 0x35, 0x38, 0x5a, + 0x58, 0x43, 0x41, 0x51, 0x30, 0x62, 0x6b, 0x6a, 0x61, 0x6e, 0x53, 0x59, 0x41, 0x30, 0x43, 0x58, 0x6b, 0x4d, + 0x4a, 0x43, 0x49, 0x54, 0x37, 0x79, 0x41, 0x77, 0x6f, 0x67, 0x73, 0x46, 0x56, 0x63, 0x63, 0x63, 0x44, 0x6a, + 0x54, 0x4c, 0x61, 0x75, 0x48, 0x71, 0x4e, 0x47, 0x67, 0x79, 0x73, 0x39, 0x38, 0x77, 0x6c, 0x61, 0x61, 0x64, + 0x4c, 0x5c, 0x0a, + 0x09, 0x6a, 0x54, 0x62, 0x55, 0x35, 0x57, 0x44, 0x67, 0x34, 0x50, 0x43, 0x52, 0x66, 0x2f, 0x77, 0x59, 0x37, + 0x70, 0x75, 0x5a, 0x6a, 0x37, 0x79, 0x4c, 0x56, 0x44, 0x4e, 0x59, 0x71, 0x4d, 0x34, 0x4f, 0x6e, 0x4a, 0x59, + 0x2f, 0x79, 0x38, 0x4a, 0x63, 0x74, 0x50, 0x61, 0x59, 0x75, 0x6e, 0x37, 0x30, 0x69, 0x71, 0x73, 0x78, 0x4e, + 0x7a, 0x65, 0x48, 0x38, 0x43, 0x61, 0x65, 0x54, 0x74, 0x37, 0x42, 0x67, 0x54, 0x4d, 0x66, 0x67, 0x65, 0x4e, + 0x32, 0x5c, 0x0a, + 0x09, 0x37, 0x6b, 0x53, 0x2f, 0x31, 0x30, 0x65, 0x65, 0x2b, 0x56, 0x54, 0x66, 0x79, 0x37, 0x72, 0x53, 0x54, + 0x51, 0x55, 0x43, 0x6e, 0x64, 0x79, 0x44, 0x41, 0x49, 0x67, 0x38, 0x43, 0x47, 0x63, 0x77, 0x51, 0x43, 0x43, + 0x72, 0x51, 0x4b, 0x44, 0x57, 0x42, 0x35, 0x65, 0x6a, 0x53, 0x46, 0x51, 0x43, 0x43, 0x44, 0x69, 0x48, 0x6e, + 0x4f, 0x6c, 0x4d, 0x67, 0x33, 0x4c, 0x51, 0x6e, 0x5a, 0x37, 0x71, 0x36, 0x6a, 0x73, 0x46, 0x31, 0x74, 0x75, + 0x54, 0x5c, 0x0a, + 0x09, 0x78, 0x52, 0x75, 0x4f, 0x34, 0x65, 0x71, 0x6d, 0x46, 0x51, 0x43, 0x48, 0x4f, 0x69, 0x47, 0x4c, 0x75, + 0x4f, 0x61, 0x61, 0x61, 0x33, 0x44, 0x48, 0x67, 0x30, 0x66, 0x53, 0x7a, 0x45, 0x6f, 0x41, 0x43, 0x51, 0x48, + 0x4f, 0x6e, 0x58, 0x44, 0x35, 0x6c, 0x36, 0x2f, 0x65, 0x30, 0x4a, 0x38, 0x4a, 0x57, 0x39, 0x63, 0x70, 0x77, + 0x49, 0x46, 0x39, 0x70, 0x2b, 0x48, 0x4e, 0x72, 0x33, 0x34, 0x5a, 0x6e, 0x76, 0x33, 0x6b, 0x78, 0x2b, 0x30, + 0x51, 0x5c, 0x0a, + 0x09, 0x74, 0x30, 0x65, 0x4d, 0x74, 0x50, 0x58, 0x72, 0x33, 0x37, 0x36, 0x35, 0x2b, 0x75, 0x70, 0x54, 0x72, + 0x4e, 0x30, 0x6e, 0x6e, 0x49, 0x42, 0x4f, 0x72, 0x34, 0x74, 0x69, 0x4f, 0x41, 0x53, 0x49, 0x4d, 0x4d, 0x51, + 0x51, 0x57, 0x53, 0x58, 0x77, 0x34, 0x58, 0x42, 0x59, 0x75, 0x36, 0x4e, 0x7a, 0x79, 0x44, 0x73, 0x35, 0x55, + 0x4a, 0x43, 0x66, 0x44, 0x6e, 0x51, 0x79, 0x59, 0x46, 0x68, 0x4e, 0x42, 0x7a, 0x49, 0x2b, 0x48, 0x63, 0x68, + 0x52, 0x5c, 0x0a, + 0x09, 0x75, 0x67, 0x49, 0x5a, 0x41, 0x53, 0x37, 0x50, 0x66, 0x66, 0x72, 0x75, 0x58, 0x45, 0x77, 0x2f, 0x77, + 0x33, 0x76, 0x7a, 0x71, 0x49, 0x6f, 0x45, 0x6c, 0x47, 0x55, 0x2b, 0x39, 0x61, 0x77, 0x6f, 0x69, 0x39, 0x4d, + 0x42, 0x50, 0x77, 0x37, 0x76, 0x6e, 0x4e, 0x55, 0x51, 0x73, 0x69, 0x79, 0x75, 0x43, 0x66, 0x67, 0x53, 0x46, + 0x52, 0x42, 0x51, 0x48, 0x66, 0x32, 0x54, 0x37, 0x44, 0x44, 0x36, 0x48, 0x67, 0x4d, 0x4b, 0x49, 0x2f, 0x72, + 0x72, 0x5c, 0x0a, + 0x09, 0x32, 0x31, 0x6e, 0x42, 0x38, 0x46, 0x78, 0x5a, 0x34, 0x76, 0x50, 0x58, 0x33, 0x59, 0x52, 0x6e, 0x58, + 0x58, 0x42, 0x57, 0x62, 0x43, 0x75, 0x38, 0x77, 0x65, 0x62, 0x49, 0x34, 0x6c, 0x49, 0x55, 0x38, 0x61, 0x41, + 0x6f, 0x6b, 0x52, 0x45, 0x68, 0x4a, 0x7a, 0x2b, 0x32, 0x54, 0x70, 0x5a, 0x6a, 0x76, 0x4e, 0x64, 0x42, 0x76, + 0x39, 0x76, 0x42, 0x65, 0x43, 0x39, 0x50, 0x73, 0x37, 0x49, 0x49, 0x46, 0x4d, 0x41, 0x58, 0x76, 0x2f, 0x35, + 0x4e, 0x5c, 0x0a, + 0x09, 0x6b, 0x66, 0x7a, 0x73, 0x4f, 0x66, 0x45, 0x6b, 0x6a, 0x49, 0x33, 0x31, 0x55, 0x51, 0x78, 0x4c, 0x4f, + 0x41, 0x41, 0x35, 0x61, 0x69, 0x63, 0x59, 0x73, 0x6a, 0x66, 0x65, 0x6c, 0x67, 0x43, 0x6f, 0x41, 0x50, 0x49, + 0x4d, 0x4b, 0x46, 0x45, 0x41, 0x4a, 0x5a, 0x42, 0x6e, 0x48, 0x52, 0x51, 0x6f, 0x67, 0x44, 0x4c, 0x7a, 0x4a, + 0x54, 0x49, 0x67, 0x4b, 0x77, 0x6b, 0x6c, 0x2f, 0x46, 0x54, 0x50, 0x46, 0x62, 0x36, 0x6a, 0x70, 0x75, 0x6b, + 0x41, 0x5c, 0x0a, + 0x09, 0x34, 0x45, 0x48, 0x41, 0x46, 0x59, 0x55, 0x48, 0x5a, 0x55, 0x42, 0x4e, 0x42, 0x77, 0x49, 0x35, 0x76, + 0x39, 0x35, 0x51, 0x51, 0x69, 0x7a, 0x61, 0x36, 0x62, 0x57, 0x4b, 0x78, 0x6b, 0x56, 0x4a, 0x6b, 0x6c, 0x4f, + 0x32, 0x65, 0x4d, 0x75, 0x52, 0x74, 0x53, 0x55, 0x57, 0x46, 0x36, 0x76, 0x7a, 0x6c, 0x33, 0x33, 0x31, 0x6d, + 0x2f, 0x69, 0x65, 0x68, 0x2b, 0x2b, 0x7a, 0x32, 0x2f, 0x51, 0x4d, 0x6f, 0x48, 0x44, 0x6c, 0x43, 0x54, 0x2f, + 0x2f, 0x5c, 0x0a, + 0x09, 0x2b, 0x72, 0x66, 0x32, 0x75, 0x74, 0x33, 0x75, 0x6f, 0x4c, 0x6e, 0x67, 0x32, 0x74, 0x4b, 0x36, 0x72, + 0x77, 0x47, 0x38, 0x2b, 0x73, 0x33, 0x76, 0x6e, 0x72, 0x35, 0x76, 0x6f, 0x62, 0x6a, 0x6f, 0x39, 0x42, 0x4e, + 0x33, 0x6a, 0x79, 0x78, 0x33, 0x31, 0x54, 0x58, 0x58, 0x69, 0x66, 0x6e, 0x56, 0x74, 0x75, 0x30, 0x37, 0x6b, + 0x47, 0x55, 0x5a, 0x58, 0x46, 0x68, 0x4d, 0x36, 0x6e, 0x51, 0x77, 0x4a, 0x4b, 0x41, 0x63, 0x46, 0x73, 0x6a, + 0x7a, 0x5c, 0x0a, + 0x09, 0x48, 0x41, 0x56, 0x38, 0x4f, 0x74, 0x4f, 0x68, 0x4c, 0x6f, 0x62, 0x44, 0x5a, 0x65, 0x52, 0x35, 0x42, + 0x72, 0x6a, 0x63, 0x72, 0x78, 0x77, 0x54, 0x49, 0x61, 0x64, 0x71, 0x2f, 0x70, 0x2f, 0x4a, 0x4e, 0x59, 0x48, + 0x77, 0x34, 0x6b, 0x35, 0x6b, 0x42, 0x46, 0x63, 0x43, 0x63, 0x4b, 0x55, 0x43, 0x41, 0x59, 0x5a, 0x52, 0x46, + 0x56, 0x41, 0x45, 0x79, 0x6f, 0x68, 0x51, 0x4f, 0x68, 0x66, 0x39, 0x75, 0x5a, 0x36, 0x42, 0x2b, 0x68, 0x58, + 0x68, 0x5c, 0x0a, + 0x09, 0x73, 0x69, 0x79, 0x6b, 0x6b, 0x54, 0x45, 0x67, 0x69, 0x50, 0x65, 0x31, 0x39, 0x5a, 0x30, 0x43, 0x59, + 0x76, 0x65, 0x37, 0x41, 0x5a, 0x45, 0x56, 0x57, 0x41, 0x74, 0x61, 0x2f, 0x4e, 0x7a, 0x62, 0x2f, 0x76, 0x53, + 0x44, 0x65, 0x50, 0x2b, 0x48, 0x74, 0x75, 0x43, 0x42, 0x42, 0x78, 0x37, 0x45, 0x6f, 0x55, 0x4d, 0x48, 0x73, + 0x54, 0x78, 0x59, 0x54, 0x75, 0x65, 0x37, 0x4d, 0x41, 0x79, 0x36, 0x75, 0x6a, 0x34, 0x32, 0x4d, 0x59, 0x62, + 0x74, 0x5c, 0x0a, + 0x09, 0x32, 0x33, 0x64, 0x67, 0x32, 0x39, 0x51, 0x30, 0x4a, 0x72, 0x64, 0x4f, 0x59, 0x75, 0x65, 0x32, 0x62, + 0x54, 0x68, 0x75, 0x2b, 0x7a, 0x53, 0x32, 0x54, 0x57, 0x33, 0x42, 0x72, 0x6d, 0x33, 0x54, 0x2b, 0x4f, 0x49, + 0x56, 0x58, 0x78, 0x61, 0x38, 0x37, 0x74, 0x69, 0x31, 0x45, 0x33, 0x6e, 0x65, 0x41, 0x64, 0x77, 0x51, 0x42, + 0x47, 0x41, 0x49, 0x6f, 0x45, 0x4d, 0x64, 0x46, 0x45, 0x57, 0x42, 0x54, 0x71, 0x63, 0x54, 0x51, 0x55, 0x41, + 0x37, 0x5c, 0x0a, + 0x09, 0x56, 0x77, 0x6e, 0x2f, 0x6b, 0x74, 0x49, 0x63, 0x75, 0x51, 0x4b, 0x42, 0x44, 0x46, 0x6c, 0x4a, 0x4b, + 0x46, 0x79, 0x42, 0x4c, 0x49, 0x4a, 0x79, 0x79, 0x55, 0x41, 0x67, 0x71, 0x38, 0x62, 0x4f, 0x4d, 0x75, 0x70, + 0x71, 0x4c, 0x59, 0x66, 0x72, 0x41, 0x78, 0x41, 0x35, 0x41, 0x44, 0x77, 0x49, 0x5a, 0x48, 0x41, 0x4d, 0x6c, + 0x4c, 0x6b, 0x38, 0x68, 0x42, 0x7a, 0x5a, 0x4a, 0x39, 0x65, 0x5a, 0x6c, 0x6e, 0x56, 0x6a, 0x39, 0x6c, 0x44, + 0x56, 0x5c, 0x0a, + 0x09, 0x65, 0x65, 0x50, 0x2f, 0x65, 0x4a, 0x65, 0x38, 0x48, 0x63, 0x6e, 0x57, 0x45, 0x56, 0x69, 0x62, 0x4f, + 0x79, 0x59, 0x6d, 0x4a, 0x30, 0x37, 0x61, 0x73, 0x32, 0x76, 0x6e, 0x54, 0x64, 0x67, 0x67, 0x32, 0x6f, 0x68, + 0x46, 0x77, 0x4e, 0x50, 0x65, 0x2f, 0x49, 0x37, 0x33, 0x2f, 0x69, 0x69, 0x41, 0x78, 0x41, 0x43, 0x74, 0x56, + 0x7a, 0x41, 0x48, 0x6f, 0x55, 0x31, 0x4f, 0x54, 0x73, 0x62, 0x55, 0x50, 0x73, 0x59, 0x57, 0x6c, 0x32, 0x50, + 0x59, 0x5c, 0x0a, + 0x09, 0x41, 0x57, 0x68, 0x49, 0x30, 0x51, 0x43, 0x70, 0x4c, 0x4e, 0x48, 0x70, 0x65, 0x42, 0x44, 0x49, 0x34, + 0x72, 0x62, 0x4e, 0x49, 0x63, 0x71, 0x69, 0x52, 0x45, 0x61, 0x5a, 0x57, 0x68, 0x67, 0x45, 0x73, 0x72, 0x4b, + 0x73, 0x51, 0x43, 0x42, 0x44, 0x6c, 0x6a, 0x6d, 0x55, 0x4d, 0x66, 0x49, 0x51, 0x79, 0x68, 0x41, 0x31, 0x57, + 0x43, 0x59, 0x67, 0x72, 0x4d, 0x2b, 0x35, 0x79, 0x75, 0x69, 0x41, 0x65, 0x68, 0x72, 0x67, 0x79, 0x7a, 0x76, + 0x34, 0x5c, 0x0a, + 0x09, 0x4c, 0x61, 0x63, 0x63, 0x4d, 0x50, 0x51, 0x39, 0x2f, 0x57, 0x67, 0x55, 0x4c, 0x4f, 0x6f, 0x6e, 0x35, + 0x34, 0x32, 0x49, 0x4a, 0x51, 0x77, 0x70, 0x6f, 0x41, 0x38, 0x42, 0x64, 0x39, 0x78, 0x2b, 0x75, 0x2b, 0x67, + 0x72, 0x72, 0x6a, 0x74, 0x51, 0x65, 0x69, 0x74, 0x52, 0x79, 0x39, 0x76, 0x42, 0x59, 0x57, 0x46, 0x75, 0x41, + 0x51, 0x76, 0x7a, 0x64, 0x2b, 0x44, 0x4f, 0x4f, 0x2b, 0x35, 0x49, 0x51, 0x49, 0x50, 0x50, 0x63, 0x51, 0x45, + 0x67, 0x5c, 0x0a, + 0x09, 0x79, 0x33, 0x4e, 0x4d, 0x62, 0x5a, 0x6e, 0x79, 0x69, 0x33, 0x6f, 0x56, 0x4b, 0x4f, 0x63, 0x41, 0x43, + 0x67, 0x4b, 0x79, 0x61, 0x6a, 0x79, 0x64, 0x6a, 0x67, 0x65, 0x44, 0x6f, 0x6d, 0x44, 0x4c, 0x4c, 0x62, 0x33, + 0x58, 0x52, 0x38, 0x55, 0x41, 0x41, 0x43, 0x41, 0x41, 0x53, 0x55, 0x52, 0x42, 0x56, 0x42, 0x57, 0x56, 0x5a, + 0x51, 0x45, 0x51, 0x6b, 0x47, 0x63, 0x63, 0x42, 0x41, 0x6f, 0x67, 0x49, 0x2b, 0x54, 0x49, 0x55, 0x62, 0x71, + 0x79, 0x5c, 0x0a, + 0x09, 0x63, 0x6d, 0x35, 0x72, 0x59, 0x52, 0x42, 0x52, 0x48, 0x33, 0x46, 0x68, 0x4d, 0x49, 0x41, 0x41, 0x67, + 0x44, 0x4a, 0x4a, 0x73, 0x52, 0x67, 0x6f, 0x46, 0x30, 0x57, 0x4d, 0x36, 0x6e, 0x70, 0x38, 0x34, 0x59, 0x33, + 0x47, 0x63, 0x56, 0x46, 0x57, 0x36, 0x53, 0x55, 0x43, 0x41, 0x34, 0x2f, 0x38, 0x31, 0x58, 0x63, 0x4f, 0x47, + 0x6f, 0x45, 0x76, 0x6b, 0x62, 0x55, 0x45, 0x55, 0x46, 0x65, 0x73, 0x50, 0x65, 0x75, 0x53, 0x70, 0x2b, 0x38, + 0x34, 0x5c, 0x0a, + 0x09, 0x64, 0x50, 0x44, 0x67, 0x70, 0x67, 0x4b, 0x41, 0x5a, 0x4b, 0x37, 0x4c, 0x35, 0x38, 0x63, 0x61, 0x5a, + 0x59, 0x4d, 0x52, 0x39, 0x2f, 0x70, 0x2b, 0x37, 0x2f, 0x5a, 0x77, 0x47, 0x63, 0x68, 0x7a, 0x78, 0x78, 0x76, + 0x43, 0x30, 0x41, 0x31, 0x42, 0x63, 0x41, 0x67, 0x33, 0x6d, 0x68, 0x77, 0x48, 0x67, 0x51, 0x79, 0x41, 0x38, + 0x31, 0x66, 0x4b, 0x73, 0x76, 0x52, 0x52, 0x50, 0x30, 0x77, 0x48, 0x4b, 0x49, 0x43, 0x41, 0x58, 0x34, 0x6b, + 0x4f, 0x5c, 0x0a, + 0x09, 0x36, 0x77, 0x5a, 0x6c, 0x34, 0x65, 0x38, 0x47, 0x79, 0x4c, 0x73, 0x44, 0x6a, 0x47, 0x63, 0x69, 0x63, + 0x59, 0x73, 0x77, 0x49, 0x30, 0x4c, 0x68, 0x77, 0x68, 0x52, 0x41, 0x52, 0x64, 0x65, 0x73, 0x76, 0x71, 0x32, + 0x6c, 0x6c, 0x53, 0x39, 0x53, 0x66, 0x42, 0x37, 0x52, 0x53, 0x52, 0x70, 0x61, 0x6c, 0x4a, 0x4f, 0x36, 0x68, + 0x38, 0x33, 0x4c, 0x57, 0x74, 0x48, 0x4c, 0x4d, 0x6b, 0x35, 0x42, 0x4a, 0x45, 0x45, 0x70, 0x76, 0x74, 0x4b, + 0x62, 0x5c, 0x0a, + 0x09, 0x38, 0x78, 0x6d, 0x6d, 0x75, 0x48, 0x48, 0x73, 0x2f, 0x6c, 0x79, 0x2f, 0x33, 0x30, 0x65, 0x6e, 0x32, + 0x77, 0x48, 0x59, 0x62, 0x31, 0x73, 0x34, 0x35, 0x30, 0x41, 0x75, 0x78, 0x37, 0x42, 0x44, 0x6f, 0x4b, 0x4c, + 0x77, 0x30, 0x7a, 0x46, 0x32, 0x2b, 0x79, 0x38, 0x36, 0x54, 0x74, 0x56, 0x57, 0x50, 0x52, 0x30, 0x49, 0x49, + 0x4a, 0x42, 0x44, 0x54, 0x67, 0x63, 0x51, 0x49, 0x33, 0x78, 0x39, 0x74, 0x30, 0x62, 0x65, 0x46, 0x59, 0x68, + 0x4f, 0x5c, 0x0a, + 0x09, 0x47, 0x71, 0x5a, 0x6f, 0x52, 0x4d, 0x69, 0x63, 0x42, 0x77, 0x47, 0x65, 0x6b, 0x51, 0x58, 0x5a, 0x42, + 0x50, 0x32, 0x4b, 0x73, 0x55, 0x62, 0x32, 0x35, 0x49, 0x71, 0x2b, 0x30, 0x42, 0x55, 0x6b, 0x43, 0x44, 0x54, + 0x75, 0x44, 0x53, 0x42, 0x6d, 0x76, 0x38, 0x61, 0x59, 0x49, 0x36, 0x42, 0x58, 0x31, 0x2f, 0x65, 0x65, 0x73, + 0x48, 0x76, 0x48, 0x4a, 0x52, 0x65, 0x63, 0x47, 0x31, 0x38, 0x4d, 0x6b, 0x70, 0x33, 0x31, 0x35, 0x46, 0x52, + 0x50, 0x5c, 0x0a, + 0x09, 0x61, 0x30, 0x6a, 0x72, 0x41, 0x67, 0x42, 0x68, 0x39, 0x39, 0x39, 0x72, 0x66, 0x76, 0x59, 0x2f, 0x34, + 0x33, 0x66, 0x65, 0x39, 0x7a, 0x38, 0x54, 0x77, 0x51, 0x72, 0x44, 0x56, 0x59, 0x49, 0x50, 0x52, 0x74, 0x37, + 0x74, 0x64, 0x4e, 0x51, 0x74, 0x61, 0x70, 0x38, 0x4a, 0x4f, 0x44, 0x66, 0x30, 0x36, 0x53, 0x5a, 0x71, 0x4a, + 0x52, 0x56, 0x67, 0x6d, 0x55, 0x41, 0x78, 0x46, 0x43, 0x75, 0x64, 0x4a, 0x53, 0x6f, 0x51, 0x71, 0x47, 0x61, + 0x4d, 0x5c, 0x0a, + 0x09, 0x57, 0x52, 0x61, 0x6d, 0x41, 0x31, 0x52, 0x6e, 0x41, 0x6a, 0x6d, 0x78, 0x39, 0x4a, 0x4e, 0x51, 0x6c, + 0x68, 0x6e, 0x43, 0x42, 0x71, 0x49, 0x34, 0x48, 0x65, 0x43, 0x33, 0x43, 0x4a, 0x30, 0x54, 0x74, 0x77, 0x6a, + 0x35, 0x32, 0x47, 0x49, 0x66, 0x70, 0x52, 0x46, 0x35, 0x41, 0x68, 0x42, 0x53, 0x62, 0x55, 0x42, 0x38, 0x63, + 0x55, 0x2b, 0x73, 0x66, 0x49, 0x50, 0x45, 0x4f, 0x2f, 0x64, 0x35, 0x2b, 0x37, 0x45, 0x39, 0x39, 0x73, 0x6c, + 0x54, 0x5c, 0x0a, + 0x09, 0x7a, 0x76, 0x35, 0x59, 0x48, 0x35, 0x4e, 0x62, 0x37, 0x48, 0x64, 0x50, 0x50, 0x48, 0x44, 0x2f, 0x2f, + 0x61, 0x4c, 0x2f, 0x71, 0x6d, 0x47, 0x70, 0x43, 0x77, 0x64, 0x70, 0x30, 0x4f, 0x51, 0x42, 0x4f, 0x65, 0x2f, + 0x6b, 0x6f, 0x69, 0x30, 0x69, 0x2f, 0x36, 0x4d, 0x58, 0x6e, 0x53, 0x7a, 0x48, 0x45, 0x41, 0x36, 0x35, 0x79, + 0x31, 0x45, 0x55, 0x66, 0x6f, 0x72, 0x6d, 0x62, 0x2f, 0x4d, 0x42, 0x79, 0x4a, 0x7a, 0x58, 0x67, 0x66, 0x4d, + 0x72, 0x5c, 0x0a, + 0x09, 0x2f, 0x6f, 0x55, 0x41, 0x67, 0x53, 0x48, 0x4c, 0x42, 0x44, 0x4b, 0x66, 0x6e, 0x59, 0x48, 0x67, 0x73, + 0x68, 0x78, 0x55, 0x46, 0x69, 0x4e, 0x76, 0x45, 0x54, 0x72, 0x6e, 0x36, 0x69, 0x6b, 0x61, 0x6b, 0x56, 0x2b, + 0x6a, 0x59, 0x51, 0x59, 0x54, 0x73, 0x6a, 0x4d, 0x48, 0x76, 0x37, 0x45, 0x6f, 0x2f, 0x68, 0x41, 0x4e, 0x56, + 0x49, 0x51, 0x32, 0x35, 0x4b, 0x74, 0x76, 0x52, 0x59, 0x37, 0x61, 0x72, 0x78, 0x48, 0x4b, 0x62, 0x35, 0x32, + 0x61, 0x5c, 0x0a, + 0x09, 0x51, 0x71, 0x39, 0x36, 0x65, 0x47, 0x77, 0x55, 0x58, 0x58, 0x44, 0x57, 0x36, 0x54, 0x39, 0x2b, 0x31, + 0x69, 0x6d, 0x37, 0x75, 0x67, 0x41, 0x2b, 0x42, 0x65, 0x66, 0x6d, 0x67, 0x36, 0x2b, 0x73, 0x31, 0x2b, 0x61, + 0x67, 0x4e, 0x64, 0x38, 0x49, 0x46, 0x4c, 0x66, 0x2b, 0x2b, 0x75, 0x7a, 0x73, 0x50, 0x33, 0x33, 0x39, 0x6c, + 0x6e, 0x74, 0x66, 0x2b, 0x6f, 0x34, 0x50, 0x2f, 0x73, 0x4e, 0x7a, 0x51, 0x4a, 0x54, 0x78, 0x4c, 0x5a, 0x37, + 0x31, 0x5c, 0x0a, + 0x09, 0x73, 0x55, 0x2f, 0x76, 0x50, 0x76, 0x32, 0x76, 0x6e, 0x34, 0x6d, 0x37, 0x37, 0x77, 0x44, 0x67, 0x34, + 0x71, 0x63, 0x2f, 0x45, 0x79, 0x42, 0x43, 0x4d, 0x53, 0x78, 0x51, 0x6c, 0x50, 0x34, 0x64, 0x38, 0x30, 0x55, + 0x78, 0x39, 0x43, 0x6e, 0x6d, 0x63, 0x42, 0x6c, 0x46, 0x36, 0x66, 0x78, 0x69, 0x59, 0x46, 0x47, 0x69, 0x4b, + 0x41, 0x75, 0x55, 0x52, 0x59, 0x48, 0x53, 0x2b, 0x51, 0x30, 0x2f, 0x77, 0x2b, 0x6f, 0x70, 0x77, 0x4c, 0x4a, + 0x30, 0x5c, 0x0a, + 0x09, 0x4b, 0x41, 0x73, 0x2f, 0x48, 0x58, 0x44, 0x4f, 0x4e, 0x57, 0x77, 0x57, 0x38, 0x6d, 0x35, 0x63, 0x4f, + 0x6c, 0x64, 0x46, 0x48, 0x74, 0x38, 0x2f, 0x33, 0x79, 0x63, 0x51, 0x65, 0x41, 0x59, 0x51, 0x6f, 0x30, 0x35, + 0x41, 0x70, 0x7a, 0x54, 0x39, 0x5a, 0x4c, 0x49, 0x6f, 0x43, 0x7a, 0x4f, 0x39, 0x4e, 0x39, 0x50, 0x7a, 0x6b, + 0x42, 0x6e, 0x6f, 0x6a, 0x45, 0x4a, 0x46, 0x46, 0x31, 0x35, 0x33, 0x2f, 0x2f, 0x34, 0x44, 0x65, 0x4e, 0x4f, + 0x6c, 0x5c, 0x0a, + 0x09, 0x4c, 0x38, 0x48, 0x55, 0x65, 0x42, 0x38, 0x54, 0x76, 0x51, 0x36, 0x32, 0x6a, 0x50, 0x66, 0x38, 0x63, + 0x77, 0x4f, 0x69, 0x59, 0x52, 0x58, 0x68, 0x71, 0x71, 0x59, 0x4f, 0x4c, 0x77, 0x78, 0x77, 0x5a, 0x47, 0x45, + 0x4a, 0x63, 0x30, 0x76, 0x4c, 0x6d, 0x46, 0x31, 0x63, 0x78, 0x74, 0x7a, 0x69, 0x49, 0x75, 0x35, 0x35, 0x38, + 0x44, 0x41, 0x4f, 0x48, 0x70, 0x37, 0x46, 0x66, 0x51, 0x63, 0x50, 0x34, 0x37, 0x61, 0x37, 0x37, 0x38, 0x56, + 0x6c, 0x5c, 0x0a, + 0x09, 0x6c, 0x33, 0x30, 0x79, 0x38, 0x6a, 0x43, 0x35, 0x64, 0x51, 0x73, 0x65, 0x2f, 0x38, 0x51, 0x6e, 0x59, + 0x31, 0x67, 0x73, 0x6f, 0x79, 0x78, 0x4b, 0x4c, 0x43, 0x38, 0x76, 0x56, 0x2b, 0x6c, 0x2b, 0x67, 0x58, 0x49, + 0x34, 0x52, 0x4f, 0x6b, 0x63, 0x68, 0x6d, 0x55, 0x42, 0x4e, 0x79, 0x77, 0x78, 0x4c, 0x50, 0x78, 0x54, 0x65, + 0x76, 0x47, 0x36, 0x4b, 0x2f, 0x33, 0x2b, 0x67, 0x4b, 0x48, 0x66, 0x78, 0x31, 0x47, 0x36, 0x61, 0x6d, 0x39, + 0x41, 0x5c, 0x0a, + 0x09, 0x61, 0x65, 0x38, 0x54, 0x4b, 0x45, 0x72, 0x2f, 0x53, 0x31, 0x42, 0x38, 0x45, 0x62, 0x5a, 0x70, 0x73, + 0x78, 0x43, 0x41, 0x4f, 0x6a, 0x75, 0x4c, 0x61, 0x77, 0x4b, 0x57, 0x54, 0x70, 0x77, 0x41, 0x41, 0x53, 0x45, + 0x50, 0x61, 0x2b, 0x46, 0x50, 0x5a, 0x51, 0x66, 0x4a, 0x47, 0x67, 0x77, 0x72, 0x51, 0x30, 0x52, 0x34, 0x33, + 0x35, 0x74, 0x2f, 0x45, 0x30, 0x39, 0x2b, 0x35, 0x44, 0x34, 0x35, 0x5a, 0x57, 0x78, 0x61, 0x61, 0x50, 0x51, + 0x44, 0x5c, 0x0a, + 0x09, 0x75, 0x41, 0x64, 0x45, 0x66, 0x77, 0x62, 0x6e, 0x33, 0x67, 0x62, 0x67, 0x62, 0x6d, 0x42, 0x39, 0x51, + 0x47, 0x42, 0x4e, 0x4d, 0x77, 0x44, 0x32, 0x76, 0x72, 0x4f, 0x4c, 0x51, 0x66, 0x51, 0x4f, 0x41, 0x47, 0x65, + 0x65, 0x75, 0x32, 0x38, 0x33, 0x2f, 0x75, 0x6a, 0x58, 0x58, 0x69, 0x4b, 0x46, 0x59, 0x74, 0x77, 0x4b, 0x66, + 0x4d, 0x71, 0x4e, 0x33, 0x38, 0x48, 0x74, 0x74, 0x39, 0x31, 0x57, 0x74, 0x31, 0x57, 0x57, 0x36, 0x49, 0x2b, + 0x4e, 0x5c, 0x0a, + 0x09, 0x41, 0x53, 0x42, 0x51, 0x45, 0x59, 0x54, 0x61, 0x38, 0x55, 0x61, 0x53, 0x64, 0x77, 0x41, 0x4d, 0x67, + 0x55, 0x34, 0x48, 0x42, 0x52, 0x58, 0x41, 0x73, 0x46, 0x4c, 0x51, 0x73, 0x41, 0x41, 0x79, 0x6f, 0x4a, 0x4e, + 0x33, 0x4d, 0x43, 0x79, 0x47, 0x79, 0x48, 0x4f, 0x71, 0x68, 0x6a, 0x79, 0x73, 0x70, 0x77, 0x4f, 0x77, 0x46, + 0x67, 0x5a, 0x4c, 0x66, 0x33, 0x63, 0x67, 0x70, 0x70, 0x2b, 0x4f, 0x5a, 0x51, 0x4a, 0x68, 0x73, 0x78, 0x44, + 0x56, 0x5c, 0x0a, + 0x09, 0x55, 0x53, 0x63, 0x59, 0x5a, 0x6b, 0x77, 0x2f, 0x41, 0x5a, 0x46, 0x62, 0x56, 0x6c, 0x59, 0x54, 0x6f, + 0x70, 0x63, 0x76, 0x57, 0x68, 0x75, 0x51, 0x54, 0x74, 0x31, 0x44, 0x39, 0x61, 0x5a, 0x64, 0x68, 0x45, 0x30, + 0x72, 0x31, 0x69, 0x65, 0x63, 0x73, 0x42, 0x76, 0x6e, 0x6e, 0x38, 0x36, 0x65, 0x73, 0x62, 0x4c, 0x41, 0x6e, + 0x61, 0x72, 0x2f, 0x43, 0x45, 0x4c, 0x75, 0x55, 0x78, 0x4e, 0x39, 0x54, 0x45, 0x33, 0x30, 0x55, 0x44, 0x74, + 0x4b, 0x5c, 0x0a, + 0x09, 0x35, 0x51, 0x6c, 0x56, 0x6d, 0x56, 0x76, 0x75, 0x4f, 0x34, 0x78, 0x50, 0x58, 0x48, 0x5a, 0x35, 0x35, + 0x48, 0x6c, 0x35, 0x73, 0x49, 0x78, 0x4f, 0x78, 0x39, 0x39, 0x36, 0x58, 0x63, 0x59, 0x41, 0x48, 0x56, 0x65, + 0x62, 0x6b, 0x6c, 0x39, 0x32, 0x4b, 0x5a, 0x44, 0x44, 0x6f, 0x63, 0x7a, 0x39, 0x77, 0x75, 0x42, 0x77, 0x4f, + 0x50, 0x53, 0x4c, 0x75, 0x4d, 0x36, 0x42, 0x48, 0x50, 0x6b, 0x73, 0x4c, 0x66, 0x65, 0x72, 0x39, 0x79, 0x69, + 0x42, 0x5c, 0x0a, + 0x09, 0x67, 0x67, 0x6f, 0x51, 0x73, 0x55, 0x7a, 0x41, 0x5a, 0x55, 0x41, 0x5a, 0x31, 0x67, 0x54, 0x38, 0x59, + 0x6d, 0x32, 0x5a, 0x35, 0x30, 0x77, 0x66, 0x4f, 0x68, 0x4e, 0x67, 0x4a, 0x68, 0x57, 0x6d, 0x41, 0x32, 0x4b, + 0x4e, 0x68, 0x75, 0x76, 0x45, 0x70, 0x7a, 0x47, 0x55, 0x65, 0x62, 0x73, 0x53, 0x74, 0x77, 0x52, 0x44, 0x39, + 0x6f, 0x4d, 0x55, 0x6d, 0x50, 0x6e, 0x55, 0x7a, 0x46, 0x70, 0x41, 0x35, 0x47, 0x56, 0x4f, 0x4f, 0x2f, 0x36, + 0x34, 0x5c, 0x0a, + 0x09, 0x32, 0x71, 0x62, 0x6a, 0x32, 0x6f, 0x35, 0x4c, 0x51, 0x53, 0x43, 0x63, 0x49, 0x39, 0x6f, 0x44, 0x34, + 0x46, 0x64, 0x42, 0x65, 0x44, 0x45, 0x63, 0x6e, 0x67, 0x7a, 0x67, 0x75, 0x6c, 0x52, 0x35, 0x71, 0x30, 0x39, + 0x72, 0x74, 0x67, 0x2b, 0x67, 0x76, 0x4f, 0x36, 0x54, 0x71, 0x4b, 0x7a, 0x34, 0x46, 0x30, 0x48, 0x30, 0x4c, + 0x77, 0x44, 0x4f, 0x39, 0x46, 0x63, 0x43, 0x68, 0x44, 0x5a, 0x55, 0x72, 0x41, 0x52, 0x79, 0x36, 0x73, 0x6b, + 0x6e, 0x5c, 0x0a, + 0x09, 0x56, 0x61, 0x58, 0x39, 0x47, 0x73, 0x44, 0x69, 0x34, 0x69, 0x4c, 0x79, 0x50, 0x45, 0x65, 0x33, 0x30, + 0x30, 0x48, 0x57, 0x79, 0x64, 0x48, 0x70, 0x64, 0x50, 0x31, 0x47, 0x6b, 0x37, 0x7a, 0x6a, 0x74, 0x77, 0x50, + 0x6e, 0x48, 0x57, 0x52, 0x55, 0x33, 0x58, 0x2f, 0x75, 0x31, 0x50, 0x73, 0x41, 0x77, 0x6a, 0x33, 0x70, 0x54, + 0x71, 0x63, 0x4c, 0x45, 0x4d, 0x58, 0x4e, 0x51, 0x6d, 0x48, 0x2f, 0x51, 0x45, 0x35, 0x36, 0x73, 0x31, 0x43, + 0x31, 0x5c, 0x0a, + 0x09, 0x75, 0x53, 0x51, 0x61, 0x55, 0x39, 0x67, 0x50, 0x51, 0x47, 0x79, 0x66, 0x51, 0x48, 0x55, 0x74, 0x4c, + 0x41, 0x37, 0x6c, 0x75, 0x56, 0x42, 0x32, 0x32, 0x43, 0x55, 0x51, 0x7a, 0x49, 0x67, 0x62, 0x58, 0x74, 0x79, + 0x32, 0x7a, 0x49, 0x79, 0x4d, 0x52, 0x78, 0x43, 0x52, 0x68, 0x6a, 0x73, 0x6e, 0x72, 0x6f, 0x66, 0x79, 0x4f, + 0x76, 0x30, 0x4d, 0x49, 0x4c, 0x4a, 0x6a, 0x32, 0x33, 0x51, 0x38, 0x59, 0x7a, 0x71, 0x2f, 0x71, 0x68, 0x64, + 0x42, 0x5c, 0x0a, + 0x09, 0x49, 0x46, 0x34, 0x4c, 0x58, 0x73, 0x51, 0x69, 0x5a, 0x6a, 0x57, 0x75, 0x48, 0x5a, 0x4e, 0x6a, 0x6b, + 0x52, 0x63, 0x43, 0x59, 0x62, 0x43, 0x30, 0x35, 0x4b, 0x63, 0x2b, 0x65, 0x59, 0x35, 0x4f, 0x70, 0x31, 0x64, + 0x39, 0x64, 0x76, 0x7a, 0x57, 0x33, 0x38, 0x78, 0x76, 0x2f, 0x38, 0x30, 0x6f, 0x38, 0x7a, 0x72, 0x49, 0x73, + 0x2b, 0x70, 0x38, 0x56, 0x6d, 0x33, 0x64, 0x39, 0x76, 0x73, 0x7a, 0x38, 0x6a, 0x78, 0x48, 0x33, 0x76, 0x48, + 0x6e, 0x5c, 0x0a, + 0x09, 0x63, 0x37, 0x5a, 0x5a, 0x4b, 0x4d, 0x38, 0x36, 0x6c, 0x55, 0x35, 0x79, 0x68, 0x41, 0x31, 0x43, 0x47, + 0x63, 0x68, 0x76, 0x49, 0x38, 0x68, 0x71, 0x77, 0x37, 0x48, 0x32, 0x43, 0x55, 0x52, 0x4a, 0x4d, 0x35, 0x33, + 0x55, 0x6d, 0x37, 0x63, 0x49, 0x33, 0x50, 0x41, 0x63, 0x6b, 0x4f, 0x67, 0x6a, 0x5a, 0x41, 0x4d, 0x61, 0x6a, + 0x44, 0x55, 0x51, 0x38, 0x30, 0x2f, 0x41, 0x36, 0x79, 0x72, 0x63, 0x31, 0x64, 0x6d, 0x39, 0x65, 0x77, 0x2f, + 0x32, 0x5c, 0x0a, + 0x09, 0x37, 0x70, 0x79, 0x71, 0x5a, 0x53, 0x73, 0x79, 0x41, 0x4f, 0x4d, 0x63, 0x31, 0x34, 0x48, 0x44, 0x4c, + 0x68, 0x44, 0x39, 0x41, 0x62, 0x41, 0x2b, 0x4c, 0x77, 0x78, 0x64, 0x45, 0x77, 0x41, 0x6f, 0x72, 0x2f, 0x31, + 0x6b, 0x47, 0x4f, 0x64, 0x7a, 0x41, 0x4c, 0x77, 0x64, 0x67, 0x46, 0x2b, 0x36, 0x64, 0x62, 0x55, 0x6a, 0x2b, + 0x41, 0x2f, 0x31, 0x79, 0x53, 0x34, 0x64, 0x4f, 0x4f, 0x30, 0x55, 0x41, 0x50, 0x56, 0x43, 0x31, 0x70, 0x48, + 0x5a, 0x5c, 0x0a, + 0x09, 0x49, 0x33, 0x36, 0x6a, 0x53, 0x54, 0x64, 0x48, 0x4a, 0x38, 0x2b, 0x52, 0x42, 0x65, 0x66, 0x76, 0x64, + 0x69, 0x6f, 0x51, 0x79, 0x4a, 0x46, 0x33, 0x4f, 0x76, 0x35, 0x61, 0x74, 0x55, 0x73, 0x77, 0x62, 0x45, 0x7a, + 0x78, 0x42, 0x75, 0x64, 0x33, 0x6f, 0x51, 0x48, 0x77, 0x52, 0x70, 0x64, 0x33, 0x34, 0x6c, 0x32, 0x43, 0x75, + 0x42, 0x4f, 0x4e, 0x36, 0x73, 0x31, 0x43, 0x65, 0x64, 0x79, 0x51, 0x51, 0x73, 0x6b, 0x4f, 0x4e, 0x54, 0x45, + 0x33, 0x5c, 0x0a, + 0x09, 0x44, 0x38, 0x61, 0x6e, 0x6c, 0x72, 0x6c, 0x7a, 0x37, 0x73, 0x77, 0x36, 0x6b, 0x6d, 0x54, 0x31, 0x74, + 0x62, 0x67, 0x7a, 0x45, 0x48, 0x55, 0x61, 0x47, 0x39, 0x32, 0x4d, 0x7a, 0x55, 0x31, 0x35, 0x2b, 0x57, 0x43, + 0x51, 0x76, 0x44, 0x77, 0x41, 0x37, 0x44, 0x73, 0x35, 0x52, 0x48, 0x2b, 0x2b, 0x59, 0x4b, 0x63, 0x7a, 0x45, + 0x5a, 0x4c, 0x66, 0x31, 0x56, 0x30, 0x4e, 0x55, 0x54, 0x2b, 0x43, 0x41, 0x62, 0x42, 0x31, 0x76, 0x49, 0x76, + 0x39, 0x5c, 0x0a, + 0x09, 0x42, 0x77, 0x35, 0x45, 0x6e, 0x54, 0x6a, 0x6e, 0x73, 0x4c, 0x43, 0x34, 0x69, 0x45, 0x34, 0x6c, 0x38, + 0x32, 0x36, 0x33, 0x68, 0x37, 0x78, 0x54, 0x67, 0x34, 0x42, 0x33, 0x37, 0x67, 0x35, 0x79, 0x71, 0x6e, 0x59, + 0x44, 0x52, 0x6e, 0x44, 0x49, 0x32, 0x41, 0x61, 0x75, 0x43, 0x71, 0x41, 0x5a, 0x43, 0x46, 0x41, 0x45, 0x67, + 0x64, 0x72, 0x35, 0x69, 0x51, 0x69, 0x55, 0x5a, 0x38, 0x67, 0x6f, 0x72, 0x39, 0x5a, 0x6f, 0x36, 0x73, 0x31, + 0x57, 0x5c, 0x0a, + 0x09, 0x4e, 0x51, 0x6a, 0x34, 0x7a, 0x34, 0x7a, 0x72, 0x68, 0x75, 0x6b, 0x6b, 0x49, 0x36, 0x36, 0x66, 0x61, + 0x6a, 0x32, 0x6e, 0x4f, 0x67, 0x34, 0x50, 0x47, 0x46, 0x6e, 0x62, 0x74, 0x6d, 0x50, 0x47, 0x35, 0x61, 0x54, + 0x73, 0x59, 0x37, 0x70, 0x66, 0x42, 0x61, 0x68, 0x51, 0x68, 0x6f, 0x68, 0x77, 0x33, 0x6a, 0x6d, 0x50, 0x4e, + 0x4b, 0x4b, 0x39, 0x5a, 0x66, 0x73, 0x61, 0x42, 0x43, 0x6a, 0x55, 0x75, 0x52, 0x68, 0x45, 0x50, 0x77, 0x69, + 0x73, 0x5c, 0x0a, + 0x09, 0x50, 0x51, 0x69, 0x73, 0x35, 0x55, 0x37, 0x41, 0x63, 0x54, 0x69, 0x38, 0x79, 0x78, 0x39, 0x57, 0x45, + 0x5a, 0x38, 0x50, 0x57, 0x71, 0x53, 0x61, 0x53, 0x4d, 0x36, 0x66, 0x66, 0x75, 0x49, 0x4a, 0x56, 0x54, 0x58, + 0x2f, 0x37, 0x35, 0x34, 0x37, 0x37, 0x76, 0x54, 0x4f, 0x54, 0x6a, 0x34, 0x4c, 0x36, 0x48, 0x61, 0x37, 0x79, + 0x44, 0x76, 0x42, 0x79, 0x54, 0x50, 0x6b, 0x65, 0x62, 0x66, 0x4b, 0x42, 0x44, 0x78, 0x41, 0x64, 0x44, 0x6f, + 0x64, 0x5c, 0x0a, + 0x09, 0x55, 0x4d, 0x63, 0x62, 0x56, 0x56, 0x35, 0x46, 0x48, 0x63, 0x6f, 0x38, 0x61, 0x41, 0x42, 0x2b, 0x52, + 0x64, 0x6c, 0x48, 0x71, 0x73, 0x6f, 0x49, 0x77, 0x34, 0x37, 0x42, 0x4c, 0x49, 0x43, 0x41, 0x6a, 0x7a, 0x70, + 0x41, 0x5a, 0x56, 0x79, 0x5a, 0x4e, 0x4c, 0x71, 0x6a, 0x41, 0x59, 0x45, 0x73, 0x70, 0x76, 0x44, 0x47, 0x6b, + 0x6c, 0x47, 0x6d, 0x56, 0x70, 0x79, 0x72, 0x6f, 0x54, 0x76, 0x32, 0x54, 0x34, 0x67, 0x6c, 0x74, 0x46, 0x4c, + 0x35, 0x5c, 0x0a, + 0x09, 0x63, 0x45, 0x68, 0x62, 0x4f, 0x55, 0x44, 0x73, 0x50, 0x2b, 0x6c, 0x34, 0x33, 0x67, 0x57, 0x59, 0x51, + 0x53, 0x6c, 0x79, 0x30, 0x75, 0x6d, 0x4a, 0x41, 0x55, 0x4d, 0x77, 0x52, 0x6d, 0x33, 0x41, 0x52, 0x48, 0x6a, + 0x34, 0x77, 0x30, 0x36, 0x76, 0x4d, 0x78, 0x55, 0x69, 0x48, 0x48, 0x7a, 0x77, 0x51, 0x58, 0x51, 0x37, 0x6e, + 0x65, 0x6a, 0x30, 0x58, 0x5a, 0x55, 0x4a, 0x35, 0x48, 0x6d, 0x4f, 0x76, 0x4e, 0x76, 0x78, 0x4f, 0x73, 0x68, + 0x71, 0x5c, 0x0a, + 0x09, 0x52, 0x38, 0x2b, 0x79, 0x76, 0x4d, 0x34, 0x45, 0x34, 0x72, 0x62, 0x75, 0x72, 0x4e, 0x37, 0x4b, 0x6e, + 0x58, 0x4d, 0x51, 0x51, 0x41, 0x55, 0x55, 0x55, 0x4e, 0x75, 0x47, 0x4b, 0x62, 0x4b, 0x6e, 0x51, 0x55, 0x43, + 0x77, 0x4c, 0x55, 0x43, 0x67, 0x42, 0x6d, 0x54, 0x48, 0x50, 0x6c, 0x30, 0x41, 0x41, 0x53, 0x55, 0x72, 0x6e, + 0x64, 0x72, 0x7a, 0x7a, 0x36, 0x41, 0x37, 0x73, 0x5a, 0x5a, 0x54, 0x58, 0x58, 0x76, 0x73, 0x32, 0x51, 0x2b, + 0x76, 0x5c, 0x0a, + 0x09, 0x5a, 0x53, 0x73, 0x59, 0x43, 0x6e, 0x4b, 0x76, 0x50, 0x76, 0x6e, 0x55, 0x68, 0x4d, 0x76, 0x64, 0x30, + 0x35, 0x38, 0x43, 0x57, 0x50, 0x4f, 0x33, 0x42, 0x71, 0x38, 0x64, 0x41, 0x42, 0x43, 0x39, 0x43, 0x45, 0x53, + 0x56, 0x52, 0x66, 0x4c, 0x49, 0x77, 0x79, 0x30, 0x65, 0x36, 0x6e, 0x78, 0x4e, 0x46, 0x35, 0x31, 0x39, 0x75, + 0x6a, 0x68, 0x31, 0x37, 0x7a, 0x31, 0x33, 0x59, 0x62, 0x67, 0x38, 0x52, 0x4c, 0x66, 0x58, 0x52, 0x5a, 0x62, + 0x6c, 0x5c, 0x0a, + 0x09, 0x79, 0x4c, 0x50, 0x4d, 0x67, 0x30, 0x43, 0x33, 0x34, 0x36, 0x63, 0x44, 0x48, 0x5a, 0x39, 0x36, 0x78, + 0x71, 0x66, 0x50, 0x73, 0x67, 0x79, 0x64, 0x33, 0x45, 0x38, 0x58, 0x59, 0x72, 0x70, 0x5a, 0x58, 0x51, 0x2f, + 0x62, 0x68, 0x6e, 0x6b, 0x6d, 0x51, 0x45, 0x54, 0x79, 0x32, 0x59, 0x47, 0x73, 0x33, 0x6e, 0x49, 0x4d, 0x49, + 0x4b, 0x61, 0x66, 0x52, 0x35, 0x30, 0x4a, 0x56, 0x4e, 0x2f, 0x7a, 0x4d, 0x4e, 0x38, 0x55, 0x71, 0x61, 0x64, + 0x48, 0x5c, 0x0a, + 0x09, 0x2b, 0x79, 0x79, 0x58, 0x4b, 0x53, 0x78, 0x69, 0x53, 0x57, 0x5a, 0x6b, 0x6f, 0x6b, 0x35, 0x64, 0x52, + 0x70, 0x44, 0x7a, 0x2f, 0x58, 0x37, 0x50, 0x67, 0x5a, 0x50, 0x72, 0x45, 0x34, 0x6d, 0x63, 0x5a, 0x58, 0x6e, + 0x47, 0x65, 0x47, 0x71, 0x6f, 0x70, 0x44, 0x49, 0x44, 0x7a, 0x77, 0x77, 0x65, 0x66, 0x65, 0x5a, 0x2b, 0x77, + 0x63, 0x75, 0x64, 0x64, 0x39, 0x36, 0x4f, 0x72, 0x41, 0x4c, 0x6a, 0x43, 0x41, 0x49, 0x68, 0x45, 0x2b, 0x68, + 0x32, 0x5c, 0x0a, + 0x09, 0x34, 0x70, 0x4f, 0x61, 0x49, 0x52, 0x76, 0x4c, 0x71, 0x71, 0x32, 0x2b, 0x6e, 0x64, 0x78, 0x48, 0x38, + 0x67, 0x41, 0x53, 0x47, 0x57, 0x55, 0x4d, 0x6f, 0x48, 0x4d, 0x66, 0x36, 0x53, 0x73, 0x51, 0x36, 0x47, 0x53, + 0x64, 0x57, 0x68, 0x38, 0x4b, 0x42, 0x4a, 0x44, 0x56, 0x64, 0x79, 0x45, 0x79, 0x49, 0x58, 0x65, 0x53, 0x4d, + 0x6d, 0x56, 0x62, 0x75, 0x59, 0x50, 0x42, 0x38, 0x7a, 0x51, 0x2b, 0x57, 0x6d, 0x43, 0x59, 0x58, 0x6a, 0x69, + 0x59, 0x5c, 0x0a, + 0x09, 0x4f, 0x75, 0x44, 0x54, 0x4d, 0x73, 0x75, 0x63, 0x51, 0x7a, 0x62, 0x33, 0x31, 0x50, 0x50, 0x50, 0x72, + 0x47, 0x57, 0x70, 0x4d, 0x39, 0x38, 0x41, 0x74, 0x6b, 0x48, 0x47, 0x73, 0x52, 0x45, 0x6d, 0x66, 0x77, 0x38, + 0x51, 0x4f, 0x77, 0x47, 0x38, 0x45, 0x47, 0x74, 0x4d, 0x71, 0x77, 0x34, 0x41, 0x62, 0x4e, 0x58, 0x2f, 0x2b, + 0x66, 0x47, 0x6b, 0x4d, 0x69, 0x53, 0x5a, 0x59, 0x33, 0x46, 0x72, 0x72, 0x46, 0x50, 0x4f, 0x66, 0x62, 0x75, + 0x6d, 0x5c, 0x0a, + 0x09, 0x63, 0x63, 0x34, 0x35, 0x35, 0x38, 0x52, 0x30, 0x6b, 0x30, 0x43, 0x34, 0x39, 0x5a, 0x61, 0x62, 0x30, + 0x59, 0x6e, 0x47, 0x31, 0x66, 0x56, 0x70, 0x66, 0x54, 0x55, 0x64, 0x36, 0x46, 0x54, 0x54, 0x67, 0x45, 0x36, + 0x6e, 0x4d, 0x73, 0x5a, 0x4f, 0x78, 0x30, 0x65, 0x64, 0x4c, 0x41, 0x4e, 0x31, 0x73, 0x67, 0x6f, 0x63, 0x73, + 0x72, 0x68, 0x4f, 0x49, 0x44, 0x4b, 0x42, 0x76, 0x49, 0x4d, 0x38, 0x7a, 0x30, 0x54, 0x71, 0x58, 0x32, 0x63, + 0x43, 0x5c, 0x0a, + 0x09, 0x46, 0x43, 0x4e, 0x48, 0x76, 0x56, 0x63, 0x64, 0x73, 0x57, 0x37, 0x59, 0x74, 0x77, 0x37, 0x55, 0x69, + 0x33, 0x4f, 0x55, 0x79, 0x39, 0x74, 0x6a, 0x50, 0x42, 0x50, 0x67, 0x35, 0x4f, 0x65, 0x67, 0x57, 0x52, 0x31, + 0x70, 0x39, 0x42, 0x53, 0x64, 0x71, 0x49, 0x37, 0x32, 0x4d, 0x42, 0x79, 0x66, 0x6c, 0x66, 0x75, 0x65, 0x78, + 0x7a, 0x34, 0x47, 0x75, 0x36, 0x62, 0x44, 0x6a, 0x38, 0x30, 0x77, 0x77, 0x30, 0x72, 0x53, 0x65, 0x30, 0x6a, + 0x6a, 0x5c, 0x0a, + 0x09, 0x69, 0x35, 0x48, 0x65, 0x4b, 0x57, 0x4f, 0x74, 0x79, 0x72, 0x6d, 0x4b, 0x55, 0x77, 0x49, 0x75, 0x4f, + 0x75, 0x65, 0x4d, 0x79, 0x49, 0x65, 0x44, 0x77, 0x33, 0x31, 0x33, 0x33, 0x59, 0x58, 0x35, 0x75, 0x56, 0x6d, + 0x66, 0x64, 0x59, 0x57, 0x73, 0x4c, 0x4b, 0x34, 0x4a, 0x73, 0x43, 0x79, 0x67, 0x6d, 0x75, 0x76, 0x6e, 0x57, + 0x59, 0x5a, 0x4f, 0x4a, 0x36, 0x2f, 0x65, 0x32, 0x79, 0x43, 0x6e, 0x41, 0x33, 0x6b, 0x65, 0x73, 0x72, 0x52, + 0x71, 0x5c, 0x0a, + 0x09, 0x48, 0x59, 0x65, 0x38, 0x37, 0x42, 0x47, 0x6d, 0x62, 0x6b, 0x51, 0x67, 0x34, 0x69, 0x43, 0x51, 0x65, + 0x31, 0x33, 0x6d, 0x51, 0x52, 0x2f, 0x56, 0x73, 0x78, 0x78, 0x42, 0x62, 0x75, 0x77, 0x54, 0x71, 0x45, 0x43, + 0x67, 0x47, 0x72, 0x64, 0x66, 0x6f, 0x39, 0x48, 0x36, 0x38, 0x4d, 0x64, 0x5a, 0x6c, 0x72, 0x4d, 0x5a, 0x6c, + 0x4a, 0x79, 0x47, 0x38, 0x54, 0x61, 0x54, 0x39, 0x5a, 0x70, 0x4b, 0x52, 0x6b, 0x39, 0x36, 0x34, 0x68, 0x4f, + 0x77, 0x5c, 0x0a, + 0x09, 0x64, 0x39, 0x63, 0x30, 0x77, 0x44, 0x4b, 0x44, 0x36, 0x50, 0x52, 0x69, 0x76, 0x53, 0x55, 0x63, 0x75, + 0x6d, 0x59, 0x64, 0x41, 0x55, 0x2f, 0x56, 0x75, 0x6c, 0x35, 0x74, 0x57, 0x71, 0x73, 0x4d, 0x49, 0x41, 0x50, + 0x63, 0x52, 0x66, 0x37, 0x51, 0x70, 0x63, 0x62, 0x47, 0x42, 0x79, 0x31, 0x51, 0x44, 0x2b, 0x42, 0x6f, 0x2b, + 0x4c, 0x53, 0x4c, 0x48, 0x6c, 0x63, 0x64, 0x65, 0x69, 0x56, 0x38, 0x38, 0x39, 0x70, 0x72, 0x41, 0x50, 0x67, + 0x64, 0x5c, 0x0a, + 0x09, 0x5a, 0x67, 0x45, 0x45, 0x38, 0x72, 0x43, 0x77, 0x56, 0x4b, 0x30, 0x4a, 0x2b, 0x4b, 0x67, 0x65, 0x4d, + 0x6f, 0x46, 0x4f, 0x7a, 0x41, 0x51, 0x6f, 0x4c, 0x50, 0x37, 0x46, 0x70, 0x77, 0x4c, 0x39, 0x77, 0x71, 0x41, + 0x33, 0x51, 0x4c, 0x2f, 0x67, 0x6c, 0x46, 0x56, 0x47, 0x49, 0x68, 0x59, 0x47, 0x77, 0x33, 0x53, 0x41, 0x38, + 0x6f, 0x6f, 0x58, 0x44, 0x67, 0x4a, 0x38, 0x59, 0x56, 0x43, 0x6c, 0x69, 0x6a, 0x6f, 0x54, 0x34, 0x47, 0x58, + 0x55, 0x5c, 0x0a, + 0x09, 0x50, 0x44, 0x7a, 0x4c, 0x63, 0x6e, 0x45, 0x72, 0x74, 0x42, 0x59, 0x48, 0x57, 0x35, 0x6a, 0x69, 0x6e, + 0x39, 0x46, 0x67, 0x61, 0x6d, 0x64, 0x38, 0x36, 0x75, 0x4d, 0x65, 0x58, 0x63, 0x75, 0x59, 0x55, 0x35, 0x41, + 0x33, 0x31, 0x30, 0x48, 0x73, 0x67, 0x2b, 0x6c, 0x44, 0x52, 0x79, 0x55, 0x64, 0x75, 0x52, 0x78, 0x77, 0x34, + 0x50, 0x68, 0x74, 0x65, 0x4e, 0x53, 0x6a, 0x48, 0x69, 0x58, 0x34, 0x75, 0x66, 0x47, 0x47, 0x47, 0x39, 0x44, + 0x72, 0x5c, 0x0a, + 0x09, 0x64, 0x66, 0x33, 0x36, 0x53, 0x38, 0x67, 0x47, 0x38, 0x68, 0x7a, 0x64, 0x54, 0x72, 0x66, 0x4b, 0x43, + 0x4c, 0x70, 0x78, 0x59, 0x62, 0x44, 0x54, 0x37, 0x53, 0x41, 0x6a, 0x42, 0x67, 0x4c, 0x56, 0x4e, 0x43, 0x43, + 0x5a, 0x44, 0x72, 0x43, 0x70, 0x67, 0x6e, 0x79, 0x41, 0x4b, 0x43, 0x77, 0x4d, 0x56, 0x69, 0x41, 0x51, 0x73, + 0x71, 0x73, 0x34, 0x50, 0x66, 0x4e, 0x33, 0x61, 0x34, 0x51, 0x65, 0x4e, 0x41, 0x68, 0x55, 0x59, 0x36, 0x37, + 0x31, 0x5c, 0x0a, + 0x09, 0x55, 0x53, 0x2b, 0x76, 0x68, 0x6a, 0x45, 0x46, 0x55, 0x42, 0x62, 0x72, 0x4c, 0x30, 0x7a, 0x57, 0x51, + 0x72, 0x77, 0x4d, 0x75, 0x41, 0x6d, 0x45, 0x35, 0x31, 0x78, 0x38, 0x45, 0x63, 0x53, 0x63, 0x54, 0x71, 0x6f, + 0x36, 0x36, 0x69, 0x33, 0x52, 0x6b, 0x2f, 0x43, 0x48, 0x57, 0x47, 0x6d, 0x76, 0x76, 0x5a, 0x69, 0x37, 0x65, + 0x72, 0x51, 0x32, 0x41, 0x45, 0x44, 0x59, 0x43, 0x77, 0x64, 0x2f, 0x41, 0x39, 0x72, 0x46, 0x2f, 0x39, 0x68, + 0x31, 0x5c, 0x0a, + 0x09, 0x6c, 0x51, 0x47, 0x49, 0x72, 0x4b, 0x42, 0x47, 0x77, 0x32, 0x64, 0x66, 0x64, 0x42, 0x37, 0x36, 0x2f, + 0x62, 0x46, 0x34, 0x65, 0x6d, 0x46, 0x2b, 0x48, 0x74, 0x64, 0x64, 0x65, 0x31, 0x30, 0x56, 0x35, 0x58, 0x4e, + 0x30, 0x75, 0x78, 0x31, 0x30, 0x75, 0x7a, 0x31, 0x30, 0x77, 0x6e, 0x53, 0x67, 0x57, 0x68, 0x50, 0x6f, 0x64, + 0x50, 0x49, 0x59, 0x67, 0x54, 0x70, 0x64, 0x6e, 0x79, 0x6e, 0x6b, 0x65, 0x59, 0x34, 0x73, 0x58, 0x4b, 0x39, + 0x41, 0x5c, 0x0a, + 0x09, 0x49, 0x45, 0x51, 0x65, 0x4d, 0x52, 0x33, 0x49, 0x4d, 0x6b, 0x44, 0x4e, 0x4e, 0x65, 0x75, 0x37, 0x41, + 0x79, 0x79, 0x79, 0x5a, 0x6d, 0x79, 0x56, 0x4f, 0x56, 0x4d, 0x70, 0x70, 0x77, 0x61, 0x42, 0x53, 0x6f, 0x6c, + 0x31, 0x35, 0x4f, 0x48, 0x7a, 0x53, 0x32, 0x39, 0x6b, 0x59, 0x54, 0x6f, 0x51, 0x72, 0x78, 0x45, 0x6c, 0x78, + 0x68, 0x55, 0x2b, 0x39, 0x53, 0x37, 0x4b, 0x79, 0x63, 0x6b, 0x4a, 0x2f, 0x4f, 0x43, 0x46, 0x35, 0x36, 0x52, + 0x36, 0x5c, 0x0a, + 0x09, 0x53, 0x46, 0x61, 0x61, 0x30, 0x33, 0x6d, 0x39, 0x69, 0x46, 0x53, 0x36, 0x44, 0x76, 0x45, 0x79, 0x6e, + 0x74, 0x64, 0x6e, 0x58, 0x66, 0x77, 0x6b, 0x77, 0x63, 0x38, 0x33, 0x72, 0x37, 0x6b, 0x61, 0x68, 0x32, 0x64, + 0x6d, 0x4a, 0x41, 0x68, 0x55, 0x43, 0x34, 0x4f, 0x64, 0x62, 0x69, 0x39, 0x6d, 0x42, 0x78, 0x59, 0x49, 0x45, + 0x46, 0x47, 0x38, 0x6c, 0x56, 0x68, 0x6e, 0x41, 0x33, 0x56, 0x6b, 0x62, 0x31, 0x77, 0x59, 0x44, 0x4a, 0x6c, + 0x41, 0x5c, 0x0a, + 0x09, 0x58, 0x6a, 0x2f, 0x65, 0x37, 0x66, 0x58, 0x68, 0x6e, 0x58, 0x6f, 0x6b, 0x43, 0x49, 0x54, 0x73, 0x72, + 0x4c, 0x70, 0x46, 0x4b, 0x50, 0x50, 0x52, 0x4f, 0x71, 0x72, 0x48, 0x4b, 0x51, 0x55, 0x58, 0x44, 0x64, 0x4e, + 0x64, 0x33, 0x48, 0x2f, 0x41, 0x4d, 0x72, 0x2b, 0x7a, 0x7a, 0x7a, 0x6b, 0x62, 0x33, 0x2f, 0x2f, 0x6f, 0x4d, + 0x36, 0x41, 0x61, 0x54, 0x57, 0x33, 0x63, 0x6d, 0x6d, 0x4c, 0x5a, 0x30, 0x36, 0x37, 0x6a, 0x45, 0x69, 0x5a, + 0x57, 0x5c, 0x0a, + 0x09, 0x6d, 0x56, 0x59, 0x66, 0x41, 0x48, 0x78, 0x6b, 0x6e, 0x42, 0x62, 0x7a, 0x53, 0x5a, 0x59, 0x71, 0x65, + 0x57, 0x4b, 0x47, 0x79, 0x41, 0x63, 0x65, 0x55, 0x30, 0x35, 0x2f, 0x2f, 0x71, 0x54, 0x6a, 0x70, 0x76, 0x42, + 0x6a, 0x7a, 0x33, 0x39, 0x32, 0x76, 0x64, 0x42, 0x43, 0x77, 0x4e, 0x56, 0x66, 0x2f, 0x54, 0x66, 0x4d, 0x7a, + 0x42, 0x78, 0x43, 0x6e, 0x6e, 0x65, 0x52, 0x64, 0x37, 0x73, 0x2b, 0x45, 0x2b, 0x6a, 0x32, 0x2f, 0x4a, 0x70, + 0x41, 0x5c, 0x0a, + 0x09, 0x74, 0x52, 0x62, 0x51, 0x79, 0x61, 0x76, 0x50, 0x63, 0x4b, 0x75, 0x77, 0x30, 0x30, 0x47, 0x6e, 0x4d, + 0x71, 0x69, 0x73, 0x57, 0x69, 0x76, 0x67, 0x68, 0x74, 0x66, 0x70, 0x2b, 0x46, 0x64, 0x37, 0x35, 0x39, 0x56, + 0x4c, 0x4c, 0x50, 0x49, 0x71, 0x46, 0x59, 0x32, 0x5a, 0x41, 0x49, 0x46, 0x6c, 0x41, 0x74, 0x55, 0x35, 0x49, + 0x42, 0x6f, 0x61, 0x77, 0x4e, 0x63, 0x45, 0x58, 0x42, 0x77, 0x57, 0x6f, 0x45, 0x41, 0x67, 0x52, 0x68, 0x36, + 0x65, 0x5c, 0x0a, + 0x09, 0x42, 0x64, 0x53, 0x66, 0x56, 0x45, 0x57, 0x65, 0x69, 0x49, 0x47, 0x6f, 0x6e, 0x5a, 0x4e, 0x76, 0x65, + 0x49, 0x6b, 0x70, 0x61, 0x58, 0x58, 0x74, 0x52, 0x35, 0x2f, 0x37, 0x4c, 0x4f, 0x7a, 0x5a, 0x74, 0x6f, 0x58, + 0x4a, 0x47, 0x2f, 0x4b, 0x59, 0x4c, 0x2f, 0x54, 0x70, 0x4e, 0x4c, 0x54, 0x4b, 0x5a, 0x4f, 0x7a, 0x4e, 0x4b, + 0x6c, 0x77, 0x76, 0x33, 0x6f, 0x43, 0x66, 0x2b, 0x2f, 0x68, 0x7a, 0x63, 0x4f, 0x72, 0x65, 0x76, 0x57, 0x49, + 0x75, 0x5c, 0x0a, + 0x09, 0x66, 0x4d, 0x58, 0x6e, 0x50, 0x77, 0x38, 0x43, 0x6f, 0x64, 0x76, 0x31, 0x47, 0x56, 0x61, 0x6e, 0x36, + 0x38, 0x47, 0x67, 0x6d, 0x33, 0x66, 0x51, 0x71, 0x62, 0x49, 0x79, 0x6e, 0x51, 0x6e, 0x6b, 0x56, 0x54, 0x59, + 0x47, 0x71, 0x6d, 0x2f, 0x4e, 0x69, 0x6b, 0x79, 0x67, 0x41, 0x75, 0x7a, 0x77, 0x58, 0x59, 0x42, 0x41, 0x70, + 0x71, 0x63, 0x44, 0x66, 0x6d, 0x6f, 0x58, 0x30, 0x33, 0x7a, 0x6f, 0x57, 0x34, 0x51, 0x79, 0x75, 0x2b, 0x49, + 0x4c, 0x5c, 0x0a, + 0x09, 0x67, 0x33, 0x6d, 0x79, 0x4e, 0x6c, 0x50, 0x72, 0x78, 0x47, 0x63, 0x4d, 0x4b, 0x53, 0x42, 0x62, 0x49, + 0x41, 0x77, 0x48, 0x2f, 0x4f, 0x49, 0x4c, 0x6e, 0x34, 0x4e, 0x65, 0x4a, 0x34, 0x65, 0x77, 0x2b, 0x57, 0x53, + 0x36, 0x61, 0x30, 0x79, 0x7a, 0x4c, 0x46, 0x44, 0x32, 0x4e, 0x6e, 0x38, 0x49, 0x61, 0x30, 0x79, 0x72, 0x44, + 0x77, 0x42, 0x2b, 0x62, 0x4b, 0x55, 0x2b, 0x45, 0x57, 0x46, 0x52, 0x72, 0x77, 0x45, 0x45, 0x45, 0x6f, 0x41, + 0x52, 0x5c, 0x0a, + 0x09, 0x71, 0x6a, 0x69, 0x38, 0x39, 0x4a, 0x49, 0x6e, 0x59, 0x50, 0x75, 0x4f, 0x48, 0x53, 0x4a, 0x74, 0x2f, + 0x75, 0x54, 0x48, 0x2f, 0x77, 0x55, 0x4c, 0x43, 0x2f, 0x50, 0x6f, 0x56, 0x4b, 0x6c, 0x2b, 0x48, 0x66, 0x45, + 0x39, 0x43, 0x47, 0x52, 0x35, 0x57, 0x50, 0x33, 0x50, 0x34, 0x39, 0x32, 0x42, 0x76, 0x4a, 0x6f, 0x75, 0x35, + 0x4e, 0x58, 0x37, 0x42, 0x4d, 0x4c, 0x43, 0x59, 0x46, 0x77, 0x54, 0x43, 0x4f, 0x38, 0x51, 0x79, 0x41, 0x67, + 0x55, 0x5c, 0x0a, + 0x09, 0x4d, 0x67, 0x45, 0x4b, 0x61, 0x77, 0x4a, 0x5a, 0x73, 0x6b, 0x2f, 0x41, 0x41, 0x30, 0x4f, 0x34, 0x4a, + 0x56, 0x57, 0x39, 0x58, 0x30, 0x44, 0x73, 0x45, 0x36, 0x69, 0x4e, 0x52, 0x4b, 0x77, 0x4a, 0x78, 0x4d, 0x67, + 0x6a, 0x4d, 0x34, 0x48, 0x67, 0x31, 0x41, 0x46, 0x49, 0x39, 0x44, 0x36, 0x42, 0x63, 0x4d, 0x77, 0x58, 0x6e, + 0x51, 0x42, 0x67, 0x35, 0x36, 0x35, 0x64, 0x65, 0x4f, 0x6b, 0x6c, 0x54, 0x30, 0x72, 0x58, 0x55, 0x73, 0x51, + 0x71, 0x5c, 0x0a, + 0x09, 0x50, 0x39, 0x4c, 0x35, 0x66, 0x54, 0x77, 0x30, 0x73, 0x67, 0x44, 0x47, 0x71, 0x39, 0x62, 0x4c, 0x78, + 0x46, 0x67, 0x58, 0x4c, 0x33, 0x2f, 0x68, 0x38, 0x78, 0x6d, 0x6d, 0x45, 0x2b, 0x36, 0x39, 0x35, 0x79, 0x35, + 0x38, 0x34, 0x58, 0x4f, 0x66, 0x42, 0x5a, 0x43, 0x68, 0x32, 0x2f, 0x56, 0x37, 0x4d, 0x75, 0x70, 0x70, 0x57, + 0x67, 0x65, 0x64, 0x76, 0x42, 0x74, 0x54, 0x2f, 0x51, 0x41, 0x43, 0x65, 0x53, 0x64, 0x48, 0x4a, 0x2b, 0x67, + 0x6a, 0x5c, 0x0a, + 0x09, 0x79, 0x32, 0x4d, 0x57, 0x46, 0x64, 0x63, 0x4d, 0x71, 0x6b, 0x77, 0x67, 0x72, 0x42, 0x30, 0x63, 0x44, + 0x51, 0x68, 0x34, 0x55, 0x4b, 0x36, 0x6e, 0x57, 0x68, 0x47, 0x67, 0x72, 0x62, 0x73, 0x44, 0x51, 0x53, 0x63, + 0x55, 0x33, 0x67, 0x39, 0x52, 0x54, 0x77, 0x4c, 0x71, 0x6b, 0x64, 0x55, 0x4c, 0x74, 0x51, 0x46, 0x34, 0x2b, + 0x5a, 0x6f, 0x41, 0x76, 0x31, 0x50, 0x7a, 0x37, 0x42, 0x2b, 0x2b, 0x42, 0x45, 0x38, 0x35, 0x4a, 0x2f, 0x7a, + 0x61, 0x5c, 0x0a, + 0x09, 0x6e, 0x51, 0x5a, 0x5a, 0x37, 0x75, 0x54, 0x73, 0x32, 0x4a, 0x4a, 0x35, 0x4f, 0x4f, 0x39, 0x42, 0x35, + 0x4b, 0x62, 0x47, 0x4d, 0x71, 0x74, 0x45, 0x2b, 0x65, 0x74, 0x66, 0x2f, 0x2f, 0x70, 0x56, 0x62, 0x64, 0x44, + 0x64, 0x64, 0x7a, 0x50, 0x67, 0x67, 0x65, 0x56, 0x56, 0x49, 0x75, 0x6f, 0x49, 0x51, 0x37, 0x4a, 0x41, 0x51, + 0x45, 0x38, 0x44, 0x2f, 0x50, 0x48, 0x6b, 0x57, 0x41, 0x2f, 0x62, 0x6a, 0x7a, 0x38, 0x52, 0x6c, 0x33, 0x33, + 0x6d, 0x5c, 0x0a, + 0x09, 0x69, 0x37, 0x48, 0x6b, 0x63, 0x4c, 0x43, 0x4d, 0x57, 0x32, 0x37, 0x36, 0x44, 0x6e, 0x62, 0x76, 0x33, + 0x6f, 0x4d, 0x74, 0x57, 0x36, 0x65, 0x71, 0x64, 0x6c, 0x46, 0x50, 0x4e, 0x79, 0x71, 0x42, 0x65, 0x34, 0x66, + 0x78, 0x62, 0x59, 0x56, 0x6e, 0x2b, 0x6f, 0x4e, 0x79, 0x48, 0x4f, 0x72, 0x55, 0x73, 0x48, 0x37, 0x71, 0x69, + 0x37, 0x33, 0x6f, 0x6f, 0x7a, 0x70, 0x32, 0x6a, 0x6b, 0x66, 0x72, 0x63, 0x4f, 0x79, 0x64, 0x31, 0x6a, 0x39, + 0x41, 0x5c, 0x0a, + 0x09, 0x78, 0x4d, 0x63, 0x6b, 0x30, 0x30, 0x33, 0x2b, 0x50, 0x62, 0x79, 0x43, 0x4c, 0x46, 0x42, 0x34, 0x6b, + 0x30, 0x33, 0x74, 0x33, 0x4b, 0x7a, 0x39, 0x77, 0x44, 0x59, 0x54, 0x52, 0x57, 0x77, 0x33, 0x66, 0x4b, 0x2f, + 0x2b, 0x76, 0x65, 0x6e, 0x56, 0x76, 0x34, 0x42, 0x48, 0x6e, 0x58, 0x36, 0x43, 0x6a, 0x50, 0x5a, 0x31, 0x35, + 0x79, 0x49, 0x61, 0x4c, 0x53, 0x30, 0x58, 0x75, 0x50, 0x7a, 0x71, 0x37, 0x2b, 0x44, 0x50, 0x2f, 0x75, 0x6d, + 0x7a, 0x5c, 0x0a, + 0x09, 0x2b, 0x50, 0x4f, 0x50, 0x66, 0x68, 0x6f, 0x66, 0x2b, 0x75, 0x51, 0x56, 0x2b, 0x4f, 0x71, 0x4e, 0x64, + 0x77, 0x4a, 0x35, 0x44, 0x36, 0x66, 0x75, 0x6e, 0x4a, 0x5a, 0x70, 0x72, 0x37, 0x67, 0x4e, 0x4b, 0x50, 0x56, + 0x31, 0x35, 0x73, 0x6d, 0x37, 0x38, 0x65, 0x33, 0x37, 0x5a, 0x6e, 0x48, 0x44, 0x6a, 0x64, 0x2b, 0x4a, 0x70, + 0x77, 0x38, 0x2b, 0x2b, 0x41, 0x42, 0x6d, 0x5a, 0x6d, 0x5a, 0x77, 0x2f, 0x50, 0x45, 0x6e, 0x6f, 0x74, 0x66, + 0x72, 0x5c, 0x0a, + 0x09, 0x65, 0x67, 0x6c, 0x56, 0x66, 0x4e, 0x63, 0x6a, 0x35, 0x45, 0x2f, 0x4a, 0x49, 0x55, 0x59, 0x37, 0x79, + 0x6f, 0x68, 0x6a, 0x47, 0x67, 0x50, 0x41, 0x71, 0x6b, 0x35, 0x47, 0x6c, 0x54, 0x77, 0x71, 0x4f, 0x56, 0x66, + 0x6a, 0x35, 0x32, 0x56, 0x41, 0x74, 0x5a, 0x61, 0x53, 0x36, 0x52, 0x68, 0x62, 0x58, 0x37, 0x47, 0x75, 0x68, + 0x65, 0x73, 0x31, 0x4b, 0x4e, 0x65, 0x36, 0x63, 0x47, 0x43, 0x4c, 0x75, 0x45, 0x7a, 0x32, 0x6e, 0x45, 0x34, + 0x2f, 0x5c, 0x0a, + 0x09, 0x63, 0x41, 0x42, 0x76, 0x76, 0x66, 0x52, 0x46, 0x6d, 0x4f, 0x68, 0x33, 0x70, 0x65, 0x79, 0x31, 0x6a, + 0x53, 0x76, 0x62, 0x53, 0x4c, 0x4b, 0x44, 0x64, 0x46, 0x72, 0x77, 0x64, 0x6a, 0x6a, 0x38, 0x47, 0x2b, 0x30, + 0x2b, 0x44, 0x57, 0x74, 0x46, 0x61, 0x77, 0x4d, 0x41, 0x52, 0x41, 0x73, 0x67, 0x65, 0x69, 0x57, 0x63, 0x36, + 0x39, 0x56, 0x47, 0x79, 0x49, 0x79, 0x49, 0x4b, 0x52, 0x38, 0x49, 0x78, 0x32, 0x42, 0x47, 0x44, 0x49, 0x47, + 0x61, 0x5c, 0x0a, + 0x09, 0x5a, 0x35, 0x32, 0x79, 0x42, 0x34, 0x66, 0x51, 0x78, 0x56, 0x56, 0x58, 0x58, 0x78, 0x63, 0x56, 0x50, + 0x31, 0x77, 0x65, 0x34, 0x73, 0x5a, 0x76, 0x58, 0x34, 0x2b, 0x5a, 0x77, 0x34, 0x63, 0x41, 0x2b, 0x44, 0x63, + 0x43, 0x39, 0x63, 0x62, 0x36, 0x63, 0x59, 0x48, 0x46, 0x4c, 0x2b, 0x52, 0x41, 0x4b, 0x4d, 0x32, 0x4a, 0x71, + 0x45, 0x68, 0x77, 0x42, 0x4a, 0x41, 0x6a, 0x31, 0x6e, 0x30, 0x77, 0x54, 0x76, 0x38, 0x51, 0x6b, 0x4c, 0x43, + 0x76, 0x5c, 0x0a, + 0x09, 0x47, 0x50, 0x49, 0x63, 0x77, 0x6a, 0x71, 0x79, 0x42, 0x34, 0x48, 0x4b, 0x75, 0x4b, 0x67, 0x32, 0x59, + 0x71, 0x6c, 0x6e, 0x5a, 0x6e, 0x78, 0x73, 0x45, 0x51, 0x71, 0x78, 0x36, 0x64, 0x43, 0x4a, 0x42, 0x42, 0x6b, + 0x69, 0x38, 0x6e, 0x76, 0x56, 0x6c, 0x63, 0x48, 0x78, 0x68, 0x31, 0x46, 0x65, 0x2f, 0x4d, 0x49, 0x66, 0x77, + 0x30, 0x75, 0x65, 0x66, 0x6f, 0x47, 0x55, 0x72, 0x54, 0x6c, 0x33, 0x42, 0x36, 0x36, 0x34, 0x2f, 0x6e, 0x62, + 0x38, 0x5c, 0x0a, + 0x09, 0x38, 0x75, 0x2b, 0x2f, 0x48, 0x33, 0x2f, 0x2b, 0x77, 0x51, 0x2f, 0x6a, 0x32, 0x75, 0x75, 0x2b, 0x69, + 0x64, 0x74, 0x75, 0x76, 0x77, 0x31, 0x33, 0x33, 0x6e, 0x45, 0x58, 0x72, 0x76, 0x33, 0x47, 0x4e, 0x2f, 0x45, + 0x50, 0x6c, 0x2f, 0x30, 0x72, 0x76, 0x6e, 0x6a, 0x39, 0x48, 0x54, 0x6a, 0x37, 0x6a, 0x50, 0x33, 0x59, 0x4f, + 0x61, 0x56, 0x2b, 0x74, 0x6c, 0x37, 0x72, 0x70, 0x6a, 0x72, 0x38, 0x33, 0x72, 0x50, 0x50, 0x77, 0x47, 0x65, + 0x76, 0x5c, 0x0a, + 0x09, 0x76, 0x67, 0x48, 0x33, 0x33, 0x2f, 0x39, 0x41, 0x50, 0x48, 0x2f, 0x34, 0x30, 0x43, 0x46, 0x38, 0x2b, + 0x31, 0x76, 0x66, 0x42, 0x43, 0x6a, 0x44, 0x32, 0x4e, 0x67, 0x59, 0x78, 0x73, 0x62, 0x36, 0x55, 0x54, 0x5a, + 0x78, 0x78, 0x50, 0x71, 0x42, 0x70, 0x69, 0x44, 0x6e, 0x49, 0x41, 0x58, 0x4c, 0x53, 0x51, 0x49, 0x41, 0x4f, + 0x74, 0x6e, 0x47, 0x4b, 0x42, 0x43, 0x51, 0x2f, 0x4d, 0x70, 0x33, 0x4b, 0x46, 0x6a, 0x72, 0x4e, 0x52, 0x34, + 0x45, 0x5c, 0x0a, + 0x09, 0x4d, 0x70, 0x51, 0x49, 0x75, 0x79, 0x2b, 0x6a, 0x4a, 0x71, 0x72, 0x72, 0x69, 0x4c, 0x6f, 0x49, 0x59, + 0x45, 0x42, 0x45, 0x32, 0x4c, 0x48, 0x6a, 0x4f, 0x4c, 0x7a, 0x6e, 0x64, 0x5a, 0x66, 0x69, 0x31, 0x4a, 0x31, + 0x54, 0x4b, 0x73, 0x67, 0x5a, 0x6c, 0x47, 0x77, 0x4f, 0x34, 0x73, 0x4e, 0x4d, 0x6e, 0x50, 0x38, 0x42, 0x4f, + 0x50, 0x63, 0x53, 0x41, 0x49, 0x4f, 0x31, 0x42, 0x49, 0x42, 0x56, 0x66, 0x78, 0x6a, 0x49, 0x37, 0x31, 0x78, + 0x79, 0x5c, 0x0a, + 0x09, 0x41, 0x50, 0x41, 0x52, 0x67, 0x48, 0x34, 0x6f, 0x69, 0x66, 0x5a, 0x4a, 0x5a, 0x45, 0x45, 0x4b, 0x43, + 0x49, 0x41, 0x55, 0x6c, 0x48, 0x4d, 0x59, 0x46, 0x41, 0x36, 0x76, 0x2f, 0x37, 0x4f, 0x2f, 0x78, 0x34, 0x63, + 0x2b, 0x2f, 0x42, 0x47, 0x42, 0x78, 0x76, 0x79, 0x7a, 0x31, 0x2b, 0x39, 0x68, 0x32, 0x2f, 0x62, 0x6a, 0x73, + 0x48, 0x56, 0x36, 0x47, 0x75, 0x50, 0x6a, 0x34, 0x2b, 0x6a, 0x31, 0x65, 0x76, 0x55, 0x74, 0x77, 0x36, 0x7a, + 0x61, 0x5c, 0x0a, + 0x09, 0x54, 0x31, 0x34, 0x4d, 0x4d, 0x52, 0x7a, 0x36, 0x68, 0x34, 0x57, 0x47, 0x52, 0x65, 0x46, 0x66, 0x4c, + 0x6a, 0x6f, 0x73, 0x55, 0x4a, 0x62, 0x56, 0x67, 0x79, 0x6e, 0x56, 0x51, 0x30, 0x54, 0x44, 0x34, 0x54, 0x4b, + 0x41, 0x2b, 0x6b, 0x57, 0x6a, 0x5a, 0x56, 0x6d, 0x4b, 0x46, 0x31, 0x6a, 0x57, 0x44, 0x78, 0x43, 0x56, 0x37, + 0x47, 0x65, 0x6f, 0x79, 0x75, 0x70, 0x52, 0x34, 0x6b, 0x6f, 0x57, 0x37, 0x46, 0x48, 0x69, 0x4d, 0x48, 0x51, + 0x41, 0x5c, 0x0a, + 0x09, 0x79, 0x57, 0x76, 0x49, 0x2b, 0x51, 0x4d, 0x72, 0x44, 0x67, 0x36, 0x75, 0x4b, 0x4f, 0x76, 0x73, 0x68, + 0x4b, 0x30, 0x4a, 0x65, 0x4c, 0x48, 0x34, 0x38, 0x79, 0x39, 0x34, 0x33, 0x72, 0x50, 0x77, 0x75, 0x70, 0x2f, + 0x36, 0x59, 0x58, 0x51, 0x37, 0x32, 0x51, 0x6a, 0x44, 0x38, 0x68, 0x55, 0x2f, 0x63, 0x50, 0x6c, 0x58, 0x38, + 0x61, 0x61, 0x33, 0x76, 0x68, 0x76, 0x44, 0x34, 0x52, 0x41, 0x6e, 0x37, 0x7a, 0x30, 0x56, 0x7a, 0x33, 0x76, + 0x36, 0x5c, 0x0a, + 0x09, 0x78, 0x54, 0x6a, 0x33, 0x59, 0x61, 0x64, 0x69, 0x57, 0x4a, 0x53, 0x34, 0x38, 0x76, 0x71, 0x62, 0x38, + 0x44, 0x63, 0x66, 0x2b, 0x53, 0x63, 0x38, 0x65, 0x50, 0x38, 0x44, 0x6d, 0x4a, 0x71, 0x65, 0x78, 0x6e, 0x2f, + 0x2f, 0x39, 0x66, 0x38, 0x58, 0x54, 0x7a, 0x37, 0x37, 0x4e, 0x4d, 0x6d, 0x77, 0x70, 0x52, 0x4d, 0x41, 0x4e, + 0x39, 0x38, 0x33, 0x67, 0x35, 0x39, 0x2f, 0x77, 0x7a, 0x76, 0x77, 0x6e, 0x65, 0x6f, 0x33, 0x41, 0x66, 0x68, + 0x30, 0x5c, 0x0a, + 0x09, 0x68, 0x6b, 0x41, 0x59, 0x47, 0x78, 0x2f, 0x48, 0x38, 0x53, 0x65, 0x64, 0x6a, 0x4b, 0x6e, 0x70, 0x61, + 0x55, 0x78, 0x4f, 0x62, 0x45, 0x46, 0x76, 0x72, 0x49, 0x64, 0x4f, 0x70, 0x34, 0x4f, 0x79, 0x4c, 0x46, 0x45, + 0x4d, 0x68, 0x2f, 0x48, 0x68, 0x6f, 0x4f, 0x46, 0x77, 0x57, 0x4c, 0x33, 0x67, 0x74, 0x66, 0x43, 0x2f, 0x2f, + 0x56, 0x43, 0x57, 0x2f, 0x71, 0x47, 0x68, 0x30, 0x71, 0x47, 0x6f, 0x5a, 0x46, 0x2b, 0x57, 0x52, 0x61, 0x57, + 0x44, 0x5c, 0x0a, + 0x09, 0x45, 0x6b, 0x58, 0x31, 0x77, 0x42, 0x65, 0x63, 0x41, 0x38, 0x72, 0x71, 0x6f, 0x61, 0x50, 0x53, 0x77, + 0x54, 0x6e, 0x2f, 0x78, 0x43, 0x44, 0x58, 0x55, 0x2f, 0x6c, 0x64, 0x50, 0x45, 0x41, 0x55, 0x39, 0x42, 0x41, + 0x66, 0x45, 0x6f, 0x71, 0x5a, 0x59, 0x66, 0x71, 0x6f, 0x4e, 0x51, 0x41, 0x63, 0x76, 0x2b, 0x64, 0x34, 0x76, + 0x50, 0x4e, 0x31, 0x6c, 0x2b, 0x4b, 0x38, 0x66, 0x58, 0x75, 0x6b, 0x44, 0x75, 0x4b, 0x55, 0x53, 0x67, 0x55, + 0x35, 0x5c, 0x0a, + 0x09, 0x50, 0x67, 0x31, 0x57, 0x41, 0x4a, 0x33, 0x6f, 0x30, 0x4c, 0x6b, 0x66, 0x41, 0x2f, 0x42, 0x42, 0x59, + 0x47, 0x30, 0x66, 0x43, 0x6c, 0x71, 0x54, 0x70, 0x77, 0x48, 0x39, 0x63, 0x77, 0x42, 0x30, 0x4d, 0x59, 0x43, + 0x50, 0x43, 0x32, 0x46, 0x6f, 0x45, 0x67, 0x36, 0x66, 0x48, 0x43, 0x52, 0x43, 0x47, 0x53, 0x77, 0x58, 0x65, + 0x4d, 0x39, 0x48, 0x50, 0x34, 0x73, 0x2f, 0x2f, 0x4f, 0x4f, 0x2f, 0x45, 0x4b, 0x2f, 0x63, 0x53, 0x74, 0x42, + 0x5a, 0x5c, 0x0a, + 0x09, 0x55, 0x59, 0x6a, 0x2b, 0x6e, 0x54, 0x78, 0x48, 0x74, 0x39, 0x39, 0x48, 0x72, 0x39, 0x2f, 0x33, 0x69, + 0x30, 0x7a, 0x38, 0x78, 0x61, 0x47, 0x35, 0x33, 0x4b, 0x77, 0x44, 0x49, 0x50, 0x36, 0x57, 0x58, 0x48, 0x67, + 0x69, 0x7a, 0x62, 0x50, 0x6b, 0x2f, 0x43, 0x75, 0x6e, 0x79, 0x62, 0x2f, 0x53, 0x4f, 0x72, 0x7a, 0x31, 0x70, + 0x6e, 0x37, 0x6d, 0x33, 0x37, 0x47, 0x33, 0x43, 0x66, 0x6b, 0x6e, 0x45, 0x50, 0x6e, 0x38, 0x75, 0x2b, 0x53, + 0x4f, 0x5c, 0x0a, + 0x09, 0x62, 0x72, 0x77, 0x6e, 0x67, 0x45, 0x65, 0x59, 0x4f, 0x72, 0x44, 0x56, 0x42, 0x70, 0x68, 0x6e, 0x47, + 0x56, 0x37, 0x78, 0x73, 0x7a, 0x2b, 0x46, 0x6c, 0x2f, 0x2f, 0x67, 0x45, 0x2b, 0x73, 0x35, 0x72, 0x6b, 0x34, + 0x66, 0x6d, 0x58, 0x46, 0x39, 0x38, 0x4e, 0x4e, 0x58, 0x34, 0x6a, 0x64, 0x2f, 0x37, 0x77, 0x2f, 0x67, 0x34, + 0x50, 0x43, 0x66, 0x58, 0x2f, 0x41, 0x38, 0x76, 0x4f, 0x6f, 0x46, 0x33, 0x31, 0x38, 0x2f, 0x49, 0x56, 0x69, + 0x56, 0x5c, 0x0a, + 0x09, 0x75, 0x66, 0x2f, 0x77, 0x41, 0x6e, 0x37, 0x6a, 0x66, 0x58, 0x2b, 0x44, 0x54, 0x31, 0x7a, 0x2b, 0x53, + 0x66, 0x54, 0x37, 0x59, 0x2f, 0x6a, 0x54, 0x74, 0x2f, 0x77, 0x47, 0x48, 0x6e, 0x76, 0x67, 0x70, 0x46, 0x51, + 0x48, 0x71, 0x5a, 0x48, 0x69, 0x33, 0x70, 0x6c, 0x35, 0x2f, 0x4e, 0x71, 0x37, 0x2f, 0x69, 0x63, 0x2b, 0x38, + 0x39, 0x6e, 0x50, 0x43, 0x66, 0x6e, 0x72, 0x34, 0x37, 0x71, 0x4b, 0x77, 0x2f, 0x6a, 0x45, 0x4f, 0x4d, 0x62, + 0x47, 0x5c, 0x0a, + 0x09, 0x4a, 0x39, 0x45, 0x62, 0x36, 0x79, 0x48, 0x50, 0x71, 0x6c, 0x75, 0x33, 0x6d, 0x63, 0x2b, 0x43, 0x73, + 0x71, 0x78, 0x2b, 0x34, 0x57, 0x64, 0x5a, 0x44, 0x72, 0x33, 0x6f, 0x55, 0x44, 0x6c, 0x6f, 0x36, 0x65, 0x4a, + 0x6a, 0x32, 0x6d, 0x56, 0x52, 0x6f, 0x75, 0x42, 0x50, 0x45, 0x51, 0x59, 0x39, 0x4f, 0x48, 0x38, 0x39, 0x50, + 0x46, 0x48, 0x6f, 0x66, 0x2f, 0x75, 0x78, 0x65, 0x6d, 0x53, 0x34, 0x65, 0x6e, 0x4b, 0x7a, 0x72, 0x4f, 0x62, + 0x7a, 0x5c, 0x0a, + 0x09, 0x34, 0x49, 0x37, 0x4f, 0x5a, 0x4f, 0x31, 0x56, 0x6b, 0x6a, 0x36, 0x69, 0x7a, 0x73, 0x64, 0x78, 0x34, + 0x59, 0x55, 0x58, 0x34, 0x49, 0x30, 0x76, 0x2b, 0x33, 0x39, 0x77, 0x79, 0x6e, 0x46, 0x68, 0x43, 0x73, 0x70, + 0x74, 0x52, 0x30, 0x55, 0x6e, 0x64, 0x68, 0x64, 0x46, 0x67, 0x49, 0x4b, 0x75, 0x56, 0x2b, 0x76, 0x78, 0x74, + 0x51, 0x42, 0x2b, 0x42, 0x31, 0x6a, 0x37, 0x4a, 0x77, 0x4c, 0x58, 0x43, 0x41, 0x41, 0x2b, 0x46, 0x56, 0x44, + 0x77, 0x5c, 0x0a, + 0x09, 0x44, 0x2b, 0x48, 0x77, 0x38, 0x6b, 0x59, 0x41, 0x41, 0x47, 0x79, 0x45, 0x62, 0x4b, 0x4a, 0x4b, 0x55, + 0x56, 0x66, 0x64, 0x66, 0x41, 0x2f, 0x65, 0x2b, 0x63, 0x47, 0x50, 0x34, 0x74, 0x50, 0x2f, 0x2b, 0x74, 0x6e, + 0x71, 0x4e, 0x4d, 0x73, 0x68, 0x6f, 0x59, 0x41, 0x67, 0x4f, 0x46, 0x43, 0x59, 0x35, 0x79, 0x6c, 0x6c, 0x57, + 0x34, 0x2f, 0x57, 0x38, 0x68, 0x52, 0x50, 0x37, 0x38, 0x50, 0x58, 0x6b, 0x56, 0x6c, 0x38, 0x68, 0x7a, 0x4a, + 0x32, 0x5c, 0x0a, + 0x09, 0x42, 0x6b, 0x59, 0x38, 0x4d, 0x75, 0x71, 0x32, 0x72, 0x4c, 0x4c, 0x68, 0x48, 0x44, 0x2f, 0x2b, 0x33, + 0x73, 0x63, 0x39, 0x44, 0x71, 0x2f, 0x36, 0x79, 0x65, 0x66, 0x67, 0x30, 0x65, 0x47, 0x4a, 0x76, 0x35, 0x69, + 0x61, 0x75, 0x2f, 0x71, 0x59, 0x79, 0x58, 0x4e, 0x70, 0x4d, 0x4d, 0x52, 0x50, 0x2f, 0x4e, 0x59, 0x37, 0x63, + 0x65, 0x58, 0x58, 0x72, 0x73, 0x4c, 0x4c, 0x66, 0x2b, 0x59, 0x6e, 0x38, 0x63, 0x76, 0x50, 0x66, 0x51, 0x71, + 0x4c, 0x5c, 0x0a, + 0x09, 0x54, 0x74, 0x57, 0x67, 0x71, 0x2b, 0x2b, 0x4c, 0x67, 0x77, 0x4b, 0x2f, 0x39, 0x74, 0x36, 0x2f, 0x78, + 0x54, 0x2f, 0x2b, 0x30, 0x37, 0x2f, 0x67, 0x42, 0x63, 0x39, 0x37, 0x46, 0x74, 0x37, 0x34, 0x6b, 0x6d, 0x64, + 0x42, 0x47, 0x71, 0x2f, 0x57, 0x51, 0x31, 0x31, 0x33, 0x65, 0x65, 0x6a, 0x77, 0x56, 0x35, 0x2f, 0x36, 0x4e, + 0x37, 0x7a, 0x33, 0x41, 0x78, 0x2f, 0x43, 0x76, 0x66, 0x66, 0x65, 0x6b, 0x77, 0x4b, 0x61, 0x6d, 0x6d, 0x4e, + 0x7a, 0x5c, 0x0a, + 0x09, 0x30, 0x6d, 0x4d, 0x56, 0x4c, 0x34, 0x49, 0x4a, 0x75, 0x6c, 0x56, 0x74, 0x52, 0x62, 0x41, 0x33, 0x5a, + 0x4b, 0x6a, 0x50, 0x6a, 0x36, 0x7a, 0x50, 0x35, 0x43, 0x76, 0x4b, 0x61, 0x6a, 0x4e, 0x6b, 0x2f, 0x6e, 0x7a, + 0x4b, 0x33, 0x6c, 0x50, 0x78, 0x34, 0x68, 0x63, 0x38, 0x43, 0x79, 0x39, 0x34, 0x34, 0x71, 0x50, 0x51, 0x36, + 0x32, 0x59, 0x69, 0x4f, 0x78, 0x4e, 0x52, 0x33, 0x33, 0x4c, 0x73, 0x30, 0x46, 0x6a, 0x55, 0x6d, 0x37, 0x36, + 0x47, 0x5c, 0x0a, + 0x09, 0x65, 0x2b, 0x44, 0x63, 0x79, 0x77, 0x46, 0x38, 0x47, 0x46, 0x69, 0x66, 0x78, 0x34, 0x48, 0x58, 0x37, + 0x48, 0x30, 0x41, 0x31, 0x59, 0x35, 0x41, 0x41, 0x74, 0x46, 0x76, 0x41, 0x48, 0x67, 0x4e, 0x67, 0x44, 0x45, + 0x7a, 0x55, 0x76, 0x45, 0x55, 0x56, 0x36, 0x52, 0x46, 0x47, 0x6a, 0x32, 0x68, 0x36, 0x67, 0x46, 0x58, 0x33, + 0x33, 0x49, 0x50, 0x50, 0x76, 0x36, 0x56, 0x61, 0x33, 0x48, 0x31, 0x4e, 0x32, 0x2f, 0x45, 0x31, 0x36, 0x36, + 0x38, 0x5c, 0x0a, + 0x09, 0x45, 0x76, 0x4e, 0x7a, 0x38, 0x37, 0x36, 0x59, 0x4d, 0x6a, 0x54, 0x4c, 0x43, 0x48, 0x57, 0x30, 0x31, + 0x32, 0x2f, 0x62, 0x43, 0x65, 0x30, 0x6b, 0x42, 0x74, 0x70, 0x77, 0x72, 0x6a, 0x70, 0x68, 0x41, 0x6b, 0x6d, + 0x43, 0x61, 0x58, 0x47, 0x38, 0x61, 0x61, 0x54, 0x55, 0x6b, 0x65, 0x66, 0x6b, 0x55, 0x30, 0x2f, 0x42, 0x45, + 0x79, 0x39, 0x34, 0x4c, 0x4a, 0x37, 0x35, 0x2b, 0x50, 0x4e, 0x78, 0x77, 0x52, 0x6b, 0x6e, 0x48, 0x52, 0x31, + 0x51, 0x5c, 0x0a, + 0x09, 0x73, 0x6b, 0x37, 0x6d, 0x42, 0x30, 0x50, 0x38, 0x30, 0x35, 0x65, 0x2b, 0x69, 0x65, 0x64, 0x64, 0x64, + 0x4c, 0x62, 0x4d, 0x78, 0x41, 0x77, 0x6a, 0x6e, 0x56, 0x74, 0x63, 0x78, 0x76, 0x2f, 0x2b, 0x30, 0x72, 0x56, + 0x34, 0x2f, 0x6b, 0x58, 0x6e, 0x2b, 0x73, 0x30, 0x36, 0x69, 0x58, 0x55, 0x37, 0x6f, 0x33, 0x35, 0x74, 0x30, + 0x45, 0x63, 0x57, 0x42, 0x76, 0x6a, 0x48, 0x4c, 0x31, 0x32, 0x4c, 0x54, 0x33, 0x33, 0x6c, 0x61, 0x6e, 0x7a, + 0x32, 0x5c, 0x0a, + 0x09, 0x63, 0x31, 0x2f, 0x41, 0x34, 0x75, 0x4c, 0x43, 0x69, 0x67, 0x41, 0x51, 0x78, 0x71, 0x33, 0x6c, 0x33, + 0x53, 0x68, 0x66, 0x41, 0x48, 0x71, 0x64, 0x51, 0x4c, 0x2b, 0x77, 0x77, 0x33, 0x78, 0x7a, 0x30, 0x67, 0x68, + 0x77, 0x48, 0x37, 0x58, 0x41, 0x35, 0x35, 0x7a, 0x44, 0x32, 0x57, 0x63, 0x2f, 0x45, 0x75, 0x65, 0x63, 0x39, + 0x58, 0x41, 0x38, 0x34, 0x64, 0x47, 0x50, 0x77, 0x42, 0x4d, 0x66, 0x63, 0x52, 0x72, 0x47, 0x2b, 0x39, 0x57, + 0x62, 0x5c, 0x0a, + 0x09, 0x70, 0x49, 0x38, 0x6d, 0x6c, 0x57, 0x66, 0x79, 0x54, 0x57, 0x30, 0x2f, 0x6e, 0x4d, 0x63, 0x69, 0x67, + 0x44, 0x66, 0x41, 0x34, 0x64, 0x32, 0x41, 0x76, 0x2f, 0x58, 0x33, 0x66, 0x2f, 0x30, 0x4c, 0x51, 0x64, 0x69, + 0x57, 0x59, 0x4d, 0x41, 0x2f, 0x45, 0x2f, 0x42, 0x6a, 0x41, 0x43, 0x34, 0x41, 0x38, 0x4d, 0x6a, 0x71, 0x62, + 0x7a, 0x52, 0x5a, 0x4b, 0x46, 0x71, 0x33, 0x78, 0x38, 0x6f, 0x41, 0x41, 0x47, 0x46, 0x78, 0x4d, 0x4d, 0x54, + 0x4e, 0x5c, 0x0a, + 0x09, 0x39, 0x78, 0x37, 0x43, 0x72, 0x66, 0x63, 0x66, 0x78, 0x45, 0x31, 0x33, 0x33, 0x49, 0x65, 0x37, 0x48, + 0x7a, 0x69, 0x49, 0x75, 0x2b, 0x2b, 0x37, 0x48, 0x33, 0x66, 0x64, 0x63, 0x78, 0x39, 0x75, 0x75, 0x66, 0x6b, + 0x57, 0x7a, 0x4d, 0x33, 0x4f, 0x2b, 0x69, 0x6f, 0x6a, 0x6f, 0x70, 0x43, 0x2b, 0x4c, 0x68, 0x79, 0x79, 0x41, + 0x55, 0x43, 0x53, 0x6c, 0x48, 0x65, 0x46, 0x7a, 0x4d, 0x4c, 0x4d, 0x54, 0x75, 0x42, 0x66, 0x73, 0x58, 0x33, + 0x36, 0x5c, 0x0a, + 0x09, 0x36, 0x61, 0x66, 0x6a, 0x31, 0x46, 0x4e, 0x50, 0x78, 0x72, 0x36, 0x54, 0x6a, 0x73, 0x65, 0x5a, 0x65, + 0x30, 0x2f, 0x43, 0x6d, 0x61, 0x63, 0x65, 0x6a, 0x34, 0x63, 0x64, 0x76, 0x78, 0x31, 0x5a, 0x54, 0x70, 0x45, + 0x6a, 0x51, 0x31, 0x42, 0x49, 0x6e, 0x48, 0x4a, 0x55, 0x78, 0x4e, 0x46, 0x31, 0x47, 0x36, 0x2f, 0x70, 0x6f, + 0x67, 0x31, 0x47, 0x4c, 0x71, 0x5a, 0x34, 0x64, 0x61, 0x67, 0x38, 0x73, 0x72, 0x43, 0x4d, 0x36, 0x32, 0x36, + 0x39, 0x5c, 0x0a, + 0x09, 0x42, 0x39, 0x66, 0x63, 0x64, 0x41, 0x65, 0x2b, 0x66, 0x65, 0x75, 0x64, 0x75, 0x4f, 0x58, 0x32, 0x4f, + 0x33, 0x44, 0x44, 0x74, 0x32, 0x2f, 0x45, 0x6f, 0x55, 0x4f, 0x48, 0x52, 0x41, 0x51, 0x58, 0x30, 0x64, 0x6c, + 0x79, 0x32, 0x42, 0x58, 0x6b, 0x7a, 0x6b, 0x48, 0x42, 0x63, 0x6d, 0x51, 0x74, 0x36, 0x33, 0x72, 0x6b, 0x73, + 0x72, 0x33, 0x6a, 0x54, 0x7a, 0x67, 0x42, 0x4a, 0x35, 0x39, 0x79, 0x45, 0x6b, 0x37, 0x63, 0x76, 0x51, 0x74, + 0x37, 0x5c, 0x0a, + 0x09, 0x64, 0x75, 0x37, 0x41, 0x33, 0x75, 0x4e, 0x33, 0x34, 0x66, 0x51, 0x54, 0x64, 0x32, 0x48, 0x2f, 0x43, + 0x54, 0x75, 0x77, 0x50, 0x66, 0x7a, 0x2b, 0x34, 0x71, 0x68, 0x46, 0x50, 0x43, 0x45, 0x58, 0x50, 0x67, 0x57, + 0x6f, 0x50, 0x32, 0x79, 0x51, 0x63, 0x41, 0x44, 0x6f, 0x43, 0x33, 0x44, 0x75, 0x38, 0x61, 0x47, 0x5a, 0x39, + 0x66, 0x79, 0x70, 0x73, 0x4c, 0x56, 0x2f, 0x49, 0x78, 0x42, 0x2f, 0x6e, 0x4e, 0x48, 0x33, 0x39, 0x57, 0x77, + 0x51, 0x5c, 0x0a, + 0x09, 0x2f, 0x5a, 0x30, 0x6f, 0x4a, 0x46, 0x4b, 0x76, 0x4a, 0x70, 0x52, 0x73, 0x4f, 0x4f, 0x5a, 0x6b, 0x47, + 0x58, 0x2b, 0x6c, 0x34, 0x4e, 0x6d, 0x46, 0x4a, 0x64, 0x78, 0x2f, 0x5a, 0x41, 0x47, 0x48, 0x35, 0x68, 0x5a, + 0x78, 0x61, 0x47, 0x34, 0x42, 0x68, 0x32, 0x63, 0x58, 0x4d, 0x4c, 0x65, 0x34, 0x69, 0x50, 0x6d, 0x46, 0x4a, + 0x53, 0x77, 0x73, 0x2b, 0x54, 0x66, 0x67, 0x7a, 0x43, 0x30, 0x73, 0x59, 0x6d, 0x46, 0x78, 0x43, 0x58, 0x4d, + 0x4c, 0x5c, 0x0a, + 0x09, 0x43, 0x31, 0x68, 0x65, 0x48, 0x6d, 0x4b, 0x32, 0x41, 0x67, 0x32, 0x41, 0x73, 0x4c, 0x43, 0x34, 0x69, + 0x4b, 0x58, 0x42, 0x4d, 0x67, 0x68, 0x2b, 0x76, 0x6e, 0x39, 0x6f, 0x70, 0x74, 0x36, 0x6a, 0x73, 0x57, 0x58, + 0x4c, 0x46, 0x6e, 0x53, 0x72, 0x7a, 0x55, 0x52, 0x45, 0x68, 0x4b, 0x31, 0x62, 0x4a, 0x6a, 0x30, 0x4c, 0x57, + 0x59, 0x61, 0x74, 0x6b, 0x35, 0x50, 0x59, 0x4d, 0x6a, 0x47, 0x4f, 0x79, 0x59, 0x6c, 0x78, 0x54, 0x49, 0x36, + 0x50, 0x5c, 0x0a, + 0x09, 0x59, 0x57, 0x4a, 0x38, 0x44, 0x4a, 0x4e, 0x6a, 0x66, 0x55, 0x79, 0x4f, 0x39, 0x37, 0x46, 0x39, 0x61, + 0x67, 0x76, 0x32, 0x62, 0x4e, 0x75, 0x4b, 0x48, 0x56, 0x76, 0x47, 0x73, 0x58, 0x74, 0x71, 0x41, 0x6d, 0x4f, + 0x39, 0x6a, 0x68, 0x79, 0x48, 0x64, 0x57, 0x7a, 0x4a, 0x69, 0x35, 0x2b, 0x72, 0x68, 0x53, 0x46, 0x6c, 0x6f, + 0x39, 0x76, 0x51, 0x35, 0x30, 0x33, 0x35, 0x42, 0x52, 0x6b, 0x61, 0x37, 0x57, 0x6b, 0x6a, 0x46, 0x39, 0x6b, + 0x61, 0x5c, 0x0a, + 0x09, 0x7a, 0x31, 0x42, 0x6b, 0x74, 0x6e, 0x4c, 0x76, 0x6f, 0x54, 0x6e, 0x63, 0x65, 0x33, 0x67, 0x57, 0x39, + 0x38, 0x33, 0x4d, 0x34, 0x39, 0x36, 0x44, 0x4d, 0x35, 0x69, 0x64, 0x58, 0x38, 0x54, 0x63, 0x34, 0x68, 0x4c, + 0x6d, 0x35, 0x68, 0x63, 0x78, 0x75, 0x37, 0x69, 0x49, 0x75, 0x64, 0x6c, 0x35, 0x7a, 0x4d, 0x37, 0x4e, 0x59, + 0x62, 0x62, 0x4b, 0x35, 0x67, 0x62, 0x4c, 0x79, 0x31, 0x68, 0x59, 0x58, 0x50, 0x49, 0x74, 0x4b, 0x62, 0x6c, + 0x76, 0x5c, 0x0a, + 0x09, 0x6d, 0x39, 0x34, 0x57, 0x58, 0x7a, 0x49, 0x79, 0x50, 0x6a, 0x36, 0x47, 0x58, 0x74, 0x66, 0x66, 0x68, + 0x75, 0x76, 0x32, 0x65, 0x68, 0x6a, 0x72, 0x39, 0x37, 0x46, 0x6c, 0x66, 0x42, 0x7a, 0x6a, 0x6b, 0x32, 0x50, + 0x59, 0x4f, 0x6a, 0x36, 0x4f, 0x69, 0x66, 0x45, 0x2b, 0x4a, 0x76, 0x6f, 0x39, 0x72, 0x34, 0x75, 0x78, 0x48, + 0x71, 0x61, 0x32, 0x54, 0x47, 0x44, 0x37, 0x6c, 0x6e, 0x48, 0x73, 0x6e, 0x4a, 0x72, 0x45, 0x63, 0x56, 0x76, + 0x47, 0x5c, 0x0a, + 0x09, 0x61, 0x39, 0x6b, 0x48, 0x6e, 0x67, 0x55, 0x77, 0x73, 0x6d, 0x79, 0x55, 0x6b, 0x35, 0x61, 0x54, 0x4d, + 0x36, 0x36, 0x74, 0x42, 0x42, 0x71, 0x65, 0x76, 0x67, 0x33, 0x67, 0x6a, 0x50, 0x56, 0x2b, 0x48, 0x79, 0x43, + 0x77, 0x44, 0x67, 0x44, 0x41, 0x71, 0x66, 0x70, 0x64, 0x77, 0x4a, 0x38, 0x45, 0x38, 0x4f, 0x63, 0x41, 0x6a, + 0x49, 0x69, 0x6c, 0x55, 0x6c, 0x73, 0x39, 0x58, 0x37, 0x58, 0x71, 0x48, 0x45, 0x33, 0x4b, 0x4e, 0x51, 0x49, + 0x59, 0x5c, 0x0a, + 0x09, 0x6d, 0x76, 0x73, 0x30, 0x2b, 0x6f, 0x75, 0x73, 0x4e, 0x44, 0x67, 0x6c, 0x70, 0x34, 0x5a, 0x46, 0x4f, + 0x65, 0x6b, 0x34, 0x49, 0x77, 0x43, 0x75, 0x61, 0x65, 0x70, 0x6a, 0x4f, 0x72, 0x49, 0x31, 0x31, 0x57, 0x67, + 0x79, 0x4f, 0x73, 0x4f, 0x68, 0x78, 0x64, 0x69, 0x4d, 0x61, 0x31, 0x59, 0x32, 0x4d, 0x56, 0x4c, 0x2b, 0x7a, + 0x42, 0x6d, 0x61, 0x6a, 0x46, 0x2b, 0x74, 0x49, 0x30, 0x67, 0x41, 0x55, 0x58, 0x77, 0x6c, 0x55, 0x30, 0x4c, + 0x47, 0x5c, 0x0a, + 0x09, 0x6f, 0x78, 0x6b, 0x63, 0x72, 0x4d, 0x7a, 0x47, 0x34, 0x4f, 0x6b, 0x6f, 0x31, 0x6a, 0x64, 0x45, 0x50, + 0x35, 0x78, 0x45, 0x47, 0x64, 0x6a, 0x6a, 0x46, 0x54, 0x70, 0x6e, 0x59, 0x30, 0x7a, 0x6c, 0x63, 0x67, 0x68, + 0x77, 0x32, 0x77, 0x46, 0x67, 0x76, 0x58, 0x38, 0x6e, 0x63, 0x48, 0x31, 0x2f, 0x47, 0x59, 0x68, 0x55, 0x6e, + 0x30, 0x45, 0x49, 0x32, 0x73, 0x6d, 0x42, 0x57, 0x6c, 0x42, 0x4f, 0x66, 0x59, 0x39, 0x31, 0x72, 0x43, 0x6a, + 0x46, 0x5c, 0x0a, + 0x09, 0x79, 0x6c, 0x72, 0x47, 0x71, 0x64, 0x74, 0x4d, 0x6a, 0x67, 0x32, 0x44, 0x30, 0x50, 0x33, 0x78, 0x64, + 0x6e, 0x6c, 0x5a, 0x67, 0x6e, 0x47, 0x4f, 0x55, 0x76, 0x42, 0x77, 0x31, 0x58, 0x2b, 0x4f, 0x6a, 0x34, 0x6c, + 0x64, 0x4a, 0x45, 0x6a, 0x44, 0x34, 0x6d, 0x33, 0x7a, 0x66, 0x6f, 0x56, 0x42, 0x68, 0x6e, 0x34, 0x4a, 0x6f, + 0x6b, 0x46, 0x74, 0x74, 0x43, 0x34, 0x34, 0x51, 0x58, 0x43, 0x53, 0x68, 0x6f, 0x6a, 0x6d, 0x77, 0x6a, 0x58, + 0x6c, 0x5c, 0x0a, + 0x09, 0x58, 0x46, 0x61, 0x45, 0x71, 0x77, 0x65, 0x6c, 0x2b, 0x4e, 0x46, 0x6c, 0x64, 0x4c, 0x75, 0x73, 0x6e, + 0x53, 0x41, 0x54, 0x41, 0x64, 0x43, 0x36, 0x50, 0x72, 0x63, 0x56, 0x4a, 0x65, 0x4d, 0x77, 0x6c, 0x73, 0x67, + 0x72, 0x30, 0x72, 0x5a, 0x69, 0x66, 0x53, 0x4f, 0x53, 0x77, 0x36, 0x56, 0x74, 0x43, 0x48, 0x6c, 0x43, 0x6e, + 0x68, 0x63, 0x41, 0x47, 0x4d, 0x5a, 0x4c, 0x36, 0x58, 0x68, 0x72, 0x5a, 0x75, 0x72, 0x78, 0x38, 0x2f, 0x6f, + 0x31, 0x5c, 0x0a, + 0x09, 0x48, 0x39, 0x73, 0x41, 0x64, 0x49, 0x33, 0x4b, 0x61, 0x30, 0x34, 0x62, 0x38, 0x4e, 0x4e, 0x67, 0x33, + 0x42, 0x6c, 0x47, 0x52, 0x43, 0x4e, 0x53, 0x43, 0x6d, 0x38, 0x4b, 0x61, 0x46, 0x45, 0x4a, 0x6b, 0x45, 0x49, + 0x64, 0x6c, 0x58, 0x6f, 0x46, 0x4a, 0x34, 0x4f, 0x54, 0x39, 0x65, 0x4a, 0x35, 0x6b, 0x75, 0x31, 0x6f, 0x67, + 0x30, 0x77, 0x56, 0x6d, 0x41, 0x4b, 0x56, 0x61, 0x4a, 0x65, 0x55, 0x59, 0x62, 0x48, 0x50, 0x34, 0x46, 0x69, + 0x78, 0x5c, 0x0a, + 0x09, 0x58, 0x7a, 0x62, 0x6d, 0x36, 0x4b, 0x51, 0x6a, 0x6f, 0x71, 0x6a, 0x6c, 0x66, 0x4d, 0x5a, 0x68, 0x37, + 0x44, 0x50, 0x4b, 0x52, 0x50, 0x47, 0x6b, 0x51, 0x5a, 0x6a, 0x4c, 0x4e, 0x59, 0x34, 0x66, 0x54, 0x45, 0x62, + 0x38, 0x55, 0x34, 0x31, 0x58, 0x38, 0x41, 0x63, 0x6b, 0x44, 0x68, 0x66, 0x59, 0x31, 0x69, 0x41, 0x57, 0x4c, + 0x76, 0x4c, 0x32, 0x65, 0x41, 0x53, 0x4e, 0x49, 0x4f, 0x54, 0x53, 0x74, 0x6f, 0x6e, 0x58, 0x34, 0x55, 0x77, + 0x70, 0x5c, 0x0a, + 0x09, 0x4a, 0x30, 0x36, 0x79, 0x48, 0x53, 0x67, 0x52, 0x57, 0x76, 0x62, 0x4a, 0x36, 0x6f, 0x63, 0x79, 0x5a, + 0x69, 0x42, 0x53, 0x64, 0x54, 0x69, 0x49, 0x52, 0x46, 0x42, 0x53, 0x31, 0x32, 0x73, 0x66, 0x32, 0x4a, 0x41, + 0x66, 0x43, 0x74, 0x32, 0x6f, 0x48, 0x77, 0x64, 0x4e, 0x55, 0x37, 0x64, 0x41, 0x53, 0x53, 0x6f, 0x63, 0x4c, + 0x7a, 0x51, 0x59, 0x50, 0x4b, 0x76, 0x44, 0x6f, 0x34, 0x70, 0x49, 0x57, 0x31, 0x56, 0x45, 0x44, 0x63, 0x62, + 0x76, 0x5c, 0x0a, + 0x09, 0x64, 0x46, 0x6e, 0x56, 0x64, 0x32, 0x78, 0x62, 0x4b, 0x55, 0x34, 0x37, 0x4e, 0x51, 0x65, 0x50, 0x70, + 0x67, 0x77, 0x69, 0x38, 0x4d, 0x4c, 0x37, 0x34, 0x56, 0x6b, 0x44, 0x35, 0x7a, 0x30, 0x36, 0x50, 0x36, 0x54, + 0x52, 0x36, 0x43, 0x6c, 0x41, 0x4b, 0x42, 0x76, 0x6c, 0x78, 0x79, 0x4b, 0x5a, 0x48, 0x6f, 0x38, 0x6c, 0x4e, + 0x2b, 0x32, 0x41, 0x31, 0x6c, 0x52, 0x44, 0x52, 0x48, 0x34, 0x6d, 0x4d, 0x33, 0x59, 0x71, 0x38, 0x69, 0x68, + 0x6b, 0x5c, 0x0a, + 0x09, 0x6f, 0x74, 0x72, 0x68, 0x73, 0x72, 0x41, 0x79, 0x4a, 0x64, 0x36, 0x67, 0x6e, 0x6d, 0x4a, 0x77, 0x2b, + 0x66, 0x4d, 0x4d, 0x49, 0x4d, 0x71, 0x64, 0x38, 0x61, 0x39, 0x31, 0x4b, 0x51, 0x64, 0x63, 0x79, 0x35, 0x6f, + 0x44, 0x50, 0x62, 0x63, 0x46, 0x79, 0x77, 0x61, 0x69, 0x72, 0x4a, 0x79, 0x73, 0x4a, 0x2b, 0x52, 0x75, 0x6a, + 0x51, 0x56, 0x53, 0x70, 0x72, 0x79, 0x6f, 0x30, 0x4c, 0x63, 0x44, 0x67, 0x46, 0x33, 0x4e, 0x55, 0x57, 0x37, + 0x74, 0x5c, 0x0a, + 0x09, 0x61, 0x41, 0x4d, 0x41, 0x77, 0x45, 0x42, 0x4f, 0x4b, 0x31, 0x49, 0x6e, 0x43, 0x4f, 0x74, 0x67, 0x47, + 0x7a, 0x77, 0x6a, 0x62, 0x58, 0x52, 0x42, 0x57, 0x61, 0x46, 0x65, 0x76, 0x4f, 0x5a, 0x59, 0x65, 0x2b, 0x48, + 0x34, 0x4b, 0x50, 0x6b, 0x4f, 0x68, 0x7a, 0x72, 0x54, 0x34, 0x49, 0x46, 0x61, 0x54, 0x44, 0x39, 0x34, 0x74, + 0x42, 0x72, 0x52, 0x5a, 0x70, 0x4b, 0x32, 0x4b, 0x32, 0x66, 0x69, 0x71, 0x58, 0x4d, 0x77, 0x50, 0x70, 0x35, + 0x68, 0x5c, 0x0a, + 0x09, 0x68, 0x44, 0x6f, 0x69, 0x61, 0x75, 0x76, 0x72, 0x44, 0x64, 0x30, 0x6e, 0x37, 0x59, 0x41, 0x42, 0x45, + 0x77, 0x63, 0x6f, 0x48, 0x58, 0x57, 0x35, 0x67, 0x33, 0x44, 0x65, 0x6b, 0x62, 0x59, 0x6c, 0x6a, 0x6b, 0x66, + 0x78, 0x35, 0x57, 0x53, 0x35, 0x6d, 0x47, 0x30, 0x78, 0x70, 0x67, 0x56, 0x51, 0x61, 0x54, 0x36, 0x63, 0x6c, + 0x4c, 0x4f, 0x5a, 0x70, 0x53, 0x48, 0x74, 0x57, 0x2b, 0x43, 0x30, 0x6b, 0x7a, 0x72, 0x57, 0x66, 0x59, 0x58, + 0x72, 0x5c, 0x0a, + 0x09, 0x77, 0x71, 0x6b, 0x56, 0x79, 0x4e, 0x70, 0x7a, 0x66, 0x51, 0x56, 0x71, 0x34, 0x4d, 0x64, 0x37, 0x30, + 0x71, 0x6e, 0x4a, 0x32, 0x74, 0x50, 0x47, 0x54, 0x77, 0x48, 0x4d, 0x4e, 0x4a, 0x45, 0x35, 0x71, 0x58, 0x41, + 0x65, 0x70, 0x35, 0x53, 0x6a, 0x6b, 0x62, 0x67, 0x69, 0x4b, 0x38, 0x32, 0x57, 0x42, 0x64, 0x52, 0x35, 0x35, + 0x6a, 0x68, 0x36, 0x6a, 0x6d, 0x32, 0x6d, 0x74, 0x5a, 0x54, 0x32, 0x49, 0x62, 0x49, 0x56, 0x58, 0x56, 0x62, + 0x78, 0x5c, 0x0a, + 0x09, 0x5a, 0x59, 0x31, 0x64, 0x7a, 0x37, 0x6d, 0x31, 0x51, 0x57, 0x6e, 0x65, 0x65, 0x66, 0x5a, 0x67, 0x6a, + 0x56, 0x31, 0x45, 0x61, 0x78, 0x56, 0x46, 0x6f, 0x32, 0x7a, 0x54, 0x5a, 0x6d, 0x30, 0x6a, 0x5a, 0x41, 0x59, + 0x72, 0x70, 0x67, 0x74, 0x49, 0x35, 0x53, 0x5a, 0x4f, 0x51, 0x6d, 0x55, 0x42, 0x41, 0x62, 0x53, 0x51, 0x79, + 0x69, 0x4a, 0x38, 0x4f, 0x6c, 0x37, 0x66, 0x43, 0x42, 0x61, 0x38, 0x4c, 0x32, 0x73, 0x61, 0x45, 0x4f, 0x54, + 0x53, 0x5c, 0x0a, + 0x09, 0x35, 0x49, 0x42, 0x4f, 0x79, 0x56, 0x67, 0x37, 0x4a, 0x4b, 0x38, 0x54, 0x51, 0x63, 0x2b, 0x77, 0x4c, + 0x77, 0x35, 0x34, 0x49, 0x53, 0x73, 0x52, 0x51, 0x4b, 0x31, 0x73, 0x6a, 0x4f, 0x76, 0x62, 0x6d, 0x6b, 0x71, + 0x73, 0x77, 0x37, 0x50, 0x2f, 0x46, 0x6d, 0x31, 0x63, 0x42, 0x68, 0x43, 0x2f, 0x63, 0x67, 0x64, 0x53, 0x44, + 0x71, 0x6b, 0x52, 0x4e, 0x35, 0x59, 0x33, 0x44, 0x44, 0x2f, 0x4a, 0x42, 0x6e, 0x69, 0x45, 0x4e, 0x76, 0x6f, + 0x4c, 0x5c, 0x0a, + 0x09, 0x6a, 0x68, 0x6b, 0x4d, 0x62, 0x73, 0x56, 0x30, 0x6c, 0x55, 0x63, 0x64, 0x41, 0x2b, 0x6e, 0x44, 0x30, + 0x48, 0x69, 0x6b, 0x35, 0x6b, 0x43, 0x6c, 0x69, 0x54, 0x75, 0x4d, 0x6d, 0x63, 0x36, 0x6a, 0x72, 0x6b, 0x65, + 0x4d, 0x56, 0x35, 0x33, 0x65, 0x57, 0x79, 0x54, 0x41, 0x69, 0x51, 0x4d, 0x6c, 0x62, 0x35, 0x63, 0x5a, 0x71, + 0x41, 0x61, 0x76, 0x78, 0x47, 0x69, 0x5a, 0x7a, 0x4d, 0x53, 0x6e, 0x49, 0x51, 0x63, 0x4f, 0x7a, 0x4b, 0x4a, + 0x39, 0x5c, 0x0a, + 0x09, 0x42, 0x70, 0x7a, 0x63, 0x4f, 0x58, 0x53, 0x35, 0x30, 0x4c, 0x36, 0x59, 0x74, 0x6a, 0x54, 0x49, 0x6e, + 0x6d, 0x63, 0x6f, 0x63, 0x5a, 0x78, 0x4b, 0x42, 0x6c, 0x6f, 0x75, 0x4d, 0x61, 0x4e, 0x67, 0x38, 0x6b, 0x69, + 0x79, 0x47, 0x33, 0x36, 0x42, 0x79, 0x59, 0x70, 0x6e, 0x42, 0x54, 0x77, 0x44, 0x45, 0x48, 0x70, 0x69, 0x50, + 0x4f, 0x69, 0x78, 0x43, 0x5a, 0x59, 0x53, 0x38, 0x4e, 0x71, 0x52, 0x4d, 0x72, 0x7a, 0x32, 0x74, 0x4d, 0x34, + 0x41, 0x5c, 0x0a, + 0x09, 0x6f, 0x46, 0x43, 0x66, 0x43, 0x78, 0x35, 0x6f, 0x6a, 0x74, 0x69, 0x6b, 0x46, 0x4b, 0x48, 0x6e, 0x74, + 0x41, 0x47, 0x42, 0x74, 0x59, 0x45, 0x30, 0x39, 0x63, 0x76, 0x6e, 0x63, 0x6a, 0x70, 0x71, 0x36, 0x66, 0x71, + 0x78, 0x50, 0x4c, 0x75, 0x6d, 0x41, 0x59, 0x46, 0x6e, 0x4b, 0x74, 0x45, 0x41, 0x46, 0x4c, 0x39, 0x57, 0x70, + 0x6d, 0x50, 0x31, 0x5a, 0x55, 0x57, 0x6b, 0x4f, 0x41, 0x78, 0x6d, 0x38, 0x46, 0x62, 0x6d, 0x59, 0x37, 0x55, + 0x62, 0x5c, 0x0a, + 0x09, 0x2b, 0x47, 0x62, 0x73, 0x4a, 0x4f, 0x33, 0x46, 0x63, 0x55, 0x41, 0x61, 0x71, 0x70, 0x56, 0x68, 0x43, + 0x44, 0x6b, 0x78, 0x35, 0x7a, 0x4d, 0x7a, 0x49, 0x6b, 0x4f, 0x33, 0x53, 0x66, 0x2b, 0x51, 0x4f, 0x75, 0x42, + 0x39, 0x4b, 0x2f, 0x2b, 0x58, 0x37, 0x65, 0x69, 0x4c, 0x70, 0x41, 0x70, 0x71, 0x30, 0x67, 0x37, 0x48, 0x48, + 0x5a, 0x4b, 0x6b, 0x6e, 0x48, 0x54, 0x51, 0x74, 0x36, 0x5a, 0x6c, 0x53, 0x52, 0x5a, 0x70, 0x38, 0x51, 0x67, + 0x70, 0x5c, 0x0a, + 0x09, 0x51, 0x35, 0x48, 0x64, 0x4a, 0x4f, 0x31, 0x74, 0x33, 0x34, 0x41, 0x6c, 0x67, 0x41, 0x31, 0x61, 0x42, + 0x42, 0x52, 0x52, 0x7a, 0x48, 0x42, 0x4f, 0x67, 0x65, 0x78, 0x47, 0x76, 0x57, 0x67, 0x63, 0x77, 0x66, 0x43, + 0x59, 0x51, 0x35, 0x67, 0x47, 0x36, 0x53, 0x41, 0x64, 0x52, 0x6a, 0x75, 0x52, 0x69, 0x68, 0x7a, 0x57, 0x33, + 0x43, 0x2b, 0x32, 0x68, 0x62, 0x71, 0x4e, 0x5a, 0x47, 0x35, 0x76, 0x39, 0x4b, 0x6c, 0x54, 0x58, 0x64, 0x57, + 0x45, 0x5c, 0x0a, + 0x09, 0x62, 0x55, 0x44, 0x71, 0x65, 0x77, 0x49, 0x65, 0x54, 0x73, 0x6e, 0x48, 0x73, 0x54, 0x2b, 0x6f, 0x73, + 0x52, 0x6b, 0x4e, 0x57, 0x38, 0x44, 0x44, 0x51, 0x54, 0x57, 0x43, 0x6e, 0x5a, 0x5a, 0x62, 0x77, 0x78, 0x68, + 0x6a, 0x4a, 0x61, 0x54, 0x6c, 0x56, 0x35, 0x72, 0x32, 0x43, 0x4c, 0x6d, 0x7a, 0x76, 0x72, 0x6e, 0x73, 0x43, + 0x49, 0x59, 0x74, 0x42, 0x42, 0x35, 0x56, 0x74, 0x72, 0x44, 0x53, 0x74, 0x45, 0x39, 0x63, 0x5a, 0x7a, 0x72, + 0x55, 0x5c, 0x0a, + 0x09, 0x77, 0x4b, 0x65, 0x72, 0x4a, 0x6e, 0x4a, 0x77, 0x61, 0x56, 0x6b, 0x74, 0x43, 0x32, 0x4c, 0x6e, 0x75, + 0x65, 0x35, 0x46, 0x4e, 0x68, 0x5a, 0x70, 0x68, 0x77, 0x6e, 0x36, 0x61, 0x30, 0x77, 0x62, 0x41, 0x77, 0x43, + 0x6d, 0x30, 0x43, 0x43, 0x64, 0x44, 0x51, 0x33, 0x43, 0x46, 0x6e, 0x4d, 0x73, 0x35, 0x66, 0x6a, 0x52, 0x38, + 0x4b, 0x73, 0x36, 0x4f, 0x6c, 0x33, 0x6d, 0x68, 0x75, 0x52, 0x55, 0x6d, 0x31, 0x59, 0x30, 0x74, 0x4f, 0x61, + 0x52, 0x5c, 0x0a, + 0x09, 0x65, 0x69, 0x37, 0x6e, 0x47, 0x70, 0x54, 0x4e, 0x30, 0x32, 0x51, 0x78, 0x70, 0x32, 0x53, 0x52, 0x79, + 0x71, 0x6d, 0x32, 0x64, 0x63, 0x71, 0x75, 0x35, 0x53, 0x49, 0x69, 0x69, 0x53, 0x61, 0x53, 0x39, 0x54, 0x69, + 0x49, 0x78, 0x67, 0x79, 0x4b, 0x39, 0x78, 0x4d, 0x48, 0x78, 0x49, 0x7a, 0x66, 0x4b, 0x47, 0x4e, 0x46, 0x37, + 0x69, 0x5a, 0x51, 0x34, 0x50, 0x33, 0x79, 0x39, 0x6a, 0x57, 0x77, 0x78, 0x33, 0x4a, 0x38, 0x54, 0x45, 0x79, + 0x4f, 0x5c, 0x0a, + 0x09, 0x44, 0x55, 0x6d, 0x48, 0x48, 0x43, 0x37, 0x76, 0x45, 0x7a, 0x4a, 0x71, 0x43, 0x36, 0x42, 0x6c, 0x6c, + 0x55, 0x66, 0x50, 0x77, 0x52, 0x45, 0x7a, 0x4e, 0x36, 0x66, 0x4f, 0x63, 0x2f, 0x41, 0x51, 0x30, 0x31, 0x54, + 0x44, 0x52, 0x71, 0x30, 0x70, 0x6b, 0x35, 0x42, 0x76, 0x67, 0x34, 0x31, 0x68, 0x55, 0x30, 0x77, 0x42, 0x6d, + 0x4a, 0x43, 0x34, 0x34, 0x31, 0x6b, 0x49, 0x6e, 0x67, 0x67, 0x59, 0x68, 0x6d, 0x49, 0x67, 0x36, 0x34, 0x6a, + 0x72, 0x5c, 0x0a, + 0x09, 0x34, 0x62, 0x77, 0x32, 0x56, 0x43, 0x65, 0x2f, 0x38, 0x72, 0x62, 0x44, 0x5a, 0x36, 0x4f, 0x68, 0x4f, + 0x48, 0x6c, 0x4f, 0x74, 0x4b, 0x47, 0x63, 0x4c, 0x36, 0x34, 0x72, 0x49, 0x44, 0x30, 0x57, 0x55, 0x55, 0x2b, + 0x50, 0x6b, 0x62, 0x4f, 0x71, 0x51, 0x63, 0x43, 0x4b, 0x63, 0x67, 0x77, 0x77, 0x7a, 0x4f, 0x6b, 0x4c, 0x62, + 0x38, 0x63, 0x5a, 0x35, 0x78, 0x56, 0x6f, 0x38, 0x6a, 0x47, 0x46, 0x4b, 0x45, 0x75, 0x42, 0x62, 0x77, 0x36, + 0x32, 0x5c, 0x0a, + 0x09, 0x6a, 0x4e, 0x65, 0x6d, 0x4b, 0x51, 0x73, 0x66, 0x54, 0x35, 0x4c, 0x70, 0x36, 0x59, 0x34, 0x67, 0x5a, + 0x53, 0x6c, 0x30, 0x79, 0x68, 0x72, 0x6a, 0x6d, 0x59, 0x6b, 0x31, 0x42, 0x34, 0x63, 0x71, 0x6e, 0x2b, 0x67, + 0x6c, 0x5a, 0x53, 0x63, 0x42, 0x63, 0x57, 0x73, 0x51, 0x57, 0x76, 0x39, 0x36, 0x4b, 0x68, 0x64, 0x45, 0x30, + 0x42, 0x54, 0x63, 0x6d, 0x73, 0x43, 0x70, 0x4c, 0x6e, 0x39, 0x63, 0x34, 0x35, 0x52, 0x75, 0x44, 0x57, 0x6c, + 0x64, 0x5c, 0x0a, + 0x09, 0x66, 0x68, 0x35, 0x63, 0x6b, 0x68, 0x73, 0x4b, 0x35, 0x77, 0x64, 0x53, 0x6f, 0x53, 0x56, 0x52, 0x52, + 0x31, 0x39, 0x48, 0x37, 0x53, 0x41, 0x6a, 0x31, 0x77, 0x30, 0x67, 0x46, 0x52, 0x4d, 0x56, 0x4c, 0x62, 0x7a, + 0x4d, 0x42, 0x68, 0x43, 0x72, 0x66, 0x38, 0x66, 0x71, 0x63, 0x73, 0x63, 0x57, 0x76, 0x44, 0x44, 0x6a, 0x31, + 0x4f, 0x32, 0x4a, 0x63, 0x38, 0x46, 0x6f, 0x56, 0x48, 0x38, 0x38, 0x43, 0x78, 0x44, 0x76, 0x42, 0x56, 0x4f, + 0x6b, 0x5c, 0x0a, + 0x09, 0x78, 0x35, 0x35, 0x6b, 0x46, 0x77, 0x59, 0x50, 0x33, 0x45, 0x38, 0x46, 0x2b, 0x50, 0x4a, 0x2b, 0x32, + 0x58, 0x6a, 0x6a, 0x64, 0x52, 0x4b, 0x6e, 0x54, 0x56, 0x6b, 0x4c, 0x4a, 0x7a, 0x4c, 0x47, 0x4a, 0x4d, 0x42, + 0x4d, 0x44, 0x34, 0x61, 0x4e, 0x4f, 0x59, 0x52, 0x79, 0x70, 0x36, 0x2b, 0x6a, 0x6c, 0x6c, 0x65, 0x69, 0x4a, + 0x32, 0x4d, 0x73, 0x59, 0x72, 0x6f, 0x45, 0x6f, 0x33, 0x2b, 0x6c, 0x6c, 0x31, 0x41, 0x32, 0x6d, 0x61, 0x61, + 0x4a, 0x5c, 0x0a, + 0x09, 0x4c, 0x7a, 0x44, 0x31, 0x78, 0x6a, 0x50, 0x50, 0x61, 0x41, 0x75, 0x68, 0x69, 0x36, 0x42, 0x4c, 0x4a, + 0x51, 0x50, 0x6e, 0x5a, 0x46, 0x6d, 0x48, 0x37, 0x56, 0x6f, 0x71, 0x36, 0x30, 0x45, 0x62, 0x41, 0x41, 0x41, + 0x30, 0x4b, 0x35, 0x53, 0x69, 0x6a, 0x5a, 0x69, 0x66, 0x74, 0x2b, 0x62, 0x6a, 0x34, 0x50, 0x57, 0x55, 0x73, + 0x65, 0x74, 0x79, 0x54, 0x63, 0x66, 0x63, 0x4f, 0x49, 0x51, 0x6a, 0x4e, 0x2f, 0x53, 0x6e, 0x76, 0x7a, 0x64, + 0x47, 0x5c, 0x0a, + 0x09, 0x43, 0x71, 0x4f, 0x65, 0x64, 0x67, 0x77, 0x65, 0x74, 0x55, 0x52, 0x6b, 0x59, 0x32, 0x58, 0x45, 0x4d, + 0x61, 0x75, 0x76, 0x73, 0x77, 0x38, 0x64, 0x42, 0x54, 0x6e, 0x41, 0x43, 0x58, 0x42, 0x6c, 0x52, 0x67, 0x6a, + 0x56, 0x6a, 0x67, 0x6c, 0x34, 0x51, 0x47, 0x4b, 0x34, 0x54, 0x62, 0x4b, 0x77, 0x31, 0x6a, 0x70, 0x45, 0x47, + 0x5a, 0x61, 0x5a, 0x6d, 0x46, 0x45, 0x64, 0x53, 0x70, 0x38, 0x61, 0x74, 0x48, 0x54, 0x37, 0x72, 0x4b, 0x34, + 0x46, 0x5c, 0x0a, + 0x09, 0x58, 0x73, 0x6c, 0x30, 0x69, 0x34, 0x31, 0x48, 0x41, 0x42, 0x70, 0x33, 0x57, 0x4d, 0x55, 0x7a, 0x7a, + 0x33, 0x70, 0x41, 0x69, 0x6c, 0x39, 0x4b, 0x65, 0x54, 0x66, 0x37, 0x55, 0x2f, 0x4a, 0x77, 0x71, 0x6e, 0x2b, + 0x6d, 0x74, 0x71, 0x72, 0x39, 0x48, 0x66, 0x62, 0x55, 0x62, 0x6d, 0x31, 0x70, 0x59, 0x2b, 0x34, 0x43, 0x56, + 0x43, 0x43, 0x66, 0x52, 0x69, 0x42, 0x75, 0x2f, 0x4c, 0x77, 0x61, 0x53, 0x59, 0x50, 0x51, 0x78, 0x69, 0x30, + 0x63, 0x5c, 0x0a, + 0x09, 0x77, 0x39, 0x56, 0x47, 0x77, 0x39, 0x4e, 0x46, 0x33, 0x56, 0x37, 0x67, 0x70, 0x39, 0x48, 0x4a, 0x6c, + 0x66, 0x45, 0x4b, 0x78, 0x70, 0x46, 0x65, 0x34, 0x38, 0x72, 0x56, 0x35, 0x2b, 0x50, 0x59, 0x47, 0x75, 0x70, + 0x47, 0x30, 0x5a, 0x41, 0x79, 0x46, 0x4d, 0x34, 0x54, 0x42, 0x79, 0x2b, 0x53, 0x4d, 0x74, 0x47, 0x67, 0x43, + 0x63, 0x56, 0x37, 0x37, 0x46, 0x62, 0x31, 0x36, 0x64, 0x68, 0x46, 0x34, 0x52, 0x68, 0x4b, 0x43, 0x5a, 0x61, + 0x4d, 0x5c, 0x0a, + 0x09, 0x64, 0x4e, 0x75, 0x79, 0x55, 0x61, 0x59, 0x44, 0x53, 0x46, 0x35, 0x35, 0x65, 0x39, 0x79, 0x35, 0x2b, + 0x54, 0x52, 0x45, 0x52, 0x32, 0x44, 0x6c, 0x78, 0x79, 0x5a, 0x6f, 0x4f, 0x39, 0x56, 0x75, 0x4d, 0x72, 0x33, + 0x51, 0x51, 0x44, 0x61, 0x43, 0x70, 0x38, 0x69, 0x62, 0x30, 0x61, 0x2b, 0x65, 0x56, 0x67, 0x56, 0x67, 0x62, + 0x6e, 0x4a, 0x65, 0x61, 0x2f, 0x71, 0x52, 0x54, 0x4d, 0x30, 0x41, 0x67, 0x48, 0x61, 0x73, 0x47, 0x46, 0x6a, + 0x57, 0x5c, 0x0a, + 0x09, 0x67, 0x44, 0x5a, 0x6d, 0x44, 0x51, 0x42, 0x49, 0x6a, 0x5a, 0x79, 0x66, 0x35, 0x38, 0x61, 0x65, 0x54, + 0x41, 0x2f, 0x59, 0x73, 0x61, 0x2f, 0x41, 0x4b, 0x30, 0x4d, 0x34, 0x42, 0x37, 0x48, 0x76, 0x47, 0x67, 0x78, + 0x30, 0x4e, 0x45, 0x31, 0x59, 0x56, 0x55, 0x59, 0x56, 0x69, 0x7a, 0x61, 0x42, 0x52, 0x35, 0x50, 0x6a, 0x57, + 0x71, 0x51, 0x41, 0x4c, 0x62, 0x52, 0x72, 0x31, 0x59, 0x30, 0x47, 0x62, 0x6b, 0x52, 0x52, 0x43, 0x30, 0x68, + 0x34, 0x5c, 0x0a, + 0x09, 0x48, 0x38, 0x5a, 0x68, 0x57, 0x70, 0x36, 0x44, 0x71, 0x4d, 0x6f, 0x55, 0x64, 0x48, 0x6c, 0x75, 0x75, + 0x4a, 0x77, 0x2f, 0x37, 0x58, 0x67, 0x63, 0x6a, 0x41, 0x52, 0x59, 0x75, 0x4c, 0x53, 0x4e, 0x42, 0x4d, 0x51, + 0x74, 0x5a, 0x2b, 0x4a, 0x39, 0x42, 0x52, 0x6d, 0x4d, 0x41, 0x43, 0x55, 0x4e, 0x47, 0x4c, 0x79, 0x2f, 0x42, + 0x49, 0x53, 0x4e, 0x64, 0x6f, 0x54, 0x39, 0x71, 0x43, 0x49, 0x61, 0x64, 0x42, 0x57, 0x4c, 0x63, 0x69, 0x78, + 0x41, 0x5c, 0x0a, + 0x09, 0x59, 0x67, 0x50, 0x4e, 0x31, 0x37, 0x62, 0x44, 0x72, 0x63, 0x39, 0x50, 0x67, 0x6e, 0x50, 0x61, 0x69, + 0x4a, 0x32, 0x41, 0x38, 0x2b, 0x4b, 0x72, 0x6d, 0x48, 0x74, 0x43, 0x47, 0x54, 0x73, 0x37, 0x46, 0x38, 0x73, + 0x71, 0x67, 0x7a, 0x49, 0x58, 0x74, 0x70, 0x41, 0x61, 0x65, 0x6b, 0x44, 0x70, 0x42, 0x48, 0x67, 0x61, 0x44, + 0x44, 0x36, 0x5a, 0x45, 0x75, 0x68, 0x50, 0x78, 0x71, 0x75, 0x49, 0x58, 0x69, 0x4d, 0x63, 0x71, 0x44, 0x46, + 0x4e, 0x5c, 0x0a, + 0x09, 0x68, 0x67, 0x51, 0x33, 0x71, 0x31, 0x35, 0x6a, 0x6d, 0x37, 0x77, 0x78, 0x4a, 0x2b, 0x58, 0x48, 0x54, + 0x73, 0x65, 0x79, 0x56, 0x76, 0x6f, 0x66, 0x49, 0x78, 0x75, 0x37, 0x5a, 0x67, 0x49, 0x4f, 0x6a, 0x4c, 0x61, + 0x56, 0x51, 0x2b, 0x74, 0x30, 0x6e, 0x59, 0x39, 0x4c, 0x4f, 0x4a, 0x55, 0x47, 0x62, 0x68, 0x68, 0x6a, 0x4e, + 0x50, 0x51, 0x62, 0x39, 0x4a, 0x2f, 0x49, 0x56, 0x59, 0x4f, 0x49, 0x34, 0x74, 0x2f, 0x53, 0x75, 0x38, 0x57, + 0x2f, 0x5c, 0x0a, + 0x09, 0x36, 0x45, 0x76, 0x4a, 0x6d, 0x64, 0x74, 0x71, 0x46, 0x42, 0x66, 0x50, 0x58, 0x6b, 0x4c, 0x42, 0x4a, + 0x6a, 0x32, 0x4d, 0x41, 0x47, 0x7a, 0x6e, 0x2b, 0x69, 0x42, 0x61, 0x39, 0x79, 0x63, 0x43, 0x31, 0x78, 0x63, + 0x41, 0x66, 0x4b, 0x51, 0x62, 0x78, 0x4f, 0x39, 0x61, 0x59, 0x53, 0x49, 0x71, 0x73, 0x50, 0x4f, 0x78, 0x76, + 0x69, 0x6f, 0x54, 0x46, 0x42, 0x44, 0x62, 0x63, 0x72, 0x61, 0x42, 0x36, 0x62, 0x6d, 0x69, 0x6a, 0x6b, 0x70, + 0x4a, 0x5c, 0x0a, + 0x09, 0x32, 0x2b, 0x70, 0x37, 0x34, 0x49, 0x55, 0x44, 0x6b, 0x49, 0x35, 0x79, 0x6f, 0x59, 0x77, 0x59, 0x72, + 0x48, 0x4a, 0x71, 0x66, 0x59, 0x33, 0x4c, 0x49, 0x59, 0x78, 0x46, 0x52, 0x35, 0x30, 0x6d, 0x6f, 0x34, 0x6c, + 0x70, 0x4a, 0x77, 0x63, 0x32, 0x4e, 0x65, 0x35, 0x45, 0x46, 0x73, 0x47, 0x41, 0x56, 0x65, 0x51, 0x6a, 0x56, + 0x55, 0x2b, 0x33, 0x77, 0x38, 0x76, 0x78, 0x39, 0x6e, 0x53, 0x47, 0x46, 0x76, 0x6c, 0x69, 0x30, 0x56, 0x57, + 0x6e, 0x5c, 0x0a, + 0x09, 0x78, 0x35, 0x5a, 0x7a, 0x57, 0x56, 0x6c, 0x47, 0x77, 0x6a, 0x4e, 0x6e, 0x54, 0x76, 0x48, 0x51, 0x5a, + 0x43, 0x4f, 0x69, 0x54, 0x64, 0x32, 0x75, 0x71, 0x38, 0x65, 0x64, 0x5a, 0x4a, 0x6b, 0x4b, 0x47, 0x49, 0x4f, + 0x63, 0x2b, 0x54, 0x6d, 0x77, 0x63, 0x35, 0x77, 0x34, 0x6b, 0x4f, 0x6f, 0x73, 0x30, 0x77, 0x52, 0x79, 0x59, + 0x66, 0x4e, 0x54, 0x61, 0x59, 0x4e, 0x72, 0x53, 0x2b, 0x75, 0x66, 0x41, 0x54, 0x68, 0x33, 0x52, 0x45, 0x62, + 0x39, 0x5c, 0x0a, + 0x09, 0x52, 0x41, 0x68, 0x41, 0x34, 0x68, 0x77, 0x73, 0x73, 0x6f, 0x6a, 0x55, 0x53, 0x30, 0x55, 0x44, 0x78, + 0x2b, 0x72, 0x71, 0x43, 0x4b, 0x47, 0x56, 0x6c, 0x6b, 0x51, 0x72, 0x31, 0x50, 0x55, 0x63, 0x71, 0x37, 0x66, + 0x79, 0x65, 0x47, 0x72, 0x2b, 0x59, 0x2f, 0x31, 0x67, 0x42, 0x4f, 0x46, 0x50, 0x52, 0x54, 0x4a, 0x68, 0x55, + 0x49, 0x78, 0x33, 0x41, 0x55, 0x70, 0x38, 0x7a, 0x4d, 0x6f, 0x4a, 0x74, 0x43, 0x4f, 0x69, 0x34, 0x54, 0x76, + 0x6e, 0x5c, 0x0a, + 0x09, 0x4c, 0x33, 0x5a, 0x43, 0x7a, 0x4c, 0x41, 0x4e, 0x51, 0x34, 0x34, 0x79, 0x55, 0x61, 0x43, 0x6a, 0x77, + 0x55, 0x54, 0x4c, 0x54, 0x71, 0x54, 0x67, 0x66, 0x47, 0x77, 0x47, 0x65, 0x49, 0x6d, 0x49, 0x61, 0x52, 0x43, + 0x66, 0x6a, 0x69, 0x52, 0x41, 0x51, 0x51, 0x33, 0x6a, 0x5a, 0x76, 0x78, 0x5a, 0x55, 0x37, 0x4f, 0x45, 0x4c, + 0x36, 0x34, 0x62, 0x59, 0x33, 0x7a, 0x63, 0x4a, 0x76, 0x55, 0x34, 0x72, 0x53, 0x44, 0x52, 0x6c, 0x4b, 0x48, + 0x70, 0x5c, 0x0a, + 0x09, 0x63, 0x33, 0x72, 0x36, 0x4a, 0x4f, 0x31, 0x67, 0x71, 0x79, 0x57, 0x4f, 0x74, 0x61, 0x54, 0x31, 0x42, + 0x77, 0x43, 0x69, 0x49, 0x6b, 0x33, 0x46, 0x74, 0x4f, 0x4d, 0x62, 0x54, 0x68, 0x6b, 0x6a, 0x53, 0x39, 0x4a, + 0x65, 0x72, 0x59, 0x7a, 0x6f, 0x61, 0x30, 0x59, 0x45, 0x69, 0x46, 0x2b, 0x64, 0x62, 0x61, 0x68, 0x4e, 0x63, + 0x7a, 0x37, 0x42, 0x46, 0x2b, 0x2f, 0x54, 0x55, 0x43, 0x4b, 0x2f, 0x6c, 0x6a, 0x69, 0x59, 0x59, 0x61, 0x41, + 0x36, 0x5c, 0x0a, + 0x09, 0x62, 0x62, 0x59, 0x69, 0x55, 0x65, 0x4b, 0x6b, 0x4b, 0x6e, 0x72, 0x7a, 0x38, 0x68, 0x47, 0x4d, 0x51, + 0x6a, 0x6b, 0x4e, 0x63, 0x47, 0x70, 0x38, 0x53, 0x63, 0x6f, 0x4c, 0x31, 0x71, 0x63, 0x46, 0x66, 0x69, 0x73, + 0x41, 0x59, 0x71, 0x7a, 0x72, 0x32, 0x4a, 0x43, 0x4a, 0x73, 0x61, 0x34, 0x69, 0x59, 0x57, 0x4e, 0x6d, 0x77, + 0x35, 0x31, 0x66, 0x79, 0x55, 0x37, 0x55, 0x59, 0x57, 0x50, 0x56, 0x6d, 0x52, 0x77, 0x72, 0x49, 0x6a, 0x36, + 0x62, 0x5c, 0x0a, + 0x09, 0x5a, 0x4a, 0x4a, 0x6b, 0x68, 0x4c, 0x79, 0x62, 0x45, 0x57, 0x6a, 0x46, 0x78, 0x38, 0x7a, 0x50, 0x78, + 0x58, 0x70, 0x4f, 0x6c, 0x72, 0x4d, 0x79, 0x6c, 0x2f, 0x72, 0x38, 0x74, 0x75, 0x61, 0x4f, 0x31, 0x6f, 0x62, + 0x57, 0x2b, 0x59, 0x31, 0x41, 0x42, 0x41, 0x43, 0x48, 0x45, 0x6b, 0x4e, 0x76, 0x69, 0x6b, 0x54, 0x68, 0x4d, + 0x7a, 0x71, 0x34, 0x5a, 0x59, 0x41, 0x4e, 0x55, 0x53, 0x46, 0x65, 0x43, 0x2f, 0x32, 0x53, 0x4b, 0x43, 0x37, + 0x36, 0x5c, 0x0a, + 0x09, 0x34, 0x46, 0x6d, 0x46, 0x6e, 0x6a, 0x4e, 0x79, 0x5a, 0x78, 0x67, 0x31, 0x44, 0x39, 0x62, 0x58, 0x74, + 0x4a, 0x47, 0x76, 0x5a, 0x45, 0x51, 0x6d, 0x61, 0x52, 0x43, 0x6f, 0x6d, 0x4e, 0x56, 0x74, 0x36, 0x55, 0x67, + 0x56, 0x4d, 0x67, 0x79, 0x72, 0x79, 0x77, 0x43, 0x69, 0x53, 0x62, 0x62, 0x56, 0x59, 0x4d, 0x44, 0x57, 0x57, + 0x4b, 0x76, 0x6d, 0x61, 0x38, 0x66, 0x54, 0x35, 0x58, 0x54, 0x32, 0x6f, 0x2f, 0x6a, 0x55, 0x57, 0x56, 0x4f, + 0x55, 0x5c, 0x0a, + 0x09, 0x76, 0x33, 0x49, 0x57, 0x69, 0x33, 0x38, 0x39, 0x56, 0x64, 0x48, 0x70, 0x74, 0x67, 0x6b, 0x75, 0x4b, + 0x6f, 0x43, 0x4d, 0x42, 0x42, 0x34, 0x32, 0x68, 0x4b, 0x5a, 0x72, 0x75, 0x6b, 0x43, 0x59, 0x35, 0x76, 0x42, + 0x41, 0x45, 0x2f, 0x58, 0x52, 0x6f, 0x41, 0x65, 0x37, 0x33, 0x66, 0x2f, 0x6f, 0x47, 0x59, 0x41, 0x44, 0x41, + 0x50, 0x57, 0x4c, 0x48, 0x70, 0x41, 0x4f, 0x6d, 0x4b, 0x52, 0x6b, 0x59, 0x45, 0x37, 0x4c, 0x49, 0x36, 0x57, + 0x46, 0x5c, 0x0a, + 0x09, 0x31, 0x46, 0x43, 0x52, 0x56, 0x42, 0x6d, 0x79, 0x52, 0x75, 0x41, 0x6d, 0x51, 0x33, 0x4f, 0x36, 0x4c, + 0x33, 0x55, 0x78, 0x4d, 0x52, 0x62, 0x56, 0x4a, 0x71, 0x63, 0x59, 0x6a, 0x64, 0x56, 0x6e, 0x59, 0x38, 0x52, + 0x69, 0x2f, 0x54, 0x5a, 0x46, 0x6f, 0x53, 0x52, 0x79, 0x4f, 0x2f, 0x61, 0x6e, 0x73, 0x78, 0x50, 0x49, 0x64, + 0x6b, 0x6a, 0x58, 0x35, 0x32, 0x55, 0x61, 0x67, 0x4d, 0x7a, 0x71, 0x4f, 0x7a, 0x69, 0x34, 0x54, 0x6d, 0x4d, + 0x31, 0x5c, 0x0a, + 0x09, 0x62, 0x79, 0x6f, 0x34, 0x31, 0x6d, 0x32, 0x51, 0x4c, 0x43, 0x50, 0x47, 0x61, 0x79, 0x68, 0x45, 0x70, + 0x2f, 0x56, 0x38, 0x71, 0x74, 0x4b, 0x49, 0x72, 0x59, 0x36, 0x31, 0x47, 0x2b, 0x53, 0x71, 0x78, 0x6d, 0x53, + 0x42, 0x61, 0x52, 0x79, 0x66, 0x64, 0x62, 0x37, 0x68, 0x6e, 0x43, 0x56, 0x72, 0x66, 0x63, 0x30, 0x71, 0x4c, + 0x77, 0x46, 0x72, 0x45, 0x36, 0x77, 0x42, 0x77, 0x42, 0x33, 0x78, 0x48, 0x30, 0x41, 0x30, 0x49, 0x42, 0x47, + 0x52, 0x5c, 0x0a, + 0x09, 0x64, 0x42, 0x62, 0x41, 0x42, 0x4b, 0x75, 0x64, 0x50, 0x52, 0x54, 0x58, 0x44, 0x73, 0x54, 0x2f, 0x41, + 0x42, 0x59, 0x68, 0x57, 0x55, 0x56, 0x7a, 0x48, 0x73, 0x6c, 0x5a, 0x4c, 0x54, 0x62, 0x5a, 0x31, 0x77, 0x41, + 0x41, 0x49, 0x41, 0x42, 0x4a, 0x52, 0x45, 0x46, 0x55, 0x73, 0x42, 0x54, 0x4f, 0x2b, 0x7a, 0x57, 0x4d, 0x53, + 0x47, 0x63, 0x57, 0x59, 0x70, 0x79, 0x38, 0x41, 0x49, 0x76, 0x59, 0x41, 0x6d, 0x53, 0x63, 0x35, 0x46, 0x48, + 0x7a, 0x5c, 0x0a, + 0x09, 0x5a, 0x34, 0x31, 0x4c, 0x70, 0x38, 0x6c, 0x57, 0x4e, 0x68, 0x4c, 0x61, 0x46, 0x71, 0x6b, 0x31, 0x34, + 0x35, 0x55, 0x55, 0x58, 0x78, 0x7a, 0x38, 0x72, 0x44, 0x55, 0x42, 0x4b, 0x7a, 0x4f, 0x49, 0x38, 0x6f, 0x58, + 0x73, 0x33, 0x77, 0x4c, 0x52, 0x70, 0x6d, 0x78, 0x49, 0x4f, 0x35, 0x45, 0x41, 0x2b, 0x69, 0x5a, 0x48, 0x56, + 0x63, 0x64, 0x69, 0x36, 0x73, 0x4d, 0x64, 0x54, 0x39, 0x6d, 0x58, 0x7a, 0x76, 0x52, 0x57, 0x36, 0x71, 0x38, + 0x4a, 0x5c, 0x0a, + 0x09, 0x73, 0x44, 0x56, 0x50, 0x54, 0x64, 0x6c, 0x63, 0x6f, 0x68, 0x66, 0x56, 0x6e, 0x71, 0x2b, 0x33, 0x37, + 0x68, 0x6e, 0x41, 0x75, 0x75, 0x34, 0x45, 0x2f, 0x4f, 0x67, 0x58, 0x76, 0x34, 0x35, 0x4c, 0x4c, 0x6a, 0x68, + 0x76, 0x6b, 0x46, 0x7a, 0x51, 0x55, 0x34, 0x4a, 0x77, 0x4c, 0x6a, 0x48, 0x41, 0x32, 0x73, 0x6a, 0x76, 0x66, + 0x4f, 0x41, 0x77, 0x48, 0x49, 0x43, 0x35, 0x68, 0x53, 0x55, 0x4d, 0x42, 0x6b, 0x4d, 0x4d, 0x69, 0x77, 0x4a, + 0x7a, 0x5c, 0x0a, + 0x09, 0x43, 0x2f, 0x37, 0x31, 0x30, 0x51, 0x65, 0x50, 0x7a, 0x4b, 0x4d, 0x73, 0x53, 0x79, 0x77, 0x4f, 0x6c, + 0x6a, 0x45, 0x6f, 0x53, 0x73, 0x41, 0x35, 0x7a, 0x43, 0x30, 0x75, 0x59, 0x54, 0x6a, 0x30, 0x79, 0x63, 0x66, + 0x43, 0x30, 0x67, 0x44, 0x4c, 0x52, 0x51, 0x45, 0x69, 0x77, 0x73, 0x4c, 0x69, 0x41, 0x4d, 0x76, 0x44, 0x6f, + 0x54, 0x38, 0x65, 0x4c, 0x47, 0x4e, 0x59, 0x2b, 0x4e, 0x2b, 0x63, 0x57, 0x31, 0x77, 0x75, 0x2f, 0x48, 0x6e, + 0x34, 0x5c, 0x0a, + 0x09, 0x39, 0x38, 0x30, 0x76, 0x4c, 0x41, 0x31, 0x51, 0x73, 0x4e, 0x2f, 0x30, 0x49, 0x79, 0x49, 0x4d, 0x6c, + 0x6f, 0x64, 0x59, 0x4c, 0x6f, 0x71, 0x4b, 0x52, 0x63, 0x39, 0x33, 0x55, 0x54, 0x67, 0x73, 0x4c, 0x43, 0x2f, + 0x4c, 0x78, 0x45, 0x55, 0x62, 0x6d, 0x61, 0x74, 0x2b, 0x30, 0x70, 0x4a, 0x46, 0x53, 0x77, 0x65, 0x67, 0x6b, + 0x32, 0x55, 0x59, 0x36, 0x33, 0x57, 0x71, 0x39, 0x76, 0x77, 0x76, 0x36, 0x50, 0x61, 0x36, 0x4f, 0x62, 0x71, + 0x35, 0x5c, 0x0a, + 0x09, 0x2f, 0x34, 0x6e, 0x73, 0x69, 0x62, 0x45, 0x2b, 0x38, 0x69, 0x7a, 0x48, 0x6c, 0x72, 0x45, 0x65, 0x4a, + 0x73, 0x66, 0x48, 0x4d, 0x44, 0x6e, 0x65, 0x77, 0x37, 0x59, 0x74, 0x6b, 0x39, 0x69, 0x7a, 0x66, 0x51, 0x70, + 0x37, 0x54, 0x39, 0x79, 0x4a, 0x2f, 0x53, 0x66, 0x74, 0x78, 0x72, 0x62, 0x4a, 0x76, 0x68, 0x49, 0x75, 0x63, + 0x2f, 0x41, 0x6f, 0x5a, 0x70, 0x56, 0x64, 0x61, 0x52, 0x37, 0x6a, 0x4e, 0x59, 0x63, 0x62, 0x37, 0x33, 0x6f, + 0x51, 0x5c, 0x0a, + 0x09, 0x63, 0x43, 0x58, 0x32, 0x6e, 0x37, 0x51, 0x4c, 0x41, 0x2b, 0x51, 0x34, 0x50, 0x4c, 0x75, 0x41, 0x65, + 0x2b, 0x38, 0x2f, 0x69, 0x41, 0x64, 0x6e, 0x5a, 0x72, 0x47, 0x77, 0x4f, 0x4d, 0x44, 0x69, 0x59, 0x49, 0x41, + 0x6a, 0x63, 0x77, 0x73, 0x6f, 0x69, 0x54, 0x41, 0x33, 0x76, 0x2b, 0x6a, 0x6c, 0x42, 0x32, 0x43, 0x35, 0x4b, + 0x4c, 0x43, 0x77, 0x4e, 0x49, 0x69, 0x79, 0x30, 0x6d, 0x2b, 0x66, 0x46, 0x75, 0x2f, 0x6f, 0x72, 0x36, 0x35, + 0x52, 0x5c, 0x0a, + 0x09, 0x42, 0x5a, 0x4b, 0x48, 0x35, 0x78, 0x59, 0x41, 0x35, 0x37, 0x42, 0x6c, 0x59, 0x68, 0x7a, 0x73, 0x42, + 0x35, 0x31, 0x5a, 0x58, 0x57, 0x43, 0x73, 0x32, 0x30, 0x4d, 0x6e, 0x39, 0x7a, 0x2f, 0x68, 0x54, 0x6c, 0x55, + 0x62, 0x2f, 0x72, 0x63, 0x42, 0x67, 0x47, 0x36, 0x65, 0x59, 0x33, 0x4b, 0x38, 0x4c, 0x38, 0x59, 0x30, 0x4f, + 0x64, 0x5a, 0x48, 0x48, 0x6e, 0x2b, 0x43, 0x50, 0x4d, 0x50, 0x30, 0x6c, 0x76, 0x70, 0x48, 0x55, 0x48, 0x75, + 0x64, 0x5c, 0x0a, + 0x09, 0x48, 0x4f, 0x50, 0x39, 0x58, 0x6d, 0x78, 0x37, 0x79, 0x2f, 0x67, 0x34, 0x75, 0x74, 0x30, 0x73, 0x36, + 0x6d, 0x6a, 0x58, 0x74, 0x71, 0x33, 0x6f, 0x5a, 0x70, 0x42, 0x5a, 0x6f, 0x78, 0x43, 0x78, 0x71, 0x32, 0x55, + 0x72, 0x67, 0x68, 0x6d, 0x37, 0x72, 0x76, 0x57, 0x68, 0x70, 0x30, 0x47, 0x2b, 0x34, 0x74, 0x51, 0x4e, 0x74, + 0x39, 0x2b, 0x4c, 0x4d, 0x38, 0x37, 0x43, 0x75, 0x74, 0x45, 0x36, 0x41, 0x38, 0x44, 0x56, 0x65, 0x50, 0x6b, + 0x66, 0x5c, 0x0a, + 0x09, 0x2f, 0x4f, 0x58, 0x55, 0x39, 0x35, 0x2f, 0x33, 0x79, 0x48, 0x4b, 0x38, 0x33, 0x38, 0x6b, 0x57, 0x6c, + 0x70, 0x5a, 0x52, 0x6c, 0x47, 0x56, 0x30, 0x72, 0x71, 0x58, 0x42, 0x4d, 0x70, 0x61, 0x4c, 0x41, 0x6f, 0x50, + 0x43, 0x2f, 0x30, 0x6a, 0x6b, 0x30, 0x76, 0x49, 0x51, 0x51, 0x31, 0x66, 0x36, 0x7a, 0x36, 0x4c, 0x41, 0x63, + 0x6c, 0x46, 0x69, 0x71, 0x53, 0x69, 0x67, 0x34, 0x43, 0x41, 0x35, 0x35, 0x74, 0x52, 0x55, 0x52, 0x73, 0x55, + 0x30, 0x5c, 0x0a, + 0x09, 0x73, 0x30, 0x31, 0x64, 0x50, 0x79, 0x33, 0x48, 0x76, 0x34, 0x58, 0x66, 0x71, 0x5a, 0x57, 0x2f, 0x67, + 0x47, 0x50, 0x31, 0x62, 0x37, 0x57, 0x58, 0x74, 0x70, 0x61, 0x4f, 0x49, 0x65, 0x56, 0x57, 0x6e, 0x53, 0x58, + 0x43, 0x33, 0x6c, 0x30, 0x37, 0x38, 0x66, 0x74, 0x76, 0x2b, 0x4b, 0x39, 0x34, 0x78, 0x43, 0x4d, 0x65, 0x42, + 0x71, 0x49, 0x4d, 0x6f, 0x41, 0x77, 0x67, 0x49, 0x4d, 0x74, 0x79, 0x6c, 0x41, 0x42, 0x75, 0x76, 0x66, 0x6c, + 0x57, 0x5c, 0x0a, + 0x09, 0x76, 0x4f, 0x76, 0x64, 0x37, 0x38, 0x55, 0x58, 0x76, 0x76, 0x77, 0x56, 0x4c, 0x41, 0x30, 0x47, 0x47, + 0x42, 0x5a, 0x44, 0x50, 0x4f, 0x2b, 0x48, 0x66, 0x67, 0x69, 0x76, 0x66, 0x4e, 0x57, 0x6c, 0x32, 0x44, 0x6f, + 0x39, 0x37, 0x64, 0x74, 0x32, 0x4a, 0x54, 0x71, 0x35, 0x4e, 0x34, 0x32, 0x33, 0x76, 0x65, 0x39, 0x58, 0x38, + 0x43, 0x2b, 0x66, 0x2b, 0x51, 0x79, 0x6d, 0x74, 0x30, 0x37, 0x68, 0x34, 0x4f, 0x77, 0x73, 0x6c, 0x71, 0x72, + 0x66, 0x5c, 0x0a, + 0x09, 0x34, 0x4c, 0x50, 0x47, 0x59, 0x6f, 0x33, 0x35, 0x61, 0x4d, 0x64, 0x59, 0x31, 0x30, 0x74, 0x6c, 0x71, + 0x66, 0x74, 0x71, 0x30, 0x71, 0x4d, 0x64, 0x65, 0x32, 0x55, 0x62, 0x54, 0x58, 0x61, 0x6a, 0x32, 0x37, 0x50, + 0x37, 0x4a, 0x47, 0x51, 0x45, 0x6a, 0x48, 0x55, 0x37, 0x73, 0x62, 0x39, 0x75, 0x70, 0x34, 0x4e, 0x75, 0x6e, + 0x73, 0x58, 0x79, 0x34, 0x37, 0x30, 0x65, 0x73, 0x73, 0x71, 0x70, 0x2b, 0x37, 0x30, 0x75, 0x63, 0x73, 0x70, + 0x41, 0x5c, 0x0a, + 0x09, 0x35, 0x44, 0x44, 0x52, 0x39, 0x38, 0x42, 0x4d, 0x52, 0x4e, 0x67, 0x79, 0x50, 0x68, 0x5a, 0x39, 0x66, + 0x32, 0x4b, 0x73, 0x44, 0x79, 0x4a, 0x67, 0x66, 0x6e, 0x47, 0x41, 0x38, 0x38, 0x2f, 0x59, 0x74, 0x33, 0x33, + 0x5a, 0x46, 0x54, 0x6a, 0x6a, 0x2b, 0x31, 0x39, 0x67, 0x6a, 0x6d, 0x51, 0x74, 0x61, 0x4e, 0x31, 0x2b, 0x46, + 0x2b, 0x44, 0x6b, 0x38, 0x78, 0x37, 0x6e, 0x4f, 0x77, 0x54, 0x65, 0x36, 0x59, 0x42, 0x58, 0x4e, 0x42, 0x6c, + 0x35, 0x5c, 0x0a, + 0x09, 0x30, 0x37, 0x6b, 0x6d, 0x78, 0x2b, 0x54, 0x58, 0x6d, 0x77, 0x78, 0x75, 0x70, 0x54, 0x4a, 0x57, 0x6e, + 0x53, 0x59, 0x48, 0x48, 0x4e, 0x58, 0x75, 0x4b, 0x42, 0x36, 0x61, 0x6a, 0x4c, 0x57, 0x70, 0x76, 0x74, 0x55, + 0x33, 0x70, 0x37, 0x71, 0x64, 0x32, 0x6d, 0x48, 0x4b, 0x73, 0x73, 0x54, 0x38, 0x2f, 0x42, 0x77, 0x65, 0x64, + 0x76, 0x4c, 0x4a, 0x2b, 0x50, 0x4b, 0x6e, 0x50, 0x32, 0x37, 0x57, 0x6d, 0x7a, 0x31, 0x79, 0x42, 0x49, 0x2b, + 0x35, 0x5c, 0x0a, + 0x09, 0x38, 0x43, 0x49, 0x63, 0x6d, 0x5a, 0x50, 0x37, 0x73, 0x58, 0x37, 0x72, 0x4e, 0x61, 0x2f, 0x42, 0x53, + 0x33, 0x2f, 0x32, 0x4a, 0x65, 0x4c, 0x63, 0x2f, 0x50, 0x77, 0x38, 0x54, 0x6a, 0x2f, 0x2f, 0x51, 0x69, 0x77, + 0x4d, 0x42, 0x68, 0x6a, 0x72, 0x39, 0x39, 0x48, 0x74, 0x39, 0x52, 0x67, 0x2f, 0x64, 0x62, 0x2f, 0x79, 0x7a, + 0x4d, 0x70, 0x41, 0x4e, 0x71, 0x70, 0x4f, 0x45, 0x39, 0x58, 0x6c, 0x36, 0x70, 0x4a, 0x32, 0x4f, 0x37, 0x4b, + 0x6c, 0x5c, 0x0a, + 0x09, 0x55, 0x53, 0x44, 0x42, 0x48, 0x56, 0x75, 0x44, 0x52, 0x4e, 0x32, 0x75, 0x48, 0x47, 0x63, 0x54, 0x47, + 0x45, 0x6b, 0x75, 0x5a, 0x42, 0x6e, 0x4a, 0x58, 0x38, 0x6f, 0x58, 0x61, 0x2b, 0x4d, 0x54, 0x70, 0x2b, 0x7a, + 0x61, 0x38, 0x5a, 0x39, 0x75, 0x76, 0x65, 0x39, 0x42, 0x33, 0x48, 0x37, 0x56, 0x6c, 0x37, 0x41, 0x65, 0x74, + 0x43, 0x35, 0x72, 0x41, 0x4b, 0x64, 0x55, 0x7a, 0x67, 0x2f, 0x67, 0x42, 0x77, 0x46, 0x36, 0x68, 0x54, 0x46, + 0x77, 0x5c, 0x0a, + 0x09, 0x51, 0x51, 0x54, 0x2b, 0x53, 0x37, 0x31, 0x55, 0x52, 0x59, 0x4b, 0x36, 0x54, 0x6d, 0x70, 0x59, 0x54, + 0x53, 0x33, 0x78, 0x4d, 0x76, 0x58, 0x2f, 0x31, 0x6a, 0x58, 0x65, 0x4e, 0x6a, 0x38, 0x76, 0x66, 0x7a, 0x5a, + 0x4d, 0x6b, 0x6a, 0x4d, 0x2b, 0x43, 0x64, 0x49, 0x45, 0x75, 0x57, 0x48, 0x57, 0x42, 0x70, 0x6f, 0x61, 0x4a, + 0x4b, 0x6e, 0x36, 0x6d, 0x6c, 0x50, 0x48, 0x2f, 0x69, 0x54, 0x66, 0x6c, 0x54, 0x4f, 0x55, 0x4a, 0x65, 0x59, + 0x58, 0x5c, 0x0a, + 0x09, 0x46, 0x75, 0x43, 0x63, 0x77, 0x2f, 0x57, 0x33, 0x33, 0x59, 0x59, 0x2f, 0x66, 0x76, 0x2b, 0x66, 0x6d, + 0x32, 0x50, 0x39, 0x71, 0x37, 0x2f, 0x36, 0x36, 0x2f, 0x69, 0x72, 0x4f, 0x35, 0x7a, 0x37, 0x4e, 0x37, 0x7a, + 0x35, 0x7a, 0x66, 0x6a, 0x73, 0x5a, 0x7a, 0x38, 0x6e, 0x79, 0x72, 0x37, 0x2b, 0x76, 0x2f, 0x30, 0x75, 0x46, + 0x67, 0x59, 0x2b, 0x6a, 0x56, 0x38, 0x61, 0x4c, 0x46, 0x55, 0x2f, 0x66, 0x53, 0x37, 0x64, 0x52, 0x50, 0x4e, + 0x66, 0x5c, 0x0a, + 0x09, 0x38, 0x30, 0x62, 0x73, 0x2f, 0x33, 0x72, 0x38, 0x41, 0x4e, 0x67, 0x35, 0x4c, 0x62, 0x75, 0x36, 0x4c, + 0x4b, 0x6c, 0x79, 0x6d, 0x6c, 0x2b, 0x74, 0x72, 0x7a, 0x52, 0x49, 0x70, 0x4b, 0x37, 0x5a, 0x44, 0x4b, 0x61, + 0x32, 0x38, 0x34, 0x64, 0x72, 0x4b, 0x6f, 0x46, 0x50, 0x39, 0x4f, 0x42, 0x47, 0x48, 0x73, 0x6d, 0x78, 0x57, + 0x2f, 0x56, 0x59, 0x65, 0x78, 0x66, 0x66, 0x65, 0x74, 0x2b, 0x44, 0x4c, 0x77, 0x62, 0x71, 0x67, 0x4c, 0x6e, + 0x57, 0x5c, 0x0a, + 0x09, 0x74, 0x4f, 0x59, 0x5a, 0x77, 0x43, 0x6e, 0x6e, 0x50, 0x53, 0x34, 0x6f, 0x35, 0x31, 0x51, 0x41, 0x56, + 0x7a, 0x72, 0x34, 0x78, 0x78, 0x35, 0x48, 0x49, 0x32, 0x4b, 0x4b, 0x34, 0x6a, 0x44, 0x4f, 0x63, 0x32, 0x71, + 0x4f, 0x33, 0x73, 0x30, 0x52, 0x6f, 0x53, 0x6c, 0x56, 0x58, 0x54, 0x6e, 0x71, 0x6a, 0x75, 0x72, 0x44, 0x6a, + 0x68, 0x6a, 0x63, 0x2b, 0x62, 0x55, 0x52, 0x57, 0x35, 0x45, 0x74, 0x35, 0x59, 0x48, 0x2f, 0x50, 0x70, 0x37, + 0x69, 0x5c, 0x0a, + 0x09, 0x71, 0x79, 0x77, 0x78, 0x74, 0x37, 0x44, 0x67, 0x66, 0x36, 0x4b, 0x63, 0x2f, 0x50, 0x57, 0x70, 0x69, + 0x55, 0x6c, 0x38, 0x36, 0x79, 0x75, 0x66, 0x52, 0x37, 0x66, 0x6e, 0x35, 0x37, 0x59, 0x42, 0x36, 0x5a, 0x2f, + 0x37, 0x76, 0x42, 0x2f, 0x42, 0x6c, 0x37, 0x37, 0x32, 0x56, 0x62, 0x50, 0x6e, 0x37, 0x56, 0x4e, 0x62, 0x38, + 0x61, 0x2b, 0x66, 0x2f, 0x77, 0x4b, 0x79, 0x4c, 0x45, 0x4f, 0x57, 0x45, 0x38, 0x34, 0x2b, 0x2f, 0x77, 0x49, + 0x63, 0x5c, 0x0a, + 0x09, 0x6e, 0x70, 0x2b, 0x50, 0x55, 0x39, 0x59, 0x38, 0x79, 0x7a, 0x41, 0x78, 0x4d, 0x5a, 0x6b, 0x77, 0x6f, + 0x4d, 0x66, 0x49, 0x2b, 0x57, 0x79, 0x4b, 0x6e, 0x4c, 0x79, 0x75, 0x70, 0x51, 0x75, 0x77, 0x74, 0x6c, 0x62, + 0x4b, 0x4a, 0x47, 0x79, 0x39, 0x72, 0x5a, 0x53, 0x50, 0x48, 0x46, 0x56, 0x45, 0x58, 0x73, 0x45, 0x65, 0x52, + 0x32, 0x56, 0x75, 0x54, 0x62, 0x2b, 0x47, 0x62, 0x50, 0x55, 0x76, 0x64, 0x4c, 0x38, 0x41, 0x34, 0x4c, 0x45, + 0x41, 0x5c, 0x0a, + 0x09, 0x72, 0x69, 0x55, 0x41, 0x74, 0x36, 0x31, 0x78, 0x4a, 0x72, 0x41, 0x75, 0x47, 0x51, 0x41, 0x42, 0x48, + 0x51, 0x66, 0x38, 0x4e, 0x55, 0x44, 0x62, 0x4f, 0x52, 0x4c, 0x7a, 0x4b, 0x41, 0x39, 0x77, 0x67, 0x61, 0x53, + 0x70, 0x5a, 0x58, 0x43, 0x72, 0x46, 0x44, 0x58, 0x54, 0x2b, 0x43, 0x41, 0x6a, 0x67, 0x78, 0x4f, 0x6f, 0x4c, + 0x65, 0x4e, 0x72, 0x58, 0x56, 0x64, 0x48, 0x49, 0x34, 0x6e, 0x59, 0x5a, 0x4b, 0x69, 0x79, 0x6d, 0x66, 0x4f, + 0x6d, 0x5c, 0x0a, + 0x09, 0x62, 0x4d, 0x4c, 0x46, 0x66, 0x35, 0x62, 0x42, 0x70, 0x61, 0x44, 0x41, 0x2b, 0x32, 0x33, 0x36, 0x5a, + 0x64, 0x33, 0x53, 0x75, 0x64, 0x72, 0x35, 0x51, 0x31, 0x30, 0x48, 0x7a, 0x4d, 0x7a, 0x4e, 0x34, 0x68, 0x64, + 0x65, 0x2f, 0x65, 0x76, 0x34, 0x78, 0x72, 0x30, 0x7a, 0x2b, 0x4d, 0x61, 0x39, 0x4d, 0x37, 0x6a, 0x6d, 0x6e, + 0x6f, 0x4f, 0x34, 0x35, 0x74, 0x34, 0x5a, 0x44, 0x4d, 0x6f, 0x51, 0x78, 0x56, 0x50, 0x54, 0x6e, 0x6c, 0x74, + 0x63, 0x5c, 0x0a, + 0x09, 0x77, 0x70, 0x32, 0x7a, 0x53, 0x37, 0x68, 0x74, 0x5a, 0x67, 0x36, 0x2f, 0x2f, 0x65, 0x59, 0x2f, 0x77, + 0x4f, 0x48, 0x35, 0x65, 0x64, 0x2b, 0x7a, 0x41, 0x34, 0x68, 0x51, 0x72, 0x64, 0x63, 0x73, 0x43, 0x75, 0x6e, + 0x70, 0x6a, 0x4d, 0x62, 0x4f, 0x41, 0x35, 0x72, 0x6b, 0x78, 0x6b, 0x76, 0x4c, 0x48, 0x45, 0x33, 0x4c, 0x70, + 0x4f, 0x35, 0x50, 0x79, 0x71, 0x55, 0x5a, 0x74, 0x45, 0x4e, 0x64, 0x78, 0x34, 0x36, 0x6b, 0x62, 0x70, 0x75, + 0x6a, 0x5c, 0x0a, + 0x09, 0x76, 0x6b, 0x56, 0x53, 0x30, 0x36, 0x6b, 0x46, 0x36, 0x63, 0x78, 0x47, 0x74, 0x74, 0x49, 0x55, 0x56, + 0x44, 0x69, 0x50, 0x56, 0x64, 0x76, 0x6a, 0x42, 0x50, 0x77, 0x4e, 0x41, 0x52, 0x4e, 0x72, 0x47, 0x35, 0x6f, + 0x39, 0x72, 0x53, 0x6b, 0x41, 0x68, 0x4f, 0x67, 0x50, 0x34, 0x50, 0x55, 0x41, 0x4c, 0x74, 0x41, 0x4b, 0x72, + 0x5a, 0x55, 0x69, 0x55, 0x7a, 0x43, 0x4e, 0x71, 0x76, 0x77, 0x63, 0x49, 0x4a, 0x56, 0x67, 0x4f, 0x5a, 0x77, + 0x56, 0x5c, 0x0a, + 0x09, 0x4c, 0x57, 0x6f, 0x46, 0x2b, 0x4e, 0x5a, 0x53, 0x35, 0x37, 0x53, 0x6a, 0x62, 0x75, 0x69, 0x44, 0x67, + 0x35, 0x5a, 0x74, 0x4d, 0x44, 0x55, 0x63, 0x68, 0x66, 0x5a, 0x30, 0x32, 0x6d, 0x63, 0x5a, 0x7a, 0x69, 0x6a, + 0x44, 0x43, 0x48, 0x78, 0x61, 0x55, 0x63, 0x6c, 0x56, 0x42, 0x2f, 0x50, 0x4d, 0x2b, 0x51, 0x47, 0x77, 0x4f, + 0x36, 0x65, 0x45, 0x76, 0x2f, 0x2f, 0x59, 0x78, 0x33, 0x44, 0x77, 0x2f, 0x76, 0x74, 0x5a, 0x78, 0x52, 0x4c, + 0x50, 0x5c, 0x0a, + 0x09, 0x2b, 0x62, 0x45, 0x66, 0x4e, 0x33, 0x6a, 0x33, 0x64, 0x4d, 0x61, 0x42, 0x41, 0x35, 0x34, 0x6e, 0x79, + 0x76, 0x43, 0x68, 0x44, 0x2f, 0x38, 0x76, 0x77, 0x57, 0x46, 0x6f, 0x74, 0x78, 0x67, 0x75, 0x49, 0x36, 0x78, + 0x71, 0x42, 0x39, 0x31, 0x4a, 0x66, 0x66, 0x43, 0x32, 0x74, 0x62, 0x37, 0x54, 0x47, 0x46, 0x33, 0x4c, 0x4a, + 0x4d, 0x31, 0x2b, 0x4c, 0x4c, 0x32, 0x47, 0x55, 0x70, 0x61, 0x75, 0x6f, 0x4d, 0x70, 0x70, 0x76, 0x72, 0x6a, + 0x4d, 0x5c, 0x0a, + 0x09, 0x30, 0x34, 0x69, 0x64, 0x39, 0x70, 0x66, 0x32, 0x54, 0x4d, 0x6d, 0x31, 0x70, 0x67, 0x77, 0x6e, 0x4c, + 0x5a, 0x6e, 0x61, 0x68, 0x58, 0x57, 0x39, 0x71, 0x6e, 0x2b, 0x57, 0x41, 0x2f, 0x34, 0x48, 0x49, 0x4b, 0x62, + 0x50, 0x61, 0x30, 0x4a, 0x72, 0x42, 0x67, 0x41, 0x6e, 0x31, 0x36, 0x6e, 0x2f, 0x45, 0x78, 0x7a, 0x77, 0x47, + 0x71, 0x30, 0x77, 0x79, 0x79, 0x6b, 0x41, 0x62, 0x53, 0x4a, 0x70, 0x75, 0x73, 0x58, 0x4c, 0x42, 0x45, 0x46, + 0x62, 0x5c, 0x0a, + 0x09, 0x4b, 0x61, 0x47, 0x75, 0x7a, 0x36, 0x4d, 0x64, 0x4e, 0x79, 0x51, 0x4c, 0x63, 0x4f, 0x6f, 0x32, 0x6e, + 0x4c, 0x69, 0x6d, 0x77, 0x53, 0x41, 0x6c, 0x65, 0x36, 0x32, 0x43, 0x31, 0x48, 0x58, 0x62, 0x45, 0x48, 0x67, + 0x38, 0x74, 0x59, 0x33, 0x55, 0x36, 0x41, 0x35, 0x5a, 0x6c, 0x71, 0x6d, 0x37, 0x54, 0x6e, 0x57, 0x74, 0x35, + 0x65, 0x55, 0x68, 0x2f, 0x76, 0x75, 0x62, 0x33, 0x67, 0x6a, 0x6e, 0x79, 0x75, 0x71, 0x4f, 0x41, 0x4f, 0x47, + 0x43, 0x5c, 0x0a, + 0x09, 0x4a, 0x7a, 0x38, 0x4e, 0x35, 0x7a, 0x2f, 0x36, 0x66, 0x4c, 0x4f, 0x48, 0x43, 0x37, 0x2f, 0x76, 0x4b, + 0x58, 0x41, 0x41, 0x4c, 0x76, 0x2f, 0x6f, 0x52, 0x2f, 0x46, 0x41, 0x2f, 0x42, 0x56, 0x65, 0x56, 0x73, 0x59, + 0x42, 0x45, 0x2b, 0x4d, 0x54, 0x63, 0x43, 0x53, 0x6a, 0x4e, 0x65, 0x39, 0x5a, 0x36, 0x31, 0x4f, 0x4f, 0x33, + 0x35, 0x6d, 0x79, 0x56, 0x6b, 0x4e, 0x4b, 0x64, 0x47, 0x49, 0x42, 0x4f, 0x6a, 0x2f, 0x6d, 0x75, 0x76, 0x4c, + 0x66, 0x5c, 0x0a, + 0x09, 0x4e, 0x58, 0x2b, 0x6b, 0x64, 0x43, 0x46, 0x72, 0x4e, 0x6a, 0x6b, 0x6f, 0x6e, 0x33, 0x35, 0x49, 0x59, + 0x4a, 0x4d, 0x52, 0x58, 0x6f, 0x4e, 0x39, 0x34, 0x47, 0x65, 0x6c, 0x37, 0x49, 0x66, 0x58, 0x54, 0x38, 0x76, + 0x51, 0x7a, 0x78, 0x48, 0x77, 0x77, 0x77, 0x35, 0x72, 0x75, 0x78, 0x36, 0x77, 0x31, 0x6c, 0x4f, 0x41, 0x4b, + 0x51, 0x41, 0x66, 0x6f, 0x4b, 0x71, 0x66, 0x5a, 0x6f, 0x4d, 0x6d, 0x59, 0x53, 0x6a, 0x38, 0x30, 0x34, 0x71, + 0x61, 0x5c, 0x0a, + 0x09, 0x4f, 0x73, 0x72, 0x6f, 0x44, 0x4d, 0x47, 0x69, 0x4f, 0x6c, 0x4b, 0x6c, 0x61, 0x57, 0x6e, 0x54, 0x63, + 0x52, 0x4d, 0x77, 0x70, 0x47, 0x6c, 0x67, 0x62, 0x59, 0x49, 0x36, 0x45, 0x6b, 0x71, 0x65, 0x6e, 0x46, 0x6d, + 0x2f, 0x6a, 0x71, 0x51, 0x75, 0x4d, 0x61, 0x54, 0x41, 0x73, 0x32, 0x34, 0x76, 0x39, 0x44, 0x6b, 0x78, 0x4e, + 0x6f, 0x59, 0x38, 0x34, 0x33, 0x64, 0x7a, 0x4b, 0x58, 0x34, 0x51, 0x41, 0x5a, 0x2f, 0x37, 0x30, 0x70, 0x64, + 0x77, 0x5c, 0x0a, + 0x09, 0x32, 0x38, 0x32, 0x33, 0x69, 0x47, 0x75, 0x2f, 0x2b, 0x47, 0x75, 0x76, 0x78, 0x65, 0x54, 0x45, 0x42, + 0x44, 0x68, 0x4e, 0x54, 0x6b, 0x7a, 0x67, 0x36, 0x63, 0x39, 0x35, 0x48, 0x67, 0x6a, 0x41, 0x6e, 0x2f, 0x37, + 0x5a, 0x6e, 0x38, 0x69, 0x6f, 0x58, 0x54, 0x55, 0x35, 0x31, 0x75, 0x38, 0x6a, 0x7a, 0x33, 0x4d, 0x68, 0x48, + 0x7a, 0x33, 0x47, 0x6c, 0x45, 0x2b, 0x62, 0x39, 0x4f, 0x4b, 0x71, 0x42, 0x4f, 0x62, 0x36, 0x76, 0x4f, 0x56, + 0x45, 0x5c, 0x0a, + 0x09, 0x64, 0x67, 0x59, 0x6d, 0x75, 0x65, 0x41, 0x36, 0x73, 0x4f, 0x39, 0x56, 0x49, 0x4a, 0x46, 0x33, 0x57, + 0x71, 0x4c, 0x2b, 0x7a, 0x75, 0x4f, 0x39, 0x74, 0x73, 0x6e, 0x36, 0x75, 0x77, 0x77, 0x79, 0x4b, 0x62, 0x2b, + 0x6b, 0x76, 0x71, 0x63, 0x5a, 0x44, 0x79, 0x2f, 0x6c, 0x67, 0x50, 0x63, 0x44, 0x32, 0x49, 0x55, 0x31, 0x70, + 0x44, 0x55, 0x42, 0x41, 0x4a, 0x61, 0x32, 0x2f, 0x43, 0x36, 0x41, 0x76, 0x65, 0x47, 0x4c, 0x54, 0x6f, 0x74, + 0x71, 0x5c, 0x0a, + 0x09, 0x70, 0x63, 0x74, 0x55, 0x6b, 0x58, 0x38, 0x47, 0x6b, 0x56, 0x74, 0x52, 0x67, 0x4b, 0x41, 0x56, 0x55, + 0x46, 0x4e, 0x54, 0x31, 0x4e, 0x44, 0x6d, 0x6b, 0x46, 0x4c, 0x4b, 0x59, 0x35, 0x4d, 0x52, 0x61, 0x77, 0x50, + 0x54, 0x64, 0x79, 0x4d, 0x34, 0x2f, 0x32, 0x6b, 0x64, 0x75, 0x32, 0x63, 0x72, 0x55, 0x74, 0x6d, 0x4c, 0x66, + 0x2f, 0x55, 0x34, 0x4a, 0x73, 0x62, 0x48, 0x68, 0x57, 0x4f, 0x47, 0x6a, 0x70, 0x30, 0x44, 0x43, 0x6c, 0x66, + 0x69, 0x5c, 0x0a, + 0x09, 0x37, 0x57, 0x2f, 0x35, 0x50, 0x5a, 0x38, 0x46, 0x41, 0x48, 0x43, 0x75, 0x78, 0x41, 0x6d, 0x6e, 0x37, + 0x73, 0x56, 0x50, 0x76, 0x4f, 0x53, 0x6c, 0x6f, 0x73, 0x58, 0x48, 0x58, 0x2f, 0x51, 0x45, 0x62, 0x4a, 0x6d, + 0x61, 0x78, 0x72, 0x56, 0x66, 0x2b, 0x78, 0x70, 0x75, 0x76, 0x66, 0x4f, 0x75, 0x68, 0x4d, 0x46, 0x75, 0x74, + 0x34, 0x74, 0x65, 0x74, 0x61, 0x43, 0x34, 0x6b, 0x71, 0x79, 0x74, 0x72, 0x49, 0x31, 0x48, 0x35, 0x2f, 0x53, + 0x63, 0x5c, 0x0a, + 0x09, 0x2f, 0x63, 0x66, 0x62, 0x74, 0x7a, 0x49, 0x71, 0x4c, 0x6e, 0x57, 0x39, 0x57, 0x4a, 0x68, 0x47, 0x5a, + 0x4e, 0x75, 0x4a, 0x39, 0x56, 0x69, 0x61, 0x2b, 0x4e, 0x64, 0x6a, 0x6c, 0x59, 0x42, 0x56, 0x63, 0x79, 0x53, + 0x64, 0x6d, 0x43, 0x42, 0x44, 0x54, 0x6e, 0x71, 0x33, 0x77, 0x51, 0x62, 0x4b, 0x43, 0x43, 0x63, 0x37, 0x43, + 0x58, 0x67, 0x58, 0x41, 0x4a, 0x78, 0x79, 0x33, 0x76, 0x64, 0x69, 0x4c, 0x57, 0x6a, 0x56, 0x41, 0x59, 0x43, + 0x6c, 0x5c, 0x0a, + 0x09, 0x2f, 0x6b, 0x38, 0x42, 0x38, 0x44, 0x4b, 0x41, 0x43, 0x31, 0x45, 0x65, 0x61, 0x55, 0x63, 0x4f, 0x33, + 0x37, 0x54, 0x67, 0x72, 0x62, 0x54, 0x62, 0x64, 0x6d, 0x49, 0x79, 0x6a, 0x6d, 0x77, 0x44, 0x30, 0x6d, 0x6c, + 0x62, 0x66, 0x54, 0x35, 0x64, 0x48, 0x34, 0x43, 0x71, 0x59, 0x77, 0x47, 0x43, 0x42, 0x6a, 0x49, 0x35, 0x70, + 0x68, 0x52, 0x30, 0x67, 0x6f, 0x6f, 0x74, 0x41, 0x36, 0x76, 0x37, 0x63, 0x67, 0x6d, 0x6f, 0x63, 0x46, 0x35, + 0x43, 0x5c, 0x0a, + 0x09, 0x65, 0x5a, 0x44, 0x50, 0x42, 0x43, 0x6a, 0x4c, 0x5a, 0x43, 0x45, 0x34, 0x4f, 0x4f, 0x66, 0x77, 0x70, + 0x53, 0x75, 0x76, 0x78, 0x41, 0x33, 0x66, 0x2b, 0x45, 0x5a, 0x39, 0x69, 0x54, 0x4a, 0x73, 0x6e, 0x64, 0x6f, + 0x71, 0x57, 0x68, 0x34, 0x4d, 0x2f, 0x43, 0x37, 0x4b, 0x39, 0x37, 0x33, 0x37, 0x58, 0x53, 0x6a, 0x4b, 0x38, + 0x4c, 0x69, 0x47, 0x37, 0x36, 0x57, 0x54, 0x35, 0x52, 0x6a, 0x76, 0x6a, 0x37, 0x45, 0x7a, 0x64, 0x6d, 0x59, + 0x47, 0x5c, 0x0a, + 0x09, 0x34, 0x33, 0x74, 0x36, 0x47, 0x7a, 0x58, 0x49, 0x6c, 0x7a, 0x74, 0x73, 0x43, 0x67, 0x70, 0x4e, 0x49, + 0x4a, 0x33, 0x61, 0x51, 0x56, 0x70, 0x53, 0x36, 0x30, 0x69, 0x57, 0x53, 0x4f, 0x57, 0x5a, 0x42, 0x70, 0x7a, + 0x6d, 0x30, 0x6a, 0x71, 0x44, 0x43, 0x36, 0x76, 0x39, 0x54, 0x70, 0x7a, 0x6e, 0x77, 0x4d, 0x33, 0x7a, 0x75, + 0x39, 0x48, 0x32, 0x77, 0x38, 0x64, 0x55, 0x31, 0x38, 0x4c, 0x7a, 0x43, 0x66, 0x52, 0x63, 0x42, 0x37, 0x63, + 0x6d, 0x5c, 0x0a, + 0x09, 0x55, 0x34, 0x47, 0x31, 0x6d, 0x67, 0x4c, 0x30, 0x41, 0x50, 0x77, 0x52, 0x59, 0x4b, 0x63, 0x34, 0x51, + 0x42, 0x6f, 0x4a, 0x72, 0x47, 0x67, 0x71, 0x68, 0x52, 0x7a, 0x71, 0x4e, 0x54, 0x76, 0x78, 0x61, 0x46, 0x57, + 0x6e, 0x62, 0x71, 0x33, 0x76, 0x4e, 0x2f, 0x4e, 0x53, 0x6f, 0x77, 0x78, 0x51, 0x47, 0x34, 0x72, 0x64, 0x68, + 0x70, 0x30, 0x33, 0x61, 0x47, 0x43, 0x77, 0x44, 0x4e, 0x55, 0x78, 0x33, 0x6b, 0x49, 0x5a, 0x57, 0x34, 0x62, + 0x73, 0x5c, 0x0a, + 0x09, 0x58, 0x4a, 0x5a, 0x68, 0x63, 0x6e, 0x77, 0x63, 0x47, 0x54, 0x39, 0x5a, 0x37, 0x59, 0x45, 0x76, 0x48, + 0x66, 0x44, 0x4f, 0x74, 0x37, 0x37, 0x56, 0x31, 0x36, 0x45, 0x4d, 0x7a, 0x70, 0x58, 0x34, 0x36, 0x68, 0x65, + 0x2f, 0x4b, 0x4f, 0x44, 0x34, 0x47, 0x39, 0x64, 0x65, 0x69, 0x37, 0x74, 0x75, 0x76, 0x77, 0x31, 0x58, 0x66, + 0x65, 0x4d, 0x62, 0x64, 0x63, 0x74, 0x45, 0x79, 0x49, 0x67, 0x77, 0x50, 0x6a, 0x59, 0x47, 0x30, 0x4d, 0x72, + 0x47, 0x5c, 0x0a, + 0x09, 0x79, 0x78, 0x32, 0x36, 0x50, 0x75, 0x2f, 0x4d, 0x73, 0x76, 0x55, 0x34, 0x77, 0x78, 0x68, 0x72, 0x71, + 0x59, 0x32, 0x4f, 0x2b, 0x46, 0x4c, 0x2b, 0x6c, 0x73, 0x78, 0x31, 0x41, 0x4a, 0x48, 0x31, 0x6e, 0x61, 0x45, + 0x2f, 0x32, 0x31, 0x4b, 0x73, 0x49, 0x4d, 0x48, 0x62, 0x31, 0x2b, 0x4d, 0x6a, 0x79, 0x44, 0x37, 0x34, 0x4f, + 0x4d, 0x4e, 0x31, 0x76, 0x59, 0x69, 0x73, 0x78, 0x77, 0x46, 0x52, 0x4e, 0x73, 0x72, 0x6e, 0x6e, 0x56, 0x69, + 0x6a, 0x5c, 0x0a, + 0x09, 0x35, 0x77, 0x52, 0x57, 0x46, 0x51, 0x42, 0x4f, 0x71, 0x58, 0x66, 0x37, 0x58, 0x51, 0x70, 0x67, 0x76, + 0x7a, 0x5a, 0x63, 0x4f, 0x55, 0x69, 0x6e, 0x6c, 0x4b, 0x63, 0x46, 0x7a, 0x38, 0x30, 0x7a, 0x7a, 0x52, 0x78, + 0x53, 0x51, 0x4c, 0x41, 0x53, 0x4f, 0x6d, 0x35, 0x49, 0x55, 0x75, 0x7a, 0x63, 0x52, 0x45, 0x4d, 0x45, 0x34, + 0x69, 0x6c, 0x64, 0x65, 0x6e, 0x74, 0x4c, 0x4c, 0x74, 0x44, 0x70, 0x73, 0x61, 0x56, 0x4b, 0x74, 0x61, 0x63, + 0x61, 0x5c, 0x0a, + 0x09, 0x61, 0x5a, 0x54, 0x68, 0x57, 0x32, 0x5a, 0x34, 0x4f, 0x62, 0x76, 0x2b, 0x79, 0x47, 0x69, 0x62, 0x5a, + 0x52, 0x67, 0x62, 0x47, 0x36, 0x39, 0x37, 0x69, 0x51, 0x30, 0x34, 0x66, 0x4f, 0x33, 0x61, 0x61, 0x2f, 0x43, + 0x64, 0x36, 0x37, 0x38, 0x46, 0x35, 0x2f, 0x77, 0x64, 0x67, 0x32, 0x39, 0x2b, 0x34, 0x31, 0x72, 0x77, 0x38, + 0x64, 0x39, 0x37, 0x2f, 0x33, 0x31, 0x34, 0x31, 0x39, 0x76, 0x65, 0x69, 0x6d, 0x47, 0x31, 0x31, 0x54, 0x65, + 0x30, 0x5c, 0x0a, + 0x09, 0x50, 0x54, 0x59, 0x2b, 0x44, 0x6d, 0x53, 0x5a, 0x45, 0x5a, 0x6d, 0x62, 0x62, 0x34, 0x31, 0x79, 0x47, + 0x4c, 0x41, 0x63, 0x4d, 0x5a, 0x53, 0x51, 0x33, 0x31, 0x31, 0x53, 0x54, 0x67, 0x4f, 0x39, 0x76, 0x65, 0x47, + 0x4c, 0x75, 0x55, 0x6c, 0x44, 0x41, 0x4c, 0x44, 0x41, 0x51, 0x6b, 0x74, 0x62, 0x66, 0x37, 0x4e, 0x73, 0x31, + 0x78, 0x71, 0x50, 0x46, 0x5a, 0x6a, 0x30, 0x64, 0x54, 0x31, 0x4f, 0x69, 0x77, 0x39, 0x65, 0x54, 0x67, 0x63, + 0x51, 0x5c, 0x0a, + 0x09, 0x42, 0x35, 0x78, 0x41, 0x77, 0x47, 0x75, 0x42, 0x31, 0x56, 0x38, 0x51, 0x58, 0x46, 0x55, 0x41, 0x71, + 0x41, 0x61, 0x78, 0x78, 0x77, 0x47, 0x2f, 0x72, 0x71, 0x39, 0x5a, 0x77, 0x74, 0x4c, 0x58, 0x77, 0x2b, 0x63, + 0x6f, 0x51, 0x30, 0x6c, 0x54, 0x77, 0x50, 0x44, 0x70, 0x7a, 0x59, 0x51, 0x4c, 0x7a, 0x7a, 0x49, 0x2b, 0x4f, + 0x34, 0x4a, 0x70, 0x46, 0x4c, 0x66, 0x63, 0x72, 0x38, 0x62, 0x37, 0x4e, 0x50, 0x4d, 0x59, 0x48, 0x61, 0x45, + 0x31, 0x5c, 0x0a, + 0x09, 0x57, 0x59, 0x62, 0x50, 0x46, 0x78, 0x41, 0x44, 0x49, 0x4e, 0x69, 0x5a, 0x68, 0x46, 0x77, 0x77, 0x6c, + 0x65, 0x6b, 0x6f, 0x30, 0x4f, 0x6c, 0x30, 0x4b, 0x78, 0x44, 0x77, 0x49, 0x77, 0x6b, 0x50, 0x32, 0x4a, 0x51, + 0x4f, 0x2b, 0x4a, 0x50, 0x33, 0x76, 0x41, 0x64, 0x45, 0x47, 0x51, 0x37, 0x64, 0x66, 0x7a, 0x2f, 0x75, 0x76, + 0x50, 0x4e, 0x4f, 0x61, 0x4d, 0x6c, 0x2b, 0x34, 0x53, 0x76, 0x2f, 0x35, 0x6f, 0x2b, 0x71, 0x30, 0x2f, 0x33, + 0x2b, 0x5c, 0x0a, + 0x09, 0x47, 0x44, 0x70, 0x35, 0x62, 0x68, 0x70, 0x31, 0x55, 0x2b, 0x6f, 0x4e, 0x53, 0x50, 0x6c, 0x77, 0x4a, + 0x7a, 0x67, 0x61, 0x4d, 0x4c, 0x43, 0x69, 0x65, 0x39, 0x32, 0x4f, 0x64, 0x63, 0x73, 0x33, 0x35, 0x57, 0x5a, + 0x55, 0x50, 0x79, 0x6b, 0x41, 0x31, 0x2b, 0x57, 0x34, 0x6a, 0x56, 0x68, 0x6a, 0x67, 0x43, 0x71, 0x6a, 0x36, + 0x7a, 0x58, 0x33, 0x54, 0x36, 0x59, 0x63, 0x41, 0x6b, 0x77, 0x47, 0x63, 0x4e, 0x4d, 0x77, 0x70, 0x4f, 0x7a, + 0x73, 0x5c, 0x0a, + 0x09, 0x55, 0x67, 0x43, 0x6e, 0x47, 0x36, 0x7a, 0x2f, 0x75, 0x32, 0x6a, 0x56, 0x41, 0x43, 0x41, 0x73, 0x55, + 0x6a, 0x6a, 0x67, 0x31, 0x51, 0x43, 0x32, 0x36, 0x6b, 0x48, 0x57, 0x2f, 0x2f, 0x75, 0x6a, 0x4a, 0x73, 0x4f, + 0x6f, 0x53, 0x36, 0x52, 0x4f, 0x78, 0x6f, 0x2b, 0x62, 0x6f, 0x72, 0x45, 0x76, 0x55, 0x78, 0x73, 0x4b, 0x78, + 0x48, 0x6c, 0x74, 0x42, 0x4a, 0x4b, 0x76, 0x2b, 0x6c, 0x4f, 0x36, 0x6e, 0x2b, 0x58, 0x73, 0x54, 0x57, 0x33, + 0x7a, 0x5c, 0x0a, + 0x09, 0x53, 0x47, 0x47, 0x68, 0x75, 0x6a, 0x51, 0x75, 0x53, 0x73, 0x37, 0x72, 0x4d, 0x65, 0x68, 0x65, 0x6d, + 0x32, 0x35, 0x4e, 0x31, 0x52, 0x48, 0x5a, 0x6f, 0x64, 0x76, 0x74, 0x6f, 0x74, 0x2f, 0x72, 0x2b, 0x58, 0x4f, + 0x73, 0x30, 0x47, 0x65, 0x75, 0x75, 0x41, 0x4c, 0x33, 0x33, 0x33, 0x4d, 0x33, 0x72, 0x76, 0x7a, 0x79, 0x46, + 0x78, 0x56, 0x55, 0x41, 0x75, 0x6a, 0x31, 0x73, 0x54, 0x52, 0x59, 0x38, 0x6a, 0x30, 0x37, 0x76, 0x2b, 0x6a, + 0x58, 0x5c, 0x0a, + 0x09, 0x37, 0x58, 0x5a, 0x5a, 0x36, 0x7a, 0x4c, 0x62, 0x30, 0x6d, 0x44, 0x56, 0x6c, 0x4d, 0x6f, 0x32, 0x36, + 0x64, 0x69, 0x4a, 0x36, 0x7a, 0x6f, 0x66, 0x30, 0x32, 0x4f, 0x79, 0x49, 0x71, 0x6b, 0x64, 0x50, 0x54, 0x6d, + 0x2f, 0x2b, 0x6c, 0x6f, 0x54, 0x49, 0x4d, 0x73, 0x65, 0x6d, 0x36, 0x36, 0x6b, 0x5a, 0x41, 0x55, 0x78, 0x4b, + 0x33, 0x74, 0x49, 0x4e, 0x63, 0x55, 0x42, 0x58, 0x6d, 0x65, 0x6a, 0x30, 0x6a, 0x59, 0x59, 0x37, 0x33, 0x30, + 0x43, 0x5c, 0x0a, + 0x09, 0x66, 0x68, 0x56, 0x59, 0x33, 0x53, 0x78, 0x67, 0x46, 0x54, 0x4d, 0x41, 0x42, 0x77, 0x4b, 0x4e, 0x41, + 0x2f, 0x69, 0x5a, 0x31, 0x41, 0x68, 0x30, 0x76, 0x48, 0x42, 0x4b, 0x4d, 0x62, 0x55, 0x49, 0x56, 0x6b, 0x4c, + 0x6e, 0x75, 0x67, 0x57, 0x72, 0x6c, 0x47, 0x30, 0x4d, 0x2b, 0x6a, 0x78, 0x50, 0x72, 0x6e, 0x51, 0x30, 0x64, + 0x38, 0x6e, 0x5a, 0x74, 0x4c, 0x36, 0x4d, 0x44, 0x6d, 0x6c, 0x76, 0x4b, 0x57, 0x43, 0x52, 0x4d, 0x41, 0x51, + 0x65, 0x5c, 0x0a, + 0x09, 0x76, 0x52, 0x79, 0x6b, 0x66, 0x4a, 0x6f, 0x64, 0x4b, 0x5a, 0x56, 0x69, 0x4c, 0x5a, 0x64, 0x30, 0x79, + 0x32, 0x79, 0x2f, 0x33, 0x30, 0x65, 0x6e, 0x4b, 0x31, 0x38, 0x79, 0x57, 0x35, 0x51, 0x46, 0x2f, 0x75, 0x4c, + 0x39, 0x66, 0x34, 0x79, 0x62, 0x76, 0x76, 0x55, 0x74, 0x31, 0x71, 0x71, 0x6e, 0x5a, 0x63, 0x71, 0x72, 0x78, + 0x33, 0x49, 0x4a, 0x57, 0x5a, 0x35, 0x6a, 0x72, 0x46, 0x72, 0x30, 0x34, 0x2b, 0x4f, 0x74, 0x5a, 0x5a, 0x43, + 0x36, 0x5c, 0x0a, + 0x09, 0x73, 0x77, 0x53, 0x49, 0x4e, 0x4a, 0x70, 0x61, 0x33, 0x37, 0x58, 0x4a, 0x38, 0x33, 0x46, 0x4c, 0x65, + 0x55, 0x6e, 0x64, 0x4e, 0x6f, 0x48, 0x4b, 0x53, 0x73, 0x2b, 0x45, 0x4e, 0x47, 0x56, 0x72, 0x4b, 0x39, 0x30, + 0x4f, 0x64, 0x4f, 0x70, 0x59, 0x36, 0x31, 0x64, 0x71, 0x31, 0x63, 0x35, 0x41, 0x72, 0x44, 0x48, 0x72, 0x67, + 0x47, 0x51, 0x46, 0x4d, 0x57, 0x57, 0x62, 0x50, 0x34, 0x46, 0x56, 0x66, 0x6d, 0x6e, 0x49, 0x71, 0x67, 0x46, + 0x41, 0x5c, 0x0a, + 0x09, 0x70, 0x62, 0x41, 0x6e, 0x41, 0x70, 0x6a, 0x53, 0x5a, 0x71, 0x4c, 0x78, 0x4e, 0x58, 0x57, 0x6d, 0x2b, + 0x73, 0x78, 0x6f, 0x46, 0x65, 0x6f, 0x4e, 0x48, 0x53, 0x6b, 0x50, 0x56, 0x73, 0x53, 0x32, 0x44, 0x4a, 0x42, + 0x7a, 0x4a, 0x46, 0x50, 0x4e, 0x35, 0x70, 0x6b, 0x6d, 0x4c, 0x38, 0x2f, 0x56, 0x62, 0x51, 0x47, 0x55, 0x6a, + 0x49, 0x36, 0x70, 0x71, 0x57, 0x73, 0x6e, 0x53, 0x64, 0x73, 0x64, 0x76, 0x63, 0x48, 0x4a, 0x63, 0x68, 0x52, + 0x64, 0x5c, 0x0a, + 0x09, 0x62, 0x72, 0x78, 0x4b, 0x34, 0x51, 0x48, 0x45, 0x71, 0x63, 0x44, 0x48, 0x4c, 0x37, 0x73, 0x63, 0x68, + 0x77, 0x34, 0x64, 0x42, 0x49, 0x2b, 0x39, 0x57, 0x62, 0x65, 0x48, 0x59, 0x74, 0x6e, 0x50, 0x2f, 0x58, 0x4d, + 0x69, 0x6a, 0x49, 0x2b, 0x50, 0x78, 0x30, 0x5a, 0x47, 0x79, 0x56, 0x71, 0x36, 0x37, 0x61, 0x68, 0x4e, 0x54, + 0x6e, 0x55, 0x70, 0x72, 0x52, 0x4d, 0x39, 0x52, 0x6e, 0x34, 0x74, 0x63, 0x47, 0x67, 0x39, 0x57, 0x38, 0x44, + 0x72, 0x5c, 0x0a, + 0x09, 0x57, 0x7a, 0x71, 0x31, 0x2b, 0x67, 0x2f, 0x58, 0x65, 0x48, 0x39, 0x36, 0x66, 0x44, 0x6f, 0x6f, 0x38, + 0x66, 0x5a, 0x30, 0x42, 0x68, 0x4b, 0x75, 0x42, 0x61, 0x75, 0x32, 0x67, 0x6f, 0x54, 0x57, 0x69, 0x64, 0x57, + 0x58, 0x78, 0x57, 0x46, 0x44, 0x2b, 0x58, 0x45, 0x43, 0x6e, 0x6d, 0x52, 0x57, 0x65, 0x34, 0x69, 0x30, 0x32, + 0x6d, 0x73, 0x41, 0x31, 0x61, 0x73, 0x37, 0x70, 0x47, 0x6d, 0x6b, 0x79, 0x55, 0x33, 0x39, 0x72, 0x56, 0x5a, + 0x67, 0x5c, 0x0a, + 0x09, 0x45, 0x31, 0x78, 0x77, 0x51, 0x63, 0x72, 0x36, 0x70, 0x4b, 0x37, 0x70, 0x43, 0x47, 0x52, 0x46, 0x43, + 0x32, 0x31, 0x34, 0x64, 0x56, 0x38, 0x38, 0x4c, 0x76, 0x73, 0x7a, 0x4e, 0x54, 0x4c, 0x72, 0x2b, 0x56, 0x6c, + 0x74, 0x38, 0x50, 0x70, 0x73, 0x79, 0x72, 0x63, 0x45, 0x43, 0x49, 0x73, 0x58, 0x51, 0x42, 0x70, 0x73, 0x44, + 0x59, 0x70, 0x57, 0x32, 0x33, 0x61, 0x32, 0x6c, 0x42, 0x6f, 0x54, 0x65, 0x59, 0x73, 0x5a, 0x47, 0x30, 0x4f, + 0x57, 0x5c, 0x0a, + 0x09, 0x5a, 0x58, 0x45, 0x71, 0x63, 0x47, 0x52, 0x2b, 0x44, 0x72, 0x66, 0x66, 0x63, 0x58, 0x65, 0x73, 0x34, + 0x51, 0x41, 0x73, 0x35, 0x31, 0x30, 0x55, 0x7a, 0x69, 0x45, 0x6a, 0x51, 0x6e, 0x39, 0x38, 0x48, 0x44, 0x6d, + 0x6c, 0x4f, 0x72, 0x43, 0x4f, 0x72, 0x5a, 0x6a, 0x58, 0x35, 0x48, 0x68, 0x63, 0x6c, 0x72, 0x4a, 0x31, 0x69, + 0x33, 0x50, 0x65, 0x73, 0x6f, 0x50, 0x6d, 0x52, 0x74, 0x65, 0x6f, 0x64, 0x53, 0x79, 0x42, 0x45, 0x4a, 0x44, + 0x79, 0x5c, 0x0a, + 0x09, 0x31, 0x6e, 0x7a, 0x77, 0x36, 0x39, 0x62, 0x74, 0x79, 0x71, 0x4d, 0x42, 0x46, 0x61, 0x33, 0x4c, 0x4a, + 0x6b, 0x43, 0x70, 0x79, 0x2b, 0x6f, 0x46, 0x5a, 0x36, 0x6c, 0x54, 0x6f, 0x4a, 0x36, 0x63, 0x57, 0x54, 0x6f, + 0x48, 0x61, 0x48, 0x5a, 0x30, 0x6b, 0x50, 0x7a, 0x75, 0x61, 0x4c, 0x56, 0x76, 0x41, 0x31, 0x37, 0x6d, 0x67, + 0x42, 0x75, 0x31, 0x73, 0x56, 0x74, 0x71, 0x74, 0x6c, 0x49, 0x75, 0x66, 0x6f, 0x61, 0x6e, 0x52, 0x53, 0x74, + 0x46, 0x5c, 0x0a, + 0x09, 0x43, 0x6b, 0x37, 0x61, 0x52, 0x49, 0x37, 0x6d, 0x63, 0x56, 0x35, 0x2f, 0x72, 0x47, 0x2f, 0x4a, 0x63, + 0x62, 0x44, 0x52, 0x47, 0x7a, 0x68, 0x6b, 0x53, 0x32, 0x6b, 0x30, 0x6c, 0x45, 0x63, 0x36, 0x31, 0x62, 0x50, + 0x71, 0x4e, 0x6b, 0x58, 0x37, 0x4e, 0x4b, 0x72, 0x71, 0x36, 0x5a, 0x4d, 0x73, 0x70, 0x2f, 0x6c, 0x48, 0x6c, + 0x6d, 0x46, 0x69, 0x66, 0x4a, 0x79, 0x39, 0x72, 0x59, 0x72, 0x38, 0x52, 0x70, 0x39, 0x51, 0x76, 0x39, 0x50, + 0x44, 0x5c, 0x0a, + 0x09, 0x59, 0x46, 0x67, 0x41, 0x42, 0x50, 0x52, 0x59, 0x78, 0x67, 0x43, 0x6b, 0x68, 0x74, 0x79, 0x73, 0x73, + 0x78, 0x54, 0x6f, 0x4f, 0x49, 0x56, 0x4d, 0x53, 0x50, 0x44, 0x46, 0x57, 0x6b, 0x71, 0x7a, 0x41, 0x52, 0x6b, + 0x4f, 0x36, 0x72, 0x48, 0x5a, 0x6d, 0x33, 0x31, 0x30, 0x58, 0x37, 0x78, 0x65, 0x55, 0x38, 0x61, 0x67, 0x2b, + 0x2b, 0x59, 0x61, 0x74, 0x32, 0x53, 0x62, 0x6a, 0x71, 0x63, 0x70, 0x6d, 0x30, 0x68, 0x42, 0x4b, 0x72, 0x57, + 0x57, 0x5c, 0x0a, + 0x09, 0x56, 0x46, 0x63, 0x79, 0x6b, 0x36, 0x6e, 0x68, 0x6a, 0x41, 0x63, 0x52, 0x41, 0x46, 0x63, 0x44, 0x37, + 0x74, 0x50, 0x47, 0x73, 0x42, 0x38, 0x79, 0x72, 0x64, 0x6f, 0x62, 0x67, 0x53, 0x35, 0x39, 0x33, 0x73, 0x56, + 0x59, 0x47, 0x67, 0x79, 0x48, 0x64, 0x39, 0x78, 0x39, 0x36, 0x46, 0x38, 0x2b, 0x38, 0x75, 0x55, 0x72, 0x58, + 0x2b, 0x62, 0x50, 0x31, 0x67, 0x50, 0x52, 0x71, 0x54, 0x42, 0x2f, 0x31, 0x4c, 0x4d, 0x75, 0x6d, 0x54, 0x70, + 0x41, 0x5c, 0x0a, + 0x09, 0x2b, 0x4d, 0x62, 0x56, 0x6f, 0x77, 0x57, 0x57, 0x66, 0x6d, 0x72, 0x58, 0x58, 0x67, 0x6d, 0x64, 0x30, + 0x34, 0x63, 0x33, 0x7a, 0x59, 0x69, 0x71, 0x32, 0x72, 0x58, 0x53, 0x4e, 0x4a, 0x33, 0x39, 0x38, 0x46, 0x71, + 0x32, 0x63, 0x30, 0x67, 0x5a, 0x79, 0x64, 0x55, 0x43, 0x44, 0x6d, 0x68, 0x70, 0x56, 0x73, 0x57, 0x58, 0x44, + 0x71, 0x30, 0x4d, 0x49, 0x35, 0x37, 0x4c, 0x4d, 0x6f, 0x79, 0x50, 0x54, 0x32, 0x42, 0x68, 0x59, 0x52, 0x34, + 0x67, 0x5c, 0x0a, + 0x09, 0x34, 0x4e, 0x35, 0x44, 0x42, 0x39, 0x47, 0x76, 0x49, 0x6e, 0x37, 0x5a, 0x37, 0x61, 0x4e, 0x63, 0x58, + 0x45, 0x53, 0x48, 0x4c, 0x66, 0x6f, 0x31, 0x5a, 0x53, 0x61, 0x57, 0x4a, 0x4a, 0x6f, 0x79, 0x6d, 0x69, 0x5a, + 0x67, 0x53, 0x74, 0x74, 0x30, 0x6b, 0x42, 0x4f, 0x37, 0x31, 0x4d, 0x6c, 0x31, 0x57, 0x78, 0x70, 0x59, 0x59, + 0x5a, 0x51, 0x66, 0x31, 0x61, 0x2f, 0x46, 0x76, 0x38, 0x77, 0x35, 0x35, 0x46, 0x68, 0x54, 0x6e, 0x76, 0x30, + 0x56, 0x5c, 0x0a, + 0x09, 0x76, 0x55, 0x4e, 0x54, 0x51, 0x6b, 0x70, 0x71, 0x32, 0x32, 0x6d, 0x77, 0x73, 0x74, 0x39, 0x57, 0x46, + 0x44, 0x61, 0x41, 0x61, 0x5a, 0x74, 0x38, 0x78, 0x54, 0x4f, 0x66, 0x66, 0x45, 0x57, 0x33, 0x6e, 0x7a, 0x76, + 0x4b, 0x64, 0x45, 0x73, 0x50, 0x6e, 0x56, 0x62, 0x74, 0x66, 0x51, 0x44, 0x6c, 0x74, 0x5a, 0x38, 0x45, 0x67, + 0x4a, 0x30, 0x67, 0x75, 0x76, 0x6c, 0x35, 0x72, 0x33, 0x33, 0x48, 0x35, 0x4a, 0x64, 0x76, 0x75, 0x6b, 0x31, + 0x32, 0x5c, 0x0a, + 0x09, 0x68, 0x43, 0x5a, 0x6e, 0x6c, 0x57, 0x52, 0x46, 0x51, 0x46, 0x31, 0x66, 0x6c, 0x78, 0x31, 0x56, 0x58, + 0x76, 0x65, 0x76, 0x79, 0x2b, 0x70, 0x6e, 0x2b, 0x64, 0x4d, 0x34, 0x59, 0x44, 0x6d, 0x6b, 0x62, 0x5a, 0x69, + 0x6a, 0x65, 0x45, 0x72, 0x35, 0x72, 0x2f, 0x75, 0x31, 0x78, 0x6a, 0x6a, 0x4b, 0x38, 0x54, 0x51, 0x6f, 0x6a, + 0x41, 0x49, 0x75, 0x33, 0x76, 0x5a, 0x77, 0x4f, 0x4d, 0x54, 0x38, 0x77, 0x67, 0x4b, 0x49, 0x67, 0x4a, 0x34, + 0x72, 0x5c, 0x0a, + 0x09, 0x30, 0x4d, 0x30, 0x79, 0x7a, 0x46, 0x4d, 0x48, 0x47, 0x59, 0x43, 0x4a, 0x73, 0x59, 0x6d, 0x59, 0x44, + 0x7a, 0x62, 0x70, 0x36, 0x57, 0x67, 0x79, 0x46, 0x58, 0x73, 0x38, 0x6f, 0x31, 0x37, 0x74, 0x5a, 0x58, 0x50, + 0x63, 0x4a, 0x41, 0x66, 0x4c, 0x39, 0x4a, 0x76, 0x73, 0x61, 0x5a, 0x51, 0x74, 0x57, 0x66, 0x58, 0x74, 0x74, + 0x6c, 0x49, 0x75, 0x64, 0x45, 0x42, 0x72, 0x41, 0x72, 0x76, 0x56, 0x73, 0x4e, 0x31, 0x77, 0x2f, 0x4e, 0x52, + 0x48, 0x5c, 0x0a, + 0x09, 0x50, 0x68, 0x78, 0x2f, 0x39, 0x6c, 0x39, 0x66, 0x73, 0x67, 0x79, 0x34, 0x41, 0x77, 0x42, 0x75, 0x7a, + 0x63, 0x35, 0x36, 0x43, 0x6c, 0x61, 0x44, 0x56, 0x6e, 0x63, 0x4b, 0x51, 0x50, 0x52, 0x7a, 0x41, 0x43, 0x5a, + 0x2f, 0x37, 0x32, 0x55, 0x2f, 0x69, 0x75, 0x33, 0x6a, 0x31, 0x54, 0x76, 0x51, 0x77, 0x4a, 0x32, 0x70, 0x4a, + 0x71, 0x31, 0x59, 0x50, 0x6d, 0x42, 0x39, 0x57, 0x30, 0x6b, 0x72, 0x52, 0x46, 0x38, 0x4c, 0x39, 0x58, 0x57, + 0x45, 0x5c, 0x0a, + 0x09, 0x34, 0x4d, 0x64, 0x61, 0x37, 0x58, 0x58, 0x45, 0x6b, 0x45, 0x74, 0x30, 0x64, 0x52, 0x33, 0x65, 0x6f, + 0x68, 0x31, 0x31, 0x6d, 0x76, 0x6d, 0x33, 0x2b, 0x70, 0x48, 0x31, 0x30, 0x30, 0x7a, 0x42, 0x33, 0x6c, 0x68, + 0x6a, 0x52, 0x5a, 0x48, 0x67, 0x49, 0x71, 0x4d, 0x7a, 0x6c, 0x6c, 0x51, 0x65, 0x6e, 0x55, 0x34, 0x48, 0x2f, + 0x58, 0x37, 0x66, 0x50, 0x79, 0x4f, 0x51, 0x64, 0x56, 0x43, 0x51, 0x66, 0x2b, 0x50, 0x6d, 0x32, 0x50, 0x67, + 0x34, 0x5c, 0x0a, + 0x09, 0x58, 0x4a, 0x5a, 0x47, 0x56, 0x42, 0x32, 0x4a, 0x39, 0x54, 0x6a, 0x35, 0x65, 0x4b, 0x7a, 0x4d, 0x53, + 0x73, 0x76, 0x56, 0x6b, 0x70, 0x33, 0x65, 0x4c, 0x73, 0x76, 0x37, 0x44, 0x6d, 0x31, 0x5a, 0x57, 0x59, 0x58, + 0x6d, 0x42, 0x38, 0x5a, 0x33, 0x61, 0x34, 0x65, 0x66, 0x4e, 0x53, 0x62, 0x4f, 0x6d, 0x77, 0x58, 0x43, 0x44, + 0x72, 0x4c, 0x50, 0x45, 0x44, 0x52, 0x73, 0x51, 0x4c, 0x50, 0x35, 0x61, 0x67, 0x4b, 0x7a, 0x35, 0x73, 0x42, + 0x55, 0x5c, 0x0a, + 0x09, 0x57, 0x39, 0x37, 0x75, 0x4c, 0x5a, 0x50, 0x34, 0x37, 0x5a, 0x2f, 0x2f, 0x45, 0x51, 0x43, 0x75, 0x43, + 0x39, 0x44, 0x50, 0x6d, 0x59, 0x62, 0x79, 0x45, 0x47, 0x6e, 0x31, 0x41, 0x4d, 0x42, 0x7a, 0x2b, 0x30, 0x77, + 0x34, 0x68, 0x77, 0x4f, 0x6e, 0x37, 0x4d, 0x61, 0x76, 0x76, 0x4f, 0x41, 0x53, 0x4a, 0x6c, 0x67, 0x5a, 0x61, + 0x37, 0x56, 0x52, 0x70, 0x77, 0x4b, 0x33, 0x49, 0x78, 0x73, 0x2f, 0x4b, 0x78, 0x58, 0x53, 0x6e, 0x4b, 0x70, + 0x70, 0x5c, 0x0a, + 0x09, 0x49, 0x2b, 0x54, 0x74, 0x4e, 0x53, 0x56, 0x53, 0x55, 0x75, 0x45, 0x72, 0x37, 0x38, 0x6a, 0x54, 0x69, + 0x71, 0x39, 0x48, 0x4f, 0x37, 0x6f, 0x65, 0x2f, 0x7a, 0x5a, 0x71, 0x46, 0x39, 0x73, 0x6f, 0x35, 0x77, 0x35, + 0x6c, 0x6e, 0x62, 0x72, 0x47, 0x5a, 0x63, 0x71, 0x76, 0x39, 0x58, 0x73, 0x39, 0x64, 0x4c, 0x70, 0x64, 0x6c, + 0x4d, 0x35, 0x68, 0x32, 0x66, 0x6c, 0x46, 0x51, 0x71, 0x4b, 0x6d, 0x4a, 0x79, 0x51, 0x6c, 0x2b, 0x44, 0x56, + 0x46, 0x5c, 0x0a, + 0x09, 0x74, 0x79, 0x62, 0x6e, 0x74, 0x67, 0x79, 0x63, 0x39, 0x79, 0x54, 0x31, 0x62, 0x67, 0x63, 0x4a, 0x32, + 0x7a, 0x6e, 0x53, 0x5a, 0x7a, 0x71, 0x31, 0x30, 0x77, 0x53, 0x37, 0x53, 0x2b, 0x33, 0x43, 0x47, 0x6b, 0x31, + 0x39, 0x4a, 0x72, 0x55, 0x35, 0x61, 0x35, 0x71, 0x61, 0x4c, 0x6c, 0x6c, 0x62, 0x34, 0x44, 0x51, 0x4b, 0x49, + 0x43, 0x7a, 0x62, 0x74, 0x32, 0x77, 0x33, 0x4a, 0x2b, 0x43, 0x33, 0x58, 0x76, 0x51, 0x63, 0x6e, 0x4c, 0x68, + 0x7a, 0x5c, 0x0a, + 0x09, 0x79, 0x70, 0x64, 0x30, 0x37, 0x76, 0x73, 0x54, 0x78, 0x76, 0x38, 0x64, 0x74, 0x48, 0x6f, 0x41, 0x34, + 0x41, 0x44, 0x41, 0x6e, 0x65, 0x32, 0x50, 0x48, 0x56, 0x37, 0x34, 0x39, 0x41, 0x76, 0x77, 0x2f, 0x4d, 0x63, + 0x2f, 0x52, 0x71, 0x6b, 0x62, 0x36, 0x73, 0x69, 0x54, 0x68, 0x59, 0x35, 0x4e, 0x35, 0x32, 0x73, 0x44, 0x53, + 0x41, 0x56, 0x6e, 0x4f, 0x58, 0x56, 0x7a, 0x65, 0x6a, 0x58, 0x36, 0x4c, 0x54, 0x2b, 0x36, 0x48, 0x59, 0x6e, + 0x2b, 0x5c, 0x0a, + 0x09, 0x2f, 0x46, 0x79, 0x54, 0x6b, 0x39, 0x67, 0x50, 0x41, 0x45, 0x6e, 0x6a, 0x73, 0x48, 0x59, 0x63, 0x6a, + 0x42, 0x34, 0x50, 0x6b, 0x6e, 0x4f, 0x32, 0x49, 0x65, 0x73, 0x49, 0x79, 0x6b, 0x48, 0x4e, 0x50, 0x7a, 0x69, + 0x55, 0x49, 0x79, 0x4e, 0x2f, 0x7a, 0x7a, 0x2f, 0x64, 0x39, 0x6d, 0x79, 0x50, 0x77, 0x4d, 0x6f, 0x34, 0x4c, + 0x47, 0x4f, 0x33, 0x53, 0x4d, 0x62, 0x35, 0x64, 0x41, 0x32, 0x48, 0x5a, 0x77, 0x6b, 0x32, 0x4c, 0x39, 0x78, + 0x5a, 0x5c, 0x0a, + 0x09, 0x58, 0x4e, 0x4b, 0x4f, 0x35, 0x44, 0x47, 0x31, 0x74, 0x5a, 0x72, 0x66, 0x65, 0x73, 0x32, 0x68, 0x53, + 0x62, 0x5a, 0x36, 0x62, 0x4b, 0x4e, 0x41, 0x6d, 0x4e, 0x64, 0x4d, 0x67, 0x61, 0x36, 0x32, 0x6a, 0x6d, 0x5a, + 0x37, 0x6b, 0x70, 0x2f, 0x68, 0x4f, 0x46, 0x7a, 0x2f, 0x6d, 0x52, 0x39, 0x34, 0x45, 0x69, 0x36, 0x35, 0x36, + 0x4e, 0x79, 0x71, 0x6b, 0x67, 0x4d, 0x49, 0x71, 0x2f, 0x72, 0x53, 0x38, 0x4e, 0x57, 0x64, 0x41, 0x6a, 0x68, + 0x4d, 0x5c, 0x0a, + 0x09, 0x38, 0x66, 0x66, 0x35, 0x76, 0x2b, 0x6e, 0x6e, 0x6e, 0x34, 0x39, 0x7a, 0x54, 0x7a, 0x30, 0x70, 0x4b, + 0x57, 0x5a, 0x46, 0x4e, 0x32, 0x30, 0x51, 0x56, 0x6e, 0x53, 0x72, 0x42, 0x57, 0x75, 0x62, 0x6e, 0x58, 0x61, + 0x6d, 0x4a, 0x75, 0x50, 0x55, 0x66, 0x66, 0x4b, 0x36, 0x32, 0x67, 0x41, 0x35, 0x50, 0x31, 0x59, 0x45, 0x31, + 0x50, 0x66, 0x34, 0x72, 0x66, 0x54, 0x53, 0x47, 0x69, 0x38, 0x33, 0x36, 0x4b, 0x5a, 0x73, 0x77, 0x68, 0x70, + 0x48, 0x5c, 0x0a, + 0x09, 0x6b, 0x35, 0x4d, 0x32, 0x52, 0x2b, 0x49, 0x55, 0x4c, 0x68, 0x79, 0x41, 0x79, 0x66, 0x45, 0x4a, 0x55, + 0x42, 0x37, 0x57, 0x67, 0x4f, 0x31, 0x62, 0x58, 0x71, 0x6e, 0x63, 0x4b, 0x4f, 0x45, 0x31, 0x33, 0x51, 0x56, + 0x6f, 0x50, 0x2b, 0x53, 0x6c, 0x59, 0x37, 0x59, 0x65, 0x55, 0x35, 0x4d, 0x38, 0x5a, 0x46, 0x2b, 0x68, 0x4a, + 0x56, 0x6b, 0x33, 0x6b, 0x49, 0x37, 0x79, 0x54, 0x55, 0x47, 0x69, 0x43, 0x64, 0x68, 0x57, 0x30, 0x68, 0x33, + 0x59, 0x5c, 0x0a, + 0x09, 0x39, 0x7a, 0x54, 0x69, 0x36, 0x79, 0x63, 0x33, 0x55, 0x38, 0x36, 0x30, 0x62, 0x69, 0x7a, 0x65, 0x2b, + 0x4c, 0x55, 0x6e, 0x6e, 0x72, 0x6b, 0x66, 0x76, 0x2f, 0x4c, 0x43, 0x5a, 0x37, 0x43, 0x54, 0x42, 0x49, 0x41, + 0x6d, 0x56, 0x6b, 0x54, 0x62, 0x37, 0x34, 0x4a, 0x57, 0x65, 0x77, 0x32, 0x67, 0x65, 0x6a, 0x65, 0x56, 0x41, + 0x77, 0x67, 0x59, 0x36, 0x32, 0x5a, 0x34, 0x37, 0x36, 0x2b, 0x38, 0x43, 0x4b, 0x64, 0x73, 0x6e, 0x7a, 0x59, + 0x46, 0x5c, 0x0a, + 0x09, 0x4f, 0x47, 0x72, 0x6e, 0x56, 0x6c, 0x4d, 0x45, 0x6b, 0x44, 0x75, 0x6b, 0x48, 0x45, 0x67, 0x5a, 0x42, + 0x43, 0x39, 0x76, 0x6f, 0x57, 0x34, 0x64, 0x2f, 0x65, 0x73, 0x53, 0x2b, 0x74, 0x61, 0x4e, 0x4e, 0x67, 0x44, + 0x70, 0x32, 0x50, 0x62, 0x72, 0x78, 0x44, 0x51, 0x31, 0x4f, 0x62, 0x34, 0x75, 0x4d, 0x79, 0x71, 0x43, 0x63, + 0x71, 0x66, 0x67, 0x66, 0x49, 0x30, 0x61, 0x57, 0x78, 0x72, 0x78, 0x39, 0x66, 0x37, 0x35, 0x53, 0x6d, 0x49, + 0x45, 0x5c, 0x0a, + 0x09, 0x63, 0x35, 0x2b, 0x2f, 0x64, 0x6e, 0x34, 0x5a, 0x6c, 0x56, 0x50, 0x48, 0x30, 0x66, 0x4b, 0x77, 0x70, + 0x47, 0x48, 0x6c, 0x46, 0x39, 0x59, 0x36, 0x6a, 0x33, 0x54, 0x62, 0x5a, 0x73, 0x44, 0x56, 0x63, 0x74, 0x44, + 0x79, 0x71, 0x48, 0x6d, 0x79, 0x34, 0x36, 0x38, 0x46, 0x6c, 0x45, 0x30, 0x41, 0x62, 0x31, 0x33, 0x54, 0x34, + 0x77, 0x6a, 0x6c, 0x62, 0x66, 0x6d, 0x73, 0x33, 0x49, 0x66, 0x56, 0x39, 0x73, 0x4e, 0x50, 0x32, 0x49, 0x4e, + 0x33, 0x5c, 0x0a, + 0x09, 0x76, 0x50, 0x4b, 0x6e, 0x30, 0x45, 0x31, 0x58, 0x2f, 0x41, 0x76, 0x54, 0x34, 0x42, 0x34, 0x69, 0x72, + 0x66, 0x59, 0x2b, 0x67, 0x48, 0x74, 0x30, 0x7a, 0x44, 0x78, 0x78, 0x35, 0x7a, 0x54, 0x65, 0x2f, 0x56, 0x39, + 0x65, 0x68, 0x47, 0x31, 0x6a, 0x66, 0x53, 0x50, 0x4b, 0x36, 0x70, 0x46, 0x49, 0x56, 0x31, 0x77, 0x4a, 0x4e, + 0x46, 0x4a, 0x41, 0x47, 0x49, 0x58, 0x51, 0x2f, 0x4a, 0x77, 0x54, 0x6e, 0x79, 0x45, 0x64, 0x64, 0x45, 0x62, + 0x37, 0x5c, 0x0a, + 0x09, 0x76, 0x4a, 0x35, 0x31, 0x58, 0x6b, 0x65, 0x4e, 0x65, 0x68, 0x53, 0x70, 0x57, 0x70, 0x73, 0x69, 0x71, + 0x34, 0x34, 0x56, 0x45, 0x68, 0x6a, 0x30, 0x61, 0x38, 0x62, 0x73, 0x64, 0x4e, 0x4c, 0x4b, 0x63, 0x71, 0x7a, + 0x4d, 0x68, 0x62, 0x74, 0x51, 0x65, 0x4c, 0x57, 0x58, 0x72, 0x70, 0x39, 0x47, 0x5a, 0x58, 0x73, 0x35, 0x7a, + 0x58, 0x61, 0x59, 0x5a, 0x41, 0x39, 0x37, 0x76, 0x4f, 0x35, 0x45, 0x43, 0x53, 0x66, 0x71, 0x63, 0x56, 0x43, + 0x33, 0x5c, 0x0a, + 0x09, 0x31, 0x6f, 0x41, 0x34, 0x6e, 0x30, 0x30, 0x4f, 0x72, 0x55, 0x47, 0x58, 0x62, 0x37, 0x57, 0x57, 0x54, + 0x6b, 0x2b, 0x69, 0x6e, 0x69, 0x5a, 0x43, 0x73, 0x32, 0x35, 0x72, 0x2f, 0x71, 0x57, 0x56, 0x6a, 0x67, 0x49, + 0x50, 0x4f, 0x62, 0x36, 0x56, 0x6e, 0x35, 0x73, 0x34, 0x66, 0x6e, 0x6f, 0x72, 0x2f, 0x75, 0x68, 0x58, 0x58, + 0x6f, 0x77, 0x64, 0x57, 0x2f, 0x71, 0x71, 0x59, 0x51, 0x63, 0x34, 0x64, 0x36, 0x66, 0x42, 0x38, 0x6b, 0x4f, + 0x6d, 0x5c, 0x0a, + 0x09, 0x56, 0x5a, 0x34, 0x43, 0x75, 0x43, 0x73, 0x73, 0x77, 0x7a, 0x2f, 0x6e, 0x74, 0x42, 0x50, 0x78, 0x33, + 0x6c, 0x64, 0x36, 0x45, 0x4c, 0x43, 0x69, 0x47, 0x56, 0x65, 0x2b, 0x2f, 0x7a, 0x38, 0x56, 0x61, 0x71, 0x31, + 0x41, 0x6e, 0x65, 0x6a, 0x56, 0x52, 0x74, 0x47, 0x73, 0x73, 0x4f, 0x2f, 0x6d, 0x76, 0x45, 0x75, 0x75, 0x4e, + 0x52, 0x6c, 0x4a, 0x33, 0x62, 0x65, 0x6b, 0x65, 0x6f, 0x59, 0x71, 0x65, 0x65, 0x63, 0x39, 0x63, 0x43, 0x4f, + 0x53, 0x5c, 0x0a, + 0x09, 0x34, 0x39, 0x54, 0x52, 0x7a, 0x34, 0x6e, 0x7a, 0x54, 0x6b, 0x6d, 0x6e, 0x61, 0x57, 0x78, 0x61, 0x53, + 0x6b, 0x31, 0x52, 0x6b, 0x33, 0x39, 0x61, 0x45, 0x63, 0x74, 0x71, 0x33, 0x53, 0x6c, 0x4e, 0x38, 0x46, 0x7a, + 0x4b, 0x6c, 0x71, 0x5a, 0x73, 0x54, 0x30, 0x39, 0x62, 0x39, 0x4c, 0x46, 0x46, 0x36, 0x57, 0x34, 0x35, 0x2b, + 0x57, 0x42, 0x56, 0x6d, 0x6a, 0x4e, 0x59, 0x6f, 0x46, 0x68, 0x7a, 0x6f, 0x47, 0x58, 0x4f, 0x78, 0x39, 0x38, + 0x55, 0x5c, 0x0a, + 0x09, 0x54, 0x50, 0x69, 0x6f, 0x4e, 0x4a, 0x6a, 0x77, 0x50, 0x71, 0x30, 0x67, 0x78, 0x6d, 0x74, 0x61, 0x6a, + 0x68, 0x2b, 0x64, 0x66, 0x32, 0x6f, 0x72, 0x2f, 0x75, 0x4b, 0x31, 0x50, 0x34, 0x75, 0x39, 0x4a, 0x32, 0x79, + 0x48, 0x2f, 0x45, 0x33, 0x44, 0x32, 0x4d, 0x48, 0x6e, 0x73, 0x49, 0x71, 0x30, 0x32, 0x6c, 0x4f, 0x41, 0x39, + 0x34, 0x72, 0x76, 0x37, 0x49, 0x63, 0x50, 0x4c, 0x7a, 0x78, 0x6e, 0x50, 0x39, 0x35, 0x39, 0x36, 0x59, 0x73, + 0x77, 0x5c, 0x0a, + 0x09, 0x50, 0x65, 0x34, 0x66, 0x4d, 0x74, 0x48, 0x52, 0x53, 0x55, 0x63, 0x39, 0x6f, 0x42, 0x61, 0x77, 0x6c, + 0x53, 0x70, 0x71, 0x68, 0x4c, 0x59, 0x45, 0x43, 0x33, 0x5a, 0x64, 0x47, 0x35, 0x6f, 0x32, 0x48, 0x76, 0x6b, + 0x35, 0x2b, 0x6b, 0x63, 0x73, 0x62, 0x49, 0x64, 0x6d, 0x59, 0x6a, 0x69, 0x4b, 0x2f, 0x71, 0x55, 0x52, 0x38, + 0x62, 0x4a, 0x70, 0x39, 0x4e, 0x4f, 0x6d, 0x70, 0x4a, 0x38, 0x64, 0x48, 0x44, 0x55, 0x6d, 0x36, 0x7a, 0x6b, + 0x45, 0x5c, 0x0a, + 0x09, 0x7a, 0x5a, 0x63, 0x56, 0x50, 0x53, 0x33, 0x6a, 0x74, 0x79, 0x4b, 0x6d, 0x4e, 0x4e, 0x48, 0x6d, 0x68, + 0x35, 0x71, 0x73, 0x42, 0x33, 0x71, 0x61, 0x51, 0x4d, 0x73, 0x43, 0x68, 0x58, 0x53, 0x74, 0x52, 0x55, 0x35, + 0x74, 0x6d, 0x76, 0x76, 0x6c, 0x31, 0x31, 0x4d, 0x62, 0x30, 0x52, 0x76, 0x4c, 0x30, 0x67, 0x56, 0x52, 0x43, + 0x59, 0x4d, 0x70, 0x51, 0x4b, 0x53, 0x4c, 0x6c, 0x39, 0x6f, 0x65, 0x74, 0x53, 0x34, 0x31, 0x63, 0x49, 0x5a, + 0x79, 0x5c, 0x0a, + 0x09, 0x4a, 0x30, 0x35, 0x50, 0x34, 0x58, 0x33, 0x2f, 0x35, 0x61, 0x66, 0x78, 0x38, 0x46, 0x50, 0x33, 0x31, + 0x42, 0x57, 0x53, 0x33, 0x32, 0x76, 0x45, 0x32, 0x37, 0x47, 0x4b, 0x74, 0x49, 0x71, 0x33, 0x41, 0x51, 0x6c, + 0x77, 0x37, 0x6d, 0x4e, 0x77, 0x37, 0x70, 0x33, 0x4a, 0x2b, 0x59, 0x6f, 0x75, 0x4f, 0x6e, 0x63, 0x2f, 0x50, + 0x76, 0x44, 0x61, 0x6e, 0x38, 0x4d, 0x70, 0x32, 0x36, 0x62, 0x4d, 0x69, 0x42, 0x4f, 0x6f, 0x56, 0x6f, 0x6a, + 0x39, 0x5c, 0x0a, + 0x09, 0x49, 0x4d, 0x30, 0x6f, 0x4a, 0x56, 0x74, 0x6c, 0x64, 0x48, 0x61, 0x67, 0x6e, 0x56, 0x76, 0x58, 0x30, + 0x61, 0x76, 0x4c, 0x73, 0x6f, 0x35, 0x38, 0x36, 0x49, 0x58, 0x7a, 0x78, 0x71, 0x4d, 0x53, 0x50, 0x34, 0x5a, + 0x71, 0x78, 0x2b, 0x6f, 0x2f, 0x64, 0x61, 0x77, 0x30, 0x67, 0x6e, 0x42, 0x4a, 0x36, 0x49, 0x69, 0x56, 0x41, + 0x6f, 0x59, 0x4e, 0x68, 0x35, 0x5a, 0x7a, 0x61, 0x65, 0x65, 0x30, 0x2b, 0x4e, 0x62, 0x58, 0x72, 0x57, 0x74, + 0x70, 0x5c, 0x0a, + 0x09, 0x2b, 0x33, 0x57, 0x37, 0x2b, 0x6f, 0x47, 0x65, 0x65, 0x6c, 0x6f, 0x68, 0x6f, 0x55, 0x62, 0x6d, 0x4f, + 0x32, 0x6e, 0x62, 0x7a, 0x56, 0x48, 0x5a, 0x72, 0x71, 0x33, 0x35, 0x53, 0x6b, 0x74, 0x72, 0x77, 0x45, 0x30, + 0x74, 0x30, 0x67, 0x49, 0x39, 0x66, 0x6c, 0x34, 0x43, 0x4a, 0x70, 0x38, 0x43, 0x70, 0x55, 0x38, 0x2b, 0x57, + 0x4f, 0x30, 0x41, 0x77, 0x46, 0x6b, 0x6e, 0x37, 0x4d, 0x45, 0x48, 0x58, 0x2f, 0x63, 0x4b, 0x6e, 0x48, 0x66, + 0x67, 0x5c, 0x0a, + 0x09, 0x70, 0x4e, 0x72, 0x70, 0x6b, 0x35, 0x2b, 0x62, 0x70, 0x31, 0x38, 0x46, 0x38, 0x41, 0x56, 0x6a, 0x4b, + 0x41, 0x2b, 0x5a, 0x56, 0x67, 0x30, 0x41, 0x73, 0x72, 0x4f, 0x65, 0x48, 0x41, 0x35, 0x2f, 0x45, 0x58, 0x41, + 0x76, 0x42, 0x50, 0x42, 0x31, 0x2f, 0x35, 0x55, 0x4e, 0x42, 0x72, 0x6a, 0x2b, 0x33, 0x50, 0x30, 0x6e, 0x76, + 0x75, 0x57, 0x56, 0x50, 0x2f, 0x4b, 0x4d, 0x52, 0x78, 0x50, 0x6f, 0x58, 0x51, 0x44, 0x6d, 0x41, 0x52, 0x77, + 0x42, 0x5c, 0x0a, + 0x09, 0x55, 0x46, 0x67, 0x6d, 0x30, 0x5a, 0x78, 0x6b, 0x70, 0x59, 0x72, 0x56, 0x78, 0x6d, 0x6b, 0x39, 0x55, + 0x47, 0x49, 0x5a, 0x6a, 0x32, 0x56, 0x63, 0x2f, 0x4c, 0x79, 0x4f, 0x37, 0x74, 0x78, 0x67, 0x55, 0x71, 0x50, + 0x69, 0x45, 0x56, 0x41, 0x76, 0x76, 0x75, 0x6d, 0x53, 0x4b, 0x78, 0x6d, 0x6e, 0x45, 0x34, 0x62, 0x45, 0x2b, + 0x78, 0x73, 0x56, 0x4b, 0x53, 0x6d, 0x70, 0x54, 0x36, 0x49, 0x4d, 0x7a, 0x36, 0x70, 0x34, 0x74, 0x4a, 0x4a, + 0x31, 0x5c, 0x0a, + 0x09, 0x6a, 0x34, 0x34, 0x73, 0x6d, 0x63, 0x6d, 0x36, 0x64, 0x6b, 0x74, 0x53, 0x67, 0x79, 0x6d, 0x63, 0x36, + 0x6d, 0x6c, 0x4f, 0x63, 0x2f, 0x38, 0x53, 0x75, 0x45, 0x49, 0x4e, 0x65, 0x2f, 0x72, 0x56, 0x70, 0x41, 0x6e, + 0x37, 0x43, 0x75, 0x63, 0x6f, 0x72, 0x5a, 0x57, 0x75, 0x63, 0x77, 0x52, 0x51, 0x6b, 0x78, 0x6d, 0x63, 0x4c, + 0x52, 0x45, 0x72, 0x75, 0x4e, 0x77, 0x39, 0x63, 0x2f, 0x69, 0x36, 0x76, 0x53, 0x64, 0x73, 0x2f, 0x79, 0x55, + 0x41, 0x5c, 0x0a, + 0x09, 0x6c, 0x34, 0x4e, 0x6f, 0x68, 0x74, 0x57, 0x59, 0x41, 0x66, 0x41, 0x78, 0x41, 0x45, 0x38, 0x44, 0x38, + 0x47, 0x59, 0x51, 0x49, 0x58, 0x76, 0x6b, 0x55, 0x38, 0x78, 0x78, 0x50, 0x42, 0x52, 0x61, 0x39, 0x5a, 0x38, + 0x47, 0x4b, 0x36, 0x2f, 0x37, 0x70, 0x44, 0x39, 0x77, 0x41, 0x49, 0x69, 0x6d, 0x41, 0x4f, 0x77, 0x44, 0x55, + 0x4d, 0x4b, 0x35, 0x57, 0x77, 0x41, 0x63, 0x75, 0x66, 0x33, 0x65, 0x67, 0x2f, 0x6a, 0x6f, 0x46, 0x56, 0x66, + 0x6a, 0x5c, 0x0a, + 0x09, 0x6f, 0x31, 0x2f, 0x38, 0x4f, 0x71, 0x36, 0x73, 0x74, 0x67, 0x73, 0x54, 0x38, 0x4c, 0x38, 0x42, 0x2f, + 0x47, 0x43, 0x6f, 0x56, 0x70, 0x32, 0x72, 0x6d, 0x32, 0x48, 0x74, 0x70, 0x34, 0x71, 0x56, 0x35, 0x58, 0x55, + 0x64, 0x4b, 0x31, 0x72, 0x7a, 0x74, 0x4d, 0x39, 0x71, 0x67, 0x39, 0x66, 0x52, 0x5a, 0x58, 0x6a, 0x5a, 0x55, + 0x55, 0x36, 0x70, 0x32, 0x32, 0x6a, 0x69, 0x53, 0x34, 0x39, 0x4c, 0x74, 0x39, 0x45, 0x30, 0x50, 0x73, 0x36, + 0x44, 0x5c, 0x0a, + 0x09, 0x35, 0x6f, 0x74, 0x66, 0x61, 0x5a, 0x49, 0x46, 0x67, 0x54, 0x41, 0x73, 0x68, 0x76, 0x46, 0x74, 0x77, + 0x6b, 0x63, 0x37, 0x33, 0x6c, 0x48, 0x6e, 0x6d, 0x73, 0x59, 0x4a, 0x53, 0x4f, 0x64, 0x6f, 0x49, 0x6f, 0x75, + 0x48, 0x70, 0x6e, 0x4f, 0x61, 0x52, 0x75, 0x6c, 0x73, 0x56, 0x46, 0x33, 0x75, 0x75, 0x4e, 0x71, 0x52, 0x6d, + 0x2b, 0x71, 0x74, 0x70, 0x45, 0x64, 0x62, 0x66, 0x33, 0x58, 0x72, 0x31, 0x6a, 0x6f, 0x57, 0x67, 0x50, 0x2f, + 0x2f, 0x5c, 0x0a, + 0x09, 0x4a, 0x79, 0x36, 0x2b, 0x34, 0x44, 0x6c, 0x76, 0x66, 0x50, 0x46, 0x7a, 0x71, 0x67, 0x73, 0x30, 0x58, + 0x51, 0x58, 0x4e, 0x47, 0x56, 0x2f, 0x49, 0x6c, 0x32, 0x53, 0x42, 0x64, 0x6c, 0x56, 0x6f, 0x7a, 0x58, 0x34, + 0x62, 0x73, 0x4c, 0x7a, 0x75, 0x55, 0x2f, 0x55, 0x58, 0x31, 0x6f, 0x64, 0x47, 0x72, 0x2b, 0x6f, 0x39, 0x67, + 0x6a, 0x2f, 0x75, 0x67, 0x41, 0x2b, 0x6b, 0x53, 0x58, 0x4f, 0x7a, 0x41, 0x73, 0x44, 0x4f, 0x61, 0x36, 0x58, + 0x78, 0x5c, 0x0a, + 0x09, 0x63, 0x6e, 0x72, 0x50, 0x64, 0x6a, 0x67, 0x48, 0x32, 0x4f, 0x61, 0x6f, 0x6e, 0x58, 0x59, 0x6c, 0x58, + 0x71, 0x44, 0x61, 0x49, 0x6e, 0x55, 0x2b, 0x50, 0x5a, 0x59, 0x38, 0x36, 0x50, 0x48, 0x77, 0x32, 0x6b, 0x31, + 0x39, 0x48, 0x38, 0x31, 0x78, 0x33, 0x55, 0x39, 0x7a, 0x2f, 0x61, 0x49, 0x6f, 0x6b, 0x4c, 0x4e, 0x62, 0x67, + 0x64, 0x2b, 0x4e, 0x4a, 0x54, 0x53, 0x50, 0x54, 0x73, 0x71, 0x33, 0x4f, 0x59, 0x62, 0x7a, 0x58, 0x43, 0x57, + 0x74, 0x5c, 0x0a, + 0x09, 0x4d, 0x30, 0x6f, 0x48, 0x7a, 0x61, 0x42, 0x67, 0x41, 0x31, 0x38, 0x6f, 0x4d, 0x57, 0x71, 0x64, 0x53, + 0x4c, 0x5a, 0x76, 0x77, 0x2b, 0x41, 0x6f, 0x50, 0x64, 0x6c, 0x41, 0x30, 0x74, 0x77, 0x76, 0x42, 0x38, 0x5a, + 0x71, 0x33, 0x47, 0x38, 0x42, 0x38, 0x4f, 0x72, 0x62, 0x72, 0x2f, 0x71, 0x53, 0x39, 0x35, 0x30, 0x52, 0x50, + 0x72, 0x4f, 0x61, 0x74, 0x47, 0x70, 0x50, 0x41, 0x32, 0x72, 0x36, 0x37, 0x70, 0x43, 0x4b, 0x50, 0x6b, 0x78, + 0x77, 0x5c, 0x0a, + 0x09, 0x4d, 0x77, 0x35, 0x75, 0x47, 0x6d, 0x69, 0x4b, 0x4c, 0x50, 0x62, 0x44, 0x46, 0x39, 0x4b, 0x74, 0x30, + 0x69, 0x68, 0x6e, 0x50, 0x57, 0x31, 0x6c, 0x47, 0x61, 0x64, 0x6c, 0x57, 0x4a, 0x59, 0x6a, 0x70, 0x51, 0x59, + 0x6b, 0x6a, 0x56, 0x61, 0x32, 0x6d, 0x50, 0x4a, 0x57, 0x74, 0x39, 0x48, 0x38, 0x31, 0x42, 0x6b, 0x48, 0x6b, + 0x5a, 0x58, 0x53, 0x38, 0x7a, 0x42, 0x47, 0x7a, 0x59, 0x4d, 0x65, 0x76, 0x39, 0x56, 0x2b, 0x52, 0x76, 0x5a, + 0x4f, 0x5c, 0x0a, + 0x09, 0x6a, 0x4b, 0x4f, 0x52, 0x41, 0x34, 0x7a, 0x6a, 0x55, 0x63, 0x36, 0x6a, 0x78, 0x77, 0x4d, 0x34, 0x79, + 0x4f, 0x63, 0x66, 0x4e, 0x45, 0x67, 0x33, 0x6a, 0x58, 0x63, 0x55, 0x4f, 0x49, 0x51, 0x32, 0x72, 0x48, 0x78, + 0x44, 0x77, 0x68, 0x56, 0x33, 0x30, 0x44, 0x52, 0x50, 0x73, 0x53, 0x4b, 0x30, 0x66, 0x46, 0x4c, 0x54, 0x44, + 0x6b, 0x68, 0x57, 0x76, 0x73, 0x50, 0x72, 0x57, 0x50, 0x71, 0x4d, 0x33, 0x37, 0x38, 0x65, 0x61, 0x71, 0x39, + 0x32, 0x5c, 0x0a, + 0x09, 0x6c, 0x42, 0x39, 0x46, 0x36, 0x2f, 0x4c, 0x6a, 0x6f, 0x4b, 0x4f, 0x4a, 0x41, 0x4c, 0x67, 0x46, 0x41, + 0x42, 0x2b, 0x51, 0x5a, 0x2f, 0x56, 0x43, 0x6b, 0x42, 0x53, 0x63, 0x4c, 0x68, 0x75, 0x75, 0x53, 0x55, 0x64, + 0x4e, 0x30, 0x33, 0x7a, 0x52, 0x4b, 0x32, 0x43, 0x32, 0x36, 0x70, 0x4b, 0x53, 0x36, 0x54, 0x57, 0x58, 0x6c, + 0x4c, 0x4f, 0x4e, 0x6f, 0x6a, 0x6d, 0x71, 0x45, 0x76, 0x76, 0x66, 0x67, 0x6f, 0x76, 0x67, 0x76, 0x43, 0x54, + 0x4f, 0x5c, 0x0a, + 0x09, 0x38, 0x54, 0x48, 0x79, 0x36, 0x4d, 0x4a, 0x62, 0x71, 0x35, 0x31, 0x58, 0x6d, 0x6d, 0x5a, 0x69, 0x75, + 0x45, 0x35, 0x7a, 0x6e, 0x58, 0x4b, 0x6e, 0x2b, 0x64, 0x50, 0x6a, 0x54, 0x72, 0x4f, 0x78, 0x4e, 0x42, 0x75, + 0x71, 0x36, 0x37, 0x71, 0x6b, 0x72, 0x41, 0x62, 0x7a, 0x55, 0x66, 0x4b, 0x56, 0x59, 0x36, 0x76, 0x62, 0x61, + 0x51, 0x4c, 0x6c, 0x64, 0x45, 0x7a, 0x61, 0x41, 0x58, 0x55, 0x57, 0x74, 0x6a, 0x4c, 0x76, 0x46, 0x74, 0x69, + 0x54, 0x5c, 0x0a, + 0x09, 0x4f, 0x75, 0x4b, 0x41, 0x4c, 0x4b, 0x2f, 0x4c, 0x57, 0x6b, 0x71, 0x4f, 0x56, 0x78, 0x6b, 0x73, 0x72, + 0x7a, 0x6c, 0x74, 0x4f, 0x41, 0x44, 0x63, 0x64, 0x74, 0x55, 0x56, 0x34, 0x66, 0x43, 0x74, 0x41, 0x41, 0x71, + 0x4e, 0x6a, 0x50, 0x34, 0x34, 0x4b, 0x4e, 0x70, 0x36, 0x6d, 0x30, 0x6f, 0x74, 0x38, 0x42, 0x53, 0x33, 0x6d, + 0x31, 0x66, 0x73, 0x51, 0x79, 0x6c, 0x74, 0x69, 0x4c, 0x79, 0x46, 0x46, 0x4d, 0x47, 0x74, 0x43, 0x43, 0x6a, + 0x76, 0x5c, 0x0a, + 0x09, 0x52, 0x33, 0x4e, 0x48, 0x73, 0x7a, 0x4d, 0x44, 0x7a, 0x59, 0x55, 0x38, 0x55, 0x2f, 0x65, 0x52, 0x76, + 0x6a, 0x34, 0x36, 0x6a, 0x55, 0x7a, 0x61, 0x58, 0x4f, 0x30, 0x78, 0x51, 0x68, 0x31, 0x48, 0x57, 0x52, 0x46, + 0x59, 0x71, 0x2f, 0x4c, 0x35, 0x69, 0x6e, 0x43, 0x6c, 0x48, 0x6b, 0x2b, 0x36, 0x4d, 0x6c, 0x39, 0x48, 0x2f, + 0x46, 0x51, 0x6e, 0x6e, 0x45, 0x69, 0x56, 0x35, 0x58, 0x64, 0x53, 0x6f, 0x44, 0x34, 0x74, 0x66, 0x75, 0x31, + 0x4d, 0x5c, 0x0a, + 0x09, 0x59, 0x7a, 0x53, 0x77, 0x32, 0x32, 0x33, 0x71, 0x67, 0x43, 0x44, 0x74, 0x70, 0x73, 0x6c, 0x47, 0x6d, + 0x6e, 0x6a, 0x56, 0x2f, 0x56, 0x74, 0x54, 0x30, 0x4a, 0x6f, 0x76, 0x45, 0x6e, 0x4b, 0x55, 0x65, 0x79, 0x48, + 0x6f, 0x4d, 0x41, 0x48, 0x58, 0x47, 0x63, 0x4e, 0x5a, 0x63, 0x39, 0x70, 0x77, 0x41, 0x41, 0x6a, 0x6b, 0x2f, + 0x4a, 0x75, 0x45, 0x2f, 0x6b, 0x5a, 0x48, 0x5a, 0x47, 0x36, 0x55, 0x58, 0x4d, 0x42, 0x79, 0x42, 0x56, 0x67, + 0x2f, 0x5c, 0x0a, + 0x09, 0x48, 0x44, 0x51, 0x71, 0x2f, 0x6b, 0x6f, 0x38, 0x62, 0x6a, 0x49, 0x6d, 0x33, 0x6f, 0x4a, 0x73, 0x57, + 0x2f, 0x65, 0x76, 0x55, 0x33, 0x6e, 0x4a, 0x75, 0x78, 0x30, 0x70, 0x5a, 0x44, 0x38, 0x45, 0x62, 0x71, 0x67, + 0x6b, 0x2b, 0x70, 0x45, 0x77, 0x70, 0x45, 0x64, 0x56, 0x47, 0x31, 0x4e, 0x61, 0x4b, 0x6f, 0x32, 0x55, 0x75, + 0x6f, 0x53, 0x56, 0x59, 0x65, 0x6b, 0x78, 0x31, 0x4f, 0x56, 0x53, 0x57, 0x65, 0x72, 0x7a, 0x2b, 0x74, 0x5a, + 0x6e, 0x5c, 0x0a, + 0x09, 0x71, 0x67, 0x55, 0x58, 0x2b, 0x65, 0x56, 0x6a, 0x31, 0x65, 0x50, 0x53, 0x51, 0x43, 0x52, 0x35, 0x6c, + 0x52, 0x5a, 0x67, 0x5a, 0x51, 0x37, 0x61, 0x53, 0x58, 0x55, 0x66, 0x56, 0x74, 0x38, 0x61, 0x5a, 0x4e, 0x4b, + 0x6f, 0x62, 0x67, 0x57, 0x59, 0x5a, 0x71, 0x44, 0x56, 0x59, 0x4d, 0x5a, 0x33, 0x6e, 0x36, 0x62, 0x42, 0x78, + 0x48, 0x30, 0x47, 0x4c, 0x50, 0x69, 0x74, 0x4a, 0x78, 0x30, 0x54, 0x41, 0x48, 0x44, 0x62, 0x56, 0x56, 0x38, + 0x43, 0x5c, 0x0a, + 0x09, 0x41, 0x44, 0x6a, 0x67, 0x74, 0x51, 0x51, 0x73, 0x63, 0x6e, 0x4e, 0x4f, 0x6f, 0x33, 0x30, 0x67, 0x2f, + 0x68, 0x77, 0x41, 0x56, 0x37, 0x73, 0x38, 0x73, 0x6a, 0x66, 0x4f, 0x31, 0x75, 0x55, 0x30, 0x77, 0x6b, 0x4d, + 0x64, 0x38, 0x37, 0x4d, 0x57, 0x79, 0x48, 0x42, 0x46, 0x63, 0x6d, 0x54, 0x6e, 0x34, 0x43, 0x4a, 0x62, 0x61, + 0x62, 0x34, 0x57, 0x61, 0x6b, 0x6f, 0x48, 0x73, 0x4a, 0x39, 0x61, 0x35, 0x41, 0x36, 0x76, 0x6a, 0x59, 0x33, + 0x33, 0x5c, 0x0a, + 0x09, 0x6f, 0x31, 0x31, 0x5a, 0x52, 0x37, 0x4a, 0x52, 0x32, 0x55, 0x6e, 0x49, 0x75, 0x6b, 0x49, 0x4e, 0x69, + 0x32, 0x66, 0x65, 0x72, 0x6a, 0x56, 0x4e, 0x6b, 0x34, 0x43, 0x70, 0x39, 0x32, 0x50, 0x59, 0x50, 0x33, 0x32, + 0x6d, 0x78, 0x38, 0x47, 0x50, 0x35, 0x59, 0x33, 0x57, 0x70, 0x6a, 0x4a, 0x32, 0x66, 0x51, 0x37, 0x32, 0x54, + 0x57, 0x73, 0x6a, 0x71, 0x52, 0x31, 0x59, 0x62, 0x33, 0x37, 0x69, 0x4f, 0x56, 0x50, 0x61, 0x31, 0x30, 0x71, + 0x67, 0x5c, 0x0a, + 0x09, 0x78, 0x44, 0x50, 0x5a, 0x36, 0x73, 0x6f, 0x2f, 0x4f, 0x4e, 0x52, 0x2b, 0x73, 0x4a, 0x35, 0x30, 0x54, + 0x41, 0x41, 0x41, 0x6f, 0x35, 0x73, 0x42, 0x2f, 0x49, 0x35, 0x47, 0x30, 0x4b, 0x62, 0x49, 0x36, 0x55, 0x78, + 0x7a, 0x6b, 0x4b, 0x57, 0x61, 0x31, 0x77, 0x35, 0x30, 0x70, 0x45, 0x30, 0x6a, 0x46, 0x74, 0x2b, 0x5a, 0x6f, + 0x4f, 0x65, 0x41, 0x54, 0x61, 0x6b, 0x65, 0x32, 0x48, 0x57, 0x64, 0x72, 0x59, 0x42, 0x39, 0x74, 0x2f, 0x69, + 0x52, 0x5c, 0x0a, + 0x09, 0x6e, 0x47, 0x75, 0x44, 0x6c, 0x30, 0x35, 0x4e, 0x72, 0x49, 0x37, 0x56, 0x76, 0x78, 0x32, 0x35, 0x37, + 0x4e, 0x7a, 0x49, 0x79, 0x6e, 0x44, 0x71, 0x75, 0x6d, 0x6c, 0x32, 0x6b, 0x59, 0x4b, 0x48, 0x4c, 0x65, 0x4e, + 0x61, 0x44, 0x6d, 0x46, 0x70, 0x7a, 0x53, 0x72, 0x6e, 0x7a, 0x47, 0x39, 0x4e, 0x6d, 0x5a, 0x6c, 0x32, 0x57, + 0x4e, 0x32, 0x58, 0x35, 0x42, 0x32, 0x6f, 0x6f, 0x59, 0x65, 0x45, 0x50, 0x76, 0x52, 0x47, 0x71, 0x32, 0x5a, + 0x41, 0x5c, 0x0a, + 0x09, 0x35, 0x4d, 0x43, 0x58, 0x51, 0x72, 0x5a, 0x6c, 0x6d, 0x31, 0x5a, 0x2f, 0x6e, 0x43, 0x39, 0x65, 0x7a, + 0x38, 0x45, 0x56, 0x44, 0x76, 0x68, 0x37, 0x6f, 0x35, 0x6c, 0x31, 0x6f, 0x57, 0x4d, 0x47, 0x41, 0x47, 0x36, + 0x76, 0x73, 0x34, 0x44, 0x66, 0x64, 0x6d, 0x71, 0x33, 0x6b, 0x35, 0x57, 0x4f, 0x6a, 0x34, 0x35, 0x34, 0x61, + 0x54, 0x61, 0x51, 0x70, 0x76, 0x6a, 0x4e, 0x76, 0x37, 0x6e, 0x48, 0x79, 0x33, 0x44, 0x6a, 0x64, 0x36, 0x71, + 0x38, 0x5c, 0x0a, + 0x09, 0x5a, 0x54, 0x77, 0x36, 0x4c, 0x65, 0x56, 0x4f, 0x56, 0x4a, 0x74, 0x2f, 0x32, 0x70, 0x36, 0x56, 0x54, + 0x4b, 0x5a, 0x67, 0x45, 0x39, 0x61, 0x33, 0x36, 0x33, 0x5a, 0x30, 0x6e, 0x38, 0x79, 0x77, 0x6b, 0x72, 0x71, + 0x36, 0x50, 0x57, 0x73, 0x73, 0x6d, 0x6d, 0x51, 0x32, 0x6b, 0x6c, 0x37, 0x54, 0x33, 0x47, 0x74, 0x51, 0x61, + 0x67, 0x4b, 0x50, 0x4d, 0x42, 0x70, 0x2b, 0x74, 0x63, 0x6d, 0x5a, 0x65, 0x42, 0x38, 0x79, 0x6f, 0x78, 0x69, + 0x74, 0x5c, 0x0a, + 0x09, 0x6a, 0x79, 0x43, 0x68, 0x4f, 0x76, 0x6e, 0x6d, 0x2f, 0x4e, 0x6b, 0x62, 0x74, 0x64, 0x49, 0x78, 0x38, + 0x58, 0x55, 0x44, 0x43, 0x61, 0x41, 0x36, 0x30, 0x76, 0x4f, 0x78, 0x38, 0x4a, 0x57, 0x56, 0x74, 0x43, 0x2b, + 0x52, 0x31, 0x58, 0x30, 0x59, 0x77, 0x46, 0x33, 0x59, 0x49, 0x44, 0x70, 0x6d, 0x41, 0x49, 0x44, 0x52, 0x45, + 0x4d, 0x42, 0x7a, 0x41, 0x64, 0x79, 0x34, 0x55, 0x6b, 0x47, 0x5a, 0x6f, 0x71, 0x62, 0x4f, 0x31, 0x42, 0x54, + 0x6c, 0x5c, 0x0a, + 0x09, 0x6d, 0x6f, 0x79, 0x61, 0x52, 0x79, 0x7a, 0x5a, 0x33, 0x74, 0x45, 0x35, 0x53, 0x37, 0x68, 0x75, 0x67, + 0x5a, 0x4e, 0x75, 0x54, 0x33, 0x4b, 0x71, 0x6f, 0x36, 0x6c, 0x63, 0x37, 0x5a, 0x66, 0x58, 0x74, 0x44, 0x6d, + 0x6e, 0x6a, 0x71, 0x30, 0x4e, 0x73, 0x6b, 0x35, 0x6c, 0x4a, 0x53, 0x65, 0x6c, 0x53, 0x2b, 0x56, 0x6e, 0x38, + 0x63, 0x6a, 0x35, 0x30, 0x55, 0x44, 0x44, 0x36, 0x2b, 0x71, 0x73, 0x62, 0x47, 0x56, 0x79, 0x4a, 0x71, 0x38, + 0x63, 0x5c, 0x0a, + 0x09, 0x79, 0x4a, 0x73, 0x79, 0x46, 0x6a, 0x34, 0x42, 0x63, 0x4f, 0x4a, 0x38, 0x7a, 0x62, 0x48, 0x64, 0x74, + 0x75, 0x64, 0x53, 0x32, 0x67, 0x44, 0x46, 0x64, 0x75, 0x78, 0x41, 0x6b, 0x50, 0x49, 0x58, 0x61, 0x6a, 0x57, + 0x56, 0x30, 0x32, 0x65, 0x6c, 0x76, 0x63, 0x58, 0x2b, 0x53, 0x77, 0x4c, 0x65, 0x42, 0x4e, 0x51, 0x42, 0x63, + 0x4c, 0x33, 0x70, 0x6d, 0x41, 0x49, 0x41, 0x4a, 0x6f, 0x53, 0x37, 0x48, 0x58, 0x41, 0x78, 0x67, 0x4b, 0x73, + 0x74, 0x5c, 0x0a, + 0x09, 0x42, 0x35, 0x63, 0x6f, 0x72, 0x4f, 0x38, 0x41, 0x2b, 0x4a, 0x4a, 0x53, 0x57, 0x55, 0x31, 0x6d, 0x7a, + 0x59, 0x2f, 0x54, 0x65, 0x39, 0x49, 0x61, 0x37, 0x62, 0x55, 0x6a, 0x38, 0x32, 0x6a, 0x4d, 0x4d, 0x35, 0x4f, + 0x6d, 0x74, 0x4e, 0x4b, 0x4b, 0x68, 0x6d, 0x6c, 0x61, 0x6e, 0x34, 0x37, 0x4a, 0x63, 0x6d, 0x34, 0x4c, 0x37, + 0x4e, 0x49, 0x73, 0x52, 0x34, 0x37, 0x55, 0x6e, 0x67, 0x44, 0x59, 0x6d, 0x55, 0x4b, 0x41, 0x49, 0x53, 0x66, + 0x71, 0x5c, 0x0a, + 0x09, 0x70, 0x57, 0x50, 0x55, 0x6a, 0x71, 0x6e, 0x35, 0x74, 0x63, 0x64, 0x58, 0x66, 0x32, 0x71, 0x51, 0x6c, + 0x58, 0x70, 0x4c, 0x64, 0x2b, 0x4f, 0x6c, 0x59, 0x4b, 0x71, 0x31, 0x4a, 0x72, 0x2f, 0x70, 0x6a, 0x46, 0x48, + 0x66, 0x53, 0x41, 0x57, 0x43, 0x76, 0x43, 0x31, 0x48, 0x72, 0x65, 0x58, 0x51, 0x42, 0x4b, 0x34, 0x31, 0x4c, + 0x35, 0x53, 0x4d, 0x52, 0x5a, 0x4d, 0x4f, 0x49, 0x67, 0x35, 0x34, 0x73, 0x77, 0x4f, 0x75, 0x73, 0x71, 0x31, + 0x7a, 0x5c, 0x0a, + 0x09, 0x66, 0x65, 0x69, 0x59, 0x41, 0x67, 0x42, 0x41, 0x67, 0x4d, 0x44, 0x4e, 0x44, 0x72, 0x67, 0x51, 0x63, + 0x47, 0x38, 0x44, 0x4d, 0x4d, 0x66, 0x4c, 0x6a, 0x42, 0x49, 0x59, 0x4e, 0x31, 0x69, 0x74, 0x4c, 0x47, 0x31, + 0x77, 0x32, 0x6d, 0x41, 0x73, 0x42, 0x65, 0x6f, 0x37, 0x44, 0x47, 0x6c, 0x76, 0x69, 0x44, 0x30, 0x32, 0x70, + 0x63, 0x6e, 0x61, 0x43, 0x47, 0x58, 0x4e, 0x39, 0x4e, 0x77, 0x6f, 0x67, 0x39, 0x4f, 0x52, 0x57, 0x50, 0x63, + 0x42, 0x5c, 0x0a, + 0x09, 0x39, 0x53, 0x6d, 0x6a, 0x70, 0x61, 0x71, 0x54, 0x43, 0x57, 0x4d, 0x55, 0x73, 0x75, 0x50, 0x72, 0x2b, + 0x52, 0x59, 0x76, 0x2b, 0x6c, 0x62, 0x65, 0x53, 0x6d, 0x4f, 0x71, 0x51, 0x53, 0x67, 0x46, 0x67, 0x39, 0x52, + 0x42, 0x65, 0x56, 0x30, 0x37, 0x47, 0x39, 0x4c, 0x6a, 0x35, 0x35, 0x39, 0x4e, 0x35, 0x51, 0x44, 0x75, 0x37, + 0x48, 0x57, 0x57, 0x74, 0x37, 0x49, 0x44, 0x36, 0x6c, 0x47, 0x6b, 0x41, 0x43, 0x64, 0x7a, 0x45, 0x6e, 0x6d, + 0x37, 0x5c, 0x0a, + 0x09, 0x32, 0x67, 0x42, 0x76, 0x52, 0x38, 0x41, 0x37, 0x55, 0x50, 0x32, 0x49, 0x37, 0x6b, 0x59, 0x73, 0x2f, + 0x67, 0x55, 0x36, 0x35, 0x67, 0x41, 0x41, 0x45, 0x43, 0x41, 0x77, 0x35, 0x2f, 0x79, 0x76, 0x6f, 0x68, 0x35, + 0x50, 0x66, 0x6c, 0x72, 0x77, 0x4a, 0x77, 0x43, 0x2b, 0x44, 0x61, 0x53, 0x47, 0x45, 0x38, 0x34, 0x46, 0x6b, + 0x74, 0x64, 0x47, 0x4a, 0x36, 0x56, 0x70, 0x6a, 0x75, 0x47, 0x50, 0x72, 0x61, 0x69, 0x72, 0x67, 0x55, 0x41, + 0x36, 0x5c, 0x0a, + 0x09, 0x6d, 0x34, 0x34, 0x73, 0x4e, 0x67, 0x69, 0x46, 0x38, 0x74, 0x71, 0x68, 0x69, 0x56, 0x32, 0x78, 0x30, + 0x74, 0x6f, 0x6d, 0x33, 0x76, 0x51, 0x66, 0x72, 0x79, 0x65, 0x6a, 0x62, 0x66, 0x50, 0x4f, 0x76, 0x78, 0x54, + 0x38, 0x30, 0x74, 0x32, 0x46, 0x65, 0x6e, 0x53, 0x57, 0x37, 0x44, 0x56, 0x66, 0x64, 0x64, 0x74, 0x4e, 0x4f, + 0x79, 0x5a, 0x72, 0x52, 0x39, 0x66, 0x5a, 0x42, 0x6c, 0x69, 0x39, 0x6c, 0x4f, 0x50, 0x52, 0x36, 0x58, 0x67, + 0x4b, 0x5c, 0x0a, + 0x09, 0x67, 0x69, 0x6b, 0x51, 0x41, 0x44, 0x59, 0x76, 0x74, 0x73, 0x78, 0x6c, 0x32, 0x37, 0x71, 0x63, 0x6c, + 0x48, 0x73, 0x4b, 0x47, 0x42, 0x55, 0x64, 0x64, 0x4d, 0x41, 0x66, 0x41, 0x58, 0x69, 0x55, 0x41, 0x33, 0x34, + 0x4a, 0x51, 0x44, 0x6d, 0x69, 0x6d, 0x33, 0x57, 0x68, 0x4e, 0x58, 0x73, 0x57, 0x59, 0x4c, 0x57, 0x49, 0x2f, + 0x78, 0x49, 0x71, 0x45, 0x2f, 0x67, 0x4f, 0x41, 0x68, 0x34, 0x33, 0x6e, 0x44, 0x76, 0x79, 0x63, 0x33, 0x44, + 0x6c, 0x5c, 0x0a, + 0x09, 0x73, 0x36, 0x6e, 0x62, 0x52, 0x39, 0x37, 0x74, 0x77, 0x57, 0x57, 0x5a, 0x4b, 0x4e, 0x66, 0x6b, 0x72, + 0x45, 0x44, 0x74, 0x45, 0x50, 0x37, 0x59, 0x6d, 0x66, 0x56, 0x30, 0x6c, 0x41, 0x72, 0x48, 0x69, 0x70, 0x63, + 0x59, 0x4c, 0x61, 0x32, 0x36, 0x73, 0x69, 0x2f, 0x37, 0x31, 0x70, 0x55, 0x33, 0x66, 0x76, 0x30, 0x54, 0x57, + 0x4f, 0x6c, 0x57, 0x59, 0x63, 0x76, 0x4a, 0x36, 0x76, 0x34, 0x34, 0x44, 0x38, 0x30, 0x6d, 0x48, 0x4b, 0x34, + 0x37, 0x5c, 0x0a, + 0x09, 0x4f, 0x46, 0x44, 0x56, 0x67, 0x4f, 0x62, 0x62, 0x48, 0x71, 0x4e, 0x64, 0x4c, 0x76, 0x33, 0x6b, 0x4d, + 0x56, 0x48, 0x79, 0x72, 0x33, 0x6e, 0x57, 0x37, 0x58, 0x49, 0x65, 0x56, 0x78, 0x70, 0x7a, 0x55, 0x2f, 0x76, + 0x68, 0x57, 0x39, 0x4f, 0x6d, 0x6e, 0x46, 0x46, 0x39, 0x57, 0x37, 0x70, 0x70, 0x47, 0x69, 0x75, 0x48, 0x4e, + 0x55, 0x74, 0x76, 0x31, 0x62, 0x6b, 0x35, 0x41, 0x46, 0x38, 0x45, 0x38, 0x43, 0x6b, 0x48, 0x66, 0x49, 0x71, + 0x41, 0x5c, 0x0a, + 0x09, 0x4b, 0x78, 0x79, 0x77, 0x48, 0x45, 0x70, 0x75, 0x5a, 0x4f, 0x51, 0x50, 0x64, 0x4d, 0x77, 0x44, 0x67, + 0x4b, 0x59, 0x41, 0x43, 0x4c, 0x50, 0x33, 0x33, 0x59, 0x32, 0x5a, 0x75, 0x32, 0x35, 0x37, 0x50, 0x59, 0x44, + 0x58, 0x68, 0x57, 0x75, 0x39, 0x73, 0x54, 0x47, 0x4d, 0x54, 0x55, 0x77, 0x69, 0x37, 0x2f, 0x61, 0x51, 0x64, + 0x2f, 0x76, 0x49, 0x75, 0x6c, 0x33, 0x6b, 0x6e, 0x51, 0x36, 0x51, 0x64, 0x5a, 0x48, 0x2f, 0x6e, 0x2f, 0x62, + 0x75, 0x5c, 0x0a, + 0x09, 0x33, 0x73, 0x65, 0x4e, 0x49, 0x67, 0x37, 0x6a, 0x2b, 0x48, 0x66, 0x73, 0x6e, 0x4f, 0x39, 0x38, 0x75, + 0x75, 0x53, 0x4d, 0x6c, 0x45, 0x52, 0x45, 0x53, 0x68, 0x6f, 0x4b, 0x6f, 0x45, 0x45, 0x52, 0x46, 0x4e, 0x42, + 0x52, 0x30, 0x46, 0x4d, 0x68, 0x55, 0x64, 0x4e, 0x52, 0x49, 0x53, 0x45, 0x71, 0x61, 0x76, 0x34, 0x41, 0x30, + 0x69, 0x48, 0x45, 0x50, 0x34, 0x41, 0x6f, 0x45, 0x4a, 0x52, 0x49, 0x55, 0x59, 0x51, 0x69, 0x51, 0x55, 0x53, + 0x56, 0x5c, 0x0a, + 0x09, 0x41, 0x71, 0x56, 0x42, 0x52, 0x4a, 0x45, 0x53, 0x68, 0x55, 0x4d, 0x6f, 0x51, 0x46, 0x37, 0x4f, 0x54, + 0x6f, 0x7a, 0x74, 0x33, 0x52, 0x2f, 0x46, 0x37, 0x4a, 0x35, 0x6e, 0x33, 0x32, 0x78, 0x66, 0x58, 0x70, 0x52, + 0x62, 0x7a, 0x2f, 0x4e, 0x70, 0x37, 0x72, 0x7a, 0x65, 0x6c, 0x31, 0x6e, 0x76, 0x7a, 0x4c, 0x4f, 0x7a, 0x34, + 0x37, 0x57, 0x39, 0x63, 0x51, 0x7a, 0x72, 0x46, 0x44, 0x2f, 0x35, 0x6c, 0x76, 0x38, 0x50, 0x70, 0x59, 0x5a, + 0x52, 0x5c, 0x0a, + 0x09, 0x6d, 0x46, 0x61, 0x65, 0x74, 0x33, 0x4b, 0x51, 0x61, 0x79, 0x70, 0x55, 0x33, 0x58, 0x72, 0x71, 0x7a, + 0x2b, 0x79, 0x4c, 0x7a, 0x6a, 0x5a, 0x4e, 0x35, 0x61, 0x78, 0x62, 0x76, 0x72, 0x6b, 0x42, 0x46, 0x43, 0x74, + 0x71, 0x57, 0x42, 0x5a, 0x6e, 0x76, 0x69, 0x39, 0x61, 0x33, 0x6c, 0x64, 0x58, 0x57, 0x63, 0x66, 0x63, 0x6f, + 0x70, 0x41, 0x4c, 0x79, 0x31, 0x33, 0x65, 0x69, 0x2b, 0x5a, 0x39, 0x4c, 0x41, 0x5a, 0x47, 0x58, 0x57, 0x67, + 0x76, 0x5c, 0x0a, + 0x09, 0x4f, 0x78, 0x75, 0x48, 0x32, 0x31, 0x2f, 0x55, 0x36, 0x4a, 0x76, 0x4b, 0x32, 0x37, 0x53, 0x74, 0x70, + 0x6c, 0x43, 0x63, 0x6c, 0x2f, 0x58, 0x67, 0x37, 0x65, 0x46, 0x39, 0x2f, 0x49, 0x31, 0x73, 0x31, 0x2f, 0x46, + 0x33, 0x39, 0x50, 0x31, 0x71, 0x2f, 0x74, 0x62, 0x65, 0x47, 0x35, 0x54, 0x4f, 0x38, 0x6b, 0x65, 0x6c, 0x34, + 0x65, 0x65, 0x65, 0x32, 0x59, 0x65, 0x42, 0x6e, 0x70, 0x58, 0x38, 0x38, 0x73, 0x44, 0x35, 0x4c, 0x30, 0x72, + 0x6f, 0x5c, 0x0a, + 0x09, 0x75, 0x50, 0x78, 0x37, 0x37, 0x63, 0x79, 0x59, 0x6a, 0x4d, 0x64, 0x4d, 0x78, 0x75, 0x50, 0x47, 0x5a, + 0x54, 0x76, 0x64, 0x4c, 0x72, 0x32, 0x74, 0x50, 0x68, 0x75, 0x39, 0x6e, 0x67, 0x2b, 0x4a, 0x54, 0x68, 0x65, + 0x36, 0x48, 0x54, 0x59, 0x32, 0x74, 0x33, 0x34, 0x2f, 0x74, 0x6a, 0x4f, 0x34, 0x41, 0x6e, 0x62, 0x61, 0x77, + 0x55, 0x6d, 0x44, 0x30, 0x38, 0x42, 0x70, 0x68, 0x2b, 0x74, 0x58, 0x42, 0x34, 0x65, 0x73, 0x55, 0x6d, 0x6c, + 0x7a, 0x5c, 0x0a, + 0x09, 0x38, 0x38, 0x70, 0x69, 0x6c, 0x55, 0x59, 0x55, 0x76, 0x69, 0x31, 0x58, 0x37, 0x6f, 0x36, 0x47, 0x5a, + 0x35, 0x43, 0x6d, 0x77, 0x61, 0x6a, 0x79, 0x76, 0x50, 0x57, 0x39, 0x6a, 0x4f, 0x4a, 0x38, 0x52, 0x74, 0x36, + 0x78, 0x72, 0x6a, 0x4a, 0x38, 0x34, 0x38, 0x2f, 0x4c, 0x57, 0x52, 0x77, 0x32, 0x7a, 0x51, 0x4b, 0x69, 0x73, + 0x5a, 0x7a, 0x56, 0x62, 0x54, 0x61, 0x46, 0x52, 0x2f, 0x48, 0x75, 0x7a, 0x65, 0x72, 0x79, 0x35, 0x53, 0x61, + 0x32, 0x5c, 0x0a, + 0x09, 0x72, 0x41, 0x48, 0x6d, 0x70, 0x51, 0x31, 0x44, 0x5a, 0x58, 0x46, 0x33, 0x6e, 0x4e, 0x4a, 0x38, 0x78, + 0x58, 0x31, 0x72, 0x4f, 0x74, 0x76, 0x50, 0x4a, 0x36, 0x5a, 0x59, 0x6b, 0x70, 0x44, 0x4f, 0x45, 0x69, 0x79, + 0x5a, 0x6b, 0x73, 0x36, 0x6d, 0x70, 0x4e, 0x4d, 0x4a, 0x53, 0x54, 0x49, 0x6a, 0x6e, 0x55, 0x34, 0x5a, 0x50, + 0x78, 0x7a, 0x65, 0x33, 0x6a, 0x35, 0x31, 0x35, 0x74, 0x7a, 0x32, 0x43, 0x79, 0x63, 0x62, 0x41, 0x2f, 0x31, + 0x35, 0x5c, 0x0a, + 0x09, 0x6a, 0x66, 0x43, 0x76, 0x6f, 0x6e, 0x55, 0x42, 0x55, 0x44, 0x49, 0x4b, 0x65, 0x7a, 0x44, 0x4f, 0x4f, + 0x52, 0x62, 0x31, 0x61, 0x4e, 0x49, 0x6b, 0x59, 0x54, 0x77, 0x61, 0x4d, 0x68, 0x35, 0x56, 0x6e, 0x76, 0x70, + 0x79, 0x63, 0x4f, 0x62, 0x73, 0x35, 0x7a, 0x75, 0x6e, 0x7a, 0x70, 0x51, 0x61, 0x74, 0x50, 0x57, 0x41, 0x58, + 0x57, 0x41, 0x41, 0x37, 0x4c, 0x72, 0x73, 0x4c, 0x39, 0x6a, 0x41, 0x5a, 0x64, 0x4d, 0x64, 0x62, 0x68, 0x64, + 0x73, 0x5c, 0x0a, + 0x09, 0x31, 0x32, 0x44, 0x67, 0x59, 0x47, 0x43, 0x77, 0x34, 0x32, 0x41, 0x4c, 0x32, 0x41, 0x45, 0x37, 0x37, + 0x71, 0x41, 0x50, 0x72, 0x6c, 0x39, 0x2f, 0x39, 0x69, 0x2f, 0x33, 0x43, 0x70, 0x6f, 0x61, 0x58, 0x66, 0x33, + 0x33, 0x46, 0x31, 0x44, 0x7a, 0x4f, 0x43, 0x74, 0x33, 0x46, 0x6a, 0x5a, 0x4e, 0x50, 0x36, 0x30, 0x64, 0x72, + 0x69, 0x73, 0x73, 0x67, 0x77, 0x58, 0x50, 0x7a, 0x78, 0x74, 0x4b, 0x65, 0x56, 0x76, 0x4c, 0x4c, 0x67, 0x76, + 0x43, 0x5c, 0x0a, + 0x09, 0x55, 0x71, 0x31, 0x32, 0x52, 0x6d, 0x34, 0x65, 0x62, 0x36, 0x6a, 0x66, 0x52, 0x76, 0x30, 0x50, 0x66, + 0x72, 0x6a, 0x53, 0x65, 0x6f, 0x4a, 0x74, 0x4a, 0x4d, 0x44, 0x51, 0x34, 0x44, 0x37, 0x59, 0x45, 0x4e, 0x77, + 0x6f, 0x6e, 0x55, 0x78, 0x4f, 0x70, 0x4e, 0x4e, 0x48, 0x72, 0x36, 0x52, 0x70, 0x69, 0x69, 0x56, 0x54, 0x62, + 0x4a, 0x61, 0x51, 0x70, 0x41, 0x6c, 0x70, 0x4f, 0x73, 0x4e, 0x6d, 0x43, 0x62, 0x50, 0x70, 0x68, 0x50, 0x38, + 0x65, 0x5c, 0x0a, + 0x09, 0x50, 0x53, 0x4b, 0x5a, 0x7a, 0x56, 0x68, 0x69, 0x50, 0x50, 0x33, 0x6a, 0x4a, 0x76, 0x2f, 0x65, 0x75, + 0x72, 0x46, 0x73, 0x76, 0x69, 0x4f, 0x70, 0x37, 0x51, 0x46, 0x77, 0x4b, 0x33, 0x79, 0x77, 0x79, 0x75, 0x56, + 0x4d, 0x54, 0x55, 0x69, 0x4d, 0x67, 0x61, 0x2f, 0x76, 0x2f, 0x58, 0x6d, 0x62, 0x75, 0x33, 0x76, 0x7a, 0x33, + 0x7a, 0x50, 0x4d, 0x4c, 0x6a, 0x55, 0x6d, 0x77, 0x42, 0x33, 0x67, 0x54, 0x72, 0x57, 0x62, 0x66, 0x62, 0x44, + 0x56, 0x5c, 0x0a, + 0x09, 0x53, 0x73, 0x4f, 0x6f, 0x6e, 0x6c, 0x6b, 0x4d, 0x68, 0x7a, 0x74, 0x68, 0x57, 0x4e, 0x38, 0x48, 0x41, + 0x67, 0x4f, 0x67, 0x62, 0x39, 0x69, 0x57, 0x38, 0x38, 0x47, 0x79, 0x62, 0x64, 0x44, 0x44, 0x68, 0x38, 0x55, + 0x6d, 0x50, 0x6e, 0x69, 0x32, 0x67, 0x61, 0x37, 0x42, 0x38, 0x53, 0x77, 0x59, 0x42, 0x74, 0x6c, 0x36, 0x6a, + 0x77, 0x4e, 0x64, 0x35, 0x73, 0x76, 0x30, 0x73, 0x75, 0x58, 0x7a, 0x37, 0x66, 0x65, 0x79, 0x35, 0x38, 0x67, + 0x61, 0x5c, 0x0a, + 0x09, 0x63, 0x4d, 0x39, 0x67, 0x32, 0x34, 0x48, 0x72, 0x4f, 0x74, 0x63, 0x46, 0x4e, 0x6d, 0x5a, 0x6d, 0x50, + 0x53, 0x75, 0x55, 0x4c, 0x6e, 0x74, 0x74, 0x43, 0x76, 0x32, 0x47, 0x34, 0x6d, 0x74, 0x5a, 0x50, 0x6f, 0x75, + 0x48, 0x44, 0x61, 0x7a, 0x75, 0x74, 0x51, 0x6b, 0x65, 0x54, 0x38, 0x45, 0x39, 0x44, 0x4f, 0x4d, 0x6d, 0x2b, + 0x33, 0x74, 0x76, 0x58, 0x67, 0x49, 0x53, 0x59, 0x44, 0x2f, 0x62, 0x34, 0x6e, 0x32, 0x48, 0x4d, 0x38, 0x4f, + 0x47, 0x5c, 0x0a, + 0x09, 0x2b, 0x48, 0x74, 0x43, 0x78, 0x73, 0x34, 0x66, 0x6f, 0x79, 0x6e, 0x2b, 0x6d, 0x74, 0x71, 0x41, 0x2b, + 0x39, 0x6b, 0x36, 0x48, 0x68, 0x68, 0x4d, 0x48, 0x65, 0x79, 0x62, 0x2f, 0x2b, 0x61, 0x63, 0x6b, 0x59, 0x4d, + 0x68, 0x75, 0x42, 0x48, 0x2b, 0x38, 0x58, 0x36, 0x32, 0x7a, 0x44, 0x67, 0x38, 0x4e, 0x71, 0x4f, 0x2f, 0x2f, + 0x2b, 0x4c, 0x65, 0x33, 0x73, 0x32, 0x50, 0x38, 0x52, 0x39, 0x41, 0x4f, 0x37, 0x52, 0x53, 0x48, 0x64, 0x70, + 0x4c, 0x5c, 0x0a, + 0x09, 0x30, 0x2b, 0x63, 0x2b, 0x6c, 0x76, 0x66, 0x59, 0x57, 0x68, 0x30, 0x41, 0x7a, 0x72, 0x6c, 0x66, 0x38, + 0x67, 0x4d, 0x52, 0x58, 0x67, 0x6f, 0x30, 0x7a, 0x49, 0x75, 0x5a, 0x31, 0x54, 0x31, 0x2f, 0x67, 0x5a, 0x6f, + 0x37, 0x73, 0x5a, 0x35, 0x6d, 0x74, 0x2b, 0x33, 0x63, 0x2b, 0x62, 0x63, 0x77, 0x37, 0x41, 0x47, 0x2b, 0x77, + 0x68, 0x61, 0x55, 0x4c, 0x79, 0x47, 0x61, 0x4c, 0x69, 0x33, 0x43, 0x2f, 0x38, 0x73, 0x39, 0x67, 0x55, 0x57, + 0x78, 0x5c, 0x0a, + 0x09, 0x46, 0x7a, 0x5a, 0x4f, 0x73, 0x2b, 0x71, 0x5a, 0x74, 0x74, 0x54, 0x6a, 0x77, 0x63, 0x47, 0x75, 0x48, + 0x59, 0x77, 0x4d, 0x65, 0x50, 0x58, 0x42, 0x56, 0x37, 0x75, 0x64, 0x45, 0x64, 0x6b, 0x67, 0x56, 0x32, 0x47, + 0x37, 0x77, 0x56, 0x5a, 0x57, 0x75, 0x52, 0x59, 0x76, 0x68, 0x30, 0x2f, 0x64, 0x76, 0x69, 0x35, 0x36, 0x66, + 0x61, 0x6a, 0x5a, 0x58, 0x6e, 0x67, 0x38, 0x73, 0x37, 0x70, 0x79, 0x74, 0x33, 0x35, 0x50, 0x4b, 0x4d, 0x78, + 0x58, 0x5c, 0x0a, + 0x09, 0x56, 0x35, 0x39, 0x4b, 0x30, 0x79, 0x34, 0x76, 0x57, 0x38, 0x39, 0x52, 0x31, 0x72, 0x70, 0x42, 0x77, + 0x46, 0x79, 0x6e, 0x30, 0x38, 0x6b, 0x50, 0x78, 0x47, 0x58, 0x67, 0x37, 0x57, 0x58, 0x7a, 0x4e, 0x78, 0x7a, + 0x4d, 0x48, 0x34, 0x42, 0x33, 0x67, 0x56, 0x6c, 0x62, 0x58, 0x34, 0x65, 0x6e, 0x36, 0x64, 0x7a, 0x35, 0x4e, + 0x78, 0x65, 0x47, 0x79, 0x53, 0x71, 0x4f, 0x32, 0x69, 0x42, 0x58, 0x6e, 0x53, 0x77, 0x41, 0x33, 0x67, 0x45, + 0x75, 0x5c, 0x0a, + 0x09, 0x72, 0x54, 0x70, 0x2f, 0x51, 0x2f, 0x31, 0x49, 0x67, 0x46, 0x65, 0x42, 0x36, 0x32, 0x32, 0x74, 0x50, + 0x36, 0x30, 0x4e, 0x41, 0x44, 0x67, 0x34, 0x6b, 0x47, 0x2f, 0x67, 0x50, 0x7a, 0x76, 0x51, 0x4f, 0x2b, 0x54, + 0x69, 0x58, 0x77, 0x45, 0x66, 0x34, 0x62, 0x76, 0x35, 0x4b, 0x31, 0x30, 0x2b, 0x79, 0x48, 0x72, 0x49, 0x36, + 0x73, 0x30, 0x4f, 0x38, 0x41, 0x38, 0x4c, 0x36, 0x6b, 0x31, 0x54, 0x77, 0x77, 0x2b, 0x6d, 0x58, 0x77, 0x41, + 0x2b, 0x5c, 0x0a, + 0x09, 0x67, 0x66, 0x62, 0x57, 0x6e, 0x79, 0x4e, 0x35, 0x49, 0x39, 0x41, 0x68, 0x58, 0x63, 0x58, 0x66, 0x4a, + 0x48, 0x54, 0x77, 0x54, 0x61, 0x72, 0x4f, 0x4c, 0x65, 0x79, 0x30, 0x2f, 0x6f, 0x7a, 0x2f, 0x68, 0x74, 0x55, + 0x50, 0x55, 0x65, 0x4f, 0x50, 0x32, 0x52, 0x44, 0x34, 0x42, 0x6e, 0x78, 0x39, 0x71, 0x61, 0x73, 0x7a, 0x54, + 0x66, 0x55, 0x69, 0x6d, 0x33, 0x34, 0x52, 0x2b, 0x48, 0x54, 0x52, 0x66, 0x47, 0x33, 0x51, 0x36, 0x68, 0x34, + 0x41, 0x5c, 0x0a, + 0x09, 0x46, 0x42, 0x72, 0x37, 0x69, 0x2f, 0x69, 0x37, 0x71, 0x39, 0x34, 0x44, 0x58, 0x67, 0x35, 0x6d, 0x47, + 0x54, 0x6e, 0x6e, 0x72, 0x70, 0x6e, 0x6f, 0x56, 0x57, 0x38, 0x39, 0x41, 0x41, 0x41, 0x42, 0x58, 0x6b, 0x6c, + 0x45, 0x51, 0x56, 0x54, 0x5a, 0x4a, 0x65, 0x42, 0x62, 0x66, 0x47, 0x41, 0x41, 0x37, 0x54, 0x35, 0x77, 0x38, + 0x6d, 0x53, 0x79, 0x65, 0x6e, 0x50, 0x57, 0x4f, 0x58, 0x66, 0x56, 0x7a, 0x45, 0x36, 0x56, 0x70, 0x69, 0x2b, + 0x72, 0x5c, 0x0a, + 0x09, 0x47, 0x31, 0x2f, 0x67, 0x37, 0x31, 0x42, 0x74, 0x2f, 0x51, 0x6d, 0x6b, 0x39, 0x51, 0x45, 0x41, 0x74, + 0x57, 0x66, 0x38, 0x54, 0x66, 0x78, 0x6f, 0x4f, 0x2f, 0x69, 0x65, 0x51, 0x66, 0x47, 0x74, 0x33, 0x54, 0x58, + 0x59, 0x5a, 0x33, 0x6b, 0x79, 0x65, 0x5a, 0x31, 0x78, 0x7a, 0x72, 0x31, 0x6d, 0x5a, 0x74, 0x38, 0x44, 0x4c, + 0x79, 0x32, 0x62, 0x33, 0x38, 0x77, 0x75, 0x41, 0x70, 0x38, 0x42, 0x50, 0x2b, 0x58, 0x54, 0x32, 0x31, 0x36, + 0x58, 0x5c, 0x0a, + 0x09, 0x31, 0x69, 0x49, 0x41, 0x51, 0x6b, 0x33, 0x64, 0x2f, 0x33, 0x58, 0x62, 0x54, 0x33, 0x6c, 0x79, 0x77, + 0x55, 0x42, 0x79, 0x48, 0x2f, 0x6a, 0x41, 0x4f, 0x66, 0x63, 0x2b, 0x38, 0x4c, 0x71, 0x5a, 0x2f, 0x33, 0x5a, + 0x71, 0x59, 0x41, 0x2b, 0x34, 0x42, 0x76, 0x77, 0x49, 0x66, 0x41, 0x66, 0x38, 0x6c, 0x69, 0x2b, 0x37, 0x4c, + 0x76, 0x56, 0x70, 0x37, 0x51, 0x4a, 0x41, 0x35, 0x44, 0x43, 0x57, 0x6a, 0x42, 0x64, 0x56, 0x72, 0x46, 0x74, + 0x37, 0x5c, 0x0a, + 0x09, 0x55, 0x51, 0x43, 0x49, 0x52, 0x47, 0x77, 0x64, 0x33, 0x67, 0x55, 0x51, 0x6b, 0x63, 0x65, 0x6b, 0x41, + 0x42, 0x43, 0x4a, 0x6d, 0x41, 0x4a, 0x41, 0x4a, 0x47, 0x49, 0x4b, 0x41, 0x4a, 0x47, 0x49, 0x4b, 0x51, 0x42, + 0x45, 0x49, 0x71, 0x59, 0x41, 0x45, 0x49, 0x6d, 0x59, 0x41, 0x6b, 0x41, 0x6b, 0x59, 0x67, 0x6f, 0x41, 0x6b, + 0x59, 0x67, 0x70, 0x41, 0x45, 0x51, 0x69, 0x70, 0x67, 0x41, 0x51, 0x69, 0x5a, 0x67, 0x43, 0x51, 0x43, 0x52, + 0x69, 0x5c, 0x0a, + 0x09, 0x43, 0x67, 0x43, 0x52, 0x69, 0x43, 0x6b, 0x41, 0x52, 0x43, 0x4b, 0x6d, 0x41, 0x42, 0x43, 0x4a, 0x6d, + 0x41, 0x4a, 0x41, 0x4a, 0x47, 0x49, 0x4b, 0x41, 0x4a, 0x47, 0x49, 0x4b, 0x51, 0x42, 0x45, 0x49, 0x71, 0x59, + 0x41, 0x45, 0x49, 0x6d, 0x59, 0x41, 0x6b, 0x41, 0x6b, 0x59, 0x67, 0x6f, 0x41, 0x6b, 0x59, 0x67, 0x70, 0x41, + 0x45, 0x51, 0x69, 0x70, 0x67, 0x41, 0x51, 0x69, 0x5a, 0x67, 0x43, 0x51, 0x43, 0x52, 0x69, 0x43, 0x67, 0x43, + 0x52, 0x5c, 0x0a, + 0x09, 0x69, 0x43, 0x6b, 0x41, 0x52, 0x43, 0x4b, 0x6d, 0x41, 0x42, 0x43, 0x4a, 0x6d, 0x41, 0x4a, 0x41, 0x4a, + 0x47, 0x49, 0x4b, 0x41, 0x4a, 0x47, 0x49, 0x4b, 0x51, 0x42, 0x45, 0x49, 0x71, 0x59, 0x41, 0x45, 0x49, 0x6d, + 0x59, 0x41, 0x6b, 0x41, 0x6b, 0x59, 0x67, 0x6f, 0x41, 0x6b, 0x59, 0x67, 0x70, 0x41, 0x45, 0x51, 0x69, 0x70, + 0x67, 0x41, 0x51, 0x69, 0x5a, 0x67, 0x43, 0x51, 0x43, 0x52, 0x69, 0x43, 0x67, 0x43, 0x52, 0x69, 0x43, 0x6b, + 0x41, 0x5c, 0x0a, + 0x09, 0x52, 0x43, 0x4b, 0x6d, 0x41, 0x42, 0x43, 0x4a, 0x6d, 0x41, 0x4a, 0x41, 0x4a, 0x47, 0x49, 0x4b, 0x41, + 0x4a, 0x47, 0x49, 0x4b, 0x51, 0x42, 0x45, 0x49, 0x71, 0x59, 0x41, 0x45, 0x49, 0x6d, 0x59, 0x41, 0x6b, 0x41, + 0x6b, 0x59, 0x67, 0x6f, 0x41, 0x6b, 0x59, 0x67, 0x70, 0x41, 0x45, 0x51, 0x69, 0x70, 0x67, 0x41, 0x51, 0x69, + 0x5a, 0x67, 0x43, 0x51, 0x43, 0x52, 0x69, 0x43, 0x67, 0x43, 0x52, 0x69, 0x50, 0x30, 0x50, 0x38, 0x66, 0x52, + 0x4d, 0x5c, 0x0a, + 0x09, 0x43, 0x50, 0x61, 0x46, 0x72, 0x73, 0x45, 0x41, 0x41, 0x41, 0x41, 0x41, 0x53, 0x55, 0x56, 0x4f, 0x52, + 0x4b, 0x35, 0x43, 0x59, 0x49, 0x49, 0x3d, 0x5c, 0x0a, + 0x09, 0x22, 0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x6e, 0x67, 0x20, 0x3d, 0x0a, + 0x09, 0x22, 0x69, 0x56, 0x42, 0x4f, 0x52, 0x77, 0x30, 0x4b, 0x47, 0x67, 0x6f, 0x41, 0x41, 0x41, 0x41, 0x4e, + 0x53, 0x55, 0x68, 0x45, 0x55, 0x67, 0x41, 0x41, 0x41, 0x49, 0x41, 0x41, 0x41, 0x41, 0x42, 0x41, 0x43, 0x41, + 0x59, 0x41, 0x41, 0x41, 0x44, 0x53, 0x31, 0x6e, 0x39, 0x2f, 0x41, 0x41, 0x41, 0x48, 0x6c, 0x45, 0x6c, 0x45, + 0x51, 0x56, 0x52, 0x34, 0x6e, 0x4f, 0x32, 0x62, 0x65, 0x34, 0x78, 0x64, 0x56, 0x52, 0x58, 0x47, 0x66, 0x7a, + 0x4f, 0x64, 0x5c, 0x0a, + 0x09, 0x61, 0x57, 0x6c, 0x4c, 0x69, 0x7a, 0x43, 0x30, 0x59, 0x68, 0x38, 0x38, 0x4f, 0x79, 0x6b, 0x57, 0x78, + 0x51, 0x6f, 0x74, 0x64, 0x41, 0x6f, 0x71, 0x31, 0x42, 0x52, 0x45, 0x53, 0x56, 0x56, 0x53, 0x59, 0x77, 0x31, + 0x70, 0x51, 0x67, 0x69, 0x52, 0x67, 0x42, 0x41, 0x44, 0x78, 0x6f, 0x51, 0x59, 0x69, 0x64, 0x68, 0x45, 0x78, + 0x47, 0x42, 0x4a, 0x4e, 0x43, 0x67, 0x59, 0x45, 0x74, 0x4e, 0x71, 0x55, 0x6a, 0x48, 0x57, 0x38, 0x45, 0x61, + 0x6b, 0x5c, 0x0a, + 0x09, 0x74, 0x63, 0x58, 0x36, 0x41, 0x4d, 0x61, 0x71, 0x69, 0x50, 0x61, 0x68, 0x56, 0x69, 0x69, 0x56, 0x55, + 0x74, 0x73, 0x69, 0x46, 0x4b, 0x61, 0x4d, 0x4c, 0x5a, 0x33, 0x32, 0x38, 0x34, 0x2b, 0x31, 0x54, 0x75, 0x36, + 0x2b, 0x5a, 0x38, 0x34, 0x35, 0x64, 0x31, 0x36, 0x33, 0x63, 0x34, 0x65, 0x7a, 0x76, 0x2b, 0x52, 0x6b, 0x33, + 0x37, 0x50, 0x58, 0x32, 0x6e, 0x75, 0x74, 0x73, 0x2f, 0x64, 0x33, 0x39, 0x6c, 0x6e, 0x37, 0x63, 0x5a, 0x73, + 0x6b, 0x5c, 0x0a, + 0x09, 0x45, 0x56, 0x46, 0x65, 0x4e, 0x41, 0x2b, 0x33, 0x41, 0x78, 0x48, 0x44, 0x69, 0x30, 0x69, 0x41, 0x6b, + 0x69, 0x4d, 0x53, 0x6f, 0x4c, 0x48, 0x52, 0x42, 0x49, 0x77, 0x48, 0x52, 0x74, 0x58, 0x4c, 0x51, 0x43, 0x52, + 0x41, 0x59, 0x2b, 0x4d, 0x6d, 0x59, 0x44, 0x2f, 0x77, 0x6c, 0x58, 0x6f, 0x5a, 0x69, 0x41, 0x52, 0x6f, 0x62, + 0x45, 0x7a, 0x77, 0x39, 0x48, 0x33, 0x31, 0x4d, 0x68, 0x41, 0x4a, 0x30, 0x4e, 0x68, 0x34, 0x77, 0x39, 0x4d, + 0x70, 0x5c, 0x0a, + 0x09, 0x39, 0x54, 0x49, 0x51, 0x43, 0x64, 0x44, 0x59, 0x36, 0x50, 0x4c, 0x30, 0x68, 0x48, 0x6f, 0x5a, 0x69, + 0x41, 0x52, 0x6f, 0x62, 0x4f, 0x7a, 0x32, 0x39, 0x4d, 0x52, 0x36, 0x47, 0x57, 0x69, 0x70, 0x56, 0x38, 0x55, + 0x52, 0x6d, 0x5a, 0x67, 0x4c, 0x66, 0x42, 0x69, 0x59, 0x42, 0x4c, 0x77, 0x43, 0x50, 0x41, 0x6c, 0x73, 0x4c, + 0x64, 0x42, 0x2f, 0x31, 0x64, 0x4e, 0x49, 0x67, 0x44, 0x71, 0x69, 0x44, 0x66, 0x67, 0x44, 0x38, 0x47, 0x2f, + 0x67, 0x5c, 0x0a, + 0x09, 0x49, 0x30, 0x48, 0x2b, 0x61, 0x47, 0x41, 0x42, 0x63, 0x43, 0x72, 0x77, 0x4f, 0x76, 0x42, 0x62, 0x59, + 0x47, 0x65, 0x71, 0x37, 0x48, 0x51, 0x76, 0x76, 0x78, 0x33, 0x59, 0x56, 0x32, 0x42, 0x6a, 0x4e, 0x76, 0x41, + 0x44, 0x34, 0x4c, 0x77, 0x4d, 0x32, 0x55, 0x72, 0x67, 0x65, 0x71, 0x41, 0x37, 0x51, 0x37, 0x62, 0x48, 0x30, + 0x32, 0x5a, 0x73, 0x4b, 0x6e, 0x69, 0x34, 0x77, 0x4d, 0x61, 0x41, 0x30, 0x44, 0x51, 0x43, 0x6c, 0x34, 0x4a, + 0x48, 0x5c, 0x0a, + 0x09, 0x41, 0x65, 0x33, 0x41, 0x54, 0x4f, 0x41, 0x30, 0x34, 0x46, 0x6e, 0x67, 0x36, 0x5a, 0x52, 0x4f, 0x45, + 0x39, 0x62, 0x59, 0x35, 0x77, 0x4e, 0x54, 0x4d, 0x61, 0x4c, 0x76, 0x77, 0x54, 0x72, 0x77, 0x6c, 0x38, 0x44, + 0x65, 0x51, 0x48, 0x63, 0x36, 0x73, 0x4d, 0x4e, 0x2f, 0x7a, 0x77, 0x55, 0x32, 0x41, 0x6e, 0x4f, 0x41, 0x31, + 0x63, 0x41, 0x70, 0x67, 0x64, 0x35, 0x68, 0x34, 0x44, 0x37, 0x67, 0x69, 0x38, 0x41, 0x30, 0x34, 0x4d, 0x66, + 0x41, 0x5c, 0x0a, + 0x09, 0x66, 0x4a, 0x63, 0x4a, 0x65, 0x41, 0x43, 0x34, 0x41, 0x64, 0x69, 0x56, 0x38, 0x6d, 0x55, 0x68, 0x38, + 0x42, 0x41, 0x77, 0x31, 0x75, 0x2b, 0x66, 0x42, 0x76, 0x34, 0x4a, 0x76, 0x4e, 0x66, 0x74, 0x41, 0x54, 0x77, + 0x49, 0x66, 0x44, 0x72, 0x6a, 0x57, 0x63, 0x64, 0x53, 0x49, 0x63, 0x59, 0x34, 0x34, 0x48, 0x38, 0x5a, 0x4f, + 0x6f, 0x4f, 0x44, 0x70, 0x4a, 0x46, 0x77, 0x48, 0x53, 0x50, 0x70, 0x4b, 0x6b, 0x6d, 0x50, 0x53, 0x75, 0x70, + 0x53, 0x5c, 0x0a, + 0x09, 0x4e, 0x66, 0x36, 0x65, 0x30, 0x72, 0x31, 0x51, 0x30, 0x69, 0x62, 0x6c, 0x34, 0x77, 0x6c, 0x4a, 0x73, + 0x31, 0x4a, 0x6c, 0x4e, 0x72, 0x70, 0x73, 0x75, 0x61, 0x54, 0x4a, 0x6b, 0x76, 0x62, 0x34, 0x66, 0x59, 0x2b, + 0x6b, 0x54, 0x6b, 0x6e, 0x50, 0x42, 0x65, 0x55, 0x66, 0x6c, 0x76, 0x53, 0x76, 0x34, 0x50, 0x35, 0x41, 0x38, + 0x48, 0x75, 0x62, 0x70, 0x4c, 0x61, 0x67, 0x33, 0x71, 0x6d, 0x53, 0x58, 0x67, 0x39, 0x6b, 0x48, 0x53, 0x6d, + 0x37, 0x5c, 0x0a, + 0x09, 0x69, 0x34, 0x4f, 0x79, 0x63, 0x33, 0x4b, 0x65, 0x2f, 0x51, 0x32, 0x58, 0x74, 0x2b, 0x58, 0x49, 0x42, + 0x33, 0x55, 0x4e, 0x64, 0x38, 0x66, 0x32, 0x35, 0x66, 0x71, 0x4d, 0x70, 0x46, 0x32, 0x71, 0x78, 0x6d, 0x46, + 0x4a, 0x4f, 0x34, 0x4c, 0x37, 0x34, 0x31, 0x54, 0x70, 0x2f, 0x4c, 0x63, 0x39, 0x37, 0x36, 0x43, 0x6b, 0x64, + 0x5a, 0x4a, 0x57, 0x2b, 0x50, 0x57, 0x77, 0x4b, 0x68, 0x31, 0x35, 0x57, 0x4e, 0x4c, 0x70, 0x67, 0x59, 0x30, + 0x76, 0x5c, 0x0a, + 0x09, 0x65, 0x66, 0x34, 0x32, 0x53, 0x58, 0x66, 0x36, 0x37, 0x78, 0x32, 0x53, 0x5a, 0x67, 0x59, 0x36, 0x69, + 0x79, 0x51, 0x64, 0x43, 0x6d, 0x79, 0x2b, 0x4b, 0x6d, 0x6d, 0x32, 0x70, 0x47, 0x5a, 0x4a, 0x6c, 0x30, 0x6e, + 0x61, 0x36, 0x2f, 0x6b, 0x2f, 0x44, 0x4d, 0x72, 0x63, 0x35, 0x58, 0x6e, 0x2f, 0x6b, 0x54, 0x51, 0x74, 0x35, + 0x2f, 0x6b, 0x53, 0x38, 0x6e, 0x30, 0x2b, 0x52, 0x37, 0x37, 0x56, 0x35, 0x61, 0x66, 0x6e, 0x79, 0x42, 0x75, + 0x57, 0x5c, 0x0a, + 0x09, 0x41, 0x47, 0x4d, 0x6b, 0x6a, 0x52, 0x70, 0x6b, 0x48, 0x54, 0x63, 0x46, 0x44, 0x66, 0x36, 0x79, 0x70, + 0x47, 0x39, 0x49, 0x75, 0x6c, 0x6a, 0x53, 0x73, 0x5a, 0x4a, 0x61, 0x4a, 0x58, 0x57, 0x37, 0x62, 0x47, 0x47, + 0x71, 0x4d, 0x54, 0x73, 0x6c, 0x54, 0x63, 0x2b, 0x6f, 0x37, 0x36, 0x4b, 0x67, 0x76, 0x6c, 0x75, 0x43, 0x2f, + 0x4a, 0x6c, 0x42, 0x66, 0x6a, 0x4c, 0x43, 0x4c, 0x4d, 0x34, 0x6f, 0x66, 0x32, 0x2b, 0x67, 0x39, 0x2b, 0x57, + 0x55, 0x5c, 0x0a, + 0x09, 0x37, 0x42, 0x4c, 0x50, 0x50, 0x79, 0x4b, 0x70, 0x33, 0x66, 0x4e, 0x32, 0x65, 0x74, 0x34, 0x39, 0x37, + 0x6e, 0x4f, 0x36, 0x76, 0x6b, 0x6b, 0x79, 0x49, 0x6b, 0x6e, 0x53, 0x30, 0x70, 0x77, 0x32, 0x65, 0x4d, 0x72, + 0x6c, 0x38, 0x77, 0x62, 0x5a, 0x6c, 0x76, 0x30, 0x69, 0x77, 0x48, 0x73, 0x6b, 0x76, 0x53, 0x52, 0x37, 0x4d, + 0x79, 0x5a, 0x4c, 0x57, 0x69, 0x5a, 0x70, 0x72, 0x61, 0x52, 0x6e, 0x4a, 0x50, 0x31, 0x4d, 0x4e, 0x68, 0x79, + 0x33, 0x5c, 0x0a, + 0x09, 0x46, 0x6c, 0x51, 0x38, 0x56, 0x64, 0x4a, 0x62, 0x37, 0x76, 0x68, 0x4c, 0x6b, 0x6c, 0x5a, 0x4a, 0x2b, + 0x70, 0x54, 0x73, 0x62, 0x65, 0x6d, 0x72, 0x63, 0x7a, 0x4e, 0x6c, 0x51, 0x37, 0x41, 0x6b, 0x66, 0x56, 0x66, + 0x53, 0x32, 0x41, 0x79, 0x64, 0x70, 0x4d, 0x4e, 0x76, 0x63, 0x7a, 0x38, 0x54, 0x76, 0x44, 0x2b, 0x6e, 0x7a, + 0x75, 0x38, 0x45, 0x4f, 0x6e, 0x39, 0x4a, 0x79, 0x56, 0x34, 0x49, 0x5a, 0x41, 0x64, 0x79, 0x37, 0x48, 0x30, + 0x6f, 0x5c, 0x0a, + 0x09, 0x30, 0x45, 0x6c, 0x2f, 0x52, 0x73, 0x4c, 0x4f, 0x75, 0x6c, 0x33, 0x53, 0x52, 0x46, 0x57, 0x6a, 0x52, + 0x39, 0x4c, 0x7a, 0x33, 0x6e, 0x34, 0x72, 0x4a, 0x4b, 0x32, 0x57, 0x39, 0x4a, 0x72, 0x4c, 0x33, 0x6e, 0x54, + 0x2f, 0x73, 0x33, 0x7a, 0x2b, 0x75, 0x6d, 0x7a, 0x45, 0x2b, 0x6d, 0x41, 0x2f, 0x32, 0x6d, 0x37, 0x51, 0x42, + 0x47, 0x68, 0x33, 0x78, 0x37, 0x5a, 0x4c, 0x32, 0x71, 0x31, 0x73, 0x2f, 0x45, 0x33, 0x53, 0x47, 0x54, 0x6e, + 0x6c, 0x5c, 0x0a, + 0x09, 0x46, 0x2b, 0x65, 0x55, 0x32, 0x53, 0x4c, 0x70, 0x67, 0x6a, 0x34, 0x36, 0x64, 0x36, 0x75, 0x58, 0x65, + 0x55, 0x35, 0x53, 0x55, 0x34, 0x37, 0x4f, 0x61, 0x74, 0x64, 0x35, 0x53, 0x74, 0x4a, 0x70, 0x67, 0x5a, 0x33, + 0x6a, 0x4d, 0x33, 0x54, 0x48, 0x71, 0x50, 0x4b, 0x32, 0x4a, 0x5a, 0x67, 0x66, 0x79, 0x4f, 0x38, 0x4f, 0x38, + 0x6a, 0x66, 0x6e, 0x32, 0x47, 0x73, 0x50, 0x64, 0x4d, 0x37, 0x4b, 0x6b, 0x46, 0x38, 0x58, 0x2b, 0x48, 0x78, + 0x69, 0x5c, 0x0a, + 0x09, 0x6f, 0x4e, 0x75, 0x74, 0x66, 0x4c, 0x77, 0x73, 0x47, 0x39, 0x57, 0x4b, 0x32, 0x71, 0x4b, 0x6c, 0x68, + 0x6e, 0x7a, 0x41, 0x56, 0x39, 0x34, 0x30, 0x4d, 0x46, 0x6d, 0x43, 0x54, 0x4b, 0x4c, 0x67, 0x62, 0x6d, 0x77, + 0x61, 0x38, 0x31, 0x66, 0x67, 0x5a, 0x4f, 0x42, 0x61, 0x34, 0x43, 0x78, 0x67, 0x50, 0x58, 0x41, 0x4f, 0x6c, + 0x66, 0x6b, 0x71, 0x77, 0x43, 0x4c, 0x67, 0x70, 0x38, 0x48, 0x39, 0x49, 0x31, 0x68, 0x6b, 0x76, 0x42, 0x51, + 0x34, 0x5c, 0x0a, + 0x09, 0x45, 0x39, 0x67, 0x41, 0x58, 0x41, 0x6e, 0x63, 0x58, 0x79, 0x4d, 0x2b, 0x62, 0x66, 0x4e, 0x30, 0x4d, + 0x78, 0x5a, 0x6c, 0x5a, 0x32, 0x47, 0x2f, 0x70, 0x78, 0x33, 0x59, 0x71, 0x6c, 0x6b, 0x50, 0x46, 0x76, 0x48, + 0x50, 0x41, 0x64, 0x61, 0x6b, 0x64, 0x4b, 0x2f, 0x78, 0x4f, 0x74, 0x2f, 0x79, 0x35, 0x35, 0x67, 0x48, 0x33, + 0x4f, 0x4c, 0x2b, 0x41, 0x6a, 0x77, 0x47, 0x66, 0x4d, 0x46, 0x2f, 0x37, 0x79, 0x45, 0x62, 0x34, 0x34, 0x50, + 0x66, 0x5c, 0x0a, + 0x09, 0x6b, 0x7a, 0x4c, 0x6b, 0x47, 0x7a, 0x77, 0x39, 0x47, 0x7a, 0x6a, 0x6f, 0x74, 0x73, 0x59, 0x44, 0x56, + 0x32, 0x41, 0x7a, 0x6a, 0x54, 0x4f, 0x42, 0x6b, 0x37, 0x41, 0x70, 0x35, 0x6b, 0x48, 0x67, 0x65, 0x61, 0x41, + 0x54, 0x4f, 0x4a, 0x52, 0x6a, 0x4c, 0x30, 0x46, 0x50, 0x44, 0x66, 0x6e, 0x41, 0x6b, 0x63, 0x4f, 0x4d, 0x59, + 0x77, 0x4f, 0x47, 0x48, 0x70, 0x44, 0x30, 0x67, 0x5a, 0x52, 0x38, 0x73, 0x69, 0x7a, 0x36, 0x6c, 0x71, 0x54, + 0x37, 0x5c, 0x0a, + 0x09, 0x55, 0x2b, 0x57, 0x53, 0x59, 0x4f, 0x68, 0x5a, 0x53, 0x54, 0x4d, 0x43, 0x32, 0x53, 0x6d, 0x71, 0x44, + 0x4e, 0x6e, 0x64, 0x71, 0x68, 0x33, 0x55, 0x58, 0x4f, 0x2b, 0x36, 0x75, 0x79, 0x56, 0x4e, 0x79, 0x4e, 0x46, + 0x5a, 0x45, 0x2f, 0x69, 0x35, 0x55, 0x4e, 0x4c, 0x6a, 0x67, 0x65, 0x33, 0x52, 0x67, 0x64, 0x34, 0x73, 0x56, + 0x61, 0x4c, 0x70, 0x4f, 0x31, 0x77, 0x33, 0x77, 0x52, 0x57, 0x75, 0x63, 0x34, 0x79, 0x6b, 0x2f, 0x5a, 0x36, + 0x33, 0x5c, 0x0a, + 0x09, 0x4d, 0x63, 0x66, 0x65, 0x37, 0x4b, 0x44, 0x63, 0x68, 0x52, 0x6e, 0x79, 0x46, 0x74, 0x6c, 0x77, 0x4c, + 0x55, 0x6e, 0x6e, 0x53, 0x76, 0x71, 0x35, 0x2f, 0x31, 0x35, 0x54, 0x34, 0x31, 0x6d, 0x48, 0x37, 0x63, 0x6f, + 0x54, 0x6a, 0x41, 0x34, 0x65, 0x39, 0x4a, 0x34, 0x63, 0x6e, 0x66, 0x6b, 0x75, 0x44, 0x34, 0x4f, 0x65, 0x70, + 0x5a, 0x36, 0x33, 0x56, 0x39, 0x6e, 0x44, 0x63, 0x4a, 0x73, 0x71, 0x45, 0x66, 0x32, 0x33, 0x61, 0x6a, 0x6a, + 0x58, 0x5c, 0x0a, + 0x09, 0x4a, 0x6d, 0x6d, 0x66, 0x36, 0x7a, 0x36, 0x6d, 0x33, 0x74, 0x2f, 0x6b, 0x4e, 0x6c, 0x56, 0x50, 0x77, + 0x57, 0x36, 0x58, 0x64, 0x46, 0x37, 0x51, 0x41, 0x62, 0x2b, 0x54, 0x39, 0x41, 0x6c, 0x4a, 0x4e, 0x30, 0x72, + 0x36, 0x72, 0x2b, 0x64, 0x74, 0x56, 0x34, 0x56, 0x4d, 0x53, 0x65, 0x64, 0x30, 0x71, 0x52, 0x4a, 0x67, 0x72, + 0x66, 0x53, 0x38, 0x58, 0x54, 0x6b, 0x2b, 0x6e, 0x52, 0x48, 0x59, 0x4f, 0x7a, 0x56, 0x48, 0x4a, 0x2f, 0x6c, + 0x6b, 0x5c, 0x0a, + 0x09, 0x4c, 0x70, 0x4b, 0x30, 0x49, 0x4e, 0x44, 0x2f, 0x61, 0x6f, 0x33, 0x6e, 0x6e, 0x61, 0x6a, 0x73, 0x4f, + 0x4b, 0x42, 0x46, 0x30, 0x6a, 0x63, 0x6c, 0x58, 0x56, 0x6d, 0x6a, 0x2f, 0x4a, 0x41, 0x53, 0x6f, 0x44, 0x6c, + 0x77, 0x2f, 0x4f, 0x4d, 0x46, 0x46, 0x57, 0x78, 0x77, 0x6e, 0x54, 0x76, 0x39, 0x50, 0x76, 0x6d, 0x4f, 0x66, + 0x72, 0x2b, 0x67, 0x7a, 0x4e, 0x64, 0x63, 0x5a, 0x32, 0x30, 0x66, 0x48, 0x50, 0x78, 0x63, 0x34, 0x4d, 0x63, + 0x6d, 0x5c, 0x0a, + 0x09, 0x53, 0x5a, 0x2b, 0x56, 0x64, 0x65, 0x44, 0x4a, 0x73, 0x76, 0x6c, 0x38, 0x69, 0x48, 0x56, 0x65, 0x35, + 0x6a, 0x70, 0x56, 0x53, 0x42, 0x44, 0x69, 0x46, 0x56, 0x56, 0x2f, 0x74, 0x39, 0x74, 0x55, 0x47, 0x63, 0x57, + 0x36, 0x5a, 0x42, 0x48, 0x35, 0x52, 0x2f, 0x33, 0x2b, 0x7a, 0x59, 0x4a, 0x32, 0x57, 0x53, 0x58, 0x70, 0x4a, + 0x38, 0x71, 0x50, 0x53, 0x2f, 0x37, 0x73, 0x64, 0x58, 0x7a, 0x53, 0x37, 0x33, 0x38, 0x55, 0x2b, 0x4c, 0x42, + 0x4b, 0x5c, 0x0a, + 0x09, 0x6c, 0x5a, 0x63, 0x6c, 0x4a, 0x4e, 0x55, 0x79, 0x74, 0x39, 0x6d, 0x74, 0x33, 0x6e, 0x48, 0x56, 0x58, + 0x43, 0x39, 0x37, 0x71, 0x4d, 0x44, 0x6d, 0x6b, 0x42, 0x4f, 0x41, 0x77, 0x4f, 0x6e, 0x5a, 0x42, 0x54, 0x6f, + 0x33, 0x75, 0x4d, 0x34, 0x6d, 0x76, 0x31, 0x2f, 0x68, 0x39, 0x30, 0x56, 0x76, 0x39, 0x32, 0x32, 0x75, 0x38, + 0x33, 0x67, 0x66, 0x6e, 0x62, 0x78, 0x4b, 0x31, 0x57, 0x39, 0x36, 0x47, 0x73, 0x6c, 0x63, 0x75, 0x79, 0x73, + 0x6f, 0x5c, 0x0a, + 0x09, 0x30, 0x79, 0x45, 0x4c, 0x45, 0x4c, 0x65, 0x35, 0x62, 0x39, 0x2b, 0x57, 0x39, 0x4f, 0x36, 0x4d, 0x75, + 0x71, 0x64, 0x4a, 0x2b, 0x70, 0x4d, 0x73, 0x36, 0x42, 0x76, 0x6e, 0x65, 0x55, 0x74, 0x6b, 0x52, 0x42, 0x68, + 0x6f, 0x6f, 0x38, 0x36, 0x53, 0x66, 0x56, 0x61, 0x53, 0x47, 0x63, 0x38, 0x59, 0x53, 0x59, 0x2b, 0x6b, 0x66, + 0x4e, 0x34, 0x75, 0x43, 0x78, 0x52, 0x33, 0x70, 0x76, 0x4a, 0x66, 0x6c, 0x44, 0x51, 0x6c, 0x56, 0x56, 0x2b, + 0x72, 0x5c, 0x0a, + 0x09, 0x70, 0x41, 0x64, 0x6c, 0x6e, 0x36, 0x56, 0x68, 0x49, 0x55, 0x42, 0x52, 0x59, 0x35, 0x77, 0x64, 0x36, + 0x4a, 0x30, 0x67, 0x47, 0x36, 0x6f, 0x6b, 0x36, 0x52, 0x63, 0x35, 0x2b, 0x6a, 0x4e, 0x55, 0x47, 0x59, 0x35, + 0x76, 0x37, 0x49, 0x65, 0x6a, 0x37, 0x54, 0x4a, 0x79, 0x68, 0x61, 0x75, 0x41, 0x6d, 0x32, 0x56, 0x44, 0x66, + 0x42, 0x69, 0x76, 0x6e, 0x44, 0x54, 0x55, 0x44, 0x54, 0x52, 0x45, 0x56, 0x35, 0x4f, 0x6b, 0x61, 0x79, 0x54, + 0x39, 0x5c, 0x0a, + 0x09, 0x51, 0x37, 0x31, 0x78, 0x52, 0x4e, 0x4c, 0x76, 0x4a, 0x56, 0x32, 0x72, 0x36, 0x72, 0x6a, 0x6c, 0x71, + 0x46, 0x78, 0x46, 0x65, 0x77, 0x45, 0x39, 0x32, 0x4c, 0x72, 0x37, 0x45, 0x71, 0x71, 0x6a, 0x2b, 0x68, 0x41, + 0x74, 0x32, 0x50, 0x70, 0x30, 0x43, 0x37, 0x59, 0x75, 0x50, 0x67, 0x72, 0x34, 0x44, 0x52, 0x61, 0x31, 0x58, + 0x77, 0x7a, 0x38, 0x32, 0x76, 0x58, 0x47, 0x41, 0x6c, 0x63, 0x44, 0x79, 0x37, 0x43, 0x39, 0x37, 0x52, 0x65, + 0x77, 0x5c, 0x0a, + 0x09, 0x55, 0x79, 0x37, 0x39, 0x58, 0x64, 0x74, 0x75, 0x78, 0x74, 0x62, 0x32, 0x44, 0x31, 0x49, 0x64, 0x71, + 0x65, 0x38, 0x44, 0x6a, 0x6e, 0x4d, 0x66, 0x30, 0x76, 0x73, 0x43, 0x6a, 0x59, 0x59, 0x5a, 0x32, 0x4f, 0x78, + 0x71, 0x41, 0x76, 0x59, 0x4d, 0x57, 0x34, 0x48, 0x58, 0x68, 0x73, 0x75, 0x5a, 0x6f, 0x74, 0x33, 0x41, 0x54, + 0x6d, 0x78, 0x36, 0x31, 0x56, 0x61, 0x67, 0x30, 0x34, 0x4d, 0x39, 0x78, 0x42, 0x52, 0x73, 0x65, 0x76, 0x4d, + 0x41, 0x5c, 0x0a, + 0x09, 0x38, 0x41, 0x54, 0x77, 0x4d, 0x57, 0x41, 0x74, 0x73, 0x4d, 0x35, 0x74, 0x7a, 0x4d, 0x4d, 0x32, 0x4d, + 0x38, 0x42, 0x32, 0x33, 0x53, 0x35, 0x6c, 0x59, 0x42, 0x73, 0x62, 0x52, 0x37, 0x78, 0x38, 0x47, 0x67, 0x6b, + 0x42, 0x69, 0x6e, 0x78, 0x74, 0x46, 0x47, 0x7a, 0x7a, 0x71, 0x79, 0x46, 0x51, 0x64, 0x43, 0x43, 0x6b, 0x30, + 0x39, 0x50, 0x4a, 0x4e, 0x65, 0x70, 0x49, 0x31, 0x67, 0x41, 0x6d, 0x65, 0x72, 0x6f, 0x45, 0x6d, 0x31, 0x4f, + 0x33, 0x5c, 0x0a, + 0x09, 0x41, 0x4a, 0x64, 0x67, 0x57, 0x36, 0x72, 0x6a, 0x73, 0x4c, 0x6e, 0x75, 0x66, 0x64, 0x6a, 0x57, 0x61, + 0x48, 0x38, 0x61, 0x34, 0x48, 0x7a, 0x67, 0x4c, 0x75, 0x44, 0x34, 0x41, 0x70, 0x32, 0x45, 0x58, 0x4c, 0x58, + 0x6d, 0x30, 0x78, 0x45, 0x70, 0x46, 0x49, 0x30, 0x41, 0x7a, 0x32, 0x42, 0x62, 0x6e, 0x30, 0x58, 0x37, 0x33, + 0x47, 0x42, 0x76, 0x66, 0x52, 0x65, 0x32, 0x4b, 0x41, 0x53, 0x32, 0x69, 0x48, 0x51, 0x35, 0x63, 0x43, 0x35, + 0x77, 0x5c, 0x0a, + 0x09, 0x41, 0x64, 0x59, 0x35, 0x4c, 0x77, 0x4b, 0x2f, 0x6f, 0x6e, 0x72, 0x42, 0x71, 0x4b, 0x2b, 0x34, 0x41, + 0x37, 0x67, 0x49, 0x32, 0x38, 0x70, 0x64, 0x6e, 0x69, 0x45, 0x66, 0x52, 0x2b, 0x58, 0x49, 0x56, 0x4e, 0x34, + 0x43, 0x54, 0x6b, 0x51, 0x4f, 0x69, 0x6d, 0x4b, 0x41, 0x56, 0x75, 0x78, 0x74, 0x33, 0x55, 0x6a, 0x2b, 0x53, + 0x74, 0x7a, 0x52, 0x77, 0x48, 0x4c, 0x67, 0x5a, 0x75, 0x7a, 0x62, 0x50, 0x6a, 0x39, 0x44, 0x76, 0x67, 0x41, + 0x6a, 0x5c, 0x0a, + 0x09, 0x31, 0x39, 0x76, 0x41, 0x75, 0x36, 0x6a, 0x48, 0x6e, 0x76, 0x6b, 0x37, 0x47, 0x45, 0x57, 0x66, 0x67, + 0x45, 0x50, 0x59, 0x53, 0x5a, 0x6e, 0x68, 0x50, 0x6a, 0x47, 0x79, 0x79, 0x74, 0x4d, 0x4f, 0x62, 0x4e, 0x6b, + 0x35, 0x6a, 0x61, 0x73, 0x39, 0x58, 0x55, 0x2f, 0x73, 0x2f, 0x48, 0x35, 0x6a, 0x4a, 0x42, 0x77, 0x4b, 0x2f, + 0x53, 0x4e, 0x32, 0x48, 0x41, 0x76, 0x67, 0x62, 0x6d, 0x77, 0x64, 0x50, 0x55, 0x45, 0x48, 0x46, 0x6e, 0x4d, + 0x41, 0x5c, 0x0a, + 0x09, 0x66, 0x4f, 0x39, 0x6f, 0x4f, 0x76, 0x56, 0x4f, 0x77, 0x55, 0x67, 0x35, 0x45, 0x6e, 0x59, 0x4f, 0x46, + 0x70, 0x4f, 0x30, 0x59, 0x6d, 0x2f, 0x36, 0x76, 0x64, 0x68, 0x52, 0x72, 0x6c, 0x75, 0x78, 0x36, 0x48, 0x38, + 0x39, 0x39, 0x69, 0x6d, 0x49, 0x36, 0x43, 0x64, 0x47, 0x43, 0x67, 0x48, 0x41, 0x64, 0x68, 0x42, 0x58, 0x30, + 0x76, 0x74, 0x2f, 0x63, 0x6c, 0x75, 0x77, 0x77, 0x35, 0x78, 0x37, 0x65, 0x35, 0x57, 0x49, 0x71, 0x49, 0x6d, + 0x52, 0x5c, 0x0a, + 0x09, 0x52, 0x41, 0x43, 0x77, 0x6b, 0x65, 0x42, 0x6d, 0x62, 0x4c, 0x36, 0x2f, 0x42, 0x54, 0x76, 0x67, 0x75, + 0x59, 0x34, 0x34, 0x2f, 0x52, 0x73, 0x77, 0x52, 0x68, 0x6f, 0x42, 0x49, 0x6f, 0x59, 0x59, 0x49, 0x79, 0x45, + 0x49, 0x6a, 0x4b, 0x67, 0x6a, 0x49, 0x67, 0x46, 0x4b, 0x6a, 0x6b, 0x69, 0x41, 0x6b, 0x69, 0x4d, 0x53, 0x6f, + 0x4f, 0x53, 0x49, 0x42, 0x43, 0x67, 0x35, 0x49, 0x67, 0x46, 0x4b, 0x6a, 0x6b, 0x69, 0x41, 0x6b, 0x69, 0x4d, + 0x53, 0x5c, 0x0a, + 0x09, 0x6f, 0x4f, 0x53, 0x49, 0x42, 0x43, 0x67, 0x35, 0x49, 0x67, 0x46, 0x4b, 0x6a, 0x6b, 0x69, 0x41, 0x6b, + 0x69, 0x4d, 0x53, 0x6f, 0x4f, 0x53, 0x49, 0x42, 0x43, 0x67, 0x35, 0x49, 0x67, 0x46, 0x4b, 0x6a, 0x6b, 0x69, + 0x41, 0x6b, 0x69, 0x4d, 0x53, 0x6f, 0x4f, 0x53, 0x49, 0x42, 0x43, 0x67, 0x35, 0x49, 0x67, 0x46, 0x4b, 0x6a, + 0x6b, 0x69, 0x41, 0x6b, 0x69, 0x4d, 0x53, 0x6f, 0x4f, 0x53, 0x49, 0x42, 0x43, 0x67, 0x35, 0x49, 0x67, 0x46, + 0x4b, 0x5c, 0x0a, + 0x09, 0x6a, 0x6b, 0x69, 0x41, 0x6b, 0x69, 0x4d, 0x53, 0x6f, 0x4f, 0x53, 0x49, 0x42, 0x43, 0x67, 0x35, 0x49, + 0x67, 0x46, 0x4b, 0x6a, 0x6b, 0x69, 0x41, 0x6b, 0x69, 0x4d, 0x53, 0x6f, 0x4f, 0x53, 0x49, 0x42, 0x43, 0x67, + 0x35, 0x49, 0x67, 0x46, 0x4b, 0x6a, 0x76, 0x38, 0x44, 0x2f, 0x7a, 0x63, 0x46, 0x56, 0x65, 0x67, 0x2b, 0x6a, + 0x62, 0x55, 0x41, 0x41, 0x41, 0x41, 0x41, 0x53, 0x55, 0x56, 0x4f, 0x52, 0x4b, 0x35, 0x43, 0x59, 0x49, 0x49, + 0x3d, 0x5c, 0x0a, + 0x09, 0x22, 0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x6f, + 0x61, 0x64, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x2c, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x29, 0x0a, + 0x09, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, + 0x68, 0x69, 0x63, 0x73, 0x2e, 0x6e, 0x65, 0x77, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x28, 0x6c, 0x6f, 0x76, 0x65, + 0x2e, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2e, 0x6e, 0x65, 0x77, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x44, 0x61, 0x74, + 0x61, 0x28, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x2e, + 0x6e, 0x65, 0x77, 0x46, 0x69, 0x6c, 0x65, 0x44, 0x61, 0x74, 0x61, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x2c, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3a, 0x67, 0x73, 0x75, 0x62, 0x28, 0x22, 0x5f, 0x22, 0x2c, 0x20, 0x22, 0x2e, 0x22, + 0x29, 0x2c, 0x20, 0x22, 0x62, 0x61, 0x73, 0x65, 0x36, 0x34, 0x22, 0x29, 0x29, 0x29, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x3d, + 0x20, 0x7b, 0x7d, 0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x20, + 0x3d, 0x20, 0x7b, 0x7d, 0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x75, 0x62, 0x62, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x65, 0x78, 0x74, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x61, 0x69, 0x6e, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x67, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x30, 0x0a, + 0x09, 0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x72, 0x61, 0x69, 0x6e, 0x0a, + 0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x6c, 0x6f, 0x61, + 0x64, 0x28, 0x29, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x73, 0x65, + 0x74, 0x42, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x31, + 0x33, 0x37, 0x2c, 0x20, 0x31, 0x39, 0x34, 0x2c, 0x20, 0x32, 0x31, 0x38, 0x29, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x77, 0x69, 0x6e, 0x5f, 0x77, 0x20, 0x3d, 0x20, 0x6c, 0x6f, + 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x67, 0x65, 0x74, 0x57, 0x69, 0x64, + 0x74, 0x68, 0x28, 0x29, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x77, 0x69, 0x6e, 0x5f, 0x68, 0x20, 0x3d, 0x20, 0x6c, 0x6f, + 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x67, 0x65, 0x74, 0x48, 0x65, 0x69, + 0x67, 0x68, 0x74, 0x28, 0x29, 0x0a, + 0x09, 0x09, 0x69, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x20, + 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x28, 0x69, 0x6e, 0x73, 0x70, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x5f, 0x70, 0x6e, 0x67, 0x2c, 0x20, 0x22, 0x69, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x2e, 0x70, 0x6e, 0x67, 0x22, 0x29, 0x0a, + 0x09, 0x09, 0x69, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x69, 0x6d, 0x67, 0x5f, 0x77, 0x20, + 0x3d, 0x20, 0x69, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x3a, + 0x67, 0x65, 0x74, 0x57, 0x69, 0x64, 0x74, 0x68, 0x28, 0x29, 0x0a, + 0x09, 0x09, 0x69, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x69, 0x6d, 0x67, 0x5f, 0x68, 0x20, + 0x3d, 0x20, 0x69, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x3a, + 0x67, 0x65, 0x74, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x28, 0x29, 0x0a, + 0x09, 0x09, 0x69, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x77, 0x69, + 0x6e, 0x5f, 0x77, 0x20, 0x2a, 0x20, 0x30, 0x2e, 0x34, 0x35, 0x0a, + 0x09, 0x09, 0x69, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x77, 0x69, + 0x6e, 0x5f, 0x68, 0x20, 0x2a, 0x20, 0x30, 0x2e, 0x35, 0x35, 0x0a, + 0x09, 0x09, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x69, 0x6d, 0x61, 0x67, 0x65, + 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x28, 0x62, 0x61, 0x63, 0x6b, 0x67, + 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x70, 0x6e, 0x67, 0x2c, 0x20, 0x22, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, + 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x70, 0x6e, 0x67, 0x22, 0x29, 0x0a, + 0x09, 0x09, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x69, 0x6d, 0x67, 0x5f, 0x77, + 0x20, 0x3d, 0x20, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x69, 0x6d, 0x61, 0x67, + 0x65, 0x3a, 0x67, 0x65, 0x74, 0x57, 0x69, 0x64, 0x74, 0x68, 0x28, 0x29, 0x0a, + 0x09, 0x09, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x69, 0x6d, 0x67, 0x5f, 0x68, + 0x20, 0x3d, 0x20, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x69, 0x6d, 0x61, 0x67, + 0x65, 0x3a, 0x67, 0x65, 0x74, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x28, 0x29, 0x0a, + 0x09, 0x09, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x30, 0x0a, + 0x09, 0x09, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x30, 0x0a, + 0x09, 0x09, 0x62, 0x75, 0x62, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x20, 0x3d, 0x20, 0x6c, + 0x6f, 0x61, 0x64, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x28, 0x62, 0x75, 0x62, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x6e, + 0x67, 0x2c, 0x20, 0x22, 0x62, 0x75, 0x62, 0x62, 0x6c, 0x65, 0x2e, 0x70, 0x6e, 0x67, 0x22, 0x29, 0x0a, + 0x09, 0x09, 0x62, 0x75, 0x62, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6d, 0x67, 0x5f, 0x77, 0x20, 0x3d, 0x20, 0x62, + 0x75, 0x62, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x3a, 0x67, 0x65, 0x74, 0x57, 0x69, 0x64, + 0x74, 0x68, 0x28, 0x29, 0x0a, + 0x09, 0x09, 0x62, 0x75, 0x62, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6d, 0x67, 0x5f, 0x68, 0x20, 0x3d, 0x20, 0x62, + 0x75, 0x62, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x3a, 0x67, 0x65, 0x74, 0x48, 0x65, 0x69, + 0x67, 0x68, 0x74, 0x28, 0x29, 0x0a, + 0x09, 0x09, 0x62, 0x75, 0x62, 0x62, 0x6c, 0x65, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x31, 0x34, 0x30, 0x0a, + 0x09, 0x09, 0x62, 0x75, 0x62, 0x62, 0x6c, 0x65, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x2d, 0x38, 0x30, 0x0a, + 0x09, 0x09, 0x74, 0x65, 0x78, 0x74, 0x2e, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, + 0x64, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x28, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x6e, 0x67, 0x2c, 0x20, 0x22, + 0x74, 0x65, 0x78, 0x74, 0x2e, 0x70, 0x6e, 0x67, 0x22, 0x29, 0x0a, + 0x09, 0x09, 0x74, 0x65, 0x78, 0x74, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x32, 0x35, 0x0a, + 0x09, 0x09, 0x74, 0x65, 0x78, 0x74, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x39, 0x0a, + 0x09, 0x09, 0x2d, 0x2d, 0x20, 0x42, 0x61, 0x62, 0x79, 0x20, 0x52, 0x61, 0x69, 0x6e, 0x0a, + 0x09, 0x09, 0x72, 0x61, 0x69, 0x6e, 0x2e, 0x73, 0x70, 0x61, 0x63, 0x69, 0x6e, 0x67, 0x5f, 0x78, 0x20, 0x3d, + 0x20, 0x31, 0x31, 0x30, 0x0a, + 0x09, 0x09, 0x72, 0x61, 0x69, 0x6e, 0x2e, 0x73, 0x70, 0x61, 0x63, 0x69, 0x6e, 0x67, 0x5f, 0x79, 0x20, 0x3d, + 0x20, 0x38, 0x30, 0x0a, + 0x09, 0x09, 0x72, 0x61, 0x69, 0x6e, 0x2e, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, + 0x64, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x28, 0x62, 0x61, 0x62, 0x79, 0x5f, 0x70, 0x6e, 0x67, 0x2c, 0x20, 0x22, + 0x62, 0x61, 0x62, 0x79, 0x2e, 0x70, 0x6e, 0x67, 0x22, 0x29, 0x0a, + 0x09, 0x09, 0x72, 0x61, 0x69, 0x6e, 0x2e, 0x69, 0x6d, 0x67, 0x5f, 0x77, 0x20, 0x3d, 0x20, 0x72, 0x61, 0x69, + 0x6e, 0x2e, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x3a, 0x67, 0x65, 0x74, 0x57, 0x69, 0x64, 0x74, 0x68, 0x28, 0x29, 0x0a, + 0x09, 0x09, 0x72, 0x61, 0x69, 0x6e, 0x2e, 0x69, 0x6d, 0x67, 0x5f, 0x68, 0x20, 0x3d, 0x20, 0x72, 0x61, 0x69, + 0x6e, 0x2e, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x3a, 0x67, 0x65, 0x74, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x28, + 0x29, 0x0a, + 0x09, 0x09, 0x72, 0x61, 0x69, 0x6e, 0x2e, 0x6f, 0x78, 0x20, 0x3d, 0x20, 0x2d, 0x72, 0x61, 0x69, 0x6e, 0x2e, + 0x69, 0x6d, 0x67, 0x5f, 0x77, 0x20, 0x2f, 0x20, 0x32, 0x0a, + 0x09, 0x09, 0x72, 0x61, 0x69, 0x6e, 0x2e, 0x6f, 0x79, 0x20, 0x3d, 0x20, 0x2d, 0x72, 0x61, 0x69, 0x6e, 0x2e, + 0x69, 0x6d, 0x67, 0x5f, 0x68, 0x20, 0x2f, 0x20, 0x32, 0x0a, + 0x09, 0x09, 0x72, 0x61, 0x69, 0x6e, 0x2e, 0x62, 0x61, 0x74, 0x63, 0x68, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x76, + 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x6e, 0x65, 0x77, 0x53, 0x70, 0x72, 0x69, + 0x74, 0x65, 0x42, 0x61, 0x74, 0x63, 0x68, 0x28, 0x72, 0x61, 0x69, 0x6e, 0x2e, 0x69, 0x6d, 0x61, 0x67, 0x65, + 0x2c, 0x20, 0x35, 0x31, 0x32, 0x29, 0x0a, + 0x09, 0x09, 0x72, 0x61, 0x69, 0x6e, 0x2e, 0x74, 0x20, 0x3d, 0x20, 0x30, 0x0a, + 0x09, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x72, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x0a, + 0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x72, + 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x61, 0x74, 0x63, 0x68, 0x20, 0x3d, 0x20, 0x72, 0x61, + 0x69, 0x6e, 0x2e, 0x62, 0x61, 0x74, 0x63, 0x68, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x78, 0x20, 0x3d, 0x20, 0x72, 0x61, 0x69, 0x6e, 0x2e, + 0x73, 0x70, 0x61, 0x63, 0x69, 0x6e, 0x67, 0x5f, 0x78, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x79, 0x20, 0x3d, 0x20, 0x72, 0x61, 0x69, 0x6e, 0x2e, + 0x73, 0x70, 0x61, 0x63, 0x69, 0x6e, 0x67, 0x5f, 0x79, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x78, 0x20, 0x3d, 0x20, 0x72, 0x61, 0x69, 0x6e, 0x2e, + 0x6f, 0x78, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x79, 0x20, 0x3d, 0x20, 0x72, 0x61, 0x69, 0x6e, 0x2e, + 0x6f, 0x79, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x20, 0x3d, 0x20, 0x31, 0x20, 0x2f, 0x20, 0x6c, 0x6f, + 0x76, 0x65, 0x2e, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x67, 0x65, 0x74, 0x50, 0x69, 0x78, 0x65, 0x6c, + 0x53, 0x63, 0x61, 0x6c, 0x65, 0x28, 0x29, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x77, 0x20, 0x3d, 0x20, + 0x32, 0x20, 0x2a, 0x20, 0x6d, 0x61, 0x74, 0x68, 0x2e, 0x63, 0x65, 0x69, 0x6c, 0x28, 0x6d, 0x20, 0x2a, 0x20, + 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x67, 0x65, 0x74, 0x57, + 0x69, 0x64, 0x74, 0x68, 0x28, 0x29, 0x20, 0x2f, 0x20, 0x73, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x32, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x68, 0x20, 0x3d, 0x20, + 0x32, 0x20, 0x2a, 0x20, 0x6d, 0x61, 0x74, 0x68, 0x2e, 0x63, 0x65, 0x69, 0x6c, 0x28, 0x6d, 0x20, 0x2a, 0x20, + 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x67, 0x65, 0x74, 0x48, + 0x65, 0x69, 0x67, 0x68, 0x74, 0x28, 0x29, 0x20, 0x2f, 0x20, 0x73, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x32, 0x0a, + 0x09, 0x09, 0x62, 0x61, 0x74, 0x63, 0x68, 0x3a, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x28, 0x29, 0x0a, + 0x09, 0x09, 0x69, 0x66, 0x20, 0x62, 0x61, 0x74, 0x63, 0x68, 0x3a, 0x67, 0x65, 0x74, 0x42, 0x75, 0x66, 0x66, + 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x28, 0x29, 0x20, 0x3c, 0x20, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x77, + 0x20, 0x2a, 0x20, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x68, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x09, 0x09, 0x09, 0x62, 0x61, 0x74, 0x63, 0x68, 0x3a, 0x73, 0x65, 0x74, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, + 0x53, 0x69, 0x7a, 0x65, 0x28, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x77, 0x20, 0x2a, 0x20, 0x62, 0x61, 0x74, + 0x63, 0x68, 0x5f, 0x68, 0x29, 0x0a, + 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x09, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x30, 0x2c, 0x20, 0x62, 0x61, 0x74, 0x63, 0x68, + 0x5f, 0x68, 0x20, 0x2d, 0x20, 0x31, 0x20, 0x64, 0x6f, 0x0a, + 0x09, 0x09, 0x09, 0x66, 0x6f, 0x72, 0x20, 0x6a, 0x20, 0x3d, 0x20, 0x30, 0x2c, 0x20, 0x62, 0x61, 0x74, 0x63, + 0x68, 0x5f, 0x77, 0x20, 0x2d, 0x20, 0x31, 0x20, 0x64, 0x6f, 0x0a, + 0x09, 0x09, 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x73, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x20, + 0x3d, 0x20, 0x28, 0x6a, 0x20, 0x25, 0x20, 0x32, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x0a, + 0x09, 0x09, 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x5f, 0x79, + 0x20, 0x3d, 0x20, 0x69, 0x73, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x30, 0x20, 0x6f, + 0x72, 0x20, 0x73, 0x79, 0x20, 0x2f, 0x20, 0x32, 0x0a, + 0x09, 0x09, 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x78, 0x20, 0x3d, 0x20, 0x6f, 0x78, 0x20, 0x2b, + 0x20, 0x6a, 0x20, 0x2a, 0x20, 0x73, 0x78, 0x0a, + 0x09, 0x09, 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x79, 0x20, 0x3d, 0x20, 0x6f, 0x79, 0x20, 0x2b, + 0x20, 0x69, 0x20, 0x2a, 0x20, 0x73, 0x79, 0x20, 0x2b, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x5f, 0x79, 0x0a, + 0x09, 0x09, 0x09, 0x09, 0x62, 0x61, 0x74, 0x63, 0x68, 0x3a, 0x61, 0x64, 0x64, 0x28, 0x78, 0x2c, 0x20, 0x79, + 0x29, 0x0a, + 0x09, 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x09, 0x62, 0x61, 0x74, 0x63, 0x68, 0x3a, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x28, 0x29, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x75, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x5f, 0x72, 0x61, 0x69, 0x6e, 0x28, 0x74, 0x29, 0x09, 0x09, 0x0a, + 0x09, 0x09, 0x72, 0x61, 0x69, 0x6e, 0x2e, 0x74, 0x20, 0x3d, 0x20, 0x74, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x72, 0x65, 0x73, + 0x69, 0x7a, 0x65, 0x28, 0x77, 0x2c, 0x20, 0x68, 0x29, 0x0a, + 0x09, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x72, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x75, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x28, 0x64, 0x74, 0x29, 0x0a, + 0x09, 0x09, 0x67, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x67, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x20, + 0x2b, 0x20, 0x64, 0x74, 0x20, 0x2f, 0x20, 0x32, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x74, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x63, 0x20, + 0x3d, 0x20, 0x6d, 0x61, 0x74, 0x68, 0x2e, 0x6d, 0x6f, 0x64, 0x66, 0x28, 0x67, 0x5f, 0x74, 0x69, 0x6d, 0x65, + 0x29, 0x0a, + 0x09, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x72, 0x61, 0x69, 0x6e, 0x28, 0x66, 0x72, 0x61, 0x63, + 0x29, 0x0a, + 0x09, 0x09, 0x69, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x6c, 0x6f, + 0x76, 0x65, 0x2e, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x66, 0x72, 0x6f, 0x6d, 0x50, 0x69, 0x78, 0x65, + 0x6c, 0x73, 0x28, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x67, + 0x65, 0x74, 0x57, 0x69, 0x64, 0x74, 0x68, 0x28, 0x29, 0x20, 0x2a, 0x20, 0x30, 0x2e, 0x34, 0x35, 0x29, 0x0a, + 0x09, 0x09, 0x69, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x6c, 0x6f, + 0x76, 0x65, 0x2e, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x66, 0x72, 0x6f, 0x6d, 0x50, 0x69, 0x78, 0x65, + 0x6c, 0x73, 0x28, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x67, + 0x65, 0x74, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x28, 0x29, 0x20, 0x2a, 0x20, 0x30, 0x2e, 0x35, 0x35, 0x29, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x72, + 0x61, 0x77, 0x5f, 0x67, 0x72, 0x69, 0x64, 0x28, 0x29, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x79, 0x20, 0x3d, 0x20, 0x72, 0x61, 0x69, 0x6e, 0x2e, 0x73, + 0x70, 0x61, 0x63, 0x69, 0x6e, 0x67, 0x5f, 0x79, 0x20, 0x2a, 0x20, 0x72, 0x61, 0x69, 0x6e, 0x2e, 0x74, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x5f, 0x79, 0x20, 0x3d, 0x20, + 0x2d, 0x72, 0x61, 0x69, 0x6e, 0x2e, 0x73, 0x70, 0x61, 0x63, 0x69, 0x6e, 0x67, 0x5f, 0x79, 0x20, 0x2b, 0x20, + 0x79, 0x20, 0x2f, 0x20, 0x32, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x69, 0x67, 0x5f, 0x79, 0x20, 0x3d, 0x20, 0x2d, 0x72, + 0x61, 0x69, 0x6e, 0x2e, 0x73, 0x70, 0x61, 0x63, 0x69, 0x6e, 0x67, 0x5f, 0x79, 0x20, 0x2b, 0x20, 0x79, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x73, 0x65, + 0x74, 0x42, 0x6c, 0x65, 0x6e, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x28, 0x22, 0x73, 0x75, 0x62, 0x74, 0x72, 0x61, + 0x63, 0x74, 0x22, 0x29, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x73, 0x65, + 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x32, 0x35, 0x35, 0x2c, 0x20, 0x32, 0x35, 0x35, 0x2c, 0x20, 0x32, + 0x35, 0x35, 0x2c, 0x20, 0x31, 0x32, 0x38, 0x29, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x64, 0x72, + 0x61, 0x77, 0x28, 0x72, 0x61, 0x69, 0x6e, 0x2e, 0x62, 0x61, 0x74, 0x63, 0x68, 0x2c, 0x20, 0x2d, 0x72, 0x61, + 0x69, 0x6e, 0x2e, 0x73, 0x70, 0x61, 0x63, 0x69, 0x6e, 0x67, 0x5f, 0x78, 0x2c, 0x20, 0x73, 0x6d, 0x61, 0x6c, + 0x6c, 0x5f, 0x79, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x35, 0x29, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x73, 0x65, + 0x74, 0x42, 0x6c, 0x65, 0x6e, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x28, 0x22, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x22, + 0x29, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x73, 0x65, + 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x32, 0x35, 0x35, 0x2c, 0x20, 0x32, 0x35, 0x35, 0x2c, 0x20, 0x32, + 0x35, 0x35, 0x2c, 0x20, 0x32, 0x35, 0x35, 0x29, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x64, 0x72, + 0x61, 0x77, 0x28, 0x72, 0x61, 0x69, 0x6e, 0x2e, 0x62, 0x61, 0x74, 0x63, 0x68, 0x2c, 0x20, 0x2d, 0x72, 0x61, + 0x69, 0x6e, 0x2e, 0x73, 0x70, 0x61, 0x63, 0x69, 0x6e, 0x67, 0x5f, 0x78, 0x2c, 0x20, 0x62, 0x69, 0x67, 0x5f, + 0x79, 0x29, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x72, + 0x61, 0x77, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x28, 0x78, 0x2c, 0x20, 0x79, 0x29, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x74, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x63, 0x20, + 0x3d, 0x20, 0x6d, 0x61, 0x74, 0x68, 0x2e, 0x6d, 0x6f, 0x64, 0x66, 0x28, 0x67, 0x5f, 0x74, 0x69, 0x6d, 0x65, + 0x29, 0x0a, + 0x09, 0x09, 0x69, 0x66, 0x20, 0x66, 0x72, 0x61, 0x63, 0x20, 0x3c, 0x20, 0x30, 0x2e, 0x35, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, + 0x09, 0x09, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x0a, + 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x78, 0x20, 0x3d, 0x20, 0x78, 0x20, 0x2b, 0x20, 0x74, + 0x65, 0x78, 0x74, 0x2e, 0x78, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x79, 0x20, 0x3d, 0x20, 0x79, 0x20, 0x2b, 0x20, 0x74, + 0x65, 0x78, 0x74, 0x2e, 0x79, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x64, 0x72, + 0x61, 0x77, 0x28, 0x74, 0x65, 0x78, 0x74, 0x2e, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x74, 0x78, 0x2c, + 0x20, 0x74, 0x79, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x37, 0x30, 0x2c, 0x20, + 0x37, 0x30, 0x29, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x72, + 0x61, 0x77, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x28, 0x78, 0x2c, 0x20, 0x79, + 0x29, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x79, 0x20, + 0x3d, 0x20, 0x28, 0x6d, 0x61, 0x74, 0x68, 0x2e, 0x73, 0x69, 0x6e, 0x28, 0x6d, 0x61, 0x74, 0x68, 0x2e, 0x70, + 0x69, 0x20, 0x2a, 0x20, 0x67, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x2a, 0x20, 0x32, 0x29, 0x20, 0x2b, 0x20, + 0x31, 0x29, 0x20, 0x2f, 0x20, 0x32, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x78, 0x20, 0x3d, 0x20, 0x78, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x79, 0x20, 0x3d, 0x20, 0x79, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x73, 0x65, + 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x32, 0x35, 0x35, 0x2c, 0x20, 0x32, 0x35, 0x35, 0x2c, 0x20, 0x32, + 0x35, 0x35, 0x2c, 0x20, 0x36, 0x34, 0x20, 0x2b, 0x20, 0x31, 0x36, 0x2a, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x73, + 0x69, 0x74, 0x79, 0x29, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x64, 0x72, + 0x61, 0x77, 0x28, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x69, 0x6d, 0x61, 0x67, + 0x65, 0x2c, 0x20, 0x62, 0x78, 0x2c, 0x20, 0x62, 0x79, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x37, 0x2c, + 0x20, 0x30, 0x2e, 0x37, 0x2c, 0x20, 0x32, 0x35, 0x36, 0x2c, 0x20, 0x32, 0x35, 0x36, 0x29, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x73, 0x65, + 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x32, 0x35, 0x35, 0x2c, 0x20, 0x32, 0x35, 0x35, 0x2c, 0x20, 0x32, + 0x35, 0x35, 0x2c, 0x20, 0x33, 0x32, 0x20, 0x2b, 0x20, 0x31, 0x36, 0x2a, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x73, + 0x69, 0x74, 0x79, 0x29, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x64, 0x72, + 0x61, 0x77, 0x28, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x69, 0x6d, 0x61, 0x67, + 0x65, 0x2c, 0x20, 0x62, 0x78, 0x2c, 0x20, 0x62, 0x79, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x36, 0x35, + 0x2c, 0x20, 0x30, 0x2e, 0x36, 0x35, 0x2c, 0x20, 0x32, 0x35, 0x36, 0x2c, 0x20, 0x32, 0x35, 0x36, 0x29, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x73, 0x65, + 0x74, 0x42, 0x6c, 0x65, 0x6e, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x28, 0x22, 0x61, 0x64, 0x64, 0x22, 0x29, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x73, 0x65, + 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x32, 0x35, 0x35, 0x2c, 0x20, 0x32, 0x35, 0x35, 0x2c, 0x20, 0x32, + 0x35, 0x35, 0x2c, 0x20, 0x31, 0x36, 0x20, 0x2b, 0x20, 0x31, 0x36, 0x2a, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x73, + 0x69, 0x74, 0x79, 0x29, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x64, 0x72, + 0x61, 0x77, 0x28, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x69, 0x6d, 0x61, 0x67, + 0x65, 0x2c, 0x20, 0x62, 0x78, 0x2c, 0x20, 0x62, 0x79, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x36, 0x2c, + 0x20, 0x30, 0x2e, 0x36, 0x2c, 0x20, 0x32, 0x35, 0x36, 0x2c, 0x20, 0x32, 0x35, 0x36, 0x29, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x72, + 0x61, 0x77, 0x5f, 0x62, 0x75, 0x62, 0x62, 0x6c, 0x65, 0x28, 0x78, 0x2c, 0x20, 0x79, 0x29, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x73, 0x63, 0x20, 0x3d, 0x20, 0x31, 0x30, 0x20, 0x2a, + 0x20, 0x6d, 0x61, 0x74, 0x68, 0x2e, 0x73, 0x69, 0x6e, 0x28, 0x6d, 0x61, 0x74, 0x68, 0x2e, 0x70, 0x69, 0x20, + 0x2a, 0x20, 0x67, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x29, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x78, 0x20, 0x3d, 0x20, 0x78, 0x20, 0x2b, 0x20, 0x62, + 0x75, 0x62, 0x62, 0x6c, 0x65, 0x2e, 0x78, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x79, 0x20, 0x3d, 0x20, 0x79, 0x20, 0x2b, 0x20, 0x62, + 0x75, 0x62, 0x62, 0x6c, 0x65, 0x2e, 0x79, 0x20, 0x2b, 0x20, 0x6f, 0x73, 0x63, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x64, 0x72, + 0x61, 0x77, 0x28, 0x62, 0x75, 0x62, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x62, + 0x78, 0x2c, 0x20, 0x62, 0x79, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x37, 0x30, + 0x2c, 0x20, 0x37, 0x30, 0x29, 0x0a, + 0x09, 0x09, 0x64, 0x72, 0x61, 0x77, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x28, 0x62, 0x78, 0x2c, 0x20, 0x62, 0x79, + 0x29, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x72, + 0x61, 0x77, 0x5f, 0x69, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x28, 0x29, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x78, 0x2c, 0x20, 0x79, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x73, + 0x70, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x78, 0x2c, 0x20, 0x69, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x2e, 0x79, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x78, 0x2c, 0x20, 0x6f, 0x79, 0x20, 0x3d, 0x20, 0x69, + 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x69, 0x6d, 0x67, 0x5f, 0x77, 0x20, 0x2f, 0x20, 0x32, + 0x2c, 0x20, 0x69, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x69, 0x6d, 0x67, 0x5f, 0x68, 0x20, + 0x2f, 0x20, 0x32, 0x0a, + 0x09, 0x09, 0x64, 0x72, 0x61, 0x77, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x28, + 0x78, 0x2c, 0x20, 0x79, 0x29, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x73, 0x65, + 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x32, 0x35, 0x35, 0x2c, 0x20, 0x32, 0x35, 0x35, 0x2c, 0x20, 0x32, + 0x35, 0x35, 0x2c, 0x20, 0x32, 0x35, 0x35, 0x29, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x73, 0x65, + 0x74, 0x42, 0x6c, 0x65, 0x6e, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x28, 0x22, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x22, + 0x29, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x64, 0x72, + 0x61, 0x77, 0x28, 0x69, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x69, 0x6d, 0x61, 0x67, 0x65, + 0x2c, 0x20, 0x78, 0x2c, 0x20, 0x79, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x6f, + 0x78, 0x2c, 0x20, 0x6f, 0x79, 0x29, 0x0a, + 0x09, 0x09, 0x64, 0x72, 0x61, 0x77, 0x5f, 0x62, 0x75, 0x62, 0x62, 0x6c, 0x65, 0x28, 0x78, 0x2c, 0x20, 0x79, + 0x29, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x64, 0x72, 0x61, + 0x77, 0x28, 0x29, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x73, 0x65, + 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x32, 0x35, 0x35, 0x2c, 0x20, 0x32, 0x35, 0x35, 0x2c, 0x20, 0x32, + 0x35, 0x35, 0x29, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x70, 0x75, + 0x73, 0x68, 0x28, 0x29, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x73, 0x63, + 0x61, 0x6c, 0x65, 0x28, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x67, 0x65, + 0x74, 0x50, 0x69, 0x78, 0x65, 0x6c, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x28, 0x29, 0x29, 0x0a, + 0x09, 0x09, 0x64, 0x72, 0x61, 0x77, 0x5f, 0x67, 0x72, 0x69, 0x64, 0x28, 0x29, 0x0a, + 0x09, 0x09, 0x64, 0x72, 0x61, 0x77, 0x5f, 0x69, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x28, 0x29, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x70, 0x6f, + 0x70, 0x28, 0x29, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x0a, + 0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x6b, 0x65, 0x79, + 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x28, 0x6b, 0x65, 0x79, 0x29, 0x0a, + 0x09, 0x09, 0x69, 0x66, 0x20, 0x6b, 0x65, 0x79, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x65, 0x73, 0x63, 0x61, 0x70, + 0x65, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x09, 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x71, 0x75, 0x69, 0x74, + 0x28, 0x29, 0x0a, + 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x63, 0x6f, 0x6e, + 0x66, 0x28, 0x74, 0x29, 0x0a, + 0x09, 0x09, 0x74, 0x2e, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x22, 0x4c, 0x5c, 0x31, 0x39, 0x35, + 0x5c, 0x31, 0x35, 0x30, 0x56, 0x45, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x5f, + 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x20, 0x28, 0x22, 0x20, 0x2e, 0x2e, + 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x64, + 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x29, 0x22, 0x0a, + 0x09, 0x09, 0x74, 0x2e, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x20, + 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x0a, + 0x09, 0x09, 0x74, 0x2e, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x73, 0x6f, 0x75, 0x6e, 0x64, 0x20, + 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x0a, + 0x09, 0x09, 0x74, 0x2e, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x70, 0x68, 0x79, 0x73, 0x69, 0x63, + 0x73, 0x20, 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x0a, + 0x09, 0x09, 0x74, 0x2e, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6a, 0x6f, 0x79, 0x73, 0x74, 0x69, + 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x0a, + 0x09, 0x09, 0x74, 0x2e, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x72, 0x65, 0x73, 0x69, 0x7a, 0x61, 0x62, + 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, + 0x09, 0x09, 0x74, 0x2e, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x68, 0x69, 0x67, 0x68, 0x64, 0x70, 0x69, + 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x65, 0x6e, 0x64, 0x0a, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x6e, 0x6f, 0x67, 0x61, 0x6d, 0x65, 0x0a, +}; // [nogame.lua] +} // love