GLFW-0.5.1.0/0000755000000000000000000000000012045371042010576 5ustar0000000000000000GLFW-0.5.1.0/Changelog.txt0000644000000000000000000002027112045371042013230 0ustar0000000000000000Sat Nov 3 21:41:09 PDT 2012 paul@thev.net * Bump version to 0.5.1.0 for release Sat Nov 3 21:39:46 PDT 2012 paul@thev.net * Enable 64-bit fix for MouseWheelCallback Thu Aug 30 20:07:02 PDT 2012 paul@thev.net * Use Int for MouseWheelCallback Wed Jun 13 21:53:39 PDT 2012 paul@thev.net * use C types for FFI Sat Jun 2 03:58:54 PDT 2012 Marc Sunet * Previous GLint was not quite working (linker error). Now fixed. Sat Jun 2 03:38:31 PDT 2012 Marc Sunet * GLint warning fixed. Mon May 28 02:46:56 PDT 2012 Marc Sunet * Update to version 2.7.5 C sources updated, nothing to be done on the Haskell side. Fixed a warning about unsafePerformIO being deprecated. Using the new function from System.Unsafe. There are still a few warnings about GLint that could be supressed. Fri Jan 27 11:07:48 PST 2012 paul@thev.net * merge the source of StateT into Setup.hs since mtl is not a default library; bump up version Sat Jan 21 01:08:46 PST 2012 paul@thev.net * update API doc for windowCloseCallback Sat Jan 21 01:05:06 PST 2012 paul@thev.net * update SOE url Fri Jan 20 13:17:21 PST 2012 paul@thev.net * cosmetic changes before new release Fri Jan 20 09:55:56 PST 2012 paul@thev.net * update README Fri Jan 20 02:45:53 PST 2012 Marc Sunet * Minor docs edit. I mentioned that AutoPollEvent is enabled by default. Fri Jan 20 01:34:45 PST 2012 paul@thev.net * use a record for confState Fri Jan 20 01:34:19 PST 2012 paul@thev.net * update README Fri Jan 20 01:06:41 PST 2012 paul@thev.net * re-org haddock comments Thu Jan 19 22:55:43 PST 2012 paul@thev.net * fix example to match new param API Thu Jan 19 14:24:38 PST 2012 paul@thev.net * revert back to atexit on x11 Thu Jan 19 12:37:13 PST 2012 Marc Sunet * Fixed X11 build. X11 build now detects the directory where the X11 files are installed and passes that as an include directory to gcc. Edited .cabal file so that the X11 section is triggered on FreeBSD, not only on Linux. Wed Jan 18 01:32:08 PST 2012 Marc Sunet * Added myself to the maintainer list. Mon Jan 16 14:10:07 PST 2012 paul@thev.net * clean up Setup.hs, and put back the x-cc-name hack for OS X Sat Jan 14 03:40:41 PST 2012 Marc Sunet * Setup.hs now successfully passes the extra libs to the install process. The extra libs were being passed to the build process, but not the install one, so applications would fail to link properly. I haven't figured out how to pass data between hooks, so as a workaround I made the build hook write the extra libs to a temporary file which is then read by the install hook. The install hook reads the extra libs, creates a modified PackageDescription and then delegates the rest of the work to the real install process. Sat Jan 14 02:46:18 PST 2012 Marc Sunet * Setup.hs now passes the extra libraries to the build process. Sat Jan 14 01:37:47 PST 2012 Marc Sunet * Added Setup.hs sysctl check. Sat Jan 14 01:31:30 PST 2012 Marc Sunet * Setup.hs flags auto detection. I have also edited the .cabal file to add some default flags for Linux. Wed Jan 11 10:58:17 PST 2012 Marc Sunet * Hint and Param type families. openWindowHint and getParam substituted by param families. Mon Jan 9 02:00:58 PST 2012 Marc Sunet * Added default-language: Haskell98 to cabal file. Sun Jan 8 21:19:49 PST 2012 paul@thev.net * mark safe foreign calls Sun Jan 8 21:18:51 PST 2012 paul@thev.net * WindowCloseCallback now returns Bool instead of () Sun Jan 8 21:04:46 PST 2012 paul@thev.net * get rid of compilation warning Thu Jan 5 06:45:05 PST 2012 Marc Sunet * Documentation + glVersion Documentation has been extended. Added the gettable statevar 'glVersion'. Thu Jan 5 05:51:37 PST 2012 Marc Sunet * windowPos statevar added Thu Jan 5 02:51:59 PST 2012 Marc Sunet * WindowParam missing constructors added. I have added the missing values to the WindowParam enum. In the original glfw library WindowHint and WindowParam share enum values, so I prepended a P to WindowParam constructors to avoid name clashes. The result isn't very clean, but I suppose that since WindowHint is used more frequently it should be ok. Thu Jan 5 02:20:40 PST 2012 Marc Sunet * WindowHint and openWindowHint redesign Redesigned WindwoHint and openWindowHint. Also added the Profile enum. Wed Jan 4 02:30:25 PST 2012 paul@thev.net * require Cabal >= 1.10, and fix building on 32-bit OS X Tue Jan 3 10:06:50 PST 2012 Marc Sunet * WindowHint - OpenGL context info Added the following constructors to WindowHint: OpenGLVersionMajor, OpenGLVersionMinor, OpenGLForwardCompat, OpenGLContext, OpenGLProfile. Mon Jan 2 15:01:31 PST 2012 paul@thev.net * add an example (same one I wrote on HaskellWiki) Mon Jan 2 14:27:45 PST 2012 paul@thev.net * use default hook when x-cc-name is not available Mon Jan 2 14:20:10 PST 2012 paul@thev.net * replace atexit with on_exit on x11 Mon Sep 26 01:59:21 PDT 2011 paul@thev.net * upgrade to glfw-2.7.2, build darwin through gcc, and bump our version to 0.5.0.0 Mon Sep 26 01:52:52 PDT 2011 paul@thev.net * fix compilation warnings Mon Sep 26 01:09:24 PDT 2011 paul@thev.net * change texture rendering direction to counter-clockwise in renderChar Wed Sep 16 11:00:09 PDT 2009 paul@thev.net * change CC option to fit Snow Leopard Wed Aug 12 17:53:18 PDT 2009 paul@thev.net * bugfix for the dynamic flag; bump version to 0.4.1 for release. Wed Aug 12 12:53:09 PDT 2009 paul@thev.net * update README.txt Wed Aug 12 12:52:38 PDT 2009 paul@thev.net * addition to Work around GHC FFI bug 2594 only in GHC < 6.10 Sun Aug 2 05:02:16 PDT 2009 paul@thev.net * remove use of Int32 and make it compatible with OpenGL 2.3.0.0 Sat Jun 6 21:10:07 PDT 2009 brian@lorf.org * Work around GHC FFI bug 2594 only in GHC < 6.10 Sat Jun 6 00:03:14 PDT 2009 brian@lorf.org * Whitespace-only change to LICENSE. Sat Jun 6 00:01:48 PDT 2009 brian@lorf.org * hlint cleanliness, Haddock comment improvements. Fri Jun 5 22:37:10 PDT 2009 brian@lorf.org * Made small improvements to GLFW.cabal Fri Jun 5 22:10:19 PDT 2009 brian@lorf.org * Made small improvements to Setup.hs Wed Jun 3 06:41:31 PDT 2009 paul@thev.net * cabal related adjustments 1. adjust to work properly with latest cabal. 2. add -mach=apple as a cc-option for OS X in order not to break GHC 6.10.2. 3. add a "dynamic" flag for Linux to link to GLFW dynamic libs already in system. Tue Dec 2 19:46:37 PST 2008 brianchina60221@gmail.com * joystick-related cleanup Mon Nov 3 15:03:56 PST 2008 shahn@cs.tu-berlin.de * add derived instance for Ord for Key and SpecialKey Sat Nov 1 17:50:32 PDT 2008 shahn@cs.tu-berlin.de * fix 64-bug for mousePosCallback (with dirty hack) Mon Oct 27 15:41:18 PDT 2008 brianchina60221@gmail.com * openWindow fixes Thu Oct 2 03:04:13 PDT 2008 brianchina60221@gmail.com * marking more foreign imports safe Thu Oct 2 00:26:39 PDT 2008 brianchina60221@gmail.com * 'deteced -> detected' Thu Oct 2 00:25:35 PDT 2008 brianchina60221@gmail.com * some foreign imports cannot be marked unsafe Tue Sep 30 11:25:57 PDT 2008 brianchina60221@gmail.com * miscellaneous simplification Tue Sep 30 06:26:03 PDT 2008 brianchina60221@gmail.com * removed unnecessary stuff from foreign imports, added "unsafe"s Tue Sep 30 00:57:00 PDT 2008 brianchina60221@gmail.com * bump to 0.4, miscellaneous cleanup Sat Sep 13 16:20:00 PDT 2008 shahn@cs.tu-berlin.de * workaround for correct mouse wheel values on 64-bit-machines Sat Sep 6 12:17:51 PDT 2008 shahn@cs.tu-berlin.de * fix mousePosCallback bug on 64-bit machines Thu Sep 4 18:30:11 PDT 2008 paul@thev.net * fix typo bug in disableSpecial, and improve some error msgs. Wed Sep 3 19:39:52 PDT 2008 paul@thev.net * GLFW-0.3 init release GLFW-0.5.1.0/GLFW.cabal0000644000000000000000000000573712045371042012335 0ustar0000000000000000name: GLFW version: 0.5.1.0 homepage: http://haskell.org/haskellwiki/GLFW maintainer: Paul H. Liu , Marc Sunet cabal-version: >= 1.10 build-type: Custom category: Graphics synopsis: A Haskell binding for GLFW description: A Haskell binding for GLFW, a window system independent toolkit for writing OpenGL programs. For more information about the C library on which this binding is based, please see . license: BSD3 license-file: LICENSE extra-source-files: Changelog.txt README.txt example/example.lhs glfw/COPYING.txt glfw/include/GL/glfw.h glfw/lib/internal.h glfw/lib/x11/platform.h glfw/lib/win32/platform.h glfw/lib/cocoa/platform.h flag dynamic description: Dynamically link with GLFW C libray if your system provides it. default: False library build-depends: base >= 3 && < 5, OpenGL >= 2.1 && < 3 default-language: Haskell98 exposed-modules: Graphics.UI.GLFW ghc-options: -Wall -fspec-constr-count=6 if impl(ghc >= 6.8) ghc-options: -fwarn-tabs include-dirs: glfw/include glfw/lib if flag(dynamic) extra-libraries: glfw else cc-options: c-sources: glfw/lib/enable.c glfw/lib/fullscreen.c glfw/lib/glext.c glfw/lib/image.c glfw/lib/init.c glfw/lib/input.c glfw/lib/joystick.c glfw/lib/stream.c glfw/lib/tga.c glfw/lib/thread.c glfw/lib/time.c glfw/lib/window.c if os(darwin) x-cc-name: gcc include-dirs: glfw/lib/cocoa frameworks: Cocoa OpenGL c-sources: glfw/lib/cocoa/cocoa_enable.m glfw/lib/cocoa/cocoa_fullscreen.m glfw/lib/cocoa/cocoa_glext.m glfw/lib/cocoa/cocoa_init.m glfw/lib/cocoa/cocoa_joystick.m glfw/lib/cocoa/cocoa_thread.c glfw/lib/cocoa/cocoa_time.m glfw/lib/cocoa/cocoa_window.m else if os(mingw32) include-dirs: glfw/lib/win32 extra-libraries: opengl32 c-sources: glfw/lib/win32/win32_enable.c glfw/lib/win32/win32_fullscreen.c glfw/lib/win32/win32_glext.c glfw/lib/win32/win32_init.c glfw/lib/win32/win32_joystick.c glfw/lib/win32/win32_thread.c glfw/lib/win32/win32_time.c glfw/lib/win32/win32_window.c else include-dirs: glfw/lib/x11 extra-libraries: X11 GL cc-options: -D_GLFW_USE_LINUX_JOYSTICKS c-sources: glfw/lib/x11/x11_enable.c glfw/lib/x11/x11_fullscreen.c glfw/lib/x11/x11_glext.c glfw/lib/x11/x11_init.c glfw/lib/x11/x11_joystick.c glfw/lib/x11/x11_keysym2unicode.c glfw/lib/x11/x11_thread.c glfw/lib/x11/x11_time.c glfw/lib/x11/x11_window.c source-repository head type: darcs location: http://code.haskell.org/GLFW/ GLFW-0.5.1.0/LICENSE0000644000000000000000000000154712045371042011612 0ustar0000000000000000Copyright (c) 2007 Paul H. Liu This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. GLFW-0.5.1.0/README.txt0000644000000000000000000000773212045371042012305 0ustar0000000000000000This is a Haskell module for GLFW OpenGL framework (http://www.glfw.org). It provides an alternative to GLUT for OpenGL based Haskell programs. SOE (http://www.cs.yale.edu/homes/hudak/SOE/) now depends on this package. The website for this Haskell module is at Haskell Wiki site: http://haskell.org/haskellwiki/GLFW ======= Changes ======= See separate file "Changlog.txt". ============ Installation ============ The package comes together with a (partial) source distribution of GLFW v2.7.2, which is compiled and installed together with the Haskell package. If you already have the Haskell package cabal-install, you can simply do "cabal install GLFW", and it will download the latest source from HackageDB, configure, compile, and install it automatically. Otherwise, you may follow the standard Cabal package installation steps: 1. To configure the module, type runhaskell Setup.hs configure or runhaskell Setup.hs configure --user --prefix=DIR if you want to install the package to your user's directory instead of the system one (replace DIR with your own directory choice). 2. To build the module, type runhaskell Setup.hs build 3. To install, type runhaskell Setup.hs install In the process it builds all GLFW C library source code. You may use "runhaskell Setup.hs build --verbose" to see the actual compilation steps. 4. Optionally to build its Haddock documentation, type runhaskell Setup.hs haddock ==== NOTE ==== For Windows users, you may have to include GHC's gcc-lib directory in your PATH environment, e.g., c:\ghc\ghc-6.8.3\gcc-lib, before configuring the GLFW module, otherwise it'll complain about missing program for ld. For Linux users there is an option to link to a system wide GLFW dynamical library instead of compilation from source. It can be done by providing "--flags=dynamic" as an option to cabal configure command. For Mac users, unfortunately interactively running GLFW programs from GHCi would result in a crash. The only sensible way is to compile and run the program. On the other hand, it no longer requires the enableGUI trick. ============= Package Usage ============= The package is tested with GHC 6.10.2 and GHC 7.0.2 on all three platforms (Linux, Win32/MinGW, and Mac OS X). Though it may work with older versions of GHC or even Hugs, they are not tested. It installs a new Haskell package called "GLFW" and the actual module to import is "Graphics.UI.GLFW". You'll need to pass "-package GLFW" to GHC if you want to compile it. GLFW itself is well documented (see GLFW website), and the Haskell module API is documented via Haddock. Not all functions are fully tested, and there are still a few GLFW C functions missing from the Haskell module, namely the image loading functions. They are excluded because image handling is a separate issue, and low level buffer manipulation would obscure their use further. Texture loading from TGA format is supported both from file and from memory (via a string buffer). The Haskell module also provides basic text rendering while GLFW doesn't. It comes from a free 8x16 font which is made into a TGA texture, stored as a Haskell string in the file GLFW.hs (also the reason for its big size). Text rendering is only possible with Alpha enabled. Again, see SOE.hs from the SOE package for sample usage. GLFW doesn't work well with GHC threads, forkIO or threadDelay. So avoid them if you can. ====================== Additional Information ====================== You may send your bug report and feature request to the package maintainer: Paul H. Liu . Lastest GLFW development is hosted in a darcs repository. You may obtain it by darcs pull http://code.haskell.org/GLFW There is also a mailinglist for GLFW deveopers at http://projects.haskell.org/cgi-bin/mailman/listinfo/glfw -- Last Updated: Fri Jan 20 PST 2012 GLFW-0.5.1.0/Setup.hs0000644000000000000000000002420112045371042012231 0ustar0000000000000000{- source partly taken from http://wewantarock.wordpress.com/tag/cabal/ -} {-# LANGUAGE MultiParamTypeClasses, FunctionalDependencies, FlexibleInstances #-} module Main (main) where import Distribution.Simple import Distribution.Simple.Setup import Distribution.Simple.Utils (rawSystemStdInOut, withTempFile) import Distribution.Simple.LocalBuildInfo import Distribution.Simple.Program import Distribution.Verbosity import Distribution.PackageDescription import Distribution.System import System.Exit import System.FilePath import System.Directory import System.IO (hClose, hPutStr) import System.Cmd (rawSystem) import Data.Maybe (fromJust) import Foreign (bitSize) import Control.Monad (when) --import Control.Monad.State --import Control.Monad.Trans.Class (lift) main :: IO () main = defaultMainWithHooks $ simpleUserHooks { confHook = myConfHook , buildHook = myBuildHook } myConfHook pkg_descr flags = do let verbosity = fromFlag (configVerbosity flags) lbi <- confHook simpleUserHooks pkg_descr flags cfg <- (case buildOS of Windows -> configureWindows OSX -> configureOSX _ -> configureUnix) verbosity let info = emptyBuildInfo { ccOptions = confFlags cfg , extraLibs = confLibs cfg } descr = updatePackageDescription (Just info, []) (localPkgDescr lbi) return $ lbi { localPkgDescr = descr } myBuildHook pkg_descr local_bld_info user_hooks bld_flags = do let lib = fromJust (library pkg_descr) lib_bi = libBuildInfo lib custom_bi = customFieldsBI lib_bi case lookup "x-cc-name" custom_bi of Nothing -> buildHook simpleUserHooks pkg_descr local_bld_info user_hooks bld_flags Just cpp_name -> do let cpp_name = fromJust (lookup "x-cc-name" custom_bi) c_srcs = cSources lib_bi mbits = bitSize (undefined :: Int) cc_opts = ("-m" ++ show mbits) : "-S" : ccOptions lib_bi inc_dirs = includeDirs lib_bi lib_dirs = extraLibDirs lib_bi bld_dir = buildDir local_bld_info prog = ConfiguredProgram { programId = cpp_name, programVersion = Nothing, programDefaultArgs = [], programOverrideArgs = [], programLocation = FoundOnSystem { locationPath = cpp_name } } -- Compile C/C++ sources putStrLn $ "invoking my compile phase " ++ cpp_name objs <- mapM (compileCxx prog cc_opts inc_dirs bld_dir) c_srcs -- Remove C/C++ source code from the hooked build (don't change libs) let lib_bi' = lib_bi { cSources = map replaceWithAsm c_srcs } lib' = lib { libBuildInfo = lib_bi' } pkg_descr' = pkg_descr { library = Just lib' } -- The following line invokes the standard build behaviour putStrLn "Invoke default build hook" buildHook simpleUserHooks pkg_descr' local_bld_info user_hooks bld_flags compileCxx :: ConfiguredProgram -- ^ C/C++ compiler (gcc) -> [String] -- ^ Compile options from Cabal and wxConfig -> [String] -- ^ Include paths from Cabal and wxConfig -> FilePath -- ^ Base output directory -> FilePath -- ^ Path to source file -> IO FilePath -- ^ Path to generated object code compileCxx gcc opts incls out_path cxx_src = do let includes = map ("-I" ++) incls -- out_path' = normalisePath out_path -- cxx_src' = normalisePath cxx_src -- out_file = out_path dropFileName cxx_src -- replaceExtension (takeFileName cxx_src) ".o" out_file = replaceWithAsm cxx_src out = ["-c", cxx_src, "-o", out_file] -- opts = opts ++ osCompileOpts do_it = True -- needsCompiling cxx_src out_file when do_it $ createDirectoryIfMissing True (dropFileName out_file) >> runProgram verbose gcc (includes ++ opts ++ out) return out_file replaceWithAsm p = replaceExtension p ".s" type Flags = [String] type Libs = [String] data ConfState = ConfState { confFlags :: Flags, confLibs :: Libs } emptyCfg = ConfState [] [] addFlag :: String -> StateT ConfState IO () addFlag flag = modify $ \(ConfState fs ls) -> ConfState (flag:fs) ls addLib :: String -> StateT ConfState IO () addLib lib = modify $ \(ConfState fs ls) -> ConfState fs (lib:ls) configureWindows :: Verbosity -> IO ConfState configureWindows verbosity = return emptyCfg configureOSX :: Verbosity -> IO ConfState configureOSX verbosity = return emptyCfg configureUnix :: Verbosity -> IO ConfState configureUnix verbosity = do cfg <- execStateT configureUnix' $ ConfState [] [] when (verbosity > normal) $ putStrLn $ unlines $ map unwords [ "Flags:" : confFlags cfg, "Libs:" : confLibs cfg ] return cfg where check' test = check verbosity (performTest verbosity test) configureUnix' :: StateT ConfState IO () configureUnix' = do checkLibDir "/usr/X11" `orelse` checkLibDir "/usr/X11R7" `orelse` checkLibDir "/usr/X11R6" `orelse` checkLibDir "/usr/X11R5" `orelse` checkLibDir "/opt/X11R6" `orelse` checkLibDir "/usr/X" check' progXrandr "Xrandr" ["-D_GLFW_HAS_XRANDR"] ["Xrandr"] `orelse` check' progVidMode "VidMode" ["-D_GLFW_HAS_XF86VIDMODE"] ["Xxf86vm", "Xext"] check' progGlXGetProcAddress "glXGetProcAddress" ["-D_GLFW_HAS_GLXGETPROCADDRESS"] [] `orelse` check' progGlXGetProcAddressARB "glXGetProcAddressARB" ["-D_GLFW_HAS_GLXGETPROCADDRESSARB"] [] `orelse` check' progGlXGetProcAddressEXT "glXGetProcAddressEXT" ["-D_GLFW_HAS_GLXGETPROCADDRESSEXT"] [] `orelse` check' progDlOpen "dlopen" ["-D_GLFW_HAS_DLOPEN"] [] check' progSysConf "sysconf" ["-D_GLFW_HAS_SYSCONF"] [] check' progSysCtl "sysctl" ["-D_GLFW_HAS_SYSCTL"] [] return () f `orelse` g = f >>= \b -> if b then return b else g checkLibDir :: String -> StateT ConfState IO Bool checkLibDir dir = do result <- lift $ doesDirectoryExist (dir ++ "/lib") when (result) $ addFlag ("-I" ++ dir ++ "/include") return result check :: Verbosity -> (Flags -> IO Bool) -> String -> Flags -> Libs -> StateT ConfState IO Bool check verbosity performCheck name flags libs = do when (verbosity >= normal) $ lift . putStr $ "Checking for " ++ name ++ " support..." success <- get >>= lift . performCheck . confFlags when (verbosity >= normal) $ lift . putStrLn $ if success then "yes" else "no" when success $ mapM_ addFlag flags >> mapM_ addLib libs return success performTest :: Verbosity -> String -> Flags -> IO Bool performTest verbosity contents flags = do tmpDir <- getTemporaryDirectory withTempFile tmpDir "glfw-test.c" $ \path inHandle -> withTempFile tmpDir "glfw-test.o" $ \objPath outHandle -> do hClose outHandle hPutStr inHandle contents hClose inHandle (out, err, exitCode) <- rawSystemStdInOut verbosity "cc" (["-c", path, "-o", objPath] ++ flags) Nothing False return (exitCode == ExitSuccess) progXrandr = unlines ["#include " ,"#include " ,"int main() {return 0;}" ] progVidMode = unlines ["#include " ,"#include " ,"#if defined(__APPLE_CC__)" ,"#error Not supported under Mac OS X" ,"#endif" ,"int main() {return 0;}" ] progGlXGetProcAddress = unlines ["#include " ,"#include " ,"#include " ,"int main() {void *ptr=(void*)glXGetProcAddress(\"glFun\"); return 0;}" ] progGlXGetProcAddressARB = unlines ["#include " ,"#include " ,"#include " ,"int main() {void *ptr=(void*)glXGetProcAddressARB(\"glFun\"); return 0;}" ] progGlXGetProcAddressEXT = unlines ["#include " ,"#include " ,"#include " ,"int main() {void *ptr=(void*)glXGetProcAddressEXT(\"glFun\"); return 0;}" ] progDlOpen = unlines ["#include " ,"int main() {void *l=dlopen(\"libGL.so\",RTLD_LAZY|RTLD_GLOBAL); return 0;}" ] progSysConf = unlines ["#include " ,"#ifndef _SC_NPROCESSORS_ONLN" ,"#ifndef _SC_NPROC_ONLN" ,"#error Neither _SC_NPROCESSORS_ONLN nor _SC_NPROC_ONLN available" ,"#endif" ,"#endif" ,"int main() {long x=sysconf(_SC_ARG_MAX); return 0; }" ] progSysCtl = unlines ["#include " ,"#include " ,"#ifdef CTL_HW" ,"#ifndef HW_NCPU" ," error;" ,"#endif" ,"#endif" ,"int main() { return 0; }" ] -- Since we cannot specify that only Setup.hs depends on mtl, we include StateT here. newtype StateT s m a = StateT { runStateT :: s -> m (a,s) } execStateT m s = fmap snd $ runStateT m s class (Monad m) => MonadState s m | m -> s where get :: m s put :: s -> m () class MonadTrans t where lift :: Monad m => m a -> t m a modify f = get >>= put . f instance (Monad m) => Monad (StateT s m) where return a = StateT $ \s -> return (a, s) m >>= k = StateT $ \s -> do ~(a, s') <- runStateT m s runStateT (k a) s' fail str = StateT $ \_ -> fail str instance MonadTrans (StateT s) where lift m = StateT $ \s -> do a <- m return (a, s) instance (Monad m) => MonadState s (StateT s m) where get = StateT $ \s -> return (s, s) put s = StateT $ \_ -> return ((), s) GLFW-0.5.1.0/example/0000755000000000000000000000000012045371042012231 5ustar0000000000000000GLFW-0.5.1.0/example/example.lhs0000644000000000000000000002355412045371042014405 0ustar0000000000000000[[Category:Libraries]] [[Category:Graphics]] == About == This is a Haskell module for [http://www.glfw.org/ GLFW OpenGL framework]. It provides an alternative to GLUT for OpenGL based Haskell programs. == Status == The library is being used by the [http://www.cs.yale.edu/homes/hudak/SOE/ Haskell School of Expression (SOE)] code to render Graphics in a cross-platform manner. It currently interfaces with GLFW version 2.7.2, works on Windows, Linux (i386) and Mac OS X. GLFW itself is well documented (see [http://www.glfw.org/ GLFW website]), and the Haskell module API is documented via Haddock. Not all functions are fully tested, and there are still a few GLFW C functions missing from the Haskell module, namely the image loading functions. They are excluded because image handling is a separate issue, and low level buffer manipulation would obscure their use further. Texture loading from TGA format is supported both from file and from memory (via a string buffer).. The Haskell module also provides basic text rendering while GLFW doesn't. It comes from a free 8x16 font which is made into a TGA texture, stored as a Haskell string in the file GLFW.hs. Text rendering is only possible with Alpha enabled. Again, see SOE.hs from the SOE package for sample usage. GLFW may not work well with GHC threads, forkIO or threadDelay. So avoid them if you can. == Download == Current version is [http://hackage.haskell.org/cgi-bin/hackage-scripts/package/GLFW GLFW-0.5.0.0]. It works with Cabal 1.10 or later. It compiles GLFW C source code as part of the building process, please report to the package maintainer if you have build problems. == More information == * [http://hackage.haskell.org/packages/archive/GLFW/0.5.0.0/doc/html/Graphics-UI-GLFW.html The Haddock documentation] * [http://www.glfw.org/ The GLFW site] == Sample Program == To demonstrate the usage of GLFW for OpenGL based Haskell applications, here is a sample program that allows user to draw lines by holding the left mouse button and move the mouse. \begin{code} import Graphics.Rendering.OpenGL as GL import Graphics.UI.GLFW as GLFW import Graphics.Rendering.OpenGL (($=)) import Data.IORef import Control.Monad import System.Environment (getArgs, getProgName) \end{code} Because the program needs to process user input, i.e., mouse button and movements, we'll use a continuation like structure for this purpose. The Action type represents an IO operation that returns the next Action to continue execution. \begin{code} data Action = Action (IO Action) \end{code} The main program is mostly book-keeping such as initializing OpenGL and GLFW, creating window, setting up viewport, etc. \begin{code} main = do -- invoke either active or passive drawing loop depending on command line argument args <- getArgs prog <- getProgName case args of ["active"] -> putStrLn "Running in active mode" >> main' active ["passive"] -> putStrLn "Running in passive mode" >> main' passive _ -> putStrLn $ "USAGE: " ++ prog ++ " [active|passive]" main' run = do GLFW.initialize -- open window GLFW.openWindow (GL.Size 400 400) [GLFW.DisplayAlphaBits 8] GLFW.Window GLFW.windowTitle $= "GLFW Demo" GL.shadeModel $= GL.Smooth -- enable antialiasing GL.lineSmooth $= GL.Enabled GL.blend $= GL.Enabled GL.blendFunc $= (GL.SrcAlpha, GL.OneMinusSrcAlpha) GL.lineWidth $= 1.5 -- set the color to clear background GL.clearColor $= Color4 0 0 0 0 -- set 2D orthogonal view inside windowSizeCallback because -- any change to the Window size should result in different -- OpenGL Viewport. GLFW.windowSizeCallback $= \ size@(GL.Size w h) -> do GL.viewport $= (GL.Position 0 0, size) GL.matrixMode $= GL.Projection GL.loadIdentity GL.ortho2D 0 (realToFrac w) (realToFrac h) 0 -- keep all line strokes as a list of points in an IORef lines <- newIORef [] -- run the main loop run lines -- finish up GLFW.closeWindow GLFW.terminate \end{code} There are usually two ways to structure the main loop of GLFW programs. One is by actively polling events before processing them. The screen buffer is usually redrawn every time before swapBuffers is called. This is the simplest main loop often seen in game applications, and may waste CPU cycles even when there is no visual update. Note that swapBuffers by default calls pollEvents implicitly, so there is no need to do a separate poll. \begin{code} -- we start with waitForPress action active lines = loop waitForPress where loop action = do -- draw the entire screen render lines -- swap buffer GLFW.swapBuffers -- check whether ESC is pressed for termination p <- GLFW.getKey GLFW.ESC unless (p == GLFW.Press) $ do -- perform action Action action' <- action -- sleep for 1ms to yield CPU to other applications GLFW.sleep 0.001 -- only continue when the window is not closed windowOpen <- getParam Opened unless (not windowOpen) $ loop action' -- loop with next action waitForPress = do b <- GLFW.getMouseButton GLFW.ButtonLeft case b of GLFW.Release -> return (Action waitForPress) GLFW.Press -> do -- when left mouse button is pressed, add the point -- to lines and switch to waitForRelease action. (GL.Position x y) <- GL.get GLFW.mousePos modifyIORef lines (((x,y):) . ((x,y):)) return (Action waitForRelease) waitForRelease = do -- keep track of mouse movement while waiting for button -- release (GL.Position x y) <- GL.get GLFW.mousePos -- update the line with new ending position modifyIORef lines (((x,y):) . tail) b <- GLFW.getMouseButton GLFW.ButtonLeft case b of -- when button is released, switch back back to -- waitForPress action GLFW.Release -> return (Action waitForPress) GLFW.Press -> return (Action waitForRelease) \end{code} Another way to structure the main loop is to register event callbacks and use waitEvents. This way we don't have to put the program to sleep every 1ms because it'll not be using any CPU cycle when there is no event to handle. One reminder in this approach is that swapBuffers must be handled with care, because it by default invokes pollEvents, which in turn invokes all callback functions. So if swapBuffers is used inside a callback, it'll create infinite loop and hang the program. To avoid it, we should disable the AutoPollEvent behavior using disableSpecial. Another optimization we can do is to use a dirty marker to remember whether the screen really needs to be redrawn. This'll not only save CPU cycles but also speed up event processing to avoid piling up events in the event queue. Similar tricks can be done to optimize the active polling approach. \begin{code} passive lines = do -- disable auto polling in swapBuffers GLFW.disableSpecial GLFW.AutoPollEvent -- keep track of whether ESC has been pressed quit <- newIORef False -- keep track of whether screen needs to be redrawn dirty <- newIORef True -- mark screen dirty in refresh callback which is often called -- when screen or part of screen comes into visibility. GLFW.windowRefreshCallback $= writeIORef dirty True -- use key callback to track whether ESC is pressed GLFW.keyCallback $= \k s -> when (fromEnum k == fromEnum GLFW.ESC && s == GLFW.Press) $ writeIORef quit True -- Terminate the program if the window is closed GLFW.windowCloseCallback $= (writeIORef quit True >> return True) -- by default start with waitForPress waitForPress dirty loop dirty quit where loop dirty quit = do GLFW.waitEvents -- redraw screen if dirty d <- readIORef dirty when d $ render lines >> GLFW.swapBuffers writeIORef dirty False -- check if we need to quit the loop q <- readIORef quit unless q $ loop dirty quit waitForPress dirty = do GLFW.mousePosCallback $= \_ -> return () GLFW.mouseButtonCallback $= \b s -> when (b == GLFW.ButtonLeft && s == GLFW.Press) $ do -- when left mouse button is pressed, add the point -- to lines and switch to waitForRelease action. (GL.Position x y) <- GL.get GLFW.mousePos modifyIORef lines (((x,y):) . ((x,y):)) waitForRelease dirty waitForRelease dirty = do GLFW.mousePosCallback $= \(Position x y) -> do -- update the line with new ending position modifyIORef lines (((x,y):) . tail) -- mark screen dirty writeIORef dirty True GLFW.mouseButtonCallback $= \b s -> -- when left mouse button is released, switch back to -- waitForPress action. when (b == GLFW.ButtonLeft && s == GLFW.Release) $ waitForPress dirty \end{code} The rest of the program goes below. \begin{code} render lines = do l <- readIORef lines GL.clear [GL.ColorBuffer] GL.color $ color3 1 0 0 GL.renderPrimitive GL.Lines $ mapM_ (\ (x, y) -> GL.vertex (vertex3 (fromIntegral x) (fromIntegral y) 0)) l vertex3 :: GLfloat -> GLfloat -> GLfloat -> GL.Vertex3 GLfloat vertex3 = GL.Vertex3 color3 :: GLfloat -> GLfloat -> GLfloat -> GL.Color3 GLfloat color3 = GL.Color3 \end{code} == More examples and external links == A number of famous [http://nehe.gamedev.net/ NeHe OpenGL tutorials] have been translated into Haskell using GLFW and made available in the [http://hackage.haskell.org/package/nehe-tuts nehe-tuts package] by Jason Dagit. Code as well as executables are available via the package page. GLFW-0.5.1.0/glfw/0000755000000000000000000000000012045371042011535 5ustar0000000000000000GLFW-0.5.1.0/glfw/COPYING.txt0000644000000000000000000000167412045371042013416 0ustar0000000000000000Copyright (c) 2002-2006 Marcus Geelnard Copyright (c) 2006-2010 Camilla Berglund This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. GLFW-0.5.1.0/glfw/include/0000755000000000000000000000000012045371042013160 5ustar0000000000000000GLFW-0.5.1.0/glfw/include/GL/0000755000000000000000000000000012045371042013462 5ustar0000000000000000GLFW-0.5.1.0/glfw/include/GL/glfw.h0000644000000000000000000004673112045371042014605 0ustar0000000000000000/************************************************************************ * GLFW - An OpenGL framework * API version: 2.7 * WWW: http://www.glfw.org/ *------------------------------------------------------------------------ * Copyright (c) 2002-2006 Marcus Geelnard * Copyright (c) 2006-2010 Camilla Berglund * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages * arising from the use of this software. * * Permission is granted to anyone to use this software for any purpose, * including commercial applications, and to alter it and redistribute it * freely, subject to the following restrictions: * * 1. The origin of this software must not be misrepresented; you must not * claim that you wrote the original software. If you use this software * in a product, an acknowledgment in the product documentation would * be appreciated but is not required. * * 2. Altered source versions must be plainly marked as such, and must not * be misrepresented as being the original software. * * 3. This notice may not be removed or altered from any source * distribution. * *************************************************************************/ #ifndef __glfw_h_ #define __glfw_h_ #ifdef __cplusplus extern "C" { #endif /************************************************************************* * Global definitions *************************************************************************/ /* We need a NULL pointer from time to time */ #ifndef NULL #ifdef __cplusplus #define NULL 0 #else #define NULL ((void *)0) #endif #endif /* NULL */ /* ------------------- BEGIN SYSTEM/COMPILER SPECIFIC -------------------- */ /* Please report any probles that you find with your compiler, which may * be solved in this section! There are several compilers that I have not * been able to test this file with yet. * * First: If we are we on Windows, we want a single define for it (_WIN32) * (Note: For Cygwin the compiler flag -mwin32 should be used, but to * make sure that things run smoothly for Cygwin users, we add __CYGWIN__ * to the list of "valid Win32 identifiers", which removes the need for * -mwin32) */ #if !defined(_WIN32) && (defined(__WIN32__) || defined(WIN32) || defined(__CYGWIN__)) #define _WIN32 #endif /* _WIN32 */ /* In order for extension support to be portable, we need to define an * OpenGL function call method. We use the keyword APIENTRY, which is * defined for Win32. (Note: Windows also needs this for ) */ #ifndef APIENTRY #ifdef _WIN32 #define APIENTRY __stdcall #else #define APIENTRY #endif #define GL_APIENTRY_DEFINED #endif /* APIENTRY */ /* The following three defines are here solely to make some Windows-based * files happy. Theoretically we could include , but * it has the major drawback of severely polluting our namespace. */ /* Under Windows, we need WINGDIAPI defined */ #if !defined(WINGDIAPI) && defined(_WIN32) #if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__POCC__) /* Microsoft Visual C++, Borland C++ Builder and Pelles C */ #define WINGDIAPI __declspec(dllimport) #elif defined(__LCC__) /* LCC-Win32 */ #define WINGDIAPI __stdcall #else /* Others (e.g. MinGW, Cygwin) */ #define WINGDIAPI extern #endif #define GL_WINGDIAPI_DEFINED #endif /* WINGDIAPI */ /* Some files also need CALLBACK defined */ #if !defined(CALLBACK) && defined(_WIN32) #if defined(_MSC_VER) /* Microsoft Visual C++ */ #if (defined(_M_MRX000) || defined(_M_IX86) || defined(_M_ALPHA) || defined(_M_PPC)) && !defined(MIDL_PASS) #define CALLBACK __stdcall #else #define CALLBACK #endif #else /* Other Windows compilers */ #define CALLBACK __stdcall #endif #define GLU_CALLBACK_DEFINED #endif /* CALLBACK */ /* Microsoft Visual C++, Borland C++ and Pelles C needs wchar_t */ #if defined(_WIN32) && (defined(_MSC_VER) || defined(__BORLANDC__) || defined(__POCC__)) && !defined(_WCHAR_T_DEFINED) typedef unsigned short wchar_t; #define _WCHAR_T_DEFINED #endif /* _WCHAR_T_DEFINED */ /* ---------------- GLFW related system specific defines ----------------- */ #if defined(_WIN32) && defined(GLFW_BUILD_DLL) /* We are building a Win32 DLL */ #define GLFWAPI __declspec(dllexport) #define GLFWAPIENTRY __stdcall #define GLFWCALL __stdcall #elif defined(_WIN32) && defined(GLFW_DLL) /* We are calling a Win32 DLL */ #if defined(__LCC__) #define GLFWAPI extern #else #define GLFWAPI __declspec(dllimport) #endif #define GLFWAPIENTRY __stdcall #define GLFWCALL __stdcall #else /* We are either building/calling a static lib or we are non-win32 */ #define GLFWAPIENTRY #define GLFWAPI #define GLFWCALL #endif /* -------------------- END SYSTEM/COMPILER SPECIFIC --------------------- */ /* Include standard OpenGL headers: GLFW uses GL_FALSE/GL_TRUE, and it is * convenient for the user to only have to include . This also * solves the problem with Windows and needing some * special defines which normally requires the user to include * (which is not a nice solution for portable programs). */ #if defined(__APPLE_CC__) #if defined(GLFW_INCLUDE_GL3) #include #else #define GL_GLEXT_LEGACY #include #endif #ifndef GLFW_NO_GLU #include #endif #else #if defined(GLFW_INCLUDE_GL3) #include #else #include #endif #ifndef GLFW_NO_GLU #include #endif #endif /************************************************************************* * GLFW version *************************************************************************/ #define GLFW_VERSION_MAJOR 2 #define GLFW_VERSION_MINOR 7 #define GLFW_VERSION_REVISION 5 /************************************************************************* * Input handling definitions *************************************************************************/ /* Key and button state/action definitions */ #define GLFW_RELEASE 0 #define GLFW_PRESS 1 /* Keyboard key definitions: 8-bit ISO-8859-1 (Latin 1) encoding is used * for printable keys (such as A-Z, 0-9 etc), and values above 256 * represent special (non-printable) keys (e.g. F1, Page Up etc). */ #define GLFW_KEY_UNKNOWN -1 #define GLFW_KEY_SPACE 32 #define GLFW_KEY_SPECIAL 256 #define GLFW_KEY_ESC (GLFW_KEY_SPECIAL+1) #define GLFW_KEY_F1 (GLFW_KEY_SPECIAL+2) #define GLFW_KEY_F2 (GLFW_KEY_SPECIAL+3) #define GLFW_KEY_F3 (GLFW_KEY_SPECIAL+4) #define GLFW_KEY_F4 (GLFW_KEY_SPECIAL+5) #define GLFW_KEY_F5 (GLFW_KEY_SPECIAL+6) #define GLFW_KEY_F6 (GLFW_KEY_SPECIAL+7) #define GLFW_KEY_F7 (GLFW_KEY_SPECIAL+8) #define GLFW_KEY_F8 (GLFW_KEY_SPECIAL+9) #define GLFW_KEY_F9 (GLFW_KEY_SPECIAL+10) #define GLFW_KEY_F10 (GLFW_KEY_SPECIAL+11) #define GLFW_KEY_F11 (GLFW_KEY_SPECIAL+12) #define GLFW_KEY_F12 (GLFW_KEY_SPECIAL+13) #define GLFW_KEY_F13 (GLFW_KEY_SPECIAL+14) #define GLFW_KEY_F14 (GLFW_KEY_SPECIAL+15) #define GLFW_KEY_F15 (GLFW_KEY_SPECIAL+16) #define GLFW_KEY_F16 (GLFW_KEY_SPECIAL+17) #define GLFW_KEY_F17 (GLFW_KEY_SPECIAL+18) #define GLFW_KEY_F18 (GLFW_KEY_SPECIAL+19) #define GLFW_KEY_F19 (GLFW_KEY_SPECIAL+20) #define GLFW_KEY_F20 (GLFW_KEY_SPECIAL+21) #define GLFW_KEY_F21 (GLFW_KEY_SPECIAL+22) #define GLFW_KEY_F22 (GLFW_KEY_SPECIAL+23) #define GLFW_KEY_F23 (GLFW_KEY_SPECIAL+24) #define GLFW_KEY_F24 (GLFW_KEY_SPECIAL+25) #define GLFW_KEY_F25 (GLFW_KEY_SPECIAL+26) #define GLFW_KEY_UP (GLFW_KEY_SPECIAL+27) #define GLFW_KEY_DOWN (GLFW_KEY_SPECIAL+28) #define GLFW_KEY_LEFT (GLFW_KEY_SPECIAL+29) #define GLFW_KEY_RIGHT (GLFW_KEY_SPECIAL+30) #define GLFW_KEY_LSHIFT (GLFW_KEY_SPECIAL+31) #define GLFW_KEY_RSHIFT (GLFW_KEY_SPECIAL+32) #define GLFW_KEY_LCTRL (GLFW_KEY_SPECIAL+33) #define GLFW_KEY_RCTRL (GLFW_KEY_SPECIAL+34) #define GLFW_KEY_LALT (GLFW_KEY_SPECIAL+35) #define GLFW_KEY_RALT (GLFW_KEY_SPECIAL+36) #define GLFW_KEY_TAB (GLFW_KEY_SPECIAL+37) #define GLFW_KEY_ENTER (GLFW_KEY_SPECIAL+38) #define GLFW_KEY_BACKSPACE (GLFW_KEY_SPECIAL+39) #define GLFW_KEY_INSERT (GLFW_KEY_SPECIAL+40) #define GLFW_KEY_DEL (GLFW_KEY_SPECIAL+41) #define GLFW_KEY_PAGEUP (GLFW_KEY_SPECIAL+42) #define GLFW_KEY_PAGEDOWN (GLFW_KEY_SPECIAL+43) #define GLFW_KEY_HOME (GLFW_KEY_SPECIAL+44) #define GLFW_KEY_END (GLFW_KEY_SPECIAL+45) #define GLFW_KEY_KP_0 (GLFW_KEY_SPECIAL+46) #define GLFW_KEY_KP_1 (GLFW_KEY_SPECIAL+47) #define GLFW_KEY_KP_2 (GLFW_KEY_SPECIAL+48) #define GLFW_KEY_KP_3 (GLFW_KEY_SPECIAL+49) #define GLFW_KEY_KP_4 (GLFW_KEY_SPECIAL+50) #define GLFW_KEY_KP_5 (GLFW_KEY_SPECIAL+51) #define GLFW_KEY_KP_6 (GLFW_KEY_SPECIAL+52) #define GLFW_KEY_KP_7 (GLFW_KEY_SPECIAL+53) #define GLFW_KEY_KP_8 (GLFW_KEY_SPECIAL+54) #define GLFW_KEY_KP_9 (GLFW_KEY_SPECIAL+55) #define GLFW_KEY_KP_DIVIDE (GLFW_KEY_SPECIAL+56) #define GLFW_KEY_KP_MULTIPLY (GLFW_KEY_SPECIAL+57) #define GLFW_KEY_KP_SUBTRACT (GLFW_KEY_SPECIAL+58) #define GLFW_KEY_KP_ADD (GLFW_KEY_SPECIAL+59) #define GLFW_KEY_KP_DECIMAL (GLFW_KEY_SPECIAL+60) #define GLFW_KEY_KP_EQUAL (GLFW_KEY_SPECIAL+61) #define GLFW_KEY_KP_ENTER (GLFW_KEY_SPECIAL+62) #define GLFW_KEY_KP_NUM_LOCK (GLFW_KEY_SPECIAL+63) #define GLFW_KEY_CAPS_LOCK (GLFW_KEY_SPECIAL+64) #define GLFW_KEY_SCROLL_LOCK (GLFW_KEY_SPECIAL+65) #define GLFW_KEY_PAUSE (GLFW_KEY_SPECIAL+66) #define GLFW_KEY_LSUPER (GLFW_KEY_SPECIAL+67) #define GLFW_KEY_RSUPER (GLFW_KEY_SPECIAL+68) #define GLFW_KEY_MENU (GLFW_KEY_SPECIAL+69) #define GLFW_KEY_LAST GLFW_KEY_MENU /* Mouse button definitions */ #define GLFW_MOUSE_BUTTON_1 0 #define GLFW_MOUSE_BUTTON_2 1 #define GLFW_MOUSE_BUTTON_3 2 #define GLFW_MOUSE_BUTTON_4 3 #define GLFW_MOUSE_BUTTON_5 4 #define GLFW_MOUSE_BUTTON_6 5 #define GLFW_MOUSE_BUTTON_7 6 #define GLFW_MOUSE_BUTTON_8 7 #define GLFW_MOUSE_BUTTON_LAST GLFW_MOUSE_BUTTON_8 /* Mouse button aliases */ #define GLFW_MOUSE_BUTTON_LEFT GLFW_MOUSE_BUTTON_1 #define GLFW_MOUSE_BUTTON_RIGHT GLFW_MOUSE_BUTTON_2 #define GLFW_MOUSE_BUTTON_MIDDLE GLFW_MOUSE_BUTTON_3 /* Joystick identifiers */ #define GLFW_JOYSTICK_1 0 #define GLFW_JOYSTICK_2 1 #define GLFW_JOYSTICK_3 2 #define GLFW_JOYSTICK_4 3 #define GLFW_JOYSTICK_5 4 #define GLFW_JOYSTICK_6 5 #define GLFW_JOYSTICK_7 6 #define GLFW_JOYSTICK_8 7 #define GLFW_JOYSTICK_9 8 #define GLFW_JOYSTICK_10 9 #define GLFW_JOYSTICK_11 10 #define GLFW_JOYSTICK_12 11 #define GLFW_JOYSTICK_13 12 #define GLFW_JOYSTICK_14 13 #define GLFW_JOYSTICK_15 14 #define GLFW_JOYSTICK_16 15 #define GLFW_JOYSTICK_LAST GLFW_JOYSTICK_16 /************************************************************************* * Other definitions *************************************************************************/ /* glfwOpenWindow modes */ #define GLFW_WINDOW 0x00010001 #define GLFW_FULLSCREEN 0x00010002 /* glfwGetWindowParam tokens */ #define GLFW_OPENED 0x00020001 #define GLFW_ACTIVE 0x00020002 #define GLFW_ICONIFIED 0x00020003 #define GLFW_ACCELERATED 0x00020004 #define GLFW_RED_BITS 0x00020005 #define GLFW_GREEN_BITS 0x00020006 #define GLFW_BLUE_BITS 0x00020007 #define GLFW_ALPHA_BITS 0x00020008 #define GLFW_DEPTH_BITS 0x00020009 #define GLFW_STENCIL_BITS 0x0002000A /* The following constants are used for both glfwGetWindowParam * and glfwOpenWindowHint */ #define GLFW_REFRESH_RATE 0x0002000B #define GLFW_ACCUM_RED_BITS 0x0002000C #define GLFW_ACCUM_GREEN_BITS 0x0002000D #define GLFW_ACCUM_BLUE_BITS 0x0002000E #define GLFW_ACCUM_ALPHA_BITS 0x0002000F #define GLFW_AUX_BUFFERS 0x00020010 #define GLFW_STEREO 0x00020011 #define GLFW_WINDOW_NO_RESIZE 0x00020012 #define GLFW_FSAA_SAMPLES 0x00020013 #define GLFW_OPENGL_VERSION_MAJOR 0x00020014 #define GLFW_OPENGL_VERSION_MINOR 0x00020015 #define GLFW_OPENGL_FORWARD_COMPAT 0x00020016 #define GLFW_OPENGL_DEBUG_CONTEXT 0x00020017 #define GLFW_OPENGL_PROFILE 0x00020018 /* GLFW_OPENGL_PROFILE tokens */ #define GLFW_OPENGL_CORE_PROFILE 0x00050001 #define GLFW_OPENGL_COMPAT_PROFILE 0x00050002 /* glfwEnable/glfwDisable tokens */ #define GLFW_MOUSE_CURSOR 0x00030001 #define GLFW_STICKY_KEYS 0x00030002 #define GLFW_STICKY_MOUSE_BUTTONS 0x00030003 #define GLFW_SYSTEM_KEYS 0x00030004 #define GLFW_KEY_REPEAT 0x00030005 #define GLFW_AUTO_POLL_EVENTS 0x00030006 /* glfwWaitThread wait modes */ #define GLFW_WAIT 0x00040001 #define GLFW_NOWAIT 0x00040002 /* glfwGetJoystickParam tokens */ #define GLFW_PRESENT 0x00050001 #define GLFW_AXES 0x00050002 #define GLFW_BUTTONS 0x00050003 /* glfwReadImage/glfwLoadTexture2D flags */ #define GLFW_NO_RESCALE_BIT 0x00000001 /* Only for glfwReadImage */ #define GLFW_ORIGIN_UL_BIT 0x00000002 #define GLFW_BUILD_MIPMAPS_BIT 0x00000004 /* Only for glfwLoadTexture2D */ #define GLFW_ALPHA_MAP_BIT 0x00000008 /* Time spans longer than this (seconds) are considered to be infinity */ #define GLFW_INFINITY 100000.0 /************************************************************************* * Typedefs *************************************************************************/ /* The video mode structure used by glfwGetVideoModes() */ typedef struct { int Width, Height; int RedBits, BlueBits, GreenBits; } GLFWvidmode; /* Image/texture information */ typedef struct { int Width, Height; int Format; int BytesPerPixel; unsigned char *Data; } GLFWimage; /* Thread ID */ typedef int GLFWthread; /* Mutex object */ typedef void * GLFWmutex; /* Condition variable object */ typedef void * GLFWcond; /* Function pointer types */ typedef void (GLFWCALL * GLFWwindowsizefun)(int,int); typedef int (GLFWCALL * GLFWwindowclosefun)(void); typedef void (GLFWCALL * GLFWwindowrefreshfun)(void); typedef void (GLFWCALL * GLFWmousebuttonfun)(int,int); typedef void (GLFWCALL * GLFWmouseposfun)(int,int); typedef void (GLFWCALL * GLFWmousewheelfun)(int); typedef void (GLFWCALL * GLFWkeyfun)(int,int); typedef void (GLFWCALL * GLFWcharfun)(int,int); typedef void (GLFWCALL * GLFWthreadfun)(void *); /************************************************************************* * Prototypes *************************************************************************/ /* GLFW initialization, termination and version querying */ GLFWAPI int GLFWAPIENTRY glfwInit( void ); GLFWAPI void GLFWAPIENTRY glfwTerminate( void ); GLFWAPI void GLFWAPIENTRY glfwGetVersion( int *major, int *minor, int *rev ); /* Window handling */ GLFWAPI int GLFWAPIENTRY glfwOpenWindow( int width, int height, int redbits, int greenbits, int bluebits, int alphabits, int depthbits, int stencilbits, int mode ); GLFWAPI void GLFWAPIENTRY glfwOpenWindowHint( int target, int hint ); GLFWAPI void GLFWAPIENTRY glfwCloseWindow( void ); GLFWAPI void GLFWAPIENTRY glfwSetWindowTitle( const char *title ); GLFWAPI void GLFWAPIENTRY glfwGetWindowSize( int *width, int *height ); GLFWAPI void GLFWAPIENTRY glfwSetWindowSize( int width, int height ); GLFWAPI void GLFWAPIENTRY glfwSetWindowPos( int x, int y ); GLFWAPI void GLFWAPIENTRY glfwIconifyWindow( void ); GLFWAPI void GLFWAPIENTRY glfwRestoreWindow( void ); GLFWAPI void GLFWAPIENTRY glfwSwapBuffers( void ); GLFWAPI void GLFWAPIENTRY glfwSwapInterval( int interval ); GLFWAPI int GLFWAPIENTRY glfwGetWindowParam( int param ); GLFWAPI void GLFWAPIENTRY glfwSetWindowSizeCallback( GLFWwindowsizefun cbfun ); GLFWAPI void GLFWAPIENTRY glfwSetWindowCloseCallback( GLFWwindowclosefun cbfun ); GLFWAPI void GLFWAPIENTRY glfwSetWindowRefreshCallback( GLFWwindowrefreshfun cbfun ); /* Video mode functions */ GLFWAPI int GLFWAPIENTRY glfwGetVideoModes( GLFWvidmode *list, int maxcount ); GLFWAPI void GLFWAPIENTRY glfwGetDesktopMode( GLFWvidmode *mode ); /* Input handling */ GLFWAPI void GLFWAPIENTRY glfwPollEvents( void ); GLFWAPI void GLFWAPIENTRY glfwWaitEvents( void ); GLFWAPI int GLFWAPIENTRY glfwGetKey( int key ); GLFWAPI int GLFWAPIENTRY glfwGetMouseButton( int button ); GLFWAPI void GLFWAPIENTRY glfwGetMousePos( int *xpos, int *ypos ); GLFWAPI void GLFWAPIENTRY glfwSetMousePos( int xpos, int ypos ); GLFWAPI int GLFWAPIENTRY glfwGetMouseWheel( void ); GLFWAPI void GLFWAPIENTRY glfwSetMouseWheel( int pos ); GLFWAPI void GLFWAPIENTRY glfwSetKeyCallback( GLFWkeyfun cbfun ); GLFWAPI void GLFWAPIENTRY glfwSetCharCallback( GLFWcharfun cbfun ); GLFWAPI void GLFWAPIENTRY glfwSetMouseButtonCallback( GLFWmousebuttonfun cbfun ); GLFWAPI void GLFWAPIENTRY glfwSetMousePosCallback( GLFWmouseposfun cbfun ); GLFWAPI void GLFWAPIENTRY glfwSetMouseWheelCallback( GLFWmousewheelfun cbfun ); /* Joystick input */ GLFWAPI int GLFWAPIENTRY glfwGetJoystickParam( int joy, int param ); GLFWAPI int GLFWAPIENTRY glfwGetJoystickPos( int joy, float *pos, int numaxes ); GLFWAPI int GLFWAPIENTRY glfwGetJoystickButtons( int joy, unsigned char *buttons, int numbuttons ); /* Time */ GLFWAPI double GLFWAPIENTRY glfwGetTime( void ); GLFWAPI void GLFWAPIENTRY glfwSetTime( double time ); GLFWAPI void GLFWAPIENTRY glfwSleep( double time ); /* Extension support */ GLFWAPI int GLFWAPIENTRY glfwExtensionSupported( const char *extension ); GLFWAPI void* GLFWAPIENTRY glfwGetProcAddress( const char *procname ); GLFWAPI void GLFWAPIENTRY glfwGetGLVersion( int *major, int *minor, int *rev ); /* Threading support */ GLFWAPI GLFWthread GLFWAPIENTRY glfwCreateThread( GLFWthreadfun fun, void *arg ); GLFWAPI void GLFWAPIENTRY glfwDestroyThread( GLFWthread ID ); GLFWAPI int GLFWAPIENTRY glfwWaitThread( GLFWthread ID, int waitmode ); GLFWAPI GLFWthread GLFWAPIENTRY glfwGetThreadID( void ); GLFWAPI GLFWmutex GLFWAPIENTRY glfwCreateMutex( void ); GLFWAPI void GLFWAPIENTRY glfwDestroyMutex( GLFWmutex mutex ); GLFWAPI void GLFWAPIENTRY glfwLockMutex( GLFWmutex mutex ); GLFWAPI void GLFWAPIENTRY glfwUnlockMutex( GLFWmutex mutex ); GLFWAPI GLFWcond GLFWAPIENTRY glfwCreateCond( void ); GLFWAPI void GLFWAPIENTRY glfwDestroyCond( GLFWcond cond ); GLFWAPI void GLFWAPIENTRY glfwWaitCond( GLFWcond cond, GLFWmutex mutex, double timeout ); GLFWAPI void GLFWAPIENTRY glfwSignalCond( GLFWcond cond ); GLFWAPI void GLFWAPIENTRY glfwBroadcastCond( GLFWcond cond ); GLFWAPI int GLFWAPIENTRY glfwGetNumberOfProcessors( void ); /* Enable/disable functions */ GLFWAPI void GLFWAPIENTRY glfwEnable( int token ); GLFWAPI void GLFWAPIENTRY glfwDisable( int token ); /* Image/texture I/O support */ GLFWAPI int GLFWAPIENTRY glfwReadImage( const char *name, GLFWimage *img, int flags ); GLFWAPI int GLFWAPIENTRY glfwReadMemoryImage( const void *data, long size, GLFWimage *img, int flags ); GLFWAPI void GLFWAPIENTRY glfwFreeImage( GLFWimage *img ); GLFWAPI int GLFWAPIENTRY glfwLoadTexture2D( const char *name, int flags ); GLFWAPI int GLFWAPIENTRY glfwLoadMemoryTexture2D( const void *data, long size, int flags ); GLFWAPI int GLFWAPIENTRY glfwLoadTextureImage2D( GLFWimage *img, int flags ); #ifdef __cplusplus } #endif #endif /* __glfw_h_ */ GLFW-0.5.1.0/glfw/lib/0000755000000000000000000000000012045371042012303 5ustar0000000000000000GLFW-0.5.1.0/glfw/lib/enable.c0000644000000000000000000002056012045371042013700 0ustar0000000000000000//======================================================================== // GLFW - An OpenGL framework // Platform: Any // API version: 2.7 // WWW: http://www.glfw.org/ //------------------------------------------------------------------------ // Copyright (c) 2002-2006 Marcus Geelnard // Copyright (c) 2006-2010 Camilla Berglund // // This software is provided 'as-is', without any express or implied // warranty. In no event will the authors be held liable for any damages // arising from the use of this software. // // Permission is granted to anyone to use this software for any purpose, // including commercial applications, and to alter it and redistribute it // freely, subject to the following restrictions: // // 1. The origin of this software must not be misrepresented; you must not // claim that you wrote the original software. If you use this software // in a product, an acknowledgment in the product documentation would // be appreciated but is not required. // // 2. Altered source versions must be plainly marked as such, and must not // be misrepresented as being the original software. // // 3. This notice may not be removed or altered from any source // distribution. // //======================================================================== #include "internal.h" //************************************************************************ //**** GLFW internal functions **** //************************************************************************ //======================================================================== // Enable (show) mouse cursor //======================================================================== static void enableMouseCursor( void ) { int centerPosX, centerPosY; if( !_glfwWin.opened || !_glfwWin.mouseLock ) { return; } // Show mouse cursor _glfwPlatformShowMouseCursor(); centerPosX = _glfwWin.width / 2; centerPosY = _glfwWin.height / 2; if( centerPosX != _glfwInput.MousePosX || centerPosY != _glfwInput.MousePosY ) { _glfwPlatformSetMouseCursorPos( centerPosX, centerPosY ); _glfwInput.MousePosX = centerPosX; _glfwInput.MousePosY = centerPosY; if( _glfwWin.mousePosCallback ) { _glfwWin.mousePosCallback( _glfwInput.MousePosX, _glfwInput.MousePosY ); } } // From now on the mouse is unlocked _glfwWin.mouseLock = GL_FALSE; } //======================================================================== // Disable (hide) mouse cursor //======================================================================== static void disableMouseCursor( void ) { if( !_glfwWin.opened || _glfwWin.mouseLock ) { return; } // Hide mouse cursor _glfwPlatformHideMouseCursor(); // Move cursor to the middle of the window _glfwPlatformSetMouseCursorPos( _glfwWin.width >> 1, _glfwWin.height >> 1 ); // From now on the mouse is locked _glfwWin.mouseLock = GL_TRUE; } //======================================================================== // Enable sticky keys //======================================================================== static void enableStickyKeys( void ) { _glfwInput.StickyKeys = 1; } //======================================================================== // Disable sticky keys //======================================================================== static void disableStickyKeys( void ) { int i; _glfwInput.StickyKeys = 0; // Release all sticky keys for( i = 0; i <= GLFW_KEY_LAST; i++ ) { if( _glfwInput.Key[ i ] == 2 ) { _glfwInput.Key[ i ] = 0; } } } //======================================================================== // Enable sticky mouse buttons //======================================================================== static void enableStickyMouseButtons( void ) { _glfwInput.StickyMouseButtons = 1; } //======================================================================== // Disable sticky mouse buttons //======================================================================== static void disableStickyMouseButtons( void ) { int i; _glfwInput.StickyMouseButtons = 0; // Release all sticky mouse buttons for( i = 0; i <= GLFW_MOUSE_BUTTON_LAST; i++ ) { if( _glfwInput.MouseButton[ i ] == 2 ) { _glfwInput.MouseButton[ i ] = 0; } } } //======================================================================== // Enable system keys //======================================================================== static void enableSystemKeys( void ) { if( !_glfwWin.sysKeysDisabled ) { return; } _glfwPlatformEnableSystemKeys(); // Indicate that system keys are no longer disabled _glfwWin.sysKeysDisabled = GL_FALSE; } //======================================================================== // Disable system keys //======================================================================== static void disableSystemKeys( void ) { if( _glfwWin.sysKeysDisabled ) { return; } _glfwPlatformDisableSystemKeys(); // Indicate that system keys are now disabled _glfwWin.sysKeysDisabled = GL_TRUE; } //======================================================================== // Enable key repeat //======================================================================== static void enableKeyRepeat( void ) { _glfwInput.KeyRepeat = 1; } //======================================================================== // Disable key repeat //======================================================================== static void disableKeyRepeat( void ) { _glfwInput.KeyRepeat = 0; } //======================================================================== // Enable automatic event polling //======================================================================== static void enableAutoPollEvents( void ) { _glfwWin.autoPollEvents = 1; } //======================================================================== // Disable automatic event polling //======================================================================== static void disableAutoPollEvents( void ) { _glfwWin.autoPollEvents = 0; } //************************************************************************ //**** GLFW user functions **** //************************************************************************ //======================================================================== // Enable certain GLFW/window/system functions. //======================================================================== GLFWAPI void GLFWAPIENTRY glfwEnable( int token ) { // Is GLFW initialized? if( !_glfwInitialized ) { return; } switch( token ) { case GLFW_MOUSE_CURSOR: enableMouseCursor(); break; case GLFW_STICKY_KEYS: enableStickyKeys(); break; case GLFW_STICKY_MOUSE_BUTTONS: enableStickyMouseButtons(); break; case GLFW_SYSTEM_KEYS: enableSystemKeys(); break; case GLFW_KEY_REPEAT: enableKeyRepeat(); break; case GLFW_AUTO_POLL_EVENTS: enableAutoPollEvents(); break; default: break; } } //======================================================================== // Disable certain GLFW/window/system functions. //======================================================================== GLFWAPI void GLFWAPIENTRY glfwDisable( int token ) { // Is GLFW initialized? if( !_glfwInitialized ) { return; } switch( token ) { case GLFW_MOUSE_CURSOR: disableMouseCursor(); break; case GLFW_STICKY_KEYS: disableStickyKeys(); break; case GLFW_STICKY_MOUSE_BUTTONS: disableStickyMouseButtons(); break; case GLFW_SYSTEM_KEYS: disableSystemKeys(); break; case GLFW_KEY_REPEAT: disableKeyRepeat(); break; case GLFW_AUTO_POLL_EVENTS: disableAutoPollEvents(); break; default: break; } } GLFW-0.5.1.0/glfw/lib/fullscreen.c0000644000000000000000000000612012045371042014610 0ustar0000000000000000//======================================================================== // GLFW - An OpenGL framework // Platform: Any // API version: 2.7 // WWW: http://www.glfw.org/ //------------------------------------------------------------------------ // Copyright (c) 2002-2006 Marcus Geelnard // Copyright (c) 2006-2010 Camilla Berglund // // This software is provided 'as-is', without any express or implied // warranty. In no event will the authors be held liable for any damages // arising from the use of this software. // // Permission is granted to anyone to use this software for any purpose, // including commercial applications, and to alter it and redistribute it // freely, subject to the following restrictions: // // 1. The origin of this software must not be misrepresented; you must not // claim that you wrote the original software. If you use this software // in a product, an acknowledgment in the product documentation would // be appreciated but is not required. // // 2. Altered source versions must be plainly marked as such, and must not // be misrepresented as being the original software. // // 3. This notice may not be removed or altered from any source // distribution. // //======================================================================== #include "internal.h" //************************************************************************ //**** GLFW user functions **** //************************************************************************ //======================================================================== // Get a list of available video modes //======================================================================== GLFWAPI int GLFWAPIENTRY glfwGetVideoModes( GLFWvidmode *list, int maxcount ) { int count, i, swap, res1, res2, depth1, depth2; GLFWvidmode vm; if( !_glfwInitialized || maxcount <= 0 || list == (GLFWvidmode*) 0 ) { return 0; } // Get list of video modes count = _glfwPlatformGetVideoModes( list, maxcount ); // Sort list (bubble sort) do { swap = 0; for( i = 0; i < count-1; ++ i ) { res1 = list[i].Width*list[i].Height; depth1 = list[i].RedBits+list[i].GreenBits+list[i].BlueBits; res2 = list[i+1].Width*list[i+1].Height; depth2 = list[i+1].RedBits+list[i+1].GreenBits+ list[i+1].BlueBits; if( (depth2 // // This software is provided 'as-is', without any express or implied // warranty. In no event will the authors be held liable for any damages // arising from the use of this software. // // Permission is granted to anyone to use this software for any purpose, // including commercial applications, and to alter it and redistribute it // freely, subject to the following restrictions: // // 1. The origin of this software must not be misrepresented; you must not // claim that you wrote the original software. If you use this software // in a product, an acknowledgment in the product documentation would // be appreciated but is not required. // // 2. Altered source versions must be plainly marked as such, and must not // be misrepresented as being the original software. // // 3. This notice may not be removed or altered from any source // distribution. // //======================================================================== #include "internal.h" //************************************************************************ //**** GLFW internal functions **** //************************************************************************ #ifndef GL_VERSION_3_0 #define GL_NUM_EXTENSIONS 0x821D #define GL_CONTEXT_FLAGS 0x821E #define GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT 0x0001 #endif #ifndef GL_VERSION_3_2 #define GL_CONTEXT_CORE_PROFILE_BIT 0x00000001 #define GL_CONTEXT_COMPATIBILITY_PROFILE_BIT 0x00000002 #define GL_CONTEXT_PROFILE_MASK 0x9126 #endif //======================================================================== // Parses the OpenGL version string and extracts the version number //======================================================================== void _glfwParseGLVersion( int *major, int *minor, int *rev ) { GLuint _major, _minor = 0, _rev = 0; const GLubyte *version; const GLubyte *ptr; // Get OpenGL version string version = glGetString( GL_VERSION ); if( !version ) { return; } // Parse string ptr = version; for( _major = 0; *ptr >= '0' && *ptr <= '9'; ptr ++ ) { _major = 10*_major + (*ptr - '0'); } if( *ptr == '.' ) { ptr ++; for( _minor = 0; *ptr >= '0' && *ptr <= '9'; ptr ++ ) { _minor = 10*_minor + (*ptr - '0'); } if( *ptr == '.' ) { ptr ++; for( _rev = 0; *ptr >= '0' && *ptr <= '9'; ptr ++ ) { _rev = 10*_rev + (*ptr - '0'); } } } // Return parsed values *major = _major; *minor = _minor; *rev = _rev; } //======================================================================== // Check if a string can be found in an OpenGL extension string //======================================================================== int _glfwStringInExtensionString( const char *string, const GLubyte *extensions ) { const GLubyte *start; GLubyte *where, *terminator; // It takes a bit of care to be fool-proof about parsing the // OpenGL extensions string. Don't be fooled by sub-strings, // etc. start = extensions; while( 1 ) { where = (GLubyte *) strstr( (const char *) start, string ); if( !where ) { return GL_FALSE; } terminator = where + strlen( string ); if( where == start || *(where - 1) == ' ' ) { if( *terminator == ' ' || *terminator == '\0' ) { break; } } start = terminator; } return GL_TRUE; } //======================================================================== // Reads back OpenGL context properties from the current context //======================================================================== void _glfwRefreshContextParams( void ) { _glfwParseGLVersion( &_glfwWin.glMajor, &_glfwWin.glMinor, &_glfwWin.glRevision ); _glfwWin.glProfile = 0; _glfwWin.glForward = GL_FALSE; // Read back the context profile, if applicable if( _glfwWin.glMajor >= 3 ) { GLint flags; glGetIntegerv( GL_CONTEXT_FLAGS, &flags ); if( flags & GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT ) { _glfwWin.glForward = GL_TRUE; } } if( _glfwWin.glMajor > 3 || ( _glfwWin.glMajor == 3 && _glfwWin.glMinor >= 2 ) ) { GLint mask; glGetIntegerv( GL_CONTEXT_PROFILE_MASK, &mask ); if( mask & GL_CONTEXT_COMPATIBILITY_PROFILE_BIT ) { _glfwWin.glProfile = GLFW_OPENGL_COMPAT_PROFILE; } else if( mask & GL_CONTEXT_CORE_PROFILE_BIT ) { _glfwWin.glProfile = GLFW_OPENGL_CORE_PROFILE; } } } //************************************************************************ //**** GLFW user functions **** //************************************************************************ //======================================================================== // Check if an OpenGL extension is available at runtime //======================================================================== GLFWAPI int GLFWAPIENTRY glfwExtensionSupported( const char *extension ) { const GLubyte *extensions; GLubyte *where; // Is GLFW initialized? if( !_glfwInitialized || !_glfwWin.opened ) { return GL_FALSE; } // Extension names should not have spaces where = (GLubyte *) strchr( extension, ' ' ); if( where || *extension == '\0' ) { return GL_FALSE; } if( _glfwWin.glMajor < 3 ) { // Check if extension is in the old style OpenGL extensions string extensions = glGetString( GL_EXTENSIONS ); if( extensions != NULL ) { if( _glfwStringInExtensionString( extension, extensions ) ) { return GL_TRUE; } } } else { // Check if extension is in the modern OpenGL extensions string list GLint count; int i; glGetIntegerv( GL_NUM_EXTENSIONS, &count ); for( i = 0; i < count; i++ ) { if( strcmp( (const char*) _glfwWin.GetStringi( GL_EXTENSIONS, i ), extension ) == 0 ) { return GL_TRUE; } } } // Additional platform specific extension checking (e.g. WGL) if( _glfwPlatformExtensionSupported( extension ) ) { return GL_TRUE; } return GL_FALSE; } //======================================================================== // Get the function pointer to an OpenGL function. This function can be // used to get access to extended OpenGL functions. //======================================================================== GLFWAPI void * GLFWAPIENTRY glfwGetProcAddress( const char *procname ) { // Is GLFW initialized? if( !_glfwInitialized || !_glfwWin.opened ) { return NULL; } return _glfwPlatformGetProcAddress( procname ); } //======================================================================== // Returns the OpenGL version //======================================================================== GLFWAPI void GLFWAPIENTRY glfwGetGLVersion( int *major, int *minor, int *rev ) { // Is GLFW initialized? if( !_glfwInitialized || !_glfwWin.opened ) { return; } if( major != NULL ) { *major = _glfwWin.glMajor; } if( minor != NULL ) { *minor = _glfwWin.glMinor; } if( rev != NULL ) { *rev = _glfwWin.glRevision; } } GLFW-0.5.1.0/glfw/lib/image.c0000644000000000000000000004241012045371042013532 0ustar0000000000000000//======================================================================== // GLFW - An OpenGL framework // Platform: Any // API version: 2.7 // WWW: http://www.glfw.org/ //------------------------------------------------------------------------ // Copyright (c) 2002-2006 Marcus Geelnard // Copyright (c) 2006-2010 Camilla Berglund // // This software is provided 'as-is', without any express or implied // warranty. In no event will the authors be held liable for any damages // arising from the use of this software. // // Permission is granted to anyone to use this software for any purpose, // including commercial applications, and to alter it and redistribute it // freely, subject to the following restrictions: // // 1. The origin of this software must not be misrepresented; you must not // claim that you wrote the original software. If you use this software // in a product, an acknowledgment in the product documentation would // be appreciated but is not required. // // 2. Altered source versions must be plainly marked as such, and must not // be misrepresented as being the original software. // // 3. This notice may not be removed or altered from any source // distribution. // //======================================================================== //======================================================================== // Description: // // This module acts as an interface for different image file formats (the // image file format is detected automatically). // // By default the loaded image is rescaled (using bilinear interpolation) // to the next higher 2^N x 2^M resolution, unless it has a valid // 2^N x 2^M resolution. The interpolation is quite slow, even if the // routine has been optimized for speed (a 200x200 RGB image is scaled to // 256x256 in ~30 ms on a P3-500). // // Paletted images are converted to RGB/RGBA images. // // A convenience function is also included (glfwLoadTexture2D), which // loads a texture image from a file directly to OpenGL texture memory, // with an option to generate all mipmap levels. GL_SGIS_generate_mipmap // is used whenever available, which should give an optimal mipmap // generation speed (possibly performed in hardware). A software fallback // method is included when GL_SGIS_generate_mipmap is not supported (it // generates all mipmaps of a 256x256 RGB texture in ~3 ms on a P3-500). // //======================================================================== #include "internal.h" // We want to support automatic mipmap generation #ifndef GL_SGIS_generate_mipmap #define GL_GENERATE_MIPMAP_SGIS 0x8191 #define GL_GENERATE_MIPMAP_HINT_SGIS 0x8192 #define GL_SGIS_generate_mipmap 1 #endif // GL_SGIS_generate_mipmap //************************************************************************ //**** GLFW internal functions **** //************************************************************************ //======================================================================== // Upsample image, from size w1 x h1 to w2 x h2 //======================================================================== static void UpsampleImage( unsigned char *src, unsigned char *dst, int w1, int h1, int w2, int h2, int bpp ) { int m, n, k, x, y, col8; float dx, dy, xstep, ystep, col, col1, col2; unsigned char *src1, *src2, *src3, *src4; // Calculate scaling factor xstep = (float)(w1-1) / (float)(w2-1); ystep = (float)(h1-1) / (float)(h2-1); // Copy source data to destination data with bilinear interpolation // Note: The rather strange look of this routine is a direct result of // my attempts at optimizing it. Improvements are welcome! dy = 0.0f; y = 0; for( n = 0; n < h2; n ++ ) { dx = 0.0f; src1 = &src[ y*w1*bpp ]; src3 = y < (h1-1) ? src1 + w1*bpp : src1; src2 = src1 + bpp; src4 = src3 + bpp; x = 0; for( m = 0; m < w2; m ++ ) { for( k = 0; k < bpp; k ++ ) { col1 = *src1 ++; col2 = *src2 ++; col = col1 + (col2 - col1) * dx; col1 = *src3 ++; col2 = *src4 ++; col2 = col1 + (col2 - col1) * dx; col += (col2 - col) * dy; col8 = (int) (col + 0.5); if( col8 >= 256 ) col8 = 255; *dst++ = (unsigned char) col8; } dx += xstep; if( dx >= 1.0f ) { x ++; dx -= 1.0f; if( x >= (w1-1) ) { src2 = src1; src4 = src3; } } else { src1 -= bpp; src2 -= bpp; src3 -= bpp; src4 -= bpp; } } dy += ystep; if( dy >= 1.0f ) { y ++; dy -= 1.0f; } } } //======================================================================== // Build the next mip-map level //======================================================================== static int HalveImage( GLubyte *src, int *width, int *height, int components ) { int halfwidth, halfheight, m, n, k, idx1, idx2; GLubyte *dst; // Last level? if( *width <= 1 && *height <= 1 ) { return GL_FALSE; } // Calculate new width and height (handle 1D case) halfwidth = *width > 1 ? *width / 2 : 1; halfheight = *height > 1 ? *height / 2 : 1; // Downsample image with a simple box-filter dst = src; if( *width == 1 || *height == 1 ) { // 1D case for( m = 0; m < halfwidth+halfheight-1; m ++ ) { for( k = 0; k < components; k ++ ) { *dst ++ = (GLubyte) (((int)*src + (int)src[components] + 1) >> 1); src ++; } src += components; } } else { // 2D case idx1 = *width*components; idx2 = (*width+1)*components; for( m = 0; m < halfheight; m ++ ) { for( n = 0; n < halfwidth; n ++ ) { for( k = 0; k < components; k ++ ) { *dst ++ = (GLubyte) (((int)*src + (int)src[components] + (int)src[idx1] + (int)src[idx2] + 2) >> 2); src ++; } src += components; } src += components * (*width); } } // Return new width and height *width = halfwidth; *height = halfheight; return GL_TRUE; } //======================================================================== // Rescales an image into power-of-two dimensions //======================================================================== static int RescaleImage( GLFWimage* image ) { int width, height, log2, newsize; unsigned char *data; // Calculate next larger 2^N width for( log2 = 0, width = image->Width; width > 1; width >>= 1, log2 ++ ) ; width = (int) 1 << log2; if( width < image->Width ) { width <<= 1; } // Calculate next larger 2^M height for( log2 = 0, height = image->Height; height > 1; height >>= 1, log2 ++ ) ; height = (int) 1 << log2; if( height < image->Height ) { height <<= 1; } // Do we really need to rescale? if( width != image->Width || height != image->Height ) { // Allocate memory for new (upsampled) image data newsize = width * height * image->BytesPerPixel; data = (unsigned char *) malloc( newsize ); if( data == NULL ) { free( image->Data ); return GL_FALSE; } // Copy old image data to new image data with interpolation UpsampleImage( image->Data, data, image->Width, image->Height, width, height, image->BytesPerPixel ); // Free memory for old image data (not needed anymore) free( image->Data ); // Set pointer to new image data, and set new image dimensions image->Data = data; image->Width = width; image->Height = height; } return GL_TRUE; } //************************************************************************ //**** GLFW user functions **** //************************************************************************ //======================================================================== // Read an image from a named file //======================================================================== GLFWAPI int GLFWAPIENTRY glfwReadImage( const char *name, GLFWimage *img, int flags ) { _GLFWstream stream; // Is GLFW initialized? if( !_glfwInitialized ) { return GL_FALSE; } // Start with an empty image descriptor img->Width = 0; img->Height = 0; img->BytesPerPixel = 0; img->Data = NULL; // Open file if( !_glfwOpenFileStream( &stream, name, "rb" ) ) { return GL_FALSE; } // We only support TGA files at the moment if( !_glfwReadTGA( &stream, img, flags ) ) { _glfwCloseStream( &stream ); return GL_FALSE; } // Close stream _glfwCloseStream( &stream ); // Should we rescale the image to closest 2^N x 2^M resolution? if( !(flags & GLFW_NO_RESCALE_BIT) ) { if( !RescaleImage( img ) ) { return GL_FALSE; } } // Interpret BytesPerPixel as an OpenGL format switch( img->BytesPerPixel ) { default: case 1: if( flags & GLFW_ALPHA_MAP_BIT ) { img->Format = GL_ALPHA; } else { img->Format = GL_LUMINANCE; } break; case 3: img->Format = GL_RGB; break; case 4: img->Format = GL_RGBA; break; } return GL_TRUE; } //======================================================================== // Read an image file from a memory buffer //======================================================================== GLFWAPI int GLFWAPIENTRY glfwReadMemoryImage( const void *data, long size, GLFWimage *img, int flags ) { _GLFWstream stream; // Is GLFW initialized? if( !_glfwInitialized ) { return GL_FALSE; } // Start with an empty image descriptor img->Width = 0; img->Height = 0; img->BytesPerPixel = 0; img->Data = NULL; // Open buffer if( !_glfwOpenBufferStream( &stream, (void*) data, size ) ) { return GL_FALSE; } // We only support TGA files at the moment if( !_glfwReadTGA( &stream, img, flags ) ) { _glfwCloseStream( &stream ); return GL_FALSE; } // Close stream _glfwCloseStream( &stream ); // Should we rescale the image to closest 2^N x 2^M resolution? if( !(flags & GLFW_NO_RESCALE_BIT) ) { if( !RescaleImage( img ) ) { return GL_FALSE; } } // Interpret BytesPerPixel as an OpenGL format switch( img->BytesPerPixel ) { default: case 1: if( flags & GLFW_ALPHA_MAP_BIT ) { img->Format = GL_ALPHA; } else { img->Format = GL_LUMINANCE; } break; case 3: img->Format = GL_RGB; break; case 4: img->Format = GL_RGBA; break; } return GL_TRUE; } //======================================================================== // Free allocated memory for an image //======================================================================== GLFWAPI void GLFWAPIENTRY glfwFreeImage( GLFWimage *img ) { // Is GLFW initialized? if( !_glfwInitialized ) { return; } // Free memory if( img->Data != NULL ) { free( img->Data ); img->Data = NULL; } // Clear all fields img->Width = 0; img->Height = 0; img->Format = 0; img->BytesPerPixel = 0; } //======================================================================== // Read an image from a file, and upload it to texture memory //======================================================================== GLFWAPI int GLFWAPIENTRY glfwLoadTexture2D( const char *name, int flags ) { GLFWimage img; // Is GLFW initialized? if( !_glfwInitialized || !_glfwWin.opened ) { return GL_FALSE; } // Force rescaling if necessary if( !_glfwWin.has_GL_ARB_texture_non_power_of_two ) { flags &= (~GLFW_NO_RESCALE_BIT); } // Read image from file if( !glfwReadImage( name, &img, flags ) ) { return GL_FALSE; } if( !glfwLoadTextureImage2D( &img, flags ) ) { return GL_FALSE; } // Data buffer is not needed anymore glfwFreeImage( &img ); return GL_TRUE; } //======================================================================== // Read an image from a buffer, and upload it to texture memory //======================================================================== GLFWAPI int GLFWAPIENTRY glfwLoadMemoryTexture2D( const void *data, long size, int flags ) { GLFWimage img; // Is GLFW initialized? if( !_glfwInitialized || !_glfwWin.opened ) { return GL_FALSE; } // Force rescaling if necessary if( !_glfwWin.has_GL_ARB_texture_non_power_of_two ) { flags &= (~GLFW_NO_RESCALE_BIT); } // Read image from file if( !glfwReadMemoryImage( data, size, &img, flags ) ) { return GL_FALSE; } if( !glfwLoadTextureImage2D( &img, flags ) ) { return GL_FALSE; } // Data buffer is not needed anymore glfwFreeImage( &img ); return GL_TRUE; } //======================================================================== // Upload an image object to texture memory //======================================================================== GLFWAPI int GLFWAPIENTRY glfwLoadTextureImage2D( GLFWimage *img, int flags ) { GLint UnpackAlignment, GenMipMap; int level, format, AutoGen, newsize, n; unsigned char *data, *dataptr; // Is GLFW initialized? if( !_glfwInitialized || !_glfwWin.opened ) { return GL_FALSE; } // TODO: Use GL_MAX_TEXTURE_SIZE or GL_PROXY_TEXTURE_2D to determine // whether the image size is valid. // NOTE: May require box filter downsampling routine. // Do we need to convert the alpha map to RGBA format (OpenGL 1.0)? if( (_glfwWin.glMajor == 1) && (_glfwWin.glMinor == 0) && (img->Format == GL_ALPHA) ) { // We go to RGBA representation instead img->BytesPerPixel = 4; // Allocate memory for new RGBA image data newsize = img->Width * img->Height * img->BytesPerPixel; data = (unsigned char *) malloc( newsize ); if( data == NULL ) { free( img->Data ); return GL_FALSE; } // Convert Alpha map to RGBA dataptr = data; for( n = 0; n < (img->Width*img->Height); ++ n ) { *dataptr ++ = 255; *dataptr ++ = 255; *dataptr ++ = 255; *dataptr ++ = img->Data[n]; } // Free memory for old image data (not needed anymore) free( img->Data ); // Set pointer to new image data img->Data = data; } // Set unpack alignment to one byte glGetIntegerv( GL_UNPACK_ALIGNMENT, &UnpackAlignment ); glPixelStorei( GL_UNPACK_ALIGNMENT, 1 ); // Should we use automatic mipmap generation? AutoGen = ( flags & GLFW_BUILD_MIPMAPS_BIT ) && _glfwWin.has_GL_SGIS_generate_mipmap; // Enable automatic mipmap generation if( AutoGen ) { glGetTexParameteriv( GL_TEXTURE_2D, GL_GENERATE_MIPMAP_SGIS, &GenMipMap ); glTexParameteri( GL_TEXTURE_2D, GL_GENERATE_MIPMAP_SGIS, GL_TRUE ); } // Format specification is different for OpenGL 1.0 if( _glfwWin.glMajor == 1 && _glfwWin.glMinor == 0 ) { format = img->BytesPerPixel; } else { format = img->Format; } // Upload to texture memeory level = 0; do { // Upload this mipmap level glTexImage2D( GL_TEXTURE_2D, level, format, img->Width, img->Height, 0, format, GL_UNSIGNED_BYTE, (void*) img->Data ); // Build next mipmap level manually, if required if( ( flags & GLFW_BUILD_MIPMAPS_BIT ) && !AutoGen ) { level = HalveImage( img->Data, &img->Width, &img->Height, img->BytesPerPixel ) ? level + 1 : 0; } } while( level != 0 ); // Restore old automatic mipmap generation state if( AutoGen ) { glTexParameteri( GL_TEXTURE_2D, GL_GENERATE_MIPMAP_SGIS, GenMipMap ); } // Restore old unpack alignment glPixelStorei( GL_UNPACK_ALIGNMENT, UnpackAlignment ); return GL_TRUE; } GLFW-0.5.1.0/glfw/lib/init.c0000644000000000000000000000642712045371042013423 0ustar0000000000000000//======================================================================== // GLFW - An OpenGL framework // Platform: Any // API version: 2.7 // WWW: http://www.glfw.org/ //------------------------------------------------------------------------ // Copyright (c) 2002-2006 Marcus Geelnard // Copyright (c) 2006-2010 Camilla Berglund // // This software is provided 'as-is', without any express or implied // warranty. In no event will the authors be held liable for any damages // arising from the use of this software. // // Permission is granted to anyone to use this software for any purpose, // including commercial applications, and to alter it and redistribute it // freely, subject to the following restrictions: // // 1. The origin of this software must not be misrepresented; you must not // claim that you wrote the original software. If you use this software // in a product, an acknowledgment in the product documentation would // be appreciated but is not required. // // 2. Altered source versions must be plainly marked as such, and must not // be misrepresented as being the original software. // // 3. This notice may not be removed or altered from any source // distribution. // //======================================================================== #define _init_c_ #include "internal.h" //************************************************************************ //**** GLFW user functions **** //************************************************************************ //======================================================================== // Initialize various GLFW state //======================================================================== GLFWAPI int GLFWAPIENTRY glfwInit( void ) { // Is GLFW already initialized? if( _glfwInitialized ) { return GL_TRUE; } memset( &_glfwLibrary, 0, sizeof( _glfwLibrary ) ); memset( &_glfwWin, 0, sizeof( _glfwWin ) ); // Window is not yet opened _glfwWin.opened = GL_FALSE; // Default enable/disable settings _glfwWin.sysKeysDisabled = GL_FALSE; // Clear window hints _glfwClearWindowHints(); // Platform specific initialization if( !_glfwPlatformInit() ) { return GL_FALSE; } // Form now on, GLFW state is valid _glfwInitialized = GL_TRUE; return GL_TRUE; } //======================================================================== // Close window and kill all threads. //======================================================================== GLFWAPI void GLFWAPIENTRY glfwTerminate( void ) { // Is GLFW initialized? if( !_glfwInitialized ) { return; } // Platform specific termination if( !_glfwPlatformTerminate() ) { return; } // GLFW is no longer initialized _glfwInitialized = GL_FALSE; } //======================================================================== // Get GLFW version //======================================================================== GLFWAPI void GLFWAPIENTRY glfwGetVersion( int *major, int *minor, int *rev ) { if( major != NULL ) *major = GLFW_VERSION_MAJOR; if( minor != NULL ) *minor = GLFW_VERSION_MINOR; if( rev != NULL ) *rev = GLFW_VERSION_REVISION; } GLFW-0.5.1.0/glfw/lib/input.c0000644000000000000000000001606612045371042013617 0ustar0000000000000000//======================================================================== // GLFW - An OpenGL framework // Platform: Any // API version: 2.7 // WWW: http://www.glfw.org/ //------------------------------------------------------------------------ // Copyright (c) 2002-2006 Marcus Geelnard // Copyright (c) 2006-2010 Camilla Berglund // // This software is provided 'as-is', without any express or implied // warranty. In no event will the authors be held liable for any damages // arising from the use of this software. // // Permission is granted to anyone to use this software for any purpose, // including commercial applications, and to alter it and redistribute it // freely, subject to the following restrictions: // // 1. The origin of this software must not be misrepresented; you must not // claim that you wrote the original software. If you use this software // in a product, an acknowledgment in the product documentation would // be appreciated but is not required. // // 2. Altered source versions must be plainly marked as such, and must not // be misrepresented as being the original software. // // 3. This notice may not be removed or altered from any source // distribution. // //======================================================================== #include "internal.h" //======================================================================== // Return key state //======================================================================== GLFWAPI int GLFWAPIENTRY glfwGetKey( int key ) { if( !_glfwInitialized || !_glfwWin.opened ) { return GLFW_RELEASE; } // Is it a valid key? if( key < 0 || key > GLFW_KEY_LAST ) { return GLFW_RELEASE; } if( _glfwInput.Key[ key ] == GLFW_STICK ) { // Sticky mode: release key now _glfwInput.Key[ key ] = GLFW_RELEASE; return GLFW_PRESS; } return (int) _glfwInput.Key[ key ]; } //======================================================================== // Return mouse button state //======================================================================== GLFWAPI int GLFWAPIENTRY glfwGetMouseButton( int button ) { if( !_glfwInitialized || !_glfwWin.opened ) { return GLFW_RELEASE; } // Is it a valid mouse button? if( button < 0 || button > GLFW_MOUSE_BUTTON_LAST ) { return GLFW_RELEASE; } if( _glfwInput.MouseButton[ button ] == GLFW_STICK ) { // Sticky mode: release mouse button now _glfwInput.MouseButton[ button ] = GLFW_RELEASE; return GLFW_PRESS; } return (int) _glfwInput.MouseButton[ button ]; } //======================================================================== // Return mouse cursor position //======================================================================== GLFWAPI void GLFWAPIENTRY glfwGetMousePos( int *xpos, int *ypos ) { if( !_glfwInitialized || !_glfwWin.opened ) { return; } // Return mouse position if( xpos != NULL ) { *xpos = _glfwInput.MousePosX; } if( ypos != NULL ) { *ypos = _glfwInput.MousePosY; } } //======================================================================== // Sets the mouse cursor position //======================================================================== GLFWAPI void GLFWAPIENTRY glfwSetMousePos( int xpos, int ypos ) { if( !_glfwInitialized || !_glfwWin.opened ) { return; } // Don't do anything if the mouse position did not change if( xpos == _glfwInput.MousePosX && ypos == _glfwInput.MousePosY ) { return; } // Set GLFW mouse position _glfwInput.MousePosX = xpos; _glfwInput.MousePosY = ypos; // If we have a locked mouse, do not change cursor position if( _glfwWin.mouseLock ) { return; } // Update physical cursor position _glfwPlatformSetMouseCursorPos( xpos, ypos ); } //======================================================================== // Return mouse wheel position //======================================================================== GLFWAPI int GLFWAPIENTRY glfwGetMouseWheel( void ) { if( !_glfwInitialized || !_glfwWin.opened ) { return 0; } // Return mouse wheel position return _glfwInput.WheelPos; } //======================================================================== // Set mouse wheel position //======================================================================== GLFWAPI void GLFWAPIENTRY glfwSetMouseWheel( int pos ) { if( !_glfwInitialized || !_glfwWin.opened ) { return; } // Set mouse wheel position _glfwInput.WheelPos = pos; } //======================================================================== // Set callback function for keyboard input //======================================================================== GLFWAPI void GLFWAPIENTRY glfwSetKeyCallback( GLFWkeyfun cbfun ) { if( !_glfwInitialized || !_glfwWin.opened ) { return; } // Set callback function _glfwWin.keyCallback = cbfun; } //======================================================================== // Set callback function for character input //======================================================================== GLFWAPI void GLFWAPIENTRY glfwSetCharCallback( GLFWcharfun cbfun ) { if( !_glfwInitialized || !_glfwWin.opened ) { return; } // Set callback function _glfwWin.charCallback = cbfun; } //======================================================================== // Set callback function for mouse clicks //======================================================================== GLFWAPI void GLFWAPIENTRY glfwSetMouseButtonCallback( GLFWmousebuttonfun cbfun ) { if( !_glfwInitialized || !_glfwWin.opened ) { return; } // Set callback function _glfwWin.mouseButtonCallback = cbfun; } //======================================================================== // Set callback function for mouse moves //======================================================================== GLFWAPI void GLFWAPIENTRY glfwSetMousePosCallback( GLFWmouseposfun cbfun ) { if( !_glfwInitialized || !_glfwWin.opened ) { return; } // Set callback function _glfwWin.mousePosCallback = cbfun; // Call the callback function to let the application know the current // mouse position if( cbfun ) { cbfun( _glfwInput.MousePosX, _glfwInput.MousePosY ); } } //======================================================================== // Set callback function for mouse wheel //======================================================================== GLFWAPI void GLFWAPIENTRY glfwSetMouseWheelCallback( GLFWmousewheelfun cbfun ) { if( !_glfwInitialized || !_glfwWin.opened ) { return; } // Set callback function _glfwWin.mouseWheelCallback = cbfun; // Call the callback function to let the application know the current // mouse wheel position if( cbfun ) { cbfun( _glfwInput.WheelPos ); } } GLFW-0.5.1.0/glfw/lib/internal.h0000644000000000000000000002306712045371042014300 0ustar0000000000000000//======================================================================== // GLFW - An OpenGL framework // Platform: Any // API version: 2.7 // WWW: http://www.glfw.org/ //------------------------------------------------------------------------ // Copyright (c) 2002-2006 Marcus Geelnard // Copyright (c) 2006-2010 Camilla Berglund // // This software is provided 'as-is', without any express or implied // warranty. In no event will the authors be held liable for any damages // arising from the use of this software. // // Permission is granted to anyone to use this software for any purpose, // including commercial applications, and to alter it and redistribute it // freely, subject to the following restrictions: // // 1. The origin of this software must not be misrepresented; you must not // claim that you wrote the original software. If you use this software // in a product, an acknowledgment in the product documentation would // be appreciated but is not required. // // 2. Altered source versions must be plainly marked as such, and must not // be misrepresented as being the original software. // // 3. This notice may not be removed or altered from any source // distribution. // //======================================================================== #ifndef _internal_h_ #define _internal_h_ //======================================================================== // GLFWGLOBAL is a macro that places all global variables in the init.c // module (all other modules reference global variables as 'extern') //======================================================================== #if defined( _init_c_ ) #define GLFWGLOBAL #else #define GLFWGLOBAL extern #endif //======================================================================== // Input handling definitions //======================================================================== // Internal key and button state/action definitions #define GLFW_STICK 2 //======================================================================== // System independent include files //======================================================================== #include #include #include //------------------------------------------------------------------------ // Window opening hints (set by glfwOpenWindowHint) // A bucket of semi-random stuff bunched together for historical reasons // This is used only by the platform independent code and only to store // parameters passed to us by glfwOpenWindowHint //------------------------------------------------------------------------ typedef struct { int refreshRate; int accumRedBits; int accumGreenBits; int accumBlueBits; int accumAlphaBits; int auxBuffers; int stereo; int windowNoResize; int samples; int glMajor; int glMinor; int glForward; int glDebug; int glProfile; } _GLFWhints; //------------------------------------------------------------------------ // Platform specific definitions goes in platform.h (which also includes // glfw.h) //------------------------------------------------------------------------ #include "platform.h" //------------------------------------------------------------------------ // Parameters relating to the creation of the context and window but not // directly related to the properties of the framebuffer // This is used to pass window and context creation parameters from the // platform independent code to the platform specific code //------------------------------------------------------------------------ typedef struct { int mode; int refreshRate; int windowNoResize; int glMajor; int glMinor; int glForward; int glDebug; int glProfile; } _GLFWwndconfig; //------------------------------------------------------------------------ // Framebuffer configuration descriptor, i.e. buffers and their sizes // Also a platform specific ID used to map back to the actual backend APIs // This is used to pass framebuffer parameters from the platform independent // code to the platform specific code, and also to enumerate and select // available framebuffer configurations //------------------------------------------------------------------------ typedef struct { int redBits; int greenBits; int blueBits; int alphaBits; int depthBits; int stencilBits; int accumRedBits; int accumGreenBits; int accumBlueBits; int accumAlphaBits; int auxBuffers; int stereo; int samples; GLFWintptr platformID; } _GLFWfbconfig; //======================================================================== // System independent global variables (GLFW internals) //======================================================================== // Flag indicating if GLFW has been initialized #if defined( _init_c_ ) int _glfwInitialized = 0; #else GLFWGLOBAL int _glfwInitialized; #endif //------------------------------------------------------------------------ // Abstract data stream (for image I/O) //------------------------------------------------------------------------ typedef struct { FILE* file; void* data; long position; long size; } _GLFWstream; //======================================================================== // Prototypes for platform specific implementation functions //======================================================================== // Init/terminate int _glfwPlatformInit( void ); int _glfwPlatformTerminate( void ); // Enable/Disable void _glfwPlatformEnableSystemKeys( void ); void _glfwPlatformDisableSystemKeys( void ); // Fullscreen int _glfwPlatformGetVideoModes( GLFWvidmode *list, int maxcount ); void _glfwPlatformGetDesktopMode( GLFWvidmode *mode ); // OpenGL extensions int _glfwPlatformExtensionSupported( const char *extension ); void * _glfwPlatformGetProcAddress( const char *procname ); // Joystick int _glfwPlatformGetJoystickParam( int joy, int param ); int _glfwPlatformGetJoystickPos( int joy, float *pos, int numaxes ); int _glfwPlatformGetJoystickButtons( int joy, unsigned char *buttons, int numbuttons ); // Threads GLFWthread _glfwPlatformCreateThread( GLFWthreadfun fun, void *arg ); void _glfwPlatformDestroyThread( GLFWthread ID ); int _glfwPlatformWaitThread( GLFWthread ID, int waitmode ); GLFWthread _glfwPlatformGetThreadID( void ); GLFWmutex _glfwPlatformCreateMutex( void ); void _glfwPlatformDestroyMutex( GLFWmutex mutex ); void _glfwPlatformLockMutex( GLFWmutex mutex ); void _glfwPlatformUnlockMutex( GLFWmutex mutex ); GLFWcond _glfwPlatformCreateCond( void ); void _glfwPlatformDestroyCond( GLFWcond cond ); void _glfwPlatformWaitCond( GLFWcond cond, GLFWmutex mutex, double timeout ); void _glfwPlatformSignalCond( GLFWcond cond ); void _glfwPlatformBroadcastCond( GLFWcond cond ); int _glfwPlatformGetNumberOfProcessors( void ); // Time double _glfwPlatformGetTime( void ); void _glfwPlatformSetTime( double time ); void _glfwPlatformSleep( double time ); // Window management int _glfwPlatformOpenWindow( int width, int height, const _GLFWwndconfig *wndconfig, const _GLFWfbconfig *fbconfig ); void _glfwPlatformCloseWindow( void ); void _glfwPlatformSetWindowTitle( const char *title ); void _glfwPlatformSetWindowSize( int width, int height ); void _glfwPlatformSetWindowPos( int x, int y ); void _glfwPlatformIconifyWindow( void ); void _glfwPlatformRestoreWindow( void ); void _glfwPlatformSwapBuffers( void ); void _glfwPlatformSwapInterval( int interval ); void _glfwPlatformRefreshWindowParams( void ); void _glfwPlatformPollEvents( void ); void _glfwPlatformWaitEvents( void ); void _glfwPlatformHideMouseCursor( void ); void _glfwPlatformShowMouseCursor( void ); void _glfwPlatformSetMouseCursorPos( int x, int y ); //======================================================================== // Prototypes for platform independent internal functions //======================================================================== // Window management (window.c) void _glfwClearWindowHints( void ); // Input handling (window.c) void _glfwClearInput( void ); void _glfwInputDeactivation( void ); void _glfwInputKey( int key, int action ); void _glfwInputChar( int character, int action ); void _glfwInputMouseClick( int button, int action ); // Threads (thread.c) _GLFWthread * _glfwGetThreadPointer( int ID ); void _glfwAppendThread( _GLFWthread * t ); void _glfwRemoveThread( _GLFWthread * t ); // OpenGL extensions (glext.c) void _glfwParseGLVersion( int *major, int *minor, int *rev ); int _glfwStringInExtensionString( const char *string, const GLubyte *extensions ); void _glfwRefreshContextParams( void ); // Abstracted data streams (stream.c) int _glfwOpenFileStream( _GLFWstream *stream, const char *name, const char *mode ); int _glfwOpenBufferStream( _GLFWstream *stream, void *data, long size ); long _glfwReadStream( _GLFWstream *stream, void *data, long size ); long _glfwTellStream( _GLFWstream *stream ); int _glfwSeekStream( _GLFWstream *stream, long offset, int whence ); void _glfwCloseStream( _GLFWstream *stream ); // Targa image I/O (tga.c) int _glfwReadTGA( _GLFWstream *s, GLFWimage *img, int flags ); // Framebuffer configs const _GLFWfbconfig *_glfwChooseFBConfig( const _GLFWfbconfig *desired, const _GLFWfbconfig *alternatives, unsigned int count ); #endif // _internal_h_ GLFW-0.5.1.0/glfw/lib/joystick.c0000644000000000000000000000602112045371042014305 0ustar0000000000000000//======================================================================== // GLFW - An OpenGL framework // Platform: Any // API version: 2.7 // WWW: http://www.glfw.org/ //------------------------------------------------------------------------ // Copyright (c) 2002-2006 Marcus Geelnard // Copyright (c) 2006-2010 Camilla Berglund // // This software is provided 'as-is', without any express or implied // warranty. In no event will the authors be held liable for any damages // arising from the use of this software. // // Permission is granted to anyone to use this software for any purpose, // including commercial applications, and to alter it and redistribute it // freely, subject to the following restrictions: // // 1. The origin of this software must not be misrepresented; you must not // claim that you wrote the original software. If you use this software // in a product, an acknowledgment in the product documentation would // be appreciated but is not required. // // 2. Altered source versions must be plainly marked as such, and must not // be misrepresented as being the original software. // // 3. This notice may not be removed or altered from any source // distribution. // //======================================================================== #include "internal.h" //************************************************************************ //**** GLFW user functions **** //************************************************************************ //======================================================================== // Determine joystick capabilities //======================================================================== GLFWAPI int GLFWAPIENTRY glfwGetJoystickParam( int joy, int param ) { if( !_glfwInitialized ) { return 0; } return _glfwPlatformGetJoystickParam( joy, param ); } //======================================================================== // Get joystick axis positions //======================================================================== GLFWAPI int GLFWAPIENTRY glfwGetJoystickPos( int joy, float *pos, int numaxes ) { int i; if( !_glfwInitialized ) { return 0; } // Clear positions for( i = 0; i < numaxes; i++ ) { pos[ i ] = 0.0f; } return _glfwPlatformGetJoystickPos( joy, pos, numaxes ); } //======================================================================== // Get joystick button states //======================================================================== GLFWAPI int GLFWAPIENTRY glfwGetJoystickButtons( int joy, unsigned char *buttons, int numbuttons ) { int i; if( !_glfwInitialized ) { return 0; } // Clear button states for( i = 0; i < numbuttons; i++ ) { buttons[ i ] = GLFW_RELEASE; } return _glfwPlatformGetJoystickButtons( joy, buttons, numbuttons ); } GLFW-0.5.1.0/glfw/lib/stream.c0000644000000000000000000001202612045371042013743 0ustar0000000000000000//======================================================================== // GLFW - An OpenGL framework // Platform: Any // API version: 2.7 // WWW: http://www.glfw.org/ //------------------------------------------------------------------------ // Copyright (c) 2002-2006 Marcus Geelnard // Copyright (c) 2006-2010 Camilla Berglund // // This software is provided 'as-is', without any express or implied // warranty. In no event will the authors be held liable for any damages // arising from the use of this software. // // Permission is granted to anyone to use this software for any purpose, // including commercial applications, and to alter it and redistribute it // freely, subject to the following restrictions: // // 1. The origin of this software must not be misrepresented; you must not // claim that you wrote the original software. If you use this software // in a product, an acknowledgment in the product documentation would // be appreciated but is not required. // // 2. Altered source versions must be plainly marked as such, and must not // be misrepresented as being the original software. // // 3. This notice may not be removed or altered from any source // distribution. // //======================================================================== #define _CRT_SECURE_NO_WARNINGS #include "internal.h" //======================================================================== // Opens a GLFW stream with a file //======================================================================== int _glfwOpenFileStream( _GLFWstream *stream, const char* name, const char* mode ) { memset( stream, 0, sizeof(_GLFWstream) ); stream->file = fopen( name, mode ); if( stream->file == NULL ) { return GL_FALSE; } return GL_TRUE; } //======================================================================== // Opens a GLFW stream with a memory block //======================================================================== int _glfwOpenBufferStream( _GLFWstream *stream, void *data, long size ) { memset( stream, 0, sizeof(_GLFWstream) ); stream->data = data; stream->size = size; return GL_TRUE; } //======================================================================== // Reads data from a GLFW stream //======================================================================== long _glfwReadStream( _GLFWstream *stream, void *data, long size ) { if( stream->file != NULL ) { return (long) fread( data, 1, size, stream->file ); } if( stream->data != NULL ) { // Check for EOF if( stream->position == stream->size ) { return 0; } // Clamp read size to available data if( stream->position + size > stream->size ) { size = stream->size - stream->position; } // Perform data read memcpy( data, (unsigned char*) stream->data + stream->position, size ); stream->position += size; return size; } return 0; } //======================================================================== // Returns the current position of a GLFW stream //======================================================================== long _glfwTellStream( _GLFWstream *stream ) { if( stream->file != NULL ) { return ftell( stream->file ); } if( stream->data != NULL ) { return stream->position; } return 0; } //======================================================================== // Sets the current position of a GLFW stream //======================================================================== int _glfwSeekStream( _GLFWstream *stream, long offset, int whence ) { long position; if( stream->file != NULL ) { if( fseek( stream->file, offset, whence ) != 0 ) { return GL_FALSE; } return GL_TRUE; } if( stream->data != NULL ) { position = offset; // Handle whence parameter if( whence == SEEK_CUR ) { position += stream->position; } else if( whence == SEEK_END ) { position += stream->size; } else if( whence != SEEK_SET ) { return GL_FALSE; } // Clamp offset to buffer bounds and apply it if( position > stream->size ) { stream->position = stream->size; } else if( position < 0 ) { stream->position = 0; } else { stream->position = position; } return GL_TRUE; } return GL_FALSE; } //======================================================================== // Closes a GLFW stream //======================================================================== void _glfwCloseStream( _GLFWstream *stream ) { if( stream->file != NULL ) { fclose( stream->file ); } // Nothing to be done about (user allocated) memory blocks memset( stream, 0, sizeof(_GLFWstream) ); } GLFW-0.5.1.0/glfw/lib/tga.c0000644000000000000000000002652412045371042013233 0ustar0000000000000000//======================================================================== // GLFW - An OpenGL framework // Platform: Any // API version: 2.7 // WWW: http://www.glfw.org/ //------------------------------------------------------------------------ // Copyright (c) 2002-2006 Marcus Geelnard // Copyright (c) 2006-2010 Camilla Berglund // // This software is provided 'as-is', without any express or implied // warranty. In no event will the authors be held liable for any damages // arising from the use of this software. // // Permission is granted to anyone to use this software for any purpose, // including commercial applications, and to alter it and redistribute it // freely, subject to the following restrictions: // // 1. The origin of this software must not be misrepresented; you must not // claim that you wrote the original software. If you use this software // in a product, an acknowledgment in the product documentation would // be appreciated but is not required. // // 2. Altered source versions must be plainly marked as such, and must not // be misrepresented as being the original software. // // 3. This notice may not be removed or altered from any source // distribution. // //======================================================================== //======================================================================== // Description: // // TGA format image file loader. This module supports version 1 Targa // images, with these restrictions: // - Pixel format may only be 8, 24 or 32 bits // - Colormaps must be no longer than 256 entries // //======================================================================== #include "internal.h" //************************************************************************ //**** GLFW internal functions & declarations **** //************************************************************************ //======================================================================== // TGA file header information //======================================================================== typedef struct { int idlen; // 1 byte int cmaptype; // 1 byte int imagetype; // 1 byte int cmapfirstidx; // 2 bytes int cmaplen; // 2 bytes int cmapentrysize; // 1 byte int xorigin; // 2 bytes int yorigin; // 2 bytes int width; // 2 bytes int height; // 2 bytes int bitsperpixel; // 1 byte int imageinfo; // 1 byte int _alphabits; // (derived from imageinfo) int _origin; // (derived from imageinfo) } _tga_header_t; #define _TGA_CMAPTYPE_NONE 0 #define _TGA_CMAPTYPE_PRESENT 1 #define _TGA_IMAGETYPE_NONE 0 #define _TGA_IMAGETYPE_CMAP 1 #define _TGA_IMAGETYPE_TC 2 #define _TGA_IMAGETYPE_GRAY 3 #define _TGA_IMAGETYPE_CMAP_RLE 9 #define _TGA_IMAGETYPE_TC_RLE 10 #define _TGA_IMAGETYPE_GRAY_RLE 11 #define _TGA_IMAGEINFO_ALPHA_MASK 0x0f #define _TGA_IMAGEINFO_ALPHA_SHIFT 0 #define _TGA_IMAGEINFO_ORIGIN_MASK 0x30 #define _TGA_IMAGEINFO_ORIGIN_SHIFT 4 #define _TGA_ORIGIN_BL 0 #define _TGA_ORIGIN_BR 1 #define _TGA_ORIGIN_UL 2 #define _TGA_ORIGIN_UR 3 //======================================================================== // Read TGA file header (and check that it is valid) //======================================================================== static int ReadTGAHeader( _GLFWstream *s, _tga_header_t *h ) { unsigned char buf[ 18 ]; int pos; // Read TGA file header from file pos = _glfwTellStream( s ); _glfwReadStream( s, buf, 18 ); // Interpret header (endian independent parsing) h->idlen = (int) buf[0]; h->cmaptype = (int) buf[1]; h->imagetype = (int) buf[2]; h->cmapfirstidx = (int) buf[3] | (((int) buf[4]) << 8); h->cmaplen = (int) buf[5] | (((int) buf[6]) << 8); h->cmapentrysize = (int) buf[7]; h->xorigin = (int) buf[8] | (((int) buf[9]) << 8); h->yorigin = (int) buf[10] | (((int) buf[11]) << 8); h->width = (int) buf[12] | (((int) buf[13]) << 8); h->height = (int) buf[14] | (((int) buf[15]) << 8); h->bitsperpixel = (int) buf[16]; h->imageinfo = (int) buf[17]; // Extract alphabits and origin information h->_alphabits = (int) (h->imageinfo & _TGA_IMAGEINFO_ALPHA_MASK) >> _TGA_IMAGEINFO_ALPHA_SHIFT; h->_origin = (int) (h->imageinfo & _TGA_IMAGEINFO_ORIGIN_MASK) >> _TGA_IMAGEINFO_ORIGIN_SHIFT; // Validate TGA header (is this a TGA file?) if( (h->cmaptype == 0 || h->cmaptype == 1) && ((h->imagetype >= 1 && h->imagetype <= 3) || (h->imagetype >= 9 && h->imagetype <= 11)) && (h->bitsperpixel == 8 || h->bitsperpixel == 24 || h->bitsperpixel == 32) ) { // Skip the ID field _glfwSeekStream( s, h->idlen, SEEK_CUR ); // Indicate that the TGA header was valid return GL_TRUE; } else { // Restore file position _glfwSeekStream( s, pos, SEEK_SET ); // Indicate that the TGA header was invalid return GL_FALSE; } } //======================================================================== // Read Run-Length Encoded data //======================================================================== static void ReadTGA_RLE( unsigned char *buf, int size, int bpp, _GLFWstream *s ) { int repcount, bytes, k, n; unsigned char pixel[ 4 ]; char c; // Dummy check if( bpp > 4 ) { return; } while( size > 0 ) { // Get repetition count _glfwReadStream( s, &c, 1 ); repcount = (unsigned int) c; bytes = ((repcount & 127) + 1) * bpp; if( size < bytes ) { bytes = size; } // Run-Length packet? if( repcount & 128 ) { _glfwReadStream( s, pixel, bpp ); for( n = 0; n < (repcount & 127) + 1; n ++ ) { for( k = 0; k < bpp; k ++ ) { *buf ++ = pixel[ k ]; } } } else { // It's a Raw packet _glfwReadStream( s, buf, bytes ); buf += bytes; } size -= bytes; } } //======================================================================== // Read a TGA image from a file //======================================================================== int _glfwReadTGA( _GLFWstream *s, GLFWimage *img, int flags ) { _tga_header_t h; unsigned char *cmap, *pix, tmp, *src, *dst; int cmapsize, pixsize, pixsize2; int bpp, bpp2, k, m, n, swapx, swapy; // Read TGA header if( !ReadTGAHeader( s, &h ) ) { return 0; } // Is there a colormap? cmapsize = (h.cmaptype == _TGA_CMAPTYPE_PRESENT ? 1 : 0) * h.cmaplen * ((h.cmapentrysize+7) / 8); if( cmapsize > 0 ) { // Is it a colormap that we can handle? if( (h.cmapentrysize != 24 && h.cmapentrysize != 32) || h.cmaplen == 0 || h.cmaplen > 256 ) { return 0; } // Allocate memory for colormap cmap = (unsigned char *) malloc( cmapsize ); if( cmap == NULL ) { return 0; } // Read colormap from file _glfwReadStream( s, cmap, cmapsize ); } else { cmap = NULL; } // Size of pixel data pixsize = h.width * h.height * ((h.bitsperpixel + 7) / 8); // Bytes per pixel (pixel data - unexpanded) bpp = (h.bitsperpixel + 7) / 8; // Bytes per pixel (expanded pixels - not colormap indeces) if( cmap ) { bpp2 = (h.cmapentrysize + 7) / 8; } else { bpp2 = bpp; } // For colormaped images, the RGB/RGBA image data may use more memory // than the stored pixel data pixsize2 = h.width * h.height * bpp2; // Allocate memory for pixel data pix = (unsigned char *) malloc( pixsize2 ); if( pix == NULL ) { if( cmap ) { free( cmap ); } return 0; } // Read pixel data from file if( h.imagetype >= _TGA_IMAGETYPE_CMAP_RLE ) { ReadTGA_RLE( pix, pixsize, bpp, s ); } else { _glfwReadStream( s, pix, pixsize ); } // If the image origin is not what we want, re-arrange the pixels switch( h._origin ) { default: case _TGA_ORIGIN_UL: swapx = 0; swapy = 1; break; case _TGA_ORIGIN_BL: swapx = 0; swapy = 0; break; case _TGA_ORIGIN_UR: swapx = 1; swapy = 1; break; case _TGA_ORIGIN_BR: swapx = 1; swapy = 0; break; } if( (swapy && !(flags & GLFW_ORIGIN_UL_BIT)) || (!swapy && (flags & GLFW_ORIGIN_UL_BIT)) ) { src = pix; dst = &pix[ (h.height-1)*h.width*bpp ]; for( n = 0; n < h.height/2; n ++ ) { for( m = 0; m < h.width ; m ++ ) { for( k = 0; k < bpp; k ++ ) { tmp = *src; *src ++ = *dst; *dst ++ = tmp; } } dst -= 2*h.width*bpp; } } if( swapx ) { src = pix; dst = &pix[ (h.width-1)*bpp ]; for( n = 0; n < h.height; n ++ ) { for( m = 0; m < h.width/2 ; m ++ ) { for( k = 0; k < bpp; k ++ ) { tmp = *src; *src ++ = *dst; *dst ++ = tmp; } dst -= 2*bpp; } src += ((h.width+1)/2)*bpp; dst += ((3*h.width+1)/2)*bpp; } } // Convert BGR/BGRA to RGB/RGBA, and optionally colormap indeces to // RGB/RGBA values if( cmap ) { // Convert colormap pixel format (BGR -> RGB or BGRA -> RGBA) if( bpp2 == 3 || bpp2 == 4 ) { for( n = 0; n < h.cmaplen; n ++ ) { tmp = cmap[ n*bpp2 ]; cmap[ n*bpp2 ] = cmap[ n*bpp2 + 2 ]; cmap[ n*bpp2 + 2 ] = tmp; } } // Convert pixel data to RGB/RGBA data for( m = h.width * h.height - 1; m >= 0; m -- ) { n = pix[ m ]; for( k = 0; k < bpp2; k ++ ) { pix[ m*bpp2 + k ] = cmap[ n*bpp2 + k ]; } } // Free memory for colormap (it's not needed anymore) free( cmap ); } else { // Convert image pixel format (BGR -> RGB or BGRA -> RGBA) if( bpp2 == 3 || bpp2 == 4 ) { src = pix; dst = &pix[ 2 ]; for( n = 0; n < h.height * h.width; n ++ ) { tmp = *src; *src = *dst; *dst = tmp; src += bpp2; dst += bpp2; } } } // Fill out GLFWimage struct (the Format field will be set by // glfwReadImage) img->Width = h.width; img->Height = h.height; img->BytesPerPixel = bpp2; img->Data = pix; return 1; } GLFW-0.5.1.0/glfw/lib/thread.c0000644000000000000000000002215412045371042013722 0ustar0000000000000000//======================================================================== // GLFW - An OpenGL framework // Platform: Any // API version: 2.7 // WWW: http://www.glfw.org/ //------------------------------------------------------------------------ // Copyright (c) 2002-2006 Marcus Geelnard // Copyright (c) 2006-2010 Camilla Berglund // // This software is provided 'as-is', without any express or implied // warranty. In no event will the authors be held liable for any damages // arising from the use of this software. // // Permission is granted to anyone to use this software for any purpose, // including commercial applications, and to alter it and redistribute it // freely, subject to the following restrictions: // // 1. The origin of this software must not be misrepresented; you must not // claim that you wrote the original software. If you use this software // in a product, an acknowledgment in the product documentation would // be appreciated but is not required. // // 2. Altered source versions must be plainly marked as such, and must not // be misrepresented as being the original software. // // 3. This notice may not be removed or altered from any source // distribution. // //======================================================================== #include "internal.h" //************************************************************************ //**** GLFW internal functions **** //************************************************************************ //======================================================================== // Find pointer to thread with a matching ID //======================================================================== _GLFWthread * _glfwGetThreadPointer( int ID ) { _GLFWthread *t; for( t = &_glfwThrd.First; t != NULL; t = t->Next ) { if( t->ID == ID ) { break; } } return t; } //======================================================================== // Append thread to thread list //======================================================================== void _glfwAppendThread( _GLFWthread * t ) { _GLFWthread *t_tmp; t_tmp = &_glfwThrd.First; while( t_tmp->Next != NULL ) { t_tmp = t_tmp->Next; } t_tmp->Next = t; t->Previous = t_tmp; t->Next = NULL; } //======================================================================== // Remove thread from thread list //======================================================================== void _glfwRemoveThread( _GLFWthread * t ) { if( t->Previous != NULL ) { t->Previous->Next = t->Next; } if( t->Next != NULL ) { t->Next->Previous = t->Previous; } free( (void *) t ); } //************************************************************************ //**** GLFW user functions **** //************************************************************************ //======================================================================== // Create a new thread //======================================================================== GLFWAPI GLFWthread GLFWAPIENTRY glfwCreateThread( GLFWthreadfun fun, void *arg ) { // Is GLFW initialized? if( !_glfwInitialized ) { return -1; } // Return the GLFW thread ID return _glfwPlatformCreateThread( fun, arg ); } //======================================================================== // Kill a thread. NOTE: THIS IS A VERY DANGEROUS OPERATION, AND SHOULD NOT // BE USED EXCEPT IN EXTREME SITUATIONS! //======================================================================== GLFWAPI void GLFWAPIENTRY glfwDestroyThread( GLFWthread ID ) { // Is GLFW initialized? if( !_glfwInitialized ) { return; } // Is it a valid thread? (killing the main thread is not allowed) if( ID < 1 ) { return; } _glfwPlatformDestroyThread( ID ); } //======================================================================== // Wait for a thread to die //======================================================================== GLFWAPI int GLFWAPIENTRY glfwWaitThread( GLFWthread ID, int waitmode ) { // Is GLFW initialized? if( !_glfwInitialized ) { return GL_TRUE; } // Is it a valid thread? (waiting for the main thread is not allowed) if( ID < 1 ) { return GL_TRUE; } return _glfwPlatformWaitThread( ID, waitmode ); } //======================================================================== // Return the thread ID for the current thread //======================================================================== GLFWAPI GLFWthread GLFWAPIENTRY glfwGetThreadID( void ) { // Is GLFW initialized? if( !_glfwInitialized ) { return 0; } return _glfwPlatformGetThreadID(); } //======================================================================== // Create a mutual exclusion object //======================================================================== GLFWAPI GLFWmutex GLFWAPIENTRY glfwCreateMutex( void ) { // Is GLFW initialized? if( !_glfwInitialized ) { return (GLFWmutex) 0; } return _glfwPlatformCreateMutex(); } //======================================================================== // Destroy a mutual exclusion object //======================================================================== GLFWAPI void GLFWAPIENTRY glfwDestroyMutex( GLFWmutex mutex ) { // Initialized & valid mutex (no real way of assuring this)? if( !_glfwInitialized || !mutex ) { return; } _glfwPlatformDestroyMutex( mutex ); } //======================================================================== // Request access to a mutex //======================================================================== GLFWAPI void GLFWAPIENTRY glfwLockMutex( GLFWmutex mutex ) { // Initialized & valid mutex (no real way of assuring this)? if( !_glfwInitialized && !mutex ) { return; } _glfwPlatformLockMutex( mutex ); } //======================================================================== // Release a mutex //======================================================================== GLFWAPI void GLFWAPIENTRY glfwUnlockMutex( GLFWmutex mutex ) { // Initialized & valid mutex (no real way of assuring this)? if( !_glfwInitialized && !mutex ) { return; } _glfwPlatformUnlockMutex( mutex ); } //======================================================================== // Create a new condition variable object //======================================================================== GLFWAPI GLFWcond GLFWAPIENTRY glfwCreateCond( void ) { // Is GLFW initialized? if( !_glfwInitialized ) { return (GLFWcond) 0; } return _glfwPlatformCreateCond(); } //======================================================================== // Destroy a condition variable object //======================================================================== GLFWAPI void GLFWAPIENTRY glfwDestroyCond( GLFWcond cond ) { // Initialized & valid condition variable? if( !_glfwInitialized || !cond ) { return; } _glfwPlatformDestroyCond( cond ); } //======================================================================== // Wait for a condition to be raised //======================================================================== GLFWAPI void GLFWAPIENTRY glfwWaitCond( GLFWcond cond, GLFWmutex mutex, double timeout ) { // Initialized & valid condition variable and mutex? if( !_glfwInitialized || !cond || !mutex ) { return; } _glfwPlatformWaitCond( cond, mutex, timeout ); } //======================================================================== // Signal a condition to one waiting thread //======================================================================== GLFWAPI void GLFWAPIENTRY glfwSignalCond( GLFWcond cond ) { // Initialized & valid condition variable? if( !_glfwInitialized || !cond ) { return; } _glfwPlatformSignalCond( cond ); } //======================================================================== // Broadcast a condition to all waiting threads //======================================================================== GLFWAPI void GLFWAPIENTRY glfwBroadcastCond( GLFWcond cond ) { // Initialized & valid condition variable? if( !_glfwInitialized || !cond ) { return; } _glfwPlatformBroadcastCond( cond ); } //======================================================================== // Return the number of processors in the system. This information can be // useful for determining the optimal number of threads to use for // performing a certain task. //======================================================================== GLFWAPI int GLFWAPIENTRY glfwGetNumberOfProcessors( void ) { // Is GLFW initialized? if( !_glfwInitialized ) { return 0; } return _glfwPlatformGetNumberOfProcessors(); } GLFW-0.5.1.0/glfw/lib/time.c0000644000000000000000000000516612045371042013415 0ustar0000000000000000//======================================================================== // GLFW - An OpenGL framework // Platform: Any // API version: 2.7 // WWW: http://www.glfw.org/ //------------------------------------------------------------------------ // Copyright (c) 2002-2006 Marcus Geelnard // Copyright (c) 2006-2010 Camilla Berglund // // This software is provided 'as-is', without any express or implied // warranty. In no event will the authors be held liable for any damages // arising from the use of this software. // // Permission is granted to anyone to use this software for any purpose, // including commercial applications, and to alter it and redistribute it // freely, subject to the following restrictions: // // 1. The origin of this software must not be misrepresented; you must not // claim that you wrote the original software. If you use this software // in a product, an acknowledgment in the product documentation would // be appreciated but is not required. // // 2. Altered source versions must be plainly marked as such, and must not // be misrepresented as being the original software. // // 3. This notice may not be removed or altered from any source // distribution. // //======================================================================== #include "internal.h" //************************************************************************ //**** GLFW user functions **** //************************************************************************ //======================================================================== // Return timer value in seconds //======================================================================== GLFWAPI double GLFWAPIENTRY glfwGetTime( void ) { // Is GLFW initialized? if( !_glfwInitialized ) { return 0.0; } return _glfwPlatformGetTime(); } //======================================================================== // Set timer value in seconds //======================================================================== GLFWAPI void GLFWAPIENTRY glfwSetTime( double time ) { // Is GLFW initialized? if( !_glfwInitialized ) { return; } _glfwPlatformSetTime( time ); } //======================================================================== // Put a thread to sleep for a specified amount of time //======================================================================== GLFWAPI void GLFWAPIENTRY glfwSleep( double time ) { // Is GLFW initialized? if( !_glfwInitialized ) { return; } _glfwPlatformSleep( time ); } GLFW-0.5.1.0/glfw/lib/window.c0000644000000000000000000007217212045371042013767 0ustar0000000000000000//======================================================================== // GLFW - An OpenGL framework // Platform: Any // API version: 2.7 // WWW: http://www.glfw.org/ //------------------------------------------------------------------------ // Copyright (c) 2002-2006 Marcus Geelnard // Copyright (c) 2006-2010 Camilla Berglund // // This software is provided 'as-is', without any express or implied // warranty. In no event will the authors be held liable for any damages // arising from the use of this software. // // Permission is granted to anyone to use this software for any purpose, // including commercial applications, and to alter it and redistribute it // freely, subject to the following restrictions: // // 1. The origin of this software must not be misrepresented; you must not // claim that you wrote the original software. If you use this software // in a product, an acknowledgment in the product documentation would // be appreciated but is not required. // // 2. Altered source versions must be plainly marked as such, and must not // be misrepresented as being the original software. // // 3. This notice may not be removed or altered from any source // distribution. // //======================================================================== #include "internal.h" #include #ifndef GL_VERSION_3_2 #define GL_CONTEXT_CORE_PROFILE_BIT 0x00000001 #define GL_CONTEXT_COMPATIBILITY_PROFILE_BIT 0x00000002 #define GL_CONTEXT_PROFILE_MASK 0x9126 #endif /*GL_VERSION_3_2*/ //************************************************************************ //**** GLFW internal functions **** //************************************************************************ static int Max(int a, int b) { return (a > b) ? a : b; } //======================================================================== // Clear all open window hints //======================================================================== void _glfwClearWindowHints( void ) { memset( &_glfwLibrary.hints, 0, sizeof( _glfwLibrary.hints ) ); _glfwLibrary.hints.glMajor = 1; } //======================================================================== // Handle the input tracking part of window deactivation //======================================================================== void _glfwInputDeactivation( void ) { int i; // Release all keyboard keys for( i = 0; i <= GLFW_KEY_LAST; i ++ ) { if( _glfwInput.Key[ i ] == GLFW_PRESS ) { _glfwInputKey( i, GLFW_RELEASE ); } } // Release all mouse buttons for( i = 0; i <= GLFW_MOUSE_BUTTON_LAST; i ++ ) { if( _glfwInput.MouseButton[ i ] == GLFW_PRESS ) { _glfwInputMouseClick( i, GLFW_RELEASE ); } } } //======================================================================== // Clear all input state //======================================================================== void _glfwClearInput( void ) { int i; // Release all keyboard keys for( i = 0; i <= GLFW_KEY_LAST; i ++ ) { _glfwInput.Key[ i ] = GLFW_RELEASE; } // Clear last character _glfwInput.LastChar = 0; // Release all mouse buttons for( i = 0; i <= GLFW_MOUSE_BUTTON_LAST; i ++ ) { _glfwInput.MouseButton[ i ] = GLFW_RELEASE; } // Set mouse position to (0,0) _glfwInput.MousePosX = 0; _glfwInput.MousePosY = 0; // Set mouse wheel position to 0 _glfwInput.WheelPos = 0; // The default is to use non sticky keys and mouse buttons _glfwInput.StickyKeys = GL_FALSE; _glfwInput.StickyMouseButtons = GL_FALSE; // The default is to disable key repeat _glfwInput.KeyRepeat = GL_FALSE; } //======================================================================== // Register keyboard activity //======================================================================== void _glfwInputKey( int key, int action ) { int keyrepeat = 0; if( key < 0 || key > GLFW_KEY_LAST ) { return; } // Are we trying to release an already released key? if( action == GLFW_RELEASE && _glfwInput.Key[ key ] != GLFW_PRESS ) { return; } // Register key action if( action == GLFW_RELEASE && _glfwInput.StickyKeys ) { _glfwInput.Key[ key ] = GLFW_STICK; } else { keyrepeat = (_glfwInput.Key[ key ] == GLFW_PRESS) && (action == GLFW_PRESS); _glfwInput.Key[ key ] = (char) action; } // Call user callback function if( _glfwWin.keyCallback && (_glfwInput.KeyRepeat || !keyrepeat) ) { _glfwWin.keyCallback( key, action ); } } //======================================================================== // Register (keyboard) character activity //======================================================================== void _glfwInputChar( int character, int action ) { int keyrepeat = 0; // Valid Unicode (ISO 10646) character? if( !( (character >= 32 && character <= 126) || character >= 160 ) ) { return; } // Is this a key repeat? if( action == GLFW_PRESS && _glfwInput.LastChar == character ) { keyrepeat = 1; } // Store this character as last character (or clear it, if released) if( action == GLFW_PRESS ) { _glfwInput.LastChar = character; } else { _glfwInput.LastChar = 0; } if( action != GLFW_PRESS ) { // This intentionally breaks release notifications for Unicode // characters, partly to see if anyone cares but mostly because it's // a nonsensical concept to begin with // // It will remain broken either until its removal in the 3.0 API or // until someone explains, in a way that makes sense to people outside // the US and Scandinavia, what "Unicode character up" actually means // // If what you want is "physical key up" then you should be using the // key functions and/or the key callback, NOT the Unicode input // // However, if your particular application uses this misfeature for... // something, you can re-enable it by removing this if-statement return; } if( _glfwWin.charCallback && (_glfwInput.KeyRepeat || !keyrepeat) ) { _glfwWin.charCallback( character, action ); } } //======================================================================== // Register mouse button clicks //======================================================================== void _glfwInputMouseClick( int button, int action ) { if( button >= 0 && button <= GLFW_MOUSE_BUTTON_LAST ) { // Register mouse button action if( action == GLFW_RELEASE && _glfwInput.StickyMouseButtons ) { _glfwInput.MouseButton[ button ] = GLFW_STICK; } else { _glfwInput.MouseButton[ button ] = (char) action; } // Call user callback function if( _glfwWin.mouseButtonCallback ) { _glfwWin.mouseButtonCallback( button, action ); } } } //======================================================================== // Return the available framebuffer config closest to the desired values // This is based on the manual GLX Visual selection from 2.6 //======================================================================== const _GLFWfbconfig *_glfwChooseFBConfig( const _GLFWfbconfig *desired, const _GLFWfbconfig *alternatives, unsigned int count ) { unsigned int i; unsigned int missing, leastMissing = UINT_MAX; unsigned int colorDiff, leastColorDiff = UINT_MAX; unsigned int extraDiff, leastExtraDiff = UINT_MAX; const _GLFWfbconfig *current; const _GLFWfbconfig *closest = NULL; for( i = 0; i < count; i++ ) { current = alternatives + i; if( desired->stereo > 0 && current->stereo == 0 ) { // Stereo is a hard constraint continue; } // Count number of missing buffers { missing = 0; if( desired->alphaBits > 0 && current->alphaBits == 0 ) { missing++; } if( desired->depthBits > 0 && current->depthBits == 0 ) { missing++; } if( desired->stencilBits > 0 && current->stencilBits == 0 ) { missing++; } if( desired->auxBuffers > 0 && current->auxBuffers < desired->auxBuffers ) { missing += desired->auxBuffers - current->auxBuffers; } if( desired->samples > 0 && current->samples == 0 ) { // Technically, several multisampling buffers could be // involved, but that's a lower level implementation detail and // not important to us here, so we count them as one missing++; } } // These polynomials make many small channel size differences matter // less than one large channel size difference // Calculate color channel size difference value { colorDiff = 0; if ( desired->redBits > 0 ) { colorDiff += ( desired->redBits - current->redBits ) * ( desired->redBits - current->redBits ); } if ( desired->greenBits > 0 ) { colorDiff += ( desired->greenBits - current->greenBits ) * ( desired->greenBits - current->greenBits ); } if ( desired->blueBits > 0 ) { colorDiff += ( desired->blueBits - current->blueBits ) * ( desired->blueBits - current->blueBits ); } } // Calculate non-color channel size difference value { extraDiff = 0; if( desired->alphaBits > 0 ) { extraDiff += ( desired->alphaBits - current->alphaBits ) * ( desired->alphaBits - current->alphaBits ); } if( desired->depthBits > 0 ) { extraDiff += ( desired->depthBits - current->depthBits ) * ( desired->depthBits - current->depthBits ); } if( desired->stencilBits > 0 ) { extraDiff += ( desired->stencilBits - current->stencilBits ) * ( desired->stencilBits - current->stencilBits ); } if( desired->accumRedBits > 0 ) { extraDiff += ( desired->accumRedBits - current->accumRedBits ) * ( desired->accumRedBits - current->accumRedBits ); } if( desired->accumGreenBits > 0 ) { extraDiff += ( desired->accumGreenBits - current->accumGreenBits ) * ( desired->accumGreenBits - current->accumGreenBits ); } if( desired->accumBlueBits > 0 ) { extraDiff += ( desired->accumBlueBits - current->accumBlueBits ) * ( desired->accumBlueBits - current->accumBlueBits ); } if( desired->accumAlphaBits > 0 ) { extraDiff += ( desired->accumAlphaBits - current->accumAlphaBits ) * ( desired->accumAlphaBits - current->accumAlphaBits ); } if( desired->samples > 0 ) { extraDiff += ( desired->samples - current->samples ) * ( desired->samples - current->samples ); } } // Figure out if the current one is better than the best one found so far if( missing < leastMissing ) { closest = current; } else if( missing == leastMissing ) { if( ( colorDiff < leastColorDiff ) || ( colorDiff == leastColorDiff && extraDiff < leastExtraDiff ) ) { closest = current; } } if( current == closest ) { leastMissing = missing; leastColorDiff = colorDiff; leastExtraDiff = extraDiff; } } return closest; } //************************************************************************ //**** GLFW user functions **** //************************************************************************ //======================================================================== // Create the GLFW window and its associated context //======================================================================== GLFWAPI int GLFWAPIENTRY glfwOpenWindow( int width, int height, int redbits, int greenbits, int bluebits, int alphabits, int depthbits, int stencilbits, int mode ) { _GLFWfbconfig fbconfig; _GLFWwndconfig wndconfig; if( !_glfwInitialized || _glfwWin.opened ) { return GL_FALSE; } // Set up desired framebuffer config fbconfig.redBits = Max( redbits, 0 ); fbconfig.greenBits = Max( greenbits, 0 ); fbconfig.blueBits = Max( bluebits, 0 ); fbconfig.alphaBits = Max( alphabits, 0 ); fbconfig.depthBits = Max( depthbits, 0 ); fbconfig.stencilBits = Max( stencilbits, 0 ); fbconfig.accumRedBits = Max( _glfwLibrary.hints.accumRedBits, 0 ); fbconfig.accumGreenBits = Max( _glfwLibrary.hints.accumGreenBits, 0 ); fbconfig.accumBlueBits = Max( _glfwLibrary.hints.accumBlueBits, 0 ); fbconfig.accumAlphaBits = Max( _glfwLibrary.hints.accumAlphaBits, 0 ); fbconfig.auxBuffers = Max( _glfwLibrary.hints.auxBuffers, 0 ); fbconfig.stereo = _glfwLibrary.hints.stereo ? GL_TRUE : GL_FALSE; fbconfig.samples = Max( _glfwLibrary.hints.samples, 0 ); // Set up desired window config wndconfig.mode = mode; wndconfig.refreshRate = Max( _glfwLibrary.hints.refreshRate, 0 ); wndconfig.windowNoResize = _glfwLibrary.hints.windowNoResize ? GL_TRUE : GL_FALSE; wndconfig.glMajor = Max( _glfwLibrary.hints.glMajor, 1 ); wndconfig.glMinor = Max( _glfwLibrary.hints.glMinor, 0 ); wndconfig.glForward = _glfwLibrary.hints.glForward ? GL_TRUE : GL_FALSE; wndconfig.glDebug = _glfwLibrary.hints.glDebug ? GL_TRUE : GL_FALSE; wndconfig.glProfile = _glfwLibrary.hints.glProfile; if( wndconfig.glMajor == 1 && wndconfig.glMinor > 5 ) { // OpenGL 1.x series ended with version 1.5 return GL_FALSE; } else if( wndconfig.glMajor == 2 && wndconfig.glMinor > 1 ) { // OpenGL 2.x series ended with version 2.1 return GL_FALSE; } else if( wndconfig.glMajor == 3 && wndconfig.glMinor > 3 ) { // OpenGL 3.x series ended with version 3.3 return GL_FALSE; } else { // For now, let everything else through } if( wndconfig.glProfile && ( wndconfig.glMajor < 3 || ( wndconfig.glMajor == 3 && wndconfig.glMinor < 2 ) ) ) { // Context profiles are only defined for OpenGL version 3.2 and above return GL_FALSE; } if( wndconfig.glForward && wndconfig.glMajor < 3 ) { // Forward-compatible contexts are only defined for OpenGL version 3.0 and above return GL_FALSE; } // Clear for next open call _glfwClearWindowHints(); // Check input arguments if( mode != GLFW_WINDOW && mode != GLFW_FULLSCREEN ) { return GL_FALSE; } // Clear GLFW window state _glfwWin.active = GL_TRUE; _glfwWin.iconified = GL_FALSE; _glfwWin.mouseLock = GL_FALSE; _glfwWin.autoPollEvents = GL_TRUE; _glfwClearInput(); // Unregister all callback functions _glfwWin.windowSizeCallback = NULL; _glfwWin.windowCloseCallback = NULL; _glfwWin.windowRefreshCallback = NULL; _glfwWin.keyCallback = NULL; _glfwWin.charCallback = NULL; _glfwWin.mousePosCallback = NULL; _glfwWin.mouseButtonCallback = NULL; _glfwWin.mouseWheelCallback = NULL; // Check width & height if( width > 0 && height <= 0 ) { // Set the window aspect ratio to 4:3 height = (width * 3) / 4; } else if( width <= 0 && height > 0 ) { // Set the window aspect ratio to 4:3 width = (height * 4) / 3; } else if( width <= 0 && height <= 0 ) { // Default window size width = 640; height = 480; } // Remember window settings _glfwWin.width = width; _glfwWin.height = height; _glfwWin.fullscreen = (mode == GLFW_FULLSCREEN ? GL_TRUE : GL_FALSE); // Platform specific window opening routine if( !_glfwPlatformOpenWindow( width, height, &wndconfig, &fbconfig ) ) { glfwCloseWindow(); return GL_FALSE; } // Flag that window is now opened _glfwWin.opened = GL_TRUE; // Read back window and context parameters _glfwPlatformRefreshWindowParams(); _glfwRefreshContextParams(); if( _glfwWin.glMajor < wndconfig.glMajor || ( _glfwWin.glMajor == wndconfig.glMajor && _glfwWin.glMinor < wndconfig.glMinor ) ) { glfwCloseWindow(); return GL_FALSE; } // Do we have non-power-of-two textures (added to core in version 2.0)? _glfwWin.has_GL_ARB_texture_non_power_of_two = ( _glfwWin.glMajor >= 2 ) || glfwExtensionSupported( "GL_ARB_texture_non_power_of_two" ); // Do we have automatic mipmap generation (added to core in version 1.4)? _glfwWin.has_GL_SGIS_generate_mipmap = ( _glfwWin.glMajor >= 2 ) || ( _glfwWin.glMinor >= 4 ) || glfwExtensionSupported( "GL_SGIS_generate_mipmap" ); if( _glfwWin.glMajor > 2 ) { _glfwWin.GetStringi = (PFNGLGETSTRINGIPROC) glfwGetProcAddress( "glGetStringi" ); if( !_glfwWin.GetStringi ) { // This is a very common problem among people who compile GLFW // on X11/GLX using custom build systems, as the glfwGetProcAddress // code path selection needs explicit configuration // // See readme.html section 2.2 for details glfwCloseWindow(); return GL_FALSE; } } // If full-screen mode was requested, disable mouse cursor if( mode == GLFW_FULLSCREEN ) { glfwDisable( GLFW_MOUSE_CURSOR ); } // Start by clearing the front buffer to black (avoid ugly desktop // remains in our OpenGL window) glClear( GL_COLOR_BUFFER_BIT ); _glfwPlatformSwapBuffers(); return GL_TRUE; } //======================================================================== // Set hints for opening the window //======================================================================== GLFWAPI void GLFWAPIENTRY glfwOpenWindowHint( int target, int hint ) { if( !_glfwInitialized ) { return; } switch( target ) { case GLFW_REFRESH_RATE: _glfwLibrary.hints.refreshRate = hint; break; case GLFW_ACCUM_RED_BITS: _glfwLibrary.hints.accumRedBits = hint; break; case GLFW_ACCUM_GREEN_BITS: _glfwLibrary.hints.accumGreenBits = hint; break; case GLFW_ACCUM_BLUE_BITS: _glfwLibrary.hints.accumBlueBits = hint; break; case GLFW_ACCUM_ALPHA_BITS: _glfwLibrary.hints.accumAlphaBits = hint; break; case GLFW_AUX_BUFFERS: _glfwLibrary.hints.auxBuffers = hint; break; case GLFW_STEREO: _glfwLibrary.hints.stereo = hint; break; case GLFW_WINDOW_NO_RESIZE: _glfwLibrary.hints.windowNoResize = hint; break; case GLFW_FSAA_SAMPLES: _glfwLibrary.hints.samples = hint; break; case GLFW_OPENGL_VERSION_MAJOR: _glfwLibrary.hints.glMajor = hint; break; case GLFW_OPENGL_VERSION_MINOR: _glfwLibrary.hints.glMinor = hint; break; case GLFW_OPENGL_FORWARD_COMPAT: _glfwLibrary.hints.glForward = hint; break; case GLFW_OPENGL_DEBUG_CONTEXT: _glfwLibrary.hints.glDebug = hint; break; case GLFW_OPENGL_PROFILE: _glfwLibrary.hints.glProfile = hint; break; default: break; } } //======================================================================== // Properly kill the window / video display //======================================================================== GLFWAPI void GLFWAPIENTRY glfwCloseWindow( void ) { if( !_glfwInitialized ) { return; } // Show mouse pointer again (if hidden) glfwEnable( GLFW_MOUSE_CURSOR ); _glfwPlatformCloseWindow(); memset( &_glfwWin, 0, sizeof(_glfwWin) ); } //======================================================================== // Set the window title //======================================================================== GLFWAPI void GLFWAPIENTRY glfwSetWindowTitle( const char *title ) { if( !_glfwInitialized || !_glfwWin.opened ) { return; } // Set window title _glfwPlatformSetWindowTitle( title ); } //======================================================================== // Get the window size //======================================================================== GLFWAPI void GLFWAPIENTRY glfwGetWindowSize( int *width, int *height ) { if( !_glfwInitialized || !_glfwWin.opened ) { return; } if( width != NULL ) { *width = _glfwWin.width; } if( height != NULL ) { *height = _glfwWin.height; } } //======================================================================== // Set the window size //======================================================================== GLFWAPI void GLFWAPIENTRY glfwSetWindowSize( int width, int height ) { if( !_glfwInitialized || !_glfwWin.opened || _glfwWin.iconified ) { return; } // Don't do anything if the window size did not change if( width == _glfwWin.width && height == _glfwWin.height ) { return; } // Change window size _glfwPlatformSetWindowSize( width, height ); // Refresh window parameters (may have changed due to changed video // modes) _glfwPlatformRefreshWindowParams(); } //======================================================================== // Set the window position //======================================================================== GLFWAPI void GLFWAPIENTRY glfwSetWindowPos( int x, int y ) { if( !_glfwInitialized || !_glfwWin.opened || _glfwWin.fullscreen || _glfwWin.iconified ) { return; } // Set window position _glfwPlatformSetWindowPos( x, y ); } //======================================================================== // Window iconification //======================================================================== GLFWAPI void GLFWAPIENTRY glfwIconifyWindow( void ) { if( !_glfwInitialized || !_glfwWin.opened || _glfwWin.iconified ) { return; } // Iconify window _glfwPlatformIconifyWindow(); } //======================================================================== // Window un-iconification //======================================================================== GLFWAPI void GLFWAPIENTRY glfwRestoreWindow( void ) { if( !_glfwInitialized || !_glfwWin.opened || !_glfwWin.iconified ) { return; } // Restore iconified window _glfwPlatformRestoreWindow(); // Refresh window parameters _glfwPlatformRefreshWindowParams(); } //======================================================================== // Swap buffers (double-buffering) and poll any new events //======================================================================== GLFWAPI void GLFWAPIENTRY glfwSwapBuffers( void ) { if( !_glfwInitialized || !_glfwWin.opened ) { return; } _glfwPlatformSwapBuffers(); // Check for window messages if( _glfwWin.autoPollEvents ) { glfwPollEvents(); } } //======================================================================== // Set double buffering swap interval (0 = vsync off) //======================================================================== GLFWAPI void GLFWAPIENTRY glfwSwapInterval( int interval ) { if( !_glfwInitialized || !_glfwWin.opened ) { return; } // Set double buffering swap interval _glfwPlatformSwapInterval( interval ); } //======================================================================== // Get window parameter //======================================================================== GLFWAPI int GLFWAPIENTRY glfwGetWindowParam( int param ) { if( !_glfwInitialized ) { return 0; } // Is the window opened? if( !_glfwWin.opened ) { if( param == GLFW_OPENED ) { return GL_FALSE; } return 0; } // Window parameters switch( param ) { case GLFW_OPENED: return GL_TRUE; case GLFW_ACTIVE: return _glfwWin.active; case GLFW_ICONIFIED: return _glfwWin.iconified; case GLFW_ACCELERATED: return _glfwWin.accelerated; case GLFW_RED_BITS: return _glfwWin.redBits; case GLFW_GREEN_BITS: return _glfwWin.greenBits; case GLFW_BLUE_BITS: return _glfwWin.blueBits; case GLFW_ALPHA_BITS: return _glfwWin.alphaBits; case GLFW_DEPTH_BITS: return _glfwWin.depthBits; case GLFW_STENCIL_BITS: return _glfwWin.stencilBits; case GLFW_ACCUM_RED_BITS: return _glfwWin.accumRedBits; case GLFW_ACCUM_GREEN_BITS: return _glfwWin.accumGreenBits; case GLFW_ACCUM_BLUE_BITS: return _glfwWin.accumBlueBits; case GLFW_ACCUM_ALPHA_BITS: return _glfwWin.accumAlphaBits; case GLFW_AUX_BUFFERS: return _glfwWin.auxBuffers; case GLFW_STEREO: return _glfwWin.stereo; case GLFW_REFRESH_RATE: return _glfwWin.refreshRate; case GLFW_WINDOW_NO_RESIZE: return _glfwWin.windowNoResize; case GLFW_FSAA_SAMPLES: return _glfwWin.samples; case GLFW_OPENGL_VERSION_MAJOR: return _glfwWin.glMajor; case GLFW_OPENGL_VERSION_MINOR: return _glfwWin.glMinor; case GLFW_OPENGL_FORWARD_COMPAT: return _glfwWin.glForward; case GLFW_OPENGL_DEBUG_CONTEXT: return _glfwWin.glDebug; case GLFW_OPENGL_PROFILE: return _glfwWin.glProfile; default: return 0; } } //======================================================================== // Set callback function for window size changes //======================================================================== GLFWAPI void GLFWAPIENTRY glfwSetWindowSizeCallback( GLFWwindowsizefun cbfun ) { if( !_glfwInitialized || !_glfwWin.opened ) { return; } // Set callback function _glfwWin.windowSizeCallback = cbfun; // Call the callback function to let the application know the current // window size if( cbfun ) { cbfun( _glfwWin.width, _glfwWin.height ); } } //======================================================================== // Set callback function for window close events //======================================================================== GLFWAPI void GLFWAPIENTRY glfwSetWindowCloseCallback( GLFWwindowclosefun cbfun ) { if( !_glfwInitialized || !_glfwWin.opened ) { return; } // Set callback function _glfwWin.windowCloseCallback = cbfun; } //======================================================================== // Set callback function for window refresh events //======================================================================== GLFWAPI void GLFWAPIENTRY glfwSetWindowRefreshCallback( GLFWwindowrefreshfun cbfun ) { if( !_glfwInitialized || !_glfwWin.opened ) { return; } // Set callback function _glfwWin.windowRefreshCallback = cbfun; } //======================================================================== // Poll for new window and input events //======================================================================== GLFWAPI void GLFWAPIENTRY glfwPollEvents( void ) { if( !_glfwInitialized || !_glfwWin.opened ) { return; } // Poll for new events _glfwPlatformPollEvents(); } //======================================================================== // Wait for new window and input events //======================================================================== GLFWAPI void GLFWAPIENTRY glfwWaitEvents( void ) { if( !_glfwInitialized || !_glfwWin.opened ) { return; } // Poll for new events _glfwPlatformWaitEvents(); } GLFW-0.5.1.0/glfw/lib/cocoa/0000755000000000000000000000000012045371042013367 5ustar0000000000000000GLFW-0.5.1.0/glfw/lib/cocoa/cocoa_enable.m0000644000000000000000000000402112045371042016134 0ustar0000000000000000//======================================================================== // GLFW - An OpenGL framework // Platform: Cocoa/NSOpenGL // API Version: 2.7 // WWW: http://www.glfw.org/ //------------------------------------------------------------------------ // Copyright (c) 2009-2010 Camilla Berglund // // This software is provided 'as-is', without any express or implied // warranty. In no event will the authors be held liable for any damages // arising from the use of this software. // // Permission is granted to anyone to use this software for any purpose, // including commercial applications, and to alter it and redistribute it // freely, subject to the following restrictions: // // 1. The origin of this software must not be misrepresented; you must not // claim that you wrote the original software. If you use this software // in a product, an acknowledgment in the product documentation would // be appreciated but is not required. // // 2. Altered source versions must be plainly marked as such, and must not // be misrepresented as being the original software. // // 3. This notice may not be removed or altered from any source // distribution. // //======================================================================== #include "internal.h" //************************************************************************ //**** Platform implementation functions **** //************************************************************************ //======================================================================== // Enable and disable system keys //======================================================================== void _glfwPlatformEnableSystemKeys( void ) { // This is checked in macosx_window.m; we take no action here } void _glfwPlatformDisableSystemKeys( void ) { // This is checked in macosx_window.m; we take no action here // I don't think it's really possible to disable stuff like Exposé // except in full-screen mode. } GLFW-0.5.1.0/glfw/lib/cocoa/cocoa_fullscreen.m0000644000000000000000000001002412045371042017050 0ustar0000000000000000//======================================================================== // GLFW - An OpenGL framework // Platform: Cocoa/NSOpenGL // API Version: 2.7 // WWW: http://www.glfw.org/ //------------------------------------------------------------------------ // Copyright (c) 2009-2010 Camilla Berglund // // This software is provided 'as-is', without any express or implied // warranty. In no event will the authors be held liable for any damages // arising from the use of this software. // // Permission is granted to anyone to use this software for any purpose, // including commercial applications, and to alter it and redistribute it // freely, subject to the following restrictions: // // 1. The origin of this software must not be misrepresented; you must not // claim that you wrote the original software. If you use this software // in a product, an acknowledgment in the product documentation would // be appreciated but is not required. // // 2. Altered source versions must be plainly marked as such, and must not // be misrepresented as being the original software. // // 3. This notice may not be removed or altered from any source // distribution. // //======================================================================== #include "internal.h" //======================================================================== // Check whether the display mode should be included in enumeration //======================================================================== static BOOL modeIsGood( NSDictionary *mode ) { // This is a bit controversial, if you've got something other than an // LCD computer monitor as an output device you might not want these // checks. You might also want to reject modes which are interlaced, // or TV out. There is no one-size-fits-all policy that can work here. // This seems like a decent compromise, but certain applications may // wish to patch this... return [[mode objectForKey:(id)kCGDisplayBitsPerPixel] intValue] >= 15 && [mode objectForKey:(id)kCGDisplayModeIsSafeForHardware] != nil && [mode objectForKey:(id)kCGDisplayModeIsStretched] == nil; } //======================================================================== // Convert Core Graphics display mode to GLFW video mode //======================================================================== static GLFWvidmode vidmodeFromCGDisplayMode( NSDictionary *mode ) { unsigned int width = [[mode objectForKey:(id)kCGDisplayWidth] unsignedIntValue]; unsigned int height = [[mode objectForKey:(id)kCGDisplayHeight] unsignedIntValue]; unsigned int bps = [[mode objectForKey:(id)kCGDisplayBitsPerSample] unsignedIntValue]; GLFWvidmode result; result.Width = width; result.Height = height; result.RedBits = bps; result.GreenBits = bps; result.BlueBits = bps; return result; } //************************************************************************ //**** Platform implementation functions **** //************************************************************************ //======================================================================== // Get a list of available video modes //======================================================================== int _glfwPlatformGetVideoModes( GLFWvidmode *list, int maxcount ) { NSArray *modes = (NSArray *)CGDisplayAvailableModes( CGMainDisplayID() ); unsigned int i, j = 0, n = [modes count]; for( i = 0; i < n && j < (unsigned)maxcount; i++ ) { NSDictionary *mode = [modes objectAtIndex:i]; if( modeIsGood( mode ) ) { list[j++] = vidmodeFromCGDisplayMode( mode ); } } return j; } //======================================================================== // Get the desktop video mode //======================================================================== void _glfwPlatformGetDesktopMode( GLFWvidmode *mode ) { *mode = vidmodeFromCGDisplayMode( CGDisplayCurrentMode( CGMainDisplayID() ) ); } GLFW-0.5.1.0/glfw/lib/cocoa/cocoa_glext.m0000644000000000000000000000502512045371042016036 0ustar0000000000000000//======================================================================== // GLFW - An OpenGL framework // Platform: Cocoa/NSOpenGL // API Version: 2.7 // WWW: http://www.glfw.org/ //------------------------------------------------------------------------ // Copyright (c) 2009-2010 Camilla Berglund // // This software is provided 'as-is', without any express or implied // warranty. In no event will the authors be held liable for any damages // arising from the use of this software. // // Permission is granted to anyone to use this software for any purpose, // including commercial applications, and to alter it and redistribute it // freely, subject to the following restrictions: // // 1. The origin of this software must not be misrepresented; you must not // claim that you wrote the original software. If you use this software // in a product, an acknowledgment in the product documentation would // be appreciated but is not required. // // 2. Altered source versions must be plainly marked as such, and must not // be misrepresented as being the original software. // // 3. This notice may not be removed or altered from any source // distribution. // //======================================================================== #include "internal.h" //************************************************************************ //**** Platform implementation functions **** //************************************************************************ //======================================================================== // Check if an OpenGL extension is available at runtime //======================================================================== int _glfwPlatformExtensionSupported( const char *extension ) { // There are no AGL, CGL or NSGL extensions. return GL_FALSE; } //======================================================================== // Get the function pointer to an OpenGL function //======================================================================== void * _glfwPlatformGetProcAddress( const char *procname ) { CFStringRef symbolName = CFStringCreateWithCString( kCFAllocatorDefault, procname, kCFStringEncodingASCII ); void *symbol = CFBundleGetFunctionPointerForName( _glfwLibrary.OpenGLFramework, symbolName ); CFRelease( symbolName ); return symbol; } GLFW-0.5.1.0/glfw/lib/cocoa/cocoa_init.m0000644000000000000000000001250012045371042015652 0ustar0000000000000000//======================================================================== // GLFW - An OpenGL framework // Platform: Cocoa/NSOpenGL // API Version: 2.7 // WWW: http://www.glfw.org/ //------------------------------------------------------------------------ // Copyright (c) 2009-2010 Camilla Berglund // // This software is provided 'as-is', without any express or implied // warranty. In no event will the authors be held liable for any damages // arising from the use of this software. // // Permission is granted to anyone to use this software for any purpose, // including commercial applications, and to alter it and redistribute it // freely, subject to the following restrictions: // // 1. The origin of this software must not be misrepresented; you must not // claim that you wrote the original software. If you use this software // in a product, an acknowledgment in the product documentation would // be appreciated but is not required. // // 2. Altered source versions must be plainly marked as such, and must not // be misrepresented as being the original software. // // 3. This notice may not be removed or altered from any source // distribution. // //======================================================================== #include #include "internal.h" @interface GLFWThread : NSThread @end @implementation GLFWThread - (void)main { } @end //======================================================================== // Change to our application bundle's resources directory, if present //======================================================================== static void changeToResourcesDirectory( void ) { char resourcesPath[MAXPATHLEN]; CFBundleRef bundle = CFBundleGetMainBundle(); if( !bundle ) return; CFURLRef resourcesURL = CFBundleCopyResourcesDirectoryURL( bundle ); CFStringRef last = CFURLCopyLastPathComponent( resourcesURL ); if( CFStringCompare( CFSTR( "Resources" ), last, 0 ) != kCFCompareEqualTo ) { CFRelease( last ); CFRelease( resourcesURL ); return; } CFRelease( last ); if( !CFURLGetFileSystemRepresentation( resourcesURL, true, (UInt8*) resourcesPath, MAXPATHLEN) ) { CFRelease( resourcesURL ); return; } CFRelease( resourcesURL ); chdir( resourcesPath ); } //======================================================================== // Terminate GLFW when exiting application //======================================================================== static void glfw_atexit( void ) { glfwTerminate(); } //======================================================================== // Initialize GLFW thread package //======================================================================== static void initThreads( void ) { // Initialize critical section handle (void) pthread_mutex_init( &_glfwThrd.CriticalSection, NULL ); // The first thread (the main thread) has ID 0 _glfwThrd.NextID = 0; // Fill out information about the main thread (this thread) _glfwThrd.First.ID = _glfwThrd.NextID ++; _glfwThrd.First.Function = NULL; _glfwThrd.First.PosixID = pthread_self(); _glfwThrd.First.Previous = NULL; _glfwThrd.First.Next = NULL; } //************************************************************************ //**** Platform implementation functions **** //************************************************************************ //======================================================================== // Initialize the GLFW library //======================================================================== int _glfwPlatformInit( void ) { _glfwLibrary.autoreleasePool = [[NSAutoreleasePool alloc] init]; _glfwLibrary.OpenGLFramework = CFBundleGetBundleWithIdentifier( CFSTR( "com.apple.opengl" ) ); if( _glfwLibrary.OpenGLFramework == NULL ) { return GL_FALSE; } GLFWThread* thread = [[GLFWThread alloc] init]; [thread start]; [thread release]; changeToResourcesDirectory(); _glfwPlatformGetDesktopMode( &_glfwLibrary.desktopMode ); // Install atexit routine atexit( glfw_atexit ); initThreads(); _glfwInitTimer(); _glfwLibrary.eventSource = CGEventSourceCreate( kCGEventSourceStateHIDSystemState ); if( !_glfwLibrary.eventSource ) { return GL_FALSE; } CGEventSourceSetLocalEventsSuppressionInterval( _glfwLibrary.eventSource, 0.0 ); _glfwPlatformSetTime( 0.0 ); return GL_TRUE; } //======================================================================== // Close window, if open, and shut down GLFW //======================================================================== int _glfwPlatformTerminate( void ) { // TODO: Fail unless this is the main thread glfwCloseWindow(); // TODO: Kill all non-main threads? // TODO: Probably other cleanup if( _glfwLibrary.eventSource ) { CFRelease( _glfwLibrary.eventSource ); _glfwLibrary.eventSource = NULL; } [_glfwLibrary.autoreleasePool release]; _glfwLibrary.autoreleasePool = nil; return GL_TRUE; } GLFW-0.5.1.0/glfw/lib/cocoa/cocoa_joystick.m0000644000000000000000000000462212045371042016554 0ustar0000000000000000//======================================================================== // GLFW - An OpenGL framework // Platform: Cocoa/NSOpenGL // API Version: 2.7 // WWW: http://www.glfw.org/ //------------------------------------------------------------------------ // Copyright (c) 2009-2010 Camilla Berglund // // This software is provided 'as-is', without any express or implied // warranty. In no event will the authors be held liable for any damages // arising from the use of this software. // // Permission is granted to anyone to use this software for any purpose, // including commercial applications, and to alter it and redistribute it // freely, subject to the following restrictions: // // 1. The origin of this software must not be misrepresented; you must not // claim that you wrote the original software. If you use this software // in a product, an acknowledgment in the product documentation would // be appreciated but is not required. // // 2. Altered source versions must be plainly marked as such, and must not // be misrepresented as being the original software. // // 3. This notice may not be removed or altered from any source // distribution. // //======================================================================== #include "internal.h" //************************************************************************ //**** Platform implementation functions **** //************************************************************************ //======================================================================== // Determine joystick capabilities //======================================================================== int _glfwPlatformGetJoystickParam( int joy, int param ) { // TODO: Implement this. return 0; } //======================================================================== // Get joystick axis positions //======================================================================== int _glfwPlatformGetJoystickPos( int joy, float *pos, int numaxes ) { // TODO: Implement this. return 0; } //======================================================================== // Get joystick button states //======================================================================== int _glfwPlatformGetJoystickButtons( int joy, unsigned char *buttons, int numbuttons ) { // TODO: Implement this. return 0; } GLFW-0.5.1.0/glfw/lib/cocoa/cocoa_thread.c0000644000000000000000000002741012045371042016152 0ustar0000000000000000//======================================================================== // GLFW - An OpenGL framework // Platform: Cocoa/NSOpenGL // API Version: 2.7 // WWW: http://www.glfw.org/ //------------------------------------------------------------------------ // Copyright (c) 2009-2010 Camilla Berglund // // This software is provided 'as-is', without any express or implied // warranty. In no event will the authors be held liable for any damages // arising from the use of this software. // // Permission is granted to anyone to use this software for any purpose, // including commercial applications, and to alter it and redistribute it // freely, subject to the following restrictions: // // 1. The origin of this software must not be misrepresented; you must not // claim that you wrote the original software. If you use this software // in a product, an acknowledgment in the product documentation would // be appreciated but is not required. // // 2. Altered source versions must be plainly marked as such, and must not // be misrepresented as being the original software. // // 3. This notice may not be removed or altered from any source // distribution. // //======================================================================== #include "internal.h" #include #include //************************************************************************ //**** GLFW internal functions **** //************************************************************************ //======================================================================== // _glfwNewThread() - This is simply a "wrapper" for calling the user // thread function. //======================================================================== void * _glfwNewThread( void * arg ) { GLFWthreadfun threadfun; _GLFWthread *t; // Get pointer to thread information for current thread t = _glfwGetThreadPointer( glfwGetThreadID() ); if( t == NULL ) { return 0; } // Get user thread function pointer threadfun = t->Function; // Call the user thread function threadfun( arg ); // Remove thread from thread list ENTER_THREAD_CRITICAL_SECTION _glfwRemoveThread( t ); LEAVE_THREAD_CRITICAL_SECTION // When the thread function returns, the thread will die... return NULL; } //************************************************************************ //**** Platform implementation functions **** //************************************************************************ //======================================================================== // _glfwPlatformCreateThread() - Create a new thread //======================================================================== GLFWthread _glfwPlatformCreateThread( GLFWthreadfun fun, void *arg ) { GLFWthread ID; _GLFWthread *t; int result; // Enter critical section ENTER_THREAD_CRITICAL_SECTION // Create a new thread information memory area t = (_GLFWthread *) malloc( sizeof(_GLFWthread) ); if( t == NULL ) { // Leave critical section LEAVE_THREAD_CRITICAL_SECTION return -1; } // Get a new unique thread id ID = _glfwThrd.NextID ++; // Store thread information in the thread list t->Function = fun; t->ID = ID; // Create thread result = pthread_create( &t->PosixID, // Thread handle NULL, // Default thread attributes _glfwNewThread, // Thread function (a wrapper function) (void *)arg // Argument to thread is user argument ); // Did the thread creation fail? if( result != 0 ) { free( (void *) t ); LEAVE_THREAD_CRITICAL_SECTION return -1; } // Append thread to thread list _glfwAppendThread( t ); // Leave critical section LEAVE_THREAD_CRITICAL_SECTION // Return the GLFW thread ID return ID; } //======================================================================== // _glfwPlatformDestroyThread() - Kill a thread. NOTE: THIS IS A VERY // DANGEROUS OPERATION, AND SHOULD NOT BE USED EXCEPT IN EXTREME // SITUATIONS! //======================================================================== void _glfwPlatformDestroyThread( GLFWthread ID ) { _GLFWthread *t; // Enter critical section ENTER_THREAD_CRITICAL_SECTION // Get thread information pointer t = _glfwGetThreadPointer( ID ); if( t == NULL ) { LEAVE_THREAD_CRITICAL_SECTION return; } // Simply murder the process, no mercy! pthread_kill( t->PosixID, SIGKILL ); // Remove thread from thread list _glfwRemoveThread( t ); // Leave critical section LEAVE_THREAD_CRITICAL_SECTION } //======================================================================== // _glfwPlatformWaitThread() - Wait for a thread to die //======================================================================== int _glfwPlatformWaitThread( GLFWthread ID, int waitmode ) { pthread_t thread; _GLFWthread *t; // Enter critical section ENTER_THREAD_CRITICAL_SECTION // Get thread information pointer t = _glfwGetThreadPointer( ID ); // Is the thread already dead? if( t == NULL ) { LEAVE_THREAD_CRITICAL_SECTION return GL_TRUE; } // If got this far, the thread is alive => polling returns FALSE if( waitmode == GLFW_NOWAIT ) { LEAVE_THREAD_CRITICAL_SECTION return GL_FALSE; } // Get thread handle thread = t->PosixID; // Leave critical section LEAVE_THREAD_CRITICAL_SECTION // Wait for thread to die (void) pthread_join( thread, NULL ); return GL_TRUE; } //======================================================================== // _glfwPlatformGetThreadID() - Return the thread ID for the current // thread //======================================================================== GLFWthread _glfwPlatformGetThreadID( void ) { _GLFWthread *t; GLFWthread ID = -1; pthread_t posixID; // Get current thread ID posixID = pthread_self(); // Enter critical section ENTER_THREAD_CRITICAL_SECTION // Loop through entire list of threads to find the matching POSIX // thread ID for( t = &_glfwThrd.First; t != NULL; t = t->Next ) { if( t->PosixID == posixID ) { ID = t->ID; break; } } // Leave critical section LEAVE_THREAD_CRITICAL_SECTION // Return the found GLFW thread identifier return ID; } //======================================================================== // _glfwPlatformCreateMutex() - Create a mutual exclusion object //======================================================================== GLFWmutex _glfwPlatformCreateMutex( void ) { pthread_mutex_t *mutex; // Allocate memory for mutex mutex = (pthread_mutex_t *) malloc( sizeof( pthread_mutex_t ) ); if( !mutex ) { return NULL; } // Initialise a mutex object (void) pthread_mutex_init( mutex, NULL ); // Cast to GLFWmutex and return return (GLFWmutex) mutex; } //======================================================================== // _glfwPlatformDestroyMutex() - Destroy a mutual exclusion object //======================================================================== void _glfwPlatformDestroyMutex( GLFWmutex mutex ) { // Destroy the mutex object pthread_mutex_destroy( (pthread_mutex_t *) mutex ); // Free memory for mutex object free( (void *) mutex ); } //======================================================================== // _glfwPlatformLockMutex() - Request access to a mutex //======================================================================== void _glfwPlatformLockMutex( GLFWmutex mutex ) { // Wait for mutex to be released (void) pthread_mutex_lock( (pthread_mutex_t *) mutex ); } //======================================================================== // _glfwPlatformUnlockMutex() - Release a mutex //======================================================================== void _glfwPlatformUnlockMutex( GLFWmutex mutex ) { // Release mutex pthread_mutex_unlock( (pthread_mutex_t *) mutex ); } //======================================================================== // _glfwPlatformCreateCond() - Create a new condition variable object //======================================================================== GLFWcond _glfwPlatformCreateCond( void ) { pthread_cond_t *cond; // Allocate memory for condition variable cond = (pthread_cond_t *) malloc( sizeof(pthread_cond_t) ); if( !cond ) { return NULL; } // Initialise condition variable (void) pthread_cond_init( cond, NULL ); // Cast to GLFWcond and return return (GLFWcond) cond; } //======================================================================== // _glfwPlatformDestroyCond() - Destroy a condition variable object //======================================================================== void _glfwPlatformDestroyCond( GLFWcond cond ) { // Destroy the condition variable object (void) pthread_cond_destroy( (pthread_cond_t *) cond ); // Free memory for condition variable object free( (void *) cond ); } //======================================================================== // _glfwPlatformWaitCond() - Wait for a condition to be raised //======================================================================== void _glfwPlatformWaitCond( GLFWcond cond, GLFWmutex mutex, double timeout ) { struct timeval currenttime; struct timespec wait; long dt_sec, dt_usec; // Select infinite or timed wait if( timeout >= GLFW_INFINITY ) { // Wait for condition (infinite wait) (void) pthread_cond_wait( (pthread_cond_t *) cond, (pthread_mutex_t *) mutex ); } else { // Set timeout time, relatvie to current time gettimeofday( ¤ttime, NULL ); dt_sec = (long) timeout; dt_usec = (long) ((timeout - (double)dt_sec) * 1000000.0); wait.tv_nsec = (currenttime.tv_usec + dt_usec) * 1000L; if( wait.tv_nsec > 1000000000L ) { wait.tv_nsec -= 1000000000L; dt_sec ++; } wait.tv_sec = currenttime.tv_sec + dt_sec; // Wait for condition (timed wait) (void) pthread_cond_timedwait( (pthread_cond_t *) cond, (pthread_mutex_t *) mutex, &wait ); } } //======================================================================== // _glfwPlatformSignalCond() - Signal a condition to one waiting thread //======================================================================== void _glfwPlatformSignalCond( GLFWcond cond ) { // Signal condition (void) pthread_cond_signal( (pthread_cond_t *) cond ); } //======================================================================== // _glfwPlatformBroadcastCond() - Broadcast a condition to all waiting // threads //======================================================================== void _glfwPlatformBroadcastCond( GLFWcond cond ) { // Broadcast condition (void) pthread_cond_broadcast( (pthread_cond_t *) cond ); } //======================================================================== // _glfwPlatformGetNumberOfProcessors() - Return the number of processors // in the system. //======================================================================== int _glfwPlatformGetNumberOfProcessors( void ) { int n; // Get number of processors online _glfw_numprocessors( n ); return n; } GLFW-0.5.1.0/glfw/lib/cocoa/cocoa_time.m0000644000000000000000000001056512045371042015656 0ustar0000000000000000//======================================================================== // GLFW - An OpenGL framework // Platform: Cocoa/NSOpenGL // API Version: 2.7 // WWW: http://www.glfw.org/ //------------------------------------------------------------------------ // Copyright (c) 2009-2010 Camilla Berglund // // This software is provided 'as-is', without any express or implied // warranty. In no event will the authors be held liable for any damages // arising from the use of this software. // // Permission is granted to anyone to use this software for any purpose, // including commercial applications, and to alter it and redistribute it // freely, subject to the following restrictions: // // 1. The origin of this software must not be misrepresented; you must not // claim that you wrote the original software. If you use this software // in a product, an acknowledgment in the product documentation would // be appreciated but is not required. // // 2. Altered source versions must be plainly marked as such, and must not // be misrepresented as being the original software. // // 3. This notice may not be removed or altered from any source // distribution. // //======================================================================== #include "internal.h" #include #include //======================================================================== // Return raw time //======================================================================== static uint64_t getRawTime( void ) { return mach_absolute_time(); } //======================================================================== // Initialise timer //======================================================================== void _glfwInitTimer( void ) { mach_timebase_info_data_t info; mach_timebase_info( &info ); _glfwLibrary.timer.resolution = (double) info.numer / ( info.denom * 1.0e9 ); _glfwLibrary.timer.base = getRawTime(); } //************************************************************************ //**** Platform implementation functions **** //************************************************************************ //======================================================================== // Return timer value in seconds //======================================================================== double _glfwPlatformGetTime( void ) { return (double) ( getRawTime() - _glfwLibrary.timer.base ) * _glfwLibrary.timer.resolution; } //======================================================================== // Set timer value in seconds //======================================================================== void _glfwPlatformSetTime( double time ) { _glfwLibrary.timer.base = getRawTime() - (uint64_t) ( time / _glfwLibrary.timer.resolution ); } //======================================================================== // Put a thread to sleep for a specified amount of time //======================================================================== void _glfwPlatformSleep( double time ) { if( time == 0.0 ) { sched_yield(); return; } struct timeval currenttime; struct timespec wait; pthread_mutex_t mutex; pthread_cond_t cond; long dt_sec, dt_usec; // Not all pthread implementations have a pthread_sleep() function. We // do it the portable way, using a timed wait for a condition that we // will never signal. NOTE: The unistd functions sleep/usleep suspends // the entire PROCESS, not a signle thread, which is why we can not // use them to implement glfwSleep. // Set timeout time, relatvie to current time gettimeofday( ¤ttime, NULL ); dt_sec = (long) time; dt_usec = (long) ((time - (double)dt_sec) * 1000000.0); wait.tv_nsec = (currenttime.tv_usec + dt_usec) * 1000L; if( wait.tv_nsec > 1000000000L ) { wait.tv_nsec -= 1000000000L; dt_sec ++; } wait.tv_sec = currenttime.tv_sec + dt_sec; // Initialize condition and mutex objects pthread_mutex_init( &mutex, NULL ); pthread_cond_init( &cond, NULL ); // Do a timed wait pthread_mutex_lock( &mutex ); pthread_cond_timedwait( &cond, &mutex, &wait ); pthread_mutex_unlock( &mutex ); // Destroy condition and mutex objects pthread_mutex_destroy( &mutex ); pthread_cond_destroy( &cond ); } GLFW-0.5.1.0/glfw/lib/cocoa/cocoa_window.m0000644000000000000000000010055412045371042016225 0ustar0000000000000000//======================================================================== // GLFW - An OpenGL framework // Platform: Cocoa/NSOpenGL // API Version: 2.7 // WWW: http://www.glfw.org/ //------------------------------------------------------------------------ // Copyright (c) 2009-2010 Camilla Berglund // // This software is provided 'as-is', without any express or implied // warranty. In no event will the authors be held liable for any damages // arising from the use of this software. // // Permission is granted to anyone to use this software for any purpose, // including commercial applications, and to alter it and redistribute it // freely, subject to the following restrictions: // // 1. The origin of this software must not be misrepresented; you must not // claim that you wrote the original software. If you use this software // in a product, an acknowledgment in the product documentation would // be appreciated but is not required. // // 2. Altered source versions must be plainly marked as such, and must not // be misrepresented as being the original software. // // 3. This notice may not be removed or altered from any source // distribution. // //======================================================================== #include "internal.h" #include // Needed for _NSGetProgname #include //======================================================================== // GLFW application class //======================================================================== @interface GLFWApplication : NSApplication @end @implementation GLFWApplication // From http://cocoadev.com/index.pl?GameKeyboardHandlingAlmost // This works around an AppKit bug, where key up events while holding // down the command key don't get sent to the key window. - (void)sendEvent:(NSEvent *)event { if( [event type] == NSKeyUp && ( [event modifierFlags] & NSCommandKeyMask ) ) { [[self keyWindow] sendEvent:event]; } else { [super sendEvent:event]; } } @end // Prior to Snow Leopard, we need to use this oddly-named semi-private API // to get the application menu working properly. Need to be careful in // case it goes away in a future OS update. @interface NSApplication (NSAppleMenu) - (void)setAppleMenu:(NSMenu *)m; @end //======================================================================== // Try to figure out what the calling application is called //======================================================================== static NSString *findAppName( void ) { // Keys to search for as potential application names NSString *keys[] = { @"CFBundleDisplayName", @"CFBundleName", @"CFBundleExecutable", }; NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary]; unsigned int i; for( i = 0; i < sizeof(keys) / sizeof(keys[0]); i++ ) { id name = [infoDictionary objectForKey:keys[i]]; if( name && [name isKindOfClass:[NSString class]] && ![@"" isEqualToString:name] ) { return name; } } // Could do this only if we discover we're unbundled, but it should // do no harm... ProcessSerialNumber psn = { 0, kCurrentProcess }; TransformProcessType( &psn, kProcessTransformToForegroundApplication ); // Having the app in front of the terminal window is also generally // handy. There is an NSApplication API to do this, but... SetFrontProcess( &psn ); char **progname = _NSGetProgname(); if( progname && *progname ) { // TODO: UTF8? return [NSString stringWithUTF8String:*progname]; } // Really shouldn't get here return @"GLFW Application"; } //======================================================================== // Set up the menu bar (manually) // This is nasty, nasty stuff -- calls to undocumented semi-private APIs that // could go away at any moment, lots of stuff that really should be // localize(d|able), etc. Loading a nib would save us this horror, but that // doesn't seem like a good thing to require of GLFW's clients. //======================================================================== static void setUpMenuBar( void ) { NSString *appName = findAppName(); NSMenu *bar = [[NSMenu alloc] init]; [NSApp setMainMenu:bar]; NSMenuItem *appMenuItem = [bar addItemWithTitle:@"" action:NULL keyEquivalent:@""]; NSMenu *appMenu = [[NSMenu alloc] init]; [appMenuItem setSubmenu:appMenu]; [appMenu addItemWithTitle:[NSString stringWithFormat:@"About %@", appName] action:@selector(orderFrontStandardAboutPanel:) keyEquivalent:@""]; [appMenu addItem:[NSMenuItem separatorItem]]; NSMenu *servicesMenu = [[NSMenu alloc] init]; [NSApp setServicesMenu:servicesMenu]; [[appMenu addItemWithTitle:@"Services" action:NULL keyEquivalent:@""] setSubmenu:servicesMenu]; [appMenu addItem:[NSMenuItem separatorItem]]; [appMenu addItemWithTitle:[NSString stringWithFormat:@"Hide %@", appName] action:@selector(hide:) keyEquivalent:@"h"]; [[appMenu addItemWithTitle:@"Hide Others" action:@selector(hideOtherApplications:) keyEquivalent:@"h"] setKeyEquivalentModifierMask:NSAlternateKeyMask | NSCommandKeyMask]; [appMenu addItemWithTitle:@"Show All" action:@selector(unhideAllApplications:) keyEquivalent:@""]; [appMenu addItem:[NSMenuItem separatorItem]]; [appMenu addItemWithTitle:[NSString stringWithFormat:@"Quit %@", appName] action:@selector(terminate:) keyEquivalent:@"q"]; NSMenuItem *windowMenuItem = [bar addItemWithTitle:@"" action:NULL keyEquivalent:@""]; NSMenu *windowMenu = [[NSMenu alloc] initWithTitle:@"Window"]; [NSApp setWindowsMenu:windowMenu]; [windowMenuItem setSubmenu:windowMenu]; [windowMenu addItemWithTitle:@"Miniaturize" action:@selector(performMiniaturize:) keyEquivalent:@"m"]; [windowMenu addItemWithTitle:@"Zoom" action:@selector(performZoom:) keyEquivalent:@""]; [windowMenu addItem:[NSMenuItem separatorItem]]; [windowMenu addItemWithTitle:@"Bring All to Front" action:@selector(arrangeInFront:) keyEquivalent:@""]; // At least guard the call to private API to avoid an exception if it // goes away. Hopefully that means the worst we'll break in future is to // look ugly... if( [NSApp respondsToSelector:@selector(setAppleMenu:)] ) { [NSApp setAppleMenu:appMenu]; } } //======================================================================== // Initialize the Cocoa Application Kit //======================================================================== static GLboolean initializeAppKit( void ) { if( NSApp ) { return GL_TRUE; } // Implicitly create shared NSApplication instance [GLFWApplication sharedApplication]; // Setting up the menu bar must go between sharedApplication // above and finishLaunching below, in order to properly emulate the // behavior of NSApplicationMain setUpMenuBar(); [NSApp finishLaunching]; return GL_TRUE; } //======================================================================== // Delegate for window related notifications // (but also used as an application delegate) //======================================================================== @interface GLFWWindowDelegate : NSObject @end @implementation GLFWWindowDelegate - (BOOL)windowShouldClose:(id)window { if( _glfwWin.windowCloseCallback ) { if( !_glfwWin.windowCloseCallback() ) { return NO; } } // This is horribly ugly, but it works glfwCloseWindow(); return NO; } - (void)windowDidResize:(NSNotification *)notification { [_glfwWin.context update]; NSRect contentRect = [_glfwWin.window contentRectForFrameRect:[_glfwWin.window frame]]; _glfwWin.width = contentRect.size.width; _glfwWin.height = contentRect.size.height; if( _glfwWin.windowSizeCallback ) { _glfwWin.windowSizeCallback( _glfwWin.width, _glfwWin.height ); } } - (void)windowDidMiniaturize:(NSNotification *)notification { _glfwWin.iconified = GL_TRUE; } - (void)windowDidDeminiaturize:(NSNotification *)notification { _glfwWin.iconified = GL_FALSE; } - (void)windowDidBecomeKey:(NSNotification *)notification { _glfwWin.active = GL_TRUE; } - (void)windowDidResignKey:(NSNotification *)notification { _glfwWin.active = GL_FALSE; _glfwInputDeactivation(); } - (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender { if( _glfwWin.windowCloseCallback ) { if( !_glfwWin.windowCloseCallback() ) { return NSTerminateCancel; } } // This is horribly ugly, but it works glfwCloseWindow(); return NSTerminateCancel; } @end //======================================================================== // Converts a Mac OS X keycode to a GLFW keycode //======================================================================== static int convertMacKeyCode( unsigned int macKeyCode ) { // TODO: Need to find mappings for F13-F15, volume down/up/mute, and eject. static const unsigned int table[128] = { /* 00 */ 'A', /* 01 */ 'S', /* 02 */ 'D', /* 03 */ 'F', /* 04 */ 'H', /* 05 */ 'G', /* 06 */ 'Z', /* 07 */ 'X', /* 08 */ 'C', /* 09 */ 'V', /* 0a */ -1, /* 0b */ 'B', /* 0c */ 'Q', /* 0d */ 'W', /* 0e */ 'E', /* 0f */ 'R', /* 10 */ 'Y', /* 11 */ 'T', /* 12 */ '1', /* 13 */ '2', /* 14 */ '3', /* 15 */ '4', /* 16 */ '6', /* 17 */ '5', /* 18 */ '=', /* 19 */ '9', /* 1a */ '7', /* 1b */ '-', /* 1c */ '8', /* 1d */ '0', /* 1e */ ']', /* 1f */ 'O', /* 20 */ 'U', /* 21 */ '[', /* 22 */ 'I', /* 23 */ 'P', /* 24 */ GLFW_KEY_ENTER, /* 25 */ 'L', /* 26 */ 'J', /* 27 */ '\'', /* 28 */ 'K', /* 29 */ ';', /* 2a */ '\\', /* 2b */ ',', /* 2c */ '/', /* 2d */ 'N', /* 2e */ 'M', /* 2f */ '.', /* 30 */ GLFW_KEY_TAB, /* 31 */ GLFW_KEY_SPACE, /* 32 */ '`', /* 33 */ GLFW_KEY_BACKSPACE, /* 34 */ -1, /* 35 */ GLFW_KEY_ESC, /* 36 */ GLFW_KEY_RSUPER, /* 37 */ GLFW_KEY_LSUPER, /* 38 */ GLFW_KEY_LSHIFT, /* 39 */ GLFW_KEY_CAPS_LOCK, /* 3a */ GLFW_KEY_LALT, /* 3b */ GLFW_KEY_LCTRL, /* 3c */ GLFW_KEY_RSHIFT, /* 3d */ GLFW_KEY_RALT, /* 3e */ GLFW_KEY_RCTRL, /* 3f */ -1, /*Function*/ /* 40 */ GLFW_KEY_F17, /* 41 */ GLFW_KEY_KP_DECIMAL, /* 42 */ -1, /* 43 */ GLFW_KEY_KP_MULTIPLY, /* 44 */ -1, /* 45 */ GLFW_KEY_KP_ADD, /* 46 */ -1, /* 47 */ -1, /*KeypadClear*/ /* 48 */ -1, /*VolumeUp*/ /* 49 */ -1, /*VolumeDown*/ /* 4a */ -1, /*Mute*/ /* 4b */ GLFW_KEY_KP_DIVIDE, /* 4c */ GLFW_KEY_KP_ENTER, /* 4d */ -1, /* 4e */ GLFW_KEY_KP_SUBTRACT, /* 4f */ GLFW_KEY_F18, /* 50 */ GLFW_KEY_F19, /* 51 */ GLFW_KEY_KP_EQUAL, /* 52 */ GLFW_KEY_KP_0, /* 53 */ GLFW_KEY_KP_1, /* 54 */ GLFW_KEY_KP_2, /* 55 */ GLFW_KEY_KP_3, /* 56 */ GLFW_KEY_KP_4, /* 57 */ GLFW_KEY_KP_5, /* 58 */ GLFW_KEY_KP_6, /* 59 */ GLFW_KEY_KP_7, /* 5a */ GLFW_KEY_F20, /* 5b */ GLFW_KEY_KP_8, /* 5c */ GLFW_KEY_KP_9, /* 5d */ -1, /* 5e */ -1, /* 5f */ -1, /* 60 */ GLFW_KEY_F5, /* 61 */ GLFW_KEY_F6, /* 62 */ GLFW_KEY_F7, /* 63 */ GLFW_KEY_F3, /* 64 */ GLFW_KEY_F8, /* 65 */ GLFW_KEY_F9, /* 66 */ -1, /* 67 */ GLFW_KEY_F11, /* 68 */ -1, /* 69 */ GLFW_KEY_F13, /* 6a */ GLFW_KEY_F16, /* 6b */ GLFW_KEY_F14, /* 6c */ -1, /* 6d */ GLFW_KEY_F10, /* 6e */ -1, /* 6f */ GLFW_KEY_F12, /* 70 */ -1, /* 71 */ GLFW_KEY_F15, /* 72 */ GLFW_KEY_INSERT, /*Help*/ /* 73 */ GLFW_KEY_HOME, /* 74 */ GLFW_KEY_PAGEUP, /* 75 */ GLFW_KEY_DEL, /* 76 */ GLFW_KEY_F4, /* 77 */ GLFW_KEY_END, /* 78 */ GLFW_KEY_F2, /* 79 */ GLFW_KEY_PAGEDOWN, /* 7a */ GLFW_KEY_F1, /* 7b */ GLFW_KEY_LEFT, /* 7c */ GLFW_KEY_RIGHT, /* 7d */ GLFW_KEY_DOWN, /* 7e */ GLFW_KEY_UP, /* 7f */ -1, }; if( macKeyCode >= 128 ) { return -1; } // This treats keycodes as *positional*; that is, we'll return 'a' // for the key left of 's', even on an AZERTY keyboard. The charInput // function should still get 'q' though. return table[macKeyCode]; } //======================================================================== // Content view class for the GLFW window //======================================================================== @interface GLFWContentView : NSView @end @implementation GLFWContentView - (BOOL)isOpaque { return YES; } - (BOOL)canBecomeKeyView { return YES; } - (BOOL)acceptsFirstResponder { return YES; } - (void)mouseDown:(NSEvent *)event { _glfwInputMouseClick( GLFW_MOUSE_BUTTON_LEFT, GLFW_PRESS ); } - (void)mouseDragged:(NSEvent *)event { [self mouseMoved:event]; } - (void)mouseUp:(NSEvent *)event { _glfwInputMouseClick( GLFW_MOUSE_BUTTON_LEFT, GLFW_RELEASE ); } - (void)mouseMoved:(NSEvent *)event { if( _glfwWin.mouseLock ) { _glfwInput.MousePosX += [event deltaX]; _glfwInput.MousePosY += [event deltaY]; } else { NSPoint p = [event locationInWindow]; // Cocoa coordinate system has origin at lower left _glfwInput.MousePosX = p.x; _glfwInput.MousePosY = [[_glfwWin.window contentView] bounds].size.height - p.y; } if( _glfwWin.mousePosCallback ) { _glfwWin.mousePosCallback( _glfwInput.MousePosX, _glfwInput.MousePosY ); } } - (void)rightMouseDown:(NSEvent *)event { _glfwInputMouseClick( GLFW_MOUSE_BUTTON_RIGHT, GLFW_PRESS ); } - (void)rightMouseDragged:(NSEvent *)event { [self mouseMoved:event]; } - (void)rightMouseUp:(NSEvent *)event { _glfwInputMouseClick( GLFW_MOUSE_BUTTON_RIGHT, GLFW_RELEASE ); } - (void)otherMouseDown:(NSEvent *)event { _glfwInputMouseClick( [event buttonNumber], GLFW_PRESS ); } - (void)otherMouseDragged:(NSEvent *)event { [self mouseMoved:event]; } - (void)otherMouseUp:(NSEvent *)event { _glfwInputMouseClick( [event buttonNumber], GLFW_RELEASE ); } - (void)keyDown:(NSEvent *)event { NSUInteger length; NSString* characters; int i, code = convertMacKeyCode( [event keyCode] ); if( code != -1 ) { _glfwInputKey( code, GLFW_PRESS ); if( [event modifierFlags] & NSCommandKeyMask ) { if( !_glfwWin.sysKeysDisabled ) { [super keyDown:event]; } } else { characters = [event characters]; length = [characters length]; for( i = 0; i < length; i++ ) { _glfwInputChar( [characters characterAtIndex:i], GLFW_PRESS ); } } } } - (void)flagsChanged:(NSEvent *)event { unsigned int newModifierFlags = [event modifierFlags] | NSDeviceIndependentModifierFlagsMask; int mode; if( newModifierFlags > _glfwWin.modifierFlags ) { mode = GLFW_PRESS; } else { mode = GLFW_RELEASE; } _glfwWin.modifierFlags = newModifierFlags; _glfwInputKey( convertMacKeyCode( [event keyCode] ), mode ); } - (void)keyUp:(NSEvent *)event { NSUInteger length; NSString* characters; int i, code = convertMacKeyCode( [event keyCode] ); if( code != -1 ) { _glfwInputKey( code, GLFW_RELEASE ); characters = [event characters]; length = [characters length]; for( i = 0; i < length; i++ ) { _glfwInputChar( [characters characterAtIndex:i], GLFW_RELEASE ); } } } - (void)scrollWheel:(NSEvent *)event { _glfwInput.WheelPosFloating += [event deltaY]; _glfwInput.WheelPos = lrint( _glfwInput.WheelPosFloating ); if( _glfwWin.mouseWheelCallback ) { _glfwWin.mouseWheelCallback( _glfwInput.WheelPos ); } } @end //************************************************************************ //**** Platform implementation functions **** //************************************************************************ //======================================================================== // Here is where the window is created, and the OpenGL rendering context is // created //======================================================================== int _glfwPlatformOpenWindow( int width, int height, const _GLFWwndconfig *wndconfig, const _GLFWfbconfig *fbconfig ) { int colorBits; _glfwWin.windowNoResize = wndconfig->windowNoResize; if( !initializeAppKit() ) { return GL_FALSE; } #if MAC_OS_X_VERSION_MAX_ALLOWED >= 1070 // Fail if any OpenGL version above 2.1 other than 3.2 was requested if( wndconfig->glMajor > 3 || ( wndconfig->glMajor == 3 && wndconfig->glMinor != 2 ) ) { return GL_FALSE; } if( wndconfig->glProfile ) { // Fail if a profile other than core was explicitly selected if( wndconfig->glProfile != GLFW_OPENGL_CORE_PROFILE ) { return GL_FALSE; } } #else // Fail if OpenGL 3.0 or above was requested if( wndconfig->glMajor > 2 ) { return GL_FALSE; } #endif /*MAC_OS_X_VERSION_MAX_ALLOWED*/ _glfwWin.delegate = [[GLFWWindowDelegate alloc] init]; if( _glfwWin.delegate == nil ) { return GL_FALSE; } [NSApp setDelegate:_glfwWin.delegate]; // Mac OS X needs non-zero color size, so set resonable values colorBits = fbconfig->redBits + fbconfig->greenBits + fbconfig->blueBits; if( colorBits == 0 ) { colorBits = 24; } else if( colorBits < 15 ) { colorBits = 15; } // Ignored hints: // OpenGLDebug // pending it meaning anything on Mac OS X // Don't use accumulation buffer support; it's not accelerated // Aux buffers probably aren't accelerated either CFDictionaryRef fullscreenMode = NULL; if( wndconfig->mode == GLFW_FULLSCREEN ) { fullscreenMode = // I think it's safe to pass 0 to the refresh rate for this function // rather than conditionalizing the code to call the version which // doesn't specify refresh... CGDisplayBestModeForParametersAndRefreshRateWithProperty( CGMainDisplayID(), colorBits + fbconfig->alphaBits, width, height, wndconfig->refreshRate, // Controversial, see macosx_fullscreen.m for discussion kCGDisplayModeIsSafeForHardware, NULL); width = [[(id)fullscreenMode objectForKey:(id)kCGDisplayWidth] intValue]; height = [[(id)fullscreenMode objectForKey:(id)kCGDisplayHeight] intValue]; } unsigned int styleMask = 0; if( wndconfig->mode == GLFW_WINDOW ) { styleMask = NSTitledWindowMask | NSClosableWindowMask | NSMiniaturizableWindowMask; if( !wndconfig->windowNoResize ) { styleMask |= NSResizableWindowMask; } } else { styleMask = NSBorderlessWindowMask; } _glfwWin.window = [[NSWindow alloc] initWithContentRect:NSMakeRect( 0, 0, width, height ) styleMask:styleMask backing:NSBackingStoreBuffered defer:NO]; [_glfwWin.window setContentView:[[GLFWContentView alloc] init]]; [_glfwWin.window setDelegate:_glfwWin.delegate]; [_glfwWin.window setAcceptsMouseMovedEvents:YES]; [_glfwWin.window center]; if( wndconfig->mode == GLFW_FULLSCREEN ) { _glfwLibrary.originalMode = (NSDictionary*) CGDisplayCurrentMode( CGMainDisplayID() ); CGCaptureAllDisplays(); CGDisplaySwitchToMode( CGMainDisplayID(), fullscreenMode ); } unsigned int attribute_count = 0; #define ADD_ATTR(x) attributes[attribute_count++] = x #define ADD_ATTR2(x, y) (void)({ ADD_ATTR(x); ADD_ATTR(y); }) #define MAX_ATTRS 64 // urrgh NSOpenGLPixelFormatAttribute attributes[MAX_ATTRS]; ADD_ATTR( NSOpenGLPFADoubleBuffer ); if( wndconfig->mode == GLFW_FULLSCREEN ) { ADD_ATTR( NSOpenGLPFAFullScreen ); ADD_ATTR( NSOpenGLPFANoRecovery ); ADD_ATTR2( NSOpenGLPFAScreenMask, CGDisplayIDToOpenGLDisplayMask( CGMainDisplayID() ) ); } #if MAC_OS_X_VERSION_MAX_ALLOWED >= 1070 if( wndconfig->glMajor > 2 ) { ADD_ATTR2( NSOpenGLPFAOpenGLProfile, NSOpenGLProfileVersion3_2Core ); } #endif /*MAC_OS_X_VERSION_MAX_ALLOWED*/ ADD_ATTR2( NSOpenGLPFAColorSize, colorBits ); if( fbconfig->alphaBits > 0) { ADD_ATTR2( NSOpenGLPFAAlphaSize, fbconfig->alphaBits ); } if( fbconfig->depthBits > 0) { ADD_ATTR2( NSOpenGLPFADepthSize, fbconfig->depthBits ); } if( fbconfig->stencilBits > 0) { ADD_ATTR2( NSOpenGLPFAStencilSize, fbconfig->stencilBits ); } int accumBits = fbconfig->accumRedBits + fbconfig->accumGreenBits + fbconfig->accumBlueBits + fbconfig->accumAlphaBits; if( accumBits > 0) { ADD_ATTR2( NSOpenGLPFAAccumSize, accumBits ); } if( fbconfig->auxBuffers > 0) { ADD_ATTR2( NSOpenGLPFAAuxBuffers, fbconfig->auxBuffers ); } if( fbconfig->stereo) { ADD_ATTR( NSOpenGLPFAStereo ); } if( fbconfig->samples > 0) { ADD_ATTR2( NSOpenGLPFASampleBuffers, 1 ); ADD_ATTR2( NSOpenGLPFASamples, fbconfig->samples ); } ADD_ATTR( 0 ); _glfwWin.pixelFormat = [[NSOpenGLPixelFormat alloc] initWithAttributes:attributes]; if( _glfwWin.pixelFormat == nil ) { return GL_FALSE; } _glfwWin.context = [[NSOpenGLContext alloc] initWithFormat:_glfwWin.pixelFormat shareContext:nil]; if( _glfwWin.context == nil ) { return GL_FALSE; } [_glfwWin.window makeKeyAndOrderFront:nil]; [_glfwWin.context setView:[_glfwWin.window contentView]]; if( wndconfig->mode == GLFW_FULLSCREEN ) { // TODO: Make this work on pre-Leopard systems [[_glfwWin.window contentView] enterFullScreenMode:[NSScreen mainScreen] withOptions:nil]; } [_glfwWin.context makeCurrentContext]; NSPoint point = [[NSCursor currentCursor] hotSpot]; _glfwInput.MousePosX = point.x; _glfwInput.MousePosY = point.y; return GL_TRUE; } //======================================================================== // Properly kill the window / video display //======================================================================== void _glfwPlatformCloseWindow( void ) { [_glfwWin.window orderOut:nil]; if( _glfwWin.fullscreen ) { [[_glfwWin.window contentView] exitFullScreenModeWithOptions:nil]; CGDisplaySwitchToMode( CGMainDisplayID(), (CFDictionaryRef)_glfwLibrary.originalMode ); CGReleaseAllDisplays(); } [_glfwWin.pixelFormat release]; _glfwWin.pixelFormat = nil; [NSOpenGLContext clearCurrentContext]; [_glfwWin.context release]; _glfwWin.context = nil; [_glfwWin.window setDelegate:nil]; [NSApp setDelegate:nil]; [_glfwWin.delegate release]; _glfwWin.delegate = nil; [_glfwWin.window close]; _glfwWin.window = nil; // TODO: Probably more cleanup } //======================================================================== // Set the window title //======================================================================== void _glfwPlatformSetWindowTitle( const char *title ) { [_glfwWin.window setTitle:[NSString stringWithCString:title encoding:NSISOLatin1StringEncoding]]; } //======================================================================== // Set the window size //======================================================================== void _glfwPlatformSetWindowSize( int width, int height ) { [_glfwWin.window setContentSize:NSMakeSize( width, height )]; } //======================================================================== // Set the window position //======================================================================== void _glfwPlatformSetWindowPos( int x, int y ) { NSRect contentRect = [_glfwWin.window contentRectForFrameRect:[_glfwWin.window frame]]; // We assume here that the client code wants to position the window within the // screen the window currently occupies NSRect screenRect = [[_glfwWin.window screen] visibleFrame]; contentRect.origin = NSMakePoint(screenRect.origin.x + x, screenRect.origin.y + screenRect.size.height - y - contentRect.size.height); [_glfwWin.window setFrame:[_glfwWin.window frameRectForContentRect:contentRect] display:YES]; } //======================================================================== // Iconify the window //======================================================================== void _glfwPlatformIconifyWindow( void ) { [_glfwWin.window miniaturize:nil]; } //======================================================================== // Restore (un-iconify) the window //======================================================================== void _glfwPlatformRestoreWindow( void ) { [_glfwWin.window deminiaturize:nil]; } //======================================================================== // Swap buffers //======================================================================== void _glfwPlatformSwapBuffers( void ) { // ARP appears to be unnecessary, but this is future-proof [_glfwWin.context flushBuffer]; } //======================================================================== // Set double buffering swap interval //======================================================================== void _glfwPlatformSwapInterval( int interval ) { GLint sync = interval; [_glfwWin.context setValues:&sync forParameter:NSOpenGLCPSwapInterval]; } //======================================================================== // Write back window parameters into GLFW window structure //======================================================================== void _glfwPlatformRefreshWindowParams( void ) { GLint value; // Since GLFW 2.x doesn't understand screens, we use virtual screen zero [_glfwWin.pixelFormat getValues:&value forAttribute:NSOpenGLPFAAccelerated forVirtualScreen:0]; _glfwWin.accelerated = value; [_glfwWin.pixelFormat getValues:&value forAttribute:NSOpenGLPFAAlphaSize forVirtualScreen:0]; _glfwWin.alphaBits = value; // It seems that the color size includes the size of the alpha channel [_glfwWin.pixelFormat getValues:&value forAttribute:NSOpenGLPFAColorSize forVirtualScreen:0]; value -= _glfwWin.alphaBits; _glfwWin.redBits = value / 3; _glfwWin.greenBits = value / 3; _glfwWin.blueBits = value / 3; [_glfwWin.pixelFormat getValues:&value forAttribute:NSOpenGLPFADepthSize forVirtualScreen:0]; _glfwWin.depthBits = value; [_glfwWin.pixelFormat getValues:&value forAttribute:NSOpenGLPFAStencilSize forVirtualScreen:0]; _glfwWin.stencilBits = value; [_glfwWin.pixelFormat getValues:&value forAttribute:NSOpenGLPFAAccumSize forVirtualScreen:0]; _glfwWin.accumRedBits = value / 3; _glfwWin.accumGreenBits = value / 3; _glfwWin.accumBlueBits = value / 3; // TODO: Figure out what to set this value to _glfwWin.accumAlphaBits = 0; [_glfwWin.pixelFormat getValues:&value forAttribute:NSOpenGLPFAAuxBuffers forVirtualScreen:0]; _glfwWin.auxBuffers = value; [_glfwWin.pixelFormat getValues:&value forAttribute:NSOpenGLPFAStereo forVirtualScreen:0]; _glfwWin.stereo = value; [_glfwWin.pixelFormat getValues:&value forAttribute:NSOpenGLPFASamples forVirtualScreen:0]; _glfwWin.samples = value; _glfwWin.glDebug = GL_FALSE; } //======================================================================== // Poll for new window and input events //======================================================================== void _glfwPlatformPollEvents( void ) { NSEvent *event; do { event = [NSApp nextEventMatchingMask:NSAnyEventMask untilDate:[NSDate distantPast] inMode:NSDefaultRunLoopMode dequeue:YES]; if( event ) { [NSApp sendEvent:event]; } } while( event ); [_glfwLibrary.autoreleasePool drain]; _glfwLibrary.autoreleasePool = [[NSAutoreleasePool alloc] init]; } //======================================================================== // Wait for new window and input events //======================================================================== void _glfwPlatformWaitEvents( void ) { // I wanted to pass NO to dequeue:, and rely on PollEvents to // dequeue and send. For reasons not at all clear to me, passing // NO to dequeue: causes this method never to return. NSEvent *event = [NSApp nextEventMatchingMask:NSAnyEventMask untilDate:[NSDate distantFuture] inMode:NSDefaultRunLoopMode dequeue:YES]; [NSApp sendEvent:event]; _glfwPlatformPollEvents(); } //======================================================================== // Hide mouse cursor (lock it) //======================================================================== void _glfwPlatformHideMouseCursor( void ) { [NSCursor hide]; CGAssociateMouseAndMouseCursorPosition( false ); } //======================================================================== // Show mouse cursor (unlock it) //======================================================================== void _glfwPlatformShowMouseCursor( void ) { [NSCursor unhide]; CGAssociateMouseAndMouseCursorPosition( true ); } //======================================================================== // Set physical mouse cursor position //======================================================================== void _glfwPlatformSetMouseCursorPos( int x, int y ) { // The library seems to assume that after calling this the mouse won't move, // but obviously it will, and escape the app's window, and activate other apps, // and other badness in pain. I think the API's just silly, but maybe I'm // misunderstanding it... // Also, (x, y) are window coords... // Also, it doesn't seem possible to write this robustly without // calculating the maximum y coordinate of all screens, since Cocoa's // "global coordinates" are upside down from CG's... NSPoint localPoint = NSMakePoint( x, y ); NSPoint globalPoint = [_glfwWin.window convertBaseToScreen:localPoint]; CGPoint mainScreenOrigin = CGDisplayBounds( CGMainDisplayID() ).origin; double mainScreenHeight = CGDisplayBounds( CGMainDisplayID() ).size.height; CGPoint targetPoint = CGPointMake( globalPoint.x - mainScreenOrigin.x, mainScreenHeight - globalPoint.y - mainScreenOrigin.y ); CGDisplayMoveCursorToPoint( CGMainDisplayID(), targetPoint ); } GLFW-0.5.1.0/glfw/lib/cocoa/platform.h0000644000000000000000000001723712045371042015376 0ustar0000000000000000//======================================================================== // GLFW - An OpenGL framework // Platform: Cocoa/NSOpenGL // API Version: 2.7 // WWW: http://www.glfw.org/ //------------------------------------------------------------------------ // Copyright (c) 2009-2010 Camilla Berglund // // This software is provided 'as-is', without any express or implied // warranty. In no event will the authors be held liable for any damages // arising from the use of this software. // // Permission is granted to anyone to use this software for any purpose, // including commercial applications, and to alter it and redistribute it // freely, subject to the following restrictions: // // 1. The origin of this software must not be misrepresented; you must not // claim that you wrote the original software. If you use this software // in a product, an acknowledgment in the product documentation would // be appreciated but is not required. // // 2. Altered source versions must be plainly marked as such, and must not // be misrepresented as being the original software. // // 3. This notice may not be removed or altered from any source // distribution. // //======================================================================== #ifndef _platform_h_ #define _platform_h_ // This is the Mac OS X version of GLFW #define _GLFW_MAC_OS_X #if defined(__OBJC__) #import #else #include typedef void *id; #endif #include #include "../../include/GL/glfw.h" #ifndef GL_VERSION_3_0 typedef const GLubyte * (APIENTRY *PFNGLGETSTRINGIPROC) (GLenum, GLuint); #endif /*GL_VERSION_3_0*/ //======================================================================== // GLFW platform specific types //======================================================================== //------------------------------------------------------------------------ // Pointer length integer //------------------------------------------------------------------------ typedef intptr_t GLFWintptr; //------------------------------------------------------------------------ // Window structure //------------------------------------------------------------------------ typedef struct _GLFWwin_struct _GLFWwin; struct _GLFWwin_struct { // ========= PLATFORM INDEPENDENT MANDATORY PART ========================= // User callback functions GLFWwindowsizefun windowSizeCallback; GLFWwindowclosefun windowCloseCallback; GLFWwindowrefreshfun windowRefreshCallback; GLFWmousebuttonfun mouseButtonCallback; GLFWmouseposfun mousePosCallback; GLFWmousewheelfun mouseWheelCallback; GLFWkeyfun keyCallback; GLFWcharfun charCallback; // User selected window settings int fullscreen; // Fullscreen flag int mouseLock; // Mouse-lock flag int autoPollEvents; // Auto polling flag int sysKeysDisabled; // System keys disabled flag int windowNoResize; // Resize- and maximize gadgets disabled flag int refreshRate; // Vertical monitor refresh rate // Window status & parameters int opened; // Flag telling if window is opened or not int active; // Application active flag int iconified; // Window iconified flag int width, height; // Window width and heigth int accelerated; // GL_TRUE if window is HW accelerated // Framebuffer attributes int redBits; int greenBits; int blueBits; int alphaBits; int depthBits; int stencilBits; int accumRedBits; int accumGreenBits; int accumBlueBits; int accumAlphaBits; int auxBuffers; int stereo; int samples; // OpenGL extensions and context attributes int has_GL_SGIS_generate_mipmap; int has_GL_ARB_texture_non_power_of_two; int glMajor, glMinor, glRevision; int glForward, glDebug, glProfile; PFNGLGETSTRINGIPROC GetStringi; // ========= PLATFORM SPECIFIC PART ====================================== id window; id pixelFormat; id context; id delegate; unsigned int modifierFlags; }; GLFWGLOBAL _GLFWwin _glfwWin; //------------------------------------------------------------------------ // Library global data //------------------------------------------------------------------------ GLFWGLOBAL struct { // ========= PLATFORM INDEPENDENT MANDATORY PART ========================= // Window opening hints _GLFWhints hints; // Initial desktop mode GLFWvidmode desktopMode; // ========= PLATFORM SPECIFIC PART ====================================== // Timer data struct { double base; double resolution; } timer; // dlopen handle for dynamically-loading extension function pointers void *OpenGLFramework; id originalMode; id autoreleasePool; CGEventSourceRef eventSource; } _glfwLibrary; //------------------------------------------------------------------------ // User input status (some of this should go in _GLFWwin) //------------------------------------------------------------------------ GLFWGLOBAL struct { // ========= PLATFORM INDEPENDENT MANDATORY PART ========================= // Mouse status int MousePosX, MousePosY; int WheelPos; char MouseButton[ GLFW_MOUSE_BUTTON_LAST+1 ]; // Keyboard status char Key[ GLFW_KEY_LAST+1 ]; int LastChar; // User selected settings int StickyKeys; int StickyMouseButtons; int KeyRepeat; // ========= PLATFORM SPECIFIC PART ====================================== double WheelPosFloating; } _glfwInput; //------------------------------------------------------------------------ // Thread information //------------------------------------------------------------------------ typedef struct _GLFWthread_struct _GLFWthread; // Thread record (one for each thread) struct _GLFWthread_struct { // Pointer to previous and next threads in linked list _GLFWthread *Previous, *Next; // GLFW user side thread information GLFWthread ID; GLFWthreadfun Function; // System side thread information pthread_t PosixID; }; // General thread information GLFWGLOBAL struct { // Critical section lock pthread_mutex_t CriticalSection; // Next thread ID to use (increments for every created thread) GLFWthread NextID; // First thread in linked list (always the main thread) _GLFWthread First; } _glfwThrd; //======================================================================== // Macros for encapsulating critical code sections (i.e. making parts // of GLFW thread safe) //======================================================================== // Define so we can use the same thread code as X11 #define _glfw_numprocessors(n) { \ int mib[2], ncpu; \ size_t len = 1; \ mib[0] = CTL_HW; \ mib[1] = HW_NCPU; \ n = 1; \ if( sysctl( mib, 2, &ncpu, &len, NULL, 0 ) != -1 ) \ { \ if( len > 0 ) \ { \ n = ncpu; \ } \ } \ } // Thread list management #define ENTER_THREAD_CRITICAL_SECTION \ pthread_mutex_lock( &_glfwThrd.CriticalSection ); #define LEAVE_THREAD_CRITICAL_SECTION \ pthread_mutex_unlock( &_glfwThrd.CriticalSection ); //======================================================================== // Prototypes for platform specific internal functions //======================================================================== // Time void _glfwInitTimer( void ); #endif // _platform_h_ GLFW-0.5.1.0/glfw/lib/win32/0000755000000000000000000000000012045371042013245 5ustar0000000000000000GLFW-0.5.1.0/glfw/lib/win32/platform.h0000644000000000000000000004367512045371042015261 0ustar0000000000000000//======================================================================== // GLFW - An OpenGL framework // Platform: Win32/WGL // API version: 2.7 // WWW: http://www.glfw.org/ //------------------------------------------------------------------------ // Copyright (c) 2002-2006 Marcus Geelnard // Copyright (c) 2006-2010 Camilla Berglund // // This software is provided 'as-is', without any express or implied // warranty. In no event will the authors be held liable for any damages // arising from the use of this software. // // Permission is granted to anyone to use this software for any purpose, // including commercial applications, and to alter it and redistribute it // freely, subject to the following restrictions: // // 1. The origin of this software must not be misrepresented; you must not // claim that you wrote the original software. If you use this software // in a product, an acknowledgment in the product documentation would // be appreciated but is not required. // // 2. Altered source versions must be plainly marked as such, and must not // be misrepresented as being the original software. // // 3. This notice may not be removed or altered from any source // distribution. // //======================================================================== #ifndef _platform_h_ #define _platform_h_ // This is the Windows version of GLFW #define _GLFW_WIN32 // We don't need all the fancy stuff #define NOMINMAX #define WIN32_LEAN_AND_MEAN #define VC_EXTRALEAN // Include files #include #include #include "../../include/GL/glfw.h" //======================================================================== // Hack: Define things that some 's do not define //======================================================================== // Some old versions of w32api (used by MinGW and Cygwin) define // WH_KEYBOARD_LL without typedef:ing KBDLLHOOKSTRUCT (!) #if defined(__MINGW32__) || defined(__CYGWIN__) #include #if defined(WH_KEYBOARD_LL) && (__W32API_MAJOR_VERSION == 1) && (__W32API_MINOR_VERSION <= 2) #undef WH_KEYBOARD_LL #endif #endif //------------------------------------------------------------------------ // ** NOTE ** If this gives you compiler errors and you are using MinGW // (or Dev-C++), update to w32api version 1.3 or later: // http://sourceforge.net/project/showfiles.php?group_id=2435 //------------------------------------------------------------------------ #ifndef WH_KEYBOARD_LL #define WH_KEYBOARD_LL 13 typedef struct tagKBDLLHOOKSTRUCT { DWORD vkCode; DWORD scanCode; DWORD flags; DWORD time; DWORD dwExtraInfo; } KBDLLHOOKSTRUCT, FAR *LPKBDLLHOOKSTRUCT, *PKBDLLHOOKSTRUCT; #endif // WH_KEYBOARD_LL #ifndef LLKHF_ALTDOWN #define LLKHF_ALTDOWN 0x00000020 #endif #ifndef SPI_SETSCREENSAVERRUNNING #define SPI_SETSCREENSAVERRUNNING 97 #endif #ifndef SPI_GETANIMATION #define SPI_GETANIMATION 72 #endif #ifndef SPI_SETANIMATION #define SPI_SETANIMATION 73 #endif #ifndef SPI_GETFOREGROUNDLOCKTIMEOUT #define SPI_GETFOREGROUNDLOCKTIMEOUT 0x2000 #endif #ifndef SPI_SETFOREGROUNDLOCKTIMEOUT #define SPI_SETFOREGROUNDLOCKTIMEOUT 0x2001 #endif #ifndef CDS_FULLSCREEN #define CDS_FULLSCREEN 4 #endif #ifndef PFD_GENERIC_ACCELERATED #define PFD_GENERIC_ACCELERATED 0x00001000 #endif #ifndef PFD_DEPTH_DONTCARE #define PFD_DEPTH_DONTCARE 0x20000000 #endif #ifndef ENUM_CURRENT_SETTINGS #define ENUM_CURRENT_SETTINGS -1 #endif #ifndef ENUM_REGISTRY_SETTINGS #define ENUM_REGISTRY_SETTINGS -2 #endif #ifndef WM_MOUSEWHEEL #define WM_MOUSEWHEEL 0x020A #endif #ifndef WHEEL_DELTA #define WHEEL_DELTA 120 #endif #ifndef WM_XBUTTONDOWN #define WM_XBUTTONDOWN 0x020B #endif #ifndef WM_XBUTTONUP #define WM_XBUTTONUP 0x020C #endif #ifndef XBUTTON1 #define XBUTTON1 1 #endif #ifndef XBUTTON2 #define XBUTTON2 2 #endif #ifndef WGL_EXT_swap_control /* Entry points */ typedef int (APIENTRY * PFNWGLSWAPINTERVALEXTPROC) (int); #endif /*WGL_EXT_swap_control*/ #ifndef WGL_ARB_extensions_string /* Entry points */ typedef const char *(APIENTRY * PFNWGLGETEXTENSIONSSTRINGARBPROC)( HDC ); #endif /*WGL_ARB_extensions_string*/ #ifndef WGL_EXT_extension_string /* Entry points */ typedef const char *(APIENTRY * PFNWGLGETEXTENSIONSSTRINGEXTPROC)( void ); #endif /*WGL_EXT_extension_string*/ #ifndef WGL_ARB_pixel_format /* Entry points */ typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBIVARBPROC) (HDC, int, int, UINT, const int *, int *); /* Constants for wglGetPixelFormatAttribivARB */ #define WGL_NUMBER_PIXEL_FORMATS_ARB 0x2000 #define WGL_DRAW_TO_WINDOW_ARB 0x2001 #define WGL_SUPPORT_OPENGL_ARB 0x2010 #define WGL_ACCELERATION_ARB 0x2003 #define WGL_DOUBLE_BUFFER_ARB 0x2011 #define WGL_STEREO_ARB 0x2012 #define WGL_PIXEL_TYPE_ARB 0x2013 #define WGL_COLOR_BITS_ARB 0x2014 #define WGL_RED_BITS_ARB 0x2015 #define WGL_GREEN_BITS_ARB 0x2017 #define WGL_BLUE_BITS_ARB 0x2019 #define WGL_ALPHA_BITS_ARB 0x201B #define WGL_ACCUM_BITS_ARB 0x201D #define WGL_ACCUM_RED_BITS_ARB 0x201E #define WGL_ACCUM_GREEN_BITS_ARB 0x201F #define WGL_ACCUM_BLUE_BITS_ARB 0x2020 #define WGL_ACCUM_ALPHA_BITS_ARB 0x2021 #define WGL_DEPTH_BITS_ARB 0x2022 #define WGL_STENCIL_BITS_ARB 0x2023 #define WGL_AUX_BUFFERS_ARB 0x2024 #define WGL_SAMPLE_BUFFERS_ARB 0x2041 #define WGL_SAMPLES_ARB 0x2042 /* Constants for WGL_ACCELERATION_ARB */ #define WGL_NO_ACCELERATION_ARB 0x2025 #define WGL_GENERIC_ACCELERATION_ARB 0x2026 #define WGL_FULL_ACCELERATION_ARB 0x2027 /* Constants for WGL_PIXEL_TYPE_ARB */ #define WGL_TYPE_RGBA_ARB 0x202B #define WGL_TYPE_COLORINDEX_ARB 0x202C #endif /*WGL_ARB_pixel_format*/ #ifndef WGL_ARB_create_context /* Entry points */ typedef HGLRC (WINAPI * PFNWGLCREATECONTEXTATTRIBSARBPROC) (HDC, HGLRC, const int *); /* Tokens for wglCreateContextAttribsARB attributes */ #define WGL_CONTEXT_MAJOR_VERSION_ARB 0x2091 #define WGL_CONTEXT_MINOR_VERSION_ARB 0x2092 #define WGL_CONTEXT_LAYER_PLANE_ARB 0x2093 #define WGL_CONTEXT_FLAGS_ARB 0x2094 #define WGL_CONTEXT_PROFILE_MASK_ARB 0x9126 /* Bits for WGL_CONTEXT_FLAGS_ARB */ #define WGL_CONTEXT_DEBUG_BIT_ARB 0x0001 #define WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x0002 /* Bits for WGL_CONTEXT_PROFILE_MASK_ARB */ #define WGL_CONTEXT_CORE_PROFILE_BIT_ARB 0x00000001 #define WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB 0x00000002 #endif /*WGL_ARB_create_context*/ #ifndef GL_VERSION_3_0 typedef const GLubyte * (APIENTRY *PFNGLGETSTRINGIPROC) (GLenum, GLuint); #endif /*GL_VERSION_3_0*/ //======================================================================== // DLLs that are loaded at glfwInit() //======================================================================== // gdi32.dll function pointer typedefs #ifndef _GLFW_NO_DLOAD_GDI32 typedef int (WINAPI * CHOOSEPIXELFORMAT_T) (HDC,CONST PIXELFORMATDESCRIPTOR*); typedef int (WINAPI * DESCRIBEPIXELFORMAT_T) (HDC,int,UINT,LPPIXELFORMATDESCRIPTOR); typedef int (WINAPI * GETPIXELFORMAT_T) (HDC); typedef BOOL (WINAPI * SETPIXELFORMAT_T) (HDC,int,const PIXELFORMATDESCRIPTOR*); typedef BOOL (WINAPI * SWAPBUFFERS_T) (HDC); #endif // _GLFW_NO_DLOAD_GDI32 // winmm.dll function pointer typedefs #ifndef _GLFW_NO_DLOAD_WINMM typedef MMRESULT (WINAPI * JOYGETDEVCAPSA_T) (UINT,LPJOYCAPSA,UINT); typedef MMRESULT (WINAPI * JOYGETPOS_T) (UINT,LPJOYINFO); typedef MMRESULT (WINAPI * JOYGETPOSEX_T) (UINT,LPJOYINFOEX); typedef DWORD (WINAPI * TIMEGETTIME_T) (void); #endif // _GLFW_NO_DLOAD_WINMM // gdi32.dll shortcuts #ifndef _GLFW_NO_DLOAD_GDI32 #define _glfw_ChoosePixelFormat _glfwLibrary.Libs.ChoosePixelFormat #define _glfw_DescribePixelFormat _glfwLibrary.Libs.DescribePixelFormat #define _glfw_GetPixelFormat _glfwLibrary.Libs.GetPixelFormat #define _glfw_SetPixelFormat _glfwLibrary.Libs.SetPixelFormat #define _glfw_SwapBuffers _glfwLibrary.Libs.SwapBuffers #else #define _glfw_ChoosePixelFormat ChoosePixelFormat #define _glfw_DescribePixelFormat DescribePixelFormat #define _glfw_GetPixelFormat GetPixelFormat #define _glfw_SetPixelFormat SetPixelFormat #define _glfw_SwapBuffers SwapBuffers #endif // _GLFW_NO_DLOAD_GDI32 // winmm.dll shortcuts #ifndef _GLFW_NO_DLOAD_WINMM #define _glfw_joyGetDevCaps _glfwLibrary.Libs.joyGetDevCapsA #define _glfw_joyGetPos _glfwLibrary.Libs.joyGetPos #define _glfw_joyGetPosEx _glfwLibrary.Libs.joyGetPosEx #define _glfw_timeGetTime _glfwLibrary.Libs.timeGetTime #else #define _glfw_joyGetDevCaps joyGetDevCapsA #define _glfw_joyGetPos joyGetPos #define _glfw_joyGetPosEx joyGetPosEx #define _glfw_timeGetTime timeGetTime #endif // _GLFW_NO_DLOAD_WINMM //======================================================================== // GLFW platform specific types //======================================================================== //------------------------------------------------------------------------ // Pointer length integer //------------------------------------------------------------------------ typedef INT_PTR GLFWintptr; //------------------------------------------------------------------------ // Window structure //------------------------------------------------------------------------ typedef struct _GLFWwin_struct _GLFWwin; struct _GLFWwin_struct { // ========= PLATFORM INDEPENDENT MANDATORY PART ========================= // User callback functions GLFWwindowsizefun windowSizeCallback; GLFWwindowclosefun windowCloseCallback; GLFWwindowrefreshfun windowRefreshCallback; GLFWmousebuttonfun mouseButtonCallback; GLFWmouseposfun mousePosCallback; GLFWmousewheelfun mouseWheelCallback; GLFWkeyfun keyCallback; GLFWcharfun charCallback; // User selected window settings int fullscreen; // Fullscreen flag int mouseLock; // Mouse-lock flag int autoPollEvents; // Auto polling flag int sysKeysDisabled; // System keys disabled flag int windowNoResize; // Resize- and maximize gadgets disabled flag int refreshRate; // Vertical monitor refresh rate // Window status & parameters int opened; // Flag telling if window is opened or not int active; // Application active flag int iconified; // Window iconified flag int width, height; // Window width and heigth int accelerated; // GL_TRUE if window is HW accelerated // Framebuffer attributes int redBits; int greenBits; int blueBits; int alphaBits; int depthBits; int stencilBits; int accumRedBits; int accumGreenBits; int accumBlueBits; int accumAlphaBits; int auxBuffers; int stereo; int samples; // OpenGL extensions and context attributes int has_GL_SGIS_generate_mipmap; int has_GL_ARB_texture_non_power_of_two; int glMajor, glMinor, glRevision; int glForward, glDebug, glProfile; PFNGLGETSTRINGIPROC GetStringi; // ========= PLATFORM SPECIFIC PART ====================================== // Platform specific window resources HDC DC; // Private GDI device context HGLRC context; // Permanent rendering context HWND window; // Window handle ATOM classAtom; // Window class atom int modeID; // Mode ID for fullscreen mode HHOOK keyboardHook; // Keyboard hook handle DWORD dwStyle; // Window styles used for window creation DWORD dwExStyle; // --"-- // Platform specific extensions (context specific) PFNWGLSWAPINTERVALEXTPROC SwapIntervalEXT; PFNWGLGETPIXELFORMATATTRIBIVARBPROC GetPixelFormatAttribivARB; PFNWGLGETEXTENSIONSSTRINGEXTPROC GetExtensionsStringEXT; PFNWGLGETEXTENSIONSSTRINGARBPROC GetExtensionsStringARB; PFNWGLCREATECONTEXTATTRIBSARBPROC CreateContextAttribsARB; GLboolean has_WGL_EXT_swap_control; GLboolean has_WGL_ARB_multisample; GLboolean has_WGL_ARB_pixel_format; GLboolean has_WGL_ARB_create_context; GLboolean has_WGL_ARB_create_context_profile; // Various platform specific internal variables int oldMouseLock; // Old mouse-lock flag (used for remembering // mouse-lock state when iconifying) int oldMouseLockValid; int desiredRefreshRate; // Desired vertical monitor refresh rate }; GLFWGLOBAL _GLFWwin _glfwWin; //------------------------------------------------------------------------ // User input status (most of this should go in _GLFWwin) //------------------------------------------------------------------------ GLFWGLOBAL struct { // ========= PLATFORM INDEPENDENT MANDATORY PART ========================= // Mouse status int MousePosX, MousePosY; int WheelPos; char MouseButton[ GLFW_MOUSE_BUTTON_LAST+1 ]; // Keyboard status char Key[ GLFW_KEY_LAST+1 ]; int LastChar; // User selected settings int StickyKeys; int StickyMouseButtons; int KeyRepeat; // ========= PLATFORM SPECIFIC PART ====================================== // Platform specific internal variables int MouseMoved, OldMouseX, OldMouseY; } _glfwInput; //------------------------------------------------------------------------ // Library global data //------------------------------------------------------------------------ GLFWGLOBAL struct { // Window opening hints _GLFWhints hints; // Initial desktop mode GLFWvidmode desktopMode; // ========= PLATFORM SPECIFIC PART ====================================== HINSTANCE instance; // Instance of the application // Timer data struct { int HasPerformanceCounter; double Resolution; unsigned int t0_32; __int64 t0_64; } Timer; // System information struct { int winVer; int hasUnicode; DWORD foregroundLockTimeout; } Sys; #if !defined(_GLFW_NO_DLOAD_WINMM) || !defined(_GLFW_NO_DLOAD_GDI32) // Library handles and function pointers struct { #ifndef _GLFW_NO_DLOAD_GDI32 // gdi32.dll HINSTANCE gdi32; CHOOSEPIXELFORMAT_T ChoosePixelFormat; DESCRIBEPIXELFORMAT_T DescribePixelFormat; GETPIXELFORMAT_T GetPixelFormat; SETPIXELFORMAT_T SetPixelFormat; SWAPBUFFERS_T SwapBuffers; #endif // _GLFW_NO_DLOAD_GDI32 // winmm.dll #ifndef _GLFW_NO_DLOAD_WINMM HINSTANCE winmm; JOYGETDEVCAPSA_T joyGetDevCapsA; JOYGETPOS_T joyGetPos; JOYGETPOSEX_T joyGetPosEx; TIMEGETTIME_T timeGetTime; #endif // _GLFW_NO_DLOAD_WINMM } Libs; #endif } _glfwLibrary; //------------------------------------------------------------------------ // Thread record (one for each thread) //------------------------------------------------------------------------ typedef struct _GLFWthread_struct _GLFWthread; struct _GLFWthread_struct { // ========= PLATFORM INDEPENDENT MANDATORY PART ========================= // Pointer to previous and next threads in linked list _GLFWthread *Previous, *Next; // GLFW user side thread information GLFWthread ID; GLFWthreadfun Function; // ========= PLATFORM SPECIFIC PART ====================================== // System side thread information HANDLE Handle; DWORD WinID; }; //------------------------------------------------------------------------ // General thread information //------------------------------------------------------------------------ GLFWGLOBAL struct { // ========= PLATFORM INDEPENDENT MANDATORY PART ========================= // Next thread ID to use (increments for every created thread) GLFWthread NextID; // First thread in linked list (always the main thread) _GLFWthread First; // ========= PLATFORM SPECIFIC PART ====================================== // Critical section lock CRITICAL_SECTION CriticalSection; } _glfwThrd; //======================================================================== // Macros for encapsulating critical code sections (i.e. making parts // of GLFW thread safe) //======================================================================== // Thread list management #define ENTER_THREAD_CRITICAL_SECTION \ EnterCriticalSection( &_glfwThrd.CriticalSection ); #define LEAVE_THREAD_CRITICAL_SECTION \ LeaveCriticalSection( &_glfwThrd.CriticalSection ); //======================================================================== // Various Windows version constants //======================================================================== #define _GLFW_WIN_UNKNOWN 0x0000 // Earlier than 95 or NT4 #define _GLFW_WIN_95 0x0001 #define _GLFW_WIN_98 0x0002 #define _GLFW_WIN_ME 0x0003 #define _GLFW_WIN_UNKNOWN_9x 0x0004 // Later than ME #define _GLFW_WIN_NT4 0x0101 #define _GLFW_WIN_2K 0x0102 #define _GLFW_WIN_XP 0x0103 #define _GLFW_WIN_NET_SERVER 0x0104 #define _GLFW_WIN_UNKNOWN_NT 0x0105 // Later than .NET Server //======================================================================== // Prototypes for platform specific internal functions //======================================================================== // Time void _glfwInitTimer( void ); // Fullscreen support int _glfwGetClosestVideoModeBPP( int *w, int *h, int *bpp, int *refresh ); int _glfwGetClosestVideoMode( int *w, int *h, int *r, int *g, int *b, int *refresh ); void _glfwSetVideoModeMODE( int mode ); void _glfwSetVideoMode( int *w, int *h, int r, int g, int b, int refresh ); #endif // _platform_h_ GLFW-0.5.1.0/glfw/lib/win32/win32_enable.c0000644000000000000000000001255412045371042015670 0ustar0000000000000000//======================================================================== // GLFW - An OpenGL framework // Platform: Win32/WGL // API version: 2.7 // WWW: http://www.glfw.org/ //------------------------------------------------------------------------ // Copyright (c) 2002-2006 Marcus Geelnard // Copyright (c) 2006-2010 Camilla Berglund // // This software is provided 'as-is', without any express or implied // warranty. In no event will the authors be held liable for any damages // arising from the use of this software. // // Permission is granted to anyone to use this software for any purpose, // including commercial applications, and to alter it and redistribute it // freely, subject to the following restrictions: // // 1. The origin of this software must not be misrepresented; you must not // claim that you wrote the original software. If you use this software // in a product, an acknowledgment in the product documentation would // be appreciated but is not required. // // 2. Altered source versions must be plainly marked as such, and must not // be misrepresented as being the original software. // // 3. This notice may not be removed or altered from any source // distribution. // //======================================================================== #include "internal.h" //************************************************************************ //**** GLFW internal functions **** //************************************************************************ //======================================================================== // Low level keyboard hook (system callback) function // Used to disable system keys under Windows NT //======================================================================== static LRESULT CALLBACK keyboardHook( int nCode, WPARAM wParam, LPARAM lParam ) { BOOL syskeys = FALSE; PKBDLLHOOKSTRUCT p; // We are only looking for keyboard events - interpret lParam as a // pointer to a KBDLLHOOKSTRUCT p = (PKBDLLHOOKSTRUCT) lParam; if( nCode == HC_ACTION ) { // We have a keyboard event switch( wParam ) { case WM_KEYDOWN: case WM_SYSKEYDOWN: case WM_KEYUP: case WM_SYSKEYUP: // Detect: ALT+TAB, ALT+ESC, ALT+F4, CTRL+ESC, // LWIN, RWIN, APPS (mysterious menu key) syskeys = ( p->vkCode == VK_TAB && p->flags & LLKHF_ALTDOWN ) || ( p->vkCode == VK_ESCAPE && p->flags & LLKHF_ALTDOWN ) || ( p->vkCode == VK_F4 && p->flags & LLKHF_ALTDOWN ) || ( p->vkCode == VK_ESCAPE && (GetKeyState(VK_CONTROL) & 0x8000)) || p->vkCode == VK_LWIN || p->vkCode == VK_RWIN || p->vkCode == VK_APPS; break; default: break; } } // Was it a system key combination (e.g. ALT+TAB)? if( syskeys ) { // Pass the key event to our window message loop if( _glfwWin.opened ) { PostMessage( _glfwWin.window, (UINT) wParam, p->vkCode, 0 ); } // We've taken care of it - don't let the system know about this // key event return 1; } else { // It's a harmless key press, let the system deal with it return CallNextHookEx( _glfwWin.keyboardHook, nCode, wParam, lParam ); } } //************************************************************************ //**** Platform implementation functions **** //************************************************************************ //======================================================================== // Enable system keys //======================================================================== void _glfwPlatformEnableSystemKeys( void ) { BOOL dummy; // Use different methods depending on operating system version if( _glfwLibrary.Sys.winVer >= _GLFW_WIN_NT4 ) { if( _glfwWin.keyboardHook != NULL ) { UnhookWindowsHookEx( _glfwWin.keyboardHook ); _glfwWin.keyboardHook = NULL; } } else { (void) SystemParametersInfo( SPI_SETSCREENSAVERRUNNING, FALSE, &dummy, 0 ); } } //======================================================================== // Disable system keys //======================================================================== void _glfwPlatformDisableSystemKeys( void ) { BOOL dummy; // Use different methods depending on operating system version if( _glfwLibrary.Sys.winVer >= _GLFW_WIN_NT4 ) { // Under Windows NT, install a low level keyboard hook _glfwWin.keyboardHook = SetWindowsHookEx( WH_KEYBOARD_LL, keyboardHook, _glfwLibrary.instance, 0 ); } else { // Under Windows 95/98/ME, fool Windows that a screensaver // is running => prevents ALT+TAB, CTRL+ESC and CTRL+ALT+DEL (void) SystemParametersInfo( SPI_SETSCREENSAVERRUNNING, TRUE, &dummy, 0 ); } } GLFW-0.5.1.0/glfw/lib/win32/win32_fullscreen.c0000644000000000000000000002344512045371042016605 0ustar0000000000000000//======================================================================== // GLFW - An OpenGL framework // Platform: Win32/WGL // API version: 2.7 // WWW: http://www.glfw.org/ //------------------------------------------------------------------------ // Copyright (c) 2002-2006 Marcus Geelnard // Copyright (c) 2006-2010 Camilla Berglund // // This software is provided 'as-is', without any express or implied // warranty. In no event will the authors be held liable for any damages // arising from the use of this software. // // Permission is granted to anyone to use this software for any purpose, // including commercial applications, and to alter it and redistribute it // freely, subject to the following restrictions: // // 1. The origin of this software must not be misrepresented; you must not // claim that you wrote the original software. If you use this software // in a product, an acknowledgment in the product documentation would // be appreciated but is not required. // // 2. Altered source versions must be plainly marked as such, and must not // be misrepresented as being the original software. // // 3. This notice may not be removed or altered from any source // distribution. // //======================================================================== #include "internal.h" //************************************************************************ //**** GLFW internal functions **** //************************************************************************ //======================================================================== // Convert BPP to RGB bits based on "best guess" //======================================================================== static void bpp2rgb( int bpp, int *r, int *g, int *b ) { int delta; // We assume that by 32 they really meant 24 if( bpp == 32 ) { bpp = 24; } // Convert "bits per pixel" to red, green & blue sizes *r = *g = *b = bpp / 3; delta = bpp - (*r * 3); if( delta >= 1 ) { *g = *g + 1; } if( delta == 2 ) { *r = *r + 1; } } //======================================================================== // Return closest video mode by dimensions, refresh rate and bits per pixel //======================================================================== int _glfwGetClosestVideoModeBPP( int *w, int *h, int *bpp, int *refresh ) { int mode, bestmode, match, bestmatch, rr, bestrr, success; DEVMODE dm; // Find best match bestmatch = 0x7fffffff; bestrr = 0x7fffffff; mode = bestmode = 0; do { dm.dmSize = sizeof( DEVMODE ); success = EnumDisplaySettings( NULL, mode, &dm ); if( success ) { match = dm.dmBitsPerPel - *bpp; if( match < 0 ) match = -match; match = ( match << 25 ) | ( (dm.dmPelsWidth - *w) * (dm.dmPelsWidth - *w) + (dm.dmPelsHeight - *h) * (dm.dmPelsHeight - *h) ); if( match < bestmatch ) { bestmatch = match; bestmode = mode; bestrr = (dm.dmDisplayFrequency - *refresh) * (dm.dmDisplayFrequency - *refresh); } else if( match == bestmatch && *refresh > 0 ) { rr = (dm.dmDisplayFrequency - *refresh) * (dm.dmDisplayFrequency - *refresh); if( rr < bestrr ) { bestmatch = match; bestmode = mode; bestrr = rr; } } } mode ++; } while( success ); // Get the parameters for the best matching display mode dm.dmSize = sizeof( DEVMODE ); (void) EnumDisplaySettings( NULL, bestmode, &dm ); // Fill out actual width and height *w = dm.dmPelsWidth; *h = dm.dmPelsHeight; // Return bits per pixel *bpp = dm.dmBitsPerPel; // Return vertical refresh rate *refresh = dm.dmDisplayFrequency; return bestmode; } //======================================================================== // Return closest video mode by dimensions, refresh rate and channel sizes //======================================================================== static int getClosestVideoMode( int *w, int *h, int *r, int *g, int *b, int *refresh ) { int bpp, bestmode; // Colorbits = sum of red/green/blue bits bpp = *r + *g + *b; // If colorbits < 15 (e.g. 0) or >= 24, default to 32 bpp if( bpp < 15 || bpp >= 24 ) { bpp = 32; } // Find best match bestmode = _glfwGetClosestVideoModeBPP( w, h, &bpp, refresh ); // Convert "bits per pixel" to red, green & blue sizes bpp2rgb( bpp, r, g, b ); return bestmode; } //======================================================================== // Change the current video mode //======================================================================== void _glfwSetVideoModeMODE( int mode ) { DEVMODE dm; int success; // Get the parameters for the best matching display mode dm.dmSize = sizeof( DEVMODE ); (void) EnumDisplaySettings( NULL, mode, &dm ); // Set which fields we want to specify dm.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT | DM_BITSPERPEL; // Do we have a prefered refresh rate? if( _glfwWin.desiredRefreshRate > 0 ) { dm.dmFields = dm.dmFields | DM_DISPLAYFREQUENCY; dm.dmDisplayFrequency = _glfwWin.desiredRefreshRate; } // Change display setting dm.dmSize = sizeof( DEVMODE ); success = ChangeDisplaySettings( &dm, CDS_FULLSCREEN ); // If the mode change was not possible, query the current display // settings (we'll use the desktop resolution for fullscreen mode) if( success == DISP_CHANGE_SUCCESSFUL ) { _glfwWin.modeID = mode; } else { _glfwWin.modeID = ENUM_REGISTRY_SETTINGS; EnumDisplaySettings( NULL, ENUM_REGISTRY_SETTINGS, &dm ); } // Set the window size to that of the display mode _glfwWin.width = dm.dmPelsWidth; _glfwWin.height = dm.dmPelsHeight; } //======================================================================== // Change the current video mode //======================================================================== void _glfwSetVideoMode( int *w, int *h, int r, int g, int b, int refresh ) { int bestmode; // Find a best match mode bestmode = getClosestVideoMode( w, h, &r, &g, &b, &refresh ); // Change mode _glfwSetVideoModeMODE( bestmode ); } //************************************************************************ //**** GLFW user functions **** //************************************************************************ //======================================================================== // Get a list of available video modes //======================================================================== int _glfwPlatformGetVideoModes( GLFWvidmode *list, int maxcount ) { int count, success, mode, i, j; int m1, m2, bpp, r, g, b; DEVMODE dm; // Loop through all video modes and extract all the UNIQUE modes count = 0; mode = 0; do { // Get video mode properties dm.dmSize = sizeof( DEVMODE ); success = EnumDisplaySettings( NULL, mode, &dm ); // Is it a valid mode? (only list depths >= 15 bpp) if( success && dm.dmBitsPerPel >= 15 ) { // Convert to RGB, and back to bpp ("mask out" alpha bits etc) bpp2rgb( dm.dmBitsPerPel, &r, &g, &b ); bpp = r + g + b; // Mode "code" for this mode m1 = (bpp << 25) | (dm.dmPelsWidth * dm.dmPelsHeight); // Insert mode in list (sorted), and avoid duplicates for( i = 0; i < count; i ++ ) { // Mode "code" for already listed mode bpp = list[i].RedBits + list[i].GreenBits + list[i].BlueBits; m2 = (bpp << 25) | (list[i].Width * list[i].Height); if( m1 <= m2 ) { break; } } // New entry at the end of the list? if( i >= count ) { list[count].Width = dm.dmPelsWidth; list[count].Height = dm.dmPelsHeight; list[count].RedBits = r; list[count].GreenBits = g; list[count].BlueBits = b; count ++; } // Insert new entry in the list? else if( m1 < m2 ) { for( j = count; j > i; j -- ) { list[j] = list[j-1]; } list[i].Width = dm.dmPelsWidth; list[i].Height = dm.dmPelsHeight; list[i].RedBits = r; list[i].GreenBits = g; list[i].BlueBits = b; count ++; } } mode ++; } while( success && (count < maxcount) ); return count; } //======================================================================== // Get the desktop video mode //======================================================================== void _glfwPlatformGetDesktopMode( GLFWvidmode *mode ) { DEVMODE dm; // Get desktop display mode dm.dmSize = sizeof( DEVMODE ); (void) EnumDisplaySettings( NULL, ENUM_REGISTRY_SETTINGS, &dm ); // Return desktop mode parameters mode->Width = dm.dmPelsWidth; mode->Height = dm.dmPelsHeight; bpp2rgb( dm.dmBitsPerPel, &mode->RedBits, &mode->GreenBits, &mode->BlueBits ); } GLFW-0.5.1.0/glfw/lib/win32/win32_glext.c0000644000000000000000000000550312045371042015561 0ustar0000000000000000//======================================================================== // GLFW - An OpenGL framework // Platform: Win32/WGL // API version: 2.7 // WWW: http://www.glfw.org/ //------------------------------------------------------------------------ // Copyright (c) 2002-2006 Marcus Geelnard // Copyright (c) 2006-2010 Camilla Berglund // // This software is provided 'as-is', without any express or implied // warranty. In no event will the authors be held liable for any damages // arising from the use of this software. // // Permission is granted to anyone to use this software for any purpose, // including commercial applications, and to alter it and redistribute it // freely, subject to the following restrictions: // // 1. The origin of this software must not be misrepresented; you must not // claim that you wrote the original software. If you use this software // in a product, an acknowledgment in the product documentation would // be appreciated but is not required. // // 2. Altered source versions must be plainly marked as such, and must not // be misrepresented as being the original software. // // 3. This notice may not be removed or altered from any source // distribution. // //======================================================================== #include "internal.h" //************************************************************************ //**** Platform implementation functions **** //************************************************************************ //======================================================================== // Check if the current context supports the specified WGL extension //======================================================================== int _glfwPlatformExtensionSupported( const char *extension ) { const GLubyte *extensions; if( _glfwWin.GetExtensionsStringEXT != NULL ) { extensions = (GLubyte *) _glfwWin.GetExtensionsStringEXT(); if( extensions != NULL ) { if( _glfwStringInExtensionString( extension, extensions ) ) { return GL_TRUE; } } } if( _glfwWin.GetExtensionsStringARB != NULL ) { extensions = (GLubyte *) _glfwWin.GetExtensionsStringARB( _glfwWin.DC ); if( extensions != NULL ) { if( _glfwStringInExtensionString( extension, extensions ) ) { return GL_TRUE; } } } return GL_FALSE; } //======================================================================== // Get the function pointer to an OpenGL function //======================================================================== void *_glfwPlatformGetProcAddress( const char *procname ) { return (void *) wglGetProcAddress( procname ); } GLFW-0.5.1.0/glfw/lib/win32/win32_init.c0000644000000000000000000002670112045371042015404 0ustar0000000000000000//======================================================================== // GLFW - An OpenGL framework // Platform: Win32/WGL // API version: 2.7 // WWW: http://www.glfw.org/ //------------------------------------------------------------------------ // Copyright (c) 2002-2006 Marcus Geelnard // Copyright (c) 2006-2010 Camilla Berglund // // This software is provided 'as-is', without any express or implied // warranty. In no event will the authors be held liable for any damages // arising from the use of this software. // // Permission is granted to anyone to use this software for any purpose, // including commercial applications, and to alter it and redistribute it // freely, subject to the following restrictions: // // 1. The origin of this software must not be misrepresented; you must not // claim that you wrote the original software. If you use this software // in a product, an acknowledgment in the product documentation would // be appreciated but is not required. // // 2. Altered source versions must be plainly marked as such, and must not // be misrepresented as being the original software. // // 3. This notice may not be removed or altered from any source // distribution. // //======================================================================== #include "internal.h" // With the Borland C++ compiler, we want to disable FPU exceptions #ifdef __BORLANDC__ #include #endif // __BORLANDC__ //************************************************************************ //**** GLFW internal functions **** //************************************************************************ //======================================================================== // Load necessary libraries (DLLs) //======================================================================== static int _glfwInitLibraries( void ) { // gdi32.dll (OpenGL pixel format functions & SwapBuffers) #ifndef _GLFW_NO_DLOAD_GDI32 _glfwLibrary.Libs.gdi32 = LoadLibrary( "gdi32.dll" ); if( _glfwLibrary.Libs.gdi32 != NULL ) { _glfwLibrary.Libs.ChoosePixelFormat = (CHOOSEPIXELFORMAT_T) GetProcAddress( _glfwLibrary.Libs.gdi32, "ChoosePixelFormat" ); _glfwLibrary.Libs.DescribePixelFormat = (DESCRIBEPIXELFORMAT_T) GetProcAddress( _glfwLibrary.Libs.gdi32, "DescribePixelFormat" ); _glfwLibrary.Libs.GetPixelFormat = (GETPIXELFORMAT_T) GetProcAddress( _glfwLibrary.Libs.gdi32, "GetPixelFormat" ); _glfwLibrary.Libs.SetPixelFormat = (SETPIXELFORMAT_T) GetProcAddress( _glfwLibrary.Libs.gdi32, "SetPixelFormat" ); _glfwLibrary.Libs.SwapBuffers = (SWAPBUFFERS_T) GetProcAddress( _glfwLibrary.Libs.gdi32, "SwapBuffers" ); if( _glfwLibrary.Libs.ChoosePixelFormat == NULL || _glfwLibrary.Libs.DescribePixelFormat == NULL || _glfwLibrary.Libs.GetPixelFormat == NULL || _glfwLibrary.Libs.SetPixelFormat == NULL || _glfwLibrary.Libs.SwapBuffers == NULL ) { FreeLibrary( _glfwLibrary.Libs.gdi32 ); _glfwLibrary.Libs.gdi32 = NULL; return GL_FALSE; } } else { return GL_FALSE; } #endif // _GLFW_NO_DLOAD_GDI32 // winmm.dll (for joystick and timer support) #ifndef _GLFW_NO_DLOAD_WINMM _glfwLibrary.Libs.winmm = LoadLibrary( "winmm.dll" ); if( _glfwLibrary.Libs.winmm != NULL ) { _glfwLibrary.Libs.joyGetDevCapsA = (JOYGETDEVCAPSA_T) GetProcAddress( _glfwLibrary.Libs.winmm, "joyGetDevCapsA" ); _glfwLibrary.Libs.joyGetPos = (JOYGETPOS_T) GetProcAddress( _glfwLibrary.Libs.winmm, "joyGetPos" ); _glfwLibrary.Libs.joyGetPosEx = (JOYGETPOSEX_T) GetProcAddress( _glfwLibrary.Libs.winmm, "joyGetPosEx" ); _glfwLibrary.Libs.timeGetTime = (TIMEGETTIME_T) GetProcAddress( _glfwLibrary.Libs.winmm, "timeGetTime" ); if( _glfwLibrary.Libs.joyGetDevCapsA == NULL || _glfwLibrary.Libs.joyGetPos == NULL || _glfwLibrary.Libs.joyGetPosEx == NULL || _glfwLibrary.Libs.timeGetTime == NULL ) { FreeLibrary( _glfwLibrary.Libs.winmm ); _glfwLibrary.Libs.winmm = NULL; return GL_FALSE; } } else { return GL_FALSE; } #endif // _GLFW_NO_DLOAD_WINMM return GL_TRUE; } //======================================================================== // Unload used libraries (DLLs) //======================================================================== static void _glfwFreeLibraries( void ) { // gdi32.dll #ifndef _GLFW_NO_DLOAD_GDI32 if( _glfwLibrary.Libs.gdi32 != NULL ) { FreeLibrary( _glfwLibrary.Libs.gdi32 ); _glfwLibrary.Libs.gdi32 = NULL; } #endif // _GLFW_NO_DLOAD_GDI32 // winmm.dll #ifndef _GLFW_NO_DLOAD_WINMM if( _glfwLibrary.Libs.winmm != NULL ) { FreeLibrary( _glfwLibrary.Libs.winmm ); _glfwLibrary.Libs.winmm = NULL; } #endif // _GLFW_NO_DLOAD_WINMM } //======================================================================== // Initialize GLFW thread package //======================================================================== static void _glfwInitThreads( void ) { // Initialize critical section handle InitializeCriticalSection( &_glfwThrd.CriticalSection ); // The first thread (the main thread) has ID 0 _glfwThrd.NextID = 0; // Fill out information about the main thread (this thread) _glfwThrd.First.ID = _glfwThrd.NextID ++; _glfwThrd.First.Function = NULL; _glfwThrd.First.Handle = GetCurrentThread(); _glfwThrd.First.WinID = GetCurrentThreadId(); _glfwThrd.First.Previous = NULL; _glfwThrd.First.Next = NULL; } //======================================================================== // Terminate GLFW thread package //======================================================================== static void _glfwTerminateThreads( void ) { _GLFWthread *t, *t_next; // Enter critical section ENTER_THREAD_CRITICAL_SECTION // Kill all threads (NOTE: THE USER SHOULD WAIT FOR ALL THREADS TO // DIE, _BEFORE_ CALLING glfwTerminate()!!!) t = _glfwThrd.First.Next; while( t != NULL ) { // Get pointer to next thread t_next = t->Next; // Simply murder the process, no mercy! if( TerminateThread( t->Handle, 0 ) ) { // Close thread handle CloseHandle( t->Handle ); // Free memory allocated for this thread free( (void *) t ); } // Select next thread in list t = t_next; } // Leave critical section LEAVE_THREAD_CRITICAL_SECTION // Delete critical section handle DeleteCriticalSection( &_glfwThrd.CriticalSection ); } //======================================================================== // Terminate GLFW when exiting application //======================================================================== void _glfwTerminate_atexit( void ) { glfwTerminate(); } //************************************************************************ //**** Platform implementation functions **** //************************************************************************ //======================================================================== // Initialize various GLFW state //======================================================================== int _glfwPlatformInit( void ) { OSVERSIONINFO osi; // To make SetForegroundWindow() work as we want, we need to fiddle // with the FOREGROUNDLOCKTIMEOUT system setting (we do this as early // as possible in the hope of still being the foreground process) SystemParametersInfo( SPI_GETFOREGROUNDLOCKTIMEOUT, 0, &_glfwLibrary.Sys.foregroundLockTimeout, 0 ); SystemParametersInfo( SPI_SETFOREGROUNDLOCKTIMEOUT, 0, (LPVOID)0, SPIF_SENDCHANGE ); // Check which OS version we are running osi.dwOSVersionInfoSize = sizeof( OSVERSIONINFO ); GetVersionEx( &osi ); _glfwLibrary.Sys.winVer = _GLFW_WIN_UNKNOWN; if( osi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS ) { if( osi.dwMajorVersion == 4 && osi.dwMinorVersion < 10 ) { _glfwLibrary.Sys.winVer = _GLFW_WIN_95; } else if( osi.dwMajorVersion == 4 && osi.dwMinorVersion < 90 ) { _glfwLibrary.Sys.winVer = _GLFW_WIN_98; } else if( osi.dwMajorVersion == 4 && osi.dwMinorVersion == 90 ) { _glfwLibrary.Sys.winVer = _GLFW_WIN_ME; } else if( osi.dwMajorVersion >= 4 ) { _glfwLibrary.Sys.winVer = _GLFW_WIN_UNKNOWN_9x; } } else if( osi.dwPlatformId == VER_PLATFORM_WIN32_NT ) { if( osi.dwMajorVersion == 4 && osi.dwMinorVersion == 0 ) { _glfwLibrary.Sys.winVer = _GLFW_WIN_NT4; } else if( osi.dwMajorVersion == 5 && osi.dwMinorVersion == 0 ) { _glfwLibrary.Sys.winVer = _GLFW_WIN_2K; } else if( osi.dwMajorVersion == 5 && osi.dwMinorVersion == 1 ) { _glfwLibrary.Sys.winVer = _GLFW_WIN_XP; } else if( osi.dwMajorVersion == 5 && osi.dwMinorVersion == 2 ) { _glfwLibrary.Sys.winVer = _GLFW_WIN_NET_SERVER; } else if( osi.dwMajorVersion >= 5 ) { _glfwLibrary.Sys.winVer = _GLFW_WIN_UNKNOWN_NT; } } // Do we have Unicode support? if( _glfwLibrary.Sys.winVer >= _GLFW_WIN_NT4 ) { // Windows NT/2000/XP/.NET has Unicode support _glfwLibrary.Sys.hasUnicode = GL_TRUE; } else { // Windows 9x/ME does not have Unicode support _glfwLibrary.Sys.hasUnicode = GL_FALSE; } // Load libraries (DLLs) if( !_glfwInitLibraries() ) { return GL_FALSE; } // With the Borland C++ compiler, we want to disable FPU exceptions // (this is recommended for OpenGL applications under Windows) #ifdef __BORLANDC__ _control87( MCW_EM, MCW_EM ); #endif // Retrieve GLFW instance handle _glfwLibrary.instance = GetModuleHandle( NULL ); // System keys are not disabled _glfwWin.keyboardHook = NULL; // Initialise thread package _glfwInitThreads(); _glfwPlatformGetDesktopMode( &_glfwLibrary.desktopMode ); // Install atexit() routine atexit( _glfwTerminate_atexit ); // Start the timer _glfwInitTimer(); return GL_TRUE; } //======================================================================== // Close window and kill all threads //======================================================================== int _glfwPlatformTerminate( void ) { // Only the main thread is allowed to do this... if( GetCurrentThreadId() != _glfwThrd.First.WinID ) { return GL_FALSE; } // Close OpenGL window glfwCloseWindow(); // Kill thread package _glfwTerminateThreads(); // Enable system keys again (if they were disabled) glfwEnable( GLFW_SYSTEM_KEYS ); // Unload libraries (DLLs) _glfwFreeLibraries(); // Restore FOREGROUNDLOCKTIMEOUT system setting SystemParametersInfo( SPI_SETFOREGROUNDLOCKTIMEOUT, 0, (LPVOID) _glfwLibrary.Sys.foregroundLockTimeout, SPIF_SENDCHANGE ); return GL_TRUE; } GLFW-0.5.1.0/glfw/lib/win32/win32_joystick.c0000644000000000000000000001533112045371042016275 0ustar0000000000000000//======================================================================== // GLFW - An OpenGL framework // Platform: Win32/WGL // API version: 2.7 // WWW: http://www.glfw.org/ //------------------------------------------------------------------------ // Copyright (c) 2002-2006 Marcus Geelnard // Copyright (c) 2006-2010 Camilla Berglund // // This software is provided 'as-is', without any express or implied // warranty. In no event will the authors be held liable for any damages // arising from the use of this software. // // Permission is granted to anyone to use this software for any purpose, // including commercial applications, and to alter it and redistribute it // freely, subject to the following restrictions: // // 1. The origin of this software must not be misrepresented; you must not // claim that you wrote the original software. If you use this software // in a product, an acknowledgment in the product documentation would // be appreciated but is not required. // // 2. Altered source versions must be plainly marked as such, and must not // be misrepresented as being the original software. // // 3. This notice may not be removed or altered from any source // distribution. // //======================================================================== #include "internal.h" //************************************************************************ //**** GLFW internal functions **** //************************************************************************ //======================================================================== // Return GL_TRUE if joystick is present, else return GL_FALSE. //======================================================================== static int _glfwJoystickPresent( int joy ) { JOYINFO ji; // Windows NT 4.0 MMSYSTEM only supports 2 sticks (other Windows // versions support 16 sticks) if( _glfwLibrary.Sys.winVer == _GLFW_WIN_NT4 && joy > GLFW_JOYSTICK_2 ) { return GL_FALSE; } // Is it a valid stick ID (Windows don't support more than 16 sticks)? if( joy < GLFW_JOYSTICK_1 || joy > GLFW_JOYSTICK_16 ) { return GL_FALSE; } // Is the joystick present? if( _glfw_joyGetPos( joy - GLFW_JOYSTICK_1, &ji ) != JOYERR_NOERROR ) { return GL_FALSE; } return GL_TRUE; } //======================================================================== // Calculate joystick position //======================================================================== static float _glfwCalcJoystickPos( DWORD pos, DWORD min, DWORD max ) { float fpos = (float) pos; float fmin = (float) min; float fmax = (float) max; return (2.0f*(fpos - fmin) / (fmax - fmin)) - 1.0f; } //************************************************************************ //**** Platform implementation functions **** //************************************************************************ //======================================================================== // Determine joystick capabilities //======================================================================== int _glfwPlatformGetJoystickParam( int joy, int param ) { JOYCAPS jc; // return 0; // Is joystick present? if( !_glfwJoystickPresent( joy ) ) { return 0; } // We got this far, the joystick is present if( param == GLFW_PRESENT ) { return GL_TRUE; } // Get joystick capabilities _glfw_joyGetDevCaps( joy - GLFW_JOYSTICK_1, &jc, sizeof(JOYCAPS) ); switch( param ) { case GLFW_AXES: // Return number of joystick axes return jc.wNumAxes; case GLFW_BUTTONS: // Return number of joystick axes return jc.wNumButtons; default: break; } return 0; } //======================================================================== // Get joystick axis positions //======================================================================== int _glfwPlatformGetJoystickPos( int joy, float *pos, int numaxes ) { JOYCAPS jc; JOYINFOEX ji; int axis; // return 0; // Is joystick present? if( !_glfwJoystickPresent( joy ) ) { return 0; } // Get joystick capabilities _glfw_joyGetDevCaps( joy - GLFW_JOYSTICK_1, &jc, sizeof(JOYCAPS) ); // Get joystick state ji.dwSize = sizeof( JOYINFOEX ); ji.dwFlags = JOY_RETURNX | JOY_RETURNY | JOY_RETURNZ | JOY_RETURNR | JOY_RETURNU | JOY_RETURNV; _glfw_joyGetPosEx( joy - GLFW_JOYSTICK_1, &ji ); // Get position values for all axes axis = 0; if( axis < numaxes ) { pos[ axis++ ] = _glfwCalcJoystickPos( ji.dwXpos, jc.wXmin, jc.wXmax ); } if( axis < numaxes ) { pos[ axis++ ] = -_glfwCalcJoystickPos( ji.dwYpos, jc.wYmin, jc.wYmax ); } if( axis < numaxes && jc.wCaps & JOYCAPS_HASZ ) { pos[ axis++ ] = _glfwCalcJoystickPos( ji.dwZpos, jc.wZmin, jc.wZmax ); } if( axis < numaxes && jc.wCaps & JOYCAPS_HASR ) { pos[ axis++ ] = _glfwCalcJoystickPos( ji.dwRpos, jc.wRmin, jc.wRmax ); } if( axis < numaxes && jc.wCaps & JOYCAPS_HASU ) { pos[ axis++ ] = _glfwCalcJoystickPos( ji.dwUpos, jc.wUmin, jc.wUmax ); } if( axis < numaxes && jc.wCaps & JOYCAPS_HASV ) { pos[ axis++ ] = -_glfwCalcJoystickPos( ji.dwVpos, jc.wVmin, jc.wVmax ); } // Return number of returned axes return axis; } //======================================================================== // Get joystick button states //======================================================================== int _glfwPlatformGetJoystickButtons( int joy, unsigned char *buttons, int numbuttons ) { JOYCAPS jc; JOYINFOEX ji; int button; // return 0; // Is joystick present? if( !_glfwJoystickPresent( joy ) ) { return 0; } // Get joystick capabilities _glfw_joyGetDevCaps( joy - GLFW_JOYSTICK_1, &jc, sizeof(JOYCAPS) ); // Get joystick state ji.dwSize = sizeof( JOYINFOEX ); ji.dwFlags = JOY_RETURNBUTTONS; _glfw_joyGetPosEx( joy - GLFW_JOYSTICK_1, &ji ); // Get states of all requested buttons button = 0; while( button < numbuttons && button < (int) jc.wNumButtons ) { buttons[ button ] = (unsigned char) (ji.dwButtons & (1UL << button) ? GLFW_PRESS : GLFW_RELEASE); button ++; } return button; } GLFW-0.5.1.0/glfw/lib/win32/win32_thread.c0000644000000000000000000003400212045371042015701 0ustar0000000000000000//======================================================================== // GLFW - An OpenGL framework // Platform: Win32/WGL // API version: 2.7 // WWW: http://www.glfw.org/ //------------------------------------------------------------------------ // Copyright (c) 2002-2006 Marcus Geelnard // Copyright (c) 2006-2010 Camilla Berglund // // This software is provided 'as-is', without any express or implied // warranty. In no event will the authors be held liable for any damages // arising from the use of this software. // // Permission is granted to anyone to use this software for any purpose, // including commercial applications, and to alter it and redistribute it // freely, subject to the following restrictions: // // 1. The origin of this software must not be misrepresented; you must not // claim that you wrote the original software. If you use this software // in a product, an acknowledgment in the product documentation would // be appreciated but is not required. // // 2. Altered source versions must be plainly marked as such, and must not // be misrepresented as being the original software. // // 3. This notice may not be removed or altered from any source // distribution. // //======================================================================== #include "internal.h" //************************************************************************ // This is an implementation of POSIX "compatible" condition variables for // Win32, as described by Douglas C. Schmidt and Irfan Pyarali: // http://www.cs.wustl.edu/~schmidt/win32-cv-1.html //************************************************************************ enum { _GLFW_COND_SIGNAL = 0, _GLFW_COND_BROADCAST = 1 }; typedef struct { // Signal and broadcast event HANDLEs HANDLE events[ 2 ]; // Count of the number of waiters unsigned int waiters_count; // Serialize access to CRITICAL_SECTION waiters_count_lock; } _GLFWcond; //************************************************************************ //**** GLFW internal functions **** //************************************************************************ //======================================================================== // This is simply a "wrapper" for calling the user thread function. //======================================================================== DWORD WINAPI _glfwNewThread( LPVOID lpParam ) { GLFWthreadfun threadfun; _GLFWthread *t; // Get pointer to thread information for current thread t = _glfwGetThreadPointer( _glfwPlatformGetThreadID() ); if( t == NULL ) { return 0; } // Get user thread function pointer threadfun = t->Function; // Call the user thread function threadfun( (void *) lpParam ); // Remove thread from thread list ENTER_THREAD_CRITICAL_SECTION _glfwRemoveThread( t ); LEAVE_THREAD_CRITICAL_SECTION // When the thread function returns, the thread will die... return 0; } //************************************************************************ //**** GLFW user functions **** //************************************************************************ //======================================================================== // Create a new thread //======================================================================== GLFWthread _glfwPlatformCreateThread( GLFWthreadfun fun, void *arg ) { GLFWthread ID; _GLFWthread *t, *t_tmp; HANDLE hThread; DWORD dwThreadId; // Enter critical section ENTER_THREAD_CRITICAL_SECTION // Create a new thread information memory area t = (_GLFWthread *) malloc( sizeof(_GLFWthread) ); if( t == NULL ) { // Leave critical section LEAVE_THREAD_CRITICAL_SECTION return -1; } // Get a new unique thread id ID = _glfwThrd.NextID ++; // Store thread information in the thread list t->Function = fun; t->ID = ID; // Create thread hThread = CreateThread( NULL, // Default security attributes 0, // Default stack size (1 MB) _glfwNewThread, // Thread function (a wrapper function) (LPVOID)arg, // Argument to thread is the user argument 0, // Default creation flags &dwThreadId // Returned thread identifier ); // Did the thread creation fail? if( hThread == NULL ) { free( (void *) t ); LEAVE_THREAD_CRITICAL_SECTION return -1; } // Store more thread information in the thread list t->Handle = hThread; t->WinID = dwThreadId; // Append thread to thread list t_tmp = &_glfwThrd.First; while( t_tmp->Next != NULL ) { t_tmp = t_tmp->Next; } t_tmp->Next = t; t->Previous = t_tmp; t->Next = NULL; // Leave critical section LEAVE_THREAD_CRITICAL_SECTION // Return the GLFW thread ID return ID; } //======================================================================== // Kill a thread. NOTE: THIS IS A VERY DANGEROUS OPERATION, AND SHOULD NOT // BE USED EXCEPT IN EXTREME SITUATIONS! //======================================================================== void _glfwPlatformDestroyThread( GLFWthread ID ) { _GLFWthread *t; // Enter critical section ENTER_THREAD_CRITICAL_SECTION // Get thread information pointer t = _glfwGetThreadPointer( ID ); if( t == NULL ) { LEAVE_THREAD_CRITICAL_SECTION return; } // Simply murder the process, no mercy! if( TerminateThread( t->Handle, 0 ) ) { // Close thread handle CloseHandle( t->Handle ); // Remove thread from thread list _glfwRemoveThread( t ); } // Leave critical section LEAVE_THREAD_CRITICAL_SECTION } //======================================================================== // Wait for a thread to die //======================================================================== int _glfwPlatformWaitThread( GLFWthread ID, int waitmode ) { DWORD result; HANDLE hThread; _GLFWthread *t; // Enter critical section ENTER_THREAD_CRITICAL_SECTION // Get thread information pointer t = _glfwGetThreadPointer( ID ); // Is the thread already dead? if( t == NULL ) { LEAVE_THREAD_CRITICAL_SECTION return GL_TRUE; } // Get thread handle hThread = t->Handle; // Leave critical section LEAVE_THREAD_CRITICAL_SECTION // Wait for thread to die if( waitmode == GLFW_WAIT ) { result = WaitForSingleObject( hThread, INFINITE ); } else if( waitmode == GLFW_NOWAIT ) { result = WaitForSingleObject( hThread, 0 ); } else { return GL_FALSE; } // Did we have a time-out? if( result == WAIT_TIMEOUT ) { return GL_FALSE; } return GL_TRUE; } //======================================================================== // Return the thread ID for the current thread //======================================================================== GLFWthread _glfwPlatformGetThreadID( void ) { _GLFWthread *t; GLFWthread ID = -1; DWORD WinID; // Get Windows thread ID WinID = GetCurrentThreadId(); // Enter critical section (to avoid an inconsistent thread list) ENTER_THREAD_CRITICAL_SECTION // Loop through entire list of threads to find the matching Windows // thread ID for( t = &_glfwThrd.First; t != NULL; t = t->Next ) { if( t->WinID == WinID ) { ID = t->ID; break; } } // Leave critical section LEAVE_THREAD_CRITICAL_SECTION // Return the found GLFW thread identifier return ID; } //======================================================================== // Create a mutual exclusion object //======================================================================== GLFWmutex _glfwPlatformCreateMutex( void ) { CRITICAL_SECTION *mutex; // Allocate memory for mutex mutex = (CRITICAL_SECTION *) malloc( sizeof(CRITICAL_SECTION) ); if( !mutex ) { return NULL; } // Initialize mutex InitializeCriticalSection( mutex ); // Cast to GLFWmutex and return return (GLFWmutex) mutex; } //======================================================================== // Destroy a mutual exclusion object //======================================================================== void _glfwPlatformDestroyMutex( GLFWmutex mutex ) { // Destroy mutex DeleteCriticalSection( (CRITICAL_SECTION *) mutex ); free( mutex ); } //======================================================================== // Request access to a mutex //======================================================================== void _glfwPlatformLockMutex( GLFWmutex mutex ) { // Wait for mutex to be released EnterCriticalSection( (CRITICAL_SECTION *) mutex ); } //======================================================================== // Release a mutex //======================================================================== void _glfwPlatformUnlockMutex( GLFWmutex mutex ) { // Release mutex LeaveCriticalSection( (CRITICAL_SECTION *) mutex ); } //======================================================================== // Create a new condition variable object //======================================================================== GLFWcond _glfwPlatformCreateCond( void ) { _GLFWcond *cond; // Allocate memory for condition variable cond = (_GLFWcond *) malloc( sizeof(_GLFWcond) ); if( !cond ) { return NULL; } // Initialize condition variable cond->waiters_count = 0; cond->events[ _GLFW_COND_SIGNAL ] = CreateEvent( NULL, FALSE, FALSE, NULL ); cond->events[ _GLFW_COND_BROADCAST ] = CreateEvent( NULL, TRUE, FALSE, NULL ); InitializeCriticalSection( &cond->waiters_count_lock ); // Cast to GLFWcond and return return (GLFWcond) cond; } //======================================================================== // Destroy a condition variable object //======================================================================== void _glfwPlatformDestroyCond( GLFWcond cond ) { // Close the condition variable handles CloseHandle( ((_GLFWcond *)cond)->events[ _GLFW_COND_SIGNAL ] ); CloseHandle( ((_GLFWcond *)cond)->events[ _GLFW_COND_BROADCAST ] ); // Delete critical section DeleteCriticalSection( &((_GLFWcond *)cond)->waiters_count_lock ); // Free memory for condition variable free( (void *) cond ); } //======================================================================== // Wait for a condition to be raised //======================================================================== void _glfwPlatformWaitCond( GLFWcond cond, GLFWmutex mutex, double timeout ) { _GLFWcond *cv = (_GLFWcond *) cond; int result, last_waiter; DWORD timeout_ms; // Avoid race conditions EnterCriticalSection( &cv->waiters_count_lock ); cv->waiters_count ++; LeaveCriticalSection( &cv->waiters_count_lock ); // It's ok to release the mutex here since Win32 manual-reset events // maintain state when used with SetEvent() LeaveCriticalSection( (CRITICAL_SECTION *) mutex ); // Translate timeout into milliseconds if( timeout >= GLFW_INFINITY ) { timeout_ms = INFINITE; } else { timeout_ms = (DWORD) (1000.0 * timeout + 0.5); if( timeout_ms <= 0 ) { timeout_ms = 1; } } // Wait for either event to become signaled due to glfwSignalCond or // glfwBroadcastCond being called result = WaitForMultipleObjects( 2, cv->events, FALSE, timeout_ms ); // Check if we are the last waiter EnterCriticalSection( &cv->waiters_count_lock ); cv->waiters_count --; last_waiter = (result == WAIT_OBJECT_0 + _GLFW_COND_BROADCAST) && (cv->waiters_count == 0); LeaveCriticalSection( &cv->waiters_count_lock ); // Some thread called glfwBroadcastCond if( last_waiter ) { // We're the last waiter to be notified or to stop waiting, so // reset the manual event ResetEvent( cv->events[ _GLFW_COND_BROADCAST ] ); } // Reacquire the mutex EnterCriticalSection( (CRITICAL_SECTION *) mutex ); } //======================================================================== // Signal a condition to one waiting thread //======================================================================== void _glfwPlatformSignalCond( GLFWcond cond ) { _GLFWcond *cv = (_GLFWcond *) cond; int have_waiters; // Avoid race conditions EnterCriticalSection( &cv->waiters_count_lock ); have_waiters = cv->waiters_count > 0; LeaveCriticalSection( &cv->waiters_count_lock ); if( have_waiters ) { SetEvent( cv->events[ _GLFW_COND_SIGNAL ] ); } } //======================================================================== // Broadcast a condition to all waiting threads //======================================================================== void _glfwPlatformBroadcastCond( GLFWcond cond ) { _GLFWcond *cv = (_GLFWcond *) cond; int have_waiters; // Avoid race conditions EnterCriticalSection( &cv->waiters_count_lock ); have_waiters = cv->waiters_count > 0; LeaveCriticalSection( &cv->waiters_count_lock ); if( have_waiters ) { SetEvent( cv->events[ _GLFW_COND_BROADCAST ] ); } } //======================================================================== // Return the number of processors in the system. //======================================================================== int _glfwPlatformGetNumberOfProcessors( void ) { SYSTEM_INFO si; // Get hardware system information GetSystemInfo( &si ); return (int) si.dwNumberOfProcessors; } GLFW-0.5.1.0/glfw/lib/win32/win32_time.c0000644000000000000000000001063212045371042015373 0ustar0000000000000000//======================================================================== // GLFW - An OpenGL framework // Platform: Win32/WGL // API version: 2.7 // WWW: http://www.glfw.org/ //------------------------------------------------------------------------ // Copyright (c) 2002-2006 Marcus Geelnard // Copyright (c) 2006-2010 Camilla Berglund // // This software is provided 'as-is', without any express or implied // warranty. In no event will the authors be held liable for any damages // arising from the use of this software. // // Permission is granted to anyone to use this software for any purpose, // including commercial applications, and to alter it and redistribute it // freely, subject to the following restrictions: // // 1. The origin of this software must not be misrepresented; you must not // claim that you wrote the original software. If you use this software // in a product, an acknowledgment in the product documentation would // be appreciated but is not required. // // 2. Altered source versions must be plainly marked as such, and must not // be misrepresented as being the original software. // // 3. This notice may not be removed or altered from any source // distribution. // //======================================================================== #include "internal.h" //************************************************************************ //**** GLFW internal functions **** //************************************************************************ //======================================================================== // Initialise timer //======================================================================== void _glfwInitTimer( void ) { __int64 freq; // Check if we have a performance counter if( QueryPerformanceFrequency( (LARGE_INTEGER *)&freq ) ) { // Performance counter is available => use it! _glfwLibrary.Timer.HasPerformanceCounter = GL_TRUE; // Counter resolution is 1 / counter frequency _glfwLibrary.Timer.Resolution = 1.0 / (double)freq; // Set start time for timer QueryPerformanceCounter( (LARGE_INTEGER *)&_glfwLibrary.Timer.t0_64 ); } else { // No performace counter available => use the tick counter _glfwLibrary.Timer.HasPerformanceCounter = GL_FALSE; // Counter resolution is 1 ms _glfwLibrary.Timer.Resolution = 0.001; // Set start time for timer _glfwLibrary.Timer.t0_32 = _glfw_timeGetTime(); } } //************************************************************************ //**** Platform implementation functions **** //************************************************************************ //======================================================================== // Return timer value in seconds //======================================================================== double _glfwPlatformGetTime( void ) { double t; __int64 t_64; if( _glfwLibrary.Timer.HasPerformanceCounter ) { QueryPerformanceCounter( (LARGE_INTEGER *)&t_64 ); t = (double)(t_64 - _glfwLibrary.Timer.t0_64); } else { t = (double)(_glfw_timeGetTime() - _glfwLibrary.Timer.t0_32); } // Calculate the current time in seconds return t * _glfwLibrary.Timer.Resolution; } //======================================================================== // Set timer value in seconds //======================================================================== void _glfwPlatformSetTime( double t ) { __int64 t_64; if( _glfwLibrary.Timer.HasPerformanceCounter ) { QueryPerformanceCounter( (LARGE_INTEGER *)&t_64 ); _glfwLibrary.Timer.t0_64 = t_64 - (__int64)(t/_glfwLibrary.Timer.Resolution); } else { _glfwLibrary.Timer.t0_32 = _glfw_timeGetTime() - (int)(t*1000.0); } } //======================================================================== // Put a thread to sleep for a specified amount of time //======================================================================== void _glfwPlatformSleep( double time ) { DWORD t; if( time == 0.0 ) { t = 0; } else if( time < 0.001 ) { t = 1; } else if( time > 2147483647.0 ) { t = 2147483647; } else { t = (DWORD)(time*1000.0 + 0.5); } Sleep( t ); } GLFW-0.5.1.0/glfw/lib/win32/win32_window.c0000644000000000000000000016640712045371042015760 0ustar0000000000000000//======================================================================== // GLFW - An OpenGL framework // Platform: Win32/WGL // API version: 2.7 // WWW: http://www.glfw.org/ //------------------------------------------------------------------------ // Copyright (c) 2002-2006 Marcus Geelnard // Copyright (c) 2006-2010 Camilla Berglund // // This software is provided 'as-is', without any express or implied // warranty. In no event will the authors be held liable for any damages // arising from the use of this software. // // Permission is granted to anyone to use this software for any purpose, // including commercial applications, and to alter it and redistribute it // freely, subject to the following restrictions: // // 1. The origin of this software must not be misrepresented; you must not // claim that you wrote the original software. If you use this software // in a product, an acknowledgment in the product documentation would // be appreciated but is not required. // // 2. Altered source versions must be plainly marked as such, and must not // be misrepresented as being the original software. // // 3. This notice may not be removed or altered from any source // distribution. // //======================================================================== #include "internal.h" //************************************************************************ //**** GLFW internal functions **** //************************************************************************ // We use versioned window class names in order not to cause conflicts // between applications using different versions of GLFW #define _GLFW_WNDCLASSNAME "GLFW27" //======================================================================== // Enable/disable minimize/restore animations //======================================================================== static int setMinMaxAnimations( int enable ) { ANIMATIONINFO AI; int old_enable; // Get old animation setting AI.cbSize = sizeof( ANIMATIONINFO ); SystemParametersInfo( SPI_GETANIMATION, AI.cbSize, &AI, 0 ); old_enable = AI.iMinAnimate; // If requested, change setting if( old_enable != enable ) { AI.iMinAnimate = enable; SystemParametersInfo( SPI_SETANIMATION, AI.cbSize, &AI, SPIF_SENDCHANGE ); } return old_enable; } //======================================================================== // Focus the window and bring it to the top of the stack // Due to some nastiness with how Win98/ME/2k/XP handles SetForegroundWindow, // we have to go through some really bizarre measures to achieve this //======================================================================== static void setForegroundWindow( HWND hWnd ) { int try_count = 0; int old_animate; // Try the standard approach first... BringWindowToTop( hWnd ); SetForegroundWindow( hWnd ); // If it worked, return now if( hWnd == GetForegroundWindow() ) { // Try to modify the system settings (since this is the foreground // process, we are allowed to do this) SystemParametersInfo( SPI_SETFOREGROUNDLOCKTIMEOUT, 0, (LPVOID)0, SPIF_SENDCHANGE ); return; } // For other Windows versions than 95 & NT4.0, the standard approach // may not work, so if we failed we have to "trick" Windows into // making our window the foureground window: Iconify and restore // again. It is ugly, but it seems to work (we turn off those annoying // zoom animations to make it look a bit better at least). // Turn off minimize/restore animations old_animate = setMinMaxAnimations( 0 ); // We try this a few times, just to be on the safe side of things... do { // Iconify & restore ShowWindow( hWnd, SW_HIDE ); ShowWindow( hWnd, SW_SHOWMINIMIZED ); ShowWindow( hWnd, SW_SHOWNORMAL ); // Try to get focus BringWindowToTop( hWnd ); SetForegroundWindow( hWnd ); // We do not want to keep going on forever, so we keep track of // how many times we tried try_count ++; } while( hWnd != GetForegroundWindow() && try_count <= 3 ); // Restore the system minimize/restore animation setting (void) setMinMaxAnimations( old_animate ); // Try to modify the system settings (since this is now hopefully the // foreground process, we are probably allowed to do this) SystemParametersInfo( SPI_SETFOREGROUNDLOCKTIMEOUT, 0, (LPVOID)0, SPIF_SENDCHANGE ); } //======================================================================== // Returns the specified attribute of the specified pixel format // NOTE: Do not call this unless we have found WGL_ARB_pixel_format //======================================================================== static int getPixelFormatAttrib(int pixelFormat, int attrib) { int value = 0; if( !_glfwWin.GetPixelFormatAttribivARB( _glfwWin.DC, pixelFormat, 0, 1, &attrib, &value) ) { // NOTE: We should probably handle this error somehow return 0; } return value; } //======================================================================== // Return a list of available and usable framebuffer configs //======================================================================== static _GLFWfbconfig *getFBConfigs( unsigned int *found ) { _GLFWfbconfig *result; PIXELFORMATDESCRIPTOR pfd; int i, count; *found = 0; if( _glfwWin.has_WGL_ARB_pixel_format ) { count = getPixelFormatAttrib( 1, WGL_NUMBER_PIXEL_FORMATS_ARB ); } else { count = _glfw_DescribePixelFormat( _glfwWin.DC, 1, sizeof( PIXELFORMATDESCRIPTOR ), NULL ); } if( !count ) { fprintf( stderr, "No Win32 pixel formats available\n" ); return NULL; } result = (_GLFWfbconfig*) malloc( sizeof( _GLFWfbconfig ) * count ); if( !result ) { fprintf(stderr, "Out of memory"); return NULL; } for( i = 1; i <= count; i++ ) { if( _glfwWin.has_WGL_ARB_pixel_format ) { // Get pixel format attributes through WGL_ARB_pixel_format if( !getPixelFormatAttrib( i, WGL_SUPPORT_OPENGL_ARB ) || !getPixelFormatAttrib( i, WGL_DRAW_TO_WINDOW_ARB ) || !getPixelFormatAttrib( i, WGL_DOUBLE_BUFFER_ARB ) ) { // Only consider doublebuffered OpenGL pixel formats for windows continue; } if( getPixelFormatAttrib( i, WGL_PIXEL_TYPE_ARB ) != WGL_TYPE_RGBA_ARB ) { // Only consider RGBA pixel formats continue; } // Only consider "hardware-accelerated" pixel formats if( getPixelFormatAttrib( i, WGL_ACCELERATION_ARB ) == WGL_NO_ACCELERATION_ARB ) { continue; } result[*found].redBits = getPixelFormatAttrib( i, WGL_RED_BITS_ARB ); result[*found].greenBits = getPixelFormatAttrib( i, WGL_GREEN_BITS_ARB ); result[*found].blueBits = getPixelFormatAttrib( i, WGL_BLUE_BITS_ARB ); result[*found].alphaBits = getPixelFormatAttrib( i, WGL_ALPHA_BITS_ARB ); result[*found].depthBits = getPixelFormatAttrib( i, WGL_DEPTH_BITS_ARB ); result[*found].stencilBits = getPixelFormatAttrib( i, WGL_STENCIL_BITS_ARB ); result[*found].accumRedBits = getPixelFormatAttrib( i, WGL_ACCUM_RED_BITS_ARB ); result[*found].accumGreenBits = getPixelFormatAttrib( i, WGL_ACCUM_GREEN_BITS_ARB ); result[*found].accumBlueBits = getPixelFormatAttrib( i, WGL_ACCUM_BLUE_BITS_ARB ); result[*found].accumAlphaBits = getPixelFormatAttrib( i, WGL_ACCUM_ALPHA_BITS_ARB ); result[*found].auxBuffers = getPixelFormatAttrib( i, WGL_AUX_BUFFERS_ARB ); result[*found].stereo = getPixelFormatAttrib( i, WGL_STEREO_ARB ); if( _glfwWin.has_WGL_ARB_multisample ) { result[*found].samples = getPixelFormatAttrib( i, WGL_SAMPLES_ARB ); } else { result[*found].samples = 0; } } else { // Get pixel format attributes through old-fashioned PFDs if( !_glfw_DescribePixelFormat( _glfwWin.DC, i, sizeof( PIXELFORMATDESCRIPTOR ), &pfd ) ) { continue; } if( !( pfd.dwFlags & PFD_DRAW_TO_WINDOW ) || !( pfd.dwFlags & PFD_SUPPORT_OPENGL ) || !( pfd.dwFlags & PFD_DOUBLEBUFFER ) ) { // Only consider doublebuffered OpenGL pixel formats for windows continue; } if( !( pfd.dwFlags & PFD_GENERIC_ACCELERATED ) && ( pfd.dwFlags & PFD_GENERIC_FORMAT ) ) { continue; } if( pfd.iPixelType != PFD_TYPE_RGBA ) { // Only RGBA pixel formats considered continue; } result[*found].redBits = pfd.cRedBits; result[*found].greenBits = pfd.cGreenBits; result[*found].blueBits = pfd.cBlueBits; result[*found].alphaBits = pfd.cAlphaBits; result[*found].depthBits = pfd.cDepthBits; result[*found].stencilBits = pfd.cStencilBits; result[*found].accumRedBits = pfd.cAccumRedBits; result[*found].accumGreenBits = pfd.cAccumGreenBits; result[*found].accumBlueBits = pfd.cAccumBlueBits; result[*found].accumAlphaBits = pfd.cAccumAlphaBits; result[*found].auxBuffers = pfd.cAuxBuffers; result[*found].stereo = ( pfd.dwFlags & PFD_STEREO ) ? GL_TRUE : GL_FALSE; // PFD pixel formats do not support FSAA result[*found].samples = 0; } result[*found].platformID = i; (*found)++; } return result; } //======================================================================== // Creates an OpenGL context on the specified device context //======================================================================== static GLboolean createContext( HDC dc, const _GLFWwndconfig* wndconfig, int pixelFormat ) { PIXELFORMATDESCRIPTOR pfd; int flags, i = 0, attribs[40]; if( !_glfw_DescribePixelFormat( dc, pixelFormat, sizeof(pfd), &pfd ) ) { return GL_FALSE; } if( !_glfw_SetPixelFormat( dc, pixelFormat, &pfd ) ) { return GL_FALSE; } if( _glfwWin.has_WGL_ARB_create_context ) { // Use the newer wglCreateContextAttribsARB if( wndconfig->glMajor != 1 || wndconfig->glMinor != 0 ) { // Request an explicitly versioned context attribs[i++] = WGL_CONTEXT_MAJOR_VERSION_ARB; attribs[i++] = wndconfig->glMajor; attribs[i++] = WGL_CONTEXT_MINOR_VERSION_ARB; attribs[i++] = wndconfig->glMinor; } if( wndconfig->glForward || wndconfig->glDebug ) { flags = 0; if( wndconfig->glForward ) { flags |= WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB; } if( wndconfig->glDebug ) { flags |= WGL_CONTEXT_DEBUG_BIT_ARB; } attribs[i++] = WGL_CONTEXT_FLAGS_ARB; attribs[i++] = flags; } if( wndconfig->glProfile ) { if( !_glfwWin.has_WGL_ARB_create_context_profile ) { return GL_FALSE; } if( wndconfig->glProfile == GLFW_OPENGL_CORE_PROFILE ) { flags = WGL_CONTEXT_CORE_PROFILE_BIT_ARB; } else { flags = WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB; } attribs[i++] = WGL_CONTEXT_PROFILE_MASK_ARB; attribs[i++] = flags; } attribs[i++] = 0; _glfwWin.context = _glfwWin.CreateContextAttribsARB( dc, NULL, attribs ); if( !_glfwWin.context ) { return GL_FALSE; } } else { _glfwWin.context = wglCreateContext( dc ); if( !_glfwWin.context ) { return GL_FALSE; } } return GL_TRUE; } //======================================================================== // Translates a Windows key to the corresponding GLFW key //======================================================================== static int translateKey( WPARAM wParam, LPARAM lParam ) { MSG next_msg; DWORD msg_time; DWORD scan_code; // Check for numeric keypad keys // Note: This way we always force "NumLock = ON", which at least // enables GLFW users to detect numeric keypad keys int hiFlags = HIWORD( lParam ); if ( !( hiFlags & 0x100 ) ) { switch( MapVirtualKey( hiFlags & 0xFF, 1 ) ) { case VK_INSERT: return GLFW_KEY_KP_0; case VK_END: return GLFW_KEY_KP_1; case VK_DOWN: return GLFW_KEY_KP_2; case VK_NEXT: return GLFW_KEY_KP_3; case VK_LEFT: return GLFW_KEY_KP_4; case VK_CLEAR: return GLFW_KEY_KP_5; case VK_RIGHT: return GLFW_KEY_KP_6; case VK_HOME: return GLFW_KEY_KP_7; case VK_UP: return GLFW_KEY_KP_8; case VK_PRIOR: return GLFW_KEY_KP_9; case VK_DIVIDE: return GLFW_KEY_KP_DIVIDE; case VK_MULTIPLY: return GLFW_KEY_KP_MULTIPLY; case VK_SUBTRACT: return GLFW_KEY_KP_SUBTRACT; case VK_ADD: return GLFW_KEY_KP_ADD; case VK_DELETE: return GLFW_KEY_KP_DECIMAL; } } // Check which key was pressed or released switch( wParam ) { // The SHIFT keys require special handling case VK_SHIFT: { // Compare scan code for this key with that of VK_RSHIFT in // order to determine which shift key was pressed (left or // right) scan_code = MapVirtualKey( VK_RSHIFT, 0 ); if( ((lParam & 0x01ff0000) >> 16) == scan_code ) { return GLFW_KEY_RSHIFT; } return GLFW_KEY_LSHIFT; } // The CTRL keys require special handling case VK_CONTROL: { // Is this an extended key (i.e. right key)? if( lParam & 0x01000000 ) { return GLFW_KEY_RCTRL; } // Here is a trick: "Alt Gr" sends LCTRL, then RALT. We only // want the RALT message, so we try to see if the next message // is a RALT message. In that case, this is a false LCTRL! msg_time = GetMessageTime(); if( PeekMessage( &next_msg, NULL, 0, 0, PM_NOREMOVE ) ) { if( next_msg.message == WM_KEYDOWN || next_msg.message == WM_SYSKEYDOWN ) { if( next_msg.wParam == VK_MENU && (next_msg.lParam & 0x01000000) && next_msg.time == msg_time ) { // Next message is a RALT down message, which // means that this is NOT a proper LCTRL message! return GLFW_KEY_UNKNOWN; } } } return GLFW_KEY_LCTRL; } // The ALT keys require special handling case VK_MENU: { // Is this an extended key (i.e. right key)? if( lParam & 0x01000000 ) { return GLFW_KEY_RALT; } return GLFW_KEY_LALT; } // The ENTER keys require special handling case VK_RETURN: { // Is this an extended key (i.e. right key)? if( lParam & 0x01000000 ) { return GLFW_KEY_KP_ENTER; } return GLFW_KEY_ENTER; } // Special keys (non character keys) case VK_ESCAPE: return GLFW_KEY_ESC; case VK_TAB: return GLFW_KEY_TAB; case VK_BACK: return GLFW_KEY_BACKSPACE; case VK_HOME: return GLFW_KEY_HOME; case VK_END: return GLFW_KEY_END; case VK_PRIOR: return GLFW_KEY_PAGEUP; case VK_NEXT: return GLFW_KEY_PAGEDOWN; case VK_INSERT: return GLFW_KEY_INSERT; case VK_DELETE: return GLFW_KEY_DEL; case VK_LEFT: return GLFW_KEY_LEFT; case VK_UP: return GLFW_KEY_UP; case VK_RIGHT: return GLFW_KEY_RIGHT; case VK_DOWN: return GLFW_KEY_DOWN; case VK_F1: return GLFW_KEY_F1; case VK_F2: return GLFW_KEY_F2; case VK_F3: return GLFW_KEY_F3; case VK_F4: return GLFW_KEY_F4; case VK_F5: return GLFW_KEY_F5; case VK_F6: return GLFW_KEY_F6; case VK_F7: return GLFW_KEY_F7; case VK_F8: return GLFW_KEY_F8; case VK_F9: return GLFW_KEY_F9; case VK_F10: return GLFW_KEY_F10; case VK_F11: return GLFW_KEY_F11; case VK_F12: return GLFW_KEY_F12; case VK_F13: return GLFW_KEY_F13; case VK_F14: return GLFW_KEY_F14; case VK_F15: return GLFW_KEY_F15; case VK_F16: return GLFW_KEY_F16; case VK_F17: return GLFW_KEY_F17; case VK_F18: return GLFW_KEY_F18; case VK_F19: return GLFW_KEY_F19; case VK_F20: return GLFW_KEY_F20; case VK_F21: return GLFW_KEY_F21; case VK_F22: return GLFW_KEY_F22; case VK_F23: return GLFW_KEY_F23; case VK_F24: return GLFW_KEY_F24; case VK_SPACE: return GLFW_KEY_SPACE; // Numeric keypad case VK_NUMPAD0: return GLFW_KEY_KP_0; case VK_NUMPAD1: return GLFW_KEY_KP_1; case VK_NUMPAD2: return GLFW_KEY_KP_2; case VK_NUMPAD3: return GLFW_KEY_KP_3; case VK_NUMPAD4: return GLFW_KEY_KP_4; case VK_NUMPAD5: return GLFW_KEY_KP_5; case VK_NUMPAD6: return GLFW_KEY_KP_6; case VK_NUMPAD7: return GLFW_KEY_KP_7; case VK_NUMPAD8: return GLFW_KEY_KP_8; case VK_NUMPAD9: return GLFW_KEY_KP_9; case VK_DIVIDE: return GLFW_KEY_KP_DIVIDE; case VK_MULTIPLY: return GLFW_KEY_KP_MULTIPLY; case VK_SUBTRACT: return GLFW_KEY_KP_SUBTRACT; case VK_ADD: return GLFW_KEY_KP_ADD; case VK_DECIMAL: return GLFW_KEY_KP_DECIMAL; case VK_NUMLOCK: return GLFW_KEY_KP_NUM_LOCK; case VK_CAPITAL: return GLFW_KEY_CAPS_LOCK; case VK_SCROLL: return GLFW_KEY_SCROLL_LOCK; case VK_PAUSE: return GLFW_KEY_PAUSE; case VK_LWIN: return GLFW_KEY_LSUPER; case VK_RWIN: return GLFW_KEY_RSUPER; case VK_APPS: return GLFW_KEY_MENU; // The rest (should be printable keys) default: { // Convert to printable character (ISO-8859-1 or Unicode) wParam = MapVirtualKey( (UINT) wParam, 2 ) & 0x0000FFFF; // Make sure that the character is uppercase if( _glfwLibrary.Sys.hasUnicode ) { wParam = (WPARAM) CharUpperW( (LPWSTR) wParam ); } else { wParam = (WPARAM) CharUpperA( (LPSTR) wParam ); } // Valid ISO-8859-1 character? if( (wParam >= 32 && wParam <= 126) || (wParam >= 160 && wParam <= 255) ) { return (int) wParam; } return GLFW_KEY_UNKNOWN; } } } //======================================================================== // Translates a Windows key to Unicode //======================================================================== static void translateChar( DWORD wParam, DWORD lParam, int action ) { BYTE keyboard_state[ 256 ]; UCHAR char_buf[ 10 ]; WCHAR unicode_buf[ 10 ]; UINT scan_code; int i, num_chars, unicode; GetKeyboardState( keyboard_state ); // Derive scan code from lParam and action scan_code = (lParam & 0x01ff0000) >> 16; if( action == GLFW_RELEASE ) { scan_code |= 0x8000000; } if( _glfwLibrary.Sys.hasUnicode ) { num_chars = ToUnicode( wParam, // virtual-key code scan_code, // scan code keyboard_state, // key-state array unicode_buf, // buffer for translated key 10, // size of translated key buffer 0 // active-menu flag ); unicode = 1; } else { // Convert to ISO-8859-1 num_chars = ToAscii( wParam, // virtual-key code scan_code, // scan code keyboard_state, // key-state array (LPWORD) char_buf, // buffer for translated key 0 // active-menu flag ); unicode = 0; } // Report characters for( i = 0; i < num_chars; i++ ) { // Get next character from buffer if( unicode ) { _glfwInputChar( (int) unicode_buf[ i ], action ); } else { _glfwInputChar( (int) char_buf[ i ], action ); } } } //======================================================================== // Window callback function (handles window events) //======================================================================== static LRESULT CALLBACK windowProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) { int wheelDelta, iconified; switch( uMsg ) { // Window activate message? (iconification?) case WM_ACTIVATE: { _glfwWin.active = LOWORD(wParam) != WA_INACTIVE ? GL_TRUE : GL_FALSE; iconified = HIWORD(wParam) ? GL_TRUE : GL_FALSE; // Were we deactivated/iconified? if( (!_glfwWin.active || iconified) && !_glfwWin.iconified ) { _glfwInputDeactivation(); // If we are in fullscreen mode we need to iconify if( _glfwWin.opened && _glfwWin.fullscreen ) { // Do we need to manually iconify? if( !iconified ) { // Minimize window ShowWindow( _glfwWin.window, SW_MINIMIZE ); iconified = GL_TRUE; } // Restore the original desktop resolution ChangeDisplaySettings( NULL, CDS_FULLSCREEN ); } // Unlock mouse if locked if( !_glfwWin.oldMouseLockValid ) { _glfwWin.oldMouseLock = _glfwWin.mouseLock; _glfwWin.oldMouseLockValid = GL_TRUE; glfwEnable( GLFW_MOUSE_CURSOR ); } } else if( _glfwWin.active || !iconified ) { // If we are in fullscreen mode we need to maximize if( _glfwWin.opened && _glfwWin.fullscreen && _glfwWin.iconified ) { // Change display settings to the user selected mode _glfwSetVideoModeMODE( _glfwWin.modeID ); // Do we need to manually restore window? if( iconified ) { // Restore window ShowWindow( _glfwWin.window, SW_RESTORE ); iconified = GL_FALSE; // Activate window ShowWindow( hWnd, SW_SHOW ); setForegroundWindow( _glfwWin.window ); SetFocus( _glfwWin.window ); } } // Lock mouse, if necessary if( _glfwWin.oldMouseLockValid && _glfwWin.oldMouseLock ) { glfwDisable( GLFW_MOUSE_CURSOR ); } _glfwWin.oldMouseLockValid = GL_FALSE; } _glfwWin.iconified = iconified; return 0; } case WM_SYSCOMMAND: { switch( wParam & 0xfff0 ) { case SC_SCREENSAVE: case SC_MONITORPOWER: { if( _glfwWin.fullscreen ) { // Disallow screen saver and screen blanking if we are // running in fullscreen mode return 0; } else { break; } } // User trying to access application menu using ALT? case SC_KEYMENU: return 0; } break; } case WM_CLOSE: { // Translate this to WM_QUIT so that we can handle all cases in the // same place PostQuitMessage( 0 ); return 0; } case WM_KEYDOWN: case WM_SYSKEYDOWN: { _glfwInputKey( translateKey( wParam, lParam ), GLFW_PRESS ); if( _glfwWin.charCallback ) { translateChar( (DWORD) wParam, (DWORD) lParam, GLFW_PRESS ); } break; } case WM_KEYUP: case WM_SYSKEYUP: { // Special trick: release both shift keys on SHIFT up event if( wParam == VK_SHIFT ) { _glfwInputKey( GLFW_KEY_LSHIFT, GLFW_RELEASE ); _glfwInputKey( GLFW_KEY_RSHIFT, GLFW_RELEASE ); } else { _glfwInputKey( translateKey( wParam, lParam ), GLFW_RELEASE ); } if( _glfwWin.charCallback ) { translateChar( (DWORD) wParam, (DWORD) lParam, GLFW_RELEASE ); } break; } case WM_LBUTTONDOWN: SetCapture(hWnd); _glfwInputMouseClick( GLFW_MOUSE_BUTTON_LEFT, GLFW_PRESS ); return 0; case WM_RBUTTONDOWN: SetCapture(hWnd); _glfwInputMouseClick( GLFW_MOUSE_BUTTON_RIGHT, GLFW_PRESS ); return 0; case WM_MBUTTONDOWN: SetCapture(hWnd); _glfwInputMouseClick( GLFW_MOUSE_BUTTON_MIDDLE, GLFW_PRESS ); return 0; case WM_XBUTTONDOWN: { if( HIWORD(wParam) == XBUTTON1 ) { SetCapture(hWnd); _glfwInputMouseClick( GLFW_MOUSE_BUTTON_4, GLFW_PRESS ); } else if( HIWORD(wParam) == XBUTTON2 ) { SetCapture(hWnd); _glfwInputMouseClick( GLFW_MOUSE_BUTTON_5, GLFW_PRESS ); } return 1; } case WM_LBUTTONUP: ReleaseCapture(); _glfwInputMouseClick( GLFW_MOUSE_BUTTON_LEFT, GLFW_RELEASE ); return 0; case WM_RBUTTONUP: ReleaseCapture(); _glfwInputMouseClick( GLFW_MOUSE_BUTTON_RIGHT, GLFW_RELEASE ); return 0; case WM_MBUTTONUP: ReleaseCapture(); _glfwInputMouseClick( GLFW_MOUSE_BUTTON_MIDDLE, GLFW_RELEASE ); return 0; case WM_XBUTTONUP: { if( HIWORD(wParam) == XBUTTON1 ) { ReleaseCapture(); _glfwInputMouseClick( GLFW_MOUSE_BUTTON_4, GLFW_RELEASE ); } else if( HIWORD(wParam) == XBUTTON2 ) { ReleaseCapture(); _glfwInputMouseClick( GLFW_MOUSE_BUTTON_5, GLFW_RELEASE ); } return 1; } case WM_MOUSEMOVE: { int NewMouseX, NewMouseY; // Get signed (!) mouse position NewMouseX = (int)((short)LOWORD(lParam)); NewMouseY = (int)((short)HIWORD(lParam)); if( NewMouseX != _glfwInput.OldMouseX || NewMouseY != _glfwInput.OldMouseY ) { if( _glfwWin.mouseLock ) { _glfwInput.MousePosX += NewMouseX - _glfwInput.OldMouseX; _glfwInput.MousePosY += NewMouseY - _glfwInput.OldMouseY; } else { _glfwInput.MousePosX = NewMouseX; _glfwInput.MousePosY = NewMouseY; } _glfwInput.OldMouseX = NewMouseX; _glfwInput.OldMouseY = NewMouseY; _glfwInput.MouseMoved = GL_TRUE; if( _glfwWin.mousePosCallback ) { _glfwWin.mousePosCallback( _glfwInput.MousePosX, _glfwInput.MousePosY ); } } return 0; } case WM_MOUSEWHEEL: { // WM_MOUSEWHEEL is not supported under Windows 95 if( _glfwLibrary.Sys.winVer != _GLFW_WIN_95 ) { wheelDelta = (((int)wParam) >> 16) / WHEEL_DELTA; _glfwInput.WheelPos += wheelDelta; if( _glfwWin.mouseWheelCallback ) { _glfwWin.mouseWheelCallback( _glfwInput.WheelPos ); } return 0; } break; } case WM_SIZE: { _glfwWin.width = LOWORD(lParam); _glfwWin.height = HIWORD(lParam); // If the mouse is locked, update the clipping rect if( _glfwWin.mouseLock ) { RECT ClipWindowRect; if( GetWindowRect( _glfwWin.window, &ClipWindowRect ) ) { ClipCursor( &ClipWindowRect ); } } if( _glfwWin.windowSizeCallback ) { _glfwWin.windowSizeCallback( LOWORD(lParam), HIWORD(lParam) ); } return 0; } case WM_MOVE: { // If the mouse is locked, update the clipping rect if( _glfwWin.mouseLock ) { RECT ClipWindowRect; if( GetWindowRect( _glfwWin.window, &ClipWindowRect ) ) { ClipCursor( &ClipWindowRect ); } } return 0; } // Was the window contents damaged? case WM_PAINT: { if( _glfwWin.windowRefreshCallback ) { _glfwWin.windowRefreshCallback(); } break; } case WM_DISPLAYCHANGE: { // TODO: Do stuff here. break; } } // Pass all unhandled messages to DefWindowProc return DefWindowProc( hWnd, uMsg, wParam, lParam ); } //======================================================================== // Translate client window size to full window size (including window borders) //======================================================================== static void getFullWindowSize( int clientWidth, int clientHeight, int *fullWidth, int *fullHeight ) { RECT rect; // Create a window rectangle rect.left = (long)0; rect.right = (long)clientWidth - 1; rect.top = (long)0; rect.bottom = (long)clientHeight - 1; // Adjust according to window styles AdjustWindowRectEx( &rect, _glfwWin.dwStyle, FALSE, _glfwWin.dwExStyle ); // Calculate width and height of full window *fullWidth = rect.right - rect.left + 1; *fullHeight = rect.bottom - rect.top + 1; } //======================================================================== // Initialize WGL-specific extensions // This function is called once before initial context creation, i.e. before // any WGL extensions could be present. This is done in order to have both // extension variable clearing and loading in the same place, hopefully // decreasing the possibility of forgetting to add one without the other. //======================================================================== static void initWGLExtensions( void ) { // This needs to include every function pointer loaded below _glfwWin.SwapIntervalEXT = NULL; _glfwWin.GetPixelFormatAttribivARB = NULL; _glfwWin.GetExtensionsStringARB = NULL; _glfwWin.GetExtensionsStringEXT = NULL; _glfwWin.CreateContextAttribsARB = NULL; // This needs to include every extension used below except for // WGL_ARB_extensions_string and WGL_EXT_extensions_string _glfwWin.has_WGL_EXT_swap_control = GL_FALSE; _glfwWin.has_WGL_ARB_pixel_format = GL_FALSE; _glfwWin.has_WGL_ARB_multisample = GL_FALSE; _glfwWin.has_WGL_ARB_create_context = GL_FALSE; _glfwWin.has_WGL_ARB_create_context_profile = GL_FALSE; _glfwWin.GetExtensionsStringEXT = (PFNWGLGETEXTENSIONSSTRINGEXTPROC) wglGetProcAddress( "wglGetExtensionsStringEXT" ); if( !_glfwWin.GetExtensionsStringEXT ) { _glfwWin.GetExtensionsStringARB = (PFNWGLGETEXTENSIONSSTRINGARBPROC) wglGetProcAddress( "wglGetExtensionsStringARB" ); if( !_glfwWin.GetExtensionsStringARB ) { return; } } if( _glfwPlatformExtensionSupported( "WGL_ARB_multisample" ) ) { _glfwWin.has_WGL_ARB_multisample = GL_TRUE; } if( _glfwPlatformExtensionSupported( "WGL_ARB_create_context" ) ) { _glfwWin.has_WGL_ARB_create_context = GL_TRUE; _glfwWin.CreateContextAttribsARB = (PFNWGLCREATECONTEXTATTRIBSARBPROC) wglGetProcAddress( "wglCreateContextAttribsARB" ); } if( _glfwWin.has_WGL_ARB_create_context ) { if( _glfwPlatformExtensionSupported( "WGL_ARB_create_context_profile" ) ) { _glfwWin.has_WGL_ARB_create_context_profile = GL_TRUE; } } if( _glfwPlatformExtensionSupported( "WGL_EXT_swap_control" ) ) { _glfwWin.has_WGL_EXT_swap_control = GL_TRUE; _glfwWin.SwapIntervalEXT = (PFNWGLSWAPINTERVALEXTPROC) wglGetProcAddress( "wglSwapIntervalEXT" ); } if( _glfwPlatformExtensionSupported( "WGL_ARB_pixel_format" ) ) { _glfwWin.has_WGL_ARB_pixel_format = GL_TRUE; _glfwWin.GetPixelFormatAttribivARB = (PFNWGLGETPIXELFORMATATTRIBIVARBPROC) wglGetProcAddress( "wglGetPixelFormatAttribivARB" ); } } //======================================================================== // Registers the GLFW window class //======================================================================== static ATOM registerWindowClass( void ) { WNDCLASS wc; ZeroMemory( &wc, sizeof( wc ) ); // Set window class parameters wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC; // Redraw on... wc.lpfnWndProc = (WNDPROC) windowProc; // Message handler wc.hInstance = _glfwLibrary.instance; // Set instance wc.hCursor = LoadCursor( NULL, IDC_ARROW ); // Load arrow pointer wc.lpszClassName = _GLFW_WNDCLASSNAME; // Set class name // Load user-provided icon if available wc.hIcon = LoadIcon( _glfwLibrary.instance, "GLFW_ICON" ); if( !wc.hIcon ) { // Load default icon wc.hIcon = LoadIcon( NULL, IDI_WINLOGO ); } return RegisterClass( &wc ); } //======================================================================== // Returns the closest matching pixel format, or zero on error //======================================================================== static int choosePixelFormat( const _GLFWfbconfig *fbconfig ) { unsigned int fbcount; int pixelFormat; _GLFWfbconfig *fbconfigs; const _GLFWfbconfig *closest; fbconfigs = getFBConfigs( &fbcount ); if( !fbconfigs ) { fprintf( stderr, "Failed to find any usable GLFWFBConfigs\n" ); return 0; } closest = _glfwChooseFBConfig( fbconfig, fbconfigs, fbcount ); if( !closest ) { fprintf( stderr, "Failed to select a GLFWFBConfig from the alternatives\n" ); free( fbconfigs ); return 0; } pixelFormat = (int) closest->platformID; free( fbconfigs ); fbconfigs = NULL; closest = NULL; return pixelFormat; } //======================================================================== // Creates the GLFW window and rendering context //======================================================================== static int createWindow( const _GLFWwndconfig *wndconfig, const _GLFWfbconfig *fbconfig ) { DWORD dwStyle, dwExStyle; int pixelFormat, fullWidth, fullHeight; RECT wa; POINT pos; _glfwWin.DC = NULL; _glfwWin.context = NULL; _glfwWin.window = NULL; // Set common window styles dwStyle = WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_VISIBLE; dwExStyle = WS_EX_APPWINDOW; // Set window style, depending on fullscreen mode if( _glfwWin.fullscreen ) { dwStyle |= WS_POPUP; // Here's a trick for helping us getting window focus // (SetForegroundWindow doesn't work properly under // Win98/ME/2K/.NET/+) /* if( _glfwLibrary.Sys.WinVer != _GLFW_WIN_95 && _glfwLibrary.Sys.WinVer != _GLFW_WIN_NT4 && _glfwLibrary.Sys.WinVer != _GLFW_WIN_XP ) { dwStyle |= WS_MINIMIZE; } */ } else { dwStyle |= WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX; if( !wndconfig->windowNoResize ) { dwStyle |= ( WS_MAXIMIZEBOX | WS_SIZEBOX ); dwExStyle |= WS_EX_WINDOWEDGE; } } // Remember window styles (used by getFullWindowSize) _glfwWin.dwStyle = dwStyle; _glfwWin.dwExStyle = dwExStyle; // Adjust window size for frame and title bar getFullWindowSize( _glfwWin.width, _glfwWin.height, &fullWidth, &fullHeight ); // Adjust window position to working area (e.g. if the task bar is at // the top of the display). Fullscreen windows are always opened in // the upper left corner regardless of the desktop working area. if( _glfwWin.fullscreen ) { wa.left = wa.top = 0; } else { SystemParametersInfo( SPI_GETWORKAREA, 0, &wa, 0 ); } _glfwWin.window = CreateWindowEx( _glfwWin.dwExStyle, // Extended style _GLFW_WNDCLASSNAME, // Class name "GLFW Window", // Window title _glfwWin.dwStyle, // Defined window style wa.left, wa.top, // Window position fullWidth, // Decorated window width fullHeight, // Decorated window height NULL, // No parent window NULL, // No menu _glfwLibrary.instance, // Instance NULL ); // Nothing to WM_CREATE if( !_glfwWin.window ) { fprintf( stderr, "Unable to create Win32 window\n" ); return GL_FALSE; } _glfwWin.DC = GetDC( _glfwWin.window ); if( !_glfwWin.DC ) { fprintf( stderr, "Unable to retrieve GLFW window DC\n" ); return GL_FALSE; } pixelFormat = choosePixelFormat( fbconfig ); if( !pixelFormat ) { fprintf( stderr, "Unable to find a usable pixel format\n" ); return GL_FALSE; } if( !createContext( _glfwWin.DC, wndconfig, pixelFormat ) ) { fprintf( stderr, "Unable to create OpenGL context\n" ); return GL_FALSE; } if( !wglMakeCurrent( _glfwWin.DC, _glfwWin.context ) ) { fprintf( stderr, "Unable to make OpenGL context current\n" ); return GL_FALSE; } initWGLExtensions(); // Initialize mouse position data GetCursorPos( &pos ); ScreenToClient( _glfwWin.window, &pos ); _glfwInput.OldMouseX = _glfwInput.MousePosX = pos.x; _glfwInput.OldMouseY = _glfwInput.MousePosY = pos.y; return GL_TRUE; } //======================================================================== // Destroys the GLFW window and rendering context //======================================================================== static void destroyWindow( void ) { if( _glfwWin.context ) { wglMakeCurrent( NULL, NULL ); wglDeleteContext( _glfwWin.context ); _glfwWin.context = NULL; } if( _glfwWin.DC ) { ReleaseDC( _glfwWin.window, _glfwWin.DC ); _glfwWin.DC = NULL; } if( _glfwWin.window ) { if( _glfwLibrary.Sys.winVer <= _GLFW_WIN_NT4 ) { // Note: Hiding the window first fixes an annoying W98/NT4 // remaining icon bug for fullscreen displays ShowWindow( _glfwWin.window, SW_HIDE ); } DestroyWindow( _glfwWin.window ); _glfwWin.window = NULL; } } //************************************************************************ //**** Platform implementation functions **** //************************************************************************ //======================================================================== // Here is where the window is created, and the OpenGL rendering context is // created //======================================================================== int _glfwPlatformOpenWindow( int width, int height, const _GLFWwndconfig *wndconfig, const _GLFWfbconfig *fbconfig ) { GLboolean recreateContext = GL_FALSE; _glfwWin.desiredRefreshRate = wndconfig->refreshRate; _glfwWin.windowNoResize = wndconfig->windowNoResize; _glfwWin.classAtom = registerWindowClass(); if( !_glfwWin.classAtom ) { fprintf( stderr, "Failed to register GLFW window class\n" ); return GL_FALSE; } if( _glfwWin.fullscreen ) { _glfwSetVideoMode( &_glfwWin.width, &_glfwWin.height, fbconfig->redBits, fbconfig->greenBits, fbconfig->blueBits, wndconfig->refreshRate ); } initWGLExtensions(); if( !createWindow( wndconfig, fbconfig ) ) { fprintf( stderr, "Failed to create GLFW window\n" ); return GL_FALSE; } _glfwRefreshContextParams(); if( fbconfig->samples > 0 ) { // We want FSAA, but can we get it? // FSAA is not a hard constraint, so otherwise we just don't care if( _glfwWin.has_WGL_ARB_multisample && _glfwWin.has_WGL_ARB_pixel_format ) { // We appear to have both the FSAA extension and the means to ask for it recreateContext = GL_TRUE; } } if( wndconfig->glMajor > 2 ) { if ( wndconfig->glMajor != _glfwWin.glMajor || wndconfig->glMinor != _glfwWin.glMinor ) { // We want a different OpenGL version, but can we get it? // Otherwise, if we got a version greater than required, that's fine, // whereas if we got a version lesser than required, it will be dealt // with in glfwOpenWindow if( _glfwWin.has_WGL_ARB_create_context ) { recreateContext = GL_TRUE; } } if( wndconfig->glForward ) { if( !_glfwWin.has_WGL_ARB_create_context ) { // Forward-compatibility is a hard constraint return GL_FALSE; } recreateContext = GL_TRUE; } if( wndconfig->glProfile ) { if( !_glfwWin.has_WGL_ARB_create_context_profile ) { // Context profile is a hard constraint return GL_FALSE; } recreateContext = GL_TRUE; } } if( recreateContext ) { // Some window hints require us to re-create the context using WGL // extensions retrieved through the current context, as we cannot check // for WGL extensions or retrieve WGL entry points before we have a // current context (actually until we have implicitly loaded the ICD) // Yes, this is strange, and yes, this is the proper way on Win32 // As Windows only allows you to set the pixel format once for a // window, we need to destroy the current window and create a new one // to be able to use the new pixel format // Technically, it may be possible to keep the old window around if // we're just creating an OpenGL 3.0+ context with the same pixel // format, but it's not worth the potential compatibility problems destroyWindow(); if( !createWindow( wndconfig, fbconfig ) ) { fprintf( stderr, "Unable to re-create GLFW window\n" ); return GL_FALSE; } } if( _glfwWin.fullscreen ) { // Place the window above all topmost windows SetWindowPos( _glfwWin.window, HWND_TOPMOST, 0,0,0,0, SWP_NOMOVE | SWP_NOSIZE ); } setForegroundWindow( _glfwWin.window ); SetFocus( _glfwWin.window ); return GL_TRUE; } //======================================================================== // Properly kill the window / video display //======================================================================== void _glfwPlatformCloseWindow( void ) { destroyWindow(); if( _glfwWin.classAtom ) { UnregisterClass( _GLFW_WNDCLASSNAME, _glfwLibrary.instance ); _glfwWin.classAtom = 0; } if( _glfwWin.fullscreen ) { // Restore original desktop resolution ChangeDisplaySettings( NULL, CDS_FULLSCREEN ); } } //======================================================================== // Set the window title //======================================================================== void _glfwPlatformSetWindowTitle( const char *title ) { (void) SetWindowText( _glfwWin.window, title ); } //======================================================================== // Set the window size. //======================================================================== void _glfwPlatformSetWindowSize( int width, int height ) { int bpp, mode = 0, refresh; int sizechanged = GL_FALSE; GLint drawbuffer; GLfloat clearcolor[4]; if( _glfwWin.fullscreen ) { // Get some info about the current mode DEVMODE dm; // Get current BPP settings dm.dmSize = sizeof( DEVMODE ); if( EnumDisplaySettings( NULL, _glfwWin.modeID, &dm ) ) { // Get bpp bpp = dm.dmBitsPerPel; // Get closest match for target video mode refresh = _glfwWin.desiredRefreshRate; mode = _glfwGetClosestVideoModeBPP( &width, &height, &bpp, &refresh ); } else { mode = _glfwWin.modeID; } } else { // If we are in windowed mode, adjust the window size to // compensate for window decorations getFullWindowSize( width, height, &width, &height ); } // Change window size before changing fullscreen mode? if( _glfwWin.fullscreen && (width > _glfwWin.width) ) { SetWindowPos( _glfwWin.window, HWND_TOP, 0, 0, width, height, SWP_NOOWNERZORDER | SWP_NOMOVE | SWP_NOZORDER ); sizechanged = GL_TRUE; } // Change fullscreen video mode? if( _glfwWin.fullscreen && mode != _glfwWin.modeID ) { _glfwSetVideoModeMODE( mode ); // Clear the front buffer to black (avoid ugly desktop remains in // our OpenGL window) glGetIntegerv( GL_DRAW_BUFFER, &drawbuffer ); glGetFloatv( GL_COLOR_CLEAR_VALUE, clearcolor ); glClearColor( 0.0f, 0.0f, 0.0f, 0.0f ); glClear( GL_COLOR_BUFFER_BIT ); if( drawbuffer == GL_BACK ) { _glfw_SwapBuffers( _glfwWin.DC ); } glClearColor( clearcolor[0], clearcolor[1], clearcolor[2], clearcolor[3] ); } // Set window size (if not already changed) if( !sizechanged ) { SetWindowPos( _glfwWin.window, HWND_TOP, 0, 0, width, height, SWP_NOOWNERZORDER | SWP_NOMOVE | SWP_NOZORDER ); } } //======================================================================== // Set the window position //======================================================================== void _glfwPlatformSetWindowPos( int x, int y ) { (void) SetWindowPos( _glfwWin.window, HWND_TOP, x, y, 0, 0, SWP_NOOWNERZORDER | SWP_NOSIZE | SWP_NOZORDER ); } //======================================================================== // Window iconification //======================================================================== void _glfwPlatformIconifyWindow( void ) { // Iconify window ShowWindow( _glfwWin.window, SW_MINIMIZE ); _glfwWin.iconified = GL_TRUE; // If we are in fullscreen mode we need to change video modes if( _glfwWin.fullscreen ) { // Change display settings to the desktop resolution ChangeDisplaySettings( NULL, CDS_FULLSCREEN ); } // Unlock mouse if( !_glfwWin.oldMouseLockValid ) { _glfwWin.oldMouseLock = _glfwWin.mouseLock; _glfwWin.oldMouseLockValid = GL_TRUE; glfwEnable( GLFW_MOUSE_CURSOR ); } } //======================================================================== // Window un-iconification //======================================================================== void _glfwPlatformRestoreWindow( void ) { // If we are in fullscreen mode we need to change video modes if( _glfwWin.fullscreen ) { // Change display settings to the user selected mode _glfwSetVideoModeMODE( _glfwWin.modeID ); } // Un-iconify window ShowWindow( _glfwWin.window, SW_RESTORE ); // Make sure that our window ends up on top of things ShowWindow( _glfwWin.window, SW_SHOW ); setForegroundWindow( _glfwWin.window ); SetFocus( _glfwWin.window ); // Window is no longer iconified _glfwWin.iconified = GL_FALSE; // Lock mouse, if necessary if( _glfwWin.oldMouseLockValid && _glfwWin.oldMouseLock ) { glfwDisable( GLFW_MOUSE_CURSOR ); } _glfwWin.oldMouseLockValid = GL_FALSE; } //======================================================================== // Swap buffers (double-buffering) //======================================================================== void _glfwPlatformSwapBuffers( void ) { _glfw_SwapBuffers( _glfwWin.DC ); } //======================================================================== // Set double buffering swap interval //======================================================================== void _glfwPlatformSwapInterval( int interval ) { if( _glfwWin.has_WGL_EXT_swap_control ) { _glfwWin.SwapIntervalEXT( interval ); } } //======================================================================== // Write back window parameters into GLFW window structure //======================================================================== void _glfwPlatformRefreshWindowParams( void ) { PIXELFORMATDESCRIPTOR pfd; DEVMODE dm; int pixelFormat, mode; // Obtain a detailed description of current pixel format pixelFormat = _glfw_GetPixelFormat( _glfwWin.DC ); if( _glfwWin.has_WGL_ARB_pixel_format ) { if( getPixelFormatAttrib( pixelFormat, WGL_ACCELERATION_ARB ) != WGL_NO_ACCELERATION_ARB ) { _glfwWin.accelerated = GL_TRUE; } else { _glfwWin.accelerated = GL_FALSE; } _glfwWin.redBits = getPixelFormatAttrib( pixelFormat, WGL_RED_BITS_ARB ); _glfwWin.greenBits = getPixelFormatAttrib( pixelFormat, WGL_GREEN_BITS_ARB ); _glfwWin.blueBits = getPixelFormatAttrib( pixelFormat, WGL_BLUE_BITS_ARB ); _glfwWin.alphaBits = getPixelFormatAttrib( pixelFormat, WGL_ALPHA_BITS_ARB ); _glfwWin.depthBits = getPixelFormatAttrib( pixelFormat, WGL_DEPTH_BITS_ARB ); _glfwWin.stencilBits = getPixelFormatAttrib( pixelFormat, WGL_STENCIL_BITS_ARB ); _glfwWin.accumRedBits = getPixelFormatAttrib( pixelFormat, WGL_ACCUM_RED_BITS_ARB ); _glfwWin.accumGreenBits = getPixelFormatAttrib( pixelFormat, WGL_ACCUM_GREEN_BITS_ARB ); _glfwWin.accumBlueBits = getPixelFormatAttrib( pixelFormat, WGL_ACCUM_BLUE_BITS_ARB ); _glfwWin.accumAlphaBits = getPixelFormatAttrib( pixelFormat, WGL_ACCUM_ALPHA_BITS_ARB ); _glfwWin.auxBuffers = getPixelFormatAttrib( pixelFormat, WGL_AUX_BUFFERS_ARB ); _glfwWin.stereo = getPixelFormatAttrib( pixelFormat, WGL_STEREO_ARB ) ? GL_TRUE : GL_FALSE; if( _glfwWin.has_WGL_ARB_multisample ) { _glfwWin.samples = getPixelFormatAttrib( pixelFormat, WGL_SAMPLES_ARB ); // Should we force 1 to 0 here for consistency, or keep 1 for transparency? } else { _glfwWin.samples = 0; } } else { _glfw_DescribePixelFormat( _glfwWin.DC, pixelFormat, sizeof(PIXELFORMATDESCRIPTOR), &pfd ); // Is current OpenGL context accelerated? _glfwWin.accelerated = (pfd.dwFlags & PFD_GENERIC_ACCELERATED) || !(pfd.dwFlags & PFD_GENERIC_FORMAT) ? 1 : 0; // "Standard" window parameters _glfwWin.redBits = pfd.cRedBits; _glfwWin.greenBits = pfd.cGreenBits; _glfwWin.blueBits = pfd.cBlueBits; _glfwWin.alphaBits = pfd.cAlphaBits; _glfwWin.depthBits = pfd.cDepthBits; _glfwWin.stencilBits = pfd.cStencilBits; _glfwWin.accumRedBits = pfd.cAccumRedBits; _glfwWin.accumGreenBits = pfd.cAccumGreenBits; _glfwWin.accumBlueBits = pfd.cAccumBlueBits; _glfwWin.accumAlphaBits = pfd.cAccumAlphaBits; _glfwWin.auxBuffers = pfd.cAuxBuffers; _glfwWin.stereo = (pfd.dwFlags & PFD_STEREO) ? GL_TRUE : GL_FALSE; // If we don't have WGL_ARB_pixel_format then we can't have created a // multisampling context, so it's safe to hardcode zero here _glfwWin.samples = 0; } // Get refresh rate mode = _glfwWin.fullscreen ? _glfwWin.modeID : ENUM_CURRENT_SETTINGS; dm.dmSize = sizeof( DEVMODE ); if( EnumDisplaySettings( NULL, mode, &dm ) ) { _glfwWin.refreshRate = dm.dmDisplayFrequency; if( _glfwWin.refreshRate <= 1 ) { _glfwWin.refreshRate = 0; } } else { _glfwWin.refreshRate = 0; } } //======================================================================== // Poll for new window and input events //======================================================================== void _glfwPlatformPollEvents( void ) { MSG msg; int winclosed = GL_FALSE; // Flag: mouse was not moved (will be changed by _glfwGetNextEvent if // there was a mouse move event) _glfwInput.MouseMoved = GL_FALSE; if( _glfwWin.mouseLock ) { _glfwInput.OldMouseX = _glfwWin.width/2; _glfwInput.OldMouseY = _glfwWin.height/2; } else { _glfwInput.OldMouseX = _glfwInput.MousePosX; _glfwInput.OldMouseY = _glfwInput.MousePosY; } // Check for new window messages while( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) ) { switch( msg.message ) { // QUIT-message (from close window)? case WM_QUIT: winclosed = GL_TRUE; break; // Ok, send it to the window message handler default: DispatchMessage( &msg ); break; } } // LSHIFT/RSHIFT fixup (keys tend to "stick" without this fix) // This is the only async event handling in GLFW, but it solves some // nasty problems. // Caveat: Does not work under Win 9x/ME. if( _glfwLibrary.Sys.winVer >= _GLFW_WIN_NT4 ) { int lshift_down, rshift_down; // Get current state of left and right shift keys lshift_down = (GetAsyncKeyState( VK_LSHIFT ) >> 15) & 1; rshift_down = (GetAsyncKeyState( VK_RSHIFT ) >> 15) & 1; // See if this differs from our belief of what has happened // (we only have to check for lost key up events) if( !lshift_down && _glfwInput.Key[ GLFW_KEY_LSHIFT ] == 1 ) { _glfwInputKey( GLFW_KEY_LSHIFT, GLFW_RELEASE ); } if( !rshift_down && _glfwInput.Key[ GLFW_KEY_RSHIFT ] == 1 ) { _glfwInputKey( GLFW_KEY_RSHIFT, GLFW_RELEASE ); } } // Did we have mouse movement in locked cursor mode? if( _glfwInput.MouseMoved && _glfwWin.mouseLock ) { _glfwPlatformSetMouseCursorPos( _glfwWin.width / 2, _glfwWin.height / 2 ); } // Was there a window close request? if( winclosed && _glfwWin.windowCloseCallback ) { // Check if the program wants us to close the window winclosed = _glfwWin.windowCloseCallback(); } if( winclosed ) { glfwCloseWindow(); } } //======================================================================== // Wait for new window and input events //======================================================================== void _glfwPlatformWaitEvents( void ) { WaitMessage(); _glfwPlatformPollEvents(); } //======================================================================== // Hide mouse cursor (lock it) //======================================================================== void _glfwPlatformHideMouseCursor( void ) { RECT ClipWindowRect; ShowCursor( FALSE ); // Clip cursor to the window if( GetWindowRect( _glfwWin.window, &ClipWindowRect ) ) { ClipCursor( &ClipWindowRect ); } // Capture cursor to user window SetCapture( _glfwWin.window ); } //======================================================================== // Show mouse cursor (unlock it) //======================================================================== void _glfwPlatformShowMouseCursor( void ) { // Un-capture cursor ReleaseCapture(); // Release the cursor from the window ClipCursor( NULL ); ShowCursor( TRUE ); } //======================================================================== // Set physical mouse cursor position //======================================================================== void _glfwPlatformSetMouseCursorPos( int x, int y ) { POINT pos; // Convert client coordinates to screen coordinates pos.x = x; pos.y = y; ClientToScreen( _glfwWin.window, &pos ); SetCursorPos( pos.x, pos.y ); } GLFW-0.5.1.0/glfw/lib/x11/0000755000000000000000000000000012045371042012714 5ustar0000000000000000GLFW-0.5.1.0/glfw/lib/x11/platform.h0000644000000000000000000003723512045371042014723 0ustar0000000000000000//======================================================================== // GLFW - An OpenGL framework // Platform: X11/GLX // API version: 2.7 // WWW: http://www.glfw.org/ //------------------------------------------------------------------------ // Copyright (c) 2002-2006 Marcus Geelnard // Copyright (c) 2006-2010 Camilla Berglund // // This software is provided 'as-is', without any express or implied // warranty. In no event will the authors be held liable for any damages // arising from the use of this software. // // Permission is granted to anyone to use this software for any purpose, // including commercial applications, and to alter it and redistribute it // freely, subject to the following restrictions: // // 1. The origin of this software must not be misrepresented; you must not // claim that you wrote the original software. If you use this software // in a product, an acknowledgment in the product documentation would // be appreciated but is not required. // // 2. Altered source versions must be plainly marked as such, and must not // be misrepresented as being the original software. // // 3. This notice may not be removed or altered from any source // distribution. // //======================================================================== #ifndef _platform_h_ #define _platform_h_ // This is the X11 version of GLFW #define _GLFW_X11 // Include files #include #include #include #include #include #include #include #include #include "../../include/GL/glfw.h" // Do we have pthread support? #ifdef _GLFW_HAS_PTHREAD #include #include #endif // We need declarations for GLX version 1.3 or above even if the server doesn't // support version 1.3 #ifndef GLX_VERSION_1_3 #error "GLX header version 1.3 or above is required" #endif #if defined( _GLFW_HAS_XF86VIDMODE ) && defined( _GLFW_HAS_XRANDR ) #error "Xf86VidMode and RandR extensions cannot both be enabled" #endif // With XFree86, we can use the XF86VidMode extension #if defined( _GLFW_HAS_XF86VIDMODE ) #include #endif #if defined( _GLFW_HAS_XRANDR ) #include #endif // Do we have support for dlopen/dlsym? #if defined( _GLFW_HAS_DLOPEN ) #include #endif // We support two different ways for getting the number of processors in // the system: sysconf (POSIX) and sysctl (BSD?) #if defined( _GLFW_HAS_SYSCONF ) // Use a single constant for querying number of online processors using // the sysconf function (e.g. SGI defines _SC_NPROC_ONLN instead of // _SC_NPROCESSORS_ONLN) #ifndef _SC_NPROCESSORS_ONLN #ifdef _SC_NPROC_ONLN #define _SC_NPROCESSORS_ONLN _SC_NPROC_ONLN #else #error POSIX constant _SC_NPROCESSORS_ONLN not defined! #endif #endif // Macro for querying the number of processors #define _glfw_numprocessors(n) n=(int)sysconf(_SC_NPROCESSORS_ONLN) #elif defined( _GLFW_HAS_SYSCTL ) #include #include // Macro for querying the number of processors #define _glfw_numprocessors(n) { \ int mib[2], ncpu; \ size_t len = 1; \ mib[0] = CTL_HW; \ mib[1] = HW_NCPU; \ n = 1; \ if( sysctl( mib, 2, &ncpu, &len, NULL, 0 ) != -1 ) \ { \ if( len > 0 ) \ { \ n = ncpu; \ } \ } \ } #else // If neither sysconf nor sysctl is supported, assume single processor // system #define _glfw_numprocessors(n) n=1 #endif // Pointer length integer // One day, this will most likely move into glfw.h typedef intptr_t GLFWintptr; #ifndef GLX_SGI_swap_control // Function signature for GLX_SGI_swap_control typedef int ( * PFNGLXSWAPINTERVALSGIPROC) (int interval); #endif /*GLX_SGI_swap_control*/ #ifndef GLX_SGIX_fbconfig /* Type definitions for GLX_SGIX_fbconfig */ typedef XID GLXFBConfigIDSGIX; typedef struct __GLXFBConfigRec *GLXFBConfigSGIX; /* Function signatures for GLX_SGIX_fbconfig */ typedef int ( * PFNGLXGETFBCONFIGATTRIBSGIXPROC) (Display *dpy, GLXFBConfigSGIX config, int attribute, int *value); typedef GLXFBConfigSGIX * ( * PFNGLXCHOOSEFBCONFIGSGIXPROC) (Display *dpy, int screen, int *attrib_list, int *nelements); typedef GLXContext ( * PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC) (Display *dpy, GLXFBConfigSGIX config, int render_type, GLXContext share_list, Bool direct); typedef XVisualInfo * ( * PFNGLXGETVISUALFROMFBCONFIGSGIXPROC) (Display *dpy, GLXFBConfigSGIX config); /* Tokens for GLX_SGIX_fbconfig */ #define GLX_WINDOW_BIT_SGIX 0x00000001 #define GLX_PIXMAP_BIT_SGIX 0x00000002 #define GLX_RGBA_BIT_SGIX 0x00000001 #define GLX_COLOR_INDEX_BIT_SGIX 0x00000002 #define GLX_DRAWABLE_TYPE_SGIX 0x8010 #define GLX_RENDER_TYPE_SGIX 0x8011 #define GLX_X_RENDERABLE_SGIX 0x8012 #define GLX_FBCONFIG_ID_SGIX 0x8013 #define GLX_RGBA_TYPE_SGIX 0x8014 #define GLX_COLOR_INDEX_TYPE_SGIX 0x8015 #define GLX_SCREEN_EXT 0x800C #endif /*GLX_SGIX_fbconfig*/ #ifndef GLX_ARB_create_context /* Tokens for glXCreateContextAttribsARB attributes */ #define GLX_CONTEXT_MAJOR_VERSION_ARB 0x2091 #define GLX_CONTEXT_MINOR_VERSION_ARB 0x2092 #define GLX_CONTEXT_FLAGS_ARB 0x2094 /* Bits for WGL_CONTEXT_FLAGS_ARB */ #define GLX_CONTEXT_DEBUG_BIT_ARB 0x0001 #define GLX_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x0002 /* Prototype for glXCreateContextAttribs */ typedef GLXContext (*PFNGLXCREATECONTEXTATTRIBSARBPROC)( Display *display, GLXFBConfig config, GLXContext share_context, Bool direct, const int *attrib_list); #endif /*GLX_ARB_create_context*/ #ifndef GLX_ARB_create_context_profile /* Tokens for glXCreateContextAttribsARB attributes */ #define GLX_CONTEXT_PROFILE_MASK_ARB 0x9126 /* BIts for GLX_CONTEXT_PROFILE_MASK_ARB */ #define GLX_CONTEXT_CORE_PROFILE_BIT_ARB 0x00000001 #define GLX_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB 0x00000002 #endif /*GLX_ARB_create_context_profile*/ #ifndef GL_VERSION_3_0 typedef const GLubyte * (APIENTRY *PFNGLGETSTRINGIPROC) (GLenum, GLuint); #endif /*GL_VERSION_3_0*/ //======================================================================== // Global variables (GLFW internals) //======================================================================== //------------------------------------------------------------------------ // Window structure //------------------------------------------------------------------------ typedef struct _GLFWwin_struct _GLFWwin; struct _GLFWwin_struct { // ========= PLATFORM INDEPENDENT MANDATORY PART ========================= // User callback functions GLFWwindowsizefun windowSizeCallback; GLFWwindowclosefun windowCloseCallback; GLFWwindowrefreshfun windowRefreshCallback; GLFWmousebuttonfun mouseButtonCallback; GLFWmouseposfun mousePosCallback; GLFWmousewheelfun mouseWheelCallback; GLFWkeyfun keyCallback; GLFWcharfun charCallback; // User selected window settings int fullscreen; // Fullscreen flag int mouseLock; // Mouse-lock flag int autoPollEvents; // Auto polling flag int sysKeysDisabled; // System keys disabled flag int windowNoResize; // Resize- and maximize gadgets disabled flag int refreshRate; // Vertical monitor refresh rate // Window status & parameters int opened; // Flag telling if window is opened or not int active; // Application active flag int iconified; // Window iconified flag int width, height; // Window width and heigth int accelerated; // GL_TRUE if window is HW accelerated // Framebuffer attributes int redBits; int greenBits; int blueBits; int alphaBits; int depthBits; int stencilBits; int accumRedBits; int accumGreenBits; int accumBlueBits; int accumAlphaBits; int auxBuffers; int stereo; int samples; // OpenGL extensions and context attributes int has_GL_SGIS_generate_mipmap; int has_GL_ARB_texture_non_power_of_two; int glMajor, glMinor, glRevision; int glForward, glDebug, glProfile; PFNGLGETSTRINGIPROC GetStringi; // ========= PLATFORM SPECIFIC PART ====================================== // Platform specific window resources Colormap colormap; // Window colormap Window window; // Window Window root; // Root window for screen int screen; // Screen ID XVisualInfo *visual; // Visual for selected GLXFBConfig GLXFBConfigID fbconfigID; // ID of selected GLXFBConfig GLXContext context; // OpenGL rendering context Atom wmDeleteWindow; // WM_DELETE_WINDOW atom Atom wmPing; // _NET_WM_PING atom Atom wmState; // _NET_WM_STATE atom Atom wmStateFullscreen; // _NET_WM_STATE_FULLSCREEN atom Atom wmActiveWindow; // _NET_ACTIVE_WINDOW atom Cursor cursor; // Invisible cursor for hidden cursor // GLX extensions PFNGLXSWAPINTERVALSGIPROC SwapIntervalSGI; PFNGLXGETFBCONFIGATTRIBSGIXPROC GetFBConfigAttribSGIX; PFNGLXCHOOSEFBCONFIGSGIXPROC ChooseFBConfigSGIX; PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC CreateContextWithConfigSGIX; PFNGLXGETVISUALFROMFBCONFIGSGIXPROC GetVisualFromFBConfigSGIX; PFNGLXCREATECONTEXTATTRIBSARBPROC CreateContextAttribsARB; GLboolean has_GLX_SGIX_fbconfig; GLboolean has_GLX_SGI_swap_control; GLboolean has_GLX_ARB_multisample; GLboolean has_GLX_ARB_create_context; GLboolean has_GLX_ARB_create_context_profile; // Various platform specific internal variables GLboolean hasEWMH; // True if window manager supports EWMH GLboolean overrideRedirect; // True if window is OverrideRedirect GLboolean keyboardGrabbed; // True if keyboard is currently grabbed GLboolean pointerGrabbed; // True if pointer is currently grabbed GLboolean pointerHidden; // True if pointer is currently hidden // Screensaver data struct { int changed; int timeout; int interval; int blanking; int exposure; } Saver; // Fullscreen data struct { int modeChanged; #if defined( _GLFW_HAS_XF86VIDMODE ) XF86VidModeModeInfo oldMode; #endif #if defined( _GLFW_HAS_XRANDR ) SizeID oldSizeID; int oldWidth; int oldHeight; Rotation oldRotation; #endif } FS; }; GLFWGLOBAL _GLFWwin _glfwWin; //------------------------------------------------------------------------ // User input status (most of this should go in _GLFWwin) //------------------------------------------------------------------------ GLFWGLOBAL struct { // ========= PLATFORM INDEPENDENT MANDATORY PART ========================= // Mouse status int MousePosX, MousePosY; int WheelPos; char MouseButton[ GLFW_MOUSE_BUTTON_LAST+1 ]; // Keyboard status char Key[ GLFW_KEY_LAST+1 ]; int LastChar; // User selected settings int StickyKeys; int StickyMouseButtons; int KeyRepeat; // ========= PLATFORM SPECIFIC PART ====================================== // Platform specific internal variables int MouseMoved, CursorPosX, CursorPosY; } _glfwInput; //------------------------------------------------------------------------ // Library global data //------------------------------------------------------------------------ GLFWGLOBAL struct { // ========= PLATFORM INDEPENDENT MANDATORY PART ========================= // Window opening hints _GLFWhints hints; // Initial desktop mode GLFWvidmode desktopMode; // ========= PLATFORM SPECIFIC PART ====================================== Display *display; // Server-side GLX version int glxMajor, glxMinor; struct { int available; int eventBase; int errorBase; } XF86VidMode; struct { int available; int eventBase; int errorBase; } XRandR; // Timer data struct { GLboolean monotonic; double resolution; long long base; } Timer; #if defined(_GLFW_HAS_DLOPEN) struct { void *libGL; // dlopen handle for libGL.so } Libs; #endif } _glfwLibrary; //------------------------------------------------------------------------ // Thread record (one for each thread) //------------------------------------------------------------------------ typedef struct _GLFWthread_struct _GLFWthread; struct _GLFWthread_struct { // ========= PLATFORM INDEPENDENT MANDATORY PART ========================= // Pointer to previous and next threads in linked list _GLFWthread *Previous, *Next; // GLFW user side thread information GLFWthread ID; GLFWthreadfun Function; // ========= PLATFORM SPECIFIC PART ====================================== // System side thread information #ifdef _GLFW_HAS_PTHREAD pthread_t PosixID; #endif }; //------------------------------------------------------------------------ // General thread information //------------------------------------------------------------------------ GLFWGLOBAL struct { // ========= PLATFORM INDEPENDENT MANDATORY PART ========================= // Next thread ID to use (increments for every created thread) GLFWthread NextID; // First thread in linked list (always the main thread) _GLFWthread First; // ========= PLATFORM SPECIFIC PART ====================================== // Critical section lock #ifdef _GLFW_HAS_PTHREAD pthread_mutex_t CriticalSection; #endif } _glfwThrd; //------------------------------------------------------------------------ // Joystick information & state //------------------------------------------------------------------------ GLFWGLOBAL struct { int Present; int fd; int NumAxes; int NumButtons; float *Axis; unsigned char *Button; } _glfwJoy[ GLFW_JOYSTICK_LAST + 1 ]; //======================================================================== // Macros for encapsulating critical code sections (i.e. making parts // of GLFW thread safe) //======================================================================== // Thread list management #ifdef _GLFW_HAS_PTHREAD #define ENTER_THREAD_CRITICAL_SECTION \ pthread_mutex_lock( &_glfwThrd.CriticalSection ); #define LEAVE_THREAD_CRITICAL_SECTION \ pthread_mutex_unlock( &_glfwThrd.CriticalSection ); #else #define ENTER_THREAD_CRITICAL_SECTION #define LEAVE_THREAD_CRITICAL_SECTION #endif //======================================================================== // Prototypes for platform specific internal functions //======================================================================== // Time void _glfwInitTimer( void ); // Fullscreen support int _glfwGetClosestVideoMode( int screen, int *width, int *height, int *rate ); void _glfwSetVideoModeMODE( int screen, int mode, int rate ); void _glfwSetVideoMode( int screen, int *width, int *height, int *rate ); void _glfwRestoreVideoMode( void ); // Joystick input void _glfwInitJoysticks( void ); void _glfwTerminateJoysticks( void ); // Unicode support long _glfwKeySym2Unicode( KeySym keysym ); #endif // _platform_h_ GLFW-0.5.1.0/glfw/lib/x11/x11_enable.c0000644000000000000000000000453712045371042015010 0ustar0000000000000000//======================================================================== // GLFW - An OpenGL framework // Platform: X11 (Unix) // API version: 2.7 // WWW: http://www.glfw.org/ //------------------------------------------------------------------------ // Copyright (c) 2002-2006 Marcus Geelnard // Copyright (c) 2006-2010 Camilla Berglund // // This software is provided 'as-is', without any express or implied // warranty. In no event will the authors be held liable for any damages // arising from the use of this software. // // Permission is granted to anyone to use this software for any purpose, // including commercial applications, and to alter it and redistribute it // freely, subject to the following restrictions: // // 1. The origin of this software must not be misrepresented; you must not // claim that you wrote the original software. If you use this software // in a product, an acknowledgment in the product documentation would // be appreciated but is not required. // // 2. Altered source versions must be plainly marked as such, and must not // be misrepresented as being the original software. // // 3. This notice may not be removed or altered from any source // distribution. // //======================================================================== #include "internal.h" //************************************************************************ //**** Platform implementation functions **** //************************************************************************ //======================================================================== // Enable system keys //======================================================================== void _glfwPlatformEnableSystemKeys( void ) { if( _glfwWin.keyboardGrabbed ) { XUngrabKeyboard( _glfwLibrary.display, CurrentTime ); _glfwWin.keyboardGrabbed = GL_FALSE; } } //======================================================================== // Disable system keys //======================================================================== void _glfwPlatformDisableSystemKeys( void ) { if( XGrabKeyboard( _glfwLibrary.display, _glfwWin.window, True, GrabModeAsync, GrabModeAsync, CurrentTime ) == GrabSuccess ) { _glfwWin.keyboardGrabbed = GL_TRUE; } } GLFW-0.5.1.0/glfw/lib/x11/x11_fullscreen.c0000644000000000000000000004134212045371042015717 0ustar0000000000000000//======================================================================== // GLFW - An OpenGL framework // Platform: X11/GLX // API version: 2.7 // WWW: http://www.glfw.org/ //------------------------------------------------------------------------ // Copyright (c) 2002-2006 Marcus Geelnard // Copyright (c) 2006-2010 Camilla Berglund // // This software is provided 'as-is', without any express or implied // warranty. In no event will the authors be held liable for any damages // arising from the use of this software. // // Permission is granted to anyone to use this software for any purpose, // including commercial applications, and to alter it and redistribute it // freely, subject to the following restrictions: // // 1. The origin of this software must not be misrepresented; you must not // claim that you wrote the original software. If you use this software // in a product, an acknowledgment in the product documentation would // be appreciated but is not required. // // 2. Altered source versions must be plainly marked as such, and must not // be misrepresented as being the original software. // // 3. This notice may not be removed or altered from any source // distribution. // //======================================================================== #include "internal.h" #include //************************************************************************ //**** GLFW internal functions **** //************************************************************************ //======================================================================== // Convert BPP to RGB bits (based on "best guess") //======================================================================== static void BPP2RGB( int bpp, int *r, int *g, int *b ) { int delta; // Special case: BPP = 32 (I don't think this is necessary for X11??) if( bpp == 32 ) bpp = 24; // Convert "bits per pixel" to red, green & blue sizes *r = *g = *b = bpp / 3; delta = bpp - (*r * 3); if( delta >= 1 ) { *g = *g + 1; } if( delta == 2 ) { *r = *r + 1; } } //======================================================================== // Finds the video mode closest in size to the specified desired size //======================================================================== int _glfwGetClosestVideoMode( int screen, int *width, int *height, int *rate ) { #if defined( _GLFW_HAS_XRANDR ) int i, match, bestmatch; int sizecount, bestsize; int ratecount, bestrate; short *ratelist; XRRScreenConfiguration *sc; XRRScreenSize *sizelist; if( _glfwLibrary.XRandR.available ) { sc = XRRGetScreenInfo( _glfwLibrary.display, RootWindow( _glfwLibrary.display, screen ) ); sizelist = XRRConfigSizes( sc, &sizecount ); // Find the best matching mode bestsize = -1; bestmatch = INT_MAX; for( i = 0; i < sizecount; i++ ) { match = (*width - sizelist[i].width) * (*width - sizelist[i].width) + (*height - sizelist[i].height) * (*height - sizelist[i].height); if( match < bestmatch ) { bestmatch = match; bestsize = i; } } if( bestsize != -1 ) { // Report width & height of best matching mode *width = sizelist[bestsize].width; *height = sizelist[bestsize].height; if( *rate > 0 ) { ratelist = XRRConfigRates( sc, bestsize, &ratecount ); bestrate = -1; bestmatch = INT_MAX; for( i = 0; i < ratecount; i++ ) { match = abs( ratelist[i] - *rate ); if( match < bestmatch ) { bestmatch = match; bestrate = ratelist[i]; } } if( bestrate != -1 ) { *rate = bestrate; } } } // Free modelist XRRFreeScreenConfigInfo( sc ); if( bestsize != -1 ) { return bestsize; } } #elif defined( _GLFW_HAS_XF86VIDMODE ) XF86VidModeModeInfo **modelist; int modecount, i, bestmode, bestmatch, match; // Use the XF86VidMode extension to control video resolution if( _glfwLibrary.XF86VidMode.available ) { // Get a list of all available display modes XF86VidModeGetAllModeLines( _glfwLibrary.display, screen, &modecount, &modelist ); // Find the best matching mode bestmode = -1; bestmatch = INT_MAX; for( i = 0; i < modecount; i++ ) { match = (*width - modelist[i]->hdisplay) * (*width - modelist[i]->hdisplay) + (*height - modelist[i]->vdisplay) * (*height - modelist[i]->vdisplay); if( match < bestmatch ) { bestmatch = match; bestmode = i; } } if( bestmode != -1 ) { // Report width & height of best matching mode *width = modelist[ bestmode ]->hdisplay; *height = modelist[ bestmode ]->vdisplay; } // Free modelist XFree( modelist ); if( bestmode != -1 ) { return bestmode; } } #endif // Default: Simply use the screen resolution *width = DisplayWidth( _glfwLibrary.display, screen ); *height = DisplayHeight( _glfwLibrary.display, screen ); return 0; } //======================================================================== // Change the current video mode //======================================================================== void _glfwSetVideoModeMODE( int screen, int mode, int rate ) { #if defined( _GLFW_HAS_XRANDR ) XRRScreenConfiguration *sc; Window root; if( _glfwLibrary.XRandR.available ) { root = RootWindow( _glfwLibrary.display, screen ); sc = XRRGetScreenInfo( _glfwLibrary.display, root ); // Remember old size and flag that we have changed the mode if( !_glfwWin.FS.modeChanged ) { _glfwWin.FS.oldSizeID = XRRConfigCurrentConfiguration( sc, &_glfwWin.FS.oldRotation ); _glfwWin.FS.oldWidth = DisplayWidth( _glfwLibrary.display, screen ); _glfwWin.FS.oldHeight = DisplayHeight( _glfwLibrary.display, screen ); _glfwWin.FS.modeChanged = GL_TRUE; } if( rate > 0 ) { // Set desired configuration XRRSetScreenConfigAndRate( _glfwLibrary.display, sc, root, mode, RR_Rotate_0, (short) rate, CurrentTime ); } else { // Set desired configuration XRRSetScreenConfig( _glfwLibrary.display, sc, root, mode, RR_Rotate_0, CurrentTime ); } XRRFreeScreenConfigInfo( sc ); } #elif defined( _GLFW_HAS_XF86VIDMODE ) XF86VidModeModeInfo **modelist; int modecount; // Use the XF86VidMode extension to control video resolution if( _glfwLibrary.XF86VidMode.available ) { // Get a list of all available display modes XF86VidModeGetAllModeLines( _glfwLibrary.display, screen, &modecount, &modelist ); // Unlock mode switch if necessary if( _glfwWin.FS.modeChanged ) { XF86VidModeLockModeSwitch( _glfwLibrary.display, screen, 0 ); } // Change the video mode to the desired mode XF86VidModeSwitchToMode( _glfwLibrary.display, screen, modelist[ mode ] ); // Set viewport to upper left corner (where our window will be) XF86VidModeSetViewPort( _glfwLibrary.display, screen, 0, 0 ); // Lock mode switch XF86VidModeLockModeSwitch( _glfwLibrary.display, screen, 1 ); // Remember old mode and flag that we have changed the mode if( !_glfwWin.FS.modeChanged ) { _glfwWin.FS.oldMode = *modelist[ 0 ]; _glfwWin.FS.modeChanged = GL_TRUE; } // Free mode list XFree( modelist ); } #endif } //======================================================================== // Change the current video mode //======================================================================== void _glfwSetVideoMode( int screen, int *width, int *height, int *rate ) { int bestmode; // Find a best match mode bestmode = _glfwGetClosestVideoMode( screen, width, height, rate ); // Change mode _glfwSetVideoModeMODE( screen, bestmode, *rate ); } //======================================================================== // Restore the previously saved (original) video mode //======================================================================== void _glfwRestoreVideoMode( void ) { if( _glfwWin.FS.modeChanged ) { #if defined( _GLFW_HAS_XRANDR ) if( _glfwLibrary.XRandR.available ) { XRRScreenConfiguration *sc; sc = XRRGetScreenInfo( _glfwLibrary.display, _glfwWin.root ); XRRSetScreenConfig( _glfwLibrary.display, sc, _glfwWin.root, _glfwWin.FS.oldSizeID, _glfwWin.FS.oldRotation, CurrentTime ); XRRFreeScreenConfigInfo( sc ); } #elif defined( _GLFW_HAS_XF86VIDMODE ) if( _glfwLibrary.XF86VidMode.available ) { // Unlock mode switch XF86VidModeLockModeSwitch( _glfwLibrary.display, _glfwWin.screen, 0 ); // Change the video mode back to the old mode XF86VidModeSwitchToMode( _glfwLibrary.display, _glfwWin.screen, &_glfwWin.FS.oldMode ); } #endif _glfwWin.FS.modeChanged = GL_FALSE; } } //************************************************************************ //**** Platform implementation functions **** //************************************************************************ struct _glfwResolution { int width; int height; }; //======================================================================== // List available video modes //======================================================================== int _glfwPlatformGetVideoModes( GLFWvidmode *list, int maxcount ) { int count, k, l, r, g, b, rgba, gl; int depth, screen; Display *dpy; XVisualInfo *vislist, dummy; int viscount, rgbcount, rescount; int *rgbarray; struct _glfwResolution *resarray; // Get display and screen dpy = _glfwLibrary.display; screen = DefaultScreen( dpy ); // Get list of visuals vislist = XGetVisualInfo( dpy, 0, &dummy, &viscount ); if( vislist == NULL ) { return 0; } rgbarray = (int*) malloc( sizeof(int) * viscount ); rgbcount = 0; // Build RGB array for( k = 0; k < viscount; k++ ) { // Does the visual support OpenGL & true color? glXGetConfig( dpy, &vislist[k], GLX_USE_GL, &gl ); glXGetConfig( dpy, &vislist[k], GLX_RGBA, &rgba ); if( gl && rgba ) { // Get color depth for this visual depth = vislist[k].depth; // Convert to RGB BPP2RGB( depth, &r, &g, &b ); depth = (r<<16) | (g<<8) | b; // Is this mode unique? for( l = 0; l < rgbcount; l++ ) { if( depth == rgbarray[ l ] ) { break; } } if( l >= rgbcount ) { rgbarray[ rgbcount ] = depth; rgbcount++; } } } rescount = 0; resarray = NULL; // Build resolution array #if defined( _GLFW_HAS_XRANDR ) if( _glfwLibrary.XRandR.available ) { XRRScreenConfiguration *sc; XRRScreenSize *sizelist; int sizecount; sc = XRRGetScreenInfo( dpy, RootWindow( dpy, screen ) ); sizelist = XRRConfigSizes( sc, &sizecount ); resarray = (struct _glfwResolution*) malloc( sizeof(struct _glfwResolution) * sizecount ); for( k = 0; k < sizecount; k++ ) { resarray[ rescount ].width = sizelist[ k ].width; resarray[ rescount ].height = sizelist[ k ].height; rescount++; } XRRFreeScreenConfigInfo( sc ); } #elif defined( _GLFW_HAS_XF86VIDMODE ) if( _glfwLibrary.XF86VidMode.available ) { XF86VidModeModeInfo **modelist; int modecount, width, height; XF86VidModeGetAllModeLines( dpy, screen, &modecount, &modelist ); resarray = (struct _glfwResolution*) malloc( sizeof(struct _glfwResolution) * modecount ); for( k = 0; k < modecount; k++ ) { width = modelist[ k ]->hdisplay; height = modelist[ k ]->vdisplay; // Is this mode unique? for( l = 0; l < rescount; l++ ) { if( width == resarray[ l ].width && height == resarray[ l ].height ) { break; } } if( l >= rescount ) { resarray[ rescount ].width = width; resarray[ rescount ].height = height; rescount++; } } XFree( modelist ); } #endif if( !resarray ) { rescount = 1; resarray = (struct _glfwResolution*) malloc( sizeof(struct _glfwResolution) * rescount ); resarray[ 0 ].width = DisplayWidth( dpy, screen ); resarray[ 0 ].height = DisplayHeight( dpy, screen ); } // Build permutations of colors and resolutions count = 0; for( k = 0; k < rgbcount && count < maxcount; k++ ) { for( l = 0; l < rescount && count < maxcount; l++ ) { list[count].Width = resarray[ l ].width; list[count].Height = resarray[ l ].height; list[count].RedBits = (rgbarray[ k ] >> 16) & 255; list[count].GreenBits = (rgbarray[ k ] >> 8) & 255; list[count].BlueBits = rgbarray[ k ] & 255; count++; } } // Free visuals list XFree( vislist ); free( resarray ); free( rgbarray ); return count; } //======================================================================== // Get the desktop video mode //======================================================================== void _glfwPlatformGetDesktopMode( GLFWvidmode *mode ) { Display *dpy; int bpp, screen; // Get display and screen dpy = _glfwLibrary.display; screen = DefaultScreen( dpy ); // Get display depth bpp = DefaultDepth( dpy, screen ); // Convert BPP to RGB bits BPP2RGB( bpp, &mode->RedBits, &mode->GreenBits, &mode->BlueBits ); #if defined( _GLFW_HAS_XRANDR ) if( _glfwLibrary.XRandR.available ) { if( _glfwWin.FS.modeChanged ) { mode->Width = _glfwWin.FS.oldWidth; mode->Height = _glfwWin.FS.oldHeight; return; } } #elif defined( _GLFW_HAS_XF86VIDMODE ) if( _glfwLibrary.XF86VidMode.available ) { XF86VidModeModeInfo **modelist; int modecount; if( _glfwWin.FS.modeChanged ) { // The old (desktop) mode is stored in _glfwWin.FS.oldMode mode->Width = _glfwWin.FS.oldMode.hdisplay; mode->Height = _glfwWin.FS.oldMode.vdisplay; } else { // Use the XF86VidMode extension to get list of video modes XF86VidModeGetAllModeLines( dpy, screen, &modecount, &modelist ); // The first mode in the list is the current (desktio) mode mode->Width = modelist[ 0 ]->hdisplay; mode->Height = modelist[ 0 ]->vdisplay; // Free list XFree( modelist ); } return; } #endif // Get current display width and height mode->Width = DisplayWidth( dpy, screen ); mode->Height = DisplayHeight( dpy, screen ); } GLFW-0.5.1.0/glfw/lib/x11/x11_glext.c0000644000000000000000000000652512045371042014704 0ustar0000000000000000//======================================================================== // GLFW - An OpenGL framework // Platform: X11/GLX // API version: 2.7 // WWW: http://www.glfw.org/ //------------------------------------------------------------------------ // Copyright (c) 2002-2006 Marcus Geelnard // Copyright (c) 2006-2010 Camilla Berglund // // This software is provided 'as-is', without any express or implied // warranty. In no event will the authors be held liable for any damages // arising from the use of this software. // // Permission is granted to anyone to use this software for any purpose, // including commercial applications, and to alter it and redistribute it // freely, subject to the following restrictions: // // 1. The origin of this software must not be misrepresented; you must not // claim that you wrote the original software. If you use this software // in a product, an acknowledgment in the product documentation would // be appreciated but is not required. // // 2. Altered source versions must be plainly marked as such, and must not // be misrepresented as being the original software. // // 3. This notice may not be removed or altered from any source // distribution. // //======================================================================== #include "internal.h" void (*glXGetProcAddress(const GLubyte *procName))(); void (*glXGetProcAddressARB(const GLubyte *procName))(); void (*glXGetProcAddressEXT(const GLubyte *procName))(); // We support four different ways for getting addresses for GL/GLX // extension functions: glXGetProcAddress, glXGetProcAddressARB, // glXGetProcAddressEXT, and dlsym #if defined( _GLFW_HAS_GLXGETPROCADDRESSARB ) #define _glfw_glXGetProcAddress(x) glXGetProcAddressARB(x) #elif defined( _GLFW_HAS_GLXGETPROCADDRESS ) #define _glfw_glXGetProcAddress(x) glXGetProcAddress(x) #elif defined( _GLFW_HAS_GLXGETPROCADDRESSEXT ) #define _glfw_glXGetProcAddress(x) glXGetProcAddressEXT(x) #elif defined( _GLFW_HAS_DLOPEN ) #define _glfw_glXGetProcAddress(x) dlsym(_glfwLibrary.Libs.libGL,x) #else #define _glfw_glXGetProcAddress(x) NULL #endif //************************************************************************ //**** Platform implementation functions **** //************************************************************************ //======================================================================== // Check if an OpenGL extension is available at runtime //======================================================================== int _glfwPlatformExtensionSupported( const char *extension ) { const GLubyte *extensions; // Get list of GLX extensions extensions = (const GLubyte*) glXQueryExtensionsString( _glfwLibrary.display, _glfwWin.screen ); if( extensions != NULL ) { if( _glfwStringInExtensionString( extension, extensions ) ) { return GL_TRUE; } } return GL_FALSE; } //======================================================================== // Get the function pointer to an OpenGL function //======================================================================== void * _glfwPlatformGetProcAddress( const char *procname ) { return (void *) _glfw_glXGetProcAddress( (const GLubyte *) procname ); } GLFW-0.5.1.0/glfw/lib/x11/x11_init.c0000644000000000000000000001757212045371042014530 0ustar0000000000000000//======================================================================== // GLFW - An OpenGL framework // Platform: X11/GLX // API version: 2.7 // WWW: http://www.glfw.org/ //------------------------------------------------------------------------ // Copyright (c) 2002-2006 Marcus Geelnard // Copyright (c) 2006-2010 Camilla Berglund // // This software is provided 'as-is', without any express or implied // warranty. In no event will the authors be held liable for any damages // arising from the use of this software. // // Permission is granted to anyone to use this software for any purpose, // including commercial applications, and to alter it and redistribute it // freely, subject to the following restrictions: // // 1. The origin of this software must not be misrepresented; you must not // claim that you wrote the original software. If you use this software // in a product, an acknowledgment in the product documentation would // be appreciated but is not required. // // 2. Altered source versions must be plainly marked as such, and must not // be misrepresented as being the original software. // // 3. This notice may not be removed or altered from any source // distribution. // //======================================================================== #include "internal.h" //************************************************************************ //**** GLFW internal functions **** //************************************************************************ //======================================================================== // Initialize GLFW thread package //======================================================================== static void initThreads( void ) { // Initialize critical section handle #ifdef _GLFW_HAS_PTHREAD (void) pthread_mutex_init( &_glfwThrd.CriticalSection, NULL ); #endif // The first thread (the main thread) has ID 0 _glfwThrd.NextID = 0; // Fill out information about the main thread (this thread) _glfwThrd.First.ID = _glfwThrd.NextID++; _glfwThrd.First.Function = NULL; _glfwThrd.First.Previous = NULL; _glfwThrd.First.Next = NULL; #ifdef _GLFW_HAS_PTHREAD _glfwThrd.First.PosixID = pthread_self(); #endif } //======================================================================== // Terminate GLFW thread package //======================================================================== static void terminateThreads( void ) { #ifdef _GLFW_HAS_PTHREAD _GLFWthread *t, *t_next; // Enter critical section ENTER_THREAD_CRITICAL_SECTION // Kill all threads (NOTE: THE USER SHOULD WAIT FOR ALL THREADS TO // DIE, _BEFORE_ CALLING glfwTerminate()!!!) t = _glfwThrd.First.Next; while( t != NULL ) { // Get pointer to next thread t_next = t->Next; // Simply murder the process, no mercy! pthread_kill( t->PosixID, SIGKILL ); // Free memory allocated for this thread free( (void *) t ); // Select next thread in list t = t_next; } // Leave critical section LEAVE_THREAD_CRITICAL_SECTION // Delete critical section handle pthread_mutex_destroy( &_glfwThrd.CriticalSection ); #endif // _GLFW_HAS_PTHREAD } //======================================================================== // Dynamically load libraries //======================================================================== static void initLibraries( void ) { #ifdef _GLFW_DLOPEN_LIBGL int i; char *libGL_names[ ] = { "libGL.so", "libGL.so.1", "/usr/lib/libGL.so", "/usr/lib/libGL.so.1", NULL }; _glfwLibrary.Libs.libGL = NULL; for( i = 0; !libGL_names[ i ] != NULL; i ++ ) { _glfwLibrary.Libs.libGL = dlopen( libGL_names[ i ], RTLD_LAZY | RTLD_GLOBAL ); if( _glfwLibrary.Libs.libGL ) break; } #endif } //======================================================================== // Terminate GLFW when exiting application //======================================================================== static void glfw_atexit( void ) { glfwTerminate(); } //======================================================================== // Initialize X11 display //======================================================================== static int initDisplay( void ) { // Open display _glfwLibrary.display = XOpenDisplay( 0 ); if( !_glfwLibrary.display ) { fprintf(stderr, "Failed to open X display\n"); return GL_FALSE; } // Check for XF86VidMode extension #ifdef _GLFW_HAS_XF86VIDMODE _glfwLibrary.XF86VidMode.available = XF86VidModeQueryExtension( _glfwLibrary.display, &_glfwLibrary.XF86VidMode.eventBase, &_glfwLibrary.XF86VidMode.errorBase); #else _glfwLibrary.XF86VidMode.available = 0; #endif // Check for XRandR extension #ifdef _GLFW_HAS_XRANDR _glfwLibrary.XRandR.available = XRRQueryExtension( _glfwLibrary.display, &_glfwLibrary.XRandR.eventBase, &_glfwLibrary.XRandR.errorBase ); #else _glfwLibrary.XRandR.available = 0; #endif // Fullscreen & screen saver settings // Check if GLX is supported on this display if( !glXQueryExtension( _glfwLibrary.display, NULL, NULL ) ) { fprintf(stderr, "GLX not supported\n"); return GL_FALSE; } // Retrieve GLX version if( !glXQueryVersion( _glfwLibrary.display, &_glfwLibrary.glxMajor, &_glfwLibrary.glxMinor ) ) { fprintf(stderr, "Unable to query GLX version\n"); return GL_FALSE; } return GL_TRUE; } //======================================================================== // Terminate X11 display //======================================================================== static void terminateDisplay( void ) { // Open display if( _glfwLibrary.display ) { XCloseDisplay( _glfwLibrary.display ); _glfwLibrary.display = NULL; } } //************************************************************************ //**** Platform implementation functions **** //************************************************************************ //======================================================================== // Initialize various GLFW state //======================================================================== int _glfwPlatformInit( void ) { // Initialize display if( !initDisplay() ) { return GL_FALSE; } // Initialize thread package initThreads(); // Try to load libGL.so if necessary initLibraries(); _glfwPlatformGetDesktopMode( &_glfwLibrary.desktopMode ); // Install atexit() routine atexit( glfw_atexit ); // Initialize joysticks _glfwInitJoysticks(); // Start the timer _glfwInitTimer(); return GL_TRUE; } //======================================================================== // Close window and kill all threads //======================================================================== int _glfwPlatformTerminate( void ) { #ifdef _GLFW_HAS_PTHREAD // Only the main thread is allowed to do this... if( pthread_self() != _glfwThrd.First.PosixID ) { return GL_FALSE; } #endif // _GLFW_HAS_PTHREAD // Close OpenGL window glfwCloseWindow(); // Kill thread package terminateThreads(); // Terminate display terminateDisplay(); // Terminate joysticks _glfwTerminateJoysticks(); // Unload libGL.so if necessary #ifdef _GLFW_DLOPEN_LIBGL if( _glfwLibrary.Libs.libGL != NULL ) { dlclose( _glfwLibrary.Libs.libGL ); _glfwLibrary.Libs.libGL = NULL; } #endif return GL_TRUE; } GLFW-0.5.1.0/glfw/lib/x11/x11_joystick.c0000644000000000000000000002572612045371042015424 0ustar0000000000000000//======================================================================== // GLFW - An OpenGL framework // Platform: X11/GLX // API version: 2.7 // WWW: http://www.glfw.org/ //------------------------------------------------------------------------ // Copyright (c) 2002-2006 Marcus Geelnard // Copyright (c) 2006-2010 Camilla Berglund // // This software is provided 'as-is', without any express or implied // warranty. In no event will the authors be held liable for any damages // arising from the use of this software. // // Permission is granted to anyone to use this software for any purpose, // including commercial applications, and to alter it and redistribute it // freely, subject to the following restrictions: // // 1. The origin of this software must not be misrepresented; you must not // claim that you wrote the original software. If you use this software // in a product, an acknowledgment in the product documentation would // be appreciated but is not required. // // 2. Altered source versions must be plainly marked as such, and must not // be misrepresented as being the original software. // // 3. This notice may not be removed or altered from any source // distribution. // //======================================================================== #include "internal.h" //======================================================================== // Note: Only Linux joystick input is supported at the moment. Other // systems will behave as if there are no joysticks connected. //======================================================================== //************************************************************************ //**** GLFW internal functions **** //************************************************************************ #ifdef _GLFW_USE_LINUX_JOYSTICKS //------------------------------------------------------------------------ // Here are the Linux joystick driver v1.x interface definitions that we // use (we do not want to rely on ): //------------------------------------------------------------------------ #include #include #include // Joystick event types #define JS_EVENT_BUTTON 0x01 /* button pressed/released */ #define JS_EVENT_AXIS 0x02 /* joystick moved */ #define JS_EVENT_INIT 0x80 /* initial state of device */ // Joystick event structure struct js_event { unsigned int time; /* (u32) event timestamp in milliseconds */ signed short value; /* (s16) value */ unsigned char type; /* (u8) event type */ unsigned char number; /* (u8) axis/button number */ }; // Joystick IOCTL commands #define JSIOCGVERSION _IOR('j', 0x01, int) /* get driver version (u32) */ #define JSIOCGAXES _IOR('j', 0x11, char) /* get number of axes (u8) */ #define JSIOCGBUTTONS _IOR('j', 0x12, char) /* get number of buttons (u8) */ #endif // _GLFW_USE_LINUX_JOYSTICKS //======================================================================== // Initialize joystick interface //======================================================================== void _glfwInitJoysticks( void ) { #ifdef _GLFW_USE_LINUX_JOYSTICKS int k, n, fd, joy_count; char *joy_base_name, joy_dev_name[ 20 ]; int driver_version = 0x000800; char ret_data; #endif // _GLFW_USE_LINUX_JOYSTICKS int i; // Start by saying that there are no sticks for( i = 0; i <= GLFW_JOYSTICK_LAST; ++ i ) { _glfwJoy[ i ].Present = GL_FALSE; } #ifdef _GLFW_USE_LINUX_JOYSTICKS // Try to open joysticks (nonblocking) joy_count = 0; for( k = 0; k <= 1 && joy_count <= GLFW_JOYSTICK_LAST; ++ k ) { // Pick joystick base name switch( k ) { case 0: joy_base_name = "/dev/input/js"; // USB sticks break; case 1: joy_base_name = "/dev/js"; // "Legacy" sticks break; default: continue; // (should never happen) } // Try to open a few of these sticks for( i = 0; i <= 50 && joy_count <= GLFW_JOYSTICK_LAST; ++ i ) { sprintf( joy_dev_name, "%s%d", joy_base_name, i ); fd = open( joy_dev_name, O_NONBLOCK ); if( fd != -1 ) { // Remember fd _glfwJoy[ joy_count ].fd = fd; // Check that the joystick driver version is 1.0+ ioctl( fd, JSIOCGVERSION, &driver_version ); if( driver_version < 0x010000 ) { // It's an old 0.x interface (we don't support it) close( fd ); continue; } // Get number of joystick axes ioctl( fd, JSIOCGAXES, &ret_data ); _glfwJoy[ joy_count ].NumAxes = (int) ret_data; // Get number of joystick buttons ioctl( fd, JSIOCGBUTTONS, &ret_data ); _glfwJoy[ joy_count ].NumButtons = (int) ret_data; // Allocate memory for joystick state _glfwJoy[ joy_count ].Axis = (float *) malloc( sizeof(float) * _glfwJoy[ joy_count ].NumAxes ); if( _glfwJoy[ joy_count ].Axis == NULL ) { close( fd ); continue; } _glfwJoy[ joy_count ].Button = (unsigned char *) malloc( sizeof(char) * _glfwJoy[ joy_count ].NumButtons ); if( _glfwJoy[ joy_count ].Button == NULL ) { free( _glfwJoy[ joy_count ].Axis ); close( fd ); continue; } // Clear joystick state for( n = 0; n < _glfwJoy[ joy_count ].NumAxes; ++ n ) { _glfwJoy[ joy_count ].Axis[ n ] = 0.0f; } for( n = 0; n < _glfwJoy[ joy_count ].NumButtons; ++ n ) { _glfwJoy[ joy_count ].Button[ n ] = GLFW_RELEASE; } // The joystick is supported and connected _glfwJoy[ joy_count ].Present = GL_TRUE; joy_count ++; } } } #endif // _GLFW_USE_LINUX_JOYSTICKS } //======================================================================== // Close all opened joystick handles //======================================================================== void _glfwTerminateJoysticks( void ) { #ifdef _GLFW_USE_LINUX_JOYSTICKS int i; // Close any opened joysticks for( i = 0; i <= GLFW_JOYSTICK_LAST; ++ i ) { if( _glfwJoy[ i ].Present ) { close( _glfwJoy[ i ].fd ); free( _glfwJoy[ i ].Axis ); free( _glfwJoy[ i ].Button ); _glfwJoy[ i ].Present = GL_FALSE; } } #endif // _GLFW_USE_LINUX_JOYSTICKS } //======================================================================== // Empty joystick event queue //======================================================================== static void pollJoystickEvents( void ) { #ifdef _GLFW_USE_LINUX_JOYSTICKS struct js_event e; int i; // Get joystick events for all GLFW joysticks for( i = 0; i <= GLFW_JOYSTICK_LAST; ++ i ) { // Is the stick present? if( _glfwJoy[ i ].Present ) { // Read all queued events (non-blocking) while( read(_glfwJoy[i].fd, &e, sizeof(struct js_event)) > 0 ) { // We don't care if it's an init event or not e.type &= ~JS_EVENT_INIT; // Check event type switch( e.type ) { case JS_EVENT_AXIS: _glfwJoy[ i ].Axis[ e.number ] = (float) e.value / 32767.0f; // We need to change the sign for the Y axes, so that // positive = up/forward, according to the GLFW spec. if( e.number & 1 ) { _glfwJoy[ i ].Axis[ e.number ] = -_glfwJoy[ i ].Axis[ e.number ]; } break; case JS_EVENT_BUTTON: _glfwJoy[ i ].Button[ e.number ] = e.value ? GLFW_PRESS : GLFW_RELEASE; break; default: break; } } } } #endif // _GLFW_USE_LINUX_JOYSTICKS } //************************************************************************ //**** Platform implementation functions **** //************************************************************************ //======================================================================== // Determine joystick capabilities //======================================================================== int _glfwPlatformGetJoystickParam( int joy, int param ) { // Is joystick present? if( !_glfwJoy[ joy ].Present ) { return 0; } switch( param ) { case GLFW_PRESENT: return GL_TRUE; case GLFW_AXES: return _glfwJoy[ joy ].NumAxes; case GLFW_BUTTONS: return _glfwJoy[ joy ].NumButtons; default: break; } return 0; } //======================================================================== // Get joystick axis positions //======================================================================== int _glfwPlatformGetJoystickPos( int joy, float *pos, int numaxes ) { int i; // Is joystick present? if( !_glfwJoy[ joy ].Present ) { return 0; } // Update joystick state pollJoystickEvents(); // Does the joystick support less axes than requested? if( _glfwJoy[ joy ].NumAxes < numaxes ) { numaxes = _glfwJoy[ joy ].NumAxes; } // Copy axis positions from internal state for( i = 0; i < numaxes; ++ i ) { pos[ i ] = _glfwJoy[ joy ].Axis[ i ]; } return numaxes; } //======================================================================== // Get joystick button states //======================================================================== int _glfwPlatformGetJoystickButtons( int joy, unsigned char *buttons, int numbuttons ) { int i; // Is joystick present? if( !_glfwJoy[ joy ].Present ) { return 0; } // Update joystick state pollJoystickEvents(); // Does the joystick support less buttons than requested? if( _glfwJoy[ joy ].NumButtons < numbuttons ) { numbuttons = _glfwJoy[ joy ].NumButtons; } // Copy button states from internal state for( i = 0; i < numbuttons; ++ i ) { buttons[ i ] = _glfwJoy[ joy ].Button[ i ]; } return numbuttons; } GLFW-0.5.1.0/glfw/lib/x11/x11_keysym2unicode.c0000644000000000000000000005171212045371042016531 0ustar0000000000000000//======================================================================== // GLFW - An OpenGL framework // Platform: X11/GLX // API version: 2.7 // WWW: http://www.glfw.org/ //------------------------------------------------------------------------ // Copyright (c) 2002-2006 Marcus Geelnard // Copyright (c) 2006-2010 Camilla Berglund // // This software is provided 'as-is', without any express or implied // warranty. In no event will the authors be held liable for any damages // arising from the use of this software. // // Permission is granted to anyone to use this software for any purpose, // including commercial applications, and to alter it and redistribute it // freely, subject to the following restrictions: // // 1. The origin of this software must not be misrepresented; you must not // claim that you wrote the original software. If you use this software // in a product, an acknowledgment in the product documentation would // be appreciated but is not required. // // 2. Altered source versions must be plainly marked as such, and must not // be misrepresented as being the original software. // // 3. This notice may not be removed or altered from any source // distribution. // //======================================================================== #include "internal.h" /* * Marcus: This code was originally written by Markus G. Kuhn. * I have made some slight changes (trimmed it down a bit from >60 KB to * 20 KB), but the functionality is the same. */ /* * This module converts keysym values into the corresponding ISO 10646 * (UCS, Unicode) values. * * The array keysymtab[] contains pairs of X11 keysym values for graphical * characters and the corresponding Unicode value. The function * _glfwKeySym2Unicode() maps a keysym onto a Unicode value using a binary * search, therefore keysymtab[] must remain SORTED by keysym value. * * We allow to represent any UCS character in the range U-00000000 to * U-00FFFFFF by a keysym value in the range 0x01000000 to 0x01ffffff. * This admittedly does not cover the entire 31-bit space of UCS, but * it does cover all of the characters up to U-10FFFF, which can be * represented by UTF-16, and more, and it is very unlikely that higher * UCS codes will ever be assigned by ISO. So to get Unicode character * U+ABCD you can directly use keysym 0x0100abcd. * * Original author: Markus G. Kuhn , University of * Cambridge, April 2001 * * Special thanks to Richard Verhoeven for preparing * an initial draft of the mapping table. * */ //************************************************************************ //**** KeySym to Unicode mapping table **** //************************************************************************ static struct codepair { unsigned short keysym; unsigned short ucs; } keysymtab[] = { { 0x01a1, 0x0104 }, { 0x01a2, 0x02d8 }, { 0x01a3, 0x0141 }, { 0x01a5, 0x013d }, { 0x01a6, 0x015a }, { 0x01a9, 0x0160 }, { 0x01aa, 0x015e }, { 0x01ab, 0x0164 }, { 0x01ac, 0x0179 }, { 0x01ae, 0x017d }, { 0x01af, 0x017b }, { 0x01b1, 0x0105 }, { 0x01b2, 0x02db }, { 0x01b3, 0x0142 }, { 0x01b5, 0x013e }, { 0x01b6, 0x015b }, { 0x01b7, 0x02c7 }, { 0x01b9, 0x0161 }, { 0x01ba, 0x015f }, { 0x01bb, 0x0165 }, { 0x01bc, 0x017a }, { 0x01bd, 0x02dd }, { 0x01be, 0x017e }, { 0x01bf, 0x017c }, { 0x01c0, 0x0154 }, { 0x01c3, 0x0102 }, { 0x01c5, 0x0139 }, { 0x01c6, 0x0106 }, { 0x01c8, 0x010c }, { 0x01ca, 0x0118 }, { 0x01cc, 0x011a }, { 0x01cf, 0x010e }, { 0x01d0, 0x0110 }, { 0x01d1, 0x0143 }, { 0x01d2, 0x0147 }, { 0x01d5, 0x0150 }, { 0x01d8, 0x0158 }, { 0x01d9, 0x016e }, { 0x01db, 0x0170 }, { 0x01de, 0x0162 }, { 0x01e0, 0x0155 }, { 0x01e3, 0x0103 }, { 0x01e5, 0x013a }, { 0x01e6, 0x0107 }, { 0x01e8, 0x010d }, { 0x01ea, 0x0119 }, { 0x01ec, 0x011b }, { 0x01ef, 0x010f }, { 0x01f0, 0x0111 }, { 0x01f1, 0x0144 }, { 0x01f2, 0x0148 }, { 0x01f5, 0x0151 }, { 0x01f8, 0x0159 }, { 0x01f9, 0x016f }, { 0x01fb, 0x0171 }, { 0x01fe, 0x0163 }, { 0x01ff, 0x02d9 }, { 0x02a1, 0x0126 }, { 0x02a6, 0x0124 }, { 0x02a9, 0x0130 }, { 0x02ab, 0x011e }, { 0x02ac, 0x0134 }, { 0x02b1, 0x0127 }, { 0x02b6, 0x0125 }, { 0x02b9, 0x0131 }, { 0x02bb, 0x011f }, { 0x02bc, 0x0135 }, { 0x02c5, 0x010a }, { 0x02c6, 0x0108 }, { 0x02d5, 0x0120 }, { 0x02d8, 0x011c }, { 0x02dd, 0x016c }, { 0x02de, 0x015c }, { 0x02e5, 0x010b }, { 0x02e6, 0x0109 }, { 0x02f5, 0x0121 }, { 0x02f8, 0x011d }, { 0x02fd, 0x016d }, { 0x02fe, 0x015d }, { 0x03a2, 0x0138 }, { 0x03a3, 0x0156 }, { 0x03a5, 0x0128 }, { 0x03a6, 0x013b }, { 0x03aa, 0x0112 }, { 0x03ab, 0x0122 }, { 0x03ac, 0x0166 }, { 0x03b3, 0x0157 }, { 0x03b5, 0x0129 }, { 0x03b6, 0x013c }, { 0x03ba, 0x0113 }, { 0x03bb, 0x0123 }, { 0x03bc, 0x0167 }, { 0x03bd, 0x014a }, { 0x03bf, 0x014b }, { 0x03c0, 0x0100 }, { 0x03c7, 0x012e }, { 0x03cc, 0x0116 }, { 0x03cf, 0x012a }, { 0x03d1, 0x0145 }, { 0x03d2, 0x014c }, { 0x03d3, 0x0136 }, { 0x03d9, 0x0172 }, { 0x03dd, 0x0168 }, { 0x03de, 0x016a }, { 0x03e0, 0x0101 }, { 0x03e7, 0x012f }, { 0x03ec, 0x0117 }, { 0x03ef, 0x012b }, { 0x03f1, 0x0146 }, { 0x03f2, 0x014d }, { 0x03f3, 0x0137 }, { 0x03f9, 0x0173 }, { 0x03fd, 0x0169 }, { 0x03fe, 0x016b }, { 0x047e, 0x203e }, { 0x04a1, 0x3002 }, { 0x04a2, 0x300c }, { 0x04a3, 0x300d }, { 0x04a4, 0x3001 }, { 0x04a5, 0x30fb }, { 0x04a6, 0x30f2 }, { 0x04a7, 0x30a1 }, { 0x04a8, 0x30a3 }, { 0x04a9, 0x30a5 }, { 0x04aa, 0x30a7 }, { 0x04ab, 0x30a9 }, { 0x04ac, 0x30e3 }, { 0x04ad, 0x30e5 }, { 0x04ae, 0x30e7 }, { 0x04af, 0x30c3 }, { 0x04b0, 0x30fc }, { 0x04b1, 0x30a2 }, { 0x04b2, 0x30a4 }, { 0x04b3, 0x30a6 }, { 0x04b4, 0x30a8 }, { 0x04b5, 0x30aa }, { 0x04b6, 0x30ab }, { 0x04b7, 0x30ad }, { 0x04b8, 0x30af }, { 0x04b9, 0x30b1 }, { 0x04ba, 0x30b3 }, { 0x04bb, 0x30b5 }, { 0x04bc, 0x30b7 }, { 0x04bd, 0x30b9 }, { 0x04be, 0x30bb }, { 0x04bf, 0x30bd }, { 0x04c0, 0x30bf }, { 0x04c1, 0x30c1 }, { 0x04c2, 0x30c4 }, { 0x04c3, 0x30c6 }, { 0x04c4, 0x30c8 }, { 0x04c5, 0x30ca }, { 0x04c6, 0x30cb }, { 0x04c7, 0x30cc }, { 0x04c8, 0x30cd }, { 0x04c9, 0x30ce }, { 0x04ca, 0x30cf }, { 0x04cb, 0x30d2 }, { 0x04cc, 0x30d5 }, { 0x04cd, 0x30d8 }, { 0x04ce, 0x30db }, { 0x04cf, 0x30de }, { 0x04d0, 0x30df }, { 0x04d1, 0x30e0 }, { 0x04d2, 0x30e1 }, { 0x04d3, 0x30e2 }, { 0x04d4, 0x30e4 }, { 0x04d5, 0x30e6 }, { 0x04d6, 0x30e8 }, { 0x04d7, 0x30e9 }, { 0x04d8, 0x30ea }, { 0x04d9, 0x30eb }, { 0x04da, 0x30ec }, { 0x04db, 0x30ed }, { 0x04dc, 0x30ef }, { 0x04dd, 0x30f3 }, { 0x04de, 0x309b }, { 0x04df, 0x309c }, { 0x05ac, 0x060c }, { 0x05bb, 0x061b }, { 0x05bf, 0x061f }, { 0x05c1, 0x0621 }, { 0x05c2, 0x0622 }, { 0x05c3, 0x0623 }, { 0x05c4, 0x0624 }, { 0x05c5, 0x0625 }, { 0x05c6, 0x0626 }, { 0x05c7, 0x0627 }, { 0x05c8, 0x0628 }, { 0x05c9, 0x0629 }, { 0x05ca, 0x062a }, { 0x05cb, 0x062b }, { 0x05cc, 0x062c }, { 0x05cd, 0x062d }, { 0x05ce, 0x062e }, { 0x05cf, 0x062f }, { 0x05d0, 0x0630 }, { 0x05d1, 0x0631 }, { 0x05d2, 0x0632 }, { 0x05d3, 0x0633 }, { 0x05d4, 0x0634 }, { 0x05d5, 0x0635 }, { 0x05d6, 0x0636 }, { 0x05d7, 0x0637 }, { 0x05d8, 0x0638 }, { 0x05d9, 0x0639 }, { 0x05da, 0x063a }, { 0x05e0, 0x0640 }, { 0x05e1, 0x0641 }, { 0x05e2, 0x0642 }, { 0x05e3, 0x0643 }, { 0x05e4, 0x0644 }, { 0x05e5, 0x0645 }, { 0x05e6, 0x0646 }, { 0x05e7, 0x0647 }, { 0x05e8, 0x0648 }, { 0x05e9, 0x0649 }, { 0x05ea, 0x064a }, { 0x05eb, 0x064b }, { 0x05ec, 0x064c }, { 0x05ed, 0x064d }, { 0x05ee, 0x064e }, { 0x05ef, 0x064f }, { 0x05f0, 0x0650 }, { 0x05f1, 0x0651 }, { 0x05f2, 0x0652 }, { 0x06a1, 0x0452 }, { 0x06a2, 0x0453 }, { 0x06a3, 0x0451 }, { 0x06a4, 0x0454 }, { 0x06a5, 0x0455 }, { 0x06a6, 0x0456 }, { 0x06a7, 0x0457 }, { 0x06a8, 0x0458 }, { 0x06a9, 0x0459 }, { 0x06aa, 0x045a }, { 0x06ab, 0x045b }, { 0x06ac, 0x045c }, { 0x06ae, 0x045e }, { 0x06af, 0x045f }, { 0x06b0, 0x2116 }, { 0x06b1, 0x0402 }, { 0x06b2, 0x0403 }, { 0x06b3, 0x0401 }, { 0x06b4, 0x0404 }, { 0x06b5, 0x0405 }, { 0x06b6, 0x0406 }, { 0x06b7, 0x0407 }, { 0x06b8, 0x0408 }, { 0x06b9, 0x0409 }, { 0x06ba, 0x040a }, { 0x06bb, 0x040b }, { 0x06bc, 0x040c }, { 0x06be, 0x040e }, { 0x06bf, 0x040f }, { 0x06c0, 0x044e }, { 0x06c1, 0x0430 }, { 0x06c2, 0x0431 }, { 0x06c3, 0x0446 }, { 0x06c4, 0x0434 }, { 0x06c5, 0x0435 }, { 0x06c6, 0x0444 }, { 0x06c7, 0x0433 }, { 0x06c8, 0x0445 }, { 0x06c9, 0x0438 }, { 0x06ca, 0x0439 }, { 0x06cb, 0x043a }, { 0x06cc, 0x043b }, { 0x06cd, 0x043c }, { 0x06ce, 0x043d }, { 0x06cf, 0x043e }, { 0x06d0, 0x043f }, { 0x06d1, 0x044f }, { 0x06d2, 0x0440 }, { 0x06d3, 0x0441 }, { 0x06d4, 0x0442 }, { 0x06d5, 0x0443 }, { 0x06d6, 0x0436 }, { 0x06d7, 0x0432 }, { 0x06d8, 0x044c }, { 0x06d9, 0x044b }, { 0x06da, 0x0437 }, { 0x06db, 0x0448 }, { 0x06dc, 0x044d }, { 0x06dd, 0x0449 }, { 0x06de, 0x0447 }, { 0x06df, 0x044a }, { 0x06e0, 0x042e }, { 0x06e1, 0x0410 }, { 0x06e2, 0x0411 }, { 0x06e3, 0x0426 }, { 0x06e4, 0x0414 }, { 0x06e5, 0x0415 }, { 0x06e6, 0x0424 }, { 0x06e7, 0x0413 }, { 0x06e8, 0x0425 }, { 0x06e9, 0x0418 }, { 0x06ea, 0x0419 }, { 0x06eb, 0x041a }, { 0x06ec, 0x041b }, { 0x06ed, 0x041c }, { 0x06ee, 0x041d }, { 0x06ef, 0x041e }, { 0x06f0, 0x041f }, { 0x06f1, 0x042f }, { 0x06f2, 0x0420 }, { 0x06f3, 0x0421 }, { 0x06f4, 0x0422 }, { 0x06f5, 0x0423 }, { 0x06f6, 0x0416 }, { 0x06f7, 0x0412 }, { 0x06f8, 0x042c }, { 0x06f9, 0x042b }, { 0x06fa, 0x0417 }, { 0x06fb, 0x0428 }, { 0x06fc, 0x042d }, { 0x06fd, 0x0429 }, { 0x06fe, 0x0427 }, { 0x06ff, 0x042a }, { 0x07a1, 0x0386 }, { 0x07a2, 0x0388 }, { 0x07a3, 0x0389 }, { 0x07a4, 0x038a }, { 0x07a5, 0x03aa }, { 0x07a7, 0x038c }, { 0x07a8, 0x038e }, { 0x07a9, 0x03ab }, { 0x07ab, 0x038f }, { 0x07ae, 0x0385 }, { 0x07af, 0x2015 }, { 0x07b1, 0x03ac }, { 0x07b2, 0x03ad }, { 0x07b3, 0x03ae }, { 0x07b4, 0x03af }, { 0x07b5, 0x03ca }, { 0x07b6, 0x0390 }, { 0x07b7, 0x03cc }, { 0x07b8, 0x03cd }, { 0x07b9, 0x03cb }, { 0x07ba, 0x03b0 }, { 0x07bb, 0x03ce }, { 0x07c1, 0x0391 }, { 0x07c2, 0x0392 }, { 0x07c3, 0x0393 }, { 0x07c4, 0x0394 }, { 0x07c5, 0x0395 }, { 0x07c6, 0x0396 }, { 0x07c7, 0x0397 }, { 0x07c8, 0x0398 }, { 0x07c9, 0x0399 }, { 0x07ca, 0x039a }, { 0x07cb, 0x039b }, { 0x07cc, 0x039c }, { 0x07cd, 0x039d }, { 0x07ce, 0x039e }, { 0x07cf, 0x039f }, { 0x07d0, 0x03a0 }, { 0x07d1, 0x03a1 }, { 0x07d2, 0x03a3 }, { 0x07d4, 0x03a4 }, { 0x07d5, 0x03a5 }, { 0x07d6, 0x03a6 }, { 0x07d7, 0x03a7 }, { 0x07d8, 0x03a8 }, { 0x07d9, 0x03a9 }, { 0x07e1, 0x03b1 }, { 0x07e2, 0x03b2 }, { 0x07e3, 0x03b3 }, { 0x07e4, 0x03b4 }, { 0x07e5, 0x03b5 }, { 0x07e6, 0x03b6 }, { 0x07e7, 0x03b7 }, { 0x07e8, 0x03b8 }, { 0x07e9, 0x03b9 }, { 0x07ea, 0x03ba }, { 0x07eb, 0x03bb }, { 0x07ec, 0x03bc }, { 0x07ed, 0x03bd }, { 0x07ee, 0x03be }, { 0x07ef, 0x03bf }, { 0x07f0, 0x03c0 }, { 0x07f1, 0x03c1 }, { 0x07f2, 0x03c3 }, { 0x07f3, 0x03c2 }, { 0x07f4, 0x03c4 }, { 0x07f5, 0x03c5 }, { 0x07f6, 0x03c6 }, { 0x07f7, 0x03c7 }, { 0x07f8, 0x03c8 }, { 0x07f9, 0x03c9 }, { 0x08a1, 0x23b7 }, { 0x08a2, 0x250c }, { 0x08a3, 0x2500 }, { 0x08a4, 0x2320 }, { 0x08a5, 0x2321 }, { 0x08a6, 0x2502 }, { 0x08a7, 0x23a1 }, { 0x08a8, 0x23a3 }, { 0x08a9, 0x23a4 }, { 0x08aa, 0x23a6 }, { 0x08ab, 0x239b }, { 0x08ac, 0x239d }, { 0x08ad, 0x239e }, { 0x08ae, 0x23a0 }, { 0x08af, 0x23a8 }, { 0x08b0, 0x23ac }, { 0x08bc, 0x2264 }, { 0x08bd, 0x2260 }, { 0x08be, 0x2265 }, { 0x08bf, 0x222b }, { 0x08c0, 0x2234 }, { 0x08c1, 0x221d }, { 0x08c2, 0x221e }, { 0x08c5, 0x2207 }, { 0x08c8, 0x223c }, { 0x08c9, 0x2243 }, { 0x08cd, 0x21d4 }, { 0x08ce, 0x21d2 }, { 0x08cf, 0x2261 }, { 0x08d6, 0x221a }, { 0x08da, 0x2282 }, { 0x08db, 0x2283 }, { 0x08dc, 0x2229 }, { 0x08dd, 0x222a }, { 0x08de, 0x2227 }, { 0x08df, 0x2228 }, { 0x08ef, 0x2202 }, { 0x08f6, 0x0192 }, { 0x08fb, 0x2190 }, { 0x08fc, 0x2191 }, { 0x08fd, 0x2192 }, { 0x08fe, 0x2193 }, { 0x09e0, 0x25c6 }, { 0x09e1, 0x2592 }, { 0x09e2, 0x2409 }, { 0x09e3, 0x240c }, { 0x09e4, 0x240d }, { 0x09e5, 0x240a }, { 0x09e8, 0x2424 }, { 0x09e9, 0x240b }, { 0x09ea, 0x2518 }, { 0x09eb, 0x2510 }, { 0x09ec, 0x250c }, { 0x09ed, 0x2514 }, { 0x09ee, 0x253c }, { 0x09ef, 0x23ba }, { 0x09f0, 0x23bb }, { 0x09f1, 0x2500 }, { 0x09f2, 0x23bc }, { 0x09f3, 0x23bd }, { 0x09f4, 0x251c }, { 0x09f5, 0x2524 }, { 0x09f6, 0x2534 }, { 0x09f7, 0x252c }, { 0x09f8, 0x2502 }, { 0x0aa1, 0x2003 }, { 0x0aa2, 0x2002 }, { 0x0aa3, 0x2004 }, { 0x0aa4, 0x2005 }, { 0x0aa5, 0x2007 }, { 0x0aa6, 0x2008 }, { 0x0aa7, 0x2009 }, { 0x0aa8, 0x200a }, { 0x0aa9, 0x2014 }, { 0x0aaa, 0x2013 }, { 0x0aae, 0x2026 }, { 0x0aaf, 0x2025 }, { 0x0ab0, 0x2153 }, { 0x0ab1, 0x2154 }, { 0x0ab2, 0x2155 }, { 0x0ab3, 0x2156 }, { 0x0ab4, 0x2157 }, { 0x0ab5, 0x2158 }, { 0x0ab6, 0x2159 }, { 0x0ab7, 0x215a }, { 0x0ab8, 0x2105 }, { 0x0abb, 0x2012 }, { 0x0abc, 0x2329 }, { 0x0abe, 0x232a }, { 0x0ac3, 0x215b }, { 0x0ac4, 0x215c }, { 0x0ac5, 0x215d }, { 0x0ac6, 0x215e }, { 0x0ac9, 0x2122 }, { 0x0aca, 0x2613 }, { 0x0acc, 0x25c1 }, { 0x0acd, 0x25b7 }, { 0x0ace, 0x25cb }, { 0x0acf, 0x25af }, { 0x0ad0, 0x2018 }, { 0x0ad1, 0x2019 }, { 0x0ad2, 0x201c }, { 0x0ad3, 0x201d }, { 0x0ad4, 0x211e }, { 0x0ad6, 0x2032 }, { 0x0ad7, 0x2033 }, { 0x0ad9, 0x271d }, { 0x0adb, 0x25ac }, { 0x0adc, 0x25c0 }, { 0x0add, 0x25b6 }, { 0x0ade, 0x25cf }, { 0x0adf, 0x25ae }, { 0x0ae0, 0x25e6 }, { 0x0ae1, 0x25ab }, { 0x0ae2, 0x25ad }, { 0x0ae3, 0x25b3 }, { 0x0ae4, 0x25bd }, { 0x0ae5, 0x2606 }, { 0x0ae6, 0x2022 }, { 0x0ae7, 0x25aa }, { 0x0ae8, 0x25b2 }, { 0x0ae9, 0x25bc }, { 0x0aea, 0x261c }, { 0x0aeb, 0x261e }, { 0x0aec, 0x2663 }, { 0x0aed, 0x2666 }, { 0x0aee, 0x2665 }, { 0x0af0, 0x2720 }, { 0x0af1, 0x2020 }, { 0x0af2, 0x2021 }, { 0x0af3, 0x2713 }, { 0x0af4, 0x2717 }, { 0x0af5, 0x266f }, { 0x0af6, 0x266d }, { 0x0af7, 0x2642 }, { 0x0af8, 0x2640 }, { 0x0af9, 0x260e }, { 0x0afa, 0x2315 }, { 0x0afb, 0x2117 }, { 0x0afc, 0x2038 }, { 0x0afd, 0x201a }, { 0x0afe, 0x201e }, { 0x0ba3, 0x003c }, { 0x0ba6, 0x003e }, { 0x0ba8, 0x2228 }, { 0x0ba9, 0x2227 }, { 0x0bc0, 0x00af }, { 0x0bc2, 0x22a5 }, { 0x0bc3, 0x2229 }, { 0x0bc4, 0x230a }, { 0x0bc6, 0x005f }, { 0x0bca, 0x2218 }, { 0x0bcc, 0x2395 }, { 0x0bce, 0x22a4 }, { 0x0bcf, 0x25cb }, { 0x0bd3, 0x2308 }, { 0x0bd6, 0x222a }, { 0x0bd8, 0x2283 }, { 0x0bda, 0x2282 }, { 0x0bdc, 0x22a2 }, { 0x0bfc, 0x22a3 }, { 0x0cdf, 0x2017 }, { 0x0ce0, 0x05d0 }, { 0x0ce1, 0x05d1 }, { 0x0ce2, 0x05d2 }, { 0x0ce3, 0x05d3 }, { 0x0ce4, 0x05d4 }, { 0x0ce5, 0x05d5 }, { 0x0ce6, 0x05d6 }, { 0x0ce7, 0x05d7 }, { 0x0ce8, 0x05d8 }, { 0x0ce9, 0x05d9 }, { 0x0cea, 0x05da }, { 0x0ceb, 0x05db }, { 0x0cec, 0x05dc }, { 0x0ced, 0x05dd }, { 0x0cee, 0x05de }, { 0x0cef, 0x05df }, { 0x0cf0, 0x05e0 }, { 0x0cf1, 0x05e1 }, { 0x0cf2, 0x05e2 }, { 0x0cf3, 0x05e3 }, { 0x0cf4, 0x05e4 }, { 0x0cf5, 0x05e5 }, { 0x0cf6, 0x05e6 }, { 0x0cf7, 0x05e7 }, { 0x0cf8, 0x05e8 }, { 0x0cf9, 0x05e9 }, { 0x0cfa, 0x05ea }, { 0x0da1, 0x0e01 }, { 0x0da2, 0x0e02 }, { 0x0da3, 0x0e03 }, { 0x0da4, 0x0e04 }, { 0x0da5, 0x0e05 }, { 0x0da6, 0x0e06 }, { 0x0da7, 0x0e07 }, { 0x0da8, 0x0e08 }, { 0x0da9, 0x0e09 }, { 0x0daa, 0x0e0a }, { 0x0dab, 0x0e0b }, { 0x0dac, 0x0e0c }, { 0x0dad, 0x0e0d }, { 0x0dae, 0x0e0e }, { 0x0daf, 0x0e0f }, { 0x0db0, 0x0e10 }, { 0x0db1, 0x0e11 }, { 0x0db2, 0x0e12 }, { 0x0db3, 0x0e13 }, { 0x0db4, 0x0e14 }, { 0x0db5, 0x0e15 }, { 0x0db6, 0x0e16 }, { 0x0db7, 0x0e17 }, { 0x0db8, 0x0e18 }, { 0x0db9, 0x0e19 }, { 0x0dba, 0x0e1a }, { 0x0dbb, 0x0e1b }, { 0x0dbc, 0x0e1c }, { 0x0dbd, 0x0e1d }, { 0x0dbe, 0x0e1e }, { 0x0dbf, 0x0e1f }, { 0x0dc0, 0x0e20 }, { 0x0dc1, 0x0e21 }, { 0x0dc2, 0x0e22 }, { 0x0dc3, 0x0e23 }, { 0x0dc4, 0x0e24 }, { 0x0dc5, 0x0e25 }, { 0x0dc6, 0x0e26 }, { 0x0dc7, 0x0e27 }, { 0x0dc8, 0x0e28 }, { 0x0dc9, 0x0e29 }, { 0x0dca, 0x0e2a }, { 0x0dcb, 0x0e2b }, { 0x0dcc, 0x0e2c }, { 0x0dcd, 0x0e2d }, { 0x0dce, 0x0e2e }, { 0x0dcf, 0x0e2f }, { 0x0dd0, 0x0e30 }, { 0x0dd1, 0x0e31 }, { 0x0dd2, 0x0e32 }, { 0x0dd3, 0x0e33 }, { 0x0dd4, 0x0e34 }, { 0x0dd5, 0x0e35 }, { 0x0dd6, 0x0e36 }, { 0x0dd7, 0x0e37 }, { 0x0dd8, 0x0e38 }, { 0x0dd9, 0x0e39 }, { 0x0dda, 0x0e3a }, { 0x0ddf, 0x0e3f }, { 0x0de0, 0x0e40 }, { 0x0de1, 0x0e41 }, { 0x0de2, 0x0e42 }, { 0x0de3, 0x0e43 }, { 0x0de4, 0x0e44 }, { 0x0de5, 0x0e45 }, { 0x0de6, 0x0e46 }, { 0x0de7, 0x0e47 }, { 0x0de8, 0x0e48 }, { 0x0de9, 0x0e49 }, { 0x0dea, 0x0e4a }, { 0x0deb, 0x0e4b }, { 0x0dec, 0x0e4c }, { 0x0ded, 0x0e4d }, { 0x0df0, 0x0e50 }, { 0x0df1, 0x0e51 }, { 0x0df2, 0x0e52 }, { 0x0df3, 0x0e53 }, { 0x0df4, 0x0e54 }, { 0x0df5, 0x0e55 }, { 0x0df6, 0x0e56 }, { 0x0df7, 0x0e57 }, { 0x0df8, 0x0e58 }, { 0x0df9, 0x0e59 }, { 0x0ea1, 0x3131 }, { 0x0ea2, 0x3132 }, { 0x0ea3, 0x3133 }, { 0x0ea4, 0x3134 }, { 0x0ea5, 0x3135 }, { 0x0ea6, 0x3136 }, { 0x0ea7, 0x3137 }, { 0x0ea8, 0x3138 }, { 0x0ea9, 0x3139 }, { 0x0eaa, 0x313a }, { 0x0eab, 0x313b }, { 0x0eac, 0x313c }, { 0x0ead, 0x313d }, { 0x0eae, 0x313e }, { 0x0eaf, 0x313f }, { 0x0eb0, 0x3140 }, { 0x0eb1, 0x3141 }, { 0x0eb2, 0x3142 }, { 0x0eb3, 0x3143 }, { 0x0eb4, 0x3144 }, { 0x0eb5, 0x3145 }, { 0x0eb6, 0x3146 }, { 0x0eb7, 0x3147 }, { 0x0eb8, 0x3148 }, { 0x0eb9, 0x3149 }, { 0x0eba, 0x314a }, { 0x0ebb, 0x314b }, { 0x0ebc, 0x314c }, { 0x0ebd, 0x314d }, { 0x0ebe, 0x314e }, { 0x0ebf, 0x314f }, { 0x0ec0, 0x3150 }, { 0x0ec1, 0x3151 }, { 0x0ec2, 0x3152 }, { 0x0ec3, 0x3153 }, { 0x0ec4, 0x3154 }, { 0x0ec5, 0x3155 }, { 0x0ec6, 0x3156 }, { 0x0ec7, 0x3157 }, { 0x0ec8, 0x3158 }, { 0x0ec9, 0x3159 }, { 0x0eca, 0x315a }, { 0x0ecb, 0x315b }, { 0x0ecc, 0x315c }, { 0x0ecd, 0x315d }, { 0x0ece, 0x315e }, { 0x0ecf, 0x315f }, { 0x0ed0, 0x3160 }, { 0x0ed1, 0x3161 }, { 0x0ed2, 0x3162 }, { 0x0ed3, 0x3163 }, { 0x0ed4, 0x11a8 }, { 0x0ed5, 0x11a9 }, { 0x0ed6, 0x11aa }, { 0x0ed7, 0x11ab }, { 0x0ed8, 0x11ac }, { 0x0ed9, 0x11ad }, { 0x0eda, 0x11ae }, { 0x0edb, 0x11af }, { 0x0edc, 0x11b0 }, { 0x0edd, 0x11b1 }, { 0x0ede, 0x11b2 }, { 0x0edf, 0x11b3 }, { 0x0ee0, 0x11b4 }, { 0x0ee1, 0x11b5 }, { 0x0ee2, 0x11b6 }, { 0x0ee3, 0x11b7 }, { 0x0ee4, 0x11b8 }, { 0x0ee5, 0x11b9 }, { 0x0ee6, 0x11ba }, { 0x0ee7, 0x11bb }, { 0x0ee8, 0x11bc }, { 0x0ee9, 0x11bd }, { 0x0eea, 0x11be }, { 0x0eeb, 0x11bf }, { 0x0eec, 0x11c0 }, { 0x0eed, 0x11c1 }, { 0x0eee, 0x11c2 }, { 0x0eef, 0x316d }, { 0x0ef0, 0x3171 }, { 0x0ef1, 0x3178 }, { 0x0ef2, 0x317f }, { 0x0ef3, 0x3181 }, { 0x0ef4, 0x3184 }, { 0x0ef5, 0x3186 }, { 0x0ef6, 0x318d }, { 0x0ef7, 0x318e }, { 0x0ef8, 0x11eb }, { 0x0ef9, 0x11f0 }, { 0x0efa, 0x11f9 }, { 0x0eff, 0x20a9 }, { 0x13a4, 0x20ac }, { 0x13bc, 0x0152 }, { 0x13bd, 0x0153 }, { 0x13be, 0x0178 }, { 0x20ac, 0x20ac }, // Numeric keypad with numlock on { XK_KP_Space, ' ' }, { XK_KP_Equal, '=' }, { XK_KP_Multiply, '*' }, { XK_KP_Add, '+' }, { XK_KP_Separator, ',' }, { XK_KP_Subtract, '-' }, { XK_KP_Decimal, '.' }, { XK_KP_Divide, '/' }, { XK_KP_0, 0x0030 }, { XK_KP_1, 0x0031 }, { XK_KP_2, 0x0032 }, { XK_KP_3, 0x0033 }, { XK_KP_4, 0x0034 }, { XK_KP_5, 0x0035 }, { XK_KP_6, 0x0036 }, { XK_KP_7, 0x0037 }, { XK_KP_8, 0x0038 }, { XK_KP_9, 0x0039 } }; //************************************************************************ //**** GLFW internal functions **** //************************************************************************ //======================================================================== // Convert X11 KeySym to Unicode //======================================================================== long _glfwKeySym2Unicode( KeySym keysym ) { int min = 0; int max = sizeof(keysymtab) / sizeof(struct codepair) - 1; int mid; /* First check for Latin-1 characters (1:1 mapping) */ if( (keysym >= 0x0020 && keysym <= 0x007e) || (keysym >= 0x00a0 && keysym <= 0x00ff) ) { return keysym; } /* Also check for directly encoded 24-bit UCS characters */ if( (keysym & 0xff000000) == 0x01000000 ) { return keysym & 0x00ffffff; } /* Binary search in table */ while( max >= min ) { mid = (min + max) / 2; if( keysymtab[mid].keysym < keysym ) { min = mid + 1; } else if( keysymtab[mid].keysym > keysym ) { max = mid - 1; } else { /* Found it! */ return keysymtab[mid].ucs; } } /* No matching Unicode value found */ return -1; } GLFW-0.5.1.0/glfw/lib/x11/x11_thread.c0000644000000000000000000003063312045371042015025 0ustar0000000000000000//======================================================================== // GLFW - An OpenGL framework // Platform: X11/GLX // API version: 2.7 // WWW: http://www.glfw.org/ //------------------------------------------------------------------------ // Copyright (c) 2002-2006 Marcus Geelnard // Copyright (c) 2006-2010 Camilla Berglund // // This software is provided 'as-is', without any express or implied // warranty. In no event will the authors be held liable for any damages // arising from the use of this software. // // Permission is granted to anyone to use this software for any purpose, // including commercial applications, and to alter it and redistribute it // freely, subject to the following restrictions: // // 1. The origin of this software must not be misrepresented; you must not // claim that you wrote the original software. If you use this software // in a product, an acknowledgment in the product documentation would // be appreciated but is not required. // // 2. Altered source versions must be plainly marked as such, and must not // be misrepresented as being the original software. // // 3. This notice may not be removed or altered from any source // distribution. // //======================================================================== #include "internal.h" //************************************************************************ //**** GLFW internal functions **** //************************************************************************ #ifdef _GLFW_HAS_PTHREAD //======================================================================== // This is simply a "wrapper" for calling the user thread function. //======================================================================== void * _glfwNewThread( void * arg ) { GLFWthreadfun threadfun; _GLFWthread *t; pthread_t posixID; // Get current thread ID posixID = pthread_self(); // Enter critical section ENTER_THREAD_CRITICAL_SECTION // Loop through entire list of threads to find the matching POSIX // thread ID for( t = &_glfwThrd.First; t != NULL; t = t->Next ) { if( t->PosixID == posixID ) { break; } } if( t == NULL ) { LEAVE_THREAD_CRITICAL_SECTION return NULL; } // Get user thread function pointer threadfun = t->Function; // Leave critical section LEAVE_THREAD_CRITICAL_SECTION // Call the user thread function threadfun( arg ); // Remove thread from thread list ENTER_THREAD_CRITICAL_SECTION _glfwRemoveThread( t ); LEAVE_THREAD_CRITICAL_SECTION // When the thread function returns, the thread will die... return NULL; } #endif // _GLFW_HAS_PTHREAD //************************************************************************ //**** Platform implementation functions **** //************************************************************************ //======================================================================== // Create a new thread //======================================================================== GLFWthread _glfwPlatformCreateThread( GLFWthreadfun fun, void *arg ) { #ifdef _GLFW_HAS_PTHREAD GLFWthread ID; _GLFWthread *t; int result; // Enter critical section ENTER_THREAD_CRITICAL_SECTION // Create a new thread information memory area t = (_GLFWthread *) malloc( sizeof(_GLFWthread) ); if( t == NULL ) { // Leave critical section LEAVE_THREAD_CRITICAL_SECTION return -1; } // Get a new unique thread id ID = _glfwThrd.NextID ++; // Store thread information in the thread list t->Function = fun; t->ID = ID; // Create thread result = pthread_create( &t->PosixID, // Thread handle NULL, // Default thread attributes _glfwNewThread, // Thread function (a wrapper function) (void *)arg // Argument to thread is user argument ); // Did the thread creation fail? if( result != 0 ) { free( (void *) t ); LEAVE_THREAD_CRITICAL_SECTION return -1; } // Append thread to thread list _glfwAppendThread( t ); // Leave critical section LEAVE_THREAD_CRITICAL_SECTION // Return the GLFW thread ID return ID; #else return -1; #endif // _GLFW_HAS_PTHREAD } //======================================================================== // Kill a thread. NOTE: THIS IS A VERY DANGEROUS OPERATION, AND SHOULD NOT // BE USED EXCEPT IN EXTREME SITUATIONS! //======================================================================== void _glfwPlatformDestroyThread( GLFWthread ID ) { #ifdef _GLFW_HAS_PTHREAD _GLFWthread *t; // Enter critical section ENTER_THREAD_CRITICAL_SECTION // Get thread information pointer t = _glfwGetThreadPointer( ID ); if( t == NULL ) { LEAVE_THREAD_CRITICAL_SECTION return; } // Simply murder the process, no mercy! pthread_kill( t->PosixID, SIGKILL ); // Remove thread from thread list _glfwRemoveThread( t ); // Leave critical section LEAVE_THREAD_CRITICAL_SECTION #endif // _GLFW_HAS_PTHREAD } //======================================================================== // Wait for a thread to die //======================================================================== int _glfwPlatformWaitThread( GLFWthread ID, int waitmode ) { #ifdef _GLFW_HAS_PTHREAD pthread_t thread; _GLFWthread *t; // Enter critical section ENTER_THREAD_CRITICAL_SECTION // Get thread information pointer t = _glfwGetThreadPointer( ID ); // Is the thread already dead? if( t == NULL ) { LEAVE_THREAD_CRITICAL_SECTION return GL_TRUE; } // If got this far, the thread is alive => polling returns FALSE if( waitmode == GLFW_NOWAIT ) { LEAVE_THREAD_CRITICAL_SECTION return GL_FALSE; } // Get thread handle thread = t->PosixID; // Leave critical section LEAVE_THREAD_CRITICAL_SECTION // Wait for thread to die (void) pthread_join( thread, NULL ); return GL_TRUE; #else return GL_TRUE; #endif // _GLFW_HAS_PTHREAD } //======================================================================== // Return the thread ID for the current thread //======================================================================== GLFWthread _glfwPlatformGetThreadID( void ) { #ifdef _GLFW_HAS_PTHREAD _GLFWthread *t; GLFWthread ID = -1; pthread_t posixID; // Get current thread ID posixID = pthread_self(); // Enter critical section ENTER_THREAD_CRITICAL_SECTION // Loop through entire list of threads to find the matching POSIX // thread ID for( t = &_glfwThrd.First; t != NULL; t = t->Next ) { if( t->PosixID == posixID ) { ID = t->ID; break; } } // Leave critical section LEAVE_THREAD_CRITICAL_SECTION // Return the found GLFW thread identifier return ID; #else return 0; #endif // _GLFW_HAS_PTHREAD } //======================================================================== // Create a mutual exclusion object //======================================================================== GLFWmutex _glfwPlatformCreateMutex( void ) { #ifdef _GLFW_HAS_PTHREAD pthread_mutex_t *mutex; // Allocate memory for mutex mutex = (pthread_mutex_t *) malloc( sizeof( pthread_mutex_t ) ); if( !mutex ) { return NULL; } // Initialise a mutex object (void) pthread_mutex_init( mutex, NULL ); // Cast to GLFWmutex and return return (GLFWmutex) mutex; #else return (GLFWmutex) 0; #endif // _GLFW_HAS_PTHREAD } //======================================================================== // Destroy a mutual exclusion object //======================================================================== void _glfwPlatformDestroyMutex( GLFWmutex mutex ) { #ifdef _GLFW_HAS_PTHREAD // Destroy the mutex object pthread_mutex_destroy( (pthread_mutex_t *) mutex ); // Free memory for mutex object free( (void *) mutex ); #endif // _GLFW_HAS_PTHREAD } //======================================================================== // Request access to a mutex //======================================================================== void _glfwPlatformLockMutex( GLFWmutex mutex ) { #ifdef _GLFW_HAS_PTHREAD // Wait for mutex to be released (void) pthread_mutex_lock( (pthread_mutex_t *) mutex ); #endif // _GLFW_HAS_PTHREAD } //======================================================================== // Release a mutex //======================================================================== void _glfwPlatformUnlockMutex( GLFWmutex mutex ) { #ifdef _GLFW_HAS_PTHREAD // Release mutex pthread_mutex_unlock( (pthread_mutex_t *) mutex ); #endif // _GLFW_HAS_PTHREAD } //======================================================================== // Create a new condition variable object //======================================================================== GLFWcond _glfwPlatformCreateCond( void ) { #ifdef _GLFW_HAS_PTHREAD pthread_cond_t *cond; // Allocate memory for condition variable cond = (pthread_cond_t *) malloc( sizeof(pthread_cond_t) ); if( !cond ) { return NULL; } // Initialise condition variable (void) pthread_cond_init( cond, NULL ); // Cast to GLFWcond and return return (GLFWcond) cond; #else return (GLFWcond) 0; #endif // _GLFW_HAS_PTHREAD } //======================================================================== // Destroy a condition variable object //======================================================================== void _glfwPlatformDestroyCond( GLFWcond cond ) { #ifdef _GLFW_HAS_PTHREAD // Destroy the condition variable object (void) pthread_cond_destroy( (pthread_cond_t *) cond ); // Free memory for condition variable object free( (void *) cond ); #endif // _GLFW_HAS_PTHREAD } //======================================================================== // Wait for a condition to be raised //======================================================================== void _glfwPlatformWaitCond( GLFWcond cond, GLFWmutex mutex, double timeout ) { #ifdef _GLFW_HAS_PTHREAD struct timeval currenttime; struct timespec wait; long dt_sec, dt_usec; // Select infinite or timed wait if( timeout >= GLFW_INFINITY ) { // Wait for condition (infinite wait) (void) pthread_cond_wait( (pthread_cond_t *) cond, (pthread_mutex_t *) mutex ); } else { // Set timeout time, relatvie to current time gettimeofday( ¤ttime, NULL ); dt_sec = (long) timeout; dt_usec = (long) ((timeout - (double)dt_sec) * 1000000.0); wait.tv_nsec = (currenttime.tv_usec + dt_usec) * 1000L; if( wait.tv_nsec > 1000000000L ) { wait.tv_nsec -= 1000000000L; dt_sec ++; } wait.tv_sec = currenttime.tv_sec + dt_sec; // Wait for condition (timed wait) (void) pthread_cond_timedwait( (pthread_cond_t *) cond, (pthread_mutex_t *) mutex, &wait ); } #endif // _GLFW_HAS_PTHREAD } //======================================================================== // Signal a condition to one waiting thread //======================================================================== void _glfwPlatformSignalCond( GLFWcond cond ) { #ifdef _GLFW_HAS_PTHREAD // Signal condition (void) pthread_cond_signal( (pthread_cond_t *) cond ); #endif // _GLFW_HAS_PTHREAD } //======================================================================== // Broadcast a condition to all waiting threads //======================================================================== void _glfwPlatformBroadcastCond( GLFWcond cond ) { #ifdef _GLFW_HAS_PTHREAD // Broadcast condition (void) pthread_cond_broadcast( (pthread_cond_t *) cond ); #endif // _GLFW_HAS_PTHREAD } //======================================================================== // Return the number of processors in the system. //======================================================================== int _glfwPlatformGetNumberOfProcessors( void ) { int n; // Get number of processors online _glfw_numprocessors( n ); return n; } GLFW-0.5.1.0/glfw/lib/x11/x11_time.c0000644000000000000000000001214412045371042014511 0ustar0000000000000000//======================================================================== // GLFW - An OpenGL framework // Platform: X11/GLX // API version: 2.7 // WWW: http://www.glfw.org/ //------------------------------------------------------------------------ // Copyright (c) 2002-2006 Marcus Geelnard // Copyright (c) 2006-2010 Camilla Berglund // // This software is provided 'as-is', without any express or implied // warranty. In no event will the authors be held liable for any damages // arising from the use of this software. // // Permission is granted to anyone to use this software for any purpose, // including commercial applications, and to alter it and redistribute it // freely, subject to the following restrictions: // // 1. The origin of this software must not be misrepresented; you must not // claim that you wrote the original software. If you use this software // in a product, an acknowledgment in the product documentation would // be appreciated but is not required. // // 2. Altered source versions must be plainly marked as such, and must not // be misrepresented as being the original software. // // 3. This notice may not be removed or altered from any source // distribution. // //======================================================================== #include "internal.h" #include //======================================================================== // Return raw time //======================================================================== static uint64_t getRawTime(void) { #if defined( CLOCK_MONOTONIC ) if( _glfwLibrary.Timer.monotonic ) { struct timespec ts; clock_gettime( CLOCK_MONOTONIC, &ts ); return (uint64_t) ts.tv_sec * (uint64_t) 1000000000 + (uint64_t) ts.tv_nsec; } else #endif { struct timeval tv; gettimeofday( &tv, NULL ); return (uint64_t) tv.tv_sec * (uint64_t) 1000000 + (uint64_t) tv.tv_usec; } } //======================================================================== // Initialise timer //======================================================================== void _glfwInitTimer( void ) { #if defined( CLOCK_MONOTONIC ) struct timespec ts; if( clock_gettime( CLOCK_MONOTONIC, &ts ) == 0 ) { _glfwLibrary.Timer.monotonic = GL_TRUE; _glfwLibrary.Timer.resolution = 1e-9; } else #endif { _glfwLibrary.Timer.resolution = 1e-6; } _glfwLibrary.Timer.base = getRawTime(); } //************************************************************************ //**** Platform implementation functions **** //************************************************************************ //======================================================================== // Return timer value in seconds //======================================================================== double _glfwPlatformGetTime( void ) { return (double) (getRawTime() - _glfwLibrary.Timer.base) * _glfwLibrary.Timer.resolution; } //======================================================================== // Set timer value in seconds //======================================================================== void _glfwPlatformSetTime( double time ) { _glfwLibrary.Timer.base = getRawTime() - (uint64_t) (time / _glfwLibrary.Timer.resolution); } //======================================================================== // Put a thread to sleep for a specified amount of time //======================================================================== void _glfwPlatformSleep( double time ) { #ifdef _GLFW_HAS_PTHREAD if( time == 0.0 ) { #ifdef _GLFW_HAS_SCHED_YIELD sched_yield(); #endif return; } struct timeval currenttime; struct timespec wait; pthread_mutex_t mutex; pthread_cond_t cond; long dt_sec, dt_usec; // Not all pthread implementations have a pthread_sleep() function. We // do it the portable way, using a timed wait for a condition that we // will never signal. NOTE: The unistd functions sleep/usleep suspends // the entire PROCESS, not a signle thread, which is why we can not // use them to implement glfwSleep. // Set timeout time, relatvie to current time gettimeofday( ¤ttime, NULL ); dt_sec = (long) time; dt_usec = (long) ((time - (double)dt_sec) * 1000000.0); wait.tv_nsec = (currenttime.tv_usec + dt_usec) * 1000L; if( wait.tv_nsec > 1000000000L ) { wait.tv_nsec -= 1000000000L; dt_sec++; } wait.tv_sec = currenttime.tv_sec + dt_sec; // Initialize condition and mutex objects pthread_mutex_init( &mutex, NULL ); pthread_cond_init( &cond, NULL ); // Do a timed wait pthread_mutex_lock( &mutex ); pthread_cond_timedwait( &cond, &mutex, &wait ); pthread_mutex_unlock( &mutex ); // Destroy condition and mutex objects pthread_mutex_destroy( &mutex ); pthread_cond_destroy( &cond ); #else // For systems without PTHREAD, use unistd usleep if( time > 0 ) { usleep( (unsigned int) (time*1000000) ); } #endif // _GLFW_HAS_PTHREAD } GLFW-0.5.1.0/glfw/lib/x11/x11_window.c0000644000000000000000000017234012045371042015067 0ustar0000000000000000//======================================================================== // GLFW - An OpenGL framework // Platform: X11/GLX // API version: 2.7 // WWW: http://www.glfw.org/ //------------------------------------------------------------------------ // Copyright (c) 2002-2006 Marcus Geelnard // Copyright (c) 2006-2010 Camilla Berglund // // This software is provided 'as-is', without any express or implied // warranty. In no event will the authors be held liable for any damages // arising from the use of this software. // // Permission is granted to anyone to use this software for any purpose, // including commercial applications, and to alter it and redistribute it // freely, subject to the following restrictions: // // 1. The origin of this software must not be misrepresented; you must not // claim that you wrote the original software. If you use this software // in a product, an acknowledgment in the product documentation would // be appreciated but is not required. // // 2. Altered source versions must be plainly marked as such, and must not // be misrepresented as being the original software. // // 3. This notice may not be removed or altered from any source // distribution. // //======================================================================== #include "internal.h" #include /* Define GLX 1.4 FSAA tokens if not already defined */ #ifndef GLX_VERSION_1_4 #define GLX_SAMPLE_BUFFERS 100000 #define GLX_SAMPLES 100001 #endif /*GLX_VERSION_1_4*/ // Action for EWMH client messages #define _NET_WM_STATE_REMOVE 0 #define _NET_WM_STATE_ADD 1 #define _NET_WM_STATE_TOGGLE 2 //************************************************************************ //**** GLFW internal functions **** //************************************************************************ //======================================================================== // Error handler for BadMatch errors when requesting context with // unavailable OpenGL versions using the GLX_ARB_create_context extension //======================================================================== static int errorHandler( Display *display, XErrorEvent *event ) { return 0; } //======================================================================== // Checks whether the event is a MapNotify for the specified window //======================================================================== static Bool isMapNotify( Display *d, XEvent *e, char *arg ) { return (e->type == MapNotify) && (e->xmap.window == (Window)arg); } //======================================================================== // Retrieve a single window property of the specified type // Inspired by fghGetWindowProperty from freeglut //======================================================================== static unsigned long getWindowProperty( Window window, Atom property, Atom type, unsigned char** value ) { Atom actualType; int actualFormat; unsigned long itemCount, bytesAfter; XGetWindowProperty( _glfwLibrary.display, window, property, 0, LONG_MAX, False, type, &actualType, &actualFormat, &itemCount, &bytesAfter, value ); if( actualType != type ) { return 0; } return itemCount; } //======================================================================== // Check whether the specified atom is supported //======================================================================== static Atom getSupportedAtom( Atom* supportedAtoms, unsigned long atomCount, const char* atomName ) { Atom atom = XInternAtom( _glfwLibrary.display, atomName, True ); if( atom != None ) { unsigned long i; for( i = 0; i < atomCount; i++ ) { if( supportedAtoms[i] == atom ) { return atom; } } } return None; } //======================================================================== // Check whether the running window manager is EWMH-compliant //======================================================================== static GLboolean checkForEWMH( void ) { Window *windowFromRoot = NULL; Window *windowFromChild = NULL; // Hey kids; let's see if the window manager supports EWMH! // First we need a couple of atoms, which should already be there Atom supportingWmCheck = XInternAtom( _glfwLibrary.display, "_NET_SUPPORTING_WM_CHECK", True ); Atom wmSupported = XInternAtom( _glfwLibrary.display, "_NET_SUPPORTED", True ); if( supportingWmCheck == None || wmSupported == None ) { return GL_FALSE; } // Then we look for the _NET_SUPPORTING_WM_CHECK property of the root window if( getWindowProperty( _glfwWin.root, supportingWmCheck, XA_WINDOW, (unsigned char**) &windowFromRoot ) != 1 ) { XFree( windowFromRoot ); return GL_FALSE; } // It should be the ID of a child window (of the root) // Then we look for the same property on the child window if( getWindowProperty( *windowFromRoot, supportingWmCheck, XA_WINDOW, (unsigned char**) &windowFromChild ) != 1 ) { XFree( windowFromRoot ); XFree( windowFromChild ); return GL_FALSE; } // It should be the ID of that same child window if( *windowFromRoot != *windowFromChild ) { XFree( windowFromRoot ); XFree( windowFromChild ); return GL_FALSE; } XFree( windowFromRoot ); XFree( windowFromChild ); // We are now fairly sure that an EWMH-compliant window manager is running Atom *supportedAtoms; unsigned long atomCount; // Now we need to check the _NET_SUPPORTED property of the root window atomCount = getWindowProperty( _glfwWin.root, wmSupported, XA_ATOM, (unsigned char**) &supportedAtoms ); // See which of the atoms we support that are supported by the WM _glfwWin.wmState = getSupportedAtom( supportedAtoms, atomCount, "_NET_WM_STATE" ); _glfwWin.wmStateFullscreen = getSupportedAtom( supportedAtoms, atomCount, "_NET_WM_STATE_FULLSCREEN" ); _glfwWin.wmPing = getSupportedAtom( supportedAtoms, atomCount, "_NET_WM_PING" ); _glfwWin.wmActiveWindow = getSupportedAtom( supportedAtoms, atomCount, "_NET_ACTIVE_WINDOW" ); XFree( supportedAtoms ); return GL_TRUE; } //======================================================================== // Translates an X Window key to internal coding //======================================================================== static int translateKey( int keycode ) { KeySym key, key_lc, key_uc; // Try secondary keysym, for numeric keypad keys // Note: This way we always force "NumLock = ON", which at least // enables GLFW users to detect numeric keypad keys key = XKeycodeToKeysym( _glfwLibrary.display, keycode, 1 ); switch( key ) { // Numeric keypad case XK_KP_0: return GLFW_KEY_KP_0; case XK_KP_1: return GLFW_KEY_KP_1; case XK_KP_2: return GLFW_KEY_KP_2; case XK_KP_3: return GLFW_KEY_KP_3; case XK_KP_4: return GLFW_KEY_KP_4; case XK_KP_5: return GLFW_KEY_KP_5; case XK_KP_6: return GLFW_KEY_KP_6; case XK_KP_7: return GLFW_KEY_KP_7; case XK_KP_8: return GLFW_KEY_KP_8; case XK_KP_9: return GLFW_KEY_KP_9; case XK_KP_Separator: case XK_KP_Decimal: return GLFW_KEY_KP_DECIMAL; case XK_KP_Equal: return GLFW_KEY_KP_EQUAL; case XK_KP_Enter: return GLFW_KEY_KP_ENTER; default: break; } // Now try pimary keysym key = XKeycodeToKeysym( _glfwLibrary.display, keycode, 0 ); switch( key ) { // Special keys (non character keys) case XK_Escape: return GLFW_KEY_ESC; case XK_Tab: return GLFW_KEY_TAB; case XK_Shift_L: return GLFW_KEY_LSHIFT; case XK_Shift_R: return GLFW_KEY_RSHIFT; case XK_Control_L: return GLFW_KEY_LCTRL; case XK_Control_R: return GLFW_KEY_RCTRL; case XK_Meta_L: case XK_Alt_L: return GLFW_KEY_LALT; case XK_Mode_switch: // Mapped to Alt_R on many keyboards case XK_Meta_R: case XK_ISO_Level3_Shift: // AltGr on at least some machines case XK_Alt_R: return GLFW_KEY_RALT; case XK_Super_L: return GLFW_KEY_LSUPER; case XK_Super_R: return GLFW_KEY_RSUPER; case XK_Menu: return GLFW_KEY_MENU; case XK_Num_Lock: return GLFW_KEY_KP_NUM_LOCK; case XK_Caps_Lock: return GLFW_KEY_CAPS_LOCK; case XK_Scroll_Lock: return GLFW_KEY_SCROLL_LOCK; case XK_Pause: return GLFW_KEY_PAUSE; case XK_KP_Delete: case XK_Delete: return GLFW_KEY_DEL; case XK_BackSpace: return GLFW_KEY_BACKSPACE; case XK_Return: return GLFW_KEY_ENTER; case XK_KP_Home: case XK_Home: return GLFW_KEY_HOME; case XK_KP_End: case XK_End: return GLFW_KEY_END; case XK_KP_Page_Up: case XK_Page_Up: return GLFW_KEY_PAGEUP; case XK_KP_Page_Down: case XK_Page_Down: return GLFW_KEY_PAGEDOWN; case XK_KP_Insert: case XK_Insert: return GLFW_KEY_INSERT; case XK_KP_Left: case XK_Left: return GLFW_KEY_LEFT; case XK_KP_Right: case XK_Right: return GLFW_KEY_RIGHT; case XK_KP_Down: case XK_Down: return GLFW_KEY_DOWN; case XK_KP_Up: case XK_Up: return GLFW_KEY_UP; case XK_F1: return GLFW_KEY_F1; case XK_F2: return GLFW_KEY_F2; case XK_F3: return GLFW_KEY_F3; case XK_F4: return GLFW_KEY_F4; case XK_F5: return GLFW_KEY_F5; case XK_F6: return GLFW_KEY_F6; case XK_F7: return GLFW_KEY_F7; case XK_F8: return GLFW_KEY_F8; case XK_F9: return GLFW_KEY_F9; case XK_F10: return GLFW_KEY_F10; case XK_F11: return GLFW_KEY_F11; case XK_F12: return GLFW_KEY_F12; case XK_F13: return GLFW_KEY_F13; case XK_F14: return GLFW_KEY_F14; case XK_F15: return GLFW_KEY_F15; case XK_F16: return GLFW_KEY_F16; case XK_F17: return GLFW_KEY_F17; case XK_F18: return GLFW_KEY_F18; case XK_F19: return GLFW_KEY_F19; case XK_F20: return GLFW_KEY_F20; case XK_F21: return GLFW_KEY_F21; case XK_F22: return GLFW_KEY_F22; case XK_F23: return GLFW_KEY_F23; case XK_F24: return GLFW_KEY_F24; case XK_F25: return GLFW_KEY_F25; // Numeric keypad (should have been detected in secondary keysym!) case XK_KP_Divide: return GLFW_KEY_KP_DIVIDE; case XK_KP_Multiply: return GLFW_KEY_KP_MULTIPLY; case XK_KP_Subtract: return GLFW_KEY_KP_SUBTRACT; case XK_KP_Add: return GLFW_KEY_KP_ADD; case XK_KP_Equal: return GLFW_KEY_KP_EQUAL; case XK_KP_Enter: return GLFW_KEY_KP_ENTER; // The rest (should be printable keys) default: // Make uppercase XConvertCase( key, &key_lc, &key_uc ); key = key_uc; // Valid ISO 8859-1 character? if( (key >= 32 && key <= 126) || (key >= 160 && key <= 255) ) { return (int) key; } return GLFW_KEY_UNKNOWN; } } //======================================================================== // Translates an X Window event to Unicode //======================================================================== static int translateChar( XKeyEvent *event ) { KeySym keysym; // Get X11 keysym XLookupString( event, NULL, 0, &keysym, NULL ); // Convert to Unicode (see x11_keysym2unicode.c) return (int) _glfwKeySym2Unicode( keysym ); } //======================================================================== // Create a blank cursor (for locked mouse mode) //======================================================================== static Cursor createNULLCursor( Display *display, Window root ) { Pixmap cursormask; XGCValues xgc; GC gc; XColor col; Cursor cursor; cursormask = XCreatePixmap( display, root, 1, 1, 1 ); xgc.function = GXclear; gc = XCreateGC( display, cursormask, GCFunction, &xgc ); XFillRectangle( display, cursormask, gc, 0, 0, 1, 1 ); col.pixel = 0; col.red = 0; col.flags = 4; cursor = XCreatePixmapCursor( display, cursormask, cursormask, &col,&col, 0,0 ); XFreePixmap( display, cursormask ); XFreeGC( display, gc ); return cursor; } //======================================================================== // Returns the specified attribute of the specified GLXFBConfig // NOTE: Do not call this unless we have found GLX 1.3+ or GLX_SGIX_fbconfig //======================================================================== static int getFBConfigAttrib( GLXFBConfig fbconfig, int attrib ) { int value; if( _glfwWin.has_GLX_SGIX_fbconfig ) { _glfwWin.GetFBConfigAttribSGIX( _glfwLibrary.display, fbconfig, attrib, &value ); } else { glXGetFBConfigAttrib( _glfwLibrary.display, fbconfig, attrib, &value ); } return value; } //======================================================================== // Return a list of available and usable framebuffer configs //======================================================================== static _GLFWfbconfig *getFBConfigs( unsigned int *found ) { GLXFBConfig *fbconfigs; _GLFWfbconfig *result; int i, count = 0; *found = 0; if( _glfwLibrary.glxMajor == 1 && _glfwLibrary.glxMinor < 3 ) { if( !_glfwWin.has_GLX_SGIX_fbconfig ) { fprintf( stderr, "GLXFBConfigs are not supported by the X server\n" ); return NULL; } } if( _glfwWin.has_GLX_SGIX_fbconfig ) { fbconfigs = _glfwWin.ChooseFBConfigSGIX( _glfwLibrary.display, _glfwWin.screen, NULL, &count ); if( !count ) { fprintf( stderr, "No GLXFBConfigs returned\n" ); return NULL; } } else { fbconfigs = glXGetFBConfigs( _glfwLibrary.display, _glfwWin.screen, &count ); if( !count ) { fprintf( stderr, "No GLXFBConfigs returned\n" ); return NULL; } } result = (_GLFWfbconfig*) malloc( sizeof(_GLFWfbconfig) * count ); if( !result ) { fprintf( stderr, "Out of memory\n" ); return NULL; } for( i = 0; i < count; i++ ) { if( !getFBConfigAttrib( fbconfigs[i], GLX_DOUBLEBUFFER ) || !getFBConfigAttrib( fbconfigs[i], GLX_VISUAL_ID ) ) { // Only consider double-buffered GLXFBConfigs with associated visuals continue; } if( !( getFBConfigAttrib( fbconfigs[i], GLX_RENDER_TYPE ) & GLX_RGBA_BIT ) ) { // Only consider RGBA GLXFBConfigs continue; } if( !( getFBConfigAttrib( fbconfigs[i], GLX_DRAWABLE_TYPE ) & GLX_WINDOW_BIT ) ) { // Only consider window GLXFBConfigs continue; } result[*found].redBits = getFBConfigAttrib( fbconfigs[i], GLX_RED_SIZE ); result[*found].greenBits = getFBConfigAttrib( fbconfigs[i], GLX_GREEN_SIZE ); result[*found].blueBits = getFBConfigAttrib( fbconfigs[i], GLX_BLUE_SIZE ); result[*found].alphaBits = getFBConfigAttrib( fbconfigs[i], GLX_ALPHA_SIZE ); result[*found].depthBits = getFBConfigAttrib( fbconfigs[i], GLX_DEPTH_SIZE ); result[*found].stencilBits = getFBConfigAttrib( fbconfigs[i], GLX_STENCIL_SIZE ); result[*found].accumRedBits = getFBConfigAttrib( fbconfigs[i], GLX_ACCUM_RED_SIZE ); result[*found].accumGreenBits = getFBConfigAttrib( fbconfigs[i], GLX_ACCUM_GREEN_SIZE ); result[*found].accumBlueBits = getFBConfigAttrib( fbconfigs[i], GLX_ACCUM_BLUE_SIZE ); result[*found].accumAlphaBits = getFBConfigAttrib( fbconfigs[i], GLX_ACCUM_ALPHA_SIZE ); result[*found].auxBuffers = getFBConfigAttrib( fbconfigs[i], GLX_AUX_BUFFERS ); result[*found].stereo = getFBConfigAttrib( fbconfigs[i], GLX_STEREO ); if( _glfwWin.has_GLX_ARB_multisample ) { result[*found].samples = getFBConfigAttrib( fbconfigs[i], GLX_SAMPLES ); } else { result[*found].samples = 0; } result[*found].platformID = (GLFWintptr) getFBConfigAttrib( fbconfigs[i], GLX_FBCONFIG_ID ); (*found)++; } XFree( fbconfigs ); return result; } //======================================================================== // Create the OpenGL context //======================================================================== #define setGLXattrib( attribs, index, attribName, attribValue ) \ attribs[index++] = attribName; \ attribs[index++] = attribValue; static int createContext( const _GLFWwndconfig *wndconfig, GLXFBConfigID fbconfigID ) { int attribs[40]; int flags, dummy, index; GLXFBConfig *fbconfig; // Retrieve the previously selected GLXFBConfig { index = 0; setGLXattrib( attribs, index, GLX_FBCONFIG_ID, (int) fbconfigID ); setGLXattrib( attribs, index, None, None ); if( _glfwWin.has_GLX_SGIX_fbconfig ) { fbconfig = _glfwWin.ChooseFBConfigSGIX( _glfwLibrary.display, _glfwWin.screen, attribs, &dummy ); } else { fbconfig = glXChooseFBConfig( _glfwLibrary.display, _glfwWin.screen, attribs, &dummy ); } if( fbconfig == NULL ) { fprintf(stderr, "Unable to retrieve the selected GLXFBConfig\n"); return GL_FALSE; } } // Retrieve the corresponding visual if( _glfwWin.has_GLX_SGIX_fbconfig ) { _glfwWin.visual = _glfwWin.GetVisualFromFBConfigSGIX( _glfwLibrary.display, *fbconfig ); } else { _glfwWin.visual = glXGetVisualFromFBConfig( _glfwLibrary.display, *fbconfig ); } if( _glfwWin.visual == NULL ) { XFree( fbconfig ); fprintf(stderr, "Unable to retrieve visual for GLXFBconfig\n"); return GL_FALSE; } if( _glfwWin.has_GLX_ARB_create_context ) { index = 0; if( wndconfig->glMajor != 1 || wndconfig->glMinor != 0 ) { // Request an explicitly versioned context setGLXattrib( attribs, index, GLX_CONTEXT_MAJOR_VERSION_ARB, wndconfig->glMajor ); setGLXattrib( attribs, index, GLX_CONTEXT_MINOR_VERSION_ARB, wndconfig->glMinor ); } if( wndconfig->glForward || wndconfig->glDebug ) { flags = 0; if( wndconfig->glForward ) { flags |= GLX_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB; } if( wndconfig->glDebug ) { flags |= GLX_CONTEXT_DEBUG_BIT_ARB; } setGLXattrib( attribs, index, GLX_CONTEXT_FLAGS_ARB, flags ); } if( wndconfig->glProfile ) { if( !_glfwWin.has_GLX_ARB_create_context_profile ) { fprintf( stderr, "OpenGL profile requested but GLX_ARB_create_context_profile " "is unavailable\n" ); return GL_FALSE; } if( wndconfig->glProfile == GLFW_OPENGL_CORE_PROFILE ) { flags = GLX_CONTEXT_CORE_PROFILE_BIT_ARB; } else { flags = GLX_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB; } setGLXattrib( attribs, index, GLX_CONTEXT_PROFILE_MASK_ARB, flags ); } setGLXattrib( attribs, index, None, None ); // This is the only place we set an Xlib error handler, and we only do // it because glXCreateContextAttribsARB generates a BadMatch error if // the requested OpenGL version is unavailable (instead of a civilized // response like returning NULL) XSetErrorHandler( errorHandler ); _glfwWin.context = _glfwWin.CreateContextAttribsARB( _glfwLibrary.display, *fbconfig, NULL, True, attribs ); // We are done, so unset the error handler again (see above) XSetErrorHandler( NULL ); } else { if( _glfwWin.has_GLX_SGIX_fbconfig ) { _glfwWin.context = _glfwWin.CreateContextWithConfigSGIX( _glfwLibrary.display, *fbconfig, GLX_RGBA_TYPE, NULL, True ); } else { _glfwWin.context = glXCreateNewContext( _glfwLibrary.display, *fbconfig, GLX_RGBA_TYPE, NULL, True ); } } XFree( fbconfig ); if( _glfwWin.context == NULL ) { fprintf(stderr, "Unable to create OpenGL context\n"); return GL_FALSE; } _glfwWin.fbconfigID = fbconfigID; return GL_TRUE; } #undef setGLXattrib //======================================================================== // Initialize GLX-specific extensions //======================================================================== static void initGLXExtensions( void ) { // This needs to include every function pointer loaded below _glfwWin.SwapIntervalSGI = NULL; _glfwWin.GetFBConfigAttribSGIX = NULL; _glfwWin.ChooseFBConfigSGIX = NULL; _glfwWin.CreateContextWithConfigSGIX = NULL; _glfwWin.GetVisualFromFBConfigSGIX = NULL; _glfwWin.CreateContextAttribsARB = NULL; // This needs to include every extension used below _glfwWin.has_GLX_SGIX_fbconfig = GL_FALSE; _glfwWin.has_GLX_SGI_swap_control = GL_FALSE; _glfwWin.has_GLX_ARB_multisample = GL_FALSE; _glfwWin.has_GLX_ARB_create_context = GL_FALSE; _glfwWin.has_GLX_ARB_create_context_profile = GL_FALSE; if( _glfwPlatformExtensionSupported( "GLX_SGI_swap_control" ) ) { _glfwWin.SwapIntervalSGI = (PFNGLXSWAPINTERVALSGIPROC) _glfwPlatformGetProcAddress( "glXSwapIntervalSGI" ); if( _glfwWin.SwapIntervalSGI ) { _glfwWin.has_GLX_SGI_swap_control = GL_TRUE; } } if( _glfwPlatformExtensionSupported( "GLX_SGIX_fbconfig" ) ) { _glfwWin.GetFBConfigAttribSGIX = (PFNGLXGETFBCONFIGATTRIBSGIXPROC) _glfwPlatformGetProcAddress( "glXGetFBConfigAttribSGIX" ); _glfwWin.ChooseFBConfigSGIX = (PFNGLXCHOOSEFBCONFIGSGIXPROC) _glfwPlatformGetProcAddress( "glXChooseFBConfigSGIX" ); _glfwWin.CreateContextWithConfigSGIX = (PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC) _glfwPlatformGetProcAddress( "glXCreateContextWithConfigSGIX" ); _glfwWin.GetVisualFromFBConfigSGIX = (PFNGLXGETVISUALFROMFBCONFIGSGIXPROC) _glfwPlatformGetProcAddress( "glXGetVisualFromFBConfigSGIX" ); if( _glfwWin.GetFBConfigAttribSGIX && _glfwWin.ChooseFBConfigSGIX && _glfwWin.CreateContextWithConfigSGIX && _glfwWin.GetVisualFromFBConfigSGIX ) { _glfwWin.has_GLX_SGIX_fbconfig = GL_TRUE; } } if( _glfwPlatformExtensionSupported( "GLX_ARB_multisample" ) ) { _glfwWin.has_GLX_ARB_multisample = GL_TRUE; } if( _glfwPlatformExtensionSupported( "GLX_ARB_create_context" ) ) { _glfwWin.CreateContextAttribsARB = (PFNGLXCREATECONTEXTATTRIBSARBPROC) _glfwPlatformGetProcAddress( "glXCreateContextAttribsARB" ); if( _glfwWin.CreateContextAttribsARB ) { _glfwWin.has_GLX_ARB_create_context = GL_TRUE; } } if( _glfwPlatformExtensionSupported( "GLX_ARB_create_context_profile" ) ) { _glfwWin.has_GLX_ARB_create_context_profile = GL_TRUE; } } //======================================================================== // Create the X11 window (and its colormap) //======================================================================== static GLboolean createWindow( int width, int height, const _GLFWwndconfig *wndconfig ) { XEvent event; unsigned long wamask; XSetWindowAttributes wa; // Every window needs a colormap // Create one based on the visual used by the current context _glfwWin.colormap = XCreateColormap( _glfwLibrary.display, _glfwWin.root, _glfwWin.visual->visual, AllocNone ); // Create the actual window { wamask = CWBorderPixel | CWColormap | CWEventMask; wa.colormap = _glfwWin.colormap; wa.border_pixel = 0; wa.event_mask = StructureNotifyMask | KeyPressMask | KeyReleaseMask | PointerMotionMask | ButtonPressMask | ButtonReleaseMask | ExposureMask | FocusChangeMask | VisibilityChangeMask; if( wndconfig->mode == GLFW_WINDOW ) { // The /only/ reason we are setting the background pixel here is // that otherwise our window wont get any decorations on systems // using Compiz on Intel hardware wa.background_pixel = BlackPixel( _glfwLibrary.display, _glfwWin.screen ); wamask |= CWBackPixel; } _glfwWin.window = XCreateWindow( _glfwLibrary.display, _glfwWin.root, 0, 0, // Upper left corner of this window on root _glfwWin.width, _glfwWin.height, 0, // Border width _glfwWin.visual->depth, // Color depth InputOutput, _glfwWin.visual->visual, wamask, &wa ); if( !_glfwWin.window ) { _glfwPlatformCloseWindow(); return GL_FALSE; } } // Check whether an EWMH-compliant window manager is running _glfwWin.hasEWMH = checkForEWMH(); if( _glfwWin.fullscreen && !_glfwWin.hasEWMH ) { // This is the butcher's way of removing window decorations // Setting the override-redirect attribute on a window makes the window // manager ignore the window completely (ICCCM, section 4) // The good thing is that this makes undecorated fullscreen windows // easy to do; the bad thing is that we have to do everything manually // and some things (like iconify/restore) won't work at all, as they're // usually performed by the window manager XSetWindowAttributes attributes; attributes.override_redirect = True; XChangeWindowAttributes( _glfwLibrary.display, _glfwWin.window, CWOverrideRedirect, &attributes ); _glfwWin.overrideRedirect = GL_TRUE; } // Find or create the protocol atom for window close notifications _glfwWin.wmDeleteWindow = XInternAtom( _glfwLibrary.display, "WM_DELETE_WINDOW", False ); // Declare the WM protocols we support { int count = 0; Atom protocols[2]; // The WM_DELETE_WINDOW ICCCM protocol // Basic window close notification protocol if( _glfwWin.wmDeleteWindow != None ) { protocols[count++] = _glfwWin.wmDeleteWindow; } // The _NET_WM_PING EWMH protocol // Tells the WM to ping our window and flag us as unresponsive if we // don't reply within a few seconds if( _glfwWin.wmPing != None ) { protocols[count++] = _glfwWin.wmPing; } if( count > 0 ) { XSetWMProtocols( _glfwLibrary.display, _glfwWin.window, protocols, count ); } } // Set ICCCM WM_HINTS property { XWMHints *hints = XAllocWMHints(); if( !hints ) { _glfwPlatformCloseWindow(); return GL_FALSE; } hints->flags = StateHint; hints->initial_state = NormalState; XSetWMHints( _glfwLibrary.display, _glfwWin.window, hints ); XFree( hints ); } // Set ICCCM WM_NORMAL_HINTS property (even if no parts are set) { XSizeHints *hints = XAllocSizeHints(); if( !hints ) { _glfwPlatformCloseWindow(); return GL_FALSE; } hints->flags = 0; if( wndconfig->windowNoResize && !_glfwWin.fullscreen ) { hints->flags |= (PMinSize | PMaxSize); hints->min_width = hints->max_width = _glfwWin.width; hints->min_height = hints->max_height = _glfwWin.height; } XSetWMNormalHints( _glfwLibrary.display, _glfwWin.window, hints ); XFree( hints ); } _glfwPlatformSetWindowTitle( "GLFW Window" ); // Make sure the window is mapped before proceeding XMapWindow( _glfwLibrary.display, _glfwWin.window ); XPeekIfEvent( _glfwLibrary.display, &event, isMapNotify, (char*)_glfwWin.window ); return GL_TRUE; } //======================================================================== // Enter fullscreen mode //======================================================================== static void enterFullscreenMode( void ) { if( !_glfwWin.Saver.changed ) { // Remember old screen saver settings XGetScreenSaver( _glfwLibrary.display, &_glfwWin.Saver.timeout, &_glfwWin.Saver.interval, &_glfwWin.Saver.blanking, &_glfwWin.Saver.exposure ); // Disable screen saver XSetScreenSaver( _glfwLibrary.display, 0, 0, DontPreferBlanking, DefaultExposures ); _glfwWin.Saver.changed = GL_TRUE; } _glfwSetVideoMode( _glfwWin.screen, &_glfwWin.width, &_glfwWin.height, &_glfwWin.refreshRate ); if( _glfwWin.hasEWMH && _glfwWin.wmState != None && _glfwWin.wmStateFullscreen != None ) { if( _glfwWin.wmActiveWindow != None ) { // Ask the window manager to raise and focus the GLFW window // Only focused windows with the _NET_WM_STATE_FULLSCREEN state end // up on top of all other windows ("Stacking order" in EWMH spec) XEvent event; memset( &event, 0, sizeof(event) ); event.type = ClientMessage; event.xclient.window = _glfwWin.window; event.xclient.format = 32; // Data is 32-bit longs event.xclient.message_type = _glfwWin.wmActiveWindow; event.xclient.data.l[0] = 1; // Sender is a normal application event.xclient.data.l[1] = 0; // We don't really know the timestamp XSendEvent( _glfwLibrary.display, _glfwWin.root, False, SubstructureNotifyMask | SubstructureRedirectMask, &event ); } // Ask the window manager to make the GLFW window a fullscreen window // Fullscreen windows are undecorated and, when focused, are kept // on top of all other windows XEvent event; memset( &event, 0, sizeof(event) ); event.type = ClientMessage; event.xclient.window = _glfwWin.window; event.xclient.format = 32; // Data is 32-bit longs event.xclient.message_type = _glfwWin.wmState; event.xclient.data.l[0] = _NET_WM_STATE_ADD; event.xclient.data.l[1] = _glfwWin.wmStateFullscreen; event.xclient.data.l[2] = 0; // No secondary property event.xclient.data.l[3] = 1; // Sender is a normal application XSendEvent( _glfwLibrary.display, _glfwWin.root, False, SubstructureNotifyMask | SubstructureRedirectMask, &event ); } else if( _glfwWin.overrideRedirect ) { // In override-redirect mode, we have divorced ourselves from the // window manager, so we need to do everything manually XRaiseWindow( _glfwLibrary.display, _glfwWin.window ); XSetInputFocus( _glfwLibrary.display, _glfwWin.window, RevertToParent, CurrentTime ); XMoveWindow( _glfwLibrary.display, _glfwWin.window, 0, 0 ); XResizeWindow( _glfwLibrary.display, _glfwWin.window, _glfwWin.width, _glfwWin.height ); } if( _glfwWin.mouseLock ) { _glfwPlatformHideMouseCursor(); } // HACK: Try to get window inside viewport (for virtual displays) by moving // the mouse cursor to the upper left corner (and then to the center) // This hack should be harmless on saner systems as well XWarpPointer( _glfwLibrary.display, None, _glfwWin.window, 0,0,0,0, 0,0 ); XWarpPointer( _glfwLibrary.display, None, _glfwWin.window, 0,0,0,0, _glfwWin.width / 2, _glfwWin.height / 2 ); } //======================================================================== // Leave fullscreen mode //======================================================================== static void leaveFullscreenMode( void ) { _glfwRestoreVideoMode(); // Did we change the screen saver setting? if( _glfwWin.Saver.changed ) { // Restore old screen saver settings XSetScreenSaver( _glfwLibrary.display, _glfwWin.Saver.timeout, _glfwWin.Saver.interval, _glfwWin.Saver.blanking, _glfwWin.Saver.exposure ); _glfwWin.Saver.changed = GL_FALSE; } if( _glfwWin.hasEWMH && _glfwWin.wmState != None && _glfwWin.wmStateFullscreen != None ) { // Ask the window manager to make the GLFW window a normal window // Normal windows usually have frames and other decorations XEvent event; memset( &event, 0, sizeof(event) ); event.type = ClientMessage; event.xclient.window = _glfwWin.window; event.xclient.format = 32; // Data is 32-bit longs event.xclient.message_type = _glfwWin.wmState; event.xclient.data.l[0] = _NET_WM_STATE_REMOVE; event.xclient.data.l[1] = _glfwWin.wmStateFullscreen; event.xclient.data.l[2] = 0; // No secondary property event.xclient.data.l[3] = 1; // Sender is a normal application XSendEvent( _glfwLibrary.display, _glfwWin.root, False, SubstructureNotifyMask | SubstructureRedirectMask, &event ); } if( _glfwWin.mouseLock ) { _glfwPlatformShowMouseCursor(); } } //======================================================================== // Get and process next X event (called by _glfwPlatformPollEvents) // Returns GL_TRUE if a window close request was received //======================================================================== static GLboolean processSingleEvent( void ) { XEvent event; XNextEvent( _glfwLibrary.display, &event ); switch( event.type ) { case KeyPress: { // A keyboard key was pressed // Translate and report key press _glfwInputKey( translateKey( event.xkey.keycode ), GLFW_PRESS ); // Translate and report character input if( _glfwWin.charCallback ) { _glfwInputChar( translateChar( &event.xkey ), GLFW_PRESS ); } break; } case KeyRelease: { // A keyboard key was released // Do not report key releases for key repeats. For key repeats we // will get KeyRelease/KeyPress pairs with similar or identical // time stamps. User selected key repeat filtering is handled in // _glfwInputKey()/_glfwInputChar(). if( XEventsQueued( _glfwLibrary.display, QueuedAfterReading ) ) { XEvent nextEvent; XPeekEvent( _glfwLibrary.display, &nextEvent ); if( nextEvent.type == KeyPress && nextEvent.xkey.window == event.xkey.window && nextEvent.xkey.keycode == event.xkey.keycode ) { // This last check is a hack to work around key repeats // leaking through due to some sort of time drift // Toshiyuki Takahashi can press a button 16 times per // second so it's fairly safe to assume that no human is // pressing the key 50 times per second (value is ms) if( ( nextEvent.xkey.time - event.xkey.time ) < 20 ) { // Do not report anything for this event break; } } } // Translate and report key release _glfwInputKey( translateKey( event.xkey.keycode ), GLFW_RELEASE ); // Translate and report character input if( _glfwWin.charCallback ) { _glfwInputChar( translateChar( &event.xkey ), GLFW_RELEASE ); } break; } case ButtonPress: { // A mouse button was pressed or a scrolling event occurred if( event.xbutton.button == Button1 ) { _glfwInputMouseClick( GLFW_MOUSE_BUTTON_LEFT, GLFW_PRESS ); } else if( event.xbutton.button == Button2 ) { _glfwInputMouseClick( GLFW_MOUSE_BUTTON_MIDDLE, GLFW_PRESS ); } else if( event.xbutton.button == Button3 ) { _glfwInputMouseClick( GLFW_MOUSE_BUTTON_RIGHT, GLFW_PRESS ); } // XFree86 3.3.2 and later translates mouse wheel up/down into // mouse button 4 & 5 presses else if( event.xbutton.button == Button4 ) { _glfwInput.WheelPos++; // To verify: is this up or down? if( _glfwWin.mouseWheelCallback ) { _glfwWin.mouseWheelCallback( _glfwInput.WheelPos ); } } else if( event.xbutton.button == Button5 ) { _glfwInput.WheelPos--; if( _glfwWin.mouseWheelCallback ) { _glfwWin.mouseWheelCallback( _glfwInput.WheelPos ); } } break; } case ButtonRelease: { // A mouse button was released if( event.xbutton.button == Button1 ) { _glfwInputMouseClick( GLFW_MOUSE_BUTTON_LEFT, GLFW_RELEASE ); } else if( event.xbutton.button == Button2 ) { _glfwInputMouseClick( GLFW_MOUSE_BUTTON_MIDDLE, GLFW_RELEASE ); } else if( event.xbutton.button == Button3 ) { _glfwInputMouseClick( GLFW_MOUSE_BUTTON_RIGHT, GLFW_RELEASE ); } break; } case MotionNotify: { // The mouse cursor was moved if( event.xmotion.x != _glfwInput.CursorPosX || event.xmotion.y != _glfwInput.CursorPosY ) { // The mouse cursor was moved and we didn't do it if( _glfwWin.mouseLock ) { if( _glfwWin.pointerHidden ) { _glfwInput.MousePosX += event.xmotion.x - _glfwInput.CursorPosX; _glfwInput.MousePosY += event.xmotion.y - _glfwInput.CursorPosY; } } else { _glfwInput.MousePosX = event.xmotion.x; _glfwInput.MousePosY = event.xmotion.y; } _glfwInput.CursorPosX = event.xmotion.x; _glfwInput.CursorPosY = event.xmotion.y; _glfwInput.MouseMoved = GL_TRUE; if( _glfwWin.mousePosCallback ) { _glfwWin.mousePosCallback( _glfwInput.MousePosX, _glfwInput.MousePosY ); } } break; } case ConfigureNotify: { if( event.xconfigure.width != _glfwWin.width || event.xconfigure.height != _glfwWin.height ) { // The window was resized _glfwWin.width = event.xconfigure.width; _glfwWin.height = event.xconfigure.height; if( _glfwWin.windowSizeCallback ) { _glfwWin.windowSizeCallback( _glfwWin.width, _glfwWin.height ); } } break; } case ClientMessage: { if( (Atom) event.xclient.data.l[ 0 ] == _glfwWin.wmDeleteWindow ) { // The window manager was asked to close the window, for example by // the user pressing a 'close' window decoration button return GL_TRUE; } else if( _glfwWin.wmPing != None && (Atom) event.xclient.data.l[ 0 ] == _glfwWin.wmPing ) { // The window manager is pinging us to make sure we are still // responding to events event.xclient.window = _glfwWin.root; XSendEvent( _glfwLibrary.display, event.xclient.window, False, SubstructureNotifyMask | SubstructureRedirectMask, &event ); } break; } case MapNotify: { // The window was mapped _glfwWin.iconified = GL_FALSE; break; } case UnmapNotify: { // The window was unmapped _glfwWin.iconified = GL_TRUE; break; } case FocusIn: { // The window gained focus _glfwWin.active = GL_TRUE; if( _glfwWin.mouseLock ) { _glfwPlatformHideMouseCursor(); } break; } case FocusOut: { // The window lost focus _glfwWin.active = GL_FALSE; _glfwInputDeactivation(); if( _glfwWin.mouseLock ) { _glfwPlatformShowMouseCursor(); } break; } case Expose: { // The window's contents was damaged if( _glfwWin.windowRefreshCallback ) { _glfwWin.windowRefreshCallback(); } break; } // Was the window destroyed? case DestroyNotify: return GL_FALSE; default: { #if defined( _GLFW_HAS_XRANDR ) switch( event.type - _glfwLibrary.XRandR.eventBase ) { case RRScreenChangeNotify: { // Show XRandR that we really care XRRUpdateConfiguration( &event ); break; } } #endif break; } } // The window was not destroyed return GL_FALSE; } //************************************************************************ //**** Platform implementation functions **** //************************************************************************ //======================================================================== // Here is where the window is created, and // the OpenGL rendering context is created //======================================================================== int _glfwPlatformOpenWindow( int width, int height, const _GLFWwndconfig* wndconfig, const _GLFWfbconfig* fbconfig ) { _GLFWfbconfig closest; // Clear platform specific GLFW window state _glfwWin.refreshRate = wndconfig->refreshRate; _glfwWin.windowNoResize = wndconfig->windowNoResize; // As the 2.x API doesn't understand multiple display devices, we hardcode // this choice and hope for the best _glfwWin.screen = DefaultScreen( _glfwLibrary.display ); _glfwWin.root = RootWindow( _glfwLibrary.display, _glfwWin.screen ); // Create the invisible cursor for hidden cursor mode _glfwWin.cursor = createNULLCursor( _glfwLibrary.display, _glfwWin.root ); initGLXExtensions(); // Choose the best available fbconfig { unsigned int fbcount; _GLFWfbconfig *fbconfigs; const _GLFWfbconfig *result; fbconfigs = getFBConfigs( &fbcount ); if( !fbconfigs ) { return GL_FALSE; } result = _glfwChooseFBConfig( fbconfig, fbconfigs, fbcount ); if( !result ) { free( fbconfigs ); return GL_FALSE; } closest = *result; free( fbconfigs ); } if( !createContext( wndconfig, (GLXFBConfigID) closest.platformID ) ) { return GL_FALSE; } if( !createWindow( width, height, wndconfig ) ) { return GL_FALSE; } if( wndconfig->mode == GLFW_FULLSCREEN ) { #if defined( _GLFW_HAS_XRANDR ) // Request screen change notifications if( _glfwLibrary.XRandR.available ) { XRRSelectInput( _glfwLibrary.display, _glfwWin.window, RRScreenChangeNotifyMask ); } #endif enterFullscreenMode(); } // Process the window map event and any other that may have arrived _glfwPlatformPollEvents(); // Retrieve and set initial cursor position { Window window, root; int windowX, windowY, rootX, rootY; unsigned int mask; XQueryPointer( _glfwLibrary.display, _glfwWin.window, &root, &window, &rootX, &rootY, &windowX, &windowY, &mask ); // TODO: Probably check for some corner cases here. _glfwInput.MousePosX = windowX; _glfwInput.MousePosY = windowY; } // Connect the context to the window glXMakeCurrent( _glfwLibrary.display, _glfwWin.window, _glfwWin.context ); return GL_TRUE; } //======================================================================== // Properly kill the window/video display //======================================================================== void _glfwPlatformCloseWindow( void ) { if( _glfwWin.fullscreen ) { leaveFullscreenMode(); } if( _glfwWin.context ) { // Release and destroy the context glXMakeCurrent( _glfwLibrary.display, None, NULL ); glXDestroyContext( _glfwLibrary.display, _glfwWin.context ); _glfwWin.context = NULL; } if( _glfwWin.visual ) { XFree( _glfwWin.visual ); _glfwWin.visual = NULL; } if( _glfwWin.window ) { XUnmapWindow( _glfwLibrary.display, _glfwWin.window ); XDestroyWindow( _glfwLibrary.display, _glfwWin.window ); _glfwWin.window = (Window) 0; } if( _glfwWin.colormap ) { XFreeColormap( _glfwLibrary.display, _glfwWin.colormap ); _glfwWin.colormap = (Colormap) 0; } if( _glfwWin.cursor ) { XFreeCursor( _glfwLibrary.display, _glfwWin.cursor ); _glfwWin.cursor = (Cursor) 0; } } //======================================================================== // Set the window title //======================================================================== void _glfwPlatformSetWindowTitle( const char *title ) { // Set window & icon title XStoreName( _glfwLibrary.display, _glfwWin.window, title ); XSetIconName( _glfwLibrary.display, _glfwWin.window, title ); } //======================================================================== // Set the window size //======================================================================== void _glfwPlatformSetWindowSize( int width, int height ) { int mode = 0, rate, sizeChanged = GL_FALSE; XSizeHints *sizehints; rate = _glfwWin.refreshRate; if( _glfwWin.fullscreen ) { // Get the closest matching video mode for the specified window size mode = _glfwGetClosestVideoMode( _glfwWin.screen, &width, &height, &rate ); } if( _glfwWin.windowNoResize ) { // Update window size restrictions to match new window size sizehints = XAllocSizeHints(); sizehints->flags = 0; sizehints->min_width = sizehints->max_width = width; sizehints->min_height = sizehints->max_height = height; XSetWMNormalHints( _glfwLibrary.display, _glfwWin.window, sizehints ); XFree( sizehints ); } // Change window size before changing fullscreen mode? if( _glfwWin.fullscreen && (width > _glfwWin.width) ) { XResizeWindow( _glfwLibrary.display, _glfwWin.window, width, height ); sizeChanged = GL_TRUE; } if( _glfwWin.fullscreen ) { // Change video mode, keeping current refresh rate _glfwSetVideoModeMODE( _glfwWin.screen, mode, _glfwWin.refreshRate ); } // Set window size (if not already changed) if( !sizeChanged ) { XResizeWindow( _glfwLibrary.display, _glfwWin.window, width, height ); } } //======================================================================== // Set the window position. //======================================================================== void _glfwPlatformSetWindowPos( int x, int y ) { XMoveWindow( _glfwLibrary.display, _glfwWin.window, x, y ); } //======================================================================== // Window iconification //======================================================================== void _glfwPlatformIconifyWindow( void ) { if( _glfwWin.overrideRedirect ) { // We can't iconify/restore override-redirect windows, as that's // performed by the window manager return; } XIconifyWindow( _glfwLibrary.display, _glfwWin.window, _glfwWin.screen ); } //======================================================================== // Window un-iconification //======================================================================== void _glfwPlatformRestoreWindow( void ) { if( _glfwWin.overrideRedirect ) { // We can't iconify/restore override-redirect windows, as that's // performed by the window manager return; } XMapWindow( _glfwLibrary.display, _glfwWin.window ); } //======================================================================== // Swap OpenGL buffers and poll any new events //======================================================================== void _glfwPlatformSwapBuffers( void ) { // Update display-buffer glXSwapBuffers( _glfwLibrary.display, _glfwWin.window ); } //======================================================================== // Set double buffering swap interval //======================================================================== void _glfwPlatformSwapInterval( int interval ) { if( _glfwWin.has_GLX_SGI_swap_control ) { _glfwWin.SwapIntervalSGI( interval ); } } //======================================================================== // Read back framebuffer parameters from the context //======================================================================== void _glfwPlatformRefreshWindowParams( void ) { int dummy; GLXFBConfig *fbconfig; #if defined( _GLFW_HAS_XRANDR ) XRRScreenConfiguration *sc; #elif defined( _GLFW_HAS_XF86VIDMODE ) XF86VidModeModeLine modeline; int dotclock; float pixels_per_second, pixels_per_frame; #endif int attribs[] = { GLX_FBCONFIG_ID, _glfwWin.fbconfigID, None }; if( _glfwWin.has_GLX_SGIX_fbconfig ) { fbconfig = _glfwWin.ChooseFBConfigSGIX( _glfwLibrary.display, _glfwWin.screen, attribs, &dummy ); } else { fbconfig = glXChooseFBConfig( _glfwLibrary.display, _glfwWin.screen, attribs, &dummy ); } if( fbconfig == NULL ) { // This should never ever happen // TODO: Figure out what to do when this happens fprintf( stderr, "Cannot find known GLXFBConfig by ID. " "This cannot happen. Have a nice day.\n"); abort(); } // There is no clear definition of an "accelerated" context on X11/GLX, and // true sounds better than false, so we hardcode true here _glfwWin.accelerated = GL_TRUE; _glfwWin.redBits = getFBConfigAttrib( *fbconfig, GLX_RED_SIZE ); _glfwWin.greenBits = getFBConfigAttrib( *fbconfig, GLX_GREEN_SIZE ); _glfwWin.blueBits = getFBConfigAttrib( *fbconfig, GLX_BLUE_SIZE ); _glfwWin.alphaBits = getFBConfigAttrib( *fbconfig, GLX_ALPHA_SIZE ); _glfwWin.depthBits = getFBConfigAttrib( *fbconfig, GLX_DEPTH_SIZE ); _glfwWin.stencilBits = getFBConfigAttrib( *fbconfig, GLX_STENCIL_SIZE ); _glfwWin.accumRedBits = getFBConfigAttrib( *fbconfig, GLX_ACCUM_RED_SIZE ); _glfwWin.accumGreenBits = getFBConfigAttrib( *fbconfig, GLX_ACCUM_GREEN_SIZE ); _glfwWin.accumBlueBits = getFBConfigAttrib( *fbconfig, GLX_ACCUM_BLUE_SIZE ); _glfwWin.accumAlphaBits = getFBConfigAttrib( *fbconfig, GLX_ACCUM_ALPHA_SIZE ); _glfwWin.auxBuffers = getFBConfigAttrib( *fbconfig, GLX_AUX_BUFFERS ); _glfwWin.stereo = getFBConfigAttrib( *fbconfig, GLX_STEREO ) ? 1 : 0; // Get FSAA buffer sample count if( _glfwWin.has_GLX_ARB_multisample ) { _glfwWin.samples = getFBConfigAttrib( *fbconfig, GLX_SAMPLES ); } else { _glfwWin.samples = 0; } // Default to refresh rate unknown (=0 according to GLFW spec) _glfwWin.refreshRate = 0; // Retrieve refresh rate if possible #if defined( _GLFW_HAS_XRANDR ) if( _glfwLibrary.XRandR.available ) { sc = XRRGetScreenInfo( _glfwLibrary.display, _glfwWin.root ); _glfwWin.refreshRate = XRRConfigCurrentRate( sc ); XRRFreeScreenConfigInfo( sc ); } #elif defined( _GLFW_HAS_XF86VIDMODE ) if( _glfwLibrary.XF86VidMode.available ) { // Use the XF86VidMode extension to get current video mode XF86VidModeGetModeLine( _glfwLibrary.display, _glfwWin.screen, &dotclock, &modeline ); pixels_per_second = 1000.0f * (float) dotclock; pixels_per_frame = (float) modeline.htotal * modeline.vtotal; _glfwWin.refreshRate = (int)(pixels_per_second/pixels_per_frame+0.5); } #endif XFree( fbconfig ); } //======================================================================== // Poll for new window and input events //======================================================================== void _glfwPlatformPollEvents( void ) { GLboolean closeRequested = GL_FALSE; // Flag that the cursor has not moved _glfwInput.MouseMoved = GL_FALSE; // Process all pending events while( XPending( _glfwLibrary.display ) ) { if( processSingleEvent() ) { closeRequested = GL_TRUE; } } // Did we get mouse movement in fully enabled hidden cursor mode? if( _glfwInput.MouseMoved && _glfwWin.pointerHidden ) { _glfwPlatformSetMouseCursorPos( _glfwWin.width/2, _glfwWin.height/2 ); // NOTE: This is a temporary fix. It works as long as you use offsets // accumulated over the course of a frame, instead of performing // the necessary actions per callback call. XFlush( _glfwLibrary.display ); } if( closeRequested && _glfwWin.windowCloseCallback ) { closeRequested = _glfwWin.windowCloseCallback(); } if( closeRequested ) { glfwCloseWindow(); } } //======================================================================== // Wait for new window and input events //======================================================================== void _glfwPlatformWaitEvents( void ) { XEvent event; // Block waiting for an event to arrive XNextEvent( _glfwLibrary.display, &event ); XPutBackEvent( _glfwLibrary.display, &event ); _glfwPlatformPollEvents(); } //======================================================================== // Hide mouse cursor (lock it) //======================================================================== void _glfwPlatformHideMouseCursor( void ) { // Hide cursor if( !_glfwWin.pointerHidden ) { XDefineCursor( _glfwLibrary.display, _glfwWin.window, _glfwWin.cursor ); _glfwWin.pointerHidden = GL_TRUE; } // Grab cursor to user window if( !_glfwWin.pointerGrabbed ) { if( XGrabPointer( _glfwLibrary.display, _glfwWin.window, True, ButtonPressMask | ButtonReleaseMask | PointerMotionMask, GrabModeAsync, GrabModeAsync, _glfwWin.window, None, CurrentTime ) == GrabSuccess ) { _glfwWin.pointerGrabbed = GL_TRUE; } } } //======================================================================== // Show mouse cursor (unlock it) //======================================================================== void _glfwPlatformShowMouseCursor( void ) { // Un-grab cursor (only in windowed mode: in fullscreen mode we still // want the mouse grabbed in order to confine the cursor to the window // area) if( _glfwWin.pointerGrabbed ) { XUngrabPointer( _glfwLibrary.display, CurrentTime ); _glfwWin.pointerGrabbed = GL_FALSE; } // Show cursor if( _glfwWin.pointerHidden ) { XUndefineCursor( _glfwLibrary.display, _glfwWin.window ); _glfwWin.pointerHidden = GL_FALSE; } } //======================================================================== // Set physical mouse cursor position //======================================================================== void _glfwPlatformSetMouseCursorPos( int x, int y ) { // Store the new position so we can recognise it later _glfwInput.CursorPosX = x; _glfwInput.CursorPosY = y; XWarpPointer( _glfwLibrary.display, None, _glfwWin.window, 0,0,0,0, x, y ); } GLFW-0.5.1.0/Graphics/0000755000000000000000000000000012045371042012336 5ustar0000000000000000GLFW-0.5.1.0/Graphics/UI/0000755000000000000000000000000012045371042012653 5ustar0000000000000000GLFW-0.5.1.0/Graphics/UI/GLFW.hs0000644000000000000000000103254012045371042013753 0ustar0000000000000000-- | Haskell Interface to GLFW (). -- Supports GLFW API version 2.7.5. -- -- GLFW thread functions are not supported by this module; use -- Haskell thread instead. {-# LANGUAGE CPP, ExistentialQuantification, ForeignFunctionInterface, TypeFamilies #-} module Graphics.UI.GLFW ( -- * Data types Version , DisplayBits(..) , WindowMode(..) , VideoMode(..) , KeyButtonState(..) , Key(..) , SpecialKey(..) , MouseButton(..) , Joystick (..) , JoystickParam (..) , SpecialFeature(..) , TextureFlag(..) , BitmapFont(..) , WindowCloseCallback , WindowSizeCallback , WindowRefreshCallback , KeyCallback , CharCallback , MouseButtonCallback , MousePosCallback , MouseWheelCallback -- * Initialization and Termination , initialize , terminate , version -- * Window Handling , openWindow , closeWindow , windowTitle , windowSize , windowPos , iconifyWindow , restoreWindow , swapBuffers , swapInterval -- * Video Modes , videoModes , desktopMode -- * Input Handling , pollEvents , waitEvents , getKey , getMouseButton , mousePos , mouseWheel , joystickParam , joystickPos , joystickPos' , joystickButtons -- * Callbacks -- ** Window callbacks , windowSizeCallback , windowCloseCallback , windowRefreshCallback -- ** Input callbacks , keyCallback , charCallback , mouseButtonCallback , mousePosCallback , mouseWheelCallback -- * Timing , time , sleep -- * OpenGL Extension Support , extensionSupported , glVersion -- * Texture loading , loadTexture2D , loadMemoryTexture2D -- * Text rendering , renderString -- * Miscellaneous , enableSpecial , disableSpecial -- * Window parameters and hints , ParamVal , Param(..) , Hint(..) , Opened(..) , Active(..) , Iconified(..) , Accelerated(..) , RedBits(..) , GreenBits(..) , BlueBits(..) , AlphaBits(..) , DepthBits(..) , StencilBits(..) , RefreshRate(..) , AccumRedBits(..) , AccumGreenBits(..) , AccumBlueBits(..) , AccumAlphaBits(..) , AuxBuffers(..) , Stereo(..) , NoResize(..) , FSAASamples(..) , OpenGLVersionMajor(..) , OpenGLVersionMinor(..) , OpenGLForwardCompat(..) , OpenGLDebugContext(..) , OpenGLProfile(..) , Profile(..) ) where import Control.Monad (liftM, liftM2) import Data.IORef (IORef, atomicModifyIORef, newIORef, readIORef, writeIORef) import Foreign hiding (unsafePerformIO) -- deprecated in next release. import Foreign.C import System.IO.Unsafe (unsafePerformIO) import Graphics.Rendering.OpenGL (GLfloat, ($=)) import qualified Graphics.Rendering.OpenGL as GL -- | Version is represented by (major, minor, revision), used -- in gettable variable 'version'. type Version = (Int, Int, Int) -- | Bit depth of GL display buffers, used in 'openWindow'. data DisplayBits = DisplayRGBBits !Int !Int !Int | DisplayAlphaBits !Int | DisplayDepthBits !Int | DisplayStencilBits !Int deriving (Eq, Show) -- | Window or Fullscreen mode, used in 'openWindow'. data WindowMode = Window | FullScreen deriving (Eq, Show) instance Enum WindowMode where fromEnum Window = 0x00010001 fromEnum FullScreen = 0x00010002 toEnum 0x00010001 = Window toEnum 0x00010002 = FullScreen toEnum _ = error "GLFW: WindowMode toEnum out of bounds" -- | We use type families to organize Window params that -- can be retrieved using 'getParam' of the 'Param' class. -- The value of a param 'a' is of type 'ParamVal' 'a', -- where 'ParamVal' is a type family defined as follows: -- -- > ParamVal Opened = Bool -- > ParamVal Active = Bool -- > ParamVal Iconified = Bool -- > ParamVal Accelerated = Bool -- > ParamVal RedBits = Int -- > ParamVal GreenBits = Int -- > ParamVal BlueBits = Int -- > ParamVal AlphaBits = Int -- > ParamVal DepthBits = Int -- > ParamVal StencilBits = Int -- -- The following are both params and hints that can be set using -- 'openWindowHint' of the 'Hint' class. -- -- > ParamVal RefreshRate = Int -- > ParamVal AccumRedBits = Int -- > ParamVal AccumGreenBits = Int -- > ParamVal AccumBlueBits = Int -- > ParamVal AccumAlphaBits = Int -- > ParamVal AuxBuffers = Int -- > ParamVal Stereo = Bool -- > ParamVal NoResize = Bool -- > ParamVal FSAASamples = Int -- > ParamVal OpenGLVersionMajor = Int -- > ParamVal OpenGLVersionMinor = Int -- > ParamVal OpenGLForwardCompat = Bool -- > ParamVal OpenGLDebugContext = Bool -- > ParamVal OpenGLProfile = Profile -- type family ParamVal a class Param a where getParam :: a -> IO (ParamVal a) class Param a => Hint a where openWindowHint :: a -> ParamVal a -> IO () data Opened = Opened data Active = Active data Iconified = Iconified data Accelerated = Accelerated data RedBits = RedBits data GreenBits = GreenBits data BlueBits = BlueBits data AlphaBits = AlphaBits data DepthBits = DepthBits data StencilBits = StencilBits data RefreshRate = RefreshRate data AccumRedBits = AccumRedBits data AccumGreenBits = AccumGreenBits data AccumBlueBits = AccumBlueBits data AccumAlphaBits = AccumAlphaBits data AuxBuffers = AuxBuffers data Stereo = Stereo data NoResize = NoResize data FSAASamples = FSAASamples data OpenGLVersionMajor = OpenGLVersionMajor data OpenGLVersionMinor = OpenGLVersionMinor data OpenGLForwardCompat = OpenGLForwardCompat data OpenGLDebugContext = OpenGLDebugContext data OpenGLProfile = OpenGLProfile type instance ParamVal Opened = Bool type instance ParamVal Active = Bool type instance ParamVal Iconified = Bool type instance ParamVal Accelerated = Bool type instance ParamVal RedBits = Int type instance ParamVal GreenBits = Int type instance ParamVal BlueBits = Int type instance ParamVal AlphaBits = Int type instance ParamVal DepthBits = Int type instance ParamVal StencilBits = Int type instance ParamVal RefreshRate = Int type instance ParamVal AccumRedBits = Int type instance ParamVal AccumGreenBits = Int type instance ParamVal AccumBlueBits = Int type instance ParamVal AccumAlphaBits = Int type instance ParamVal AuxBuffers = Int type instance ParamVal Stereo = Bool type instance ParamVal NoResize = Bool type instance ParamVal FSAASamples = Int type instance ParamVal OpenGLVersionMajor = Int type instance ParamVal OpenGLVersionMinor = Int type instance ParamVal OpenGLForwardCompat = Bool type instance ParamVal OpenGLDebugContext = Bool type instance ParamVal OpenGLProfile = Profile -- | OpenGL profiles, used in 'openWindowHint' with 'OpenGLProfile'. data Profile = DefaultProfile | OpenGLCoreProfile | OpenGLCompatProfile deriving (Eq, Show) instance Enum Profile where fromEnum DefaultProfile = 0 fromEnum OpenGLCoreProfile = 0x00050001 fromEnum OpenGLCompatProfile = 0x00050002 toEnum 0 = DefaultProfile toEnum 0x00050001 = OpenGLCoreProfile toEnum 0x00050002 = OpenGLCompatProfile toEnum _ = error "GLFW: Profile toEnum out of bounds" -- | Video modes used in gettable variables 'videoModes' and 'desktopMode'. data VideoMode = VideoMode { videoWidth :: !Int , videoHeight :: !Int , videoRedBits :: !Int , videoBlueBits :: !Int , videoGreenBits :: !Int } deriving (Eq, Show) -- | Key or button state. data KeyButtonState = Release | Press deriving (Eq, Show, Enum) -- | Key is represented by either a character key or a special key. data Key = CharKey Char | SpecialKey SpecialKey deriving (Eq, Ord, Show) instance Enum Key where fromEnum (CharKey c) = fromEnum c fromEnum (SpecialKey c) = fromEnum c toEnum c = if c < 256 then CharKey (toEnum c) else SpecialKey (toEnum c) -- | Special key is a key not represented in the 32 - 127 printable ASCII range. data SpecialKey = UNKNOWN | ESC | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | F13 | F14 | F15 | F16 | F17 | F18 | F19 | F20 | F21 | F22 | F23 | F24 | F25 | UP | DOWN | LEFT | RIGHT | LSHIFT | RSHIFT | LCTRL | RCTRL | LALT | RALT | TAB | ENTER | BACKSPACE | INSERT | DEL | PAGEUP | PAGEDOWN | HOME | END | KP_0 | KP_1 | KP_2 | KP_3 | KP_4 | KP_5 | KP_6 | KP_7 | KP_8 | KP_9 | KP_DIVIDE | KP_MULTIPLY | KP_SUBTRACT | KP_ADD | KP_DECIMAL | KP_EQUAL | KP_ENTER deriving (Eq, Ord, Show) instance Enum SpecialKey where fromEnum UNKNOWN = -1 fromEnum ESC = 257 fromEnum F1 = 258 fromEnum F2 = 259 fromEnum F3 = 260 fromEnum F4 = 261 fromEnum F5 = 262 fromEnum F6 = 263 fromEnum F7 = 264 fromEnum F8 = 265 fromEnum F9 = 266 fromEnum F10 = 267 fromEnum F11 = 268 fromEnum F12 = 269 fromEnum F13 = 270 fromEnum F14 = 271 fromEnum F15 = 272 fromEnum F16 = 273 fromEnum F17 = 274 fromEnum F18 = 275 fromEnum F19 = 276 fromEnum F20 = 277 fromEnum F21 = 278 fromEnum F22 = 279 fromEnum F23 = 280 fromEnum F24 = 281 fromEnum F25 = 282 fromEnum UP = 283 fromEnum DOWN = 284 fromEnum LEFT = 285 fromEnum RIGHT = 286 fromEnum LSHIFT = 287 fromEnum RSHIFT = 288 fromEnum LCTRL = 289 fromEnum RCTRL = 290 fromEnum LALT = 291 fromEnum RALT = 292 fromEnum TAB = 293 fromEnum ENTER = 294 fromEnum BACKSPACE = 295 fromEnum INSERT = 296 fromEnum DEL = 297 fromEnum PAGEUP = 298 fromEnum PAGEDOWN = 299 fromEnum HOME = 300 fromEnum END = 301 fromEnum KP_0 = 302 fromEnum KP_1 = 303 fromEnum KP_2 = 304 fromEnum KP_3 = 305 fromEnum KP_4 = 306 fromEnum KP_5 = 307 fromEnum KP_6 = 308 fromEnum KP_7 = 309 fromEnum KP_8 = 310 fromEnum KP_9 = 311 fromEnum KP_DIVIDE = 312 fromEnum KP_MULTIPLY = 313 fromEnum KP_SUBTRACT = 314 fromEnum KP_ADD = 315 fromEnum KP_DECIMAL = 316 fromEnum KP_EQUAL = 317 fromEnum KP_ENTER = 318 toEnum 257 = ESC toEnum 258 = F1 toEnum 259 = F2 toEnum 260 = F3 toEnum 261 = F4 toEnum 262 = F5 toEnum 263 = F6 toEnum 264 = F7 toEnum 265 = F8 toEnum 266 = F9 toEnum 267 = F10 toEnum 268 = F11 toEnum 269 = F12 toEnum 270 = F13 toEnum 271 = F14 toEnum 272 = F15 toEnum 273 = F16 toEnum 274 = F17 toEnum 275 = F18 toEnum 276 = F19 toEnum 277 = F20 toEnum 278 = F21 toEnum 279 = F22 toEnum 280 = F23 toEnum 281 = F24 toEnum 282 = F25 toEnum 283 = UP toEnum 284 = DOWN toEnum 285 = LEFT toEnum 286 = RIGHT toEnum 287 = LSHIFT toEnum 288 = RSHIFT toEnum 289 = LCTRL toEnum 290 = RCTRL toEnum 291 = LALT toEnum 292 = RALT toEnum 293 = TAB toEnum 294 = ENTER toEnum 295 = BACKSPACE toEnum 296 = INSERT toEnum 297 = DEL toEnum 298 = PAGEUP toEnum 299 = PAGEDOWN toEnum 300 = HOME toEnum 301 = END toEnum 302 = KP_0 toEnum 303 = KP_1 toEnum 304 = KP_2 toEnum 305 = KP_3 toEnum 306 = KP_4 toEnum 307 = KP_5 toEnum 308 = KP_6 toEnum 309 = KP_7 toEnum 310 = KP_8 toEnum 311 = KP_9 toEnum 312 = KP_DIVIDE toEnum 313 = KP_MULTIPLY toEnum 314 = KP_SUBTRACT toEnum 315 = KP_ADD toEnum 316 = KP_DECIMAL toEnum 317 = KP_EQUAL toEnum 318 = KP_ENTER toEnum _ = UNKNOWN -- | Mouse button is represented by left, right, middle or a number from 0 to -- 7. /Differs from the C API./ data MouseButton = ButtonLeft | ButtonRight | ButtonMiddle | ButtonNo Int deriving (Eq, Show) instance Enum MouseButton where fromEnum ButtonLeft = 0 fromEnum ButtonRight = 1 fromEnum ButtonMiddle = 2 fromEnum (ButtonNo i) | i < 0 = 0 | i < _GLFW_MOUSE_BUTTON_LAST = i | otherwise = _GLFW_MOUSE_BUTTON_LAST toEnum 0 = ButtonLeft toEnum 1 = ButtonRight toEnum 2 = ButtonMiddle toEnum i = ButtonNo i -- | Joystick is represent a number from 0 to 15. /Differs from the C API./ newtype Joystick = Joystick Int deriving (Eq, Show) instance Enum Joystick where fromEnum (Joystick i) | i < 0 = 0 | i < _GLFW_JOYSTICK_LAST = i | otherwise = _GLFW_JOYSTICK_LAST toEnum i | i < _GLFW_JOYSTICK_LAST = Joystick i toEnum _ = Joystick _GLFW_JOYSTICK_LAST -- | Joystick parameters data JoystickParam -- | Indicates whether the joystick is present. = Present -- | Number of axes supported by the joystick. | Axes -- | Number of buttons supported by the joystick. | Buttons deriving (Eq, Show) instance Enum JoystickParam where fromEnum Present = 0x00050001 fromEnum Axes = 0x00050002 fromEnum Buttons = 0x00050003 toEnum 0x00050001 = Present toEnum 0x00050002 = Axes toEnum 0x00050003 = Buttons toEnum _ = error "GLFW: JoystickParam toEnum out of bounds" -- | Special features used in 'enableSpecial' and 'disableSpecial'. data SpecialFeature -- | When enabled, the mouse cursor is visible and mouse coordinates are relative to the -- upper left corner of the client area of the GLFW window. The coordinates are limited -- to the client area of the window. = MouseCursor -- | When enabled, keys which are pressed will not be released until they are physically -- released and checked with 'getKey'. | StickyKey -- | When enabled, mouse buttons which are pressed will not be released until they are -- physically released and checked with 'getMouseButton'. | StickyMouseButton -- | When enabled, pressing standard system key combinations, such as ALT+TAB under Windows, -- will give the normal behavior. | SystemKey -- | When enabled, the key and character callback functions are called repeatedly when a -- key is held down long enough (according to the system key repeat configuration). | KeyRepeat -- | When enabled, 'pollEvents' is automatically called each time 'swapBuffers' is called, -- immediately after the buffer swap itself. Enabled by default. | AutoPollEvent deriving (Eq, Show) instance Enum SpecialFeature where fromEnum MouseCursor = 0x00030001 fromEnum StickyKey = 0x00030002 fromEnum StickyMouseButton = 0x00030003 fromEnum SystemKey = 0x00030004 fromEnum KeyRepeat = 0x00030005 fromEnum AutoPollEvent = 0x00030006 toEnum 0x00030001 = MouseCursor toEnum 0x00030002 = StickyKey toEnum 0x00030003 = StickyMouseButton toEnum 0x00030004 = SystemKey toEnum 0x00030005 = KeyRepeat toEnum 0x00030006 = AutoPollEvent toEnum _ = error "GLFW: SpecialFeature toEnum out of bounds" -- | Texture flag used in 'loadTexture2D' and 'loadMemoryTexture2D'. data TextureFlag -- | Do not rescale to the closest 2^m x 2^n resolution. = NoRescale -- | Specifies that the origin of the loaded image should be in the upper left corner -- (default is the lower left corner). | OriginUL -- | Automatically build and upload all mipmap levels. | BuildMipMaps -- | Treat single component images as alpha maps rather than luminance maps. | AlphaMap deriving (Eq, Show) instance Enum TextureFlag where fromEnum NoRescale = 0x00000001 fromEnum OriginUL = 0x00000002 fromEnum BuildMipMaps = 0x00000004 fromEnum AlphaMap = 0x00000008 toEnum 0x00000001 = NoRescale toEnum 0x00000002 = OriginUL toEnum 0x00000004 = BuildMipMaps toEnum 0x00000008 = AlphaMap toEnum _ = error "GLFW: TextureFlag toEnum out of bounds" -- | Built-in bitmap font used in 'renderString'. data BitmapFont = Fixed8x16 -- ^ 8x16 fixed width font. deriving (Eq, Enum, Show) -- Mouse button definitions _GLFW_MOUSE_BUTTON_LAST :: Int _GLFW_MOUSE_BUTTON_LAST = 7 -- Joystick identifiers _GLFW_JOYSTICK_LAST :: Int _GLFW_JOYSTICK_LAST = 15 -- Time spans longer than this (seconds) are considered to be infinity _GLFW_INFINITY :: Double _GLFW_INFINITY = 100000 -- Callback function type type GLFWwindowsizefun = CInt -> CInt -> IO () type GLFWwindowclosefun = IO CInt type GLFWwindowrefreshfun = IO () type GLFWmousebuttonfun = CInt -> CInt -> IO () type GLFWmouseposfun = CInt -> CInt -> IO () type GLFWmousewheelfun = CInt -> IO () type GLFWkeyfun = CInt -> CInt -> IO () type GLFWcharfun = CInt -> CInt -> IO () -- | Initialize GLFW library. Returns 'True' if successful, 'False' otherwise. Must -- be called before any other GLFW functions. initialize :: IO Bool initialize = liftM toEnum' glfwInit toEnum' :: (Integral a, Enum b) => a -> b toEnum' = toEnum . fromIntegral fromEnum' :: (Enum a, Integral b) => a -> b fromEnum' = fromIntegral . fromEnum foreign import ccall unsafe glfwInit :: IO CInt -- | Terminate GLFW library after use. Before a program terminates, GLFW has to -- be terminated in order to free up resources, etc. terminate :: IO () terminate = glfwTerminate >> glfwCleanup foreign import ccall unsafe glfwTerminate :: IO () -- | Returns the GLFW C library version numbers. version :: GL.GettableStateVar Version version = GL.makeGettableStateVar $ with 0 $ \x -> with 0 $ \y -> with 0 $ \z -> do glfwGetVersion x y z peek3 (x, y, z) foreign import ccall unsafe glfwGetVersion :: Ptr CInt -> Ptr CInt -> Ptr CInt -> IO () -- | Open a window. Returns 'True' if successful, 'False' otherwise. GLFW -- applications can only open one window. -- -- If width is zero and height is not, width will be calculated as width = 4/3 height. -- -- If height is zero and width is not, height will be calculated as height = 3/4 width. -- -- If both width and height are zero, width is set to 640 and height to 480. -- -- Display bits default to 0 if no value is specified, meaning that particular buffer is not created. -- -- In fullscreen mode a resolution that best matches the given window dimensions will be chosen. -- -- In fullscreen mode the mouse cursor is hidden by default. To change the visibility of the mouse -- cursor, see, 'enableSpecial' and 'disableSpecial'. openWindow :: GL.Size -> [DisplayBits] -> WindowMode -> IO Bool openWindow (GL.Size w h) bits mode = do writeIORef fontTextures [] liftM toEnum' $ glfwOpenWindow (fromIntegral w) (fromIntegral h) (fromIntegral r') (fromIntegral g') (fromIntegral b') (fromIntegral a') (fromIntegral d') (fromIntegral s') (fromEnum' mode) where (r', g', b', a', d', s') = gather bits (0, 0, 0, 0, 0, 0) gather :: [DisplayBits] -> (Int, Int, Int, Int, Int, Int) -> (Int, Int, Int, Int, Int, Int) gather (x:xs) (r, g, b, a, d, s) = gather xs $ case x of DisplayRGBBits r_ g_ b_ -> (r_, g_, b_, a , d , s ) DisplayAlphaBits a_ -> (r , g , b , a_, d , s ) DisplayDepthBits d_ -> (r , g , b , a , d_, s ) DisplayStencilBits s_ -> (r , g , b , a , d , s_) gather [] vs = vs foreign import ccall unsafe glfwOpenWindow :: CInt -> CInt -> CInt -> CInt -> CInt -> CInt -> CInt -> CInt -> CInt -> IO CInt -- | Close the open window and destroy the associated OpenGL context. foreign import ccall unsafe "glfwCloseWindow" closeWindow :: IO () -- | Vertical monitor refresh rate in Hz (only used for fullscreen windows). -- Zero means system default. Use with caution: specifying a refresh rate can override the system's settings, -- in which case the display may be suboptimal, fail or even damage the monitor. instance Hint RefreshRate where openWindowHint RefreshRate = glfwOpenWindowHint 0x0002000B . fromIntegral -- | Specify the number of bits for the red channel of the accumulation buffer. instance Hint AccumRedBits where openWindowHint AccumRedBits = glfwOpenWindowHint 0x0002000C . fromIntegral -- | Specify the number of bits for the green channel of the accumulation buffer. instance Hint AccumGreenBits where openWindowHint AccumGreenBits = glfwOpenWindowHint 0x0002000D . fromIntegral -- | Specify the number of bits for the blue channel of the accumulation buffer. instance Hint AccumBlueBits where openWindowHint AccumBlueBits = glfwOpenWindowHint 0x0002000E . fromIntegral -- | Specify the number of bits for the alpha channel of the accumulation buffer. instance Hint AccumAlphaBits where openWindowHint AccumAlphaBits = glfwOpenWindowHint 0x0002000F . fromIntegral -- | Specify the number of auxiliary buffers. instance Hint AuxBuffers where openWindowHint AuxBuffers = glfwOpenWindowHint 0x00020010 . fromIntegral -- | Specify if stereo rendering should be supported. -- If Stereo is requested on a call to 'openWindowHint', but no stereo rendering pixel formats / framebuffer -- configs are available, 'openWindow' will fail. instance Hint Stereo where openWindowHint Stereo = glfwOpenWindowHint 0x00020011 . fromEnum' -- | Specify whether the window can be resized by the user. instance Hint NoResize where openWindowHint NoResize = glfwOpenWindowHint 0x00020012 . fromEnum' -- | Specify the number of samples to use for the multisampling buffer. instance Hint FSAASamples where openWindowHint FSAASamples = glfwOpenWindowHint 0x00020013 . fromIntegral -- | Specify the major number of the desired minimum OpenGL version. instance Hint OpenGLVersionMajor where openWindowHint OpenGLVersionMajor = glfwOpenWindowHint 0x00020014 . fromIntegral -- | Specify the minor number of the desired minimum OpenGL version. instance Hint OpenGLVersionMinor where openWindowHint OpenGLVersionMinor = glfwOpenWindowHint 0x00020015 . fromIntegral -- | Specify whether the OpenGL context should be forward-compatible (i.e. disallow legacy functionality). -- This should only be used when requesting OpenGL version 3.0 or above. instance Hint OpenGLForwardCompat where openWindowHint OpenGLForwardCompat = glfwOpenWindowHint 0x00020016 . fromEnum' -- | Specify whether a debug context should be created. instance Hint OpenGLDebugContext where openWindowHint OpenGLDebugContext = glfwOpenWindowHint 0x00020017 . fromEnum' -- | Specify the OpenGL profile the context should implement. For available profiles see 'Profile'. instance Hint OpenGLProfile where openWindowHint OpenGLProfile = glfwOpenWindowHint 0x00020018 . fromEnum' foreign import ccall unsafe glfwOpenWindowHint :: CInt -> CInt -> IO () -- | Set the title of the opened window. windowTitle :: GL.SettableStateVar String windowTitle = GL.makeSettableStateVar setter where setter = flip withCString glfwSetWindowTitle foreign import ccall unsafe glfwSetWindowTitle :: CString -> IO () -- | Get or set the size of the opened window. -- -- The dimensions denote the size of the client area of the window (i.e. excluding any -- window borders and decorations). -- -- If the window is in fullscreen mode when setting new dimensions, the video mode will -- be changed to a resolution that closest matches the given dimensions. -- -- The setter has no effect if the window is iconified. -- -- The OpenGL context is guaranteed to be preserved when the window is resized. windowSize :: GL.StateVar GL.Size windowSize = GL.makeStateVar getter setter where getter = with 0 $ \w -> with 0 $ \h -> do glfwGetWindowSize w h liftM2 GL.Size (fmap fromIntegral $ peek w) (fmap fromIntegral $ peek h) setter (GL.Size w h) = glfwSetWindowSize (fromIntegral w) (fromIntegral h) foreign import ccall unsafe glfwGetWindowSize :: Ptr CInt -> Ptr CInt -> IO () foreign import ccall unsafe glfwSetWindowSize :: CInt -> CInt -> IO () -- | Set the position of the opened window. -- -- The setter has no effect in fullscreen mode or if the window is iconified. -- -- On multi-monitor systems, the behavior of the setter is ill-defined. windowPos :: GL.SettableStateVar GL.Position windowPos = GL.makeSettableStateVar $ \(GL.Position x y) -> glfwSetWindowPos x y foreign import ccall unsafe "glfwSetWindowPos" glfwSetWindowPosC :: CInt -> CInt -> IO () glfwSetWindowPos :: GL.GLint -> GL.GLint -> IO () glfwSetWindowPos x y = glfwSetWindowPosC (fromIntegral x) (fromIntegral y) -- | Iconify the window. foreign import ccall unsafe "glfwIconifyWindow" iconifyWindow :: IO () -- | Restore the window after iconification. foreign import ccall unsafe "glfwRestoreWindow" restoreWindow :: IO () -- | Swap the back and front color buffers of the window. If 'AutoPollEvent' is -- enabled by 'enableSpecial' (which is the default), it also polls for new -- events before the swapping. foreign import ccall safe "glfwSwapBuffers" swapBuffers :: IO () -- | Set the minimum number of monitor retraces between each each buffer swap -- performed by 'swapBuffers'. If set to zero, buffer swaps will not be -- synchronized to the vertical refresh of the monitor. swapInterval :: GL.SettableStateVar Int swapInterval = GL.makeSettableStateVar (glfwSwapInterval . fromIntegral) foreign import ccall unsafe glfwSwapInterval :: CInt -> IO () -- | Query the window opened status. instance Param Opened where getParam Opened = fmap toEnum' $ glfwGetWindowParam 0x00020001 -- | Query the window active status. instance Param Active where getParam Active = fmap toEnum' $ glfwGetWindowParam 0x00020002 -- | Query the window iconified status. instance Param Iconified where getParam Iconified = fmap toEnum' $ glfwGetWindowParam 0x00020003 -- | Query the window hardware accelerated status. instance Param Accelerated where getParam Accelerated = fmap toEnum' $ glfwGetWindowParam 0x00020004 -- | Query the number of bits for the red color component. instance Param RedBits where getParam RedBits = fmap fromIntegral $ glfwGetWindowParam 0x00020005 -- | Query the number of bits for the green color component. instance Param GreenBits where getParam GreenBits = fmap fromIntegral $ glfwGetWindowParam 0x00020006 -- | Query the number of bits for the blue color component. instance Param BlueBits where getParam BlueBits = fmap fromIntegral $ glfwGetWindowParam 0x00020007 -- | Query the number of bits for the alpha buffer. instance Param AlphaBits where getParam AlphaBits = fmap fromIntegral $ glfwGetWindowParam 0x00020008 -- | Query the number of bits for the depth buffer. instance Param DepthBits where getParam DepthBits = fmap fromIntegral $ glfwGetWindowParam 0x00020009 -- | Query the number of bits for the stencil buffer. instance Param StencilBits where getParam StencilBits = fmap fromIntegral $ glfwGetWindowParam 0x0002000A -- | Query the vertical monitor refresh rate in Hz (only used for fullscreen windows). instance Param RefreshRate where getParam RefreshRate = fmap fromIntegral $ glfwGetWindowParam 0x0002000B -- | Query the number of bits for the red channel of the accumulation buffer. instance Param AccumRedBits where getParam AccumRedBits = fmap fromIntegral $ glfwGetWindowParam 0x0002000C -- | Query the number of bits for the green channel of the accumulation buffer. instance Param AccumGreenBits where getParam AccumGreenBits = fmap fromIntegral $ glfwGetWindowParam 0x0002000D -- | Query the number of bits for the blue channel of the accumulation buffer. instance Param AccumBlueBits where getParam AccumBlueBits = fmap fromIntegral $ glfwGetWindowParam 0x0002000E -- | Query the number of bits for the alpha channel of the accumulation buffer. instance Param AccumAlphaBits where getParam AccumAlphaBits = fmap fromIntegral $ glfwGetWindowParam 0x0002000F -- | Query the number of auxiliary buffers. instance Param AuxBuffers where getParam AuxBuffers = fmap fromIntegral $ glfwGetWindowParam 0x00020010 -- | Query whether the window supports stereo rendering. instance Param Stereo where getParam Stereo = fmap toEnum' $ glfwGetWindowParam 0x00020011 -- | Query whether the window can be resized by the user. instance Param NoResize where getParam NoResize = fmap toEnum' $ glfwGetWindowParam 0x00020012 -- | Query the number used for the multisampling buffer. instance Param FSAASamples where getParam FSAASamples = fmap fromIntegral $ glfwGetWindowParam 0x00020013 -- | Query the OpenGL major version. instance Param OpenGLVersionMajor where getParam OpenGLVersionMajor = fmap fromIntegral $ glfwGetWindowParam 0x00020014 -- | Query the OpenGL minor version. instance Param OpenGLVersionMinor where getParam OpenGLVersionMinor = fmap fromIntegral $ glfwGetWindowParam 0x00020015 -- | Query whether the current OpenGL context is forward-compatible. instance Param OpenGLForwardCompat where getParam OpenGLForwardCompat = fmap toEnum' $ glfwGetWindowParam 0x000200016 -- | Query whether the current OpenGL context is a debug context. instance Param OpenGLDebugContext where getParam OpenGLDebugContext = fmap toEnum' $ glfwGetWindowParam 0x00020017 -- | Query the OpenGL 'Profile' implemented by the current context. instance Param OpenGLProfile where getParam OpenGLProfile = fmap toEnum' $ glfwGetWindowParam 0x00020018 foreign import ccall unsafe glfwGetWindowParam :: CInt -> IO CInt -- | Callback type for 'windowSizeCallback'. type WindowSizeCallback = GL.Size -> IO () -- | Set the function that will be called every time the window size changes. windowSizeCallback :: GL.SettableStateVar WindowSizeCallback windowSizeCallback = GL.makeSettableStateVar (\f -> do let g w h = f $ GL.Size (fromIntegral w) (fromIntegral h) ptr <- glfwWrapFun2 g glfwSetCallbackIORef glfwWindowsizefun ptr glfwSetWindowSizeCallback ptr) -- glfwSetWindowSizeCallback executes the callback (see window.c), ccall cannot be marked unsafe foreign import ccall safe glfwSetWindowSizeCallback :: FunPtr GLFWwindowsizefun -> IO () -- | Callback type for 'windowCloseCallback'. The callback should return 'True' to close the window, and 'False' otherwise. type WindowCloseCallback = IO Bool -- | Set the function that will be called when the window is closed. windowCloseCallback :: GL.SettableStateVar WindowCloseCallback windowCloseCallback = GL.makeSettableStateVar (\f -> do ptr <- glfwWrapFunB (liftM fromEnum' f) glfwSetCallbackIORef glfwWindowclosefun ptr glfwSetWindowCloseCallback ptr) foreign import ccall safe glfwSetWindowCloseCallback :: FunPtr GLFWwindowclosefun -> IO () -- | Callback type for 'windowRefreshCallback'. type WindowRefreshCallback = IO () -- | Set the function that will be called when the window client area needs to -- be refreshed, which occurs when any part of the window client area is -- damaged and needs to be repainted (for instance, if a part of the window -- that was previously occluded by another window has become visible). windowRefreshCallback :: GL.SettableStateVar WindowRefreshCallback windowRefreshCallback = GL.makeSettableStateVar setter where setter f = do ptr <- glfwWrapFun0 f glfwSetCallbackIORef glfwWindowrefreshfun ptr glfwSetWindowRefreshCallback ptr foreign import ccall unsafe glfwSetWindowRefreshCallback :: FunPtr GLFWwindowrefreshfun -> IO () -- | Get a list of detected 'VideoMode's, the max number of which is limited to -- 256 for now. videoModes :: GL.GettableStateVar [VideoMode] videoModes = GL.makeGettableStateVar getter where getter = withArray (replicate (sizeOfVideoMode * maxCount) 0) $ \arr -> glfwGetVideoModes arr (fromIntegral maxCount) >>= filterMode arr filterMode _ 0 = return [] filterMode a c = do [w, h, r, b, g] <- peekArray 5 a let a' = advancePtr a sizeOfVideoMode rest <- filterMode a' (pred c) return $ videoMode w h r b g : rest foreign import ccall unsafe glfwGetVideoModes :: Ptr CInt -> CInt -> IO CInt sizeOfVideoMode :: Int sizeOfVideoMode = 5 maxCount :: Int maxCount = 256 videoMode :: CInt -> CInt -> CInt -> CInt -> CInt -> VideoMode videoMode w h r b g = VideoMode (fromIntegral w) (fromIntegral h) (fromIntegral r) (fromIntegral b) (fromIntegral g) -- | Get the 'VideoMode' of current desktop. desktopMode :: GL.GettableStateVar VideoMode desktopMode = GL.makeGettableStateVar getter where getter = withArray (replicate sizeOfVideoMode 0) $ \arr -> do glfwGetDesktopMode arr [w, h, r, b, g] <- peekArray 5 arr return $ videoMode w h r b g foreign import ccall unsafe glfwGetDesktopMode :: Ptr CInt -> IO () -- | Poll events, such as user input and window events. Upon calling this -- function, all window states, keyboard states and mouse states are updated. -- If any related callback functions are registered, these are called during -- the call of 'pollEvents'. -- -- 'pollEvents' is called implicitly from 'swapBuffers' if 'AutoPollEvent' is -- enabled (as it is by default). foreign import ccall safe "glfwPollEvents" pollEvents :: IO () -- | Wait for events, such as user input and window events. The calling thread -- will be put to sleep until any event appears in the event queue. -- When events are ready, the events will be processed just as they are -- processed by 'pollEvents'. foreign import ccall safe "glfwWaitEvents" waitEvents :: IO () -- | Return a 'KeyButtonState', either 'Release' or 'Press', of the indicated -- key. -- -- A window must be opened for the function to have any effect, and 'pollEvents', -- 'waitEvents' or 'swapBuffers' (with 'AutoPollEvent' enabled) must be called -- before any keyboard events are recorded and reported by 'getKey'. getKey :: Enum a => a -> IO KeyButtonState getKey = fmap toEnum' . glfwGetKey . fromEnum' foreign import ccall unsafe glfwGetKey :: CInt -> IO CInt -- | Return a 'KeyButtonState', either 'Release' or 'Press', of the indicated -- mouse button. -- -- A window must be opened for the function to have any effect, and 'pollEvents', -- 'waitEvents' or 'swapBuffers' (with 'AutoPollEvent' enabled) must be called -- before any mouse events are recorded and reported by 'getMouseButton'. getMouseButton :: MouseButton -> IO KeyButtonState getMouseButton = fmap toEnum' . glfwGetMouseButton . fromEnum' foreign import ccall unsafe glfwGetMouseButton :: CInt -> IO CInt -- | Set or get the mouse position. -- -- A window must be opened for the getter to have any effect, and 'pollEvents', -- 'waitEvents' or 'swapBuffers' (with 'AutoPollEvent' enabled) must be called -- before any mouse movements are recorded and reported by 'mousePos'. -- -- When setting the mouse position, if the cursor is visible (not disabled), the -- cursor will be moved to the specified position, relative to the upper left -- corner of the window client area and with the Y-axis down. If the cursor is -- hidden (disabled), only the mouse position that is reported by the getter is -- changed. mousePos :: GL.StateVar GL.Position mousePos = GL.makeStateVar getter setter where getter = with 0 (\x -> with 0 (\y -> do glfwGetMousePos x y mx <- peek x my <- peek y return $ GL.Position (fromIntegral mx) (fromIntegral my))) setter (GL.Position x y) = glfwSetMousePos (fromIntegral x) (fromIntegral y) foreign import ccall unsafe glfwGetMousePos :: Ptr CInt -> Ptr CInt -> IO () foreign import ccall unsafe glfwSetMousePos :: CInt -> CInt -> IO () -- | Set or get the mouse wheel position. -- -- A window must be opened for the getter to have any effect, and 'pollEvents', -- 'waitEvents' or 'swapBuffers' (with 'AutoPollEvent' enabled) must be called -- before any wheel movements are recorded and reported by 'mouseWheel'. mouseWheel :: GL.StateVar Int mouseWheel = GL.makeStateVar (liftM fromIntegral glfwGetMouseWheel) (glfwSetMouseWheel . fromIntegral) foreign import ccall unsafe glfwGetMouseWheel :: IO CInt foreign import ccall unsafe glfwSetMouseWheel :: CInt -> IO () -- | Get joystick parameters. -- -- The joystick information is updated every time the getter is queried. -- -- No window has to be opened for joystick information to be available. joystickParam :: Joystick -> JoystickParam -> GL.GettableStateVar CInt joystickParam j param = GL.makeGettableStateVar (glfwGetJoystickParam (fromEnum' j) (fromEnum' param)) foreign import ccall unsafe glfwGetJoystickParam :: CInt -> CInt -> IO CInt -- | Get a certain number of axis positions for the given joystick. If the -- number of positions requested is is greater than the number available, the -- unavailable positions will be 0. -- -- The joystick state is updated every time the getter is queried. -- -- No window has to be opened for joystick input to be available. joystickPos :: Joystick -> Int -> GL.GettableStateVar [Float] joystickPos j n = GL.makeGettableStateVar $ withArray (replicate n 0) $ \a -> do _ <- glfwGetJoystickPos (fromEnum' j) a (fromIntegral n) peekArray n a -- | Get joystick positions. The returned list contains the positions -- for all available axes for the given joystick. -- -- The joystick state is updated every time the getter is queried. -- -- No window has to be opened for joystick input to be available. joystickPos' :: Joystick -> GL.GettableStateVar [Float] joystickPos' j = GL.makeGettableStateVar $ do n <- glfwGetJoystickParam (fromEnum' j) (fromEnum' Axes) allocaArray (fromIntegral n) $ \a -> do n' <- glfwGetJoystickPos (fromEnum' j) a n peekArray (fromIntegral n') a foreign import ccall unsafe glfwGetJoystickPos :: CInt -> Ptr Float -> CInt -> IO CInt -- | Get joystick button states. The returned list contains the states -- for all available buttons for the given joystick. -- -- The joystick state is updated every time the getter is queried. -- -- No window has to be opened for joystick input to be available. joystickButtons :: Joystick -> GL.GettableStateVar [KeyButtonState] joystickButtons j = GL.makeGettableStateVar $ do n <- glfwGetJoystickParam (fromEnum' j) (fromEnum' Buttons) allocaArray (fromIntegral n) $ \a -> do n' <- glfwGetJoystickButtons (fromEnum' j) a n l <- peekArray (fromIntegral n') a return $ map (toEnum . fromEnum') l foreign import ccall unsafe glfwGetJoystickButtons :: CInt -> Ptr Int8 -> CInt -> IO CInt -- | Callback type for 'keyCallback'. type KeyCallback = Key -> KeyButtonState -> IO () -- | Set the function that will be called when there is a key event, i.e., -- every time the state of a single key is changed. The reported keys are -- unaffected by any modifiers (such as SHIFT or ALT). keyCallback :: GL.SettableStateVar KeyCallback keyCallback = GL.makeSettableStateVar setter where setter f = do let g k s = f (toEnum' k) (toEnum' s) ptr <- glfwWrapFun2 g glfwSetCallbackIORef glfwKeyfun ptr glfwSetKeyCallback ptr foreign import ccall unsafe glfwSetKeyCallback :: FunPtr GLFWkeyfun -> IO () -- | Callback type for 'charCallback'. type CharCallback = Char -> KeyButtonState -> IO () -- | Set the function that will be called when there is a character event, -- i.e., every time a key that results in a printable Unicode character is -- pressed or released. Characters are affected by modifiers (such as SHIFT -- or ALT). charCallback :: GL.SettableStateVar CharCallback charCallback = GL.makeSettableStateVar setter where setter f = do let g k s = f (toEnum' k) (toEnum' s) ptr <- glfwWrapFun2 g glfwSetCallbackIORef glfwCharfun ptr glfwSetCharCallback ptr foreign import ccall unsafe glfwSetCharCallback :: FunPtr GLFWcharfun -> IO () -- | Callback type for 'mouseButtonCallback'. type MouseButtonCallback = MouseButton -> KeyButtonState -> IO () -- | Set the function that will be called when there is a mouse button event, -- i.e., every time a mouse button is pressed or released. mouseButtonCallback :: GL.SettableStateVar MouseButtonCallback mouseButtonCallback = GL.makeSettableStateVar setter where setter f = do let g b s = f (toEnum' b) (toEnum' s) ptr <- glfwWrapFun2 g glfwSetCallbackIORef glfwMousebuttonfun ptr glfwSetMouseButtonCallback ptr foreign import ccall unsafe glfwSetMouseButtonCallback :: FunPtr GLFWmousebuttonfun -> IO () -- | Callback type for 'mousePosCallback'. type MousePosCallback = GL.Position -> IO () -- | Set the function that will be called when there is a mouse motion event, -- i.e., every time they mouse is moved. mousePosCallback :: GL.SettableStateVar MousePosCallback mousePosCallback = GL.makeSettableStateVar setter where setter f = do let g x y = f =<< do #if _GLASGOW_HASKELL__ >= 610 return $ GL.Position (fromIntegral x) (fromIntegral y) #else -- Work around bug in GHC FFI -- See http://hackage.haskell.org/trac/ghc/ticket/2594 with 0 $ \ptr -> do poke ptr x x32 <- peek (castPtr ptr) :: IO Int32 poke ptr y y32 <- peek (castPtr ptr) :: IO Int32 return $ GL.Position (fromIntegral x32) (fromIntegral y32) #endif ptr <- glfwWrapFun2 g glfwSetCallbackIORef glfwMouseposfun ptr glfwSetMousePosCallback ptr -- glfwSetMousePosCallback executes the callback (see input.c), ccall cannot be marked unsafe foreign import ccall safe glfwSetMousePosCallback :: FunPtr GLFWmouseposfun -> IO () -- | Callback type for 'mouseWheelCallback'. type MouseWheelCallback = Int -> IO () -- | Set the function that will be called when there is a mouse wheel event, -- i.e., every time the mouse wheel is turned. mouseWheelCallback :: GL.SettableStateVar MouseWheelCallback mouseWheelCallback = GL.makeSettableStateVar setter where setter f = do let g x = f =<< do #if 0 return (fromIntegral x) #else -- Work around bug in GHC FFI -- See http://hackage.haskell.org/trac/ghc/ticket/2594 with 0 $ \ptr -> do poke ptr x x32 <- peek (castPtr ptr) :: IO Int32 return $ fromIntegral x32 #endif ptr <- glfwWrapFun1 g glfwSetCallbackIORef glfwMousewheelfun ptr glfwSetMouseWheelCallback ptr -- glfwSetMouseWheelCallback executes the callback (see input.c), ccall cannot be marked unsafe foreign import ccall safe glfwSetMouseWheelCallback :: FunPtr GLFWmousewheelfun -> IO () -- | Get or set the value of the high precision timer. The time is measured in -- seconds as a double precision floating point number. -- -- Unless the timer has been set by the programmer, the time is measured as -- the number of seconds that have passed since 'initialize' was called. -- -- The resolution of the timer depends on which system the program is running on. time :: GL.StateVar Double time = GL.makeStateVar glfwGetTime glfwSetTime foreign import ccall unsafe glfwGetTime :: IO Double foreign import ccall unsafe glfwSetTime :: Double -> IO () -- | Put the calling thread to sleep for the requested period of time in -- seconds. -- -- The minimum amount of time it is possible to sleep is generally in the -- range 1ms to 20ms. foreign import ccall unsafe "glfwSleep" sleep :: Double -> IO () -- | Return 'True' if the extension is supported, 'False' otherwise. extensionSupported :: String -> IO Bool extensionSupported = liftM toEnum' . flip withCString glfwExtensionSupported foreign import ccall unsafe glfwExtensionSupported :: CString -> IO CInt -- | Returns the version numbers for the currently used OpenGL implementation. glVersion :: GL.GettableStateVar Version glVersion = GL.makeGettableStateVar $ with 0 $ \x -> with 0 $ \y -> with 0 $ \z -> do glfwGetGLVersion x y z peek3 (x, y, z) foreign import ccall unsafe glfwGetGLVersion :: Ptr CInt -> Ptr CInt -> Ptr CInt -> IO () -- TODO: -- foreign import ccall unsafe glfwGetProcAddress :: Ptr CChar -> FunPtr ? -- foreign import ccall unsafe glfwGetGLVersion :: Ptr Int -> Ptr Int -> Ptr Int -> IO () -- | Enable a 'SpecialFeature'. enableSpecial :: SpecialFeature -> IO () enableSpecial = glfwEnable . fromEnum' foreign import ccall unsafe glfwEnable :: CInt -> IO () -- | Disable a 'SpecialFeature'. disableSpecial :: SpecialFeature -> IO () disableSpecial = glfwDisable . fromEnum' foreign import ccall unsafe glfwDisable :: CInt -> IO () --foreign import ccall unsafe glfwReadImage :: Ptr CChar -> Ptr GLFWimage -> Int -> IO () --foreign import ccall unsafe glfwFreeImage :: Ptr GLFWimage -> IO () -- | Read an image from a file specified by the given string and upload the -- image to OpenGL texture memory. -- -- If BuildMipMaps flag is given, all mipmap levels for the loaded texture -- are generated and uploaded to texture memory. -- -- Unless the OriginUL flag is given, the origin of the texture is the lower -- left corner of the loaded image. If OriginUL is given, however, the first -- pixel is the upper left corner. -- -- For single component images (i.e. gray scale), the texture is uploaded as -- an alpha mask if the flag AlphaMap is set, otherwise it's uploaded as a -- luminance texture. -- -- It only supports the Truevision Targa verson 1 file (.tga). Supported -- pixel formats are: 8-bit gray scale, 8-bit paletted (24/32-bit color), -- 24-bit true color and 32-bit true color + alpha. -- -- Paletted images are translated into true color or true color + alpha pixel -- formats. -- -- The read texture is always rescaled to the nearest larger 2^m x 2^n -- resolution using bilinear interpolation if necessary. loadTexture2D :: String -> [TextureFlag] -> IO Bool loadTexture2D fname flag = do r <- withCString fname (`glfwLoadTexture2D` readFlag flag) return $ toEnum' r foreign import ccall unsafe glfwLoadTexture2D :: CString -> CInt -> IO CInt readFlag :: forall t. (Enum t) => [t] -> CInt readFlag = foldr ((.|.) . fromEnum') 0 -- | Read an image from the memory buffer (the given byte string) and -- upload the image to OpenGL texture memory. The rest is similar -- to 'loadTexture2D'. loadMemoryTexture2D :: String -> [TextureFlag] -> IO Bool loadMemoryTexture2D arr flag = withCAStringLen arr (\(ptr, len) -> do r <- glfwLoadMemoryTexture2D ptr (fromIntegral len) (readFlag flag) return $ toEnum' r) foreign import ccall unsafe glfwLoadMemoryTexture2D :: Ptr CChar -> CInt -> CInt -> IO CInt glfwWindowsizefun :: IORef (Maybe (FunPtr GLFWwindowsizefun)) glfwWindowclosefun :: IORef (Maybe (FunPtr GLFWwindowclosefun)) glfwWindowrefreshfun :: IORef (Maybe (FunPtr GLFWwindowrefreshfun)) glfwMousebuttonfun :: IORef (Maybe (FunPtr GLFWmousebuttonfun)) glfwMouseposfun :: IORef (Maybe (FunPtr GLFWmouseposfun)) glfwMousewheelfun :: IORef (Maybe (FunPtr GLFWmousewheelfun)) glfwKeyfun :: IORef (Maybe (FunPtr GLFWkeyfun)) glfwCharfun :: IORef (Maybe (FunPtr GLFWcharfun)) glfwWindowsizefun = unsafePerformIO (newIORef Nothing) glfwWindowclosefun = unsafePerformIO (newIORef Nothing) glfwWindowrefreshfun = unsafePerformIO (newIORef Nothing) glfwMousebuttonfun = unsafePerformIO (newIORef Nothing) glfwMouseposfun = unsafePerformIO (newIORef Nothing) glfwMousewheelfun = unsafePerformIO (newIORef Nothing) glfwKeyfun = unsafePerformIO (newIORef Nothing) glfwCharfun = unsafePerformIO (newIORef Nothing) foreign import ccall unsafe "wrapper" glfwWrapFun2 :: (CInt -> CInt -> IO ()) -> IO (FunPtr (CInt -> CInt -> IO ())) foreign import ccall unsafe "wrapper" glfwWrapFun1 :: (CInt -> IO ()) -> IO (FunPtr (CInt -> IO ())) foreign import ccall unsafe "wrapper" glfwWrapFunB :: IO CInt -> IO (FunPtr (IO CInt)) foreign import ccall unsafe "wrapper" glfwWrapFun0 :: IO () -> IO (FunPtr (IO ())) glfwSetCallbackIORef :: forall a. IORef (Maybe (FunPtr a)) -> FunPtr a -> IO () glfwSetCallbackIORef ref f = atomicModifyIORef ref (\g -> (Just f, g)) >>= maybe (return ()) freeHaskellFunPtr glfwCleanup :: IO () glfwCleanup = do cleanup glfwWindowsizefun cleanup glfwWindowclosefun cleanup glfwWindowrefreshfun cleanup glfwMousebuttonfun cleanup glfwMouseposfun cleanup glfwMousewheelfun cleanup glfwKeyfun cleanup glfwCharfun where cleanup :: IORef (Maybe (FunPtr a)) -> IO () cleanup ref = atomicModifyIORef ref (\g -> (Nothing, g)) >>= maybe (return ()) freeHaskellFunPtr -- text rendering fontTextures :: IORef [(BitmapFont, GL.TextureObject)] fontTextures = unsafePerformIO (newIORef []) loadFont :: BitmapFont -> IO GL.TextureObject loadFont name = do l <- readIORef fontTextures case lookup name l of Just font -> do (r, _) <- GL.areTexturesResident [font] if length r == 1 then return font else loadIt $ filter ((/=name) . fst) l Nothing -> loadIt l where bitmap = case name of Fixed8x16 -> bitmap8x16 loadIt l = do objs <- GL.genObjectNames 1 case objs of [font] -> do GL.textureBinding GL.Texture2D $= Just font -- this next line is important, otherwise it won't render the texture! GL.textureFilter GL.Texture2D $= ((GL.Linear', Nothing), GL.Linear') _ <- loadMemoryTexture2D bitmap [OriginUL, NoRescale] writeIORef fontTextures ((name, font):l) return font _ -> error "GLFW: loadFont Unable to load texture" renderChar :: (Enum a) => t -> a -> IO () renderChar _ c = do let y = fromIntegral (fromEnum c `rem` 16 * 16) / 256 x = fromIntegral (fromEnum c `quot` 16 * 8) / 128 dx = 8 / 128 dy = 16 / 256 h = 16 w = 8 GL.preservingMatrix $ GL.renderPrimitive GL.Quads (do GL.texCoord (texCoord2 x y) GL.vertex (vertex3 0 h 0) GL.texCoord (texCoord2 x (y + dy)) GL.vertex (vertex3 0 0 0) GL.texCoord (texCoord2 (x + dx) (y + dy)) GL.vertex (vertex3 w 0 0) GL.texCoord (texCoord2 (x + dx) y) GL.vertex (vertex3 w h 0)) GL.translate (vector3 w 0 0) -- | Render a text string using the given 'BitmapFont'. Text is rendered -- through texture, and is only possible with alpha enabled. renderString :: BitmapFont -> String -> IO () renderString name s = do font <- loadFont name GL.texture GL.Texture2D $= GL.Enabled GL.textureBinding GL.Texture2D $= Just font GL.preservingMatrix $ mapM_ (renderChar font) s GL.texture GL.Texture2D $= GL.Disabled peek3 :: (Ptr CInt, Ptr CInt, Ptr CInt) -> IO (Int, Int, Int) peek3 (x, y, z) = do x' <- peek x y' <- peek y z' <- peek z return (fromIntegral x', fromIntegral y', fromIntegral z') vector3 :: GLfloat -> GLfloat -> GLfloat -> GL.Vector3 GLfloat vector3 = GL.Vector3 vertex3 :: GLfloat -> GLfloat -> GLfloat -> GL.Vertex3 GLfloat vertex3 = GL.Vertex3 texCoord2 :: GLfloat -> GLfloat -> GL.TexCoord2 GLfloat texCoord2 = GL.TexCoord2 bitmap8x16 :: String bitmap8x16 = "\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x01\x20\x08\xff\xff\xff\xff\x00\xa7\xff\xff\xff\x00\x86\xff\xff\xff\xf3\x00\xff\xff\xff\x34\xcf\xff\xff\xff\x00\x01\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x04\xff\xff\xff\xf0\xff\xff\xff\xef\xff\xff\xff\x00\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x01\xff\xff\xff\xf0\xff\xff\xff\xef\xa8\xff\xff\xff\x00\x01\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x04\xff\xff\xff\xf0\xff\xff\xff\xef\xff\xff\xff\x00\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x04\xff\xff\xff\xf0\xff\xff\xff\xef\xff\xff\xff\x00\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x01\xff\xff\xff\xf0\xff\xff\xff\xef\xb0\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x2c\xff\xff\xff\xe8\xff\xff\xff\x07\xa4\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\xb0\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\xb6\xff\xff\xff\x68\x86\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x84\xff\xff\xff\x00\x04\xff\xff\xff\x0d\xff\xff\xff\xa8\xff\xff\xff\xf1\xff\xff\xff\xea\xff\xff\xff\x88\x8a\xff\xff\xff\x00\x04\xff\xff\xff\x28\xff\xff\xff\xcc\xff\xff\xff\xf3\xff\xff\xff\xb8\xff\xff\xff\x12\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x89\xff\xff\xff\x00\x04\xff\xff\xff\x5f\xff\xff\xff\xe6\xff\xff\xff\xf3\xff\xff\xff\xc5\xff\xff\xff\x32\x82\xff\xff\xff\x00\x02\xff\xff\xff\xf3\xff\xff\xff\xf4\xff\xff\xff\xff\x81\xff\xff\xff\xf3\x81\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xd7\xff\xff\xff\x01\xff\xff\xff\xe0\xff\xff\xff\xf0\xff\xff\xff\x5e\x81\xff\xff\xff\x00\x03\xff\xff\xff\x47\xff\xff\xff\xf3\xff\xff\xff\xf4\xff\xff\xff\xff\x81\xff\xff\xff\xf3\x00\xff\xff\xff\x1d\x88\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x02\xff\xff\xff\x40\xff\xff\xff\xdb\xff\xff\xff\x01\x85\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x84\xff\xff\xff\x00\x05\xff\xff\xff\x99\xff\xff\xff\xaa\xff\xff\xff\x08\xff\xff\xff\x12\xff\xff\xff\xcb\xff\xff\xff\x65\x89\xff\xff\xff\x00\x04\xff\xff\xff\xc7\xff\xff\xff\x75\xff\xff\xff\x02\xff\xff\xff\x9f\xff\xff\xff\x99\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x88\xff\xff\xff\x00\x05\xff\xff\xff\x0e\xff\xff\xff\xf9\xff\xff\xff\x49\xff\xff\xff\x00\xff\xff\xff\x3f\xff\xff\xff\x4a\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xd7\xff\xff\xff\x00\xff\xff\xff\x17\xff\xff\xff\x51\xff\xff\xff\xdf\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x8b\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x01\xff\xff\xff\xc9\xff\xff\xff\x54\x85\xff\xff\xff\x00\x01\xff\xff\xff\x01\xff\xff\xff\x0e\x84\xff\xff\xff\x00\x01\xff\xff\xff\xf0\xff\xff\xff\x2e\x81\xff\xff\xff\x00\x01\xff\xff\xff\x5b\xff\xff\xff\xbf\x88\xff\xff\xff\x00\x05\xff\xff\xff\x11\xff\xff\xff\xff\xff\xff\xff\x10\xff\xff\xff\x00\xff\xff\xff\x3d\xff\xff\xff\xe1\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x88\xff\xff\xff\x00\x02\xff\xff\xff\x1a\xff\xff\xff\xff\xff\xff\xff\x0d\x86\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xd7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x2f\xff\xff\xff\xf6\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x8b\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x01\xff\xff\xff\x54\xff\xff\xff\xca\x85\xff\xff\xff\x00\x01\xff\xff\xff\x26\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x02\xff\xff\xff\x19\xff\xff\xff\xff\xff\xff\xff\x06\x81\xff\xff\xff\x00\x01\xff\xff\xff\x33\xff\xff\xff\xe7\x88\xff\xff\xff\x00\x01\xff\xff\xff\x24\xff\xff\xff\xfd\x81\xff\xff\xff\x00\x01\xff\xff\xff\x2a\xff\xff\xff\xf3\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x89\xff\xff\xff\x00\x02\xff\xff\xff\xac\xff\xff\xff\xa8\xff\xff\xff\x01\x85\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xd7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x7f\xff\xff\xff\xdd\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x8b\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x02\xff\xff\xff\x01\xff\xff\xff\xdb\xff\xff\xff\x40\x84\xff\xff\xff\x00\x02\xff\xff\xff\x0c\xff\xff\xff\xf3\xff\xff\xff\x32\x82\xff\xff\xff\x00\x01\xff\xff\xff\x24\xff\xff\xff\xfc\x82\xff\xff\xff\x00\x01\xff\xff\xff\x29\xff\xff\xff\xf3\x88\xff\xff\xff\x00\x05\xff\xff\xff\x12\xff\xff\xff\xff\xff\xff\xff\x10\xff\xff\xff\x00\xff\xff\xff\x3d\xff\xff\xff\xe1\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x89\xff\xff\xff\x00\x02\xff\xff\xff\x0b\xff\xff\xff\xca\xff\xff\xff\x81\x85\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xd7\xff\xff\xff\x00\xff\xff\xff\x4d\xff\xff\xff\xd1\xff\xff\xff\x19\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x8b\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x01\xff\xff\xff\x68\xff\xff\xff\xb6\x85\xff\xff\xff\x00\x02\xff\xff\xff\x47\xff\xff\xff\xe0\xff\xff\xff\x2e\x81\xff\xff\xff\x00\x02\xff\xff\xff\x1a\xff\xff\xff\xff\xff\xff\xff\x06\x81\xff\xff\xff\x00\x01\xff\xff\xff\x33\xff\xff\xff\xe9\x89\xff\xff\xff\x00\x04\xff\xff\xff\xcc\xff\xff\xff\x76\xff\xff\xff\x02\xff\xff\xff\xa0\xff\xff\xff\x99\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x8a\xff\xff\xff\x00\x01\xff\xff\xff\x36\xff\xff\xff\xe8\x85\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xd7\xff\xff\xff\x00\xff\xff\xff\x93\xff\xff\xff\x44\x84\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x8b\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x02\xff\xff\xff\x07\xff\xff\xff\xe8\xff\xff\xff\x2c\x85\xff\xff\xff\x00\x01\xff\xff\xff\x58\xff\xff\xff\xd3\x81\xff\xff\xff\x00\x02\xff\xff\xff\x01\xff\xff\xff\xf3\xff\xff\xff\x2f\x81\xff\xff\xff\x00\x01\xff\xff\xff\x5c\xff\xff\xff\xc5\x89\xff\xff\xff\x00\x04\xff\xff\xff\x2c\xff\xff\xff\xcf\xff\xff\xff\xf3\xff\xff\xff\xb9\xff\xff\xff\x12\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x8a\xff\xff\xff\x00\x01\xff\xff\xff\x1f\xff\xff\xff\xf6\x85\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xd7\xff\xff\xff\x00\xff\xff\xff\x63\xff\xff\xff\x81\x83\xff\xff\xff\x00\x02\xff\xff\xff\xcc\xff\xff\xff\xf4\xff\xff\xff\xfb\x8b\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x84\xff\xff\xff\x00\x01\xff\xff\xff\x7c\xff\xff\xff\xa2\x82\xff\xff\xff\x00\x04\xff\xff\xff\x4f\xff\xff\xff\x25\xff\xff\xff\x00\xff\xff\xff\x69\xff\xff\xff\xe3\x82\xff\xff\xff\x00\x05\xff\xff\xff\xa2\xff\xff\xff\xac\xff\xff\xff\x09\xff\xff\xff\x14\xff\xff\xff\xcd\xff\xff\xff\x72\x90\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x8b\xff\xff\xff\x00\x00\xff\xff\xff\x0a\x84\xff\xff\xff\x00\x02\xff\xff\xff\x07\xff\xff\xff\x2d\xff\xff\xff\xf7\x81\xff\xff\xff\x07\x81\xff\xff\xff\x00\x01\xff\xff\xff\x23\xff\xff\xff\xdd\x81\xff\xff\xff\x00\x01\xff\xff\xff\x86\xff\xff\xff\xcf\x91\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x04\xff\xff\xff\xf4\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x01\xff\xff\xff\xf4\xff\xff\xff\xf7\x84\xff\xff\xff\x00\x02\xff\xff\xff\x11\xff\xff\xff\xee\xff\xff\xff\x1d\x81\xff\xff\xff\x00\x04\xff\xff\xff\x4d\xff\xff\xff\xd0\xff\xff\xff\xf5\xff\xff\xff\xdc\xff\xff\xff\x49\x82\xff\xff\xff\x00\x05\xff\xff\xff\x13\xff\xff\xff\xaf\xff\xff\xff\xf1\xff\xff\xff\xec\xff\xff\xff\x96\xff\xff\xff\x03\x90\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x04\xff\xff\xff\xf4\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x04\xff\xff\xff\xf4\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x01\xff\xff\xff\xf4\xff\xff\xff\xf7\x8a\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x84\xff\xff\xff\x00\x84\xff\xff\xff\xff\x81\xff\xff\xff\x00\x05\xff\xff\xff\x06\xff\xff\xff\xef\xff\xff\xff\x39\xff\xff\xff\x00\xff\xff\xff\x7b\xff\xff\xff\xc1\x91\xff\xff\xff\x00\xd0\xff\xff\xff\x00\x00\xff\xff\xff\x21\x82\xff\xff\xff\xf3\x00\xff\xff\xff\x56\x92\xff\xff\xff\x00\x04\xff\xff\xff\x51\xff\xff\xff\xdc\xff\xff\xff\xf5\xff\xff\xff\xce\xff\xff\xff\x2b\x82\xff\xff\xff\x00\x04\xff\xff\xff\x4f\xff\xff\xff\xcc\xff\xff\xff\x02\xff\xff\xff\xf3\xff\xff\xff\x30\x89\xff\xff\xff\x00\xe0\xff\xff\xff\x00\x04\xff\xff\xff\x4f\xff\xff\xff\xd7\xff\xff\xff\x07\xff\xff\xff\xff\xff\xff\xff\x3b\x99\xff\xff\xff\x00\xff\xff\xff\xff\x00\xff\xff\xff\xff\x00\xf7\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x01\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x04\xff\xff\xff\xf0\xff\xff\xff\xef\xff\xff\xff\x00\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x01\xff\xff\xff\xf0\xff\xff\xff\xef\xb0\xff\xff\xff\x00\x01\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x04\xff\xff\xff\xf0\xff\xff\xff\xef\xff\xff\xff\x00\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x01\xff\xff\xff\xf0\xff\xff\xff\xef\x8d\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x98\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\xb0\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x8a\xff\xff\xff\x00\x05\xff\xff\xff\x25\xff\xff\xff\xf7\xff\xff\xff\xef\xff\xff\xff\xf1\xff\xff\xff\xff\xff\xff\xff\x9c\x97\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x84\xff\xff\xff\x00\x00\xff\xff\xff\x04\x85\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\xa3\xff\xff\xff\xf7\x89\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x89\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x04\xff\xff\xff\x13\xff\xff\xff\xa8\xff\xff\xff\xe9\xff\xff\xff\xa4\xff\xff\xff\x1b\x83\xff\xff\xff\x00\x04\xff\xff\xff\x03\xff\xff\xff\xae\xff\xff\xff\x6a\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x84\xff\xff\xff\xff\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x03\xff\xff\xff\x41\xff\xff\xff\xdf\xff\xff\xff\xe4\xff\xff\xff\xff\x81\xff\xff\xff\xdf\x07\xff\xff\xff\x1b\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x8e\xff\xff\xff\xf1\xff\xff\xff\xc4\xff\xff\xff\x16\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x01\xff\xff\xff\x21\xff\xff\xff\xd7\x84\xff\xff\xff\x00\x02\xff\xff\xff\xe6\xff\xff\xff\x80\xff\xff\xff\x18\x83\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x00\xff\xff\xff\x08\xff\xff\xff\xeb\xff\xff\xff\xf7\x89\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x89\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x09\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x01\xff\xff\xff\x9a\xff\xff\xff\x39\xff\xff\xff\x04\xff\xff\xff\x67\xff\xff\xff\xe0\xff\xff\xff\x19\x83\xff\xff\xff\x00\x03\xff\xff\xff\x05\xff\xff\xff\xb1\xff\xff\xff\x62\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x02\xff\xff\xff\x07\xff\xff\xff\x2d\xff\xff\xff\xf7\x81\xff\xff\xff\x07\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x87\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xff\xff\xff\xff\x76\xff\xff\xff\x01\xff\xff\xff\x9e\xff\xff\xff\x9b\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x89\xff\xff\xff\x00\x04\xff\xff\xff\x2d\xff\xff\xff\x93\xff\xff\xff\xe9\xff\xff\xff\xa6\xff\xff\xff\x3a\x81\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x00\xff\xff\xff\x54\xff\xff\xff\xaf\xff\xff\xff\xf7\x89\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x89\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x11\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x76\xff\xff\xff\x67\xff\xff\xff\xd8\xff\xff\xff\x00\xff\xff\xff\xb0\xff\xff\xff\x91\xff\xff\xff\x9c\xff\xff\xff\x00\xff\xff\xff\x2a\xff\xff\xff\x2d\xff\xff\xff\x06\xff\xff\xff\x00\xff\xff\xff\x08\xff\xff\xff\xb4\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xff\xff\xff\xff\xef\xff\xff\xff\xf1\xff\xff\xff\xca\xff\xff\xff\x35\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xff\xff\xff\xff\x10\xff\xff\xff\x00\xff\xff\xff\x3d\xff\xff\xff\xe1\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x8b\xff\xff\xff\x00\x0a\xff\xff\xff\x09\xff\xff\xff\x5f\xff\xff\xff\xca\xff\xff\xff\xcd\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x00\xff\xff\xff\xac\xff\xff\xff\x57\xff\xff\xff\xf7\x89\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x08\xff\xff\xff\x7a\xff\xff\xff\x04\xff\xff\xff\x33\xff\xff\xff\xb6\xff\xff\xff\xeb\xff\xff\xff\x7a\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x12\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x0d\xff\xff\xff\xf6\xff\xff\xff\x32\xff\xff\xff\xf7\xff\xff\xff\x48\xff\xff\xff\x5a\xff\xff\xff\x35\xff\xff\xff\xe5\xff\xff\xff\x00\xff\xff\xff\x2a\xff\xff\xff\x6b\xff\xff\xff\x98\xff\xff\xff\xa7\xff\xff\xff\xa9\xff\xff\xff\x86\xff\xff\xff\x5d\xff\xff\xff\x2a\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x00\xff\xff\xff\x04\xff\xff\xff\x87\xff\xff\xff\xce\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfd\x81\xff\xff\xff\x00\x01\xff\xff\xff\x2a\xff\xff\xff\xf3\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x8b\xff\xff\xff\x00\x0a\xff\xff\xff\x26\xff\xff\xff\x8e\xff\xff\xff\xe5\xff\xff\xff\xa1\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x0c\xff\xff\xff\xce\xff\xff\xff\x27\xff\xff\xff\xf7\x89\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xff\xff\xff\xff\x0e\xff\xff\xff\x00\xff\xff\xff\x2e\xff\xff\xff\xf3\x82\xff\xff\xff\x00\x08\xff\xff\xff\x81\xff\xff\xff\xe9\xff\xff\xff\xcb\xff\xff\xff\x50\xff\xff\xff\x13\xff\xff\xff\x83\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x12\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x1f\xff\xff\xff\xfd\xff\xff\xff\x27\xff\xff\xff\xff\xff\xff\xff\xed\xff\xff\xff\x63\xff\xff\xff\x33\xff\xff\xff\xeb\xff\xff\xff\x00\xff\xff\xff\x26\xff\xff\xff\xd6\xff\xff\xff\xf0\xff\xff\xff\xd1\xff\xff\xff\x4d\xff\xff\xff\x2e\xff\xff\xff\x5f\xff\xff\xff\x5d\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x31\xff\xff\xff\xf2\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xff\xff\xff\xff\x10\xff\xff\xff\x00\xff\xff\xff\x3d\xff\xff\xff\xe0\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x89\xff\xff\xff\x00\x04\xff\xff\xff\x57\xff\xff\xff\xbf\xff\xff\xff\xe3\xff\xff\xff\x7b\xff\xff\xff\x15\x81\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x5c\xff\xff\xff\x7f\xff\xff\xff\x27\xff\xff\xff\xf7\x89\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xff\xff\xff\xff\x78\xff\xff\xff\x01\xff\xff\xff\x7c\xff\xff\xff\xce\x89\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x0f\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x01\xff\xff\xff\xe9\xff\xff\xff\x3a\xff\xff\xff\xf7\xff\xff\xff\x38\xff\xff\xff\xe9\xff\xff\xff\x79\xff\xff\xff\xa8\xff\xff\xff\x00\xff\xff\xff\x10\xff\xff\xff\x17\xff\xff\xff\x00\xff\xff\xff\x6a\xff\xff\xff\xe6\x84\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x00\xff\xff\xff\x04\xff\xff\xff\x89\xff\xff\xff\xce\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xff\xff\xff\xff\x78\xff\xff\xff\x02\xff\xff\xff\x9f\xff\xff\xff\x98\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x89\xff\xff\xff\x00\x02\xff\xff\xff\xc4\xff\xff\xff\x56\xff\xff\xff\x04\x83\xff\xff\xff\x00\x02\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\xb3\x81\xff\xff\xff\x27\x00\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x0d\xff\xff\xff\x2e\xff\xff\xff\xcd\xff\xff\xff\x1b\xff\xff\xff\x00\xff\xff\xff\x07\xff\xff\xff\xb4\xff\xff\xff\x5a\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x6e\xff\xff\xff\xe8\xff\xff\xff\xe7\xff\xff\xff\x47\x89\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x09\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x65\xff\xff\xff\xa0\xff\xff\xff\xff\xff\xff\xff\xe6\xff\xff\xff\xa2\xff\xff\xff\xda\xff\xff\xff\x1f\x82\xff\xff\xff\x00\x02\xff\xff\xff\x01\xff\xff\xff\x6c\xff\xff\xff\xd4\x84\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xff\xff\xff\xff\xef\xff\xff\xff\xf0\xff\xff\xff\xc9\xff\xff\xff\x34\x82\xff\xff\xff\x00\x02\xff\xff\xff\xbc\xff\xff\xff\xe4\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x8d\xff\xff\xff\xf1\xff\xff\xff\xc3\xff\xff\xff\x14\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x90\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xfd\xff\xff\xff\xc9\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x04\xff\xff\xff\x42\xff\xff\xff\xd5\xff\xff\xff\x25\xff\xff\xff\xb8\xff\xff\xff\x75\x91\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x04\xff\xff\xff\x61\xff\xff\xff\xd3\xff\xff\xff\xe7\xff\xff\xff\x99\xff\xff\xff\x15\x82\xff\xff\xff\x00\x03\xff\xff\xff\x42\xff\xff\xff\xf7\xff\xff\xff\xe5\xff\xff\xff\x37\x83\xff\xff\xff\x00\x02\xff\xff\xff\x03\xff\xff\xff\x2a\xff\xff\xff\xf7\x81\xff\xff\xff\x03\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x8d\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x04\xff\xff\xff\xf4\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x01\xff\xff\xff\xf4\xff\xff\xff\xf7\x90\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xff\xff\xff\xff\x77\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x02\xff\xff\xff\x5a\xff\xff\xff\xf9\xff\xff\xff\x90\x92\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x04\xff\xff\xff\xf4\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x01\xff\xff\xff\xf4\xff\xff\xff\xf7\x88\xff\xff\xff\x00\x04\xff\xff\xff\x01\xff\xff\xff\x11\xff\xff\xff\x00\xff\xff\xff\x60\xff\xff\xff\xe4\x83\xff\xff\xff\x00\x84\xff\xff\xff\xff\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x86\xff\xff\xff\x00\x04\xff\xff\xff\x40\xff\xff\xff\x9e\xff\xff\xff\x1e\xff\xff\xff\xb7\xff\xff\xff\x06\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\xd7\xff\xff\xff\x00\x04\xff\xff\xff\x09\xff\xff\xff\xce\xff\xff\xff\xed\xff\xff\xff\xde\xff\xff\xff\x72\x83\xff\xff\xff\x00\x04\xff\xff\xff\x03\xff\xff\xff\x04\xff\xff\xff\x00\xff\xff\xff\x06\xff\xff\xff\x02\x8b\xff\xff\xff\x00\x02\xff\xff\xff\x84\xff\xff\xff\xe0\xff\xff\xff\x26\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\xe0\xff\xff\xff\x00\x04\xff\xff\xff\x16\xff\xff\xff\xbf\xff\xff\xff\x1c\xff\xff\xff\xc9\xff\xff\xff\x0c\x99\xff\xff\xff\x00\xe1\xff\xff\xff\x00\x02\xff\xff\xff\x69\xff\xff\xff\xea\xff\xff\xff\x44\x9a\xff\xff\xff\x00\xff\xff\xff\xff\x00\xf8\xff\xff\xff\x00\x02\xff\xff\xff\xdd\xff\xff\xff\xe3\xff\xff\xff\x39\x83\xff\xff\xff\x00\x01\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x04\xff\xff\xff\xf0\xff\xff\xff\xef\xff\xff\xff\x00\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x01\xff\xff\xff\xf0\xff\xff\xff\xef\xa9\xff\xff\xff\x00\x02\xff\xff\xff\xd4\xff\xff\xff\xde\xff\xff\xff\x5f\x83\xff\xff\xff\x00\x01\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x04\xff\xff\xff\xf0\xff\xff\xff\xef\xff\xff\xff\x00\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x01\xff\xff\xff\xf0\xff\xff\xff\xef\x8b\xff\xff\xff\x00\x01\xff\xff\xff\x95\xff\xff\xff\xf4\x81\xff\xff\xff\xf3\x9a\xff\xff\xff\x00\x01\xff\xff\xff\x69\xff\xff\xff\xc9\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x9a\xff\xff\xff\x00\x02\xff\xff\xff\x86\xff\xff\xff\xf0\xff\xff\xff\xf3\x8c\xff\xff\xff\x00\x01\xff\xff\xff\x5d\xff\xff\xff\xe1\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x8b\xff\xff\xff\x00\x02\xff\xff\xff\x1e\xff\xff\xff\xa3\xff\xff\xff\x24\x9b\xff\xff\xff\x00\x02\xff\xff\xff\x06\xff\xff\xff\xf2\xff\xff\xff\x26\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x90\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x01\xff\xff\xff\x28\xff\xff\xff\xf9\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x8c\xff\xff\xff\x00\x02\xff\xff\xff\x09\xff\xff\xff\xa2\xff\xff\xff\x3b\x81\xff\xff\xff\x00\x02\xff\xff\xff\xf3\xff\xff\xff\xf4\xff\xff\xff\xff\x81\xff\xff\xff\xf3\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x03\xff\xff\xff\x41\xff\xff\xff\xdf\xff\xff\xff\xe4\xff\xff\xff\xff\x81\xff\xff\xff\xdf\x00\xff\xff\xff\x1b\x82\xff\xff\xff\x00\x02\xff\xff\xff\x1a\xff\xff\xff\xfc\xff\xff\xff\x7d\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x90\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x8b\xff\xff\xff\x00\x03\xff\xff\xff\x1c\xff\xff\xff\x03\xff\xff\xff\x4b\xff\xff\xff\xe2\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x85\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x02\xff\xff\xff\x72\xff\xff\xff\xd4\xff\xff\xff\xd5\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x89\xff\xff\xff\x00\x85\xff\xff\xff\xf3\x02\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x02\xff\xff\xff\x24\xff\xff\xff\xfd\xff\xff\xff\x01\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x88\xff\xff\xff\x00\x06\xff\xff\xff\x6d\xff\xff\xff\x4c\xff\xff\xff\x05\xff\xff\xff\x5b\xff\xff\xff\xe1\xff\xff\xff\xe6\xff\xff\xff\x79\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x85\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x03\xff\xff\xff\xcd\xff\xff\xff\x4a\xff\xff\xff\xe2\xff\xff\xff\x2e\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x82\xff\xff\xff\xf3\x8a\xff\xff\xff\x00\x06\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x00\xff\xff\xff\x7f\xff\xff\xff\x5c\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x27\xff\xff\xff\xf6\x83\xff\xff\xff\x00\x02\xff\xff\xff\x08\xff\xff\xff\xf2\xff\xff\xff\x4c\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x82\xff\xff\xff\xf3\x82\xff\xff\xff\x00\x05\xff\xff\xff\x4a\xff\xff\xff\xa9\xff\xff\xff\xe2\xff\xff\xff\x9b\xff\xff\xff\x43\xff\xff\xff\x02\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x85\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x84\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xec\xff\xff\xff\x04\xff\xff\xff\x8f\xff\xff\xff\x87\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x90\xff\xff\xff\x00\x06\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x01\xff\xff\xff\xd0\xff\xff\xff\xbb\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xfc\xff\xff\xff\x29\xff\xff\xff\xf8\xff\xff\xff\x29\xff\xff\xff\xf2\x84\xff\xff\xff\x00\x02\xff\xff\xff\x70\xff\xff\xff\xff\xff\xff\xff\xc5\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x8a\xff\xff\xff\x00\x05\xff\xff\xff\x09\xff\xff\xff\x52\xff\xff\xff\xa6\xff\xff\xff\xdb\xff\xff\xff\x93\xff\xff\xff\x08\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x85\xff\xff\xff\x00\x02\xff\xff\xff\x6a\xff\xff\xff\xff\xff\xff\xff\x3f\x84\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x84\xff\xff\xff\x00\x04\xff\xff\xff\x81\xff\xff\xff\x9a\xff\xff\xff\x00\xff\xff\xff\x39\xff\xff\xff\xdf\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x89\xff\xff\xff\x00\x85\xff\xff\xff\xef\x07\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x3c\xff\xff\xff\x8f\xff\xff\xff\xbb\xff\xff\xff\x3b\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xff\xff\xff\xff\x50\xff\xff\xff\xff\xff\xff\xff\x4d\xff\xff\xff\xe1\x83\xff\xff\xff\x00\x02\xff\xff\xff\x0e\xff\xff\xff\xf9\xff\xff\xff\x3e\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x88\xff\xff\xff\x00\x07\xff\xff\xff\x3b\xff\xff\xff\xad\xff\xff\xff\xd2\xff\xff\xff\xa7\xff\xff\xff\x1e\xff\xff\xff\x07\xff\xff\xff\x4e\xff\xff\xff\x01\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x84\xff\xff\xff\x00\x04\xff\xff\xff\x0f\xff\xff\xff\xe8\xff\xff\xff\x82\xff\xff\xff\xcd\xff\xff\xff\x01\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x84\xff\xff\xff\x00\x01\xff\xff\xff\xdb\xff\xff\xff\x42\x81\xff\xff\xff\x00\x02\xff\xff\xff\xe2\xff\xff\xff\x39\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x90\xff\xff\xff\x00\x06\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x8d\xff\xff\xff\x3d\xff\xff\xff\x6d\xff\xff\xff\x88\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xfc\xff\xff\xff\xcf\xff\xff\xff\xa1\xff\xff\xff\xdc\xff\xff\xff\x8f\x83\xff\xff\xff\x00\x01\xff\xff\xff\x26\xff\xff\xff\xfc\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x89\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x86\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x84\xff\xff\xff\x00\x04\xff\xff\xff\x8b\xff\xff\xff\xa3\xff\xff\xff\x00\xff\xff\xff\xcc\xff\xff\xff\x60\x82\xff\xff\xff\x00\x02\xff\xff\xff\xbc\xff\xff\xff\xe4\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x02\xff\xff\xff\x36\xff\xff\xff\xe7\xff\xff\xff\x02\x81\xff\xff\xff\x00\x02\xff\xff\xff\x8e\xff\xff\xff\x92\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x90\xff\xff\xff\x00\x06\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\xc8\xff\xff\xff\x01\xff\xff\xff\x1b\xff\xff\xff\xd8\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x8c\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfa\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x89\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x02\xff\xff\xff\x07\xff\xff\xff\x2d\xff\xff\xff\xf7\x81\xff\xff\xff\x07\x81\xff\xff\xff\x00\x06\xff\xff\xff\x21\xff\xff\xff\xf2\xff\xff\xff\x20\xff\xff\xff\x00\xff\xff\xff\x46\xff\xff\xff\xe5\xff\xff\xff\x0b\x8a\xff\xff\xff\x00\x02\xff\xff\xff\x0a\xff\xff\xff\xd1\xff\xff\xff\x13\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x04\xff\xff\xff\xf4\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x01\xff\xff\xff\xf4\xff\xff\xff\xf7\x90\xff\xff\xff\x00\x02\xff\xff\xff\x27\xff\xff\xff\xff\xff\xff\xff\x9b\x81\xff\xff\xff\x00\x01\xff\xff\xff\xc8\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x8c\xff\xff\xff\x00\x01\xff\xff\xff\x51\xff\xff\xff\xec\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x04\xff\xff\xff\xf4\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x01\xff\xff\xff\xf4\xff\xff\xff\xf7\x89\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x84\xff\xff\xff\xff\x81\xff\xff\xff\x00\x01\xff\xff\xff\xab\xff\xff\xff\x93\x82\xff\xff\xff\x00\x01\xff\xff\xff\xbe\xff\xff\xff\x82\x82\xff\xff\xff\x00\x02\xff\xff\xff\x2d\xff\xff\xff\xbe\xff\xff\xff\x0e\x85\xff\xff\xff\x00\x01\xff\xff\xff\x63\xff\xff\xff\xa2\x82\xff\xff\xff\x00\xa9\xff\xff\xff\x00\x02\xff\xff\xff\x88\xff\xff\xff\xf4\xff\xff\xff\xfb\x8b\xff\xff\xff\x00\x02\xff\xff\xff\xd8\xff\xff\xff\xe9\xff\xff\xff\x72\x9b\xff\xff\xff\x00\x02\xff\xff\xff\x50\xff\xff\xff\xb5\xff\xff\xff\xfb\x86\xff\xff\xff\x00\x01\xff\xff\xff\x03\xff\xff\xff\x05\x8e\xff\xff\xff\x00\x02\xff\xff\xff\x48\xff\xff\xff\xc2\xff\xff\xff\x0b\x84\xff\xff\xff\x00\x02\xff\xff\xff\x02\xff\xff\xff\xd2\xff\xff\xff\x45\x81\xff\xff\xff\x00\xd9\xff\xff\xff\x00\x00\xff\xff\xff\x06\x86\xff\xff\xff\x00\x02\xff\xff\xff\x1e\xff\xff\xff\xcc\xff\xff\xff\x06\x84\xff\xff\xff\x00\x02\xff\xff\xff\x20\xff\xff\xff\xb8\xff\xff\xff\x01\x92\xff\xff\xff\x00\xe2\xff\xff\xff\x00\x01\xff\xff\xff\x8c\xff\xff\xff\x8b\x85\xff\xff\xff\x00\x01\xff\xff\xff\x8d\xff\xff\xff\x77\x92\xff\xff\xff\x00\xff\xff\xff\xff\x00\xb9\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\xc3\xff\xff\xff\x00\x01\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x04\xff\xff\xff\xf0\xff\xff\xff\xef\xff\xff\xff\x00\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x01\xff\xff\xff\xf0\xff\xff\xff\xef\x82\xff\xff\xff\x00\x01\xff\xff\xff\x9e\xff\xff\xff\x42\xa5\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x01\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x04\xff\xff\xff\xf0\xff\xff\xff\xef\xff\xff\xff\x00\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x01\xff\xff\xff\xf0\xff\xff\xff\xef\x8c\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\xa1\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x01\xff\xff\xff\x65\xff\xff\xff\x9a\x97\xff\xff\xff\x00\x02\xff\xff\xff\x11\xff\xff\xff\xee\xff\xff\xff\x1c\x8a\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x8a\xff\xff\xff\x00\x04\xff\xff\xff\x02\xff\xff\xff\xf3\xff\xff\xff\xf1\xff\xff\xff\xff\xff\xff\xff\x9c\xa0\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x01\xff\xff\xff\x31\xff\xff\xff\xeb\x89\xff\xff\xff\x00\x02\xff\xff\xff\x04\xff\xff\xff\x00\xff\xff\xff\x27\x84\xff\xff\xff\xff\x00\xff\xff\xff\x33\x84\xff\xff\xff\x00\x01\xff\xff\xff\x7c\xff\xff\xff\xa2\x84\xff\xff\xff\x00\x03\xff\xff\xff\x68\xff\xff\xff\xef\xff\xff\xff\xf3\xff\xff\xff\x47\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x8b\xff\xff\xff\x00\x02\xff\xff\xff\x8d\xff\xff\xff\x29\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x02\xff\xff\xff\xf3\xff\xff\xff\xf4\xff\xff\xff\xff\x81\xff\xff\xff\xf3\x82\xff\xff\xff\x00\x04\xff\xff\xff\x46\xff\xff\xff\xdd\xff\xff\xff\xf4\xff\xff\xff\xc6\xff\xff\xff\x25\x81\xff\xff\xff\x00\x03\xff\xff\xff\x47\xff\xff\xff\xf3\xff\xff\xff\xf4\xff\xff\xff\xff\x81\xff\xff\xff\xf3\x00\xff\xff\xff\x1d\x81\xff\xff\xff\x00\x04\xff\xff\xff\x6d\xff\xff\xff\xf1\xff\xff\xff\xde\xff\xff\xff\x74\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x87\xff\xff\xff\x00\x05\xff\xff\xff\x18\xff\xff\xff\x80\xff\xff\xff\xe6\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x83\xff\xff\xff\x07\x84\xff\xff\xff\x00\x02\xff\xff\xff\x07\xff\xff\xff\xe8\xff\xff\xff\x2c\x83\xff\xff\xff\x00\x02\xff\xff\xff\x08\xff\xff\xff\xf6\xff\xff\xff\x3c\x84\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x8b\xff\xff\xff\x00\x02\xff\xff\xff\x29\xff\xff\xff\x86\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x05\xff\xff\xff\x02\xff\xff\xff\xe9\xff\xff\xff\x47\xff\xff\xff\x00\xff\xff\xff\x76\xff\xff\xff\xbe\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x05\xff\xff\xff\x07\xff\xff\xff\xf6\xff\xff\xff\x50\xff\xff\xff\x04\xff\xff\xff\xa0\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x8a\xff\xff\xff\x00\x07\xff\xff\xff\x3a\xff\xff\xff\xa7\xff\xff\xff\xea\xff\xff\xff\x93\xff\xff\xff\x2d\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x88\xff\xff\xff\x00\x01\xff\xff\xff\x68\xff\xff\xff\xb6\x84\xff\xff\xff\x00\x01\xff\xff\xff\x24\xff\xff\xff\xfc\x85\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x85\xff\xff\xff\x00\x04\xff\xff\xff\x25\xff\xff\xff\xf3\xff\xff\xff\x00\xff\xff\xff\x2a\xff\xff\xff\x06\x81\xff\xff\xff\x00\x01\xff\xff\xff\x88\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x01\xff\xff\xff\x1d\xff\xff\xff\xfd\x81\xff\xff\xff\x00\x01\xff\xff\xff\x2a\xff\xff\xff\xed\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x05\xff\xff\xff\x23\xff\xff\xff\xfd\xff\xff\xff\x03\xff\xff\xff\x00\xff\xff\xff\x3a\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x89\xff\xff\xff\x00\x03\xff\xff\xff\xcd\xff\xff\xff\xca\xff\xff\xff\x5f\xff\xff\xff\x09\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x87\xff\xff\xff\x00\x02\xff\xff\xff\x01\xff\xff\xff\xdb\xff\xff\xff\x40\x84\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x85\xff\xff\xff\x00\x07\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x00\xff\xff\xff\x67\xff\xff\xff\xc1\xff\xff\xff\xa8\xff\xff\xff\x57\xff\xff\xff\x0d\x84\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x01\xff\xff\xff\x26\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf6\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x89\xff\xff\xff\x00\x03\xff\xff\xff\xa1\xff\xff\xff\xe5\xff\xff\xff\x8e\xff\xff\xff\x26\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x87\xff\xff\xff\x00\x01\xff\xff\xff\x54\xff\xff\xff\xc9\x85\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x03\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x56\x83\xff\xff\xff\xf3\x01\xff\xff\xff\xf4\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x04\xff\xff\xff\x22\xff\xff\xff\x74\xff\xff\xff\xc0\xff\xff\xff\xb5\xff\xff\xff\x53\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x8a\xff\xff\xff\x00\x07\xff\xff\xff\x15\xff\xff\xff\x7c\xff\xff\xff\xe3\xff\xff\xff\xbf\xff\xff\xff\x57\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x87\xff\xff\xff\x00\x01\xff\xff\xff\xca\xff\xff\xff\x54\x85\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x88\xff\xff\xff\x00\x06\xff\xff\xff\x3b\xff\xff\xff\xad\xff\xff\xff\xd2\xff\xff\xff\xa1\xff\xff\xff\x00\xff\xff\xff\x1b\xff\xff\xff\x3f\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x8c\xff\xff\xff\x00\x05\xff\xff\xff\x04\xff\xff\xff\x56\xff\xff\xff\xc4\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x86\xff\xff\xff\x00\x02\xff\xff\xff\x40\xff\xff\xff\xdb\xff\xff\xff\x01\x85\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x89\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x86\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x02\xff\xff\xff\xbc\xff\xff\xff\xe4\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x90\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x86\xff\xff\xff\x00\x01\xff\xff\xff\xb6\xff\xff\xff\x68\x86\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x89\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x02\xff\xff\xff\x07\xff\xff\xff\x2d\xff\xff\xff\xf7\x81\xff\xff\xff\x07\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x91\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x04\xff\xff\xff\xf4\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x01\xff\xff\xff\xf4\xff\xff\xff\xf7\x90\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x02\xff\xff\xff\x2c\xff\xff\xff\xe8\xff\xff\xff\x07\x86\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x04\xff\xff\xff\xf4\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x01\xff\xff\xff\xf4\xff\xff\xff\xf7\x89\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x84\xff\xff\xff\xff\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x02\xff\xff\xff\x48\xff\xff\xff\xaf\xff\xff\xff\x02\x8a\xff\xff\xff\x00\xb0\xff\xff\xff\x00\x02\xff\xff\xff\xd8\xff\xff\xff\xf4\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x9b\xff\xff\xff\x00\x02\xff\xff\xff\x4f\xff\xff\xff\xb4\xff\xff\xff\xfb\x87\xff\xff\xff\x00\x01\xff\xff\xff\x07\xff\xff\xff\x01\x8b\xff\xff\xff\x00\x02\xff\xff\xff\x41\xff\xff\xff\xc9\xff\xff\xff\x0c\x84\xff\xff\xff\x00\x04\xff\xff\xff\x5e\xff\xff\xff\xcc\xff\xff\xff\x06\xff\xff\xff\xf3\xff\xff\xff\x1d\x81\xff\xff\xff\x00\xe1\xff\xff\xff\x00\x02\xff\xff\xff\x14\xff\xff\xff\xd0\xff\xff\xff\x08\x83\xff\xff\xff\x00\x04\xff\xff\xff\x2c\xff\xff\xff\xc9\xff\xff\xff\x06\xff\xff\xff\xef\xff\xff\xff\x02\x91\xff\xff\xff\x00\xe1\xff\xff\xff\x00\x01\xff\xff\xff\xa5\xff\xff\xff\x61\x9b\xff\xff\xff\x00\xff\xff\xff\xff\x00\xff\xff\xff\xff\x00\x01\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x04\xff\xff\xff\xf0\xff\xff\xff\xef\xff\xff\xff\x00\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x01\xff\xff\xff\xf0\xff\xff\xff\xef\xab\xff\xff\xff\x00\x02\xff\xff\xff\x81\xff\xff\xff\xe5\xff\xff\xff\xab\x81\xff\xff\xff\x00\x01\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x04\xff\xff\xff\xf0\xff\xff\xff\xef\xff\xff\xff\x00\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x01\xff\xff\xff\xf0\xff\xff\xff\xef\xb0\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x8a\xff\xff\xff\x00\x01\xff\xff\xff\x99\xff\xff\xff\x4b\x8d\xff\xff\xff\x00\x03\xff\xff\xff\x25\xff\xff\xff\xf6\xff\xff\xff\xef\xff\xff\xff\x5c\x8b\xff\xff\xff\x00\x02\xff\xff\xff\x0f\xff\xff\xff\xfd\xff\xff\xff\x2c\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\xb0\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x8a\xff\xff\xff\x00\x01\xff\xff\xff\x56\xff\xff\xff\xb3\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x02\xff\xff\xff\x94\xff\xff\xff\xcd\xff\xff\xff\x03\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x84\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x02\xff\xff\xff\x28\xff\xff\xff\xf2\xff\xff\xff\x33\x81\xff\xff\xff\x00\x01\xff\xff\xff\x25\xff\xff\xff\xfc\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x02\xff\xff\xff\x02\xff\xff\xff\x00\xff\xff\xff\x01\x82\xff\xff\xff\x00\x00\xff\xff\xff\x01\x85\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xff\x83\xff\xff\xff\xf3\x00\xff\xff\xff\x25\x81\xff\xff\xff\x00\x04\xff\xff\xff\x41\xff\xff\xff\xd9\xff\xff\xff\xf9\xff\xff\xff\xc3\xff\xff\xff\x21\x82\xff\xff\xff\x00\x05\xff\xff\xff\x0b\xff\xff\xff\x96\xff\xff\xff\xe8\xff\xff\xff\xf3\xff\xff\xff\xd9\xff\xff\xff\x6e\x81\xff\xff\xff\x00\x04\xff\xff\xff\x6d\xff\xff\xff\xe7\xff\xff\xff\xc0\xff\xff\xff\x84\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x84\xff\xff\xff\x00\x01\xff\xff\xff\x28\xff\xff\xff\xf9\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x02\xff\xff\xff\x39\xff\xff\xff\xf8\xff\xff\xff\x2e\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x84\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x00\xff\xff\xff\x02\xff\xff\xff\xc9\xff\xff\xff\x7f\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x03\xff\xff\xff\x0b\xff\xff\xff\xb3\xff\xff\xff\x00\xff\xff\xff\x80\x82\xff\xff\xff\x00\x03\xff\xff\xff\xb2\xff\xff\xff\x0b\xff\xff\xff\x00\xff\xff\xff\x7f\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x05\xff\xff\xff\x02\xff\xff\xff\xe8\xff\xff\xff\x56\xff\xff\xff\x06\xff\xff\xff\x82\xff\xff\xff\xba\x82\xff\xff\xff\x00\x0c\xff\xff\xff\xa5\xff\xff\xff\x9b\xff\xff\xff\x0e\xff\xff\xff\x00\xff\xff\xff\x1f\xff\xff\xff\x4b\xff\xff\xff\x00\xff\xff\xff\x07\xff\xff\xff\xf6\xff\xff\xff\x38\xff\xff\xff\x00\xff\xff\xff\x8a\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x84\xff\xff\xff\x00\x01\xff\xff\xff\x0e\xff\xff\xff\x5d\x83\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x00\xff\xff\xff\x04\xff\xff\xff\xd3\xff\xff\xff\x82\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x84\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x02\xff\xff\xff\x79\xff\xff\xff\xcb\xff\xff\xff\x03\x82\xff\xff\xff\x00\x01\xff\xff\xff\x2b\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x04\xff\xff\xff\x1c\xff\xff\xff\xcd\xff\xff\xff\x72\xff\xff\xff\x4b\xff\xff\xff\x9a\x82\xff\xff\xff\x00\x04\xff\xff\xff\x70\xff\xff\xff\xcc\xff\xff\xff\x1c\xff\xff\xff\x9e\xff\xff\xff\x4a\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x01\xff\xff\xff\x1d\xff\xff\xff\xfd\x81\xff\xff\xff\x00\x01\xff\xff\xff\x2a\xff\xff\xff\xec\x81\xff\xff\xff\x00\x02\xff\xff\xff\x0c\xff\xff\xff\xfb\xff\xff\xff\x0c\x84\xff\xff\xff\x00\x05\xff\xff\xff\x23\xff\xff\xff\xfd\xff\xff\xff\x01\xff\xff\xff\x00\xff\xff\xff\x35\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x8a\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xfc\xff\xff\xff\x17\xff\xff\xff\x7b\xff\xff\xff\xd3\xff\xff\xff\x05\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x84\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xff\xff\xff\xff\xb6\xff\xff\xff\xef\xff\xff\xff\x29\x83\xff\xff\xff\x00\x01\xff\xff\xff\x77\xff\xff\xff\xcd\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x04\xff\xff\xff\xe4\xff\xff\xff\x65\xff\xff\xff\x00\xff\xff\xff\xcb\xff\xff\xff\x05\x83\xff\xff\xff\x00\x03\xff\xff\xff\x58\xff\xff\xff\xe4\xff\xff\xff\x08\xff\xff\xff\xd3\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x01\xff\xff\xff\x26\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf6\x81\xff\xff\xff\x00\x01\xff\xff\xff\x22\xff\xff\xff\xff\x82\xff\xff\xff\xef\x04\xff\xff\xff\xf0\xff\xff\xff\xed\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x81\xff\xff\xff\xef\x01\xff\xff\xff\xf1\xff\xff\xff\xff\x81\xff\xff\xff\xef\x88\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xff\xff\xff\xff\xd3\xff\xff\xff\xf3\xff\xff\xff\x35\x84\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x84\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x9c\xff\xff\xff\xc5\xff\xff\xff\x02\x82\xff\xff\xff\x00\x02\xff\xff\xff\xed\xff\xff\xff\xf9\xff\xff\xff\x4c\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x04\xff\xff\xff\x55\xff\xff\xff\xd9\xff\xff\xff\x2d\xff\xff\xff\x88\xff\xff\xff\x59\x82\xff\xff\xff\x00\x04\xff\xff\xff\x2b\xff\xff\xff\xd4\xff\xff\xff\x55\xff\xff\xff\x60\xff\xff\xff\x87\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xef\x00\xff\xff\xff\xd1\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x02\xff\xff\xff\x0b\xff\xff\xff\xfb\xff\xff\xff\x25\x81\xff\xff\xff\x00\x04\xff\xff\xff\x3a\xff\xff\xff\xde\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x84\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x8c\xff\xff\xff\xda\xff\xff\xff\x09\x84\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x84\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x01\xff\xff\xff\xa2\xff\xff\xff\xa5\xff\xff\xff\x01\x82\xff\xff\xff\x00\x01\xff\xff\xff\x69\xff\xff\xff\xde\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x03\xff\xff\xff\x37\xff\xff\xff\xdb\xff\xff\xff\x02\xff\xff\xff\xb3\x82\xff\xff\xff\x00\x04\xff\xff\xff\xdb\xff\xff\xff\x37\xff\xff\xff\x00\xff\xff\xff\xb3\xff\xff\xff\x02\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x08\xff\xff\xff\xa2\xff\xff\xff\xb4\xff\xff\xff\x0e\xff\xff\xff\x09\xff\xff\xff\xab\xff\xff\xff\x8b\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x84\xff\xff\xff\x00\x01\xff\xff\xff\x20\xff\xff\xff\xd3\x83\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x00\xff\xff\xff\x9f\xff\xff\xff\xb7\xff\xff\xff\x05\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x84\xff\xff\xff\x00\x06\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x00\xff\xff\xff\x02\xff\xff\xff\xa8\xff\xff\xff\xa0\xff\xff\xff\x01\x81\xff\xff\xff\x00\x01\xff\xff\xff\x28\xff\xff\xff\xfa\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x02\xff\xff\xff\x20\xff\xff\xff\x00\xff\xff\xff\x15\x82\xff\xff\xff\x00\x00\xff\xff\xff\x1f\x81\xff\xff\xff\x00\x00\xff\xff\xff\x14\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x08\xff\xff\xff\x0a\xff\xff\xff\x98\xff\xff\xff\xea\xff\xff\xff\xef\xff\xff\xff\x9f\xff\xff\xff\x08\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x90\xff\xff\xff\x00\x06\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x00\xff\xff\xff\x03\xff\xff\xff\xb0\xff\xff\xff\xa8\xff\xff\xff\x01\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x84\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x86\xff\xff\xff\x00\x01\xff\xff\xff\x26\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x90\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x83\xff\xff\xff\x07\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x8a\xff\xff\xff\x00\x04\xff\xff\xff\x05\xff\xff\xff\x02\xff\xff\xff\x00\xff\xff\xff\x05\xff\xff\xff\x01\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x04\xff\xff\xff\xf4\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x01\xff\xff\xff\xf4\xff\xff\xff\xf7\x90\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x02\xff\xff\xff\x07\xff\xff\xff\xc0\xff\xff\xff\x97\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x84\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x86\xff\xff\xff\x00\x02\xff\xff\xff\x18\xff\xff\xff\xff\xff\xff\xff\x22\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x04\xff\xff\xff\xf4\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x01\xff\xff\xff\xf4\xff\xff\xff\xf7\x90\xff\xff\xff\x00\x00\xff\xff\xff\x27\x84\xff\xff\xff\xff\x03\xff\xff\xff\x0b\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x8a\xff\xff\xff\x00\x04\xff\xff\xff\x2b\xff\xff\xff\xb2\xff\xff\xff\x1c\xff\xff\xff\xbb\xff\xff\xff\x08\x81\xff\xff\xff\x00\xa9\xff\xff\xff\x00\x03\xff\xff\xff\x27\xff\xff\xff\xff\xff\xff\xff\xf3\xff\xff\xff\x5e\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x87\xff\xff\xff\x00\x02\xff\xff\xff\x97\xff\xff\xff\xee\xff\xff\xff\xae\xaa\xff\xff\xff\x00\x03\xff\xff\xff\x01\xff\xff\xff\x05\xff\xff\xff\x00\xff\xff\xff\x07\x84\xff\xff\xff\x00\x03\xff\xff\xff\xc1\xff\xff\xff\x06\xff\xff\xff\xf3\xff\xff\xff\xcc\x83\xff\xff\xff\x00\x02\xff\xff\xff\x68\xff\xff\xff\xe8\xff\xff\xff\x2f\x82\xff\xff\xff\x00\xe0\xff\xff\xff\x00\x04\xff\xff\xff\x5b\xff\xff\xff\xd7\xff\xff\xff\x07\xff\xff\xff\xff\xff\xff\xff\x27\x82\xff\xff\xff\x00\x03\xff\xff\xff\x09\xff\xff\xff\xbc\xff\xff\xff\x23\xff\xff\xff\xb2\x92\xff\xff\xff\x00\xe9\xff\xff\xff\x00\x02\xff\xff\xff\x5e\xff\xff\xff\xeb\xff\xff\xff\x33\x92\xff\xff\xff\x00\xff\xff\xff\xff\x00\xb0\xff\xff\xff\x00\x03\xff\xff\xff\x8c\xff\xff\xff\xf4\xff\xff\xff\xe6\xff\xff\xff\x46\xca\xff\xff\xff\x00\x01\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x04\xff\xff\xff\xf0\xff\xff\xff\xef\xff\xff\xff\x00\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x01\xff\xff\xff\xf0\xff\xff\xff\xef\xa3\xff\xff\xff\x00\x01\xff\xff\xff\x6a\xff\xff\xff\xd2\x8a\xff\xff\xff\x00\x01\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x04\xff\xff\xff\xf0\xff\xff\xff\xef\xff\xff\xff\x00\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x01\xff\xff\xff\xf0\xff\xff\xff\xef\xb0\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\xa3\xff\xff\xff\x00\x01\xff\xff\xff\x2b\xff\xff\xff\xf8\x8a\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\xb0\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x8a\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x05\xff\xff\xff\x13\xff\xff\xff\xb6\xff\xff\xff\xef\xff\xff\xff\xf3\xff\xff\xff\xc9\xff\xff\xff\x2d\x82\xff\xff\xff\x00\x01\xff\xff\xff\xfd\xff\xff\xff\xf6\x83\xff\xff\xff\xf3\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x01\xff\xff\xff\xff\xff\xff\xff\xf5\x82\xff\xff\xff\xf3\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x90\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xff\x83\xff\xff\xff\xf3\x00\xff\xff\xff\x15\x81\xff\xff\xff\x00\x04\xff\xff\xff\x41\xff\xff\xff\xd9\xff\xff\xff\xf9\xff\xff\xff\xc3\xff\xff\xff\x21\x82\xff\xff\xff\x00\x05\xff\xff\xff\x0b\xff\xff\xff\x96\xff\xff\xff\xe8\xff\xff\xff\xf3\xff\xff\xff\xd9\xff\xff\xff\x6e\x81\xff\xff\xff\x00\x04\xff\xff\xff\x6d\xff\xff\xff\xe7\xff\xff\xff\xc0\xff\xff\xff\x84\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x8a\xff\xff\xff\x00\x01\xff\xff\xff\x21\xff\xff\xff\xd7\x83\xff\xff\xff\x00\x05\xff\xff\xff\x21\xff\xff\xff\x77\xff\xff\xff\x0e\xff\xff\xff\x00\xff\xff\xff\x84\xff\xff\xff\xc0\x82\xff\xff\xff\x00\x01\xff\xff\xff\x96\xff\xff\xff\xa2\x87\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x01\xff\xff\xff\xab\xff\xff\xff\x93\x84\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x90\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x05\xff\xff\xff\x02\xff\xff\xff\xe8\xff\xff\xff\x56\xff\xff\xff\x06\xff\xff\xff\x82\xff\xff\xff\xba\x82\xff\xff\xff\x00\x0c\xff\xff\xff\xa5\xff\xff\xff\x9b\xff\xff\xff\x0e\xff\xff\xff\x00\xff\xff\xff\x1f\xff\xff\xff\x4b\xff\xff\xff\x00\xff\xff\xff\x07\xff\xff\xff\xf6\xff\xff\xff\x38\xff\xff\xff\x00\xff\xff\xff\x8a\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x94\xff\xff\xff\x00\x01\xff\xff\xff\x30\xff\xff\xff\xf1\x82\xff\xff\xff\x00\x02\xff\xff\xff\x0d\xff\xff\xff\xe3\xff\xff\xff\x4a\x86\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x02\xff\xff\xff\x0c\xff\xff\xff\xd7\xff\xff\xff\x59\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x00\xff\xff\xff\xb9\x82\xff\xff\xff\xbf\x83\xff\xff\xff\x00\x00\xff\xff\xff\xdf\x81\xff\xff\xff\xf3\x00\xff\xff\xff\xaa\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x01\xff\xff\xff\x1d\xff\xff\xff\xfd\x81\xff\xff\xff\x00\x01\xff\xff\xff\x2a\xff\xff\xff\xec\x81\xff\xff\xff\x00\x02\xff\xff\xff\x0c\xff\xff\xff\xfb\xff\xff\xff\x0c\x84\xff\xff\xff\x00\x05\xff\xff\xff\x23\xff\xff\xff\xfd\xff\xff\xff\x01\xff\xff\xff\x00\xff\xff\xff\x35\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x8f\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfa\x83\xff\xff\xff\x00\x02\xff\xff\xff\x4f\xff\xff\xff\xe3\xff\xff\xff\x0e\x85\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x84\xff\xff\xff\x00\x02\xff\xff\xff\x2a\xff\xff\xff\xe8\xff\xff\xff\x2a\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x03\xff\xff\xff\x1b\xff\xff\xff\x52\xff\xff\xff\x20\xff\xff\xff\x58\x83\xff\xff\xff\x00\x03\xff\xff\xff\x06\xff\xff\xff\x08\xff\xff\xff\x07\xff\xff\xff\x04\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x01\xff\xff\xff\x26\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf6\x81\xff\xff\xff\x00\x01\xff\xff\xff\x22\xff\xff\xff\xff\x82\xff\xff\xff\xef\x04\xff\xff\xff\xf0\xff\xff\xff\xed\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x09\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x3d\xff\xff\xff\x76\xff\xff\xff\x2a\xff\xff\xff\xfb\xff\xff\xff\x0b\xff\xff\xff\x90\xff\xff\xff\x18\x8c\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x84\xff\xff\xff\x00\x01\xff\xff\xff\xac\xff\xff\xff\x9b\x85\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x02\xff\xff\xff\x59\xff\xff\xff\xd7\xff\xff\xff\x0c\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x04\xff\xff\xff\x08\xff\xff\xff\xea\xff\xff\xff\x64\xff\xff\xff\xa4\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x03\xff\xff\xff\x52\xff\xff\xff\xc0\xff\xff\xff\xc2\xff\xff\xff\x31\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xef\x00\xff\xff\xff\xc2\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x02\xff\xff\xff\x0b\xff\xff\xff\xfb\xff\xff\xff\x28\x81\xff\xff\xff\x00\x04\xff\xff\xff\x3a\xff\xff\xff\xde\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x04\xff\xff\xff\x51\xff\xff\xff\xbd\xff\xff\xff\xfd\xff\xff\xff\xab\xff\xff\xff\x37\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x87\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x84\xff\xff\xff\x00\x02\xff\xff\xff\x18\xff\xff\xff\xed\xff\xff\xff\x43\x84\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x86\xff\xff\xff\x00\x01\xff\xff\xff\x94\xff\xff\xff\xaa\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x04\xff\xff\xff\x1c\xff\xff\xff\xff\xff\xff\xff\x24\xff\xff\xff\x34\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x04\xff\xff\xff\x07\xff\xff\xff\xf1\xff\xff\xff\x18\xff\xff\xff\x48\xff\xff\xff\xc9\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x08\xff\xff\xff\xa2\xff\xff\xff\xb6\xff\xff\xff\x0f\xff\xff\xff\x08\xff\xff\xff\xab\xff\xff\xff\x8b\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x04\xff\xff\xff\x52\xff\xff\xff\xbd\xff\xff\xff\xfd\xff\xff\xff\xab\xff\xff\xff\x37\x83\xff\xff\xff\x00\x01\xff\xff\xff\x20\xff\xff\xff\xd3\x87\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x02\xff\xff\xff\x64\xff\xff\xff\xde\xff\xff\xff\x0b\x81\xff\xff\xff\x00\x03\xff\xff\xff\x02\xff\xff\xff\xdf\xff\xff\xff\xe4\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x00\xff\xff\xff\xd0\x81\xff\xff\xff\xf3\x01\xff\xff\xff\xf5\xff\xff\xff\xff\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x03\xff\xff\xff\x8b\xff\xff\xff\xea\xff\xff\xff\xf2\xff\xff\xff\xf5\x82\xff\xff\xff\x00\x04\xff\xff\xff\x23\xff\xff\xff\xff\xff\xff\xff\x01\xff\xff\xff\x2d\xff\xff\xff\xf2\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x08\xff\xff\xff\x0a\xff\xff\xff\x98\xff\xff\xff\xea\xff\xff\xff\xef\xff\xff\xff\x9f\xff\xff\xff\x08\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x09\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x3d\xff\xff\xff\x75\xff\xff\xff\x2a\xff\xff\xff\xfb\xff\xff\xff\x0a\xff\xff\xff\x90\xff\xff\xff\x18\x8c\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x86\xff\xff\xff\x00\x01\xff\xff\xff\xbf\xff\xff\xff\x93\x90\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x03\xff\xff\xff\x20\xff\xff\xff\x00\xff\xff\xff\x59\xff\xff\xff\xdc\x82\xff\xff\xff\x00\x04\xff\xff\xff\x08\xff\xff\xff\xf4\xff\xff\xff\x3c\xff\xff\xff\x6a\xff\xff\xff\xcd\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x07\x00\xff\xff\xff\x06\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x91\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x04\xff\xff\xff\xf4\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x01\xff\xff\xff\xf4\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x8d\xff\xff\xff\x00\x03\xff\xff\xff\x7c\xff\xff\xff\xf3\xff\xff\xff\xf4\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x83\xff\xff\xff\xf3\x01\xff\xff\xff\xf8\xff\xff\xff\xfd\x83\xff\xff\xff\x00\x01\xff\xff\xff\x17\xff\xff\xff\x98\x8a\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x04\xff\xff\xff\xf4\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x01\xff\xff\xff\xf4\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x03\xff\xff\xff\x76\xff\xff\xff\xec\xff\xff\xff\xe8\xff\xff\xff\x54\x83\xff\xff\xff\x00\x03\xff\xff\xff\x5f\xff\xff\xff\xec\xff\xff\xff\xe1\xff\xff\xff\x3b\x81\xff\xff\xff\x00\x00\xff\xff\xff\x27\x83\xff\xff\xff\xff\x00\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x03\xff\xff\xff\xa2\xff\xff\xff\x49\xff\xff\xff\x54\xff\xff\xff\x95\x83\xff\xff\xff\x00\x02\xff\xff\xff\x1e\xff\xff\xff\xc1\xff\xff\xff\x15\x82\xff\xff\xff\x00\xb2\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\xbc\xff\xff\xff\x00\x03\xff\xff\xff\x0a\xff\xff\xff\xc7\xff\xff\xff\xc2\xff\xff\xff\x06\x84\xff\xff\xff\x00\x02\xff\xff\xff\x3b\xff\xff\xff\xca\xff\xff\xff\x11\x81\xff\xff\xff\x00\xe0\xff\xff\xff\x00\x04\xff\xff\xff\x21\xff\xff\xff\xb4\xff\xff\xff\x1c\xff\xff\xff\xbe\xff\xff\xff\x04\x83\xff\xff\xff\x00\x01\xff\xff\xff\x1b\xff\xff\xff\xbe\x93\xff\xff\xff\x00\xe1\xff\xff\xff\x00\x02\xff\xff\xff\x7d\xff\xff\xff\xe7\xff\xff\xff\x38\x85\xff\xff\xff\x00\x01\xff\xff\xff\x8b\xff\xff\xff\x65\x92\xff\xff\xff\x00\xff\xff\xff\xff\x00\xb8\xff\xff\xff\x00\x02\xff\xff\xff\xdd\xff\xff\xff\xe3\xff\xff\xff\x39\xc3\xff\xff\xff\x00\x01\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x04\xff\xff\xff\xf0\xff\xff\xff\xef\xff\xff\xff\x00\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x01\xff\xff\xff\xf0\xff\xff\xff\xef\xaa\xff\xff\xff\x00\x01\xff\xff\xff\x69\xff\xff\xff\xc9\x83\xff\xff\xff\x00\x01\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x04\xff\xff\xff\xf0\xff\xff\xff\xef\xff\xff\xff\x00\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x01\xff\xff\xff\xf0\xff\xff\xff\xef\xb0\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x01\xff\xff\xff\x75\xff\xff\xff\x80\xa5\xff\xff\xff\x00\x02\xff\xff\xff\x06\xff\xff\xff\xf2\xff\xff\xff\x26\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\xb0\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x02\xff\xff\xff\x0b\xff\xff\xff\xe7\xff\xff\xff\x10\x83\xff\xff\xff\x00\x03\xff\xff\xff\x67\xff\xff\xff\xef\xff\xff\xff\xec\xff\xff\xff\x84\x83\xff\xff\xff\x00\x02\xff\xff\xff\xf3\xff\xff\xff\xf4\xff\xff\xff\xff\x81\xff\xff\xff\xf3\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x03\xff\xff\xff\x47\xff\xff\xff\xf3\xff\xff\xff\xf4\xff\xff\xff\xff\x81\xff\xff\xff\xf3\x00\xff\xff\xff\x1d\x82\xff\xff\xff\x00\x02\xff\xff\xff\x1a\xff\xff\xff\xfc\xff\xff\xff\x7d\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x04\xff\xff\xff\x46\xff\xff\xff\xd1\xff\xff\xff\xe9\xff\xff\xff\xa7\xff\xff\xff\x1e\x89\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xff\x83\xff\xff\xff\xf3\x00\xff\xff\xff\x15\x81\xff\xff\xff\x00\x04\xff\xff\xff\x41\xff\xff\xff\xd9\xff\xff\xff\xf9\xff\xff\xff\xc3\xff\xff\xff\x21\x82\xff\xff\xff\x00\x05\xff\xff\xff\x0b\xff\xff\xff\x96\xff\xff\xff\xe8\xff\xff\xff\xf3\xff\xff\xff\xd9\xff\xff\xff\x6e\x81\xff\xff\xff\x00\x04\xff\xff\xff\x6d\xff\xff\xff\xe7\xff\xff\xff\xc0\xff\xff\xff\x84\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x01\xff\xff\xff\xa4\xff\xff\xff\x6d\x83\xff\xff\xff\x00\x04\xff\xff\xff\x21\xff\xff\xff\x05\xff\xff\xff\x18\xff\xff\xff\xd5\xff\xff\xff\x5e\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x85\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x02\xff\xff\xff\x72\xff\xff\xff\xd4\xff\xff\xff\xd5\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x09\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x08\xff\xff\xff\x9a\xff\xff\xff\x19\xff\xff\xff\x05\xff\xff\xff\x67\xff\xff\xff\xe2\xff\xff\xff\x1b\x88\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x05\xff\xff\xff\x02\xff\xff\xff\xe8\xff\xff\xff\x56\xff\xff\xff\x06\xff\xff\xff\x82\xff\xff\xff\xba\x82\xff\xff\xff\x00\x0c\xff\xff\xff\xa5\xff\xff\xff\x9e\xff\xff\xff\x0f\xff\xff\xff\x00\xff\xff\xff\x20\xff\xff\xff\x4d\xff\xff\xff\x00\xff\xff\xff\x07\xff\xff\xff\xf6\xff\xff\xff\x38\xff\xff\xff\x00\xff\xff\xff\x8a\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x01\xff\xff\xff\x63\xff\xff\xff\xb6\x86\xff\xff\xff\x00\x01\xff\xff\xff\x5f\xff\xff\xff\xbc\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x85\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x03\xff\xff\xff\xcd\xff\xff\xff\x4a\xff\xff\xff\xe2\xff\xff\xff\x2e\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x09\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x61\xff\xff\xff\x43\xff\xff\xff\xda\xff\xff\xff\xe7\xff\xff\xff\x4d\xff\xff\xff\x89\xff\xff\xff\x9d\x88\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x01\xff\xff\xff\x1d\xff\xff\xff\xfd\x81\xff\xff\xff\x00\x01\xff\xff\xff\x2a\xff\xff\xff\xec\x81\xff\xff\xff\x00\x02\xff\xff\xff\x0c\xff\xff\xff\xfb\xff\xff\xff\x0e\x84\xff\xff\xff\x00\x05\xff\xff\xff\x23\xff\xff\xff\xfd\xff\xff\xff\x01\xff\xff\xff\x00\xff\xff\xff\x35\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x01\xff\xff\xff\x3a\xff\xff\xff\xe5\x83\xff\xff\xff\x00\x04\xff\xff\xff\x40\xff\xff\xff\xd9\xff\xff\xff\xe3\xff\xff\xff\x84\xff\xff\xff\xe7\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x85\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x84\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xec\xff\xff\xff\x04\xff\xff\xff\x8f\xff\xff\xff\x87\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x09\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x06\xff\xff\xff\xe6\xff\xff\xff\xd9\xff\xff\xff\x52\xff\xff\xff\x01\xff\xff\xff\x10\xff\xff\xff\x35\xff\xff\xff\xe5\x88\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x01\xff\xff\xff\x26\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf6\x81\xff\xff\xff\x00\x01\xff\xff\xff\x22\xff\xff\xff\xff\x82\xff\xff\xff\xd7\x04\xff\xff\xff\xda\xff\xff\xff\xe2\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x01\xff\xff\xff\x2c\xff\xff\xff\xf5\x83\xff\xff\xff\x00\x04\xff\xff\xff\xe3\xff\xff\xff\x65\xff\xff\xff\x02\xff\xff\xff\x98\xff\xff\xff\xf3\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x85\xff\xff\xff\x00\x02\xff\xff\xff\x6a\xff\xff\xff\xff\xff\xff\xff\x3f\x84\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x84\xff\xff\xff\x00\x04\xff\xff\xff\x81\xff\xff\xff\x9a\xff\xff\xff\x00\xff\xff\xff\x39\xff\xff\xff\xdf\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x21\xff\xff\xff\xfd\xff\xff\xff\xfc\xff\xff\xff\x01\x81\xff\xff\xff\x00\x01\xff\xff\xff\x35\xff\xff\xff\xea\x81\xff\xff\xff\x00\x04\xff\xff\xff\x3b\xff\xff\xff\xad\xff\xff\xff\xd2\xff\xff\xff\xa7\xff\xff\xff\x1b\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xef\x00\xff\xff\xff\xc2\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x02\xff\xff\xff\x0b\xff\xff\xff\xfb\xff\xff\xff\x2b\x81\xff\xff\xff\x00\x04\xff\xff\xff\x37\xff\xff\xff\xe0\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x01\xff\xff\xff\x39\xff\xff\xff\xe5\x82\xff\xff\xff\x00\x05\xff\xff\xff\x1e\xff\xff\xff\xff\xff\xff\xff\x05\xff\xff\xff\x00\xff\xff\xff\x37\xff\xff\xff\xea\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x84\xff\xff\xff\x00\x04\xff\xff\xff\x0f\xff\xff\xff\xe8\xff\xff\xff\x82\xff\xff\xff\xcd\xff\xff\xff\x01\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x84\xff\xff\xff\x00\x01\xff\xff\xff\xdb\xff\xff\xff\x42\x81\xff\xff\xff\x00\x04\xff\xff\xff\xe2\xff\xff\xff\x39\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x09\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x04\xff\xff\xff\xef\xff\xff\xff\xec\xff\xff\xff\x4f\xff\xff\xff\x01\xff\xff\xff\x12\xff\xff\xff\x86\xff\xff\xff\xa1\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x08\xff\xff\xff\xa2\xff\xff\xff\xbb\xff\xff\xff\x15\xff\xff\xff\x0d\xff\xff\xff\xad\xff\xff\xff\x8e\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x01\xff\xff\xff\x62\xff\xff\xff\xb6\x82\xff\xff\xff\x00\x05\xff\xff\xff\x1d\xff\xff\xff\xff\xff\xff\xff\x05\xff\xff\xff\x00\xff\xff\xff\x36\xff\xff\xff\xca\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x84\xff\xff\xff\x00\x04\xff\xff\xff\x8b\xff\xff\xff\xa3\xff\xff\xff\x00\xff\xff\xff\xcc\xff\xff\xff\x60\x82\xff\xff\xff\x00\x02\xff\xff\xff\xbc\xff\xff\xff\xe4\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x02\xff\xff\xff\x36\xff\xff\xff\xe7\xff\xff\xff\x02\x81\xff\xff\xff\x00\x04\xff\xff\xff\x8e\xff\xff\xff\x92\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x09\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x77\xff\xff\xff\xa8\xff\xff\xff\xe0\xff\xff\xff\xf3\xff\xff\xff\xb5\xff\xff\xff\xd5\xff\xff\xff\x17\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x08\xff\xff\xff\x0a\xff\xff\xff\x98\xff\xff\xff\xec\xff\xff\xff\xf2\xff\xff\xff\xa1\xff\xff\xff\x09\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x01\xff\xff\xff\xa2\xff\xff\xff\x6b\x83\xff\xff\xff\x00\x04\xff\xff\xff\xe2\xff\xff\xff\x63\xff\xff\xff\x01\xff\xff\xff\x9b\xff\xff\xff\x7f\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x06\xff\xff\xff\x21\xff\xff\xff\xf2\xff\xff\xff\x20\xff\xff\xff\x00\xff\xff\xff\x46\xff\xff\xff\xe5\xff\xff\xff\x0b\x90\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x04\xff\xff\xff\x71\xff\xff\xff\xd8\xff\xff\xff\xe3\xff\xff\xff\x7b\xff\xff\xff\x0a\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x07\x00\xff\xff\xff\x06\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x84\xff\xff\xff\x00\x00\xff\xff\xff\x09\x8b\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x04\xff\xff\xff\xf4\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x01\xff\xff\xff\xf4\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x02\xff\xff\xff\x0b\xff\xff\xff\xe6\xff\xff\xff\x10\x83\xff\xff\xff\x00\x04\xff\xff\xff\x3f\xff\xff\xff\xda\xff\xff\xff\xf2\xff\xff\xff\xad\xff\xff\xff\x09\x82\xff\xff\xff\x00\x02\xff\xff\xff\xf3\xff\xff\xff\xf4\xff\xff\xff\xff\x81\xff\xff\xff\xf3\x81\xff\xff\xff\x00\x01\xff\xff\xff\xab\xff\xff\xff\x93\x82\xff\xff\xff\x00\x01\xff\xff\xff\xbe\xff\xff\xff\x82\x82\xff\xff\xff\x00\x01\xff\xff\xff\x17\xff\xff\xff\x98\x8b\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x04\xff\xff\xff\xf4\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x01\xff\xff\xff\xf4\xff\xff\xff\xf7\x89\xff\xff\xff\x00\x02\xff\xff\xff\x4f\xff\xff\xff\xb4\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x00\xff\xff\xff\x27\x83\xff\xff\xff\xff\x00\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x84\xff\xff\xff\x00\x01\xff\xff\xff\x71\xff\xff\xff\x98\x84\xff\xff\xff\x00\x02\xff\xff\xff\x39\xff\xff\xff\xb6\xff\xff\xff\x05\x82\xff\xff\xff\x00\x91\xff\xff\xff\x00\x01\xff\xff\xff\x74\xff\xff\xff\x80\x9d\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\xbf\xff\xff\xff\x00\x01\xff\xff\xff\x92\xff\xff\xff\x96\x82\xff\xff\xff\x00\x02\xff\xff\xff\x34\xff\xff\xff\xd2\xff\xff\xff\x15\x83\xff\xff\xff\x00\xe1\xff\xff\xff\x00\x02\xff\xff\xff\x2f\xff\xff\xff\xc0\xff\xff\xff\x01\x84\xff\xff\xff\x00\x02\xff\xff\xff\x0d\xff\xff\xff\xc6\xff\xff\xff\x06\x92\xff\xff\xff\x00\xe2\xff\xff\xff\x00\x01\xff\xff\xff\x99\xff\xff\xff\x71\x84\xff\xff\xff\x00\x01\xff\xff\xff\x91\xff\xff\xff\x5f\x93\xff\xff\xff\x00\xff\xff\xff\xff\x00\xd9\xff\xff\xff\x00\x02\xff\xff\xff\x4e\xff\xff\xff\xc0\xff\xff\xff\xc1\xa2\xff\xff\xff\x00\x01\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x04\xff\xff\xff\xf0\xff\xff\xff\xef\xff\xff\xff\x00\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x01\xff\xff\xff\xf0\xff\xff\xff\xef\xb0\xff\xff\xff\x00\x01\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x04\xff\xff\xff\xf0\xff\xff\xff\xef\xff\xff\xff\x00\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x01\xff\xff\xff\xf0\xff\xff\xff\xef\x8b\xff\xff\xff\x00\x01\xff\xff\xff\x0e\xff\xff\xff\xac\xa2\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x84\xff\xff\xff\x00\x01\xff\xff\xff\xae\xff\xff\xff\x47\xa9\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x98\xff\xff\xff\x00\x00\xff\xff\xff\x0f\x8e\xff\xff\xff\x00\x01\xff\xff\xff\x24\xff\xff\xff\x05\x85\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x01\xff\xff\xff\x34\xff\xff\xff\xce\x83\xff\xff\xff\x00\x04\xff\xff\xff\x52\xff\xff\xff\xdd\xff\xff\xff\xf7\xff\xff\xff\xcd\xff\xff\xff\x31\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x95\xff\xff\xff\xaf\x82\xff\xff\xff\x00\x04\xff\xff\xff\x6e\xff\xff\xff\xcc\xff\xff\xff\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x09\xff\xff\xff\x35\xff\xff\xff\xe8\xff\xff\xff\x18\xff\xff\xff\x00\xff\xff\xff\x03\xff\xff\xff\xca\xff\xff\xff\x6c\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x90\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xff\x83\xff\xff\xff\xf3\x07\xff\xff\xff\x15\xff\xff\xff\x00\xff\xff\xff\x88\xff\xff\xff\x69\xff\xff\xff\xbd\xff\xff\xff\xf4\xff\xff\xff\xe7\xff\xff\xff\x82\x82\xff\xff\xff\x00\x0c\xff\xff\xff\x0b\xff\xff\xff\x96\xff\xff\xff\xe8\xff\xff\xff\xf3\xff\xff\xff\xd9\xff\xff\xff\x6e\xff\xff\xff\x00\xff\xff\xff\x4e\xff\xff\xff\xa5\xff\xff\xff\xc2\xff\xff\xff\xf4\xff\xff\xff\xc1\xff\xff\xff\x18\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x01\xff\xff\xff\x9d\xff\xff\xff\x72\x82\xff\xff\xff\x00\x05\xff\xff\xff\x0a\xff\xff\xff\xf4\xff\xff\xff\x57\xff\xff\xff\x01\xff\xff\xff\x7f\xff\xff\xff\xce\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x09\xff\xff\xff\x0f\xff\xff\xff\xe7\xff\xff\xff\x47\xff\xff\xff\x00\xff\xff\xff\x0e\xff\xff\xff\xea\xff\xff\xff\x39\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x04\xff\xff\xff\x7c\xff\xff\xff\xb4\xff\xff\xff\x00\xff\xff\xff\x7d\xff\xff\xff\xb6\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x90\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x06\xff\xff\xff\x08\xff\xff\xff\xe7\xff\xff\xff\x9b\xff\xff\xff\x08\xff\xff\xff\x12\xff\xff\xff\xcb\xff\xff\xff\x62\x81\xff\xff\xff\x00\x05\xff\xff\xff\xa5\xff\xff\xff\x9e\xff\xff\xff\x0f\xff\xff\xff\x00\xff\xff\xff\x20\xff\xff\xff\x4d\x81\xff\xff\xff\x00\x02\xff\xff\xff\xd0\xff\xff\xff\x9e\xff\xff\xff\x02\x81\xff\xff\xff\x9f\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x01\xff\xff\xff\xe5\xff\xff\xff\x33\x82\xff\xff\xff\x00\x05\xff\xff\xff\x1f\xff\xff\xff\xff\xff\xff\xff\x04\xff\xff\xff\x00\xff\xff\xff\x30\xff\xff\xff\xee\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x04\xff\xff\xff\x5b\xff\xff\xff\xd9\xff\xff\xff\x05\xff\xff\xff\x89\xff\xff\xff\xa3\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x04\xff\xff\xff\x02\xff\xff\xff\xc4\xff\xff\xff\x90\xff\xff\xff\xe5\xff\xff\xff\x17\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x90\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x0a\xff\xff\xff\x05\xff\xff\xff\xf9\xff\xff\xff\xb7\xff\xff\xff\x02\xff\xff\xff\x00\xff\xff\xff\x5b\xff\xff\xff\xbe\xff\xff\xff\x00\xff\xff\xff\x0c\xff\xff\xff\xfb\xff\xff\xff\x0e\x84\xff\xff\xff\x00\x05\xff\xff\xff\x0f\xff\xff\xff\xff\xff\xff\xff\xae\xff\xff\xff\x25\xff\xff\xff\x3c\xff\xff\xff\xe2\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x02\xff\xff\xff\x13\xff\xff\xff\xff\xff\xff\xff\x0c\x82\xff\xff\xff\x00\x05\xff\xff\xff\x02\xff\xff\xff\xd7\xff\xff\xff\x58\xff\xff\xff\x03\xff\xff\xff\x84\xff\xff\xff\xaa\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x03\xff\xff\xff\xbd\xff\xff\xff\x96\xff\xff\xff\xea\xff\xff\xff\x19\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x02\xff\xff\xff\x29\xff\xff\xff\xff\xff\xff\xff\x64\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x90\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x09\xff\xff\xff\x1d\xff\xff\xff\xfb\xff\xff\xff\x7b\xff\xff\xff\x8c\xff\xff\xff\x00\xff\xff\xff\x33\xff\xff\xff\xe8\xff\xff\xff\x00\xff\xff\xff\x22\xff\xff\xff\xff\x82\xff\xff\xff\xd7\x08\xff\xff\xff\xda\xff\xff\xff\xe2\xff\xff\xff\x00\xff\xff\xff\x24\xff\xff\xff\xfd\xff\xff\xff\x12\xff\xff\xff\xaf\xff\xff\xff\x2d\xff\xff\xff\xf3\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x01\xff\xff\xff\x22\xff\xff\xff\xff\x84\xff\xff\xff\x00\x04\xff\xff\xff\x23\xff\xff\xff\xe2\xff\xff\xff\xfc\xff\xff\xff\xcd\xff\xff\xff\x0e\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xff\x81\xff\xff\xff\xef\x01\xff\xff\xff\xf1\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x02\xff\xff\xff\x29\xff\xff\xff\xff\xff\xff\xff\x7f\x82\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xff\xff\xff\xff\x0e\xff\xff\xff\x00\xff\xff\xff\x2e\xff\xff\xff\xf3\x83\xff\xff\xff\x00\x03\xff\xff\xff\x90\xff\xff\xff\xcd\xff\xff\xff\xc6\xff\xff\xff\x02\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x90\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xef\x00\xff\xff\xff\xc2\x81\xff\xff\xff\x00\x0a\xff\xff\xff\x25\xff\xff\xff\xfd\xff\xff\xff\x00\xff\xff\xff\xa7\xff\xff\xff\x5d\xff\xff\xff\x28\xff\xff\xff\xf4\xff\xff\xff\x00\xff\xff\xff\x0b\xff\xff\xff\xfb\xff\xff\xff\x2b\x81\xff\xff\xff\x00\x08\xff\xff\xff\x37\xff\xff\xff\xe0\xff\xff\xff\x00\xff\xff\xff\x13\xff\xff\xff\xff\xff\xff\xff\x0f\xff\xff\xff\x46\xff\xff\xff\xb8\xff\xff\xff\xe0\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x02\xff\xff\xff\x12\xff\xff\xff\xff\xff\xff\xff\x0c\x83\xff\xff\xff\x00\x04\xff\xff\xff\xc6\xff\xff\xff\x5e\xff\xff\xff\x03\xff\xff\xff\x87\xff\xff\xff\x9e\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x02\xff\xff\xff\x67\xff\xff\xff\xe8\xff\xff\xff\xc1\x82\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xff\xff\xff\xff\x78\xff\xff\xff\x01\xff\xff\xff\x7c\xff\xff\xff\xce\x82\xff\xff\xff\x00\x04\xff\xff\xff\x45\xff\xff\xff\xd9\xff\xff\xff\x0a\xff\xff\xff\xae\xff\xff\xff\x7d\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x90\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x06\xff\xff\xff\x18\xff\xff\xff\xff\xff\xff\xff\x0a\xff\xff\xff\x09\xff\xff\xff\xc5\xff\xff\xff\x60\xff\xff\xff\xeb\x81\xff\xff\xff\x00\x05\xff\xff\xff\xa2\xff\xff\xff\xbb\xff\xff\xff\x15\xff\xff\xff\x0d\xff\xff\xff\xad\xff\xff\xff\x8e\x81\xff\xff\xff\x00\x04\xff\xff\xff\xce\xff\xff\xff\x78\xff\xff\xff\x02\xff\xff\xff\xc6\xff\xff\xff\x9e\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x01\xff\xff\xff\xe5\xff\xff\xff\x33\x82\xff\xff\xff\x00\x05\xff\xff\xff\x1d\xff\xff\xff\xff\xff\xff\xff\x04\xff\xff\xff\x00\xff\xff\xff\x30\xff\xff\xff\xed\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x04\xff\xff\xff\x12\xff\xff\xff\xeb\xff\xff\xff\x34\xff\xff\xff\xc6\xff\xff\xff\x60\x81\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x6e\xff\xff\xff\xe8\xff\xff\xff\xe7\xff\xff\xff\x47\x81\xff\xff\xff\x00\x09\xff\xff\xff\x12\xff\xff\xff\xe2\xff\xff\xff\x39\xff\xff\xff\x00\xff\xff\xff\x15\xff\xff\xff\xe4\xff\xff\xff\x35\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x90\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x86\xff\xff\xff\x00\x05\xff\xff\xff\xed\xff\xff\xff\x31\xff\xff\xff\x00\xff\xff\xff\x1c\xff\xff\xff\xe2\xff\xff\xff\xc9\x81\xff\xff\xff\x00\x05\xff\xff\xff\x0a\xff\xff\xff\x98\xff\xff\xff\xec\xff\xff\xff\xf2\xff\xff\xff\xa1\xff\xff\xff\x09\x81\xff\xff\xff\x00\x06\xff\xff\xff\x2f\xff\xff\xff\xd2\xff\xff\xff\xf3\xff\xff\xff\xaf\xff\xff\xff\xbb\xff\xff\xff\x22\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x01\xff\xff\xff\x9c\xff\xff\xff\x72\x82\xff\xff\xff\x00\x05\xff\xff\xff\x07\xff\xff\xff\xee\xff\xff\xff\x55\xff\xff\xff\x01\xff\xff\xff\x81\xff\xff\xff\xc8\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x08\xff\xff\xff\x99\xff\xff\xff\xa0\xff\xff\xff\x00\xff\xff\xff\x35\xff\xff\xff\xe9\xff\xff\xff\x12\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x8d\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x90\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x07\x00\xff\xff\xff\x06\x82\xff\xff\xff\x00\x05\xff\xff\xff\x91\xff\xff\xff\xaa\xff\xff\xff\x09\xff\xff\xff\x12\xff\xff\xff\xcc\xff\xff\xff\xac\x84\xff\xff\xff\x00\x00\xff\xff\xff\x09\x87\xff\xff\xff\x00\x02\xff\xff\xff\x1a\xff\xff\xff\x0b\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x04\xff\xff\xff\xf4\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x01\xff\xff\xff\xf4\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x01\xff\xff\xff\x34\xff\xff\xff\xce\x83\xff\xff\xff\x00\x04\xff\xff\xff\x40\xff\xff\xff\xd4\xff\xff\xff\xf5\xff\xff\xff\xc2\xff\xff\xff\x24\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x02\xff\xff\xff\x34\xff\xff\xff\xf2\xff\xff\xff\x1a\x81\xff\xff\xff\x00\x04\xff\xff\xff\xa1\xff\xff\xff\x9c\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x8d\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x04\xff\xff\xff\xf4\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x01\xff\xff\xff\xf4\xff\xff\xff\xf7\x90\xff\xff\xff\x00\x00\xff\xff\xff\x27\x83\xff\xff\xff\xff\x00\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x06\xff\xff\xff\x08\xff\xff\xff\x9d\xff\xff\xff\xec\xff\xff\xff\xef\xff\xff\xff\x9a\xff\xff\xff\x95\xff\xff\xff\x37\x81\xff\xff\xff\x00\x02\xff\xff\xff\x01\xff\xff\xff\xa3\xff\xff\xff\x64\x8a\xff\xff\xff\x00\x93\xff\xff\xff\x00\x01\xff\xff\xff\xae\xff\xff\xff\x47\x99\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x9e\xff\xff\xff\x00\x04\xff\xff\xff\x52\xff\xff\xff\xcc\xff\xff\xff\x02\xff\xff\xff\xf3\xff\xff\xff\x25\x97\xff\xff\xff\x00\x05\xff\xff\xff\x08\xff\xff\xff\x02\xff\xff\xff\x00\xff\xff\xff\x01\xff\xff\xff\xa1\xff\xff\xff\x86\x8b\xff\xff\xff\x00\xe1\xff\xff\xff\x00\x02\xff\xff\xff\x1a\xff\xff\xff\xcd\xff\xff\xff\x06\x9a\xff\xff\xff\x00\xe1\xff\xff\xff\x00\x01\xff\xff\xff\xb3\xff\xff\xff\x51\x9b\xff\xff\xff\x00\xff\xff\xff\xff\x00\xb0\xff\xff\xff\x00\x04\xff\xff\xff\x4c\xff\xff\xff\xe5\xff\xff\xff\xf2\xff\xff\xff\xb4\xff\xff\xff\x11\xab\xff\xff\xff\x00\x03\xff\xff\xff\x02\xff\xff\xff\xea\xff\xff\xff\xf1\xff\xff\xff\x76\x8b\xff\xff\xff\x00\x02\xff\xff\xff\x5e\xff\xff\xff\xf3\xff\xff\xff\x87\x8a\xff\xff\xff\x00\x01\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x04\xff\xff\xff\xf0\xff\xff\xff\xef\xff\xff\xff\x00\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x01\xff\xff\xff\xf0\xff\xff\xff\xef\xa1\xff\xff\xff\x00\x04\xff\xff\xff\x32\xff\xff\xff\x23\xff\xff\xff\x02\xff\xff\xff\x96\xff\xff\xff\x9a\x89\xff\xff\xff\x00\x01\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x04\xff\xff\xff\xf0\xff\xff\xff\xef\xff\xff\xff\x00\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x01\xff\xff\xff\xf0\xff\xff\xff\xef\x81\xff\xff\xff\x00\x03\xff\xff\xff\xbc\xff\xff\xff\xed\xff\xff\xff\xdd\xff\xff\xff\x4d\x8d\xff\xff\xff\x00\x02\xff\xff\xff\x08\xff\xff\xff\x47\xff\xff\xff\xcb\x8b\xff\xff\xff\x00\x02\xff\xff\xff\x07\xff\xff\xff\x05\xff\xff\xff\xbb\x8a\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\xa4\xff\xff\xff\x00\x01\xff\xff\xff\x36\xff\xff\xff\xe2\x89\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x03\xff\xff\xff\x3b\xff\xff\xff\x01\xff\xff\xff\x5e\xff\xff\xff\xe1\x8e\xff\xff\xff\x00\x01\xff\xff\xff\x79\xff\xff\xff\x6d\x8c\xff\xff\xff\x00\x01\xff\xff\xff\x25\xff\xff\xff\x83\x8a\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x8a\xff\xff\xff\x00\x01\xff\xff\xff\x8a\xff\xff\xff\xca\x85\xff\xff\xff\x00\x04\xff\xff\xff\x68\xff\xff\xff\xdb\xff\xff\xff\xf2\xff\xff\xff\xdc\xff\xff\xff\x6c\x81\xff\xff\xff\x00\x05\xff\xff\xff\xc2\xff\xff\xff\x85\xff\xff\xff\x00\xff\xff\xff\x4e\xff\xff\xff\xf9\xff\xff\xff\x02\x81\xff\xff\xff\x00\x04\xff\xff\xff\x2c\xff\xff\xff\xd8\xff\xff\xff\xeb\xff\xff\xff\x86\xff\xff\xff\xf5\x82\xff\xff\xff\x00\x04\xff\xff\xff\x93\xff\xff\xff\xb2\xff\xff\xff\x00\xff\xff\xff\x7a\xff\xff\xff\xcb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x01\xff\xff\xff\x63\xff\xff\xff\xe8\x8b\xff\xff\xff\x00\x04\xff\xff\xff\x02\xff\xff\xff\x8b\xff\xff\xff\xd9\xff\xff\xff\xdc\xff\xff\xff\xad\x8a\xff\xff\xff\x00\x04\xff\xff\xff\x16\xff\xff\xff\xac\xff\xff\xff\xd1\xff\xff\xff\xcd\xff\xff\xff\xa9\x89\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x8a\xff\xff\xff\x00\x02\xff\xff\xff\x23\xff\xff\xff\xfd\xff\xff\xff\x30\x83\xff\xff\xff\x00\x05\xff\xff\xff\x63\xff\xff\xff\xd2\xff\xff\xff\x25\xff\xff\xff\x00\xff\xff\xff\x46\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x05\xff\xff\xff\xe6\xff\xff\xff\xb9\xff\xff\xff\x00\xff\xff\xff\x83\xff\xff\xff\xfd\xff\xff\xff\x21\x81\xff\xff\xff\x00\x04\xff\xff\xff\xc7\xff\xff\xff\x7b\xff\xff\xff\x02\xff\xff\xff\x9f\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x08\xff\xff\xff\xcb\xff\xff\xff\xd9\xff\xff\xff\x04\xff\xff\xff\xb4\xff\xff\xff\xec\xff\xff\xff\x08\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x04\xff\xff\xff\x01\xff\xff\xff\x7f\xff\xff\xff\xf8\xff\xff\xff\xd1\xff\xff\xff\x0f\x8a\xff\xff\xff\x00\x04\xff\xff\xff\x7d\xff\xff\xff\xaf\xff\xff\xff\x04\xff\xff\xff\x00\xff\xff\xff\x37\x81\xff\xff\xff\x00\x06\xff\xff\xff\x03\xff\xff\xff\xaa\xff\xff\xff\x1c\xff\xff\xff\x00\xff\xff\xff\x06\xff\xff\xff\xa5\xff\xff\xff\x1a\x81\xff\xff\xff\x00\x01\xff\xff\xff\xba\xff\xff\xff\x8b\x81\xff\xff\xff\x00\x00\xff\xff\xff\x2a\x84\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x8b\xff\xff\xff\x00\x01\xff\xff\xff\xb8\xff\xff\xff\x96\x83\xff\xff\xff\x00\x01\xff\xff\xff\xdb\xff\xff\xff\x45\x81\xff\xff\xff\x00\x10\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x0c\xff\xff\xff\xe9\xff\xff\xff\xcd\xff\xff\xff\x00\xff\xff\xff\xb8\xff\xff\xff\xc5\xff\xff\xff\x46\xff\xff\xff\x00\xff\xff\xff\x10\xff\xff\xff\xff\xff\xff\xff\x12\xff\xff\xff\x00\xff\xff\xff\x3e\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x09\xff\xff\xff\x08\xff\xff\xff\xee\xff\xff\xff\x81\xff\xff\xff\x4b\xff\xff\xff\xaf\xff\xff\xff\xc0\xff\xff\xff\x3b\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x04\xff\xff\xff\x9f\xff\xff\xff\xd4\xff\xff\xff\x1f\xff\xff\xff\x8a\xff\xff\xff\xbc\x8a\xff\xff\xff\x00\x01\xff\xff\xff\xe5\xff\xff\xff\x34\x85\xff\xff\xff\x00\x04\xff\xff\xff\x6d\xff\xff\xff\xd8\xff\xff\xff\x1b\xff\xff\xff\xb2\xff\xff\xff\xa0\x81\xff\xff\xff\x00\x02\xff\xff\xff\x10\xff\xff\xff\xff\xff\xff\xff\x15\x87\xff\xff\xff\x00\x01\xff\xff\xff\x1c\xff\xff\xff\xb5\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x8b\xff\xff\xff\x00\x02\xff\xff\xff\x4e\xff\xff\xff\xf1\xff\xff\xff\x0a\x81\xff\xff\xff\x00\x02\xff\xff\xff\x13\xff\xff\xff\xff\xff\xff\xff\x0b\x81\xff\xff\xff\x00\x0c\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x32\xff\xff\xff\xcc\xff\xff\xff\xad\xff\xff\xff\x25\xff\xff\xff\xd2\xff\xff\xff\x90\xff\xff\xff\x6b\xff\xff\xff\x00\xff\xff\xff\x24\xff\xff\xff\xfd\x81\xff\xff\xff\x00\x01\xff\xff\xff\x2a\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x09\xff\xff\xff\x3b\xff\xff\xff\xc3\xff\xff\xff\x3c\xff\xff\xff\xcf\xff\xff\xff\x71\xff\xff\xff\x8c\xff\xff\xff\x73\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x08\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x17\xff\xff\xff\xff\xff\xff\xff\x24\xff\xff\xff\x00\xff\xff\xff\x52\xff\xff\xff\xe6\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x02\xff\xff\xff\x16\xff\xff\xff\xff\xff\xff\xff\x07\x86\xff\xff\xff\x00\x03\xff\xff\xff\x76\xff\xff\xff\xf4\xff\xff\xff\xac\xff\xff\xff\x02\x81\xff\xff\xff\x00\x01\xff\xff\xff\x23\xff\xff\xff\xfd\x86\xff\xff\xff\x00\x85\xff\xff\xff\x1b\x00\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x8b\xff\xff\xff\x00\x02\xff\xff\xff\x02\xff\xff\xff\xe1\xff\xff\xff\x63\x81\xff\xff\xff\x00\x01\xff\xff\xff\x23\xff\xff\xff\xfd\x81\xff\xff\xff\x00\x05\xff\xff\xff\x86\xff\xff\xff\xf0\xff\xff\xff\xef\xff\xff\xff\x00\xff\xff\xff\x57\xff\xff\xff\xae\x81\xff\xff\xff\x7d\x09\xff\xff\xff\xb3\xff\xff\xff\x72\xff\xff\xff\x90\xff\xff\xff\x00\xff\xff\xff\x10\xff\xff\xff\xff\xff\xff\xff\x12\xff\xff\xff\x00\xff\xff\xff\x3d\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x09\xff\xff\xff\x73\xff\xff\xff\x8f\xff\xff\xff\x04\xff\xff\xff\xe9\xff\xff\xff\x2c\xff\xff\xff\x58\xff\xff\xff\xab\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x08\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x0d\xff\xff\xff\xf3\xff\xff\xff\x07\xff\xff\xff\x77\xff\xff\xff\xe4\xff\xff\xff\x49\x83\xff\xff\xff\x00\x01\xff\xff\xff\x22\xff\xff\xff\xdb\x83\xff\xff\xff\x00\x01\xff\xff\xff\x24\xff\xff\xff\xfd\x87\xff\xff\xff\x00\x03\xff\xff\xff\xa0\xff\xff\xff\xdc\xff\xff\xff\xcc\xff\xff\xff\x0e\x81\xff\xff\xff\x00\x02\xff\xff\xff\x0b\xff\xff\xff\xfb\xff\xff\xff\x20\x85\xff\xff\xff\x00\x85\xff\xff\xff\xeb\x00\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x8c\xff\xff\xff\x00\x01\xff\xff\xff\x7c\xff\xff\xff\xca\x81\xff\xff\xff\x00\x02\xff\xff\xff\x13\xff\xff\xff\xff\xff\xff\xff\x0d\x84\xff\xff\xff\x00\x06\xff\xff\xff\x7c\xff\xff\xff\x90\xff\xff\xff\x4c\xff\xff\xff\xe2\xff\xff\xff\x81\xff\xff\xff\x54\xff\xff\xff\xb5\x81\xff\xff\xff\x00\x04\xff\xff\xff\xc7\xff\xff\xff\x7c\xff\xff\xff\x02\xff\xff\xff\xa0\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\xab\xff\xff\xff\x5c\x82\xff\xff\xff\x00\x04\xff\xff\xff\x25\xff\xff\xff\xe3\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x03\xff\xff\xff\x62\xff\xff\xff\xe7\xff\xff\xff\x8d\xff\xff\xff\x13\x8a\xff\xff\xff\x00\x02\xff\xff\xff\x16\xff\xff\xff\xff\xff\xff\xff\x0b\x85\xff\xff\xff\x00\x05\xff\xff\xff\x97\xff\xff\xff\xbb\xff\xff\xff\x07\xff\xff\xff\x8b\xff\xff\xff\xc4\xff\xff\xff\x0a\x81\xff\xff\xff\x00\x04\xff\xff\xff\xa8\xff\xff\xff\xab\xff\xff\xff\x0d\xff\xff\xff\x06\xff\xff\xff\x51\x84\xff\xff\xff\x00\x01\xff\xff\xff\x09\xff\xff\xff\x3d\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x87\xff\xff\xff\x00\x02\xff\xff\xff\x17\xff\xff\xff\xf9\xff\xff\xff\x30\x81\xff\xff\xff\x00\x01\xff\xff\xff\xda\xff\xff\xff\x4b\x84\xff\xff\xff\x00\x06\xff\xff\xff\xa2\xff\xff\xff\x72\xff\xff\xff\x1b\xff\xff\xff\xff\xff\xff\xff\x4f\xff\xff\xff\x36\xff\xff\xff\xda\x81\xff\xff\xff\x00\x04\xff\xff\xff\x2c\xff\xff\xff\xd7\xff\xff\xff\xec\xff\xff\xff\x8c\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\xe3\xff\xff\xff\x28\x83\xff\xff\xff\x00\x03\xff\xff\xff\xef\xff\xff\xff\x1b\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x07\xff\xff\xff\xd9\xff\xff\xff\x48\x8d\xff\xff\xff\x00\x01\xff\xff\xff\xe3\xff\xff\xff\x3e\x84\xff\xff\xff\x00\x02\xff\xff\xff\x02\xff\xff\xff\x7e\xff\xff\xff\x0a\x81\xff\xff\xff\x00\x01\xff\xff\xff\x78\xff\xff\xff\x13\x81\xff\xff\xff\x00\x04\xff\xff\xff\x0e\xff\xff\xff\xa1\xff\xff\xff\xed\xff\xff\xff\xee\xff\xff\xff\x91\x84\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x88\xff\xff\xff\x00\x01\xff\xff\xff\xa9\xff\xff\xff\x96\x81\xff\xff\xff\x00\x08\xff\xff\xff\x60\xff\xff\xff\xd8\xff\xff\xff\x29\xff\xff\xff\x00\xff\xff\xff\x21\xff\xff\xff\x57\xff\xff\xff\x00\xff\xff\xff\xc7\xff\xff\xff\x54\x82\xff\xff\xff\x00\x02\xff\xff\xff\x18\xff\xff\xff\xfa\xff\xff\xff\x03\x8f\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x07\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x18\xff\xff\xff\xfd\xff\xff\xff\x2f\xff\xff\xff\x00\xff\xff\xff\x30\x8b\xff\xff\xff\x00\x04\xff\xff\xff\x77\xff\xff\xff\xc4\xff\xff\xff\x13\xff\xff\xff\x07\xff\xff\xff\x52\x99\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x04\xff\xff\xff\xf4\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x01\xff\xff\xff\xf4\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x84\xff\xff\xff\x00\x83\xff\xff\xff\xf3\x01\xff\xff\xff\xf8\xff\xff\xff\xf1\x82\xff\xff\xff\x00\x07\xff\xff\xff\x64\xff\xff\xff\xd8\xff\xff\xff\xf3\xff\xff\xff\xdc\xff\xff\xff\x5e\xff\xff\xff\x00\xff\xff\xff\xec\xff\xff\xff\x36\x83\xff\xff\xff\x00\x01\xff\xff\xff\xf8\xff\xff\xff\x24\x8f\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x04\xff\xff\xff\xf4\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x01\xff\xff\xff\xf4\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x03\xff\xff\xff\x76\xff\xff\xff\xec\xff\xff\xff\xf0\xff\xff\xff\xb3\x8b\xff\xff\xff\x00\x04\xff\xff\xff\x01\xff\xff\xff\x87\xff\xff\xff\xe9\xff\xff\xff\xf0\xff\xff\xff\x98\x99\xff\xff\xff\x00\xff\xff\xff\xff\x00\xff\xff\xff\xff\x00\xff\xff\xff\xff\x00\xff\xff\xff\xff\x00\xd1\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\xab\xff\xff\xff\x00\x01\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x04\xff\xff\xff\xf0\xff\xff\xff\xef\xff\xff\xff\x00\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x01\xff\xff\xff\xf0\xff\xff\xff\xef\xb0\xff\xff\xff\x00\x01\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x04\xff\xff\xff\xf0\xff\xff\xff\xef\xff\xff\xff\x00\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x01\xff\xff\xff\xf0\xff\xff\xff\xef\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x86\xff\xff\xff\x00\x03\xff\xff\xff\x25\xff\xff\xff\xef\xff\xff\xff\x25\xff\xff\xff\xeb\xa0\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\xb0\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x86\xff\xff\xff\x00\x03\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x27\xff\xff\xff\xf7\xa0\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x0d\xff\xff\xff\x18\xff\xff\xff\xaf\xff\xff\xff\xf2\xff\xff\xff\xe9\xff\xff\xff\x97\xff\xff\xff\xa9\xff\xff\xff\xb9\xff\xff\xff\x00\xff\xff\xff\x0d\xff\xff\xff\xa4\xff\xff\xff\xed\xff\xff\xff\xf0\xff\xff\xff\xab\xff\xff\xff\x11\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x86\xff\xff\xff\x00\x02\xff\xff\xff\x3f\xff\xff\xff\xff\xff\xff\xff\x77\x84\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x02\xff\xff\xff\x3e\xff\xff\xff\xff\xff\xff\xff\x79\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x86\xff\xff\xff\x00\x0b\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\xc1\xff\xff\xff\x54\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xff\xff\xff\xff\xf3\xff\xff\xff\xeb\x81\xff\xff\xff\x00\x04\xff\xff\xff\x0d\xff\xff\xff\xa8\xff\xff\xff\xf1\xff\xff\xff\xea\xff\xff\xff\x88\x82\xff\xff\xff\x00\x0c\xff\xff\xff\x8f\xff\xff\xff\xf3\xff\xff\xff\xd6\xff\xff\xff\x5d\xff\xff\xff\xdf\xff\xff\xff\xf1\xff\xff\xff\x93\xff\xff\xff\x00\xff\xff\xff\x28\xff\xff\xff\xcd\xff\xff\xff\xf3\xff\xff\xff\xb8\xff\xff\xff\x12\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x0d\xff\xff\xff\xc7\xff\xff\xff\x96\xff\xff\xff\x0b\xff\xff\xff\x09\xff\xff\xff\xa6\xff\xff\xff\xfd\xff\xff\xff\x20\xff\xff\xff\x00\xff\xff\xff\x9a\xff\xff\xff\x8c\xff\xff\xff\x05\xff\xff\xff\x0a\xff\xff\xff\xa8\xff\xff\xff\xa5\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x86\xff\xff\xff\x00\x02\xff\xff\xff\x88\xff\xff\xff\xc1\xff\xff\xff\xbf\x84\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x02\xff\xff\xff\x93\xff\xff\xff\xbf\xff\xff\xff\xce\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x86\xff\xff\xff\x00\x09\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x7d\xff\xff\xff\x9e\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x14\xff\xff\xff\x99\xff\xff\xff\xaa\xff\xff\xff\x08\xff\xff\xff\x12\xff\xff\xff\xcb\xff\xff\xff\x65\xff\xff\xff\x00\xff\xff\xff\x19\xff\xff\xff\xff\xff\xff\xff\x1f\xff\xff\xff\x56\xff\xff\xff\xff\xff\xff\xff\x3f\xff\xff\xff\x01\xff\xff\xff\x32\xff\xff\xff\x00\xff\xff\xff\xc7\xff\xff\xff\x6e\xff\xff\xff\x01\xff\xff\xff\x98\xff\xff\xff\x99\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x0d\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x1b\xff\xff\xff\xef\xff\xff\xff\x04\xff\xff\xff\x00\xff\xff\xff\x1a\xff\xff\xff\xe9\xff\xff\xff\xbe\xff\xff\xff\x7d\xff\xff\xff\x00\xff\xff\xff\xf0\xff\xff\xff\x0b\x81\xff\xff\xff\x00\x01\xff\xff\xff\x35\xff\xff\xff\xeb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x86\xff\xff\xff\x00\x03\xff\xff\xff\xd1\xff\xff\xff\x43\xff\xff\xff\xf3\xff\xff\xff\x0d\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x84\xff\xff\xff\x00\x04\xff\xff\xff\x01\xff\xff\xff\xe6\xff\xff\xff\x2d\xff\xff\xff\xec\xff\xff\xff\x23\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x8b\xff\xff\xff\x00\x09\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x38\xff\xff\xff\xfd\xff\xff\xff\xef\xff\xff\xff\xf1\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x01\xff\xff\xff\xf0\xff\xff\xff\x2e\x81\xff\xff\xff\x00\x07\xff\xff\xff\x5a\xff\xff\xff\xbf\xff\xff\xff\x00\xff\xff\xff\x14\xff\xff\xff\xfd\xff\xff\xff\x31\xff\xff\xff\x29\xff\xff\xff\xfa\x82\xff\xff\xff\x00\x05\xff\xff\xff\x11\xff\xff\xff\xff\xff\xff\xff\x0f\xff\xff\xff\x00\xff\xff\xff\x3b\xff\xff\xff\xe1\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x0d\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x11\xff\xff\xff\xe2\xff\xff\xff\x00\xff\xff\xff\x01\xff\xff\xff\xbe\xff\xff\xff\x81\xff\xff\xff\x37\xff\xff\xff\xd2\xff\xff\xff\x19\xff\xff\xff\xff\xff\xff\xff\x0b\x81\xff\xff\xff\x00\x01\xff\xff\xff\x39\xff\xff\xff\xea\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x04\xff\xff\xff\x1b\xff\xff\xff\xf2\xff\xff\xff\x04\xff\xff\xff\xc0\xff\xff\xff\x51\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x84\xff\xff\xff\x00\x04\xff\xff\xff\x3d\xff\xff\xff\xd5\xff\xff\xff\x00\xff\xff\xff\x9e\xff\xff\xff\x78\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x01\xff\xff\xff\x0e\xff\xff\xff\x5d\x85\xff\xff\xff\x00\x0a\xff\xff\xff\x43\xff\xff\xff\x8c\xff\xff\xff\xfb\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x02\xff\xff\xff\xf0\xff\xff\xff\x26\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x02\xff\xff\xff\x19\xff\xff\xff\xff\xff\xff\xff\x06\x81\xff\xff\xff\x00\x01\xff\xff\xff\x33\xff\xff\xff\xe7\x81\xff\xff\xff\x00\x08\xff\xff\xff\x72\xff\xff\xff\xe4\xff\xff\xff\xf2\xff\xff\xff\xff\xff\xff\xff\xef\xff\xff\xff\xf0\xff\xff\xff\xee\xff\xff\xff\x24\xff\xff\xff\xfd\x81\xff\xff\xff\x00\x01\xff\xff\xff\x2a\xff\xff\xff\xf3\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x0d\xff\xff\xff\xad\xff\xff\xff\x4b\xff\xff\xff\x7a\xff\xff\xff\xba\xff\xff\xff\x01\xff\xff\xff\x27\xff\xff\xff\xf1\xff\xff\xff\x24\xff\xff\xff\xff\xff\xff\xff\x8d\xff\xff\xff\x08\xff\xff\xff\x0d\xff\xff\xff\xae\xff\xff\xff\xa2\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xef\x00\xff\xff\xff\x86\x81\xff\xff\xff\x00\x04\xff\xff\xff\x63\xff\xff\xff\xb6\xff\xff\xff\x00\xff\xff\xff\x7e\xff\xff\xff\x9a\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x84\xff\xff\xff\x00\x04\xff\xff\xff\x92\xff\xff\xff\x82\xff\xff\xff\x00\xff\xff\xff\x4b\xff\xff\xff\xcd\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x84\xff\xff\xff\x00\x00\xff\xff\xff\x90\x81\xff\xff\xff\xff\x02\xff\xff\xff\xfb\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x08\xff\xff\xff\xaf\xff\xff\xff\x62\xff\xff\xff\x27\xff\xff\xff\xff\xff\xff\xff\xef\xff\xff\xff\xa0\xff\xff\xff\x00\xff\xff\xff\x24\xff\xff\xff\xfc\x82\xff\xff\xff\x00\x01\xff\xff\xff\x2a\xff\xff\xff\xf3\x83\xff\xff\xff\x00\x0a\xff\xff\xff\x2a\xff\xff\xff\xf9\xff\xff\xff\x00\xff\xff\xff\x2a\xff\xff\xff\xec\xff\xff\xff\x12\xff\xff\xff\xff\xff\xff\xff\x10\xff\xff\xff\x00\xff\xff\xff\x3d\xff\xff\xff\xe1\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x03\xff\xff\xff\x10\xff\xff\xff\xc8\xff\xff\xff\xde\xff\xff\xff\x14\x82\xff\xff\xff\x00\x06\xff\xff\xff\x15\xff\xff\xff\xff\xff\xff\xff\x66\xff\xff\xff\xdd\xff\xff\xff\xeb\xff\xff\xff\xa6\xff\xff\xff\x10\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x04\xff\xff\xff\xac\xff\xff\xff\x75\xff\xff\xff\x00\xff\xff\xff\x3b\xff\xff\xff\xe3\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x09\xff\xff\xff\x01\xff\xff\xff\xe5\xff\xff\xff\x2f\xff\xff\xff\x00\xff\xff\xff\x06\xff\xff\xff\xf0\xff\xff\xff\x22\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x01\xff\xff\xff\x10\xff\xff\xff\xfc\x81\xff\xff\xff\xff\x02\xff\xff\xff\xfb\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x03\xff\xff\xff\x6b\xff\xff\xff\x9e\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x02\xff\xff\xff\x1b\xff\xff\xff\xff\xff\xff\xff\x02\x81\xff\xff\xff\x00\x01\xff\xff\xff\x3a\xff\xff\xff\xe8\x81\xff\xff\xff\x00\x0c\xff\xff\xff\x2e\xff\xff\xff\x03\xff\xff\xff\x6d\xff\xff\xff\xff\xff\xff\xff\x2d\xff\xff\xff\x60\xff\xff\xff\xc6\xff\xff\xff\x00\xff\xff\xff\xcc\xff\xff\xff\x76\xff\xff\xff\x02\xff\xff\xff\xa0\xff\xff\xff\x99\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x02\xff\xff\xff\x08\xff\xff\xff\xec\xff\xff\xff\x38\x84\xff\xff\xff\x00\x01\xff\xff\xff\xe1\xff\xff\xff\x42\x85\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x84\xff\xff\xff\x00\x06\xff\xff\xff\x04\xff\xff\xff\xf0\xff\xff\xff\x33\xff\xff\xff\x00\xff\xff\xff\x04\xff\xff\xff\xf3\xff\xff\xff\x2c\x81\xff\xff\xff\x00\x02\xff\xff\xff\xdc\xff\xff\xff\xf4\xff\xff\xff\xff\x81\xff\xff\xff\xf3\x03\xff\xff\xff\x3c\xff\xff\xff\x00\xff\xff\xff\x3c\xff\xff\xff\xdc\x82\xff\xff\xff\x00\x04\xff\xff\xff\xa5\xff\xff\xff\x78\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x00\xff\xff\xff\x1e\x82\xff\xff\xff\xff\x02\xff\xff\xff\xfb\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x03\xff\xff\xff\x26\xff\xff\xff\xda\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x02\xff\xff\xff\x02\xff\xff\xff\xf5\xff\xff\xff\x1e\x81\xff\xff\xff\x00\x01\xff\xff\xff\x76\xff\xff\xff\xc1\x81\xff\xff\xff\x00\x0c\xff\xff\xff\x80\xff\xff\xff\xee\xff\xff\xff\xdf\xff\xff\xff\x7e\xff\xff\xff\xe8\xff\xff\xff\xe9\xff\xff\xff\x49\xff\xff\xff\x00\xff\xff\xff\x2c\xff\xff\xff\xcf\xff\xff\xff\xf3\xff\xff\xff\xb9\xff\xff\xff\x12\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x04\xff\xff\xff\x1b\xff\xff\xff\xfd\xff\xff\xff\x26\xff\xff\xff\x00\xff\xff\xff\x21\x82\xff\xff\xff\x00\x05\xff\xff\xff\x6f\xff\xff\xff\xd4\xff\xff\xff\x2a\xff\xff\xff\x00\xff\xff\xff\x12\xff\xff\xff\x1a\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x84\xff\xff\xff\x00\x02\xff\xff\xff\x3e\xff\xff\xff\xee\xff\xff\xff\x01\x81\xff\xff\xff\x00\x01\xff\xff\xff\xb7\xff\xff\xff\x75\x82\xff\xff\xff\x00\x01\xff\xff\xff\x25\xff\xff\xff\xfb\x8b\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x84\xff\xff\xff\x00\x00\xff\xff\xff\xd3\x81\xff\xff\xff\xff\x02\xff\xff\xff\xfb\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x02\xff\xff\xff\xe1\xff\xff\xff\x3e\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x05\xff\xff\xff\xac\xff\xff\xff\x81\xff\xff\xff\x06\xff\xff\xff\x48\xff\xff\xff\xee\xff\xff\xff\x69\x90\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x04\xff\xff\xff\xf4\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x01\xff\xff\xff\xf4\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x03\xff\xff\xff\x7d\xff\xff\xff\xe8\xff\xff\xff\xf0\xff\xff\xff\xa9\x83\xff\xff\xff\x00\x04\xff\xff\xff\x73\xff\xff\xff\xdd\xff\xff\xff\xf3\xff\xff\xff\xe0\xff\xff\xff\x40\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x03\xff\xff\xff\xe3\xff\xff\xff\x00\xff\xff\xff\x87\xff\xff\xff\xaf\x82\xff\xff\xff\x00\x01\xff\xff\xff\x74\xff\xff\xff\xbe\x82\xff\xff\xff\x00\x02\xff\xff\xff\x0d\xff\xff\xff\xfb\xff\xff\xff\x26\x8a\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x04\xff\xff\xff\xf4\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x01\xff\xff\xff\xf4\xff\xff\xff\xf7\x89\xff\xff\xff\x00\x05\xff\xff\xff\x1f\xff\xff\xff\xb2\xff\xff\xff\xf3\xff\xff\xff\xff\xff\xff\xff\xf4\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x04\xff\xff\xff\x9d\xff\xff\xff\xf7\xff\xff\xff\xff\xff\xff\xff\xf3\xff\xff\xff\xcc\x81\xff\xff\xff\x00\x04\xff\xff\xff\x1c\xff\xff\xff\xc6\xff\xff\xff\xf8\xff\xff\xff\xe0\xff\xff\xff\x81\x91\xff\xff\xff\x00\xb2\xff\xff\xff\x00\x03\xff\xff\xff\x79\xff\xff\xff\xf0\xff\xff\xff\xf3\xff\xff\xff\x3c\xc1\xff\xff\xff\x00\x03\xff\xff\xff\x15\xff\xff\xff\xcc\xff\xff\xff\x06\xff\xff\xff\xdc\x82\xff\xff\xff\x00\xe8\xff\xff\xff\x00\x04\xff\xff\xff\x0f\xff\xff\xff\xd7\xff\xff\xff\x07\xff\xff\xff\xff\xff\xff\xff\xe3\x91\xff\xff\xff\x00\xe8\xff\xff\xff\x00\x04\xff\xff\xff\x0f\xff\xff\xff\xd7\xff\xff\xff\x07\xff\xff\xff\xff\xff\xff\xff\xe3\x91\xff\xff\xff\x00\xff\xff\xff\xff\x00\xd7\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\xa5\xff\xff\xff\x00\x01\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x04\xff\xff\xff\xf0\xff\xff\xff\xef\xff\xff\xff\x00\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x01\xff\xff\xff\xf0\xff\xff\xff\xef\xb0\xff\xff\xff\x00\x01\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x04\xff\xff\xff\xf0\xff\xff\xff\xef\xff\xff\xff\x00\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x01\xff\xff\xff\xf0\xff\xff\xff\xef\x88\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\xa5\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\xb0\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x88\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\xa5\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x84\xff\xff\xff\x00\x09\xff\xff\xff\x7a\xff\xff\xff\xf1\xff\xff\xff\xd6\xff\xff\xff\x35\xff\xff\xff\x19\xff\xff\xff\xd6\xff\xff\xff\xf4\xff\xff\xff\xf0\xff\xff\xff\xa7\xff\xff\xff\x0f\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xff\x83\xff\xff\xff\xf3\x00\xff\xff\xff\x15\x81\xff\xff\xff\x00\x04\xff\xff\xff\x41\xff\xff\xff\xd9\xff\xff\xff\xf4\xff\xff\xff\xc4\xff\xff\xff\x25\x82\xff\xff\xff\x00\x05\xff\xff\xff\x0b\xff\xff\xff\x96\xff\xff\xff\xe8\xff\xff\xff\xf3\xff\xff\xff\xd9\xff\xff\xff\x6e\x81\xff\xff\xff\x00\x04\xff\xff\xff\x6d\xff\xff\xff\xe7\xff\xff\xff\xc0\xff\xff\xff\x84\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x09\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\xa3\xff\xff\xff\xf3\xff\xff\xff\x9b\xff\xff\xff\xc8\xff\xff\xff\xa5\xff\xff\xff\x00\xff\xff\xff\xc3\xff\xff\xff\x71\x82\xff\xff\xff\x00\x01\xff\xff\xff\xa2\xff\xff\xff\x97\x81\xff\xff\xff\x00\x04\xff\xff\xff\x0d\xff\xff\xff\xa8\xff\xff\xff\xf1\xff\xff\xff\xea\xff\xff\xff\x88\x82\xff\xff\xff\x00\x05\xff\xff\xff\x7f\xff\xff\xff\xf1\xff\xff\xff\xe5\xff\xff\xff\x6d\xff\xff\xff\xff\xff\xff\xff\x1b\x81\xff\xff\xff\x00\x04\xff\xff\xff\x28\xff\xff\xff\xcc\xff\xff\xff\xf3\xff\xff\xff\xb8\xff\xff\xff\x12\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x0a\xff\xff\xff\x15\xff\xff\xff\xfc\xff\xff\xff\x25\xff\xff\xff\x57\xff\xff\xff\xd9\xff\xff\xff\x13\xff\xff\xff\x3c\xff\xff\xff\x01\xff\xff\xff\x0c\xff\xff\xff\xad\xff\xff\xff\xa1\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x05\xff\xff\xff\x02\xff\xff\xff\xe8\xff\xff\xff\x4c\xff\xff\xff\x00\xff\xff\xff\x79\xff\xff\xff\xbe\x82\xff\xff\xff\x00\x0c\xff\xff\xff\xa5\xff\xff\xff\x9b\xff\xff\xff\x0e\xff\xff\xff\x00\xff\xff\xff\x1f\xff\xff\xff\x4b\xff\xff\xff\x00\xff\xff\xff\x07\xff\xff\xff\xf6\xff\xff\xff\x38\xff\xff\xff\x00\xff\xff\xff\x8a\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x09\xff\xff\xff\x27\xff\xff\xff\xff\xff\xff\xff\x5b\xff\xff\xff\x02\xff\xff\xff\x98\xff\xff\xff\xfa\xff\xff\xff\x09\xff\xff\xff\x00\xff\xff\xff\x6b\xff\xff\xff\xc5\x81\xff\xff\xff\x00\x02\xff\xff\xff\x07\xff\xff\xff\xf1\xff\xff\xff\x3f\x81\xff\xff\xff\x00\x0d\xff\xff\xff\x99\xff\xff\xff\xaa\xff\xff\xff\x08\xff\xff\xff\x12\xff\xff\xff\xcb\xff\xff\xff\x65\xff\xff\xff\x00\xff\xff\xff\x17\xff\xff\xff\xef\xff\xff\xff\x1b\xff\xff\xff\x04\xff\xff\xff\x8b\xff\xff\xff\xff\xff\xff\xff\x1b\x81\xff\xff\xff\x00\x04\xff\xff\xff\xc7\xff\xff\xff\x75\xff\xff\xff\x02\xff\xff\xff\x9f\xff\xff\xff\x99\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x06\xff\xff\xff\x0a\xff\xff\xff\x00\xff\xff\xff\x13\xff\xff\xff\xfb\xff\xff\xff\x2a\xff\xff\xff\x5b\xff\xff\xff\xd1\x83\xff\xff\xff\x00\x01\xff\xff\xff\x36\xff\xff\xff\xea\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x01\xff\xff\xff\x1d\xff\xff\xff\xfd\x81\xff\xff\xff\x00\x01\xff\xff\xff\x2a\xff\xff\xff\xed\x81\xff\xff\xff\x00\x02\xff\xff\xff\x0c\xff\xff\xff\xfb\xff\xff\xff\x0c\x84\xff\xff\xff\x00\x05\xff\xff\xff\x23\xff\xff\xff\xfd\xff\xff\xff\x01\xff\xff\xff\x00\xff\xff\xff\x35\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xfd\xff\xff\xff\x04\xff\xff\xff\x00\xff\xff\xff\x35\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x06\xff\xff\xff\x16\xff\xff\xff\xfb\xff\xff\xff\xf2\xff\xff\xff\xef\xff\xff\xff\xf5\xff\xff\xff\xe4\xff\xff\xff\x01\x81\xff\xff\xff\x00\x01\xff\xff\xff\xf0\xff\xff\xff\x2e\x81\xff\xff\xff\x00\x10\xff\xff\xff\x5a\xff\xff\xff\xbf\xff\xff\xff\x00\xff\xff\xff\x11\xff\xff\xff\xef\xff\xff\xff\x30\xff\xff\xff\x00\xff\xff\xff\x15\xff\xff\xff\xff\xff\xff\xff\x1b\xff\xff\xff\x00\xff\xff\xff\x11\xff\xff\xff\xff\xff\xff\xff\x10\xff\xff\xff\x00\xff\xff\xff\x3d\xff\xff\xff\xe1\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x06\xff\xff\xff\x5d\xff\xff\xff\xb1\xff\xff\xff\x4c\xff\xff\xff\x71\xff\xff\xff\xea\xff\xff\xff\xbf\xff\xff\xff\x1f\x83\xff\xff\xff\x00\x01\xff\xff\xff\x39\xff\xff\xff\xe9\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x01\xff\xff\xff\x26\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf6\x81\xff\xff\xff\x00\x01\xff\xff\xff\x22\xff\xff\xff\xff\x82\xff\xff\xff\xef\x04\xff\xff\xff\xf0\xff\xff\xff\xed\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x06\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x77\xff\xff\xff\xef\xff\xff\xff\xf1\xff\xff\xff\xff\x81\xff\xff\xff\xef\x03\xff\xff\xff\x4d\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x04\xff\xff\xff\xbb\xff\xff\xff\x82\xff\xff\xff\x00\xff\xff\xff\xb3\xff\xff\xff\x8f\x81\xff\xff\xff\x00\x02\xff\xff\xff\x19\xff\xff\xff\xff\xff\xff\xff\x06\x81\xff\xff\xff\x00\x01\xff\xff\xff\x33\xff\xff\xff\xe7\x81\xff\xff\xff\x00\x08\xff\xff\xff\x5c\xff\xff\xff\xd5\xff\xff\xff\xf0\xff\xff\xff\xef\xff\xff\xff\xff\xff\xff\xff\x1a\xff\xff\xff\x00\xff\xff\xff\x24\xff\xff\xff\xfd\x81\xff\xff\xff\x00\x01\xff\xff\xff\x2a\xff\xff\xff\xf3\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x0b\xff\xff\xff\x0b\xff\xff\xff\x71\xff\xff\xff\xb7\xff\xff\xff\x5f\xff\xff\xff\x04\xff\xff\xff\x00\xff\xff\xff\x0e\xff\xff\xff\x28\xff\xff\xff\x00\xff\xff\xff\x19\xff\xff\xff\xbc\xff\xff\xff\x9b\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xef\x00\xff\xff\xff\xc2\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x02\xff\xff\xff\x0b\xff\xff\xff\xfb\xff\xff\xff\x28\x81\xff\xff\xff\x00\x04\xff\xff\xff\x3a\xff\xff\xff\xde\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x02\xff\xff\xff\x54\xff\xff\xff\xff\xff\xff\xff\x26\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x04\xff\xff\xff\x63\xff\xff\xff\xb5\xff\xff\xff\x00\xff\xff\xff\xe6\xff\xff\xff\x37\x81\xff\xff\xff\x00\x01\xff\xff\xff\x24\xff\xff\xff\xfc\x82\xff\xff\xff\x00\x01\xff\xff\xff\x29\xff\xff\xff\xf3\x84\xff\xff\xff\x00\x09\xff\xff\xff\x0e\xff\xff\xff\xff\xff\xff\xff\x15\xff\xff\xff\x00\xff\xff\xff\x12\xff\xff\xff\xff\xff\xff\xff\x10\xff\xff\xff\x00\xff\xff\xff\x3d\xff\xff\xff\xe1\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x0c\xff\xff\xff\x69\xff\xff\xff\xe7\xff\xff\xff\xdd\xff\xff\xff\x4c\xff\xff\xff\x5f\xff\xff\xff\xb8\xff\xff\xff\x54\xff\xff\xff\x27\xff\xff\xff\xff\xff\xff\xff\xe4\xff\xff\xff\xe9\xff\xff\xff\x9b\xff\xff\xff\x0b\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x08\xff\xff\xff\xa2\xff\xff\xff\xb6\xff\xff\xff\x0f\xff\xff\xff\x08\xff\xff\xff\xab\xff\xff\xff\x8b\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x0c\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x53\xff\xff\xff\xac\xff\xff\xff\xef\xff\xff\xff\xae\xff\xff\xff\xe2\xff\xff\xff\xa7\xff\xff\xff\x36\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x03\xff\xff\xff\x10\xff\xff\xff\xe3\xff\xff\xff\x1a\xff\xff\xff\xde\x82\xff\xff\xff\x00\x02\xff\xff\xff\x1a\xff\xff\xff\xff\xff\xff\xff\x07\x81\xff\xff\xff\x00\x01\xff\xff\xff\x34\xff\xff\xff\xe9\x81\xff\xff\xff\x00\x05\xff\xff\xff\x6a\xff\xff\xff\x3a\xff\xff\xff\x1b\xff\xff\xff\x82\xff\xff\xff\xe9\xff\xff\xff\x01\x81\xff\xff\xff\x00\x04\xff\xff\xff\xcc\xff\xff\xff\x76\xff\xff\xff\x02\xff\xff\xff\xa0\xff\xff\xff\x99\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x07\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x13\xff\xff\xff\xfb\xff\xff\xff\x2b\xff\xff\xff\x57\xff\xff\xff\xe2\x81\xff\xff\xff\x00\x02\xff\xff\xff\x13\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x08\xff\xff\xff\x0a\xff\xff\xff\x98\xff\xff\xff\xea\xff\xff\xff\xef\xff\xff\xff\x9f\xff\xff\xff\x08\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x04\xff\xff\xff\x79\xff\xff\xff\xb7\xff\xff\xff\x04\xff\xff\xff\xda\xff\xff\xff\x43\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x02\xff\xff\xff\xb3\xff\xff\xff\x6c\xff\xff\xff\x87\x82\xff\xff\xff\x00\x02\xff\xff\xff\x01\xff\xff\xff\xf3\xff\xff\xff\x31\x81\xff\xff\xff\x00\x01\xff\xff\xff\x5e\xff\xff\xff\xc5\x81\xff\xff\xff\x00\x04\xff\xff\xff\x6b\xff\xff\xff\xdd\xff\xff\xff\xf9\xff\xff\xff\xd3\xff\xff\xff\x3f\x82\xff\xff\xff\x00\x04\xff\xff\xff\x2c\xff\xff\xff\xcf\xff\xff\xff\xf3\xff\xff\xff\xb9\xff\xff\xff\x12\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x07\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x14\xff\xff\xff\xfc\xff\xff\xff\x2b\xff\xff\xff\x57\xff\xff\xff\xb8\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x91\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x09\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x1b\xff\xff\xff\xf0\xff\xff\xff\x2a\xff\xff\xff\x00\xff\xff\xff\x51\xff\xff\xff\xd9\xff\xff\xff\x06\x8a\xff\xff\xff\x00\x02\xff\xff\xff\x5b\xff\xff\xff\xd3\xff\xff\xff\x2f\x83\xff\xff\xff\x00\x05\xff\xff\xff\xa2\xff\xff\xff\xb2\xff\xff\xff\x11\xff\xff\xff\x1e\xff\xff\xff\xd1\xff\xff\xff\x72\x83\xff\xff\xff\x00\x00\xff\xff\xff\x01\x8b\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x04\xff\xff\xff\xf4\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x01\xff\xff\xff\xf4\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x03\xff\xff\xff\x74\xff\xff\xff\xeb\xff\xff\xff\xaf\xff\xff\xff\x0c\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x00\xff\xff\xff\x5a\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x00\xff\xff\xff\xef\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x91\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x04\xff\xff\xff\xf4\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x04\xff\xff\xff\xf4\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\xa7\xff\xff\xff\x97\x82\xff\xff\xff\x00\x01\xff\xff\xff\xc1\xff\xff\xff\x7c\x8a\xff\xff\xff\x00\x02\xff\xff\xff\x41\xff\xff\xff\xf4\xff\xff\xff\x1f\x83\xff\xff\xff\x00\x05\xff\xff\xff\x13\xff\xff\xff\xaf\xff\xff\xff\xf4\xff\xff\xff\xee\xff\xff\xff\x96\xff\xff\xff\x03\x81\xff\xff\xff\x00\x03\xff\xff\xff\x02\xff\xff\xff\xa5\xff\xff\xff\xb2\xff\xff\xff\x6d\x83\xff\xff\xff\x00\x03\xff\xff\xff\x3b\xff\xff\xff\x72\xff\xff\xff\xa3\xff\xff\xff\xbc\x82\xff\xff\xff\x00\xe0\xff\xff\xff\x00\x03\xff\xff\xff\x0d\xff\xff\xff\xf2\xff\xff\xff\x56\xff\xff\xff\xd2\x8b\xff\xff\xff\x00\x03\xff\xff\xff\x17\xff\xff\xff\xfa\xff\xff\xff\x43\xff\xff\xff\xeb\x83\xff\xff\xff\x00\x04\xff\xff\xff\x0a\xff\xff\xff\xe1\xff\xff\xff\x6a\xff\xff\xff\xa0\xff\xff\xff\x0c\x81\xff\xff\xff\x00\xe0\xff\xff\xff\x00\x03\xff\xff\xff\x14\xff\xff\xff\xfb\xff\xff\xff\x50\xff\xff\xff\xdc\x83\xff\xff\xff\x00\x04\xff\xff\xff\x26\xff\xff\xff\x81\xff\xff\xff\x36\xff\xff\xff\xba\xff\xff\xff\x72\x83\xff\xff\xff\x00\x02\xff\xff\xff\x6a\xff\xff\xff\xe2\xff\xff\xff\x5c\x8a\xff\xff\xff\x00\xe1\xff\xff\xff\x00\x02\xff\xff\xff\x66\xff\xff\xff\xde\xff\xff\xff\x3d\x83\xff\xff\xff\x00\x05\xff\xff\xff\x03\xff\xff\xff\xc3\xff\xff\xff\xd3\xff\xff\xff\x41\xff\xff\xff\xc2\xff\xff\xff\x02\x90\xff\xff\xff\x00\xff\xff\xff\xff\x00\xff\xff\xff\xff\x00\x01\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x04\xff\xff\xff\xf0\xff\xff\xff\xef\xff\xff\xff\x00\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x01\xff\xff\xff\xf0\xff\xff\xff\xef\xb0\xff\xff\xff\x00\x01\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x04\xff\xff\xff\xf0\xff\xff\xff\xef\xff\xff\xff\x00\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x01\xff\xff\xff\xf0\xff\xff\xff\xef\xb0\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\xab\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\xb0\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x08\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x10\xff\xff\xff\xaa\xff\xff\xff\xf1\xff\xff\xff\xff\xff\xff\xff\xd9\xff\xff\xff\x2b\x85\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xff\xff\xff\xff\xf3\xff\xff\xff\xf0\xff\xff\xff\xbe\xff\xff\xff\x43\x84\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x04\xff\xff\xff\x2e\xff\xff\xff\xd7\xff\xff\xff\xec\xff\xff\xff\x8e\xff\xff\xff\xf7\x84\xff\xff\xff\x00\x06\xff\xff\xff\x88\xff\xff\xff\xec\xff\xff\xff\xe3\xff\xff\xff\x62\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x90\xff\xff\xff\x00\x01\xff\xff\xff\xd9\xff\xff\xff\x5f\x82\xff\xff\xff\x00\x01\xff\xff\xff\x8f\xff\xff\xff\xac\x81\xff\xff\xff\x00\x04\xff\xff\xff\x0d\xff\xff\xff\xa8\xff\xff\xff\xf1\xff\xff\xff\xea\xff\xff\xff\x88\x82\xff\xff\xff\x00\x04\xff\xff\xff\x83\xff\xff\xff\xf3\xff\xff\xff\xe0\xff\xff\xff\x78\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x04\xff\xff\xff\x28\xff\xff\xff\xcc\xff\xff\xff\xf3\xff\xff\xff\xb8\xff\xff\xff\x12\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x08\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x1d\xff\xff\xff\x69\xff\xff\xff\x2f\xff\xff\xff\xf7\xff\xff\xff\x60\xff\xff\xff\xc4\x85\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x06\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x00\xff\xff\xff\x06\xff\xff\xff\x4d\xff\xff\xff\xe9\xff\xff\xff\x3c\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x04\xff\xff\xff\xc9\xff\xff\xff\x75\xff\xff\xff\x02\xff\xff\xff\xa2\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x02\xff\xff\xff\x13\xff\xff\xff\xff\xff\xff\xff\x29\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x4f\xff\xff\xff\x1a\x81\xff\xff\xff\x00\x01\xff\xff\xff\x32\xff\xff\xff\x36\x88\xff\xff\xff\x00\x01\xff\xff\xff\x8d\xff\xff\xff\xaf\x82\xff\xff\xff\x00\x01\xff\xff\xff\xdf\xff\xff\xff\x60\x81\xff\xff\xff\x00\x0c\xff\xff\xff\x99\xff\xff\xff\xaa\xff\xff\xff\x08\xff\xff\xff\x12\xff\xff\xff\xcb\xff\xff\xff\x65\xff\xff\xff\x00\xff\xff\xff\x18\xff\xff\xff\xff\xff\xff\xff\x2c\xff\xff\xff\x05\xff\xff\xff\xa0\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x04\xff\xff\xff\xc7\xff\xff\xff\x75\xff\xff\xff\x02\xff\xff\xff\x9f\xff\xff\xff\x99\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x03\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x2d\xff\xff\xff\xf1\x81\xff\xff\xff\x00\x00\xff\xff\xff\x27\x85\xff\xff\xff\xff\x81\xff\xff\xff\x27\x00\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x71\xff\xff\xff\xb0\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x05\xff\xff\xff\x11\xff\xff\xff\xff\xff\xff\xff\x10\xff\xff\xff\x00\xff\xff\xff\x3e\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x01\xff\xff\xff\x26\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x05\xff\xff\xff\x40\xff\xff\xff\xdc\xff\xff\xff\xcd\xff\xff\xff\xbe\xff\xff\xff\xda\xff\xff\xff\x26\x88\xff\xff\xff\x00\x06\xff\xff\xff\x41\xff\xff\xff\xfd\xff\xff\xff\xf0\xff\xff\xff\xef\xff\xff\xff\xf2\xff\xff\xff\xfc\xff\xff\xff\x15\x81\xff\xff\xff\x00\x01\xff\xff\xff\xf0\xff\xff\xff\x2e\x81\xff\xff\xff\x00\x08\xff\xff\xff\x5a\xff\xff\xff\xbf\xff\xff\xff\x00\xff\xff\xff\x11\xff\xff\xff\xfb\xff\xff\xff\x41\xff\xff\xff\x00\xff\xff\xff\x34\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x05\xff\xff\xff\x11\xff\xff\xff\xff\xff\xff\xff\x10\xff\xff\xff\x00\xff\xff\xff\x3d\xff\xff\xff\xe1\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x03\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x83\xff\xff\xff\xc9\x81\xff\xff\xff\x00\x05\xff\xff\xff\x0a\xff\xff\xff\xde\xff\xff\xff\x30\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x38\xff\xff\xff\xe4\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x01\xff\xff\xff\x24\xff\xff\xff\xfd\x81\xff\xff\xff\x00\x01\xff\xff\xff\x2a\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x04\xff\xff\xff\x0b\xff\xff\xff\xe3\xff\xff\xff\x2f\xff\xff\xff\x5b\xff\xff\xff\xbe\x89\xff\xff\xff\x00\x05\xff\xff\xff\x04\xff\xff\xff\xef\xff\xff\xff\x46\xff\xff\xff\x00\xff\xff\xff\x77\xff\xff\xff\xc7\x81\xff\xff\xff\x00\x02\xff\xff\xff\x19\xff\xff\xff\xff\xff\xff\xff\x06\x81\xff\xff\xff\x00\x01\xff\xff\xff\x33\xff\xff\xff\xe7\x81\xff\xff\xff\x00\x04\xff\xff\xff\x5f\xff\xff\xff\xd8\xff\xff\xff\xf0\xff\xff\xff\xf1\xff\xff\xff\xf6\x81\xff\xff\xff\x00\x01\xff\xff\xff\x24\xff\xff\xff\xfd\x81\xff\xff\xff\x00\x01\xff\xff\xff\x2a\xff\xff\xff\xf3\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x04\xff\xff\xff\x42\xff\xff\xff\xd6\xff\xff\xff\xff\xff\xff\xff\xdc\xff\xff\xff\x30\x82\xff\xff\xff\x00\x04\xff\xff\xff\x49\xff\xff\xff\xc7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x2a\xff\xff\xff\xf3\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x05\xff\xff\xff\x12\xff\xff\xff\xff\xff\xff\xff\x10\xff\xff\xff\x00\xff\xff\xff\x3e\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x04\xff\xff\xff\x0c\xff\xff\xff\xe3\xff\xff\xff\x2b\xff\xff\xff\x56\xff\xff\xff\xc2\x8a\xff\xff\xff\x00\x04\xff\xff\xff\xa9\xff\xff\xff\x88\xff\xff\xff\x00\xff\xff\xff\xb9\xff\xff\xff\x7a\x81\xff\xff\xff\x00\x01\xff\xff\xff\x24\xff\xff\xff\xfc\x82\xff\xff\xff\x00\x01\xff\xff\xff\x29\xff\xff\xff\xf3\x84\xff\xff\xff\x00\x01\xff\xff\xff\x2d\xff\xff\xff\xf1\x81\xff\xff\xff\x00\x05\xff\xff\xff\x12\xff\xff\xff\xff\xff\xff\xff\x10\xff\xff\xff\x00\xff\xff\xff\x3d\xff\xff\xff\xe1\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x06\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x05\xff\xff\xff\xed\xff\xff\xff\x94\xff\xff\xff\xf7\x85\xff\xff\xff\x00\x03\xff\xff\xff\xa3\xff\xff\xff\x65\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x39\xff\xff\xff\xe5\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x04\xff\xff\xff\xcc\xff\xff\xff\x76\xff\xff\xff\x02\xff\xff\xff\xa4\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x05\xff\xff\xff\x41\xff\xff\xff\xd9\xff\xff\xff\xcc\xff\xff\xff\xbf\xff\xff\xff\xd9\xff\xff\xff\x24\x89\xff\xff\xff\x00\x04\xff\xff\xff\x5d\xff\xff\xff\xca\xff\xff\xff\x05\xff\xff\xff\xf4\xff\xff\xff\x2e\x81\xff\xff\xff\x00\x02\xff\xff\xff\x1a\xff\xff\xff\xff\xff\xff\xff\x07\x81\xff\xff\xff\x00\x01\xff\xff\xff\x34\xff\xff\xff\xe9\x81\xff\xff\xff\x00\x04\xff\xff\xff\x54\xff\xff\xff\x1e\xff\xff\xff\x01\xff\xff\xff\x86\xff\xff\xff\xc9\x82\xff\xff\xff\x00\x04\xff\xff\xff\xcc\xff\xff\xff\x76\xff\xff\xff\x02\xff\xff\xff\xa0\xff\xff\xff\x99\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x06\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x22\xff\xff\xff\xff\xff\xff\xff\x2a\xff\xff\xff\xf7\x85\xff\xff\xff\x00\x03\xff\xff\xff\x12\xff\xff\xff\xd6\xff\xff\xff\x3c\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x72\xff\xff\xff\xb5\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x04\xff\xff\xff\x2f\xff\xff\xff\xd7\xff\xff\xff\xec\xff\xff\xff\x8e\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x02\xff\xff\xff\xdc\xff\xff\xff\xf4\xff\xff\xff\xff\x81\xff\xff\xff\xf3\x03\xff\xff\xff\x69\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x4d\xff\xff\xff\x1a\x81\xff\xff\xff\x00\x01\xff\xff\xff\x30\xff\xff\xff\x39\x89\xff\xff\xff\x00\x03\xff\xff\xff\x13\xff\xff\xff\xf9\xff\xff\xff\x4e\xff\xff\xff\xe0\x82\xff\xff\xff\x00\x02\xff\xff\xff\x01\xff\xff\xff\xf3\xff\xff\xff\x31\x81\xff\xff\xff\x00\x01\xff\xff\xff\x5e\xff\xff\xff\xc5\x81\xff\xff\xff\x00\x04\xff\xff\xff\x68\xff\xff\xff\xe0\xff\xff\xff\xf5\xff\xff\xff\xcb\xff\xff\xff\x2e\x82\xff\xff\xff\x00\x04\xff\xff\xff\x2c\xff\xff\xff\xcf\xff\xff\xff\xf3\xff\xff\xff\xb9\xff\xff\xff\x12\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x08\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x0b\xff\xff\xff\xf7\xff\xff\xff\x5a\xff\xff\xff\xf7\xff\xff\xff\x21\xff\xff\xff\x30\x84\xff\xff\xff\x00\x02\xff\xff\xff\x55\xff\xff\xff\xc4\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x06\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x00\xff\xff\xff\x06\xff\xff\xff\x4d\xff\xff\xff\xeb\xff\xff\xff\x47\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x86\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x92\xff\xff\xff\x00\x02\xff\xff\xff\xc5\xff\xff\xff\xce\xff\xff\xff\x95\x83\xff\xff\xff\x00\x05\xff\xff\xff\xa2\xff\xff\xff\xb2\xff\xff\xff\x11\xff\xff\xff\x1e\xff\xff\xff\xd1\xff\xff\xff\x72\x90\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x04\xff\xff\xff\xf4\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x01\xff\xff\xff\xf4\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x04\xff\xff\xff\x68\xff\xff\xff\xea\xff\xff\xff\xff\xff\xff\xff\xdc\xff\xff\xff\x40\x85\xff\xff\xff\x00\x01\xff\xff\xff\xae\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xff\xff\xff\xff\xf3\xff\xff\xff\xf1\xff\xff\xff\xc5\xff\xff\xff\x50\x82\xff\xff\xff\x00\x81\xff\xff\xff\xf3\x01\xff\xff\xff\xf4\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x04\xff\xff\xff\xf4\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x01\xff\xff\xff\xf4\xff\xff\xff\xf7\x8a\xff\xff\xff\x00\x02\xff\xff\xff\x06\xff\xff\xff\xb8\xff\xff\xff\x36\x84\xff\xff\xff\x00\x02\xff\xff\xff\x79\xff\xff\xff\xff\xff\xff\xff\x49\x83\xff\xff\xff\x00\x05\xff\xff\xff\x13\xff\xff\xff\xaf\xff\xff\xff\xf4\xff\xff\xff\xee\xff\xff\xff\x96\xff\xff\xff\x03\x89\xff\xff\xff\x00\x03\xff\xff\xff\x08\xff\xff\xff\xae\xff\xff\xff\x20\xff\xff\xff\xa5\x82\xff\xff\xff\x00\x91\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x9f\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\xa4\xff\xff\xff\x00\x02\xff\xff\xff\x16\xff\xff\xff\xd0\xff\xff\xff\x2e\x93\xff\xff\xff\x00\x03\xff\xff\xff\xcc\xff\xff\xff\x06\xff\xff\xff\xf3\xff\xff\xff\x12\x83\xff\xff\xff\x00\x02\xff\xff\xff\x44\xff\xff\xff\xe4\xff\xff\xff\x21\x82\xff\xff\xff\x00\xe0\xff\xff\xff\x00\x04\xff\xff\xff\x51\xff\xff\xff\xc9\xff\xff\xff\x02\xff\xff\xff\xef\xff\xff\xff\x24\x82\xff\xff\xff\x00\x04\xff\xff\xff\x01\xff\xff\xff\xba\xff\xff\xff\x3c\xff\xff\xff\x65\xff\xff\xff\x95\x91\xff\xff\xff\x00\xe9\xff\xff\xff\x00\x03\xff\xff\xff\x1e\xff\xff\xff\xdd\xff\xff\xff\xd3\xff\xff\xff\x09\x91\xff\xff\xff\x00\xff\xff\xff\xff\x00\xff\xff\xff\xff\x00\x01\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x04\xff\xff\xff\xf0\xff\xff\xff\xef\xff\xff\xff\x00\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x01\xff\xff\xff\xf0\xff\xff\xff\xef\xb0\xff\xff\xff\x00\x01\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x04\xff\xff\xff\xf0\xff\xff\xff\xef\xff\xff\xff\x00\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x01\xff\xff\xff\xf0\xff\xff\xff\xef\xb0\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\xb0\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\xb0\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x07\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x02\xff\xff\xff\xe6\xff\xff\xff\x00\xff\xff\xff\x9d\xff\xff\xff\x50\x82\xff\xff\xff\x00\x05\xff\xff\xff\x72\xff\xff\xff\xdc\xff\xff\xff\xf3\xff\xff\xff\xee\xff\xff\xff\xa2\xff\xff\xff\x0f\x82\xff\xff\xff\x00\x04\xff\xff\xff\x02\xff\xff\xff\x8b\xff\xff\xff\xea\xff\xff\xff\xf1\xff\xff\xff\x9b\x81\xff\xff\xff\x00\x05\xff\xff\xff\x04\xff\xff\xff\xb0\xff\xff\xff\xed\xff\xff\xff\xf5\xff\xff\xff\xc6\xff\xff\xff\x2b\x82\xff\xff\xff\x00\x01\xff\xff\xff\x0f\xff\xff\xff\xa4\x81\xff\xff\xff\xee\x00\xff\xff\xff\x92\x81\xff\xff\xff\x00\x05\xff\xff\xff\x18\xff\xff\xff\xc2\xff\xff\xff\xf1\xff\xff\xff\xf4\xff\xff\xff\xc9\xff\xff\xff\x37\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x02\xff\xff\xff\xf3\xff\xff\xff\xf4\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x88\xff\xff\xff\x00\x01\xff\xff\xff\xa1\xff\xff\xff\x97\x82\xff\xff\xff\x00\x01\xff\xff\xff\x5f\xff\xff\xff\xdc\x81\xff\xff\xff\x00\x04\xff\xff\xff\x0d\xff\xff\xff\xa8\xff\xff\xff\xf1\xff\xff\xff\xea\xff\xff\xff\x88\x82\xff\xff\xff\x00\x04\xff\xff\xff\x83\xff\xff\xff\xf3\xff\xff\xff\xe0\xff\xff\xff\x78\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x04\xff\xff\xff\x28\xff\xff\xff\xcc\xff\xff\xff\xf3\xff\xff\xff\xb8\xff\xff\xff\x12\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x03\xff\xff\xff\xc6\xff\xff\xff\x25\xff\xff\xff\x68\xff\xff\xff\x83\x82\xff\xff\xff\x00\x05\xff\xff\xff\x58\xff\xff\xff\x28\xff\xff\xff\x00\xff\xff\xff\x12\xff\xff\xff\xb5\xff\xff\xff\xa5\x82\xff\xff\xff\x00\x04\xff\xff\xff\x7d\xff\xff\xff\xc0\xff\xff\xff\x12\xff\xff\xff\x05\xff\xff\xff\x4f\x81\xff\xff\xff\x00\x05\xff\xff\xff\x08\xff\xff\xff\x6e\xff\xff\xff\x0b\xff\xff\xff\x04\xff\xff\xff\x8a\xff\xff\xff\xc7\x82\xff\xff\xff\x00\x04\xff\xff\xff\xac\xff\xff\xff\xa6\xff\xff\xff\x0c\xff\xff\xff\x05\xff\xff\xff\x4d\x81\xff\xff\xff\x00\x05\xff\xff\xff\x16\xff\xff\xff\x4d\xff\xff\xff\x09\xff\xff\xff\x01\xff\xff\xff\x72\xff\xff\xff\xd9\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x8b\xff\xff\xff\x00\x01\xff\xff\xff\x55\xff\xff\xff\xe5\x82\xff\xff\xff\x00\x01\xff\xff\xff\xb0\xff\xff\xff\x90\x81\xff\xff\xff\x00\x0c\xff\xff\xff\x99\xff\xff\xff\xaa\xff\xff\xff\x08\xff\xff\xff\x12\xff\xff\xff\xcb\xff\xff\xff\x65\xff\xff\xff\x00\xff\xff\xff\x18\xff\xff\xff\xff\xff\xff\xff\x2c\xff\xff\xff\x05\xff\xff\xff\xa0\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x04\xff\xff\xff\xc7\xff\xff\xff\x75\xff\xff\xff\x02\xff\xff\xff\x9f\xff\xff\xff\x99\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x03\xff\xff\xff\x93\xff\xff\xff\x5a\xff\xff\xff\x33\xff\xff\xff\xb7\x86\xff\xff\xff\x00\x01\xff\xff\xff\x38\xff\xff\xff\xef\x82\xff\xff\xff\x00\x01\xff\xff\xff\xe5\xff\xff\xff\x3c\x88\xff\xff\xff\x00\x01\xff\xff\xff\x30\xff\xff\xff\xf1\x81\xff\xff\xff\x00\x02\xff\xff\xff\x0d\xff\xff\xff\xfc\xff\xff\xff\x1c\x87\xff\xff\xff\x00\x02\xff\xff\xff\x03\xff\xff\xff\x75\xff\xff\xff\xe2\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x8b\xff\xff\xff\x00\x06\xff\xff\xff\x0e\xff\xff\xff\xf9\xff\xff\xff\xf2\xff\xff\xff\xef\xff\xff\xff\xf0\xff\xff\xff\xfd\xff\xff\xff\x43\x81\xff\xff\xff\x00\x01\xff\xff\xff\xf0\xff\xff\xff\x2e\x81\xff\xff\xff\x00\x08\xff\xff\xff\x5b\xff\xff\xff\xbf\xff\xff\xff\x00\xff\xff\xff\x11\xff\xff\xff\xfb\xff\xff\xff\x41\xff\xff\xff\x00\xff\xff\xff\x34\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x05\xff\xff\xff\x10\xff\xff\xff\xff\xff\xff\xff\x10\xff\xff\xff\x00\xff\xff\xff\x3d\xff\xff\xff\xe1\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x09\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\xeb\xff\xff\xff\xf4\xff\xff\xff\xf8\xff\xff\xff\xef\xff\xff\xff\xfc\xff\xff\xff\xef\xff\xff\xff\x7e\x84\xff\xff\xff\x00\x01\xff\xff\xff\x39\xff\xff\xff\xe8\x81\xff\xff\xff\x00\x02\xff\xff\xff\x16\xff\xff\xff\xff\xff\xff\xff\x09\x87\xff\xff\xff\x00\x02\xff\xff\xff\x0b\xff\xff\xff\x95\xff\xff\xff\xc9\x81\xff\xff\xff\x00\x01\xff\xff\xff\x23\xff\xff\xff\xfd\x86\xff\xff\xff\x00\x04\xff\xff\xff\x4c\xff\xff\xff\xba\xff\xff\xff\xf1\xff\xff\xff\xd4\xff\xff\xff\x45\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x85\xff\xff\xff\x00\x03\xff\xff\xff\x96\xff\xff\xff\xee\xff\xff\xff\xdb\xff\xff\xff\x50\x82\xff\xff\xff\x00\x09\xff\xff\xff\xbd\xff\xff\xff\x7d\xff\xff\xff\x00\xff\xff\xff\x46\xff\xff\xff\xf1\xff\xff\xff\x04\xff\xff\xff\x00\xff\xff\xff\x19\xff\xff\xff\xff\xff\xff\xff\x06\x81\xff\xff\xff\x00\x01\xff\xff\xff\x33\xff\xff\xff\xe7\x81\xff\xff\xff\x00\x04\xff\xff\xff\x5f\xff\xff\xff\xd8\xff\xff\xff\xf0\xff\xff\xff\xf1\xff\xff\xff\xf6\x81\xff\xff\xff\x00\x01\xff\xff\xff\x23\xff\xff\xff\xfd\x81\xff\xff\xff\x00\x01\xff\xff\xff\x29\xff\xff\xff\xf3\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x04\xff\xff\xff\x0e\xff\xff\xff\xd7\xff\xff\xff\x07\xff\xff\xff\x9f\xff\xff\xff\x4e\x84\xff\xff\xff\x00\x02\xff\xff\xff\x16\xff\xff\xff\xbc\xff\xff\xff\x88\x81\xff\xff\xff\x00\x01\xff\xff\xff\x24\xff\xff\xff\xfd\x86\xff\xff\xff\x00\x04\xff\xff\xff\x30\xff\xff\xff\xb5\xff\xff\xff\xf7\xff\xff\xff\xcc\xff\xff\xff\x28\x81\xff\xff\xff\x00\x02\xff\xff\xff\x0d\xff\xff\xff\xfc\xff\xff\xff\x1c\x84\xff\xff\xff\x00\x03\xff\xff\xff\x10\xff\xff\xff\xf9\xff\xff\xff\x5c\xff\xff\xff\x0d\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x02\xff\xff\xff\xa7\xff\xff\xff\xf1\xff\xff\xff\xff\x81\xff\xff\xff\xef\x00\xff\xff\xff\x20\x82\xff\xff\xff\x00\x03\xff\xff\xff\x24\xff\xff\xff\x01\xff\xff\xff\x63\xff\xff\xff\xe8\x82\xff\xff\xff\x00\x04\xff\xff\xff\x71\xff\xff\xff\xbe\xff\xff\xff\x00\xff\xff\xff\x87\xff\xff\xff\xaa\x81\xff\xff\xff\x00\x01\xff\xff\xff\x24\xff\xff\xff\xfc\x82\xff\xff\xff\x00\x01\xff\xff\xff\x29\xff\xff\xff\xf3\x84\xff\xff\xff\x00\x01\xff\xff\xff\x2d\xff\xff\xff\xf1\x81\xff\xff\xff\x00\x05\xff\xff\xff\x13\xff\xff\xff\xff\xff\xff\xff\x0f\xff\xff\xff\x00\xff\xff\xff\x3c\xff\xff\xff\xe1\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x4a\xff\xff\xff\xef\xff\xff\xff\xf9\x81\xff\xff\xff\xf3\x08\xff\xff\xff\xf9\xff\xff\xff\xef\xff\xff\xff\x2f\xff\xff\xff\x00\xff\xff\xff\x24\xff\xff\xff\xef\xff\xff\xff\xfd\xff\xff\xff\xc4\xff\xff\xff\x0f\x81\xff\xff\xff\x00\x02\xff\xff\xff\x16\xff\xff\xff\xff\xff\xff\xff\x0a\x84\xff\xff\xff\x00\x03\xff\xff\xff\x07\xff\xff\xff\xeb\xff\xff\xff\x9a\xff\xff\xff\x2b\x84\xff\xff\xff\x00\x04\xff\xff\xff\xac\xff\xff\xff\xa7\xff\xff\xff\x0c\xff\xff\xff\x06\xff\xff\xff\x4e\x81\xff\xff\xff\x00\x05\xff\xff\xff\x14\xff\xff\xff\xfc\xff\xff\xff\x35\xff\xff\xff\x00\xff\xff\xff\x13\xff\xff\xff\x36\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x87\xff\xff\xff\x00\x01\xff\xff\xff\x5c\xff\xff\xff\xd5\x82\xff\xff\xff\x00\x04\xff\xff\xff\x25\xff\xff\xff\xf7\xff\xff\xff\x07\xff\xff\xff\xc9\xff\xff\xff\x5e\x81\xff\xff\xff\x00\x02\xff\xff\xff\x1a\xff\xff\xff\xff\xff\xff\xff\x06\x81\xff\xff\xff\x00\x01\xff\xff\xff\x33\xff\xff\xff\xe9\x81\xff\xff\xff\x00\x04\xff\xff\xff\x54\xff\xff\xff\x1e\xff\xff\xff\x01\xff\xff\xff\x86\xff\xff\xff\xc9\x82\xff\xff\xff\x00\x04\xff\xff\xff\xce\xff\xff\xff\x71\xff\xff\xff\x00\xff\xff\xff\x9c\xff\xff\xff\x99\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x03\xff\xff\xff\x6c\xff\xff\xff\x82\xff\xff\xff\x10\xff\xff\xff\xdd\x84\xff\xff\xff\x00\x02\xff\xff\xff\x07\xff\xff\xff\x74\xff\xff\xff\xc8\x82\xff\xff\xff\x00\x01\xff\xff\xff\xe3\xff\xff\xff\x3c\x84\xff\xff\xff\x00\x02\xff\xff\xff\x22\xff\xff\xff\xff\xff\xff\xff\x05\x85\xff\xff\xff\x00\x01\xff\xff\xff\x0f\xff\xff\xff\xa3\x81\xff\xff\xff\xee\x00\xff\xff\xff\x91\x82\xff\xff\xff\x00\x04\xff\xff\xff\x67\xff\xff\xff\xe0\xff\xff\xff\xf4\xff\xff\xff\xe4\xff\xff\xff\x6f\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x02\xff\xff\xff\x22\xff\xff\xff\xfb\xff\xff\xff\x01\x85\xff\xff\xff\x00\x02\xff\xff\xff\xcc\xff\xff\xff\xf0\xff\xff\xff\x40\x83\xff\xff\xff\x00\x03\xff\xff\xff\xd9\xff\xff\xff\x50\xff\xff\xff\xf9\xff\xff\xff\x14\x81\xff\xff\xff\x00\x02\xff\xff\xff\x01\xff\xff\xff\xf3\xff\xff\xff\x2f\x81\xff\xff\xff\x00\x01\xff\xff\xff\x5c\xff\xff\xff\xc5\x81\xff\xff\xff\x00\x04\xff\xff\xff\x68\xff\xff\xff\xe0\xff\xff\xff\xf5\xff\xff\xff\xcb\xff\xff\xff\x2e\x82\xff\xff\xff\x00\x04\xff\xff\xff\x2e\xff\xff\xff\xd0\xff\xff\xff\xed\xff\xff\xff\xb9\xff\xff\xff\x12\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x0b\xff\xff\xff\x38\xff\xff\xff\xb5\xff\xff\xff\x00\xff\xff\xff\xda\xff\xff\xff\x13\xff\xff\xff\x00\xff\xff\xff\x1a\xff\xff\xff\x1c\xff\xff\xff\x00\xff\xff\xff\x02\xff\xff\xff\x72\xff\xff\xff\xe2\x82\xff\xff\xff\x00\x04\xff\xff\xff\x77\xff\xff\xff\xc2\xff\xff\xff\x13\xff\xff\xff\x07\xff\xff\xff\x50\x81\xff\xff\xff\x00\x05\xff\xff\xff\x05\xff\xff\xff\xeb\xff\xff\xff\x5a\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\x3b\x91\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x04\xff\xff\xff\x04\xff\xff\xff\xef\xff\xff\xff\x5d\xff\xff\xff\x00\xff\xff\xff\x2c\x82\xff\xff\xff\x00\x03\xff\xff\xff\x0d\xff\xff\xff\x00\xff\xff\xff\x59\xff\xff\xff\xe6\x83\xff\xff\xff\x00\x02\xff\xff\xff\x8d\xff\xff\xff\xce\xff\xff\xff\xc5\x83\xff\xff\xff\x00\x05\xff\xff\xff\xa2\xff\xff\xff\xac\xff\xff\xff\x09\xff\xff\xff\x14\xff\xff\xff\xcd\xff\xff\xff\x72\x8a\xff\xff\xff\x00\x01\xff\xff\xff\x02\xff\xff\xff\x05\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x04\xff\xff\xff\xf4\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x01\xff\xff\xff\xf4\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x0b\xff\xff\xff\x08\xff\xff\xff\xe5\xff\xff\xff\x00\xff\xff\xff\xa5\xff\xff\xff\x48\xff\xff\xff\x00\xff\xff\xff\x45\xff\xff\xff\xd1\xff\xff\xff\xf1\xff\xff\xff\xf2\xff\xff\xff\xc2\xff\xff\xff\x36\x82\xff\xff\xff\x00\x04\xff\xff\xff\x01\xff\xff\xff\x87\xff\xff\xff\xe9\xff\xff\xff\xf0\xff\xff\xff\x98\x82\xff\xff\xff\x00\x04\xff\xff\xff\x3f\xff\xff\xff\xd4\xff\xff\xff\xf5\xff\xff\xff\xda\xff\xff\xff\x4a\x91\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x04\xff\xff\xff\xf4\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x01\xff\xff\xff\xf4\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x03\xff\xff\xff\x4f\xff\xff\xff\xde\xff\xff\xff\xf4\xff\xff\xff\xcd\x82\xff\xff\xff\x00\x03\xff\xff\xff\x78\xff\xff\xff\xed\xff\xff\xff\xec\xff\xff\xff\x82\x83\xff\xff\xff\x00\x02\xff\xff\xff\x41\xff\xff\xff\xff\xff\xff\xff\x79\x83\xff\xff\xff\x00\x05\xff\xff\xff\x13\xff\xff\xff\xaf\xff\xff\xff\xf1\xff\xff\xff\xec\xff\xff\xff\x96\xff\xff\xff\x03\x82\xff\xff\xff\x00\x03\xff\xff\xff\x80\xff\xff\xff\x82\xff\xff\xff\xd6\xff\xff\xff\x09\x83\xff\xff\xff\x00\x02\xff\xff\xff\x0c\xff\xff\xff\xb9\xff\xff\xff\x10\x82\xff\xff\xff\x00\xea\xff\xff\xff\x00\x00\xff\xff\xff\x0b\x85\xff\xff\xff\x00\x03\xff\xff\xff\xb5\xff\xff\xff\x87\xff\xff\xff\x7c\xff\xff\xff\x3b\x84\xff\xff\xff\x00\x02\xff\xff\xff\x3d\xff\xff\xff\xb8\xff\xff\xff\x02\x81\xff\xff\xff\x00\xe0\xff\xff\xff\x00\x04\xff\xff\xff\x31\xff\xff\xff\x80\xff\xff\xff\x7b\xff\xff\xff\xb1\xff\xff\xff\x2d\x84\xff\xff\xff\x00\x01\xff\xff\xff\xad\xff\xff\xff\x67\x92\xff\xff\xff\x00\xe0\xff\xff\xff\x00\x04\xff\xff\xff\x01\xff\xff\xff\x6e\xff\xff\xff\x52\xff\xff\xff\x1e\xff\xff\xff\x43\x84\xff\xff\xff\x00\x02\xff\xff\xff\x19\xff\xff\xff\xe7\xff\xff\xff\x2f\x91\xff\xff\xff\x00\xff\xff\xff\xff\x00\xff\xff\xff\xff\x00\x01\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x04\xff\xff\xff\xf0\xff\xff\xff\xef\xff\xff\xff\x00\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x01\xff\xff\xff\xf0\xff\xff\xff\xef\xb0\xff\xff\xff\x00\x01\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x04\xff\xff\xff\xf0\xff\xff\xff\xef\xff\xff\xff\x00\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x01\xff\xff\xff\xf0\xff\xff\xff\xef\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\xaa\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\xb0\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\xaa\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x89\xff\xff\xff\x00\x01\xff\xff\xff\xff\xff\xff\xff\xf6\x81\xff\xff\xff\xf3\x00\xff\xff\xff\xeb\x81\xff\xff\xff\x00\x09\xff\xff\xff\x27\xff\xff\xff\xff\xff\xff\xff\xf3\xff\xff\xff\xf2\xff\xff\xff\xed\xff\xff\xff\xb5\xff\xff\xff\x26\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x08\xff\xff\xff\x80\xff\xff\xff\xb5\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x8b\xff\xff\xff\xf1\xff\xff\xff\xc4\xff\xff\xff\x16\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x84\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x05\xff\xff\xff\x09\xff\xff\xff\x95\xff\xff\xff\xed\xff\xff\xff\xff\xff\xff\xff\xe7\xff\xff\xff\x56\x88\xff\xff\xff\x00\x01\xff\xff\xff\xa1\xff\xff\xff\x97\x82\xff\xff\xff\x00\x01\xff\xff\xff\x60\xff\xff\xff\xdc\x81\xff\xff\xff\x00\x04\xff\xff\xff\x0d\xff\xff\xff\xa8\xff\xff\xff\xf1\xff\xff\xff\xea\xff\xff\xff\x88\x82\xff\xff\xff\x00\x04\xff\xff\xff\x83\xff\xff\xff\xf3\xff\xff\xff\xe0\xff\xff\xff\x78\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x04\xff\xff\xff\x28\xff\xff\xff\xcc\xff\xff\xff\xf3\xff\xff\xff\xb8\xff\xff\xff\x12\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x89\xff\xff\xff\x00\x02\xff\xff\xff\x86\xff\xff\xff\xb2\xff\xff\xff\x02\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x05\xff\xff\xff\x08\xff\xff\xff\x88\xff\xff\xff\xcb\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x09\xff\xff\xff\x04\xff\xff\xff\xe5\xff\xff\xff\x42\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xff\xff\xff\xff\x76\xff\xff\xff\x02\xff\xff\xff\x9f\xff\xff\xff\x9b\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x84\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x05\xff\xff\xff\xa2\xff\xff\xff\xb3\xff\xff\xff\x38\xff\xff\xff\xf7\xff\xff\xff\x0e\xff\xff\xff\x29\x88\xff\xff\xff\x00\x02\xff\xff\xff\x55\xff\xff\xff\xe6\xff\xff\xff\x01\x81\xff\xff\xff\x00\x01\xff\xff\xff\xb1\xff\xff\xff\x90\x81\xff\xff\xff\x00\x0c\xff\xff\xff\x99\xff\xff\xff\xaa\xff\xff\xff\x08\xff\xff\xff\x12\xff\xff\xff\xcb\xff\xff\xff\x65\xff\xff\xff\x00\xff\xff\xff\x18\xff\xff\xff\xff\xff\xff\xff\x2c\xff\xff\xff\x05\xff\xff\xff\xa0\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x04\xff\xff\xff\xc7\xff\xff\xff\x75\xff\xff\xff\x02\xff\xff\xff\x9f\xff\xff\xff\x99\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x8a\xff\xff\xff\x00\x01\xff\xff\xff\xa6\xff\xff\xff\x95\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x2e\xff\xff\xff\xef\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x56\xff\xff\xff\xcf\x81\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xff\xff\xff\xff\x10\xff\xff\xff\x00\xff\xff\xff\x3d\xff\xff\xff\xe1\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x84\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x07\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x0b\xff\xff\xff\xfb\xff\xff\xff\x22\xff\xff\xff\x27\xff\xff\xff\xf7\x8a\xff\xff\xff\x00\x02\xff\xff\xff\x0e\xff\xff\xff\xf9\xff\xff\xff\xf8\x81\xff\xff\xff\xf7\x01\xff\xff\xff\xff\xff\xff\xff\x43\x81\xff\xff\xff\x00\x01\xff\xff\xff\xf0\xff\xff\xff\x2e\x81\xff\xff\xff\x00\x08\xff\xff\xff\x5b\xff\xff\xff\xbf\xff\xff\xff\x00\xff\xff\xff\x11\xff\xff\xff\xfb\xff\xff\xff\x41\xff\xff\xff\x00\xff\xff\xff\x34\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x05\xff\xff\xff\x10\xff\xff\xff\xff\xff\xff\xff\x10\xff\xff\xff\x00\xff\xff\xff\x3d\xff\xff\xff\xe1\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x8a\xff\xff\xff\x00\x02\xff\xff\xff\x06\xff\xff\xff\xc4\xff\xff\xff\x6e\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x09\xff\xff\xff\x0f\xff\xff\xff\x9a\xff\xff\xff\x99\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x00\xff\xff\xff\x16\xff\xff\xff\xd7\xff\xff\xff\x59\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfd\x81\xff\xff\xff\x00\x01\xff\xff\xff\x2a\xff\xff\xff\xf3\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfc\x84\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x07\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x23\xff\xff\xff\xfd\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x01\xff\xff\xff\x25\xff\xff\xff\xf4\x81\xff\xff\xff\xef\x00\xff\xff\xff\x02\x82\xff\xff\xff\x00\x09\xff\xff\xff\xbd\xff\xff\xff\x7c\xff\xff\xff\x00\xff\xff\xff\x45\xff\xff\xff\xf1\xff\xff\xff\x04\xff\xff\xff\x00\xff\xff\xff\x19\xff\xff\xff\xff\xff\xff\xff\x06\x81\xff\xff\xff\x00\x01\xff\xff\xff\x33\xff\xff\xff\xe7\x81\xff\xff\xff\x00\x04\xff\xff\xff\x5f\xff\xff\xff\xd8\xff\xff\xff\xf0\xff\xff\xff\xf1\xff\xff\xff\xf6\x81\xff\xff\xff\x00\x01\xff\xff\xff\x23\xff\xff\xff\xfd\x81\xff\xff\xff\x00\x01\xff\xff\xff\x29\xff\xff\xff\xf3\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x8b\xff\xff\xff\x00\x02\xff\xff\xff\x16\xff\xff\xff\xe3\xff\xff\xff\x38\x81\xff\xff\xff\x00\x0d\xff\xff\xff\x27\xff\xff\xff\xff\xff\xff\xff\xef\xff\xff\xff\xf4\xff\xff\xff\xef\xff\xff\xff\x62\xff\xff\xff\x01\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xff\xff\xff\xff\xef\xff\xff\xff\xfb\xff\xff\xff\xcc\xff\xff\xff\x0e\x81\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xff\xff\xff\xff\x10\xff\xff\xff\x00\xff\xff\xff\x3d\xff\xff\xff\xe2\x82\xff\xff\xff\x00\x02\xff\xff\xff\x27\xff\xff\xff\xff\xff\xff\xff\x1e\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x07\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x0b\xff\xff\xff\xfb\xff\xff\xff\x21\xff\xff\xff\x27\xff\xff\xff\xf7\x84\xff\xff\xff\x00\x01\xff\xff\xff\xa5\xff\xff\xff\x27\x84\xff\xff\xff\x00\x04\xff\xff\xff\x71\xff\xff\xff\xbe\xff\xff\xff\x00\xff\xff\xff\x87\xff\xff\xff\xaa\x81\xff\xff\xff\x00\x01\xff\xff\xff\x24\xff\xff\xff\xfc\x82\xff\xff\xff\x00\x01\xff\xff\xff\x29\xff\xff\xff\xf3\x84\xff\xff\xff\x00\x01\xff\xff\xff\x2d\xff\xff\xff\xf1\x81\xff\xff\xff\x00\x05\xff\xff\xff\x13\xff\xff\xff\xff\xff\xff\xff\x0f\xff\xff\xff\x00\xff\xff\xff\x3c\xff\xff\xff\xe1\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x8c\xff\xff\xff\x00\x01\xff\xff\xff\x63\xff\xff\xff\xbf\x81\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x00\xff\xff\xff\x02\xff\xff\xff\x7e\xff\xff\xff\xbb\x81\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x00\xff\xff\xff\x03\xff\xff\xff\x86\xff\xff\xff\xb5\x81\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xff\xff\xff\xff\x79\xff\xff\xff\x02\xff\xff\xff\x9f\xff\xff\xff\x9d\x82\xff\xff\xff\x00\x08\xff\xff\xff\x27\xff\xff\xff\xfd\xff\xff\xff\x9e\xff\xff\xff\x0c\xff\xff\xff\x08\xff\xff\xff\x2b\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x05\xff\xff\xff\xa1\xff\xff\xff\xb1\xff\xff\xff\x36\xff\xff\xff\xf7\xff\xff\xff\x0d\xff\xff\xff\x28\x82\xff\xff\xff\x00\x02\xff\xff\xff\x12\xff\xff\xff\xc2\xff\xff\xff\x14\x83\xff\xff\xff\x00\x04\xff\xff\xff\x25\xff\xff\xff\xf7\xff\xff\xff\x07\xff\xff\xff\xc8\xff\xff\xff\x5e\x81\xff\xff\xff\x00\x02\xff\xff\xff\x1a\xff\xff\xff\xff\xff\xff\xff\x06\x81\xff\xff\xff\x00\x01\xff\xff\xff\x33\xff\xff\xff\xe9\x81\xff\xff\xff\x00\x04\xff\xff\xff\x54\xff\xff\xff\x1e\xff\xff\xff\x01\xff\xff\xff\x86\xff\xff\xff\xc9\x82\xff\xff\xff\x00\x04\xff\xff\xff\xce\xff\xff\xff\x71\xff\xff\xff\x00\xff\xff\xff\x9c\xff\xff\xff\x99\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x03\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x27\xff\xff\xff\xf7\x86\xff\xff\xff\x00\x01\xff\xff\xff\x2f\xff\xff\xff\xf0\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x2d\xff\xff\xff\xf0\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x31\xff\xff\xff\xef\x81\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x8d\xff\xff\xff\xf1\xff\xff\xff\xc5\xff\xff\xff\x17\x82\xff\xff\xff\x00\x08\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x56\xff\xff\xff\xe0\xff\xff\xff\xf2\xff\xff\xff\x71\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x05\xff\xff\xff\x09\xff\xff\xff\x99\xff\xff\xff\xf0\xff\xff\xff\xff\xff\xff\xff\xe8\xff\xff\xff\x57\x83\xff\xff\xff\x00\x01\xff\xff\xff\x58\xff\xff\xff\xb1\x84\xff\xff\xff\x00\x03\xff\xff\xff\xd9\xff\xff\xff\x4f\xff\xff\xff\xf8\xff\xff\xff\x14\x81\xff\xff\xff\x00\x02\xff\xff\xff\x01\xff\xff\xff\xf3\xff\xff\xff\x2f\x81\xff\xff\xff\x00\x01\xff\xff\xff\x5c\xff\xff\xff\xc5\x81\xff\xff\xff\x00\x04\xff\xff\xff\x68\xff\xff\xff\xe0\xff\xff\xff\xf5\xff\xff\xff\xcb\xff\xff\xff\x2e\x82\xff\xff\xff\x00\x04\xff\xff\xff\x2e\xff\xff\xff\xd0\xff\xff\xff\xed\xff\xff\xff\xb9\xff\xff\xff\x12\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x03\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x04\xff\xff\xff\x73\xff\xff\xff\x16\xff\xff\xff\x02\xff\xff\xff\x8b\xff\xff\xff\xc0\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x75\xff\xff\xff\xca\x81\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x00\xff\xff\xff\x03\xff\xff\xff\x89\xff\xff\xff\xc7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x8d\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x03\xff\xff\xff\x0b\xff\xff\xff\x18\xff\xff\xff\x4a\xff\xff\xff\xef\x84\xff\xff\xff\x00\x02\xff\xff\xff\x8d\xff\xff\xff\xce\xff\xff\xff\xc5\x83\xff\xff\xff\x00\x05\xff\xff\xff\xa2\xff\xff\xff\xac\xff\xff\xff\x09\xff\xff\xff\x14\xff\xff\xff\xcd\xff\xff\xff\x72\x8b\xff\xff\xff\x00\x00\xff\xff\xff\x07\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x04\xff\xff\xff\xf4\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x01\xff\xff\xff\xf4\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x03\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x04\xff\xff\xff\x97\xff\xff\xff\xe8\xff\xff\xff\xf4\xff\xff\xff\xbd\xff\xff\xff\x20\x81\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xff\xff\xff\xff\xf3\xff\xff\xff\xf4\xff\xff\xff\xc9\xff\xff\xff\x2e\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xff\x81\xff\xff\xff\xf3\x01\xff\xff\xff\xc1\xff\xff\xff\x28\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x8d\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x04\xff\xff\xff\xf4\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x01\xff\xff\xff\xf4\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x03\xff\xff\xff\x10\xff\xff\xff\xd0\xff\xff\xff\xf1\xff\xff\xff\x72\x84\xff\xff\xff\x00\x02\xff\xff\xff\x41\xff\xff\xff\xff\xff\xff\xff\x79\x83\xff\xff\xff\x00\x05\xff\xff\xff\x13\xff\xff\xff\xaf\xff\xff\xff\xf1\xff\xff\xff\xec\xff\xff\xff\x96\xff\xff\xff\x03\x81\xff\xff\xff\x00\x04\xff\xff\xff\x02\xff\xff\xff\xaf\xff\xff\xff\x1c\xff\xff\xff\xb5\xff\xff\xff\x08\x83\xff\xff\xff\x00\x01\xff\xff\xff\x28\xff\xff\xff\xad\x83\xff\xff\xff\x00\xaf\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\xb8\xff\xff\xff\x00\x01\xff\xff\xff\x01\xff\xff\xff\x09\x84\xff\xff\xff\x00\x02\xff\xff\xff\x30\xff\xff\xff\xe9\xff\xff\xff\x3c\x83\xff\xff\xff\x00\x02\xff\xff\xff\x0f\xff\xff\xff\xca\xff\xff\xff\x1d\x83\xff\xff\xff\x00\xe0\xff\xff\xff\x00\x04\xff\xff\xff\x05\xff\xff\xff\xbe\xff\xff\xff\x19\xff\xff\xff\xba\xff\xff\xff\x21\x84\xff\xff\xff\x00\x01\xff\xff\xff\x93\xff\xff\xff\x81\x92\xff\xff\xff\x00\xe1\xff\xff\xff\x00\x02\xff\xff\xff\x3e\xff\xff\xff\xe8\xff\xff\xff\x7a\x84\xff\xff\xff\x00\x02\xff\xff\xff\x51\xff\xff\xff\xd5\xff\xff\xff\x05\x92\xff\xff\xff\x00\xff\xff\xff\xff\x00\xbb\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\xc1\xff\xff\xff\x00\x01\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x04\xff\xff\xff\xf0\xff\xff\xff\xef\xff\xff\xff\x00\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x01\xff\xff\xff\xf0\xff\xff\xff\xef\x9d\xff\xff\xff\x00\x01\xff\xff\xff\x36\xff\xff\xff\x0b\x8c\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x04\xff\xff\xff\xf0\xff\xff\xff\xef\xff\xff\xff\x00\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x01\xff\xff\xff\xf0\xff\xff\xff\xef\xb0\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x9c\xff\xff\xff\x00\x02\xff\xff\xff\x51\xff\xff\xff\xec\xff\xff\xff\x37\x8c\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\xb0\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x84\xff\xff\xff\xff\x02\xff\xff\xff\x00\xff\xff\xff\xa1\xff\xff\xff\x97\x82\xff\xff\xff\x00\x01\xff\xff\xff\x60\xff\xff\xff\xdc\x81\xff\xff\xff\x00\x05\xff\xff\xff\x0b\xff\xff\xff\xa5\xff\xff\xff\xf0\xff\xff\xff\xfd\xff\xff\xff\xbd\xff\xff\xff\x05\x81\xff\xff\xff\x00\x04\xff\xff\xff\x83\xff\xff\xff\xf3\xff\xff\xff\xe0\xff\xff\xff\x78\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x04\xff\xff\xff\x2f\xff\xff\xff\xd8\xff\xff\xff\xec\xff\xff\xff\x8d\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x84\xff\xff\xff\x00\x85\xff\xff\xff\xf3\x02\xff\xff\xff\x00\xff\xff\xff\xa1\xff\xff\xff\x97\x82\xff\xff\xff\x00\x04\xff\xff\xff\x60\xff\xff\xff\xdc\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\xa3\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x04\xff\xff\xff\x83\xff\xff\xff\xf3\xff\xff\xff\xe0\xff\xff\xff\x77\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x02\xff\xff\xff\x07\xff\xff\xff\x2d\xff\xff\xff\xf7\x81\xff\xff\xff\x07\x03\xff\xff\xff\x00\xff\xff\xff\x55\xff\xff\xff\xe6\xff\xff\xff\x01\x81\xff\xff\xff\x00\x01\xff\xff\xff\xb1\xff\xff\xff\x90\x81\xff\xff\xff\x00\x0c\xff\xff\xff\x95\xff\xff\xff\xaa\xff\xff\xff\x08\xff\xff\xff\x12\xff\xff\xff\xcb\xff\xff\xff\x73\xff\xff\xff\x00\xff\xff\xff\x18\xff\xff\xff\xff\xff\xff\xff\x2c\xff\xff\xff\x05\xff\xff\xff\xa0\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x04\xff\xff\xff\xcc\xff\xff\xff\x75\xff\xff\xff\x02\xff\xff\xff\x9f\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x8b\xff\xff\xff\x00\x02\xff\xff\xff\x55\xff\xff\xff\xe6\xff\xff\xff\x01\x81\xff\xff\xff\x00\x08\xff\xff\xff\xb1\xff\xff\xff\x90\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x00\xff\xff\xff\x08\xff\xff\xff\xeb\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x05\xff\xff\xff\x18\xff\xff\xff\xff\xff\xff\xff\x2d\xff\xff\xff\x05\xff\xff\xff\xa0\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x01\xff\xff\xff\x01\xff\xff\xff\x0e\x86\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x02\xff\xff\xff\x0e\xff\xff\xff\xf9\xff\xff\xff\xf8\x81\xff\xff\xff\xf7\x01\xff\xff\xff\xff\xff\xff\xff\x43\x81\xff\xff\xff\x00\x01\xff\xff\xff\xee\xff\xff\xff\x2e\x81\xff\xff\xff\x00\x08\xff\xff\xff\x5b\xff\xff\xff\xc6\xff\xff\xff\x00\xff\xff\xff\x11\xff\xff\xff\xfb\xff\xff\xff\x41\xff\xff\xff\x00\xff\xff\xff\x34\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x05\xff\xff\xff\x12\xff\xff\xff\xff\xff\xff\xff\x10\xff\xff\xff\x00\xff\xff\xff\x3d\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x86\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x02\xff\xff\xff\x0e\xff\xff\xff\xf9\xff\xff\xff\xf8\x81\xff\xff\xff\xf7\x08\xff\xff\xff\xff\xff\xff\xff\x43\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x00\xff\xff\xff\x54\xff\xff\xff\xaf\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x05\xff\xff\xff\x10\xff\xff\xff\xfa\xff\xff\xff\x3c\xff\xff\xff\x00\xff\xff\xff\x34\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x86\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x09\xff\xff\xff\xbd\xff\xff\xff\x7c\xff\xff\xff\x00\xff\xff\xff\x45\xff\xff\xff\xf1\xff\xff\xff\x04\xff\xff\xff\x00\xff\xff\xff\x19\xff\xff\xff\xff\xff\xff\xff\x06\x81\xff\xff\xff\x00\x01\xff\xff\xff\x33\xff\xff\xff\xea\x81\xff\xff\xff\x00\x04\xff\xff\xff\x5f\xff\xff\xff\xd8\xff\xff\xff\xf0\xff\xff\xff\xf1\xff\xff\xff\xf6\x81\xff\xff\xff\x00\x01\xff\xff\xff\x24\xff\xff\xff\xfd\x81\xff\xff\xff\x00\x01\xff\xff\xff\x2a\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x86\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x0c\xff\xff\xff\xbd\xff\xff\xff\x7c\xff\xff\xff\x00\xff\xff\xff\x45\xff\xff\xff\xf1\xff\xff\xff\x04\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x00\xff\xff\xff\xac\xff\xff\xff\x57\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x04\xff\xff\xff\x58\xff\xff\xff\xd0\xff\xff\xff\xe2\xff\xff\xff\xe4\xff\xff\xff\xf6\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x86\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x04\xff\xff\xff\x71\xff\xff\xff\xbe\xff\xff\xff\x00\xff\xff\xff\x87\xff\xff\xff\xaa\x81\xff\xff\xff\x00\x01\xff\xff\xff\x24\xff\xff\xff\xfc\x82\xff\xff\xff\x00\x01\xff\xff\xff\x29\xff\xff\xff\xf4\x84\xff\xff\xff\x00\x01\xff\xff\xff\x2d\xff\xff\xff\xf1\x81\xff\xff\xff\x00\x05\xff\xff\xff\x11\xff\xff\xff\xff\xff\xff\xff\x10\xff\xff\xff\x00\xff\xff\xff\x3d\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x84\xff\xff\xff\x00\x81\xff\xff\xff\xef\x01\xff\xff\xff\xf1\xff\xff\xff\xff\x81\xff\xff\xff\xef\x81\xff\xff\xff\x00\x04\xff\xff\xff\x71\xff\xff\xff\xbe\xff\xff\xff\x00\xff\xff\xff\x87\xff\xff\xff\xaa\x81\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x0c\xff\xff\xff\xce\xff\xff\xff\x27\xff\xff\xff\xf7\x85\xff\xff\xff\x00\x01\xff\xff\xff\x2f\xff\xff\xff\xf1\x81\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xff\xff\xff\xff\x06\xff\xff\xff\x00\xff\xff\xff\x2a\xff\xff\xff\xf3\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x86\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x04\xff\xff\xff\x25\xff\xff\xff\xf7\xff\xff\xff\x07\xff\xff\xff\xc8\xff\xff\xff\x5e\x81\xff\xff\xff\x00\x02\xff\xff\xff\x1a\xff\xff\xff\xff\xff\xff\xff\x06\x81\xff\xff\xff\x00\x01\xff\xff\xff\x33\xff\xff\xff\xe9\x81\xff\xff\xff\x00\x04\xff\xff\xff\x54\xff\xff\xff\x1e\xff\xff\xff\x01\xff\xff\xff\x86\xff\xff\xff\xc9\x82\xff\xff\xff\x00\x04\xff\xff\xff\xcb\xff\xff\xff\x77\xff\xff\xff\x02\xff\xff\xff\xa1\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x86\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x04\xff\xff\xff\x25\xff\xff\xff\xf7\xff\xff\xff\x07\xff\xff\xff\xc8\xff\xff\xff\x5e\x81\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x5c\xff\xff\xff\x7f\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x04\xff\xff\xff\x65\xff\xff\xff\x3f\xff\xff\xff\x20\xff\xff\xff\x9c\xff\xff\xff\xc9\x81\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xff\xff\xff\xff\x5d\xff\xff\xff\x00\xff\xff\xff\x63\xff\xff\xff\xce\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x86\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x84\xff\xff\xff\x00\x03\xff\xff\xff\xd9\xff\xff\xff\x4f\xff\xff\xff\xf8\xff\xff\xff\x14\x81\xff\xff\xff\x00\x02\xff\xff\xff\x01\xff\xff\xff\xf3\xff\xff\xff\x2f\x81\xff\xff\xff\x00\x01\xff\xff\xff\x5c\xff\xff\xff\xc4\x81\xff\xff\xff\x00\x04\xff\xff\xff\x68\xff\xff\xff\xe0\xff\xff\xff\xf5\xff\xff\xff\xcb\xff\xff\xff\x2e\x82\xff\xff\xff\x00\x04\xff\xff\xff\x30\xff\xff\xff\xd7\xff\xff\xff\xec\xff\xff\xff\x8f\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x01\xff\xff\xff\x01\xff\xff\xff\x0e\x86\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x84\xff\xff\xff\x00\x03\xff\xff\xff\xd9\xff\xff\xff\x4f\xff\xff\xff\xf8\xff\xff\xff\x14\x81\xff\xff\xff\x00\x02\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\xb3\x81\xff\xff\xff\x27\x00\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x04\xff\xff\xff\x60\xff\xff\xff\xdc\xff\xff\xff\xf9\xff\xff\xff\xcb\xff\xff\xff\x2e\x81\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x7b\xff\xff\xff\xc9\xff\xff\xff\xe3\xff\xff\xff\x47\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x84\xff\xff\xff\x00\x03\xff\xff\xff\x12\xff\xff\xff\x66\xff\xff\xff\x50\xff\xff\xff\xf7\x84\xff\xff\xff\x00\x02\xff\xff\xff\x8d\xff\xff\xff\xce\xff\xff\xff\xc5\x83\xff\xff\xff\x00\x05\xff\xff\xff\xa2\xff\xff\xff\xac\xff\xff\xff\x09\xff\xff\xff\x14\xff\xff\xff\xcd\xff\xff\xff\x72\x90\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x8d\xff\xff\xff\x00\x02\xff\xff\xff\x8d\xff\xff\xff\xce\xff\xff\xff\xc5\x82\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xfd\xff\xff\xff\xc9\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x01\xff\xff\xff\x01\xff\xff\xff\x06\x84\xff\xff\xff\x00\x03\xff\xff\xff\x05\xff\xff\xff\x01\xff\xff\xff\x00\xff\xff\xff\x02\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x04\xff\xff\xff\xf4\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x01\xff\xff\xff\xf4\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x84\xff\xff\xff\x00\x03\xff\xff\xff\x13\xff\xff\xff\xb0\xff\xff\xff\xea\xff\xff\xff\xf7\x84\xff\xff\xff\x00\x02\xff\xff\xff\x41\xff\xff\xff\xff\xff\xff\xff\x79\x83\xff\xff\xff\x00\x05\xff\xff\xff\x13\xff\xff\xff\xaf\xff\xff\xff\xf1\xff\xff\xff\xec\xff\xff\xff\x96\xff\xff\xff\x03\x90\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x04\xff\xff\xff\xf4\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x01\xff\xff\xff\xf4\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x8d\xff\xff\xff\x00\x02\xff\xff\xff\x41\xff\xff\xff\xff\xff\xff\xff\x79\x82\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xff\xff\xff\xff\x77\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xf7\x83\xff\xff\xff\x00\x02\xff\xff\xff\x04\xff\xff\xff\xb7\xff\xff\xff\x22\x83\xff\xff\xff\x00\x04\xff\xff\xff\x86\xff\xff\xff\x49\xff\xff\xff\xb6\xff\xff\xff\xe6\xff\xff\xff\x0c\x81\xff\xff\xff\x00\xe1\xff\xff\xff\x00\x01\xff\xff\xff\x01\xff\xff\xff\x07\x84\xff\xff\xff\x00\x03\xff\xff\xff\x02\xff\xff\xff\x03\xff\xff\xff\x00\xff\xff\xff\x02\x85\xff\xff\xff\x00\x02\xff\xff\xff\x26\xff\xff\xff\xcc\xff\xff\xff\x0f\x82\xff\xff\xff\x00\x04\xff\xff\xff\x37\xff\xff\xff\xf0\xff\xff\xff\x64\xff\xff\xff\x7f\xff\xff\xff\x43\x81\xff\xff\xff\x00\xe1\xff\xff\xff\x00\x02\xff\xff\xff\x07\xff\xff\xff\xd0\xff\xff\xff\x19\x83\xff\xff\xff\x00\x03\xff\xff\xff\x3e\xff\xff\xff\x71\xff\xff\xff\xa4\xff\xff\xff\xc6\x92\xff\xff\xff\x00\xe2\xff\xff\xff\x00\x01\xff\xff\xff\x57\xff\xff\xff\xb2\x83\xff\xff\xff\x00\x04\xff\xff\xff\x09\xff\xff\xff\xda\xff\xff\xff\x8c\xff\xff\xff\x9d\xff\xff\xff\x0e\x91\xff\xff\xff\x00\xff\xff\xff\xff\x00\xb7\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\xc5\xff\xff\xff\x00\x01\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x04\xff\xff\xff\xf0\xff\xff\xff\xef\xff\xff\xff\x00\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x01\xff\xff\xff\xf0\xff\xff\xff\xef\x92\xff\xff\xff\x00\x04\xff\xff\xff\x0e\xff\xff\xff\x8a\xff\xff\xff\xdc\xff\xff\xff\xf0\xff\xff\xff\xa8\x90\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x8d\xff\xff\xff\x00\x01\xff\xff\xff\x25\xff\xff\xff\xf6\x82\xff\xff\xff\xef\x01\xff\xff\xff\xf0\xff\xff\xff\xef\xb0\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x91\xff\xff\xff\x00\x05\xff\xff\xff\x0a\xff\xff\xff\xd0\xff\xff\xff\xa4\xff\xff\xff\x1f\xff\xff\xff\x01\xff\xff\xff\x18\x90\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x85\xff\xff\xff\x00\x02\xff\xff\xff\x1f\xff\xff\xff\x4c\xff\xff\xff\x10\x81\xff\xff\xff\x00\x04\xff\xff\xff\x19\xff\xff\xff\x46\xff\xff\xff\x0e\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\xb0\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x89\xff\xff\xff\x00\x04\xff\xff\xff\x15\xff\xff\xff\xc1\xff\xff\xff\xf4\xff\xff\xff\x9f\xff\xff\xff\x01\x82\xff\xff\xff\x00\x01\xff\xff\xff\x85\xff\xff\xff\xbb\x84\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x8d\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x8e\xff\xff\xff\xf1\xff\xff\xff\xc4\xff\xff\xff\x16\x81\xff\xff\xff\x00\x09\xff\xff\xff\x57\xff\xff\xff\xee\xff\xff\xff\x52\xff\xff\xff\x00\xff\xff\xff\x07\xff\xff\xff\x9a\xff\xff\xff\xee\xff\xff\xff\x44\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x90\xff\xff\xff\x00\x01\xff\xff\xff\xa1\xff\xff\xff\x97\x82\xff\xff\xff\x00\x08\xff\xff\xff\x60\xff\xff\xff\xdc\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xff\xff\xff\xff\xf3\xff\xff\xff\xef\xff\xff\xff\xbd\xff\xff\xff\x42\x82\xff\xff\xff\x00\x04\xff\xff\xff\x83\xff\xff\xff\xdd\xff\xff\xff\xbc\xff\xff\xff\x8a\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x04\xff\xff\xff\x25\xff\xff\xff\xcb\xff\xff\xff\xf3\xff\xff\xff\xb4\xff\xff\xff\x0f\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x89\xff\xff\xff\x00\x04\xff\xff\xff\x9d\xff\xff\xff\xa9\xff\xff\xff\x0d\xff\xff\xff\xcf\xff\xff\xff\x56\x82\xff\xff\xff\x00\x08\xff\xff\xff\xe3\xff\xff\xff\x47\xff\xff\xff\x3e\xff\xff\xff\xd6\xff\xff\xff\xea\xff\xff\xff\xa1\xff\xff\xff\xef\xff\xff\xff\x27\xff\xff\xff\xfb\x8d\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xff\xff\xff\xff\x76\xff\xff\xff\x01\xff\xff\xff\x9e\xff\xff\xff\x9b\x81\xff\xff\xff\x00\x09\xff\xff\xff\x10\xff\xff\xff\xc8\xff\xff\xff\xae\xff\xff\xff\x0f\xff\xff\xff\x42\xff\xff\xff\xe8\xff\xff\xff\x7f\xff\xff\xff\x10\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x90\xff\xff\xff\x00\x02\xff\xff\xff\x55\xff\xff\xff\xe6\xff\xff\xff\x01\x81\xff\xff\xff\x00\x10\xff\xff\xff\xb1\xff\xff\xff\x90\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x00\xff\xff\xff\x05\xff\xff\xff\x45\xff\xff\xff\xe3\xff\xff\xff\x3c\xff\xff\xff\x00\xff\xff\xff\x18\xff\xff\xff\xff\xff\xff\xff\x16\xff\xff\xff\x00\xff\xff\xff\x88\xff\xff\xff\xf7\x82\xff\xff\xff\x00\x04\xff\xff\xff\xc4\xff\xff\xff\x7b\xff\xff\xff\x02\xff\xff\xff\xa5\xff\xff\xff\x93\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x89\xff\xff\xff\x00\x04\xff\xff\xff\xed\xff\xff\xff\x24\xff\xff\xff\x00\xff\xff\xff\x55\xff\xff\xff\xa1\x81\xff\xff\xff\x00\x09\xff\xff\xff\x14\xff\xff\xff\xff\xff\xff\xff\x14\xff\xff\xff\xe9\xff\xff\xff\x5a\xff\xff\xff\x03\xff\xff\xff\x88\xff\xff\xff\xf7\xff\xff\xff\x27\xff\xff\xff\xfb\x8d\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xff\xff\xff\xff\x10\xff\xff\xff\x00\xff\xff\xff\x3d\xff\xff\xff\xe1\x81\xff\xff\xff\x00\x09\xff\xff\xff\x03\xff\xff\xff\x6b\xff\xff\xff\xe8\xff\xff\xff\x90\xff\xff\xff\xd4\xff\xff\xff\xc2\xff\xff\xff\x0e\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x90\xff\xff\xff\x00\x02\xff\xff\xff\x0e\xff\xff\xff\xf9\xff\xff\xff\xf8\x81\xff\xff\xff\xf7\x04\xff\xff\xff\xff\xff\xff\xff\x43\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x08\xff\xff\xff\x6a\xff\xff\xff\xb0\xff\xff\xff\x00\xff\xff\xff\x11\xff\xff\xff\xfb\xff\xff\xff\x49\xff\xff\xff\x00\xff\xff\xff\x32\xff\xff\xff\xf7\x81\xff\xff\xff\x00\x05\xff\xff\xff\x10\xff\xff\xff\xff\xff\xff\xff\x12\xff\xff\xff\x00\xff\xff\xff\x3e\xff\xff\xff\xdf\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x88\xff\xff\xff\x00\x01\xff\xff\xff\x15\xff\xff\xff\xed\x81\xff\xff\xff\x00\x01\xff\xff\xff\x1d\xff\xff\xff\xc5\x81\xff\xff\xff\x00\x09\xff\xff\xff\x23\xff\xff\xff\xfd\xff\xff\xff\x22\xff\xff\xff\xfd\xff\xff\xff\x02\xff\xff\xff\x00\xff\xff\xff\x31\xff\xff\xff\xf7\xff\xff\xff\x27\xff\xff\xff\xfb\x8d\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfd\x81\xff\xff\xff\x00\x01\xff\xff\xff\x2a\xff\xff\xff\xf3\x82\xff\xff\xff\x00\x01\xff\xff\xff\x0a\xff\xff\xff\x78\x81\xff\xff\xff\xf0\x00\xff\xff\xff\x3c\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x91\xff\xff\xff\x00\x08\xff\xff\xff\xbd\xff\xff\xff\x7c\xff\xff\xff\x00\xff\xff\xff\x45\xff\xff\xff\xf1\xff\xff\xff\x04\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x36\xff\xff\xff\xe4\x81\xff\xff\xff\x00\x04\xff\xff\xff\x5f\xff\xff\xff\xd8\xff\xff\xff\xf0\xff\xff\xff\xf1\xff\xff\xff\xf6\x81\xff\xff\xff\x00\x01\xff\xff\xff\x24\xff\xff\xff\xfd\x81\xff\xff\xff\x00\x01\xff\xff\xff\x2a\xff\xff\xff\xf3\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x88\xff\xff\xff\x00\x05\xff\xff\xff\x23\xff\xff\xff\xda\xff\xff\xff\x00\xff\xff\xff\xae\xff\xff\xff\x0b\xff\xff\xff\xd3\x81\xff\xff\xff\x00\x09\xff\xff\xff\x16\xff\xff\xff\xff\xff\xff\xff\x11\xff\xff\xff\xe8\xff\xff\xff\x5c\xff\xff\xff\x04\xff\xff\xff\x8a\xff\xff\xff\xf7\xff\xff\xff\x27\xff\xff\xff\xff\x81\xff\xff\xff\xef\x01\xff\xff\xff\xc2\xff\xff\xff\x2b\x89\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xff\xff\xff\xff\x10\xff\xff\xff\x00\xff\xff\xff\x3d\xff\xff\xff\xe0\x83\xff\xff\xff\x00\x03\xff\xff\xff\x08\xff\xff\xff\xbe\xff\xff\xff\xc6\xff\xff\xff\x0b\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x91\xff\xff\xff\x00\x04\xff\xff\xff\x71\xff\xff\xff\xbe\xff\xff\xff\x00\xff\xff\xff\x87\xff\xff\xff\xaa\x81\xff\xff\xff\x00\x06\xff\xff\xff\xd7\xff\xff\xff\xff\xff\xff\xff\xef\xff\xff\xff\xc5\xff\xff\xff\x00\xff\xff\xff\x2a\xff\xff\xff\xf2\x84\xff\xff\xff\x00\x01\xff\xff\xff\x2e\xff\xff\xff\xf1\x81\xff\xff\xff\x00\x05\xff\xff\xff\x11\xff\xff\xff\xff\xff\xff\xff\x12\xff\xff\xff\x00\xff\xff\xff\x41\xff\xff\xff\xdd\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x88\xff\xff\xff\x00\x05\xff\xff\xff\x20\xff\xff\xff\xdc\xff\xff\xff\x00\xff\xff\xff\x88\xff\xff\xff\x0d\xff\xff\xff\xcf\x82\xff\xff\xff\x00\x00\xff\xff\xff\xe9\x81\xff\xff\xff\x3b\x09\xff\xff\xff\xd3\xff\xff\xff\xe9\xff\xff\xff\x9b\xff\xff\xff\xf6\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x00\xff\xff\xff\x05\xff\xff\xff\x8e\xff\xff\xff\xc8\x89\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xff\xff\xff\xff\x78\xff\xff\xff\x02\xff\xff\xff\x9f\xff\xff\xff\x98\x83\xff\xff\xff\x00\x03\xff\xff\xff\x11\xff\xff\xff\xc9\xff\xff\xff\x79\xff\xff\xff\x02\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x8a\xff\xff\xff\x00\x03\xff\xff\xff\x4c\xff\xff\xff\xdb\xff\xff\xff\xe3\xff\xff\xff\x4e\x82\xff\xff\xff\x00\x04\xff\xff\xff\x25\xff\xff\xff\xf7\xff\xff\xff\x07\xff\xff\xff\xc8\xff\xff\xff\x5e\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x3a\xff\xff\xff\xe3\x81\xff\xff\xff\x00\x04\xff\xff\xff\x62\xff\xff\xff\x3b\xff\xff\xff\x1c\xff\xff\xff\x99\xff\xff\xff\xc9\x82\xff\xff\xff\x00\x04\xff\xff\xff\xc7\xff\xff\xff\x7e\xff\xff\xff\x00\xff\xff\xff\x8d\xff\xff\xff\x98\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x88\xff\xff\xff\x00\x05\xff\xff\xff\x08\xff\xff\xff\xf2\xff\xff\xff\x02\xff\xff\xff\x00\xff\xff\xff\x29\xff\xff\xff\xb3\x82\xff\xff\xff\x00\x01\xff\xff\xff\x92\xff\xff\xff\xa1\x82\xff\xff\xff\x00\x03\xff\xff\xff\x48\xff\xff\xff\xe6\xff\xff\xff\x27\xff\xff\xff\xfb\x81\xff\xff\xff\x00\x01\xff\xff\xff\x31\xff\xff\xff\xf1\x89\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x8d\xff\xff\xff\xf1\xff\xff\xff\xc3\xff\xff\xff\x14\x82\xff\xff\xff\x00\x03\xff\xff\xff\x0a\xff\xff\xff\x74\xff\xff\xff\xe8\xff\xff\xff\x54\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x89\xff\xff\xff\x00\x04\xff\xff\xff\x0e\xff\xff\xff\xf5\xff\xff\xff\x2b\xff\xff\xff\x5a\xff\xff\xff\xe3\x83\xff\xff\xff\x00\x03\xff\xff\xff\xd9\xff\xff\xff\x4f\xff\xff\xff\xf8\xff\xff\xff\x14\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x74\xff\xff\xff\xaf\x81\xff\xff\xff\x00\x04\xff\xff\xff\x60\xff\xff\xff\xdc\xff\xff\xff\xf9\xff\xff\xff\xcb\xff\xff\xff\x2e\x82\xff\xff\xff\x00\x04\xff\xff\xff\x29\xff\xff\xff\xcf\xff\xff\xff\xf7\xff\xff\xff\xfb\xff\xff\xff\x27\x81\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x04\xff\xff\xff\x27\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x89\xff\xff\xff\x00\x04\xff\xff\xff\xbd\xff\xff\xff\x66\xff\xff\xff\x01\xff\xff\xff\x94\xff\xff\xff\x6a\x82\xff\xff\xff\x00\x0c\xff\xff\xff\x13\xff\xff\xff\xdf\xff\xff\xff\x7c\xff\xff\xff\x0b\xff\xff\xff\x13\xff\xff\xff\xc7\xff\xff\xff\x96\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x00\xff\xff\xff\x03\xff\xff\xff\x8b\xff\xff\xff\xca\x92\xff\xff\xff\x00\x03\xff\xff\xff\x27\xff\xff\xff\xd5\xff\xff\xff\xba\xff\xff\xff\x19\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xfb\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xf7\x89\xff\xff\xff\x00\x04\xff\xff\xff\x16\xff\xff\xff\xfd\xff\xff\xff\x2a\xff\xff\xff\x58\xff\xff\xff\xcd\x83\xff\xff\xff\x00\x02\xff\xff\xff\x8d\xff\xff\xff\xce\xff\xff\xff\xc5\x82\xff\xff\xff\x00\x06\xff\xff\xff\x27\xff\xff\xff\xfb\xff\xff\xff\x00\xff\xff\xff\x06\xff\xff\xff\x4e\xff\xff\xff\xeb\xff\xff\xff\x3d\x83\xff\xff\xff\x00\x01\xff\xff\xff\x05\xff\xff\xff\x01\x83\xff\xff\xff\x00\x03\xff\xff\xff\x29\xff\xff\xff\x1c\xff\xff\xff\x80\xff\xff\xff\x94\x82\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x04\xff\xff\xff\xf4\xff\xff\xff\xf7\xff\xff\xff\x00\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x01\xff\xff\xff\xf4\xff\xff\xff\xf7\x89\xff\xff\xff\x00\x04\xff\xff\xff\x28\xff\xff\xff\xd0\xff\xff\xff\xf2\xff\xff\xff\xa5\xff\xff\xff\x04\x83\xff\xff\xff\x00\x0b\xff\xff\xff\x19\xff\xff\xff\x9e\xff\xff\xff\xe4\xff\xff\xff\xea\xff\xff\xff\x9d\xff\xff\xff\x0a\xff\xff\xff\x27\xff\xff\xff\xff\xff\xff\xff\xf3\xff\xff\xff\xf4\xff\xff\xff\xc7\xff\xff\xff\x2e\x83\xff\xff\xff\x00\x02\xff\xff\xff\x15\xff\xff\xff\xc0\xff\xff\xff\x1c\x8b\xff\xff\xff\x00\x02\xff\xff\xff\x07\xff\xff\xff\x2a\xff\xff\xff\x12\x83\xff\xff\xff\x00\x01\xff\xff\xff\x27\xff\xff\xff\xff\x82\xff\xff\xff\xf3\x01\xff\xff\xff\xf4\xff\xff\xff\xf7\x8a\xff\xff\xff\x00\x03\xff\xff\xff\x7b\xff\xff\xff\xf2\xff\xff\xff\xbf\xff\xff\xff\x1a\x83\xff\xff\xff\x00\x02\xff\xff\xff\x41\xff\xff\xff\xff\xff\xff\xff\x79\x82\xff\xff\xff\x00\x05\xff\xff\xff\x27\xff\xff\xff\xff\xff\xff\xff\xf3\xff\xff\xff\xf1\xff\xff\xff\xc2\xff\xff\xff\x48\x83\xff\xff\xff\x00\x02\xff\xff\xff\x19\xff\xff\xff\xb9\xff\xff\xff\x07\x83\xff\xff\xff\x00\x03\xff\xff\xff\x24\xff\xff\xff\xaf\xff\xff\xff\xf8\xff\xff\xff\x4d\x82\xff\xff\xff\x00\xb0\xff\xff\xff\x00\x02\xff\xff\xff\x10\xff\xff\xff\xc9\xff\xff\xff\x3a\xae\xff\xff\xff\x00\x81\xff\xff\xff\x04\x8b\xff\xff\xff\x00\x02\xff\xff\xff\x08\xff\xff\xff\xc4\xff\xff\xff\x2e\x84\xff\xff\xff\x00\x04\xff\xff\xff\x06\xff\xff\xff\xce\xff\xff\xff\x54\xff\xff\xff\x72\xff\xff\xff\x14\x81\xff\xff\xff\x00\xe1\xff\xff\xff\x00\x02\xff\xff\xff\x02\xff\xff\xff\xc5\xff\xff\xff\x24\x9a\xff\xff\xff\x00\xe1\xff\xff\xff\x00\x01\xff\xff\xff\x77\xff\xff\xff\x8f\x9b\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x54\x52\x55\x45\x56\x49\x53\x49\x4f\x4e\x2d\x58\x46\x49\x4c\x45\x2e\x00"