1
0
Fork 0
mirror of https://github.com/ocornut/imgui.git synced 2026-01-13 00:24:20 +00:00

Added the whole opengl_various_bindings directory with opengl bindings for glfw3 glut/freeglut SDL2 and WIndowsAPI

This commit is contained in:
Flix 2014-11-12 12:04:40 +01:00
parent 8a65d97bf0
commit 8bd15be809
14 changed files with 8087 additions and 0 deletions

View file

@ -0,0 +1,310 @@
#ifndef IMIMPL_BINDING_H
#define IMIMPL_BINDING_H
#ifdef _WIN32
#pragma warning (disable: 4996) // 'This function or variable may be unsafe': strcpy, strdup, sprintf, vsnprintf, sscanf, fopen
#include <Windows.h>
#include <Imm.h>
#endif
#include <imgui.h>
// glew (optional) & glfw
#ifdef IMIMPL_USE_GLEW
//#define GLEW_STATIC // Optional, depending on which glew lib you want to use
#ifdef __APPLE__ // or __MACOSX__ ?
# include <OpenGL/glew.h> // guessing...
#else //__APPLE
# include <GL/glew.h>
#endif //__APPLE
#else //IMIMPL_USE_GLEW
#define GL_GLEXT_PROTOTYPES
#endif //IMIMPL_USE_GLEW
//#define GLFW_STATIC
#include <GLFW/glfw3.h>
#ifdef _WIN32
#define GLFW_EXPOSE_NATIVE_WIN32
#define GLFW_EXPOSE_NATIVE_WGL
#include <GLFW/glfw3native.h>
#endif
#include "ImImpl_RenderDrawLists.h"
static GLFWwindow* window;
//static bool mousePressed[2] = { false, false };
static ImVec2 mousePosScale(1.0f, 1.0f);
// NB: ImGui already provide OS clipboard support for Windows so this isn't needed if you are using Windows only.
static const char* ImImpl_GetClipboardTextFn()
{
return glfwGetClipboardString(window);
}
static void ImImpl_SetClipboardTextFn(const char* text)
{
glfwSetClipboardString(window, text);
}
#ifdef _WIN32
// Notify OS Input Method Editor of text input position (e.g. when using Japanese/Chinese inputs, otherwise this isn't needed)
static void ImImpl_ImeSetInputScreenPosFn(int x, int y)
{
HWND hwnd = glfwGetWin32Window(window);
if (HIMC himc = ImmGetContext(hwnd))
{
COMPOSITIONFORM cf;
cf.ptCurrentPos.x = x;
cf.ptCurrentPos.y = y;
cf.dwStyle = CFS_FORCE_POSITION;
ImmSetCompositionWindow(himc, &cf);
}
}
#endif
// GLFW callbacks to get events
static void glfw_error_callback(int error, const char* description) {
fputs(description, stderr);
}
static bool gImGuiAppIsIconified = false;
static void glfw_window_iconify_callback(GLFWwindow* window,int iconified) {
gImGuiAppIsIconified = iconified == GL_TRUE;
}
static void glfw_framebuffer_size_callback(GLFWwindow* window,int fb_w,int fb_h) {
int w, h;glfwGetWindowSize(window, &w, &h);
mousePosScale.x = (float)fb_w / w; // Some screens e.g. Retina display have framebuffer size != from window size, and mouse inputs are given in window/screen coordinates.
mousePosScale.y = (float)fb_h / h;
ImGuiIO& io = ImGui::GetIO();
io.DisplaySize = ImVec2((float)fb_w, (float)fb_h);
}
static void glfw_window_size_callback(GLFWwindow* window,int w,int h) {
int fb_w, fb_h;glfwGetFramebufferSize(window, &fb_w, &fb_h);
mousePosScale.x = (float)fb_w / w; // Some screens e.g. Retina display have framebuffer size != from window size, and mouse inputs are given in window/screen coordinates.
mousePosScale.y = (float)fb_h / h;
ResizeGL(w,h);
}
static bool gImGuiBindingMouseDblClicked[5]={false,false,false,false,false};
static void glfw_mouse_button_callback(GLFWwindow* window, int button, int action, int mods) {
ImGuiIO& io = ImGui::GetIO();
if (button >= 0 && button < 5) {
io.MouseDown[button] = (action == GLFW_PRESS);
// Manual double click handling:
static double dblClickTimes[6]={-FLT_MAX,-FLT_MAX,-FLT_MAX,-FLT_MAX,-FLT_MAX,-FLT_MAX}; // seconds
if (action == GLFW_PRESS) {
double time = glfwGetTime();
double& oldTime = dblClickTimes[button];
bool& mouseDoubleClicked = gImGuiBindingMouseDblClicked[button];
if (time - oldTime < io.MouseDoubleClickTime) {
mouseDoubleClicked = true;
oldTime = -FLT_MAX;
//fprintf(stderr,"Double Clicked button %d\n",button);
}
else {
//fprintf(stderr,"Not Double Clicked button %d (%1.4f < %1.4f)\n",button,(float)time-(float)oldTime,io.MouseDoubleClickTime);
mouseDoubleClicked = false;
oldTime = time;
}
}
}
io.KeyCtrl = (mods & GLFW_MOD_CONTROL);
io.KeyShift = (mods & GLFW_MOD_SHIFT);
}
static void glfw_scroll_callback(GLFWwindow* window, double xoffset, double yoffset) {
ImGuiIO& io = ImGui::GetIO();
io.MouseWheel = (yoffset != 0.0f) ? yoffset > 0.0f ? 1 : - 1 : 0; // Mouse wheel: -1,0,+1
}
static void glfw_key_callback(GLFWwindow* window, int key, int scancode, int action, int mods) {
ImGuiIO& io = ImGui::GetIO();
if (action == GLFW_PRESS) io.KeysDown[key] = true;
if (action == GLFW_RELEASE) io.KeysDown[key] = false;
io.KeyCtrl = (mods & GLFW_MOD_CONTROL);
io.KeyShift = (mods & GLFW_MOD_SHIFT);
}
static void glfw_char_callback(GLFWwindow* window, unsigned int c) {
if (c > 0 && c < 0x10000)
ImGui::GetIO().AddInputCharacter((unsigned short)c);
}
static void glfw_mouse_enter_leave_callback(GLFWwindow* window, int entered) {
if (entered==GL_FALSE) {
ImGuiIO& io = ImGui::GetIO();
io.MousePos.x=io.MousePos.y=-1.f;
}
}
static void glfw_mouse_move_callback(GLFWwindow* window, double x,double y) {
ImGuiIO& io = ImGui::GetIO();
io.MousePos = ImVec2((float)x * mousePosScale.x, (float)y * mousePosScale.y); // Mouse position, in pixels (set to -1,-1 if no mouse / on another screen, etc.)
}
static void InitImGui(const ImImpl_InitParams* pOptionalInitParams=NULL) {
int w, h;
int fb_w, fb_h;
glfwGetWindowSize(window, &w, &h);
glfwGetFramebufferSize(window, &fb_w, &fb_h);
mousePosScale.x = (float)fb_w / w; // Some screens e.g. Retina display have framebuffer size != from window size, and mouse inputs are given in window/screen coordinates.
mousePosScale.y = (float)fb_h / h;
ImGuiIO& io = ImGui::GetIO();
io.DisplaySize = ImVec2((float)fb_w, (float)fb_h); // Display size, in pixels. For clamping windows positions.
io.DeltaTime = 1.0f/60.0f; // Time elapsed since last frame, in seconds (in this sample app we'll override this every frame because our timestep is variable)
io.PixelCenterOffset = 0.0f; // Align OpenGL texels
io.KeyMap[ImGuiKey_Tab] = GLFW_KEY_TAB; // Keyboard mapping. ImGui will use those indices to peek into the io.KeyDown[] array.
io.KeyMap[ImGuiKey_LeftArrow] = GLFW_KEY_LEFT;
io.KeyMap[ImGuiKey_RightArrow] = GLFW_KEY_RIGHT;
io.KeyMap[ImGuiKey_UpArrow] = GLFW_KEY_UP;
io.KeyMap[ImGuiKey_DownArrow] = GLFW_KEY_DOWN;
io.KeyMap[ImGuiKey_Home] = GLFW_KEY_HOME;
io.KeyMap[ImGuiKey_End] = GLFW_KEY_END;
io.KeyMap[ImGuiKey_Delete] = GLFW_KEY_DELETE;
io.KeyMap[ImGuiKey_Backspace] = GLFW_KEY_BACKSPACE;
io.KeyMap[ImGuiKey_Enter] = GLFW_KEY_ENTER;
io.KeyMap[ImGuiKey_Escape] = GLFW_KEY_ESCAPE;
io.KeyMap[ImGuiKey_A] = GLFW_KEY_A;
io.KeyMap[ImGuiKey_C] = GLFW_KEY_C;
io.KeyMap[ImGuiKey_V] = GLFW_KEY_V;
io.KeyMap[ImGuiKey_X] = GLFW_KEY_X;
io.KeyMap[ImGuiKey_Y] = GLFW_KEY_Y;
io.KeyMap[ImGuiKey_Z] = GLFW_KEY_Z;
io.RenderDrawListsFn = ImImpl_RenderDrawLists;
io.SetClipboardTextFn = ImImpl_SetClipboardTextFn;
io.GetClipboardTextFn = ImImpl_GetClipboardTextFn;
#ifdef _WIN32
io.ImeSetInputScreenPosFn = ImImpl_ImeSetInputScreenPosFn;
#endif
// 3 common init steps
InitImGuiFontTexture(pOptionalInitParams);
InitImGuiProgram();
InitImGuiBuffer();
}
static bool InitBinding(const ImImpl_InitParams* pOptionalInitParams=NULL,int argc=0, char** argv=NULL) {
glfwSetErrorCallback(glfw_error_callback);
if (!glfwInit()) {
fprintf(stderr, "Could not call glfwInit(...) successfully.\n");
return false;
}
//-ENABLE-OPENGLES COMPATIBILITY PROFILES----------------------------------
#ifndef IMIMPL_SHADER_NONE
#ifdef IMIMPL_SHADER_GLES
# ifndef IMIMPL_SHADER_GL3
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 2); // 1 => ES1.1 2 => ES2.0 3 => ES3.0
# else //IMIMPL_SHADER_GL3
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
# endif //MIMPL_SHADER_GL3
glfwWindowHint(GLFW_CLIENT_API, GLFW_OPENGL_ES_API);
#endif // IMIMPL_SHADER_GLES
#endif //IMIMPL_SHADER_NONE
//--------------------------------------------------------------------------
//glfwWindowHint(GLFW_SRGB_CAPABLE, GL_TRUE);
if (pOptionalInitParams && pOptionalInitParams->gWindowTitle[0]!='\0') window = glfwCreateWindow(pOptionalInitParams ? pOptionalInitParams->gWindowSize.x : 1270, pOptionalInitParams ? pOptionalInitParams->gWindowSize.y : 720,(const char*) &pOptionalInitParams->gWindowTitle[0], NULL, NULL);
else window = glfwCreateWindow(pOptionalInitParams ? pOptionalInitParams->gWindowSize.x : 1270, pOptionalInitParams ? pOptionalInitParams->gWindowSize.y : 720, "ImGui Glfw3 OpenGL example", NULL, NULL);
if (!window) {
fprintf(stderr, "Could not call glfwCreateWindow(...) successfully.\n");
return false;
}
glfwMakeContextCurrent(window);
glfwSetKeyCallback(window, glfw_key_callback);
glfwSetMouseButtonCallback(window, glfw_mouse_button_callback);
glfwSetScrollCallback(window, glfw_scroll_callback);
glfwSetCharCallback(window, glfw_char_callback);
glfwSetCursorPosCallback(window, glfw_mouse_move_callback);
glfwSetCursorEnterCallback(window, glfw_mouse_enter_leave_callback);
glfwSetWindowSizeCallback(window, glfw_window_size_callback);
glfwSetFramebufferSizeCallback(window, glfw_framebuffer_size_callback);
glfwSetWindowIconifyCallback(window, glfw_window_iconify_callback);
//OpenGL info
{
printf("GL Vendor: %s\n", glGetString( GL_VENDOR ));
printf("GL Renderer : %s\n", glGetString( GL_RENDERER ));
printf("GL Version (string) : %s\n", glGetString( GL_VERSION ));
printf("GLSL Version : %s\n", glGetString( GL_SHADING_LANGUAGE_VERSION ));
//printf("GL Extensions:\n%s\n",(char *) glGetString(GL_EXTENSIONS));
}
#ifdef IMIMPL_USE_GLEW
GLenum err = glewInit();
if( GLEW_OK != err )
{
fprintf(stderr, "Error initializing GLEW: %s\n",
glewGetErrorString(err) );
return false;
}
#endif //IMIMPL_USE_GLEW
return true;
}
// Application code
int ImImpl_Main(const ImImpl_InitParams* pOptionalInitParams=NULL,int argc=0, char** argv=NULL)
{
if (!InitBinding(pOptionalInitParams,argc,argv)) return -1;
InitImGui(pOptionalInitParams);
ImGuiIO& io = ImGui::GetIO();
InitGL();
ResizeGL(io.DisplaySize.x,io.DisplaySize.y);
static double time = 0.0f;
gImGuiInverseFPSClamp = pOptionalInitParams ? ((pOptionalInitParams->gFpsClamp!=0) ? (1.0f/pOptionalInitParams->gFpsClamp) : 1.0f) : -1.0f;
while (!glfwWindowShouldClose(window))
{
if (!gImGuiPaused) for (size_t i = 0; i < 5; i++) gImGuiBindingMouseDblClicked[i] = false; // We manually set it (otherwise it won't work with low frame rates)
if (gImGuiAppIsIconified) {
//fprintf(stderr,"glfwWaitEvents() Start %1.4f\n",glfwGetTime());
glfwWaitEvents();
//fprintf(stderr,"glfwWaitEvents() End %1.4f\n",glfwGetTime());
}
else glfwPollEvents();
// Setup timestep
const double current_time = glfwGetTime();
io.DeltaTime = (float)(current_time - time);
time = current_time;
// If needed we must wait (inverseFPSClamp-io.DeltaTime) seconds (=> honestly I shouldn't add the * 2.0f factor at the end, but ImGui tells me the wrong FPS otherwise... why? <=)
if (gImGuiInverseFPSClamp>0 && io.DeltaTime < gImGuiInverseFPSClamp) WaitFor((unsigned int) ((gImGuiInverseFPSClamp-io.DeltaTime)*1000.f * 2.0f) );
if (!gImGuiPaused) {
// Start the frame
ImGui::NewFrame();
for (size_t i = 0; i < 5; i++) {
io.MouseDoubleClicked[i]=gImGuiBindingMouseDblClicked[i]; // We manually set it (otherwise it won't work with low frame rates)
}
}
DrawGL();
if (!gImGuiPaused) {
// Rendering
glViewport(0, 0, (int)io.DisplaySize.x, (int)io.DisplaySize.y);
//glClearColor(0.8f, 0.6f, 0.6f, 1.0f);
//glClear(GL_COLOR_BUFFER_BIT);
ImGui::Render();
}
glfwSwapBuffers(window);
}
DestroyGL();
ImGui::Shutdown();
DestroyImGuiFontTexture();
DestroyImGuiProgram();
DestroyImGuiBuffer();
glfwTerminate();
return 0;
}
#endif //#ifndef IMIMPL_BINDING_H

View file

@ -0,0 +1,429 @@
#ifndef IMIMPL_BINDING_H
#define IMIMPL_BINDING_H
#ifdef _WIN32
#pragma warning (disable: 4996) // 'This function or variable may be unsafe': strcpy, strdup, sprintf, vsnprintf, sscanf, fopen
#include <Windows.h>
#include <Imm.h>
#endif
#include <imgui.h>
// glew (optional) & glut
#ifdef IMIMPL_USE_GLEW
#ifdef __APPLE__ // or __MACOSX__ ?
# include <OpenGL/glew.h> // guessing...
#else //__APPLE
# include <GL/glew.h>
#endif //__APPLE
#else //IMIMPL_USE_GLEW
#define GL_GLEXT_PROTOTYPES
#endif //IMIMPL_USE_GLEW
#ifdef __APPLE__ // or __MACOSX__ ?
# include <OpenGL/glut.h> // guessing...
#else //__APPLE
# include <GL/glut.h>
#endif //__APPLE
#ifdef __FREEGLUT_STD_H__
#ifdef __APPLE__ // or __MACOSX__ ?
# include <OpenGL/freeglut_ext.h> // guessing...
#else //__APPLE
# include <GL/freeglut_ext.h>
#endif //__APPLE
#endif //__FREEGLUT_STD_H__
#include "ImImpl_RenderDrawLists.h"
static ImVec2 mousePosScale(1.0f, 1.0f);
// NB: ImGui already provide OS clipboard support for Windows so this isn't needed if you are using Windows only.
#ifndef _WIN32
// If somebody implements these, in InitImGui(...) these callbacks MUST be set (they're currently detached).
// The default fallback on non-Windows OS is a "private" clipboard.
static const char* ImImpl_GetClipboardTextFn()
{
//fprintf(stderr,"ImImpl_GetClipboardTextFn()\n");
static char* txt = "copy and paste not implemented in the glut backend!";
//return SDL_GetClipboardText();
return txt;
}
static void ImImpl_SetClipboardTextFn(const char* text)
{
//fprintf(stderr,"ImImpl_SetClipboardTextFn()\n");
//SDL_SetClipboardText(text);
}
#endif //_WIN32
// TODO: once we can extract the HWND from glut...
/*
#ifdef _WIN32
// Notify OS Input Method Editor of text input position (e.g. when using Japanese/Chinese inputs, otherwise this isn't needed)
static void ImImpl_ImeSetInputScreenPosFn(int x, int y)
{
HWND hwnd = glfwGetWin32Window(window);
if (HIMC himc = ImmGetContext(hwnd))
{
COMPOSITIONFORM cf;
cf.ptCurrentPos.x = x;
cf.ptCurrentPos.y = y;
cf.dwStyle = CFS_FORCE_POSITION;
ImmSetCompositionWindow(himc, &cf);
}
}
#endif
*/
static void GlutReshapeFunc(int w,int h) {
int fb_w, fb_h;
fb_w = w;
fb_h = h;
//glfwGetFramebufferSize(window, &fb_w, &fb_h);
mousePosScale.x = 1.f;//(float)fb_w / w; // Some screens e.g. Retina display have framebuffer size != from window size, and mouse inputs are given in window/screen coordinates.
mousePosScale.y = 1.f;//(float)fb_h / h;
ImGuiIO& io = ImGui::GetIO();
io.DisplaySize = ImVec2((float)fb_w, (float)fb_h); // Display size, in pixels. For clamping windows positions.
ResizeGL(w,h);
}
static void GlutEntryFunc(int a) {
//fprintf(stderr,"GlutEntryFunc %d\n",a);
if (a==0){
ImGuiIO& io = ImGui::GetIO();
io.MousePos.x = io.MousePos.y = -1;
}
}
static bool gImGuiAppIconized = false; // stays always false (I'm not able to detect when the user minimizes a window)
/*
// This method gets never called on my system:
static void GlutVisibilityFunc(int a) {
fprintf(stderr,"GlutVisibilityFunc %d\n",a);
gImGuiAppIconized = a == GL_TRUE;
}
// This gets called, but does not provide the info I'm looking for
static void GlutWindowStatusFunc(int a) {
fprintf(stderr,"GlutWindowStatusFunc %d\n",a);
//gImGuiAppIconized = a == GL_TRUE;
}*/
static inline void GlutSpecialUpDown(int key,int x,int y,bool down) {
ImGuiIO& io = ImGui::GetIO();
const int mods = glutGetModifiers();
io.KeyCtrl = (mods&GLUT_ACTIVE_CTRL) != 0;
io.KeyShift = (mods&GLUT_ACTIVE_SHIFT) != 0;
io.MousePos.x = x;io.MousePos.y = y;
if (key>=0 && key<512) io.KeysDown[key] = down;
}
static void GlutSpecial(int key,int x,int y) {
GlutSpecialUpDown(key,x,y,true);
}
static void GlutSpecialUp(int key,int x,int y) {
GlutSpecialUpDown(key,x,y,false);
}
static inline void GlutKeyboardUpDown(unsigned char key,int x,int y,bool down) {
ImGuiIO& io = ImGui::GetIO();
const int mods = glutGetModifiers();
io.KeyCtrl = (mods&GLUT_ACTIVE_CTRL) != 0;
io.KeyShift = (mods&GLUT_ACTIVE_SHIFT) != 0;
io.MousePos.x = x;io.MousePos.y = y;
if ( key!=GLUT_KEY_LEFT && key!=GLUT_KEY_RIGHT &&
key!=GLUT_KEY_UP && key!=GLUT_KEY_DOWN &&
key!=GLUT_KEY_HOME && key!=GLUT_KEY_END
) {
io.KeysDown[key] = down;
}
if (down) io.AddInputCharacter(key);
}
static void GlutKeyboard(unsigned char key,int x,int y) {
GlutKeyboardUpDown(key,x,y,true);
}
static void GlutKeyboardUp(unsigned char key,int x,int y) {
GlutKeyboardUpDown(key,x,y,false);
}
static bool gImGuiBindingMouseDblClicked[5]={false,false,false,false,false};
static void GlutMouse(int b,int s,int x,int y) {
//fprintf(stderr,"GlutMouse(%d,%d,%d,%d);\n",b,s,x,y);
ImGuiIO& io = ImGui::GetIO();
const int mods = glutGetModifiers();
io.KeyCtrl = (mods&GLUT_ACTIVE_CTRL) != 0;
io.KeyShift = (mods&GLUT_ACTIVE_SHIFT) != 0;
io.MousePos.x = x;io.MousePos.y = y;
if (b>=0 && b<5) {
io.MouseDown[b] = (s==0);
# ifndef _WIN32
if (s==0) io.MouseWheel = b==3 ? 1 : b==4 ? -1 : 0;
# endif //_WIN32
// Manual double click handling:
static double dblClickTimes[6]={-FLT_MAX,-FLT_MAX,-FLT_MAX,-FLT_MAX,-FLT_MAX,-FLT_MAX}; // seconds
if (s == 0) {
double time = glutGet(GLUT_ELAPSED_TIME);
double& oldTime = dblClickTimes[b];
bool& mouseDoubleClicked = gImGuiBindingMouseDblClicked[b];
if (time - oldTime < io.MouseDoubleClickTime*1000.f) {
mouseDoubleClicked = true;
oldTime = -FLT_MAX;
//fprintf(stderr,"Double Clicked button %d\n",button);
}
else {
//fprintf(stderr,"Not Double Clicked button %d (%1.4f < %1.4f)\n",button,(float)time-(float)oldTime,io.MouseDoubleClickTime);
mouseDoubleClicked = false;
oldTime = time;
}
}
}
}
#ifdef _WIN32
static void GlutMouseWheel(int b,int s,int x,int y) {
//fprintf(stderr,"GlutMouseWheel(%d,%d,%d,%d);\n",b,s,x,y);
ImGuiIO& io = ImGui::GetIO();
const int mods = glutGetModifiers();
io.KeyCtrl = (mods&GLUT_ACTIVE_CTRL) != 0;
io.KeyShift = (mods&GLUT_ACTIVE_SHIFT) != 0;
io.MousePos.x = x;io.MousePos.y = y;
// NEVER TESTED !!!!!!!!
if (s==0) io.MouseWheel = b==0 ? 1 : b==1 ? -1 : 0;
}
#endif //_WIN32
static void GlutMotion(int x,int y) {
ImGuiIO& io = ImGui::GetIO();
//const int mods = glutGetModifiers();
//io.KeyCtrl = (mods&GLUT_ACTIVE_CTRL) != 0;
//io.KeyShift = (mods&GLUT_ACTIVE_SHIFT) != 0;
io.MousePos.x = x;io.MousePos.y = y;
}
static void GlutPassiveMotion(int x,int y) {
ImGuiIO& io = ImGui::GetIO();
//const int mods = glutGetModifiers();
//io.KeyCtrl = (mods&GLUT_ACTIVE_CTRL) != 0;
//io.KeyShift = (mods&GLUT_ACTIVE_SHIFT) != 0;
io.MousePos.x = x;io.MousePos.y = y;
}
static void GlutDrawGL() {
ImGuiIO& io = ImGui::GetIO();
if (gImGuiAppIconized) WaitFor(1000);
// Setup timestep
static double time = 0.0f;
const double current_time = (double) glutGet(GLUT_ELAPSED_TIME);
io.DeltaTime = (float) ((current_time - time)*0.001);
time = current_time;
if (io.DeltaTime<=0) io.DeltaTime = (1.0f/60.0f);
// If needed we must wait (gImGuiInverseFPSClamp-io.DeltaTime) seconds (=> honestly I shouldn't add the * 2.0f factor at the end, but ImGui tells me the wrong FPS otherwise... why? <=)
if (gImGuiInverseFPSClamp>0 && io.DeltaTime < gImGuiInverseFPSClamp) WaitFor((unsigned int) ((gImGuiInverseFPSClamp-io.DeltaTime)*1000.f * 2.0f) );
if (!gImGuiPaused) {
// Start the frame
ImGui::NewFrame();
for (size_t i = 0; i < 5; i++) {
io.MouseDoubleClicked[i]=gImGuiBindingMouseDblClicked[i]; // We manually set it (otherwise it won't work with low frame rates)
}
}
DrawGL();
if (!gImGuiPaused) {
// Rendering
glViewport(0, 0, (int)io.DisplaySize.x, (int)io.DisplaySize.y);
//glClearColor(0.8f, 0.6f, 0.6f, 1.0f);
//glClear(GL_COLOR_BUFFER_BIT);
ImGui::Render();
}
glutSwapBuffers();
if (!gImGuiPaused) for (size_t i = 0; i < 5; i++) gImGuiBindingMouseDblClicked[i] = false; // We manually set it (otherwise it won't work with low frame rates)
}
static void GlutIdle(void) {
glutPostRedisplay(); // TODO: Well, we could sleep a bit here if we detect that the window is minimized...
}
static void GlutFakeDrawGL() {
glutDisplayFunc(GlutDrawGL);
}
static void InitImGui(const ImImpl_InitParams* pOptionalInitParams=NULL) {
//fprintf(stderr,"InitImGui(%d,%d);\n",w,h);
//int w, h;
int fb_w, fb_h;
fb_w = glutGet(GLUT_WINDOW_WIDTH);
fb_h = glutGet(GLUT_WINDOW_HEIGHT);
//glfwGetFramebufferSize(window, &fb_w, &fb_h);
mousePosScale.x = 1.f;//(float)fb_w / w; // Some screens e.g. Retina display have framebuffer size != from window size, and mouse inputs are given in window/screen coordinates.
mousePosScale.y = 1.f;//(float)fb_h / h;
ImGuiIO& io = ImGui::GetIO();
io.DisplaySize = ImVec2((float)fb_w, (float)fb_h); // Display size, in pixels. For clamping windows positions.
io.DeltaTime = 1.0f/60.0f; // Time elapsed since last frame, in seconds (in this sample app we'll override this every frame because our timestep is variable)
io.PixelCenterOffset = 0.0f; // Align OpenGL texels
// Set up ImGui
io.KeyMap[ImGuiKey_Tab] = 9; // tab (ascii)
io.KeyMap[ImGuiKey_LeftArrow] = GLUT_KEY_LEFT; // Left
io.KeyMap[ImGuiKey_RightArrow] = GLUT_KEY_RIGHT; // Right
io.KeyMap[ImGuiKey_UpArrow] = GLUT_KEY_UP; // Up
io.KeyMap[ImGuiKey_DownArrow] = GLUT_KEY_DOWN; // Down
io.KeyMap[ImGuiKey_Home] = GLUT_KEY_HOME; // Home
io.KeyMap[ImGuiKey_End] = GLUT_KEY_END; // End
io.KeyMap[ImGuiKey_Delete] = 127; // Delete (ascii) (0x006F)
io.KeyMap[ImGuiKey_Backspace] = 8; // Backspace (ascii)
io.KeyMap[ImGuiKey_Enter] = 13; // Enter (ascii)
io.KeyMap[ImGuiKey_Escape] = 27; // Escape (ascii)
io.KeyMap[ImGuiKey_A] = 1;
io.KeyMap[ImGuiKey_C] = 3;
io.KeyMap[ImGuiKey_V] = 22;
io.KeyMap[ImGuiKey_X] = 24;
io.KeyMap[ImGuiKey_Y] = 25;
io.KeyMap[ImGuiKey_Z] = 26;
io.RenderDrawListsFn = ImImpl_RenderDrawLists;
#ifndef _WIN32
//io.SetClipboardTextFn = ImImpl_SetClipboardTextFn;
//io.GetClipboardTextFn = ImImpl_GetClipboardTextFn;
#endif
#ifdef _WIN32
//io.ImeSetInputScreenPosFn = ImImpl_ImeSetInputScreenPosFn;
#endif
// 3 common init steps
InitImGuiFontTexture(pOptionalInitParams);
InitImGuiProgram();
InitImGuiBuffer();
}
static bool InitBinding(const ImImpl_InitParams* pOptionalInitParams=NULL,int argc=0, char** argv=NULL) {
//-ENABLE-OPENGLES COMPATIBILITY PROFILES----------------------------------
/* // Don't know how to make this work... for sure,
* // "custom" freeglut compiled with -legl -lglesv2 can do it,
* // but otherwie it seems that the required profile definition is missing ATM.
* // Moreover, I'm not sure that the glutInitContextMethods (defined in freeglut_ext.h)
* // can be called at this point...
*/
/*
#ifndef IMIMPL_SHADER_NONE
#ifdef IMIMPL_SHADER_GLES
# ifndef IMIMPL_SHADER_GL3
glutInitContextVersion( 2, 0);
# else //IMIMPL_SHADER_GL3
glutInitContextVersion( 3, 0);
# endif //MIMPL_SHADER_GL3
//glfwWindowHint(GLFW_CLIENT_API, GLFW_OPENGL_ES_API); // GLFW3 can do it!
//SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK,SDL_GL_CONTEXT_PROFILE_ES); // SDL2 can do it too!
// What about freeglut?
glutInitContextProfile( GLUT_ES_PROFILE ); //GLUT_CORE_PROFILE GLUT_COMPATIBILITY_PROFILE
//glutInitContextVersion( int majorVersion, int minorVersion );
//glutInitContextFlags( int flags ); //GLUT_DEBUG GLUT_FORWARD_COMPATIBLE
//glutInitContextProfile( int profile ); //GLUT_CORE_PROFILE GLUT_COMPATIBILITY_PROFILE
#endif // IMIMPL_SHADER_GLES
#endif //IMIMPL_SHADER_NONE
*/
//--------------------------------------------------------------------------
glutInitDisplayMode(GLUT_RGB | GLUT_ALPHA | GLUT_DEPTH | GLUT_DOUBLE);// | GLUT_MULTISAMPLE | GLUT_SRGB); // The latter is defined in freeglut_ext.h
glutInitWindowSize(pOptionalInitParams ? pOptionalInitParams->gWindowSize.x : 1270, pOptionalInitParams ? pOptionalInitParams->gWindowSize.y : 720);
//int screenWidth = glutGet(GLUT_SCREEN_WIDTH);
//glutInitWindowPosition(5 * screenWidth/ 12, 0);
glutInit(&argc, argv);
if (!glutCreateWindow((pOptionalInitParams && pOptionalInitParams->gWindowTitle[0]!='\0') ? (const char*) &pOptionalInitParams->gWindowTitle[0] : "ImGui Glut OpenGL example"))
{
fprintf(stderr, "Could not call glutCreateWindow(...) successfully.\n");
return false;
}
//OpenGL info
{
printf("GL Vendor: %s\n", glGetString( GL_VENDOR ));
printf("GL Renderer : %s\n", glGetString( GL_RENDERER ));
printf("GL Version (string) : %s\n", glGetString( GL_VERSION ));
printf("GLSL Version : %s\n", glGetString( GL_SHADING_LANGUAGE_VERSION ));
//printf("GL Extensions:\n%s\n",(char *) glGetString(GL_EXTENSIONS));
}
#ifdef IMIMPL_USE_GLEW
GLenum err = glewInit();
if( GLEW_OK != err )
{
fprintf(stderr, "Error initializing GLEW: %s\n",
glewGetErrorString(err) );
return false;
}
#endif //IMIMPL_USE_GLEW
// Set up glut callbacks
glutIdleFunc(GlutIdle);
glutReshapeFunc(GlutReshapeFunc);
//glutDisplayFunc(GlutDrawGL);
//glutInitContextFunc(InitGL); // freeglut3 only: call order: ResizeGL() - InitGL() - DrawGL()
//InitGL(); // call order: InitGL() - DrawGL() - ResizeGL()
//But I prefer call order: InitGL() - ResizeGL() - DrawGL():
// this can be achieved by skipping the first DrawGL call this way:
glutDisplayFunc(GlutFakeDrawGL);
glutKeyboardFunc(GlutKeyboard);
glutKeyboardUpFunc(GlutKeyboardUp);
glutSpecialFunc(GlutSpecial);
glutSpecialUpFunc(GlutSpecialUp);
glutMouseFunc(GlutMouse); // This handles mouse wheel as well on non-Windows systems
glutMotionFunc(GlutMotion);
glutPassiveMotionFunc(GlutPassiveMotion);
glutEntryFunc(GlutEntryFunc);
// Apparently, there's no way to detect when the user minimizes a window using glut (at least on my system these callbacks don't provide this info)
//glutVisibilityFunc(GlutVisibilityFunc); // never called
//glutWindowStatusFunc(GlutWindowStatusFunc); // called on resizing too
#ifdef _WIN32
glutMouseWheelFunc(GlutMouseWheel);
#endif //_WIN32
return true;
}
// Application code
int ImImpl_Main(const ImImpl_InitParams* pOptionalInitParams=NULL,int argc=0, char** argv=NULL)
{
if (!InitBinding(pOptionalInitParams,argc,argv)) return -1;
InitImGui(pOptionalInitParams);
ImGuiIO& io = ImGui::GetIO();
gImGuiInverseFPSClamp = pOptionalInitParams ? ((pOptionalInitParams->gFpsClamp!=0) ? (1.0f/pOptionalInitParams->gFpsClamp) : 1.0f) : -1.0f;
InitGL();
ResizeGL((int)io.DisplaySize.x,(int)io.DisplaySize.y);
#ifdef __FREEGLUT_EXT_H__
glutSetOption ( GLUT_ACTION_ON_WINDOW_CLOSE, GLUT_ACTION_CONTINUE_EXECUTION ) ;
#endif //__FREEGLUT_STD_H__
glutMainLoop(); // GLUT has its own main loop, which calls display();
ImGui::Shutdown();
DestroyGL();
DestroyImGuiFontTexture();
DestroyImGuiProgram();
DestroyImGuiBuffer();
return 0;
}
#endif //#ifndef IMIMPL_BINDING_H

View file

@ -0,0 +1,359 @@
#ifndef IMIMPL_BINDING_H
#define IMIMPL_BINDING_H
#ifdef _WIN32
#pragma warning (disable: 4996) // 'This function or variable may be unsafe': strcpy, strdup, sprintf, vsnprintf, sscanf, fopen
#include <Windows.h>
#include <Imm.h>
#endif
#include <imgui.h>
// glew (optional) & glfw
#ifdef IMIMPL_USE_GLEW
//#define GLEW_STATIC // Optional, depending on which glew lib you want to use
#ifdef __APPLE__ // or __MACOSX__ ?
# include <OpenGL/glew.h> // guessing...
#else //__APPLE
# include <GL/glew.h>
#endif //__APPLE
#else //IMIMPL_USE_GLEW
#define GL_GLEXT_PROTOTYPES
#if (!defined(IMIMPL_SHADER_GLES) || defined (IMIMPL_SHADER_NONE))
#include <SDL2/SDL_opengl.h>
#else //IMIMPL_SHADER_GLES
#include <SDL2/SDL_opengles2.h>
#endif //IMIMPL_SHADER_GLES
#endif //IMIMPL_USE_GLEW
#include <SDL2/SDL.h>
#define IMIMPL_SDL2_USE_STL // Different handling of SDL_KEYDOWN/SDL_KEYUP events
#ifdef IMIMPL_SDL2_USE_STL
#include <map> // we could work around this dependency if needed
static std::map<int,int> specialKeyMap;
#endif //IMIMPL_SDL2_USE_STL
#include "ImImpl_RenderDrawLists.h"
static SDL_Window* window = NULL;
static ImVec2 mousePosScale(1.0f, 1.0f);
// NB: ImGui already provide OS clipboard support for Windows so this isn't needed if you are using Windows only.
static const char* ImImpl_GetClipboardTextFn()
{
return SDL_GetClipboardText();
}
static void ImImpl_SetClipboardTextFn(const char* text)
{
SDL_SetClipboardText(text);
}
// TODO: once we can find out how to get a HWND from SDL2
/*
#ifdef _WIN32
// Notify OS Input Method Editor of text input position (e.g. when using Japanese/Chinese inputs, otherwise this isn't needed)
static void ImImpl_ImeSetInputScreenPosFn(int x, int y)
{
HWND hwnd = glfwGetWin32Window(window);
if (HIMC himc = ImmGetContext(hwnd))
{
COMPOSITIONFORM cf;
cf.ptCurrentPos.x = x;
cf.ptCurrentPos.y = y;
cf.dwStyle = CFS_FORCE_POSITION;
ImmSetCompositionWindow(himc, &cf);
}
}
#endif
*/
static void InitImGui(const ImImpl_InitParams* pOptionalInitParams=NULL) {
//int w, h;
int fb_w, fb_h;
SDL_GetWindowSize(window, &fb_w, &fb_h);
//glfwGetFramebufferSize(window, &fb_w, &fb_h);
mousePosScale.x = 1.f;//(float)fb_w / w; // Some screens e.g. Retina display have framebuffer size != from window size, and mouse inputs are given in window/screen coordinates.
mousePosScale.y = 1.f;//(float)fb_h / h;
ImGuiIO& io = ImGui::GetIO();
io.DisplaySize = ImVec2((float)fb_w, (float)fb_h); // Display size, in pixels. For clamping windows positions.
io.DeltaTime = 1.0f/60.0f; // Time elapsed since last frame, in seconds (in this sample app we'll override this every frame because our timestep is variable)
io.PixelCenterOffset = 0.0f; // Align OpenGL texels
# ifdef IMIMPL_SDL2_USE_STL
specialKeyMap.clear();const int numKeyMaps = 512;
int cnt = 1;
io.KeyMap[ImGuiKey_Tab] = specialKeyMap[SDLK_TAB] = numKeyMaps - cnt++; // Keyboard mapping. ImGui will use those indices to peek into the io.KeyDown[] array.
io.KeyMap[ImGuiKey_LeftArrow] = specialKeyMap[SDLK_LEFT] = numKeyMaps - cnt++;
io.KeyMap[ImGuiKey_RightArrow] = specialKeyMap[SDLK_RIGHT] = numKeyMaps - cnt++;
io.KeyMap[ImGuiKey_UpArrow] = specialKeyMap[SDLK_UP] = numKeyMaps - cnt++;
io.KeyMap[ImGuiKey_DownArrow] = specialKeyMap[SDLK_DOWN] = numKeyMaps - cnt++;
io.KeyMap[ImGuiKey_Home] = specialKeyMap[SDLK_HOME] = numKeyMaps - cnt++;
io.KeyMap[ImGuiKey_End] = specialKeyMap[SDLK_END] = numKeyMaps - cnt++;
io.KeyMap[ImGuiKey_Delete] = specialKeyMap[SDLK_DELETE] = numKeyMaps - cnt++;
io.KeyMap[ImGuiKey_Backspace] = specialKeyMap[SDLK_BACKSPACE] = numKeyMaps - cnt++;
io.KeyMap[ImGuiKey_Enter] = specialKeyMap[SDLK_RETURN] = numKeyMaps - cnt++;
io.KeyMap[ImGuiKey_Escape] = specialKeyMap[SDLK_ESCAPE] = numKeyMaps - cnt++;
io.KeyMap[ImGuiKey_A] = specialKeyMap[SDLK_a] = numKeyMaps - cnt++;
io.KeyMap[ImGuiKey_C] = specialKeyMap[SDLK_c] = numKeyMaps - cnt++;
io.KeyMap[ImGuiKey_V] = specialKeyMap[SDLK_v] = numKeyMaps - cnt++;
io.KeyMap[ImGuiKey_X] = specialKeyMap[SDLK_x] = numKeyMaps - cnt++;
io.KeyMap[ImGuiKey_Y] = specialKeyMap[SDLK_y] = numKeyMaps - cnt++;
io.KeyMap[ImGuiKey_Z] = specialKeyMap[SDLK_z] = numKeyMaps - cnt++;
# else //IMIMPL_SDL2_USE_STL
// thanks to mattiasljungstrom:
io.KeyMap[ImGuiKey_Tab] = SDL_GetScancodeFromKey( SDLK_TAB );
io.KeyMap[ImGuiKey_LeftArrow] = SDL_GetScancodeFromKey( SDLK_LEFT );
io.KeyMap[ImGuiKey_RightArrow] = SDL_GetScancodeFromKey( SDLK_RIGHT );
io.KeyMap[ImGuiKey_UpArrow] = SDL_GetScancodeFromKey( SDLK_UP );
io.KeyMap[ImGuiKey_DownArrow] = SDL_GetScancodeFromKey( SDLK_DOWN );
io.KeyMap[ImGuiKey_Home] = SDL_GetScancodeFromKey( SDLK_HOME );
io.KeyMap[ImGuiKey_End] = SDL_GetScancodeFromKey( SDLK_END );
io.KeyMap[ImGuiKey_Delete] = SDL_GetScancodeFromKey( SDLK_DELETE );
io.KeyMap[ImGuiKey_Backspace] = SDL_GetScancodeFromKey( SDLK_BACKSPACE );
io.KeyMap[ImGuiKey_Enter] = SDL_GetScancodeFromKey( SDLK_RETURN );
io.KeyMap[ImGuiKey_Escape] = SDL_GetScancodeFromKey( SDLK_ESCAPE );
io.KeyMap[ImGuiKey_A] = SDLK_a;
io.KeyMap[ImGuiKey_C] = SDLK_c;
io.KeyMap[ImGuiKey_V] = SDLK_v;
io.KeyMap[ImGuiKey_X] = SDLK_x;
io.KeyMap[ImGuiKey_Y] = SDLK_y;
io.KeyMap[ImGuiKey_Z] = SDLK_z;
# endif //IMIMPL_SDL2_USE_STL
io.RenderDrawListsFn = ImImpl_RenderDrawLists;
io.SetClipboardTextFn = ImImpl_SetClipboardTextFn;
io.GetClipboardTextFn = ImImpl_GetClipboardTextFn;
#ifdef _MSC_VER
//io.ImeSetInputScreenPosFn = ImImpl_ImeSetInputScreenPosFn;
#endif
// 3 common init steps
InitImGuiFontTexture(pOptionalInitParams);
InitImGuiProgram();
InitImGuiBuffer();
}
static bool InitBinding(const ImImpl_InitParams* pOptionalInitParams=NULL,int argc=0, char** argv=NULL) {
if (SDL_Init(SDL_INIT_EVERYTHING) < 0) {
fprintf(stderr, "Couldn't initialize SDL: %s\n", SDL_GetError());
return false;
}
// Init OpenGL
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24);
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);
//-ENABLE-OPENGLES COMPATIBILITY PROFILES----------------------------------
#ifndef IMIMPL_SHADER_NONE
#ifdef IMIMPL_SHADER_GLES
# ifndef IMIMPL_SHADER_GL3
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2); // 1 => ES1.1 2 => ES2.0 3 => ES3.0
# else //IMIMPL_SHADER_GL3
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
# endif //MIMPL_SHADER_GL3
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 0);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK,SDL_GL_CONTEXT_PROFILE_ES);
#endif // IMIMPL_SHADER_GLES
#endif //IMIMPL_SHADER_NONE
//--------------------------------------------------------------------------
//SDL_GL_SetAttribute(SDL_GL_CONTEXT_FLAGS,);
//SDL_GL_SetAttribute(SDL_GL_FRAMEBUFFER_SRGB_CAPABLE,1);
window = SDL_CreateWindow((pOptionalInitParams && pOptionalInitParams->gWindowTitle[0]!='\0') ? (const char*) &pOptionalInitParams->gWindowTitle[0] : "ImGui SDL2 OpenGL example",
SDL_WINDOWPOS_CENTERED,
SDL_WINDOWPOS_CENTERED,
pOptionalInitParams ? pOptionalInitParams->gWindowSize.x : 1270,
pOptionalInitParams ? pOptionalInitParams->gWindowSize.y : 720,
SDL_WINDOW_RESIZABLE |
SDL_WINDOW_OPENGL
);
if (!window)
{
fprintf(stderr, "Could not call SDL_CreateWindow(...) successfully.\n");
return false;
}
SDL_GL_CreateContext(window);
//OpenGL info
{
printf("GL Vendor: %s\n", glGetString( GL_VENDOR ));
printf("GL Renderer : %s\n", glGetString( GL_RENDERER ));
printf("GL Version (string) : %s\n", glGetString( GL_VERSION ));
printf("GLSL Version : %s\n", glGetString( GL_SHADING_LANGUAGE_VERSION ));
//printf("GL Extensions:\n%s\n",(char *) glGetString(GL_EXTENSIONS));
}
#ifdef IMIMPL_USE_GLEW
GLenum err = glewInit();
if( GLEW_OK != err )
{
fprintf(stderr, "Error initializing GLEW: %s\n",
glewGetErrorString(err) );
return false;
}
#endif //IMIMPL_USE_GLEW
return true;
}
// Application code
int ImImpl_Main(const ImImpl_InitParams* pOptionalInitParams=NULL,int argc=0, char** argv=NULL)
{
if (!InitBinding(pOptionalInitParams,argc,argv)) return -1;
InitImGui(pOptionalInitParams);
ImGuiIO& io = ImGui::GetIO();
InitGL();
ResizeGL((int) io.DisplaySize.x,(int) io.DisplaySize.y);
gImGuiInverseFPSClamp = pOptionalInitParams ? ((pOptionalInitParams->gFpsClamp!=0) ? (1.0f/pOptionalInitParams->gFpsClamp) : 1.0f) : -1.0f;
static bool gImGuiBindingMouseDblClicked[5]={false,false,false,false,false};
int done = 0;
SDL_Event event;
while (!done)
{
if (!gImGuiPaused) for (size_t i = 0; i < 5; i++) gImGuiBindingMouseDblClicked[i] = false; // We manually set it (otherwise it won't work with low frame rates)
while (SDL_PollEvent(&event))
{
switch (event.type)
{
case SDL_WINDOWEVENT: {
switch (event.window.event) {
case SDL_WINDOWEVENT_RESIZED:
{
int width = event.window.data1;
int height = event.window.data2;
int fb_w, fb_h;
fb_w = width;fb_h = height;
mousePosScale.x = 1.f;//(float)fb_w / w; // Some screens e.g. Retina display have framebuffer size != from window size, and mouse inputs are given in window/screen coordinates.
mousePosScale.y = 1.f;//(float)fb_h / h;
io.DisplaySize = ImVec2((float)fb_w, (float)fb_h); // Display size, in pixels. For clamping windows positions.
ResizeGL(width,height);
}
break;
}
}
break;
case SDL_KEYDOWN:
case SDL_KEYUP:
{
SDL_Keymod mod;
//mod = event.key.keysym.mod; // event.key.keysym.mod == 0 always!
mod = SDL_GetModState();
io.KeyCtrl = (mod & (KMOD_LCTRL|KMOD_RCTRL)) != 0;
io.KeyShift = (mod & (KMOD_LSHIFT|KMOD_RSHIFT)) != 0;
// SDLK_UNKNOWN enums...
//io.KeysDown[event.key.keysym.sym] = event.key.type == SDL_KEYDOWN;
# ifdef IMIMPL_SDL2_USE_STL
std::map<int,int>::const_iterator it = specialKeyMap.find(event.key.keysym.sym);
if ( it!=specialKeyMap.end() ) {
io.KeysDown[it->second] = (event.key.type == SDL_KEYDOWN);
}
// Must I set the other io.KeysDown[...] here too ?
# else //IMIMPL_SDL2_USE_STL
// thanks to mattiasljungstrom:
const SDL_Scancode key = event.key.keysym.scancode;
if (key>=0 && key<512) io.KeysDown[key] = (event.key.type == SDL_KEYDOWN);
# endif //IMIMPL_SDL2_USE_STL
}
break;
//case SDL_TEXTEDITING: break;
case SDL_TEXTINPUT:
{
size_t i=0;char c;
while ((c = event.text.text[i])!='\0') {
if (c > 0 && c < 0x10000) ImGui::GetIO().AddInputCharacter((unsigned short)c);
if (++i==SDL_TEXTINPUTEVENT_TEXT_SIZE) break;
}
}
break;
case SDL_MOUSEBUTTONDOWN: /**< Mouse button pressed */
case SDL_MOUSEBUTTONUP: {
SDL_Keymod mod = SDL_GetModState();
io.KeyCtrl = (mod & (KMOD_LCTRL|KMOD_RCTRL)) != 0;
io.KeyShift = (mod & (KMOD_LSHIFT|KMOD_RSHIFT)) != 0;
if (event.button.button>0 && event.button.button<6) {
io.MouseDown[event.button.button-1] = (event.button.type == SDL_MOUSEBUTTONDOWN);
if (event.button.clicks==2 && event.button.type == SDL_MOUSEBUTTONDOWN) gImGuiBindingMouseDblClicked[event.button.button-1] = true;
//else gImGuiBindingMouseDblClicked[event.button.button-1] = false;
}
//fprintf(stderr,"mousePressed[%d] = %s\n",event.button.button-1,(event.button.type == SDL_MOUSEBUTTONDOWN)?"true":"false");
}
break;
break;
case SDL_MOUSEWHEEL:
// positive away from the user and negative toward the user
io.MouseWheel = (event.wheel.y != 0) ? event.wheel.y > 0 ? 1 : - 1 : 0; // Mouse wheel: -1,0,+1
//fprintf(stderr,"io.MouseWheel = %d (%d,%d)\n",io.MouseWheel,event.wheel.x,event.wheel.y); // set correctly, but why it does not seem to work ?
break;
case SDL_MOUSEMOTION:
io.MousePos = ImVec2((float)event.motion.x * mousePosScale.x, (float)event.motion.y * mousePosScale.y);
//fprintf(stderr,"io.MousePos (%1.2f,%1.2f)\n",io.MousePos.x,io.MousePos.y);
break;
case SDL_QUIT:
done = 1;
break;
default:
break;
}
}
// Setup io.DeltaTime
static Uint32 time = SDL_GetTicks();
const Uint32 current_time = SDL_GetTicks();
io.DeltaTime = (float)(0.001*(double)(current_time - time));
if (io.DeltaTime<=0) io.DeltaTime=1.0f/60.0f;
time = current_time;
// If needed we must wait (gImGuiInverseFPSClamp-io.DeltaTime) seconds (=> honestly I shouldn't add the * 2.0f factor at the end, but ImGui tells me the wrong FPS otherwise... why? <=)
if (gImGuiInverseFPSClamp>0 && io.DeltaTime < gImGuiInverseFPSClamp) WaitFor((unsigned int) ((gImGuiInverseFPSClamp-io.DeltaTime)*1000.f * 2.0f) );
if (!gImGuiPaused) {
ImGui::NewFrame();
for (size_t i = 0; i < 5; i++) {
io.MouseDoubleClicked[i]=gImGuiBindingMouseDblClicked[i]; // We manually set it (otherwise it won't work with low frame rates)
}
}
DrawGL();
if (!gImGuiPaused) {
glViewport(0, 0, (int)io.DisplaySize.x, (int)io.DisplaySize.y);
//glClearColor(0.8f, 0.6f, 0.6f, 1.0f);
//glClear(GL_COLOR_BUFFER_BIT);
ImGui::Render();
}
SDL_GL_SwapWindow(window);
}
DestroyGL();
ImGui::Shutdown();
DestroyImGuiFontTexture();
DestroyImGuiProgram();
DestroyImGuiBuffer();
SDL_Quit();
return 0;
}
#endif //#ifndef IMIMPL_BINDING_H

View file

@ -0,0 +1,395 @@
#ifndef IMIMPL_BINDING_H
#define IMIMPL_BINDING_H
#pragma warning (disable: 4996) // 'This function or variable may be unsafe': strcpy, strdup, sprintf, vsnprintf, sscanf, fopen
#include <windows.h>
#include <imm.h>
#include <imgui.h>
// glew (optional) & gl
#ifdef IMIMPL_USE_GLEW
//#define GLEW_STATIC // Optional, depending on which glew lib you want to use
#ifdef __APPLE__ // or __MACOSX__ ?
# include <OpenGL/glew.h> // guessing...
#else //__APPLE
# include <GL/glew.h>
#endif //__APPLE
#else //IMIMPL_USE_GLEW
// I've never managed to make this branch work => when using Windows, ALWAYS use glew (on Linux it's much easier)
#define GL_GLEXT_PROTOTYPES
#ifdef __APPLE__ // or __MACOSX__ ?
# include <OpenGL/glext.h> // guessing...
#else //__APPLE
# include <GL/glext.h>
#endif //__APPLE
#endif // IMIMPL_USE_GLEW
#ifdef __APPLE__ // or __MACOSX__ ?
# include <OpenGL/gl.h> // guessing...
#else //__APPLE
# include <GL/gl.h>
#endif //__APPLE
#include "ImImpl_RenderDrawLists.h"
static HWND window = NULL;
static ImVec2 mousePosScale(1.0f, 1.0f);
// Notify OS Input Method Editor of text input position (e.g. when using Japanese/Chinese inputs, otherwise this isn't needed)
static void ImImpl_ImeSetInputScreenPosFn(int x, int y)
{
HWND hwnd = window;
if (HIMC himc = ImmGetContext(hwnd))
{
COMPOSITIONFORM cf;
cf.ptCurrentPos.x = x;
cf.ptCurrentPos.y = y;
cf.dwStyle = CFS_FORCE_POSITION;
ImmSetCompositionWindow(himc, &cf);
}
}
static bool gImGuiBindingMouseDblClicked[5]={false,false,false,false,false};
static bool gImGuiAppIconized = false;
// Window Procedure
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
ImGuiIO& io = ImGui::GetIO();
switch (message)
{
case WM_SIZE:
switch (wParam)
{
case SIZE_MINIMIZED:
//fprintf(stderr,"SIZE_MINIMIZED %d %d\n",wParam,lParam);
return 0;
}
ResizeGL(LOWORD (lParam),HIWORD (lParam));
break;
case WM_CREATE:
return 0;
case WM_CLOSE:
PostQuitMessage( 0 );
return 0;
case WM_DESTROY:
return 0;
case WM_ACTIVATE:
gImGuiAppIconized = (HIWORD(wParam) == SIZE_MINIMIZED); // SIZE_MINIMIZED == 1
//fprintf(stderr,"WM_ACTIVATE %d %d %d gImGuiAppIconized=%d\n",wParam,LOWORD(wParam),HIWORD(wParam),gImGuiAppIconized);
return 0;
case WM_CHAR:
// You can also use ToAscii()+GetKeyboardState() to retrieve characters.
if (wParam>=0 && wParam<0x10000) io.AddInputCharacter((unsigned short)wParam);
return 0;
case WM_MOUSEMOVE:
io.MousePos = ImVec2((float)LOWORD(lParam) * mousePosScale.x, (float)HIWORD(lParam) * mousePosScale.y); // Mouse position, in pixels (set to -1,-1 if no mouse / on another screen, etc.)
return 0;
case WM_MOUSELEAVE:
io.MousePos.x = io.MousePos.y = -1.0f;
return 0;
case WM_MOUSEWHEEL:
io.KeyCtrl = (wParam&MK_CONTROL);
io.KeyShift = (wParam&MK_SHIFT);
io.MouseDown[0] = (wParam&MK_LBUTTON);
io.MouseDown[1] = (wParam&MK_MBUTTON);
io.MouseDown[2] = (wParam&MK_RBUTTON);
io.MouseWheel = GET_WHEEL_DELTA_WPARAM(wParam) > 0 ? 1 : -1; // it's 120 or -120
return 0;
case WM_LBUTTONDBLCLK:
io.KeyCtrl = (wParam&MK_CONTROL);
io.KeyShift = (wParam&MK_SHIFT);
gImGuiBindingMouseDblClicked[0] = true;
io.MousePos = ImVec2((float)LOWORD(lParam) * mousePosScale.x, (float)HIWORD(lParam) * mousePosScale.y); // Mouse position, in pixels (set to -1,-1 if no mouse / on another screen, etc.)
return 0;
case WM_MBUTTONDBLCLK:
io.KeyCtrl = (wParam&MK_CONTROL);
io.KeyShift = (wParam&MK_SHIFT);
gImGuiBindingMouseDblClicked[1] = true;
io.MousePos = ImVec2((float)LOWORD(lParam) * mousePosScale.x, (float)HIWORD(lParam) * mousePosScale.y); // Mouse position, in pixels (set to -1,-1 if no mouse / on another screen, etc.)
return 0;
case WM_RBUTTONDBLCLK:
io.KeyCtrl = (wParam&MK_CONTROL);
io.KeyShift = (wParam&MK_SHIFT);
gImGuiBindingMouseDblClicked[2] = true;
io.MousePos = ImVec2((float)LOWORD(lParam) * mousePosScale.x, (float)HIWORD(lParam) * mousePosScale.y); // Mouse position, in pixels (set to -1,-1 if no mouse / on another screen, etc.)
return 0;
case WM_LBUTTONDOWN:
io.KeyCtrl = (wParam&MK_CONTROL);
io.KeyShift = (wParam&MK_SHIFT);
io.MouseDown[0] = true;
io.MousePos = ImVec2((float)LOWORD(lParam) * mousePosScale.x, (float)HIWORD(lParam) * mousePosScale.y); // Mouse position, in pixels (set to -1,-1 if no mouse / on another screen, etc.)
return 0;
case WM_LBUTTONUP:
io.KeyCtrl = (wParam&MK_CONTROL);
io.KeyShift = (wParam&MK_SHIFT);
io.MouseDown[0] = false;
io.MousePos = ImVec2((float)LOWORD(lParam) * mousePosScale.x, (float)HIWORD(lParam) * mousePosScale.y); // Mouse position, in pixels (set to -1,-1 if no mouse / on another screen, etc.)
return 0;
case WM_MBUTTONDOWN:
io.KeyCtrl = (wParam&MK_CONTROL);
io.KeyShift = (wParam&MK_SHIFT);
io.MouseDown[1] = true;
io.MousePos = ImVec2((float)LOWORD(lParam) * mousePosScale.x, (float)HIWORD(lParam) * mousePosScale.y); // Mouse position, in pixels (set to -1,-1 if no mouse / on another screen, etc.)
return 0;
case WM_MBUTTONUP:
io.KeyCtrl = (wParam&MK_CONTROL);
io.KeyShift = (wParam&MK_SHIFT);
io.MouseDown[2] = false;
io.MousePos = ImVec2((float)LOWORD(lParam) * mousePosScale.x, (float)HIWORD(lParam) * mousePosScale.y); // Mouse position, in pixels (set to -1,-1 if no mouse / on another screen, etc.)
return 0;
case WM_RBUTTONDOWN:
io.KeyCtrl = (wParam&MK_CONTROL);
io.KeyShift = (wParam&MK_SHIFT);
io.MouseDown[2] = true;
io.MousePos = ImVec2((float)LOWORD(lParam) * mousePosScale.x, (float)HIWORD(lParam) * mousePosScale.y); // Mouse position, in pixels (set to -1,-1 if no mouse / on another screen, etc.)
return 0;
case WM_RBUTTONUP:
io.KeyCtrl = (wParam&MK_CONTROL);
io.KeyShift = (wParam&MK_SHIFT);
io.MouseDown[2] = false;
io.MousePos = ImVec2((float)LOWORD(lParam) * mousePosScale.x, (float)HIWORD(lParam) * mousePosScale.y); // Mouse position, in pixels (set to -1,-1 if no mouse / on another screen, etc.)
return 0;
default:
return DefWindowProc( hWnd, message, wParam, lParam );
}
return 0;
}
static void InitImGui(const ImImpl_InitParams* pOptionalInitParams=NULL) {
//int w, h;
int fb_w, fb_h;
//glfwGetWindowSize(window, &w, &h);
//glfwGetFramebufferSize(window, &fb_w, &fb_h);
mousePosScale.x = 1.f;//(float)fb_w / w; // Some screens e.g. Retina display have framebuffer size != from window size, and mouse inputs are given in window/screen coordinates.
mousePosScale.y = 1.f;//(float)fb_h / h;
RECT rect = {0};::GetClientRect(window,&rect);
fb_w = rect.right - rect.left;
fb_h = rect.bottom - rect.top;
ImGuiIO& io = ImGui::GetIO();
io.DisplaySize = ImVec2((float)fb_w, (float)fb_h); // Display size, in pixels. For clamping windows positions.
io.DeltaTime = 1.0f/60.0f; // Time elapsed since last frame, in seconds (in this sample app we'll override this every frame because our timestep is variable)
io.PixelCenterOffset = 0.0f; // Align OpenGL texels
io.KeyMap[ImGuiKey_Tab] = VK_TAB; // Keyboard mapping. ImGui will use those indices to peek into the io.KeyDown[] array.
io.KeyMap[ImGuiKey_LeftArrow] = VK_LEFT;
io.KeyMap[ImGuiKey_RightArrow] = VK_RIGHT;
io.KeyMap[ImGuiKey_UpArrow] = VK_UP;
io.KeyMap[ImGuiKey_DownArrow] = VK_DOWN;
io.KeyMap[ImGuiKey_Home] = VK_HOME;
io.KeyMap[ImGuiKey_End] = VK_END;
io.KeyMap[ImGuiKey_Delete] = VK_DELETE;
io.KeyMap[ImGuiKey_Backspace] = VK_BACK;
io.KeyMap[ImGuiKey_Enter] = VK_RETURN;
io.KeyMap[ImGuiKey_Escape] = VK_ESCAPE;
io.KeyMap[ImGuiKey_A] = 'A';
io.KeyMap[ImGuiKey_C] = 'C';
io.KeyMap[ImGuiKey_V] = 'V';
io.KeyMap[ImGuiKey_X] = 'X';
io.KeyMap[ImGuiKey_Y] = 'Y';
io.KeyMap[ImGuiKey_Z] = 'Z';
io.RenderDrawListsFn = ImImpl_RenderDrawLists;
io.ImeSetInputScreenPosFn = ImImpl_ImeSetInputScreenPosFn;
// 3 common init steps
InitImGuiFontTexture(pOptionalInitParams);
InitImGuiProgram();
InitImGuiBuffer();
}
// Application code
int ImImpl_WinMain(const ImImpl_InitParams* pOptionalInitParams,HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int iCmdShow)
{
WNDCLASS wc;
HWND hWnd;
HDC hDC;
HGLRC hRC;
MSG msg;
BOOL quit = FALSE;
// register window class
wc.style = CS_OWNDC | CS_DBLCLKS;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon( NULL, IDI_APPLICATION );
wc.hCursor = LoadCursor( NULL, IDC_ARROW );
wc.hbrBackground = (HBRUSH)GetStockObject( BLACK_BRUSH );
wc.lpszMenuName = NULL;
wc.lpszClassName = "ImGuiApp";
RegisterClass( &wc );
const int width = pOptionalInitParams ? pOptionalInitParams->gWindowSize.x : 1270;
const int height = pOptionalInitParams ? pOptionalInitParams->gWindowSize.y : 720;
// create main window
window = hWnd = CreateWindow(
"ImGuiApp",
(pOptionalInitParams && pOptionalInitParams->gWindowTitle[0]!='\0') ? (const char*) &pOptionalInitParams->gWindowTitle[0] : "ImGui WinApi OpenGL Example",
WS_CAPTION | WS_VISIBLE | WS_OVERLAPPEDWINDOW,
0, 0,
width,
height,
NULL, NULL, hInstance, NULL );
// enable OpenGL for the window-------------------------------------------------
PIXELFORMATDESCRIPTOR pfd;
int format;
// get the device context (DC)
hDC = GetDC( hWnd );
// set the pixel format for the DC
ZeroMemory( &pfd, sizeof( pfd ) );
pfd.nSize = sizeof( pfd );
pfd.nVersion = 1;
pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
pfd.iPixelType = PFD_TYPE_RGBA;
pfd.cColorBits = 24;
pfd.cDepthBits = 16;
pfd.cStencilBits = 1;
pfd.iLayerType = PFD_MAIN_PLANE;
format = ChoosePixelFormat( hDC, &pfd );
SetPixelFormat( hDC, format, &pfd );
// create and enable the render context (RC)
hRC = wglCreateContext( hDC );
wglMakeCurrent( hDC, hRC );
//----------------------------------------------------------------------------------
//OpenGL info
{
printf("GL Vendor: %s\n", glGetString( GL_VENDOR ));
printf("GL Renderer : %s\n", glGetString( GL_RENDERER ));
printf("GL Version (string) : %s\n", glGetString( GL_VERSION ));
printf("GLSL Version : %s\n", glGetString( GL_SHADING_LANGUAGE_VERSION ));
//printf("GL Extensions:\n%s\n",(char *) glGetString(GL_EXTENSIONS));
}
#ifdef IMIMPL_USE_GLEW
GLenum err = glewInit();
if( GLEW_OK != err )
{
fprintf(stderr, "Error initializing GLEW: %s\n",
glewGetErrorString(err) );
}
#endif //IMIMPL_USE_GLEW
static double time = 0.0f;
gImGuiInverseFPSClamp = pOptionalInitParams ? ((pOptionalInitParams->gFpsClamp!=0) ? (1.0f/pOptionalInitParams->gFpsClamp) : 1.0f) : -1.0f;
InitImGui(pOptionalInitParams);
InitGL();
ResizeGL(width,height);
ImGuiIO& io = ImGui::GetIO();
// program main loop
while ( !quit )
{
for (size_t i = 0; i < 5; i++) gImGuiBindingMouseDblClicked[i] = false; // We manually set it (otherwise it won't work with low frame rates)
// check for messages
if ( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) )
{
// handle or dispatch messages
if ( msg.message == WM_QUIT )
{
quit = TRUE;
}
else
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
};
// Setup timestep
const double current_time = ::GetTickCount();
io.DeltaTime = (float) ((current_time - time)*0.001);
time = current_time;
if (io.DeltaTime<=0) io.DeltaTime = 1.0f/60.0f;
// If needed we must wait (gImGuiInverseFPSClamp-io.DeltaTime) seconds (=> honestly I shouldn't add the * 2.0f factor at the end, but ImGui tells me the wrong FPS otherwise... why? <=)
if (gImGuiInverseFPSClamp>0 && io.DeltaTime < gImGuiInverseFPSClamp) WaitFor((unsigned int) ((gImGuiInverseFPSClamp-io.DeltaTime)*1000.f * 2.0f) );
if (!gImGuiPaused) {
// Setup inputs
BYTE keystate[256];
::GetKeyboardState(keystate);
for (int i = 0; i < 256; i++) io.KeysDown[i] = (keystate[i] & 0x80) != 0;
io.KeyCtrl = (keystate[VK_CONTROL] & 0x80) != 0;
io.KeyShift = (keystate[VK_SHIFT] & 0x80) != 0;
// Start the frame
ImGui::NewFrame();
for (size_t i = 0; i < 5; i++) {
io.MouseDoubleClicked[i]=gImGuiBindingMouseDblClicked[i]; // We manually set it (otherwise it won't work with low frame rates)
}
}
DrawGL();
if (!gImGuiPaused) {
// Rendering
glViewport(0, 0, (int)io.DisplaySize.x, (int)io.DisplaySize.y);
//glClearColor(0.8f, 0.6f, 0.6f, 1.0f);
//glClear(GL_COLOR_BUFFER_BIT);
ImGui::Render();
}
SwapBuffers( hDC );
if (gImGuiAppIconized) WaitFor(500);
}
DestroyGL();
ImGui::Shutdown();
DestroyImGuiFontTexture();
DestroyImGuiProgram();
DestroyImGuiBuffer();
// shutdown OpenGL
wglMakeCurrent( NULL, NULL );
wglDeleteContext( hRC );
ReleaseDC( hWnd, hDC );
// destroy the window explicitly
DestroyWindow( hWnd );
return msg.wParam;
}
#endif //#ifndef IMIMPL_BINDING_H

View file

@ -0,0 +1,615 @@
#ifndef IMIMPL_RENDERDRAWLISTS_H
#define IMIMPL_RENDERDRAWLISTS_H
#include <string.h>
#include <stdio.h>
extern void InitGL();
extern void ResizeGL(int w,int h);
extern void DrawGL();
extern void DestroyGL();
// These variables can be declared extern and set at runtime-----------------------------------------------------
bool gImGuiPaused = false;
float gImGuiInverseFPSClamp = -1.0f; // CAN'T BE 0. < 0 = No clamping.
// --------------------------------------------------------------------------------------------------------------
struct ImImpl_InitParams {
ImVec2 gWindowSize;
char gWindowTitle[1024];
char gOptionalFntFilePath[2048];
char gOptionalImageFilePath[2048];
ImVec2 gOptionalTexCoordUVForWhite;
float gFpsClamp; // <0 -> no clamp
const unsigned char* pOptionalReferenceToFntFileInMemory;
size_t pOptionalSizeOfFntFileInMemory;
const unsigned char* pOptionalReferenceToImageFileInMemory;
size_t pOptionalSizeOfImageFileInMemory;
ImImpl_InitParams(
int windowWidth=1270,
int windowHeight=720,
const char* windowTitle=NULL,
const char* optionalFntFilePath=NULL,
const char* optionalImageFilePath=NULL,
float optionalTexCoordUForWhite=-1.f,
float optionalTexCoordVForWhite=-1.f
,const unsigned char* _pOptionalReferenceToFntFileInMemory=NULL,
size_t _pOptionalSizeOfFntFileInMemory=0,
const unsigned char* _pOptionalReferenceToImageFileInMemory=NULL,
size_t _pOptionalSizeOfImageFileInMemory=0
) : gFpsClamp(-1.0f)
,pOptionalReferenceToFntFileInMemory(_pOptionalReferenceToFntFileInMemory),
pOptionalSizeOfFntFileInMemory(_pOptionalSizeOfFntFileInMemory),
pOptionalReferenceToImageFileInMemory(_pOptionalReferenceToImageFileInMemory),
pOptionalSizeOfImageFileInMemory(_pOptionalSizeOfImageFileInMemory)
{
gWindowSize.x = windowWidth<=0?1270:windowWidth;gWindowSize.y = windowHeight<=0?720:windowHeight;
gOptionalTexCoordUVForWhite.x = optionalTexCoordUForWhite;
gOptionalTexCoordUVForWhite.y = optionalTexCoordVForWhite;
gWindowTitle[0]='\0';
if (windowTitle) {
const size_t len = strlen(windowTitle);
if (len<1023) strcat(gWindowTitle,windowTitle);
else {
memcpy(gWindowTitle,windowTitle,1023);
gWindowTitle[1023]='\0';
}
}
else strcat(gWindowTitle,"ImGui OpenGL Example");
gOptionalFntFilePath[0]='\0';
if (optionalFntFilePath) {
const size_t len = strlen(optionalFntFilePath);
if (len<2047) strcat(gOptionalFntFilePath,optionalFntFilePath);
}
gOptionalImageFilePath[0]='\0';
if (optionalImageFilePath) {
const size_t len = strlen(optionalImageFilePath);
if (len<2047) strcat(gOptionalImageFilePath,optionalImageFilePath);
}
}
};
struct ImImpl_PrivateParams {
#ifndef IMIMPL_SHADER_NONE
#ifndef IMIMPL_NUM_ROUND_ROBIN_VERTEX_BUFFERS
#define IMIMPL_NUM_ROUND_ROBIN_VERTEX_BUFFERS 1
#elif (IMIMPL_NUM_ROUND_ROBIN_VERTEX_BUFFERS<=0)
#undef IMIMPL_NUM_ROUND_ROBIN_VERTEX_BUFFERS
#define IMIMPL_NUM_ROUND_ROBIN_VERTEX_BUFFERS 1
#endif //IMIMPL_NUM_ROUND_ROBIN_VERTEX_BUFFERS
GLuint vertexBuffers[IMIMPL_NUM_ROUND_ROBIN_VERTEX_BUFFERS];
GLuint program;
// gProgram uniform locations:
GLint uniLocOrthoMatrix;
GLint uniLocTexture;
// gProgram attribute locations:
GLint attrLocPosition;
GLint attrLocUV;
GLint attrLocColour;
// font texture
GLuint fontTex;
ImImpl_PrivateParams() :program(0),uniLocOrthoMatrix(-1),uniLocTexture(-1),
attrLocPosition(-1),attrLocUV(-1),attrLocColour(-1),fontTex(0)
{for (int i=0;i<IMIMPL_NUM_ROUND_ROBIN_VERTEX_BUFFERS;i++) vertexBuffers[i]=0;}
#else //IMIMPL_SHADER_NONE
// font texture
GLuint fontTex;
ImImpl_PrivateParams() :fontTex(0) {}
#endif //IMIMPL_SHADER_NONE
};
static ImImpl_PrivateParams gImImplPrivateParams;
#ifndef IMIMPL_SHADER_NONE
static GLuint CompileShaders(const GLchar** vertexShaderSource, const GLchar** fragmentShaderSource )
{
//Compile vertex shader
GLuint vertexShader( glCreateShader( GL_VERTEX_SHADER ) );
glShaderSource( vertexShader, 1, vertexShaderSource, NULL );
glCompileShader( vertexShader );
// check
GLint bShaderCompiled;
glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &bShaderCompiled);
if (!bShaderCompiled) {
int i32InfoLogLength, i32CharsWritten;
glGetShaderiv(vertexShader, GL_INFO_LOG_LENGTH, &i32InfoLogLength);
char* pszInfoLog = new char[i32InfoLogLength];
glGetShaderInfoLog(vertexShader, i32InfoLogLength, &i32CharsWritten, pszInfoLog);
printf("********VertexShader %s\n", pszInfoLog);
delete[] pszInfoLog;
}
//Compile fragment shader
GLuint fragmentShader( glCreateShader( GL_FRAGMENT_SHADER ) );
glShaderSource( fragmentShader, 1, fragmentShaderSource, NULL );
glCompileShader( fragmentShader );
//check
glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &bShaderCompiled);
if (!bShaderCompiled) {
int i32InfoLogLength, i32CharsWritten;
glGetShaderiv(fragmentShader, GL_INFO_LOG_LENGTH, &i32InfoLogLength);
char* pszInfoLog = new char[i32InfoLogLength];
glGetShaderInfoLog(fragmentShader, i32InfoLogLength, &i32CharsWritten, pszInfoLog);
printf("********FragmentShader %s\n", pszInfoLog);
delete[] pszInfoLog;
}
//Link vertex and fragment shader together
GLuint program( glCreateProgram() );
glAttachShader( program, vertexShader );
glAttachShader( program, fragmentShader );
glLinkProgram( program );
//check
GLint bLinked;
glGetProgramiv(program, GL_LINK_STATUS, &bLinked);
if (!bLinked) {
int i32InfoLogLength, i32CharsWritten;
glGetProgramiv(program, GL_INFO_LOG_LENGTH, &i32InfoLogLength);
char* pszInfoLog = new char[i32InfoLogLength];
glGetProgramInfoLog(program, i32InfoLogLength, &i32CharsWritten, pszInfoLog);
printf("%s",pszInfoLog);
delete[] pszInfoLog;
}
//Delete shaders objects
glDeleteShader( vertexShader );
glDeleteShader( fragmentShader );
return program;
}
#endif //IMIMPL_SHADER_NONE
static void DestroyImGuiFontTexture() {
if (gImImplPrivateParams.fontTex) {
glDeleteTextures( 1, &gImImplPrivateParams.fontTex );
gImImplPrivateParams.fontTex = 0;
}
}
#ifndef STBI_INCLUDE_STB_IMAGE_H
#define STB_IMAGE_IMPLEMENTATION
#include "stb_image.h"
#endif //STBI_INCLUDE_STB_IMAGE_H
static void InitImGuiFontTexture(const ImImpl_InitParams* pOptionalInitParams=NULL) {
const char* optionalFntFilePath=NULL;
const char* optionalImageFilePath=NULL;
float optionalTexCoordUForWhite=-1;
float optionalTexCoordVForWhite=-1;
if (pOptionalInitParams) {
if (pOptionalInitParams->gOptionalFntFilePath[0]!='\0') optionalFntFilePath = (const char*) &pOptionalInitParams->gOptionalFntFilePath[0];
if (pOptionalInitParams->gOptionalImageFilePath[0]!='\0') optionalImageFilePath = (const char*) &pOptionalInitParams->gOptionalImageFilePath[0];
optionalTexCoordUForWhite = pOptionalInitParams->gOptionalTexCoordUVForWhite.x;
optionalTexCoordVForWhite = pOptionalInitParams->gOptionalTexCoordUVForWhite.y;
}
ImGuiIO& io = ImGui::GetIO();
DestroyImGuiFontTexture(); // reentrant
// Load font texture
glGenTextures(1, &gImImplPrivateParams.fontTex);
glBindTexture(GL_TEXTURE_2D, gImImplPrivateParams.fontTex);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
void* tex_data = NULL;
int tex_x=0, tex_y=0;
bool fontOk = false;
if (optionalFntFilePath && optionalImageFilePath) {
// Custom font from filesystem
io.Font = new ImBitmapFont();
io.Font->LoadFromFile(optionalFntFilePath);
if (io.Font->IsLoaded()) {
int tex_comp;
tex_data = stbi_load(optionalImageFilePath, &tex_x, &tex_y, &tex_comp, 4);
if(tex_data != NULL) {
fontOk = true;
if (optionalTexCoordUForWhite<0 || optionalTexCoordVForWhite<0) {
// Automatically find white pixel from the texture we just loaded
// (io.FontTexUvForWhite needs to contains UV coordinates pointing to a white pixel in order to render solid objects)
bool found = false;
for (int tex_data_off = 0; tex_data_off < tex_x*tex_y; tex_data_off++)
if (((unsigned int*)tex_data)[tex_data_off] == 0xffffffff) {
io.FontTexUvForWhite = ImVec2((float)(tex_data_off % tex_x)/(tex_x), (float)(tex_data_off / tex_x)/(tex_y));
found = true;
break;
}
if (!found) {
fprintf(stderr,"Error: white pixel not found in font image: \"%s\"\n",optionalImageFilePath);
fontOk = false;
}
else printf("InitImGuiFontTexture(...) Tip: for faster loading \"%s\" please use: optionalTexCoordUForWhite = %1.10f, optionalTexCoordVForWhite = %1.10f\n",optionalImageFilePath,io.FontTexUvForWhite.x,io.FontTexUvForWhite.y);
}
else {io.FontTexUvForWhite.x = optionalTexCoordUForWhite;io.FontTexUvForWhite.y = optionalTexCoordVForWhite;}
}
}
}
// IMIMPL_ALLOW_CLIENT_EMBEDDED_FONT
if (!fontOk && pOptionalInitParams) {
const unsigned char* pFnt = pOptionalInitParams->pOptionalReferenceToFntFileInMemory;
const size_t fntSize = pOptionalInitParams->pOptionalSizeOfFntFileInMemory;
const unsigned char* pImg = pOptionalInitParams->pOptionalReferenceToImageFileInMemory;
const size_t imgSize = pOptionalInitParams->pOptionalSizeOfImageFileInMemory;
if (pFnt && fntSize>0 && pImg && imgSize>0) {
if (io.Font) {delete io.Font; io.Font = NULL;}
if (tex_data) {stbi_image_free(tex_data);tex_data=0;}
// Load custom font (embedded in code)
io.Font = new ImBitmapFont();
io.Font->LoadFromMemory(pFnt, fntSize);
io.FontYOffset = +1;
if (io.Font->IsLoaded()) {
int tex_comp;
tex_data = stbi_load_from_memory(pImg, (int)imgSize, &tex_x, &tex_y, &tex_comp, 4);
if(tex_data != NULL) {
fontOk = true;
if (optionalTexCoordUForWhite<0 || optionalTexCoordVForWhite<0) {
// Automatically find white pixel from the texture we just loaded
// (io.FontTexUvForWhite needs to contains UV coordinates pointing to a white pixel in order to render solid objects)
bool found = false;
for (int tex_data_off = 0; tex_data_off < tex_x*tex_y; tex_data_off++)
if (((unsigned int*)tex_data)[tex_data_off] == 0xffffffff) {
io.FontTexUvForWhite = ImVec2((float)(tex_data_off % tex_x)/(tex_x), (float)(tex_data_off / tex_x)/(tex_y));
found = true;
break;
}
if (!found) {
fprintf(stderr,"Error: white pixel not found in embedded font image.\n");
fontOk = false;
}
else printf("InitImGuiFontTexture(...) Tip: for faster loading the embedded font image please use: optionalTexCoordUForWhite = %1.10f, optionalTexCoordVForWhite = %1.10f\n",io.FontTexUvForWhite.x,io.FontTexUvForWhite.y);
}
else {io.FontTexUvForWhite.x = optionalTexCoordUForWhite;io.FontTexUvForWhite.y = optionalTexCoordVForWhite;}
}
}
}
}
// end IMIMPL_ALLOW_CLIENT_EMBEDDED_FONT
if (!fontOk) {
if (io.Font) {delete io.Font; io.Font = NULL;}
if (tex_data) {stbi_image_free(tex_data);tex_data=0;}
// Default font (embedded in code)
const void* png_data;
unsigned int png_size;
ImGui::GetDefaultFontData(NULL, NULL, &png_data, &png_size);
int tex_comp;
tex_data = stbi_load_from_memory((const unsigned char*)png_data, (int)png_size, &tex_x, &tex_y, &tex_comp, 4);
fontOk = (tex_data != NULL);
}
if (fontOk) {
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, tex_x, tex_y, 0, GL_RGBA, GL_UNSIGNED_BYTE, tex_data);
stbi_image_free(tex_data);tex_data=0;
}
else {
if (io.Font) {delete io.Font; io.Font = NULL;}
if (tex_data) {stbi_image_free(tex_data);tex_data=0;}
}
}
static void InitImGuiProgram() {
#ifndef IMIMPL_SHADER_NONE
// -----------------------------------------------------------------------
// START SHADER CODE
//------------------------------------------------------------------------
// shaders
#ifdef IMIMPL_SHADER_GL3
static const GLchar* gVertexShaderSource[] = {
#ifdef IMIMPL_SHADER_GLES
"#version 300 es\n"
#else //IMIMPL_SHADER_GLES
"#version 330\n"
#endif //IMIMPL_SHADER_GLES
"precision highp float;\n"
"uniform mat4 ortho;\n"
"layout (location = 0 ) in vec2 Position;\n"
"layout (location = 1 ) in vec2 UV;\n"
"layout (location = 2 ) in vec4 Colour;\n"
"out vec2 Frag_UV;\n"
"out vec4 Frag_Colour;\n"
"void main()\n"
"{\n"
" Frag_UV = UV;\n"
" Frag_Colour = Colour;\n"
"\n"
" gl_Position = ortho*vec4(Position.xy,0,1);\n"
"}\n"
};
static const GLchar* gFragmentShaderSource[] = {
#ifdef IMIMPL_SHADER_GLES
"#version 300 es\n"
#else //IMIMPL_SHADER_GLES
"#version 330\n"
#endif //IMIMPL_SHADER_GLES
"precision mediump float;\n"
"uniform lowp sampler2D Texture;\n"
"in vec2 Frag_UV;\n"
"in vec4 Frag_Colour;\n"
"out vec4 FragColor;\n"
"void main()\n"
"{\n"
" FragColor = Frag_Colour * texture( Texture, Frag_UV.st);\n"
"}\n"
};
#else //NO IMIMPL_SHADER_GL3
static const GLchar* gVertexShaderSource[] = {
#ifdef IMIMPL_SHADER_GLES
"#version 100\n"
"precision highp float;\n"
#endif //IMIMPL_SHADER_GLES
"uniform mat4 ortho;\n"
"attribute vec2 Position;\n"
"attribute vec2 UV;\n"
"attribute vec4 Colour;\n"
"varying vec2 Frag_UV;\n"
"varying vec4 Frag_Colour;\n"
"void main()\n"
"{\n"
" Frag_UV = UV;\n"
" Frag_Colour = Colour;\n"
"\n"
" gl_Position = ortho*vec4(Position.xy,0,1);\n"
"}\n"
};
static const GLchar* gFragmentShaderSource[] = {
#ifdef IMIMPL_SHADER_GLES
"#version 100\n"
"precision mediump float;\n"
"uniform lowp sampler2D Texture;\n"
#else //IMIMPL_SHADER_GLES
"uniform sampler2D Texture;\n"
#endif //IMIMPL_SHADER_GLES
"varying vec2 Frag_UV;\n"
"varying vec4 Frag_Colour;\n"
"void main()\n"
"{\n"
" gl_FragColor = Frag_Colour * texture2D( Texture, Frag_UV.st);\n"
"}\n"
};
#endif //IMIMPL_SHADER_GL3
//------------------------------------------------------------------------
// END SHADER CODE
//------------------------------------------------------------------------
if (gImImplPrivateParams.program==0) {
gImImplPrivateParams.program = CompileShaders(gVertexShaderSource, gFragmentShaderSource );
if (gImImplPrivateParams.program==0) {
fprintf(stderr,"Error compiling shaders.\n");
return;
}
//Get Uniform locations
gImImplPrivateParams.uniLocTexture = glGetUniformLocation(gImImplPrivateParams.program,"Texture");
gImImplPrivateParams.uniLocOrthoMatrix = glGetUniformLocation(gImImplPrivateParams.program,"ortho");
//Get Attribute locations
gImImplPrivateParams.attrLocPosition = glGetAttribLocation(gImImplPrivateParams.program,"Position");
gImImplPrivateParams.attrLocUV = glGetAttribLocation(gImImplPrivateParams.program,"UV");
gImImplPrivateParams.attrLocColour = glGetAttribLocation(gImImplPrivateParams.program,"Colour");
// Debug
/*
printf("gUniLocTexture = %d\n",gImImplPrivateParams.gUniLocTexture);
printf("gUniLocLayers = %d\n",gImImplPrivateParams.gUniLocOrthoMatrix);
printf("gAttrLocPosition = %d\n",gImImplPrivateParams.gAttrLocPosition);
printf("gAttrLocUV = %d\n",gImImplPrivateParams.gAttrLocUV);
printf("gAttrLocColour = %d\n",gImImplPrivateParams.gAttrLocColour);
*/
}
#endif //IMIMPL_SHADER_NONE
}
static void DestroyImGuiProgram() {
#ifndef IMIMPL_SHADER_NONE
if (gImImplPrivateParams.program) {
glDeleteProgram(gImImplPrivateParams.program);
gImImplPrivateParams.program = 0;
}
#endif //IMIMPL_SHADER_NONE
}
static void InitImGuiBuffer() {
#ifndef IMIMPL_SHADER_NONE
if (gImImplPrivateParams.vertexBuffers[0]==0) glGenBuffers(IMIMPL_NUM_ROUND_ROBIN_VERTEX_BUFFERS, &gImImplPrivateParams.vertexBuffers[0]);
#endif //IMIMPL_SHADER_NONE
}
static void DestroyImGuiBuffer() {
#ifndef IMIMPL_SHADER_NONE
if (gImImplPrivateParams.vertexBuffers[0]) {
glDeleteBuffers( IMIMPL_NUM_ROUND_ROBIN_VERTEX_BUFFERS, &gImImplPrivateParams.vertexBuffers[0] );
gImImplPrivateParams.vertexBuffers[0] = 0;
}
#endif //IMIMPL_SHADER_NONE
}
static void ImImpl_RenderDrawLists(ImDrawList** const cmd_lists, int cmd_lists_count)
{
// ----------------------------------------------------------------------------------------------------------------
// Warning: we SHOULD store the gl state here and restore it later; we don't do it: we just return a gl state with:
// GL_BLEND,GL_SCISSOR_TEST disabled
// GL_DEPTH_TEST enabled
// glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
// glCullFace(GL_BACK);
// glActiveTexture(GL_TEXTURE0); with bound texture our font texture
// glEnable(GL_TEXTURE_2D); // Only in case IMIMPL_SHADER_NONE is defined
// These settings should not harm most applications
// -----------------------------------------------------------------------------------------------------------------
#ifndef IMIMPL_SHADER_NONE
size_t total_vtx_count = 0;
for (int n = 0; n < cmd_lists_count; n++) total_vtx_count += cmd_lists[n]->vtx_buffer.size();
if (total_vtx_count == 0) return;
static int bufferNum = 0;
#if IMIMPL_NUM_ROUND_ROBIN_VERTEX_BUFFERS > 1
if (++bufferNum == IMIMPL_NUM_ROUND_ROBIN_VERTEX_BUFFERS) bufferNum = 0;
//fprintf(stderr,"Using buffer: %d\n",bufferNum);
#endif //IMIMPL_NUM_ROUND_ROBIN_VERTEX_BUFFERS
glBindBuffer(GL_ARRAY_BUFFER, gImImplPrivateParams.vertexBuffers[bufferNum]);
glBufferData(GL_ARRAY_BUFFER, total_vtx_count * sizeof(ImDrawVert), NULL, GL_STREAM_DRAW);
GLintptr dataOffset = 0;
for (int n = 0; n < cmd_lists_count; n++) {
const ImDrawList* cmd_list = cmd_lists[n];
glBufferSubData(GL_ARRAY_BUFFER,dataOffset,cmd_list->vtx_buffer.size() * sizeof(ImDrawVert),&cmd_list->vtx_buffer[0]);
dataOffset += cmd_list->vtx_buffer.size() * sizeof(ImDrawVert);
}
// Setup render state: alpha-blending enabled, no face culling (or GL_FRONT face culling), no depth testing, scissor enabled
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glCullFace(GL_FRONT); // with this I can leave GL_CULL_FACE as it is
glDisable(GL_DEPTH_TEST);
glEnable(GL_SCISSOR_TEST);
// Setup texture
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, gImImplPrivateParams.fontTex);
// Setup program and uniforms
glUseProgram(gImImplPrivateParams.program);
glUniform1i(gImImplPrivateParams.uniLocTexture, 0);
// Setup orthographic projection matrix
const float width = ImGui::GetIO().DisplaySize.x;
const float height = ImGui::GetIO().DisplaySize.y;
const float ortho[4][4] = {
{ 2.0f/width, 0.0f, 0.0f, 0.0f },
{ 0.0f, 2.0f/-height, 0.0f, 0.0f },
{ 0.0f, 0.0f, -1.0f, 0.0f },
{ -1.0f, 1.0f, 0.0f, 1.0f },
};
glUniformMatrix4fv(gImImplPrivateParams.uniLocOrthoMatrix, 1, GL_FALSE, &ortho[0][0]);
glEnableVertexAttribArray(gImImplPrivateParams.attrLocPosition);
glEnableVertexAttribArray(gImImplPrivateParams.attrLocUV);
glEnableVertexAttribArray(gImImplPrivateParams.attrLocColour);
glVertexAttribPointer(gImImplPrivateParams.attrLocPosition, 2, GL_FLOAT, GL_FALSE, sizeof(ImDrawVert), (const void*)(0));
glVertexAttribPointer(gImImplPrivateParams.attrLocUV, 2, GL_FLOAT, GL_FALSE, sizeof(ImDrawVert), (const void*)(0 + 8));
glVertexAttribPointer(gImImplPrivateParams.attrLocColour, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(ImDrawVert), (const void*)(0 + 16));
int vtx_offset = 0;
for (int n = 0; n < cmd_lists_count; n++)
{
const ImDrawList* cmd_list = cmd_lists[n];
const ImDrawCmd* pcmd_end = cmd_list->commands.end();
for (const ImDrawCmd* pcmd = cmd_list->commands.begin(); pcmd != pcmd_end; pcmd++) {
glScissor((int)pcmd->clip_rect.x, (int)(height - pcmd->clip_rect.w), (int)(pcmd->clip_rect.z - pcmd->clip_rect.x), (int)(pcmd->clip_rect.w - pcmd->clip_rect.y));
glDrawArrays(GL_TRIANGLES, vtx_offset, pcmd->vtx_count);
vtx_offset += pcmd->vtx_count;
}
}
glDisableVertexAttribArray(gImImplPrivateParams.attrLocPosition);
glDisableVertexAttribArray(gImImplPrivateParams.attrLocUV);
glDisableVertexAttribArray(gImImplPrivateParams.attrLocColour);
glUseProgram(0);
glEnable(GL_DEPTH_TEST);
glDisable(GL_SCISSOR_TEST);
glCullFace(GL_BACK);
glDisable(GL_BLEND);
#else //IMIMPL_SHADER_NONE
if (cmd_lists_count == 0)
return;
// We are using the OpenGL fixed pipeline to make the example code simpler to read!
// A probable faster way to render would be to collate all vertices from all cmd_lists into a single vertex buffer.
// Setup render state: alpha-blending enabled, no face culling, no depth testing, scissor enabled, vertex/texcoord/color pointers.
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glCullFace(GL_FRONT); // with this I can leave GL_CULL_FACE as it is
glDisable(GL_DEPTH_TEST);
glEnable(GL_SCISSOR_TEST);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
// Setup texture
glBindTexture(GL_TEXTURE_2D, gImImplPrivateParams.fontTex);
glEnable(GL_TEXTURE_2D);
// Setup orthographic projection matrix
const float width = ImGui::GetIO().DisplaySize.x;
const float height = ImGui::GetIO().DisplaySize.y;
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0.0f, width, height, 0.0f, -1.0f, +1.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
// Render command lists
for (int n = 0; n < cmd_lists_count; n++)
{
const ImDrawList* cmd_list = cmd_lists[n];
const unsigned char* vtx_buffer = (const unsigned char*)cmd_list->vtx_buffer.begin();
glVertexPointer(2, GL_FLOAT, sizeof(ImDrawVert), (void*)(vtx_buffer));
glTexCoordPointer(2, GL_FLOAT, sizeof(ImDrawVert), (void*)(vtx_buffer+8));
glColorPointer(4, GL_UNSIGNED_BYTE, sizeof(ImDrawVert), (void*)(vtx_buffer+16));
int vtx_offset = 0;
const ImDrawCmd* pcmd_end = cmd_list->commands.end();
for (const ImDrawCmd* pcmd = cmd_list->commands.begin(); pcmd != pcmd_end; pcmd++)
{
glScissor((int)pcmd->clip_rect.x, (int)(height - pcmd->clip_rect.w), (int)(pcmd->clip_rect.z - pcmd->clip_rect.x), (int)(pcmd->clip_rect.w - pcmd->clip_rect.y));
glDrawArrays(GL_TRIANGLES, vtx_offset, pcmd->vtx_count);
vtx_offset += pcmd->vtx_count;
}
}
glDisable(GL_SCISSOR_TEST);
glDisableClientState(GL_COLOR_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);
glEnable(GL_DEPTH_TEST);
glDisable(GL_SCISSOR_TEST);
glCullFace(GL_BACK);
glDisable(GL_BLEND);
#endif //IMIMPL_SHADER_NONE
}
#ifndef _WIN32
#include <unistd.h>
#else //_WIN32
// Is there a header with ::Sleep(...) ?
#endif //_WIN32
static void WaitFor(unsigned int ms) {
#ifdef _WIN32
if (ms > 0) Sleep(ms);
#else
// delta in microseconds
useconds_t delta = (useconds_t) ms * 1000;
// On some systems, the usleep argument must be < 1000000
while (delta > 999999L) {
usleep(999999);
delta -= 999999L;
}
if (delta > 0L) usleep(delta);
#endif
}
#endif //IMIMPL_RENDERDRAWLISTS_H

View file

@ -0,0 +1,104 @@
DejaVu Fonts License v1.00
——————————————————————————————
This license can also be found at this permalink: http://www.fontsquirrel.com/license/dejavu-sans
Fonts are (c) Bitstream (see below). DejaVu changes are in public domain.
Glyphs imported from Arev fonts are (c) Tavmjong Bah (see below)
Bitstream Vera Fonts Copyright
——————————————————————————————
Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is
a trademark of Bitstream, Inc.
Permission is hereby granted, free of charge, to any person obtaining a copy
of the fonts accompanying this license (“Fonts”) and associated
documentation files (the “Font Software”), to reproduce and distribute the
Font Software, including without limitation the rights to use, copy, merge,
publish, distribute, and/or sell copies of the Font Software, and to permit
persons to whom the Font Software is furnished to do so, subject to the
following conditions:
The above copyright and trademark notices and this permission notice shall
be included in all copies of one or more of the Font Software typefaces.
The Font Software may be modified, altered, or added to, and in particular
the designs of glyphs or characters in the Fonts may be modified and
additional glyphs or characters may be added to the Fonts, only if the fonts
are renamed to names not containing either the words “Bitstream” or the word
“Vera”.
This License becomes null and void to the extent applicable to Fonts or Font
Software that has been modified and is distributed under the “Bitstream
Vera” names.
The Font Software may be sold as part of a larger software package but no
copy of one or more of the Font Software typefaces may be sold by itself.
THE FONT SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT,
TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME
FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING
ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES,
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE
FONT SOFTWARE.
Except as contained in this notice, the names of Gnome, the Gnome
Foundation, and Bitstream Inc., shall not be used in advertising or
otherwise to promote the sale, use or other dealings in this Font Software
without prior written authorization from the Gnome Foundation or Bitstream
Inc., respectively. For further information, contact: fonts at gnome dot
org.
Arev Fonts Copyright
————————————————————
Copyright (c) 2006 by Tavmjong Bah. All Rights Reserved.
Permission is hereby granted, free of charge, to any person obtaining
a copy of the fonts accompanying this license (“Fonts”) and
associated documentation files (the “Font Software”), to reproduce
and distribute the modifications to the Bitstream Vera Font Software,
including without limitation the rights to use, copy, merge, publish,
distribute, and/or sell copies of the Font Software, and to permit
persons to whom the Font Software is furnished to do so, subject to
the following conditions:
The above copyright and trademark notices and this permission notice
shall be included in all copies of one or more of the Font Software
typefaces.
The Font Software may be modified, altered, or added to, and in
particular the designs of glyphs or characters in the Fonts may be
modified and additional glyphs or characters may be added to the
Fonts, only if the fonts are renamed to names not containing either
the words “Tavmjong Bah” or the word “Arev”.
This License becomes null and void to the extent applicable to Fonts
or Font Software that has been modified and is distributed under the
“Tavmjong Bah Arev” names.
The Font Software may be sold as part of a larger software package but
no copy of one or more of the Font Software typefaces may be sold by
itself.
THE FONT SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL
TAVMJONG BAH BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
OTHER DEALINGS IN THE FONT SOFTWARE.
Except as contained in this notice, the name of Tavmjong Bah shall not
be used in advertising or otherwise to promote the sale, use or other
dealings in this Font Software without prior written authorization
from Tavmjong Bah. For further information, contact: tavmjong @ free
. fr.

View file

@ -0,0 +1,226 @@
static const unsigned int DejaVuSansCondensedBoldOutlineRGBAbinary18_fnt_size = 5185;
static const unsigned int DejaVuSansCondensedBoldOutlineRGBAbinary18_fnt_data[5188/4] =
{
0x03464d42,0x00002501,0xd0001200,0x01006400,0x00000000,0x44010101,0x56616a65,0x65532075,0x20666972,0x646e6f43,0x65736e65,0x0f020064,0x12000000,0x00000e00,0x01010001,0x00010000,0x31030000,0x44000000,0x56616a65,0x6e615375,0x6e6f4373,0x736e6564,0x6f426465,0x754f646c,
0x6e696c74,0x42475265,0x6e696241,0x31797261,0x2e305f38,0x00676e70,0x0013c404,0x00002000,0x4300fc00,0x03000300,0xffffff00,0x000005ff,0x0000210f,0x54009a00,0x0e000600,0x02000000,0x00000600,0x0000220f,0x94009800,0x07000700,0x02000000,0x00000700,0x0000230f,0x63007600,
0x0d000d00,0x02ffff00,0x00000b00,0x0000240f,0x13008900,0x11000a00,0x01000000,0x00000900,0x0000250f,0x25006e00,0x0f000f00,0x01ffff00,0x00000d00,0x0000260f,0x25008d00,0x0f000e00,0x01ffff00,0x00000c00,0x0000270f,0x2300fb00,0x07000400,0x02000000,0x00000400,0x0000280f,
0x1200d800,0x11000700,0x01000000,0x00000600,0x0000290f,0x1200cf00,0x11000800,0x01ffff00,0x00000600,0x00002a0f,0x8d000a00,0x0a000900,0x01ffff00,0x00000700,0x00002b0f,0x71008100,0x0c000b00,0x03000000,0x00000b00,0x00002c0f,0x8600f900,0x08000600,0x0affff00,0x00000500,
0x00002d0f,0xa1001900,0x05000700,0x08ffff00,0x00000600,0x00002e0f,0x9100de00,0x06000500,0x0a000000,0x00000500,0x00002f0f,0x45006000,0x0f000700,0x02ffff00,0x00000500,0x0000300f,0x35006200,0x0f000b00,0x01ffff00,0x00000900,0x0000310f,0x55004500,0x0e000900,0x01000000,
0x00000900,0x0000320f,0x56002400,0x0e000b00,0x01ffff00,0x00000900,0x0000330f,0x3400da00,0x0f000b00,0x01ffff00,0x00000900,0x0000340f,0x56001800,0x0e000b00,0x01ffff00,0x00000900,0x0000350f,0x56003000,0x0e000a00,0x02000000,0x00000900,0x0000360f,0x3300f200,0x0f000b00,
0x01ffff00,0x00000900,0x0000370f,0x73004000,0x0d000a00,0x02000000,0x00000900,0x0000380f,0x46000000,0x0f000b00,0x01ffff00,0x00000900,0x0000390f,0x36001a00,0x0f000b00,0x01ffff00,0x00000900,0x00003a0f,0x7f007f00,0x0b000500,0x05000000,0x00000500,0x00003b0f,0x5200f900,
0x0d000600,0x05ffff00,0x00000500,0x00003c0f,0x6f00e800,0x0b000b00,0x04000000,0x00000b00,0x00003d0f,0x98000c00,0x08000b00,0x05000000,0x00000b00,0x00003e0f,0x6f00f400,0x0b000b00,0x04000000,0x00000b00,0x00003f0f,0x46000c00,0x0f000a00,0x01ffff00,0x00000800,0x0000400f,
0x1200e000,0x10000f00,0x02ffff00,0x00000e00,0x0000410f,0x65002d00,0x0d000e00,0x02fffe00,0x00000a00,0x0000420f,0x6300a000,0x0d000d00,0x02ffff00,0x00000b00,0x0000430f,0x2500ab00,0x0f000d00,0x01ffff00,0x00000b00,0x0000440f,0x65003c00,0x0d000e00,0x02ffff00,0x00000c00,
0x0000450f,0x6200bb00,0x0d000c00,0x02ffff00,0x00000a00,0x0000460f,0x6200c800,0x0d000c00,0x02ffff00,0x00000a00,0x0000470f,0x2500b900,0x0f000d00,0x01ffff00,0x00000c00,0x0000480f,0x5300d900,0x0d000f00,0x02ffff00,0x00000d00,0x0000490f,0x72006000,0x0d000800,0x02ffff00,
0x00000600,0x00004a0f,0x1200bc00,0x11000900,0x02fffe00,0x00000600,0x00004b0f,0x5300e900,0x0d000f00,0x02ffff00,0x00000c00,0x00004c0f,0x6200d500,0x0d000c00,0x02ffff00,0x00000a00,0x00004d0f,0x5400b500,0x0d001100,0x02ffff00,0x00000f00,0x00004e0f,0x65000f00,0x0d000e00,
0x02ffff00,0x00000c00,0x00004f0f,0x25009c00,0x0f000e00,0x01ffff00,0x00000c00,0x0000500f,0x6100e200,0x0d000c00,0x02ffff00,0x00000a00,0x0000510f,0x0000d900,0x11000e00,0x01ffff00,0x00000c00,0x0000520f,0x65000000,0x0d000e00,0x02ffff00,0x00000b00,0x0000530f,0x35008600,
0x0f000b00,0x01ffff00,0x00000a00,0x0000540f,0x6100ef00,0x0d000c00,0x02ffff00,0x00000a00,0x0000550f,0x45006800,0x0e000e00,0x02ffff00,0x00000c00,0x0000560f,0x64004b00,0x0d000e00,0x02fffe00,0x00000a00,0x0000570f,0x5400a100,0x0d001300,0x02fffe00,0x00000f00,0x0000580f,
0x63008400,0x0d000d00,0x02ffff00,0x00000a00,0x0000590f,0x64006800,0x0d000d00,0x02fffe00,0x00000a00,0x00005a0f,0x73000000,0x0d000c00,0x02ffff00,0x00000a00,0x00005b0f,0x25002d00,0x10000700,0x01000000,0x00000600,0x00005c0f,0x45005800,0x0f000700,0x02ffff00,0x00000500,
0x00005d0f,0x25002500,0x10000700,0x01ffff00,0x00000600,0x00005e0f,0x97006500,0x07000b00,0x02000000,0x00000b00,0x00005f0f,0xa1003c00,0x04000900,0x0fffff00,0x00000700,0x0000600f,0xa1001100,0x05000700,0x01ffff00,0x00000700,0x0000610f,0x81000000,0x0b000b00,0x05ffff00,
0x00000900,0x0000620f,0x35005600,0x0f000b00,0x01ffff00,0x00000900,0x0000630f,0x81003a00,0x0b000a00,0x05ffff00,0x00000800,0x0000640f,0x36000000,0x0f000c00,0x01ffff00,0x00000900,0x0000650f,0x81002f00,0x0b000a00,0x05ffff00,0x00000900,0x0000660f,0x55004f00,0x0e000900,
0x01ffff00,0x00000600,0x0000670f,0x4300ef00,0x0e000c00,0x05ffff00,0x00000900,0x0000680f,0x4400e200,0x0e000c00,0x01ffff00,0x00000a00,0x0000690f,0x54008300,0x0e000700,0x01ffff00,0x00000500,0x00006a0f,0x0000ad00,0x12000700,0x01fffe00,0x00000500,0x00006b0f,0x4400d500,
0x0e000c00,0x01ffff00,0x00000900,0x00006c0f,0x54008b00,0x0e000700,0x01ffff00,0x00000500,0x00006d0f,0x7e008500,0x0a001000,0x05ffff00,0x00000e00,0x00006e0f,0x7d00a600,0x0a000c00,0x05ffff00,0x00000a00,0x00006f0f,0x7000dc00,0x0b000b00,0x05ffff00,0x00000900,0x0000700f,
0x56000000,0x0e000b00,0x05ffff00,0x00000900,0x0000710f,0x4500ae00,0x0e000c00,0x05ffff00,0x00000900,0x0000720f,0x7c00cc00,0x0a000a00,0x05ffff00,0x00000700,0x0000730f,0x80004f00,0x0b000900,0x05ffff00,0x00000800,0x0000740f,0x56003b00,0x0e000900,0x02ffff00,0x00000600,
0x0000750f,0x7000b700,0x0b000c00,0x05ffff00,0x00000a00,0x0000760f,0x7d00b300,0x0a000c00,0x05fffe00,0x00000800,0x0000770f,0x7e009600,0x0a000f00,0x05fffe00,0x00000c00,0x0000780f,0x7c00c000,0x0a000b00,0x05ffff00,0x00000800,0x0000790f,0x4500c800,0x0e000c00,0x05fffe00,
0x00000800,0x00007a0f,0x7c00e200,0x0a000a00,0x05ffff00,0x00000800,0x00007b0f,0x1300a800,0x11000900,0x01000000,0x00000900,0x00007c0f,0x0000b500,0x12000500,0x01000000,0x00000500,0x00007d0f,0x13009400,0x11000900,0x01000000,0x00000900,0x00007e0f,0x9200bf00,0x06000b00,
0x06000000,0x00000b00,0x0000a00f,0x4700fc00,0x03000300,0xffffff00,0x000005ff,0x0000a10f,0x54009300,0x0e000600,0x01000000,0x00000600,0x0000a20f,0x35007a00,0x0f000b00,0x03ffff00,0x00000900,0x0000a30f,0x56000c00,0x0e000b00,0x01ffff00,0x00000900,0x0000a40f,0x81000c00,
0x0b000b00,0x04ffff00,0x00000900,0x0000a50f,0x73003400,0x0d000b00,0x02ffff00,0x00000900,0x0000a60f,0x25003500,0x10000500,0x02000000,0x00000500,0x0000a70f,0x25001b00,0x10000900,0x01ffff00,0x00000700,0x0000a80f,0xa1000000,0x05000800,0x01ffff00,0x00000700,0x0000a90f,
0x64005a00,0x0d000d00,0x02000000,0x00000e00,0x0000aa0f,0x81004500,0x0b000900,0x01ffff00,0x00000700,0x0000ab0f,0x7c00d700,0x0a000a00,0x05ffff00,0x00000800,0x0000ac0f,0x96007100,0x07000b00,0x06000000,0x00000b00,0x0000ad0f,0xa1000900,0x05000700,0x08ffff00,0x00000600,
0x0000ae0f,0x63009200,0x0d000d00,0x02000000,0x00000e00,0x0000af0f,0x9000f800,0x05000700,0x01000000,0x00000700,0x0000b00f,0x98005000,0x08000700,0x01000000,0x00000700,0x0000b10f,0x71008d00,0x0c000b00,0x03000000,0x00000b00,0x0000b20f,0x8d003800,0x0a000800,0x01ffff00,
0x00000600,0x0000b30f,0x8d002f00,0x0a000800,0x01ffff00,0x00000600,0x0000b40f,0xa1002100,0x05000600,0x01000100,0x00000700,0x0000b50f,0x4500a100,0x0e000c00,0x05ffff00,0x00000a00,0x0000b60f,0x46002d00,0x0f000a00,0x02ffff00,0x00000900,0x0000b70f,0x9100d200,0x06000500,
0x06000000,0x00000500,0x0000b80f,0x9100cb00,0x06000600,0x0c000000,0x00000700,0x0000b90f,0x89009200,0x0a000700,0x01ffff00,0x00000600,0x0000ba0f,0x80005900,0x0b000900,0x01ffff00,0x00000700,0x0000bb0f,0x8d000000,0x0a000900,0x05000000,0x00000800,0x0000bc0f,0x25003b00,
0x0f001000,0x01ffff00,0x00000e00,0x0000bd0f,0x25005d00,0x0f001000,0x01ffff00,0x00000e00,0x0000be0f,0x25004c00,0x0f001000,0x01ffff00,0x00000e00,0x0000bf0f,0x45004e00,0x0f000900,0x01ffff00,0x00000800,0x0000c00f,0x13001e00,0x11000e00,0xfefffe00,0x00000aff,0x0000c10f,
0x0000bb00,0x11000e00,0xfefffe00,0x00000aff,0x0000c20f,0x0000ca00,0x11000e00,0xfefffe00,0x00000aff,0x0000c30f,0x13000000,0x11000e00,0xfefffe00,0x00000aff,0x0000c40f,0x0000e800,0x11000e00,0xfefffe00,0x00000aff,0x0000c50f,0x1200f000,0x10000e00,0xfffffe00,0x00000aff,
0x0000c60f,0x5400c700,0x0d001100,0x02fffe00,0x00000e00,0x0000c70f,0x13003b00,0x11000d00,0x01ffff00,0x00000b00,0x0000c80f,0x13007000,0x11000c00,0xfeffff00,0x00000aff,0x0000c90f,0x13004900,0x11000c00,0xfeffff00,0x00000aff,0x0000ca0f,0x13005600,0x11000c00,0xfeffff00,
0x00000aff,0x0000cb0f,0x13006300,0x11000c00,0xfeffff00,0x00000aff,0x0000cc0f,0x0000f700,0x11000800,0xfeffff00,0x000006ff,0x0000cd0f,0x1200c600,0x11000800,0xfeffff00,0x000006ff,0x0000ce0f,0x1300b200,0x11000900,0xfeffff00,0x000006ff,0x0000cf0f,0x13009e00,0x11000900,
0xfeffff00,0x000006ff,0x0000d00f,0x65001e00,0x0d000e00,0x02ffff00,0x00000c00,0x0000d10f,0x13000f00,0x11000e00,0xfeffff00,0x00000cff,0x0000d20f,0x00000000,0x12000e00,0xfeffff00,0x00000cff,0x0000d30f,0x00001e00,0x12000e00,0xfeffff00,0x00000cff,0x0000d40f,0x00007800,
0x12000e00,0xfeffff00,0x00000cff,0x0000d50f,0x00006900,0x12000e00,0xfeffff00,0x00000cff,0x0000d60f,0x00005a00,0x12000e00,0xfeffff00,0x00000cff,0x0000d70f,0x72006900,0x0c000b00,0x03000000,0x00000b00,0x0000d80f,0x25007e00,0x0f000e00,0x01ffff00,0x00000c00,0x0000d90f,
0x00002d00,0x12000e00,0xfeffff00,0x00000cff,0x0000da0f,0x00003c00,0x12000e00,0xfeffff00,0x00000cff,0x0000db0f,0x00004b00,0x12000e00,0xfeffff00,0x00000cff,0x0000dc0f,0x00000f00,0x12000e00,0xfeffff00,0x00000cff,0x0000dd0f,0x13002d00,0x11000d00,0xfefffe00,0x00000aff,
0x0000de0f,0x6200ae00,0x0d000c00,0x02ffff00,0x00000a00,0x0000df0f,0x2300ee00,0x0f000c00,0x01ffff00,0x00000a00,0x0000e00f,0x35006e00,0x0f000b00,0x01ffff00,0x00000900,0x0000e10f,0x35004a00,0x0f000b00,0x01ffff00,0x00000900,0x0000e20f,0x35003e00,0x0f000b00,0x01ffff00,
0x00000900,0x0000e30f,0x36003200,0x0f000b00,0x01ffff00,0x00000900,0x0000e40f,0x36002600,0x0f000b00,0x01ffff00,0x00000900,0x0000e50f,0x13007d00,0x11000b00,0xffffff00,0x000009ff,0x0000e60f,0x71009900,0x0b000f00,0x05ffff00,0x00000d00,0x0000e70f,0x72004b00,0x0d000a00,
0x05ffff00,0x00000800,0x0000e80f,0x46003800,0x0f000a00,0x01ffff00,0x00000900,0x0000e90f,0x45004300,0x0f000a00,0x01ffff00,0x00000900,0x0000ea0f,0x46001700,0x0f000a00,0x01ffff00,0x00000900,0x0000eb0f,0x46002200,0x0f000a00,0x01ffff00,0x00000900,0x0000ec0f,0x54007b00,
0x0e000700,0x01ffff00,0x00000500,0x0000ed0f,0x54007300,0x0e000700,0x01ffff00,0x00000500,0x0000ee0f,0x55005900,0x0e000800,0x01fffe00,0x00000500,0x0000ef0f,0x54006b00,0x0e000700,0x01ffff00,0x00000500,0x0000f00f,0x3400ce00,0x0f000b00,0x01ffff00,0x00000900,0x0000f10f,
0x4500bb00,0x0e000c00,0x01ffff00,0x00000a00,0x0000f20f,0x3500c200,0x0f000b00,0x01ffff00,0x00000900,0x0000f30f,0x3500b600,0x0f000b00,0x01ffff00,0x00000900,0x0000f40f,0x3500aa00,0x0f000b00,0x01ffff00,0x00000900,0x0000f50f,0x35009200,0x0f000b00,0x01ffff00,0x00000900,
0x0000f60f,0x35009e00,0x0f000b00,0x01ffff00,0x00000900,0x0000f70f,0x7000d000,0x0b000b00,0x04000000,0x00000b00,0x0000f80f,0x72007500,0x0c000b00,0x04ffff00,0x00000900,0x0000f90f,0x2300e100,0x0f000c00,0x01ffff00,0x00000a00,0x0000fa0f,0x36000d00,0x0f000c00,0x01ffff00,
0x00000a00,0x0000fb0f,0x2400c700,0x0f000c00,0x01ffff00,0x00000a00,0x0000fc0f,0x2400d400,0x0f000c00,0x01ffff00,0x00000a00,0x0000fd0f,0x00009400,0x12000c00,0x01fffe00,0x00000800,0x0000fe0f,0x0000a100,0x12000b00,0x01ffff00,0x00000900,0x0000ff0f,0x00008700,0x12000c00,
0x01fffe00,0x00000800,0x0020260f,0x9200b000,0x06000e00,0x0a000000,0x00000e00,0x0020530f,0x9300a000,0x06000f00,0x06ffff00,0x00000e00,0x0020700f,0x8d004100,0x0a000800,0x01ffff00,0x00000600,0x0020710f,0x89009a00,0x0a000500,0x01ffff00,0x00000300,0x0020740f,0x8d004a00,
0x0a000800,0x01ffff00,0x00000600,0x0020750f,0x8c005300,0x0a000800,0x01ffff00,0x00000600,0x0020760f,0x8c005c00,0x0a000800,0x01ffff00,0x00000600,0x0020770f,0x8c006500,0x0a000800,0x01ffff00,0x00000600,0x0020780f,0x8d002600,0x0a000800,0x01ffff00,0x00000600,0x0020790f,
0x8b007700,0x0a000800,0x01ffff00,0x00000600,0x00207a0f,0x8800aa00,0x09000900,0x02ffff00,0x00000700,0x00207b0f,0xa1003200,0x04000900,0x04ffff00,0x00000700,0x00207c0f,0x9100e400,0x05000900,0x04ffff00,0x00000700,0x00207d0f,0x80006300,0x0b000600,0x01ffff00,0x00000400,
0x00207e0f,0x7f007100,0x0b000600,0x01ffff00,0x00000400,0x00207f0f,0x98001800,0x08000900,0x03ffff00,0x00000700,0x0020800f,0x8b008000,0x0a000800,0x06ffff00,0x00000600,0x0020810f,0x8700ea00,0x09000700,0x06ffff00,0x00000600,0x0020820f,0x8700d000,0x09000800,0x06ffff00,
0x00000600,0x0020830f,0x89008900,0x0a000800,0x06ffff00,0x00000600,0x0020840f,0x8700d900,0x09000800,0x06ffff00,0x00000600,0x0020850f,0x8b006e00,0x0a000800,0x06ffff00,0x00000600,0x0020860f,0x7b00f700,0x0a000800,0x06ffff00,0x00000600,0x0020870f,0x8800be00,0x09000800,
0x06ffff00,0x00000600,0x0020880f,0x8d001400,0x0a000800,0x06ffff00,0x00000600,0x0020890f,0x8d001d00,0x0a000800,0x06ffff00,0x00000600,0x00208a0f,0x98002200,0x08000900,0x07ffff00,0x00000700,0x00208b0f,0xa1002800,0x04000900,0x09ffff00,0x00000700,0x00208c0f,0x9100ee00,
0x05000900,0x09ffff00,0x00000700,0x00208d0f,0x7f007800,0x0b000600,0x06ffff00,0x00000400,0x00208e0f,0x7f006a00,0x0b000600,0x06ffff00,0x00000400,0x0020900f,0x98003e00,0x08000800,0x08ffff00,0x00000600,0x0020910f,0x98002c00,0x08000800,0x08ffff00,0x00000600,0x0020920f,
0x98003500,0x08000800,0x08ffff00,0x00000600,0x0020930f,0x96008700,0x07000800,0x08ffff00,0x00000600,0x0020940f,0x98004700,0x08000800,0x08ffff00,0x00000600,0x0020950f,0x8800b400,0x09000900,0x06ffff00,0x00000700,0x0020960f,0x8900a000,0x09000900,0x06ffff00,0x00000700,
0x0020970f,0x8600f200,0x09000600,0x06ffff00,0x00000400,0x0020980f,0x97005800,0x07000c00,0x08ffff00,0x00000a00,0x0020990f,0x96007d00,0x07000900,0x08ffff00,0x00000700,0x00209a0f,0x8700c700,0x09000800,0x08ffff00,0x00000700,0x00209b0f,0x94009000,0x07000700,0x08ffff00,
0x00000500,0x00209c0f,0x8700e200,0x09000700,0x07ffff00,0x00000500,0x0020ac0f,0x3300e600,0x0f000b00,0x01ffff00,0x00000900,0x0022020f,0x72005600,0x0d000900,0x03ffff00,0x00000700,0x0022100f,0x25000000,0x10000d00,0x02ffff00,0x00000b00,0x0022110f,0x25000e00,0x10000c00,
0x02ffff00,0x00000a00,0x0022430f,0x98000000,0x08000b00,0x05000000,0x00000b00,0x0022640f,0x81001800,0x0b000b00,0x04000000,0x00000b00,0x0022650f,0x7000c400,0x0b000b00,0x04000000,0x00000b00,0x0022c50f,0x9100d800,0x06000500,0x06000000,0x00000500,0x0023cf0f,0x7100a900,
0x0b000d00,0x04000000,0x00000d00,0x0025a00f,0x45008500,0x0e000d00,0x03000000,0x00000d00,0x0025a10f,0x45007700,0x0e000d00,0x03000000,0x00000d00,0x0025ae0f,0x55006200,0x0e000800,0x03000000,0x00000700,0x0025b80f,0x7b00ed00,0x0a000900,0x05ffff00,0x00000700,0x0025cf0f,
0x45009300,0x0e000d00,0x03ffff00,0x00000c00,0x0025fe0f,0x81002400,0x0b000a00,0x05000000,0x00000a00,0x0026390f,0x73001a00,0x0d000c00,0x02000000,0x00000c00,0x00263a0f,0x73002700,0x0d000c00,0x02000000,0x00000c00,0x00263b0f,0x73000d00,0x0d000c00,0x02000000,0x00000c00,
0x0000000f,
};
static const unsigned int DejaVuSansCondensedBoldOutlineRGBAbinary18_0_png_size = 15431;
static const unsigned int DejaVuSansCondensedBoldOutlineRGBAbinary18_0_png_data[15432/4] =
{
0x474e5089,0x0a1a0a0d,0x0d000000,0x52444849,0x00010000,0x00010000,0x00000308,0x58ac6b00,0x01000054,0x544c5080,0x00000045,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
0xffff0000,0xffffffff,0xffffffff,0xffffffff,0xf8f8f8ff,0xeff2f2f2,0xececefef,0xe7e7e7ec,0xe0e3e3e3,0xe0e0e0e0,0xdbdbdbe0,0xced5d5d5,0xc6c6cece,0xc3c3c3c6,0xbfbfbfbf,0xbababfbf,0xb4b4b4ba,0xa8aeaeae,0xa3a3a8a8,0x9f9f9fa3,0x959a9a9a,0x8f8f9595,0x8989898f,0x7f838383,
0x7f7f7f7f,0x7c7c7c7f,0x6e767676,0x67676e6e,0x63636367,0x5e5f5f5f,0x58585e5e,0x53535358,0x4c4f4f4f,0x46464c4c,0x42424246,0x3e3f3f3f,0x3a3a3e3e,0x3737373a,0x2f323232,0x2b2b2f2f,0x2727272b,0x1f232323,0x1e1e1f1f,0x1d1d1d1e,0x181a1a1a,0x16161818,0x13131316,0x0f121212,
0x0e0e0f0f,0x0b0b0b0e,0x080a0a0a,0x07070808,0x04040407,0x03040404,0x02020303,0x00000002,0x00000000,0x00000000,0xc381e300,0x0000003e,0x4e527433,0x00000053,0x02000000,0x07060303,0x110e0b0a,0x1e1a1815,0x2d28231f,0x3f3e3833,0x5e545247,0x78726760,0x928a7f7f,0xaea8a09e,
0xc8c0c0b9,0xf3e7dfd1,0x19be4852,0x00200000,0x54414449,0x7dedda78,0x4b2a4feb,0x265fafd3,0x06230621,0x4b160545,0x0942c025,0xee07f48c,0x28821044,0x89611a28,0x4e22a277,0x84842102,0xebfc2f84,0x332faaa7,0xf72e803d,0x9ef3f67e,0x64c39f77,0xccf4e5ef,0xaebf5d00,0xaeaaaeae,
0xe05259aa,0x1457dab0,0x153870f9,0xb6d496c7,0x2d4d57da,0xb753d3f3,0xd4d6e457,0x97365937,0x9ecfad95,0x57790e5d,0x7b467b42,0x2e1ac267,0xb8db678f,0xf158f76a,0xdf2bbd7b,0x69bc75f8,0x4e2e8cff,0x0e9e12c6,0x934c81b5,0x6ce5bde3,0x851d1abf,0xb955fdfb,0xea7a7a65,0xeb40eaf6,
0x4df27faf,0xc8dbf196,0xe9b17d2f,0xf151e5d9,0xd6b8506a,0x4df9d811,0x3d70d8ea,0x3a2f9b35,0x76ed7602,0xed1c5568,0x2f87d12b,0x3cd95d7e,0xd45a6a18,0x1bd79d6f,0xa0030641,0x1b2d1b90,0x62a61d14,0xb8cc64fd,0x3ba62a12,0xe6bd121b,0x57b7cda7,0xf264d9fb,0x37fe7d63,0xf649cff9,
0xff9d1922,0xe4975aec,0xa23e495e,0x7e179337,0xa7abd93c,0x3e202549,0xaa91c913,0x8934f15f,0xafe3ff66,0xb14adf3b,0x31792254,0x8de9ceb4,0x35896320,0x835d8d4a,0x78f540a2,0x881d2e5c,0xb8fefba6,0x711a61b7,0xdbe6d3d3,0x7c756a81,0xccb63279,0xf150a6fd,0xf2bd96a5,0xbe167fce,
0xb669eda8,0xabe5bc1d,0x9f12fd9d,0x33500092,0x001bae04,0xceebf17c,0x0fd48256,0xe3922507,0xc37b9808,0xe69a58c9,0x8e04c094,0xfe1f65b0,0x11f2cef5,0xd83debbd,0x335977e5,0x019b976c,0x67fe778b,0x373219a1,0x50b6bbe5,0xf6541428,0x689b2142,0x040de2fc,0x77513420,0x6f7b63e8,
0xcc9b3dd7,0x22756e01,0xa0204e8d,0x7c2df64e,0x2e4865be,0x9085b302,0x0ddf8f9a,0x3f4113ab,0xa2127276,0x25389800,0x5c702150,0xaffa3579,0xafddf5f2,0xf83c339b,0x2bd6d355,0xc1a78b16,0xf408b17a,0x40081a99,0xbf3240a9,0x287ce877,0x29e42f16,0xf34a6480,0x1eba6a53,0x7449c109,
0xc3a92298,0x2bdebb99,0x04316bec,0x65399800,0xe4275fb5,0xd632b06e,0x24287732,0x75fbbcbe,0xbf079a73,0xa08f2e6c,0x3a3f7747,0x4c4c06b9,0x88010353,0x79092f35,0x46ca2974,0x36bd84a7,0x1b3d7000,0xee6e6c03,0x3c82135d,0xa4263e1e,0x777d36bb,0xf8077065,0xd34bbe00,0x4ddf029c,
0xa2c54e5a,0xe55fe166,0x375fbbeb,0x75fb3ea7,0x0264a613,0x7559ba4e,0x0001ba79,0x09c7871c,0x702f6742,0xe4000999,0x462e8cba,0x718e26e4,0x3e3f43d3,0x8b6761ef,0x34d2e9b1,0x142270a7,0x77d7c446,0x7d4e6ebf,0x2c26ebf6,0x1e925511,0xf0992e35,0x08541b90,0x559259aa,0x1e580167,
0x67a88025,0x1a94be97,0xa700044d,0xe640a84d,0x3003ac3d,0x226629cd,0x75fbbebe,0x5fb3ea73,0xeb651537,0x98fed815,0xf1b9514f,0xee3f0015,0x88841f4a,0xfcd4c2f5,0xeb78c771,0x6c124d30,0xeb0f4dd4,0x8a734c00,0xefaf8899,0xfa9cdd7e,0xb64dd7ec,0xc38ee7c4,0x1a2f7ac6,0x3ec9c4f0,
0x84554190,0xcbf60029,0x893c9177,0x6e5e958b,0x7c49875a,0xb10bd414,0x361e9a8a,0xca732001,0xdf9f112c,0xd20033fd,0xc26ebf67,0xb4220bb1,0x9001c3b1,0xb240001a,0x95411c07,0xab003344,0xd268d4fd,0x27e6e420,0xe6e483d7,0xcde81bcf,0xd242a441,0xef9a064c,0x9cc800ea,0x3c44e512,
0xb78891b8,0xcd1f334d,0x39bafdde,0x9bafd9f5,0x98f183b4,0x0d4ad5ae,0x23172000,0x385544a4,0x2ea00033,0x299cbe13,0xb79fcdb3,0x472958e9,0x34355c8a,0x9001d5df,0x9c8aa538,0x6f46f9b2,0xae09f6ac,0xfddf5f64,0xd9f539ba,0x9e809baf,0xef2e583b,0x06e5fa73,0x6be180ca,0xdfe900f7,
0x2a100337,0x733a813c,0xaa68782c,0xfb0e78a9,0x27b3b1cf,0xd5df32de,0x6b7c6001,0x7c658a70,0x876f5244,0x19d32ac3,0x75fbbebf,0x7fb3ea73,0x0a87de6a,0x74ca3ec8,0x6e080103,0x8c59b1ad,0x0081d15a,0x5465aec0,0x3e57b236,0x1949a665,0x95c97bc9,0xbbbbe9b2,0x6a904008,0xa7331e82,
0x0964bf6c,0xa8f2c549,0xba7f2984,0xea7375fb,0xbd365fb3,0x4e52a957,0x2372e82c,0x89271a78,0x9f3d20d3,0x12589390,0xc00639ec,0x2895375a,0x19bad684,0x9b30e242,0xe5429aa6,0xaca0afbd,0xdbbbbe9d,0x84921348,0x9c625daf,0x0c3efaf2,0x5b6a2309,0x0dbebfed,0x8dc136c2,0xbafdde5f,
0xafd9f539,0x97a3cb9a,0x946cdd47,0xa69eb61b,0x8dd11c69,0x086b43ce,0x87372cf6,0x30a30ed7,0xc9d4d79f,0x4f048a24,0x158d8535,0xd2f330f0,0x10f7777c,0x1adc824e,0x1cb75654,0x5bdec956,0x315cdadd,0xfbbebf35,0xb3ea7375,0xb797369f,0x2d91865d,0xbb766c37,0xe1ba205d,0x480fd276,
0xf0ff910e,0xd5fe5258,0x54e9b507,0xbb2435d9,0xf7c22cab,0xf5ebbeb2,0xeb1ba47a,0x032dd561,0x32a9ed30,0x8176bfb7,0x4e9c9b2d,0x7bb27ba6,0x8a379e6a,0xf06dc677,0x7b753884,0x1f39f63c,0x0e3c7a74,0x9b3337d3,0xdc88aa8e,0x06d76435,0x3421dd1e,0xe59fee66,0xeae347c0,0xa9f839aa,
0xfe47e4ff,0x006ddee8,0x32a9ed30,0x8174bfb7,0x6047f639,0xe6bbefd2,0x53dd93dd,0x4c51bd73,0x17b8fde9,0xe6e29c7a,0xe6fbeea7,0xf998e6ad,0x64d5a060,0x9bfd130e,0x7a600657,0xc39e9997,0xa7ae435c,0xa6572de4,0x7472df36,0x551e5d81,0xb2ed71c9,0x0811ba94,0x5aa5cb04,0xa5d8cb92,
0x54d54f59,0xd8172bfb,0x2c49fbd6,0x3c9f8e91,0x99ef66b9,0xbd7353dc,0x8fe94c51,0xb7bc84c5,0x69cd59a9,0x63a0dea1,0x21be6312,0x2a8183e9,0xdae19c49,0xcaf37d28,0xc2ba2844,0x1eeb0435,0xdf3720d3,0x8bf4c712,0xc789cbf7,0xf07bcfb0,0x447a6b9e,0xc26deb2f,0xd6696a07,0xfedd3553,
0xf5b605dc,0xe317209a,0x5704e7c3,0x2a0e4cbd,0xae6a7b93,0x7d998a37,0x1b24c3a7,0x26ef5761,0x1fa2dd79,0xe6b88df0,0x74107f2b,0xf72feac6,0x000b37d4,0x2d078384,0x03bbd8e9,0x844b3dc7,0xd3b8fe7e,0xdd7bf56d,0xbc67348f,0x212c46dd,0x4065433a,0x789d5b68,0x86a2b10d,0x886a7db6,
0xafed1f7d,0x53b275e1,0x4ecd9987,0x93dea26f,0x2f787e85,0x0fb40029,0xfb0eee13,0x9b3e0366,0x2b0ed26f,0x71c4e7ae,0x6c778cf2,0x9d17d422,0x166b99b0,0x77400245,0x41ca28f0,0xa07c1a89,0x4629c76a,0xd4217c91,0x32651d88,0x59cab559,0xfad63500,0xcd042c9e,0x700ca2ae,0x7c691a07,
0x76bba55c,0x2fc176f4,0x3a26f46a,0x28fdce58,0x58dbf053,0xec53981f,0xe7640dbb,0xfb3338e3,0xcdd279c3,0xa3f64d6a,0xb0895882,0x0004d7b9,0x780783ba,0x183a82ea,0xbfa19d7e,0x34807f05,0xb8fcf186,0x4daacf1b,0x08f0d6ce,0x980029bb,0xc6951576,0xe2ef5b16,0xd21f6b82,0x35f8cb5d,
0xd5fdf246,0x6e0cf571,0x595e930a,0x4c9dd3df,0xc05cb4a0,0x01b37ccf,0x1270e8f2,0x0209510d,0x5a45ff16,0x1fa9b11b,0x949fb04d,0x9001d308,0x4053e9af,0x1f0cf6a8,0x31f0c118,0x95eb68c3,0x4b90bf3c,0x03a0a86f,0x2aa71960,0xbac97084,0xc455cf34,0x01484a46,0x1b05aef9,0x0a41ae4f,
0xe9309065,0xfb4522c5,0xf1350f60,0xc11b37da,0x2f162a72,0x768a1950,0xd837c931,0x8ff7410f,0xc226bb47,0xdc844fa2,0xb5d3147a,0x3d0000cf,0x00a4f019,0x5690bf6c,0x8a856e0b,0x1d46b559,0x11eb8aab,0xbf55231d,0xab94c00e,0x1a409b28,0x5ecc0075,0x600ff5a7,0x1315f181,0x66dc573c,
0x7a2ddab7,0x9085ba1f,0x098dfbe7,0x90dc9979,0x8e365a38,0x9b590676,0xb7cd80c9,0x9d2ee324,0xe05c28b0,0x00cfef82,0x19e40720,0x691eb600,0xd085620c,0x64ed9530,0xa904db18,0x16c92463,0x5759a5a2,0x2c381151,0x4c00e9a9,0xfe709d79,0x80032834,0x037367cc,0x19ec75d6,0xacdca1f6,
0x9be4b533,0x90d7ad8d,0xe47ce63a,0xe326dd1b,0x02cf5084,0x9b6cb248,0x61399679,0xe381ad76,0xa00067f2,0x0784b883,0x5734f94f,0x6bf64e8f,0xc64f94a4,0x59f94c53,0x63a9a419,0xd2d3b184,0x18a8abac,0x8e2f01aa,0x5e530004,0x4e2f5b27,0x45e96c62,0xc61f3e93,0x4d6ea49f,0x78b643ec,
0x8df9906c,0x42bb8fc6,0xeebacb36,0xecd5f5ab,0x5dad865b,0xdf35de30,0xbb30898a,0xd7180abe,0x0cf1969c,0x7427fb00,0x70de7eb4,0x836ecb47,0x1a9ef8bc,0x7d77b7af,0xa7a1fca6,0xa5b5e0c8,0x31515759,0x14c12e34,0x794c00e1,0x56c3a89d,0xeaf4084c,0x3a0f86dc,0xd366ba09,0x8334843e,
0x5c373fcc,0xd635af38,0x00db3575,0xa31f2845,0x621cdd7a,0xb6735ce7,0x2df31a9c,0x0f50d71b,0x803d5368,0x97196963,0x5e07cf12,0xcb877eef,0x4231dd4d,0xd669697f,0xd90c5455,0x731d307a,0xdca6d7ec,0xd18e6c4c,0x1e04466f,0x8a5f24b2,0x0c86c757,0x7fb77718,0xdf01bb7e,0x61395195,
0x49d8a507,0x1a631722,0x9800f7d2,0xb63b8f90,0x835c6261,0xe56361f1,0xdcf22768,0x4a467a3b,0x19275797,0xc70df726,0x018fb5c8,0x022aed30,0xe2df3752,0xdda6d7e2,0x1400264c,0xad3fdab7,0x6c92028d,0x60bf6cb2,0x80d7be07,0xf1f63485,0x60ea7fc0,0x8f3f49dc,0x09a8fd29,0x6ba000ce,
0x48b5fa82,0xb04b113e,0xe3c1c2bb,0x723ccfbe,0xf274755e,0xfd628fcc,0x5caf5ef5,0x94b68edc,0x0008c759,0x2a2ae330,0xc55fccaa,0x9bb4cf65,0x08008829,0x7ed1d8d5,0x254a113c,0xd58003ed,0xbdf949c4,0xac07fac6,0x2572a038,0x605bb8e9,0xced9d80a,0xd8c49170,0x64c20978,0x16b8c05b,
0x46516be9,0xacf070bf,0x65ba4775,0x7b1611b6,0x80bd8ecd,0x8fadc3df,0xd2c8c729,0x8e28abac,0x0d7e13d3,0x33759801,0x3d614f05,0xde550b4a,0xba3d98f5,0x7de8a1fb,0xfc534c20,0x1f59436e,0xe94175bd,0x98f2ee8e,0xedceb600,0xf7cdea36,0x7461132d,0x5cde3f32,0xd7c9ef01,0x2cd58556,
0x9aca3c1c,0xbe39b76c,0x719910e3,0xb6554515,0xe655ee11,0xd18299ba,0x3750e4c9,0xfaaa5c8e,0x3d03ea43,0x286fdf02,0x526b9bcb,0x4fb8d66f,0x1b8f7770,0x886106fe,0xd7a7eb80,0x3bed7539,0x6a20e587,0x1e5b9a93,0x55cbb70f,0x11ef5ff5,0xc9e11d32,0x2378bcce,0x3d920658,0xf095811d,
0x1af9b36b,0x37caa65a,0xe292faf0,0xf80991a7,0x42a5b52f,0x7661f8ec,0x1e3d58f0,0x75adce0f,0xf92ebbf8,0xfc6c6ce4,0x0e536c56,0xccc2fd21,0x627b0a13,0x8a996ed9,0x1c36da64,0xe3cfb649,0x503ca69c,0x1e59d2d0,0x3bdfe7d4,0xac8de2f3,0x30595cc3,0x98e0cacc,0x22b1aa94,0x000c81aa,
0x460d05ff,0xfc417fc0,0xec8a941f,0x3fdb1360,0xfa11fad4,0x1366cd15,0x0ff5b0d4,0x205a0bf8,0x072ecaf7,0x5d2d747a,0xdd847019,0x4581fcf0,0xc4f330ba,0xffeb445a,0x350f40b2,0x71a702e1,0x177e8722,0x1db2840f,0x745eb40c,0x2738b3eb,0xb68a0793,0x8a3de146,0x71234ec1,0x0081e49e,
0x3946f133,0x75828de1,0x2d063527,0x706bbeb1,0xf1ae15c0,0xee2a5fec,0xde01801f,0x5ff768a8,0xfc09b2c4,0x257ed59a,0x486477cd,0xfcca7a05,0xa26be8f2,0xcf244cfa,0x3efba284,0x5253465d,0x04f330bf,0x38932574,0x17fc5b1b,0x4e2c77a2,0x98f17524,0x5b0adea5,0xf15244af,0x54efe884,
0x03d98950,0x1686ddb5,0x1c752228,0xfe4195ce,0xfb155029,0x11bc7201,0x045ef730,0xcb717268,0xce7c78ee,0x00380d82,0xfb3a4a5e,0x09d0aa97,0x0150e218,0x26d1d4be,0x0943b525,0x05150d58,0x856d9300,0x6fdab003,0xb73cf251,0xd8b0cc47,0xad06797e,0x5fa6bbb9,0xd4027998,0xdc8d5694,
0x5ce23fbb,0x2271e095,0x0e3214b0,0xf4e02300,0xdf309bb0,0x66254115,0x4bf6d40f,0xd48f9c82,0x515531ee,0x9ec8a1fc,0x9a44c822,0xbc590345,0xa6a6021e,0x5ad6e1a8,0x07bbe49d,0xe700ebf4,0xc3ac0069,0xd735fc23,0x982cb013,0xbf7799d2,0x00ea3970,0x65000228,0x2de48275,0xb96e8e8f,
0x2fddbc51,0x5d2e2283,0xbe027e98,0xab926b46,0xfb27675f,0x46132472,0x03c1b04b,0xdbe6b62b,0xcc0733ab,0xec89504c,0x65ad6281,0x7d83a365,0x6a699131,0x5879da38,0xc5b8ef71,0x48540085,0xdfe74839,0x033296d6,0x31812800,0x365c2634,0x890289fc,0x9f6d0f9d,0xf250a002,0xc8f91b76,
0xbb747332,0xfc5cedc7,0x3c60ba5d,0xc008dac1,0xc76eb90d,0xb64c914c,0xe944181e,0x92aa6643,0x6f63bbf8,0x4cf3050f,0x03c98950,0x35047685,0x6017fc03,0x34c89afd,0x2c034cd3,0xdc000934,0x6aa3d42e,0xeb400066,0xd755fb89,0x2485323f,0x5f6cf5c9,0x4832b002,0xea239cb6,0xb43f76e8,
0xa6919d7f,0xa278c171,0x4c020daf,0xc9543d06,0x3feab14b,0x398c92a0,0x0bb98695,0x02ac9b6e,0x1f6c910b,0xd340c183,0x84a824f9,0x0b78a079,0xeaff01d6,0x379f9934,0xc03e8010,0xcc08165d,0x2ff60002,0x4cebe828,0x0cc21cf7,0x0669bca3,0xe0007b80,0xe78c1c62,0x2d7c01d2,0xabde8dea,
0xd4712d5c,0x4fe82e37,0xbe2533d4,0xce967e29,0xdd929fd4,0x4d04e97a,0x1a54ea4a,0x1663ca17,0xca3cb227,0x14825a91,0x12f39d86,0x824fcfcc,0xa49b0c4a,0x44e581e9,0x05ff58a3,0xa2fd4200,0x07365a11,0x96419580,0x78ec03e1,0x7b30ea1d,0xe2800cdb,0xa1a9d899,0xf196fb80,0xe295b3b6,
0xd68fcafe,0x105f2abb,0xea5b344f,0xeb621d11,0x923543af,0x7a906ebf,0x7501a719,0x63cb952a,0xa602271e,0x14f47c7a,0xe0a9f183,0xa827353a,0xb140f0c4,0xdcaf5b9b,0x0025f09d,0x0977c1a7,0x9478de80,0x039da9d7,0x054bf6c0,0x5360dfe8,0xfb3280b0,0xb76029d3,0x4a9503db,0xe0dc7460,
0xd3badb26,0x9fc0be61,0xa9c738f0,0xf10cdf0c,0x12a33334,0x5ae068f9,0x74a54e8c,0x71e16c71,0x300bfe22,0x3e29718f,0x4ff7e04d,0x3d989145,0x35b5bc50,0xc83001d1,0x1c603534,0x049aa373,0x7829f140,0x9e14b841,0x1fa70003,0x21fb94a5,0xf3879c25,0xabadc001,0x5dabe684,0xabe548d4,
0x71d5f60b,0xdee5c735,0xe4db28f2,0x3a97818b,0xab43d295,0x51c11388,0xd5f758fd,0x4e66bbb8,0x81e18950,0x518616c2,0x644c0071,0x16ce1a9a,0x43c0f6d8,0xc1f311e8,0x52962b04,0xf50cb1a7,0x0003cdbc,0x9d3a77e9,0x55fc6423,0xb082e0ff,0x00cf9d50,0xf9a93fd8,0x32abcd3c,0x7ba5f229,
0x7ed585ee,0xb2a9d2a9,0x9eb77505,0xdb07408f,0x207bb497,0x1138a467,0x0a463b47,0x412604da,0x8d9d51ec,0xa07b3122,0xdc84b73c,0x0c860f85,0x734c9900,0x5f0e7143,0xc43ce4d1,0x12745f73,0x7cbde83a,0xac9f9ba8,0xf92fdb02,0xd71c16e7,0x24413f37,0x6283ec5f,0x4fb2b542,0x92b67000,
0xed3c8120,0xbd32c91c,0xb605fe6b,0x423f4197,0xb7cd8d17,0x879d3144,0xca7ae129,0x44e396fd,0xf891cf28,0xa3508975,0xc4a83a7c,0x3c5281e4,0xa56819f7,0x5bca1512,0x86e69932,0x335add62,0xedb64d59,0xa61cc975,0xc428704a,0x8aed4000,0xbb5bd01d,0x63ce4e46,0xfb35fc05,0x23c000c4,
0x41feb001,0x911cb5b7,0xbe50ea89,0xb37740b8,0x7c394cec,0xf5cee271,0x196447db,0x8ece8eb5,0x7dc46c29,0x44e97bd8,0xcc260ef7,0x2a0e9f28,0xd7fdab71,0x6140f736,0xd6f6f06b,0x6636068f,0xf9a69cc9,0x68007f73,0x281cd9e5,0x486ff84d,0xecb2e489,0x5bd6ba60,0xe948f9b3,0x105798d7,
0x35ce4001,0xa7d63632,0xbc7f0e7d,0x42cdbab0,0x9b4d1810,0x2361d31b,0xf30dedb6,0x254133f3,0x6563cb92,0xdbf57373,0x618af2e6,0x22ab2a39,0x20380144,0x80a9a2a2,0xa2d5a2ff,0x7ac423b2,0x45b04609,0xe8868a6c,0x0e4137f2,0x544307f8,0x0dc3f1fe,0xa0136f43,0x18a119af,0x8e6660eb,
0xe59199f6,0xa662808c,0x10a1feda,0xf10fc919,0xe813a659,0xddf3ab6b,0x3480ce33,0xfad73a40,0x38238f54,0xee6a952f,0xd3be996f,0xf03ddf7d,0x09fc98f7,0x20dabb45,0x62a7c9bc,0x2713a489,0x5b39a054,0x963658b9,0x032e2aa5,0xd61cfd00,0x9ca5ef99,0xd3979d62,0xf6507525,0xe9967c43,
0xb48df164,0xd66d81fe,0x115d033d,0x07e830d9,0x9b4346e8,0xd47a29cc,0x3f4e677c,0xee636bb3,0x73be996f,0xd2c74c05,0xe981e645,0x824cf12e,0x0782e9e4,0x1ca91dda,0x73f8e276,0x3ea4ee60,0x8a8c76d4,0x4e8625b1,0x5b14d9b3,0xa2f7fa3f,0x0dafb55b,0x8e99d683,0xf9341d48,0x74c93e21,
0x716b8cb2,0x8face610,0xf9467bb2,0x22556e11,0x03f70a7b,0x22899264,0x8c3ad6f6,0xee7e3683,0xcc6d719f,0x9769adff,0x4790894f,0x6e43b337,0xa09a5ed4,0x0e5a9b5b,0xc5503d9a,0x76cac14e,0x1eba77ee,0x6c4bc529,0x9623d7ed,0xe8ddefe5,0xec4c931c,0x77273e94,0xd9a0ee44,0xd33f310f,
0xd29b1409,0xd9e48361,0x67b925e2,0x4279773c,0x70ee1472,0x8eaefe3e,0x60dd537f,0xffb37065,0x4c9c2d74,0xb3e36b86,0x677d32df,0x47757f38,0x5a091ea8,0x66ee98df,0x279a2363,0xb8631029,0xc61d6119,0xead3b348,0x0c86acfa,0x01cee940,0x0d17be30,0x9cf553ee,0x8ea68d2b,0x1ba41d48,
0xac61c2fc,0x99cbf66f,0x6817804e,0x8e2cefbd,0x34067e5a,0xe555d899,0xf5fc170a,0x35a8180f,0xea98f84b,0xe881ab6e,0xc1bb90e4,0x4f91e74c,0xdee74bae,0x924af3e7,0x80e338b0,0x18d68dc5,0x2dee208c,0x27ec85d3,0xe4c90f8b,0x02020079,0xa89e19b0,0x287f0002,0x5dc5fbe4,0xf301b829,
0xb081e77b,0xe3a910f0,0xc1b4b9f2,0x32973a6f,0xb80fdc9d,0x96cc6a74,0xe4899f97,0x1955be48,0xb7ec4216,0x3788dd6a,0x57efe94c,0x6e664141,0xee7abfb0,0xe6f924bd,0xe1b18931,0x4857df71,0xe1f6c9a2,0xdac79149,0x23e56fe0,0x096d4f62,0x2f460100,0xae4c0033,0xa68b6414,0xb02cc5a7,
0x369508cf,0x52e74df8,0xfe8613a6,0xb6233d37,0x9e7e68bd,0x0c10829c,0x0c1640b1,0xb6d4b88f,0xa4f2f391,0x73532e3a,0xa39eafe0,0xad1ee8f3,0xee13b629,0x1649e5ab,0xe260519d,0x34f16493,0x0031b568,0x5b8d7eaa,0x61d64b39,0x8f1f149a,0x57260018,0x4d5b9a0a,0xb55333cf,0xde54233f,
0xa5cf97e0,0xb866274c,0xd200184f,0x4980cb33,0x2aa00005,0xc339ee05,0x03a58091,0xe799f77f,0xf3d5fc5e,0x8dbb003d,0xae2122be,0x711a6523,0x49656ce0,0x18d9d5aa,0xde386702,0x151f6e79,0xc9f84b52,0x9f069dc7,0xbd21b202,0x8b918dd6,0xf0019d40,0x06d2a119,0x4a5ce9bf,0xac0141f4,
0x733f2003,0x56a52298,0x4a954065,0x14f1ff8b,0x210accf7,0x30e21266,0x77fcb981,0x0e7a35ce,0x6c02d800,0x181821fe,0xf0dfd1d7,0xb0b560d5,0x1b30538c,0x8fc00e75,0x68217474,0x36ec24f2,0x6192a248,0x5084fdbd,0x3e5f8379,0x9c600197,0x3d3710c4,0xe243ab03,0xcb8b72a1,0x75dc6594,
0x795b0f05,0x2275fbb4,0xf57fe3a0,0x15f2471c,0x67a98689,0x8d0d81eb,0x31fc0d3e,0xf52096bb,0x051a61fd,0x71eefc31,0x9bc791f8,0xf9b40050,0xefbb2800,0xa61be68d,0xa84a7e30,0x9f2fc1bc,0x684e99cb,0x3f7637ce,0xe9858c68,0x29d1e599,0x28526649,0x0c5aec8b,0x0b7a00f8,0xe14e3e96,
0xe60d4417,0xb73d5ff1,0x11a492f5,0x582c91ac,0xef9df09a,0x7729c8c1,0x64bf6fb8,0x94472762,0x0ae32deb,0x2c62a529,0x7d096f3a,0x35182fa0,0x5c300022,0xf75d6b29,0x4a85e78e,0x9508cfd4,0x9b4df837,0x53a672fd,0xf65494f0,0x847a08ef,0xcb28cf4c,0x3cb361c1,0xc400b176,0x723f78ea,
0x88225c89,0xeaffe7c0,0x4e99d039,0x708fc69c,0xc9eb82e1,0xb8248e72,0x6aadb8ee,0x8f00832f,0xbdbe1b75,0xc1d4588f,0x2e44e012,0x001c27c6,0xcd452b93,0xa7c3043e,0x8cfaf574,0x5f837950,0x0f34c73e,0x3ac9d33d,0x524ec52c,0x73081c19,0x0aa18040,0xcd61f6af,0xaa13c93c,0xa822722e,
0xcf57f36a,0x5ec3ed95,0x8352a7ab,0xbc1d16d2,0xbaa374bf,0x36df6cee,0x0a6c2eaa,0x0309729b,0x031d4167,0x4c7500dd,0x3d452b93,0x098f978a,0x253ec83a,0x2fc1b4d4,0x93a3079f,0x5274c888,0x178307ac,0x81a6a54d,0x66002039,0x5e598f01,0x2fba4d0d,0x183321ed,0x20350fb6,0x7f76a982,
0x76e81cf5,0x8ec15b1a,0x05b93fed,0x1dda1140,0x9322f6be,0xe336ba89,0x6ffb514a,0x19f0fbc2,0x7e0da6a1,0xecbf66f3,0xb6d95894,0xd9667fcf,0xb6d7e730,0x6edfc30d,0xcf97f110,0xdea070ff,0x36e17b87,0xbad65423,0x95c4fb65,0xca73aab2,0x2ffe8457,0x6ed9b63c,0x734c22be,0xbef541a3,
0xcccb22f3,0x665327ff,0xc2da230c,0x4b0d51d0,0xb01e469f,0x288a0b62,0x880be0b6,0x42d33dc3,0x7e0277e8,0xeeec45b7,0xdf2095fa,0x401a9cf6,0x2b972ec9,0xd0bf6c30,0xff4e7cdd,0xf5d0d493,0xa4ee3bbe,0x490a9a5f,0x095e1ab0,0xf920fbc3,0x87025602,0xe4dd7e22,0x688c30da,0xa877d258,
0xc1add504,0x4c1e4610,0xd5f05755,0x7078e22a,0x8950b54f,0xe72a37ef,0xdf1b630f,0x9e08bddd,0xf35dddf2,0xb9764a00,0xcfc2e8a9,0xae23239b,0x352eaf6f,0x031f7acc,0xd0342360,0xc8892c7a,0x5d6a1911,0xfbca7b75,0x5602f920,0x0f14d506,0x36b9341a,0xff7a2324,0x810f1a84,0x3324466a,
0xd9f0e30d,0x6a0aeaa9,0x2a8fc9b6,0x931a01c0,0xfdde8829,0x9a37ad40,0x79ea887f,0x56caf431,0xca00f326,0xe8b9b976,0x35304b02,0xa2980a8a,0xf1923b1c,0x746c000b,0xa31d248a,0x7bc7143e,0x4725912e,0x786395cc,0xc05f241f,0xf5fa0941,0xb2e12842,0xce32421b,0x64aa09a3,0xeef26683,
0xe8c03b10,0x575730e6,0x87aab350,0x0059cd1d,0xac625fb6,0x2415e391,0x0309a18a,0x26803cc0,0x7454dcbb,0x62ecd281,0x11ac3f51,0x58f5fa8d,0x60003372,0xaf0f1694,0x9c883a08,0x3d4f64ad,0x2c344923,0xee83ef65,0x9b46600b,0x2507f6c6,0x570d8437,0x7f7b3e3d,0x26bee0de,0xdf563e7c,
0x734829e5,0x59a82f6a,0x2ce4f055,0x68bce100,0x00c857e1,0x26100798,0x29cfdfbc,0xa05d1733,0xa8d13f34,0x5428da1f,0x29ca71e3,0x010fbd66,0x4950f5b0,0x69e0d26f,0x43e6bb47,0xe9ee99e5,0x944022d8,0xcb1f4ccf,0x1800e118,0xe57adb54,0x5cf1c904,0x4d8f5b5f,0x8f31f0ca,0xe8e48ca0,
0x8003ef85,0x303f33ba,0x001a7be0,0x1371007d,0x66505cfd,0x0140ba2e,0xa6fcc8f8,0x76234094,0xce11635e,0x010fbd66,0x19c51e58,0xc3acf800,0x3c174d47,0x4e928895,0x003ad30f,0xd4dc55c6,0x6225eebe,0xc678ea74,0xef368c4f,0x5a0a9c55,0x95ea8d00,0x030007df,0xe131c421,0x0018f400,
0x8ac401a6,0xe6653a2a,0x13740ba2,0xe3bf70b8,0xe1d48de4,0x42c89b84,0xc0a633ef,0x7e96234e,0x0188892a,0x8068862b,0x25112676,0x13a547d3,0x8aba4005,0x0a86bd98,0xa7822504,0xa8fee299,0x31d617ed,0x2ce81f58,0x74003efd,0x4004c5fb,0x00cd707a,0x89a00f30,0x05d15332,0xf1cb93b8,
0xe46c02f4,0x5b02c223,0xd7de82eb,0x8e6b2224,0xb1f2847a,0xe2c53242,0xa043ace2,0x8960d51f,0xc53e9928,0x0061b83d,0x2f915748,0x061ccdeb,0x63de38b9,0xe5f0f860,0x48254930,0x1712ccb0,0xbe15d5cc,0x6f56e004,0xf0c0f4a1,0xaa331c08,0xd0069b9e,0xe8a99944,0x9e7d7202,0xf9897f66,
0xb3531e20,0x2a83c1ef,0x19741dfa,0xd0b52490,0x0190f713,0x02bcb2bf,0x94e92889,0x9801413d,0x6b8ca07a,0x647a8078,0x2aeff840,0x8702e53a,0x5f0aeaa9,0x4832b001,0x189e2911,0xc7b42800,0x65df3d42,0x30002803,0x5d153328,0xacc33bc0,0x8fca8df0,0xd3c97245,0x198bc912,0x50684ac0,
0x334d0577,0x6465835d,0x9c172c55,0x0a74e928,0x7a957e00,0x77810221,0xb1965f18,0x3fe54bb4,0x4d107de3,0xd5cd138c,0x3b000015,0x02ade63d,0xc47a27d8,0xca985771,0x74ae2900,0x001733cb,0x7a05d153,0x6e4635e7,0x598fd37c,0x87a7edc6,0x6e1eb0f7,0x9f5cc4ba,0xf9b643c2,0xa8c4ce76,
0x2a749444,0x5d5d2001,0xf5c9c6eb,0xa404e87e,0x1e4b3a31,0x29507d7f,0x909fa4c9,0x15d55385,0x8fc6acd4,0x08451cfa,0x491c1d65,0x59683b14,0x72834fc7,0xdb8a6aea,0xe4ca26ae,0x07180ba2,0x6cc1af11,0xd67710c1,0xf283d538,0xb4b72e1d,0xb384bb5f,0xe67c16b6,0xe79223e2,0x511234a9,
0x8004a9d2,0x9f7dd57c,0x790b958c,0x0c7e719c,0xa3c4cfea,0xafa7fafa,0x0aeae686,0x1c5642a1,0x0b732dd0,0xcd397811,0xedbd6be5,0x220a02a9,0x200e1af7,0xa9994cd5,0x3a2f8302,0x7976fa89,0x046d3b88,0xca7c1b0d,0x9df9de1c,0x63a69d88,0xe780e82c,0xa2262a9d,0x000353a4,0xb47755d3,
0xaf0fd2f3,0xf6e2f0b2,0xbdca3f5b,0x9e1ec01d,0x628c115b,0x5210aeae,0xd33bb1c5,0x9182b042,0x5336cfb0,0x4f844140,0xb5ac69db,0x05533299,0xab1cef86,0x398a1fb8,0xab6ed143,0xbf666633,0x0226fc65,0xa4a224e8,0x1e9b8c53,0x7ca18f32,0x16d8d955,0xa1d5bd86,0x713bd96f,0xff3678d2,
0x0857166f,0x9b111329,0x9568dbc1,0x81a2d93a,0x35a929c5,0xb0dce6b8,0x0c13b5e8,0x25106371,0x563d5a9f,0x6fd5eccf,0xc951861d,0xc25fe78c,0xe5655c9c,0x7e2b741d,0x98119595,0x61221c4c,0xf0c0e31b,0x27c5951f,0xe5543120,0x88f28d59,0xa27bc405,0xc53d761f,0x5de22278,0x5a31ca44,
0x844154a5,0xdee41c35,0xa130973f,0xb8afee47,0xa09e6e3d,0x6a69ecc6,0x38a06fec,0x33254617,0x719d7f9e,0xdfb57273,0xb751a5c4,0xe1fd1de2,0xc034d30a,0x37ea6100,0x3fc2bee6,0x64a92d28,0x4c315b45,0x7c227e97,0xd7e934d8,0x29e1f008,0xec0d76c6,0xbc189467,0xd74f78ed,0x402b2a35,
0x4932c1de,0x7afc2613,0x8f29c6c1,0xe45d8ac0,0xfa745835,0x8bbe4602,0x708a70e2,0xc690f596,0x0c7156be,0x2cf79bee,0xed40b6bc,0xc3ec6669,0x461132e2,0x979e3725,0x4e667947,0xe62883c2,0x68ef1585,0x1fd331c7,0x51e00715,0xfc7418cb,0x186560f2,0x94bd9823,0x94132ac7,0x7131b418,
0x90da222d,0x26bfe0ef,0x001cc12e,0x55c19909,0x01972792,0x48d55970,0x1a64ebeb,0x47148cbb,0x12960afb,0x2171309a,0x2aa2360a,0x93bad43c,0xaed7b12d,0xd586bcb1,0x0be818f0,0xa8a22aae,0x1d345b24,0xfe0f16ed,0x39147f73,0x53de3963,0x0b8472a4,0xd996e793,0xa38d6cd3,0xa8dc587b,
0xadb3c614,0x3649ccc7,0x8ee1ba16,0x075c209a,0x5eea8995,0x5baa0896,0x86c5a468,0x98e4832b,0x8a3c6355,0x244ecee1,0xc4e15a0f,0xaa21922a,0x0ddedd54,0x826cf69e,0x40050f60,0xcf7bc0cf,0x816bebdc,0xcb8dbbc3,0x146f3b60,0x3855446c,0x94f0cc96,0x0b18ec35,0xc71fef8b,0x29d8b1b2,
0x00197c4a,0xfdc0083d,0x00702890,0x5bd0e7fc,0x7196ff14,0x3ad3d981,0x757cd400,0xf6963370,0x7f611438,0x6286573b,0xe997b883,0x338d1b92,0x92be1585,0x40abf9bc,0x96e783ea,0x56ce0469,0x062484f1,0x0ab96f9b,0xc1a5de0f,0x60046df5,0xda0b51b7,0x26e524f4,0x0006ab68,0x1a4f04a5,
0xa0216167,0x154d2c67,0xbc65846c,0xe1b56237,0x4ace4e98,0xb57b9156,0x0bbda71d,0x0cb8ea54,0x0ac9e88b,0x87ee6a95,0xa875370e,0xa0f21df1,0x4284b7f8,0x314f80a1,0x4105e000,0xbbabfd3f,0x50de7e6e,0x639232c3,0x55da828c,0x91023d5d,0x2675fd50,0x9a117be6,0x6eb57f0d,0x2fbee000,
0x6a2f401d,0x151b32cd,0x2c5ca496,0x62002526,0x5f57a624,0xe973e984,0xf5180065,0xe823d50a,0xa096cd3e,0x80e72bba,0x99582eb5,0xeb820ce8,0x73cdca81,0x4db469f3,0x924975bd,0xa057522e,0xfe7ad85b,0x1649348b,0x5d052f69,0x20bc003a,0x757fa7e8,0xfaac0200,0x998941d5,0x51611879,
0xc21d48fc,0x4c538e50,0xe300026c,0xd28dc934,0x5000037d,0xf917b184,0xe000d662,0x9e41060a,0x492cd502,0xa02f2a8a,0x380581b3,0x3b2d000d,0xc4b1b2e0,0x5715c281,0x8cc2d7ba,0xa811a1f7,0x84724f24,0xece0f36e,0x20297129,0xc1b47000,0x0fd168d2,0x298cba09,0xf5f81060,0x6a13fddf,
0xa81c704c,0x9fab167a,0xd09982fd,0xcf3ef6e4,0x0d3f3f71,0xda3800ea,0xf6099347,0x01257422,0x21a085c0,0xcca21203,0x8e2746f0,0xa64b883b,0x49f68d82,0xec290316,0x5ea6024c,0x01c70caf,0x2650a9fa,0xdc79bcfd,0xf729c31f,0x987855d6,0x029a47a6,0x765d90c5,0x0075fe46,0x533a3922,
0xa0dceaf7,0x79331b47,0x983101eb,0x022f96e1,0xfadf01f0,0x0801d01c,0xf80308b0,0x6f7f41a1,0xbc0033e3,0xd69a318f,0xc18abc85,0xb1000c08,0x5c96c98d,0xaaf7b44e,0x8000941c,0xe5462945,0xc6174fe4,0x4f1350a1,0x0332848a,0x0067fca0,0xf22c1344,0x37bb8ae3,0xf481a430,0x14216157,
0x00103f95,0x000e994a,0xc6030fac,0x9615ce01,0x8c53c473,0x4d6c7c55,0x3046434f,0x1d6db02f,0x0e15b676,0x298dbe80,0x97ad8071,0x001150f8,0x2f46cd46,0xa1747c97,0x92cfb6be,0xc72678eb,0xbe00037f,0xcc51a1fe,0xa0c0cb1d,0x2ea0fbc0,0xa2450fa4,0x7add5176,0xa1727abd,0x53713762,
0x4c481077,0xb402f61f,0x6291a294,0x24e366ac,0x58d58596,0x64231ca4,0xb1bb9a59,0xf40008a1,0x065c8d82,0xb646dcfc,0x49b3658b,0x14ba3a60,0xa5473ab9,0x92fa3e30,0x371a0000,0x54414449,0xd415ebae,0x7d93fd93,0x3830308c,0xfe29ed80,0x0d700093,0xe24cf5c8,0x6590283c,0xc7fe80e0,
0xde2966f1,0xa8575e5b,0xee720090,0xc404b0dd,0x9abef753,0xafe0a4f0,0x356314f1,0x453df7ca,0xec4071ca,0x00062a83,0x4821b141,0x90aba001,0x5ab56b5d,0x321dd600,0x5539eb9d,0x9bd4ab1b,0x41af2137,0x2e190190,0x23e34a03,0xc616e4ec,0xdd44b599,0x2e6d755b,0x857cd400,0x7f4ffc75,
0xb8ac0eb9,0xa3a27a3e,0x29835e01,0xf36a27a0,0x9210f268,0xd9a6a6e7,0x89f15ba1,0xb7e76cc4,0xb925f835,0xa6b2a360,0xa54029d2,0x0ce9ddaf,0xd1f014e1,0xda38d2d8,0x42a031ea,0x39ca24cd,0x77e336c2,0x425124eb,0x6bd6d7bf,0x834fb016,0x5044a1b0,0x61e9d30e,0x007e3ec6,0xf2a0d7cd,
0x0adcbfe7,0xff6dd652,0x8938599c,0xa8f85986,0x27dd5438,0xd61bf868,0x25b659ba,0x509f96c3,0xe800a701,0x4199ba72,0xf7c3b9fd,0xbf19b117,0x50e97fdb,0x0a96e78f,0x9caa1fd8,0x8201ce08,0x6fec6a1e,0xee3683fd,0x2e98d4c4,0x5731e5d1,0xabb512e0,0xaa747912,0x897b744e,0x4c97253b,
0x13ac06fe,0x4bec3130,0xc93e5fca,0x833274d0,0x0466db7f,0x07fc6fff,0x6e2becc4,0xa8c10a96,0xfda4180a,0xdf11a908,0x1aa54c8a,0x4cc419b0,0x4ba6ca64,0x516b0974,0x066622c8,0x88340a76,0x345e4268,0x5ed4a4dc,0xc1fe0074,0x1eee5843,0x84ca2d61,0x691199d8,0xf2e64637,0x269eff64,
0x9961b0c3,0xfcd27454,0xae6cc577,0x26489036,0x53641547,0xf42b885e,0xacf94b6b,0x00195778,0xe2db5530,0xcd1bc00a,0x5db352c4,0xdcbbaf26,0x6624be31,0x67476448,0x0e17ea2b,0xc0121919,0xc35da1dc,0x8a31624f,0x5df979cb,0x37d1458f,0x6b00c0ce,0x127f228a,0x6c3ae621,0x1d2b6d6c,
0x4258269c,0x95970e4a,0x699aee7e,0x588bfe1d,0xca3f59b5,0x243f2449,0x142ffda8,0xa757b3fc,0x2e8949f2,0xb5c93daa,0x63437896,0x1aea6d1b,0xe44d6003,0xe384720d,0x9c8de639,0x37c726aa,0xc685d269,0xbf07aad8,0x00a5bd4f,0xd52681ec,0x76e32cad,0x2b06e48c,0x8955e1d6,0x21324b1a,
0x886c3ae6,0x26ae469d,0x6e9d22d9,0x22182fdb,0xb63f3bf9,0x448358b3,0xfeaaeaf9,0xeb0e3c5e,0xb29e0fdd,0xd0aa1ccd,0xca08e73f,0x744a4fe3,0x00b994b9,0x587289dc,0x00cd8afa,0x9c7f0860,0xe9d89db3,0xe1d6726a,0x94ffe20b,0x4f910521,0x0296f330,0xb5cd2eed,0x09fecb4b,0x1f0ead0d,
0x205d50d3,0x52bbf5a4,0x988461bd,0xa799b0ea,0xae34332c,0x5fe13c53,0x4dfefccd,0x49fa7780,0x1cc13063,0x5d7a8b88,0x14e85e57,0x5d7fb0c6,0x4004cbaf,0xd2453af9,0x0a6cf72c,0x28d85100,0xa60193c1,0x69d9c9aa,0x25aba444,0xe663a8bd,0xee3f052d,0x5c427d45,0xebbd2fc1,0x1cea291f,
0xe3ce4202,0x2309bf0f,0x0d8754c4,0xc74c517a,0xbb60478a,0xfdab7bd1,0xeb0bfea4,0x22d8641f,0x5a3245da,0xfbb42bc1,0x0c686737,0xd7f3b34c,0x004cbaf5,0xc6d52be4,0x1cf95d60,0x0e94c380,0x1c9aa980,0xb701c003,0x39fe9179,0x8cb0296f,0x032d2ce3,0xcce0a66e,0x19fd497b,0x5e3f4840,
0x022ffa0e,0x549a4615,0x79b14d87,0x70e3f9c2,0xa1e43635,0xcbe3b83f,0x03d0157d,0xf9ea05b5,0xc582979d,0x79239fba,0x7ec97bba,0x9dd089f1,0xebd43fca,0x80814d32,0xf945677f,0x83f0801c,0x35734418,0x8776bb39,0x146ddd21,0xcfe26c09,0x7a814b7b,0x300ed844,0xcd59f1a5,0x42065e50,
0xf7ebbc34,0xea9751f2,0xcd7ad9b0,0xccd4a266,0x11664466,0xd2c2de68,0xe3e3b471,0x9f4f7916,0x48102ffb,0x790c7dd6,0xd0a13965,0x492cbb9f,0xdcc36ee0,0x326b5d12,0x34c77e00,0xc801f31a,0xb9aa49e6,0xbcda5b27,0x236edc9a,0x4f646803,0x37e5c243,0xc6052df7,0x5e30124b,0xbc62d2bf,
0x49f48404,0x3af5b035,0x0c21e0ba,0xc3361d46,0x49002b83,0x8e49c7dd,0xd3c4d2cb,0x4abb793d,0x3fa868f5,0x09740dfb,0x16c87e0a,0x4d8fb54b,0xae897e65,0xfc647935,0xd4143817,0x0075540c,0x33e4c5a8,0xc4b95003,0x2003abb9,0xc5db9355,0x9106a029,0xcd996a44,0x24414b7d,0x25c8bfa7,
0x3289279c,0x909162b3,0x96fbba72,0x0179641c,0xd90ca30d,0x2555a0ca,0xcea4dfcd,0xcebf29fd,0x5c57fc2e,0x57ec630e,0xbbd9aaed,0x838353ca,0xb63b99cb,0x3988cb7d,0xca2badf0,0x825d12bc,0x30c7714c,0xb46ec50b,0xb4a62d42,0x4f9d7d5e,0xe334b001,0xae49b3ba,0x0064c726,0x8f6c341a,
0x0a5bee73,0x55fd49a2,0x8ea7e83e,0x207a4df3,0xcd9a7da4,0xe244d63d,0x6d8754bc,0x8c9cbf65,0xf980c836,0x99af43d5,0x8c0475a1,0x4952edad,0x7edec852,0x87529cbc,0x9bac2705,0x3227d967,0xba25b331,0x66e8ef66,0xa801c4a1,0x85a6fbb5,0xc0b04b60,0x06393554,0x4c4746c0,0x296f79fb,
0x045185c0,0x854ee1c9,0x13331d88,0xb0eb98a2,0x97883551,0x03a30576,0x9db031ec,0x236a8a48,0x979e21d6,0x9682dbda,0x65080e24,0x33311323,0xef66ba25,0x5c2cd1fc,0x8c128ee2,0xe6f5a143,0xb9c9aaa6,0x8ed014e9,0xbcfb0279,0x761c14b7,0xf0fea872,0x99960c2f,0x22995d83,0xc3ae9944,
0x04a07876,0x50a3a545,0x9f26ac14,0x8acca451,0x9d0e07e7,0x28d82896,0xa13fcf11,0xc0ff2fad,0xe8eff471,0xc24bc951,0xa4a40251,0x554f0a41,0x67df7393,0x6ac9fe28,0xce0c459f,0x9a414b79,0xeaa42ea4,0x1189c1e3,0xa2132b98,0xfb61d74c,0x54b90ecf,0x69fde290,0x13ded28e,0x4272e6d9,
0x7cb5fa1d,0x64e03ba3,0xa1efc5ff,0xc0a02f5f,0xf060251d,0x33296e1d,0x2adce4d5,0x601a3fc5,0x5bde7ad3,0x27e10e0a,0x6a54c3fe,0xce7d679b,0xfde76639,0xef401c72,0xc3d3eb74,0xfce6adfd,0x4dd5ef36,0x36dde237,0xbcea0802,0x509c80de,0xc27b2ca7,0x3080101d,0x89eec0bc,0x67645bea,
0x06b69fe5,0x002fdb15,0xdc46c83c,0x8a5c46ab,0xa5e734c9,0xd7e7e589,0x53616879,0x71a0497f,0xf6832c1e,0xc52ed675,0xd76e6512,0x05b77c59,0xe09dc5cd,0xae1b7e52,0x97cbf951,0x216e5fc3,0x5b7bd988,0x653a84e4,0xd104d46f,0xa986bb95,0x606fdabc,0xe0636aca,0x99592fa7,0xf385e498,
0x103d1a20,0x86b3e3a2,0xcc2a3d4a,0x6d3e977c,0x7ac19deb,0xa5eba650,0xff28eaf7,0x610b92e4,0x98e4b32f,0x9bc1baf1,0xc82b463d,0x8e3cbd52,0x2d213e71,0xbd13705c,0x9504333a,0x28283195,0x231de7a9,0x37679737,0x25ea746d,0x5a29da90,0xf5e3d26f,0xbd1e97be,0x2a655dde,0x76ba0ea1,
0xc3d91afe,0x1bbab2c9,0x4865af7e,0x92f7441c,0x17479411,0x2956dda8,0x76b52891,0xbf3a6af8,0xd97cbd41,0x27df3509,0xe32da7c6,0xba8d291c,0x47739659,0x40298ff2,0x97cd375b,0x04a0c747,0x448be581,0xb3ccde73,0x688323b8,0x4e70d998,0xecd148cb,0xe3f6f83c,0x9f531bf0,0x4d16981c,
0x5811ac48,0xdaef4e9e,0xb5183dd8,0x6f6431ca,0x1d8af34f,0x1d42730d,0x18799f3c,0x5bf7f4fb,0xba2da9ee,0x94000869,0x897b4d35,0x4f57ba13,0x0f08f0c3,0xc46dda18,0x950f0f2b,0xac1ac6d9,0xfdcd49ca,0x0495e680,0xe8fe0200,0xa6a6bbda,0x563da3a0,0x89baacb3,0x274b5c48,0x1cbd1dde,
0xde082eee,0x0c232aa4,0x874d1019,0x9e76670c,0x291968e4,0x988bba50,0xd66b979d,0x78ee9aa9,0xbeab123f,0x002329be,0xc6fcefd8,0xdf7443ac,0xee42a8d1,0xea1392f2,0x7c254f5c,0x4a5683e0,0xeb77ed74,0xb8c76df0,0xafbee635,0x5998ecf9,0x8ee3fb8a,0xa70f2c76,0xbc5622e5,0xc4fdc687,
0xcfdc9eed,0xe9b6e834,0xdc33affd,0x854603ba,0xa74b1ce3,0xddc1efe0,0xdab5963d,0xf2d9aaeb,0x6f89a4be,0x9dd224bf,0x51c7ee3c,0x47f09ea8,0xae732be9,0x4ca42aae,0xbdee4c87,0xf34bcec8,0xb7cd822c,0x45703896,0xd0dbf396,0xae158f0a,0xe77dd1df,0xf703c368,0xb57c3ff0,0xb8a7509c,
0x801ab40e,0x8049a454,0x3c923127,0x40ff0f7f,0xf166e019,0xfbb554c1,0x7b9e4675,0x50b4d860,0x5675f9ed,0x3e758a79,0xe995b762,0x4e3db286,0xd92f5293,0x091d89ff,0x1c919d39,0xacbc422a,0x80a69bb9,0x17a762d4,0x364862b1,0xb1cf5c45,0x46062b18,0x09c8baa1,0x94bc34de,0xb804c9a1,
0xe16cba81,0x9d21f499,0x3dc08102,0x4ce61ab0,0x659583f0,0xf6dbf237,0xfdb767cb,0x7b802050,0x09c38ad1,0x39ef5dd0,0x427314b7,0x6fa0f01d,0x631278fc,0x6ef140ab,0xba250d44,0xcf7e800a,0x99311242,0x003948b5,0x54c3db55,0xd7b8f5eb,0x4d697e3b,0xc05fb637,0x99a7253c,0x21045a0a,
0xd5a71ddc,0x67f01018,0x8601fb97,0x8bc3940b,0x5af75560,0x140c5b70,0xe39623ee,0x0b54000d,0x7137948f,0x46a41ac8,0x07964c87,0x1f12757b,0xfd62a3bc,0xcac63deb,0x84b1cbc5,0x5edb7e72,0x309ba79d,0x06ec1f0d,0x129beaae,0x005970ea,0xec3987de,0x3f427669,0x29a48d96,0x45d53774,
0xe25a6741,0x9bc4c73d,0xbdb835b6,0xac6b6c1d,0xd9b7d1f1,0xac6c6d7a,0x406f347f,0x2d843456,0xed502a1b,0x904bd6d7,0x0e71fdcb,0xf8b30160,0xf0bca805,0x2f3d954f,0x846ca0b2,0x63bc372a,0x5270e9bc,0x94c871a2,0x53a040bd,0x8943a179,0x513256ea,0x19ec90ae,0x83a71ed5,0x36fca529,
0x02211313,0x66ea116d,0xd2a3a84e,0x679a050f,0x439b4e43,0x8ebd934b,0xdf9aad04,0x1bc6bca0,0x9a3da058,0x2ae51d7c,0x95e8dc95,0x07aa9e35,0x6c47b5fb,0x102d7ad8,0x3716e9a1,0xb95eb6e5,0x4a7aef25,0x7479cac6,0x442a058f,0x59f7e303,0x36ee4ff6,0x8d1afa80,0x24a84206,0x5d4694de,
0xf535ca1a,0xc41875e3,0x6e5a4f24,0x39001a7a,0xde642dbf,0x961c50ec,0x2dd4276f,0xa1953ac1,0xf8c174af,0x391283d1,0xeee5c879,0x1c3ba84b,0x2e9e2e94,0xfdda8103,0x0b8c6b05,0x18fc93a5,0x8c27ae1b,0x591788bb,0x414c0470,0x57449ef1,0x1fad3b54,0xa8ee21b0,0xe4b0f947,0x88ff588e,
0xfecb4615,0xf5d5a473,0x5379919c,0x286a6007,0x34acb7d7,0x2ba2d3c9,0x49dbd21f,0x31e1d6fe,0x35621595,0x1d5f7044,0x007ee83a,0x4e199010,0xe94e9e9f,0x31eba7de,0xafafecde,0xd6719bf7,0x3e3f1978,0xa1b05e8e,0x34ded8b8,0xca03fa0b,0xf48b5bc4,0x0860db4a,0x54b3559e,0xb085e8ae,
0x2660eb77,0x3057c65b,0x8edb9eea,0xfa9d3789,0x50d4cc56,0x10f8277e,0x39a6020d,0x6f3788d0,0xfd78c454,0x8545a358,0xe078b7b0,0xe88cd5ea,0xa06061e6,0x12eee10d,0x346e500e,0xb8821be1,0x15078bef,0xa25abe22,0x48d1f1f1,0x631436cc,0x3cfd1dd7,0x8ce53159,0x21cbdb4a,0x15d70658,
0x5dec7153,0xde2c27b4,0xff093665,0x74e7b242,0x8423907a,0x947b5651,0x8a07b426,0xa0734c4f,0x09576f11,0xef77213e,0x587b9eba,0xf15f9131,0x909e0180,0xceb82b7c,0x57f229e3,0xf12ee168,0x9fe12fa8,0x2906fdf6,0xa8cdf998,0xefa1bcfc,0x5f4f53ba,0x6da55e63,0x7bf9515e,0x7d39b085,
0x49e11b7b,0x8348d364,0x17b18174,0xa535c1c4,0x45da3907,0x53aa3e8c,0x90ee409a,0xfca2ef5c,0x73e2c5ba,0x149ba512,0x8d7d69d5,0x8699b0d4,0xacd3c745,0x54539eb4,0xadad43d1,0x555b81fc,0xaa2febc0,0x02644346,0xcc22a6f2,0x7a6a985e,0x0de7e4d4,0x931dd77d,0xe169bfb4,0xf87f4dda,
0xe6588d19,0x41ae25f4,0xbba1ca51,0x3e41a793,0xf9619f17,0xa535c187,0xaa0cad07,0xc07672a8,0x3e61599a,0x7751faa8,0xf48a244b,0x6ca37e77,0x687e5e06,0x2dab12f0,0xaa938c51,0x2a1af1ad,0x74a4976d,0x7f938254,0xc5b8b6bc,0x2b33c607,0x1aaca48e,0xb068cbd5,0x91ed885d,0xf5d7b4f1,
0x8c4dad30,0xbe94cb11,0x8c98738b,0x9b3473bf,0x09747965,0xa788246b,0x1d45a04a,0xa0f4a64a,0xe93c0ff5,0xae15d466,0x52fa885d,0xaa91d4f0,0x4f506cec,0x3dc27956,0x3b670efd,0x31018ac6,0x24731dbd,0x3d3f1841,0x64bf5ea0,0x3b638a2a,0x5ce552b0,0x1bf7290e,0x95303802,0xbf592823,
0xd6c03ccb,0x2b2b4632,0x3583cb8f,0x3b46d7d8,0x6f3fad06,0xff2bbe68,0xfee05403,0x66588b11,0xdbef51f4,0x06c9a125,0x38d7cd98,0xf8d4934c,0x5a71bc41,0x4f820f4a,0xee7522e5,0x0aecc5c6,0xe11969ae,0x2e61d629,0xeab02dd9,0x247968bd,0x0c2b1bbb,0xc8f5c480,0xf5a6f94d,0x92cfda88,
0xd6c7145c,0x91430d2b,0xb37f9340,0xf50bd8e2,0x1199416f,0xd576304b,0x5ba74e94,0xad235bbf,0xc163591b,0xa8c1b995,0x0eb0dd0a,0x2b1289cb,0x0568c0df,0xe1694579,0xfdf4c27f,0x964a3c0f,0x69a25786,0xe13acc83,0xc15e1634,0xeaa67960,0x107a54e6,0xf3b4a36e,0x77a58b7c,0xa52f8c04,
0x48af0a0b,0xd32a38a9,0x0136602d,0xf8efc03a,0x1ede9a4e,0xfe77b97b,0xddaf84ac,0xe28b9259,0x2a590e80,0x86acaae6,0xb6a033a2,0x49740baf,0xb2900096,0x77eb24e5,0x967935eb,0x444ca1ca,0xb0edfe0d,0xaef6d70b,0x8a61f9c9,0x568cc8ea,0x11f4779c,0x8df367fa,0x7a575f9b,0x00098bf2,
0xd4aae68c,0xea9aa473,0xb000ceaf,0x13938832,0xe5a87cae,0x1cc9a0df,0xf1ccd78f,0x5c758a39,0xf855c6d1,0x79d3ac79,0x1015aaa2,0x3b62a18d,0x6b1ed7c0,0x82c7d064,0xa2a64b7a,0xc5bca038,0x42cd24d3,0xf520ab8d,0x906bc563,0x53001249,0xfadc74e9,0xd1cf6bb5,0xd276ba7b,0xaba4d877,
0x54a00df0,0xd6fdb7a1,0x70456823,0xe1990bf8,0xb67e508f,0x3ccaebfc,0xc79e7000,0x1442603e,0x5f993342,0xf3677b4c,0x7c76fa1e,0x4449609f,0xdd0e7c52,0x7fe31d8d,0x6549d154,0x795eb4b3,0x5a16ca48,0xa09a6559,0x6c07205c,0xd3c3f7b8,0x742c1a18,0x1869fc7f,0x6454dbda,0xe5b2a600,
0x68ebf5b8,0x7cac13e7,0x0480c81c,0x3e87e58b,0xe872455e,0xc2b41622,0xba1bf807,0x82a00fe0,0x7af5bdbc,0x0074d78e,0x9a00027c,0xe3791a07,0xe254ca56,0x71cada13,0x275588ee,0x9258b761,0xee1cf8a4,0x00b0b37d,0x8d5543ff,0x2f90f7ce,0x04fb2a99,0x1843e92a,0xdddb6443,0x64c04c06,
0xcc8ed1b9,0xd3a52000,0x6c17eb71,0x051697d3,0x8ceed1c0,0x08918f9e,0x1f4b7e30,0xd3951a34,0x75413c0a,0x32c7f663,0x806d35a6,0xa73ef2cc,0xaa963e0f,0x0c1e8525,0xabd2e533,0xe99b0866,0xae4f89d3,0x3b6ff449,0x2f3c1d62,0xafdd1b65,0x3ecaa64b,0xd37275bb,0x51b7b3c9,0x0d1faaee,
0x22e5b4f4,0x3a720032,0xc2fd619d,0x69945f68,0x55ef1809,0x37ebfc39,0x7aec83ad,0x90d62d3e,0x7456811f,0xeff17252,0x8615607e,0x2d461aed,0xdb92b01d,0xee30be94,0x3d7544d8,0x6452cbd8,0x64a9bfd6,0x583f1d38,0x5cbd09c9,0xbc2a22a8,0xcaca7efb,0xf2cda399,0xd05fb652,0x1724bafd,
0xf272c1c5,0xf7a375e8,0x1c0d32c1,0x20abef0c,0xa400246b,0xfac9396c,0x4f94e8dd,0xd5f0577e,0xc775f00b,0x5c38c967,0x88681ae3,0x184624fe,0x01547ada,0xf88fbc70,0x6d710bcb,0x02df8cb4,0x9cf0617f,0x39a431e6,0xc597342d,0x77dab5ae,0xbb7238f7,0x2a3b8ebc,0xbbc2ac13,0x3276c6af,
0xec2eebf9,0x65845a5a,0x925cccc2,0x9a78e28b,0xf571bae4,0x2f823d90,0x79532d92,0xe5b29419,0x2257eb0c,0xd1fc6f76,0xf27f8cea,0x664d9532,0x544639e5,0x97bde3bd,0xb2c523b5,0xadc3a529,0xcb68d49a,0xad0e85b6,0xd93bbc61,0x4318a2ce,0x7342d396,0x54ed1c75,0x895181aa,0xbb8ea2bb,
0x82452f88,0xfd034569,0xad2a1775,0x0e528b99,0x1724b57a,0x9b8cb1c5,0x775ebb7b,0xd92f5507,0x657add32,0xbaca38be,0x581cb652,0x4efa2dbf,0xcb589911,0x5b41cf3a,0x442205a7,0x8f3f99dd,0x894178ae,0xf8cb2918,0xa185b005,0xcbfe0115,0xb09909f6,0xdc3186e1,0x3691ebb3,0x1cbd1d2c,
0xe50e83ce,0x8bb8ebd1,0x4d80ef0a,0xbc6ddee1,0x000382ee,0x981719a2,0x1c515325,0xc365878b,0x5ba65b4d,0xcc6c7a4e,0x9dd9cb64,0xf62654ec,0x38194d6b,0xfa8ceb96,0xe2f1af78,0x2505fc87,0x5ec0a462,0xba12cb01,0x9d38095f,0xc235a38c,0x6cd4b352,0x68d759a1,0xd69ddc6e,0xa54bb2ce,
0x8f450e48,0xacbee3a8,0x7ac77857,0xec75c82e,0x80021775,0x198d31f0,0x67bcaffa,0x7b92a0c8,0x6aa9f41d,0xd2c70319,0xd631da85,0x692aacfa,0x37c3dbb8,0x9417885e,0x9a0523e8,0xba10f608,0x9889683f,0x13b87d30,0x4dec53bf,0x57bc3faf,0x4a30e60d,0x514cedb1,0xf0a8ddc7,0xa630df0e,
0x001327ae,0x9d77768e,0x945a0ded,0xd26d3d1d,0xda1392c8,0xfd271884,0x0d533e8a,0x3366bb69,0x4a835d89,0xa7d075e1,0xc4168d2a,0xe9da385e,0xdb8d1e72,0xf971c195,0x17a514f8,0x3189417b,0x714f2052,0xdbf74152,0x7e265605,0x6e805302,0x7cd9a941,0xcb56c8a4,0x459e4195,0x434e0164,
0x71d45fa4,0x47bc2a37,0x3a2547f2,0xd81c268d,0xee7bad24,0xc3bbe358,0x04111de3,0xae673d08,0x6e9e180d,0x271e4564,0x533e8afd,0x862b6975,0x3abb1750,0x41d7ba95,0xed76aa9f,0x4cabeb52,0xa068fce7,0x3b320210,0x02b2b477,0x4389417b,0x200728ea,0xb3e27e9f,0x2495c26b,0xa8a2c31c,
0x71c141d4,0xa84e943f,0xe3a8d68b,0x8f78546e,0xc3c2e974,0x5f01775e,0x850d551c,0x54a0e970,0xd4cb571e,0x83e3bd59,0x0b43e639,0x927d3dfa,0xfa2d03cf,0xf457e938,0x5b4baa99,0xb10d0863,0xbdd4a9cb,0xb554fa0e,0x18d5476b,0x00018346,0xefae6a1d,0xc5ad109f,0x82f8727d,0x002ccf12,
0xcbaa72c5,0x6bd76c7a,0xd99b67da,0x302e8e24,0xf7331b00,0x11b6fec1,0x9602cabd,0xfcef0af4,0x49a16c0d,0x09a33434,0x4964b5da,0xe418614b,0x2036a34e,0x31da1a83,0x0aa2d275,0xe24e31bb,0x75533e8a,0xa10c6b69,0x953abb10,0x9f41d7ba,0x10f196aa,0x94587354,0x3c93da00,0x09a00a1a,
0x0bf80031,0x91f5564a,0x92a05ff2,0x9be6c408,0x2863cf24,0xc60533b9,0xdb75c3d0,0xefe5b095,0x87b72a09,0xcb1dcabe,0x1d2691e9,0xe9379f8b,0xf4727213,0xf64db680,0xe8988f24,0x315fa4e3,0xb690aa66,0x62ea10fa,0xf752a757,0xd148e03a,0xb68e48a2,0x8961abe6,0xdfaf5b47,0x1de4626d,
0x4f71f480,0x63bc07f7,0x94c3486d,0xec498be9,0x346973a0,0xf11a3603,0xbf8e224c,0xf97274e0,0xefc5e3a9,0xfa9dcfd2,0xe67eb606,0x57d26fbe,0xc6592fb9,0x2176c9c7,0x69ef0881,0xedc79259,0x6e88502e,0xa6e8716b,0x15fa4e3e,0x690aa663,0x2ea10fab,0x752a7576,0x4d4e03af,0xb73dab2a,
0xc0df1025,0xe1669eb4,0x85497726,0x2a52ae56,0x5138f8b2,0x0c971cc8,0x6bf35c64,0x11db84d6,0x7121b248,0xf6365e3b,0x81d846cb,0x1389fb5d,0x6e541cef,0x767d56bb,0xe7868681,0x9c61fac6,0x7a0ee551,0xb640b60d,0x8a469373,0x55e3aef6,0xda824d52,0x4f1adb88,0x271f5778,0x533e8afd,
0x0fab6975,0x75762ea1,0x83af752a,0xe0400060,0x82d11b40,0x568f9e20,0x35d5bd9f,0xfe841fd2,0xc6cbc6c0,0xef524a5f,0xd3b5c9e2,0xb24b6fa0,0x41a28c1f,0xe785d597,0xf412838e,0x22c71a3e,0x809e6098,0x17e70ac5,0xb041aa7e,0x4338c855,0xbd9142fe,0xfcf72c14,0x6a838ed5,0x0641bf22,
0x9ba47efc,0x04651700,0xfd271f45,0x75533e8a,0xa10c6b69,0xdd3d762e,0xc9a507d6,0xd1bf691a,0xe57a7092,0xa731e848,0xae29dd66,0x0398aeac,0x7994027c,0x6fa15555,0x44ecb039,0xa0c3a326,0xdf5961c7,0x92538e85,0xefc2d5f0,0x5dabdab4,0xf978912b,0xb27cf879,0x4025762f,0x58f7d534,
0xac0558e9,0xcc3debc9,0x3b59e1e8,0x17f219c6,0x0530da2e,0x4f31966c,0x5581df01,0x9cce8760,0xe87faf68,0xb4a175a0,0x1dd9db08,0x688dbebe,0x4abe07e4,0xed2c5568,0xf8eaf748,0xa5c94dad,0x5e81d2f0,0xce1b0a73,0x2c320bc1,0x82d4b77f,0x395d7875,0x57c5e607,0x62c2a1c1,0x86b03719,
0x3ef9b950,0x920ba8fe,0x0a91c9ae,0x763c1956,0x68178a50,0xe2dc204c,0xdeb612bb,0xa4551ecb,0xc3ad7c61,0xe8cd1ef6,0xc63b5911,0x6635be99,0xec76c291,0x6ceb3113,0x57a3feba,0xe65cd9af,0xec30e723,0x63775630,0x20f421d3,0x9f87fde9,0xd2f001ef,0xd6663e89,0x9ad8f679,0xa36cf1e5,
0xcdeb078d,0xc0351bc7,0x4ed00018,0x6671f316,0x40aac097,0x0f6bda49,0x0ffd6bad,0xbdf01a17,0xacf1f8d0,0x9a028978,0xd8d84aef,0x09683c4b,0xa49feb55,0x95ef7fe7,0xbba0609b,0xb87f587f,0x3627748d,0x133365d3,0xa647bacc,0xf359c3d4,0xf73c6d05,0x7061893d,0x73c00091,0x22871cdb,
0x93cbe7a3,0xbec3e9e2,0x8fab0920,0x5970b2ae,0xfd71629b,0x7fad790a,0x80009bb3,0x22a3efd3,0xd9d07a80,0x1c1a65b1,0xec570ec3,0x1e561f9e,0xfaa1e6cc,0xe3dbb2ef,0xfa36e65e,0xd797360f,0xb50d59b6,0xddfdfbd6,0x36944ef0,0x64c95902,0x62666cbd,0xea530cd8,0xe3df2e71,0xf5b38f4e,
0x2b849376,0x83c50002,0x2ecb38f9,0xe8287eef,0xd38c2ffe,0x9d6de292,0x4091dad7,0x0d38e404,0xf0b1692f,0x0c706312,0x68715c3b,0x34aa3bcd,0xcdb77a3a,0xf5c17d1e,0x4e9ef343,0xe6f7adfb,0xb83f751d,0x55a32fbb,0xafa6846a,0xa9bf9e49,0xa94b398b,0xf4f340fe,0x0da9a0e0,0xef6f5286,
0xefa89265,0x6b8fd6ed,0x7d1efac9,0xdb6be21b,0x0fb7fca1,0xaf94339e,0xc8e859e4,0xec31c19c,0xa27bc770,0x16ddc25e,0x265da938,0x7ad85160,0x708e76ad,0xb5eb65d3,0x52e3cedc,0x91887ee7,0x307c8a1c,0x16a027d0,0xf5d48b30,0x95bfcb14,0x8db23858,0xba62d096,0x3bd4a1bc,0x58cb22b5,
0xa2fb0dd8,0xcc817054,0x8fd3effe,0x75ad40b6,0x49242053,0x3e296055,0xc31c1f41,0x6ab0070e,0xd18cd465,0xa562ddb3,0x23e56ad1,0x9a37b8a6,0xa9fda827,0x23f7d547,0x8ad34af6,0x9da3800e,0xc7368ca8,0xdc2bc697,0xa1b74a15,0xf95b3bd4,0xdf563666,0x8fa7fe53,0xae3ed5a5,0x90cbda0b,
0x7a5471be,0x383e90cb,0xcb04f686,0x0376adcf,0xf9a20bc3,0x4ef185a9,0x8a7ba570,0x49d6ed0f,0x44d882a3,0x53c10f13,0x0eb83e50,0x344520df,0x02dfdeaa,0xfbc58acb,0x4679bc6e,0xa526a909,0xa8f119de,0xfa79ff93,0x17987731,0x14842af1,0xb8b25cf9,0xaedc3b74,0x340d4a65,0xdcbd6d05,
0x312b1969,0x672ed4c0,0x7ed5a1f0,0xe28b4ab6,0x33d9cb04,0xe980685a,0x1093bbf0,0x4b99ab35,0xfcadb1cc,0x053e3b6f,0x9e9d1500,0x9338bfa6,0xb576e1d9,0x00cea03f,0x1dd8245b,0x39fc34a1,0x5c11b218,0x20c37b55,0xa5aa7ab5,0xd7f947a6,0xb6264b1c,0xd141cf97,0xd385d9b1,0xa8cca267,
0x5ec6dcad,0x1b6017d1,0x1c095b3b,0xffe88bfc,0xe3ddea7f,0xbd00137f,0xbb87b66e,0x6cc94580,0xcf95e6d1,0xb1dced96,0xbf319d29,0x0d5fe871,0x9b375e80,0x40838d86,0x45b32517,0x9b3e579b,0xe44e5267,0x2b7faa04,0x6cdd7a00,0x325e609d,0xe579b45b,0x054e79b3,0xff4c0b2f,0x39bcc937,
0x38944053,0x792a95a3,0x71ac712d,0xf2a2da26,0x92b71cd9,0xe787a5e2,0x30032ddf,0x83bd1444,0x7f2552b4,0x4b647d7b,0xfd7efb6a,0xff042dbf,0x16055fbf,0x58002c00,0x6000b000,0x8002c001,0x000b0005,0x002c0016,0x00b00058,0x02c00160,0x0b000580,0x2c001600,0xb0005800,0xc0016000,
0x00058002,0x0016000b,0x0058002c,0x016000b0,0x058002c0,0x16000b00,0x58002c00,0x6000b000,0x8002c001,0x000b0005,0x002c0016,0x00b00058,0x02c00160,0x0b000580,0x2c001600,0xb0005800,0xc0016000,0x00058002,0x0016000b,0x0058002c,0x016000b0,0x058002c0,0x16000b00,0x58002c00,
0x6000b000,0x8002c001,0x000b0005,0x002c0016,0x00b00058,0x02c00160,0x0b000580,0x2c001600,0xb0005800,0xc0016000,0x00058002,0x25fe000b,0x8c01ffc7,0x03859954,0x00a7226a,0x49000000,0xae444e45,0x00826042,
};

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

View file

@ -0,0 +1,167 @@
{
0x42,0x4d,0x46,0x03,0x01,0x25,0x00,0x00,0x00,0x12,0x00,0xd0,0x00,0x64,0x00,0x01,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x44,0x65,0x6a,0x61,0x56,0x75,0x20,0x53,0x65,
0x72,0x69,0x66,0x20,0x43,0x6f,0x6e,0x64,0x65,0x6e,0x73,0x65,0x64,0x00,0x02,0x0f,0x00,0x00,0x00,0x12,0x00,0x0e,0x00,0x00,0x01,0x00,0x01,0x01,0x00,0x00,0x01,0x00,
0x00,0x00,0x03,0x31,0x00,0x00,0x00,0x44,0x65,0x6a,0x61,0x56,0x75,0x53,0x61,0x6e,0x73,0x43,0x6f,0x6e,0x64,0x65,0x6e,0x73,0x65,0x64,0x42,0x6f,0x6c,0x64,0x4f,0x75,
0x74,0x6c,0x69,0x6e,0x65,0x52,0x47,0x42,0x41,0x62,0x69,0x6e,0x61,0x72,0x79,0x31,0x38,0x5f,0x30,0x2e,0x70,0x6e,0x67,0x00,0x04,0xc4,0x13,0x00,0x00,0x20,0x00,0x00,
0x00,0xfc,0x00,0x43,0x00,0x03,0x00,0x03,0x00,0xff,0xff,0xff,0xff,0x05,0x00,0x00,0x0f,0x21,0x00,0x00,0x00,0x9a,0x00,0x54,0x00,0x06,0x00,0x0e,0x00,0x00,0x00,0x02,
0x00,0x06,0x00,0x00,0x0f,0x22,0x00,0x00,0x00,0x98,0x00,0x94,0x00,0x07,0x00,0x07,0x00,0x00,0x00,0x02,0x00,0x07,0x00,0x00,0x0f,0x23,0x00,0x00,0x00,0x76,0x00,0x63,
0x00,0x0d,0x00,0x0d,0x00,0xff,0xff,0x02,0x00,0x0b,0x00,0x00,0x0f,0x24,0x00,0x00,0x00,0x89,0x00,0x13,0x00,0x0a,0x00,0x11,0x00,0x00,0x00,0x01,0x00,0x09,0x00,0x00,
0x0f,0x25,0x00,0x00,0x00,0x6e,0x00,0x25,0x00,0x0f,0x00,0x0f,0x00,0xff,0xff,0x01,0x00,0x0d,0x00,0x00,0x0f,0x26,0x00,0x00,0x00,0x8d,0x00,0x25,0x00,0x0e,0x00,0x0f,
0x00,0xff,0xff,0x01,0x00,0x0c,0x00,0x00,0x0f,0x27,0x00,0x00,0x00,0xfb,0x00,0x23,0x00,0x04,0x00,0x07,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x00,0x0f,0x28,0x00,0x00,
0x00,0xd8,0x00,0x12,0x00,0x07,0x00,0x11,0x00,0x00,0x00,0x01,0x00,0x06,0x00,0x00,0x0f,0x29,0x00,0x00,0x00,0xcf,0x00,0x12,0x00,0x08,0x00,0x11,0x00,0xff,0xff,0x01,
0x00,0x06,0x00,0x00,0x0f,0x2a,0x00,0x00,0x00,0x0a,0x00,0x8d,0x00,0x09,0x00,0x0a,0x00,0xff,0xff,0x01,0x00,0x07,0x00,0x00,0x0f,0x2b,0x00,0x00,0x00,0x81,0x00,0x71,
0x00,0x0b,0x00,0x0c,0x00,0x00,0x00,0x03,0x00,0x0b,0x00,0x00,0x0f,0x2c,0x00,0x00,0x00,0xf9,0x00,0x86,0x00,0x06,0x00,0x08,0x00,0xff,0xff,0x0a,0x00,0x05,0x00,0x00,
0x0f,0x2d,0x00,0x00,0x00,0x19,0x00,0xa1,0x00,0x07,0x00,0x05,0x00,0xff,0xff,0x08,0x00,0x06,0x00,0x00,0x0f,0x2e,0x00,0x00,0x00,0xde,0x00,0x91,0x00,0x05,0x00,0x06,
0x00,0x00,0x00,0x0a,0x00,0x05,0x00,0x00,0x0f,0x2f,0x00,0x00,0x00,0x60,0x00,0x45,0x00,0x07,0x00,0x0f,0x00,0xff,0xff,0x02,0x00,0x05,0x00,0x00,0x0f,0x30,0x00,0x00,
0x00,0x62,0x00,0x35,0x00,0x0b,0x00,0x0f,0x00,0xff,0xff,0x01,0x00,0x09,0x00,0x00,0x0f,0x31,0x00,0x00,0x00,0x45,0x00,0x55,0x00,0x09,0x00,0x0e,0x00,0x00,0x00,0x01,
0x00,0x09,0x00,0x00,0x0f,0x32,0x00,0x00,0x00,0x24,0x00,0x56,0x00,0x0b,0x00,0x0e,0x00,0xff,0xff,0x01,0x00,0x09,0x00,0x00,0x0f,0x33,0x00,0x00,0x00,0xda,0x00,0x34,
0x00,0x0b,0x00,0x0f,0x00,0xff,0xff,0x01,0x00,0x09,0x00,0x00,0x0f,0x34,0x00,0x00,0x00,0x18,0x00,0x56,0x00,0x0b,0x00,0x0e,0x00,0xff,0xff,0x01,0x00,0x09,0x00,0x00,
0x0f,0x35,0x00,0x00,0x00,0x30,0x00,0x56,0x00,0x0a,0x00,0x0e,0x00,0x00,0x00,0x02,0x00,0x09,0x00,0x00,0x0f,0x36,0x00,0x00,0x00,0xf2,0x00,0x33,0x00,0x0b,0x00,0x0f,
0x00,0xff,0xff,0x01,0x00,0x09,0x00,0x00,0x0f,0x37,0x00,0x00,0x00,0x40,0x00,0x73,0x00,0x0a,0x00,0x0d,0x00,0x00,0x00,0x02,0x00,0x09,0x00,0x00,0x0f,0x38,0x00,0x00,
0x00,0x00,0x00,0x46,0x00,0x0b,0x00,0x0f,0x00,0xff,0xff,0x01,0x00,0x09,0x00,0x00,0x0f,0x39,0x00,0x00,0x00,0x1a,0x00,0x36,0x00,0x0b,0x00,0x0f,0x00,0xff,0xff,0x01,
0x00,0x09,0x00,0x00,0x0f,0x3a,0x00,0x00,0x00,0x7f,0x00,0x7f,0x00,0x05,0x00,0x0b,0x00,0x00,0x00,0x05,0x00,0x05,0x00,0x00,0x0f,0x3b,0x00,0x00,0x00,0xf9,0x00,0x52,
0x00,0x06,0x00,0x0d,0x00,0xff,0xff,0x05,0x00,0x05,0x00,0x00,0x0f,0x3c,0x00,0x00,0x00,0xe8,0x00,0x6f,0x00,0x0b,0x00,0x0b,0x00,0x00,0x00,0x04,0x00,0x0b,0x00,0x00,
0x0f,0x3d,0x00,0x00,0x00,0x0c,0x00,0x98,0x00,0x0b,0x00,0x08,0x00,0x00,0x00,0x05,0x00,0x0b,0x00,0x00,0x0f,0x3e,0x00,0x00,0x00,0xf4,0x00,0x6f,0x00,0x0b,0x00,0x0b,
0x00,0x00,0x00,0x04,0x00,0x0b,0x00,0x00,0x0f,0x3f,0x00,0x00,0x00,0x0c,0x00,0x46,0x00,0x0a,0x00,0x0f,0x00,0xff,0xff,0x01,0x00,0x08,0x00,0x00,0x0f,0x40,0x00,0x00,
0x00,0xe0,0x00,0x12,0x00,0x0f,0x00,0x10,0x00,0xff,0xff,0x02,0x00,0x0e,0x00,0x00,0x0f,0x41,0x00,0x00,0x00,0x2d,0x00,0x65,0x00,0x0e,0x00,0x0d,0x00,0xfe,0xff,0x02,
0x00,0x0a,0x00,0x00,0x0f,0x42,0x00,0x00,0x00,0xa0,0x00,0x63,0x00,0x0d,0x00,0x0d,0x00,0xff,0xff,0x02,0x00,0x0b,0x00,0x00,0x0f,0x43,0x00,0x00,0x00,0xab,0x00,0x25,
0x00,0x0d,0x00,0x0f,0x00,0xff,0xff,0x01,0x00,0x0b,0x00,0x00,0x0f,0x44,0x00,0x00,0x00,0x3c,0x00,0x65,0x00,0x0e,0x00,0x0d,0x00,0xff,0xff,0x02,0x00,0x0c,0x00,0x00,
0x0f,0x45,0x00,0x00,0x00,0xbb,0x00,0x62,0x00,0x0c,0x00,0x0d,0x00,0xff,0xff,0x02,0x00,0x0a,0x00,0x00,0x0f,0x46,0x00,0x00,0x00,0xc8,0x00,0x62,0x00,0x0c,0x00,0x0d,
0x00,0xff,0xff,0x02,0x00,0x0a,0x00,0x00,0x0f,0x47,0x00,0x00,0x00,0xb9,0x00,0x25,0x00,0x0d,0x00,0x0f,0x00,0xff,0xff,0x01,0x00,0x0c,0x00,0x00,0x0f,0x48,0x00,0x00,
0x00,0xd9,0x00,0x53,0x00,0x0f,0x00,0x0d,0x00,0xff,0xff,0x02,0x00,0x0d,0x00,0x00,0x0f,0x49,0x00,0x00,0x00,0x60,0x00,0x72,0x00,0x08,0x00,0x0d,0x00,0xff,0xff,0x02,
0x00,0x06,0x00,0x00,0x0f,0x4a,0x00,0x00,0x00,0xbc,0x00,0x12,0x00,0x09,0x00,0x11,0x00,0xfe,0xff,0x02,0x00,0x06,0x00,0x00,0x0f,0x4b,0x00,0x00,0x00,0xe9,0x00,0x53,
0x00,0x0f,0x00,0x0d,0x00,0xff,0xff,0x02,0x00,0x0c,0x00,0x00,0x0f,0x4c,0x00,0x00,0x00,0xd5,0x00,0x62,0x00,0x0c,0x00,0x0d,0x00,0xff,0xff,0x02,0x00,0x0a,0x00,0x00,
0x0f,0x4d,0x00,0x00,0x00,0xb5,0x00,0x54,0x00,0x11,0x00,0x0d,0x00,0xff,0xff,0x02,0x00,0x0f,0x00,0x00,0x0f,0x4e,0x00,0x00,0x00,0x0f,0x00,0x65,0x00,0x0e,0x00,0x0d,
0x00,0xff,0xff,0x02,0x00,0x0c,0x00,0x00,0x0f,0x4f,0x00,0x00,0x00,0x9c,0x00,0x25,0x00,0x0e,0x00,0x0f,0x00,0xff,0xff,0x01,0x00,0x0c,0x00,0x00,0x0f,0x50,0x00,0x00,
0x00,0xe2,0x00,0x61,0x00,0x0c,0x00,0x0d,0x00,0xff,0xff,0x02,0x00,0x0a,0x00,0x00,0x0f,0x51,0x00,0x00,0x00,0xd9,0x00,0x00,0x00,0x0e,0x00,0x11,0x00,0xff,0xff,0x01,
0x00,0x0c,0x00,0x00,0x0f,0x52,0x00,0x00,0x00,0x00,0x00,0x65,0x00,0x0e,0x00,0x0d,0x00,0xff,0xff,0x02,0x00,0x0b,0x00,0x00,0x0f,0x53,0x00,0x00,0x00,0x86,0x00,0x35,
0x00,0x0b,0x00,0x0f,0x00,0xff,0xff,0x01,0x00,0x0a,0x00,0x00,0x0f,0x54,0x00,0x00,0x00,0xef,0x00,0x61,0x00,0x0c,0x00,0x0d,0x00,0xff,0xff,0x02,0x00,0x0a,0x00,0x00,
0x0f,0x55,0x00,0x00,0x00,0x68,0x00,0x45,0x00,0x0e,0x00,0x0e,0x00,0xff,0xff,0x02,0x00,0x0c,0x00,0x00,0x0f,0x56,0x00,0x00,0x00,0x4b,0x00,0x64,0x00,0x0e,0x00,0x0d,
0x00,0xfe,0xff,0x02,0x00,0x0a,0x00,0x00,0x0f,0x57,0x00,0x00,0x00,0xa1,0x00,0x54,0x00,0x13,0x00,0x0d,0x00,0xfe,0xff,0x02,0x00,0x0f,0x00,0x00,0x0f,0x58,0x00,0x00,
0x00,0x84,0x00,0x63,0x00,0x0d,0x00,0x0d,0x00,0xff,0xff,0x02,0x00,0x0a,0x00,0x00,0x0f,0x59,0x00,0x00,0x00,0x68,0x00,0x64,0x00,0x0d,0x00,0x0d,0x00,0xfe,0xff,0x02,
0x00,0x0a,0x00,0x00,0x0f,0x5a,0x00,0x00,0x00,0x00,0x00,0x73,0x00,0x0c,0x00,0x0d,0x00,0xff,0xff,0x02,0x00,0x0a,0x00,0x00,0x0f,0x5b,0x00,0x00,0x00,0x2d,0x00,0x25,
0x00,0x07,0x00,0x10,0x00,0x00,0x00,0x01,0x00,0x06,0x00,0x00,0x0f,0x5c,0x00,0x00,0x00,0x58,0x00,0x45,0x00,0x07,0x00,0x0f,0x00,0xff,0xff,0x02,0x00,0x05,0x00,0x00,
0x0f,0x5d,0x00,0x00,0x00,0x25,0x00,0x25,0x00,0x07,0x00,0x10,0x00,0xff,0xff,0x01,0x00,0x06,0x00,0x00,0x0f,0x5e,0x00,0x00,0x00,0x65,0x00,0x97,0x00,0x0b,0x00,0x07,
0x00,0x00,0x00,0x02,0x00,0x0b,0x00,0x00,0x0f,0x5f,0x00,0x00,0x00,0x3c,0x00,0xa1,0x00,0x09,0x00,0x04,0x00,0xff,0xff,0x0f,0x00,0x07,0x00,0x00,0x0f,0x60,0x00,0x00,
0x00,0x11,0x00,0xa1,0x00,0x07,0x00,0x05,0x00,0xff,0xff,0x01,0x00,0x07,0x00,0x00,0x0f,0x61,0x00,0x00,0x00,0x00,0x00,0x81,0x00,0x0b,0x00,0x0b,0x00,0xff,0xff,0x05,
0x00,0x09,0x00,0x00,0x0f,0x62,0x00,0x00,0x00,0x56,0x00,0x35,0x00,0x0b,0x00,0x0f,0x00,0xff,0xff,0x01,0x00,0x09,0x00,0x00,0x0f,0x63,0x00,0x00,0x00,0x3a,0x00,0x81,
0x00,0x0a,0x00,0x0b,0x00,0xff,0xff,0x05,0x00,0x08,0x00,0x00,0x0f,0x64,0x00,0x00,0x00,0x00,0x00,0x36,0x00,0x0c,0x00,0x0f,0x00,0xff,0xff,0x01,0x00,0x09,0x00,0x00,
0x0f,0x65,0x00,0x00,0x00,0x2f,0x00,0x81,0x00,0x0a,0x00,0x0b,0x00,0xff,0xff,0x05,0x00,0x09,0x00,0x00,0x0f,0x66,0x00,0x00,0x00,0x4f,0x00,0x55,0x00,0x09,0x00,0x0e,
0x00,0xff,0xff,0x01,0x00,0x06,0x00,0x00,0x0f,0x67,0x00,0x00,0x00,0xef,0x00,0x43,0x00,0x0c,0x00,0x0e,0x00,0xff,0xff,0x05,0x00,0x09,0x00,0x00,0x0f,0x68,0x00,0x00,
0x00,0xe2,0x00,0x44,0x00,0x0c,0x00,0x0e,0x00,0xff,0xff,0x01,0x00,0x0a,0x00,0x00,0x0f,0x69,0x00,0x00,0x00,0x83,0x00,0x54,0x00,0x07,0x00,0x0e,0x00,0xff,0xff,0x01,
0x00,0x05,0x00,0x00,0x0f,0x6a,0x00,0x00,0x00,0xad,0x00,0x00,0x00,0x07,0x00,0x12,0x00,0xfe,0xff,0x01,0x00,0x05,0x00,0x00,0x0f,0x6b,0x00,0x00,0x00,0xd5,0x00,0x44,
0x00,0x0c,0x00,0x0e,0x00,0xff,0xff,0x01,0x00,0x09,0x00,0x00,0x0f,0x6c,0x00,0x00,0x00,0x8b,0x00,0x54,0x00,0x07,0x00,0x0e,0x00,0xff,0xff,0x01,0x00,0x05,0x00,0x00,
0x0f,0x6d,0x00,0x00,0x00,0x85,0x00,0x7e,0x00,0x10,0x00,0x0a,0x00,0xff,0xff,0x05,0x00,0x0e,0x00,0x00,0x0f,0x6e,0x00,0x00,0x00,0xa6,0x00,0x7d,0x00,0x0c,0x00,0x0a,
0x00,0xff,0xff,0x05,0x00,0x0a,0x00,0x00,0x0f,0x6f,0x00,0x00,0x00,0xdc,0x00,0x70,0x00,0x0b,0x00,0x0b,0x00,0xff,0xff,0x05,0x00,0x09,0x00,0x00,0x0f,0x70,0x00,0x00,
0x00,0x00,0x00,0x56,0x00,0x0b,0x00,0x0e,0x00,0xff,0xff,0x05,0x00,0x09,0x00,0x00,0x0f,0x71,0x00,0x00,0x00,0xae,0x00,0x45,0x00,0x0c,0x00,0x0e,0x00,0xff,0xff,0x05,
0x00,0x09,0x00,0x00,0x0f,0x72,0x00,0x00,0x00,0xcc,0x00,0x7c,0x00,0x0a,0x00,0x0a,0x00,0xff,0xff,0x05,0x00,0x07,0x00,0x00,0x0f,0x73,0x00,0x00,0x00,0x4f,0x00,0x80,
0x00,0x09,0x00,0x0b,0x00,0xff,0xff,0x05,0x00,0x08,0x00,0x00,0x0f,0x74,0x00,0x00,0x00,0x3b,0x00,0x56,0x00,0x09,0x00,0x0e,0x00,0xff,0xff,0x02,0x00,0x06,0x00,0x00,
0x0f,0x75,0x00,0x00,0x00,0xb7,0x00,0x70,0x00,0x0c,0x00,0x0b,0x00,0xff,0xff,0x05,0x00,0x0a,0x00,0x00,0x0f,0x76,0x00,0x00,0x00,0xb3,0x00,0x7d,0x00,0x0c,0x00,0x0a,
0x00,0xfe,0xff,0x05,0x00,0x08,0x00,0x00,0x0f,0x77,0x00,0x00,0x00,0x96,0x00,0x7e,0x00,0x0f,0x00,0x0a,0x00,0xfe,0xff,0x05,0x00,0x0c,0x00,0x00,0x0f,0x78,0x00,0x00,
0x00,0xc0,0x00,0x7c,0x00,0x0b,0x00,0x0a,0x00,0xff,0xff,0x05,0x00,0x08,0x00,0x00,0x0f,0x79,0x00,0x00,0x00,0xc8,0x00,0x45,0x00,0x0c,0x00,0x0e,0x00,0xfe,0xff,0x05,
0x00,0x08,0x00,0x00,0x0f,0x7a,0x00,0x00,0x00,0xe2,0x00,0x7c,0x00,0x0a,0x00,0x0a,0x00,0xff,0xff,0x05,0x00,0x08,0x00,0x00,0x0f,0x7b,0x00,0x00,0x00,0xa8,0x00,0x13,
0x00,0x09,0x00,0x11,0x00,0x00,0x00,0x01,0x00,0x09,0x00,0x00,0x0f,0x7c,0x00,0x00,0x00,0xb5,0x00,0x00,0x00,0x05,0x00,0x12,0x00,0x00,0x00,0x01,0x00,0x05,0x00,0x00,
0x0f,0x7d,0x00,0x00,0x00,0x94,0x00,0x13,0x00,0x09,0x00,0x11,0x00,0x00,0x00,0x01,0x00,0x09,0x00,0x00,0x0f,0x7e,0x00,0x00,0x00,0xbf,0x00,0x92,0x00,0x0b,0x00,0x06,
0x00,0x00,0x00,0x06,0x00,0x0b,0x00,0x00,0x0f,0xa0,0x00,0x00,0x00,0xfc,0x00,0x47,0x00,0x03,0x00,0x03,0x00,0xff,0xff,0xff,0xff,0x05,0x00,0x00,0x0f,0xa1,0x00,0x00,
0x00,0x93,0x00,0x54,0x00,0x06,0x00,0x0e,0x00,0x00,0x00,0x01,0x00,0x06,0x00,0x00,0x0f,0xa2,0x00,0x00,0x00,0x7a,0x00,0x35,0x00,0x0b,0x00,0x0f,0x00,0xff,0xff,0x03,
0x00,0x09,0x00,0x00,0x0f,0xa3,0x00,0x00,0x00,0x0c,0x00,0x56,0x00,0x0b,0x00,0x0e,0x00,0xff,0xff,0x01,0x00,0x09,0x00,0x00,0x0f,0xa4,0x00,0x00,0x00,0x0c,0x00,0x81,
0x00,0x0b,0x00,0x0b,0x00,0xff,0xff,0x04,0x00,0x09,0x00,0x00,0x0f,0xa5,0x00,0x00,0x00,0x34,0x00,0x73,0x00,0x0b,0x00,0x0d,0x00,0xff,0xff,0x02,0x00,0x09,0x00,0x00,
0x0f,0xa6,0x00,0x00,0x00,0x35,0x00,0x25,0x00,0x05,0x00,0x10,0x00,0x00,0x00,0x02,0x00,0x05,0x00,0x00,0x0f,0xa7,0x00,0x00,0x00,0x1b,0x00,0x25,0x00,0x09,0x00,0x10,
0x00,0xff,0xff,0x01,0x00,0x07,0x00,0x00,0x0f,0xa8,0x00,0x00,0x00,0x00,0x00,0xa1,0x00,0x08,0x00,0x05,0x00,0xff,0xff,0x01,0x00,0x07,0x00,0x00,0x0f,0xa9,0x00,0x00,
0x00,0x5a,0x00,0x64,0x00,0x0d,0x00,0x0d,0x00,0x00,0x00,0x02,0x00,0x0e,0x00,0x00,0x0f,0xaa,0x00,0x00,0x00,0x45,0x00,0x81,0x00,0x09,0x00,0x0b,0x00,0xff,0xff,0x01,
0x00,0x07,0x00,0x00,0x0f,0xab,0x00,0x00,0x00,0xd7,0x00,0x7c,0x00,0x0a,0x00,0x0a,0x00,0xff,0xff,0x05,0x00,0x08,0x00,0x00,0x0f,0xac,0x00,0x00,0x00,0x71,0x00,0x96,
0x00,0x0b,0x00,0x07,0x00,0x00,0x00,0x06,0x00,0x0b,0x00,0x00,0x0f,0xad,0x00,0x00,0x00,0x09,0x00,0xa1,0x00,0x07,0x00,0x05,0x00,0xff,0xff,0x08,0x00,0x06,0x00,0x00,
0x0f,0xae,0x00,0x00,0x00,0x92,0x00,0x63,0x00,0x0d,0x00,0x0d,0x00,0x00,0x00,0x02,0x00,0x0e,0x00,0x00,0x0f,0xaf,0x00,0x00,0x00,0xf8,0x00,0x90,0x00,0x07,0x00,0x05,
0x00,0x00,0x00,0x01,0x00,0x07,0x00,0x00,0x0f,0xb0,0x00,0x00,0x00,0x50,0x00,0x98,0x00,0x07,0x00,0x08,0x00,0x00,0x00,0x01,0x00,0x07,0x00,0x00,0x0f,0xb1,0x00,0x00,
0x00,0x8d,0x00,0x71,0x00,0x0b,0x00,0x0c,0x00,0x00,0x00,0x03,0x00,0x0b,0x00,0x00,0x0f,0xb2,0x00,0x00,0x00,0x38,0x00,0x8d,0x00,0x08,0x00,0x0a,0x00,0xff,0xff,0x01,
0x00,0x06,0x00,0x00,0x0f,0xb3,0x00,0x00,0x00,0x2f,0x00,0x8d,0x00,0x08,0x00,0x0a,0x00,0xff,0xff,0x01,0x00,0x06,0x00,0x00,0x0f,0xb4,0x00,0x00,0x00,0x21,0x00,0xa1,
0x00,0x06,0x00,0x05,0x00,0x01,0x00,0x01,0x00,0x07,0x00,0x00,0x0f,0xb5,0x00,0x00,0x00,0xa1,0x00,0x45,0x00,0x0c,0x00,0x0e,0x00,0xff,0xff,0x05,0x00,0x0a,0x00,0x00,
0x0f,0xb6,0x00,0x00,0x00,0x2d,0x00,0x46,0x00,0x0a,0x00,0x0f,0x00,0xff,0xff,0x02,0x00,0x09,0x00,0x00,0x0f,0xb7,0x00,0x00,0x00,0xd2,0x00,0x91,0x00,0x05,0x00,0x06,
0x00,0x00,0x00,0x06,0x00,0x05,0x00,0x00,0x0f,0xb8,0x00,0x00,0x00,0xcb,0x00,0x91,0x00,0x06,0x00,0x06,0x00,0x00,0x00,0x0c,0x00,0x07,0x00,0x00,0x0f,0xb9,0x00,0x00,
0x00,0x92,0x00,0x89,0x00,0x07,0x00,0x0a,0x00,0xff,0xff,0x01,0x00,0x06,0x00,0x00,0x0f,0xba,0x00,0x00,0x00,0x59,0x00,0x80,0x00,0x09,0x00,0x0b,0x00,0xff,0xff,0x01,
0x00,0x07,0x00,0x00,0x0f,0xbb,0x00,0x00,0x00,0x00,0x00,0x8d,0x00,0x09,0x00,0x0a,0x00,0x00,0x00,0x05,0x00,0x08,0x00,0x00,0x0f,0xbc,0x00,0x00,0x00,0x3b,0x00,0x25,
0x00,0x10,0x00,0x0f,0x00,0xff,0xff,0x01,0x00,0x0e,0x00,0x00,0x0f,0xbd,0x00,0x00,0x00,0x5d,0x00,0x25,0x00,0x10,0x00,0x0f,0x00,0xff,0xff,0x01,0x00,0x0e,0x00,0x00,
0x0f,0xbe,0x00,0x00,0x00,0x4c,0x00,0x25,0x00,0x10,0x00,0x0f,0x00,0xff,0xff,0x01,0x00,0x0e,0x00,0x00,0x0f,0xbf,0x00,0x00,0x00,0x4e,0x00,0x45,0x00,0x09,0x00,0x0f,
0x00,0xff,0xff,0x01,0x00,0x08,0x00,0x00,0x0f,0xc0,0x00,0x00,0x00,0x1e,0x00,0x13,0x00,0x0e,0x00,0x11,0x00,0xfe,0xff,0xfe,0xff,0x0a,0x00,0x00,0x0f,0xc1,0x00,0x00,
0x00,0xbb,0x00,0x00,0x00,0x0e,0x00,0x11,0x00,0xfe,0xff,0xfe,0xff,0x0a,0x00,0x00,0x0f,0xc2,0x00,0x00,0x00,0xca,0x00,0x00,0x00,0x0e,0x00,0x11,0x00,0xfe,0xff,0xfe,
0xff,0x0a,0x00,0x00,0x0f,0xc3,0x00,0x00,0x00,0x00,0x00,0x13,0x00,0x0e,0x00,0x11,0x00,0xfe,0xff,0xfe,0xff,0x0a,0x00,0x00,0x0f,0xc4,0x00,0x00,0x00,0xe8,0x00,0x00,
0x00,0x0e,0x00,0x11,0x00,0xfe,0xff,0xfe,0xff,0x0a,0x00,0x00,0x0f,0xc5,0x00,0x00,0x00,0xf0,0x00,0x12,0x00,0x0e,0x00,0x10,0x00,0xfe,0xff,0xff,0xff,0x0a,0x00,0x00,
0x0f,0xc6,0x00,0x00,0x00,0xc7,0x00,0x54,0x00,0x11,0x00,0x0d,0x00,0xfe,0xff,0x02,0x00,0x0e,0x00,0x00,0x0f,0xc7,0x00,0x00,0x00,0x3b,0x00,0x13,0x00,0x0d,0x00,0x11,
0x00,0xff,0xff,0x01,0x00,0x0b,0x00,0x00,0x0f,0xc8,0x00,0x00,0x00,0x70,0x00,0x13,0x00,0x0c,0x00,0x11,0x00,0xff,0xff,0xfe,0xff,0x0a,0x00,0x00,0x0f,0xc9,0x00,0x00,
0x00,0x49,0x00,0x13,0x00,0x0c,0x00,0x11,0x00,0xff,0xff,0xfe,0xff,0x0a,0x00,0x00,0x0f,0xca,0x00,0x00,0x00,0x56,0x00,0x13,0x00,0x0c,0x00,0x11,0x00,0xff,0xff,0xfe,
0xff,0x0a,0x00,0x00,0x0f,0xcb,0x00,0x00,0x00,0x63,0x00,0x13,0x00,0x0c,0x00,0x11,0x00,0xff,0xff,0xfe,0xff,0x0a,0x00,0x00,0x0f,0xcc,0x00,0x00,0x00,0xf7,0x00,0x00,
0x00,0x08,0x00,0x11,0x00,0xff,0xff,0xfe,0xff,0x06,0x00,0x00,0x0f,0xcd,0x00,0x00,0x00,0xc6,0x00,0x12,0x00,0x08,0x00,0x11,0x00,0xff,0xff,0xfe,0xff,0x06,0x00,0x00,
0x0f,0xce,0x00,0x00,0x00,0xb2,0x00,0x13,0x00,0x09,0x00,0x11,0x00,0xff,0xff,0xfe,0xff,0x06,0x00,0x00,0x0f,0xcf,0x00,0x00,0x00,0x9e,0x00,0x13,0x00,0x09,0x00,0x11,
0x00,0xff,0xff,0xfe,0xff,0x06,0x00,0x00,0x0f,0xd0,0x00,0x00,0x00,0x1e,0x00,0x65,0x00,0x0e,0x00,0x0d,0x00,0xff,0xff,0x02,0x00,0x0c,0x00,0x00,0x0f,0xd1,0x00,0x00,
0x00,0x0f,0x00,0x13,0x00,0x0e,0x00,0x11,0x00,0xff,0xff,0xfe,0xff,0x0c,0x00,0x00,0x0f,0xd2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0e,0x00,0x12,0x00,0xff,0xff,0xfe,
0xff,0x0c,0x00,0x00,0x0f,0xd3,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x0e,0x00,0x12,0x00,0xff,0xff,0xfe,0xff,0x0c,0x00,0x00,0x0f,0xd4,0x00,0x00,0x00,0x78,0x00,0x00,
0x00,0x0e,0x00,0x12,0x00,0xff,0xff,0xfe,0xff,0x0c,0x00,0x00,0x0f,0xd5,0x00,0x00,0x00,0x69,0x00,0x00,0x00,0x0e,0x00,0x12,0x00,0xff,0xff,0xfe,0xff,0x0c,0x00,0x00,
0x0f,0xd6,0x00,0x00,0x00,0x5a,0x00,0x00,0x00,0x0e,0x00,0x12,0x00,0xff,0xff,0xfe,0xff,0x0c,0x00,0x00,0x0f,0xd7,0x00,0x00,0x00,0x69,0x00,0x72,0x00,0x0b,0x00,0x0c,
0x00,0x00,0x00,0x03,0x00,0x0b,0x00,0x00,0x0f,0xd8,0x00,0x00,0x00,0x7e,0x00,0x25,0x00,0x0e,0x00,0x0f,0x00,0xff,0xff,0x01,0x00,0x0c,0x00,0x00,0x0f,0xd9,0x00,0x00,
0x00,0x2d,0x00,0x00,0x00,0x0e,0x00,0x12,0x00,0xff,0xff,0xfe,0xff,0x0c,0x00,0x00,0x0f,0xda,0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x0e,0x00,0x12,0x00,0xff,0xff,0xfe,
0xff,0x0c,0x00,0x00,0x0f,0xdb,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x0e,0x00,0x12,0x00,0xff,0xff,0xfe,0xff,0x0c,0x00,0x00,0x0f,0xdc,0x00,0x00,0x00,0x0f,0x00,0x00,
0x00,0x0e,0x00,0x12,0x00,0xff,0xff,0xfe,0xff,0x0c,0x00,0x00,0x0f,0xdd,0x00,0x00,0x00,0x2d,0x00,0x13,0x00,0x0d,0x00,0x11,0x00,0xfe,0xff,0xfe,0xff,0x0a,0x00,0x00,
0x0f,0xde,0x00,0x00,0x00,0xae,0x00,0x62,0x00,0x0c,0x00,0x0d,0x00,0xff,0xff,0x02,0x00,0x0a,0x00,0x00,0x0f,0xdf,0x00,0x00,0x00,0xee,0x00,0x23,0x00,0x0c,0x00,0x0f,
0x00,0xff,0xff,0x01,0x00,0x0a,0x00,0x00,0x0f,0xe0,0x00,0x00,0x00,0x6e,0x00,0x35,0x00,0x0b,0x00,0x0f,0x00,0xff,0xff,0x01,0x00,0x09,0x00,0x00,0x0f,0xe1,0x00,0x00,
0x00,0x4a,0x00,0x35,0x00,0x0b,0x00,0x0f,0x00,0xff,0xff,0x01,0x00,0x09,0x00,0x00,0x0f,0xe2,0x00,0x00,0x00,0x3e,0x00,0x35,0x00,0x0b,0x00,0x0f,0x00,0xff,0xff,0x01,
0x00,0x09,0x00,0x00,0x0f,0xe3,0x00,0x00,0x00,0x32,0x00,0x36,0x00,0x0b,0x00,0x0f,0x00,0xff,0xff,0x01,0x00,0x09,0x00,0x00,0x0f,0xe4,0x00,0x00,0x00,0x26,0x00,0x36,
0x00,0x0b,0x00,0x0f,0x00,0xff,0xff,0x01,0x00,0x09,0x00,0x00,0x0f,0xe5,0x00,0x00,0x00,0x7d,0x00,0x13,0x00,0x0b,0x00,0x11,0x00,0xff,0xff,0xff,0xff,0x09,0x00,0x00,
0x0f,0xe6,0x00,0x00,0x00,0x99,0x00,0x71,0x00,0x0f,0x00,0x0b,0x00,0xff,0xff,0x05,0x00,0x0d,0x00,0x00,0x0f,0xe7,0x00,0x00,0x00,0x4b,0x00,0x72,0x00,0x0a,0x00,0x0d,
0x00,0xff,0xff,0x05,0x00,0x08,0x00,0x00,0x0f,0xe8,0x00,0x00,0x00,0x38,0x00,0x46,0x00,0x0a,0x00,0x0f,0x00,0xff,0xff,0x01,0x00,0x09,0x00,0x00,0x0f,0xe9,0x00,0x00,
0x00,0x43,0x00,0x45,0x00,0x0a,0x00,0x0f,0x00,0xff,0xff,0x01,0x00,0x09,0x00,0x00,0x0f,0xea,0x00,0x00,0x00,0x17,0x00,0x46,0x00,0x0a,0x00,0x0f,0x00,0xff,0xff,0x01,
0x00,0x09,0x00,0x00,0x0f,0xeb,0x00,0x00,0x00,0x22,0x00,0x46,0x00,0x0a,0x00,0x0f,0x00,0xff,0xff,0x01,0x00,0x09,0x00,0x00,0x0f,0xec,0x00,0x00,0x00,0x7b,0x00,0x54,
0x00,0x07,0x00,0x0e,0x00,0xff,0xff,0x01,0x00,0x05,0x00,0x00,0x0f,0xed,0x00,0x00,0x00,0x73,0x00,0x54,0x00,0x07,0x00,0x0e,0x00,0xff,0xff,0x01,0x00,0x05,0x00,0x00,
0x0f,0xee,0x00,0x00,0x00,0x59,0x00,0x55,0x00,0x08,0x00,0x0e,0x00,0xfe,0xff,0x01,0x00,0x05,0x00,0x00,0x0f,0xef,0x00,0x00,0x00,0x6b,0x00,0x54,0x00,0x07,0x00,0x0e,
0x00,0xff,0xff,0x01,0x00,0x05,0x00,0x00,0x0f,0xf0,0x00,0x00,0x00,0xce,0x00,0x34,0x00,0x0b,0x00,0x0f,0x00,0xff,0xff,0x01,0x00,0x09,0x00,0x00,0x0f,0xf1,0x00,0x00,
0x00,0xbb,0x00,0x45,0x00,0x0c,0x00,0x0e,0x00,0xff,0xff,0x01,0x00,0x0a,0x00,0x00,0x0f,0xf2,0x00,0x00,0x00,0xc2,0x00,0x35,0x00,0x0b,0x00,0x0f,0x00,0xff,0xff,0x01,
0x00,0x09,0x00,0x00,0x0f,0xf3,0x00,0x00,0x00,0xb6,0x00,0x35,0x00,0x0b,0x00,0x0f,0x00,0xff,0xff,0x01,0x00,0x09,0x00,0x00,0x0f,0xf4,0x00,0x00,0x00,0xaa,0x00,0x35,
0x00,0x0b,0x00,0x0f,0x00,0xff,0xff,0x01,0x00,0x09,0x00,0x00,0x0f,0xf5,0x00,0x00,0x00,0x92,0x00,0x35,0x00,0x0b,0x00,0x0f,0x00,0xff,0xff,0x01,0x00,0x09,0x00,0x00,
0x0f,0xf6,0x00,0x00,0x00,0x9e,0x00,0x35,0x00,0x0b,0x00,0x0f,0x00,0xff,0xff,0x01,0x00,0x09,0x00,0x00,0x0f,0xf7,0x00,0x00,0x00,0xd0,0x00,0x70,0x00,0x0b,0x00,0x0b,
0x00,0x00,0x00,0x04,0x00,0x0b,0x00,0x00,0x0f,0xf8,0x00,0x00,0x00,0x75,0x00,0x72,0x00,0x0b,0x00,0x0c,0x00,0xff,0xff,0x04,0x00,0x09,0x00,0x00,0x0f,0xf9,0x00,0x00,
0x00,0xe1,0x00,0x23,0x00,0x0c,0x00,0x0f,0x00,0xff,0xff,0x01,0x00,0x0a,0x00,0x00,0x0f,0xfa,0x00,0x00,0x00,0x0d,0x00,0x36,0x00,0x0c,0x00,0x0f,0x00,0xff,0xff,0x01,
0x00,0x0a,0x00,0x00,0x0f,0xfb,0x00,0x00,0x00,0xc7,0x00,0x24,0x00,0x0c,0x00,0x0f,0x00,0xff,0xff,0x01,0x00,0x0a,0x00,0x00,0x0f,0xfc,0x00,0x00,0x00,0xd4,0x00,0x24,
0x00,0x0c,0x00,0x0f,0x00,0xff,0xff,0x01,0x00,0x0a,0x00,0x00,0x0f,0xfd,0x00,0x00,0x00,0x94,0x00,0x00,0x00,0x0c,0x00,0x12,0x00,0xfe,0xff,0x01,0x00,0x08,0x00,0x00,
0x0f,0xfe,0x00,0x00,0x00,0xa1,0x00,0x00,0x00,0x0b,0x00,0x12,0x00,0xff,0xff,0x01,0x00,0x09,0x00,0x00,0x0f,0xff,0x00,0x00,0x00,0x87,0x00,0x00,0x00,0x0c,0x00,0x12,
0x00,0xfe,0xff,0x01,0x00,0x08,0x00,0x00,0x0f,0x26,0x20,0x00,0x00,0xb0,0x00,0x92,0x00,0x0e,0x00,0x06,0x00,0x00,0x00,0x0a,0x00,0x0e,0x00,0x00,0x0f,0x53,0x20,0x00,
0x00,0xa0,0x00,0x93,0x00,0x0f,0x00,0x06,0x00,0xff,0xff,0x06,0x00,0x0e,0x00,0x00,0x0f,0x70,0x20,0x00,0x00,0x41,0x00,0x8d,0x00,0x08,0x00,0x0a,0x00,0xff,0xff,0x01,
0x00,0x06,0x00,0x00,0x0f,0x71,0x20,0x00,0x00,0x9a,0x00,0x89,0x00,0x05,0x00,0x0a,0x00,0xff,0xff,0x01,0x00,0x03,0x00,0x00,0x0f,0x74,0x20,0x00,0x00,0x4a,0x00,0x8d,
0x00,0x08,0x00,0x0a,0x00,0xff,0xff,0x01,0x00,0x06,0x00,0x00,0x0f,0x75,0x20,0x00,0x00,0x53,0x00,0x8c,0x00,0x08,0x00,0x0a,0x00,0xff,0xff,0x01,0x00,0x06,0x00,0x00,
0x0f,0x76,0x20,0x00,0x00,0x5c,0x00,0x8c,0x00,0x08,0x00,0x0a,0x00,0xff,0xff,0x01,0x00,0x06,0x00,0x00,0x0f,0x77,0x20,0x00,0x00,0x65,0x00,0x8c,0x00,0x08,0x00,0x0a,
0x00,0xff,0xff,0x01,0x00,0x06,0x00,0x00,0x0f,0x78,0x20,0x00,0x00,0x26,0x00,0x8d,0x00,0x08,0x00,0x0a,0x00,0xff,0xff,0x01,0x00,0x06,0x00,0x00,0x0f,0x79,0x20,0x00,
0x00,0x77,0x00,0x8b,0x00,0x08,0x00,0x0a,0x00,0xff,0xff,0x01,0x00,0x06,0x00,0x00,0x0f,0x7a,0x20,0x00,0x00,0xaa,0x00,0x88,0x00,0x09,0x00,0x09,0x00,0xff,0xff,0x02,
0x00,0x07,0x00,0x00,0x0f,0x7b,0x20,0x00,0x00,0x32,0x00,0xa1,0x00,0x09,0x00,0x04,0x00,0xff,0xff,0x04,0x00,0x07,0x00,0x00,0x0f,0x7c,0x20,0x00,0x00,0xe4,0x00,0x91,
0x00,0x09,0x00,0x05,0x00,0xff,0xff,0x04,0x00,0x07,0x00,0x00,0x0f,0x7d,0x20,0x00,0x00,0x63,0x00,0x80,0x00,0x06,0x00,0x0b,0x00,0xff,0xff,0x01,0x00,0x04,0x00,0x00,
0x0f,0x7e,0x20,0x00,0x00,0x71,0x00,0x7f,0x00,0x06,0x00,0x0b,0x00,0xff,0xff,0x01,0x00,0x04,0x00,0x00,0x0f,0x7f,0x20,0x00,0x00,0x18,0x00,0x98,0x00,0x09,0x00,0x08,
0x00,0xff,0xff,0x03,0x00,0x07,0x00,0x00,0x0f,0x80,0x20,0x00,0x00,0x80,0x00,0x8b,0x00,0x08,0x00,0x0a,0x00,0xff,0xff,0x06,0x00,0x06,0x00,0x00,0x0f,0x81,0x20,0x00,
0x00,0xea,0x00,0x87,0x00,0x07,0x00,0x09,0x00,0xff,0xff,0x06,0x00,0x06,0x00,0x00,0x0f,0x82,0x20,0x00,0x00,0xd0,0x00,0x87,0x00,0x08,0x00,0x09,0x00,0xff,0xff,0x06,
0x00,0x06,0x00,0x00,0x0f,0x83,0x20,0x00,0x00,0x89,0x00,0x89,0x00,0x08,0x00,0x0a,0x00,0xff,0xff,0x06,0x00,0x06,0x00,0x00,0x0f,0x84,0x20,0x00,0x00,0xd9,0x00,0x87,
0x00,0x08,0x00,0x09,0x00,0xff,0xff,0x06,0x00,0x06,0x00,0x00,0x0f,0x85,0x20,0x00,0x00,0x6e,0x00,0x8b,0x00,0x08,0x00,0x0a,0x00,0xff,0xff,0x06,0x00,0x06,0x00,0x00,
0x0f,0x86,0x20,0x00,0x00,0xf7,0x00,0x7b,0x00,0x08,0x00,0x0a,0x00,0xff,0xff,0x06,0x00,0x06,0x00,0x00,0x0f,0x87,0x20,0x00,0x00,0xbe,0x00,0x88,0x00,0x08,0x00,0x09,
0x00,0xff,0xff,0x06,0x00,0x06,0x00,0x00,0x0f,0x88,0x20,0x00,0x00,0x14,0x00,0x8d,0x00,0x08,0x00,0x0a,0x00,0xff,0xff,0x06,0x00,0x06,0x00,0x00,0x0f,0x89,0x20,0x00,
0x00,0x1d,0x00,0x8d,0x00,0x08,0x00,0x0a,0x00,0xff,0xff,0x06,0x00,0x06,0x00,0x00,0x0f,0x8a,0x20,0x00,0x00,0x22,0x00,0x98,0x00,0x09,0x00,0x08,0x00,0xff,0xff,0x07,
0x00,0x07,0x00,0x00,0x0f,0x8b,0x20,0x00,0x00,0x28,0x00,0xa1,0x00,0x09,0x00,0x04,0x00,0xff,0xff,0x09,0x00,0x07,0x00,0x00,0x0f,0x8c,0x20,0x00,0x00,0xee,0x00,0x91,
0x00,0x09,0x00,0x05,0x00,0xff,0xff,0x09,0x00,0x07,0x00,0x00,0x0f,0x8d,0x20,0x00,0x00,0x78,0x00,0x7f,0x00,0x06,0x00,0x0b,0x00,0xff,0xff,0x06,0x00,0x04,0x00,0x00,
0x0f,0x8e,0x20,0x00,0x00,0x6a,0x00,0x7f,0x00,0x06,0x00,0x0b,0x00,0xff,0xff,0x06,0x00,0x04,0x00,0x00,0x0f,0x90,0x20,0x00,0x00,0x3e,0x00,0x98,0x00,0x08,0x00,0x08,
0x00,0xff,0xff,0x08,0x00,0x06,0x00,0x00,0x0f,0x91,0x20,0x00,0x00,0x2c,0x00,0x98,0x00,0x08,0x00,0x08,0x00,0xff,0xff,0x08,0x00,0x06,0x00,0x00,0x0f,0x92,0x20,0x00,
0x00,0x35,0x00,0x98,0x00,0x08,0x00,0x08,0x00,0xff,0xff,0x08,0x00,0x06,0x00,0x00,0x0f,0x93,0x20,0x00,0x00,0x87,0x00,0x96,0x00,0x08,0x00,0x07,0x00,0xff,0xff,0x08,
0x00,0x06,0x00,0x00,0x0f,0x94,0x20,0x00,0x00,0x47,0x00,0x98,0x00,0x08,0x00,0x08,0x00,0xff,0xff,0x08,0x00,0x06,0x00,0x00,0x0f,0x95,0x20,0x00,0x00,0xb4,0x00,0x88,
0x00,0x09,0x00,0x09,0x00,0xff,0xff,0x06,0x00,0x07,0x00,0x00,0x0f,0x96,0x20,0x00,0x00,0xa0,0x00,0x89,0x00,0x09,0x00,0x09,0x00,0xff,0xff,0x06,0x00,0x07,0x00,0x00,
0x0f,0x97,0x20,0x00,0x00,0xf2,0x00,0x86,0x00,0x06,0x00,0x09,0x00,0xff,0xff,0x06,0x00,0x04,0x00,0x00,0x0f,0x98,0x20,0x00,0x00,0x58,0x00,0x97,0x00,0x0c,0x00,0x07,
0x00,0xff,0xff,0x08,0x00,0x0a,0x00,0x00,0x0f,0x99,0x20,0x00,0x00,0x7d,0x00,0x96,0x00,0x09,0x00,0x07,0x00,0xff,0xff,0x08,0x00,0x07,0x00,0x00,0x0f,0x9a,0x20,0x00,
0x00,0xc7,0x00,0x87,0x00,0x08,0x00,0x09,0x00,0xff,0xff,0x08,0x00,0x07,0x00,0x00,0x0f,0x9b,0x20,0x00,0x00,0x90,0x00,0x94,0x00,0x07,0x00,0x07,0x00,0xff,0xff,0x08,
0x00,0x05,0x00,0x00,0x0f,0x9c,0x20,0x00,0x00,0xe2,0x00,0x87,0x00,0x07,0x00,0x09,0x00,0xff,0xff,0x07,0x00,0x05,0x00,0x00,0x0f,0xac,0x20,0x00,0x00,0xe6,0x00,0x33,
0x00,0x0b,0x00,0x0f,0x00,0xff,0xff,0x01,0x00,0x09,0x00,0x00,0x0f,0x02,0x22,0x00,0x00,0x56,0x00,0x72,0x00,0x09,0x00,0x0d,0x00,0xff,0xff,0x03,0x00,0x07,0x00,0x00,
0x0f,0x10,0x22,0x00,0x00,0x00,0x00,0x25,0x00,0x0d,0x00,0x10,0x00,0xff,0xff,0x02,0x00,0x0b,0x00,0x00,0x0f,0x11,0x22,0x00,0x00,0x0e,0x00,0x25,0x00,0x0c,0x00,0x10,
0x00,0xff,0xff,0x02,0x00,0x0a,0x00,0x00,0x0f,0x43,0x22,0x00,0x00,0x00,0x00,0x98,0x00,0x0b,0x00,0x08,0x00,0x00,0x00,0x05,0x00,0x0b,0x00,0x00,0x0f,0x64,0x22,0x00,
0x00,0x18,0x00,0x81,0x00,0x0b,0x00,0x0b,0x00,0x00,0x00,0x04,0x00,0x0b,0x00,0x00,0x0f,0x65,0x22,0x00,0x00,0xc4,0x00,0x70,0x00,0x0b,0x00,0x0b,0x00,0x00,0x00,0x04,
0x00,0x0b,0x00,0x00,0x0f,0xc5,0x22,0x00,0x00,0xd8,0x00,0x91,0x00,0x05,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x05,0x00,0x00,0x0f,0xcf,0x23,0x00,0x00,0xa9,0x00,0x71,
0x00,0x0d,0x00,0x0b,0x00,0x00,0x00,0x04,0x00,0x0d,0x00,0x00,0x0f,0xa0,0x25,0x00,0x00,0x85,0x00,0x45,0x00,0x0d,0x00,0x0e,0x00,0x00,0x00,0x03,0x00,0x0d,0x00,0x00,
0x0f,0xa1,0x25,0x00,0x00,0x77,0x00,0x45,0x00,0x0d,0x00,0x0e,0x00,0x00,0x00,0x03,0x00,0x0d,0x00,0x00,0x0f,0xae,0x25,0x00,0x00,0x62,0x00,0x55,0x00,0x08,0x00,0x0e,
0x00,0x00,0x00,0x03,0x00,0x07,0x00,0x00,0x0f,0xb8,0x25,0x00,0x00,0xed,0x00,0x7b,0x00,0x09,0x00,0x0a,0x00,0xff,0xff,0x05,0x00,0x07,0x00,0x00,0x0f,0xcf,0x25,0x00,
0x00,0x93,0x00,0x45,0x00,0x0d,0x00,0x0e,0x00,0xff,0xff,0x03,0x00,0x0c,0x00,0x00,0x0f,0xfe,0x25,0x00,0x00,0x24,0x00,0x81,0x00,0x0a,0x00,0x0b,0x00,0x00,0x00,0x05,
0x00,0x0a,0x00,0x00,0x0f,0x39,0x26,0x00,0x00,0x1a,0x00,0x73,0x00,0x0c,0x00,0x0d,0x00,0x00,0x00,0x02,0x00,0x0c,0x00,0x00,0x0f,0x3a,0x26,0x00,0x00,0x27,0x00,0x73,
0x00,0x0c,0x00,0x0d,0x00,0x00,0x00,0x02,0x00,0x0c,0x00,0x00,0x0f,0x3b,0x26,0x00,0x00,0x0d,0x00,0x73,0x00,0x0c,0x00,0x0d,0x00,0x00,0x00,0x02,0x00,0x0c,0x00,0x00,
0x0f
};

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

View file

@ -0,0 +1,326 @@
{
137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,1,0,0,0,1,0,8,3,0,0,0,107,172,88,84,0,0,1,128,80,76,84,69,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,248,248,248,242,242,242,239,239,239,236,236,236,231,231,231,227,227,227,224,224,224,224,224,224,219,219,219,213,213,213,206,
206,206,198,198,198,195,195,195,191,191,191,191,191,191,186,186,186,180,180,180,174,174,174,168,168,168,163,163,163,159,159,159,154,154,154,149,149,149,143,143,143,137,137,137,131,131,131,127,
127,127,127,127,127,124,124,124,118,118,118,110,110,110,103,103,103,99,99,99,95,95,95,94,94,94,88,88,88,83,83,83,79,79,79,76,76,76,70,70,70,66,66,66,63,63,63,62,
62,62,58,58,58,55,55,55,50,50,50,47,47,47,43,43,43,39,39,39,35,35,35,31,31,31,30,30,30,29,29,29,26,26,26,24,24,24,22,22,22,19,19,19,18,18,18,15,
15,15,14,14,14,11,11,11,10,10,10,8,8,8,7,7,7,4,4,4,4,4,4,3,3,3,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,227,129,195,62,0,0,0,
51,116,82,78,83,0,0,0,0,0,0,2,3,3,6,7,10,11,14,17,21,24,26,30,31,35,40,45,51,56,62,63,71,82,84,94,96,103,114,120,127,127,138,146,158,160,168,174,
185,192,192,200,209,223,231,243,82,72,190,25,0,0,32,0,73,68,65,84,120,218,237,125,235,79,42,75,211,175,95,38,33,6,35,6,69,5,22,75,37,192,66,9,140,244,7,238,
68,16,130,40,40,26,97,137,119,162,34,78,2,33,132,132,132,47,252,235,167,170,47,51,61,128,46,247,126,246,243,158,119,159,195,100,239,229,244,204,0,93,191,174,174,174,170,174,
170,89,82,224,176,218,87,20,249,112,56,21,199,150,212,182,218,87,77,45,243,211,83,183,87,228,214,212,55,89,54,151,149,173,207,158,93,14,121,87,66,123,70,123,103,194,26,46,
143,103,219,184,106,247,88,241,123,189,43,223,248,117,188,105,255,140,46,78,198,18,158,14,181,129,76,147,227,189,229,108,191,26,29,133,251,253,85,185,101,122,122,234,246,234,64,235,
175,127,242,77,150,241,219,200,47,125,177,233,217,229,81,241,106,80,184,214,17,216,249,77,234,216,112,61,53,155,47,58,2,118,237,118,104,85,28,237,43,209,135,47,126,93,217,60,
24,106,90,212,111,157,215,27,65,6,3,160,144,27,45,27,20,29,166,98,253,100,204,184,18,42,166,59,27,18,189,230,167,205,183,87,251,217,100,242,99,125,254,55,249,207,73,246,
34,25,157,255,236,90,151,228,94,73,62,162,55,147,23,126,60,217,171,167,73,37,32,62,19,201,145,170,95,241,52,137,102,255,227,175,59,223,74,177,84,34,121,49,180,206,233,141,
32,99,137,53,74,141,93,131,162,64,245,120,92,46,29,136,166,251,254,184,183,97,26,113,211,211,230,219,129,106,117,124,121,50,182,204,253,166,80,241,165,150,189,242,206,127,22,190,
168,237,105,182,29,188,229,171,157,253,18,159,146,0,80,51,4,174,27,0,124,241,235,206,86,130,212,15,7,37,146,227,8,152,123,195,201,88,154,230,148,192,4,142,176,101,31,254,
245,206,242,17,189,235,61,216,229,119,89,51,108,151,155,1,139,119,254,103,161,25,50,55,229,187,182,80,40,20,84,246,66,33,155,104,252,226,13,4,32,52,81,119,232,99,123,111,
215,61,155,204,1,110,117,34,141,78,32,160,78,246,45,124,190,101,72,46,2,179,133,144,154,143,223,13,171,19,65,63,118,114,18,162,0,152,56,37,80,33,112,92,121,53,250,175,
242,245,221,175,155,51,60,248,85,211,214,43,22,139,167,193,122,177,8,244,153,26,8,64,169,64,50,191,119,232,124,40,22,47,228,41,128,100,74,243,83,106,186,30,9,193,73,116,
152,34,169,195,153,187,222,43,236,107,49,4,0,152,57,101,181,95,39,228,110,176,50,214,50,119,40,36,190,188,251,117,115,154,7,191,108,46,143,160,71,119,63,58,185,6,76,76,
83,3,1,136,53,47,9,121,116,41,202,70,167,132,189,54,0,112,61,27,3,108,110,238,93,19,130,60,30,62,38,164,187,54,125,119,101,112,7,248,0,190,75,211,156,2,223,77,
90,78,197,162,102,225,95,229,235,187,95,55,167,62,251,117,19,166,100,2,78,186,89,117,121,186,1,0,28,135,199,9,66,103,47,112,153,9,0,228,186,140,46,70,228,38,142,113,
211,67,63,62,239,97,103,139,177,233,210,52,167,112,34,20,70,196,215,119,191,110,78,125,246,235,38,44,17,85,146,30,53,46,153,240,144,27,84,8,170,89,146,85,103,1,88,30,
37,128,168,103,151,190,148,26,77,4,0,167,77,168,64,230,61,172,3,48,205,41,102,34,190,190,251,117,115,234,179,95,55,21,101,235,21,216,254,152,79,81,185,241,21,0,63,238,
74,31,132,136,245,194,212,252,113,199,120,235,48,77,18,108,212,77,15,235,0,76,115,138,153,136,175,239,126,221,156,250,236,215,77,182,196,231,142,195,198,122,47,26,240,196,201,62,
144,65,85,132,41,0,246,203,119,145,60,137,139,149,94,110,90,135,73,124,20,212,11,177,138,154,30,54,1,32,115,202,44,17,159,223,253,51,0,210,103,191,110,194,177,11,34,180,
177,195,1,144,26,0,64,178,7,28,65,149,68,51,0,171,253,212,104,210,32,228,230,39,215,131,228,230,207,27,232,205,65,164,66,210,76,6,154,239,234,0,200,156,18,229,68,60,
184,145,136,183,77,51,31,205,222,253,186,57,245,217,175,155,180,131,241,152,174,213,74,13,0,32,23,35,164,68,85,56,51,0,160,46,19,190,156,41,179,205,159,183,233,88,41,71,
138,92,53,52,223,213,1,144,56,165,138,156,178,249,70,111,172,246,9,174,100,95,223,253,186,57,245,217,175,155,128,158,59,88,46,239,115,250,229,6,202,128,225,107,247,0,233,223,
55,3,16,42,60,129,58,115,44,120,104,170,169,120,14,251,207,177,179,39,222,50,223,213,1,96,124,107,112,138,101,124,68,82,111,135,195,42,211,25,191,190,251,117,115,234,179,127,
106,222,135,10,200,62,202,116,3,1,8,110,173,177,89,140,90,209,129,0,192,174,101,84,54,178,87,62,101,166,73,25,201,123,201,149,178,233,187,187,8,64,144,106,130,30,51,167,
108,191,100,9,73,197,242,168,132,41,127,186,251,117,115,234,179,95,54,189,87,169,82,78,44,232,114,35,120,26,39,137,211,32,61,159,144,147,88,18,236,57,6,192,90,55,149,40,
132,214,186,25,66,226,48,155,166,154,66,229,189,175,160,172,157,190,187,219,72,19,146,132,175,93,98,156,242,250,62,12,9,35,106,91,237,191,190,13,194,54,193,141,95,222,253,186,
57,245,217,175,154,203,163,151,71,221,108,148,27,182,158,166,105,28,209,141,206,67,107,8,246,44,55,135,215,14,163,48,159,215,212,201,36,138,4,79,53,133,141,21,240,48,243,210,
124,119,247,16,78,130,220,26,84,86,183,28,86,201,222,91,221,218,92,49,53,191,190,251,117,115,234,179,159,54,151,183,93,134,145,45,55,108,118,187,93,32,186,225,118,210,15,72,
14,145,255,240,88,82,254,213,7,181,233,84,217,53,36,187,171,44,194,247,178,190,235,245,122,164,27,235,97,213,45,3,48,237,169,50,183,191,118,129,45,155,156,78,166,123,178,123,
106,158,55,138,119,198,109,240,132,56,117,123,60,246,57,31,116,122,60,14,211,55,51,155,142,170,136,220,53,100,215,6,30,221,33,52,102,238,159,229,192,71,227,234,170,57,248,169,
255,228,71,254,232,222,109,0,48,237,169,50,183,191,116,129,57,246,71,96,210,239,187,230,221,147,221,83,115,189,81,76,233,253,184,23,122,156,226,230,167,238,251,230,173,230,152,249,
96,160,213,100,14,19,253,155,87,6,96,122,151,153,158,195,92,67,174,167,228,45,87,166,54,223,114,116,129,93,30,85,201,113,237,178,148,186,17,8,4,203,165,90,146,203,216,165,
89,79,213,84,251,43,23,216,214,251,73,44,145,142,159,60,185,102,239,153,220,83,115,189,81,76,233,143,197,132,188,183,169,89,205,105,161,222,160,99,18,99,190,33,233,131,129,42,
73,156,225,218,40,125,243,202,68,40,186,194,53,4,235,30,211,32,55,223,18,199,244,139,247,203,137,199,176,207,123,240,158,107,122,68,47,235,109,194,7,106,105,214,83,53,221,254,
220,5,182,245,154,32,23,227,195,231,4,87,189,76,14,42,147,123,106,174,55,138,153,125,167,195,36,27,97,87,239,38,121,221,162,31,240,141,184,230,43,127,16,116,198,234,47,247,
212,55,11,0,132,131,7,45,233,216,187,3,199,61,75,132,126,254,184,211,109,245,123,221,143,52,103,188,221,70,44,33,58,67,101,64,104,91,157,120,13,177,162,134,182,125,106,136,
125,31,237,175,225,117,178,83,135,153,205,78,111,162,222,147,133,126,120,47,41,0,180,15,19,238,14,251,102,3,62,155,111,210,14,43,174,231,196,113,242,140,119,108,34,212,23,157,
176,153,107,22,69,2,64,119,240,40,202,65,137,26,124,160,106,199,41,70,145,124,33,212,136,29,101,50,89,181,202,89,0,53,214,250,158,44,4,205,174,162,12,112,7,26,105,124,
92,165,187,118,244,118,193,47,106,244,38,58,88,206,253,40,83,240,219,88,31,152,83,236,187,13,100,231,227,56,51,251,195,121,210,205,106,77,246,163,130,88,137,176,185,215,4,0,
186,131,7,120,234,130,58,24,126,157,161,191,5,127,128,52,134,241,252,184,27,207,170,77,206,214,240,8,187,41,0,152,118,21,149,198,22,91,239,226,130,107,31,210,93,203,248,53,
70,242,253,213,113,245,12,110,10,147,94,89,223,211,157,76,160,180,92,192,207,124,179,1,242,232,112,18,13,81,9,2,22,255,69,90,27,177,169,31,77,176,159,148,8,211,1,144,
175,233,83,64,168,246,12,31,24,193,240,49,195,104,235,149,60,191,144,75,111,168,160,3,96,25,167,42,132,112,201,186,52,207,85,196,70,74,72,1,249,174,5,27,79,174,65,10,
101,144,48,233,197,34,69,251,96,15,53,241,218,55,27,193,114,42,22,47,80,25,138,118,49,201,55,216,15,65,247,143,71,187,38,194,162,79,132,220,122,20,211,181,207,0,0,61,
25,240,164,0,108,191,144,86,11,110,133,138,89,181,70,29,171,138,235,17,29,35,85,191,14,192,148,171,40,155,64,26,117,0,204,94,167,245,15,96,129,241,21,19,60,87,220,102,
183,218,45,122,31,186,133,144,231,251,141,9,121,153,220,144,56,90,54,142,118,6,89,155,201,128,205,183,36,227,46,157,176,40,92,224,130,239,207,0,32,7,228,25,0,182,30,105,
12,98,133,208,48,149,237,100,24,219,4,169,99,36,201,22,162,165,89,87,81,17,56,44,169,233,0,76,121,157,112,254,52,40,3,128,204,103,115,3,214,117,236,25,246,161,220,172,
51,181,228,155,141,173,215,144,58,230,124,228,27,221,38,227,132,80,207,2,72,178,108,155,121,150,57,97,118,173,129,227,242,103,0,160,131,184,132,7,79,249,52,87,143,78,246,107,
164,148,79,198,83,76,249,89,25,164,169,99,132,177,211,210,172,171,168,24,170,1,47,142,4,0,83,94,39,91,47,78,98,108,233,69,147,62,31,198,159,164,110,77,236,67,182,120,
108,144,249,141,198,143,187,66,54,203,186,238,171,245,213,236,91,134,173,93,48,222,53,223,138,137,48,187,190,10,24,215,156,150,241,12,0,251,39,116,180,126,222,112,71,203,110,131,
188,248,158,26,175,183,119,125,166,252,161,167,200,224,181,165,89,87,81,49,52,46,193,20,225,0,76,121,157,168,195,86,76,8,244,234,220,134,15,58,9,186,102,211,62,132,52,131,
204,63,55,92,56,175,53,214,117,53,219,0,69,40,31,163,122,221,28,98,231,92,115,182,156,26,243,45,27,215,80,15,104,83,61,128,99,105,25,151,18,207,7,94,239,126,135,203,
77,221,49,66,127,105,105,214,85,84,12,217,122,48,29,115,236,215,166,220,76,108,142,209,111,70,4,30,178,36,95,138,87,199,134,12,24,119,183,127,126,187,1,223,149,81,57,97,
7,165,216,73,34,23,99,26,210,247,0,152,144,143,59,182,97,98,92,131,241,97,99,229,104,39,242,220,59,122,70,74,151,87,39,25,38,247,13,199,200,181,143,1,48,237,42,2,
82,55,223,226,226,215,166,221,76,38,0,20,183,218,63,173,141,2,146,108,178,108,191,96,7,190,215,128,133,52,246,241,192,127,234,96,220,73,63,143,41,253,168,9,206,0,160,107,
130,250,181,72,62,17,75,176,187,194,193,227,190,207,60,114,94,117,116,242,204,143,98,253,245,94,175,92,220,142,182,148,89,199,8,0,48,227,42,42,170,204,95,197,101,207,180,155,
41,136,0,8,213,216,209,126,60,17,74,37,237,3,128,213,196,73,249,189,198,250,7,172,56,160,114,37,233,184,91,96,10,216,217,206,112,145,196,216,120,9,194,100,91,192,184,22,
233,107,81,70,191,112,240,172,117,71,186,101,182,17,22,123,205,142,189,128,223,195,173,143,41,199,200,210,172,171,40,142,211,19,126,13,1,152,117,51,5,79,97,61,74,11,85,222,
245,152,61,186,251,161,232,125,32,76,83,252,110,67,89,31,189,117,65,233,142,238,242,152,0,182,206,237,54,234,205,247,45,19,97,116,50,63,222,92,1,239,201,215,86,133,213,44,
28,60,202,154,108,183,57,190,227,16,153,113,21,69,85,182,17,238,85,230,186,153,130,209,201,228,80,55,142,92,170,250,67,234,3,61,2,223,111,40,203,155,107,82,111,214,184,79,
112,119,143,27,254,6,97,136,128,235,167,215,57,117,237,59,135,229,32,106,147,154,91,30,15,183,203,85,245,95,239,17,50,29,225,201,206,188,120,35,88,6,146,61,29,129,149,240,
107,179,249,26,90,166,202,55,240,250,146,226,167,145,9,248,47,181,165,66,236,248,97,118,240,88,61,30,15,206,173,117,248,187,46,249,228,108,108,252,86,108,83,14,33,253,194,204,
19,10,123,98,217,110,153,138,100,218,54,28,73,182,207,227,156,166,60,80,208,210,89,30,212,231,223,59,243,226,141,172,195,92,89,48,204,202,224,152,148,170,177,34,170,129,12,0,
255,5,13,70,192,127,65,252,31,148,138,236,96,19,219,63,212,250,17,250,21,205,102,19,212,176,245,15,248,11,90,32,247,202,46,7,122,116,45,93,25,112,132,221,240,252,129,69,
186,48,243,196,90,68,235,255,178,64,15,53,225,2,167,113,34,135,126,23,15,132,178,29,12,180,94,116,235,179,56,39,147,7,138,182,70,225,61,138,193,78,35,113,158,228,129,0,
51,241,70,57,225,141,130,117,39,53,6,45,177,190,107,112,192,21,174,241,236,95,42,238,31,128,1,222,168,104,247,95,196,178,9,252,154,213,126,37,205,119,100,72,5,122,202,252,
242,232,107,162,250,76,36,207,132,162,251,62,93,70,83,82,191,48,243,4,116,37,147,56,27,91,252,23,162,119,44,78,36,117,241,152,165,222,10,91,175,68,82,241,132,232,239,84,
80,137,217,3,181,221,134,22,40,34,117,28,206,149,65,254,41,80,21,251,1,114,188,17,48,247,94,4,104,114,113,203,238,120,124,206,130,13,56,0,94,74,58,251,151,170,208,9,
24,226,80,1,190,212,209,38,37,181,67,9,88,13,21,5,0,147,109,133,3,176,218,111,81,242,60,183,71,204,176,216,126,121,6,173,185,187,166,95,152,121,2,212,148,86,141,220,
187,63,226,92,149,224,113,34,176,20,50,14,0,35,224,244,176,155,48,223,21,65,37,102,15,212,246,75,130,156,143,212,238,49,85,81,252,161,200,158,34,200,68,154,69,3,89,188,
30,2,166,166,168,225,214,90,157,228,187,7,244,235,0,231,105,0,172,195,35,252,53,215,19,176,44,152,210,153,119,191,112,57,234,0,40,2,0,101,117,130,228,45,143,142,110,185,
81,188,221,47,131,34,46,93,152,126,2,190,70,107,146,171,95,103,39,251,114,36,19,70,75,176,193,3,43,182,230,219,171,51,7,204,76,80,137,236,129,98,173,101,101,163,131,125,
49,145,105,106,56,218,121,88,113,239,184,197,133,0,84,72,57,72,231,223,214,150,50,3,0,40,129,49,52,38,92,54,252,137,2,137,157,15,109,159,2,160,80,242,118,27,249,200,
50,115,116,187,199,237,92,252,93,186,96,60,193,218,8,192,13,185,110,199,76,145,76,182,30,24,68,233,67,102,170,146,248,187,99,111,15,5,243,76,80,137,201,3,133,118,4,53,
3,252,23,96,253,154,200,52,211,76,3,44,52,9,0,220,46,212,163,106,102,0,64,235,137,251,85,215,63,50,133,36,201,245,108,95,2,176,50,72,182,156,35,234,232,118,63,180,
127,157,145,166,113,193,120,162,175,13,2,76,6,61,84,201,75,177,234,63,160,146,140,57,149,134,185,11,110,155,172,2,11,145,108,31,131,193,64,211,249,36,168,132,121,160,120,11,
214,1,255,234,52,153,159,55,16,128,62,192,93,22,8,204,2,0,246,47,40,232,235,76,247,28,194,12,163,188,105,6,128,123,0,224,98,28,140,231,210,1,124,45,234,141,222,171,
92,45,113,212,55,46,232,79,212,51,37,190,41,126,150,206,212,159,146,221,122,233,4,77,74,234,84,26,23,202,99,22,39,178,60,202,145,90,130,20,134,157,243,18,204,207,79,130,
74,12,155,164,233,129,229,68,163,88,255,5,0,66,253,162,17,90,54,7,128,149,65,150,225,3,236,120,29,234,48,123,219,12,128,226,153,216,169,161,128,251,150,241,182,179,149,226,
254,202,143,214,187,42,95,16,79,52,91,234,17,29,98,235,175,67,53,146,191,110,144,122,25,167,1,117,42,149,203,99,30,39,2,166,122,124,244,20,131,241,169,224,58,53,39,168,
196,240,64,177,155,91,175,220,157,240,37,0,167,193,119,9,128,222,120,148,215,169,157,3,192,246,75,5,232,223,96,83,176,128,50,251,211,41,96,183,219,3,149,74,96,116,220,224,
38,219,186,211,97,190,192,159,240,56,199,169,12,223,12,241,52,51,163,18,249,104,224,90,140,78,165,116,113,108,225,113,34,254,11,48,143,113,41,62,77,224,247,79,69,145,152,61,
80,188,181,53,209,1,48,200,52,53,96,28,115,163,154,4,64,241,41,120,65,184,20,158,3,0,167,31,165,148,251,33,37,156,135,243,1,192,173,171,132,230,171,93,212,72,229,171,
11,246,213,113,53,199,229,222,242,40,219,228,139,129,151,58,149,210,67,171,136,19,193,81,253,88,247,213,184,187,102,78,80,137,225,129,194,22,134,81,113,0,76,100,154,26,206,22,
216,246,192,67,232,17,243,193,4,43,150,82,167,177,12,245,188,205,3,0,233,119,58,157,35,100,252,85,255,224,130,176,80,157,207,0,216,63,169,249,60,205,171,50,41,242,165,123,
238,133,213,126,169,210,169,178,5,117,183,158,143,64,7,219,151,180,123,32,103,164,56,17,71,59,70,10,218,4,38,65,236,81,157,141,34,49,123,160,60,183,132,220,133,15,134,12,
0,153,76,115,67,113,14,95,209,228,60,196,115,95,116,18,58,232,189,124,168,155,159,172,2,219,47,249,231,22,28,215,55,63,65,36,95,236,131,98,66,181,178,79,0,112,182,146,
32,129,60,237,28,201,50,189,107,254,5,182,151,65,63,66,23,141,205,183,68,49,157,135,41,225,122,202,253,150,227,68,40,207,145,248,117,137,80,163,124,58,168,196,228,129,82,60,
247,25,104,165,18,21,202,91,50,153,230,134,98,221,90,51,89,77,182,237,117,201,28,166,74,112,40,196,0,64,237,138,29,208,91,187,70,78,206,99,5,252,53,251,196,0,192,35,
1,176,254,65,183,181,28,145,137,234,80,190,184,64,119,179,236,76,57,124,113,226,206,245,219,71,100,25,181,142,206,142,41,108,196,125,216,123,233,68,247,14,38,204,40,159,14,42,
113,171,253,215,54,247,64,97,107,240,246,214,143,6,54,102,201,156,166,249,115,127,0,104,229,217,28,40,77,248,111,72,137,228,178,236,96,186,214,91,179,249,72,233,215,152,87,16,
1,64,206,53,50,54,214,167,125,14,127,188,176,186,205,66,16,24,77,155,27,211,97,35,182,237,13,243,243,51,65,37,146,203,99,101,115,115,245,219,230,242,138,97,57,42,171,34,
68,1,56,32,162,162,169,128,255,162,213,162,178,35,196,122,9,70,176,69,108,138,134,232,242,55,65,14,248,7,67,84,254,241,195,13,67,111,19,160,175,25,161,24,235,96,102,142,
246,153,145,229,140,128,98,166,218,254,161,16,25,201,15,241,89,166,19,232,107,171,243,221,51,206,128,52,64,58,215,250,84,143,35,56,47,149,106,238,111,153,190,211,125,223,61,240,
247,152,252,9,69,187,218,32,188,201,167,98,137,164,19,39,84,160,57,91,185,88,54,150,165,42,46,3,0,253,28,214,153,239,165,156,98,157,151,211,37,117,80,246,67,124,150,233,
100,241,141,180,254,129,109,214,61,3,93,17,217,48,232,7,232,70,67,155,204,41,122,212,124,103,78,63,179,107,99,238,111,153,190,115,5,76,199,210,69,230,129,233,46,241,76,130,
228,233,130,7,218,29,169,28,118,226,248,115,96,238,164,62,212,118,140,138,177,37,134,78,179,217,20,91,63,250,247,162,91,181,175,13,131,214,153,142,72,29,52,249,33,62,201,116,
178,140,107,113,16,230,172,143,178,123,70,249,17,110,85,34,123,10,247,3,100,146,137,34,246,214,58,140,131,54,126,238,159,113,109,204,255,173,105,151,79,137,144,71,55,179,67,110,
212,94,154,160,91,155,90,14,154,61,80,197,78,193,202,118,238,119,186,30,41,197,75,108,237,215,35,150,229,239,221,232,28,147,76,236,148,62,39,119,68,238,160,217,15,49,63,211,
9,20,155,210,97,131,228,217,226,37,185,103,60,119,121,66,114,20,238,112,62,254,174,142,127,83,221,96,101,112,179,255,116,45,156,76,134,107,227,179,223,50,125,103,56,127,117,71,
168,30,9,90,223,152,238,102,99,35,154,39,41,16,99,184,25,97,29,198,72,179,211,234,250,172,134,12,64,233,206,1,48,190,23,13,238,83,245,156,43,141,166,142,72,29,164,27,
252,194,97,172,111,246,203,153,78,128,23,104,189,239,44,142,90,126,6,52,153,216,85,229,10,23,252,245,15,24,168,53,75,248,152,234,110,171,129,232,228,144,187,193,76,231,145,79,
174,75,231,222,231,243,74,146,176,56,227,128,197,141,214,24,140,32,238,45,211,133,236,39,139,15,201,228,121,0,2,2,176,25,158,168,2,0,127,40,228,251,197,93,41,184,1,243,
123,231,129,176,240,16,169,227,242,185,180,193,111,58,151,50,157,220,15,184,116,106,204,150,151,159,137,228,72,190,85,25,22,66,236,183,106,221,136,55,76,233,239,87,65,65,102,110,
176,191,122,238,189,36,249,230,49,137,177,225,113,223,87,72,162,201,246,225,73,145,199,218,224,111,229,35,98,79,109,9,0,1,70,47,51,0,76,174,20,100,139,166,167,197,44,176,
207,8,149,54,248,77,231,82,166,19,134,254,55,61,35,182,189,104,126,158,156,130,16,12,177,64,22,12,143,184,212,182,145,243,242,164,58,46,83,115,224,175,158,163,243,232,30,173,
41,182,19,238,171,229,73,22,157,81,96,226,147,100,241,52,104,181,49,0,170,126,141,91,57,75,214,97,154,20,31,143,24,0,38,87,10,154,91,77,207,51,83,181,63,35,84,222,
224,151,207,165,76,39,102,184,79,24,0,210,51,203,128,73,5,0,160,42,5,238,57,195,145,128,165,3,127,247,153,231,94,252,213,243,61,0,187,141,190,34,33,174,35,101,26,113,
224,108,101,73,170,213,217,24,2,103,56,222,121,110,31,21,82,75,248,201,199,157,6,159,2,178,33,189,214,141,145,139,64,157,1,240,25,161,210,6,191,233,92,74,244,65,1,172,
3,32,63,115,152,34,165,86,101,64,149,74,139,255,241,20,247,204,10,33,102,18,226,48,129,185,252,119,206,53,122,14,0,216,2,108,254,33,24,24,215,209,223,240,213,96,181,176,
140,83,48,27,117,14,192,143,116,116,33,104,242,36,236,54,72,162,146,97,189,253,132,80,121,131,95,62,151,1,96,156,196,16,55,61,3,171,67,226,161,114,139,203,148,101,220,117,
5,15,91,121,180,251,117,34,160,227,127,245,28,71,242,21,137,134,169,103,235,129,13,141,62,13,252,49,187,150,32,245,253,97,26,5,49,252,238,113,248,145,199,155,80,0,180,249,
0,40,187,239,141,230,27,166,48,126,74,168,188,193,47,159,203,153,78,104,206,55,118,63,104,140,133,233,153,229,209,41,73,102,82,40,139,236,90,12,248,0,122,11,150,62,78,225,
23,68,13,230,241,95,61,183,245,146,164,17,172,145,44,88,154,240,157,239,193,200,41,119,184,111,191,100,98,39,71,148,235,45,227,10,41,165,98,44,58,111,9,125,160,47,24,53,
34,0,48,92,41,107,93,247,142,231,133,74,212,207,8,149,55,248,77,155,253,114,166,83,240,148,84,246,239,8,122,132,76,207,40,203,193,97,179,60,118,177,0,196,234,120,63,114,
137,92,34,136,192,231,255,234,57,208,153,78,156,198,143,112,225,130,235,201,114,142,36,184,238,184,173,106,47,131,0,143,117,27,190,189,143,88,212,193,18,224,68,46,198,39,28,0,
147,43,69,205,62,4,195,167,116,245,250,140,80,121,131,95,62,199,52,15,61,211,201,58,44,197,78,82,25,28,8,115,64,128,161,10,175,246,97,205,60,201,19,170,46,114,34,168,
106,243,87,207,149,237,195,94,171,167,82,131,210,22,29,188,191,116,163,186,238,108,223,54,170,46,108,10,155,114,9,3,103,65,29,3,221,0,117,76,147,43,69,61,138,151,143,9,
58,200,62,37,212,180,193,47,159,7,163,147,136,200,116,82,172,7,131,23,77,165,166,129,57,32,0,102,1,143,89,94,13,77,186,47,237,33,51,24,182,15,53,32,130,169,118,127,
245,28,232,118,26,91,193,142,237,63,185,5,64,17,218,29,190,246,34,147,137,186,54,227,74,81,251,111,194,251,240,25,161,166,13,126,243,102,191,236,148,88,217,182,207,127,102,217,
48,231,215,182,13,195,223,110,16,241,151,207,255,112,160,222,135,123,225,54,35,84,214,186,101,251,196,149,178,170,115,202,87,132,254,47,60,182,217,110,190,34,76,115,163,65,245,190,
243,34,203,204,255,39,83,102,12,35,218,194,208,81,13,75,159,70,30,176,98,11,138,40,182,224,11,136,195,61,211,66,232,119,2,126,183,69,236,238,250,149,32,223,246,156,26,64,
201,46,151,43,48,108,191,208,221,124,78,255,147,212,208,245,190,59,238,164,95,154,10,73,176,26,94,9,195,251,32,249,2,86,2,135,34,126,221,228,218,48,140,104,88,210,119,168,
4,213,173,193,16,70,30,76,85,87,240,213,42,226,120,112,79,181,80,137,239,55,42,231,15,99,27,223,221,189,8,158,242,221,93,243,0,74,118,185,169,232,194,207,155,35,35,174,
111,175,46,53,204,122,31,3,96,35,52,208,122,44,137,200,17,25,106,93,117,123,202,251,32,249,2,86,6,213,20,15,26,52,185,54,36,35,122,255,132,26,15,129,106,70,36,51,
13,227,240,217,169,234,10,106,182,201,143,42,192,1,26,147,41,136,222,253,64,173,55,154,127,136,234,121,49,244,202,86,38,243,0,202,118,185,185,232,2,75,48,53,138,10,152,162,
28,59,146,241,11,0,108,116,138,36,29,163,62,20,199,123,46,145,37,71,204,149,99,120,31,36,95,192,65,9,250,245,66,40,225,178,27,66,50,206,163,9,170,100,131,102,242,238,
16,59,192,232,230,48,87,87,80,179,170,135,29,205,89,0,182,95,98,172,145,227,21,36,138,161,9,3,192,60,128,38,187,220,84,116,129,210,236,98,81,63,172,17,141,250,245,88,
114,51,0,96,148,22,15,175,8,58,136,156,173,100,79,61,35,73,52,44,101,239,131,238,11,96,70,155,198,246,7,37,55,132,13,87,61,62,123,127,222,224,190,38,124,62,86,223,
229,41,72,115,106,47,168,89,85,240,228,44,0,225,188,104,225,87,200,0,152,7,16,38,188,223,207,41,51,23,93,160,52,63,209,168,31,218,40,84,227,113,202,41,102,189,15,1,
176,245,80,73,111,210,224,105,71,187,230,67,229,153,238,233,216,34,64,148,207,76,31,203,24,225,0,24,84,219,122,229,4,201,241,92,95,91,143,77,202,240,49,143,160,140,228,232,
133,239,3,128,186,51,63,48,224,123,26,0,125,0,113,19,253,92,80,102,46,186,64,1,248,200,252,166,148,64,35,118,94,99,17,206,102,189,15,1,88,30,197,25,0,248,172,195,
71,77,23,60,149,136,146,78,15,211,58,0,198,85,220,212,190,238,37,98,116,234,120,198,79,140,54,239,85,156,10,90,0,141,234,149,223,7,0,3,33,196,49,225,0,244,24,0,
166,1,196,138,42,58,101,230,162,11,116,19,184,112,191,227,228,141,212,225,132,155,200,66,239,51,166,192,78,35,150,126,42,137,136,1,43,134,104,128,118,38,17,37,211,71,165,19,
5,64,186,138,152,189,134,10,4,37,130,167,153,226,254,168,237,23,214,49,88,31,232,44,253,62,0,116,251,197,4,64,122,112,205,0,48,15,160,137,50,83,209,5,184,147,203,241,
244,2,108,228,35,194,2,91,235,130,222,215,36,34,107,142,122,132,242,177,66,50,197,226,226,172,67,160,31,213,96,137,40,153,62,197,61,184,97,0,72,87,145,47,235,205,28,6,
185,56,222,99,96,248,240,229,48,73,37,72,176,204,18,23,204,213,21,190,4,224,86,111,161,244,192,240,8,28,51,170,158,155,6,208,68,153,169,232,2,114,125,158,102,127,137,249,
32,30,83,179,239,193,131,42,250,29,116,25,144,36,181,208,19,247,144,1,191,178,188,2,137,40,233,148,61,65,1,152,122,160,140,107,120,128,122,100,64,248,239,42,58,229,2,135,
169,234,10,95,1,176,50,72,17,41,158,24,0,40,180,199,66,61,223,101,3,40,0,48,40,51,21,93,192,59,195,172,240,141,202,143,69,114,201,211,18,201,139,25,192,74,104,80,
119,5,77,51,93,131,101,100,85,44,23,156,40,233,116,10,0,126,149,122,33,2,129,119,24,95,150,177,180,75,229,63,227,125,16,77,140,19,205,213,21,0,0,59,61,230,173,2,
216,39,122,196,113,87,152,202,0,41,174,116,203,51,23,0,83,209,5,122,231,53,70,110,124,211,143,89,198,237,167,135,247,176,30,110,186,196,92,159,194,67,182,249,118,206,196,168,
68,148,116,42,1,32,93,93,235,198,201,245,126,232,4,164,49,58,75,30,127,125,80,41,201,164,159,144,133,83,213,21,212,172,198,143,250,28,69,8,101,29,28,73,20,59,104,89,
199,79,131,114,234,106,138,219,174,38,202,228,162,11,24,7,17,175,193,108,193,16,119,214,56,213,131,242,29,46,183,180,95,187,132,179,182,22,124,230,226,35,146,231,169,52,18,81,
210,169,4,128,124,213,125,159,140,149,11,121,156,113,126,12,234,207,196,163,250,250,167,175,134,230,234,10,161,66,86,28,208,45,115,11,17,120,57,205,229,107,189,237,169,2,10,34,
247,26,14,32,213,76,153,169,2,131,47,58,137,250,118,121,136,59,109,4,13,27,124,202,28,222,249,157,136,157,166,99,44,232,128,231,157,42,38,162,164,83,3,0,211,85,119,180,
243,210,15,175,178,240,226,246,91,63,202,189,29,192,30,158,91,17,140,98,174,174,16,82,197,177,59,211,66,176,130,145,176,207,54,83,64,65,132,79,219,105,172,181,153,50,83,5,
134,239,28,171,184,31,138,57,67,209,110,171,51,102,102,191,101,252,38,2,232,36,162,164,83,140,155,30,50,143,161,124,85,217,216,22,134,189,213,161,111,217,59,113,210,120,54,255,
111,22,87,8,41,19,17,155,193,219,104,149,58,217,162,129,197,41,169,53,184,230,220,176,232,181,19,12,113,99,16,37,159,90,61,86,207,236,213,111,29,134,81,201,140,231,95,194,
156,92,101,229,29,116,43,126,149,149,17,152,76,28,34,97,27,227,192,240,31,149,197,39,32,49,84,229,89,141,242,136,5,196,123,162,31,118,61,197,120,34,226,93,68,202,49,90,
165,84,65,132,53,28,228,222,63,151,48,161,71,238,175,184,61,110,158,160,198,236,105,106,236,111,160,56,23,70,37,51,158,127,157,113,115,114,181,223,196,165,81,183,226,29,253,225,
10,211,52,192,0,97,234,55,230,190,194,63,40,45,169,100,69,91,49,76,151,126,34,124,216,52,233,215,8,240,225,41,198,118,13,236,103,148,24,188,237,120,79,215,53,42,43,64,
222,193,50,73,19,38,252,122,193,198,41,143,192,138,93,228,53,88,116,250,2,70,190,139,226,112,138,112,150,245,144,198,190,86,113,12,238,155,247,44,188,182,64,237,105,102,236,195,
226,50,17,70,37,55,158,151,71,121,102,78,194,131,40,230,133,21,239,104,199,49,211,31,21,7,224,81,203,24,116,252,242,96,101,24,35,152,189,148,199,42,19,148,24,180,49,113,
45,34,218,144,239,224,191,38,46,193,28,0,9,153,193,85,146,39,151,1,112,89,213,72,235,235,100,26,187,140,20,71,251,10,150,18,154,48,113,33,10,54,162,42,60,212,186,147,
45,177,215,174,177,188,134,213,240,24,232,11,174,42,162,168,36,91,52,29,237,22,15,254,115,127,20,57,99,57,222,83,164,114,132,11,147,231,150,217,211,108,141,163,123,88,220,168,
20,198,179,173,199,204,73,54,22,186,225,142,154,32,92,7,149,137,234,94,150,8,170,91,104,164,197,134,43,131,228,152,85,99,60,138,225,206,78,36,15,90,225,196,42,146,33,170,
84,221,222,13,158,246,108,130,96,15,5,64,207,192,123,207,220,235,107,129,195,187,141,203,96,59,111,20,108,68,85,56,150,204,240,148,53,236,24,11,139,239,31,199,178,177,216,41,
74,124,25,0,61,8,192,253,144,40,112,0,252,231,208,91,20,255,150,113,129,217,211,58,0,212,124,117,112,51,150,246,56,20,97,127,59,87,134,98,131,184,151,233,146,27,141,51,
133,21,190,146,188,249,171,64,234,131,231,150,105,4,206,86,241,132,36,6,155,111,185,10,15,222,165,193,245,109,4,96,183,81,11,218,244,36,229,38,104,171,6,0,165,4,79,26,
103,97,33,160,103,44,77,21,108,132,101,188,55,98,181,225,152,78,206,74,86,145,123,181,29,167,189,11,84,234,184,12,139,232,201,10,149,106,238,135,14,55,117,168,241,29,242,160,
248,183,132,66,161,128,79,49,0,224,5,65,63,253,171,187,110,126,222,80,195,50,146,99,140,130,218,85,93,61,2,145,80,253,117,38,230,123,17,154,13,127,181,110,0,224,190,47,
29,64,47,106,205,50,27,21,150,164,92,44,38,37,0,98,36,166,87,95,132,233,115,233,101,0,24,245,10,213,35,232,62,205,150,160,186,43,231,128,181,46,88,153,232,12,130,235,
129,202,205,115,243,105,180,77,189,117,73,146,46,82,87,160,91,216,122,254,139,52,73,22,105,47,5,93,58,0,188,32,232,167,127,117,0,2,172,250,213,65,137,153,121,24,97,81,
252,72,29,194,80,142,83,76,108,2,0,227,52,201,141,210,125,3,0,80,132,177,23,249,98,214,0,224,10,6,65,158,2,213,44,73,138,42,47,160,179,129,5,56,13,0,45,59,
224,178,177,196,129,194,21,87,186,215,194,140,247,161,17,168,36,79,114,132,110,243,224,236,41,113,41,32,0,112,180,193,210,104,209,15,9,186,140,41,96,16,248,245,223,253,19,106,
76,112,28,168,122,22,171,159,253,130,153,208,228,246,62,207,113,63,63,13,234,0,56,218,71,147,9,246,34,116,37,1,192,133,160,33,3,18,162,204,240,70,39,142,59,136,75,166,
130,141,246,73,22,3,41,236,76,2,166,94,175,12,199,1,250,169,80,38,253,188,121,220,31,195,41,247,214,85,120,152,166,71,154,2,197,144,93,118,70,254,117,0,34,57,58,83,
247,234,220,160,71,27,51,121,235,1,49,152,225,150,47,2,240,1,223,250,28,208,1,8,176,8,3,248,161,65,127,111,227,51,0,188,143,49,154,214,133,188,138,193,8,12,0,177,
141,201,150,92,78,180,247,170,28,148,0,128,69,41,70,229,228,79,23,198,161,80,19,79,138,132,50,3,160,252,103,0,68,19,44,242,227,138,187,55,48,164,129,244,87,97,33,20,
149,63,16,0,74,153,14,0,172,15,3,198,1,206,21,150,115,196,83,140,85,124,108,77,79,67,70,48,47,176,109,29,118,182,21,14,128,190,141,41,113,128,173,151,248,80,17,0,
70,205,70,47,151,124,116,161,190,182,207,146,235,120,38,199,127,3,0,190,254,161,81,204,29,203,192,160,192,251,160,46,164,15,69,162,118,81,221,122,189,122,114,161,98,55,113,83,
119,16,72,76,31,246,2,180,148,162,145,98,172,102,227,36,150,133,213,88,164,28,35,100,89,154,187,177,161,8,0,244,130,141,92,6,252,220,70,182,139,101,179,73,96,58,186,20,
185,58,71,165,48,62,250,146,0,0,26,55,73,68,65,84,174,235,21,212,147,253,147,125,140,48,48,56,128,237,41,254,147,0,112,13,200,245,76,226,60,40,144,101,224,128,254,199,
241,102,41,222,91,94,87,168,144,0,114,238,221,176,4,196,83,247,190,154,240,164,224,175,241,20,99,53,202,247,61,69,202,113,64,236,131,42,6,0,65,177,33,72,1,160,171,144,
93,107,181,90,0,214,29,50,157,235,57,85,27,171,212,155,55,33,175,65,144,1,25,46,3,74,227,35,236,228,22,198,153,181,68,221,91,117,109,46,0,212,124,133,117,252,79,127,
185,14,172,184,62,122,162,163,1,94,131,41,160,39,106,243,104,242,16,146,231,166,166,217,161,91,241,137,196,108,231,183,53,248,37,185,96,163,178,166,210,41,64,165,175,221,233,12,
225,20,240,209,216,210,56,218,234,49,160,66,205,36,202,57,194,54,227,119,235,36,81,66,191,215,214,107,22,176,79,131,176,161,68,80,14,211,233,97,198,62,126,0,205,215,160,242,
231,191,220,10,82,214,109,255,156,89,56,137,134,89,248,168,56,84,221,39,104,248,27,214,186,89,182,37,195,150,159,80,1,167,0,232,114,186,153,65,253,185,195,247,23,177,25,191,
219,127,233,80,143,231,150,10,216,31,170,156,8,206,1,130,30,106,236,111,253,131,54,238,196,212,152,46,209,229,49,87,224,18,181,171,18,121,116,170,78,116,123,137,59,37,151,76,
254,6,172,19,48,49,236,75,202,95,62,201,208,116,50,131,127,219,102,4,255,111,252,7,196,236,43,110,150,10,193,168,10,24,164,253,8,169,17,223,138,76,165,26,176,25,196,76,
100,202,166,75,116,9,107,81,200,34,102,6,118,10,52,136,104,66,94,52,220,164,212,94,116,0,254,193,67,88,238,30,97,45,202,132,216,153,17,105,55,70,230,242,100,255,158,38,
195,176,97,153,84,116,210,252,119,197,108,174,54,144,72,38,71,21,100,83,94,136,43,244,107,75,249,172,120,87,25,0,48,85,219,226,10,192,27,205,196,82,179,93,38,175,187,220,
49,190,36,102,72,100,71,103,43,234,23,14,25,25,18,192,220,161,93,195,79,98,49,138,203,121,249,93,143,69,209,55,206,192,0,107,138,34,127,18,33,230,58,108,108,109,43,29,
156,38,88,66,74,14,151,149,126,238,154,105,29,254,139,88,181,89,63,202,73,36,63,36,168,253,47,20,252,179,87,167,242,73,137,46,170,61,201,181,150,120,67,99,27,109,234,26,
3,96,77,228,13,114,132,227,57,230,141,156,170,38,199,55,105,210,133,198,216,170,7,191,79,189,165,0,236,129,38,213,173,44,227,118,140,228,6,43,214,225,85,137,26,75,50,33,
230,58,108,136,157,70,174,38,217,34,157,110,219,47,24,34,249,59,63,182,179,88,131,68,249,234,170,254,94,60,14,235,221,15,158,178,205,28,170,208,63,231,8,202,227,79,74,116,
185,148,185,0,220,137,114,88,250,138,205,0,96,8,127,156,179,157,216,233,106,114,214,225,11,226,255,148,33,5,145,79,48,243,150,2,237,46,205,181,75,203,254,9,13,173,14,31,
211,80,93,32,164,245,187,82,189,97,132,152,234,176,153,167,44,51,52,174,83,60,225,95,205,252,254,77,128,119,250,73,99,48,193,28,136,139,122,93,87,94,232,20,198,176,127,93,
175,203,4,64,249,58,69,210,44,247,108,10,0,81,216,40,193,147,1,166,170,201,217,105,68,164,171,37,189,168,99,230,45,5,63,238,69,125,66,92,193,47,189,235,31,41,234,28,
2,66,206,227,15,191,9,35,196,84,135,13,122,81,76,199,138,71,96,187,209,123,171,253,164,254,11,235,31,100,216,34,218,69,50,90,193,43,180,251,55,103,104,12,76,179,243,215,
245,186,76,0,228,43,213,198,96,93,249,28,128,195,148,14,128,169,154,28,3,192,1,183,121,145,254,57,111,41,176,140,227,44,45,3,110,166,224,204,123,73,253,25,64,72,63,94,
14,250,47,2,21,70,154,84,135,77,177,121,194,249,227,112,53,54,228,161,63,184,227,203,125,21,208,3,181,5,234,249,157,151,130,197,186,159,35,121,186,123,201,126,241,137,208,157,
202,63,212,235,50,77,129,128,127,103,69,249,28,128,240,131,24,68,115,53,57,187,118,135,33,221,109,20,9,108,226,207,123,75,129,122,68,216,14,48,165,241,89,205,80,94,6,66,
52,188,235,247,242,81,151,234,176,217,122,205,102,162,212,204,102,68,102,17,104,222,194,210,113,180,227,227,22,121,79,159,251,47,16,72,214,125,12,121,101,57,161,208,159,187,44,73,
224,110,195,220,18,93,107,50,0,126,199,52,26,243,1,200,230,73,170,185,39,91,218,188,154,220,110,35,3,104,100,79,67,194,229,55,247,45,5,198,75,18,48,94,191,210,98,188,
4,132,244,73,53,176,245,58,186,224,33,12,70,29,54,195,131,43,0,73,221,199,73,142,203,210,196,211,61,121,187,74,245,104,168,63,251,13,116,9,10,126,200,22,75,181,143,77,
101,126,137,174,53,121,100,252,23,56,20,212,12,84,117,0,168,197,228,51,3,80,185,196,185,171,3,32,85,147,219,197,41,160,6,145,68,106,153,205,125,75,65,36,167,191,200,37,
156,39,137,50,179,98,145,144,114,186,251,150,28,100,121,1,13,163,12,217,202,160,85,37,205,223,164,206,253,41,191,206,46,252,87,92,14,99,236,87,237,170,217,187,202,83,131,131,
203,153,59,182,125,203,136,57,240,173,43,202,188,18,93,130,76,113,199,48,11,197,110,180,66,45,166,180,94,125,157,79,1,176,52,227,186,179,73,174,38,199,100,0,26,52,108,143,
115,238,91,10,162,73,253,85,62,232,167,142,243,77,122,32,164,125,154,205,61,214,68,226,188,84,135,109,101,191,156,140,54,200,128,249,213,67,175,153,161,117,4,140,173,237,82,73,
82,200,222,126,188,156,82,135,5,39,172,155,103,217,39,50,49,179,37,186,102,239,232,102,161,196,1,168,181,251,166,133,96,75,176,192,84,53,57,6,192,70,71,76,251,121,111,41,
192,133,81,4,201,225,78,133,136,29,51,19,162,152,235,176,81,53,136,151,118,5,163,3,236,49,176,157,72,138,106,35,214,33,158,151,218,219,130,150,36,14,8,101,35,19,49,51,
37,186,102,239,252,209,44,92,226,142,18,140,67,161,245,230,166,170,201,185,233,20,208,142,121,2,251,188,183,20,28,118,114,168,254,240,47,12,150,153,131,93,153,34,68,153,174,195,
118,120,160,4,69,165,163,80,20,172,38,159,81,164,204,138,231,7,14,157,150,40,216,40,17,207,63,161,173,47,255,192,113,244,239,232,81,201,75,194,81,2,164,164,65,10,79,85,
147,115,223,103,40,254,201,106,159,69,12,206,121,75,65,154,164,46,164,234,227,193,137,17,152,43,19,162,76,215,97,251,207,14,185,84,144,226,253,105,142,210,222,19,217,230,114,66,
29,250,181,124,163,59,224,100,255,197,239,161,95,47,160,192,29,37,96,240,29,110,41,51,213,228,220,42,197,63,26,96,211,122,222,91,10,14,225,39,254,195,84,106,155,103,125,206,
57,102,231,253,114,28,64,239,116,235,211,195,253,173,230,252,54,239,213,77,55,226,221,54,2,8,234,188,222,128,156,80,167,44,123,194,29,16,128,48,188,192,238,137,234,91,100,103,
229,159,182,6,21,219,47,0,60,200,70,220,171,70,92,138,201,52,231,165,137,229,231,215,121,104,97,83,127,73,160,113,30,44,131,246,117,214,46,197,18,101,110,215,89,124,183,5,
205,197,157,224,82,126,27,174,81,249,203,151,195,95,110,33,136,217,123,91,228,132,58,101,111,212,4,209,149,187,134,169,188,218,111,96,202,106,99,224,167,47,89,153,152,228,133,243,
32,26,61,16,162,227,179,134,74,61,42,204,124,151,62,109,235,157,193,122,80,166,235,165,247,234,40,255,228,146,11,97,47,179,228,152,241,186,193,155,61,70,43,200,82,189,60,142,
113,62,33,45,92,112,19,189,58,51,4,149,149,49,40,40,169,231,29,35,55,151,103,55,109,116,234,37,144,218,41,90,111,210,227,245,190,151,30,189,222,93,101,42,161,14,186,118,
254,26,217,195,201,178,186,27,126,175,101,72,28,68,247,146,17,148,71,23,168,221,86,41,145,40,181,118,248,106,58,191,65,189,124,217,9,53,223,39,198,167,45,227,28,41,141,186,
89,150,115,71,242,143,41,64,91,55,205,151,71,199,160,4,129,229,139,68,115,222,204,179,184,35,131,104,152,217,112,78,203,72,209,236,60,248,246,227,240,27,83,159,28,152,22,77,
72,172,17,88,158,78,239,218,216,61,24,181,202,49,100,111,79,243,138,29,13,115,66,29,60,159,121,24,251,244,247,91,238,169,45,186,105,8,0,148,53,77,123,137,19,186,87,79,
195,240,8,15,24,218,109,196,43,15,15,149,217,198,26,172,202,73,205,253,128,230,149,4,0,2,254,232,218,187,166,166,160,163,61,86,179,172,186,137,72,92,75,39,222,29,189,28,
238,46,8,222,164,42,35,12,25,16,77,135,12,103,118,158,228,104,25,41,80,186,139,152,157,151,107,214,169,154,238,120,63,18,171,190,190,41,35,0,216,239,252,198,172,67,116,223,
209,168,66,238,242,146,19,234,92,79,37,124,224,131,86,74,116,237,119,235,240,109,199,184,53,230,190,175,249,236,152,89,138,251,227,142,118,44,15,167,229,34,86,188,135,198,253,196,
237,158,220,207,52,232,182,233,253,175,51,220,186,3,70,133,227,28,75,167,224,239,193,221,61,150,181,218,235,170,217,242,190,164,137,111,191,36,210,157,60,238,199,81,168,158,240,71,
233,43,115,174,174,42,164,76,135,76,238,189,200,206,75,243,44,130,205,183,150,56,112,69,150,243,219,208,10,143,21,174,223,209,125,231,104,195,3,247,240,63,124,181,156,80,167,184,
14,180,26,128,84,164,73,128,39,49,146,60,127,15,255,64,25,224,102,241,193,84,181,251,117,70,158,123,96,216,180,80,237,249,117,86,121,138,117,62,98,183,149,233,134,178,61,78,
147,82,47,217,255,137,29,9,57,157,145,28,42,66,188,172,185,155,166,128,212,98,167,23,177,98,72,54,69,92,207,177,24,43,6,70,161,186,200,9,222,52,188,148,161,201,4,184,
129,186,108,225,153,244,33,157,2,129,192,61,176,26,230,76,240,131,149,101,55,242,219,246,203,103,183,253,80,32,128,123,209,138,195,9,208,93,239,57,183,20,115,66,29,240,160,111,
252,120,18,99,171,64,241,110,68,13,37,186,10,128,126,207,66,18,49,153,181,72,57,0,85,219,195,84,235,245,184,215,59,126,105,77,55,182,95,192,60,37,167,153,10,90,4,33,
220,29,167,213,24,16,240,103,151,251,1,134,11,148,195,139,96,85,247,90,112,91,12,20,238,35,150,227,13,0,84,11,143,148,55,113,200,26,164,70,135,76,150,7,123,117,18,31,
188,163,98,253,235,61,198,202,197,203,177,132,114,126,219,94,157,167,155,48,13,31,236,6,174,234,155,18,234,112,89,0,222,135,57,236,105,118,66,63,150,141,164,41,116,55,213,69,
65,103,90,226,61,199,196,155,182,53,184,189,29,108,107,172,241,209,183,217,122,109,108,172,127,52,111,64,86,52,132,45,27,42,80,237,215,214,75,144,203,253,113,14,96,1,179,248,
5,168,188,240,79,149,61,47,178,160,108,132,42,55,188,99,188,233,112,82,162,113,200,148,189,64,160,83,121,161,67,137,234,86,50,81,174,144,236,25,213,30,167,131,41,165,252,54,
19,19,33,2,109,17,234,102,78,168,163,210,15,5,154,103,67,78,155,67,75,147,189,142,4,173,154,223,160,188,198,27,88,160,61,154,124,29,229,42,149,220,232,149,53,158,170,7,
251,181,71,108,216,122,45,16,161,233,22,55,229,182,94,185,37,239,122,74,198,202,121,116,143,5,42,68,3,227,247,89,246,79,238,54,128,250,26,141,6,66,168,36,222,148,70,93,
26,202,53,245,227,117,24,196,36,79,90,110,122,26,0,57,191,45,100,222,236,80,28,150,111,39,212,45,193,58,149,161,175,116,193,248,209,131,18,57,121,200,229,238,75,168,59,28,
148,46,158,46,3,129,218,253,5,107,140,11,165,147,252,24,27,174,39,140,187,136,23,89,112,4,76,65,241,158,68,87,84,59,173,31,176,33,238,168,71,249,176,228,142,88,255,136,
21,70,203,254,115,164,213,245,156,145,121,83,7,96,106,40,215,183,172,52,201,211,162,43,31,210,219,73,254,214,225,49,149,21,98,53,68,112,95,29,58,232,126,0,16,144,25,78,
159,158,78,233,222,167,235,49,222,236,175,175,247,155,113,214,120,25,63,62,142,94,176,161,184,216,222,52,11,250,3,202,196,91,139,244,74,219,96,8,158,85,179,84,174,232,133,176,
119,235,96,38,91,198,87,48,234,158,219,142,137,55,157,250,86,204,212,80,126,39,248,16,13,2,166,57,208,136,55,111,84,196,120,253,88,163,69,133,176,183,120,224,234,213,140,232,
230,97,96,160,13,225,238,18,14,80,110,52,225,27,130,184,239,139,7,21,34,190,90,162,241,241,209,72,204,54,20,99,215,29,253,60,89,49,229,140,74,219,203,33,88,6,215,21,
83,113,236,93,180,39,44,222,101,54,9,255,66,178,231,116,122,144,35,132,81,86,123,148,38,180,7,138,79,76,115,160,17,111,87,9,62,33,119,239,186,158,123,88,49,145,95,241,
128,1,158,144,124,43,184,206,227,41,242,87,104,225,46,241,168,47,225,159,246,253,6,41,152,249,205,168,252,188,161,239,186,83,79,95,99,94,165,109,94,81,249,123,133,176,57,125,
123,27,225,73,100,211,72,131,116,129,177,23,196,193,53,165,7,57,218,69,140,62,170,83,154,64,238,144,92,239,162,252,186,197,226,115,18,165,155,20,213,105,125,141,212,176,153,134,
69,199,211,172,180,158,83,84,209,67,173,173,252,129,91,85,192,235,47,170,70,67,100,2,242,166,34,204,94,152,106,122,212,228,231,13,125,215,29,147,180,191,105,225,218,77,127,248,
25,141,88,230,244,37,174,65,81,202,161,187,147,167,65,62,23,159,97,249,135,193,53,165,7,173,12,170,168,114,118,192,154,89,97,62,168,250,81,119,75,36,138,244,119,126,163,108,
6,94,126,104,240,18,171,45,81,140,147,170,173,241,26,42,109,151,164,116,84,130,147,127,188,182,184,197,7,198,51,43,142,164,172,26,213,203,104,176,93,136,237,145,241,180,215,245,
48,173,77,140,17,203,148,190,139,115,152,140,191,115,52,155,101,121,116,9,107,36,136,167,74,160,69,29,74,166,244,160,245,15,60,233,102,212,21,174,93,136,250,82,240,212,145,170,
236,108,80,79,86,121,194,61,253,14,103,59,198,138,1,49,189,29,115,36,65,24,63,61,160,94,191,100,42,138,99,59,176,82,229,92,14,41,247,27,2,56,48,149,35,40,89,191,
203,60,192,214,50,70,43,43,143,203,131,53,216,215,70,59,6,173,63,111,104,190,43,255,3,84,224,254,17,139,88,102,244,81,239,219,37,161,201,6,152,205,215,56,76,147,212,248,
65,188,113,90,74,15,130,79,229,34,117,238,198,197,236,10,174,105,25,225,41,214,97,46,217,45,176,234,189,104,121,36,187,27,43,12,128,196,245,200,77,249,166,245,136,218,207,146,
92,20,199,214,43,13,67,145,64,147,127,179,226,216,11,245,111,65,153,17,75,48,118,213,148,78,167,91,191,91,35,173,27,89,99,193,149,185,193,168,10,221,176,14,203,137,18,43,
223,192,104,5,121,69,105,225,127,194,244,253,15,60,74,150,134,87,162,105,131,204,58,225,52,22,94,193,96,121,166,234,230,84,122,16,110,163,180,243,124,139,165,119,4,140,47,165,
11,10,175,72,169,56,42,211,45,96,54,1,58,192,239,248,78,154,222,30,123,185,119,254,172,132,175,221,89,146,139,226,128,14,89,42,230,170,172,134,162,51,160,182,175,11,116,73,
150,0,144,178,229,36,235,119,235,53,121,150,202,161,76,68,13,254,237,176,11,215,246,174,201,249,97,138,234,200,140,86,156,119,244,17,250,103,243,141,155,95,87,122,242,139,9,0,
140,230,170,212,115,164,154,234,175,206,0,176,50,136,147,19,174,124,168,229,223,160,201,28,143,215,204,241,57,138,117,92,209,198,85,248,121,172,211,121,162,170,21,16,141,161,98,59,
192,215,30,107,100,208,199,130,122,75,166,162,56,160,188,197,211,36,205,66,141,171,32,245,99,197,107,144,73,18,0,83,233,116,220,250,181,107,207,209,123,186,118,210,119,216,164,171,
240,13,160,84,161,183,253,214,35,104,69,112,248,11,153,225,143,80,126,182,252,235,202,60,0,112,158,199,62,96,66,20,66,51,153,95,76,123,103,243,30,250,118,124,159,96,73,68,
82,124,14,221,141,29,227,127,84,209,73,101,179,180,94,121,72,202,22,90,89,101,154,160,92,32,7,108,184,247,195,211,24,26,44,116,127,252,105,24,218,219,84,100,0,166,178,229,
184,245,235,104,231,19,172,124,28,200,128,4,139,229,135,62,94,69,114,232,34,22,180,194,7,248,27,186,224,15,160,130,188,189,245,122,142,215,116,0,124,2,0,154,7,26,121,227,
86,202,84,226,19,218,202,113,238,136,85,39,97,183,88,146,164,248,28,238,125,179,176,0,255,67,85,141,206,247,144,47,153,42,251,4,42,233,67,24,67,100,219,221,6,76,192,100,
185,209,142,204,0,32,165,211,113,235,23,108,211,151,22,5,192,209,238,140,158,143,145,8,48,126,75,31,52,26,149,211,10,60,65,117,99,246,199,50,166,53,109,128,204,242,62,167,
15,62,150,170,37,133,30,12,51,229,210,171,102,8,155,233,211,137,79,174,73,244,111,59,98,29,60,47,101,27,221,175,75,166,202,62,187,117,114,211,201,179,183,81,238,170,31,13,
244,180,229,34,50,0,114,58,157,97,253,194,104,95,148,105,9,24,239,85,57,252,235,55,173,131,236,122,62,45,214,144,31,129,86,116,82,114,241,239,126,96,21,134,237,26,70,45,
29,176,146,219,148,190,48,238,216,68,117,61,216,203,82,100,214,191,169,100,56,29,63,88,201,9,189,92,168,34,42,188,251,126,202,202,153,163,205,242,82,182,95,208,253,186,36,23,
197,193,114,242,232,117,163,247,193,50,13,28,12,239,171,32,107,36,0,164,108,57,201,250,221,232,148,79,126,87,240,213,11,240,117,199,103,201,56,92,227,26,104,136,254,36,70,24,
218,122,84,1,112,188,143,248,203,11,113,109,180,140,223,2,127,97,240,156,230,49,164,57,45,52,151,197,174,181,218,119,247,56,114,187,188,142,59,42,19,172,194,187,175,198,118,50,
249,235,46,236,90,90,132,101,194,204,92,146,139,226,120,154,228,186,113,245,144,61,130,47,146,45,83,121,25,148,178,229,12,235,87,34,118,111,252,209,234,140,127,242,50,149,77,102,
229,57,70,84,189,227,189,151,181,35,197,178,41,165,195,173,154,212,104,203,182,133,14,173,97,188,59,217,206,162,24,67,150,211,66,115,117,28,237,84,170,129,81,137,187,162,142,187,
136,47,69,130,105,69,3,253,117,23,42,173,153,139,82,14,122,181,36,23,197,177,140,155,123,187,94,119,7,85,47,217,50,221,122,101,190,56,202,186,82,182,28,88,191,45,250,78,
17,153,88,203,58,207,65,91,167,5,34,68,221,153,63,143,174,120,65,137,24,41,203,248,5,176,133,161,21,1,254,203,246,9,153,176,225,134,49,220,179,235,145,54,44,29,189,28,
206,131,14,229,209,235,184,139,10,239,128,77,225,222,109,188,238,130,3,0,162,25,23,152,37,83,81,28,139,135,101,195,77,91,166,91,78,122,108,204,100,203,217,157,236,84,38,246,
107,77,25,56,150,235,140,250,120,175,241,226,135,252,5,37,98,164,192,94,1,203,18,186,95,9,56,157,140,163,53,194,82,179,212,108,161,89,215,104,110,220,157,214,206,178,75,165,
72,14,69,143,168,227,190,172,87,120,199,122,46,200,117,236,117,23,2,128,240,49,141,25,250,175,188,103,200,160,146,123,29,244,169,106,25,3,199,210,133,218,49,214,250,172,42,105,
184,219,195,55,94,136,23,148,232,35,5,154,8,246,16,186,63,104,137,152,48,125,184,19,191,83,236,77,175,63,188,87,13,230,48,74,177,237,76,81,199,221,168,240,14,223,48,166,
174,39,19,0,142,118,119,157,237,13,90,148,29,61,109,210,200,146,19,218,132,24,39,253,138,62,83,13,105,187,102,51,137,93,131,74,225,117,208,167,42,141,22,196,94,56,218,233,
114,30,141,219,149,193,113,249,248,20,165,23,123,65,137,49,82,32,79,113,82,65,247,219,5,86,38,126,2,83,128,110,65,169,217,124,164,200,86,203,149,65,158,69,100,1,78,67,
164,95,212,113,55,42,188,71,242,71,37,58,141,38,28,216,36,173,123,238,88,227,187,195,227,29,17,4,8,61,103,174,13,24,158,110,100,69,30,39,253,138,62,83,117,105,43,134,
80,23,187,58,149,186,215,65,159,170,118,237,82,235,171,76,231,252,104,160,16,2,50,59,119,180,178,2,123,65,137,67,234,40,7,32,159,126,226,179,107,194,149,36,28,195,162,168,
212,65,193,113,63,148,78,168,139,214,168,227,110,84,120,143,116,233,194,195,94,119,1,95,28,85,13,133,112,233,160,84,30,87,203,212,89,189,227,131,57,230,67,11,250,61,125,146,
207,3,45,250,56,233,87,244,153,170,75,91,99,8,13,177,203,169,212,189,14,250,84,181,107,71,213,24,70,131,1,0,29,106,174,239,159,16,173,197,125,114,248,130,18,207,44,0,
197,114,170,203,122,108,215,107,218,103,155,217,36,142,46,48,0,27,51,247,193,254,182,17,189,202,2,150,244,10,239,252,13,108,161,73,52,52,163,9,218,181,100,73,75,97,24,228,
78,163,54,32,131,26,218,49,117,210,162,10,187,49,78,226,138,62,83,117,105,107,12,161,16,187,58,149,186,215,65,159,170,150,241,16,84,115,88,148,0,218,147,60,26,10,160,9,
49,0,248,11,74,86,245,145,242,95,160,146,8,196,230,155,36,207,99,40,185,51,5,198,208,195,117,219,149,176,229,239,9,42,183,135,190,202,29,203,233,145,38,29,139,159,55,233,
19,114,114,244,128,182,77,246,36,143,152,232,227,164,95,49,102,170,144,182,250,16,234,98,87,167,82,247,58,224,72,209,162,72,142,182,230,171,97,137,71,91,175,223,109,98,228,29,
128,244,113,79,247,7,188,99,109,72,195,148,233,139,73,236,160,115,105,52,3,54,26,241,76,34,142,191,224,116,114,249,169,227,197,239,210,207,157,250,6,182,126,230,190,111,210,87,
185,47,89,198,199,201,118,33,129,8,239,105,89,146,199,237,46,80,136,110,107,113,232,166,62,78,250,21,99,166,10,105,171,15,161,46,118,117,42,117,175,3,78,77,42,171,61,183,
37,16,223,192,180,158,102,225,38,119,73,133,86,174,82,42,178,248,56,81,200,28,151,12,100,92,243,107,214,132,219,17,72,178,33,113,59,94,54,246,203,70,216,129,93,251,137,19,
239,28,84,110,187,86,125,118,129,134,134,231,198,250,97,156,81,229,14,122,13,182,64,182,115,147,70,138,246,174,227,85,82,77,130,218,136,219,26,79,120,87,31,39,253,138,62,83,
117,105,171,15,161,46,118,117,42,117,175,131,96,0,64,224,64,27,209,130,32,158,143,86,159,189,213,53,210,31,132,254,192,198,203,198,95,74,82,239,226,201,181,211,160,111,75,178,
31,140,162,65,151,213,133,231,142,131,18,244,62,26,199,34,152,96,158,128,197,10,231,23,126,170,65,176,85,200,56,67,254,66,145,189,20,44,247,252,213,142,131,106,34,191,65,6,
252,126,164,155,0,23,101,4,69,31,39,253,138,62,83,117,105,107,12,161,46,118,61,221,214,7,165,201,26,105,191,209,146,112,122,229,72,232,49,167,102,221,41,174,172,174,152,3,
124,2,148,121,85,85,161,111,57,176,236,68,38,163,195,160,199,97,89,223,133,142,83,146,240,213,194,239,180,218,171,93,43,145,120,249,121,248,124,178,47,118,37,64,52,213,247,88,
233,88,5,172,201,235,61,204,232,225,89,59,198,25,242,23,46,218,48,5,108,150,49,79,1,223,129,85,96,135,206,156,104,175,127,232,160,117,161,180,8,219,217,29,190,190,141,104,
228,7,190,74,104,85,44,237,72,247,234,248,173,77,201,165,240,210,129,94,115,10,27,206,193,11,50,44,127,183,212,130,117,120,93,57,7,230,197,87,193,161,194,98,25,55,176,134,
80,185,249,62,254,168,11,146,174,201,145,10,86,25,60,118,80,138,23,104,76,32,220,226,187,18,182,222,203,30,85,164,97,124,173,195,246,30,205,232,17,89,59,198,153,190,53,102,
145,194,118,236,19,49,235,108,186,254,163,87,175,217,92,230,35,231,48,236,48,86,119,99,211,33,244,32,233,253,135,159,239,1,240,210,137,62,102,214,121,246,216,154,229,241,108,163,
141,7,235,205,199,27,53,192,24,0,208,78,22,243,113,102,151,192,170,64,73,218,107,15,173,107,253,15,23,26,240,189,208,248,241,172,120,137,2,154,239,74,216,216,75,60,104,9,
85,235,159,164,231,127,239,149,155,96,160,187,127,88,127,184,141,116,39,54,211,101,51,19,204,186,71,166,212,195,89,243,5,109,60,247,61,137,97,112,145,0,192,115,219,28,135,34,
163,231,203,147,226,233,195,190,32,9,171,143,174,178,112,89,155,98,113,253,10,121,173,127,179,155,0,128,211,239,163,34,128,122,208,217,177,101,26,28,195,14,87,236,158,31,86,30,
204,230,161,250,239,178,219,227,94,230,54,250,15,54,151,215,182,89,13,181,214,251,253,221,240,78,148,54,2,89,201,100,189,108,102,98,216,12,83,234,113,46,223,227,78,143,179,245,
118,147,132,43,2,0,197,131,249,56,203,46,239,126,40,232,254,47,140,211,146,226,109,157,215,218,145,64,4,228,56,13,47,105,177,240,18,99,112,12,59,92,113,104,205,59,170,52,
58,122,183,205,30,125,193,245,67,243,158,78,251,173,247,230,29,117,63,184,187,47,163,85,106,132,166,175,73,158,191,169,139,57,75,169,254,64,243,244,224,160,169,13,134,82,111,239,
101,146,168,239,237,214,143,107,201,250,30,125,27,226,107,219,161,252,183,15,158,51,148,175,228,89,232,200,156,193,49,236,112,199,123,162,94,194,221,22,56,169,93,38,96,81,216,122,
173,118,142,112,211,101,235,181,220,206,227,82,231,126,136,145,28,138,124,48,208,39,160,22,48,139,212,245,20,203,191,149,88,56,178,141,150,208,98,186,188,161,212,59,181,34,203,88,
216,13,251,162,84,112,129,204,254,239,211,143,182,64,173,117,83,32,36,73,85,96,41,62,65,31,28,195,14,7,176,106,101,212,140,209,179,221,98,165,209,106,229,35,166,184,55,154,
39,168,253,169,71,213,247,35,246,74,211,138,14,128,163,157,168,140,54,199,151,198,43,220,21,74,183,161,212,59,91,249,102,54,86,223,83,254,167,143,165,213,62,174,11,218,203,144,
190,113,84,122,203,144,62,56,134,246,4,203,207,173,118,3,195,11,162,249,169,133,241,78,112,165,123,138,15,237,214,73,163,130,216,68,19,15,193,83,80,62,184,14,223,32,69,52,
170,222,223,2,203,138,197,251,110,188,121,70,9,169,38,165,222,25,241,168,147,255,121,250,49,119,152,23,241,42,132,20,249,92,178,184,116,59,220,174,101,74,13,52,5,109,189,220,
105,25,43,49,192,212,46,103,240,161,213,126,182,74,139,226,4,203,217,51,90,104,128,233,240,187,147,16,53,171,153,75,204,177,173,252,111,59,62,5,0,21,157,158,166,191,56,147,
217,225,118,181,63,160,206,0,91,36,216,29,161,52,252,57,24,178,17,92,85,123,195,32,181,122,170,165,166,71,249,215,28,75,38,182,151,207,65,209,177,217,133,211,103,162,204,168,
173,220,198,94,209,23,96,27,59,91,9,28,252,139,232,255,127,234,221,227,127,19,0,189,110,182,135,187,128,69,201,108,209,230,149,207,150,237,220,177,41,157,49,191,113,232,95,13,
128,94,55,155,134,141,131,64,23,37,179,69,155,87,62,155,103,82,78,228,4,170,127,43,0,122,221,108,157,96,94,50,91,180,121,229,179,121,78,5,47,11,76,255,55,201,188,57,
83,64,148,56,163,149,42,121,45,113,172,113,38,218,162,242,217,28,183,146,226,165,135,231,223,45,3,48,68,20,189,131,180,82,37,127,123,125,100,75,106,251,126,253,191,45,4,255,
191,95,5,22,0,44,0,88,0,176,0,96,1,192,2,128,5,0,11,0,22,0,44,0,88,0,176,0,96,1,192,2,128,5,0,11,0,22,0,44,0,88,0,176,0,96,1,192,
2,128,5,0,11,0,22,0,44,0,88,0,176,0,96,1,192,2,128,5,0,11,0,22,0,44,0,88,0,176,0,96,1,192,2,128,5,0,11,0,22,0,44,0,88,0,176,0,
96,1,192,2,128,5,0,11,0,22,0,44,0,88,0,176,0,96,1,192,2,128,5,0,11,0,22,0,44,0,88,0,176,0,96,1,192,2,128,5,0,11,0,22,0,44,0,88,
0,176,0,96,1,192,2,128,5,0,11,0,22,0,44,0,88,0,176,0,96,1,192,2,128,5,0,11,0,22,0,44,0,88,0,176,0,96,1,192,2,128,5,0,11,0,254,37,
199,255,1,140,84,153,133,3,106,34,167,0,0,0,0,73,69,78,68,174,66,96,130
};

View file

@ -0,0 +1,222 @@
// USAGE:
/*
1) Compile this cpp file
2) In your main.cpp just add (without including any additional file: there's no header!):
extern bool ImGuiSaveStyle(const char* filename,const ImGuiStyle& style);
extern bool ImGuiLoadStyle(const char* filename,ImGuiStyle& style);
3) Use them together with ImGui::GetStyle() to save/load the current style.
ImGui::GetStyle() returns a reference of the current style that can be set/get.
Please note that other style options are not globally serializable because they are "window flags",
that must be set on a per-window basis (for example border,titlebar,scrollbar,resizable,movable,per-window alpha).
To edit and save a style, you can use the default ImGui example and append to the "Debug" window the following code:
ImGui::Text("\n");
ImGui::Text("Please modify the current style in:");
ImGui::Text("ImGui Test->Window Options->Style Editor");
static bool loadCurrentStyle = false;
static bool saveCurrentStyle = false;
static bool resetCurrentStyle = false;
loadCurrentStyle = ImGui::Button("Load Saved Style");
saveCurrentStyle = ImGui::Button("Save Current Style");
resetCurrentStyle = ImGui::Button("Reset Current Style");
if (loadCurrentStyle) {
if (!ImGuiLoadStyle("./myimgui.style",ImGui::GetStyle())) {
fprintf(stderr,"Warning: \"./myimgui.style\" not present.\n");
}
}
if (saveCurrentStyle) {
if (!ImGuiSaveStyle("./myimgui.style",ImGui::GetStyle())) {
fprintf(stderr,"Warning: \"./myimgui.style\" cannot be saved.\n");
}
}
if (resetCurrentStyle) ImGui::GetStyle() = ImGuiStyle();
*/
#include <imgui.h>
// From <imgui.cpp>:--------------------------------------------------------
#include <stdio.h> // vsnprintf
#define IM_ARRAYSIZE(_ARR) ((int)(sizeof(_ARR)/sizeof(*_ARR)))
static size_t ImFormatString(char* buf, size_t buf_size, const char* fmt, ...)
{
va_list args;
va_start(args, fmt);
int w = vsnprintf(buf, buf_size, fmt, args);
va_end(args);
buf[buf_size-1] = 0;
return (w == -1) ? buf_size : (size_t)w;
}
//---------------------------------------------------------------------------
#include <string.h>
bool ImGuiSaveStyle(const char* filename,const ImGuiStyle& style)
{
// Write .style file
FILE* f = fopen(filename, "wt");
if (!f) return false;
fprintf(f, "[Alpha]\n%1.3f\n", style.Alpha);
fprintf(f, "[WindowPadding]\n%1.3f %1.3f\n", style.WindowPadding.x,style.WindowPadding.y);
fprintf(f, "[WindowMinSize]\n%1.3f %1.3f\n", style.WindowMinSize.x,style.WindowMinSize.y);
fprintf(f, "[FramePadding]\n%1.3f %1.3f\n", style.FramePadding.x,style.FramePadding.y);
fprintf(f, "[ItemSpacing]\n%1.3f %1.3f\n", style.ItemSpacing.x,style.ItemSpacing.y);
fprintf(f, "[ItemInnerSpacing]\n%1.3f %1.3f\n", style.ItemInnerSpacing.x,style.ItemInnerSpacing.y);
fprintf(f, "[TouchExtraPadding]\n%1.3f %1.3f\n", style.TouchExtraPadding.x,style.TouchExtraPadding.y);
fprintf(f, "[AutoFitPadding]\n%1.3f %1.3f\n", style.AutoFitPadding.x,style.AutoFitPadding.y);
fprintf(f, "[WindowFillAlphaDefault]\n%1.3f\n", style.WindowFillAlphaDefault);
fprintf(f, "[WindowRounding]\n%1.3f\n", style.WindowRounding);
fprintf(f, "[TreeNodeSpacing]\n%1.3f\n", style.TreeNodeSpacing);
fprintf(f, "[ColumnsMinSpacing]\n%1.3f\n", style.ColumnsMinSpacing);
fprintf(f, "[ScrollBarWidth]\n%1.3f\n", style.ScrollBarWidth);
for (size_t i = 0; i != ImGuiCol_COUNT; i++)
{
const ImVec4& c = style.Colors[i];
fprintf(f, "[%s]\n", ImGui::GetStyleColorName(i));//ImGuiColNames[i]);
fprintf(f, "%1.3f %1.3f %1.3f %1.3f\n",c.x,c.y,c.z,c.w);
}
fprintf(f,"\n");
fclose(f);
return true;
}
bool ImGuiLoadStyle(const char* filename,ImGuiStyle& style)
{
// Load .style file
if (!filename) return false;
// Load file into memory
FILE* f;
if ((f = fopen(filename, "rt")) == NULL) return false;
if (fseek(f, 0, SEEK_END)) {
fclose(f);
return false;
}
const long f_size_signed = ftell(f);
if (f_size_signed == -1) {
fclose(f);
return false;
}
size_t f_size = (size_t)f_size_signed;
if (fseek(f, 0, SEEK_SET)) {
fclose(f);
return false;
}
char* f_data = (char*)ImGui::MemAlloc(f_size+1);
f_size = fread(f_data, 1, f_size, f); // Text conversion alter read size so let's not be fussy about return value
fclose(f);
if (f_size == 0) {
ImGui::MemFree(f_data);
return false;
}
f_data[f_size] = 0;
// Parse file in memory
char name[128];name[0]='\0';
const char* buf_end = f_data + f_size;
for (const char* line_start = f_data; line_start < buf_end; )
{
const char* line_end = line_start;
while (line_end < buf_end && *line_end != '\n' && *line_end != '\r')
line_end++;
if (name[0]=='\0' && line_start[0] == '[' && line_end > line_start && line_end[-1] == ']')
{
ImFormatString(name, IM_ARRAYSIZE(name), "%.*s", line_end-line_start-2, line_start+1);
//fprintf(stderr,"name: %s\n",name); // dbg
}
else if (name[0]!='\0')
{
float *pf[4]= {0,0,0,0};
int npf = 0;
// parsing 'name' here by filling the fields above
{
if (strcmp(name, "Alpha")==0) {npf=1;pf[0]=&style.Alpha;}
else if (strcmp(name, "WindowPadding")==0) {npf=2;pf[0]=&style.WindowPadding.x;pf[1]=&style.WindowPadding.y;}
else if (strcmp(name, "WindowMinSize")==0) {npf=2;pf[0]=&style.WindowMinSize.x;pf[1]=&style.WindowMinSize.y;}
else if (strcmp(name, "FramePadding")==0) {npf=2;pf[0]=&style.FramePadding.x;pf[1]=&style.FramePadding.y;}
else if (strcmp(name, "ItemSpacing")==0) {npf=2;pf[0]=&style.ItemSpacing.x;pf[1]=&style.ItemSpacing.y;}
else if (strcmp(name, "ItemInnerSpacing")==0) {npf=2;pf[0]=&style.ItemInnerSpacing.x;pf[1]=&style.ItemInnerSpacing.y;}
else if (strcmp(name, "TouchExtraPadding")==0) {npf=2;pf[0]=&style.TouchExtraPadding.x;pf[1]=&style.TouchExtraPadding.y;}
else if (strcmp(name, "AutoFitPadding")==0) {npf=2;pf[0]=&style.AutoFitPadding.x;pf[1]=&style.AutoFitPadding.y;}
else if (strcmp(name, "WindowFillAlphaDefault")==0) {npf=1;pf[0]=&style.WindowFillAlphaDefault;}
else if (strcmp(name, "WindowRounding")==0) {npf=1;pf[0]=&style.WindowRounding;}
else if (strcmp(name, "TreeNodeSpacing")==0) {npf=1;pf[0]=&style.TreeNodeSpacing;}
else if (strcmp(name, "ColumnsMinSpacing")==0) {npf=1;pf[0]=&style.ColumnsMinSpacing;}
else if (strcmp(name, "ScrollBarWidth")==0) {npf=1;pf[0]=&style.ScrollBarWidth;}
// all the colors here
else {
for (int j=0;j<ImGuiCol_COUNT;j++) {
if (strcmp(name,ImGui::GetStyleColorName(j))==0) {
npf = 4;
ImVec4& color = style.Colors[j];
pf[0]=&color.x;pf[1]=&color.y;pf[2]=&color.z;pf[3]=&color.w;
break;
}
}
}
}
//fprintf(stderr,"name: %s npf=%d\n",name,npf); // dbg
// parsing values here and filling pf[]
float x,y,z,w;
switch (npf) {
case 1:
if (sscanf(line_start, "%f", &x) == npf) {
*pf[0] = x;
}
else fprintf(stderr,"Warning in ImGui::LoadStyle(\"%s\"): skipped [%s] (parsing error).\n",filename,name);
break;
case 2:
if (sscanf(line_start, "%f %f", &x, &y) == npf) {
*pf[0] = x;*pf[1] = y;
}
else fprintf(stderr,"Warning in ImGui::LoadStyle(\"%s\"): skipped [%s] (parsing error).\n",filename,name);
break;
case 3:
if (sscanf(line_start, "%f %f %f", &x, &y, &z) == npf) {
*pf[0] = x;*pf[1] = y;*pf[2] = z;
}
else fprintf(stderr,"Warning in ImGui::LoadStyle(\"%s\"): skipped [%s] (parsing error).\n",filename,name);
break;
case 4:
if (sscanf(line_start, "%f %f %f %f", &x, &y, &z, &w) == npf) {
*pf[0] = x;*pf[1] = y;*pf[2] = z;*pf[3] = w;
}
else fprintf(stderr,"Warning in ImGui::LoadStyle(\"%s\"): skipped [%s] (parsing error).\n",filename,name);
break;
default:
fprintf(stderr,"Warning in ImGui::LoadStyle(\"%s\"): skipped [%s] (unknown field).\n",filename,name);
break;
}
/*
// Same reference code from <imgui.cpp> to help parsing
float x, y;
int i;
if (sscanf(line_start, "Pos=%f,%f", &x, &y) == 2)
settings->Pos = ImVec2(x, y);
else if (sscanf(line_start, "Size=%f,%f", &x, &y) == 2)
settings->Size = ImMax(ImVec2(x, y), g.Style.WindowMinSize);
else if (sscanf(line_start, "Collapsed=%d", &i) == 1)
settings->Collapsed = (i != 0);
*/
//---------------------------------------------------------------------------------
name[0]='\0'; // mandatory
}
line_start = line_end+1;
}
// Release memory
ImGui::MemFree(f_data);
return true;
}

View file

@ -0,0 +1,190 @@
//#define IMIMPL_USE_GLEW
// Only one of these is mandatory:
//#define IMIMPL_USE_GLFW3
//#define IMIMPL_USE_GLUT
//#define IMIMPL_USE_SDL2
//#define IMIMPL_USE_WINAPI // IMIMPL_USE_GLEW above might be mandatory here
// These are optional definitions that nobody will ever use (all undefined by default):
//#define IMIMPL_SHADER_NONE // no shaders at all, and no vertex buffer object as well (minimal implementation).
//#define IMIMPL_NUM_ROUND_ROBIN_VERTEX_BUFFERS // undefined (=default) => 1. Memory usage vs performance. When defined MUST BE A VALUE >=1.
//#define IMIMPL_SHADER_GL3 // shader uses openGL 3.3 (glsl #version 330)
//#define IMIMPL_SHADER_GLES // shader uses gles (and if IMIMPL_SHADER_GL3 is defined glsl #version 300 es)
#ifdef IMIMPL_USE_GLFW3
#include "ImImpl_Binding_Glfw3.h"
#elif defined(IMIMPL_USE_GLUT)
#include "ImImpl_Binding_Glut.h"
#elif defined(IMIMPL_USE_SDL2)
#include "ImImpl_Binding_SDL2.h"
#elif defined(IMIMPL_USE_WINAPI)
#include "ImImpl_Binding_WinAPI.h"
#endif
#define DEMO_CAN_LOAD_SAVE_STYLES // This definition needs imguistyleserializer.cpp to be compiled with the project too (no need to include anything)
#ifdef DEMO_CAN_LOAD_SAVE_STYLES
extern bool ImGuiSaveStyle(const char* filename,const ImGuiStyle& style);
extern bool ImGuiLoadStyle(const char* filename,ImGuiStyle& style);
#endif //DEMO_CAN_LOAD_SAVE_STYLES
void InitGL() // Mandatory
{
//fprintf(stderr,"InitGL();\n");
//ImGui::GetIO().FontAllowUserScaling = true;
#ifdef DEMO_CAN_LOAD_SAVE_STYLES
if (!ImGuiLoadStyle("./myimgui.style",ImGui::GetStyle())) {
fprintf(stderr,"Warning: \"./myimgui.style\" not present.\n");
}
#endif //DEMO_CAN_LOAD_SAVE_STYLES
}
void ResizeGL(int w,int h) // Mandatory
{
//fprintf(stderr,"ResizeGL(%d,%d);\n",w,h);
}
void DrawGL() // Mandatory
{
glClearColor(0.8f, 0.6f, 0.6f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
static bool show_test_window = true;
static bool show_another_window = false;
// 1. Show a simple window
{
// Tip: if we don't call ImGui::Begin()/ImGui::End() the widgets appears in a window automatically called "Debug"
// Me: However I've discovered that when I clamp the FPS to a low value (e.g.10), I have to catch double clicks manually in my binding to make them work.
// They work, but for some strange reasons only with windows properly set up through ImGui::Begin(...) and ImGui::End(...) (and whose name is NOT 'Debug').
// [Please remember that double clicking the titlebar of a window minimizes it]
// No problem with full frame rates.
static bool open = true;
ImGui::Begin("Debug ", &open, ImVec2(300,300)); // Try using 10 FPS and replacing the title with "Debug"...
static float f;
ImGui::Text("Hello, world!");
ImGui::SliderFloat("float", &f, 0.0f, 1.0f);
show_test_window ^= ImGui::Button("Test Window");
show_another_window ^= ImGui::Button("Another Window");
// Calculate and show framerate
static float ms_per_frame[120] = { 0 };
static int ms_per_frame_idx = 0;
static float ms_per_frame_accum = 0.0f;
ms_per_frame_accum -= ms_per_frame[ms_per_frame_idx];
ms_per_frame[ms_per_frame_idx] = ImGui::GetIO().DeltaTime * 1000.0f;
ms_per_frame_accum += ms_per_frame[ms_per_frame_idx];
ms_per_frame_idx = (ms_per_frame_idx + 1) % 120;
const float ms_per_frame_avg = ms_per_frame_accum / 120;
ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", ms_per_frame_avg, 1000.0f / ms_per_frame_avg);
# ifdef DEMO_CAN_LOAD_SAVE_STYLES
ImGui::Text("\n");
ImGui::Text("Please modify the current style in:");
ImGui::Text("ImGui Test->Window Options->Style Editor");
static bool loadCurrentStyle = false;
static bool saveCurrentStyle = false;
static bool resetCurrentStyle = false;
loadCurrentStyle = ImGui::Button("Load Saved Style");
saveCurrentStyle = ImGui::Button("Save Current Style");
resetCurrentStyle = ImGui::Button("Reset Current Style");
if (loadCurrentStyle) {
if (!ImGuiLoadStyle("./myimgui.style",ImGui::GetStyle())) {
fprintf(stderr,"Warning: \"./myimgui.style\" not present.\n");
}
}
if (saveCurrentStyle) {
if (!ImGuiSaveStyle("./myimgui.style",ImGui::GetStyle())) {
fprintf(stderr,"Warning: \"./myimgui.style\" cannot be saved.\n");
}
}
if (resetCurrentStyle) ImGui::GetStyle() = ImGuiStyle();
# endif //DEMO_CAN_LOAD_SAVE_STYLES
ImGui::End();
}
// 2. Show another simple window, this time using an explicit Begin/End pair
if (show_another_window)
{
ImGui::Begin("Another Window", &show_another_window, ImVec2(200,100));
ImGui::Text("Hello");
ImGui::End();
}
// 3. Show the ImGui test window. Most of the sample code is in ImGui::ShowTestWindow()
if (show_test_window)
{
ImGui::SetNewWindowDefaultPos(ImVec2(650, 20)); // Normally user code doesn't need/want to call this, because positions are saved in .ini file. Here we just want to make the demo initial state a bit more friendly!
ImGui::ShowTestWindow(&show_test_window);
}
}
void DestroyGL() // Mandatory
{
}
// Application code
#ifndef IMIMPL_USE_WINAPI
int main(int argc, char** argv)
{
// Basic
ImImpl_Main(NULL,argc,argv);
// Advanced
/*
// These lines load an embedded font. [However these files are way too big... inside <imgui.cpp> they used a better format storing bytes at groups of 4, so the files are more concise (1/4?) than mine]
const unsigned char fntMemory[] =
# include "./fonts/DejaVuSansCondensedBoldOutlineRGBAbinary18.fnt.inl"
const unsigned char imgMemory[] =
# include "./fonts/DejaVuSansCondensedBoldOutlineRGBAbinary18_0.png.inl"
ImImpl_InitParams gImGuiInitParams(
-1,-1,NULL, // optional window width, height, title
NULL,//"./fonts/DejaVuSansCondensedBoldOutlineRGBAbinary18.fnt", // optional custom font from file (main custom font)
NULL,//"./fonts/DejaVuSansCondensedBoldOutlineRGBAbinary18_0.png", // optional custom font from file (main custom font)
-1,-1, // optional white spot in font texture (returned by the console if not set)
&fntMemory[0],sizeof(fntMemory)/sizeof(fntMemory[0]), // optional custom font from memory (secondary custom font) WARNING (licensing problem): e.g. embedding a GPL font in your code can make your code GPL as well.
&imgMemory[0],sizeof(imgMemory)/sizeof(imgMemory[0]) // optional custom font from memory (secondary custom font) WARNING (licensing problem): e.g. embedding a GPL font in your code can make your code GPL as well.
);
gImGuiInitParams.gFpsClamp = 10.0f; // Optional Max allowed FPS (default -1 => unclamped). Useful for editors and to save GPU and CPU power.
ImImpl_Main(&gImGuiInitParams,argc,argv);*/
return 0;
}
#else //IMIMPL_USE_WINAPI
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int iCmdShow) // This branch has made my code less concise (I will consider stripping it)
{
// Basic
ImImpl_WinMain(NULL,hInstance,hPrevInstance,lpCmdLine,iCmdShow);
// Advanced
/*
// These lines load an embedded font. [However these files are way too big... inside <imgui.cpp> they used a better format storing bytes at groups of 4, so the files are more concise (1/4?) than mine]
const unsigned char fntMemory[] =
# include "./fonts/DejaVuSansCondensedBoldOutlineRGBAbinary18.fnt.inl"
const unsigned char imgMemory[] =
# include "./fonts/DejaVuSansCondensedBoldOutlineRGBAbinary18_0.png.inl"
ImImpl_InitParams gImGuiInitParams(
-1,-1,NULL, // optional window width, height, title
NULL,//"./fonts/DejaVuSansCondensedBoldOutlineRGBAbinary18.fnt", // optional custom font from file (main custom font)
NULL,//"./fonts/DejaVuSansCondensedBoldOutlineRGBAbinary18_0.png", // optional custom font from file (main custom font)
-1,-1, // optional white spot in font texture (returned by the console if not set)
&fntMemory[0],sizeof(fntMemory)/sizeof(fntMemory[0]), // optional custom font from memory (secondary custom font) WARNING (licensing problem): e.g. embedding a GPL font in your code can make your code GPL as well.
&imgMemory[0],sizeof(imgMemory)/sizeof(imgMemory[0]) // optional custom font from memory (secondary custom font) WARNING (licensing problem): e.g. embedding a GPL font in your code can make your code GPL as well.
);
gImGuiInitParams.gFpsClamp = 10.0f; // Optional Max allowed FPS (default -1 => unclamped). Useful for editors and to save GPU and CPU power.
ImImpl_WinMain(&gImGuiInitParams,hInstance,hPrevInstance,lpCmdLine,iCmdShow);*/
return 0;
}
#endif //IMIMPL_USE_WINAPI

File diff suppressed because it is too large Load diff