diff --git a/Graphics/LambdaCube.hs b/Graphics/LambdaCube.hs
new file mode 100644
--- /dev/null
+++ b/Graphics/LambdaCube.hs
@@ -0,0 +1,63 @@
+module Graphics.LambdaCube (
+--    module Graphics.LambdaCube.Overlay,
+    module Graphics.LambdaCube.Compositor,
+    module Graphics.LambdaCube.Material,
+    module Graphics.LambdaCube.Common,
+    module Graphics.LambdaCube.Math,
+    module Graphics.LambdaCube.Entity,
+    module Graphics.LambdaCube.Frustum,
+    module Graphics.LambdaCube.Mesh,
+    module Graphics.LambdaCube.HardwareBuffer,
+    module Graphics.LambdaCube.HardwareVertexBuffer,
+    module Graphics.LambdaCube.HardwareIndexBuffer,
+    module Graphics.LambdaCube.VertexIndexData,
+    module Graphics.LambdaCube.Resource,
+    module Graphics.LambdaCube.RenderQueue,
+    module Graphics.LambdaCube.RenderSystem,
+    module Graphics.LambdaCube.RenderOperation,
+    module Graphics.LambdaCube.SceneGraph,
+    module Graphics.LambdaCube.Loader.StbImage,
+--    module Graphics.LambdaCube.Loader.MeshXML,
+--	module Graphics.LambdaCube.Loader.MeshBinary,
+--    module Graphics.LambdaCube.Loader.LMeshBinary,
+    module Graphics.LambdaCube.Loader.CompositorScript,
+    module Graphics.LambdaCube.Loader.MaterialScript,
+    module Graphics.LambdaCube.Loader.ResourceScript,
+    module Graphics.LambdaCube.World,
+    module Graphics.LambdaCube.Types,
+    module Graphics.LambdaCube.Texture,
+    module Graphics.LambdaCube.GpuProgram,
+    module Graphics.LambdaCube.Utility
+--    module Graphics.LambdaCube.Loader.OverlayScript
+) where
+
+import Graphics.LambdaCube.Common
+import Graphics.LambdaCube.Types
+import Graphics.LambdaCube.Utility
+--import Graphics.LambdaCube.Overlay
+import Graphics.LambdaCube.Compositor
+import Graphics.LambdaCube.Material
+import Graphics.LambdaCube.Math
+import Graphics.LambdaCube.Entity
+import Graphics.LambdaCube.Frustum
+import Graphics.LambdaCube.Mesh
+import Graphics.LambdaCube.Texture
+import Graphics.LambdaCube.GpuProgram
+import Graphics.LambdaCube.HardwareBuffer
+import Graphics.LambdaCube.HardwareVertexBuffer
+import Graphics.LambdaCube.HardwareIndexBuffer
+import Graphics.LambdaCube.VertexIndexData
+import Graphics.LambdaCube.Resource
+import Graphics.LambdaCube.RenderQueue
+import Graphics.LambdaCube.RenderSystem
+import Graphics.LambdaCube.RenderOperation
+import Graphics.LambdaCube.SceneGraph
+import Graphics.LambdaCube.Loader.StbImage
+--import Graphics.LambdaCube.Loader.MeshXML
+--import Graphics.LambdaCube.Loader.MeshBinary
+--import Graphics.LambdaCube.Loader.LMeshBinary
+import Graphics.LambdaCube.Loader.MaterialScript
+import Graphics.LambdaCube.Loader.CompositorScript
+import Graphics.LambdaCube.Loader.ResourceScript
+import Graphics.LambdaCube.World
+--import Graphics.LambdaCube.Loader.OverlayScript
diff --git a/Graphics/LambdaCube/AnimationState.hs b/Graphics/LambdaCube/AnimationState.hs
new file mode 100644
--- /dev/null
+++ b/Graphics/LambdaCube/AnimationState.hs
@@ -0,0 +1,28 @@
+module Graphics.LambdaCube.AnimationState where
+
+import Data.Map
+import Graphics.LambdaCube.Types
+
+{-| Represents the state of an animation and the weight of it's influence. 
+@remarks
+    Other classes can hold instances of this class to store the state of any animations
+    they are using.
+-}
+data AnimationState
+    = AnimationState
+    { asBlendMask       :: [Float]      -- ^ the blend mask (containing per bone weights)
+    , asAnimationName   :: String
+    , asTimePos         :: FloatType
+    , asLength          :: FloatType
+    , asWeight          :: FloatType
+    , asEnabled         :: Bool
+    , asLoop            :: Bool
+    }
+
+-- | Class encapsulating a set of AnimationState objects.
+data AnimationStateSet
+    = AnimationStateSet
+    { assDirtyFrameNumber       :: Int
+    , assAnimationStates        :: Map String AnimationState
+    , assEnabledAnimationStates :: [AnimationState] -- ^ List of enabled animation states
+    }    
diff --git a/Graphics/LambdaCube/BlendMode.hs b/Graphics/LambdaCube/BlendMode.hs
new file mode 100644
--- /dev/null
+++ b/Graphics/LambdaCube/BlendMode.hs
@@ -0,0 +1,131 @@
+module Graphics.LambdaCube.BlendMode where
+
+import Graphics.LambdaCube.Types
+
+-- | Type of texture blend mode.
+data LayerBlendType
+    = LBT_COLOUR
+    | LBT_ALPHA
+    deriving Eq
+    
+{-| List of valid texture blending operations, for use with TextureUnitState::setColourOperation.
+    @remarks
+        This list is a more limited list than LayerBlendOperationEx because it only
+        includes operations that are supportable in both multipass and multitexture
+        rendering and thus provides automatic fallback if multitexture hardware
+        is lacking or insufficient.
+-}
+data LayerBlendOperation
+    = LBO_REPLACE     -- ^ Replace all colour with texture with no adjustment
+    | LBO_ADD         -- ^ Add colour components together.
+    | LBO_MODULATE    -- ^ Multiply colour components together.
+    | LBO_ALPHA_BLEND -- ^ Blend based on texture alpha
+    deriving Eq
+
+{-| Expert list of valid texture blending operations, for use with TextureUnitState::setColourOperationEx
+    and TextureUnitState::setAlphaOperation, and internally in the LayerBlendModeEx class. It's worth
+    noting that these operations are for blending <i>between texture layers</i> and not between rendered objects
+    and the existing scene. Because all of these modes are only supported in multitexture hardware it may be
+    required to set up a fallback operation where this hardware is not available.
+-}
+data LayerBlendOperationEx
+    = LBX_SOURCE1               -- ^ use source1 without modification
+    | LBX_SOURCE2               -- ^ use source2 without modification
+    | LBX_MODULATE              -- ^ multiply source1 and source2 together
+    | LBX_MODULATE_X2           -- ^ as LBX_MODULATE but brighten afterwards (x2)
+    | LBX_MODULATE_X4           -- ^ as LBX_MODULATE but brighten more afterwards (x4)
+    | LBX_ADD                   -- ^ add source1 and source2 together
+    | LBX_ADD_SIGNED            -- ^ as LBX_ADD, but subtract 0.5 from the result
+    | LBX_ADD_SMOOTH            -- ^ as LBX_ADD, but subtract product from the sum
+    | LBX_SUBTRACT              -- ^ subtract source2 from source1
+    | LBX_BLEND_DIFFUSE_ALPHA   -- ^ use interpolated alpha value from vertices to scale source1, then add source2 scaled by (1-alpha)
+    | LBX_BLEND_TEXTURE_ALPHA   -- ^ as LBX_BLEND_DIFFUSE_ALPHA, but use alpha from texture
+    | LBX_BLEND_CURRENT_ALPHA   -- ^ as LBX_BLEND_DIFFUSE_ALPHA, but use current alpha from previous stages
+    | LBX_BLEND_MANUAL          -- ^ as LBX_BLEND_DIFFUSE_ALPHA but use a constant manual blend value (0.0-1.0)
+    | LBX_DOTPRODUCT            -- ^ dot product of color1 and color2 
+    | LBX_BLEND_DIFFUSE_COLOUR  -- ^ use interpolated color values from vertices to scale source1, then add source2 scaled by (1-color)
+    deriving Eq
+
+{-| List of valid sources of values for blending operations used
+    in TextureUnitState::setColourOperation and TextureUnitState::setAlphaOperation,
+    and internally in the LayerBlendModeEx class.
+-}
+data LayerBlendSource
+    = LBS_CURRENT   -- ^ the colour as built up from previous stages
+    | LBS_TEXTURE   -- ^ the colour derived from the texture assigned to this layer
+    | LBS_DIFFUSE   -- ^ the interpolated diffuse colour from the vertices
+    | LBS_SPECULAR  -- ^ the interpolated specular colour from the vertices
+    | LBS_MANUAL    -- ^ a colour supplied manually as a separate argument
+    deriving Eq
+    
+
+data LayerBlendModeEx
+    = LayerBlendModeEx
+    { lbBlendType  :: LayerBlendType        -- ^ The type of blending (colour or alpha)
+    , lbOperation  :: LayerBlendOperationEx -- ^ The operation to be applied
+    , lbSource1    :: LayerBlendSource      -- ^ The first source of colour/alpha
+    , lbSource2    :: LayerBlendSource      -- ^ The second source of colour/alpha
+    , lbColourArg1 :: ColourValue           -- ^ Manual colour value for manual source1
+    , lbColourArg2 :: ColourValue           -- ^ Manual colour value for manual source2
+    , lbAlphaArg1  :: FloatType             -- ^ Manual alpha value for manual source1
+    , lbAlphaArg2  :: FloatType             -- ^ Manual alpha value for manual source2
+    , lbFactor     :: FloatType             -- ^ Manual blending factor
+    }
+    deriving Eq
+
+{-| Types of blending that you can specify between an object and the existing contents of the scene.
+    @remarks
+        As opposed to the LayerBlendType, which classifies blends between texture layers, these blending
+        types blend between the output of the texture units and the pixels already in the viewport,
+        allowing for object transparency, glows, etc.
+    @par
+        These types are provided to give quick and easy access to common effects. You can also use
+        the more manual method of supplying source and destination blending factors.
+        See Material::setSceneBlending for more details.
+    @see
+        Material::setSceneBlending
+-}
+data SceneBlendType
+    = SBT_TRANSPARENT_ALPHA  -- ^ Make the object transparent based on the final alpha values in the texture
+    | SBT_TRANSPARENT_COLOUR -- ^ Make the object transparent based on the colour values in the texture (brighter = more opaque)
+    | SBT_ADD                -- ^ Add the texture values to the existing scene content
+    | SBT_MODULATE           -- ^ Multiply the 2 colours together
+    | SBT_REPLACE            -- ^ The default blend mode where source replaces destination
+    deriving Eq
+
+{-| Blending factors for manually blending objects with the scene. If there isn't a predefined
+    SceneBlendType that you like, then you can specify the blending factors directly to affect the
+    combination of object and the existing scene. See Material::setSceneBlending for more details.
+-}
+data SceneBlendFactor
+    = SBF_ONE
+    | SBF_ZERO
+    | SBF_DEST_COLOUR
+    | SBF_SOURCE_COLOUR
+    | SBF_ONE_MINUS_DEST_COLOUR
+    | SBF_ONE_MINUS_SOURCE_COLOUR
+    | SBF_DEST_ALPHA
+    | SBF_SOURCE_ALPHA
+    | SBF_ONE_MINUS_DEST_ALPHA
+    | SBF_ONE_MINUS_SOURCE_ALPHA
+    deriving Eq
+
+{-| Blending operations controls how objects are blended into the scene. The default operation
+	is add (+) but by changing this you can change how drawn objects are blended into the
+	existing scene.
+-}
+data SceneBlendOperation
+    = SBO_ADD
+    | SBO_SUBTRACT
+    | SBO_REVERSE_SUBTRACT
+    | SBO_MIN
+    | SBO_MAX
+    deriving Eq
+
+-- | Converts SceneBlendType to SceneBlendFactor pair
+convertSBTtoSBF :: SceneBlendType -> (SceneBlendFactor,SceneBlendFactor)
+convertSBTtoSBF SBT_ADD                = (SBF_ONE,SBF_ONE)
+convertSBTtoSBF SBT_MODULATE           = (SBF_DEST_COLOUR,SBF_ZERO)
+convertSBTtoSBF SBT_TRANSPARENT_COLOUR = (SBF_SOURCE_COLOUR,SBF_ONE_MINUS_SOURCE_COLOUR)
+convertSBTtoSBF SBT_TRANSPARENT_ALPHA  = (SBF_SOURCE_ALPHA,SBF_ONE_MINUS_SOURCE_ALPHA)
+convertSBTtoSBF SBT_REPLACE            = (SBF_ONE,SBF_ZERO)
diff --git a/Graphics/LambdaCube/Common.hs b/Graphics/LambdaCube/Common.hs
new file mode 100644
--- /dev/null
+++ b/Graphics/LambdaCube/Common.hs
@@ -0,0 +1,115 @@
+module Graphics.LambdaCube.Common where
+
+{-| Comparison functions used for the depth/stencil buffer operations and 
+	others. -}
+data CompareFunction
+    = CMPF_ALWAYS_FAIL
+    | CMPF_ALWAYS_PASS
+    | CMPF_LESS
+    | CMPF_LESS_EQUAL
+    | CMPF_EQUAL
+    | CMPF_NOT_EQUAL
+    | CMPF_GREATER_EQUAL
+    | CMPF_GREATER
+    deriving Eq
+
+{-| High-level filtering options providing shortcuts to settings the
+    minification, magnification and mip filters. -}
+data TextureFilterOptions
+    = TFO_NONE        -- ^ Equal to: min=FO_POINT, mag=FO_POINT, mip=FO_NONE
+    | TFO_BILINEAR    -- ^ Equal to: min=FO_LINEAR, mag=FO_LINEAR, mip=FO_POINT
+    | TFO_TRILINEAR   -- ^ Equal to: min=FO_LINEAR, mag=FO_LINEAR, mip=FO_LINEAR
+    | TFO_ANISOTROPIC -- ^ Equal to: min=FO_ANISOTROPIC, max=FO_ANISOTROPIC, mip=FO_LINEAR
+    deriving Eq
+
+data FilterType
+    = FT_MIN -- ^ The filter used when shrinking a texture
+    | FT_MAG -- ^ The filter used when magnifying a texture
+    | FT_MIP -- ^ The filter used when determining the mipmap
+    deriving Eq
+    
+-- | Filtering options for textures / mipmaps.
+data FilterOptions
+    = FO_NONE        -- ^ No filtering, used for FILT_MIP to turn off mipmapping
+    | FO_POINT       -- ^ Use the closest pixel
+    | FO_LINEAR      -- ^ Average of a 2x2 pixel area, denotes bilinear for MIN and MAG, trilinear for MIP
+    | FO_ANISOTROPIC -- ^ Similar to FO_LINEAR, but compensates for the angle of the texture plane
+    deriving Eq
+    
+-- | Light shading modes.
+data ShadeOptions
+    = SO_FLAT
+    | SO_GOURAUD
+    | SO_PHONG
+    deriving Eq
+
+-- | Fog modes.
+data FogMode
+    = FOG_NONE      -- ^ No fog. Duh.
+    | FOG_EXP       -- ^ Fog density increases  exponentially from the camera (fog = 1/e^(distance * density))
+    | FOG_EXP2      -- ^ Fog density increases at the square of FOG_EXP, i.e. even quicker (fog = 1/e^(distance * density)^2)
+    | FOG_LINEAR    -- ^ Fog density increases linearly between the start and end distances
+    deriving Eq
+
+{-| Hardware culling modes based on vertex winding.
+    This setting applies to how the hardware API culls triangles it is sent. -}
+data CullingMode
+    = CULL_NONE             -- ^ Hardware never culls triangles and renders everything it receives.
+    | CULL_CLOCKWISE        -- ^ Hardware culls triangles whose vertices are listed clockwise in the view (default).
+    | CULL_ANTICLOCKWISE    -- ^ Hardware culls triangles whose vertices are listed anticlockwise in the view.
+    deriving Eq
+
+{-| Manual culling modes based on vertex normals.
+    This setting applies to how the software culls triangles before sending them to the 
+	hardware API. This culling mode is used by scene managers which choose to implement it -
+	normally those which deal with large amounts of fixed world geometry which is often 
+	planar (software culling movable variable geometry is expensive). -}
+data ManualCullingMode
+    = MANUAL_CULL_NONE  -- ^ No culling so everything is sent to the hardware.
+    | MANUAL_CULL_BACK  -- ^ Cull triangles whose normal is pointing away from the camera (default).
+    | MANUAL_CULL_FRONT -- ^ Cull triangles whose normal is pointing towards the camera.
+    deriving Eq
+
+-- | Enumerates the wave types usable with the Ogre engine.
+data WaveformType
+    = WFT_SINE             -- ^ Standard sine wave which smoothly changes from low to high and back again.
+    | WFT_TRIANGLE         -- ^ An angular wave with a constant increase / decrease speed with pointed peaks.
+    | WFT_SQUARE           -- ^ Half of the time is spent at the min, half at the max with instant transition between.
+    | WFT_SAWTOOTH         -- ^ Gradual steady increase from min to max over the period with an instant return to min at the end.
+    | WFT_INVERSE_SAWTOOTH -- ^ Gradual steady decrease from max to min over the period, with an instant return to max at the end.
+    | WFT_PWM              -- ^ Pulse Width Modulation. Works like WFT_SQUARE, except the high to low transition is controlled by duty cycle. 
+                           -- ^  With a duty cycle of 50% (0.5) will give the same output as WFT_SQUARE.
+    deriving Eq
+
+-- | The polygon mode to use when rasterising.
+data PolygonMode
+    = PM_POINTS     -- ^ Only points are rendered.
+    | PM_WIREFRAME  -- ^ Wireframe models are rendered.
+    | PM_SOLID      -- ^ Solid polygons are rendered.
+    deriving Eq
+
+-- | An enumeration describing which material properties should track the vertex colours 
+data TrackVertexColourType
+    = TrackVertexColourType
+    { tvcAmbient  :: Bool
+    , tvcDiffuse  :: Bool
+    , tvcSpecular :: Bool
+    , tvcEmissive :: Bool
+    }
+    deriving Eq
+
+-- | Sort mode for billboard-set and particle-system
+data SortMode
+    = SM_DIRECTION -- ^ Sort by direction of the camera
+    | SM_DISTANCE  -- ^ Sort by distance from the camera
+    deriving Eq
+
+-- | Defines the frame buffer types.
+data FrameBufferType
+    = FrameBufferType
+    { fbtColour  :: Bool
+    , fbtDepth   :: Bool
+    , fbtStencil :: Bool
+    }
+    deriving Eq
+
diff --git a/Graphics/LambdaCube/Compositor.hs b/Graphics/LambdaCube/Compositor.hs
new file mode 100644
--- /dev/null
+++ b/Graphics/LambdaCube/Compositor.hs
@@ -0,0 +1,121 @@
+module Graphics.LambdaCube.Compositor where
+
+import Data.Maybe
+import Data.Word
+import Data.IntMap (IntMap)
+
+import Graphics.LambdaCube.Types
+import Graphics.LambdaCube.Common
+import Graphics.LambdaCube.PixelFormat
+import Graphics.LambdaCube.RenderSystem
+import Graphics.LambdaCube.Material
+import Graphics.LambdaCube.GpuProgram
+import Graphics.LambdaCube.Texture
+
+-- | Enumeration that enumerates the various composition pass types.
+data PassType
+    = PT_CLEAR          -- ^ Clear target to one colour
+    | PT_STENCIL        -- ^ Set stencil operation
+    | PT_RENDERSCENE    -- ^ Render the scene or part of it
+    | PT_RENDERQUAD     -- ^ Render a full screen quad
+
+-- | Input mode of a TargetPass
+data InputMode
+    = IM_NONE       -- ^ No input
+    | IM_PREVIOUS   -- ^ Output of previous Composition in chain
+    deriving Eq
+    
+{-| Class representing a Compositor object. Compositors provide the means 
+    to flexibly "composite" the final rendering result from multiple scene renders
+    and intermediate operations like rendering fullscreen quads. This makes 
+    it possible to apply postfilter effects, HDRI postprocessing, and shadow 
+    effects to a Viewport. -}
+data (Texture t, LinkedGpuProgram lp) => Compositor t lp
+    = Compositor
+    { cmpName                   :: String
+    , cmpTechniques             :: [CompositionTechnique t lp]
+    , cmpSupportedTechniques    :: Maybe [CompositionTechnique t lp]
+	}
+
+-- | Local texture definition
+data Texture t => TextureDefinition t
+    = TextureDefinition
+    { tdName            :: String
+    , tdWidth           :: Maybe Int        -- Nothing means adapt to target width
+    , tdHeight          :: Maybe Int        -- Nothing means adapt to target height
+    , tdWidthFactor     :: FloatType        -- multiple of target width to use (if width = Nothing)
+    , tdHeightFactor    :: FloatType        -- multiple of target height to use (if height = Nothing)
+    , tdFormatList      :: [PixelFormat]    -- more than one means MRT
+    , tdFsaa            :: Bool             -- FSAA enabled; true = determine from main target (if render_scene), false = disable
+    , tdHwGammaWrite    :: Bool             -- Do sRGB gamma correction on write (only 8-bit per channel formats) 
+    , tdShared          :: Bool             -- whether to use shared textures for this one
+    , tdTexture         :: Maybe t
+    }
+
+data InputTex
+    = InputTex
+    { itName        :: String   -- ^ Name (local) of the input texture
+    , itMrtIndex    :: Int      -- ^ MRT surface index if applicable
+    }
+
+data (Texture t, LinkedGpuProgram lp) => CompositionTechnique t lp
+    = CompositionTechnique
+    { ctTextureDefinitions  :: [TextureDefinition t]        -- ^ Local texture definitions
+    , ctTargetPasses        :: [CompositionTargetPass t lp] -- ^ Intermediate target passes
+    , ctOutputTarget        :: CompositionTargetPass t lp   -- ^ Output target pass (can be only one)
+    , ctSchemeName          :: String                       -- ^ Optional scheme name
+    }
+
+-- | Object representing one render to a RenderTarget or Viewport in the Ogre Composition framework.
+data (Texture t, LinkedGpuProgram lp) => CompositionTargetPass t lp
+    = CompositionTargetPass
+    { ctpInputMode      :: InputMode                    -- ^ Input name
+    , ctpOutputName     :: String                       -- ^ (local) output texture
+    , ctpOutput         :: Maybe (TextureDefinition t)
+    , ctpPasses         :: [CompositionPass t lp]       -- ^ Passes
+    , ctpOnlyInitial    :: Bool                         -- ^ This target pass is only executed initially after the effect has been enabled.
+    , ctpVisibilityMask :: Word32                       -- ^ Visibility mask for this render
+    , ctpLodBias        :: FloatType                    -- ^ LOD bias of this render
+    , ctpMaterialScheme :: String                       -- ^ Material scheme name
+    , ctpShadowsEnabled :: Bool                         -- ^ Shadows option
+    }
+
+{-| Object representing one pass or operation in a composition sequence. This provides a 
+    method to conveniently interleave RenderSystem commands between Render Queues. -}
+data (Texture t, LinkedGpuProgram lp) => CompositionPass t lp
+    = CompositionPass
+    { cpType                        :: PassType         -- ^ Type of composition pass
+    , cpIdentifier                  :: Word32           -- ^ Identifier for this pass
+    , cpMaterialName                :: String           -- ^ Material used for rendering
+    , cpMaterial                    :: Maybe (Material t lp)
+    , cpFirstRenderQueue            :: Int              -- ^ [first,last] render queue to render this pass (in case of PT_RENDERSCENE)
+    , cpLastRenderQueue             :: Int
+    , cpClearBuffers                :: (Bool,Bool,Bool) -- ^ Clear buffers (in case of PT_CLEAR), hint: [colour] [depth] [stencil]
+    , cpClearColour                 :: ColourValue      -- ^ Clear colour (in case of PT_CLEAR)
+    , cpClearDepth                  :: FloatType        -- ^ Clear depth (in case of PT_CLEAR)
+    , cpClearStencil                :: Word32           -- ^ Clear stencil value (in case of PT_CLEAR)
+    , cpInputs                      :: IntMap InputTex  -- ^ Inputs (for material used for rendering the quad)
+    , cpStencilCheck                :: Bool             -- ^ Stencil operation parameters
+    , cpStencilFunc                 :: CompareFunction
+    , cpStencilRefValue             :: Word32
+    , cpStencilMask                 :: Word32
+    , cpStencilFailOp               :: StencilOperation
+    , cpStencilDepthFailOp          :: StencilOperation
+    , cpStencilPassOp               :: StencilOperation
+    , cpStencilTwoSidedOperation    :: Bool
+    , cpQuadCornerModified          :: Bool             -- ^ true if quad should not cover whole screen
+    , cpQuadLeft                    :: FloatType        -- ^ quad positions in normalised coordinates [-1;1]x[-1;1] (in case of PT_RENDERQUAD)
+    , cpQuadTop                     :: FloatType
+    , cpQuadRight                   :: FloatType
+    , cpQuadBottom                  :: FloatType
+    , cpQuadFarCorners              :: Bool
+    , cpQuadFarCornersViewSpace     :: Bool
+    }
+{-        
+data CompositionPass
+    = CompositionRenderQuadPass
+    , rqInput    :: (Int, String, Int)
+    }
+-}
+--compileCompositor
+
diff --git a/Graphics/LambdaCube/Entity.hs b/Graphics/LambdaCube/Entity.hs
new file mode 100644
--- /dev/null
+++ b/Graphics/LambdaCube/Entity.hs
@@ -0,0 +1,228 @@
+{-# LANGUAGE FlexibleInstances, MultiParamTypeClasses #-}
+module Graphics.LambdaCube.Entity where
+
+import Data.Map (Map)
+import qualified Data.Map as Map
+import Data.Maybe
+--import qualified Data.Set as Set
+
+import Graphics.LambdaCube.Types
+import Graphics.LambdaCube.Mesh
+import Graphics.LambdaCube.AnimationState
+import Graphics.LambdaCube.VertexIndexData
+import Graphics.LambdaCube.Material
+import Graphics.LambdaCube.RenderQueue
+import Graphics.LambdaCube.RenderSystem
+import Graphics.LambdaCube.RenderOperation
+import Graphics.LambdaCube.Technique
+import Graphics.LambdaCube.HardwareVertexBuffer
+import Graphics.LambdaCube.HardwareIndexBuffer
+import Graphics.LambdaCube.Texture
+import Graphics.LambdaCube.GpuProgram
+
+{-| Utility class which defines the sub-parts of an Entity.
+    @remarks
+        Just as meshes are split into submeshes, an Entity is made up of
+        potentially multiple SubMeshes. These are mainly here to provide the
+        link between the Material which the SubEntity uses (which may be the
+        default Material for the SubMesh or may have been changed for this
+        object) and the SubMesh data.
+    @par
+        The SubEntity also allows the application some flexibility in the
+        material properties for this section of a particular instance of this
+        Mesh, e.g. tinting the windows on a car model.
+    @par
+        SubEntity instances are never created manually. They are created at
+        the same time as their parent Entity by the SceneManager method
+        createEntity.
+-}
+data (HardwareVertexBuffer vb, HardwareIndexBuffer ib, Texture t, LinkedGpuProgram lp) => SubEntity vb ib t lp
+    = SubEntity
+    { seMaterial                        :: Material t lp  -- ^ Cached pointer to material.
+    , seSubMesh                         :: SubMesh vb ib  -- ^ Pointer to the SubMesh defining geometry.
+--    , seVisible                         :: Bool         -- ^ Is this SubEntity visible?
+--    , seMaterialLodIndex                :: Int          -- ^ The LOD number of the material to use, calculated by Entity::_notifyCurrentCamera
+--    , seSkelAnimVertexData              :: VertexData   -- ^ blend buffer details for dedicated geometry
+    -- | Quick lookup of buffers
+    -- TODO: TempBlendedBufferInfo mTempSkelAnimInfo;
+    -- | Temp buffer details for software Vertex anim geometry
+    -- TODO: TempBlendedBufferInfo mTempVertexAnimInfo;
+--    , seSoftwareVertexAnimVertexData    :: VertexData   -- ^ Vertex data details for software Vertex anim of shared geometry
+    {-| Vertex data details for hardware Vertex anim of shared geometry
+        - separate since we need to s/w anim for shadows whilst still altering
+          the vertex data for hardware morphing (pos2 binding)
+    -}
+--    , seHardwareVertexAnimVertexData    :: VertexData
+--    , seVertexAnimationAppliedThisFrame :: Bool         -- ^ Have we applied any vertex animation to geometry?
+--    , seHardwarePoseCount               :: Int          -- ^ Number of hardware blended poses supported by material
+    -- | Cached distance to last camera for getSquaredViewDepth
+    -- TODO: , seCachedCameraDist       :: FloatType
+    -- | The camera for which the cached distance is valid
+    -- TODO: , seCachedCamera           :: Camera
+    }
+
+{-| Defines an instance of a discrete, movable object based on a Mesh.
+@remarks
+Ogre generally divides renderable objects into 2 groups, discrete
+(separate) and relatively small objects which move around the world,
+and large, sprawling geometry which makes up generally immovable
+scenery, aka 'level geometry'.
+@par
+The Mesh and SubMesh classes deal with the definition of the geometry
+used by discrete movable objects. Entities are actual instances of
+objects based on this geometry in the world. Therefore there is
+usually a single set Mesh for a car, but there may be multiple
+entities based on it in the world. Entities are able to override
+aspects of the Mesh it is defined by, such as changing material
+properties per instance (so you can have many cars using the same
+geometry but different textures for example). Because a Mesh is split
+into SubMeshes for this purpose, the Entity class is a grouping class
+(much like the Mesh class) and much of the detail regarding
+individual changes is kept in the SubEntity class. There is a 1:1
+relationship between SubEntity instances and the SubMesh instances
+associated with the Mesh the Entity is based on.
+@par
+Entity and SubEntity classes are never created directly. Use the
+createEntity method of the SceneManager (passing a model name) to
+create one.
+@par
+Entities are included in the scene by associating them with a
+SceneNode, using the attachEntity method. See the SceneNode class
+for full information.
+@note
+No functions were declared virtual to improve performance.
+-}
+---------- new code below -----------
+		{-| Nested class to allow entity shadows. -}
+        {-
+		class _OgreExport EntityShadowRenderable : public ShadowRenderable
+		{
+		protected:
+			Entity* mParent;
+			-- Shared link to position buffer
+			HardwareVertexBufferSharedPtr mPositionBuffer;
+			-- Shared link to w-coord buffer (optional)
+			HardwareVertexBufferSharedPtr mWBuffer;
+			-- Link to current vertex data used to bind (maybe changes)
+			const VertexData* mCurrentVertexData;
+			-- Original position buffer source binding
+			unsigned short mOriginalPosBufferBinding;
+			-- | Link to SubEntity, only present if SubEntity has it's own geometry
+			SubEntity* mSubEntity;
+
+
+		public:
+			EntityShadowRenderable(Entity* parent,
+				HardwareIndexBufferSharedPtr* indexBuffer, const VertexData* vertexData,
+				bool createSeparateLightCap, SubEntity* subent, bool isLightCap = false);
+			~EntityShadowRenderable();
+			-- | Overridden from ShadowRenderable
+			void getWorldTransforms(Matrix4* xform) const;
+			HardwareVertexBufferSharedPtr getPositionBuffer(void) { return mPositionBuffer; }
+			HardwareVertexBufferSharedPtr getWBuffer(void) { return mWBuffer; }
+			-- | Rebind the source positions (for temp buffer users)
+			void rebindPositionBuffer(const VertexData* vertexData, bool force);
+			-- | Overridden from ShadowRenderable
+			bool isVisible(void) const;
+
+		};
+    -}
+-- | Identify which vertex data we should be sending to the renderer
+data VertexDataBindChoice
+    = BIND_ORIGINAL
+    | BIND_SOFTWARE_SKELETAL
+    | BIND_SOFTWARE_MORPH
+    | BIND_HARDWARE_MORPH
+
+data (HardwareVertexBuffer vb, HardwareIndexBuffer ib, Texture t, LinkedGpuProgram lp) => Entity vb ib t lp
+    = Entity
+    {
+    -- MovableObject attributes
+    -- TODO: add all attrs
+      enName                                :: String
+    , enRenderQueue                         :: Int 
+    
+    -- Own attributes 
+    , enMesh                                :: Mesh vb ib
+    , enSubEntityList                       :: [SubEntity vb ib t lp]
+-- TODO    , enAnimationState                      :: AnimationStateSet        -- ^ State of animation for animable meshes
+-- TODO    , enTempSkelAnimInfo                    :: TempBlendedBufferInfo    -- ^ Temp buffer details for software skeletal anim of shared geometry
+-- TODO    , enSkelAnimVertexData                  :: VertexData               -- ^ Vertex data details for software skeletal anim of shared geometry
+-- TODO    , enTempVertexAnimInfo                  :: TempBlendedBufferInfo    -- ^ Temp buffer details for software vertex anim of shared geometry
+-- TODO    , enSoftwareVertexAnimVertexData        :: VertexData               -- ^ Vertex data details for software vertex anim of shared geometry
+    -- | Vertex data details for hardware vertex anim of shared geometry
+    -- | - separate since we need to s/w anim for shadows whilst still altering
+    -- |   the vertex data for hardware morphing (pos2 binding)
+-- TODO    , enHardwareVertexAnimVertexData        :: VertexData
+-- TODO    , enVertexAnimationAppliedThisFrame     :: Bool                     -- ^ Have we applied any vertex animation to shared geometry?
+--    , enPreparedForShadowVolumes            :: Bool                     -- ^ Have the temp buffers already had their geometry prepared for use in rendering shadow volumes?
+-- TODO    , enBoneWorldMatrices                   :: Matrix4                  -- ^ Cached bone matrices, including any world transform
+
+-- TODO    , enBoneMatrices                        :: Matrix4                  -- ^ Cached bone matrices in skeleton local space, might shares with other entity instances.
+-- TODO    , enNumBoneMatrices                     :: Int
+--    , enFrameAnimationLastUpdated           :: Int                      -- ^ Records the last frame in which animation was updated
+    
+    -- | Records the last frame in which the bones was updated
+    -- | It's a pointer because it can be shared between different entities with
+    -- | a shared skeleton.
+--    , enFrameBonesLastUpdated               :: Int
+    
+    {-|
+    * A set of all the entities which shares a single SkeletonInstance.
+    * This is only created if the entity is in fact sharing it's SkeletonInstance with
+    * other Entities.
+    -}
+-- TODO    , enSharedSkeletonEntities              :: Set Entity
+    
+-- TODO    , enDisplaySkeleton                     :: Bool                     -- ^ Flag determines whether or not to display skeleton
+-- TODO    , enHardwareAnimation                   :: Bool                     -- ^ Flag indicating whether hardware animation is supported by this entities materials
+-- TODO    , enHardwarePoseCount                   :: Bool                     -- ^ Number of hardware poses supported by materials
+--    , enVertexProgramInUse                  :: Bool                     -- ^ Flag indicating whether we have a vertex program in use on any of our subentities
+-- TODO    , enSoftwareAnimationRequests           :: Int                      -- ^ Counter indicating number of requests for software animation.
+-- TODO    , enSoftwareAnimationNormalsRequests    :: Int                      -- ^ Counter indicating number of requests for software blended normals.
+-- TODO    , enSkipAnimStateUpdates                :: Bool                     -- ^ Flag indicating whether to skip automatic updating of the Skeleton's AnimationState
+    
+--    , enMeshLodIndex                        :: Int                      -- ^ The LOD number of the mesh to use, calculated by _notifyCurrentCamera
+    
+--    , enMeshLodFactorTransformed            :: FloatType                -- ^ LOD bias factor, transformed for optimisation when calculating adjusted lod value
+--    , enMinMeshLodIndex                     :: Int                      -- ^ Index of minimum detail LOD (NB higher index is lower detail)
+--    , enMaxMeshLodIndex                     :: Int                      -- ^ Index of maximum detail LOD (NB lower index is higher detail)
+    
+--    , enMaterialLodFactor                   :: FloatType                -- ^ LOD bias factor, not transformed
+--    , enMaterialLodFactorTransformed        :: FloatType                -- ^ LOD bias factor, transformed for optimisation when calculating adjusted lod value
+--    , enMinMaterialLodIndex                 :: Int                      -- ^ Index of minimum detail LOD (NB higher index is lower detail)
+--    , enMaxMaterialLodIndex                 :: Int                      -- ^ Index of maximum detail LOD (NB lower index is higher detail)
+    
+    {-| List of LOD Entity instances (for manual LODs).
+    We don't know when the mesh is using manual LODs whether one LOD to the next will have the
+    same number of SubMeshes, therefore we have to allow a separate Entity list
+    with each alternate one.
+    -}
+--    , enLodEntityList                       :: [Entity]
+    -- TODO: , enSkeletonInstance                    :: SkeletonInstance         -- ^ This Entity's personal copy of the skeleton, if skeletally animated
+--    , enInitialised                         :: Bool                     -- ^ Has this entity been initialised yet?
+--    , enLastParentXform                     :: Matrix4                  -- ^ Last parent xform
+--    , enMeshStateCount                      :: Int                      -- ^ Mesh state count, used to detect differences
+    -- TODO: , enChildObjectList                     :: Map String MovableObject -- ^ Contains the child objects (attached to bones) indexed by name
+    -- TODO: , enFullBoundingBox                     :: AxisAlignedBox           -- ^ Bounding box that 'contains' all the mesh of each child entity
+    -- TODO: , enShadowRenderables                   :: [ShadowRenderable]
+    }
+
+instance (HardwareVertexBuffer vb, HardwareIndexBuffer ib, Texture t, LinkedGpuProgram lp) => Renderable (Entity vb ib t lp) vb ib t lp where
+    prepare = prepareEntity
+
+prepareEntity m ent = map mkRenderEntity (enSubEntityList ent)
+  where
+    mkRenderEntity e = RenderEntity
+        { rePassList    = fromMaybe [] (fmap (tchPasses . head) (mtSupportedTechniques (seMaterial e)))
+        , reOperation   = mkOperation . seSubMesh $ e
+        , reMatrix      = m
+        }
+
+    mkOperation sm = RenderOperation
+        { roVertexData      = case smVertexData sm of
+                                Just vd -> vd
+                                Nothing -> fromMaybe (error "fromJust 11") . msSharedVertexData . enMesh $ ent
+        , roOperationType   = smOperationType sm
+        , roIndexData       = smIndexData sm
+        }
diff --git a/Graphics/LambdaCube/Frustum.hs b/Graphics/LambdaCube/Frustum.hs
new file mode 100644
--- /dev/null
+++ b/Graphics/LambdaCube/Frustum.hs
@@ -0,0 +1,153 @@
+module Graphics.LambdaCube.Frustum where
+
+import Graphics.LambdaCube.Types
+
+{-
+class Plane  
+{
+public:
+
+	Vec3 normal,point;
+	float d;
+
+	void set3Points( Vec3 &v1,  Vec3 &v2,  Vec3 &v3);
+	float distance(Vec3 &p);
+};
+
+void Plane::set3Points( Vec3 &v1,  Vec3 &v2,  Vec3 &v3) {
+
+	Vec3 aux1, aux2;
+
+	aux1 = v1 - v2;
+	aux2 = v3 - v2;
+
+	normal = aux2 * aux1;
+
+	normal.normalize();
+	point.copy(v2);
+	d = -(normal.innerProduct(point));
+}
+
+float Plane::distance(Vec3 &p) {
+
+	return (d + normal.innerProduct(p));
+}
+
+class FrustumG 
+{
+private:
+
+	enum {
+		TOP = 0,
+		BOTTOM,
+		LEFT,
+		RIGHT,
+		NEARP,
+		FARP
+	};
+public:
+
+	static enum {OUTSIDE, INTERSECT, INSIDE};
+
+	Plane pl[6];
+
+	Vec3 ntl,ntr,nbl,nbr,ftl,ftr,fbl,fbr;
+	float nearD, farD, ratio, angle,tang;
+	float nw,nh,fw,fh;
+
+	void FrustumG::setCamInternals(float angle, float ratio, float nearD, float farD);
+	void FrustumG::setCamDef(Vec3 &p, Vec3 &l, Vec3 &u);
+	int FrustumG::pointInFrustum(Vec3 &p);
+	int FrustumG::sphereInFrustum(Vec3 &p, float raio);
+	int FrustumG::boxInFrustum(AABox &b);
+};
+
+#define ANG2RAD 3.14159265358979323846/180.0
+
+void FrustumG::setCamInternals(float angle, float ratio, float nearD, float farD) {
+
+	this->ratio = ratio;
+	this->angle = angle;
+	this->nearD = nearD;
+	this->farD = farD;
+
+	tang = (float)tan(angle* ANG2RAD * 0.5) ;
+	nh = nearD * tang;
+	nw = nh * ratio; 
+	fh = farD  * tang;
+	fw = fh * ratio;
+}
+
+void FrustumG::setCamDef(Vec3 &p, Vec3 &l, Vec3 &u) {
+
+	Vec3 dir,nc,fc,X,Y,Z;
+
+	Z = p - l;
+	Z.normalize();
+
+	X = u * Z;
+	X.normalize();
+
+	Y = Z * X;
+
+	nc = p - Z * nearD;
+	fc = p - Z * farD;
+
+	ntl = nc + Y * nh - X * nw;
+	ntr = nc + Y * nh + X * nw;
+	nbl = nc - Y * nh - X * nw;
+	nbr = nc - Y * nh + X * nw;
+
+	ftl = fc + Y * fh - X * fw;
+	ftr = fc + Y * fh + X * fw;
+	fbl = fc - Y * fh - X * fw;
+	fbr = fc - Y * fh + X * fw;
+
+	pl[TOP].set3Points(ntr,ntl,ftl);
+	pl[BOTTOM].set3Points(nbl,nbr,fbr);
+	pl[LEFT].set3Points(ntl,nbl,fbl);
+	pl[RIGHT].set3Points(nbr,ntr,fbr);
+	pl[NEARP].set3Points(ntl,ntr,nbr);
+	pl[FARP].set3Points(ftr,ftl,fbl);
+}
+
+int FrustumG::pointInFrustum(Vec3 &p) {
+
+	int result = INSIDE;
+	for(int i=0; i < 6; i++) {
+
+		if (pl[i].distance(p) < 0)
+			return OUTSIDE;
+	}
+	return(result);
+}
+
+int FrustumG::sphereInFrustum(Vec3 &p, float raio) {
+
+	int result = INSIDE;
+	float distance;
+
+	for(int i=0; i < 6; i++) {
+		distance = pl[i].distance(p);
+		if (distance < -raio)
+			return OUTSIDE;
+		else if (distance < raio)
+			result =  INTERSECT;
+	}
+	return(result);
+}
+
+int FrustumG::boxInFrustum(AABox &b) {
+
+	int result = INSIDE;
+	for(int i=0; i < 6; i++) {
+
+		if (pl[i].distance(b.getVertexP(pl[i].normal)) < 0)
+			return OUTSIDE;
+		else if (pl[i].distance(b.getVertexN(pl[i].normal)) < 0)
+			result =  INTERSECT;
+	}
+	return(result);
+ }
+
+-}
diff --git a/Graphics/LambdaCube/GpuProgram.hs b/Graphics/LambdaCube/GpuProgram.hs
new file mode 100644
--- /dev/null
+++ b/Graphics/LambdaCube/GpuProgram.hs
@@ -0,0 +1,65 @@
+module Graphics.LambdaCube.GpuProgram where
+
+import Graphics.LambdaCube.GpuProgramParams
+
+data GpuProgramType
+    = GPT_VERTEX_PROGRAM
+    | GPT_FRAGMENT_PROGRAM
+    | GPT_GEOMETRY_PROGRAM
+    deriving Eq
+
+class Eq p => GpuProgram p
+class Eq lp => LinkedGpuProgram lp --where
+--    lgpVertexProgramName    :: lp -> String
+--    lgpFragmentProgramName  :: lp -> String
+--    lgpGeometryProgramName  :: lp -> String
+
+{-
+class GpuProgram p where
+    gpType                :: p -> GpuProgramType        -- ^ The type of the program
+    gpFilename            :: p -> String                -- ^ The name of the file to load source from (may be blank)
+    gpSource              :: p -> String                -- ^ The assembler source of the program (may be blank until file loaded)
+    gpLoadFromFile        :: p -> Bool                  -- ^ Whether we need to load source from file or not
+    gpSyntaxCode          :: p -> String                -- ^ Syntax code e.g. arbvp1, vs_2_0 etc
+    gpSkeletalAnimation   :: p -> Bool                  -- ^ Does this (vertex) program include skeletal animation?
+    gpMorphAnimation      :: p -> Bool                  -- ^ Does this (vertex) program include morph animation?
+    gpPoseAnimation       :: p -> Int                   -- ^ Does this (vertex) program include pose animation (count of number of poses supported)
+    gpVertexTextureFetch  :: p -> Bool                  -- ^ Does this (vertex) program require support for vertex texture fetch?
+    gpNeedsAdjacencyInfo  :: p -> Bool                  -- ^ Does this (geometry) program require adjacency information?
+    gpDefaultParams       :: p -> GpuProgramParameters  -- ^ The default parameters for use with this object
+    gpCompileError        :: p -> Bool                  -- ^ Did we encounter a compilation error?
+-}
+
+data GpuProgram p => GpuProgramDescriptor p
+    = GpuProgramDescriptor
+    { gpdName               :: String
+    , gpdType               :: GpuProgramType       -- ^ The type of the program
+    , gpdFilename           :: String               -- ^ The name of the file to load source from (may be blank)
+--    , gpdSource             :: String               -- ^ The assembler source of the program (may be blank until file loaded)
+--    , gpdLoadFromFile       :: Bool                 -- ^ Whether we need to load source from file or not
+    , gpdSyntaxCode         :: String               -- ^ Syntax code e.g. arbvp1, vs_2_0 etc
+    , gpdAttach             :: [String]
+    , gpdSkeletalAnimation  :: Bool                 -- ^ Does this (vertex) program include skeletal animation?
+    , gpdMorphAnimation     :: Bool                 -- ^ Does this (vertex) program include morph animation?
+    , gpdPoseAnimation      :: Int                  -- ^ Does this (vertex) program include pose animation (count of number of poses supported)
+    , gpdVertexTextureFetch :: Bool                 -- ^ Does this (vertex) program require support for vertex texture fetch?
+    , gpdNeedsAdjacencyInfo :: Bool                 -- ^ Does this (geometry) program require adjacency information?
+    , gpdDefaultParams      :: GpuProgramParameters -- ^ The default parameters for use with this object
+--    , gpdCompileError       :: Bool                 -- ^ Did we encounter a compilation error?
+    
+    , gpdGpuProgram         :: Maybe p
+    
+--		/** Record of logical to physical buffer maps. Mandatory for low-level
+--			programs or high-level programs which set their params the same way. */
+--		mutable GpuLogicalBufferStruct mFloatLogicalToPhysical;
+--		/** Record of logical to physical buffer maps. Mandatory for low-level
+--			programs or high-level programs which set their params the same way. */
+--		mutable GpuLogicalBufferStruct mIntLogicalToPhysical;
+--		/// Parameter name -> ConstantDefinition map, shared instance used by all parameter objects
+--		mutable GpuNamedConstants mConstantDefs;
+--		/// File from which to load named constants manually
+--		String mManualNamedConstantsFile;
+--		bool mLoadedManualNamedConstants;
+    
+    }
+--    deriving Eq
diff --git a/Graphics/LambdaCube/GpuProgramParams.hs b/Graphics/LambdaCube/GpuProgramParams.hs
new file mode 100644
--- /dev/null
+++ b/Graphics/LambdaCube/GpuProgramParams.hs
@@ -0,0 +1,925 @@
+module Graphics.LambdaCube.GpuProgramParams where
+
+import Data.Map (Map)
+import qualified Data.Map as Map
+import Data.Word
+
+import Graphics.LambdaCube.Types
+
+{-| Enumeration of the types of constant we may encounter in programs. 
+@note Low-level programs, by definition, will always use either
+float4 or int4 constant types since that is the fundamental underlying
+type in assembler.
+-}
+data GpuConstantType
+    = GCT_FLOAT1
+    | GCT_FLOAT2
+    | GCT_FLOAT3
+    | GCT_FLOAT4
+    | GCT_SAMPLER1D
+    | GCT_SAMPLER2D
+    | GCT_SAMPLER3D
+    | GCT_SAMPLERCUBE
+    | GCT_SAMPLER1DSHADOW
+    | GCT_SAMPLER2DSHADOW
+    | GCT_MATRIX_2X2
+    | GCT_MATRIX_2X3
+    | GCT_MATRIX_2X4
+    | GCT_MATRIX_3X2
+    | GCT_MATRIX_3X3
+    | GCT_MATRIX_3X4
+    | GCT_MATRIX_4X2
+    | GCT_MATRIX_4X3
+    | GCT_MATRIX_4X4
+    | GCT_INT1
+    | GCT_INT2
+    | GCT_INT3
+    | GCT_INT4
+    | GCT_UNKNOWN
+    deriving Eq
+
+
+{-| The variability of a GPU parameter, as derived from auto-params targetting it.
+These values must be powers of two since they are used in masks.
+-}
+data GpuParamVariability
+    = GpuParamVariability
+    { gpvGlobal                 :: Bool -- ^ No variation except by manual setting - the default
+    , gpvPerObject              :: Bool -- ^ Varies per object (based on an auto param usually), but not per light setup
+    , gpvLights                 :: Bool -- ^ Varies with light setup
+    , gpvPassIterationNumber    :: Bool -- ^ Varies with pass iteration number
+    }
+    deriving Eq
+{-
+enum GpuParamVariability
+{
+	
+	GPV_GLOBAL = 1, 
+	-- |
+	GPV_PER_OBJECT = 2, 
+	-- |Varies with light setup
+	GPV_LIGHTS = 4, 
+	-- |Varies with pass iteration number
+	GPV_PASS_ITERATION_NUMBER = 8,
+
+
+	-- |Full mask (16-bit)
+	GPV_ALL = 0xFFFF
+
+};
+-}
+
+{-| Information about predefined program constants. 
+@note Only available for high-level programs but is referenced generically
+by GpuProgramParameters.
+-}
+data GpuConstantDefinition
+    = GpuConstantDefinition
+    { gcdConstType      :: GpuConstantType      -- ^ Data type
+    , gcdPhysicalIndex  :: Int                  -- ^ Physical start index in buffer (either float or int buffer)
+    , gcdLogicalIndex   :: Int                  -- ^ Logical index - used to communicate this constant to the rendersystem
+    {-| Number of raw buffer slots per element 
+    (some programs pack each array element to float4, some do not) -}
+    , gcdElementSize    :: Int
+    , gcdArraySize      :: Int                  -- ^ Length of array
+    , gcdVariability    :: GpuParamVariability  -- ^ How this parameter varies (bitwise combination of GpuProgramVariability)
+    }
+    deriving Eq
+
+isFloat :: GpuConstantType -> Bool
+isFloat c = case c of
+    { GCT_INT1              -> False
+    ; GCT_INT2              -> False
+    ; GCT_INT3              -> False
+    ; GCT_INT4              -> False
+    ; GCT_SAMPLER1D         -> False
+    ; GCT_SAMPLER2D         -> False
+    ; GCT_SAMPLER3D         -> False
+    ; GCT_SAMPLERCUBE       -> False
+    ; GCT_SAMPLER1DSHADOW   -> False
+    ; GCT_SAMPLER2DSHADOW   -> False
+    ; _                     -> True
+    }
+
+isSampler :: GpuConstantType -> Bool
+isSampler c = case c of
+    {
+    ; GCT_SAMPLER1D         -> True
+    ; GCT_SAMPLER2D         -> True
+    ; GCT_SAMPLER3D         -> True
+    ; GCT_SAMPLERCUBE       -> True
+    ; GCT_SAMPLER1DSHADOW   -> True
+    ; GCT_SAMPLER2DSHADOW   -> True
+    ; _                     -> False
+    }
+
+{-| Get the element size of a given type, including whether to pad the 
+	elements into multiples of 4 (e.g. SM1 and D3D does, GLSL doesn't)
+-}
+getElementSize :: GpuConstantType -> Bool -> Int
+getElementSize ctype padToMultiplesOf4 = case padToMultiplesOf4 of
+    { True  -> case ctype of
+        { GCT_FLOAT1            -> 4
+        ; GCT_INT1              -> 4
+        ; GCT_SAMPLER1D         -> 4
+        ; GCT_SAMPLER2D         -> 4
+        ; GCT_SAMPLER3D         -> 4
+        ; GCT_SAMPLERCUBE       -> 4
+        ; GCT_SAMPLER1DSHADOW   -> 4
+        ; GCT_SAMPLER2DSHADOW   -> 4
+        ; GCT_FLOAT2            -> 4
+        ; GCT_INT2              -> 4
+        ; GCT_FLOAT3            -> 4
+        ; GCT_INT3              -> 4
+        ; GCT_FLOAT4            -> 4
+        ; GCT_INT4              -> 4
+        ; GCT_MATRIX_2X2        -> 8
+        ; GCT_MATRIX_2X3        -> 8
+        ; GCT_MATRIX_2X4        -> 8
+        ; GCT_MATRIX_3X2        -> 12
+        ; GCT_MATRIX_3X3        -> 12
+        ; GCT_MATRIX_3X4        -> 12
+        ; GCT_MATRIX_4X2        -> 16
+        ; GCT_MATRIX_4X3        -> 16
+        ; GCT_MATRIX_4X4        -> 16
+        ; _                     -> 4
+        }
+    ; False -> case ctype of
+        {
+        ; GCT_FLOAT1            -> 1
+        ; GCT_INT1              -> 1
+        ; GCT_SAMPLER1D         -> 1
+        ; GCT_SAMPLER2D         -> 1
+        ; GCT_SAMPLER3D         -> 1
+        ; GCT_SAMPLERCUBE       -> 1
+        ; GCT_SAMPLER1DSHADOW   -> 1
+        ; GCT_SAMPLER2DSHADOW   -> 1
+        ; GCT_FLOAT2            -> 2
+        ; GCT_INT2              -> 2
+        ; GCT_FLOAT3            -> 3
+        ; GCT_INT3              -> 3
+        ; GCT_FLOAT4            -> 4
+        ; GCT_INT4              -> 4
+        ; GCT_MATRIX_2X2        -> 4
+        ; GCT_MATRIX_2X3        -> 6
+        ; GCT_MATRIX_3X2        -> 6
+        ; GCT_MATRIX_2X4        -> 8
+        ; GCT_MATRIX_4X2        -> 8
+        ; GCT_MATRIX_3X3        -> 9
+        ; GCT_MATRIX_3X4        -> 12
+        ; GCT_MATRIX_4X3        -> 12
+        ; GCT_MATRIX_4X4        -> 16
+        ; _                     -> 4
+        }
+    }
+
+-- | Struct collecting together the information for named constants.
+data GpuNamedConstants
+    = GpuNamedConstants
+    { gncFloatBufferSize                            :: Int                              -- ^ Total size of the float buffer required
+    , gncIntBufferSize                              :: Int                              -- ^ Total size of the int buffer required
+    , gncMap                                        :: Map String GpuConstantDefinition -- ^ Map of parameter names to GpuConstantDefinition
+	{-| Indicates whether all array entries will be generated and added to the definitions map
+	@remarks
+	Normally, the number of array entries added to the definitions map is capped at 16
+	to save memory. Setting this value to <code>true</code> allows all of the entries
+	to be generated and added to the map.
+	-}
+    , gncGenerateAllConstantDefinitionArrayEntries  :: Bool
+    }
+    deriving Eq
+
+{-| Structure recording the use of a physical buffer by a logical parameter
+index. Only used for low-level programs.
+-}
+data GpuLogicalIndexUse
+    = GpuLogicalIndexUse
+    { gliPhysicalIndex  :: Int      -- ^ Physical buffer index
+    , gliCurrentSize    :: Int      -- ^ Current physical size allocation
+    , gliVariability    :: Word16   -- ^ How the contents of this slot vary
+    }
+    deriving Eq
+
+-- | Container struct to allow params to safely & update shared list of logical buffer assignments
+data GpuLogicalBufferStruct
+    = GpuLogicalBufferStruct
+    { gluMap        :: Map Int GpuLogicalIndexUse   -- ^ Map from logical index to physical buffer location
+    , gluBufferSize :: Int                          -- ^ Shortcut to know the buffer size needs
+    }
+    deriving Eq
+
+{-| A group of manually updated parameters that are shared between many parameter sets.
+@remarks
+	Sometimes you want to set some common parameters across many otherwise 
+	different parameter sets, and keep them all in sync together. This class
+	allows you to define a set of parameters that you can share across many
+	parameter sets and have the parameters that match automatically be pulled
+	from the shared set, rather than you having to set them on all the parameter
+	sets individually.
+@par
+	Parameters in a shared set are matched up with instances in a GpuProgramParameters
+	structure by matching names. It is up to you to define the named parameters
+	that a shared set contains, and ensuring the definition matches.
+@note
+	Shared parameter sets can be named, and looked up using the GpuProgramManager.
+-}
+data GpuSharedParameters
+    = GpuSharedParameters
+    { gspNamedConstants     :: GpuNamedConstants
+    , gspFloatConstants     :: [Float]
+    , gspIntConstants       :: [Int]
+    , gspName               :: String
+	-- Optional data the rendersystem might want to store
+    --mutable Any mRenderSystemData;
+
+    , gspFrameLastUpdated   :: Int  -- ^ Not used when copying data, but might be useful to RS using shared buffers
+    , gspVersion            :: Int  -- ^ Version number of the definitions in this buffer
+    }
+    deriving Eq
+
+-- list of physical mappings that we are going to bring in
+data CopyDataEntry
+    = CopyDataEntry
+    { cdeSrcDefinition  :: GpuConstantDefinition
+    , cdeDstDefinition  :: GpuConstantDefinition
+    }
+    deriving Eq
+
+{-| This class records the usage of a set of shared parameters in a concrete
+	set of GpuProgramParameters.
+-}
+data GpuSharedParametersUsage
+    = GpuSharedParametersUsage
+    { spuSharedParams       :: GpuSharedParameters
+--    , spuParams             :: GpuProgramParameters -- ^ Not a shared pointer since this is also parent
+    , spuCopyDataList       :: [CopyDataEntry]
+	-- Optional data the rendersystem might want to store
+--    mutable Any mRenderSystemData;
+    , spuCopyDataVersion    :: Int  -- ^ Version of shared params we based the copydata on
+    }
+    deriving Eq
+    
+{-| Defines the types of automatically updated values that may be bound to GpuProgram
+parameters, or used to modify parameters on a per-object basis.
+-}
+data AutoConstantType
+    = ACT_WORLD_MATRIX -- ^ The current world matrix
+    | ACT_INVERSE_WORLD_MATRIX -- ^ The current world matrix, inverted
+    {-|Provides transpose of world matrix.
+       Equivalent to RenderMonkey's "WorldTranspose".
+    -}
+    | ACT_TRANSPOSE_WORLD_MATRIX
+    | ACT_INVERSE_TRANSPOSE_WORLD_MATRIX -- ^ The current world matrix, inverted & transposed
+
+
+    | ACT_WORLD_MATRIX_ARRAY_3x4 -- ^ The current array of world matrices, as a 3x4 matrix, used for blending
+    | ACT_WORLD_MATRIX_ARRAY -- ^ The current array of world matrices, used for blending
+
+    | ACT_VIEW_MATRIX -- ^ The current view matrix
+    | ACT_INVERSE_VIEW_MATRIX -- ^ The current view matrix, inverted
+    {-|Provides transpose of view matrix.
+    Equivalent to RenderMonkey's "ViewTranspose".
+    -}
+    | ACT_TRANSPOSE_VIEW_MATRIX
+    {-|Provides inverse transpose of view matrix.
+    Equivalent to RenderMonkey's "ViewInverseTranspose".
+    -}
+    | ACT_INVERSE_TRANSPOSE_VIEW_MATRIX
+
+
+    | ACT_PROJECTION_MATRIX -- ^ The current projection matrix
+    {-|Provides inverse of projection matrix.
+    Equivalent to RenderMonkey's "ProjectionInverse".
+    -}
+    | ACT_INVERSE_PROJECTION_MATRIX
+    {-|Provides transpose of projection matrix.
+    Equivalent to RenderMonkey's "ProjectionTranspose".
+    -}
+    | ACT_TRANSPOSE_PROJECTION_MATRIX
+    {-|Provides inverse transpose of projection matrix.
+    Equivalent to RenderMonkey's "ProjectionInverseTranspose".
+    -}
+    | ACT_INVERSE_TRANSPOSE_PROJECTION_MATRIX
+
+
+    | ACT_VIEWPROJ_MATRIX -- ^ The current view & projection matrices concatenated
+    {-|Provides inverse of concatenated view and projection matrices.
+    Equivalent to RenderMonkey's "ViewProjectionInverse".
+    -}
+    | ACT_INVERSE_VIEWPROJ_MATRIX
+    {-|Provides transpose of concatenated view and projection matrices.
+    Equivalent to RenderMonkey's "ViewProjectionTranspose".
+    -}
+    | ACT_TRANSPOSE_VIEWPROJ_MATRIX
+    {-|Provides inverse transpose of concatenated view and projection matrices.
+    Equivalent to RenderMonkey's "ViewProjectionInverseTranspose".
+    -}
+    | ACT_INVERSE_TRANSPOSE_VIEWPROJ_MATRIX
+
+
+    | ACT_WORLDVIEW_MATRIX -- ^ The current world & view matrices concatenated
+    | ACT_INVERSE_WORLDVIEW_MATRIX -- ^ The current world & view matrices concatenated, then inverted
+    {-|Provides transpose of concatenated world and view matrices.
+    Equivalent to RenderMonkey's "WorldViewTranspose".
+    -}
+    | ACT_TRANSPOSE_WORLDVIEW_MATRIX
+    | ACT_INVERSE_TRANSPOSE_WORLDVIEW_MATRIX -- ^ The current world & view matrices concatenated, then inverted & transposed
+    -- |view matrices.
+
+
+    | ACT_WORLDVIEWPROJ_MATRIX -- ^ The current world, view & projection matrices concatenated
+    {-|Provides inverse of concatenated world, view and projection matrices.
+    Equivalent to RenderMonkey's "WorldViewProjectionInverse".
+    -}
+    | ACT_INVERSE_WORLDVIEWPROJ_MATRIX
+    {-|Provides transpose of concatenated world, view and projection matrices.
+    Equivalent to RenderMonkey's "WorldViewProjectionTranspose".
+    -}
+    | ACT_TRANSPOSE_WORLDVIEWPROJ_MATRIX
+    {-|Provides inverse transpose of concatenated world, view and projection
+    matrices. Equivalent to RenderMonkey's "WorldViewProjectionInverseTranspose".
+    -}
+    | ACT_INVERSE_TRANSPOSE_WORLDVIEWPROJ_MATRIX
+
+
+    -- |render target related values
+    {-|-1 if requires texture flipping, +1 otherwise. It's useful when you bypassed
+    projection matrix transform, still able use this value to adjust transformed y position.
+    -}
+    | ACT_RENDER_TARGET_FLIPPING
+
+
+    | ACT_FOG_COLOUR -- ^ Fog colour
+    | ACT_FOG_PARAMS -- ^ Fog params: density, linear start, linear end, 1/(end-start)
+
+
+    | ACT_SURFACE_AMBIENT_COLOUR -- ^ Surface ambient colour, as set in Pass::setAmbient
+    | ACT_SURFACE_DIFFUSE_COLOUR -- ^ Surface diffuse colour, as set in Pass::setDiffuse
+    | ACT_SURFACE_SPECULAR_COLOUR -- ^ Surface specular colour, as set in Pass::setSpecular
+    | ACT_SURFACE_EMISSIVE_COLOUR -- ^ Surface emissive colour, as set in Pass::setSelfIllumination
+    | ACT_SURFACE_SHININESS -- ^ Surface shininess, as set in Pass::setShininess
+
+
+    | ACT_LIGHT_COUNT -- ^ The number of active light sources (better than gl_MaxLights)
+
+
+    | ACT_AMBIENT_LIGHT_COLOUR -- ^ The ambient light colour set in the scene
+
+    | ACT_LIGHT_DIFFUSE_COLOUR -- ^ Light diffuse colour (index determined by setAutoConstant call)
+    | ACT_LIGHT_SPECULAR_COLOUR -- ^ Light specular colour (index determined by setAutoConstant call)
+    | ACT_LIGHT_ATTENUATION -- ^ Light attenuation parameters, Vector4(range, constant, linear, quadric)
+    {-|Spotlight parameters, Vector4(innerFactor, outerFactor, falloff, isSpot)
+    innerFactor and outerFactor are cos(angle/2)
+    The isSpot parameter is 0.0f for non-spotlights, 1.0f for spotlights.
+    Also for non-spotlights the inner and outer factors are 1 and nearly 1 respectively
+    -} 
+    | ACT_SPOTLIGHT_PARAMS
+    | ACT_LIGHT_POSITION -- ^ A light position in world space (index determined by setAutoConstant call)
+    | ACT_LIGHT_POSITION_OBJECT_SPACE -- ^ A light position in object space (index determined by setAutoConstant call)
+    | ACT_LIGHT_POSITION_VIEW_SPACE -- ^ A light position in view space (index determined by setAutoConstant call)
+    | ACT_LIGHT_DIRECTION -- ^ A light direction in world space (index determined by setAutoConstant call)
+    | ACT_LIGHT_DIRECTION_OBJECT_SPACE -- ^ A light direction in object space (index determined by setAutoConstant call)
+    | ACT_LIGHT_DIRECTION_VIEW_SPACE -- ^ A light direction in view space (index determined by setAutoConstant call)
+    {-|The distance of the light from the center of the object
+    a useful approximation as an alternative to per-vertex distance
+    calculations.
+    -}
+    | ACT_LIGHT_DISTANCE_OBJECT_SPACE
+    {-|Light power level, a single scalar as set in Light::setPowerScale  (index determined by setAutoConstant call) -}
+    | ACT_LIGHT_POWER_SCALE
+    -- |Light diffuse colour pre-scaled by Light::setPowerScale (index determined by setAutoConstant call)
+    | ACT_LIGHT_DIFFUSE_COLOUR_POWER_SCALED
+    -- |Light specular colour pre-scaled by Light::setPowerScale (index determined by setAutoConstant call)
+    | ACT_LIGHT_SPECULAR_COLOUR_POWER_SCALED
+    -- |Array of light diffuse colours (count set by extra param)
+    | ACT_LIGHT_DIFFUSE_COLOUR_ARRAY
+    -- |Array of light specular colours (count set by extra param)
+    | ACT_LIGHT_SPECULAR_COLOUR_ARRAY
+    -- |Array of light diffuse colours scaled by light power (count set by extra param)
+    | ACT_LIGHT_DIFFUSE_COLOUR_POWER_SCALED_ARRAY
+    -- |Array of light specular colours scaled by light power (count set by extra param)
+    | ACT_LIGHT_SPECULAR_COLOUR_POWER_SCALED_ARRAY
+    -- |Array of light attenuation parameters, Vector4(range, constant, linear, quadric) (count set by extra param)
+    | ACT_LIGHT_ATTENUATION_ARRAY
+    -- |Array of light positions in world space (count set by extra param)
+    | ACT_LIGHT_POSITION_ARRAY
+    -- |Array of light positions in object space (count set by extra param)
+    | ACT_LIGHT_POSITION_OBJECT_SPACE_ARRAY
+    -- |Array of light positions in view space (count set by extra param)
+    | ACT_LIGHT_POSITION_VIEW_SPACE_ARRAY
+    -- |Array of light directions in world space (count set by extra param)
+    | ACT_LIGHT_DIRECTION_ARRAY
+    -- |Array of light directions in object space (count set by extra param)
+    | ACT_LIGHT_DIRECTION_OBJECT_SPACE_ARRAY
+    -- |Array of light directions in view space (count set by extra param)
+    | ACT_LIGHT_DIRECTION_VIEW_SPACE_ARRAY
+    {-|Array of distances of the lights from the center of the object
+    a useful approximation as an alternative to per-vertex distance
+    calculations. (count set by extra param)
+    -}
+    | ACT_LIGHT_DISTANCE_OBJECT_SPACE_ARRAY
+    {-|Array of light power levels, a single scalar as set in Light::setPowerScale 
+    (count set by extra param)
+    -}
+    | ACT_LIGHT_POWER_SCALE_ARRAY
+    {-|Spotlight parameters array of Vector4(innerFactor, outerFactor, falloff, isSpot)
+    innerFactor and outerFactor are cos(angle/2)
+    The isSpot parameter is 0.0f for non-spotlights, 1.0f for spotlights.
+    Also for non-spotlights the inner and outer factors are 1 and nearly 1 respectively.
+    (count set by extra param)
+    -} 
+    | ACT_SPOTLIGHT_PARAMS_ARRAY
+
+    {-|The derived ambient light colour, with 'r', 'g', 'b' components filled with
+    product of surface ambient colour and ambient light colour, respectively,
+    and 'a' component filled with surface ambient alpha component.
+    -}
+    | ACT_DERIVED_AMBIENT_LIGHT_COLOUR
+    {-|The derived scene colour, with 'r', 'g' and 'b' components filled with sum
+    of derived ambient light colour and surface emissive colour, respectively,
+    and 'a' component filled with surface diffuse alpha component.
+    -}
+    | ACT_DERIVED_SCENE_COLOUR
+
+    {-|The derived light diffuse colour (index determined by setAutoConstant call),
+    with 'r', 'g' and 'b' components filled with product of surface diffuse colour,
+    light power scale and light diffuse colour, respectively, and 'a' component filled with surface
+    diffuse alpha component.
+    -}
+    | ACT_DERIVED_LIGHT_DIFFUSE_COLOUR
+    {-|The derived light specular colour (index determined by setAutoConstant call),
+    with 'r', 'g' and 'b' components filled with product of surface specular colour
+    and light specular colour, respectively, and 'a' component filled with surface
+    specular alpha component.
+    -}
+    | ACT_DERIVED_LIGHT_SPECULAR_COLOUR
+
+    -- |Array of derived light diffuse colours (count set by extra param)
+    | ACT_DERIVED_LIGHT_DIFFUSE_COLOUR_ARRAY
+    -- |Array of derived light specular colours (count set by extra param)
+    | ACT_DERIVED_LIGHT_SPECULAR_COLOUR_ARRAY
+    {-|The absolute light number of a local light index. Each pass may have
+    a number of lights passed to it, and each of these lights will have
+    an index in the overall light list, which will differ from the local
+    light index due to factors like setStartLight and setIteratePerLight.
+    This binding provides the global light index for a local index.
+    -}
+    | ACT_LIGHT_NUMBER
+    -- |Returns (int) 1 if the  given light casts shadows, 0 otherwise (index set in extra param)
+    | ACT_LIGHT_CASTS_SHADOWS
+
+
+    {-|The distance a shadow volume should be extruded when using
+    finite extrusion programs.
+    -}
+    | ACT_SHADOW_EXTRUSION_DISTANCE
+    -- |The current camera's position in world space
+    | ACT_CAMERA_POSITION
+    -- |The current camera's position in object space 
+    | ACT_CAMERA_POSITION_OBJECT_SPACE
+    -- |The view/projection matrix of the assigned texture projection frustum
+    | ACT_TEXTURE_VIEWPROJ_MATRIX
+    -- |Array of view/projection matrices of the first n texture projection frustums
+    | ACT_TEXTURE_VIEWPROJ_MATRIX_ARRAY
+    {-|The view/projection matrix of the assigned texture projection frustum, 
+    combined with the current world matrix
+    -}
+    | ACT_TEXTURE_WORLDVIEWPROJ_MATRIX
+    -- |Array of world/view/projection matrices of the first n texture projection frustums
+    | ACT_TEXTURE_WORLDVIEWPROJ_MATRIX_ARRAY
+    -- |The view/projection matrix of a given spotlight
+    | ACT_SPOTLIGHT_VIEWPROJ_MATRIX
+    {-|The view/projection matrix of a given spotlight projection frustum, 
+    combined with the current world matrix
+    -}
+    | ACT_SPOTLIGHT_WORLDVIEWPROJ_MATRIX
+    -- |A custom parameter which will come from the renderable, using 'data' as the identifier
+    | ACT_CUSTOM
+    {-|provides current elapsed time
+    -}
+    | ACT_TIME
+    {-|Single float value, which repeats itself based on given as
+    parameter "cycle time". Equivalent to RenderMonkey's "Time0_X".
+    -}
+    | ACT_TIME_0_X
+    -- |Cosine of "Time0_X". Equivalent to RenderMonkey's "CosTime0_X".
+    | ACT_COSTIME_0_X
+    -- |Sine of "Time0_X". Equivalent to RenderMonkey's "SinTime0_X".
+    | ACT_SINTIME_0_X
+    -- |Tangent of "Time0_X". Equivalent to RenderMonkey's "TanTime0_X".
+    | ACT_TANTIME_0_X
+    {-|Vector of "Time0_X", "SinTime0_X", "CosTime0_X", 
+    "TanTime0_X". Equivalent to RenderMonkey's "Time0_X_Packed".
+    -}
+    | ACT_TIME_0_X_PACKED
+    {-|Single float value, which represents scaled time value [0..1],
+    which repeats itself based on given as parameter "cycle time".
+    Equivalent to RenderMonkey's "Time0_1".
+    -}
+    | ACT_TIME_0_1
+    -- |Cosine of "Time0_1". Equivalent to RenderMonkey's "CosTime0_1".
+    | ACT_COSTIME_0_1
+    -- |Sine of "Time0_1". Equivalent to RenderMonkey's "SinTime0_1".
+    | ACT_SINTIME_0_1
+    -- |Tangent of "Time0_1". Equivalent to RenderMonkey's "TanTime0_1".
+    | ACT_TANTIME_0_1
+    {-|Vector of "Time0_1", "SinTime0_1", "CosTime0_1",
+    "TanTime0_1". Equivalent to RenderMonkey's "Time0_1_Packed".
+    -}
+    | ACT_TIME_0_1_PACKED
+    {-|Single float value, which represents scaled time value [0..2*Pi],
+    which repeats itself based on given as parameter "cycle time".
+    Equivalent to RenderMonkey's "Time0_2PI".
+    -}
+    | ACT_TIME_0_2PI
+    -- |Cosine of "Time0_2PI". Equivalent to RenderMonkey's "CosTime0_2PI".
+    | ACT_COSTIME_0_2PI
+    -- |Sine of "Time0_2PI". Equivalent to RenderMonkey's "SinTime0_2PI".
+    | ACT_SINTIME_0_2PI
+    -- |Tangent of "Time0_2PI". Equivalent to RenderMonkey's "TanTime0_2PI".
+    | ACT_TANTIME_0_2PI
+    {-|Vector of "Time0_2PI", "SinTime0_2PI", "CosTime0_2PI",
+    "TanTime0_2PI". Equivalent to RenderMonkey's "Time0_2PI_Packed".
+    -}
+    | ACT_TIME_0_2PI_PACKED
+    -- |provides the scaled frame time, returned as a floating point value.
+    | ACT_FRAME_TIME
+    -- |provides the calculated frames per second, returned as a floating point value.
+    | ACT_FPS
+    -- |viewport-related values
+    {-|Current viewport width (in pixels) as floating point value.
+    Equivalent to RenderMonkey's "ViewportWidth".
+    -}
+    | ACT_VIEWPORT_WIDTH
+    {-|Current viewport height (in pixels) as floating point value.
+    Equivalent to RenderMonkey's "ViewportHeight".
+    -}
+    | ACT_VIEWPORT_HEIGHT
+    {-|This variable represents 1.0/ViewportWidth. 
+    Equivalent to RenderMonkey's "ViewportWidthInverse".
+    -}
+    | ACT_INVERSE_VIEWPORT_WIDTH
+    {-|This variable represents 1.0/ViewportHeight.
+    Equivalent to RenderMonkey's "ViewportHeightInverse".
+    -}
+    | ACT_INVERSE_VIEWPORT_HEIGHT
+    {-|Packed of "ViewportWidth", "ViewportHeight", "ViewportWidthInverse",
+    "ViewportHeightInverse".
+    -}
+    | ACT_VIEWPORT_SIZE
+
+    -- |view parameters
+    {-|This variable provides the view direction vector (world space).
+    Equivalent to RenderMonkey's "ViewDirection".
+    -}
+    | ACT_VIEW_DIRECTION
+    {-|This variable provides the view side vector (world space).
+    Equivalent to RenderMonkey's "ViewSideVector".
+    -}
+    | ACT_VIEW_SIDE_VECTOR
+    {-|This variable provides the view up vector (world space).
+    Equivalent to RenderMonkey's "ViewUpVector".
+    -}
+    | ACT_VIEW_UP_VECTOR
+    {-|This variable provides the field of view as a floating point value.
+    Equivalent to RenderMonkey's "FOV".
+    -}
+    | ACT_FOV
+    {-|This variable provides the near clip distance as a floating point value.
+    Equivalent to RenderMonkey's "NearClipPlane".
+    -}
+    | ACT_NEAR_CLIP_DISTANCE
+    {-|This variable provides the far clip distance as a floating point value.
+    Equivalent to RenderMonkey's "FarClipPlane".
+    -}
+    | ACT_FAR_CLIP_DISTANCE
+
+    {-|provides the pass index number within the technique
+    of the active materil.
+    -}
+    | ACT_PASS_NUMBER
+
+    {-|provides the current iteration number of the pass. The iteration
+    number is the number of times the current render operation has
+    been drawn for the active pass.
+    -}
+    | ACT_PASS_ITERATION_NUMBER
+
+
+    {-|Provides a parametric animation value [0..1], only available
+    where the renderable specifically implements it.
+    -}
+    | ACT_ANIMATION_PARAMETRIC
+
+    {-|Provides the texel offsets required by this rendersystem to map
+    texels to pixels. Packed as 
+    float4(absoluteHorizontalOffset, absoluteVerticalOffset, 
+    horizontalOffset / viewportWidth, verticalOffset / viewportHeight)
+    -}
+    | ACT_TEXEL_OFFSETS
+
+    {-|Provides information about the depth range of the scene as viewed
+    from the current camera. 
+    Passed as float4(minDepth, maxDepth, depthRange, 1 / depthRange)
+    -}
+    | ACT_SCENE_DEPTH_RANGE
+
+    {-|Provides information about the depth range of the scene as viewed
+    from a given shadow camera. Requires an index parameter which maps
+    to a light index relative to the current light list.
+    Passed as float4(minDepth, maxDepth, depthRange, 1 / depthRange)
+    -}
+    | ACT_SHADOW_SCENE_DEPTH_RANGE
+
+    {-|Provides the fixed shadow colour as configured via SceneManager::setShadowColour;
+    useful for integrated modulative shadows.
+    -}
+    | ACT_SHADOW_COLOUR
+    {-|Provides texture size of the texture unit (index determined by setAutoConstant
+    call). Packed as float4(width, height, depth, 1)
+    -}
+    | ACT_TEXTURE_SIZE
+    {-|Provides inverse texture size of the texture unit (index determined by setAutoConstant
+    call). Packed as float4(1 / width, 1 / height, 1 / depth, 1)
+    -}
+    | ACT_INVERSE_TEXTURE_SIZE
+    {-|Provides packed texture size of the texture unit (index determined by setAutoConstant
+    call). Packed as float4(width, height, 1 / width, 1 / height)
+    -}
+    | ACT_PACKED_TEXTURE_SIZE
+
+    {-|Provides the current transform matrix of the texture unit (index determined by setAutoConstant
+    call), as seen by the fixed-function pipeline. 
+    -}
+    | ACT_TEXTURE_MATRIX
+
+    {-|Provides the position of the LOD camera in world space, allowing you 
+    to perform separate LOD calculations in shaders independent of the rendering
+    camera. If there is no separate LOD camera then this is the real camera
+    position. See Camera::setLodCamera.
+    -}
+    | ACT_LOD_CAMERA_POSITION
+    {-|Provides the position of the LOD camera in object space, allowing you 
+    to perform separate LOD calculations in shaders independent of the rendering
+    camera. If there is no separate LOD camera then this is the real camera
+    position. See Camera::setLodCamera.
+    -}
+    | ACT_LOD_CAMERA_POSITION_OBJECT_SPACE
+    {-|Binds custom per-light constants to the shaders. -}
+    | ACT_LIGHT_CUSTOM
+    deriving Eq
+
+
+-- | Defines the type of the extra data item used by the auto constant.
+data ACDataType
+    = ACDT_NONE -- ^ no data is required
+    | ACDT_INT  -- ^ the auto constant requires data of type int
+    | ACDT_REAL -- ^ the auto constant requires data of type real
+    deriving Eq
+
+--  | Defines the base element type of the auto constant
+data ElementType
+    = ET_INT
+    | ET_REAL
+    deriving Eq
+
+{-| Structure defining an auto constant that's available for use in 
+a parameters object.
+-}
+data AutoConstantDefinition
+    = AutoConstantDefinition
+    { acdType           :: AutoConstantType
+    , acdName           :: String
+    , acdElementCount   :: Int
+    , acdElementType    :: ElementType      -- ^ The type of the constant in the program
+    , acdDataType       :: ACDataType       -- ^ The type of any extra data
+    }
+    deriving Eq
+        
+{-| Structure recording the use of an automatic parameter. -}
+data AutoConstantEntry
+    = AutoConstantEntry
+    { aceParamType      :: AutoConstantType     -- ^ The type of parameter
+    , acePhysicalIndex  :: Int                  -- ^ The target (physical) constant index
+	{-| The number of elements per individual entry in this constant
+	Used in case people used packed elements smaller than 4 (e.g. GLSL)
+	and bind an auto which is 4-element packed to it -}
+    , aceElementCount   :: Int
+	-- | Additional information to go with the parameter
+--	union{
+--		size_t data;
+--		Real fData;
+--	};
+    , aceVariability    :: GpuParamVariability  -- ^ The variability of this parameter (see GpuParamVariability)
+    }
+    deriving Eq
+        
+{-| Collects together the program parameters used for a GpuProgram.
+@remarks
+Gpu program state includes constant parameters used by the program, and
+bindings to render system state which is propagated into the constants 
+by the engine automatically if requested.
+@par
+GpuProgramParameters objects should be created through the GpuProgram and
+may be shared between multiple Pass instances. For this reason they
+are managed using a shared pointer, which will ensure they are automatically
+deleted when no Pass is using them anymore. 
+@par
+High-level programs use named parameters (uniforms), low-level programs 
+use indexed constants. This class supports both, but you can tell whether 
+named constants are supported by calling hasNamedParameters(). There are
+references in the documentation below to 'logical' and 'physical' indexes;
+logical indexes are the indexes used by low-level programs and represent 
+indexes into an array of float4's, some of which may be settable, some of
+which may be predefined constants in the program. We only store those
+constants which have actually been set, therefore our buffer could have 
+gaps if we used the logical indexes in our own buffers. So instead we map
+these logical indexes to physical indexes in our buffer. When using 
+high-level programs, logical indexes don't necessarily exist, although they
+might if the high-level program has a direct, exposed mapping from parameter
+names to logical indexes. In addition, high-level languages may or may not pack
+arrays of elements that are smaller than float4 (e.g. float2/vec2) contiguously.
+This kind of information is held in the ConstantDefinition structure which 
+is only populated for high-level programs. You don't have to worry about
+any of this unless you intend to read parameters back from this structure
+rather than just setting them.
+-}
+--data GpuProgramParameters'
+--    = GpuProgramParameters' 
+--    { 
+----    static AutoConstantDefinition AutoConstantDictionary[];
+--      gppFloatConstants             :: [Float]              -- ^ Packed list of floating-point constants (physical indexing)
+--    , gppIntConstants               :: [Int]                -- ^ Packed list of integer constants (physical indexing)
+--	{-| Logical index to physical index map - for low-level programs
+--	or high-level programs which pass params this way. -}
+--    , gppFloatLogicalToPhysical     :: GpuLogicalBufferStruct
+--	{-| Logical index to physical index map - for low-level programs
+--	or high-level programs which pass params this way. -}
+--    , gppIntLogicalToPhysical       :: GpuLogicalBufferStruct
+--    , gppNamedConstants             :: GpuNamedConstants    -- ^ Mapping from parameter names to def - high-level programs are expected to populate this
+--    , gppAutoConstants              :: [AutoConstantEntry]  -- ^ List of automatically updated parameters
+--    , gppCombinedVariability        :: GpuParamVariability  -- ^ The combined variability masks of all parameters
+--    , gppTransposeMatrices          :: Bool                 -- ^ Do we need to transpose matrices?
+--    , gppIgnoreMissingParams        :: Bool                 -- ^ flag to indicate if names not found will be ignored
+--    , gppActivePassIterationIndex   :: Int                  -- ^ physical index for active pass iteration parameter real constant entry;
+--    , gppSharedParamSets            :: [GpuSharedParametersUsage]
+----    -- Optional data the rendersystem might want to store
+----    mutable Any mRenderSystemData;
+--    }
+--    deriving Eq
+
+-- TEMP CODE
+data GpuProgramParameters
+    = GpuProgramParameters
+    { gppNamedConstants             :: [GpuNamedConstant]
+    }
+
+data GpuNamedConstant
+    = GpuNamedConstant
+    { gncName           :: String
+    , gncType           :: ElementType
+    , gncIntValues      :: [Int]
+    , gncFloatValues    :: [FloatType]
+    }
+
+autoConstantDictionary = 
+    [ (ACT_WORLD_MATRIX,                                "world_matrix",                             16, ET_REAL, ACDT_NONE)
+    , (ACT_INVERSE_WORLD_MATRIX,                        "inverse_world_matrix",                     16, ET_REAL, ACDT_NONE)
+    , (ACT_TRANSPOSE_WORLD_MATRIX,                      "transpose_world_matrix",                   16, ET_REAL, ACDT_NONE)
+    , (ACT_INVERSE_TRANSPOSE_WORLD_MATRIX,              "inverse_transpose_world_matrix",           16, ET_REAL, ACDT_NONE)
+
+    , (ACT_WORLD_MATRIX_ARRAY_3x4,                      "world_matrix_array_3x4",                   12, ET_REAL, ACDT_NONE)
+    , (ACT_WORLD_MATRIX_ARRAY,                          "world_matrix_array",                       16, ET_REAL, ACDT_NONE)
+
+    , (ACT_VIEW_MATRIX,                                 "view_matrix",                              16, ET_REAL, ACDT_NONE)
+    , (ACT_INVERSE_VIEW_MATRIX,                         "inverse_view_matrix",                      16, ET_REAL, ACDT_NONE)
+    , (ACT_TRANSPOSE_VIEW_MATRIX,                       "transpose_view_matrix",                    16, ET_REAL, ACDT_NONE)
+    , (ACT_INVERSE_TRANSPOSE_VIEW_MATRIX,               "inverse_transpose_view_matrix",            16, ET_REAL, ACDT_NONE)
+
+    , (ACT_PROJECTION_MATRIX,                           "projection_matrix",                        16, ET_REAL, ACDT_NONE)
+    , (ACT_INVERSE_PROJECTION_MATRIX,                   "inverse_projection_matrix",                16, ET_REAL, ACDT_NONE)
+    , (ACT_TRANSPOSE_PROJECTION_MATRIX,                 "transpose_projection_matrix",              16, ET_REAL, ACDT_NONE)
+    , (ACT_INVERSE_TRANSPOSE_PROJECTION_MATRIX,         "inverse_transpose_projection_matrix",      16, ET_REAL, ACDT_NONE)
+
+    , (ACT_VIEWPROJ_MATRIX,                             "viewproj_matrix",                          16, ET_REAL, ACDT_NONE)
+    , (ACT_INVERSE_VIEWPROJ_MATRIX,                     "inverse_viewproj_matrix",                  16, ET_REAL, ACDT_NONE)
+    , (ACT_TRANSPOSE_VIEWPROJ_MATRIX,                   "transpose_viewproj_matrix",                16, ET_REAL, ACDT_NONE)
+    , (ACT_INVERSE_TRANSPOSE_VIEWPROJ_MATRIX,           "inverse_transpose_viewproj_matrix",        16, ET_REAL, ACDT_NONE)
+
+    , (ACT_WORLDVIEW_MATRIX,                            "worldview_matrix",                         16, ET_REAL, ACDT_NONE)
+    , (ACT_INVERSE_WORLDVIEW_MATRIX,                    "inverse_worldview_matrix",                 16, ET_REAL, ACDT_NONE)
+    , (ACT_TRANSPOSE_WORLDVIEW_MATRIX,                  "transpose_worldview_matrix",               16, ET_REAL, ACDT_NONE)
+    , (ACT_INVERSE_TRANSPOSE_WORLDVIEW_MATRIX,          "inverse_transpose_worldview_matrix",       16, ET_REAL, ACDT_NONE)
+
+    , (ACT_WORLDVIEWPROJ_MATRIX,                        "worldviewproj_matrix",                     16, ET_REAL, ACDT_NONE)
+    , (ACT_INVERSE_WORLDVIEWPROJ_MATRIX,                "inverse_worldviewproj_matrix",             16, ET_REAL, ACDT_NONE)
+    , (ACT_TRANSPOSE_WORLDVIEWPROJ_MATRIX,              "transpose_worldviewproj_matrix",           16, ET_REAL, ACDT_NONE)
+    , (ACT_INVERSE_TRANSPOSE_WORLDVIEWPROJ_MATRIX,      "inverse_transpose_worldviewproj_matrix",   16, ET_REAL, ACDT_NONE)
+
+    , (ACT_RENDER_TARGET_FLIPPING,                      "render_target_flipping",                    1, ET_REAL, ACDT_NONE)
+
+    , (ACT_FOG_COLOUR,                                  "fog_colour",                                4, ET_REAL, ACDT_NONE)
+    , (ACT_FOG_PARAMS,                                  "fog_params",                                4, ET_REAL, ACDT_NONE)
+
+    , (ACT_SURFACE_AMBIENT_COLOUR,                      "surface_ambient_colour",                    4, ET_REAL, ACDT_NONE)
+    , (ACT_SURFACE_DIFFUSE_COLOUR,                      "surface_diffuse_colour",                    4, ET_REAL, ACDT_NONE)
+    , (ACT_SURFACE_SPECULAR_COLOUR,                     "surface_specular_colour",                   4, ET_REAL, ACDT_NONE)
+    , (ACT_SURFACE_EMISSIVE_COLOUR,                     "surface_emissive_colour",                   4, ET_REAL, ACDT_NONE)
+    , (ACT_SURFACE_SHININESS,                           "surface_shininess",                         1, ET_REAL, ACDT_NONE)
+
+    , (ACT_LIGHT_COUNT,                                 "light_count",                               1, ET_REAL, ACDT_NONE)
+
+    , (ACT_AMBIENT_LIGHT_COLOUR,                        "ambient_light_colour",                      4, ET_REAL, ACDT_NONE)
+    , (ACT_LIGHT_DIFFUSE_COLOUR,                        "light_diffuse_colour",                      4, ET_REAL, ACDT_INT)
+    , (ACT_LIGHT_SPECULAR_COLOUR,                       "light_specular_colour",                     4, ET_REAL, ACDT_INT)
+    , (ACT_LIGHT_ATTENUATION,                           "light_attenuation",                         4, ET_REAL, ACDT_INT)
+    , (ACT_SPOTLIGHT_PARAMS,                            "spotlight_params",                          4, ET_REAL, ACDT_INT)
+    , (ACT_LIGHT_POSITION,                              "light_position",                            4, ET_REAL, ACDT_INT)
+    , (ACT_LIGHT_POSITION_OBJECT_SPACE,                 "light_position_object_space",               4, ET_REAL, ACDT_INT)
+    , (ACT_LIGHT_POSITION_VIEW_SPACE,                   "light_position_view_space",                 4, ET_REAL, ACDT_INT)
+    , (ACT_LIGHT_DIRECTION,                             "light_direction",                           4, ET_REAL, ACDT_INT)
+    , (ACT_LIGHT_DIRECTION_OBJECT_SPACE,                "light_direction_object_space",              4, ET_REAL, ACDT_INT)
+    , (ACT_LIGHT_DIRECTION_VIEW_SPACE,                  "light_direction_view_space",                4, ET_REAL, ACDT_INT)
+    , (ACT_LIGHT_DISTANCE_OBJECT_SPACE,                 "light_distance_object_space",               1, ET_REAL, ACDT_INT)
+    , (ACT_LIGHT_POWER_SCALE,                           "light_power",                               1, ET_REAL, ACDT_INT)
+    , (ACT_LIGHT_DIFFUSE_COLOUR_POWER_SCALED,           "light_diffuse_colour_power_scaled",         4, ET_REAL, ACDT_INT)
+    , (ACT_LIGHT_SPECULAR_COLOUR_POWER_SCALED,          "light_specular_colour_power_scaled",        4, ET_REAL, ACDT_INT)
+    , (ACT_LIGHT_DIFFUSE_COLOUR_ARRAY,                  "light_diffuse_colour_array",                4, ET_REAL, ACDT_INT)
+    , (ACT_LIGHT_SPECULAR_COLOUR_ARRAY,                 "light_specular_colour_array",               4, ET_REAL, ACDT_INT)
+    , (ACT_LIGHT_DIFFUSE_COLOUR_POWER_SCALED_ARRAY,     "light_diffuse_colour_power_scaled_array",   4, ET_REAL, ACDT_INT)
+    , (ACT_LIGHT_SPECULAR_COLOUR_POWER_SCALED_ARRAY,    "light_specular_colour_power_scaled_array",  4, ET_REAL, ACDT_INT)
+    , (ACT_LIGHT_ATTENUATION_ARRAY,                     "light_attenuation_array",                   4, ET_REAL, ACDT_INT)
+    , (ACT_LIGHT_POSITION_ARRAY,                        "light_position_array",                      4, ET_REAL, ACDT_INT)
+    , (ACT_LIGHT_POSITION_OBJECT_SPACE_ARRAY,           "light_position_object_space_array",         4, ET_REAL, ACDT_INT)
+    , (ACT_LIGHT_POSITION_VIEW_SPACE_ARRAY,             "light_position_view_space_array",           4, ET_REAL, ACDT_INT)
+    , (ACT_LIGHT_DIRECTION_ARRAY,                       "light_direction_array",                     4, ET_REAL, ACDT_INT)
+    , (ACT_LIGHT_DIRECTION_OBJECT_SPACE_ARRAY,          "light_direction_object_space_array",        4, ET_REAL, ACDT_INT)
+    , (ACT_LIGHT_DIRECTION_VIEW_SPACE_ARRAY,            "light_direction_view_space_array",          4, ET_REAL, ACDT_INT)
+    , (ACT_LIGHT_DISTANCE_OBJECT_SPACE_ARRAY,           "light_distance_object_space_array",         1, ET_REAL, ACDT_INT)
+    , (ACT_LIGHT_POWER_SCALE_ARRAY,                     "light_power_array",                         1, ET_REAL, ACDT_INT)
+    , (ACT_SPOTLIGHT_PARAMS_ARRAY,                      "spotlight_params_array",                    4, ET_REAL, ACDT_INT)
+
+    , (ACT_DERIVED_AMBIENT_LIGHT_COLOUR,                "derived_ambient_light_colour",              4, ET_REAL, ACDT_NONE)
+    , (ACT_DERIVED_SCENE_COLOUR,                        "derived_scene_colour",                      4, ET_REAL, ACDT_NONE)
+    , (ACT_DERIVED_LIGHT_DIFFUSE_COLOUR,                "derived_light_diffuse_colour",              4, ET_REAL, ACDT_INT)
+    , (ACT_DERIVED_LIGHT_SPECULAR_COLOUR,               "derived_light_specular_colour",             4, ET_REAL, ACDT_INT)
+    , (ACT_DERIVED_LIGHT_DIFFUSE_COLOUR_ARRAY,          "derived_light_diffuse_colour_array",        4, ET_REAL, ACDT_INT)
+    , (ACT_DERIVED_LIGHT_SPECULAR_COLOUR_ARRAY,         "derived_light_specular_colour_array",       4, ET_REAL, ACDT_INT)
+
+    , (ACT_LIGHT_NUMBER,                                "light_number",                              1, ET_REAL, ACDT_INT)
+    , (ACT_LIGHT_CASTS_SHADOWS,                         "light_casts_shadows",                       1, ET_REAL, ACDT_INT)
+
+    , (ACT_SHADOW_EXTRUSION_DISTANCE,                   "shadow_extrusion_distance",                 1, ET_REAL, ACDT_INT)
+    , (ACT_CAMERA_POSITION,                             "camera_position",                           3, ET_REAL, ACDT_NONE)
+    , (ACT_CAMERA_POSITION_OBJECT_SPACE,                "camera_position_object_space",              3, ET_REAL, ACDT_NONE)
+    , (ACT_TEXTURE_VIEWPROJ_MATRIX,                     "texture_viewproj_matrix",                  16, ET_REAL, ACDT_INT)
+    , (ACT_TEXTURE_VIEWPROJ_MATRIX_ARRAY,               "texture_viewproj_matrix_array",            16, ET_REAL, ACDT_INT)
+    , (ACT_TEXTURE_WORLDVIEWPROJ_MATRIX,                "texture_worldviewproj_matrix",             16, ET_REAL, ACDT_INT)
+    , (ACT_TEXTURE_WORLDVIEWPROJ_MATRIX_ARRAY,          "texture_worldviewproj_matrix_array",       16, ET_REAL, ACDT_INT)
+    , (ACT_SPOTLIGHT_VIEWPROJ_MATRIX,                   "spotlight_viewproj_matrix",                16, ET_REAL, ACDT_INT)
+    , (ACT_SPOTLIGHT_WORLDVIEWPROJ_MATRIX,              "spotlight_worldviewproj_matrix",           16, ET_REAL, ACDT_INT)
+    , (ACT_CUSTOM,                                      "custom",                                    4, ET_REAL, ACDT_INT)  -- *** needs to be tested
+    , (ACT_TIME,                                        "time",                                      1, ET_REAL, ACDT_REAL)
+    , (ACT_TIME_0_X,                                    "time_0_x",                                  4, ET_REAL, ACDT_REAL)
+    , (ACT_COSTIME_0_X,                                 "costime_0_x",                               4, ET_REAL, ACDT_REAL)
+    , (ACT_SINTIME_0_X,                                 "sintime_0_x",                               4, ET_REAL, ACDT_REAL)
+    , (ACT_TANTIME_0_X,                                 "tantime_0_x",                               4, ET_REAL, ACDT_REAL)
+    , (ACT_TIME_0_X_PACKED,                             "time_0_x_packed",                           4, ET_REAL, ACDT_REAL)
+    , (ACT_TIME_0_1,                                    "time_0_1",                                  4, ET_REAL, ACDT_REAL)
+    , (ACT_COSTIME_0_1,                                 "costime_0_1",                               4, ET_REAL, ACDT_REAL)
+    , (ACT_SINTIME_0_1,                                 "sintime_0_1",                               4, ET_REAL, ACDT_REAL)
+    , (ACT_TANTIME_0_1,                                 "tantime_0_1",                               4, ET_REAL, ACDT_REAL)
+    , (ACT_TIME_0_1_PACKED,                             "time_0_1_packed",                           4, ET_REAL, ACDT_REAL)
+    , (ACT_TIME_0_2PI,                                  "time_0_2pi",                                4, ET_REAL, ACDT_REAL)
+    , (ACT_COSTIME_0_2PI,                               "costime_0_2pi",                             4, ET_REAL, ACDT_REAL)
+    , (ACT_SINTIME_0_2PI,                               "sintime_0_2pi",                             4, ET_REAL, ACDT_REAL)
+    , (ACT_TANTIME_0_2PI,                               "tantime_0_2pi",                             4, ET_REAL, ACDT_REAL)
+    , (ACT_TIME_0_2PI_PACKED,                           "time_0_2pi_packed",                         4, ET_REAL, ACDT_REAL)
+    , (ACT_FRAME_TIME,                                  "frame_time",                                1, ET_REAL, ACDT_REAL)
+    , (ACT_FPS,                                         "fps",                                       1, ET_REAL, ACDT_NONE)
+    , (ACT_VIEWPORT_WIDTH,                              "viewport_width",                            1, ET_REAL, ACDT_NONE)
+    , (ACT_VIEWPORT_HEIGHT,                             "viewport_height",                           1, ET_REAL, ACDT_NONE)
+    , (ACT_INVERSE_VIEWPORT_WIDTH,                      "inverse_viewport_width",                    1, ET_REAL, ACDT_NONE)
+    , (ACT_INVERSE_VIEWPORT_HEIGHT,                     "inverse_viewport_height",                   1, ET_REAL, ACDT_NONE)
+    , (ACT_VIEWPORT_SIZE,                               "viewport_size",                             4, ET_REAL, ACDT_NONE)
+    , (ACT_VIEW_DIRECTION,                              "view_direction",                            3, ET_REAL, ACDT_NONE)
+    , (ACT_VIEW_SIDE_VECTOR,                            "view_side_vector",                          3, ET_REAL, ACDT_NONE)
+    , (ACT_VIEW_UP_VECTOR,                              "view_up_vector",                            3, ET_REAL, ACDT_NONE)
+    , (ACT_FOV,                                         "fov",                                       1, ET_REAL, ACDT_NONE)
+    , (ACT_NEAR_CLIP_DISTANCE,                          "near_clip_distance",                        1, ET_REAL, ACDT_NONE)
+    , (ACT_FAR_CLIP_DISTANCE,                           "far_clip_distance",                         1, ET_REAL, ACDT_NONE)
+    , (ACT_PASS_NUMBER,                                 "pass_number",                               1, ET_REAL, ACDT_NONE)
+    , (ACT_PASS_ITERATION_NUMBER,                       "pass_iteration_number",                     1, ET_REAL, ACDT_NONE)
+    , (ACT_ANIMATION_PARAMETRIC,                        "animation_parametric",                      4, ET_REAL, ACDT_INT)
+    , (ACT_TEXEL_OFFSETS,                               "texel_offsets",                             4, ET_REAL, ACDT_NONE)
+    , (ACT_SCENE_DEPTH_RANGE,                           "scene_depth_range",                         4, ET_REAL, ACDT_NONE)
+    , (ACT_SHADOW_SCENE_DEPTH_RANGE,                    "shadow_scene_depth_range",                  4, ET_REAL, ACDT_INT)
+    , (ACT_SHADOW_COLOUR,                               "shadow_colour",                             4, ET_REAL, ACDT_NONE)
+    , (ACT_TEXTURE_SIZE,                                "texture_size",                              4, ET_REAL, ACDT_INT)
+    , (ACT_INVERSE_TEXTURE_SIZE,                        "inverse_texture_size",                      4, ET_REAL, ACDT_INT)
+    , (ACT_PACKED_TEXTURE_SIZE,                         "packed_texture_size",                       4, ET_REAL, ACDT_INT)
+    , (ACT_TEXTURE_MATRIX,                              "texture_matrix",                           16, ET_REAL, ACDT_INT)
+    , (ACT_LOD_CAMERA_POSITION,                         "lod_camera_position",                       3, ET_REAL, ACDT_NONE)
+    , (ACT_LOD_CAMERA_POSITION_OBJECT_SPACE,            "lod_camera_position_object_space",          3, ET_REAL, ACDT_NONE)
+    , (ACT_LIGHT_CUSTOM,                                "light_custom",                              4, ET_REAL, ACDT_INT)
+    ]
diff --git a/Graphics/LambdaCube/GpuProgramUsage.hs b/Graphics/LambdaCube/GpuProgramUsage.hs
new file mode 100644
--- /dev/null
+++ b/Graphics/LambdaCube/GpuProgramUsage.hs
@@ -0,0 +1,47 @@
+module Graphics.LambdaCube.GpuProgramUsage where
+
+import Graphics.LambdaCube.GpuProgram
+--import Graphics.LambdaCube.GpuProgramParams
+
+{-| This class makes the usage of a vertex and fragment programs (low-level or high-level), 
+    with a given set of parameters, explicit.
+@remarks
+    Using a vertex or fragment program can get fairly complex; besides the fairly rudimentary
+    process of binding a program to the GPU for rendering, managing usage has few
+    complications, such as:
+    <ul>
+    <li>Programs can be high level (e.g. Cg, RenderMonkey) or low level (assembler). Using
+    either should be relatively seamless, although high-level programs give you the advantage
+    of being able to use named parameters, instead of just indexed registers</li>
+    <li>Programs and parameters can be shared between multiple usages, in order to save
+    memory</li>
+    <li>When you define a user of a program, such as a material, you often want to be able to
+    set up the definition but not load / compile / assemble the program at that stage, because
+    it is not needed just yet. The program should be loaded when it is first needed, or
+    earlier if specifically requested. The program may not be defined at this time, you
+    may want to have scripts that can set up the definitions independent of the order in which
+    those scripts are loaded.</li>
+    </ul>
+    This class packages up those details so you don't have to worry about them. For example,
+    this class lets you define a high-level program and set up the parameters for it, without
+    having loaded the program (which you normally could not do). When the program is loaded and
+    compiled, this class will then validate the parameters you supplied earlier and turn them
+    into runtime parameters.
+@par
+    Just incase it wasn't clear from the above, this class provides linkage to both 
+    GpuProgram and HighLevelGpuProgram, despite its name.
+-}
+data GpuProgramUsage
+    = GpuProgramUsage
+    { --gpuType           :: GpuProgramType
+--    , gpuParent         :: Pass
+    
+      gpuProgramName    :: String
+--    , gpuProgram        :: Maybe p          -- ^ The program link
+--    , gpuProgram        :: Either String (GpuProgramDescriptor p)          -- ^ The program link
+--    , gpuParameters     :: GpuProgramParameters -- ^ program parameters
+
+--    , gpuRecreateParams :: Bool                 -- ^ Whether to recreate parameters next load
+    }
+    deriving Eq
+    
diff --git a/Graphics/LambdaCube/HardwareBuffer.hs b/Graphics/LambdaCube/HardwareBuffer.hs
new file mode 100644
--- /dev/null
+++ b/Graphics/LambdaCube/HardwareBuffer.hs
@@ -0,0 +1,93 @@
+module Graphics.LambdaCube.HardwareBuffer where
+
+import Data.Word
+import Foreign.Ptr
+
+-- | Enums describing buffer usage; not mutually exclusive
+data Usage 
+    {-| Static buffer which the application rarely modifies once created. Modifying 
+    the contents of this buffer will involve a performance hit.
+    -}
+    = HBU_STATIC
+    {-| Indicates the application would like to modify this buffer with the CPU
+    fairly often. 
+    Buffers created with this flag will typically end up in AGP memory rather 
+    than video memory.
+    -}
+    | HBU_DYNAMIC
+    {-| Indicates the application will never read the contents of the buffer back, 
+    it will only ever write data. Locking a buffer with this flag will ALWAYS 
+    return a pointer to new, blank memory rather than the memory associated 
+    with the contents of the buffer; this avoids DMA stalls because you can 
+    write to a new memory area while the previous one is being used. 
+    -}
+    | HBU_WRITE_ONLY
+    {-| Indicates that the application will be refilling the contents
+    of the buffer regularly (not just updating, but generating the
+    contents from scratch), and therefore does not mind if the contents 
+    of the buffer are lost somehow and need to be recreated. This
+    allows and additional level of optimisation on the buffer.
+    This option only really makes sense when combined with 
+    HBU_DYNAMIC_WRITE_ONLY.
+    -}
+    | HBU_DISCARDABLE
+    -- | Combination of HBU_STATIC and HBU_WRITE_ONLY
+    | HBU_STATIC_WRITE_ONLY
+    {-| Combination of HBU_DYNAMIC and HBU_WRITE_ONLY. If you use 
+    this, strongly consider using HBU_DYNAMIC_WRITE_ONLY_DISCARDABLE
+    instead if you update the entire contents of the buffer very 
+    regularly. 
+    -}
+    | HBU_DYNAMIC_WRITE_ONLY
+    -- | Combination of HBU_DYNAMIC, HBU_WRITE_ONLY and HBU_DISCARDABLE
+    | HBU_DYNAMIC_WRITE_ONLY_DISCARDABLE
+    deriving Eq
+
+-- | Locking options
+data LockOptions
+    {-| Normal mode, ie allows read/write and contents are preserved. -}
+    = HBL_NORMAL
+    {-| Discards the <em>entire</em> buffer while locking; this allows optimisation to be 
+    performed because synchronisation issues are relaxed. Only allowed on buffers 
+    created with the HBU_DYNAMIC flag. 
+    -}
+    | HBL_DISCARD
+    {-| Lock the buffer for reading only. Not allowed in buffers which are created with HBU_WRITE_ONLY. 
+    Mandatory on static buffers, i.e. those created without the HBU_DYNAMIC flag. 
+    -} 
+    | HBL_READ_ONLY
+    {-| As HBL_NORMAL, except the application guarantees not to overwrite any 
+    region of the buffer which has already been used in this frame, can allow
+    some optimisation on some APIs. -}
+    | HBL_NO_OVERWRITE
+    deriving Eq
+
+
+class Eq a => HardwareBuffer a where
+    {-| Lock the buffer for (potentially) reading / writing.
+    @param offset The byte offset from the start of the buffer to lock
+    @param length The size of the area to lock, in bytes
+    @param options Locking options
+    @returns Pointer to the locked memory
+    -}
+    lock                :: a -> Int -> Int -> LockOptions -> IO (Ptr Word8) -- virtual void* lock(size_t offset, size_t length, LockOptions options)
+
+    {-| Releases the lock on this buffer. 
+    @remarks 
+        Locking and unlocking a buffer can, in some rare circumstances such as 
+        switching video modes whilst the buffer is locked, corrupt the 
+        contents of a buffer. This is pretty rare, but if it occurs, 
+        this method will throw an exception, meaning you
+        must re-upload the data.
+    @par
+        Note that using the 'read' and 'write' forms of updating the buffer does not
+        suffer from this problem, so if you want to be 100% sure your
+        data will not be lost, use the 'read' and 'write' forms instead.
+    -}
+    unlock              :: a -> IO () -- virtual void unlock(void)
+
+    getSizeInBytes      :: a -> Int             -- ^ Returns the size of this buffer in bytes
+    getUsage            :: a -> Usage           -- ^ Returns the Usage flags with which this buffer was created
+    isSystemMemory      :: a -> Bool            -- ^ Returns whether this buffer is held in system memory
+    hasShadowBuffer     :: a -> Bool            -- ^ Returns whether this buffer has a system memory shadow for quicker reading
+    isLocked            :: a -> IO Bool         -- ^ Returns whether or not this buffer is currently locked.
diff --git a/Graphics/LambdaCube/HardwareIndexBuffer.hs b/Graphics/LambdaCube/HardwareIndexBuffer.hs
new file mode 100644
--- /dev/null
+++ b/Graphics/LambdaCube/HardwareIndexBuffer.hs
@@ -0,0 +1,20 @@
+module Graphics.LambdaCube.HardwareIndexBuffer where
+
+import Data.Word
+import Data.IORef
+import Foreign.Ptr
+import Foreign.Marshal.Alloc
+import Foreign.Marshal.Utils
+import Control.Monad
+
+import Graphics.LambdaCube.HardwareBuffer
+
+data IndexType
+    = IT_16BIT
+    | IT_32BIT
+    deriving (Eq,Show)
+
+class (HardwareBuffer a) => HardwareIndexBuffer a where
+    getIndexType  :: a -> IndexType -- ^ Get the type of indexes used in this buffer
+    getNumIndexes :: a -> Int       -- ^ Get the number of indexes in this buffer
+    getIndexSize  :: a -> Int       -- ^ Get the size in bytes of each index
diff --git a/Graphics/LambdaCube/HardwareOcclusionQuery.hs b/Graphics/LambdaCube/HardwareOcclusionQuery.hs
new file mode 100644
--- /dev/null
+++ b/Graphics/LambdaCube/HardwareOcclusionQuery.hs
@@ -0,0 +1,41 @@
+module Graphics.LambdaCube.HardwareOcclusionQuery where
+
+-- | This is a abstract class that that provides the interface for the query class for hardware occlusion.
+class HardwareOcclusionQuery a where
+    {-| Starts the hardware occlusion query
+        @Remarks	Simple usage: Create one or more OcclusionQuery object one per outstanding query or one per tested object 
+       				OcclusionQuery* m_pOcclusionQuery;
+       				createOcclusionQuery( &m_pOcclusionQuery );
+       				In the rendering loop:
+       				Draw all occluders
+       				m_pOcclusionQuery->startOcclusionQuery();
+       				Draw the polygons to be tested
+       				m_pOcclusionQuery->endOcclusionQuery();
+       
+       				Results must be pulled using:
+       				UINT	m_uintNumberOfPixelsVisable;
+       				pullOcclusionQuery( &m_dwNumberOfPixelsVisable );
+    -}
+    beginOcclusionQuery     :: a -> IO ()
+    endOcclusionQuery       :: a -> IO ()   -- ^ Ends the hardware occlusion test
+
+    {-| Pulls the hardware occlusion query.
+        @note Waits until the query result is available; use isStillOutstanding
+       		if just want to test if the result is available.
+        @retval NumOfFragments will get the resulting number of fragments.
+        @return True if success or false if not.
+    -}
+    pullOcclusionQuery      :: a -> IO Int
+
+    {-| Let's you get the last pixel count with out doing the hardware occlusion test
+        @return The last fragment count from the last test.
+        Remarks This function won't give you new values, just the old value.
+    -}
+--    getLastQuerysPixelcount :: a -> IO Int
+
+    {-| Lets you know when query is done, or still be processed by the Hardware
+        @return true if query isn't finished.
+    -}
+    isStillOutstanding      :: a -> IO Bool
+
+
diff --git a/Graphics/LambdaCube/HardwareVertexBuffer.hs b/Graphics/LambdaCube/HardwareVertexBuffer.hs
new file mode 100644
--- /dev/null
+++ b/Graphics/LambdaCube/HardwareVertexBuffer.hs
@@ -0,0 +1,187 @@
+module Graphics.LambdaCube.HardwareVertexBuffer where
+
+import Data.Word
+import Data.IntMap
+import Foreign.Marshal.Alloc
+import Foreign.Marshal.Utils
+import Foreign.Storable
+import Foreign.C.Types
+import Foreign.Ptr
+import Data.IORef
+import Control.Monad
+
+import Graphics.LambdaCube.HardwareBuffer
+
+class (HardwareBuffer a) => HardwareVertexBuffer a where
+    getVertexSize  :: a -> Int -- ^ Gets the size in bytes of a single vertex in this buffer
+    getNumVertices :: a -> Int -- ^ Get the number of vertices in this buffer
+
+-- | Vertex element semantics, used to identify the meaning of vertex buffer contents
+data VertexElementSemantic
+    = VES_POSITION              -- ^ Position, 3 reals per vertex
+    | VES_BLEND_WEIGHTS         -- ^ Blending weights
+    | VES_BLEND_INDICES         -- ^ Blending indices
+    | VES_NORMAL                -- ^ Normal, 3 reals per vertex
+    | VES_DIFFUSE               -- ^ Diffuse colours
+    | VES_SPECULAR              -- ^ Specular colours
+    | VES_TEXTURE_COORDINATES   -- ^ Texture coordinates
+    | VES_BINORMAL              -- ^ Binormal (Y axis if normal is Z)
+    | VES_TANGENT               -- ^ Tangent (X axis if normal is Z)
+    deriving (Enum,Eq,Ord,Show)
+
+
+-- | Vertex element type, used to identify the base types of the vertex contents
+data VertexElementType
+    = VET_FLOAT1
+    | VET_FLOAT2
+    | VET_FLOAT3
+    | VET_FLOAT4
+--    -- | alias to more specific colour type - use the current rendersystem's colour packing
+--    | VET_COLOUR -- Deprecated by Ogre
+    | VET_SHORT1
+    | VET_SHORT2
+    | VET_SHORT3
+    | VET_SHORT4
+    | VET_UBYTE4
+    -- | D3D style compact colour
+    | VET_COLOUR_ARGB
+    -- | GL style compact colour
+    | VET_COLOUR_ABGR
+    deriving (Eq,Ord,Show)
+
+{-| This class declares the usage of a single vertex buffer as a component
+    of a complete VertexDeclaration.
+    @remarks
+    Several vertex buffers can be used to supply the input geometry for a
+    rendering operation, and in each case a vertex buffer can be used in
+    different ways for different operations; the buffer itself does not
+    define the semantics (position, normal etc), the VertexElement
+    class does.
+-}
+data VertexElement
+    = VertexElement
+    { veSource      :: Int                      -- ^ The source vertex buffer, as bound to an index using VertexBufferBinding
+    , veOffset      :: Int                      -- ^ The offset in the buffer that this element starts at
+    , veType        :: VertexElementType        -- ^ The type of element
+    , veSemantic    :: VertexElementSemantic    -- ^ The meaning of the element
+    , veIndex       :: Int                      -- ^ Index of the item, only applicable for some elements like texture coords
+    }
+    deriving (Eq,Ord,Show)
+
+-- | Utility method for helping to calculate offsets
+getTypeSize :: VertexElementType -> Int
+getTypeSize etype = case etype of
+    { VET_COLOUR_ABGR   ->     sizeOf (undefined::Word32) -- sizeof(RGBA);
+    ; VET_COLOUR_ARGB   ->     sizeOf (undefined::Word32) -- sizeof(RGBA);
+    ; VET_FLOAT1        ->     sizeOf (undefined::CFloat) -- sizeof(float);
+    ; VET_FLOAT2        -> 2 * sizeOf (undefined::CFloat) -- sizeof(float)*2;
+    ; VET_FLOAT3        -> 3 * sizeOf (undefined::CFloat) -- sizeof(float)*3;
+    ; VET_FLOAT4        -> 4 * sizeOf (undefined::CFloat) -- sizeof(float)*4;
+    ; VET_SHORT1        ->     sizeOf (undefined::CShort) -- sizeof(short);
+    ; VET_SHORT2        -> 2 * sizeOf (undefined::CShort) -- sizeof(short)*2;
+    ; VET_SHORT3        -> 3 * sizeOf (undefined::CShort) -- sizeof(short)*3;
+    ; VET_SHORT4        -> 4 * sizeOf (undefined::CShort) -- sizeof(short)*4;
+    ; VET_UBYTE4        -> 4 * sizeOf (undefined::CUChar) -- sizeof(unsigned char)*4;
+    }
+
+-- | Utility method which returns the count of values in a given type
+getTypeCount :: VertexElementType -> Int
+getTypeCount etype = case etype of
+    { VET_COLOUR_ABGR   -> 1
+    ; VET_COLOUR_ARGB   -> 1
+    ; VET_FLOAT1        -> 1
+    ; VET_FLOAT2        -> 2
+    ; VET_FLOAT3        -> 3
+    ; VET_FLOAT4        -> 4
+    ; VET_SHORT1        -> 1
+    ; VET_SHORT2        -> 2
+    ; VET_SHORT3        -> 3
+    ; VET_SHORT4        -> 4
+    ; VET_UBYTE4        -> 4
+    }
+    
+{-| Simple converter function which will turn a single-value type into a
+	multi-value type based on a parameter.
+-}
+multiplyTypeCount :: VertexElementType -> Int -> VertexElementType
+multiplyTypeCount baseType count = case baseType of
+    { VET_FLOAT1 -> case count of
+        { 1 -> VET_FLOAT1
+        ; 2 -> VET_FLOAT2
+        ; 3 -> VET_FLOAT3
+        ; 4 -> VET_FLOAT4
+        ; _ -> error "Invalid type"
+        }
+    ; VET_SHORT1 -> case count of
+        { 1 -> VET_SHORT1
+        ; 2 -> VET_SHORT2
+        ; 3 -> VET_SHORT3
+        ; 4 -> VET_SHORT4
+        ; _ -> error "Invalid type"
+        }
+    ; _ -> error "Invalid type"
+    }
+
+{-| Simple converter function which will a type into it's single-value
+	equivalent - makes switches on type easier.
+-}
+getBaseType :: VertexElementType -> VertexElementType
+getBaseType multiType = case multiType of
+    { VET_FLOAT1        -> VET_FLOAT1
+    ; VET_FLOAT2        -> VET_FLOAT2
+    ; VET_FLOAT3        -> VET_FLOAT3
+    ; VET_FLOAT4        -> VET_FLOAT4
+    ; VET_COLOUR_ABGR   -> VET_COLOUR_ABGR
+    ; VET_COLOUR_ARGB   -> VET_COLOUR_ARGB
+    ; VET_SHORT1        -> VET_SHORT1
+    ; VET_SHORT2        -> VET_SHORT2
+    ; VET_SHORT3        -> VET_SHORT3
+    ; VET_SHORT4        -> VET_SHORT4
+    ; VET_UBYTE4        -> VET_UBYTE4
+    }
+
+{-| Utility method for converting colour from
+	one packed 32-bit colour type to another.
+@param srcType The source type
+@param dstType The destination type
+@param ptr Read / write value to change
+-}
+--static void convertColourValue(VertexElementType srcType,
+--	VertexElementType dstType, uint32* ptr);
+
+{-| Utility method for converting colour to
+	a packed 32-bit colour type.
+@param src source colour
+@param dst The destination type
+-}
+--static uint32 convertColourValue(const ColourValue& src,
+--	VertexElementType dst);
+
+{-| Utility method to get the most appropriate packed colour vertex element format. -}
+--static VertexElementType getBestColourVertexElementType(void);
+
+data VertexDeclaration
+    = VertexDeclaration
+    { vdElementList :: [VertexElement] -- ^ Defines the list of vertex elements that makes up this declaration
+    }
+    deriving (Eq,Show)
+
+
+{-| Records the state of all the vertex buffer bindings required to provide a vertex declaration
+	with the input data it needs for the vertex elements.
+@remarks
+	Why do we have this binding list rather than just have VertexElement referring to the
+	vertex buffers direct? Well, in the underlying APIs, binding the vertex buffers to an
+	index (or 'stream') is the way that vertex data is linked, so this structure better
+	reflects the realities of that. In addition, by separating the vertex declaration from
+	the list of vertex buffer bindings, it becomes possible to reuse bindings between declarations
+	and vice versa, giving opportunities to reduce the state changes required to perform rendering.
+@par
+	Like the other classes in this functional area, these binding maps should be created and
+	destroyed using the HardwareBufferManager.
+-}
+data HardwareVertexBuffer vb => VertexBufferBinding vb
+    = VertexBufferBinding
+    { vbbBindingMap :: IntMap vb
+    }
+    deriving Eq
diff --git a/Graphics/LambdaCube/Image.hs b/Graphics/LambdaCube/Image.hs
new file mode 100644
--- /dev/null
+++ b/Graphics/LambdaCube/Image.hs
@@ -0,0 +1,34 @@
+module Graphics.LambdaCube.Image where
+
+import Data.Word
+import Foreign.Ptr
+
+import Data.ByteString.Lazy
+
+import Graphics.LambdaCube.PixelFormat
+
+-- | Image loader function
+type ImageLoader = String -> ByteString -> IO (Maybe Image)
+
+-- | Has information about the size and the pixel format of the image.
+data Image
+    = Image
+    { imName        :: String
+    , imHeight      :: Int
+    , imWidth       :: Int
+    , imDepth       :: Int
+    , imSize        :: Int
+    , imNumMipmaps  :: Int
+--    uint flags;
+    , imFormat      :: PixelFormat
+    , imData        :: {-Maybe-} (Ptr Word8) -- ^ Image can be empty
+    }
+
+{-
+    enum ImageFlags
+    {
+        IF_COMPRESSED = 0x00000001,
+        IF_CUBEMAP    = 0x00000002,
+        IF_3D_TEXTURE = 0x00000004
+    };
+-}
diff --git a/Graphics/LambdaCube/Light.hs b/Graphics/LambdaCube/Light.hs
new file mode 100644
--- /dev/null
+++ b/Graphics/LambdaCube/Light.hs
@@ -0,0 +1,58 @@
+module Graphics.LambdaCube.Light where
+
+import Graphics.LambdaCube.Types
+
+-- | Defines the type of light
+data LightTypes
+    = LT_POINT          -- ^ Point light sources give off light equally in all directions, so require only position not direction
+    | LT_DIRECTIONAL    -- ^ Directional lights simulate parallel light beams from a distant source, hence have direction but no position
+    | LT_SPOTLIGHT      -- ^ Spotlights simulate a cone of light from a source so require position and direction, plus extra values for falloff
+    deriving Eq
+    
+data Light
+    = Light
+    { lgType                    :: LightTypes
+    , lgDiffuse                 :: ColourValue
+    , lgSpecular                :: ColourValue
+--        Vector3 mPosition;
+--        Vector3 mDirection;
+    , lgSpotOuter               :: FloatType
+    , lgSpotInner               :: FloatType
+    , lgSpotFalloff             :: FloatType
+    , lgRange                   :: FloatType
+    , lgAttenuationConst        :: FloatType
+    , lgAttenuationLinear       :: FloatType
+    , lgAttenuationQuad         :: FloatType
+    , lgPowerScale              :: FloatType
+--        size_t mIndexInFrame;
+--    , lgOwnShadowFarDist    :: Bool
+--    , lgShadowFarDist           :: FloatType
+--    , lgShadowFarDistSquared    :: FloatType
+--    , lgShadowNearClipDist      :: FloatType
+--    , lgShadowFarClipDist       :: FloatType
+    }
+    
+{-
+
+        mutable Vector3 mDerivedPosition;
+        mutable Vector3 mDerivedDirection;
+		// Slightly hacky but unless we separate observed light render state from main Light...
+		mutable Vector3 mDerivedCamRelativePosition;
+		mutable bool mDerivedCamRelativeDirty;
+		Camera* mCameraToBeRelativeTo;
+
+        /// Shared class-level name for Movable type
+        static String msMovableType;
+
+        mutable PlaneBoundedVolume mNearClipVolume;
+        mutable PlaneBoundedVolumeList mFrustumClipVolumes;
+        /// Is the derived transform dirty?
+        mutable bool mDerivedTransformDirty;
+
+		/// Pointer to a custom shadow camera setup
+		mutable ShadowCameraSetupPtr mCustomShadowCameraSetup;
+
+		typedef map<uint16, Vector4>::type CustomParameterMap;
+		/// Stores the custom parameters for the light
+        CustomParameterMap mCustomParameters;
+-}
diff --git a/Graphics/LambdaCube/Loader/CompositorScript.hs b/Graphics/LambdaCube/Loader/CompositorScript.hs
new file mode 100644
--- /dev/null
+++ b/Graphics/LambdaCube/Loader/CompositorScript.hs
@@ -0,0 +1,262 @@
+{-# LANGUAGE NoMonomorphismRestriction #-}
+module Graphics.LambdaCube.Loader.CompositorScript (loadCompositor,parseCompositor) where
+
+-- import the the library functions from uulib
+import UU.Parsing
+import UU.Scanner
+
+import Data.Maybe
+import Data.Either
+import qualified Data.IntMap as IntMap
+
+-- import our custom made Alex-scanner
+import Graphics.LambdaCube.Loader.Generated.CompositorScriptScanner
+import Graphics.LambdaCube.Loader.ParserUtil
+import Graphics.LambdaCube.Compositor
+import Graphics.LambdaCube.Types
+import Graphics.LambdaCube.Common
+import Graphics.LambdaCube.RenderSystem
+import Graphics.LambdaCube.PixelFormat
+import Graphics.LambdaCube.Texture
+import Graphics.LambdaCube.GpuProgram
+
+----------------------
+-- Boilerplate code --
+----------------------
+
+loadCompositor path file = do
+    txt <- readFile file
+    parseCompositor file txt
+
+parseCompositor file txt
+    = let res = parseTokens pCompositorScript (tokenize file txt)
+    in case res of
+        Left errs -> do
+            mapM_ putStrLn errs
+            return Nothing
+        Right tree -> return (Just tree)
+		
+type TokenParser a = Parser Token a
+
+parseTokens :: TokenParser a -> [Token] -> Either [String] a
+parseTokens p tks = if null msgs then final `seq` Right v else Left (map show msgs)
+  where
+    steps = parse p tks
+    msgs  = getMsgs steps
+    (Pair v final) = evalSteps steps
+
+----------------------------------------------------
+-- Compositor script top level parser combinators --
+----------------------------------------------------
+-- * AST definitions
+
+data (Texture t, LinkedGpuProgram lp) => CS_Attr t lp
+    = CS_compositor     (Compositor t lp)
+
+data (Texture t, LinkedGpuProgram lp) => C_Attr t lp
+    = C_technique       (CompositionTechnique t lp)
+
+data (Texture t, LinkedGpuProgram lp) => T_Attr t lp
+    = T_target          (CompositionTargetPass t lp)
+    | T_targetoutput    (CompositionTargetPass t lp)
+    | T_texture         String (Either Int FloatType) (Either Int FloatType) [PixelFormat] Bool
+
+data (Texture t, LinkedGpuProgram lp) => TR_Attr t lp
+    = TR_input          InputMode
+    | TR_onlyinitial    Bool
+    | TR_visibilitymask Int
+    | TR_lodbias        FloatType
+    | TR_shadows        Bool
+    | TR_materialscheme String
+    | TR_pass           (CompositionPass t lp)
+
+data P_Attr
+    = P_material         String
+    | P_input            Int String Int
+    | P_identifier       Int
+    | P_firstrenderqueue Int
+    | P_lastrenderqueue  Int
+    | P_buffers          [String]
+    | P_colourvalue      ColourValue
+    | P_depthvalue       FloatType
+    | P_stencilvalue     Int
+    | P_check            Bool
+    | P_compfunc         CompareFunction
+    | P_refvalue         Int
+    | P_mask             Int
+    | P_failop           StencilOperation
+    | P_depthfailop      StencilOperation
+    | P_passop           StencilOperation
+    | P_twosided         Bool
+
+-- * Compositor parser combinators
+
+pCompositorScript = mkCompositorScript <$> pList pCompositorScriptContent
+mkCompositorScript l = [x | CS_compositor x <- l]
+	
+pCompositorScriptContent = pCompositor
+
+-- * Compositor
+pCompositor = (CS_compositor .) . mkCompositor <$= "compositor" <*> pName <*= "{" <*> pList pCompositorContent <*= "}"
+pCompositorContent = pTechnique
+
+mkCompositor name l = Compositor
+    { cmpName                   = name
+    , cmpTechniques             = [x | C_technique x <- l]
+    , cmpSupportedTechniques    = Nothing
+	}
+
+-- * Technique
+pTechnique = C_technique . mkTechnique <$= "technique" <*= "{" <*> pList pTechniqueContent <*= "}"
+pTechniqueContent =  T_texture         <$= "texture" <*> pName <*> pTexWidth <*> pTexHeight <*> pList (pEnum compositorPixelFormatVals) <*> (True <$= "shared" <|> pSucceed False)
+                 <|> pTarget
+                 <|> pTargetOutput
+
+pTexWidth =  Left       <$> pInt
+         <|> Right 1    <$= "target_width"
+         <|> Right      <$= "target_width_scaled" <*> pFloat
+
+pTexHeight =  Left      <$> pInt
+          <|> Right 1   <$= "target_height"
+          <|> Right     <$= "target_height_scaled" <*> pFloat
+
+mkTechnique l = CompositionTechnique
+    { ctTextureDefinitions  = [mkTextureDefinition n w h p s | T_texture n w h p s <- l]
+    , ctTargetPasses        = [x | T_target x <- l]
+    , ctOutputTarget        = head [x | T_targetoutput x <- l]
+    , ctSchemeName          = "" -- TODO
+    }
+  where 
+    mkTextureDefinition n w h p s = TextureDefinition
+        { tdName            = n
+        , tdWidth           = listToMaybe $ map fromIntegral $ lefts [w]
+        , tdHeight          = listToMaybe $ map fromIntegral $ lefts [h]
+        , tdWidthFactor     = def 1 $ rights [w]
+        , tdHeightFactor    = def 1 $ rights [h]
+        , tdFormatList      = p
+        , tdFsaa            = False
+        , tdHwGammaWrite    = False
+        , tdShared          = s
+        , tdTexture         = Nothing
+        }
+
+-- * Target
+pTargetOutput = T_targetoutput . (mkTarget "output") <$= "target_output" <*= "{" <*> pList pTargetContent <*= "}"
+pTarget = (T_target .) . mkTarget       <$= "target" <*> pName <*= "{" <*> pList pTargetContent <*= "}"
+pTargetContent =  TR_input          <$= "input" <*> pEnum inputVals
+              <|> TR_onlyinitial    <$= "only_initial" <*> pOnOff
+              <|> TR_visibilitymask <$= "visibbility_mask" <*> pInt
+              <|> TR_lodbias        <$= "lod_bias" <*> pFloat
+              <|> TR_materialscheme <$= "material_scheme" <*> pName
+              <|> TR_shadows        <$= "shadows" <*> pOnOff
+              <|> pPass
+
+mkTarget n l = CompositionTargetPass
+    { ctpInputMode      = def IM_NONE       [x | TR_input x <- l]
+    , ctpOutputName     = n
+    , ctpOutput         = Nothing
+    , ctpPasses         = [x | TR_pass x <- l]
+    , ctpOnlyInitial    = def False         [x | TR_onlyinitial x <- l]
+    , ctpVisibilityMask = def 4294967295    [fromIntegral x | TR_visibilitymask x <- l]
+    , ctpLodBias        = def 1             [x | TR_lodbias x <- l]
+    , ctpMaterialScheme = def ""            [x | TR_materialscheme x <- l]
+    , ctpShadowsEnabled = def True          [x | TR_shadows x <- l]
+    }
+
+-- * Pass
+pPass =  TR_pass . (mkPass PT_RENDERQUAD)   <$= "pass" <*= "render_quad" <*= "{" <*> pList pPassRQContent <*= "}"
+     <|> TR_pass . (mkPass PT_CLEAR)        <$= "pass" <*= "clear" <*= "{" <*> pList pPassCContent <*= "}"
+     <|> TR_pass . (mkPass PT_STENCIL)      <$= "pass" <*= "stencil" <*= "{" <*> pList pPassSContent <*= "}"
+     <|> TR_pass . (mkPass PT_RENDERSCENE)  <$= "pass" <*= "render_scene" <*= "{" <*> pList pPassRSContent <*= "}"
+
+pIdentifier = P_identifier <$= "identifier" <*> pInt
+
+pPassRQContent = pIdentifier
+              <|> P_material <$= "material" <*> pName
+              <|> P_input    <$= "input" <*> pInt <*> pName <*> (pInt <|> pSucceed 0)
+
+pPassRSContent =  pIdentifier
+              <|> P_firstrenderqueue <$= "first_render_queue" <*> pInt
+              <|> P_lastrenderqueue  <$= "last_render_queue" <*> pInt
+
+pPassCContent =  pIdentifier
+             <|> P_buffers      <$= "buffers" <*> pList (pKey "colour" <|> pKey "depth" <|> pKey "stencil")
+             <|> P_colourvalue  <$= "colour_value" <*> pRGBA
+             <|> P_depthvalue   <$= "depth_value" <*> pFloat
+             <|> P_stencilvalue <$= "stencil_value" <*> pInt
+
+pPassSContent = pIdentifier
+             <|> P_check       <$= "check" <*> pOnOff
+             <|> P_compfunc    <$= "comp_func" <*> pEnum cmpfuncVals
+             <|> P_refvalue    <$= "ref_value" <*> pInt
+             <|> P_mask        <$= "mask" <*> pInt
+             <|> P_failop      <$= "fail_op" <*> pEnum stencilopVals
+             <|> P_depthfailop <$= "depth_fail_op" <*> pEnum stencilopVals
+             <|> P_passop      <$= "pass_op" <*> pEnum stencilopVals
+             <|> P_twosided    <$= "two_sided" <*> pOnOff
+
+mkPass t l = CompositionPass
+    { cpType                        = t
+    , cpIdentifier                  = def 0             [fromIntegral x | P_identifier x <- l]
+    , cpMaterialName                = def ""            [x | P_material x <- l]
+    , cpMaterial                    = Nothing
+    , cpFirstRenderQueue            = def 5             [x | P_firstrenderqueue x <- l]
+    , cpLastRenderQueue             = def 95            [x | P_lastrenderqueue x <- l]
+    , cpClearBuffers                = def (True,True,False) [(elem "colour" x, elem "depth" x, elem "stencil" x) | P_buffers x <- l]
+    , cpClearColour                 = def (0,0,0,0)     [x | P_colourvalue x <- l]
+    , cpClearDepth                  = def 0             [x | P_depthvalue x <- l]
+    , cpClearStencil                = def 0             [fromIntegral x | P_stencilvalue x <- l]
+    , cpInputs                      = IntMap.fromList   [(i,InputTex n mi) | P_input i n mi <- l]
+    , cpStencilCheck                = def False         [x | P_check x <- l]
+    , cpStencilFunc                 = def CMPF_LESS     [x | P_compfunc x <- l]
+    , cpStencilRefValue             = def 0             [fromIntegral x | P_refvalue x <- l]
+    , cpStencilMask                 = def 0xFFFFFFFF    [fromIntegral x | P_mask x <- l]
+    , cpStencilFailOp               = def SOP_KEEP      [x | P_failop x <- l]
+    , cpStencilDepthFailOp          = def SOP_KEEP      [x | P_depthfailop x <- l]
+    , cpStencilPassOp               = def SOP_KEEP      [x | P_passop x <- l]
+    , cpStencilTwoSidedOperation    = def False         [x | P_twosided x <- l]
+--    , cpQuadCornerModified          :: Bool             -- ^ true if quad should not cover whole screen
+--    , cpQuadLeft                    :: FloatType        -- ^ quad positions in normalised coordinates [-1;1]x[-1;1] (in case of PT_RENDERQUAD)
+--    , cpQuadTop                     :: FloatType
+--    , cpQuadRight                   :: FloatType
+--    , cpQuadBottom                  :: FloatType
+--    , cpQuadFarCorners              :: Bool
+--    , cpQuadFarCornersViewSpace     :: Bool
+    }
+{-
+mkPassS l =
+    (def Nothing [Just x | P_identifier x <- l],
+    CompositionStencilPass
+    { stCheck       = def False [x | P_check x <- l]
+    , stCompFunc    = def CMPF_LESS [x | P_compfunc x <- l]
+    , stRefValue    = def 0 [x | P_refvalue x <- l]
+    , stMask        = def 4294967295 [x | P_mask x <- l]
+    , stFailOp      = def SOP_KEEP [x | P_failop x <- l]
+    , stDepthFailOp = def SOP_KEEP [x | P_depthfailop x <- l]
+    , stPassOp      = def SOP_KEEP [x | P_passop x <- l]
+    , stTwoSided    = def False [x | P_twosided x <- l]
+    })
+mkPassRQ l =
+    (def Nothing [Just x | P_identifier x <- l],
+    CompositionRenderQuadPass
+    { rqMaterial = def "" [x | P_material x <- l]
+    , rqInput    = def (0,"",0) [(a,b,c) | P_input a b c <- l]
+    })
+    
+mkPassC l =
+    (def Nothing [Just x | P_identifier x <- l],
+    CompositionClearPass
+    { clBuffers      = def (True,True,False) [(elem "colour" x, elem "depth" x, elem "stencil" x) | P_buffers x <- l]
+    , clColourValue  = def (0,0,0,0) [x | P_colourvalue x <- l]
+    , clDepthValue   = def 0 [x | P_depthvalue x <- l]
+    , clStencilValue = def 0 [x | P_stencilvalue x <- l]
+    })
+    
+mkPassRS l =
+    (def Nothing [Just x | P_identifier x <- l],
+    CompositionRenderScenePass
+    { rsFirstRenderQueue = def 5 [x | P_firstrenderqueue x <- l]
+    , rsLastRenderQueue  = def 95 [x | P_lastrenderqueue x <- l]
+    })
+    
+-}
diff --git a/Graphics/LambdaCube/Loader/CompositorScriptScanner.x b/Graphics/LambdaCube/Loader/CompositorScriptScanner.x
new file mode 100644
--- /dev/null
+++ b/Graphics/LambdaCube/Loader/CompositorScriptScanner.x
@@ -0,0 +1,63 @@
+{
+-- alex scanner for use with uulib
+--   compile with alex -o Scanner.hs -g Scanner.x
+module Graphics.LambdaCube.Loader.Generated.CompositorScriptScanner(tokenize) where
+
+import UU.Scanner
+}
+
+$litChar   = [^[\" \\]]
+$identChar = [a-zA-Z0-9_\.\-\/\~\&]
+
+
+tokens :-
+  $white+                                      ;                               -- whitespace
+  "//".*                                       ;                               -- comment
+
+  \" ($litChar | \\ \\ | \\ \" )* \"           { valueToken TkString }         -- string
+  [0-9]+                                       { valueToken TkInteger10 }      -- int
+  [0-9]+\.[0-9]+                               { valueToken TkFraction }       -- float
+  
+  ( 
+    on | off |
+    compositor | technique | texture | target_width | target_height | target_width_scaled | target_height_scaled | shared |
+    PF_A8R8G8B8 | PF_R8G8B8A8 | PF_R8G8B8 | PF_FLOAT16_RGBA | PF_FLOAT16_RGB | PF_FLOAT16_R | PF_FLOAT32_RGBA | PF_FLOAT32_RGB | PF_FLOAT32_R | 
+    target | target_output | input | none | previous | only_initial | visibility_mask | lod_bias | shadows | material_scheme |
+    pass | render_quad | clear | stencil | render_scene | material |  identifier | first_render_queue | last_render_queue |
+    buffers | colour | depth | colour_value | depth_value | stencil_value | check | comp_func |
+    always_fail | always_pass | less | less_equal | not_equal | greater_equal | greater | ref_value | mask | fail_op |
+    keep | zero | replace | increment | decrement | increment_wrap | decrement_wrap | invert | depth_fail_op | pass_op | two_sided
+  )                                            { reserved }                    -- reserved keywords
+  [\{\}]                                       { reserved }                    -- reserved symbols
+
+  $identChar+                                  { valueToken TkVarid }          -- identifier
+
+
+{
+-- boilerplate code needed for Alex
+type AlexInput = (Pos, String)
+
+alexInputPrevChar :: AlexInput -> Char
+alexInputPrevChar = error "alexInputPrevChar: there is no need to go back in the input."
+
+alexGetChar :: AlexInput -> Maybe (Char, AlexInput)
+alexGetChar (_, []) = Nothing
+alexGetChar (p, (c:cs))
+  = let p' = adv p c
+    in Just (c, (p', cs))
+
+-- use the Alex scanner to generate a list of tokens for the uulib token parsers
+tokenize :: String -> String -> [Token]
+tokenize filename str
+  = go (initpos, str)
+  where
+    initpos = Pos 1 1 filename
+    
+    go inp@(pos, cs)
+      = case alexScan inp 0 of
+          AlexEOF         -> []
+          AlexError inp'  -> valueToken TkError [head cs] pos : go inp'
+          AlexSkip inp' _ -> go inp'
+          AlexToken inp' len act -> act (take len cs) pos : go inp'
+}
+
diff --git a/Graphics/LambdaCube/Loader/FontDefinitionScriptScanner.x b/Graphics/LambdaCube/Loader/FontDefinitionScriptScanner.x
new file mode 100644
--- /dev/null
+++ b/Graphics/LambdaCube/Loader/FontDefinitionScriptScanner.x
@@ -0,0 +1,56 @@
+{
+-- alex scanner for use with uulib
+--   compile with alex -o Scanner.hs -g Scanner.x
+module Graphics.LambdaCube.Loader.Generated.FontDefinitionScriptScanner(tokenize) where
+
+import UU.Scanner
+}
+
+$litChar   = [^[\" \\]]
+$identChar = [a-zA-Z0-9_\.\-\/\~]
+
+
+tokens :-
+  $white+                                      ;                               -- whitespace
+  "//".*                                       ;                               -- comment
+
+  \" ($litChar | \\ \\ | \\ \" )* \"           { valueToken TkString }         -- string
+  [0-9]+                                       { valueToken TkInteger16 }      -- int
+  
+  ( type | image | truetype |
+    source | glyph | size |
+    resolution | antialias_colour |
+    true | false | code_points )               { reserved }                    -- reserved keywords
+  [\{\}]                                       { reserved }                    -- reserved symbols
+
+  $identChar+                                  { valueToken TkVarid }          -- identifier
+
+
+{
+-- boilerplate code needed for Alex
+type AlexInput = (Pos, String)
+
+alexInputPrevChar :: AlexInput -> Char
+alexInputPrevChar = error "alexInputPrevChar: there is no need to go back in the input."
+
+alexGetChar :: AlexInput -> Maybe (Char, AlexInput)
+alexGetChar (_, []) = Nothing
+alexGetChar (p, (c:cs))
+  = let p' = adv p c
+    in Just (c, (p', cs))
+
+-- use the Alex scanner to generate a list of tokens for the uulib token parsers
+tokenize :: String -> String -> [Token]
+tokenize filename str
+  = go (initpos, str)
+  where
+    initpos = Pos 1 1 filename
+    
+    go inp@(pos, cs)
+      = case alexScan inp 0 of
+          AlexEOF         -> []
+          AlexError inp'  -> valueToken TkError [head cs] pos : go inp'
+          AlexSkip inp' _ -> go inp'
+          AlexToken inp' len act -> act (take len cs) pos : go inp'
+}
+
diff --git a/Graphics/LambdaCube/Loader/Generated/CompositorScriptScanner.hs b/Graphics/LambdaCube/Loader/Generated/CompositorScriptScanner.hs
new file mode 100644
--- /dev/null
+++ b/Graphics/LambdaCube/Loader/Generated/CompositorScriptScanner.hs
@@ -0,0 +1,268 @@
+{-# OPTIONS -fglasgow-exts -cpp #-}
+{-# LINE 1 "CompositorScriptScanner.x" #-}
+
+-- alex scanner for use with uulib
+--   compile with alex -o Scanner.hs -g Scanner.x
+module Graphics.LambdaCube.Loader.Generated.CompositorScriptScanner(tokenize) where
+
+import UU.Scanner
+
+#if __GLASGOW_HASKELL__ >= 603
+#include "ghcconfig.h"
+#elif defined(__GLASGOW_HASKELL__)
+#include "config.h"
+#endif
+#if __GLASGOW_HASKELL__ >= 503
+import Data.Array
+import Data.Char (ord)
+import Data.Array.Base (unsafeAt)
+#else
+import Array
+import Char (ord)
+#endif
+#if __GLASGOW_HASKELL__ >= 503
+import GHC.Exts
+#else
+import GlaExts
+#endif
+alex_base :: AlexAddr
+alex_base = AlexA# "\xf8\xff\xff\xff\xfd\xff\xff\xff\x02\x00\x00\x00\x4e\x00\x00\x00\x06\x00\x00\x00\xa4\x00\x00\x00\xf9\x00\x00\x00\x00\x00\x00\x00\x6a\x01\x00\x00\x6b\x01\x00\x00\xf7\xff\xff\xff\x69\x01\x00\x00\xbe\x01\x00\x00\x13\x02\x00\x00\x68\x02\x00\x00\xbd\x02\x00\x00\x12\x03\x00\x00\x67\x03\x00\x00\xbc\x03\x00\x00\x11\x04\x00\x00\x66\x04\x00\x00\xbb\x04\x00\x00\x10\x05\x00\x00\x65\x05\x00\x00\xba\x05\x00\x00\x0f\x06\x00\x00\x64\x06\x00\x00\xb9\x06\x00\x00\x0e\x07\x00\x00\x63\x07\x00\x00\xb8\x07\x00\x00\x0d\x08\x00\x00\x62\x08\x00\x00\xb7\x08\x00\x00\x0c\x09\x00\x00\x61\x09\x00\x00\xb6\x09\x00\x00\x0b\x0a\x00\x00\x60\x0a\x00\x00\xb5\x0a\x00\x00\x0a\x0b\x00\x00\x5f\x0b\x00\x00\xb4\x0b\x00\x00\x09\x0c\x00\x00\x5e\x0c\x00\x00\xb3\x0c\x00\x00\x08\x0d\x00\x00\x5d\x0d\x00\x00\xb2\x0d\x00\x00\x07\x0e\x00\x00\x5c\x0e\x00\x00\xb1\x0e\x00\x00\x06\x0f\x00\x00\x5b\x0f\x00\x00\xb0\x0f\x00\x00\x05\x10\x00\x00\x5a\x10\x00\x00\xaf\x10\x00\x00\x04\x11\x00\x00\x59\x11\x00\x00\xae\x11\x00\x00\x03\x12\x00\x00\x58\x12\x00\x00\xad\x12\x00\x00\x02\x13\x00\x00\x57\x13\x00\x00\xac\x13\x00\x00\x01\x14\x00\x00\x56\x14\x00\x00\xab\x14\x00\x00\x00\x15\x00\x00\x55\x15\x00\x00\xaa\x15\x00\x00\xff\x15\x00\x00\x54\x16\x00\x00\xa9\x16\x00\x00\xfe\x16\x00\x00\x53\x17\x00\x00\xa8\x17\x00\x00\xfd\x17\x00\x00\x52\x18\x00\x00\xa7\x18\x00\x00\xfc\x18\x00\x00\x51\x19\x00\x00\xa6\x19\x00\x00\xfb\x19\x00\x00\x50\x1a\x00\x00\xa5\x1a\x00\x00\xfa\x1a\x00\x00\x4f\x1b\x00\x00\xa4\x1b\x00\x00\xf9\x1b\x00\x00\x4e\x1c\x00\x00\xa3\x1c\x00\x00\xf8\x1c\x00\x00\x4d\x1d\x00\x00\xa2\x1d\x00\x00\xf7\x1d\x00\x00\x4c\x1e\x00\x00\xa1\x1e\x00\x00\xf6\x1e\x00\x00\x4b\x1f\x00\x00\xa0\x1f\x00\x00\xf5\x1f\x00\x00\x4a\x20\x00\x00\x9f\x20\x00\x00\xf4\x20\x00\x00\x49\x21\x00\x00\x9e\x21\x00\x00\xf3\x21\x00\x00\x48\x22\x00\x00\x9d\x22\x00\x00\xf2\x22\x00\x00\x47\x23\x00\x00\x9c\x23\x00\x00\xf1\x23\x00\x00\x46\x24\x00\x00\x9b\x24\x00\x00\xf0\x24\x00\x00\x45\x25\x00\x00\x9a\x25\x00\x00\xef\x25\x00\x00\x44\x26\x00\x00\x99\x26\x00\x00\xee\x26\x00\x00\x43\x27\x00\x00\x98\x27\x00\x00\xed\x27\x00\x00\x42\x28\x00\x00\x97\x28\x00\x00\xec\x28\x00\x00\x41\x29\x00\x00\x96\x29\x00\x00\xeb\x29\x00\x00\x40\x2a\x00\x00\x95\x2a\x00\x00\xea\x2a\x00\x00\x3f\x2b\x00\x00\x94\x2b\x00\x00\xe9\x2b\x00\x00\x3e\x2c\x00\x00\x93\x2c\x00\x00\xe8\x2c\x00\x00\x3d\x2d\x00\x00\x92\x2d\x00\x00\xe7\x2d\x00\x00\x3c\x2e\x00\x00\x91\x2e\x00\x00\xe6\x2e\x00\x00\x3b\x2f\x00\x00\x90\x2f\x00\x00\xe5\x2f\x00\x00\x3a\x30\x00\x00\x8f\x30\x00\x00\xe4\x30\x00\x00\x39\x31\x00\x00\x8e\x31\x00\x00\xe3\x31\x00\x00\x38\x32\x00\x00\x8d\x32\x00\x00\xe2\x32\x00\x00\x37\x33\x00\x00\x8c\x33\x00\x00\xe1\x33\x00\x00\x36\x34\x00\x00\x8b\x34\x00\x00\xe0\x34\x00\x00\x35\x35\x00\x00\x8a\x35\x00\x00\xdf\x35\x00\x00\x34\x36\x00\x00\x89\x36\x00\x00\xde\x36\x00\x00\x33\x37\x00\x00\x88\x37\x00\x00\xdd\x37\x00\x00\x32\x38\x00\x00\x87\x38\x00\x00\xdc\x38\x00\x00\x31\x39\x00\x00\x86\x39\x00\x00\xdb\x39\x00\x00\x30\x3a\x00\x00\x85\x3a\x00\x00\xda\x3a\x00\x00\x2f\x3b\x00\x00\x84\x3b\x00\x00\xd9\x3b\x00\x00\x2e\x3c\x00\x00\x83\x3c\x00\x00\xd8\x3c\x00\x00\x2d\x3d\x00\x00\x82\x3d\x00\x00\xd7\x3d\x00\x00\x2c\x3e\x00\x00\x81\x3e\x00\x00\xd6\x3e\x00\x00\x2b\x3f\x00\x00\x80\x3f\x00\x00\xd5\x3f\x00\x00\x2a\x40\x00\x00\x7f\x40\x00\x00\xd4\x40\x00\x00\x29\x41\x00\x00\x7e\x41\x00\x00\xd3\x41\x00\x00\x28\x42\x00\x00\x7d\x42\x00\x00\xd2\x42\x00\x00\x27\x43\x00\x00\x7c\x43\x00\x00\xd1\x43\x00\x00\x26\x44\x00\x00\x7b\x44\x00\x00\xd0\x44\x00\x00\x25\x45\x00\x00\x7a\x45\x00\x00\xcf\x45\x00\x00\x24\x46\x00\x00\x79\x46\x00\x00\xce\x46\x00\x00\x23\x47\x00\x00\x78\x47\x00\x00\xcd\x47\x00\x00\x22\x48\x00\x00\x77\x48\x00\x00\xcc\x48\x00\x00\x21\x49\x00\x00\x76\x49\x00\x00\xcb\x49\x00\x00\x20\x4a\x00\x00\x75\x4a\x00\x00\xca\x4a\x00\x00\x1f\x4b\x00\x00\x74\x4b\x00\x00\xc9\x4b\x00\x00\x1e\x4c\x00\x00\x73\x4c\x00\x00\xc8\x4c\x00\x00\x1d\x4d\x00\x00\x72\x4d\x00\x00\xc7\x4d\x00\x00\x1c\x4e\x00\x00\x71\x4e\x00\x00\xc6\x4e\x00\x00\x1b\x4f\x00\x00\x70\x4f\x00\x00\xc5\x4f\x00\x00\x1a\x50\x00\x00\x6f\x50\x00\x00\xc4\x50\x00\x00\x19\x51\x00\x00\x6e\x51\x00\x00\xc3\x51\x00\x00\x18\x52\x00\x00\x6d\x52\x00\x00\xc2\x52\x00\x00\x17\x53\x00\x00\x6c\x53\x00\x00\xc1\x53\x00\x00\x16\x54\x00\x00\x6b\x54\x00\x00\xc0\x54\x00\x00\x15\x55\x00\x00\x6a\x55\x00\x00\xbf\x55\x00\x00\x14\x56\x00\x00\x69\x56\x00\x00\xbe\x56\x00\x00\x13\x57\x00\x00\x68\x57\x00\x00\xbd\x57\x00\x00\x12\x58\x00\x00\x67\x58\x00\x00\xbc\x58\x00\x00\x11\x59\x00\x00\x66\x59\x00\x00\xbb\x59\x00\x00\x10\x5a\x00\x00\x65\x5a\x00\x00\xba\x5a\x00\x00\x0f\x5b\x00\x00\x64\x5b\x00\x00\xb9\x5b\x00\x00\x0e\x5c\x00\x00\x63\x5c\x00\x00\xb8\x5c\x00\x00\x0d\x5d\x00\x00\x62\x5d\x00\x00\xb7\x5d\x00\x00\x0c\x5e\x00\x00\x61\x5e\x00\x00\xb6\x5e\x00\x00\x0b\x5f\x00\x00\x60\x5f\x00\x00\xb5\x5f\x00\x00\x0a\x60\x00\x00\x5f\x60\x00\x00\xb4\x60\x00\x00\x09\x61\x00\x00\x5e\x61\x00\x00\xb3\x61\x00\x00\x08\x62\x00\x00\x5d\x62\x00\x00\xb2\x62\x00\x00\x07\x63\x00\x00\x5c\x63\x00\x00\xb1\x63\x00\x00\x06\x64\x00\x00\x5b\x64\x00\x00\xb0\x64\x00\x00\x05\x65\x00\x00\x5a\x65\x00\x00\xaf\x65\x00\x00\x04\x66\x00\x00\x59\x66\x00\x00\xae\x66\x00\x00\x03\x67\x00\x00\x58\x67\x00\x00\xad\x67\x00\x00\x02\x68\x00\x00\x57\x68\x00\x00\xac\x68\x00\x00\x01\x69\x00\x00\x56\x69\x00\x00\xab\x69\x00\x00\x00\x6a\x00\x00\x55\x6a\x00\x00\xaa\x6a\x00\x00\xff\x6a\x00\x00\x54\x6b\x00\x00\xa9\x6b\x00\x00\xfe\x6b\x00\x00\x53\x6c\x00\x00\xa8\x6c\x00\x00\xfd\x6c\x00\x00\x52\x6d\x00\x00\xa7\x6d\x00\x00\xfc\x6d\x00\x00\x51\x6e\x00\x00\xa6\x6e\x00\x00\xfb\x6e\x00\x00\x50\x6f\x00\x00\xa5\x6f\x00\x00\xfa\x6f\x00\x00\x4f\x70\x00\x00\xa4\x70\x00\x00\xf9\x70\x00\x00\x4e\x71\x00\x00\xa3\x71\x00\x00\xf8\x71\x00\x00\x4d\x72\x00\x00\xa2\x72\x00\x00\xf7\x72\x00\x00\x4c\x73\x00\x00\xa1\x73\x00\x00\xf6\x73\x00\x00\x4b\x74\x00\x00\xa0\x74\x00\x00\xf5\x74\x00\x00\x4a\x75\x00\x00\x9f\x75\x00\x00\xf4\x75\x00\x00\x49\x76\x00\x00\x9e\x76\x00\x00\xf3\x76\x00\x00\x48\x77\x00\x00\x9d\x77\x00\x00\xf2\x77\x00\x00\x47\x78\x00\x00\x9c\x78\x00\x00\xf1\x78\x00\x00\x46\x79\x00\x00\x9b\x79\x00\x00\xf0\x79\x00\x00\x45\x7a\x00\x00\x9a\x7a\x00\x00\x00\x00\x00\x00\xef\x7a\x00\x00"#
+
+alex_table :: AlexAddr
+alex_table = AlexA# "\x00\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x09\x00\x08\x00\x00\x00\x00\x00\x02\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x06\x00\x0b\x00\x0b\x00\x0b\x00\x0b\x00\x0b\x00\x0b\x00\x0b\x00\x0b\x00\x0b\x00\x0b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x60\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x09\x00\x00\x00\x00\x00\x00\x00\x7a\x01\xff\xff\x21\x01\xfa\x00\x2b\x00\x01\x01\x7a\x01\xe5\x00\x3c\x01\x7a\x01\x7c\x00\x7a\x01\x4b\x01\xa4\x00\xb4\x00\x7f\x00\x21\x00\x86\x00\x7a\x01\xc0\x00\x56\x00\x33\x00\x7a\x01\x9d\x00\x7a\x01\x7a\x01\x7a\x01\x4e\x01\x79\x01\x05\x00\x79\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\xff\xff\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x00\x00\x05\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x7a\x01\x00\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x03\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xff\xff\xff\xff\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x07\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x0d\x00\x7a\x01\x0b\x00\x0b\x00\x0b\x00\x0b\x00\x0b\x00\x0b\x00\x0b\x00\x0b\x00\x0b\x00\x0b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x0a\x00\x0a\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x3c\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x4b\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x51\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x67\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x70\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x8f\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\xad\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x06\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x0b\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x10\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x2b\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x36\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x62\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x66\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x71\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x22\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x16\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x20\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x20\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x23\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x24\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x25\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x26\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x17\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x27\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x28\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xfd\x00\x29\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x13\x01\x7a\x01\x7a\x01\x7a\x01\xc3\x00\x7a\x01\x7a\x01\x2a\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x20\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x2c\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x2d\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x2e\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x2f\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x30\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x31\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x37\x00\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x40\x00\x7a\x01\x7a\x01\x7a\x01\x32\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x78\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x20\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x34\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x35\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x36\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x0f\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x38\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x39\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x3a\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x45\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x78\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x3b\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x0e\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x3d\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x3e\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x3f\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x10\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x41\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x42\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x43\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x44\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x20\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x46\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x47\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x48\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x49\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x4a\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x20\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x4c\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x4d\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x4e\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x4f\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x50\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x20\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x52\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\xa7\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x53\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x54\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x55\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xc8\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x20\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x57\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x58\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x59\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x5a\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x5b\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x5c\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5d\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x6f\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x66\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x5f\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x20\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x11\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x62\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x63\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x64\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x65\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x12\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x13\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x68\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x69\x00\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x6a\x00\x7a\x01\x73\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x6b\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6c\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x6d\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x6e\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x14\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x15\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x71\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x72\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x20\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x74\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x75\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x76\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x77\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x20\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x79\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x58\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x69\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\xd4\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7b\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x20\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7d\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x31\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7e\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x20\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x80\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x81\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x82\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x83\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x84\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\xb6\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x85\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x20\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x87\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x88\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x89\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x8a\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x8b\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x8c\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x8d\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x8e\x00\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x20\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x90\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x91\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x92\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x93\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x94\x00\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x95\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x96\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x97\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x98\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x99\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x9a\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x9b\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x9c\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x20\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x9e\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x9f\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\xa0\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\xa1\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\xa2\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\xf4\x00\x7a\x01\x7a\x01\x7a\x01\x26\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xa3\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x20\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xa5\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xa6\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x20\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xa8\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xa9\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xaa\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\xab\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xac\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x17\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\xae\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xaf\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xb0\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xb1\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x43\x01\xb2\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\xb3\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x1f\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xb5\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x20\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\xb7\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xb8\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xb9\x00\x7a\x01\xcc\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\xba\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xbb\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xbc\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\xbd\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x42\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xbe\x00\x7a\x01\x52\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xbf\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x20\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\xc1\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xc2\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x1a\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xc4\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\xc5\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xc6\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xc7\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x20\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xc9\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xca\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\xcb\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x20\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xcd\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xce\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xcf\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xd0\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xd1\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xd2\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xd3\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x20\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xd5\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xd6\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xd7\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xd8\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\xd9\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xda\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xdb\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\xdc\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xdd\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xde\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xdf\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\xe0\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xe1\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xe2\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xe3\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x48\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xe4\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x20\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xe6\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xe7\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xe8\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xe9\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\xea\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xeb\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xec\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\xed\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xee\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xef\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xf0\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\xf1\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xf2\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xf3\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x20\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xf5\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xf6\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xf7\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xf8\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xf9\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x18\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xfb\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xfc\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x19\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xfe\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x5e\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xff\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x20\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x02\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x03\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x04\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x05\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x20\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x07\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x08\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x09\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x6f\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x0a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x20\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x0c\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x0d\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x0e\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x0f\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x20\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x11\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x12\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x20\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x14\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x15\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x16\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x20\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x18\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x19\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x1a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x24\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x1b\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x1c\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x1d\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x1e\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x1f\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x20\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x20\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x22\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x23\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x1b\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x25\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x20\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x27\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x28\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x29\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x2a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x20\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x2c\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x2d\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x2e\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x2f\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x30\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x20\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x32\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x33\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x34\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x35\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x1c\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x37\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x38\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x39\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x3a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x3b\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x20\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x3d\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x3e\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x3f\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x40\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x41\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x20\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x20\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x44\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x45\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x46\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x47\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x20\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x49\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x4a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x20\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x4c\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x4d\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x20\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x4f\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x50\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x51\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x1d\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x53\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x54\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x55\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x56\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x57\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x1e\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x59\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x5a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x5b\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x5c\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x5d\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x20\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x5f\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x60\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x61\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x20\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x63\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x64\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x65\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x20\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x67\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x68\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x20\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x6a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x6b\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x6c\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x6d\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x6e\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x20\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x70\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x20\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x72\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x73\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x74\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x75\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x76\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x77\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"#
+
+alex_check :: AlexAddr
+alex_check = AlexA# "\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\x22\x00\x22\x00\xff\xff\xff\xff\x20\x00\x26\x00\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5c\x00\xff\xff\xff\xff\xff\xff\x5f\x00\x0a\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x26\x00\x7d\x00\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\x0a\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x26\x00\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x0a\x00\x0a\x00\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x22\x00\x22\x00\xff\xff\x26\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\x5c\x00\x5c\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"#
+
+alex_deflt :: AlexAddr
+alex_deflt = AlexA# "\xff\xff\xff\xff\xff\xff\x04\x00\x04\x00\x04\x00\xff\xff\xff\xff\x09\x00\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"#
+
+alex_accept = listArray (0::Int,378) [[],[],[(AlexAccSkip)],[(AlexAccSkip)],[(AlexAccSkip)],[(AlexAccSkip)],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_2))],[],[],[],[(AlexAcc (alex_action_3))],[(AlexAcc (alex_action_4))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_5))],[(AlexAcc (alex_action_5))],[(AlexAcc (alex_action_5))],[(AlexAcc (alex_action_5))],[(AlexAcc (alex_action_5))],[(AlexAcc (alex_action_5))],[(AlexAcc (alex_action_5))],[(AlexAcc (alex_action_5))],[(AlexAcc (alex_action_5))],[(AlexAcc (alex_action_5))],[(AlexAcc (alex_action_5))],[(AlexAcc (alex_action_5))],[(AlexAcc (alex_action_5))],[(AlexAcc (alex_action_5))],[(AlexAcc (alex_action_5))],[(AlexAcc (alex_action_5))],[(AlexAcc (alex_action_5))],[(AlexAcc (alex_action_5))],[(AlexAcc (alex_action_5))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_6))],[(AlexAcc (alex_action_7))]]
+{-# LINE 36 "CompositorScriptScanner.x" #-}
+
+-- boilerplate code needed for Alex
+type AlexInput = (Pos, String)
+
+alexInputPrevChar :: AlexInput -> Char
+alexInputPrevChar = error "alexInputPrevChar: there is no need to go back in the input."
+
+alexGetChar :: AlexInput -> Maybe (Char, AlexInput)
+alexGetChar (_, []) = Nothing
+alexGetChar (p, (c:cs))
+  = let p' = adv p c
+    in Just (c, (p', cs))
+
+-- use the Alex scanner to generate a list of tokens for the uulib token parsers
+tokenize :: String -> String -> [Token]
+tokenize filename str
+  = go (initpos, str)
+  where
+    initpos = Pos 1 1 filename
+    
+    go inp@(pos, cs)
+      = case alexScan inp 0 of
+          AlexEOF         -> []
+          AlexError inp'  -> valueToken TkError [head cs] pos : go inp'
+          AlexSkip inp' _ -> go inp'
+          AlexToken inp' len act -> act (take len cs) pos : go inp'
+
+alex_action_2 =  valueToken TkString 
+alex_action_3 =  valueToken TkInteger10 
+alex_action_4 =  valueToken TkFraction 
+alex_action_5 =  reserved 
+alex_action_6 =  reserved 
+alex_action_7 =  valueToken TkVarid 
+{-# LINE 1 "templates/GenericTemplate.hs" #-}
+{-# LINE 1 "templates/GenericTemplate.hs" #-}
+{-# LINE 1 "<built-in>" #-}
+{-# LINE 1 "<command-line>" #-}
+{-# LINE 1 "templates/GenericTemplate.hs" #-}
+-- -----------------------------------------------------------------------------
+-- ALEX TEMPLATE
+--
+-- This code is in the PUBLIC DOMAIN; you may copy it freely and use
+-- it for any purpose whatsoever.
+
+-- -----------------------------------------------------------------------------
+-- INTERNALS and main scanner engine
+
+{-# LINE 35 "templates/GenericTemplate.hs" #-}
+
+{-# LINE 45 "templates/GenericTemplate.hs" #-}
+
+
+data AlexAddr = AlexA# Addr#
+
+#if __GLASGOW_HASKELL__ < 503
+uncheckedShiftL# = shiftL#
+#endif
+
+{-# INLINE alexIndexInt16OffAddr #-}
+alexIndexInt16OffAddr (AlexA# arr) off =
+#ifdef WORDS_BIGENDIAN
+  narrow16Int# i
+  where
+	i    = word2Int# ((high `uncheckedShiftL#` 8#) `or#` low)
+	high = int2Word# (ord# (indexCharOffAddr# arr (off' +# 1#)))
+	low  = int2Word# (ord# (indexCharOffAddr# arr off'))
+	off' = off *# 2#
+#else
+  indexInt16OffAddr# arr off
+#endif
+
+
+
+
+
+{-# INLINE alexIndexInt32OffAddr #-}
+alexIndexInt32OffAddr (AlexA# arr) off = 
+#ifdef WORDS_BIGENDIAN
+  narrow32Int# i
+  where
+   i    = word2Int# ((b3 `uncheckedShiftL#` 24#) `or#`
+		     (b2 `uncheckedShiftL#` 16#) `or#`
+		     (b1 `uncheckedShiftL#` 8#) `or#` b0)
+   b3   = int2Word# (ord# (indexCharOffAddr# arr (off' +# 3#)))
+   b2   = int2Word# (ord# (indexCharOffAddr# arr (off' +# 2#)))
+   b1   = int2Word# (ord# (indexCharOffAddr# arr (off' +# 1#)))
+   b0   = int2Word# (ord# (indexCharOffAddr# arr off'))
+   off' = off *# 4#
+#else
+  indexInt32OffAddr# arr off
+#endif
+
+
+
+
+
+#if __GLASGOW_HASKELL__ < 503
+quickIndex arr i = arr ! i
+#else
+-- GHC >= 503, unsafeAt is available from Data.Array.Base.
+quickIndex = unsafeAt
+#endif
+
+
+
+
+-- -----------------------------------------------------------------------------
+-- Main lexing routines
+
+data AlexReturn a
+  = AlexEOF
+  | AlexError  !AlexInput
+  | AlexSkip   !AlexInput !Int
+  | AlexToken  !AlexInput !Int a
+
+-- alexScan :: AlexInput -> StartCode -> AlexReturn a
+alexScan input (I# (sc))
+  = alexScanUser undefined input (I# (sc))
+
+alexScanUser user input (I# (sc))
+  = case alex_scan_tkn user input 0# input sc AlexNone of
+	(AlexNone, input') ->
+		case alexGetChar input of
+			Nothing -> 
+
+
+
+				   AlexEOF
+			Just _ ->
+
+
+
+				   AlexError input'
+
+	(AlexLastSkip input len, _) ->
+
+
+
+		AlexSkip input len
+
+	(AlexLastAcc k input len, _) ->
+
+
+
+		AlexToken input len k
+
+
+-- Push the input through the DFA, remembering the most recent accepting
+-- state it encountered.
+
+alex_scan_tkn user orig_input len input s last_acc =
+  input `seq` -- strict in the input
+  let 
+	new_acc = check_accs (alex_accept `quickIndex` (I# (s)))
+  in
+  new_acc `seq`
+  case alexGetChar input of
+     Nothing -> (new_acc, input)
+     Just (c, new_input) -> 
+
+
+
+	let
+		base   = alexIndexInt32OffAddr alex_base s
+		(I# (ord_c)) = ord c
+		offset = (base +# ord_c)
+		check  = alexIndexInt16OffAddr alex_check offset
+		
+		new_s = if (offset >=# 0#) && (check ==# ord_c)
+			  then alexIndexInt16OffAddr alex_table offset
+			  else alexIndexInt16OffAddr alex_deflt s
+	in
+	case new_s of 
+	    -1# -> (new_acc, input)
+		-- on an error, we want to keep the input *before* the
+		-- character that failed, not after.
+    	    _ -> alex_scan_tkn user orig_input (len +# 1#) 
+			new_input new_s new_acc
+
+  where
+	check_accs [] = last_acc
+	check_accs (AlexAcc a : _) = AlexLastAcc a input (I# (len))
+	check_accs (AlexAccSkip : _)  = AlexLastSkip  input (I# (len))
+	check_accs (AlexAccPred a pred : rest)
+	   | pred user orig_input (I# (len)) input
+	   = AlexLastAcc a input (I# (len))
+	check_accs (AlexAccSkipPred pred : rest)
+	   | pred user orig_input (I# (len)) input
+	   = AlexLastSkip input (I# (len))
+	check_accs (_ : rest) = check_accs rest
+
+data AlexLastAcc a
+  = AlexNone
+  | AlexLastAcc a !AlexInput !Int
+  | AlexLastSkip  !AlexInput !Int
+
+data AlexAcc a user
+  = AlexAcc a
+  | AlexAccSkip
+  | AlexAccPred a (AlexAccPred user)
+  | AlexAccSkipPred (AlexAccPred user)
+
+type AlexAccPred user = user -> AlexInput -> Int -> AlexInput -> Bool
+
+-- -----------------------------------------------------------------------------
+-- Predicates on a rule
+
+alexAndPred p1 p2 user in1 len in2
+  = p1 user in1 len in2 && p2 user in1 len in2
+
+--alexPrevCharIsPred :: Char -> AlexAccPred _ 
+alexPrevCharIs c _ input _ _ = c == alexInputPrevChar input
+
+--alexPrevCharIsOneOfPred :: Array Char Bool -> AlexAccPred _ 
+alexPrevCharIsOneOf arr _ input _ _ = arr ! alexInputPrevChar input
+
+--alexRightContext :: Int -> AlexAccPred _
+alexRightContext (I# (sc)) user _ _ input = 
+     case alex_scan_tkn user input 0# input sc AlexNone of
+	  (AlexNone, _) -> False
+	  _ -> True
+	-- TODO: there's no need to find the longest
+	-- match when checking the right context, just
+	-- the first match will do.
+
+-- used by wrappers
+iUnbox (I# (i)) = i
diff --git a/Graphics/LambdaCube/Loader/Generated/MaterialScriptScanner.hs b/Graphics/LambdaCube/Loader/Generated/MaterialScriptScanner.hs
new file mode 100644
# file too large to diff: Graphics/LambdaCube/Loader/Generated/MaterialScriptScanner.hs
diff --git a/Graphics/LambdaCube/Loader/Generated/ResourceScriptScanner.hs b/Graphics/LambdaCube/Loader/Generated/ResourceScriptScanner.hs
new file mode 100644
--- /dev/null
+++ b/Graphics/LambdaCube/Loader/Generated/ResourceScriptScanner.hs
@@ -0,0 +1,265 @@
+{-# OPTIONS -fglasgow-exts -cpp #-}
+{-# LINE 1 "ResourceScriptScanner.x" #-}
+
+-- alex scanner for use with uulib
+--   compile with alex -o Scanner.hs -g Scanner.x
+module Graphics.LambdaCube.Loader.Generated.ResourceScriptScanner(tokenize) where
+
+import UU.Scanner
+
+#if __GLASGOW_HASKELL__ >= 603
+#include "ghcconfig.h"
+#elif defined(__GLASGOW_HASKELL__)
+#include "config.h"
+#endif
+#if __GLASGOW_HASKELL__ >= 503
+import Data.Array
+import Data.Char (ord)
+import Data.Array.Base (unsafeAt)
+#else
+import Array
+import Char (ord)
+#endif
+#if __GLASGOW_HASKELL__ >= 503
+import GHC.Exts
+#else
+import GlaExts
+#endif
+alex_base :: AlexAddr
+alex_base = AlexA# "\xf8\xff\xff\xff\xfd\xff\xff\xff\x02\x00\x00\x00\x06\x00\x00\x00\x07\x00\x00\x00\x46\x00\x00\x00\x94\x00\x00\x00\xe2\x00\x00\x00\x30\x01\x00\x00\x7e\x01\x00\x00\xcc\x01\x00\x00\x1a\x02\x00\x00\x68\x02\x00\x00\xb6\x02\x00\x00\x04\x03\x00\x00\x52\x03\x00\x00\xa0\x03\x00\x00\x00\x00\x00\x00\xee\x03\x00\x00"#
+
+alex_table :: AlexAddr
+alex_table = AlexA# "\x00\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x03\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x11\x00\x00\x00\x00\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x0e\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x10\x00\x11\x00\x00\x00\x11\x00\x00\x00\x12\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x05\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x06\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x07\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x08\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x09\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x0a\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x0b\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x0c\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x0d\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x05\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x0f\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"#
+
+alex_check :: AlexAddr
+alex_check = AlexA# "\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0a\x00\x0a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\x23\x00\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\x3d\x00\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\xff\xff\x5d\x00\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"#
+
+alex_deflt :: AlexAddr
+alex_deflt = AlexA# "\xff\xff\xff\xff\xff\xff\x04\x00\x04\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"#
+
+alex_accept = listArray (0::Int,18) [[],[],[(AlexAccSkip)],[(AlexAccSkip)],[(AlexAccSkip)],[(AlexAcc (alex_action_2))],[(AlexAcc (alex_action_4))],[(AlexAcc (alex_action_4))],[(AlexAcc (alex_action_4))],[(AlexAcc (alex_action_4))],[(AlexAcc (alex_action_4))],[(AlexAcc (alex_action_4))],[(AlexAcc (alex_action_4))],[(AlexAcc (alex_action_4))],[(AlexAcc (alex_action_4))],[(AlexAcc (alex_action_4))],[(AlexAcc (alex_action_4))],[(AlexAcc (alex_action_3))],[(AlexAcc (alex_action_4))]]
+{-# LINE 25 "ResourceScriptScanner.x" #-}
+
+-- boilerplate code needed for Alex
+type AlexInput = (Pos, String)
+
+alexInputPrevChar :: AlexInput -> Char
+alexInputPrevChar = error "alexInputPrevChar: there is no need to go back in the input."
+
+alexGetChar :: AlexInput -> Maybe (Char, AlexInput)
+alexGetChar (_, []) = Nothing
+alexGetChar (p, (c:cs))
+  = let p' = adv p c
+    in Just (c, (p', cs))
+
+-- use the Alex scanner to generate a list of tokens for the uulib token parsers
+tokenize :: String -> String -> [Token]
+tokenize filename str
+  = go (initpos, str)
+  where
+    initpos = Pos 1 1 filename
+    
+    go inp@(pos, cs)
+      = case alexScan inp 0 of
+          AlexEOF         -> []
+          AlexError inp'  -> valueToken TkError [head cs] pos : go inp'
+          AlexSkip inp' _ -> go inp'
+          AlexToken inp' len act -> act (take len cs) pos : go inp'
+
+alex_action_2 =  reserved 
+alex_action_3 =  reserved 
+alex_action_4 =  valueToken TkVarid 
+{-# LINE 1 "templates/GenericTemplate.hs" #-}
+{-# LINE 1 "templates/GenericTemplate.hs" #-}
+{-# LINE 1 "<built-in>" #-}
+{-# LINE 1 "<command-line>" #-}
+{-# LINE 1 "templates/GenericTemplate.hs" #-}
+-- -----------------------------------------------------------------------------
+-- ALEX TEMPLATE
+--
+-- This code is in the PUBLIC DOMAIN; you may copy it freely and use
+-- it for any purpose whatsoever.
+
+-- -----------------------------------------------------------------------------
+-- INTERNALS and main scanner engine
+
+{-# LINE 35 "templates/GenericTemplate.hs" #-}
+
+{-# LINE 45 "templates/GenericTemplate.hs" #-}
+
+
+data AlexAddr = AlexA# Addr#
+
+#if __GLASGOW_HASKELL__ < 503
+uncheckedShiftL# = shiftL#
+#endif
+
+{-# INLINE alexIndexInt16OffAddr #-}
+alexIndexInt16OffAddr (AlexA# arr) off =
+#ifdef WORDS_BIGENDIAN
+  narrow16Int# i
+  where
+	i    = word2Int# ((high `uncheckedShiftL#` 8#) `or#` low)
+	high = int2Word# (ord# (indexCharOffAddr# arr (off' +# 1#)))
+	low  = int2Word# (ord# (indexCharOffAddr# arr off'))
+	off' = off *# 2#
+#else
+  indexInt16OffAddr# arr off
+#endif
+
+
+
+
+
+{-# INLINE alexIndexInt32OffAddr #-}
+alexIndexInt32OffAddr (AlexA# arr) off = 
+#ifdef WORDS_BIGENDIAN
+  narrow32Int# i
+  where
+   i    = word2Int# ((b3 `uncheckedShiftL#` 24#) `or#`
+		     (b2 `uncheckedShiftL#` 16#) `or#`
+		     (b1 `uncheckedShiftL#` 8#) `or#` b0)
+   b3   = int2Word# (ord# (indexCharOffAddr# arr (off' +# 3#)))
+   b2   = int2Word# (ord# (indexCharOffAddr# arr (off' +# 2#)))
+   b1   = int2Word# (ord# (indexCharOffAddr# arr (off' +# 1#)))
+   b0   = int2Word# (ord# (indexCharOffAddr# arr off'))
+   off' = off *# 4#
+#else
+  indexInt32OffAddr# arr off
+#endif
+
+
+
+
+
+#if __GLASGOW_HASKELL__ < 503
+quickIndex arr i = arr ! i
+#else
+-- GHC >= 503, unsafeAt is available from Data.Array.Base.
+quickIndex = unsafeAt
+#endif
+
+
+
+
+-- -----------------------------------------------------------------------------
+-- Main lexing routines
+
+data AlexReturn a
+  = AlexEOF
+  | AlexError  !AlexInput
+  | AlexSkip   !AlexInput !Int
+  | AlexToken  !AlexInput !Int a
+
+-- alexScan :: AlexInput -> StartCode -> AlexReturn a
+alexScan input (I# (sc))
+  = alexScanUser undefined input (I# (sc))
+
+alexScanUser user input (I# (sc))
+  = case alex_scan_tkn user input 0# input sc AlexNone of
+	(AlexNone, input') ->
+		case alexGetChar input of
+			Nothing -> 
+
+
+
+				   AlexEOF
+			Just _ ->
+
+
+
+				   AlexError input'
+
+	(AlexLastSkip input len, _) ->
+
+
+
+		AlexSkip input len
+
+	(AlexLastAcc k input len, _) ->
+
+
+
+		AlexToken input len k
+
+
+-- Push the input through the DFA, remembering the most recent accepting
+-- state it encountered.
+
+alex_scan_tkn user orig_input len input s last_acc =
+  input `seq` -- strict in the input
+  let 
+	new_acc = check_accs (alex_accept `quickIndex` (I# (s)))
+  in
+  new_acc `seq`
+  case alexGetChar input of
+     Nothing -> (new_acc, input)
+     Just (c, new_input) -> 
+
+
+
+	let
+		base   = alexIndexInt32OffAddr alex_base s
+		(I# (ord_c)) = ord c
+		offset = (base +# ord_c)
+		check  = alexIndexInt16OffAddr alex_check offset
+		
+		new_s = if (offset >=# 0#) && (check ==# ord_c)
+			  then alexIndexInt16OffAddr alex_table offset
+			  else alexIndexInt16OffAddr alex_deflt s
+	in
+	case new_s of 
+	    -1# -> (new_acc, input)
+		-- on an error, we want to keep the input *before* the
+		-- character that failed, not after.
+    	    _ -> alex_scan_tkn user orig_input (len +# 1#) 
+			new_input new_s new_acc
+
+  where
+	check_accs [] = last_acc
+	check_accs (AlexAcc a : _) = AlexLastAcc a input (I# (len))
+	check_accs (AlexAccSkip : _)  = AlexLastSkip  input (I# (len))
+	check_accs (AlexAccPred a pred : rest)
+	   | pred user orig_input (I# (len)) input
+	   = AlexLastAcc a input (I# (len))
+	check_accs (AlexAccSkipPred pred : rest)
+	   | pred user orig_input (I# (len)) input
+	   = AlexLastSkip input (I# (len))
+	check_accs (_ : rest) = check_accs rest
+
+data AlexLastAcc a
+  = AlexNone
+  | AlexLastAcc a !AlexInput !Int
+  | AlexLastSkip  !AlexInput !Int
+
+data AlexAcc a user
+  = AlexAcc a
+  | AlexAccSkip
+  | AlexAccPred a (AlexAccPred user)
+  | AlexAccSkipPred (AlexAccPred user)
+
+type AlexAccPred user = user -> AlexInput -> Int -> AlexInput -> Bool
+
+-- -----------------------------------------------------------------------------
+-- Predicates on a rule
+
+alexAndPred p1 p2 user in1 len in2
+  = p1 user in1 len in2 && p2 user in1 len in2
+
+--alexPrevCharIsPred :: Char -> AlexAccPred _ 
+alexPrevCharIs c _ input _ _ = c == alexInputPrevChar input
+
+--alexPrevCharIsOneOfPred :: Array Char Bool -> AlexAccPred _ 
+alexPrevCharIsOneOf arr _ input _ _ = arr ! alexInputPrevChar input
+
+--alexRightContext :: Int -> AlexAccPred _
+alexRightContext (I# (sc)) user _ _ input = 
+     case alex_scan_tkn user input 0# input sc AlexNone of
+	  (AlexNone, _) -> False
+	  _ -> True
+	-- TODO: there's no need to find the longest
+	-- match when checking the right context, just
+	-- the first match will do.
+
+-- used by wrappers
+iUnbox (I# (i)) = i
diff --git a/Graphics/LambdaCube/Loader/Makefile b/Graphics/LambdaCube/Loader/Makefile
new file mode 100644
--- /dev/null
+++ b/Graphics/LambdaCube/Loader/Makefile
@@ -0,0 +1,13 @@
+all: 
+	alex -o Generated/CompositorScriptScanner.hs -g CompositorScriptScanner.x
+	alex -o Generated/MaterialScriptScanner.hs -g MaterialScriptScanner.x
+	alex -o Generated/ResourceScriptScanner.hs -g ResourceScriptScanner.x
+	alex -o Generated/OverlayScriptScanner.hs -g OverlayScriptScanner.x
+	alex -o Generated/FontDefinitionScriptScanner.hs -g FontDefinitionScriptScanner.x
+
+clean:
+	rm -f Generated/CompositorScriptScanner.hi Generated/CompositorScriptScanner.o Generated/CompositorScriptScanner.hs
+	rm -f Generated/MaterialScriptScanner.hi Generated/MaterialScriptScanner.o Generated/MaterialScriptScanner.hs
+	rm -f Generated/ResourceScriptScanner.hi Generated/ResourceScriptScanner.o Generated/ResourceScriptScanner.hs
+	rm -f Generated/OverlayScriptScanner.hi Generated/OverlayScriptScanner.o Generated/OverlayScriptScanner.hs
+	rm -f Generated/FontDefinitionScriptScanner.hi Generated/FontDefinitionScriptScanner.o Generated/FontDefinitionScriptScanner.hs
diff --git a/Graphics/LambdaCube/Loader/MaterialScript.hs b/Graphics/LambdaCube/Loader/MaterialScript.hs
new file mode 100644
--- /dev/null
+++ b/Graphics/LambdaCube/Loader/MaterialScript.hs
@@ -0,0 +1,712 @@
+{-# LANGUAGE NoMonomorphismRestriction #-}
+module Graphics.LambdaCube.Loader.MaterialScript (loadMaterial,parseMaterial) where
+
+-- import the the library functions from uulib
+import UU.Parsing
+import UU.Scanner
+
+import Data.Maybe
+import Data.Either
+import System.FilePath.Posix
+
+import System.Log.Logger
+
+import Graphics.LambdaCube.Loader.Generated.MaterialScriptScanner
+import Graphics.LambdaCube.Types
+import Graphics.LambdaCube.Common
+import Graphics.LambdaCube.BlendMode
+import Graphics.LambdaCube.Light
+import Graphics.LambdaCube.PixelFormat
+import Graphics.LambdaCube.RenderSystem
+import Graphics.LambdaCube.Material
+import Graphics.LambdaCube.Technique
+import Graphics.LambdaCube.Pass
+import Graphics.LambdaCube.TextureUnitState
+import Graphics.LambdaCube.Texture
+import Graphics.LambdaCube.GpuProgram
+import Graphics.LambdaCube.GpuProgramUsage
+import Graphics.LambdaCube.GpuProgramParams
+import Graphics.LambdaCube.Loader.ParserUtil
+
+----------------------
+-- Boilerplate code --
+----------------------
+{-
+loadMaterial path file = do
+	txt <- readFile file
+	parseMaterial file txt
+
+parseMaterial file txt = parseFile pMaterialScript tokenize file txt
+-}
+
+loadMaterial path file = do
+    txt <- readFile file
+    parseMaterial file txt
+
+parseMaterial file txt
+    = let res = parseTokens pMaterialScript (tokenize file txt)
+    in case res of
+        Left errs -> do
+            mapM_ (errorM "MaterialScript") errs
+            return Nothing
+        Right tree -> return (Just tree)
+		
+type TokenParser a = Parser Token a
+
+parseTokens :: TokenParser a -> [Token] -> Either [String] a
+parseTokens p tks = if null msgs then final `seq` Right v else Left (map show msgs)
+  where
+    steps = parse p tks
+    msgs  = getMsgs steps
+    (Pair v final) = evalSteps steps
+
+-- * AST definitions
+
+-- |Material Script
+data (Texture t, GpuProgram p, LinkedGpuProgram lp) => MS_Attr t p lp
+    = MS_material        (Material t lp)
+    | MS_vertexprogram   (GpuProgramDescriptor p)
+    | MS_fragmentprogram (GpuProgramDescriptor p)
+
+-- |Material
+data (Texture t, LinkedGpuProgram lp) => M_Attr t lp
+    = M_technique                (Technique t lp)
+    | M_receiveshadows           Bool
+    | M_transparencycastsshadows Bool
+    | M_loddistances             [FloatType]
+    | M_settexturealias          String String
+
+-- |Technique
+data (Texture t, LinkedGpuProgram lp) => T_Attr t lp
+    = T_pass                   (Pass t lp)
+    | T_scheme                 String
+    | T_lodindex               Int
+    | T_shadowcastermaterial   String
+    | T_shadowreceivermaterial String
+    | T_gpuvendorrule          IncludeOrExclude String
+    | T_gpudevicerule          IncludeOrExclude String Bool
+
+-- |Pass
+type Colour = Either ColourValue ()
+data Texture t => P_Attr t
+    = P_textureunit             (TextureUnitState t)
+    | P_vertexprogramref        String [PR_Attr]
+    | P_fragmentprogramref      String [PR_Attr]
+    | P_shadowcastervertexprogramref        -- NOT SUPPORTED
+    | P_shadowreceiververtexprogramref      -- NOT SUPPORTED
+    | P_shadowreceiverfragmentprogramref    -- NOT SUPPORTED
+    | P_ambient                 Colour
+    | P_diffuse                 Colour
+    | P_specular                Colour FloatType
+    | P_emissive                Colour
+    | P_sceneblend              (SceneBlendFactor,SceneBlendFactor)
+    | P_sceneblendop            SceneBlendOperation
+    | P_separatesceneblend      ((SceneBlendFactor,SceneBlendFactor),(SceneBlendFactor,SceneBlendFactor))
+    | P_separatesceneblendop    SceneBlendOperation SceneBlendOperation
+    | P_depthcheck              Bool
+    | P_depthwrite              Bool
+    | P_depthfunc               CompareFunction
+    | P_depthbias               FloatType FloatType
+    | P_iterationdepthbias      FloatType
+    | P_alpharejection          CompareFunction Int
+    | P_alphatocoverage         Bool
+    | P_lightscissor            Bool
+    | P_lightclipplanes         Bool
+    | P_illuminationstage       IlluminationStage
+    | P_normalisenormals        Bool
+    | P_transparentsorting      Bool Bool
+    | P_cullhardware            CullingMode
+    | P_cullsoftware            ManualCullingMode
+    | P_lighting                Bool
+    | P_shading                 ShadeOptions
+    | P_polygonmode             PolygonMode
+    | P_polygonmodeoverrideable Bool
+    | P_fogoverride             Bool FogMode FloatType3 FloatType FloatType FloatType
+    | P_colourwrite             Bool
+    | P_startlight              Int
+    | P_maxlights               Int
+    | P_iteration               Int (Maybe Int) (Maybe LightTypes)        -- ^ iteration count, n_light, light type
+    | P_pointsize               FloatType
+    | P_pointsprites            Bool
+    | P_pointsizeattenuation    Bool FloatType3
+    | P_pointsizemin            FloatType
+    | P_pointsizemax            FloatType
+
+-- |TextureUnit
+data TU_Attr
+    = TU_texturealias              String
+    
+    -- texture <texturename> [<type>] [unlimited | numMipMaps] [alpha] [<PixelFormat>] [gamma]
+    | TU_texture                   String TextureType TextureMipmap Bool PixelFormat Bool
+
+    | TU_animtexture               [String] FloatType
+    | TU_cubictexture              String String String String String String Bool
+    | TU_bindingtype               BindingType
+    | TU_contenttype               ContentType
+    | TU_texcoordset               Int
+    | TU_texaddressmode            TextureAddressingMode TextureAddressingMode TextureAddressingMode
+    | TU_texbordercolour           ColourValue
+    | TU_filtering                 (FilterOptions,FilterOptions,FilterOptions)
+    | TU_maxanisotropy             Int
+    | TU_mipmapbias                FloatType
+    | TU_colourop                  LayerBlendOperation
+    | TU_colouropex                LayerBlendOperationEx LayerBlendSource LayerBlendSource FloatType ColourValue ColourValue
+    | TU_colouropmultipassfallback (SceneBlendFactor,SceneBlendFactor)
+    | TU_alphaopex                 LayerBlendOperationEx LayerBlendSource LayerBlendSource FloatType FloatType FloatType
+    | TU_envmap                    (Maybe EnvMapType)
+    | TU_scroll                    FloatType FloatType
+    | TU_scrollanim                FloatType FloatType
+    | TU_rotate                    FloatType
+    | TU_rotateanim                FloatType
+    | TU_scale                     FloatType FloatType
+    | TU_wavexform                 TextureTransformType WaveformType FloatType FloatType FloatType FloatType
+    | TU_transform                 FloatType4 FloatType4 FloatType4 FloatType4
+
+-- |Texture
+data TX_Attr
+    = TX_type         TextureType
+    | TX_mipmap       TextureMipmap
+    | TX_alpha
+    | TX_pixelformat  PixelFormat
+    | TX_gamma
+
+-- |Shader
+data SH_Attr
+    = SH_source                     String
+    | SH_attach                     [String]
+    | SH_includesskeletalanimation  Bool
+    | SH_includesmorphanimation     Bool
+    | SH_includesposeanimation      Int
+    | SH_usesvertextexturefetch     Bool
+    | SH_usesadjacencyinformation   Bool
+    | SH_entrypoint                 String
+    | SH_profiles                   [String]
+    | SH_target                     String
+    | SH_delegate                   String
+    | SH_defaultparams              [PR_Attr]
+    
+data PR_Attr
+    = PR_paramnamed                 String String [FloatType]
+    | PR_paramnamedauto             String AutoConstantType [FloatType]
+    | PR_paramindexed               Int String [FloatType]
+    | PR_paramindexedauto           Int AutoConstantType [FloatType]
+
+-- * Material script top level parser combinators
+
+pMaterialScript = mkMaterialScript <$> pList pMaterialScriptContent
+mkMaterialScript l = (mats,vertprogs,fragprogs)
+  where
+    mats = [x | MS_material x <- l]
+    vertprogs = [x | MS_vertexprogram x <- l]
+    fragprogs = [x | MS_fragmentprogram x <- l]
+
+pMaterialScriptContent =  (MS_material .) . mkMaterial                                          <$= "material" <*> pName <*= "{" <*> pList pMaterialContent <*= "}"
+                      <|> ((MS_vertexprogram .) .) . (mkGpuProgramDesc GPT_VERTEX_PROGRAM)      <$= "vertex_program" <*> pName <*> pName <*= "{" <*> pList pProgramContent <*= "}"
+                      <|> ((MS_fragmentprogram .) .) . (mkGpuProgramDesc GPT_FRAGMENT_PROGRAM)  <$= "fragment_program" <*> pName <*> pName <*= "{" <*> pList pProgramContent <*= "}"
+
+-- * Material
+pMaterialContent =  (M_technique .) . mkTechnique   <$= "technique" <*> (pName <|> pSucceed "") <*= "{" <*> pList pTechniqueContent <*= "}"
+                <|> M_loddistances                  <$= "lod_distances" <*> pList pFloat
+                <|> M_receiveshadows                <$= "receive_shadows" <*> pOnOff
+                <|> M_transparencycastsshadows      <$= "transparency_casts_shadows" <*> pOnOff
+                <|> M_settexturealias               <$= "set_texture_alias" <*> pName <*> pName
+
+mkMaterial name l = Material
+    { mtName                     = name
+--    , mtLodDistances             = def []    [x | M_loddistances x <- l]
+    , mtReceiveShadows           = def True  [x | M_receiveshadows x <- l]
+    , mtTransparencyCastsShadows = def False [x | M_transparencycastsshadows x <- l]
+    --, mtTextureAlias             = [(a,b) | M_settexturealias a b <- l]
+    , mtTechniques               = [x | M_technique x <- l]
+---------------
+    , mtSupportedTechniques      = Nothing
+    , mtUserLodValues = []
+    , mtLodValues = []
+    , mtUnsupportedReasons = ""
+    }
+
+-- * Technique
+pTechniqueContent =  (T_pass .) . mkPass      <$= "pass" <*> (pName <|> pSucceed "") <*= "{" <*> pList pPassContent <*= "}"
+                 <|> T_scheme                 <$= "scheme" <*> pName
+                 <|> T_lodindex               <$= "lod_index" <*> pInt
+                 <|> T_shadowcastermaterial   <$= "shadow_caster_material" <*> pName
+                 <|> T_shadowreceivermaterial <$= "shadow_receiver_material" <*> pName
+                 <|> T_gpuvendorrule          <$= "gpu_vendor_rule" <*> pEnum ruleopVals <*> pName
+                 <|> T_gpudevicerule          <$= "gpu_device_rule" <*> pEnum ruleopVals <*> pName <*> (True <$= "case_sensitive" <|> pSucceed False)
+
+mkTechnique n l = Technique
+    -- TODO
+    { tchName                   = n
+    -- TODO
+    , tchSchemeIndex            = 0 --def "Default" [x | T_scheme x <- l]
+    , tchLodIndex               = def 0         [x | T_lodindex x <- l]
+--    , tchShadowCasterMaterial   = def ""        [x | T_shadowcastermaterial x <- l]
+--    , tchShadowReceiverMaterial = def ""        [x | T_shadowreceivermaterial x <- l]
+--    , tchGPUVendorRules         = [GPUVendorRule (a,b) | T_gpuvendorrule a b <- l]
+--    , tchGPUDeviceNameRules     = [(a,b,c) | T_gpudevicerule a b c <- l]
+    , tchPasses                 = [x | T_pass x <- l]
+-------------------
+    , tchGPUVendorRules = []
+    , tchGPUDeviceNameRules = []
+
+    }
+
+-- * Pass
+pPassContent =  (P_textureunit .) . mkTextureUnitState  <$= "texture_unit" <*> (pName <|> pSucceed "") <*= "{" <*> pList pTextureUnitContent <*= "}"
+            <|> P_vertexprogramref                      <$= "vertex_program_ref" <*> pName <*= "{" <*> pList pParamContent <*= "}"
+            <|> P_fragmentprogramref                    <$= "fragment_program_ref" <*> pName <*= "{" <*> pList pParamContent <*= "}"
+            <|> P_shadowcastervertexprogramref          <$= "shadow_caster_vertex_program_ref" <* pName <*= "{" <* pList pParamContent <*= "}"
+            <|> P_shadowreceiververtexprogramref        <$= "shadow_receiver_vertex_program_ref" <* pName <*= "{" <* pList pParamContent <*= "}"
+            <|> P_shadowreceiverfragmentprogramref      <$= "shadow_receiver_fragment_program_ref" <* pName <*= "{" <* pList pParamContent <*= "}"
+            <|> P_ambient                               <$= "ambient" <*> pColour 1
+            <|> P_diffuse                               <$= "diffuse" <*> pColour 1
+            <|> P_specular                              <$= "specular" <*> pColour 0 <*> pFloat
+            <|> P_emissive                              <$= "emissive" <*> pColour 0
+            <|> P_sceneblendop                          <$= "scene_blend_op" <*> pEnum blendopVals
+--            <|> P_sceneblend (convertSBTtoSBF SBT_MODULATE)     <$= "scene_blend" <*= "modulate"
+            <|> P_sceneblend . convertSBTtoSBF          <$= "scene_blend" <*> pEnum sceneblendVals
+            <|> curry P_sceneblend                      <$= "scene_blend" <*> pEnum blendVals <*> pEnum blendVals
+            <|> P_separatesceneblendop                  <$= "separate_scene_blend_op" <*> pEnum blendopVals <*> pEnum blendopVals
+            <|> curry P_separatesceneblend              <$= "separate_scene_blend" <*> (convertSBTtoSBF <$> pEnum sceneblendVals) <*> (convertSBTtoSBF <$> pEnum sceneblendVals)
+            <|> (\a b c d -> P_separatesceneblend ((a,b),(c,d))) <$= "separate_scene_blend" <*> pEnum blendVals <*> pEnum blendVals <*> pEnum blendVals <*> pEnum blendVals
+            <|> P_depthcheck                            <$= "depth_check" <*> pOnOff
+            <|> P_depthwrite                            <$= "depth_write" <*> pOnOff
+            <|> P_depthfunc                             <$= "depth_func" <*> pEnum cmpfuncVals
+            <|> P_depthbias                             <$= "depth_bias" <*> pFloat <*> (pFloat <|> pSucceed 0)
+            <|> P_iterationdepthbias                    <$= "iteration_depth_bias" <*> pFloat
+            <|> P_alpharejection                        <$= "alpha_rejection" <*> pEnum cmpfuncVals <*> pInt
+            <|> P_alphatocoverage                       <$= "alpha_to_coverage" <*> pOnOff
+            <|> P_lightscissor                          <$= "light_scissor" <*> pOnOff
+            <|> P_lightclipplanes                       <$= "light_clip_planes" <*> pOnOff
+            <|> P_illuminationstage                     <$= "illumination_stage" <*> pEnum illumstageVals
+            <|> P_normalisenormals                      <$= "normalise_normals" <*> pOnOff
+            <|> P_transparentsorting                    <$= "transparent_sorting" <*= "force" <*> pSucceed True <*> pSucceed True
+            <|> P_transparentsorting                    <$= "transparent_sorting" <*> pOnOff <*> pSucceed False
+            <|> P_cullhardware                          <$= "cull_hardware" <*> pEnum cullhwVals
+            <|> P_cullsoftware                          <$= "cull_software" <*> pEnum cullswVals
+            <|> P_lighting                              <$= "lighting" <*> pOnOff
+            <|> P_shading                               <$= "shading" <*> pEnum shadingVals
+            <|> P_polygonmode                           <$= "polygon_mode" <*> pEnum polymodeVals
+            <|> P_polygonmodeoverrideable               <$= "polygon_mode_overrideable" <*> pOnOff
+            
+            <|> P_fogoverride False                     <$= "fog_override" <*= "false" <*> pSucceed FOG_NONE <*> pSucceed (0,0,0) <*> pSucceed 0 <*> pSucceed 0 <*> pSucceed 0
+            <|> P_fogoverride True                      <$= "fog_override" <*= "true" <*> pSucceed FOG_NONE <*> pSucceed (0,0,0) <*> pSucceed 0 <*> pSucceed 0 <*> pSucceed 0
+            <|> P_fogoverride True                      <$= "fog_override" <*= "true" <*> (FOG_NONE <$= "none") <*> pSucceed (0,0,0) <*> pSucceed 0 <*> pSucceed 0 <*> pSucceed 0
+            <|> P_fogoverride True                      <$= "fog_override" <*= "true" <*> pEnum fogmodeVals <*> pFloat3 <*> pFloat <*> pFloat <*> pFloat
+            
+            <|> P_colourwrite                           <$= "colour_write" <*> pOnOff
+            <|> P_startlight                            <$= "start_light" <*> pInt
+            <|> P_maxlights                             <$= "max_lights" <*> pInt
+            
+            -- Format 1: iteration <once | once_per_light> [lightType]
+            -- Format 2: iteration <number> [<per_light> [lightType]]
+            -- Format 3: iteration <number> [<per_n_lights> <num_lights> [lightType]]
+            -- lights of a single type (either 'point', 'directional' or 'spot').
+            <|> P_iteration 1 Nothing                   <$= "iteration" <*= "once" <*> (Just <$> pEnum lighttypeVals <|> pSucceed Nothing)
+            <|> P_iteration 1 (Just 1)                  <$= "iteration" <*= "once_per_light" <*> (Just <$> pEnum lighttypeVals <|> pSucceed Nothing)
+            <|> (\n -> P_iteration n (Just 1))          <$= "iteration" <*> pInt <*= "per_light" <*> (Just <$> pEnum lighttypeVals <|> pSucceed Nothing)
+            <|> P_iteration                             <$= "iteration" <*> pInt <*= "per_n_light" <*> (Just <$> pInt) <*> (Just <$> pEnum lighttypeVals <|> pSucceed Nothing)
+            <|> P_iteration                             <$= "iteration" <*> pInt <*> pSucceed Nothing <*> pSucceed Nothing 
+            
+            <|> P_pointsize                             <$= "point_size" <*> pFloat
+            <|> P_pointsprites                          <$= "point_sprites" <*> pOnOff
+            <|> P_pointsizeattenuation                  <$= "point_size_attenuation" <*> pOnOff <*> (pFloat3 <|> pSucceed (1,0,0))
+            <|> P_pointsizemin                          <$= "point_size_min" <*> pFloat
+            <|> P_pointsizemax                          <$= "point_size_max" <*> pFloat
+
+mkPass n l = Pass
+    { psName                     = n
+
+    , psAmbient                  = def (1,1,1,1)            $ lefts $ [x | P_ambient x <- l] 
+    , psDiffuse                  = def (1,1,1,1)            $ lefts $ [x | P_diffuse x <- l]
+    , psSpecular                 = def (0,0,0,0)            $ lefts $ [x | P_specular x _ <- l]
+    , psEmissive                 = def (0,0,0,0)            $ lefts $ [x | P_emissive x <- l]
+    , psShininess                = def 0                    [x | P_specular _ x <- l]
+
+    , psTracking                 = def (TrackVertexColourType False False False False)
+                                                            [ TrackVertexColourType
+                                                                (null $ lefts $ [x | P_ambient x <- l])
+                                                                (null $ lefts $ [x | P_diffuse x <- l])
+                                                                (null $ lefts $ [x | P_specular x _ <- l])
+                                                                (null $ lefts $ [x | P_emissive x <- l])
+                                                            ]
+
+    , psSourceBlendFactor        = def SBF_ONE              $ [x | P_separatesceneblend ((x,_),_) <- l] ++ [x | P_sceneblend (x,_) <- l]
+    , psDestBlendFactor          = def SBF_ZERO             $ [x | P_separatesceneblend ((_,x),_) <- l] ++ [x | P_sceneblend (_,x) <- l]
+    , psSourceBlendFactorAlpha   = def SBF_ONE              [x | P_separatesceneblend (_,(x,_)) <- l]
+    , psDestBlendFactorAlpha     = def SBF_ZERO             [x | P_separatesceneblend (_,(_,x)) <- l]
+
+    , psSeparateBlend            = (not . null)             [() | P_separatesceneblend _ <- l]
+
+    , psBlendOperation           = def SBO_ADD              $ [x | P_separatesceneblendop x _ <- l] ++ [x | P_sceneblendop x <- l]
+    , psAlphaBlendOperation      = def SBO_ADD              [x | P_separatesceneblendop _ x <- l]
+    , psSeparateBlendOperation   = (not . null)             [() | P_separatesceneblendop _ _ <- l]
+
+    , psDepthCheck               = def True                 [x | P_depthcheck x <- l]
+    , psDepthWrite               = def True                 [x | P_depthwrite x <- l]
+    , psDepthFunc                = def CMPF_LESS_EQUAL      [x | P_depthfunc x <- l]
+    , psDepthBiasConstant        = def 0                    [x | P_depthbias x _ <- l]
+    , psDepthBiasSlopeScale      = def 0                    [x | P_depthbias _ x <- l]
+    , psDepthBiasPerIteration    = def 0                    [x | P_iterationdepthbias x <- l]
+
+    , psColourWrite              = def True                 [x | P_colourwrite x <- l]
+
+    , psAlphaRejectFunc          = def CMPF_ALWAYS_PASS     [x | P_alpharejection x _ <- l]
+    , psAlphaRejectVal           = def 0                    [x | P_alpharejection _ x <- l]
+    , psAlphaToCoverageEnabled   = def False                [x | P_alphatocoverage x <- l]
+
+
+	, psTransparentSorting       = def True                 [x | P_transparentsorting x _ <- l]
+    , psTransparentSortingForced = def False                [x | P_transparentsorting _ x <- l]
+
+    , psCullMode                 = def CULL_CLOCKWISE       [x | P_cullhardware x <- l]
+    , psManualCullMode           = def MANUAL_CULL_BACK     [x | P_cullsoftware x <- l]
+
+    , psLightingEnabled          = def True                 [x | P_lighting x <- l]
+    , psMaxSimultaneousLights    = def 0                    [x | P_maxlights x <- l]
+    , psStartLight               = def 0                    [x | P_startlight x <- l]
+    , psLightsPerIteration       = def Nothing              [x | P_iteration _ x _ <- l]
+    , psOnlyLightType            = def Nothing              [x | P_iteration _ _ x <- l]
+
+    , psShadeOptions             = def SO_GOURAUD           [x | P_shading x <- l]
+    , psPolygonMode              = def PM_SOLID             [x | P_polygonmode x <- l]
+
+    , psNormaliseNormals         = def False                [x | P_normalisenormals x <- l]
+    , psPolygonModeOverrideable  = def True                 [x | P_polygonmodeoverrideable x <- l]
+
+    , psFogOverride              = def False                [x | P_fogoverride x _ _ _ _ _ <- l]
+    , psFogMode                  = def FOG_NONE             [x | P_fogoverride _ x _ _ _ _  <- l]
+    , psFogColour                = def (0,0,0,0)            [(r,g,b,1) | P_fogoverride _ _ (r,g,b) _ _ _ <- l]
+    , psFogStart                 = def 0                    [x | P_fogoverride _ _ _ _ x _ <- l]
+    , psFogEnd                   = def 0                    [x | P_fogoverride _ _ _ _ _ x <- l]
+    , psFogDensity               = def 0                    [x | P_fogoverride _ _ _ x _ _ <- l]
+
+    , psTextureUnitStates        = [x | P_textureunit x <- l]
+
+    , psVertexProgramUsage       = def Nothing              [Just $ GpuProgramUsage x | P_vertexprogramref x _ <- l] -- TODO
+    , psFragmentProgramUsage     = def Nothing              [Just $ GpuProgramUsage x | P_fragmentprogramref x _ <- l] -- TODO
+    , psGeometryProgramUsage     = Nothing  -- TODO
+    , psLinkedGpuProgram         = Nothing
+
+    , psPassIterationCount       = def 1                    [x | P_iteration x _ _ <- l]
+
+    , psPointSize                = def 0                    [x | P_pointsize x <- l]
+    , psPointMinSize             = def 0                    [x | P_pointsizemin x <- l]
+    , psPointMaxSize             = def 0                    [x | P_pointsizemax x <- l]
+    , psPointSpritesEnabled      = def False                [x | P_pointsprites x <- l]
+    , psPointAttenuationEnabled  = def False                [x | P_pointsizeattenuation x _ <- l]
+    , psPointAttenuationCoeffs   = def (0,0,0)              [x | P_pointsizeattenuation _ x <- l]
+
+    , psLightScissoring          = def False                [x | P_lightscissor x <- l]
+    , psLightClipPlanes          = def False                [x | P_lightclipplanes x <- l]
+    , psIlluminationStage        = def IS_UNKNOWN           [x | P_illuminationstage x <- l]
+	}
+
+-- * Texture
+pTextureContent =  TX_type        <$> pEnum textypeVals
+               <|> TX_mipmap      <$> (pKey "unlimited" *> pSucceed MIP_UNLIMITED <|> MIP_NUMBER <$> pInt)
+               <|> TX_alpha       <$= "alpha"
+               <|> TX_pixelformat <$> pEnum pixelformatVals
+               <|> TX_gamma       <$= "gamma"
+               
+-- * TextureUnit
+pTextureUnitContent =  TU_texturealias      <$= "texture_alias" <*> pName
+                    -- Format: texture <texturename> [<type>] [unlimited | numMipMaps] [alpha] [<PixelFormat>] [gamma]
+                   <|> mkTU_Texture         <$= "texture" <*> pName <*> pList pTextureContent
+                   -- Format1 (short): anim_texture <base_name> <num_frames> <duration>
+--                   <|> mkTU_animtexture     <$= "anim_texture" <*> pName <*> pInt <*> pFloat
+                   -- Format2 (long): anim_texture <frame1> <frame2> ... <duration>
+--                   <|> TU_animtexture       <$= "anim_texture" <*> pList pName <*> pFloat
+                   <|> (\a b -> TU_animtexture b a)       <$= "anim_texture" <*> pFloat <*> pList pName
+
+                   -- Format2 (long): cubic_texture <front> <back> <left> <right> <up> <down> separateUV
+                   <|> TU_cubictexture      <$= "cubic_texture" <*> pName <*> pName <*> pName <*> pName <*> pName <*> pName <*= "separateUV" <*> pSucceed False
+                   -- Format1 (short): cubic_texture <base_name> <combinedUVW|separateUV>
+                   <|> mkTU_cubictexture    <$= "cubic_texture" <*> pName <*> (True <$= "combinedUVW" <|> False <$= "separateUV" )
+
+                   <|> TU_bindingtype       <$= "binding_type" <*> pEnum btyVals
+                   <|> TU_contenttype       <$= "content_type" <*> pEnum ctyVals
+                   <|> TU_texcoordset       <$= "tex_coord_set" <*> pInt
+
+                   -- Extended Format: tex_address_mode <u_mode> <v_mode> [<w_mode>] 
+                   <|> TU_texaddressmode    <$= "tex_address_mode" <*> pEnum texaddressVals <*> pEnum texaddressVals <*> (pEnum texaddressVals <|> pSucceed TAM_WRAP)
+                   -- Simple Format: tex_address_mode <uvw_mode> 
+                   <|> (\a -> TU_texaddressmode a a a) <$= "tex_address_mode" <*> pEnum texaddressVals
+                   
+                   <|> TU_texbordercolour   <$= "tex_border_colour" <*> pRGBOrRGBA 1
+
+                   -- Format: filtering <minification> <magnification> <mip>
+                   <|> (\a b c -> TU_filtering (a,b,c))  <$= "filtering" <*> pEnum filteringVals <*> pEnum filteringVals <*> pEnum filteringVals
+                   -- Format: filtering <none|bilinear|trilinear|anisotropic>
+                   <|> TU_filtering         <$= "filtering" <*> pEnum texfilteringVals
+                   
+                   <|> TU_maxanisotropy     <$= "max_anisotropy" <*> pInt
+                   <|> TU_mipmapbias        <$= "mipmap_bias" <*> pFloat
+                   <|> TU_colourop          <$= "colour_op" <*> pEnum copVals
+                   
+                   -- Format: colour_op_ex <operation> <source1> <source2> [<manual_factor>] [<manual_colour1>] [<manual_colour2>]
+                   <|> TU_colouropex        <$= "colour_op_ex" <*> pEnum layerblendopexVals <*> pEnum layerblendsrcVals <*> pEnum layerblendsrcVals <*> pFloat <*> pFloat4 <*> pFloat4 
+                   <|> TU_colouropex        <$= "colour_op_ex" <*> pEnum layerblendopexVals <*> pEnum layerblendsrcVals <*> pEnum layerblendsrcVals <*> pFloat <*> pFloat4 <*> pSucceed (1,1,1,1) 
+                   <|> TU_colouropex        <$= "colour_op_ex" <*> pEnum layerblendopexVals <*> pEnum layerblendsrcVals <*> pEnum layerblendsrcVals <*> pFloat <*> pSucceed (1,1,1,1) <*> pSucceed (1,1,1,1) 
+                   <|> TU_colouropex        <$= "colour_op_ex" <*> pEnum layerblendopexVals <*> pEnum layerblendsrcVals <*> pEnum layerblendsrcVals <*> pSucceed 0 <*> pSucceed (1,1,1,1) <*> pSucceed (1,1,1,1) 
+                   
+                   -- Format: colour_op_multipass_fallback <src_factor> <dest_factor>
+                   <|> TU_colouropmultipassfallback . convertSBTtoSBF <$= "colour_op_multipass_fallback" <*> pEnum sceneblendVals
+                   <|> curry TU_colouropmultipassfallback   <$= "colour_op_multipass_fallback" <*> pEnum blendVals <*> pEnum blendVals
+                   
+                   <|> TU_alphaopex        <$= "alpha_op_ex" <*> pEnum layerblendopexVals <*> pEnum layerblendsrcVals <*> pEnum layerblendsrcVals <*> pFloat <*> pFloat <*> pFloat 
+                   <|> TU_alphaopex        <$= "alpha_op_ex" <*> pEnum layerblendopexVals <*> pEnum layerblendsrcVals <*> pEnum layerblendsrcVals <*> pFloat <*> pFloat <*> pSucceed 1
+                   <|> TU_alphaopex        <$= "alpha_op_ex" <*> pEnum layerblendopexVals <*> pEnum layerblendsrcVals <*> pEnum layerblendsrcVals <*> pFloat <*> pSucceed 1 <*> pSucceed 1
+                   <|> TU_alphaopex        <$= "alpha_op_ex" <*> pEnum layerblendopexVals <*> pEnum layerblendsrcVals <*> pEnum layerblendsrcVals <*> pSucceed 0 <*> pSucceed 1 <*> pSucceed 1
+                   
+                   -- Format: env_map <off|spherical|planar|cubic_reflection|cubic_normal>
+                   <|> TU_envmap            <$= "env_map" <*> pEnum envmapVals
+                   <|> TU_scroll            <$= "scroll" <*> pFloat <*> pFloat
+                   <|> TU_scrollanim        <$= "scroll_anim" <*> pFloat <*> pFloat
+                   <|> TU_rotate            <$= "rotate" <*> pFloat
+                   <|> TU_rotateanim        <$= "rotate_anim" <*> pFloat
+                   <|> TU_scale             <$= "scale" <*> pFloat <*> pFloat
+                   
+                   -- Format: wave_xform <xform_type> <wave_type> <base> <frequency> <phase> <amplitude>
+                   <|> TU_wavexform         <$= "wave_xform" <*> pEnum xformtypeVals <*> pEnum wavetypeVals <*> pFloat <*> pFloat <*> pFloat <*> pFloat
+                   <|> TU_transform         <$= "transform" <*> pFloat4 <*> pFloat4 <*> pFloat4 <*> pFloat4
+  where
+    mkTU_Texture n l = TU_texture n t m a p g
+      where
+        t = def TEX_TYPE_2D   [x    | TX_type x <- l]
+        m = def MIP_UNLIMITED [x    | TX_mipmap x <- l]
+        a = def False         [True | TX_alpha <- l]
+        p = def PF_UNKNOWN    [x    | TX_pixelformat x <- l]
+        g = def False         [True | TX_gamma <- l]
+    f a e = (dropExtensions a) ++ e ++ (takeExtensions a)
+    mkTU_cubictexture n True = TU_cubictexture n n n n n n True
+    mkTU_cubictexture n False = TU_cubictexture (f n "_fr") (f n "_bk") (f n "_up") (f n "_dn") (f n "_lf") (f n "_rt") False
+    -- Format1 (short): anim_texture <base_name> <num_frames> <duration>
+    mkTU_animtexture basename numframes duration = TU_animtexture [f basename $ show i | i <- [0..(numframes-1)]] duration
+
+{-
+    -- texture <texturename> [<type>] [unlimited | numMipMaps] [alpha] [<PixelFormat>] [gamma]
+    | TU_texture                   String TextureType TextureMipmap Bool PixelFormat Bool
+-}    
+mkTextureUnitState n l = TextureUnitState
+    { tusAnimDuration               = def Nothing           [Just x | TU_animtexture _ x <- l]
+    , tusCubic                      = def False           $ [TEX_TYPE_CUBE_MAP==x | TU_texture _ x _ _ _ _ <- l] ++ [True | TU_cubictexture _ _ _ _ _ _ _ <- l]
+    
+    , tusTextureType                = def TEX_TYPE_2D     $ [x | TU_texture _ x _ _ _ _ <- l] ++ [TEX_TYPE_CUBE_MAP | TU_cubictexture _ _ _ _ _ _ _ <- l]
+    , tusDesiredFormat              = def PF_UNKNOWN        [x | TU_texture _ _ _ _ x _ <- l]
+    , tusTextureSrcMipmaps          = def MIP_DEFAULT       [x | TU_texture _ _ x _ _ _ <- l]
+
+    , tusTextureCoordSetIndex       = def 0                 [x | TU_texcoordset x <- l]
+    , tusAddressMode                = def (UVWAddressingMode TAM_WRAP TAM_WRAP TAM_WRAP)
+                                                            [UVWAddressingMode a b c | TU_texaddressmode a b c <- l]
+    , tusBorderColour               = def (0,0,0,1)         [x | TU_texbordercolour x <- l]
+
+    , tusColourBlendMode            = def cblendmode        [LayerBlendModeEx LBT_COLOUR op src1 src2 c1 c2 1 1 f | TU_colouropex op src1 src2 f c1 c2 <- (l ++ colouropex)]
+    , tusColourBlendFallbackSrc     = def SBF_DEST_COLOUR   [x | TU_colouropmultipassfallback (x,_) <- (l ++ fallbackop)]
+    , tusColourBlendFallbackDest    = def SBF_ZERO          [x | TU_colouropmultipassfallback (_,x) <- (l ++ fallbackop)]
+
+    , tusAlphaBlendMode             = def ablendmode        [LayerBlendModeEx LBT_ALPHA op src1 src2 white white a1 a2 f | TU_alphaopex op src1 src2 f a1 a2 <- l]
+    , tusIsAlpha                    = def False             [x | TU_texture _ _ _ x _ _ <- l]
+    , tusHwGamma                    = def False             [x | TU_texture _ _ _ _ _ x <- l]
+
+    , tusUMod                       = def 0                 [x | TU_scroll x _ <- l]
+    , tusVMod                       = def 0                 [x | TU_scroll _ x <- l]
+    , tusUScale                     = def 1                 [x | TU_scale x _ <- l]
+    , tusVScale                     = def 1                 [x | TU_scale _ x <- l]
+    , tusRotate                     = def 0                 [x | TU_rotate x <- l]
+
+    , tusMinFilter                  = def FO_LINEAR         [x | TU_filtering (x,_,_) <- l]
+    , tusMagFilter                  = def FO_LINEAR         [x | TU_filtering (_,x,_) <- l]
+    , tusMipFilter                  = def FO_POINT          [x | TU_filtering (_,_,x) <- l]
+    
+    , tusMaxAniso                   = def 1                 [x | TU_maxanisotropy x <- l]
+    , tusMipmapBias                 = def 0                 [x | TU_mipmapbias x <- l]
+
+    , tusBindingType                = def BT_FRAGMENT       [x | TU_bindingtype x <- l]
+    , tusContentType                = def CONTENT_NAMED     [x | TU_contenttype x <- l]
+
+
+    , tusFrameNames                 = animFrames ++ cubeFrames ++ [n | TU_texture n _ _ _ _ _ <- l]
+    , tusFrames                     = Nothing
+    , tusName                       = n
+    , tusTextureAlias               = def ""                [x | TU_texturealias x <- l]
+    , tusEffects                    = [e | Just e <- map mkEffect l]
+    }
+  where
+    white       = (1,1,1,1)
+    colourop    = def LBO_MODULATE [x | TU_colourop x <- l]
+    animFrames  = concat [x | TU_animtexture x _ <- l]
+    cubeFrames  = concat [[a,b,c,d,e,f] | TU_cubictexture a b c d e f _ <- l]
+    fallbackop  = case colourop of
+        { LBO_REPLACE       -> [TU_colouropmultipassfallback (SBF_ONE, SBF_ZERO)]
+        ; LBO_ADD           -> [TU_colouropmultipassfallback (SBF_ONE, SBF_ONE)]
+        ; LBO_MODULATE      -> [TU_colouropmultipassfallback (SBF_DEST_COLOUR, SBF_ZERO)]
+        ; LBO_ALPHA_BLEND   -> [TU_colouropmultipassfallback (SBF_SOURCE_ALPHA, SBF_ONE_MINUS_SOURCE_ALPHA)]
+        }
+    colouropex  = case colourop of
+        { LBO_REPLACE       -> [TU_colouropex LBX_SOURCE1               LBS_TEXTURE LBS_CURRENT 0 white white]
+        ; LBO_ADD           -> [TU_colouropex LBX_ADD                   LBS_TEXTURE LBS_CURRENT 0 white white]
+        ; LBO_MODULATE      -> [TU_colouropex LBX_MODULATE              LBS_TEXTURE LBS_CURRENT 0 white white]
+        ; LBO_ALPHA_BLEND   -> [TU_colouropex LBX_BLEND_TEXTURE_ALPHA   LBS_TEXTURE LBS_CURRENT 0 white white]
+        }
+    cblendmode  = LayerBlendModeEx
+        { lbBlendType  = LBT_COLOUR
+        , lbOperation  = LBX_MODULATE
+        , lbSource1    = LBS_TEXTURE
+        , lbSource2    = LBS_CURRENT
+        , lbColourArg1 = white
+        , lbColourArg2 = white
+        , lbAlphaArg1  = 1
+        , lbAlphaArg2  = 1
+        , lbFactor     = 0
+        }
+    ablendmode  = LayerBlendModeEx
+        { lbBlendType  = LBT_ALPHA
+        , lbOperation  = LBX_MODULATE
+        , lbSource1    = LBS_TEXTURE
+        , lbSource2    = LBS_CURRENT
+        , lbColourArg1 = white
+        , lbColourArg2 = white
+        , lbAlphaArg1  = 1
+        , lbAlphaArg2  = 1
+        , lbFactor     = 0
+        }
+    mkEffect e  = case e of 
+        { TU_envmap _   -> Just $ TextureEffect
+            { teType        = ET_ENVIRONMENT_MAP
+            , teSubType     = 0
+            , teArg1        = 0
+            , teArg2        = 0
+            , teWaveType    = WFT_SINE
+            , teBase        = 0
+            , teFrequency   = 0
+            , tePhase       = 0
+            , teAmplitude   = 0
+            }
+--        ; TU_scrollanim
+--        ; TU_rotateanim
+--        ; TU_wavexform
+--        ; TU_transform
+        ; _ -> Nothing
+        }
+    {-
+    void TextureUnitState::setEnvironmentMap(bool enable, EnvMapType envMapType)
+    {
+        if (enable)
+        {
+            TextureEffect eff;
+            eff.type = ET_ENVIRONMENT_MAP;
+
+            eff.subtype = envMapType;
+            addEffect(eff);
+        }
+        else
+        {
+            removeEffect(ET_ENVIRONMENT_MAP);
+        }
+    }
+							case ScriptCompiler::ID_OFF:
+								mUnit->setEnvironmentMap(false);
+								break;
+							case ID_SPHERICAL:
+								mUnit->setEnvironmentMap(true, TextureUnitState::ENV_CURVED);
+								break;
+							case ID_PLANAR:
+								mUnit->setEnvironmentMap(true, TextureUnitState::ENV_PLANAR);
+								break;
+							case ID_CUBIC_REFLECTION:
+								mUnit->setEnvironmentMap(true, TextureUnitState::ENV_REFLECTION);
+								break;
+							case ID_CUBIC_NORMAL:
+								mUnit->setEnvironmentMap(true, TextureUnitState::ENV_NORMAL);
+								break;
+
+    | TU_envmap                    (Maybe EnvMapType)
+    | TU_scrollanim                FloatType FloatType
+    | TU_rotateanim                FloatType
+    | TU_wavexform                 TextureTransformType WaveformType FloatType FloatType FloatType FloatType
+    | TU_transform                 FloatType4 FloatType4 FloatType4 FloatType4
+
+    = TextureEffect
+    { teType        :: TextureEffectType
+    , teSubType     :: Int
+    , teArg1        :: FloatType
+    , teArg2        :: FloatType
+    , teWaveType    :: WaveformType
+    , teBase        :: FloatType
+    , teFrequency   :: FloatType
+    , tePhase       :: FloatType
+    , teAmplitude   :: FloatType
+    }
+    -}
+
+-- * Shaders
+pProgramContent =  SH_source                    <$= "source" <*> pName
+               <|> SH_attach                    <$= "attach" <*> pList pName
+               <|> SH_includesskeletalanimation <$= "includes_skeletal_animation" <*> pBool
+               <|> SH_includesmorphanimation    <$= "includes_morph_animation" <*> pBool
+               <|> SH_includesposeanimation     <$= "includes_pose_animation" <*> pInt
+               <|> SH_usesvertextexturefetch    <$= "uses_vertex_texture_fetch" <*> pBool
+               <|> SH_usesadjacencyinformation  <$= "uses_adjacency_information" <*> pBool
+               <|> SH_entrypoint                <$= "entry_point" <*> pName
+               <|> SH_profiles                  <$= "profiles" <*> pList pName
+               <|> SH_target                    <$= "target" <*> pName
+               <|> SH_delegate                  <$= "delegate" <*> pName
+--               <|> pPreprocessorDefines
+               <|> SH_defaultparams             <$= "default_params" <*= "{" <*> pList pParamContent <*= "}"
+
+--pPreprocessorDefines = (\_ d -> []) <$> pKey "preprocessor_defines" <*> pName -- TODO: parse defines correctly not with pName
+
+--format: param_indexed         <index> <type>       <value>
+--format: param_indexed_auto    <index> <value_code> <extra_params>
+--format: param_named           <name>  <type>       <value>
+--format: param_named_auto      <name>  <value_code> <extra_params>
+--The value of 'type' can be float4, matrix4x4, float<n>, int4, int<n>
+
+--("matrix4x4", 16, pFloat)
+--("float"    , 1 , pFloat)
+--("int"      , 1 , pInt)
+--[("float" ++ show i,i,pFloat) | i <- [1..32]]
+--[("int" ++ show i,i,pInt) | i <- [1..32]]
+autoparamVals = [(n,v) | (v,n,_,_,_) <- autoConstantDictionary]
+pParamContent =  PR_paramnamed       <$= "param_named" <*> pName <*> pVarid <*> pList pFloat
+             <|> PR_paramnamedauto   <$= "param_named_auto" <*> pName <*> pEnum autoparamVals <*> pList pFloat
+             <|> PR_paramindexed     <$= "param_indexed" <*> pInt <*> pVarid <*> pList pFloat
+             <|> PR_paramindexedauto <$= "param_indexed_auto" <*> pInt <*> pEnum autoparamVals <*> pList pFloat
+
+
+mkGpuProgramDesc t name s l = GpuProgramDescriptor
+    { gpdName               = name
+    , gpdType               = t
+    , gpdFilename           = def ""                [x | SH_source x <- l]
+    , gpdSyntaxCode         = s
+    , gpdAttach             = def []                [x | SH_attach x <- l]
+    , gpdSkeletalAnimation  = def False             [x | SH_includesskeletalanimation x <- l]
+    , gpdMorphAnimation     = def False             [x | SH_includesmorphanimation x <- l]
+    , gpdPoseAnimation      = def 0                 [x | SH_includesposeanimation x <- l]
+    , gpdVertexTextureFetch = def False             [x | SH_usesvertextexturefetch x <- l]
+    , gpdNeedsAdjacencyInfo = def False             [x | SH_usesadjacencyinformation x <- l]
+--    , gpdDefaultParams      :: GpuProgramParameters -- ^ The default parameters for use with this object
+--    , gpdCompileError       = False
+    
+    , gpdGpuProgram         = Nothing
+    }
+
+{-
+fragment_program is same:
+vertex_program myExteranalGLSLFunction1 glsl
+{
+    source myExternalGLSLfunction1.txt
+
+	default_params
+	{
+		param_named_auto lightPosition light_position_object_space 0
+		param_named_auto eyePosition camera_position_object_space
+		param_named_auto worldViewProj worldviewproj_matrix
+		param_named shininess float 10 
+	}
+
+	preprocessor_defines CLEVERTECHNIQUE,NUMTHINGS=2
+    attach myExteranalGLSLFunction1 myExteranalGLSLFunction2
+}
+-}
diff --git a/Graphics/LambdaCube/Loader/MaterialScriptScanner.x b/Graphics/LambdaCube/Loader/MaterialScriptScanner.x
new file mode 100644
--- /dev/null
+++ b/Graphics/LambdaCube/Loader/MaterialScriptScanner.x
@@ -0,0 +1,115 @@
+{
+-- alex scanner for use with uulib
+--   compile with alex -o Scanner.hs -g Scanner.x
+module Graphics.LambdaCube.Loader.Generated.MaterialScriptScanner(tokenize) where
+
+import UU.Scanner
+}
+
+$litChar   = [^[\" \\]]
+$identChar = [a-zA-Z0-9_\.\-\/\~\[\]]
+
+
+tokens :-
+  $white+                                      ;                               -- whitespace
+  "//".*                                       ;                               -- comment
+
+  \" ($litChar | \\ \\ | \\ \" )* \"           { valueToken TkString }         -- string
+  (\+ | \-)?[0-9]+                             { valueToken TkInteger10 }      -- int
+  (\+ | \-)?[0-9]+\.[0-9]+                     { valueToken TkFraction }       -- float
+  
+  ( 
+    on | off | true | false | force |
+    material | technique | pass | texture_unit |
+    lod_distances | receive_shadows | transparency_casts_shadows | set_texture_alias |
+    scheme | lod_index | lod_distances | shadow_caster_material | shadow_receiver_material | 
+    gpu_vendor_rule | gpu_device_rule | include | exclude | case_sensitive |
+    ambient | vertexcolour | diffuse | specular | emissive | scene_blend |
+    add | modulate | alpha_blend | colour_blend |
+    one | zero | dest_colour | src_colour | one_minus_dest_colour | one_minus_src_colour | dest_alpha | src_alpha | one_minus_dest_alpha | one_minus_src_alpha |
+    separate_scene_blend | depth_check | depth_write | depth_func | 
+    always_fail | always_pass | less | less_equal | equal | not_equal | greater_equal | greater |
+    depth_bias | iteration_depth_bias | alpha_rejection | alpha_to_coverage | light_scissor | light_clip_planes |
+    illumination_stage | per_light | decal | normalise_normals | transparent_sorting | cull_hardware |
+    clockwise | anticlockwise | none | cull_software | back | front | lighting | shading | 
+    flat | gouraud | phong | polygon_mode | solid | wireframe | points |
+    polygon_mode_overrideable | fog_override | exp | exp2 | colour_write | start_light | max_lights | iteration |
+    once | once_per_light | directional | spot | point_size | point_sprites | point_size_attenuation | 
+    point_size_min | point_size_max | texture_alias | texture | unlimited | alpha | gamma | 
+    1d | 2d | 3d | cubic |
+    PF_L8 | PF_L16 | PF_A8 | PF_A4L4 | PF_BYTE_LA | PF_R5G6B5 | PF_B5G6R5 | PF_R3G3B2 | PF_A4R4G4B4 | PF_A1R5G5B5 | PF_R8G8B8 | PF_B8G8R8 | PF_A8R8G8B8 | PF_A8B8G8R8 | PF_B8G8R8A8 |
+    PF_R8G8B8A8 | PF_X8R8G8B8 | PF_X8B8G8R8 | PF_A2R10G10B10 | PF_A2B10G10R10 | PF_FLOAT16_R | PF_FLOAT16_RGB | PF_FLOAT16_RGBA | PF_FLOAT32_R | PF_FLOAT32_RGB | PF_FLOAT32_RGBA | PF_SHORT_RGBA |
+    anim_texture | cubic_texture | combinedUVW | separateUV | binding_type | vertex | fragment | content_type | named | shadow |
+    tex_coord_set | tex_address_mode | wrap | clamp | mirror | border | tex_border_colour | filtering | bilinear | trilinear | anisotropic | linear | point |
+    max_anisotropy | mipmap_bias | colour_op | replace | colour_op_ex | source1 | source2 | modulate_x2 | modulate_x4 |
+    add_signed | add_smooth | subtract | blend_diffuse_alpha | blend_texture_alpha | blend_current_alpha | 
+    blend_manual | dotproduct | blend_diffuse_colour | src_current | src_texture | src_diffuse | src_specular | src_manual |
+    colour_op_multipass_fallback | alpha_op_ex | env_map | spherical | planar | cubic_reflection | cubic_normal |
+    scroll | scroll_anim | rotate | rotate_anim | scale | wave_xform | scroll_x | scroll_y | scale_x | scale_y |
+    sine | triangle | square | sawtooth | inverse_sawtooth | transform |
+    scene_blend_op | reverse_subtract | min | max | separate_scene_blend_op | 
+    keep |  increment | decrement | increment_wrap | decrement_wrap | invert |
+    
+    vertex_program | fragment_program | source | syntax | attach | manual_named_constants | profiles | entry_point |
+    target | preprocessor_defines | column_major_matrices | 
+    input_operation_type | output_operation_type | max_output_vertices | 
+    delegate | vertex_program_ref |fragment_program_ref | shadow_caster_vertex_program_ref | shadow_receiver_vertex_program_ref | shadow_receiver_fragment_program_ref | 
+    default_params | param_named_auto | param_named | param_indexed_auto | param_indexed | 
+    includes_skeletal_animation | includes_morph_animation | includes_pose_animation | uses_vertex_texture_fetch | uses_adjacency_information |
+    world_matrix | inverse_world_matrix | transpose_world_matrix | inverse_transpose_world_matrix | world_matrix_array_3x4 | view_matrix |
+    inverse_view_matrix | transpose_view_matrix | inverse_transpose_view_matrix | projection_matrix | inverse_projection_matrix | 
+    transpose_projection_matrix | inverse_transpose_projection_matrix | worldview_matrix | inverse_worldview_matrix | transpose_worldview_matrix |
+    inverse_transpose_worldview_matrix | viewproj_matrix | inverse_viewproj_matrix | transpose_viewproj_matrix | inverse_transpose_viewproj_matrix |
+    worldviewproj_matrix | inverse_worldviewproj_matrix | transpose_worldviewproj_matrix | inverse_transpose_worldviewproj_matrix |
+    texture_matrix | render_target_flipping | light_diffuse_colour | light_specular_colour | light_attenuation | spotlight_params |
+    light_position | light_direction | light_position_object_space | light_direction_object_space | light_distance_object_space |
+    light_position_view_space | light_direction_view_space | light_power | light_diffuse_colour_power_scaled | light_specular_colour_power_scaled |
+    light_number | light_diffuse_colour_array | light_specular_colour_array | light_diffuse_colour_power_scaled_array |
+    light_specular_colour_power_scaled_array | light_attenuation_array | spotlight_params_array | light_position_array | light_direction_array |
+    light_position_object_space_array | light_direction_object_space_array | light_distance_object_space_array | light_position_view_space_array |
+    light_direction_view_space_array | light_power_array | light_count | light_casts_shadows | ambient_light_colour | surface_ambient_colour |
+    surface_diffuse_colour | surface_specular_colour | surface_emissive_colour | surface_shininess | derived_ambient_light_colour | derived_scene_colour |
+    derived_light_diffuse_colour | derived_light_specular_colour | derived_light_diffuse_colour_array | derived_light_specular_colour_array |
+    fog_colour | fog_params | camera_position | camera_position_object_space | lod_camera_position | lod_camera_position_object_space | time |
+    time_0_x | costime_0_x | sintime_0_x | tantime_0_x | time_0_x_packed | time_0_1 | costime_0_1 | sintime_0_1 | tantime_0_1 | time_0_1_packed |
+    time_0_2pi | costime_0_2pi | sintime_0_2pi | tantime_0_2pi | time_0_2pi_packed | frame_time | fps | viewport_width | viewport_height |
+    inverse_viewport_width | inverse_viewport_height | viewport_size | texel_offsets | view_direction | view_side_vector | view_up_vector |    
+    fov | near_clip_distance | far_clip_distance | texture_viewproj_matrix | texture_viewproj_matrix_array | texture_worldviewproj_matrix |
+    texture_worldviewproj_matrix_array | spotlight_viewproj_matrix | spotlight_worldviewproj_matrix | scene_depth_range | shadow_scene_depth_range |
+    shadow_colour | shadow_extrusion_distance | texture_size | inverse_texture_size | packed_texture_size | pass_number | pass_iteration_number |
+    animation_parametric | custom 
+    )            { reserved }                    -- reserved keywords
+    
+  [\{\}]                                       { reserved }                    -- reserved symbols
+
+  $identChar+                                  { valueToken TkVarid }          -- identifier
+
+
+{
+-- boilerplate code needed for Alex
+type AlexInput = (Pos, String)
+
+alexInputPrevChar :: AlexInput -> Char
+alexInputPrevChar = error "alexInputPrevChar: there is no need to go back in the input."
+
+alexGetChar :: AlexInput -> Maybe (Char, AlexInput)
+alexGetChar (_, []) = Nothing
+alexGetChar (p, (c:cs))
+  = let p' = adv p c
+    in Just (c, (p', cs))
+
+-- use the Alex scanner to generate a list of tokens for the uulib token parsers
+tokenize :: String -> String -> [Token]
+tokenize filename str
+  = go (initpos, str)
+  where
+    initpos = Pos 1 1 filename
+    
+    go inp@(pos, cs)
+      = case alexScan inp 0 of
+          AlexEOF         -> []
+          AlexError inp'  -> valueToken TkError [head cs] pos : go inp'
+          AlexSkip inp' _ -> go inp'
+          AlexToken inp' len act -> act (take len cs) pos : go inp'
+}
+
diff --git a/Graphics/LambdaCube/Loader/MeshXML.hs b/Graphics/LambdaCube/Loader/MeshXML.hs
new file mode 100644
--- /dev/null
+++ b/Graphics/LambdaCube/Loader/MeshXML.hs
@@ -0,0 +1,266 @@
+module Graphics.LambdaCube.Loader.MeshXML where
+
+import Data.Maybe
+import Data.List
+import Data.Word
+import qualified Data.IntMap as IntMap
+import Foreign.Ptr
+import Foreign.C.Types
+import Foreign.Marshal.Array
+
+import Text.XML.Light
+import System.Log.Logger
+
+import Graphics.LambdaCube.Mesh
+import Graphics.LambdaCube.HardwareBuffer
+import Graphics.LambdaCube.HardwareVertexBuffer
+import Graphics.LambdaCube.HardwareIndexBuffer
+import Graphics.LambdaCube.RenderSystem
+import Graphics.LambdaCube.RenderOperation
+import Graphics.LambdaCube.VertexIndexData
+
+
+{-
+data MeshReader
+    = MeshReader
+    { mrInfo          :: String
+    , mrFileExtension :: String
+    , mrReadFunction  :: ByteString -> IO Mesh
+    }
+    
+meshReader = MeshReader
+    { mrInfo = "Ogre XML mesh reader"
+    , mrFileExtension = "xml"
+    , mrReadFunction = parseMesh
+    }
+-}
+
+-- Load Mesh XML
+readBool :: String -> Bool -> Element -> Bool
+readBool n v e = maybe v (=="true") $ findAttr (unqual n) e
+        
+readInt :: String -> Int -> Element -> Int
+readInt n v e = maybe v read $ findAttr (unqual n) e
+
+readStr :: String -> String -> Element -> String
+readStr n v e = fromMaybe v $ findAttr (unqual n) e
+
+{-
+data VertexElement
+    = VertexElement
+    { veSource      :: Int                      -- ^ The source vertex buffer, as bound to an index using VertexBufferBinding
+    , veOffset      :: Int                      -- ^ The offset in the buffer that this element starts at
+    , veType        :: VertexElementType        -- ^ The type of element
+    , veSemantic    :: VertexElementSemantic    -- ^ The meaning of the element
+    , veIndex       :: Int                      -- ^ Index of the item, only applicable for some elements like texture coords
+    }
+-}
+
+readDecl :: (Element,Int) -> [VertexElement]
+readDecl (x,n) = [v { veIndex = i } | (v,i) <- zip declList $ reverse indexList]
+  where
+    hasPositions = readBool "positions"          False x
+    hasNormals   = readBool "normals"            False x
+    hasDiffuse   = readBool "colours_diffuse"    False x
+    hasSpecular  = readBool "colours_specular"   False x
+    hasBinormals = readBool "binormals"          False x
+    hasTangents  = readBool "tangents"           False x
+    dimTangents  = readInt  "tangent_dimensions" 3 x
+    numTexCoords = readInt  "texture_coords"     0 x
+    dimTexCoords = [readInt ("texture_coord_dimensions_" ++ show (i-1)) 2 x | i <- [1..numTexCoords]]
+    
+    mColourElementType = VET_COLOUR_ABGR
+    
+    f a b       = if a then [b] else [] 
+    
+    l           = [ f hasPositions (VET_FLOAT3, VES_POSITION)
+                  , f hasNormals   (VET_FLOAT3, VES_NORMAL)
+                  , f hasTangents  (if dimTangents == 4 then VET_FLOAT4 else VET_FLOAT3, VES_TANGENT)
+                  , f hasBinormals (VET_FLOAT3, VES_BINORMAL)
+                  , f hasDiffuse   (mColourElementType, VES_DIFFUSE)
+                  , f hasSpecular  (mColourElementType, VES_SPECULAR)
+                  ] ++ 
+                  [[(multiplyTypeCount VET_FLOAT1 dims,VES_TEXTURE_COORDINATES)] | dims <- dimTexCoords]
+    l'          = concat l
+    offs        = scanl (\a (b,_) -> a + getTypeSize b) 0 l'
+    declList    = [VertexElement n o t s 0 | (o,(t,s)) <- zip offs l']
+    indexList   = snd $ foldl fi (IntMap.empty,[]) declList
+    fi (m,vl) e = case IntMap.lookup semIdx m of
+                    { Nothing   -> (IntMap.insert semIdx 0 m,0:vl)
+                    ; Just i    -> (IntMap.insert semIdx (i+1) m,(i+1):vl)
+                    }
+      where
+        semIdx  = fromEnum $ veSemantic e
+    
+--readGeometry :: RenderSystem rs => rs -> Element -> IO VertexData
+readGeometry rs x = do
+    let vcount = read $ fromMaybe (error "fromJust 0") $ findAttr (unqual "vertexcount") x
+        vbs = findElements (unqual "vertexbuffer") x
+        elems = [readDecl v | v <- zip vbs [0..]]
+        sizes = [foldl (\a b -> a + (getTypeSize $ veType b)) 0 e | e <- elems]
+        -- create VertexDeclaration
+        decl = VertexDeclaration $ concat elems
+        -- create VertexBufferBinding
+        usage = HBU_STATIC -- TODO
+    
+    debugM "readGeometry" $ "gemetry declaration: " ++ show elems
+    
+    bufs <- mapM (\s -> createVertexBuffer rs s vcount usage True) sizes
+    let binding = VertexBufferBinding $ IntMap.fromList $ zip [0..] bufs
+        fillBuffer (d,vx,b) = do
+            -- 1. lock buffer
+            ptr <- lock b 0 (getSizeInBytes b) HBL_NORMAL
+            let fillVertex (i,vx) = do
+                    -- iterate over elements and read data from xml subelement
+                    let fillAttribute e = do
+                            let p = plusPtr ptr (i * (getVertexSize b) + veOffset e)
+                                setCFloatAttr :: String -> [String] -> IO () 
+                                setCFloatAttr en ea = pokeArray p $ getCFloat ((findElements (unqual en) vx ) !! veIndex e) ea
+                        
+                                setColourAttr :: String -> IO ()
+                                setColourAttr en = pokeArray p $ getColour ((findElements (unqual en) vx ) !! veIndex e)
+                        
+                                getCFloat :: Element -> [String] -> [CFloat]
+                                getCFloat xn ll = map ef ll
+                                  where 
+                                    ef nm = read $ fromMaybe (error "fromJust 1") $ findAttr (unqual nm) xn
+                            
+                                getColour :: Element -> [Word8]
+                                getColour xn = if length values == 4 then values else 1:values
+                                  where 
+                                    values = map read $ words $ fromMaybe (error "fromJust 2") $ findAttr (unqual "value") xn
+                            
+                            case veSemantic e of
+                                { VES_POSITION              -> setCFloatAttr "position" ["x","y","z"]
+                                ; VES_BLEND_WEIGHTS         -> error "invalid semantic"
+                                ; VES_BLEND_INDICES         -> error "invalid semantic"
+                                ; VES_NORMAL                -> setCFloatAttr "normal" ["x","y","z"]
+                                ; VES_DIFFUSE               -> setColourAttr "colour_diffuse"
+                                ; VES_SPECULAR              -> setColourAttr "colour_specular"
+                                ; VES_TEXTURE_COORDINATES   -> setCFloatAttr "texcoord" $ take (getTypeCount $ veType e) ["u","v","w","x"]
+                                ; VES_BINORMAL              -> setCFloatAttr "binormal" ["x","y","z"]
+                                ; VES_TANGENT               -> setCFloatAttr "tangent" $ if veType e == VET_FLOAT4 then ["x","y","z","w"] else ["x","y","z"]
+                                }
+                            -- end fillAttribute
+                            
+                    mapM_ fillAttribute d
+                    -- end fillVertex
+                    
+            -- 2. fill n-th vertex attributes according declaration
+            mapM_ fillVertex $ zip [0..] $ findElements (unqual "vertex") vx
+            -- 3. unlock buffer
+            unlock b
+            -- end fillBuffer
+            
+    -- fill buffers with data
+    mapM_ fillBuffer $ zip3 elems vbs bufs
+    
+    -- create VertexData
+    return $ VertexData decl binding 0 vcount
+    
+--readSubMesh :: RenderSystem rs => rs -> Element -> IO SubMesh
+readSubMesh rs x = do
+    let Just material   = findAttr (unqual "material") x
+        useShared       = readBool "usesharedvertices"  True    x
+        use32BitIndex   = readBool "use32bitindexes"    False   x
+        (hasFaces,oper) = readOpType $ readStr  "operationtype" "triangle_list" x
+        readOpType o    = case o of
+                            { "triangle_list"   -> (True,  OT_TRIANGLE_LIST)
+                            ; "triangle_strip"  -> (True,  OT_TRIANGLE_STRIP)
+                            ; "triangle_fan"    -> (True,  OT_TRIANGLE_FAN)
+                            ; "line_strip"      -> (False, OT_LINE_STRIP)
+                            ; "line_list"       -> (False, OT_LINE_LIST)
+                            ; "point_list"      -> (False, OT_POINT_LIST)
+                            }
+
+    midata <- if not hasFaces then return Nothing else do
+        let Just faces      = findElement (unqual "faces") x
+            faceCount       = readInt "count" 0 faces
+            faceList        = findElements (unqual "face") faces
+            indexCount      = if oper == OT_TRIANGLE_LIST then 3 * faceCount else 2 + faceCount
+            usage           = HBU_STATIC -- TODO
+
+            attrList        = take (if oper == OT_TRIANGLE_LIST then 3 else 1) ["v1", "v2", "v3"]
+            indexList gf    = concat $ [gf (head faceList) ["v1", "v2", "v3"]] ++ [gf f attrList | f <- tail faceList]
+            getWord16 :: Element -> [String] -> [Word16]
+            getWord16 xn ll = map ef ll
+              where 
+                ef nm = read $ fromMaybe (error "fromJust 3") $ findAttr (unqual nm) xn
+
+            getWord32 :: Element -> [String] -> [Word32]
+            getWord32 xn ll = map ef ll
+              where 
+                ef nm = read $ fromMaybe (error "fromJust 4") $ findAttr (unqual nm) xn
+    
+        -- create IndexData
+        ib <- createIndexBuffer rs (if use32BitIndex then IT_32BIT else IT_16BIT) indexCount usage True
+        -- 1. lock buffer
+        ptr <- lock ib 0 (getSizeInBytes ib) HBL_NORMAL 
+        -- 2. fill buffer
+        case use32BitIndex of
+            { True  -> pokeArray (castPtr ptr) $ indexList getWord32
+            ; False -> pokeArray (castPtr ptr) $ indexList getWord16
+            }
+        -- 3. unlock buffer
+        unlock ib
+        return $ Just IndexData
+            { idIndexBuffer = ib
+            , idIndexStart  = 0
+            , idIndexCount  = indexCount
+            }
+
+    -- read geometry if necessary
+    mvdata <- if useShared then return Nothing else do
+        vd <- readGeometry rs $ fromMaybe (error "fromJust 5") $ findElement (unqual "geometry") x 
+        return $ Just vd
+
+    return $ SubMesh
+        { smOperationType       = oper
+        , smVertexData          = mvdata
+        , smIndexData           = midata
+        , smExtremityPoints     = undefined -- TODO
+        , smMaterialName        = material
+        }
+
+{-
+    <levelofdetail strategy="Distance" numlevels="6" manual="false">
+        <lodgenerated value="1000">
+            <lodfacelist submeshindex="0" numfaces="60">
+                <face v1="1" v2="2" v3="6" />
+-}
+--readMesh :: RenderSystem rs => rs -> Element -> IO Mesh
+readMesh rs x = do
+    let Just sml = findElement (unqual "submeshes") x
+    submeshes <- mapM (readSubMesh rs) $ findElements (unqual "submesh") sml
+    sharedVDs <- mapM (readGeometry rs) $ findElements (unqual "sharedgeometry") x
+    return $ Mesh 
+        { msSubMeshList                 = submeshes
+        , msSharedVertexData            = listToMaybe sharedVDs
+        , msSubMeshNameMap              = undefined -- TODO
+        , msBoundRadius                 = undefined -- TODO
+        , msSkeletonName                = undefined -- TODO
+        , msVertexBufferUsage           = undefined -- TODO
+        , msIndexBufferUsage            = undefined -- TODO
+        , msVertexBufferShadowBuffer    = undefined -- TODO
+        , msIndexBufferShadowBuffer     = undefined -- TODO
+        }
+{-
+    -- load LOD data
+    e a n = read $ fromMaybe (error "fromJust 0") $ findAttr (unqual n) a
+    lods = [ (getLod m) | m <- findElements (unqual "levelofdetail") x ]
+    -- <lodgenerated value="1000">
+    getLod a = [ (e m "value" ,getLodLevel m) | m <- findElements (unqual "lodgenerated") a ]
+    -- <lodfacelist submeshindex="0" numfaces="60">
+    getLodLevel a = [ (e m "submeshindex", e m "numfaces", getLodFaces m) | m <- findElements (unqual "lodfacelist") a ]
+    -- <face v1="1" v2="2" v3="6" />
+    getLodFaces a = [ (getFace m) | m <- findElements (unqual "face") a ]
+-}
+--parseMesh :: RenderSystem rs => rs -> String -> IO Mesh
+parseMesh rs doc = do 
+    let Just x = parseXMLDoc doc
+    readMesh rs $ fromMaybe (error "fromJust 6") $ findElement (unqual "mesh") x
+
+--loadMesh :: RenderSystem rs => rs -> String -> IO Mesh
+loadMesh rs fileName = do
+    doc <- readFile fileName
+    parseMesh rs doc
diff --git a/Graphics/LambdaCube/Loader/OverlayScriptScanner.x b/Graphics/LambdaCube/Loader/OverlayScriptScanner.x
new file mode 100644
--- /dev/null
+++ b/Graphics/LambdaCube/Loader/OverlayScriptScanner.x
@@ -0,0 +1,69 @@
+{
+-- alex scanner for use with uulib
+--   compile with alex -o Scanner.hs -g Scanner.x
+module Graphics.LambdaCube.Loader.Generated.OverlayScriptScanner(tokenize) where
+
+import UU.Scanner
+}
+
+$litChar   = [^[\" \\]]
+$identChar = [a-zA-Z0-9_\.\-\/\~]
+
+
+tokens :-
+  $white+                                      ;                               -- whitespace
+  "//".*                                       ;                               -- comment
+
+  \" ($litChar | \\ \\ | \\ \" )* \"           { valueToken TkString }         -- string
+  [0-9]+                                       { valueToken TkInteger16 }      -- int
+  
+  ( zorder | element | container |
+    metrics_mode | pixels | relative |
+    horz_align | left | center | right |
+    vert_align | top | center | bottom |
+    left | top | width | height |
+    material | caption | rotation |
+    Panel | transparent | true | false |
+    tiling | uv_coords |
+    BorderPanel | border_size |
+    border_material | border_topleft_uv |
+    border_topright_uv | border_bottomleft_uv |
+    border_bottomright_uv | border_left_uv |
+    border_right_uv | border_top_uv | border_bottom_uv |
+    TextArea | font_name | char_height | colour |
+    colour_top | colour_bottom | alignment |
+    space_width |
+    Panel | BorderPanel | TextArea)            { reserved }                    -- reserved keywords
+  [\{\}\:\(\)]                                 { reserved }                    -- reserved symbols
+
+  $identChar+                                  { valueToken TkVarid }          -- identifier
+
+
+{
+-- boilerplate code needed for Alex
+type AlexInput = (Pos, String)
+
+alexInputPrevChar :: AlexInput -> Char
+alexInputPrevChar = error "alexInputPrevChar: there is no need to go back in the input."
+
+alexGetChar :: AlexInput -> Maybe (Char, AlexInput)
+alexGetChar (_, []) = Nothing
+alexGetChar (p, (c:cs))
+  = let p' = adv p c
+    in Just (c, (p', cs))
+
+-- use the Alex scanner to generate a list of tokens for the uulib token parsers
+tokenize :: String -> String -> [Token]
+tokenize filename str
+  = go (initpos, str)
+  where
+    initpos = Pos 1 1 filename
+    
+    go inp@(pos, cs)
+      = case alexScan inp 0 of
+          AlexEOF         -> []
+          AlexError inp'  -> valueToken TkError [head cs] pos : go inp'
+          AlexSkip inp' _ -> go inp'
+          AlexToken inp' len act -> act (take len cs) pos : go inp'
+}
+
diff --git a/Graphics/LambdaCube/Loader/ParserUtil.hs b/Graphics/LambdaCube/Loader/ParserUtil.hs
new file mode 100644
--- /dev/null
+++ b/Graphics/LambdaCube/Loader/ParserUtil.hs
@@ -0,0 +1,493 @@
+{-# LANGUAGE FlexibleContexts #-}
+module Graphics.LambdaCube.Loader.ParserUtil where
+
+-- import the the library functions from uulib
+import UU.Parsing
+import UU.Scanner
+
+import Data.Maybe
+
+import Graphics.LambdaCube.Types
+import Graphics.LambdaCube.Common
+import Graphics.LambdaCube.BlendMode
+import Graphics.LambdaCube.PixelFormat
+import Graphics.LambdaCube.RenderSystem
+import Graphics.LambdaCube.Technique
+import Graphics.LambdaCube.Pass
+import Graphics.LambdaCube.Light
+import Graphics.LambdaCube.TextureUnitState
+import Graphics.LambdaCube.Texture
+import Graphics.LambdaCube.Compositor
+
+{-
+
+parseFile pFunc tokenize file txt
+	= let res = parseTokens pFunc (tokenize file txt)
+	in case res of
+		Left errs -> do
+			mapM_ putStrLn errs
+			return Nothing
+		Right tree -> return (Just tree)
+		
+type TokenParser a = Parser Token a
+
+parseTokens :: TokenParser a -> [Token] -> Either [String] a
+parseTokens p tks = if null msgs then final `seq` Right v else Left (map show msgs)
+  where
+    steps = parse p tks
+    msgs  = getMsgs steps
+    (Pair v final) = evalSteps steps
+-}
+
+-- * Utility parser combinators
+
+infixl 4 <$=, <*=
+
+x <$= s = x <$ pKey s
+x <*= s = x <* pKey s
+
+pBool :: AnaParser [Token] Pair Token (Maybe Token) Bool
+pBool = pEnum boolVals
+
+pOnOff :: AnaParser [Token] Pair Token (Maybe Token) Bool
+pOnOff = pEnum onoffVals
+
+pInt :: AnaParser [Token] Pair Token (Maybe Token) Int
+pInt = read <$> pInteger10
+
+pFloat :: AnaParser [Token] Pair Token (Maybe Token) FloatType
+pFloat =  read <$> pFraction
+      <|> read <$> pInteger10
+
+pName :: AnaParser [Token] Pair Token (Maybe Token) String
+pName =  pVarid
+     <|> (filter (/= '"') <$> pString)
+     <|> pInteger10
+     <|> pFraction
+{-
+    -- | Parses using any of the parsers in the list 'l'.
+    --
+    -- Warning: 'l' may not be an empty list.
+    pAny :: (IsParser p s) =>(a -> p a1) -> [a] -> p a1
+    pAny  f l = if null l then usererror "pAny: argument may not be empty list" else foldr1 (<|>) (map f l)
+    
+    -- | Parses any of the symbols in 'l'.
+    pAnySym :: (IsParser p s) =>[s] -> p s
+    pAnySym l = pAny pSym l -- used to be called pAnySym
+    
+    pToks :: (IsParser p s) => [s] -> p [s]
+    pToks []     = pSucceed []
+    pToks (a:as) = (:) <$> pSym a <*> pToks as
+-}
+--     pEnum :: (IsParser p s) => [(s, t)] -> p t
+--     pEnum v = pAny (\(a,b) -> pToks a *> pSucceed b) v 
+pEnum :: (IsParser p Token) => [(String, t)] -> p t
+pEnum v = pAny (\(a,b) -> pKey a *> pSucceed b) v 
+{-
+pEnum v = readVal v <$> pVarid
+  where
+    readVal l x = head [y | (x2,y) <- l, x == x2]
+-}
+
+pColour a =  Left <$> pRGB a
+         <|> Left <$> pRGBA
+         <|> Right () <$= "vertex_colour"
+
+pFloat3 = (,,) <$> pFloat <*> pFloat <*> pFloat
+pFloat4 = (,,,) <$> pFloat <*> pFloat <*> pFloat <*> pFloat
+pRGBOrRGBA a = pRGBA <|> pRGB a
+
+pRGBA :: AnaParser [Token] Pair Token (Maybe Token) (FloatType, FloatType, FloatType, FloatType)
+pRGBA = pFloat4
+pRGB a = (,,,) <$> pFloat <*> pFloat <*> pFloat <*> pSucceed a
+
+def dv l = if null l then dv else head l
+
+-- * 
+boolVals =
+    [ ("true",  True)
+    , ("false", False)
+    ]
+    
+onoffVals =
+    [ ("on",    True)
+    , ("off",   False)
+    ]
+
+ruleopVals =
+    [ ("include",INCLUDE)
+    , ("exclude",EXCLUDE)
+    ]
+
+cmpfuncVals =
+    [ ("always_fail",   CMPF_ALWAYS_FAIL)
+    , ("always_pass",   CMPF_ALWAYS_PASS)
+    , ("less",          CMPF_LESS)
+    , ("less_equal",    CMPF_LESS_EQUAL)
+    , ("equal",         CMPF_EQUAL)
+    , ("not_equal",     CMPF_NOT_EQUAL)
+    , ("greater_equal", CMPF_GREATER_EQUAL)
+    , ("greater",       CMPF_GREATER)
+    ]
+
+shadingVals =
+    [ ("flat",    SO_FLAT)
+    , ("gouraud", SO_GOURAUD)
+    , ("phong",   SO_PHONG)
+    ]
+
+polymodeVals =
+    [ ("points",    PM_POINTS)
+    , ("wireframe", PM_WIREFRAME)
+    , ("solid",     PM_SOLID)
+    ]
+    
+blendopVals = 
+    [ ("add",               SBO_ADD)
+    , ("subtract",          SBO_SUBTRACT)
+    , ("reverse_subtract",  SBO_REVERSE_SUBTRACT)
+    , ("min",               SBO_MIN)
+    , ("max",               SBO_MAX)
+    ]
+    
+blendVals =
+    [ ("one",                   SBF_ONE)
+    , ("zero",                  SBF_ZERO)
+    , ("dest_colour",           SBF_DEST_COLOUR)
+    , ("src_colour",            SBF_SOURCE_COLOUR)
+    , ("one_minus_dest_colour", SBF_ONE_MINUS_DEST_COLOUR)
+    , ("one_minus_src_colour",  SBF_ONE_MINUS_SOURCE_COLOUR)
+    , ("dest_alpha",            SBF_DEST_ALPHA)
+    , ("src_alpha",             SBF_SOURCE_ALPHA)
+    , ("one_minus_dest_alpha",  SBF_ONE_MINUS_DEST_ALPHA)
+    , ("one_minus_src_alpha",   SBF_ONE_MINUS_SOURCE_ALPHA)
+    ]
+
+sceneblendVals =
+    [ ("add",          SBT_ADD)
+    , ("modulate",     SBT_MODULATE)
+    , ("colour_blend", SBT_TRANSPARENT_COLOUR)
+    , ("alpha_blend",  SBT_TRANSPARENT_ALPHA)
+    ]
+    
+illumstageVals = 
+    [ ("ambient",   IS_AMBIENT)
+    , ("per_light", IS_PER_LIGHT)
+    , ("decal",     IS_DECAL)
+    ]
+
+cullhwVals = 
+    [ ("clockwise",     CULL_CLOCKWISE)
+    , ("anticlockwise", CULL_ANTICLOCKWISE)
+    , ("none",          CULL_NONE)
+    ]
+
+cullswVals =
+    [ ("back",  MANUAL_CULL_BACK)
+    , ("front", MANUAL_CULL_FRONT)
+    , ("none",  MANUAL_CULL_NONE)
+    ]
+    
+lighttypeVals =
+    [ ("point",       LT_POINT)
+    , ("directional", LT_DIRECTIONAL)
+    , ("spot",        LT_SPOTLIGHT)
+    ]
+
+copVals =
+    [ ("replace",     LBO_REPLACE)
+    , ("add",         LBO_ADD)
+    , ("modulate",    LBO_MODULATE)
+    , ("alpha_blend", LBO_ALPHA_BLEND)
+    ]
+          
+btyVals =
+    [ ("vertex",   BT_VERTEX)
+    , ("fragment", BT_FRAGMENT)
+    ]
+
+ctyVals =
+    [ ("named",  CONTENT_NAMED)
+    , ("shadow", CONTENT_SHADOW)
+    ]
+
+pixelformatVals = 
+    [ ("PF_L8",           PF_L8)            
+    , ("PF_L16",          PF_L16)           
+    , ("PF_A8",           PF_A8)            
+    , ("PF_A4L4",         PF_A4L4)        
+    , ("PF_BYTE_LA",      PF_BYTE_LA)  
+    , ("PF_R5G6B5",       PF_R5G6B5)    
+    , ("PF_B5G6R5",       PF_B5G6R5)    
+    , ("PF_R3G3B2",       PF_R3G3B2)    
+    , ("PF_A4R4G4B4",     PF_A4R4G4B4)
+    , ("PF_A1R5G5B5",     PF_A1R5G5B5)
+    , ("PF_R8G8B8",       PF_R8G8B8)    
+    , ("PF_B8G8R8",       PF_B8G8R8)    
+    , ("PF_A8R8G8B8",     PF_A8R8G8B8)
+    , ("PF_A8B8G8R8",     PF_A8B8G8R8)
+    , ("PF_B8G8R8A8",     PF_B8G8R8A8)
+    , ("PF_R8G8B8A8",     PF_R8G8B8A8)
+    , ("PF_X8R8G8B8",     PF_X8R8G8B8)
+    , ("PF_X8B8G8R8",     PF_X8B8G8R8)
+    , ("PF_A2R10G10B10",  PF_A2R10G10B10)
+    , ("PF_A2B10G10R10",  PF_A2B10G10R10)
+    , ("PF_FLOAT16_R",    PF_FLOAT16_R)    
+    , ("PF_FLOAT16_RGB",  PF_FLOAT16_RGB)  
+    , ("PF_FLOAT16_RGBA", PF_FLOAT16_RGBA)
+    , ("PF_FLOAT32_R",    PF_FLOAT32_R)      
+    , ("PF_FLOAT32_RGB",  PF_FLOAT32_RGB)  
+    , ("PF_FLOAT32_RGBA", PF_FLOAT32_RGBA)
+    , ("PF_SHORT_RGBA",   PF_SHORT_RGBA)    
+    ]
+    
+textypeVals = 
+    [ ("1d",    TEX_TYPE_1D)
+    , ("2d",    TEX_TYPE_2D)
+    , ("3d",    TEX_TYPE_3D)
+    , ("cubic", TEX_TYPE_CUBE_MAP)
+    ]
+
+texaddressVals =
+    [ ("wrap",   TAM_WRAP)
+    , ("clamp",  TAM_CLAMP)
+    , ("mirror", TAM_MIRROR)
+    , ("border", TAM_BORDER)
+    ]
+    
+texfilteringVals =
+    [ ("none",        (FO_POINT,FO_POINT,FO_NONE))
+    , ("bilinear",    (FO_LINEAR,FO_LINEAR,FO_POINT))
+    , ("trilinear",   (FO_LINEAR,FO_LINEAR,FO_LINEAR))
+    , ("anisotropic", (FO_ANISOTROPIC,FO_ANISOTROPIC,FO_LINEAR))
+    ]
+
+filteringVals =
+    [ ("none",        FO_NONE)
+    , ("point",       FO_POINT)
+    , ("linear",      FO_LINEAR)
+    , ("anisotropic", FO_ANISOTROPIC)
+    ]
+
+envmapVals =
+    [ ("off",              Nothing)
+    , ("spherical",        Just ENV_CURVED)
+    , ("planar",           Just ENV_PLANAR)
+    , ("cubic_reflection", Just ENV_REFLECTION)
+    , ("cubic_normal",     Just ENV_NORMAL)
+    ]    
+
+xformtypeVals =
+    [ ("scroll_x", TT_TRANSLATE_U)
+    , ("scroll_y", TT_TRANSLATE_V)
+    , ("scale_x",  TT_SCALE_U)
+    , ("scale_y",  TT_SCALE_V)
+    , ("rotate",   TT_ROTATE)
+    ]
+
+wavetypeVals =
+    [ ("sine",              WFT_SINE)       
+    , ("triangle",          WFT_TRIANGLE)
+    , ("square",            WFT_SQUARE)       
+    , ("sawtooth",          WFT_SAWTOOTH)
+    , ("inverse_sawtooth",  WFT_INVERSE_SAWTOOTH)
+--    , ("",WFT_PWM)
+    ]      
+
+stencilopVals =
+    [ ("keep",              SOP_KEEP)
+    , ("zero",              SOP_ZERO)
+    , ("replace",           SOP_REPLACE)
+    , ("increment",         SOP_INCREMENT)
+    , ("decrement",         SOP_DECREMENT)
+    , ("increment_wrap",    SOP_INCREMENT_WRAP)
+    , ("decrement_wrap",    SOP_DECREMENT_WRAP)
+    , ("invert",            SOP_INVERT)
+    ]
+
+fogmodeVals =
+    [ ("none",      FOG_NONE)
+    , ("linear",    FOG_LINEAR)
+    , ("exp",       FOG_EXP)
+    , ("exp2",      FOG_EXP2)
+    ]
+
+layerblendopexVals =
+    [ ("source1",               LBX_SOURCE1)
+    , ("source2",               LBX_SOURCE2)
+    , ("modulate",              LBX_MODULATE)
+    , ("modulate_x2",           LBX_MODULATE_X2)
+    , ("modulate_x4",           LBX_MODULATE_X4)
+    , ("add",                   LBX_ADD)
+    , ("add_signed",            LBX_ADD_SIGNED)
+    , ("add_smooth",            LBX_ADD_SMOOTH)
+    , ("subtract",              LBX_SUBTRACT)
+    , ("blend_diffuse_alpha",   LBX_BLEND_DIFFUSE_ALPHA)
+    , ("blend_texture_alpha",   LBX_BLEND_TEXTURE_ALPHA)
+    , ("blend_current_alpha",   LBX_BLEND_CURRENT_ALPHA)
+    , ("blend_manual",          LBX_BLEND_MANUAL)
+    , ("dotproduct",            LBX_DOTPRODUCT)
+    , ("blend_diffuse_colour",  LBX_BLEND_DIFFUSE_COLOUR)
+    ]
+
+layerblendsrcVals = 
+    [ ("src_current",   LBS_CURRENT)
+    , ("src_texture",   LBS_TEXTURE)
+    , ("src_diffuse",   LBS_DIFFUSE)
+    , ("src_specular",  LBS_SPECULAR)
+    , ("src_manual",    LBS_MANUAL)
+    ]
+
+inputVals =
+    [ ("none",      IM_NONE)
+    , ("previous",  IM_PREVIOUS)
+    ]
+
+compositorPixelFormatVals =
+    [ ("PF_A8R8G8B8",       PF_A8R8G8B8) 
+    , ("PF_R8G8B8A8",       PF_R8G8B8A8)
+    , ("PF_R8G8B8",         PF_R8G8B8)
+    , ("PF_FLOAT16_RGBA",   PF_FLOAT16_RGBA)
+    , ("PF_FLOAT16_RGB",    PF_FLOAT16_RGB)
+    , ("PF_FLOAT16_R",      PF_FLOAT16_R)
+    , ("PF_FLOAT32_RGBA",   PF_FLOAT32_RGBA)
+    , ("PF_FLOAT32_RGB",    PF_FLOAT32_RGB)
+    , ("PF_FLOAT32_R",      PF_FLOAT32_R)
+    ]
+
+--autoparamVals = [(n,v) | (v,n,_,_,_) <- autoConstantDictionary]
+{-
+    [ ("world_matrix",                              ACT_WORLD_MATRIX)
+    , ("inverse_world_matrix",                      ACT_INVERSE_WORLD_MATRIX)
+    , ("transpose_world_matrix",                    ACT_TRANSPOSE_WORLD_MATRIX)
+    , ("inverse_transpose_world_matrix",            ACT_INVERSE_TRANSPOSE_WORLD_MATRIX)
+    , ("world_matrix_array_3x4",                    ACT_WORLD_MATRIX_ARRAY_3x4)
+    , ("view_matrix",                               ACT_VIEW_MATRIX)
+    , ("inverse_view_matrix",                       ACT_INVERSE_VIEW_MATRIX)
+    , ("transpose_view_matrix",                     ACT_TRANSPOSE_VIEW_MATRIX)
+    , ("inverse_transpose_view_matrix",             ACT_INVERSE_TRANSPOSE_VIEW_MATRIX)
+    , ("projection_matrix",                         ACT_PROJECTION_MATRIX)
+    , ("inverse_projection_matrix",                 ACT_INVERSE_PROJECTION_MATRIX)
+    , ("transpose_projection_matrix",               ACT_TRANSPOSE_PROJECTION_MATRIX)
+    , ("inverse_transpose_projection_matrix",       ACT_INVERSE_TRANSPOSE_PROJECTION_MATRIX)
+    , ("worldview_matrix",                          ACT_WORLDVIEW_MATRIX)
+    , ("inverse_worldview_matrix",                  ACT_INVERSE_WORLDVIEW_MATRIX)
+    , ("transpose_worldview_matrix",                ACT_TRANSPOSE_WORLDVIEW_MATRIX)
+    , ("inverse_transpose_worldview_matrix",        ACT_INVERSE_TRANSPOSE_WORLDVIEW_MATRIX)
+    , ("viewproj_matrix",                           ACT_VIEWPROJ_MATRIX)
+    , ("inverse_viewproj_matrix",                   ACT_INVERSE_VIEWPROJ_MATRIX)
+    , ("transpose_viewproj_matrix",                 ACT_TRANSPOSE_VIEWPROJ_MATRIX)
+    , ("inverse_transpose_viewproj_matrix",         ACT_INVERSE_TRANSPOSE_VIEWPROJ_MATRIX)
+    , ("worldviewproj_matrix",                      ACT_WORLDVIEWPROJ_MATRIX)
+    , ("inverse_worldviewproj_matrix",              ACT_INVERSE_WORLDVIEWPROJ_MATRIX)
+    , ("transpose_worldviewproj_matrix",            ACT_TRANSPOSE_WORLDVIEWPROJ_MATRIX)
+    , ("inverse_transpose_worldviewproj_matrix",    ACT_INVERSE_TRANSPOSE_WORLDVIEWPROJ_MATRIX)
+    , ("texture_matrix",                            ACT_TEXTURE_MATRIX)
+    , ("render_target_flipping",                    ACT_RENDER_TARGET_FLIPPING)
+    , ("light_diffuse_colour",                      ACT_LIGHT_DIFFUSE_COLOUR)
+    , ("light_specular_colour",                     ACT_LIGHT_SPECULAR_COLOUR)
+    , ("light_attenuation",                         ACT_LIGHT_ATTENUATION)
+    , ("spotlight_params",                          ACT_SPOTLIGHT_PARAMS)
+    , ("light_position",                            ACT_LIGHT_POSITION)
+    , ("light_direction",                           ACT_LIGHT_DIRECTION)
+    , ("light_position_object_space",               ACT_LIGHT_POSITION_OBJECT_SPACE)
+    , ("light_direction_object_space",              ACT_LIGHT_DIRECTION_OBJECT_SPACE)
+    , ("light_distance_object_space",               ACT_LIGHT_DISTANCE_OBJECT_SPACE)
+    , ("light_position_view_space",                 ACT_LIGHT_POSITION_VIEW_SPACE)
+    , ("light_direction_view_space",                ACT_LIGHT_DIRECTION_VIEW_SPACE)
+    , ("light_power",                               )
+    , ("light_diffuse_colour_power_scaled",         )
+    , ("light_specular_colour_power_scaled",        )
+    , ("light_number",                              ACT_LIGHT_NUMBER)
+    , ("light_diffuse_colour_array",                ACT_LIGHT_DIFFUSE_COLOUR_ARRAY)
+    , ("light_specular_colour_array",               ACT_LIGHT_SPECULAR_COLOUR_ARRAY)
+    , ("light_diffuse_colour_power_scaled_array",   ACT_LIGHT_DIFFUSE_COLOUR_POWER_SCALED_ARRAY)
+    , ("light_specular_colour_power_scaled_array",  ACT_LIGHT_SPECULAR_COLOUR_POWER_SCALED_ARRAY)
+    , ("light_attenuation_array",                   ACT_LIGHT_ATTENUATION_ARRAY)
+    , ("spotlight_params_array",                    ACT_SPOTLIGHT_PARAMS_ARRAY)
+    , ("light_position_array",                      ACT_LIGHT_POSITION_ARRAY)
+    , ("light_direction_array",                     ACT_LIGHT_DIRECTION_ARRAY)
+    , ("light_position_object_space_array",         ACT_LIGHT_POSITION_OBJECT_SPACE_ARRAY)
+    , ("light_direction_object_space_array",        ACT_LIGHT_DIRECTION_OBJECT_SPACE_ARRAY)
+    , ("light_distance_object_space_array",         ACT_LIGHT_DISTANCE_OBJECT_SPACE_ARRAY)
+    , ("light_position_view_space_array",           ACT_LIGHT_POSITION_VIEW_SPACE_ARRAY)
+    , ("light_direction_view_space_array",          ACT_LIGHT_DIRECTION_VIEW_SPACE_ARRAY)
+    , ("light_power_array",                         )
+    , ("light_count",                               ACT_LIGHT_COUNT)
+    , ("light_casts_shadows",                       ACT_LIGHT_CASTS_SHADOWS)
+    , ("ambient_light_colour",                      ACT_AMBIENT_LIGHT_COLOUR)
+    , ("surface_ambient_colour",                    ACT_SURFACE_AMBIENT_COLOUR)
+    , ("surface_diffuse_colour",                    ACT_SURFACE_DIFFUSE_COLOUR)
+    , ("surface_specular_colour",                   ACT_SURFACE_SPECULAR_COLOUR)
+    , ("surface_emissive_colour",                   ACT_SURFACE_EMISSIVE_COLOUR)
+    , ("surface_shininess",                         ACT_SURFACE_SHININESS)
+    , ("derived_ambient_light_colour",              ACT_DERIVED_AMBIENT_LIGHT_COLOUR)
+    , ("derived_scene_colour",                      ACT_DERIVED_SCENE_COLOUR)
+    , ("derived_light_diffuse_colour",              ACT_DERIVED_LIGHT_DIFFUSE_COLOUR)
+    , ("derived_light_specular_colour",             ACT_DERIVED_LIGHT_SPECULAR_COLOUR)
+    , ("derived_light_diffuse_colour_array",        ACT_DERIVED_LIGHT_DIFFUSE_COLOUR_ARRAY)
+    , ("derived_light_specular_colour_array",       ACT_DERIVED_LIGHT_SPECULAR_COLOUR_ARRAY)
+    , ("fog_colour",                                ACT_FOG_COLOUR)
+    , ("fog_params",                                ACT_FOG_PARAMS)
+    , ("camera_position",                           ACT_CAMERA_POSITION)
+    , ("camera_position_object_space",              ACT_CAMERA_POSITION_OBJECT_SPACE)
+    , ("lod_camera_position",                       ACT_LOD_CAMERA_POSITION)
+    , ("lod_camera_position_object_space",          ACT_LOD_CAMERA_POSITION_OBJECT_SPACE)
+    , ("time",                                      ACT_TIME)
+    , ("time_0_x",                                  ACT_TIME_0_X)
+    , ("costime_0_x",                               ACT_COSTIME_0_X)
+    , ("sintime_0_x",                               ACT_SINTIME_0_X)
+    , ("tantime_0_x",                               ACT_TANTIME_0_X)
+    , ("time_0_x_packed",                           ACT_TIME_0_X_PACKED)
+    , ("time_0_1",                                  ACT_TIME_0_1)
+    , ("costime_0_1",                               ACT_COSTIME_0_1)
+    , ("sintime_0_1",                               ACT_SINTIME_0_1)
+    , ("tantime_0_1",                               ACT_TANTIME_0_1)
+    , ("time_0_1_packed",                           ACT_TIME_0_1_PACKED)
+    , ("time_0_2pi",                                ACT_TIME_0_2PI)
+    , ("costime_0_2pi",                             ACT_COSTIME_0_2PI)
+    , ("sintime_0_2pi",                             ACT_SINTIME_0_2PI)
+    , ("tantime_0_2pi",                             ACT_TANTIME_0_2PI)
+    , ("time_0_2pi_packed",                         ACT_TIME_0_2PI_PACKED)
+    , ("frame_time",                                ACT_FRAME_TIME)
+    , ("fps",                                       ACT_FPS)
+    , ("viewport_width",                            ACT_VIEWPORT_WIDTH)
+    , ("viewport_height",                           ACT_VIEWPORT_HEIGHT)
+    , ("inverse_viewport_width",                    ACT_INVERSE_VIEWPORT_WIDTH)
+    , ("inverse_viewport_height",                   ACT_INVERSE_VIEWPORT_HEIGHT)
+    , ("viewport_size",                             ACT_VIEWPORT_SIZE)
+    , ("texel_offsets",                             ACT_TEXEL_OFFSETS)
+    , ("view_direction",                            ACT_VIEW_DIRECTION)
+    , ("view_side_vector",                          ACT_VIEW_SIDE_VECTOR)
+    , ("view_up_vector",                            ACT_VIEW_UP_VECTOR)
+    , ("fov",                                       ACT_FOV)
+    , ("near_clip_distance",                        ACT_NEAR_CLIP_DISTANCE)
+    , ("far_clip_distance",                         ACT_FAR_CLIP_DISTANCE)
+    , ("texture_viewproj_matrix",                   ACT_TEXTURE_VIEWPROJ_MATRIX)
+    , ("texture_viewproj_matrix_array",             ACT_TEXTURE_VIEWPROJ_MATRIX_ARRAY)
+    , ("texture_worldviewproj_matrix",              ACT_TEXTURE_WORLDVIEWPROJ_MATRIX)
+    , ("texture_worldviewproj_matrix_array",        ACT_TEXTURE_WORLDVIEWPROJ_MATRIX_ARRAY)
+    , ("spotlight_viewproj_matrix",                 ACT_SPOTLIGHT_VIEWPROJ_MATRIX)
+    , ("spotlight_worldviewproj_matrix",            ACT_SPOTLIGHT_WORLDVIEWPROJ_MATRIX)
+    , ("scene_depth_range",                         ACT_SCENE_DEPTH_RANGE)
+    , ("shadow_scene_depth_range",                  ACT_SHADOW_SCENE_DEPTH_RANGE)
+    , ("shadow_colour",                             ACT_SHADOW_COLOUR)
+    , ("shadow_extrusion_distance",                 ACT_SHADOW_EXTRUSION_DISTANCE)
+    , ("texture_size",                              ACT_TEXTURE_SIZE)
+    , ("inverse_texture_size",                      ACT_INVERSE_TEXTURE_SIZE)
+    , ("packed_texture_size",                       ACT_PACKED_TEXTURE_SIZE)
+    , ("pass_number",                               ACT_PASS_NUMBER)
+    , ("pass_iteration_number",                     ACT_PASS_ITERATION_NUMBER)
+    , ("animation_parametric",                      ACT_ANIMATION_PARAMETRIC)
+    , ("custom ",                                   ACT_CUSTOM)
+    ]
+ACT_WORLD_MATRIX_ARRAY
+
+ACT_LIGHT_POWER_SCALE
+ACT_LIGHT_DIFFUSE_COLOUR_POWER_SCALED
+ACT_LIGHT_SPECULAR_COLOUR_POWER_SCALED
+
+ACT_LIGHT_POWER_SCALE_ARRAY
+
+ACT_LIGHT_CUSTOM
+-}    
diff --git a/Graphics/LambdaCube/Loader/ResourceScript.hs b/Graphics/LambdaCube/Loader/ResourceScript.hs
new file mode 100644
--- /dev/null
+++ b/Graphics/LambdaCube/Loader/ResourceScript.hs
@@ -0,0 +1,42 @@
+module Graphics.LambdaCube.Loader.ResourceScript (loadResourcesCfg,PathType(..),ResourcePath,ResourceGroup) where
+
+-- import the the library functions from uulib
+import UU.Parsing
+import UU.Scanner
+
+-- import our custom made Alex-scanner
+import Graphics.LambdaCube.Loader.Generated.ResourceScriptScanner
+import Graphics.LambdaCube.Loader.ParserUtil
+import System.Log.Logger
+
+data PathType = PathDir | PathZip
+type ResourcePath = (PathType,String)
+type ResourceGroup = (String,[ResourcePath])
+
+loadResourcesCfg file = do
+    txt <- readFile file
+    parseResourcesCfg file txt
+
+parseResourcesCfg file txt
+    = let res = parseTokens pResourceScript (tokenize file txt)
+    in case res of
+        Left errs -> do
+            mapM_ (errorM "ResourceScript") errs
+            return Nothing
+        Right tree -> return (Just tree)
+		
+type TokenParser a = Parser Token a
+
+parseTokens :: TokenParser a -> [Token] -> Either [String] a
+parseTokens p tks = if null msgs then final `seq` Right v else Left (map show msgs)
+  where
+    steps = parse p tks
+    msgs  = getMsgs steps
+    (Pair v final) = evalSteps steps
+
+pResourceScript = pList pResourceGroup
+pResourceGroup = (,) <$= "[" <*> pVarid <*= "]" <*> pList pResourceGroupContent
+pResourceGroupContent = pFileSystem <|> pZip
+
+pFileSystem = (,) PathDir <$= "FileSystem" <*= "=" <*> pVarid
+pZip = (,) PathZip <$= "Zip" <*= "=" <*> pVarid
diff --git a/Graphics/LambdaCube/Loader/ResourceScriptScanner.x b/Graphics/LambdaCube/Loader/ResourceScriptScanner.x
new file mode 100644
--- /dev/null
+++ b/Graphics/LambdaCube/Loader/ResourceScriptScanner.x
@@ -0,0 +1,52 @@
+{
+-- alex scanner for use with uulib
+--   compile with alex -o Scanner.hs -g Scanner.x
+module Graphics.LambdaCube.Loader.Generated.ResourceScriptScanner(tokenize) where
+
+import UU.Scanner
+}
+
+--$litChar   = [^[\n\r]]
+--$litChar   = [^[\" \\]]
+--$litChar   = [a-zA-Z0-9_\.\-\/ ]
+$identChar = [a-zA-Z0-9_\.\-\/]
+
+
+tokens :-
+  $white+                                      ;                               -- whitespace
+  "#".*                                        ;                               -- comment
+
+  ( FileSystem | Zip )                         { reserved }                    -- reserved keywords
+  [\[\]\=]                                     { reserved }                    -- reserved symbols
+
+  $identChar+                                  { valueToken TkVarid }          -- identifier
+--  $litChar+                                    { valueToken TkString }         -- string
+
+{
+-- boilerplate code needed for Alex
+type AlexInput = (Pos, String)
+
+alexInputPrevChar :: AlexInput -> Char
+alexInputPrevChar = error "alexInputPrevChar: there is no need to go back in the input."
+
+alexGetChar :: AlexInput -> Maybe (Char, AlexInput)
+alexGetChar (_, []) = Nothing
+alexGetChar (p, (c:cs))
+  = let p' = adv p c
+    in Just (c, (p', cs))
+
+-- use the Alex scanner to generate a list of tokens for the uulib token parsers
+tokenize :: String -> String -> [Token]
+tokenize filename str
+  = go (initpos, str)
+  where
+    initpos = Pos 1 1 filename
+    
+    go inp@(pos, cs)
+      = case alexScan inp 0 of
+          AlexEOF         -> []
+          AlexError inp'  -> valueToken TkError [head cs] pos : go inp'
+          AlexSkip inp' _ -> go inp'
+          AlexToken inp' len act -> act (take len cs) pos : go inp'
+}
+
diff --git a/Graphics/LambdaCube/Loader/StbImage.hs b/Graphics/LambdaCube/Loader/StbImage.hs
new file mode 100644
--- /dev/null
+++ b/Graphics/LambdaCube/Loader/StbImage.hs
@@ -0,0 +1,42 @@
+module Graphics.LambdaCube.Loader.StbImage (loadImage) where
+
+import System.Exit
+import System.Log.Logger
+import Foreign.Marshal.Array
+
+import qualified Codec.Image.STB as STB
+import qualified Data.ByteString as SB
+import Data.ByteString.Lazy
+
+import Graphics.LambdaCube.PixelFormat
+import Graphics.LambdaCube.Image
+
+loadImage :: ImageLoader
+loadImage name buf = STB.decodeImage (SB.pack $ unpack buf) >>= \result -> case result of
+    { Left err  -> do
+        debugM "StbImage loader" err
+        return Nothing
+    ; Right img -> STB.withImage img $ \p (x,y) c -> do
+        let pf = case c of
+            { 1 -> PF_L8
+            ; 2 -> PF_BYTE_LA
+            ; 3 -> PF_R8G8B8
+            ; 4 -> PF_R8G8B8A8
+            }
+        debugM "StbImage loader" $ "\"" ++ name ++ "\" loaded"
+        debugM "StbImage loader" $ "resolution = " ++ show x ++ " x " ++ show y ++ ", " ++ show c ++ " bytes per pixel"
+        imgdata <- mallocArray (x * y * c)
+        copyArray imgdata p (x * y * c)
+        return $ Just Image
+            { imName       = name
+            , imHeight     = y
+            , imWidth      = x
+            , imDepth      = 1
+            , imSize       = x * y * c
+            , imNumMipmaps = 0 -- TODO
+        --    uint flags;
+            , imFormat     = pf
+            , imData       = imgdata
+            }
+    }
+        
diff --git a/Graphics/LambdaCube/Material.hs b/Graphics/LambdaCube/Material.hs
new file mode 100644
--- /dev/null
+++ b/Graphics/LambdaCube/Material.hs
@@ -0,0 +1,50 @@
+module Graphics.LambdaCube.Material where
+
+import Graphics.LambdaCube.Types
+import Graphics.LambdaCube.Technique
+import Graphics.LambdaCube.Texture
+import Graphics.LambdaCube.GpuProgram
+
+{-
+data Shader
+    = Shader
+    { shName      :: String
+    , shSource    :: String
+    , shAttach    :: [String]
+--    , shParameter :: [ShaderParameterValue]
+--    , shObject    :: GL.Shader s => Maybe s
+    }
+        
+data Program
+    = Program
+    { prVertShaderName :: Maybe String
+    , prFragShaderName :: Maybe String
+    --prParameters :: [ShaderParameter],
+--    , prObject         :: Maybe GL.Program
+    }
+-}
+---------------------------------------
+-- NEW code
+data (Texture t, LinkedGpuProgram lp) => Material t lp
+    = Material
+    { mtName                     :: String
+    , mtTechniques               :: [Technique t lp] -- ^ All techniques, supported and unsupported
+    , mtSupportedTechniques      :: Maybe [Technique t lp] -- ^ Supported techniques of any sort
+{-
+    typedef map<unsigned short, Technique*>::type LodTechniques;
+    typedef map<unsigned short, LodTechniques*>::type BestTechniquesBySchemeList;
+    /** Map of scheme -> list of LOD techniques. 
+    	Current scheme is set on MaterialManager,
+    	and can be set per Viewport for auto activation.
+    */
+    BestTechniquesBySchemeList mBestTechniquesBySchemeList;
+-}
+    , mtUserLodValues            :: [FloatType] -- ^ distance list used to specify LOD
+    , mtLodValues                :: [FloatType] -- ^ distance list used to specify LOD
+--    const LodStrategy *mLodStrategy;
+    , mtReceiveShadows           :: Bool
+    , mtTransparencyCastsShadows :: Bool
+--    /// Does this material require compilation?
+--    bool mCompilationRequired;
+    , mtUnsupportedReasons       :: String -- ^ Text description of why any techniques are not supported
+    }
diff --git a/Graphics/LambdaCube/Math.hs b/Graphics/LambdaCube/Math.hs
new file mode 100644
--- /dev/null
+++ b/Graphics/LambdaCube/Math.hs
@@ -0,0 +1,160 @@
+module Graphics.LambdaCube.Math where
+import Graphics.LambdaCube.Types
+
+vec4xscalar :: Vec4 -> FloatType -> Vec4
+vec4xscalar (Vec4 x1 y1 z1 _) s = Vec4 (x1 * s) (y1 * s) (z1 * s) 0
+
+vec4crossvec4 :: Vec4 -> Vec4 -> Vec4
+vec4crossvec4 (Vec4 x1 y1 z1 _) (Vec4 x2 y2 z2 _) = Vec4 (y1*z2-y2*z1) (z1*x2-z2*x1) (x1*y2-x2*y1) 0
+
+vec4subvec4 :: Vec4 -> Vec4 -> Vec4
+vec4subvec4
+    (Vec4
+         a1 a2 a3 a4)
+    (Vec4
+         b1 b2 b3 b4)
+    = (Vec4 (a1 - b1) (a2 - b2) (a3 - b3) (a4 - b4))
+
+vec4addvec4 :: Vec4 -> Vec4 -> Vec4
+vec4addvec4
+    (Vec4
+         a1 a2 a3 a4)
+    (Vec4
+         b1 b2 b3 b4)
+    = (Vec4 (a1 + b1) (a2 + b2) (a3 + b3) (a4 + b4))
+
+norm :: Vec4 -> Vec4
+norm
+    (Vec4
+         a1 a2 a3 a4)
+    = (Vec4 (a1 / l) (a2 / l) (a3 / l) (a4 / l))
+  where
+    l = sqrt (a1*a1 + a2*a2 + a3*a3 + a4*a4)
+
+vec4xmat44 :: Vec4 -> Matrix4 -> Vec4
+vec4xmat44
+    (Vec4
+         a1 a2 a3 a4)
+    (Matrix4
+        b11 b12 b13 b14
+        b21 b22 b23 b24
+        b31 b32 b33 b34
+        b41 b42 b43 b44)
+    = (Vec4
+        (a1*b11+a2*b21+a3*b31+a4*b41) (a1*b12+a2*b22+a3*b32+a4*b42) (a1*b13+a2*b23+a3*b33+a4*b43) (a1*b14+a2*b24+a3*b34+a4*b44))
+
+mat44xmat44 :: Matrix4 -> Matrix4 -> Matrix4
+mat44xmat44
+    (Matrix4
+        a11 a12 a13 a14
+        a21 a22 a23 a24
+        a31 a32 a33 a34
+        a41 a42 a43 a44)
+    (Matrix4
+        b11 b12 b13 b14
+        b21 b22 b23 b24
+        b31 b32 b33 b34
+        b41 b42 b43 b44)
+    = (Matrix4
+        (a11*b11+a12*b21+a13*b31+a14*b41) (a11*b12+a12*b22+a13*b32+a14*b42) (a11*b13+a12*b23+a13*b33+a14*b43) (a11*b14+a12*b24+a13*b34+a14*b44)
+        (a21*b11+a22*b21+a23*b31+a24*b41) (a21*b12+a22*b22+a23*b32+a24*b42) (a21*b13+a22*b23+a23*b33+a24*b43) (a21*b14+a22*b24+a23*b34+a24*b44)
+        (a31*b11+a32*b21+a33*b31+a34*b41) (a31*b12+a32*b22+a33*b32+a34*b42) (a31*b13+a32*b23+a33*b33+a34*b43) (a31*b14+a32*b24+a33*b34+a34*b44)
+        (a41*b11+a42*b21+a43*b31+a44*b41) (a41*b12+a42*b22+a43*b32+a44*b42) (a41*b13+a42*b23+a43*b33+a44*b43) (a41*b14+a42*b24+a43*b34+a44*b44))
+
+
+transMatrix4 :: Matrix4 -> Matrix4
+transMatrix4
+    (Matrix4
+        a11 a12 a13 a14
+        a21 a22 a23 a24
+        a31 a32 a33 a34
+        a41 a42 a43 a44)
+    = (Matrix4
+        a11 a21 a31 a41
+        a12 a22 a32 a42
+        a13 a23 a33 a43
+        a14 a24 a34 a44)
+        
+infixl 7 <>
+a <> b = a `mat44xmat44` b
+
+toListsMatrix4
+    (Matrix4
+        a11 a12 a13 a14
+        a21 a22 a23 a24
+        a31 a32 a33 a34
+        a41 a42 a43 a44) = [a11, a12, a13, a14, a21, a22, a23, a24, a31, a32, a33, a34, a41, a42, a43, a44]
+        
+scal a = Matrix4
+    a 0 0 0
+    0 a 0 0
+    0 0 a 0
+    0 0 0 1 
+
+transl x y z = Matrix4
+    1 0 0 0
+    0 1 0 0
+    0 0 1 0
+    x y z 1
+
+rotX a = Matrix4
+    1  0  0  0
+    0  c  s  0
+    0(-s) c  0
+    0  0  0  1
+  where
+    c = cos a
+    s = sin a
+
+rotY a = Matrix4
+     c 0 s 0
+     0 1 0 0
+    (-s) 0 c 0
+     0 0 0 1 
+  where
+    c = cos a
+    s = sin a
+
+rotZ a = Matrix4
+     c  s  0  0
+   (-s) c  0  0
+     0  0  1  0
+     0  0  0  1
+  where
+    c = cos a
+    s = sin a
+    
+--lookat eye@(Vec4 ex ey ez _) dir up =  (Matrix4 
+lookat eye@(Vec4 ex ey ez _) dir up = (transl (-ex) (-ey) (-ez)) <> (Matrix4 
+--lookat eye@(Vec4 ex ey ez _) dir up = (transl (ex) (ey) (ez)) <> Matrix4
+    ux vx wx 0
+    uy vy wy 0
+    uz vz wz 0
+    0  0  0  1)-- <> (transl (-ex) (-ey) (-ez))
+  where
+    w@(Vec4 wx wy wz _) = norm $ dir
+    u@(Vec4 ux uy uz _) = norm $ up `vec4crossvec4` w
+    v@(Vec4 vx vy vz _) = norm $ w `vec4crossvec4` u
+ 
+
+mat44pos :: Matrix4 -> (FloatType,FloatType,FloatType,FloatType)
+mat44pos
+    (Matrix4
+        _ _ _ _
+        _ _ _ _
+        _ _ _ _
+        x y z w
+    )
+    = (x,y,z,w)
+
+perpectiveMatrix fov aspect near far = Matrix4
+    m00 0 0 0
+    0 m11 0 0
+    0 0 m22 (-1)
+    0 0 m32 0
+  where
+    slopey  = tan $ fov * pi / 360
+    m00     = 1 / slopey / aspect
+    m11     = 1 / slopey
+    m22     = -(near + far) / (far - near)
+    m32     = -2 * near * far / (far - near)
diff --git a/Graphics/LambdaCube/Mesh.hs b/Graphics/LambdaCube/Mesh.hs
new file mode 100644
--- /dev/null
+++ b/Graphics/LambdaCube/Mesh.hs
@@ -0,0 +1,212 @@
+module Graphics.LambdaCube.Mesh where
+
+import Data.Map (Map)
+import qualified Data.Map as Map
+
+import Graphics.LambdaCube.Types
+import Graphics.LambdaCube.RenderOperation
+import Graphics.LambdaCube.HardwareBuffer
+import Graphics.LambdaCube.HardwareVertexBuffer
+import Graphics.LambdaCube.HardwareIndexBuffer
+import Graphics.LambdaCube.VertexIndexData
+
+data (HardwareVertexBuffer vb, HardwareIndexBuffer ib) => SubMesh vb ib
+    = SubMesh
+    { smOperationType       :: OperationType            -- ^ The render operation type used to render this submesh
+
+    {-| Dedicated vertex data (only valid if useSharedVertices = false).
+        @remarks
+            This data is completely owned by this submesh.
+        @par
+            The use of shared or non-shared buffers is determined when
+            model data is converted to the OGRE .mesh format.
+    -}
+    , smVertexData          :: Maybe (VertexData vb)    -- ^ Indicates if this submesh shares vertex data with other meshes or whether it has it's own vertices.    
+    , smIndexData           :: Maybe (IndexData ib)     -- ^ Face index data
+
+    {-| Dedicated index map for translate blend index to bone index (only valid if useSharedVertices = false).
+        @remarks
+            This data is completely owned by this submesh.
+        @par
+            We collect actually used bones of all bone assignments, and build the
+            blend index in 'packed' form, then the range of the blend index in vertex
+            data VES_BLEND_INDICES element is continuous, with no gaps. Thus, by
+            minimising the world matrix array constants passing to GPU, we can support
+            more bones for a mesh when hardware skinning is used. The hardware skinning
+            support limit is applied to each set of vertex data in the mesh, in other words, the
+            hardware skinning support limit is applied only to the actually used bones of each
+            SubMeshes, not all bones across the entire Mesh.
+        @par
+            Because the blend index is different to the bone index, therefore, we use
+            the index map to translate the blend index to bone index.
+        @par
+            The use of shared or non-shared index map is determined when
+            model data is converted to the OGRE .mesh format.
+    -}
+    --typedef vector<unsigned short>::type IndexMap;
+    --IndexMap blendIndexToBoneIndexMap;
+
+    --ProgressiveMesh::LODFaceList mLodFaceList;
+
+    {-| A list of extreme points on the submesh (optional).
+        @remarks
+            These points are some arbitrary points on the mesh that are used
+            by engine to better sort submeshes by depth. This doesn't matter
+            much for non-transparent submeshes, as Z-buffer takes care of invisible
+            surface culling anyway, but is pretty useful for semi-transparent
+            submeshes because the order in which transparent submeshes must be
+            rendered cannot be always correctly deduced from entity position.
+        @par
+            These points are intelligently chosen from the points that make up
+            the submesh, the criteria for choosing them should be that these points
+            somewhat characterize the submesh outline, e.g. they should not be
+            close to each other, and they should be on the outer hull of the submesh.
+            They can be stored in the .mesh file, or generated at runtime
+            (see generateExtremes ()).
+        @par
+            If this array is empty, submesh sorting is done like in older versions -
+            by comparing the positions of the owning entity.
+    -}
+    , smExtremityPoints     :: [FloatType3]
+    , smMaterialName        :: String           -- ^ Name of the material this SubMesh uses.
+
+        -- | Is there a material yet?
+--        bool mMatInitialised;
+
+        -- | paired list of texture aliases and texture names
+--        AliasTextureNamePairList mTextureAliases;
+
+--        VertexBoneAssignmentList mBoneAssignments;
+
+        -- | Flag indicating that bone assignments need to be recompiled
+--        bool mBoneAssignmentsOutOfDate;
+
+		-- | Type of vertex animation for dedicated vertex data (populated by Mesh)
+--		mutable VertexAnimationType mVertexAnimationType;
+
+		-- | Is Build Edges Enabled
+--		bool mBuildEdgesEnabled;
+    }
+
+data (HardwareVertexBuffer vb, HardwareIndexBuffer ib) => Mesh vb ib
+    = Mesh
+    { msSubMeshList                 :: [SubMesh vb ib]
+    {-| A hashmap used to store optional SubMesh names.
+    	Translates a name into SubMesh index
+    -}
+--typedef HashMap<String, ushort> SubMeshNameMap ;
+
+
+--ected:
+
+--DataStreamPtr mFreshFromDisk;
+
+--SubMeshNameMap mSubMeshNameMap ;
+    , msSubMeshNameMap              :: Map String Int
+
+    -- | Local bounding box volume
+    -- TODO: AxisAlignedBox mAABB;
+    ---- | Local bounding sphere radius (centered on object)
+    , msBoundRadius                 :: FloatType
+
+    -- | Optional linked skeleton
+    , msSkeletonName                :: String
+-- TODO:    , msSkeleton            :: Skeleton
+
+
+-- TODO: VertexBoneAssignmentList mBoneAssignments;
+
+-- | Flag indicating that bone assignments need to be recompiled
+-- TODO: bool mBoneAssignmentsOutOfDate;
+
+-- TODO: const LodStrategy *mLodStrategy;
+-- TODO: bool mIsLodManual;
+-- TODO: ushort mNumLods;
+-- TODO: MeshLodUsageList mMeshLodUsageList;
+
+    , msVertexBufferUsage           :: Usage
+    , msIndexBufferUsage            :: Usage
+    , msVertexBufferShadowBuffer    :: Bool
+    , msIndexBufferShadowBuffer     :: Bool
+
+
+-- TODO: bool mPreparedForShadowVolumes;
+-- TODO: bool mEdgeListsBuilt;
+-- TODO: bool mAutoBuildEdgeLists;
+
+-- | Storage of morph animations, lookup by name
+-- TODO: typedef map<String, Animation*>::type AnimationList;
+-- TODO: AnimationList mAnimationsList;
+-- | The vertex animation type associated with the shared vertex data
+-- TODO: mutable VertexAnimationType mSharedVertexDataAnimationType;
+-- | Do we need to scan animations for animation types?
+-- TODO: mutable bool mAnimationTypesDirty;
+
+-- | List of available poses for shared and dedicated geometryPoseList
+-- TODO: PoseList mPoseList;
+
+{-| Shared vertex data.
+    @remarks
+        This vertex data can be shared among multiple submeshes. SubMeshes may not have
+        their own VertexData, they may share this one.
+    @par
+        The use of shared or non-shared buffers is determined when
+        model data is converted to the OGRE .mesh format.
+-}
+    , msSharedVertexData            :: Maybe (VertexData vb)
+
+{-| Shared index map for translating blend index to bone index.
+    @remarks
+        This index map can be shared among multiple submeshes. SubMeshes might not have
+        their own IndexMap, they might share this one.
+    @par
+        We collect actually used bones of all bone assignments, and build the
+        blend index in 'packed' form, then the range of the blend index in vertex
+        data VES_BLEND_INDICES element is continuous, with no gaps. Thus, by
+        minimising the world matrix array constants passing to GPU, we can support
+        more bones for a mesh when hardware skinning is used. The hardware skinning
+        support limit is applied to each set of vertex data in the mesh, in other words, the
+        hardware skinning support limit is applied only to the actually used bones of each
+        SubMeshes, not all bones across the entire Mesh.
+    @par
+        Because the blend index is different to the bone index, therefore, we use
+        the index map to translate the blend index to bone index.
+    @par
+        The use of shared or non-shared index map is determined when
+        model data is converted to the OGRE .mesh format.
+-}
+-- TODO: IndexMap sharedBlendIndexToBoneIndexMap;
+    }
+
+{-
+-- TODO: create generic functions which operate on buffer elements
+mapFloatType3M_ :: (FloatType -> FloatType -> FloatType -> IO a) -> (Int,Ptr FloatType,Int) -> IO ()
+mapFloatType3M_ f (cnt,ptr,stride) = do
+    let s' = if stride == 0 then 4 else stride
+    mapM_ (g ptr s') [0..(cnt-1)]
+  where
+    g ptr stride i = do
+        let p = plusPtr ptr $ stride * i
+        x <- peekElemOff p 0
+        y <- peekElemOff p 1
+        z <- peekElemOff p 2
+        f x y z
+
+foldFloatType3M :: ((FloatType,FloatType,FloatType) -> b -> b) -> b -> (Int,Ptr FloatType,Int) -> IO b
+foldFloatType3M f a (cnt,ptr,stride) = do
+    let s' = if stride == 0 then 4 else stride
+    foldM (g ptr s') a [0..(cnt-1)]
+  where
+    g ptr stride e i = do
+        let p = plusPtr ptr $ stride * i
+        x <- peekElemOff p 0
+        y <- peekElemOff p 1
+        z <- peekElemOff p 2
+        return $ f (x,y,z) e
+-}
+
+--calculateBoundingRadius :: Mesh -> IO FloatType
+--calculateBoundingRadius m = do
+    -- collect vertex data
+    -- find 
+--    return
diff --git a/Graphics/LambdaCube/Pass.hs b/Graphics/LambdaCube/Pass.hs
new file mode 100644
--- /dev/null
+++ b/Graphics/LambdaCube/Pass.hs
@@ -0,0 +1,120 @@
+module Graphics.LambdaCube.Pass where
+
+import Graphics.LambdaCube.Types
+import Graphics.LambdaCube.Common
+import Graphics.LambdaCube.BlendMode
+import Graphics.LambdaCube.Light
+import Graphics.LambdaCube.Texture
+import Graphics.LambdaCube.TextureUnitState
+import Graphics.LambdaCube.GpuProgram
+import Graphics.LambdaCube.GpuProgramUsage
+
+-- | Categorisation of passes for the purpose of additive lighting
+data IlluminationStage
+    = IS_AMBIENT    -- ^ Part of the rendering which occurs without any kind of direct lighting
+    | IS_PER_LIGHT  -- ^ Part of the rendering which occurs per light
+    | IS_DECAL      -- ^ Post-lighting rendering
+    | IS_UNKNOWN    -- ^ Not determined
+    deriving Eq
+
+data (Texture t, LinkedGpuProgram lp) => Pass t lp
+    = Pass
+    { psName                     :: String                      -- ^ optional name for the pass
+    
+    -- Colour properties, only applicable in fixed-function passes
+    , psAmbient                  :: ColourValue
+    , psDiffuse                  :: ColourValue
+    , psSpecular                 :: ColourValue
+    , psEmissive                 :: ColourValue
+    , psShininess                :: FloatType
+    , psTracking                 :: TrackVertexColourType
+    
+    -- Blending factors
+    , psSourceBlendFactor        :: SceneBlendFactor
+    , psDestBlendFactor          :: SceneBlendFactor
+    , psSourceBlendFactorAlpha   :: SceneBlendFactor
+    , psDestBlendFactorAlpha     :: SceneBlendFactor
+
+    , psSeparateBlend            :: Bool                        -- ^ Used to determine if separate alpha blending should be used for color and alpha channels
+
+    -- Blending operations
+    , psBlendOperation           :: SceneBlendOperation
+    , psAlphaBlendOperation      :: SceneBlendOperation
+    , psSeparateBlendOperation   :: Bool                        -- ^ Determines if we should use separate blending operations for color and alpha channels
+
+    -- Depth buffer settings
+    , psDepthCheck               :: Bool
+    , psDepthWrite               :: Bool
+    , psDepthFunc                :: CompareFunction
+    , psDepthBiasConstant        :: FloatType
+    , psDepthBiasSlopeScale      :: FloatType
+    , psDepthBiasPerIteration    :: FloatType
+
+    -- Colour buffer settings
+    , psColourWrite              :: Bool
+    
+    -- Alpha reject settings
+    , psAlphaRejectFunc          :: CompareFunction
+    , psAlphaRejectVal           :: Int
+    , psAlphaToCoverageEnabled   :: Bool
+
+	, psTransparentSorting       :: Bool                        -- ^ Transparent depth sorting
+    , psTransparentSortingForced :: Bool                        -- ^ Transparent depth sorting forced
+    
+    -- Culling mode
+    , psCullMode                 :: CullingMode
+    , psManualCullMode           :: ManualCullingMode
+    
+    , psLightingEnabled          :: Bool                        -- ^ Lighting enabled?
+    , psMaxSimultaneousLights    :: Int                         -- ^ Max simultaneous lights
+    , psStartLight               :: Int                         -- ^ Starting light index
+    , psLightsPerIteration       :: Maybe Int                   -- ^ Run this pass once per light? Iterate per how many lights?
+    , psOnlyLightType            :: Maybe LightTypes            -- ^ Should it only be run for a certain light type?
+
+    , psShadeOptions             :: ShadeOptions                -- ^ Shading options
+    , psPolygonMode	             :: PolygonMode                 -- ^ Polygon mode
+
+    -- Normalisation
+    , psNormaliseNormals         :: Bool
+    , psPolygonModeOverrideable  :: Bool
+    
+    -- Fog
+    , psFogOverride              :: Bool
+    , psFogMode                  :: FogMode
+    , psFogColour                :: ColourValue
+    , psFogStart                 :: FloatType
+    , psFogEnd                   :: FloatType
+    , psFogDensity               :: FloatType
+    
+    , psTextureUnitStates        :: [TextureUnitState t]
+
+    , psVertexProgramUsage       :: Maybe GpuProgramUsage   -- ^ Vertex program details
+--    , psShadowCasterVertexProgramUsage  :: GpuProgramUsage    -- ^ Vertex program details
+--    , psShadowReceiverVertexProgramUsage    :: GpuProgramUsage  -- ^ Vertex program details
+    , psFragmentProgramUsage     :: Maybe GpuProgramUsage   -- ^ Fragment program details
+--    , psShadowReceiverFragmentProgramUsage  :: GpuProgramUsage  -- ^ Fragment program details
+    , psGeometryProgramUsage     :: Maybe GpuProgramUsage   -- ^ Geometry program details
+--    , psQueuedForDeletion        :: Bool    -- ^ Is this pass queued for deletion?
+    , psLinkedGpuProgram         :: Maybe lp
+
+    , psPassIterationCount       :: Int                         -- ^ number of pass iterations to perform
+
+    , psPointSize                :: FloatType                   -- ^ point size, applies when not using per-vertex point size
+    , psPointMinSize             :: FloatType
+    , psPointMaxSize             :: FloatType
+    , psPointSpritesEnabled      :: Bool
+    , psPointAttenuationEnabled  :: Bool
+    , psPointAttenuationCoeffs   :: FloatType3                  -- ^ constant, linear, quadratic coeffs
+
+    {-
+		// TU Content type lookups
+		typedef vector<unsigned short>::type ContentTypeLookup;
+		mutable ContentTypeLookup mShadowContentTypeLookup;
+		mutable bool mContentTypeLookupBuilt;
+    -}  
+    , psLightScissoring          :: Bool                        -- ^ Scissoring for the light?
+    , psLightClipPlanes          :: Bool                        -- ^ User clip planes for light?
+    , psIlluminationStage        :: IlluminationStage           -- ^ Illumination stage?
+    }
+    deriving Eq
+
diff --git a/Graphics/LambdaCube/PixelFormat.hs b/Graphics/LambdaCube/PixelFormat.hs
new file mode 100644
--- /dev/null
+++ b/Graphics/LambdaCube/PixelFormat.hs
@@ -0,0 +1,494 @@
+module Graphics.LambdaCube.PixelFormat where
+
+import Data.Word
+import Foreign.Ptr
+
+-- | The pixel format used for images, textures, and render surfaces
+data PixelFormat
+    = PF_UNKNOWN        -- ^ Unknown pixel format.
+    | PF_L8             -- ^ 8-bit pixel format, all bits luminace.
+--    | PF_BYTE_L = PF_L8
+    | PF_L16            -- ^ 16-bit pixel format, all bits luminace.
+--    | PF_SHORT_L = PF_L16
+    | PF_A8             -- ^ 8-bit pixel format, all bits alpha.
+--    | PF_BYTE_A = PF_A8
+    | PF_A4L4           -- ^ 8-bit pixel format, 4 bits alpha, 4 bits luminance.
+    | PF_BYTE_LA        -- ^ 2 byte pixel format, 1 byte luminance, 1 byte alpha
+    | PF_R5G6B5         -- ^ 16-bit pixel format, 5 bits red, 6 bits green, 5 bits blue.
+    | PF_B5G6R5         -- ^ 16-bit pixel format, 5 bits red, 6 bits green, 5 bits blue.
+    | PF_R3G3B2         -- ^ 8-bit pixel format, 2 bits blue, 3 bits green, 3 bits red.
+    | PF_A4R4G4B4       -- ^ 16-bit pixel format, 4 bits for alpha, red, green and blue.
+    | PF_A1R5G5B5       -- ^ 16-bit pixel format, 5 bits for blue, green, red and 1 for alpha.
+    | PF_R8G8B8         -- ^ 24-bit pixel format, 8 bits for red, green and blue.
+    | PF_B8G8R8         -- ^ 24-bit pixel format, 8 bits for blue, green and red.
+    | PF_A8R8G8B8       -- ^ 32-bit pixel format, 8 bits for alpha, red, green and blue.
+    | PF_A8B8G8R8       -- ^ 32-bit pixel format, 8 bits for blue, green, red and alpha.
+    | PF_B8G8R8A8       -- ^ 32-bit pixel format, 8 bits for blue, green, red and alpha.
+    | PF_R8G8B8A8       -- ^ 32-bit pixel format, 8 bits for red, green, blue and alpha.
+    | PF_X8R8G8B8       -- ^ 32-bit pixel format, 8 bits for red, 8 bits for green, 8 bits for blue
+                        --   like PF_A8R8G8B8, but alpha will get discarded
+    | PF_X8B8G8R8       -- ^ 32-bit pixel format, 8 bits for blue, 8 bits for green, 8 bits for red
+                        --   like PF_A8B8G8R8, but alpha will get discarded
+{-
+#if OGRE_ENDIAN == OGRE_ENDIAN_BIG
+-- ^ 3 byte pixel format, 1 byte for red, 1 byte for green, 1 byte for blue
+PF_BYTE_RGB = PF_R8G8B8,
+-- ^ 3 byte pixel format, 1 byte for blue, 1 byte for green, 1 byte for red
+PF_BYTE_BGR = PF_B8G8R8,
+-- ^ 4 byte pixel format, 1 byte for blue, 1 byte for green, 1 byte for red and one byte for alpha
+PF_BYTE_BGRA = PF_B8G8R8A8,
+-- ^ 4 byte pixel format, 1 byte for red, 1 byte for green, 1 byte for blue, and one byte for alpha
+PF_BYTE_RGBA = PF_R8G8B8A8,
+#else
+-- ^ 3 byte pixel format, 1 byte for red, 1 byte for green, 1 byte for blue
+PF_BYTE_RGB = PF_B8G8R8,
+-- ^ 3 byte pixel format, 1 byte for blue, 1 byte for green, 1 byte for red
+PF_BYTE_BGR = PF_R8G8B8,
+-- ^ 4 byte pixel format, 1 byte for blue, 1 byte for green, 1 byte for red and one byte for alpha
+PF_BYTE_BGRA = PF_A8R8G8B8,
+-- ^ 4 byte pixel format, 1 byte for red, 1 byte for green, 1 byte for blue, and one byte for alpha
+PF_BYTE_RGBA = PF_A8B8G8R8,
+#endif        
+-}
+
+    | PF_A2R10G10B10    -- ^ 32-bit pixel format, 2 bits for alpha, 10 bits for red, green and blue.
+    | PF_A2B10G10R10    -- ^ 32-bit pixel format, 10 bits for blue, green and red, 2 bits for alpha.
+    | PF_DXT1           -- ^ DDS (DirectDraw Surface) DXT1 format
+    | PF_DXT2           -- ^ DDS (DirectDraw Surface) DXT2 format
+    | PF_DXT3           -- ^ DDS (DirectDraw Surface) DXT3 format
+    | PF_DXT4           -- ^ DDS (DirectDraw Surface) DXT4 format
+    | PF_DXT5           -- ^ DDS (DirectDraw Surface) DXT5 format
+    | PF_FLOAT16_R      -- 16-bit pixel format, 16 bits (float) for red
+    | PF_FLOAT16_RGB    -- 48-bit pixel format, 16 bits (float) for red, 16 bits (float) for green, 16 bits (float) for blue
+    | PF_FLOAT16_RGBA   -- 64-bit pixel format, 16 bits (float) for red, 16 bits (float) for green, 16 bits (float) for blue, 16 bits (float) for alpha
+    | PF_FLOAT32_R      -- 16-bit pixel format, 16 bits (float) for red
+    | PF_FLOAT32_RGB    -- 96-bit pixel format, 32 bits (float) for red, 32 bits (float) for green, 32 bits (float) for blue
+    | PF_FLOAT32_RGBA   -- 128-bit pixel format, 32 bits (float) for red, 32 bits (float) for green, 32 bits (float) for blue, 32 bits (float) for alpha
+    | PF_FLOAT16_GR     -- 32-bit, 2-channel s10e5 floating point pixel format, 16-bit green, 16-bit red
+    | PF_FLOAT32_GR     -- 64-bit, 2-channel floating point pixel format, 32-bit green, 32-bit red
+    | PF_DEPTH          -- Depth texture format
+    | PF_SHORT_RGBA     -- 64-bit pixel format, 16 bits for red, green, blue and alpha
+    | PF_SHORT_GR       -- 32-bit pixel format, 16-bit green, 16-bit red
+    | PF_SHORT_RGB      -- 48-bit pixel format, 16 bits for red, green and blue
+    deriving Eq
+
+-- | Flags defining some on/off properties of pixel formats
+{-
+    PFF_HASALPHA        = 0x00000001,      
+    PFF_COMPRESSED      = 0x00000002,
+    PFF_FLOAT           = 0x00000004,         
+    PFF_DEPTH           = 0x00000008,
+    PFF_NATIVEENDIAN    = 0x00000010,
+    PFF_LUMINANCE       = 0x00000020
+-}
+data PixelFormatFlags
+    = PFF_HASALPHA      -- ^ This format has an alpha channel
+    | PFF_COMPRESSED    -- ^ This format is compressed. This invalidates the values in elemBytes,
+                        --   elemBits and the bit counts as these might not be fixed in a compressed format.
+    | PFF_FLOAT         -- ^ This is a floating point format
+    | PFF_DEPTH         -- ^ This is a depth format (for depth textures)
+    | PFF_NATIVEENDIAN  -- ^ Format is in native endian. Generally true for the 16, 24 and 32 bits
+                        --   formats which can be represented as machine integers.
+    | PFF_LUMINANCE     -- ^ This is an intensity format instead of a RGB one. The luminance
+                        --   replaces R,G and B. (but not A)
+
+-- | Pixel component format
+data PixelComponentType
+    = PCT_BYTE      -- | Byte per component (8 bit fixed 0.0..1.0)
+    | PCT_SHORT     -- | Short per component (16 bit fixed 0.0..1.0))
+    | PCT_FLOAT16   -- | 16 bit float per component
+    | PCT_FLOAT32   -- | 32 bit float per component
+
+         {-| Structure used to define a box in a 3-D integer space.
+         	Note that the left, top, and front edges are included but the right, 
+         	bottom and back ones are not.
+         -}
+--        struct Box
+--        {
+--            size_t left, top, right, bottom, front, back;
+			-- | Parameterless constructor for setting the members manually
+--            Box()
+--				: left(0), top(0), right(1), bottom(1), front(0), back(1)
+--            {
+--            }
+            {-| Define a box from left, top, right and bottom coordinates
+            	This box will have depth one (front=0 and back=1).
+            	@param	l	x value of left edge
+            	@param	t	y value of top edge
+            	@param	r	x value of right edge
+            	@param	b	y value of bottom edge
+            	@note Note that the left, top, and front edges are included 
+ 		           	but the right, bottom and back ones are not.
+            -}
+--            Box( size_t l, size_t t, size_t r, size_t b ):
+--                left(l),
+--                top(t),   
+--                right(r),
+--                bottom(b),
+--                front(0),
+--                back(1)
+--            {
+--          		assert(right >= left && bottom >= top && back >= front);
+--            }
+            {-| Define a box from left, top, front, right, bottom and back
+            	coordinates.
+            	@param	l	x value of left edge
+            	@param	t	y value of top edge
+            	@param  ff  z value of front edge
+            	@param	r	x value of right edge
+            	@param	b	y value of bottom edge
+            	@param  bb  z value of back edge
+            	@note Note that the left, top, and front edges are included 
+ 		           	but the right, bottom and back ones are not.
+            -}
+--            Box( size_t l, size_t t, size_t ff, size_t r, size_t b, size_t bb ):
+--                left(l),
+--                top(t),   
+--                right(r),
+--                bottom(b),
+--                front(ff),
+--                back(bb)
+--            {
+--          		assert(right >= left && bottom >= top && back >= front);
+--            }
+            
+            -- | Return true if the other box is a part of this one
+--            bool contains(const Box &def) const
+--            {
+--            	return (def.left >= left && def.top >= top && def.front >= front &&
+--					def.right <= right && def.bottom <= bottom && def.back <= back);
+--            }
+            
+            -- | Get the width of this box
+--            size_t getWidth() const { return right-left; }
+            -- | Get the height of this box
+--            size_t getHeight() const { return bottom-top; }
+            -- | Get the depth of this box
+--            size_t getDepth() const { return back-front; }
+--        };
+
+{-| A primitive describing a volume (3D), image (2D) or line (1D) of pixels in memory.
+    In case of a rectangle, depth must be 1. 
+    Pixels are stored as a succession of "depth" slices, each containing "height" rows of 
+    "width" pixels.
+-}
+data PixelBox
+    = PixelBox
+    { pbPixelData       :: Ptr Word8
+    , pbPixelFormat     :: PixelFormat
+    , pbLeft            :: Int
+    , pbTop             :: Int
+    , pbRight           :: Int
+    , pbBottom          :: Int
+    , pbFront           :: Int
+    , pbBack            :: Int
+    }
+        
+--    class _OgreExport PixelBox: public Box, public ImageAlloc {
+--    public:
+    	-- | Parameter constructor for setting the members manually
+--    	PixelBox() {}
+--		~PixelBox() {}
+		{-| Constructor providing extents in the form of a Box object. This constructor
+    		assumes the pixel data is laid out consecutively in memory. (this
+    		means row after row, slice after slice, with no space in between)
+    		@param extents	    Extents of the region defined by data
+    		@param pixelFormat	Format of this buffer
+    		@param pixelData	Pointer to the actual data
+    	-}
+--		PixelBox(const Box &extents, PixelFormat pixelFormat, void *pixelData=0):
+--			Box(extents), data(pixelData), format(pixelFormat)
+--		{
+--			setConsecutive();
+--		}
+    	{-| Constructor providing width, height and depth. This constructor
+    		assumes the pixel data is laid out consecutively in memory. (this
+    		means row after row, slice after slice, with no space in between)
+    		@param width	    Width of the region
+    		@param height	    Height of the region
+    		@param depth	    Depth of the region
+    		@param pixelFormat	Format of this buffer
+    		@param pixelData    Pointer to the actual data
+    	-}
+--    	PixelBox(size_t width, size_t height, size_t depth, PixelFormat pixelFormat, void *pixelData=0):
+--    		Box(0, 0, 0, width, height, depth),
+--    		data(pixelData), format(pixelFormat)
+--    	{
+--    		setConsecutive();
+--    	}
+    	
+        -- | The data pointer 
+--        void *data;
+        -- | The pixel format 
+--        PixelFormat format;
+        {-| Number of elements between the leftmost pixel of one row and the left
+         	pixel of the next. This value must always be equal to getWidth() (consecutive) 
+			for compressed formats.
+        -}
+--        size_t rowPitch;
+        {-| Number of elements between the top left pixel of one (depth) slice and 
+         	the top left pixel of the next. This can be a negative value. Must be a multiple of
+         	rowPitch. This value must always be equal to getWidth()*getHeight() (consecutive) 
+			for compressed formats.
+        -}
+--        size_t slicePitch;
+        
+        {-| Set the rowPitch and slicePitch so that the buffer is laid out consecutive 
+         	in memory.
+        -}        
+--        void setConsecutive()
+--        {
+--            rowPitch = getWidth();
+--            slicePitch = getWidth()*getHeight();
+--        }
+        {-|	Get the number of elements between one past the rightmost pixel of 
+         	one row and the leftmost pixel of the next row. (IE this is zero if rows
+         	are consecutive).
+        -}
+--        size_t getRowSkip() const { return rowPitch - getWidth(); }
+        {-| Get the number of elements between one past the right bottom pixel of
+         	one slice and the left top pixel of the next slice. (IE this is zero if slices
+         	are consecutive).
+        -}
+--        size_t getSliceSkip() const { return slicePitch - (getHeight() * rowPitch); }
+
+        {-| Return whether this buffer is laid out consecutive in memory (ie the pitches
+         	are equal to the dimensions)
+        -}        
+--        bool isConsecutive() const 
+--		{ 
+--			return rowPitch == getWidth() && slicePitch == getWidth()*getHeight(); 
+--		}
+        {-| Return the size (in bytes) this image would take if it was
+        	laid out consecutive in memory
+      	-}
+--      	size_t getConsecutiveSize() const;
+      	{-| Return a subvolume of this PixelBox.
+      		@param def	Defines the bounds of the subregion to return
+      		@returns	A pixel box describing the region and the data in it
+      		@remarks	This function does not copy any data, it just returns
+      			a PixelBox object with a data pointer pointing somewhere inside 
+      			the data of object.
+      		@throws	Exception(ERR_INVALIDPARAMS) if def is not fully contained
+      	-}
+--      	PixelBox getSubVolume(const Box &def) const;
+--    };
+
+{-| Returns the size in bytes of an element of the given pixel format.
+ @returns
+       The size in bytes of an element. See Remarks.
+ @remarks
+       Passing PF_UNKNOWN will result in returning a size of 0 bytes.
+-}
+--TODO getNumElemBytes :: PixelFormat -> Int
+--static size_t getNumElemBytes( PixelFormat format );
+
+{-| Returns the size in bits of an element of the given pixel format.
+  @returns
+       The size in bits of an element. See Remarks.
+   @remarks
+       Passing PF_UNKNOWN will result in returning a size of 0 bits.
+-}
+--TODO getNumElemBits :: PixelFormat -> Int
+--static size_t getNumElemBits( PixelFormat format );
+
+{-| Returns the size in memory of a region with the given extents and pixel
+	format with consecutive memory layout.
+	@param width
+		The width of the area
+	@param height
+		The height of the area
+	@param depth
+		The depth of the area
+	@param format
+		The format of the area
+  	@returns
+  		The size in bytes
+	@remarks
+		In case that the format is non-compressed, this simply returns
+		width*height*depth*PixelUtil::getNumElemBytes(format). In the compressed
+		case, this does serious magic.
+-}
+--TODO getMemorySize :: Int -> Int -> Int -> PixelFormat -> Int
+--static size_t getMemorySize(size_t width, size_t height, size_t depth, PixelFormat format);
+
+{-| Returns the property flags for this pixel format
+  @returns
+       A bitfield combination of PFF_HASALPHA, PFF_ISCOMPRESSED,
+       PFF_FLOAT, PFF_DEPTH, PFF_NATIVEENDIAN, PFF_LUMINANCE
+  @remarks
+       This replaces the seperate functions for formatHasAlpha, formatIsFloat, ...
+-}
+--static unsigned int getFlags( PixelFormat format );
+
+-- | Shortcut method to determine if the format has an alpha component
+--TODO hasAlpha :: PixelFormat -> Bool
+--static bool hasAlpha(PixelFormat format);
+
+-- | Shortcut method to determine if the format is floating point
+--TODO isFloatingPoint :: PixelFormat -> Bool
+--static bool isFloatingPoint(PixelFormat format);
+
+-- | Shortcut method to determine if the format is compressed
+--TODO isCompressed :: PixelFormat -> Bool
+--static bool isCompressed(PixelFormat format);
+
+-- | Shortcut method to determine if the format is a depth format.
+--TODO isDepth :: PixelFormat -> Bool
+--static bool isDepth(PixelFormat format);
+
+-- | Shortcut method to determine if the format is in native endian format.
+--TODO isNativeEndian :: PixelFormat -> Bool
+--static bool isNativeEndian(PixelFormat format);
+
+-- | Shortcut method to determine if the format is a luminance format.
+--TODO isLuminance :: PixelFormat -> Bool
+--static bool isLuminance(PixelFormat format);
+
+{-| Return wether a certain image extent is valid for this image format.
+	@param width
+		The width of the area
+	@param height
+		The height of the area
+	@param depth
+		The depth of the area
+	@param format
+		The format of the area
+	@remarks For non-compressed formats, this is always true. For DXT formats,
+	only sizes with a width and height multiple of 4 and depth 1 are allowed.
+-}
+--TODO isValidExtent :: Int -> Int -> Int -> PixelFormat -> Bool
+--static bool isValidExtent(size_t width, size_t height, size_t depth, PixelFormat format);
+
+{-| Gives the number of bits (RGBA) for a format. See remarks.          
+  @remarks      For non-colour formats (dxt, depth) this returns [0,0,0,0].
+-}
+--TODO static void getBitDepths(PixelFormat format, int rgba[4]);
+
+{-| Gives the masks for the R, G, B and A component
+  @note			Only valid for native endian formats
+-}
+--TODO static void getBitMasks(PixelFormat format, uint32 rgba[4]);
+
+{-| Gives the bit shifts for R, G, B and A component
+@note			Only valid for native endian formats
+-}
+--TODO static void getBitShifts(PixelFormat format, unsigned char rgba[4]);
+
+-- | Gets the name of an image format
+--TODO getFormatName :: PixelFormat -> String
+--static String getFormatName(PixelFormat srcformat);
+
+{-| Returns wether the format can be packed or unpacked with the packColour()
+and unpackColour() functions. This is generally not true for compressed and
+depth formats as they are special. It can only be true for formats with a
+fixed element size.
+  @returns 
+       true if yes, otherwise false
+-}
+--TODO static bool isAccessible(PixelFormat srcformat);
+
+{-| Returns the component type for a certain pixel format. Returns PCT_BYTE
+    in case there is no clear component type like with compressed formats.
+    This is one of PCT_BYTE, PCT_SHORT, PCT_FLOAT16, PCT_FLOAT32.
+-}
+--TODO getComponentType :: PixelFormat -> PixelComponentType
+--static PixelComponentType getComponentType(PixelFormat fmt);
+
+{-| Returns the component count for a certain pixel format. Returns 3(no alpha) or 
+    4 (has alpha) in case there is no clear component type like with compressed formats.
+ -}
+--TODO getComponentCount :: PixelFormat -> Int
+--static size_t getComponentCount(PixelFormat fmt);
+
+{-| Gets the format from given name.
+    @param  name            The string of format name
+    @param  accessibleOnly  If true, non-accessible format will treat as invalid format,
+                            otherwise, all supported format are valid.
+    @param  caseSensitive   Should be set true if string match should use case sensitivity.
+    @returns                The format match the format name, or PF_UNKNOWN if is invalid name.
+-}
+--TODO static PixelFormat getFormatFromName(const String& name, bool accessibleOnly = false, bool caseSensitive = false);
+
+{-| Gets the BNF expression of the pixel-formats.
+    @note                   The string returned by this function is intented to use as a BNF expression
+                            to work with Compiler2Pass.
+    @param  accessibleOnly  If true, only accessible pixel format will take into account, otherwise all
+                            pixel formats list in PixelFormat enumeration will being returned.
+    @returns                A string contains the BNF expression.
+-}
+--TODO static String getBNFExpressionOfPixelFormats(bool accessibleOnly = false);
+
+{-| Returns the similar format but acoording with given bit depths.
+    @param fmt      The original foamt.
+    @param integerBits Preferred bit depth (pixel bits) for integer pixel format.
+                    Available values: 0, 16 and 32, where 0 (the default) means as it is.
+    @param floatBits Preferred bit depth (channel bits) for float pixel format.
+                    Available values: 0, 16 and 32, where 0 (the default) means as it is.
+    @returns        The format that similar original format with bit depth according
+                    with preferred bit depth, or original format if no convertion occuring.
+-}
+--TODO getFormatForBitDepths :: PixelFormat -> Int -> Int -> PixelFormat
+--static PixelFormat getFormatForBitDepths(PixelFormat fmt, ushort integerBits, ushort floatBits);
+
+{-| Pack a colour value to memory
+	@param colour	The colour
+	@param pf		Pixelformat in which to write the colour
+	@param dest		Destination memory location
+-}
+--TODO static void packColour(const ColourValue &colour, const PixelFormat pf,  void* dest);
+{-| Pack a colour value to memory
+	@param r,g,b,a	The four colour components, range 0x00 to 0xFF
+	@param pf		Pixelformat in which to write the colour
+	@param dest		Destination memory location
+-}
+--TODO static void packColour(const uint8 r, const uint8 g, const uint8 b, const uint8 a, const PixelFormat pf,  void* dest);
+ {-| Pack a colour value to memory
+	@param r,g,b,a	The four colour components, range 0.0f to 1.0f
+					(an exception to this case exists for floating point pixel
+					formats, which don't clamp to 0.0f..1.0f)
+	@param pf		Pixelformat in which to write the colour
+	@param dest		Destination memory location
+-}
+--TODO static void packColour(const float r, const float g, const float b, const float a, const PixelFormat pf,  void* dest);
+
+{-| Unpack a colour value from memory
+	@param colour	The colour is returned here
+	@param pf		Pixelformat in which to read the colour
+	@param src		Source memory location
+-}
+--TODO static void unpackColour(ColourValue *colour, PixelFormat pf,  const void* src);
+{-| Unpack a colour value from memory
+	@param r,g,b,a	The colour is returned here (as byte)
+	@param pf		Pixelformat in which to read the colour
+	@param src		Source memory location
+	@remarks 	This function returns the colour components in 8 bit precision,
+		this will lose precision when coming from PF_A2R10G10B10 or floating
+		point formats.  
+-}
+--TODO static void unpackColour(uint8 *r, uint8 *g, uint8 *b, uint8 *a, PixelFormat pf,  const void* src);
+{-| Unpack a colour value from memory
+	@param r,g,b,a	The colour is returned here (as float)
+	@param pf		Pixelformat in which to read the colour
+	@param src		Source memory location
+-}
+--TODO static void unpackColour(float *r, float *g, float *b, float *a, PixelFormat pf,  const void* src); 
+
+{-| Convert consecutive pixels from one format to another. No dithering or filtering is being done. 
+ 	Converting from RGB to luminance takes the R channel.  In case the source and destination format match,
+ 	just a copy is done.
+ 	@param	src			Pointer to source region
+ 	@param	srcFormat	Pixel format of source region
+ 	@param   dst			Pointer to destination region
+ 	@param	dstFormat	Pixel format of destination region
+ -}
+--TODO static void bulkPixelConversion(void *src, PixelFormat srcFormat, void *dest, PixelFormat dstFormat, unsigned int count);
+
+{-| Convert pixels from one format to another. No dithering or filtering is being done. Converting
+  	from RGB to luminance takes the R channel. 
+ 	@param	src			PixelBox containing the source pixels, pitches and format
+ 	@param	dst			PixelBox containing the destination pixels, pitches and format
+ 	@remarks The source and destination boxes must have the same
+ 	dimensions. In case the source and destination format match, a plain copy is done.
+-}
+--TODO static void bulkPixelConversion(const PixelBox &src, const PixelBox &dst);
diff --git a/Graphics/LambdaCube/RenderOperation.hs b/Graphics/LambdaCube/RenderOperation.hs
new file mode 100644
--- /dev/null
+++ b/Graphics/LambdaCube/RenderOperation.hs
@@ -0,0 +1,31 @@
+module Graphics.LambdaCube.RenderOperation where
+
+import Graphics.LambdaCube.HardwareVertexBuffer
+import Graphics.LambdaCube.HardwareIndexBuffer
+import Graphics.LambdaCube.VertexIndexData
+
+-- | The rendering operation type to perform
+data OperationType
+    = OT_POINT_LIST     -- ^ A list of points, 1 vertex per point
+    | OT_LINE_LIST      -- ^ A list of lines, 2 vertices per line
+    | OT_LINE_STRIP     -- ^ A strip of connected lines, 1 vertex per line plus 1 start vertex
+    | OT_TRIANGLE_LIST  -- ^ A list of triangles, 3 vertices per triangle
+    | OT_TRIANGLE_STRIP -- ^ A strip of triangles, 3 vertices for the first triangle, and 1 per triangle after that 
+    | OT_TRIANGLE_FAN   -- ^ A fan of triangles, 3 vertices for the first triangle, and 1 per triangle after that
+    deriving (Eq,Enum)
+
+
+-- | 'New' rendering operation using vertex buffers.
+data (HardwareVertexBuffer vb, HardwareIndexBuffer ib) => RenderOperation vb ib
+    = RenderOperation
+    { roVertexData      :: VertexData vb        -- ^ Vertex source data
+    , roOperationType   :: OperationType        -- ^ The type of operation to perform
+    {-| Specifies whether to use indexes to determine the vertices to use as input. If false, the vertices are
+        simply read in sequence to define the primitives. If true, indexes are used instead to identify vertices
+        anywhere in the buffer, and allowing vertices to be used more than once.
+        If true, then the indexBuffer, indexStart and numIndexes properties must be valid.
+    -}
+    , roIndexData       :: Maybe (IndexData ib) -- ^ Index data - only valid if useIndexes is true
+--    , roSrcRenderable   :: Renderable     -- ^ Debug pointer back to renderable which created this
+    }
+    deriving Eq
diff --git a/Graphics/LambdaCube/RenderQueue.hs b/Graphics/LambdaCube/RenderQueue.hs
new file mode 100644
--- /dev/null
+++ b/Graphics/LambdaCube/RenderQueue.hs
@@ -0,0 +1,225 @@
+module Graphics.LambdaCube.RenderQueue where
+
+import Data.IntMap (IntMap)
+import qualified Data.IntMap as IntMap
+import Data.List
+import Data.Maybe
+import Control.Monad
+
+import Graphics.LambdaCube.Types
+import Graphics.LambdaCube.Utility
+import Graphics.LambdaCube.Pass
+import Graphics.LambdaCube.Light
+import Graphics.LambdaCube.RenderOperation
+import Graphics.LambdaCube.VertexIndexData
+import Graphics.LambdaCube.RenderSystem
+import Graphics.LambdaCube.HardwareVertexBuffer
+import Graphics.LambdaCube.HardwareIndexBuffer
+import Graphics.LambdaCube.Texture
+import Graphics.LambdaCube.TextureUnitState
+import Graphics.LambdaCube.GpuProgram
+
+-- Standard Render Queues
+constRenderQueueBackground      = 0   :: Int
+constRenderQueueSkiesEarly      = 5   :: Int  -- ^ First queue (after backgrounds), used for skyboxes if rendered first
+constRenderQueue1               = 10  :: Int
+constRenderQueue2               = 20  :: Int
+constRenderQueueWorldGeometry1  = 25  :: Int
+constRenderQueue3               = 30  :: Int
+constRenderQueue4               = 40  :: Int
+constRenderQueueMain            = 50  :: Int  -- ^ The default render queue
+constRenderQueue6               = 60  :: Int
+constRenderQueue7               = 70  :: Int
+constRenderQueueWorldGeometry2  = 75  :: Int
+constRenderQueue8               = 80  :: Int
+constRenderQueue9               = 90  :: Int
+constRenderQueueSkiesLate       = 95  :: Int  -- ^ Penultimate queue(before overlays), used for skyboxes if rendered last
+constRenderQueueOverlay         = 100 :: Int  -- ^ Use this queue for objects which must be rendered last e.g. overlays
+constRenderQueueMax             = 105 :: Int  -- ^ Final possible render queue, don't exceed this
+
+constRenderableDefaultPriority  = 100 :: Int
+
+data RenderGroupOptions
+    = RenderGroupOptions
+    { rqoShadowsEnabled :: Bool
+    }
+
+defaultRenderGroupOptions = RenderGroupOptions
+    { rqoShadowsEnabled = True
+    }
+
+-- | Struct associating a single Pass with a single Renderable. 
+data (HardwareVertexBuffer vb, HardwareIndexBuffer ib, Texture t, LinkedGpuProgram lp) => RenderablePass vb ib t lp
+    = RenderablePass
+    { rpOperation   :: RenderOperation vb ib
+    , rpPass        :: Pass t lp
+    , rpMatrix      :: Matrix4
+    , rpLights      :: [(Matrix4,Light)]
+    }
+
+data RenderStatistics
+    = RenderStatistics
+    { rsFaceCount   :: Int
+    , rsVertexCount :: Int
+    , rsBatchCount  :: Int
+    }
+    deriving Show
+    
+emptyRenderStatistics = RenderStatistics
+    { rsFaceCount   = 0
+    , rsVertexCount = 0
+    , rsBatchCount  = 0
+    }
+
+--renderPassGroup :: RenderSystem -> RenderablePass -> IO ()
+renderPassGroup time rs rstat r = do
+    let pass = rpPass $ head r
+        depthBiasConstant   = psDepthBiasConstant pass
+        depthBiasPerIter    = psDepthBiasPerIteration pass
+        depthBiasSlopeScale = psDepthBiasSlopeScale pass
+        iterationCnt        = psPassIterationCount pass
+        geomCmp a b         = rpOperation a == rpOperation b
+        geomSort a b        = case geomCmp a b of
+            { True  -> EQ
+            ; False -> GT
+            }
+        renderGeomGrp pass rst r = do
+            let rop     = rpOperation $ head r
+                geomCnt = length r
+--            print $ "  geomGrp len: " ++ (show $ length r)
+            --TODO: setup object related shader parameters
+            bindGeometry rs rop $ psTextureUnitStates pass
+            mapM_ (renderGeom pass) r
+            unbindGeometry rs rop
+
+            -- calculate statistics
+            let val     = if isNothing $ roIndexData rop then vdVertexCount $ roVertexData rop else idIndexCount $ fromJust $ roIndexData rop 
+                val'    = case roOperationType rop of
+                    { OT_TRIANGLE_LIST  -> val `div` 3
+                    ; OT_TRIANGLE_STRIP -> val - 2
+                    ; OT_TRIANGLE_FAN   -> val - 2
+                    ; _ -> 0
+                    }
+            return RenderStatistics
+                { rsFaceCount   = geomCnt * iterationCnt * val' + rsFaceCount rst
+                , rsVertexCount = geomCnt * (vdVertexCount $ roVertexData rop) + rsVertexCount rst
+                , rsBatchCount  = geomCnt * iterationCnt + rsBatchCount rst
+                }
+
+        renderGeom pass r = do
+            setWorldMatrix rs $ rpMatrix r
+
+            --TODO: do pass and per light iterations
+            --       light list with attributes
+            -- filter relevant lights
+            let lights      = drop (psStartLight pass) $ take (psMaxSimultaneousLights pass) $ filter filtL $ rpLights r
+                filtL (m,l) = case psOnlyLightType pass of
+                    { Nothing   -> True
+                    ; Just t    -> t == (lgType l)
+                    }
+                -- create light groups according requirement (per n light)
+                lightGrp    = case psLightsPerIteration pass of
+                    { Nothing   -> [lights]
+                    ; Just n    -> f n lights
+                    }
+                f _ [] = []
+                f n l = h:(f n t)
+                  where
+                    (h,t) = splitAt n l
+            -- render n times each light group
+            forM_ lightGrp $ \l -> do
+                --TODO setup lights
+                --TODO: useLights rs l
+                --TODO: setup per light iteration shader parameters
+                forM_ [1..iterationCnt] $ \pc -> do
+                    -- TODO: update iteration dependent parameteres:
+                        --TODO: setup pass iteration number shader parameter
+                    -- Update derived depth bias
+                    when (pc > 1 && depthBiasPerIter /= 0) $ setDepthBias rs (depthBiasConstant + (fromIntegral pc-1) * depthBiasPerIter) depthBiasSlopeScale
+                    render rs $ rpOperation r
+            
+    setPass time rs pass 
+--    print $ "passGrp len: " ++ (show $ length r) ++ " " ++ show [ tusFrameNames tu | tu <- psTextureUnitStates pass ]
+    --TODO: setup global pass related shader parameters
+    --foldM (renderGeomGrp pass) rstat $ groupBy geomCmp $ sortBy geomSort r
+    foldM (renderGeomGrp pass) rstat $ groupSetBy geomCmp r
+   
+--[(Matrix4,r,Int,Int)]    -- ^ List of Renderable information including WorldMatrix RenderQueueID and RenderPriority
+--renderCollection :: (RenderSystem rs, Renderable r) => rs -> IntMap RenderGroupOptions -> [(Matrix4,r,Int,Int)] -> IO ()
+renderCollection time rs roptMap rstat rl = do
+
+    let passCmp a b = rpPass a == rpPass b
+        passSort a b = case passCmp a b of
+            { True  -> EQ
+            ; False -> GT
+            }
+        --groupPass 
+        
+        -- group by pass and geometry
+        --passGroupRenderMethod rst a = foldM (renderPassGroup time rs) rst $ groupBy passCmp $ sortBy passSort a
+        passGroupRenderMethod rst a = foldM (renderPassGroup time rs) rst $ groupSetBy passCmp a
+        
+        -- sort by distance
+        distanceSortRenderMethod = undefined
+        
+        -- simple render
+        simpleRenderMethod = undefined
+
+        
+        rents   = concat [r | (m,r,_,_) <- rl]
+        lights  = [] -- TODO
+        (_,_,grpID,_) = head rl
+        ropt = fromMaybe defaultRenderGroupOptions $ IntMap.lookup grpID roptMap
+
+    -- Do solids
+    rstat1 <- passGroupRenderMethod rstat [RenderablePass ro p m lights | RenderEntity ro pl m <- rents, p <- pl]
+    
+    -- Do unsorted transparents
+    --simpleRenderMethod $ rpgTransparentsUnsorted rpg
+    
+    -- Do transparents (always descending)
+    --distanceSortRenderMethod $ rpgTransparents rpg
+    return rstat1
+
+-- Fast    
+--renderQueue :: (RenderSystem rs, Renderable r) => rs -> IntMap RenderGroupOptions -> [(Matrix4,r,Int,Int)] -> IO ()
+-- TODO: maybe we should try parallelize this code
+-- HINT: Ogre uses radix sort
+renderQueue time rs roptMap rstat rl = do
+    let grpPriorGroupCmp (_,_,ga,pa) (_,_,gb,pb) = ga == gb && pa == pb
+        grpPriorSortCmp al bl = case ga `compare` gb of
+            { LT    -> LT
+            ; EQ    -> pa `compare` pb
+            ; GT    -> GT
+            }
+          where
+            (_,_,ga,pa) = {-head-} al
+            (_,_,gb,pb) = {-head-} bl
+--    foldM (renderCollection rs roptMap) rstat $ groupBy grpPriorGroupCmp $ sortBy grpPriorSortCmp rl
+    foldM (renderCollection time rs roptMap) rstat $ groupSetBy grpPriorGroupCmp rl
+
+----------------------------------------------------------------------------------------------------------------------------
+-- Slow code below  --------------------------------------------------------------------------------------------------------
+----------------------------------------------------------------------------------------------------------------------------
+{-
+data RenderQueue
+    = RenderQueue
+    { rqGroupMap :: IntMap RenderGroup
+    }
+
+data RenderGroup
+    = RenderGroup
+    { rgPriorityGroups  :: IntMap RenderPriorityGroup
+    , rgShadowsEnabled  :: Bool -- ^ Whether shadows are enabled for this queue
+    }
+
+data RenderPriorityGroup
+    = RenderPriorityGroup
+    { rpgSolidsBasic            :: [RenderablePass] -- ^ Solid pass list, used when no shadows, modulative shadows, or ambient passes for additive
+    , rpgSolidsDiffuseSpecular  :: [RenderablePass] -- ^ Solid per-light pass list, used with additive shadows
+    , rpgSolidsDecal            :: [RenderablePass] -- ^ Solid decal (texture) pass list, used with additive shadows
+    , rpgSolidsNoShadowReceive  :: [RenderablePass] -- ^ Solid pass list, used when shadows are enabled but shadow receive is turned off for these passes
+    , rpgTransparentsUnsorted   :: [RenderablePass] -- ^ Unsorted transparent list
+    , rpgTransparents           :: [RenderablePass] -- ^ Transparent list
+    }
+-}
diff --git a/Graphics/LambdaCube/RenderSystem.hs b/Graphics/LambdaCube/RenderSystem.hs
new file mode 100644
--- /dev/null
+++ b/Graphics/LambdaCube/RenderSystem.hs
@@ -0,0 +1,1492 @@
+{-# LANGUAGE MultiParamTypeClasses, FunctionalDependencies #-}
+module Graphics.LambdaCube.RenderSystem where
+
+import Data.Word
+import Data.Maybe
+import qualified Data.Set as Set
+import Foreign.C.Types
+import Control.Monad
+
+import Graphics.LambdaCube.Types
+import Graphics.LambdaCube.Common
+import Graphics.LambdaCube.BlendMode
+import Graphics.LambdaCube.Texture
+import Graphics.LambdaCube.GpuProgram
+import Graphics.LambdaCube.TextureUnitState
+import Graphics.LambdaCube.Image
+import Graphics.LambdaCube.Light
+import Graphics.LambdaCube.RenderSystemCapabilities
+import Graphics.LambdaCube.RenderOperation
+import Graphics.LambdaCube.HardwareBuffer
+import Graphics.LambdaCube.HardwareVertexBuffer
+import Graphics.LambdaCube.HardwareIndexBuffer
+import Graphics.LambdaCube.HardwareOcclusionQuery
+import Graphics.LambdaCube.PixelFormat
+import Graphics.LambdaCube.Pass
+
+-- | Enum describing the ways to generate texture coordinates
+data TexCoordCalcMethod
+    = TEXCALC_NONE                       -- ^ No calculated texture coordinates
+    | TEXCALC_ENVIRONMENT_MAP            -- ^ Environment map based on vertex normals
+    | TEXCALC_ENVIRONMENT_MAP_PLANAR     -- ^ Environment map based on vertex positions
+    | TEXCALC_ENVIRONMENT_MAP_REFLECTION -- ^ Environment map based on vertex positions
+    | TEXCALC_ENVIRONMENT_MAP_NORMAL     -- ^ Environment map based on vertex positions
+    | TEXCALC_PROJECTIVE_TEXTURE         -- ^ Projective texture
+    deriving Eq
+
+-- | Enum describing the various actions which can be taken onthe stencil buffer
+data StencilOperation
+    = SOP_KEEP           -- ^ Leave the stencil buffer unchanged
+    | SOP_ZERO           -- ^ Set the stencil value to zero
+    | SOP_REPLACE        -- ^ Set the stencil value to the reference value
+    | SOP_INCREMENT      -- ^ Increase the stencil value by 1, clamping at the maximum value
+    | SOP_DECREMENT      -- ^ Decrease the stencil value by 1, clamping at 0
+    | SOP_INCREMENT_WRAP -- ^ Increase the stencil value by 1, wrapping back to 0 when incrementing the maximum value
+    | SOP_DECREMENT_WRAP -- ^ Decrease the stencil value by 1, wrapping when decrementing 0
+    | SOP_INVERT         -- ^ Invert the bits of the stencil buffer
+    deriving Eq
+
+{-| Defines the functionality of a 3D API
+@remarks
+The RenderSystem class provides a base interface
+which abstracts the general functionality of the 3D API
+e.g. Direct3D or OpenGL. Whilst a few of the general
+methods have implementations, most of this class is
+abstract, requiring a subclass based on a specific API
+to be constructed to provide the full functionality.
+Note there are 2 levels to the interface - one which
+will be used often by the caller of the Ogre library,
+and one which is at a lower level and will be used by the
+other classes provided by Ogre. These lower level
+methods are prefixed with '_' to differentiate them.
+The advanced user of the library may use these lower
+level methods to access the 3D API at a more fundamental
+level (dealing direct with render states and rendering
+primitives), but still benefiting from Ogre's abstraction
+of exactly which 3D API is in use.
+@author
+Steven Streeting
+@version
+1.0
+-}
+class (HardwareVertexBuffer vb, HardwareIndexBuffer ib, HardwareOcclusionQuery q, Texture t, GpuProgram p, LinkedGpuProgram lp) => RenderSystem a vb ib q t p lp | a -> vb ib q t p lp where
+    {-| Create a hardware vertex buffer.
+    @remarks
+        This method creates a new vertex buffer; this will act as a source of geometry
+        data for rendering objects. Note that because the meaning of the contents of
+        the vertex buffer depends on the usage, this method does not specify a
+        vertex format; the user of this buffer can actually insert whatever data 
+        they wish, in any format. However, in order to use this with a RenderOperation,
+        the data in this vertex buffer will have to be associated with a semantic element
+        of the rendering pipeline, e.g. a position, or texture coordinates. This is done 
+        using the VertexDeclaration class, which itself contains VertexElement structures
+        referring to the source data.
+    @remarks Note that because vertex buffers can be shared, they are reference
+        counted so you do not need to worry about destroying themm this will be done
+        automatically.
+    @param vertexSize The size in bytes of each vertex in this buffer; you must calculate
+        this based on the kind of data you expect to populate this buffer with.
+    @param numVerts The number of vertices in this buffer.
+    @param usage One or more members of the HardwareBuffer::Usage enumeration; you are
+        strongly advised to use HBU_STATIC_WRITE_ONLY wherever possible, if you need to 
+        update regularly, consider HBU_DYNAMIC_WRITE_ONLY and useShadowBuffer=true.
+    @param useShadowBuffer If set to true, this buffer will be 'shadowed' by one stored in 
+        system memory rather than GPU or AGP memory. You should set this flag if you intend 
+        to read data back from the vertex buffer, because reading data from a buffer
+    	in the GPU or AGP memory is very expensive, and is in fact impossible if you
+        specify HBU_WRITE_ONLY for the main buffer. If you use this option, all 
+        reads and writes will be done to the shadow buffer, and the shadow buffer will
+        be synchronised with the real buffer at an appropriate time.
+    -}
+    createVertexBuffer              :: a -> Int -> Int -> Usage -> Bool -> IO vb
+    {-| Create a hardware index buffer.
+    @remarks Note that because buffers can be shared, they are reference
+        counted so you do not need to worry about destroying them this will be done
+        automatically.
+    @param itype The type in index, either 16- or 32-bit, depending on how many vertices
+    	you need to be able to address
+    @param numIndexes The number of indexes in the buffer
+    @param usage One or more members of the HardwareBuffer::Usage enumeration.
+    @param useShadowBuffer If set to true, this buffer will be 'shadowed' by one stored in 
+        system memory rather than GPU or AGP memory. You should set this flag if you intend 
+        to read data back from the index buffer, because reading data from a buffer
+    	in the GPU or AGP memory is very expensive, and is in fact impossible if you
+        specify HBU_WRITE_ONLY for the main buffer. If you use this option, all 
+        reads and writes will be done to the shadow buffer, and the shadow buffer will
+        be synchronised with the real buffer at an appropriate time.
+    -}
+    createIndexBuffer               :: a -> IndexType -> Int -> Usage -> Bool -> IO ib
+
+    {-
+        virtual TexturePtr createManual(const String & name, const String& group,
+            TextureType texType, uint width, uint height, uint depth, 
+			int num_mips, PixelFormat format, int usage = TU_DEFAULT, ManualResourceLoader* loader = 0,
+			bool hwGammaCorrection = false, uint fsaa = 0, const String& fsaaHint = StringUtil::BLANK);
+            TextureUsage = bufferUsage::Usage, autoMipmap::Bool, isTarget::Bool
+    -}
+    createTexture                   :: a -> String -> TextureType -> Int -> Int -> Int -> TextureMipmap -> PixelFormat -> TextureUsage -> Bool -> Int -> String -> Maybe [Image] -> IO t
+    --FIXME: TEMP HACK!!!!!
+    dirtyHackCopyTexImage           :: a -> t -> Int -> Int -> Int -> Int -> IO ()
+    createGpuProgram                :: a -> GpuProgramType -> String -> IO (Either p String) -- TODO
+    createLinkedGpuProgram          :: a -> [p] -> IO (Either lp String) -- TODO
+    getName                         :: a -> String                                  -- ^ Returns the name of the rendering system.
+    createOcclusionQuery            :: a -> IO q                                    -- ^ Create an object for performing hardware occlusion queries. 
+--    destroyOcclusionQuery           :: a -> q -> IO ()                              -- ^ Destroy a hardware occlusion query object. 
+--obsolete    createRenderSystemCapabilities  :: a -> IO RenderSystemCapabilities             -- ^ Query the real capabilities of the GPU and driver in the RenderSystem
+--    reinitialise                    :: a -> IO ()                                   -- ^ Restart the renderer (normally following a change in settings).
+--    shutdown                        :: a -> IO ()                                   -- ^ Shutdown the renderer and cleanup resources.
+    setAmbientLight                 :: a -> Float -> Float -> Float -> IO ()        -- ^ Sets the colour & strength of the ambient (global directionless) light in the world.
+    setShadingType                  :: a -> ShadeOptions -> IO ()                   -- ^ Sets the type of light shading required (default = Gouraud).
+
+    {-| Sets whether or not dynamic lighting is enabled.
+    @param
+    enabled If true, dynamic lighting is performed on geometry with normals supplied, geometry without
+    normals will not be displayed. If false, no lighting is applied and all geometry will be full brightness.
+    -}
+    setLightingEnabled              :: a -> Bool -> IO ()
+
+    {-| Sets whether or not W-buffers are enabled if they are available for this renderer.
+    @param
+    enabled If true and the renderer supports them W-buffers will be used.  If false 
+    W-buffers will not be used even if available.  W-buffers are enabled by default 
+    for 16bit depth buffers and disabled for all other depths.
+    -}
+    setWBufferEnabled               :: a -> Bool -> IO ()
+--    getWBufferEnabled               :: a -> IO Bool                                 -- ^ Returns true if the renderer will try to use W-buffers when avalible.
+
+    {-|	Create a MultiRenderTarget, which is a render target that renders to multiple RenderTextures
+    at once. Surfaces can be bound and unbound at will.
+    This fails if mCapabilities->getNumMultiRenderTargets() is smaller than 2.
+    -}
+    -- TODO: virtual MultiRenderTarget * createMultiRenderTarget(const String & name) = 0; 
+
+    {-| Destroys a render texture -}
+    -- TODO: virtual void destroyRenderTexture(const String& name);
+    {-| Destroys a render target of any sort -}
+    -- TODO: virtual void destroyRenderTarget(const String& name);
+
+    {-| Attaches the passed render target to the render system.
+    -}
+    -- TODO: virtual void attachRenderTarget( RenderTarget &target );
+    {-| Returns a pointer to the render target with the passed name, or NULL if that
+    render target cannot be found.
+    -}
+    -- TODO: virtual RenderTarget * getRenderTarget( const String &name );
+    {-| Detaches the render target with the passed name from the render system and
+    returns a pointer to it.
+    @note
+    If the render target cannot be found, NULL is returned.
+    -}
+    -- TODO: virtual RenderTarget * detachRenderTarget( const String &name );
+
+    -- | Iterator over RenderTargets
+    -- TODO: typedef MapIterator<Ogre::RenderTargetMap> RenderTargetIterator;
+
+    {-| Returns a specialised MapIterator over all render targets attached to the RenderSystem. -}
+    -- TODO: virtual RenderTargetIterator getRenderTargetIterator(void) {
+    -- TODO: 	return RenderTargetIterator( mRenderTargets.begin(), mRenderTargets.end() );
+    -- TODO: }
+
+    {-| Returns a description of an error code.
+    -}
+    -- TODO: virtual String getErrorDescription(long errorNumber) const = 0;
+
+    {-| Defines whether or now fullscreen render windows wait for the vertical blank before flipping buffers.
+    @remarks
+    By default, all rendering windows wait for a vertical blank (when the CRT beam turns off briefly to move
+    from the bottom right of the screen back to the top left) before flipping the screen buffers. This ensures
+    that the image you see on the screen is steady. However it restricts the frame rate to the refresh rate of
+    the monitor, and can slow the frame rate down. You can speed this up by not waiting for the blank, but
+    this has the downside of introducing 'tearing' artefacts where part of the previous frame is still displayed
+    as the buffers are switched. Speed vs quality, you choose.
+    @note
+    Has NO effect on windowed mode render targets. Only affects fullscreen mode.
+    @param
+    enabled If true, the system waits for vertical blanks - quality over speed. If false it doesn't - speed over quality.
+    -}
+    setWaitForVerticalBlank         :: a -> Bool -> IO ()
+--    getWaitForVerticalBlank         :: a -> IO Bool                                 -- ^ Returns true if the system is synchronising frames with the monitor vertical blank.
+
+    -- ------------------------------------------------------------------------
+    --                     Internal Rendering Access
+    -- All methods below here are normally only called by other OGRE classes
+    -- They can be called by library user if required
+    -- ------------------------------------------------------------------------
+
+
+    {-| Tells the rendersystem to use the attached set of lights (and no others) 
+    up to the number specified (this allows the same list to be used with different
+    count limits) -}
+    useLights                      :: a -> [(Matrix4,Light)] -> IO ()
+--    useLights                      :: a -> [Light] -> Int -> IO ()
+    {-| Are fixed-function lights provided in view space? Affects optimisation. 
+    -}
+    -- TODO: virtual bool areFixedFunctionLightsInViewSpace() const { return false; }
+    setWorldMatrix                 :: a -> Matrix4 -> IO ()                        -- ^ Sets the world transform matrix.
+    --_setWorldMatrices               :: a -> [Matrix4] -> Int -> IO ()               -- ^ Sets multiple world matrices (vertex blending).
+    setViewMatrix                  :: a -> Matrix4 -> IO ()                        -- ^ Sets the view transform matrix
+    setProjectionMatrix            :: a -> Matrix4 -> IO ()                        -- ^ Sets the projection transform matrix
+    
+    {-| Sets the surface properties to be used for future rendering.
+    
+    This method sets the the properties of the surfaces of objects
+    to be rendered after it. In this context these surface properties
+    are the amount of each type of light the object reflects (determining
+    it's colour under different types of light), whether it emits light
+    itself, and how shiny it is. Textures are not dealt with here,
+    see the _setTetxure method for details.
+    This method is used by _setMaterial so does not need to be called
+    direct if that method is being used.
+    
+    @param ambient The amount of ambient (sourceless and directionless)
+    light an object reflects. Affected by the colour/amount of ambient light in the scene.
+    @param diffuse The amount of light from directed sources that is
+    reflected (affected by colour/amount of point, directed and spot light sources)
+    @param specular The amount of specular light reflected. This is also
+    affected by directed light sources but represents the colour at the
+    highlights of the object.
+    @param emissive The colour of light emitted from the object. Note that
+    this will make an object seem brighter and not dependent on lights in
+    the scene, but it will not act as a light, so will not illuminate other
+    objects. Use a light attached to the same SceneNode as the object for this purpose.
+    @param shininess A value which only has an effect on specular highlights (so
+    specular must be non-black). The higher this value, the smaller and crisper the
+    specular highlights will be, imitating a more highly polished surface.
+    This value is not constrained to 0.0-1.0, in fact it is likely to
+    be more (10.0 gives a modest sheen to an object).
+    @param tracking A bit field that describes which of the ambient, diffuse, specular
+    and emissive colours follow the vertex colour of the primitive. When a bit in this field is set
+    its ColourValue is ignored. This is a combination of TVC_AMBIENT, TVC_DIFFUSE, TVC_SPECULAR(note that the shininess value is still
+    taken from shininess) and TVC_EMISSIVE. TVC_NONE means that there will be no material property
+    tracking the vertex colours.
+    -}
+    setSurfaceParams               :: a -> ColourValue -> ColourValue -> ColourValue -> ColourValue -> FloatType -> TrackVertexColourType -> IO ()
+
+    {-| Sets whether or not rendering points using OT_POINT_LIST will 
+    render point sprites (textured quads) or plain points.
+    @param enabled True enables point sprites, false returns to normal
+    point rendering.
+    -}	
+    setPointSpritesEnabled         :: a -> Bool -> IO ()
+
+    {-| Sets the size of points and how they are attenuated with distance.
+    @remarks
+    When performing point rendering or point sprite rendering,
+    point size can be attenuated with distance. The equation for
+    doing this is attenuation = 1 / (constant + linear * dist + quadratic * d^2) .
+    @par
+    For example, to disable distance attenuation (constant screensize) 
+    you would set constant to 1, and linear and quadratic to 0. A
+    standard perspective attenuation would be 0, 1, 0 respectively.
+    -}
+    setPointParameters              :: a -> FloatType -> Bool -> FloatType -> FloatType -> FloatType -> FloatType -> FloatType -> IO ()
+
+
+    setActiveTextureUnit            :: a -> Int -> IO ()
+    {-|
+    Sets the texture to bind to a given texture unit.
+
+    User processes would not normally call this direct unless rendering
+    primitives themselves.
+
+    @param unit The index of the texture unit to modify. Multitexturing 
+    hardware can support multiple units (see 
+    RenderSystemCapabilites::getNumTextureUnits)
+    @param enabled Boolean to turn the unit on/off
+    @param texPtr Pointer to the texture to use.
+    -}
+--    setTexture                      :: a -> Int -> Bool -> Maybe t -> IO ()
+    setTexture                      :: a -> Maybe t -> IO ()
+    {-|
+    Sets the texture to bind to a given texture unit.
+
+    User processes would not normally call this direct unless rendering
+    primitives themselves.
+
+    @param unit The index of the texture unit to modify. Multitexturing 
+    hardware can support multiple units (see 
+    RenderSystemCapabilites::getNumTextureUnits)
+    @param enabled Boolean to turn the unit on/off
+    @param texname The name of the texture to use - this should have
+    already been loaded with TextureManager::load.
+    -}
+    --virtual void _setTexture(size_t unit, bool enabled, const String &texname);
+
+    {-| Binds a texture to a vertex sampler.
+    @remarks
+    Not all rendersystems support separate vertex samplers. For those that
+    do, you can set a texture for them, separate to the regular texture
+    samplers, using this method. For those that don't, you should use the
+    regular texture samplers which are shared between the vertex and
+    fragment units; calling this method will throw an exception.
+    @see RenderSystemCapabilites::getVertexTextureUnitsShared
+    -}
+    setVertexTexture               :: a -> Maybe t -> IO ()
+
+    {-|
+    Sets the texture coordinate set to use for a texture unit.
+
+    Meant for use internally - not generally used directly by apps - the Material and TextureUnitState
+    classes let you manage textures far more easily.
+
+    @param unit Texture unit as above
+    @param index The index of the texture coordinate set to use.
+    -}
+--    setTextureCoordSet             :: a -> Int -> Int -> IO ()
+
+    {-|
+    Sets a method for automatically calculating texture coordinates for a stage.
+    Should not be used by apps - for use by Ogre only.
+    @param unit Texture unit as above
+    @param m Calculation method to use
+    @param frustum Optional Frustum param, only used for projective effects
+    -}
+    setTextureCoordCalculation     :: a -> TexCoordCalcMethod{- -> Frustum-} -> IO ()
+
+    {-| Sets the texture blend modes from a TextureUnitState record.
+    Meant for use internally only - apps should use the Material
+    and TextureUnitState classes.
+    @param unit Texture unit as above
+    @param bm Details of the blending mode
+    -}
+    setTextureBlendMode            :: a -> LayerBlendModeEx -> LayerBlendModeEx -> IO ()
+
+    {-| Sets the filtering options for a given texture unit.
+    @param unit The texture unit to set the filtering options for
+    @param minFilter The filter used when a texture is reduced in size
+    @param magFilter The filter used when a texture is magnified
+    @param mipFilter The filter used between mipmap levels, FO_NONE disables mipmapping
+    -}
+    setTextureUnitFiltering        :: a -> TextureType -> FilterOptions -> FilterOptions -> FilterOptions -> IO ()
+
+    {-| Sets a single filter for a given texture unit.
+    @param unit The texture unit to set the filtering options for
+    @param ftype The filter type
+    @param filter The filter to be used
+    -}
+--    setTextureUnitFiltering        :: a -> Int -> FilterType -> FilterOptions -> IO ()
+
+    {-| Sets the maximal anisotropy for the specified texture unit.-}
+    setTextureLayerAnisotropy      :: a -> TextureType -> Int -> IO ()
+
+    {-| Sets the texture addressing mode for a texture unit.-}
+    setTextureAddressingMode       :: a -> TextureType -> UVWAddressingMode -> IO ()
+
+    {-| Sets the texture border colour for a texture unit.-}
+    setTextureBorderColour         :: a -> TextureType -> ColourValue -> IO ()
+
+    {-| Sets the mipmap bias value for a given texture unit.
+    @remarks
+    This allows you to adjust the mipmap calculation up or down for a
+    given texture unit. Negative values force a larger mipmap to be used, 
+    positive values force a smaller mipmap to be used. Units are in numbers
+    of levels, so +1 forces the mipmaps to one smaller level.
+    @note Only does something if render system has capability RSC_MIPMAP_LOD_BIAS.
+    -}
+    setTextureMipmapBias           :: a -> FloatType -> IO ()
+
+    {-| Sets the texture coordinate transformation matrix for a texture unit.
+    @param unit Texture unit to affect
+    @param xform The 4x4 matrix
+    -}
+    setTextureMatrix               :: a -> Matrix4 -> IO ()
+
+    {-| Sets the global blending factors for combining subsequent renders with the existing frame contents.
+    The result of the blending operation is:</p>
+    <p align="center">final = (texture * sourceFactor) + (pixel * destFactor)</p>
+    Each of the factors is specified as one of a number of options, as specified in the SceneBlendFactor
+    enumerated type.
+    By changing the operation you can change addition between the source and destination pixels to a different operator.
+    @param sourceFactor The source factor in the above calculation, i.e. multiplied by the texture colour components.
+    @param destFactor The destination factor in the above calculation, i.e. multiplied by the pixel colour components.
+    @param op The blend operation mode for combining pixels
+    -}
+    setSceneBlending               :: a -> SceneBlendFactor -> SceneBlendFactor -> SceneBlendOperation -> IO ()
+
+    {-| Sets the global blending factors for combining subsequent renders with the existing frame contents.
+    The result of the blending operation is:</p>
+    <p align="center">final = (texture * sourceFactor) + (pixel * destFactor)</p>
+    Each of the factors is specified as one of a number of options, as specified in the SceneBlendFactor
+    enumerated type.
+    @param sourceFactor The source factor in the above calculation, i.e. multiplied by the texture colour components.
+    @param destFactor The destination factor in the above calculation, i.e. multiplied by the pixel colour components.
+    @param sourceFactorAlpha The source factor in the above calculation for the alpha channel, i.e. multiplied by the texture alpha components.
+    @param destFactorAlpha The destination factor in the above calculation for the alpha channel, i.e. multiplied by the pixel alpha components.
+    @param op The blend operation mode for combining pixels
+    @param alphaOp The blend operation mode for combining pixel alpha values
+    -}
+    setSeparateSceneBlending       :: a -> SceneBlendFactor -> SceneBlendFactor -> SceneBlendFactor -> SceneBlendFactor -> SceneBlendOperation -> SceneBlendOperation -> IO ()
+
+    {-| Sets the global alpha rejection approach for future renders.
+    By default images are rendered regardless of texture alpha. This method lets you change that.
+    @param func The comparison function which must pass for a pixel to be written.
+    @param val The value to compare each pixels alpha value to (0-255)
+    @param alphaToCoverage Whether to enable alpha to coverage, if supported
+    -}
+    setAlphaRejectSettings         :: a -> CompareFunction -> Int -> Bool -> IO ()
+
+    {-| Notify the rendersystem that it should adjust texture projection to be 
+    	relative to a different origin.
+    -}
+    -- TODO: virtual void _setTextureProjectionRelativeTo(bool enabled, const Vector3& pos);
+    {-|
+    * Signifies the beginning of a frame, i.e. the start of rendering on a single viewport. Will occur
+    * several times per complete frame if multiple viewports exist.
+    -}
+    -- TODO: virtual void _beginFrame(void) = 0;
+
+
+    {-|
+    * Ends rendering of a frame to the current viewport.
+    -}
+    -- TODO: virtual void _endFrame(void) = 0;
+    {-|
+    Sets the provided viewport as the active one for future
+    rendering operations. This viewport is aware of it's own
+    camera and render target. Must be implemented by subclass.
+
+    @param target Pointer to the appropriate viewport.
+    -}
+    setViewport                     :: a -> Int -> Int -> Int -> Int -> IO ()
+    {-| Get the current active viewport for rendering. -}
+    -- TODO: virtual Viewport* _getViewport(void);
+
+    {-| Sets the culling mode for the render system based on the 'vertex winding'.
+    A typical way for the rendering engine to cull triangles is based on the
+    'vertex winding' of triangles. Vertex winding refers to the direction in
+    which the vertices are passed or indexed to in the rendering operation as viewed
+    from the camera, and will wither be clockwise or anticlockwise (that's 'counterclockwise' for
+    you Americans out there ;) The default is CULL_CLOCKWISE i.e. that only triangles whose vertices
+    are passed/indexed in anticlockwise order are rendered - this is a common approach and is used in 3D studio models
+    for example. You can alter this culling mode if you wish but it is not advised unless you know what you are doing.
+    You may wish to use the CULL_NONE option for mesh data that you cull yourself where the vertex
+    winding is uncertain.
+    -}
+    setCullingMode                  :: a -> CullingMode -> IO ()
+--    getCullingMode                  :: a -> IO CullingMode
+
+    {-| Sets the mode of operation for depth buffer tests from this point onwards.
+    Sometimes you may wish to alter the behaviour of the depth buffer to achieve
+    special effects. Because it's unlikely that you'll set these options for an entire frame,
+    but rather use them to tweak settings between rendering objects, this is an internal
+    method (indicated by the '_' prefix) which will be used by a SceneManager implementation
+    rather than directly from the client application.
+    If this method is never called the settings are automatically the same as the default parameters.
+    @param depthTest If true, the depth buffer is tested for each pixel and the frame buffer is only updated
+    if the depth function test succeeds. If false, no test is performed and pixels are always written.
+    @param depthWrite If true, the depth buffer is updated with the depth of the new pixel if the depth test succeeds.
+    If false, the depth buffer is left unchanged even if a new pixel is written.
+    @param depthFunction Sets the function required for the depth test.
+    -}
+    setDepthBufferParams           :: a -> Bool -> Bool -> CompareFunction -> IO ()
+
+    {-| Sets whether or not the depth buffer check is performed before a pixel write.
+    @param enabled If true, the depth buffer is tested for each pixel and the frame buffer is only updated
+    if the depth function test succeeds. If false, no test is performed and pixels are always written.
+    -}
+    setDepthBufferCheckEnabled     :: a -> Bool -> IO ()
+    {-| Sets whether or not the depth buffer is updated after a pixel write.
+    @param enabled If true, the depth buffer is updated with the depth of the new pixel if the depth test succeeds.
+    If false, the depth buffer is left unchanged even if a new pixel is written.
+    -}
+    setDepthBufferWriteEnabled     :: a -> Bool -> IO ()
+    {-| Sets the comparison function for the depth buffer check.
+    Advanced use only - allows you to choose the function applied to compare the depth values of
+    new and existing pixels in the depth buffer. Only an issue if the deoth buffer check is enabled
+    (see _setDepthBufferCheckEnabled)
+    @param  func The comparison between the new depth and the existing depth which must return true
+    for the new pixel to be written.
+    -}
+    --setDepthBufferFunction         :: a -> CompareFunction -> IO ()
+    setDepthBufferFunction         :: a -> Bool -> CompareFunction -> IO ()
+    {-| Sets whether or not colour buffer writing is enabled, and for which channels. 
+    @remarks
+    For some advanced effects, you may wish to turn off the writing of certain colour
+    channels, or even all of the colour channels so that only the depth buffer is updated
+    in a rendering pass. However, the chances are that you really want to use this option
+    through the Material class.
+    @param red, green, blue, alpha Whether writing is enabled for each of the 4 colour channels. -}
+    setColourBufferWriteEnabled    :: a -> Bool -> Bool -> Bool -> Bool -> IO ()
+    {-| Sets the depth bias, NB you should use the Material version of this. 
+    @remarks
+    When polygons are coplanar, you can get problems with 'depth fighting' where
+    the pixels from the two polys compete for the same screen pixel. This is particularly
+    a problem for decals (polys attached to another surface to represent details such as
+    bulletholes etc.).
+    @par
+    A way to combat this problem is to use a depth bias to adjust the depth buffer value
+    used for the decal such that it is slightly higher than the true value, ensuring that
+    the decal appears on top.
+    @note
+    The final bias value is a combination of a constant bias and a bias proportional
+    to the maximum depth slope of the polygon being rendered. The final bias
+    is constantBias + slopeScaleBias * maxslope. Slope scale biasing is
+    generally preferable but is not available on older hardware.
+    @param constantBias The constant bias value, expressed as a value in 
+    homogeneous depth coordinates.
+    @param slopeScaleBias The bias value which is factored by the maximum slope
+    of the polygon, see the description above. This is not supported by all
+    cards.
+
+    -}
+    setDepthBias                   :: a -> FloatType -> FloatType -> IO ()
+    {-| Sets the fogging mode for future geometry.
+    @param mode Set up the mode of fog as described in the FogMode enum, or set to FOG_NONE to turn off.
+    @param colour The colour of the fog. Either set this to the same as your viewport background colour,
+    or to blend in with a skydome or skybox.
+    @param expDensity The density of the fog in FOG_EXP or FOG_EXP2 mode, as a value between 0 and 1. The default is 1. i.e. completely opaque, lower values can mean
+    that fog never completely obscures the scene.
+    @param linearStart Distance at which linear fog starts to encroach. The distance must be passed
+    as a parametric value between 0 and 1, with 0 being the near clipping plane, and 1 being the far clipping plane. Only applicable if mode is FOG_LINEAR.
+    @param linearEnd Distance at which linear fog becomes completely opaque.The distance must be passed
+    as a parametric value between 0 and 1, with 0 being the near clipping plane, and 1 being the far clipping plane. Only applicable if mode is FOG_LINEAR.
+    -}
+    setFog                         :: a -> FogMode -> ColourValue -> FloatType -> FloatType -> FloatType -> IO ()
+
+    {-| The RenderSystem will keep a count of tris rendered, this resets the count. -}
+    -- TODO: virtual void _beginGeometryCount(void);
+    {-| Reports the number of tris rendered since the last _beginGeometryCount call. -}
+    -- TODO: virtual unsigned int _getFaceCount(void) const;
+    {-| Reports the number of batches rendered since the last _beginGeometryCount call. -}
+    -- TODO: virtual unsigned int _getBatchCount(void) const;
+    {-| Reports the number of vertices passed to the renderer since the last _beginGeometryCount call. -}
+    -- TODO: virtual unsigned int _getVertexCount(void) const;
+
+    {-| Generates a packed data version of the passed in ColourValue suitable for
+    use as with this RenderSystem.
+    @remarks
+    Since different render systems have different colour data formats (eg
+    RGBA for GL, ARGB for D3D) this method allows you to use 1 method for all.
+    @param colour The colour to convert
+    @param pDest Pointer to location to put the result.
+    -}
+    -- TODO: virtual void convertColourValue(const ColourValue& colour, uint32* pDest);
+    {-| Get the native VertexElementType for a compact 32-bit colour value
+    for this rendersystem.
+    -}
+    -- TODO: virtual VertexElementType getColourVertexElementType(void) const = 0;
+
+    {-| Converts a uniform projection matrix to suitable for this render system.
+    @remarks
+    Because different APIs have different requirements (some incompatible) for the
+    projection matrix, this method allows each to implement their own correctly and pass
+    back a generic OGRE matrix for storage in the engine.
+    -}
+    -- TODO: virtual void _convertProjectionMatrix(const Matrix4& matrix,
+	-- TODO:     Matrix4& dest, bool forGpuProgram = false) = 0;
+
+    {-| Builds a perspective projection matrix suitable for this render system.
+    @remarks
+    Because different APIs have different requirements (some incompatible) for the
+    projection matrix, this method allows each to implement their own correctly and pass
+    back a generic OGRE matrix for storage in the engine.
+    -}
+    -- TODO: virtual void _makeProjectionMatrix(const Radian& fovy, Real aspect, Real nearPlane, Real farPlane, 
+	-- TODO:     Matrix4& dest, bool forGpuProgram = false) = 0;
+
+    {-| Builds a perspective projection matrix for the case when frustum is
+    not centered around camera.
+    @remarks
+    Viewport coordinates are in camera coordinate frame, i.e. camera is 
+    at the origin.
+    -}
+    -- TODO: virtual void _makeProjectionMatrix(Real left, Real right, Real bottom, Real top, 
+    -- TODO: 	Real nearPlane, Real farPlane, Matrix4& dest, bool forGpuProgram = false) = 0;
+    {-| Builds an orthographic projection matrix suitable for this render system.
+    @remarks
+    Because different APIs have different requirements (some incompatible) for the
+    projection matrix, this method allows each to implement their own correctly and pass
+    back a generic OGRE matrix for storage in the engine.
+    -}
+    -- TODO: virtual void _makeOrthoMatrix(const Radian& fovy, Real aspect, Real nearPlane, Real farPlane, 
+    -- TODO: 	Matrix4& dest, bool forGpuProgram = false) = 0;
+
+    {-| Update a perspective projection matrix to use 'oblique depth projection'.
+    @remarks
+    This method can be used to change the nature of a perspective 
+    transform in order to make the near plane not perpendicular to the 
+    camera view direction, but to be at some different orientation. 
+    This can be useful for performing arbitrary clipping (e.g. to a 
+    reflection plane) which could otherwise only be done using user
+    clip planes, which are more expensive, and not necessarily supported
+    on all cards.
+    @param matrix The existing projection matrix. Note that this must be a
+    perspective transform (not orthographic), and must not have already
+    been altered by this method. The matrix will be altered in-place.
+    @param plane The plane which is to be used as the clipping plane. This
+    plane must be in CAMERA (view) space.
+    @param forGpuProgram Is this for use with a Gpu program or fixed-function
+    -}
+    -- TODO: virtual void _applyObliqueDepthProjection(Matrix4& matrix, const Plane& plane, 
+    -- TODO: 	bool forGpuProgram) = 0;
+
+    {-| Sets how to rasterise triangles, as points, wireframe or solid polys. -}
+    setPolygonMode                 :: a -> PolygonMode -> IO ()
+
+    {-| Turns stencil buffer checking on or off. 
+    @remarks
+    Stencilling (masking off areas of the rendering target based on the stencil 
+    buffer) can be turned on or off using this method. By default, stencilling is
+    disabled.
+    -}
+    setStencilCheckEnabled          :: a -> Bool -> IO ()
+    {-| Determines if this system supports hardware accelerated stencil buffer. 
+    @remarks
+    Note that the lack of this function doesn't mean you can't do stencilling, but
+    the stencilling operations will be provided in software, which will NOT be
+    fast.
+    @par
+    Generally hardware stencils are only supported in 32-bit colour modes, because
+    the stencil buffer shares the memory of the z-buffer, and in most cards the 
+    z-buffer has to be the same depth as the colour buffer. This means that in 32-bit
+    mode, 24 bits of the z-buffer are depth and 8 bits are stencil. In 16-bit mode there
+    is no room for a stencil (although some cards support a 15:1 depth:stencil option,
+    this isn't useful for very much) so 8 bits of stencil are provided in software.
+    This can mean that if you use stencilling, your applications may be faster in 
+    32-but colour than in 16-bit, which may seem odd to some people.
+    -}
+    {-virtual bool hasHardwareStencil(void) = 0;-}
+
+    {-| This method allows you to set all the stencil buffer parameters in one call.
+    @remarks
+    The stencil buffer is used to mask out pixels in the render target, allowing
+    you to do effects like mirrors, cut-outs, stencil shadows and more. Each of
+    your batches of rendering is likely to ignore the stencil buffer, 
+    update it with new values, or apply it to mask the output of the render.
+    The stencil test is:<PRE>
+    (Reference Value & Mask) CompareFunction (Stencil Buffer Value & Mask)</PRE>
+    The result of this will cause one of 3 actions depending on whether the test fails,
+    succeeds but with the depth buffer check still failing, or succeeds with the
+    depth buffer check passing too.
+    @par
+    Unlike other render states, stencilling is left for the application to turn
+    on and off when it requires. This is because you are likely to want to change
+    parameters between batches of arbitrary objects and control the ordering yourself.
+    In order to batch things this way, you'll want to use OGRE's separate render queue
+    groups (see RenderQueue) and register a RenderQueueListener to get notifications
+    between batches.
+    @par
+    There are individual state change methods for each of the parameters set using 
+    this method. 
+    Note that the default values in this method represent the defaults at system 
+    start up too.
+    @param func The comparison function applied.
+    @param refValue The reference value used in the comparison
+    @param mask The bitmask applied to both the stencil value and the reference value 
+    before comparison
+    @param stencilFailOp The action to perform when the stencil check fails
+    @param depthFailOp The action to perform when the stencil check passes, but the
+    depth buffer check still fails
+    @param passOp The action to take when both the stencil and depth check pass.
+    @param twoSidedOperation If set to true, then if you render both back and front faces 
+    (you'll have to turn off culling) then these parameters will apply for front faces, 
+    and the inverse of them will happen for back faces (keep remains the same).
+    -}
+    setStencilBufferParams          :: a -> CompareFunction -> Word32 -> Word32 -> StencilOperation -> StencilOperation -> StencilOperation -> Bool -> IO ()
+
+
+
+    {-| Sets the current vertex declaration, ie the source of vertex data. -}
+--    setVertexDeclaration            :: a -> VertexDeclaration -> IO ()
+    {-| Sets the current vertex buffer binding state. -}
+--    setVertexBufferBinding          :: a -> VertexBufferBinding vb -> IO ()
+
+    {-| Sets whether or not normals are to be automatically normalised.
+    @remarks
+    This is useful when, for example, you are scaling SceneNodes such that
+    normals may not be unit-length anymore. Note though that this has an
+    overhead so should not be turn on unless you really need it.
+    @par
+    You should not normally call this direct unless you are rendering
+    world geometry; set it on the Renderable because otherwise it will be
+    overridden by material settings. 
+    -}
+    setNormaliseNormals             :: a -> Bool -> IO ()
+
+    {-|
+    Render something to the active viewport.
+
+    Low-level rendering interface to perform rendering
+    operations. Unlikely to be used directly by client
+    applications, since the SceneManager and various support
+    classes will be responsible for calling this method.
+    Can only be called between _beginScene and _endScene
+
+    @param Iteration count
+    @param op A rendering operation instance, which contains
+    details of the operation to be performed.
+    -}
+    render                          :: a -> RenderOperation vb ib -> IO ()
+    bindGeometry                    :: a -> RenderOperation vb ib -> [TextureUnitState t] -> IO ()
+    unbindGeometry                  :: a -> RenderOperation vb ib -> IO ()
+
+    {-| Gets the capabilities of the render system. -}
+    getCapabilities                 :: a -> RenderSystemCapabilities
+
+    {-| Binds a given GpuProgram (but not the parameters). 
+    @remarks Only one GpuProgram of each type can be bound at once, binding another
+    one will simply replace the existing one.
+    -}
+    bindLinkedGpuProgram            :: a -> lp -> IO ()    
+--    bindGpuProgram                  :: a -> GpuProgram -> IO ()
+
+    {-| Bind Gpu program parameters.
+    @param gptype The type of program to bind the parameters to
+    @param params The parameters to bind
+    @param variabilityMask A mask of GpuParamVariability identifying which params need binding
+    -}
+--    bindGpuProgramParameters        :: a -> GpuProgramType -> GpuProgramParameters -> Word16 -> IO ()
+
+    {-| Only binds Gpu program parameters used for passes that have more than one iteration rendering
+    -}
+--    bindGpuProgramPassIterationParameters :: a -> GpuProgramType -> IO ()
+    {-| Unbinds GpuPrograms of a given GpuProgramType.
+    @remarks
+    This returns the pipeline to fixed-function processing for this type.
+    -}
+    unbindLinkedGpuProgram                :: a -> IO ()
+--    unbindGpuProgram                :: a -> GpuProgramType -> IO ()
+
+    {-| Returns whether or not a Gpu program of the given type is currently bound. -}
+--    isGpuProgramBound               :: a -> GpuProgramType -> IO Bool
+
+    {-| Sets the user clipping region.
+    -}
+    -- TODO: virtual void setClipPlanes(const PlaneList& clipPlanes);
+
+    {-| Add a user clipping plane. -}
+    -- TODO: virtual void addClipPlane (const Plane &p);
+    {-| Add a user clipping plane. -}
+    -- TODO: virtual void addClipPlane (Real A, Real B, Real C, Real D);
+
+    {-| Clears the user clipping region.
+    -}
+    -- TODO: virtual void resetClipPlanes();
+
+    {-| Utility method for initialising all render targets attached to this rendering system. -}
+    -- TODO: virtual void _initRenderTargets(void);
+
+    {-| Utility method to notify all render targets that a camera has been removed, 
+    in case they were referring to it as their viewer. 
+    -}
+    -- TODO: virtual void _notifyCameraRemoved(const Camera* cam);
+
+    {-| Internal method for updating all render targets attached to this rendering system. -}
+    -- TODO: virtual void _updateAllRenderTargets(bool swapBuffers = true);
+    {-| Internal method for swapping all the buffers on all render targets,
+    if _updateAllRenderTargets was called with a 'false' parameter. -}
+    -- TODO: virtual void _swapAllRenderTargetBuffers(bool waitForVsync = true);
+
+    {-| Gets whether or not vertex windings set should be inverted; this can be important
+    for rendering reflections. -}
+    -- TODO: virtual bool getInvertVertexWinding(void);
+
+    {-| Sets whether or not vertex windings set should be inverted; this can be important
+    for rendering reflections. -}
+    -- TODO: virtual void setInvertVertexWinding(bool invert);
+    {-| Sets the 'scissor region' ie the region of the target in which rendering can take place.
+    @remarks
+    This method allows you to 'mask off' rendering in all but a given rectangular area
+    as identified by the parameters to this method.
+    @note
+    Not all systems support this method. Check the RenderSystemCapabilities for the
+    RSC_SCISSOR_TEST capability to see if it is supported.
+    @param enabled True to enable the scissor test, false to disable it.
+    @param left, top, right, bottom The location of the corners of the rectangle, expressed in
+    <i>pixels</i>.
+    -}
+    setScissorTest                  :: a -> Bool -> Int -> Int -> Int -> Int -> IO ()
+
+    {-| Clears one or more frame buffers on the active render target. 
+    @param buffers Combination of one or more elements of FrameBufferType
+    denoting which buffers are to be cleared
+    @param colour The colour to clear the colour buffer with, if enabled
+    @param depth The value to initialise the depth buffer with, if enabled
+    @param stencil The value to initialise the stencil buffer with, if enabled.
+    -}
+    clearFrameBuffer                :: a -> FrameBufferType -> ColourValue -> FloatType -> Word16 -> IO ()
+    {-| Returns the horizontal texel offset value required for mapping 
+    texel origins to pixel origins in this rendersystem.
+    @remarks
+    Since rendersystems sometimes disagree on the origin of a texel, 
+    mapping from texels to pixels can sometimes be problematic to 
+    implement generically. This method allows you to retrieve the offset
+    required to map the origin of a texel to the origin of a pixel in
+    the horizontal direction.
+    -}
+    getHorizontalTexelOffset        :: a -> IO FloatType
+    {-| Returns the vertical texel offset value required for mapping 
+    texel origins to pixel origins in this rendersystem.
+    @remarks
+    Since rendersystems sometimes disagree on the origin of a texel, 
+    mapping from texels to pixels can sometimes be problematic to 
+    implement generically. This method allows you to retrieve the offset
+    required to map the origin of a texel to the origin of a pixel in
+    the vertical direction.
+    -}
+    getVerticalTexelOffset          :: a -> IO FloatType
+
+    {-| Gets the minimum (closest) depth value to be used when rendering
+    using identity transforms.
+    @remarks
+    When using identity transforms you can manually set the depth
+    of a vertex; however the input values required differ per
+    rendersystem. This method lets you retrieve the correct value.
+    @see Renderable::getUseIdentityView, Renderable::getUseIdentityProjection
+    -}
+    getMinimumDepthInputValue       :: a -> FloatType
+    {-| Gets the maximum (farthest) depth value to be used when rendering
+    using identity transforms.
+    @remarks
+    When using identity transforms you can manually set the depth
+    of a vertex; however the input values required differ per
+    rendersystem. This method lets you retrieve the correct value.
+    @see Renderable::getUseIdentityView, Renderable::getUseIdentityProjection
+    -}
+    getMaximumDepthInputValue       :: a -> FloatType
+    {-| set the current multi pass count value.  This must be set prior to 
+    calling _render() if multiple renderings of the same pass state are 
+    required.
+    @param count Number of times to render the current state.
+    -}
+    -- TODO: virtual void setCurrentPassIterationCount(const size_t count) { mCurrentPassIterationCount = count; }
+
+    {-| Tell the render system whether to derive a depth bias on its own based on 
+    the values passed to it in setCurrentPassIterationCount.
+    The depth bias set will be baseValue + iteration * multiplier
+    @param derive True to tell the RS to derive this automatically
+    @param baseValue The base value to which the multiplier should be
+    added
+    @param multiplier The amount of depth bias to apply per iteration
+    @param slopeScale The constant slope scale bias for completeness
+    -}
+    -- TODO: virtual void setDeriveDepthBias(bool derive, float baseValue = 0.0f,
+    -- TODO: 	float multiplier = 0.0f, float slopeScale = 0.0f)
+    -- TODO: {
+    -- TODO: 	mDerivedDepthBias = derive;
+    -- TODO: 	mDerivedDepthBiasBase = baseValue;
+    -- TODO: 	mDerivedDepthBiasMultiplier = multiplier;
+    -- TODO: 	mDerivedDepthBiasSlopeScale = slopeScale;
+    -- TODO: }
+
+    {-|
+     * Set current render target to target, enabling its device context if needed
+     -}
+    -- TODO: virtual void _setRenderTarget(RenderTarget *target) = 0;
+
+class (HardwareVertexBuffer vb, HardwareIndexBuffer ib, Texture t, LinkedGpuProgram lp) => Renderable r vb ib t lp | r -> vb ib t lp where
+    prepare :: Matrix4 -> r -> [RenderEntity vb ib t lp]
+
+data (HardwareVertexBuffer vb, HardwareIndexBuffer ib, Texture t, LinkedGpuProgram lp) => RenderEntity vb ib t lp
+    = RenderEntity
+    { reOperation   :: RenderOperation vb ib
+    , rePassList    :: [Pass t lp]
+    , reMatrix      :: Matrix4
+    }
+
+--setPass :: RenderSystem -> Pass -> IO ()
+setPass time rs pass = do
+    let rsc     = getCapabilities rs
+        caps    = rscCapabilities rsc
+        Pass
+            { --psName                     :: String                      -- ^ optional name for the pass
+    
+            -- Colour properties, only applicable in fixed-function passes
+              psAmbient                     = ambient
+            , psDiffuse                     = diffuse
+            , psSpecular                    = specular
+            , psEmissive                    = emissive
+            , psShininess                   = shininess
+            , psTracking                    = vertexColourTracking
+    
+            -- Blending factors
+            , psSourceBlendFactor           = sourceBlendFactor
+            , psDestBlendFactor             = destBlendFactor
+            , psSourceBlendFactorAlpha      = sourceBlendFactorAlpha
+            , psDestBlendFactorAlpha        = destBlendFactorAlpha
+
+            , psSeparateBlend               = separateBlend
+
+            -- Blending operations
+            , psBlendOperation              = blendOperation
+            , psAlphaBlendOperation         = alphaBlendOperation
+            , psSeparateBlendOperation      = separateBlendOperation
+
+            -- Depth buffer settings
+            , psDepthCheck                  = depthCheck
+            , psDepthWrite                  = depthWrite
+            , psDepthFunc                   = depthFunc
+            , psDepthBiasConstant           = depthBiasConstant
+            , psDepthBiasSlopeScale         = depthBiasSlopeScale
+--            , psDepthBiasPerIteration    :: FloatType
+
+            -- Colour buffer settings
+            , psColourWrite                 = colourWrite
+    
+            -- Alpha reject settings
+            , psAlphaRejectFunc             = alphaRejectFunc
+            , psAlphaRejectVal              = alphaRejectVal
+            , psAlphaToCoverageEnabled      = alphaToCoverageEnabled
+        
+--            , psTransparentSorting       :: Bool                        -- ^ Transparent depth sorting
+--            , psTransparentSortingForced :: Bool                        -- ^ Transparent depth sorting forced
+    
+            -- Culling mode
+            , psCullMode                    = cullMode
+--            , psManualCullMode           :: ManualCullingMode
+    
+            , psLightingEnabled             = lightingEnabled
+--            , psMaxSimultaneousLights    :: Int                         -- ^ Max simultaneous lights
+--            , psStartLight               :: Int                         -- ^ Starting light index
+--            , psLightsPerIteration       :: Maybe Int                   -- ^ Run this pass once per light? Iterate per how many lights?
+--            , psOnlyLightType            :: Maybe LightTypes            -- ^ Should it only be run for a certain light type?
+
+            , psShadeOptions                = shadeOptions
+            , psPolygonMode	                = polygonMode
+
+            -- Normalisation
+--            , psNormaliseNormals         :: Bool
+            , psPolygonModeOverrideable     = polygonModeOverrideable
+    
+            -- Fog
+            , psFogOverride                 = fogOverride
+            , psFogMode                     = fogMode
+            , psFogColour                   = fogColour
+            , psFogStart                    = fogStart
+            , psFogEnd                      = fogEnd
+            , psFogDensity                  = fogDensity
+    
+            , psTextureUnitStates           = textureUnitStates
+
+            , psVertexProgramUsage          = vertexProgramUsage
+        --    , psShadowCasterVertexProgramUsage  :: GpuProgramUsage    -- ^ Vertex program details
+        --    , psShadowReceiverVertexProgramUsage    :: GpuProgramUsage  -- ^ Vertex program details
+            , psFragmentProgramUsage        = fragmentProgramUsage
+        --    , psShadowReceiverFragmentProgramUsage  :: GpuProgramUsage  -- ^ Fragment program details
+            , psGeometryProgramUsage        = geometryProgramUsage
+            , psLinkedGpuProgram            = linkedGpuProgram
+        --    , psQueuedForDeletion        :: Bool    -- ^ Is this pass queued for deletion?
+
+--            , psPassIterationCount       :: Int                         -- ^ number of pass iterations to perform
+
+            , psPointSize                   = pointSize
+            , psPointMinSize                = pointMinSize
+            , psPointMaxSize                = pointMaxSize
+            , psPointSpritesEnabled         = pointSpritesEnabled
+            , psPointAttenuationEnabled     = pointAttenuationEnabled
+--            , psPointAttenuationCoeffs   :: FloatType3                  -- ^ constant, linear, quadratic coeffs
+
+            {-
+        		// TU Content type lookups
+        		typedef vector<unsigned short>::type ContentTypeLookup;
+        		mutable ContentTypeLookup mShadowContentTypeLookup;
+        		mutable bool mContentTypeLookupBuilt;
+            -}  
+--            , psLightScissoring          :: Bool                        -- ^ Scissoring for the light?
+--            , psLightClipPlanes          :: Bool                        -- ^ User clip planes for light?
+--            , psIlluminationStage        :: IlluminationStage           -- ^ Illumination stage?
+            } = pass
+    {-
+	if (!mSuppressRenderStateChanges || evenIfSuppressed)
+	{
+		if (mIlluminationStage == IRS_RENDER_TO_TEXTURE && shadowDerivation)
+		{
+			// Derive a special shadow caster pass from this one
+			pass = deriveShadowCasterPass(pass);
+		}
+		else if (mIlluminationStage == IRS_RENDER_RECEIVER_PASS && shadowDerivation)
+		{
+			pass = deriveShadowReceiverPass(pass);
+		}
+
+        // Tell params about current pass
+        mAutoParamDataSource->setCurrentPass(pass);
+
+		bool passSurfaceAndLightParams = true;
+		bool passFogParams = true;
+    -}
+    let passSurfaceAndLightParams = True
+        passFogParams = True
+
+    case linkedGpuProgram of
+        { Nothing   -> unbindLinkedGpuProgram rs
+        ; Just lp   -> bindLinkedGpuProgram rs lp
+        }
+
+    when passSurfaceAndLightParams $ do
+        -- Set surface reflectance properties, only valid if lighting is enabled
+        when lightingEnabled $
+             setSurfaceParams rs ambient diffuse specular emissive shininess vertexColourTracking
+        -- Dynamic lighting enabled?
+        setLightingEnabled rs lightingEnabled
+        
+    when passFogParams $ do
+        -- New fog params can either be from scene or from material
+        -- TODO: implement override 
+        --setFog rs newFogMode newFogColour newFogDensity newFogStart newFogEnd
+        setFog rs fogMode fogColour fogDensity fogStart fogEnd
+    -- TODO
+    {-
+		if (passFogParams)
+		{
+			// New fog params can either be from scene or from material
+			FogMode newFogMode;
+			ColourValue newFogColour;
+			Real newFogStart, newFogEnd, newFogDensity;
+			if (pass->getFogOverride())
+			{
+				// New fog params from material
+				newFogMode = pass->getFogMode();
+				newFogColour = pass->getFogColour();
+				newFogStart = pass->getFogStart();
+				newFogEnd = pass->getFogEnd();
+				newFogDensity = pass->getFogDensity();
+			}
+			else
+			{
+				// New fog params from scene
+				newFogMode = mFogMode;
+				newFogColour = mFogColour;
+				newFogStart = mFogStart;
+				newFogEnd = mFogEnd;
+				newFogDensity = mFogDensity;
+			}
+
+			/* In D3D, it applies to shaders prior
+			to version vs_3_0 and ps_3_0. And in OGL, it applies to "ARB_fog_XXX" in
+			fragment program, and in other ways, them maybe access by gpu program via
+			"state.fog.XXX".
+			*/
+	        mDestRenderSystem->_setFog(
+		        newFogMode, newFogColour, newFogDensity, newFogStart, newFogEnd);
+		}
+
+        // Tell params about ORIGINAL fog
+		// Need to be able to override fixed function fog, but still have
+		// original fog parameters available to a shader than chooses to use
+        mAutoParamDataSource->setFog(
+            mFogMode, mFogColour, mFogDensity, mFogStart, mFogEnd);
+    -}
+
+    -- The rest of the settings are the same no matter whether we use programs or not
+
+    -- Set scene blending
+    case separateBlend of
+        { True  -> setSeparateSceneBlending rs sourceBlendFactor destBlendFactor
+                                               sourceBlendFactorAlpha destBlendFactorAlpha
+                                               blendOperation
+                                               (if separateBlendOperation then blendOperation else alphaBlendOperation)
+        ; False -> case psSeparateBlendOperation pass of
+                    { True  -> setSeparateSceneBlending rs sourceBlendFactor destBlendFactor
+                                                           sourceBlendFactor destBlendFactor
+                                                           blendOperation alphaBlendOperation
+                    ; False -> setSceneBlending rs sourceBlendFactor destBlendFactor blendOperation
+                    }
+        }
+
+    -- Set point parameters
+    let (pac,pal,paq) = psPointAttenuationCoeffs pass -- TODO: refactor
+    setPointParameters rs pointSize pointAttenuationEnabled pac pal paq pointMinSize pointMaxSize
+
+    when (Set.member RSC_POINT_SPRITES caps) $
+        setPointSpritesEnabled rs pointSpritesEnabled
+    
+    -- Texture unit settings
+    -- TODO
+    {-
+		Pass::ConstTextureUnitStateIterator texIter =  pass->getTextureUnitStateIterator();
+		size_t unit = 0;
+		// Reset the shadow texture index for each pass
+		size_t startLightIndex = pass->getStartLight();
+		size_t shadowTexUnitIndex = 0;
+		size_t shadowTexIndex = mShadowTextures.size();
+		if (mShadowTextureIndexLightList.size() > startLightIndex)
+			shadowTexIndex = mShadowTextureIndexLightList[startLightIndex];
+		while(texIter.hasMoreElements())
+		{
+			TextureUnitState* pTex = texIter.getNext();
+			if (!pass->getIteratePerLight() && 
+				isShadowTechniqueTextureBased() && 
+				pTex->getContentType() == TextureUnitState::CONTENT_SHADOW)
+			{
+				// Need to bind the correct shadow texture, based on the start light
+				// Even though the light list can change per object, our restrictions
+				// say that when texture shadows are enabled, the lights up to the
+				// number of texture shadows will be fixed for all objects
+				// to match the shadow textures that have been generated
+				// see Listener::sortLightsAffectingFrustum and
+				// MovableObject::Listener::objectQueryLights
+				// Note that light iteration throws the indexes out so we don't bind here
+				// if that's the case, we have to bind when lights are iterated
+				// in renderSingleObject
+
+				TexturePtr shadowTex;
+				if (shadowTexIndex < mShadowTextures.size())
+				{
+					shadowTex = getShadowTexture(shadowTexIndex);
+					// Hook up projection frustum
+					Camera *cam = shadowTex->getBuffer()->getRenderTarget()->getViewport(0)->getCamera();
+					// Enable projective texturing if fixed-function, but also need to
+					// disable it explicitly for program pipeline.
+					pTex->setProjectiveTexturing(!pass->hasVertexProgram(), cam);
+					mAutoParamDataSource->setTextureProjector(cam, shadowTexUnitIndex);
+				}
+				else
+				{
+					// Use fallback 'null' shadow texture
+					// no projection since all uniform colour anyway
+					shadowTex = mNullShadowTexture;
+					pTex->setProjectiveTexturing(false);
+					mAutoParamDataSource->setTextureProjector(0, shadowTexUnitIndex);
+
+				}
+				pTex->_setTexturePtr(shadowTex);
+
+				++shadowTexIndex;
+				++shadowTexUnitIndex;
+			}
+			else if (mIlluminationStage == IRS_NONE && pass->hasVertexProgram())
+			{
+				// Manually set texture projector for shaders if present
+				// This won't get set any other way if using manual projection
+				TextureUnitState::EffectMap::const_iterator effi = 
+					pTex->getEffects().find(TextureUnitState::ET_PROJECTIVE_TEXTURE);
+				if (effi != pTex->getEffects().end())
+				{
+					mAutoParamDataSource->setTextureProjector(effi->second.frustum, unit);
+				}
+			}
+			mDestRenderSystem->_setTextureUnitSettings(unit, *pTex);
+			++unit;
+		}
+		// Disable remaining texture units
+		mDestRenderSystem->_disableTextureUnitsFrom(pass->getNumTextureUnitStates());
+    -}
+    -- TODO
+    mapM_ (uncurry $ setTextureUnitSettings time rs) $ zip [0..] textureUnitStates
+
+    -- Disable remaining texture units
+    forM_ [(length textureUnitStates)..((rscNumTextureUnits $ getCapabilities rs) - 1)] $ \tu -> do
+        -- TODO: dont disable disabled texunits
+        setActiveTextureUnit rs tu
+        setTexture rs Nothing
+
+    -- Set up non-texture related material settings
+    -- Depth buffer settings
+    --FIXME: high level haskell gl binding handles depth check activation and depth function in one function
+    setDepthBufferFunction rs depthCheck depthFunc
+    {- -- HINT: GL has unified function for this
+        setDepthBufferFunction rs depthFunc
+        setDepthBufferCheckEnabled rs depthCheck
+    -}
+    setDepthBufferWriteEnabled rs depthWrite
+    setDepthBias rs depthBiasConstant depthBiasSlopeScale
+
+    -- Alpha-reject settings
+    setAlphaRejectSettings rs alphaRejectFunc alphaRejectVal alphaToCoverageEnabled
+
+    -- Set colour write mode
+    -- Right now we only use on/off, not per-channel
+    setColourBufferWriteEnabled rs colourWrite colourWrite colourWrite colourWrite
+    -- TODO
+    {-
+		// Culling mode
+		if (isShadowTechniqueTextureBased() 
+			&& mIlluminationStage == IRS_RENDER_TO_TEXTURE
+			&& mShadowCasterRenderBackFaces
+			&& pass->getCullingMode() == CULL_CLOCKWISE)
+		{
+			// render back faces into shadow caster, can help with depth comparison
+			mPassCullingMode = CULL_ANTICLOCKWISE;
+		}
+		else
+		{
+			mPassCullingMode = pass->getCullingMode();
+		}
+    -}
+    -- TODO: calc cull mode according illumination stage
+    setCullingMode rs cullMode
+    -- Shading
+    setShadingType rs shadeOptions
+    
+    -- Polygon mode
+    unless polygonModeOverrideable $
+        setPolygonMode rs polygonMode
+    
+    -- TODO
+    {-
+		// set pass number
+    	mAutoParamDataSource->setPassNumber( pass->getIndex() );
+
+		// mark global params as dirty
+		mGpuParamsDirty |= (uint16)GPV_GLOBAL;
+    -}
+    return ()
+
+{-
+	const TexturePtr& TextureUnitState::_getTexturePtr(size_t frame) const
+	{
+		if (mContentType == CONTENT_NAMED)
+		{
+			if (frame < mFrames.size() && !mTextureLoadFailed)
+			{
+				ensureLoaded(frame);
+				return mFramePtrs[frame];
+			}
+			else
+			{
+				// Silent fail with empty texture for internal method
+				static TexturePtr nullTexPtr;
+				return nullTexPtr;
+			}
+		}
+		else
+		{
+			// Manually bound texture, no name or loading
+			assert(frame < mFramePtrs.size());
+			return mFramePtrs[frame];
+		}
+	}
+-}
+
+{-| Utility function for setting all the properties of a texture unit at once.
+This method is also worth using over the individual texture unit settings because it
+only sets those settings which are different from the current settings for this
+unit, thus minimising render state changes.
+-}
+--setTextureUnitSettings :: RenderSystem a vb ib q t p => a -> Int -> TextureUnitState t -> IO ()
+setTextureUnitSettings time rs texUnit tl = do
+    -- This method is only ever called to set a texture unit to valid details
+    -- The method _disableTextureUnit is called to turn a unit off
+    let rsc     = getCapabilities rs
+        caps    = rscCapabilities rsc
+        TextureUnitState 
+            { tusAnimDuration           = animDuration
+--            , tusCubic                   :: Bool                -- ^ is this a series of 6 2D textures to make up a cube?
+    
+            , tusTextureType            = texType
+--            , tusDesiredFormat           :: PixelFormat
+--            , tusTextureSrcMipmaps       :: Int                 -- ^ Request number of mipmaps
+
+--            , tusTextureCoordSetIndex    :: Int
+            , tusAddressMode            = uvw
+            , tusBorderColour           = borderColour
+
+            , tusColourBlendMode        = colourBlendMode
+--            , tusColourBlendFallbackSrc  :: SceneBlendFactor
+--            , tusColourBlendFallbackDest :: SceneBlendFactor
+
+            , tusAlphaBlendMode         = alphaBlendMode
+        --        mutable bool mTextureLoadFailed;
+        --    , tusTextureLoadFailed       :: Bool
+--            , tusIsAlpha                 :: Bool
+--            , tusHwGamma                 :: Bool
+
+        --        mutable bool mRecalcTexMatrix;
+        --        Real mUMod, mVMod;
+        --        Real mUScale, mVScale;
+        --        Radian mRotate;
+        --        mutable Matrix4 mTexModMatrix;
+
+            , tusMinFilter              = minFilter
+            , tusMagFilter              = magFilter
+            , tusMipFilter              = mipFilter
+
+            , tusMaxAniso               = maxAniso
+            , tusMipmapBias             = mipmapBias
+
+        --        bool mIsDefaultAniso;
+        --        bool mIsDefaultFiltering;
+            , tusBindingType            = bindingType
+--            , tusContentType             :: ContentType      -- ^ Content type of texture (normal loaded texture, auto-texture)
+
+--            , tusFrameNames              :: [String]
+            , tusFrames                 = frames
+--            , tusName                    :: String          -- ^ optional name for the TUS
+--            , tusTextureAlias            :: String          -- ^ optional alias for texture frames
+            , tusEffects                = effects
+            }   = tl
+        texl    = fromMaybe (error "fromJust 12") frames -- TODO: const TexturePtr& tex = tl._getTexturePtr();
+
+    -- Activate TextureUnit
+    setActiveTextureUnit rs texUnit
+    -- Vertex texture binding?
+    unless (null texl) $ do
+        let tex = case animDuration of
+                { Nothing   -> head texl
+                ; Just 0    -> head texl
+                ; Just d    -> texl !! (floor $ (fromIntegral $ length texl) * (snd $ properFraction $ time / d))
+                }
+        case (Set.member RSC_VERTEX_TEXTURE_FETCH caps && (not $ rscVertexTextureUnitsShared rsc)) of
+            { True  -> case bindingType of
+                { BT_VERTEX -> do
+                    -- Bind vertex texture
+                    setVertexTexture rs $ Just tex
+                    -- bind nothing to fragment unit (hardware isn't shared but fragment
+                    -- unit can't be using the same index
+                    setTexture rs Nothing
+                ; _         -> do
+                    -- vice versa
+                    setVertexTexture rs Nothing
+                    setTexture rs $ Just tex
+                }
+            ; False -> do
+                -- Shared vertex / fragment textures or no vertex texture support
+                -- Bind texture (may be blank)
+                setTexture rs $ Just tex
+            }
+    
+    -- Set texture layer filtering
+    setTextureUnitFiltering rs texType minFilter magFilter mipFilter
+
+    -- Set texture layer filtering
+    when (Set.member RSC_ANISOTROPY caps) $
+        setTextureLayerAnisotropy rs texType maxAniso
+
+    -- Set mipmap biasing
+    when (Set.member RSC_MIPMAP_LOD_BIAS caps) $
+        setTextureMipmapBias rs mipmapBias
+
+    -- Set blend modes
+    -- Check to see if blending is supported
+    when (Set.member RSC_BLENDING caps) $ do
+        setTextureBlendMode rs colourBlendMode alphaBlendMode
+        --HINT: Obsolete below, due to stateful behaviour
+        -- Note, colour before alpha is important
+        --setTextureBlendMode rs colourBlendMode 
+        --setTextureBlendMode rs alphaBlendMode
+
+    -- Texture addressing mode
+    setTextureAddressingMode rs texType uvw
+    -- Set texture border colour only if required
+    when (  amU uvw == TAM_BORDER ||
+            amV uvw == TAM_BORDER ||
+            amW uvw == TAM_BORDER ) $
+        setTextureBorderColour rs texType borderColour
+
+    -- Set texture effects
+    -- TODO
+--    mapM_ effects
+    setTextureCoordCalculation rs TEXCALC_NONE
+    forM_ effects $ \ e -> case teType e of
+        { ET_ENVIRONMENT_MAP    -> setTextureCoordCalculation rs TEXCALC_ENVIRONMENT_MAP
+        ; _ -> return ()
+        }
+--    effects
+{-
+        // Set texture effects
+        TextureUnitState::EffectMap::iterator effi;
+        // Iterate over new effects
+        bool anyCalcs = false;
+        for (effi = tl.mEffects.begin(); effi != tl.mEffects.end(); ++effi)
+        {
+            switch (effi->second.type)
+            {
+            case TextureUnitState::ET_ENVIRONMENT_MAP:
+                if (effi->second.subtype == TextureUnitState::ENV_CURVED)
+                {
+                    _setTextureCoordCalculation(texUnit, TEXCALC_ENVIRONMENT_MAP);
+                    anyCalcs = true;
+                }
+                else if (effi->second.subtype == TextureUnitState::ENV_PLANAR)
+                {
+                    _setTextureCoordCalculation(texUnit, TEXCALC_ENVIRONMENT_MAP_PLANAR);
+                    anyCalcs = true;
+                }
+                else if (effi->second.subtype == TextureUnitState::ENV_REFLECTION)
+                {
+                    _setTextureCoordCalculation(texUnit, TEXCALC_ENVIRONMENT_MAP_REFLECTION);
+                    anyCalcs = true;
+                }
+                else if (effi->second.subtype == TextureUnitState::ENV_NORMAL)
+                {
+                    _setTextureCoordCalculation(texUnit, TEXCALC_ENVIRONMENT_MAP_NORMAL);
+                    anyCalcs = true;
+                }
+                break;
+            case TextureUnitState::ET_UVSCROLL:
+			case TextureUnitState::ET_USCROLL:
+			case TextureUnitState::ET_VSCROLL:
+            case TextureUnitState::ET_ROTATE:
+            case TextureUnitState::ET_TRANSFORM:
+                break;
+            case TextureUnitState::ET_PROJECTIVE_TEXTURE:
+                _setTextureCoordCalculation(texUnit, TEXCALC_PROJECTIVE_TEXTURE, 
+                    effi->second.frustum);
+                anyCalcs = true;
+                break;
+            }
+        }
+        // Ensure any previous texcoord calc settings are reset if there are now none
+        if (!anyCalcs)
+        {
+            _setTextureCoordCalculation(texUnit, TEXCALC_NONE);
+        }
+
+        // Change tetxure matrix 
+        _setTextureMatrix(texUnit, tl.getTextureTransform());
+    }
+-}
+    return ()
+{-
+    const Matrix4& TextureUnitState::getTextureTransform() const
+    {
+        if (mRecalcTexMatrix)
+            recalcTextureMatrix();
+        return mTexModMatrix;
+
+    }
+-}
+calcTextureMatrix tus = do
+    return ()
+{-
+    //-----------------------------------------------------------------------
+    void TextureUnitState::recalcTextureMatrix() const
+    {
+        // Assumption: 2D texture coords
+        Matrix4 xform;
+
+        xform = Matrix4::IDENTITY;
+        if (mUScale != 1 || mVScale != 1)
+        {
+            // Offset to center of texture
+            xform[0][0] = 1/mUScale;
+            xform[1][1] = 1/mVScale;
+            // Skip matrix concat since first matrix update
+            xform[0][3] = (-0.5 * xform[0][0]) + 0.5;
+            xform[1][3] = (-0.5 * xform[1][1]) + 0.5;
+        }
+
+        if (mUMod || mVMod)
+        {
+            Matrix4 xlate = Matrix4::IDENTITY;
+
+            xlate[0][3] = mUMod;
+            xlate[1][3] = mVMod;
+
+            xform = xlate * xform;
+        }
+
+        if (mRotate != Radian(0))
+        {
+            Matrix4 rot = Matrix4::IDENTITY;
+            Radian theta ( mRotate );
+            Real cosTheta = Math::Cos(theta);
+            Real sinTheta = Math::Sin(theta);
+
+            rot[0][0] = cosTheta;
+            rot[0][1] = -sinTheta;
+            rot[1][0] = sinTheta;
+            rot[1][1] = cosTheta;
+            // Offset center of rotation to center of texture
+            rot[0][3] = 0.5 + ( (-0.5 * cosTheta) - (-0.5 * sinTheta) );
+            rot[1][3] = 0.5 + ( (-0.5 * sinTheta) + (-0.5 * cosTheta) );
+
+            xform = rot * xform;
+        }
+
+        mTexModMatrix = xform;
+        mRecalcTexMatrix = false;
+
+    }
+-}
diff --git a/Graphics/LambdaCube/RenderSystem/GL.hs b/Graphics/LambdaCube/RenderSystem/GL.hs
new file mode 100644
--- /dev/null
+++ b/Graphics/LambdaCube/RenderSystem/GL.hs
@@ -0,0 +1,13 @@
+module Graphics.LambdaCube.RenderSystem.GL (mkGLRenderSystem,GLEntity,GLRenderEntity,GLVertexBuffer,GLIndexBuffer) where
+
+import Graphics.LambdaCube.Entity
+import Graphics.LambdaCube.RenderSystem
+import Graphics.LambdaCube.RenderSystem.GL.GLRenderSystem
+import Graphics.LambdaCube.RenderSystem.GL.GLVertexBuffer
+import Graphics.LambdaCube.RenderSystem.GL.GLIndexBuffer
+import Graphics.LambdaCube.RenderSystem.GL.GLTexture
+import Graphics.LambdaCube.RenderSystem.GL.GLGpuProgram
+
+type GLEntity = Entity GLVertexBuffer GLIndexBuffer GLTexture GLLinkedGpuProgram
+
+type GLRenderEntity = RenderEntity GLVertexBuffer GLIndexBuffer GLTexture GLLinkedGpuProgram
diff --git a/Graphics/LambdaCube/RenderSystem/GL/GLCapabilities.hs b/Graphics/LambdaCube/RenderSystem/GL/GLCapabilities.hs
new file mode 100644
--- /dev/null
+++ b/Graphics/LambdaCube/RenderSystem/GL/GLCapabilities.hs
@@ -0,0 +1,404 @@
+module Graphics.LambdaCube.RenderSystem.GL.GLCapabilities where
+
+import Data.Set (Set)
+import qualified Data.Set as Set
+
+import Graphics.Rendering.OpenGL (($=))
+import qualified Graphics.Rendering.OpenGL as GL
+
+import Graphics.LambdaCube.Types
+import Graphics.LambdaCube.RenderSystemCapabilities
+
+    {-
+       vendor, renderer, glVersion, glExtensions, shadingLanguageVersion,
+       majorMinor, contextProfile
+vendor :: GettableStateVar String
+renderer :: GettableStateVar String
+glVersion :: GettableStateVar String
+glExtensions :: GettableStateVar [String]
+shadingLanguageVersion :: GettableStateVar String
+
+    = DriverVersion 
+    { dvMajor   :: Int
+    , dvMinor   :: Int
+    , dvRelease :: Int
+    , dvBuild   :: Int
+    }
+    -}
+
+
+--mkRenderSystemCapabilities :: IO RenderSystemCapabilities
+mkGLCapabilities = do
+    vendorS     <- GL.get GL.vendor
+    versionS    <- GL.get GL.glVersion
+    extSList    <- GL.get GL.glExtensions
+    shLngVerS   <- GL.get GL.shadingLanguageVersion
+
+    -- setup driver version
+    {-
+			StringVector tokens = StringUtil::split(mGLSupport->getGLVersion(), ".");
+
+			if (!tokens.empty())
+			{
+				mDriverVersion.major = StringConverter::parseInt(tokens[0]);
+				if (tokens.size() > 1)
+					mDriverVersion.minor = StringConverter::parseInt(tokens[1]);
+				if (tokens.size() > 2)
+					mDriverVersion.release = StringConverter::parseInt(tokens[2]); 
+			}
+			mDriverVersion.build = 0;
+    -}
+    -- setup device name
+    deviceName <- GL.get GL.renderer
+    {-
+		const char* deviceName = (const char*)glGetString(GL_RENDERER);
+		rsc->setDeviceName(deviceName);
+    -}
+    -- setup vendor    
+    let v = words vendorS
+        vendorName = if elem "NVIDIA" v         then GPU_NVIDIA
+                        else if elem "ATI" v    then GPU_ATI
+                        else if elem "Intel" v  then GPU_INTEL
+                        else if elem "S3" v     then GPU_S3
+                        else if elem "Matrox" v then GPU_MATROX
+                        else if elem "3DLabs" v then GPU_3DLABS
+                        else if elem "SiS" v    then GPU_SIS
+                        else GPU_UNKNOWN
+
+    (major,minor) <- GL.get $ GL.majorMinor GL.glVersion
+    -- setup capabilities
+    let ext = Set.fromList extSList
+        glVer a b = major > a || (major >= a && minor >= b)
+        supports s = Set.member s ext
+        driverVersion = DriverVersion major minor 0 0 -- TODO
+        caps0 =
+            [ RSC_FIXED_FUNCTION        -- Supports fixed-function
+            , RSC_SCISSOR_TEST          -- Scissor test is standard in GL 1.2 (is it emulated on some cards though?)
+            , RSC_USER_CLIP_PLANES      -- As are user clipping planes
+            , RSC_VERTEX_FORMAT_UBYTE4  -- UBYTE4 always supported
+            , RSC_INFINITE_FAR_PLANE    -- Infinite far plane always supported
+            , RSC_TEXTURE_3D            -- 3D textures should be supported by GL 1.2, which is our minimum version
+            ]
+        
+        -- Check for hardware mipmapping support.
+        caps1 = if not (glVer 1 4 || supports "GL_SGIS_generate_mipmap") then [] else
+            [RSC_AUTOMIPMAP] -- FIXME
+            {-
+            case vendorName of
+                { GPU_ATI   -> []   -- Apple & Linux ATI drivers have faults in hardware mipmap generation
+                -- The Intel 915G frequently corrupts textures when using hardware mip generation
+    			-- I'm not currently sure how many generations of hardware this affects, 
+    			-- so for now, be safe. 
+                ; GPU_INTEL -> []
+                ; GPU_SIS   -> []   -- SiS chipsets also seem to have problems with this
+                ; _         -> [RSC_AUTOMIPMAP]
+                }
+            -}
+        -- Check for blending support
+        caps2 = if (glVer 1 3 || supports "GL_ARB_texture_env_combine" || supports "GL_EXT_texture_env_combine") then [RSC_BLENDING] else []
+
+    -- Check for Multitexturing support and set number of texture units
+    numTexUnits <- case glVer 1 3 || supports "GL_ARB_multitexture" of
+        { True  -> do
+            GL.TextureUnit mtu <- GL.get GL.maxTextureUnit
+            mtimu <- case supports "GL_ARB_fragment_program" of 
+                { True  -> do
+                    -- Also check GL_MAX_TEXTURE_IMAGE_UNITS_ARB since NV at least
+                    -- only increased this on the FX/6x00 series
+                    GL.get GL.maxTextureImageUnits
+                ; False -> return 0
+                }
+            -- FIXME: enable at becoming hgl binding
+            return mtimu -- $ max mtu (fromIntegral mtimu)
+        ; False -> return 1
+        }
+
+        -- Check for Anisotropy support
+    let caps3 = if (supports "GL_EXT_texture_filter_anisotropic") then [RSC_ANISOTROPY] else []
+
+        -- Check for DOT3 support
+        caps4 = if (glVer 1 3 || supports "GL_ARB_texture_env_dot3" || supports "GL_EXT_texture_env_dot3") then [RSC_DOT3] else []
+
+        -- Check for cube mapping
+        caps5 = if (glVer 1 3 || supports "GL_ARB_texture_cube_map" || supports "GL_EXT_texture_cube_map") then [RSC_CUBEMAPPING] else []
+
+        -- Point sprites
+        caps6 = if (glVer 2 0 || supports "GL_ARB_point_sprite") then [RSC_POINT_SPRITES] else []
+
+        -- Check for point parameters
+        caps7 = if (glVer 1 4) then [RSC_POINT_EXTENDED_PARAMETERS] else []
+        caps8 = if (supports "GL_ARB_point_parameters") then [RSC_POINT_EXTENDED_PARAMETERS_ARB] else []
+        caps9 = if (supports "GL_EXT_point_parameters") then [RSC_POINT_EXTENDED_PARAMETERS_EXT] else []
+
+    -- Check for hardware stencil support and set bit depth
+    stencilBits <- GL.get GL.stencilBits
+    let caps10 = if stencilBits > 0 then [RSC_HWSTENCIL] else []
+
+        caps11 = if not (glVer 1 5 || supports "GL_ARB_vertex_buffer_object") then [] else
+            [RSC_VBO] ++ (if not (supports "GL_ARB_vertex_buffer_object") then [RSC_GL1_5_NOVBO] else [])
+-- TODO: haskell gl binding does not support query for GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB
+{-
+		if(GLEW_ARB_vertex_program)
+		{
+			rsc->setCapability(RSC_VERTEX_PROGRAM);
+
+			// Vertex Program Properties
+			rsc->setVertexProgramConstantBoolCount(0);
+			rsc->setVertexProgramConstantIntCount(0);
+
+			GLint floatConstantCount;
+			glGetProgramivARB(GL_VERTEX_PROGRAM_ARB, GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB, &floatConstantCount);
+			rsc->setVertexProgramConstantFloatCount(floatConstantCount);
+
+			rsc->addShaderProfile("arbvp1");
+			if (GLEW_NV_vertex_program2_option)
+			{
+				rsc->addShaderProfile("vp30");
+			}
+
+			if (GLEW_NV_vertex_program3)
+			{
+				rsc->addShaderProfile("vp40");
+			}
+
+			if (GLEW_NV_vertex_program4)
+			{
+				rsc->addShaderProfile("gp4vp");
+				rsc->addShaderProfile("gpu_vp");
+			}
+		}
+-}
+        (prof1,caps12) = if supports "GL_NV_register_combiners2" && supports "GL_NV_texture_shader" then (["fp20"],[RSC_FRAGMENT_PROGRAM]) else ([],[])
+
+        -- check for ATI fragment shader support
+            -- no boolean params allowed
+            -- no integer params allowed
+            -- only 8 Vector4 constant floats supported
+        (prof2,caps13,fragConstBool,fragConstInt,fragConstFloat) = if supports "GL_ATI_fragment_shader" then (["ps_1_4","ps_1_3","ps_1_2","ps_1_1"],[RSC_FRAGMENT_PROGRAM],0,0,8) else ([],[],0,0,0)
+-- TODO
+------------------------------------------------------------------------------
+{-
+        (prof,cap,fragConstBool,fragConstInt,fragConstFloat) <- case supports "GL_ARB_fragment_program" of
+            { True  -> do
+                -- Fragment Program Properties
+                return ([],[RSC_FRAGMENT_PROGRAM],0,0,)
+            ; False -> ([],[],0,0,0)
+            }
+-}
+{-
+
+		if (GLEW_ARB_fragment_program)
+		{
+			rsc->setCapability(RSC_FRAGMENT_PROGRAM);
+
+			// Fragment Program Properties
+			rsc->setFragmentProgramConstantBoolCount(0);
+			rsc->setFragmentProgramConstantIntCount(0);
+
+			GLint floatConstantCount;
+			glGetProgramivARB(GL_FRAGMENT_PROGRAM_ARB, GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB, &floatConstantCount);
+			rsc->setFragmentProgramConstantFloatCount(floatConstantCount);
+
+			rsc->addShaderProfile("arbfp1");
+			if (GLEW_NV_fragment_program_option)
+			{
+				rsc->addShaderProfile("fp30");
+			}
+
+			if (GLEW_NV_fragment_program2)
+			{
+				rsc->addShaderProfile("fp40");
+			}        
+		}
+-}
+------------------------------------------------------------------------------
+        -- Check if GLSL is supported
+        prof3 = if glVer 2 0 ||
+                (supports "GL_ARB_shading_language_100" 
+                && supports "GL_ARB_shader_objects"
+                && supports "GL_ARB_fragment_shader"
+                && supports "GL_ARB_vertex_shader") then ["glsl"] else []
+-- TODO
+--------------------------------------------------------------------------------------
+        -- Check if geometry shaders are supported
+        {-
+        (cap,prof,boolC,intC,floatC,outVertN) <- case glVer 2 0 && supports "GL_EXT_geometry_shader4" of
+            { True  -> do
+                return ([RSC_GEOMETRY_PROGRAM],["nvgp4","gpu_gp","gp4gp"],0,0,)
+            ; False -> return ([],[],0,0,0,0)
+            }
+        -}
+{-
+		// Check if geometry shaders are supported
+		if (GLEW_VERSION_2_0 &&
+			GLEW_EXT_geometry_shader4)
+		{
+			rsc->setCapability(RSC_GEOMETRY_PROGRAM);
+			rsc->addShaderProfile("nvgp4");
+
+			//Also add the CG profiles
+			rsc->addShaderProfile("gpu_gp");
+			rsc->addShaderProfile("gp4gp");
+
+			rsc->setGeometryProgramConstantBoolCount(0);
+			rsc->setGeometryProgramConstantIntCount(0);
+
+			GLint floatConstantCount;
+			glGetProgramivARB(GL_GEOMETRY_PROGRAM_NV, GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB, &floatConstantCount);
+			rsc->setGeometryProgramConstantFloatCount(floatConstantCount);
+
+			GLint maxOutputVertices;
+			glGetIntegerv(GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT,&maxOutputVertices);
+			rsc->setGeometryProgramNumOutputVertices(maxOutputVertices);
+		}
+-}		
+--------------------------------------------------------------------------------------
+        -- Check if render to vertex buffer (transform feedback in OpenGL)
+        caps14 = if (glVer 2 0 && supports "GL_NV_transform_feedback") then [RSC_HWRENDER_TO_VERTEX_BUFFER] else []
+
+        -- Check for texture compression
+        caps15 = if not (glVer 1 3 || supports "GL_ARB_texture_compression") then [] else
+            [RSC_TEXTURE_COMPRESSION]
+            -- Check for dxt compression
+            --------------------------------------------------------------------------------
+            {-  FIXME: we should disable DXT on (apple && ati && ppc)
+                -- if defined(__APPLE__) && defined(__PPC__)
+                --			// Apple on ATI & PPC has errors in DXT
+                --			if (mGLSupport->getGLVendor().find("ATI") == std::string::npos)
+                -- endif
+            -}
+            --------------------------------------------------------------------------------
+            ++ (if supports "GL_EXT_texture_compression_s3tc" then [RSC_TEXTURE_COMPRESSION_DXT] else [])
+            -- Check for vtc compression
+            ++ (if supports "GL_NV_texture_compression_vtc" then [RSC_TEXTURE_COMPRESSION_VTC] else [])
+
+        -- 2-sided stencil?
+        caps16 = if (glVer 2 0 || supports "GL_EXT_stencil_two_side") then [RSC_TWO_SIDED_STENCIL] else []
+        caps17 = if (glVer 1 4 || supports "GL_EXT_stencil_wrap") then [RSC_STENCIL_WRAP] else []
+
+        -- Check for hardware occlusion support
+        caps18 = case glVer 1 5 || supports "GL_ARB_occlusion_query" of
+            -- Some buggy driver claim that it is GL 1.5 compliant and not support ARB_occlusion_query
+            { True  -> [RSC_HWOCCLUSION] ++ (if not (supports "GL_ARB_occlusion_query") then [RSC_GL1_5_NOHWOCCLUSION] else [])
+            -- Support NV extension too for old hardware
+            ; False -> if supports "GL_NV_occlusion_query" then [RSC_HWOCCLUSION] else []
+            } 
+        -- Check for non-power-of-2 texture support
+        caps19 = if (supports "GL_ARB_texture_non_power_of_two") then [RSC_NON_POWER_OF_2_TEXTURES] else []
+
+        -- Check for Float textures
+        caps20 = if (supports "GL_ATI_texture_float" || supports "GL_ARB_texture_float") then [RSC_TEXTURE_FLOAT] else []
+
+    -- Check for framebuffer object extension
+    (numMTR,caps21) <- case supports "GL_EXT_framebuffer_object" of
+        { True  -> do
+            -- Probe number of draw buffers
+            -- Only makes sense with FBO support, so probe here
+            (n,c) <- case glVer 2 0 || supports "GL_ARB_draw_buffers" || supports "GL_ATI_draw_buffers" of
+                { True  -> do
+                    m <- GL.get GL.maxDrawBuffers
+                    -- Before GL version 2.0, we need to get one of the extensions
+                    let cp = case (glVer 2 0, supports "GL_ARB_draw_buffers", supports "GL_ATI_draw_buffers") of
+                            { (False,True,True)     -> [RSC_FBO_ARB,RSC_FBO_ATI]
+                            ; (False,True,False)    -> [RSC_FBO_ARB]
+                            ; (False,False,True)    -> [RSC_FBO_ATI]
+                            ; _                     -> []
+                            }
+                    -- Set FBO flag for all 3 'subtypes'
+                    return (m,[RSC_MRT_DIFFERENT_BIT_DEPTHS,RSC_FBO] ++ cp)
+                ; False -> return (0,[])
+                }
+            return (n,RSC_HWRENDER_TO_TEXTURE:c)
+        ; False -> do
+            -- TODO
+            ----------------------------------------------
+            {-
+            // Check GLSupport for PBuffer support
+            if(mGLSupport->supportsPBuffers())
+            {
+                // Use PBuffers
+                rsc->setCapability(RSC_HWRENDER_TO_TEXTURE);
+                rsc->setCapability(RSC_PBUFFER);
+            }
+            -}
+            ----------------------------------------------
+            return (0,[])
+        }
+        ------------------------------------------------------
+        -- FIXE: haskell gl binding does not have query for GL_POINT_SIZE_RANGE
+        -- Point size
+    (_,maxPointSize) <- GL.get GL.pointSizeRange
+        {-
+		if (GLEW_VERSION_1_4)
+		{
+    		float ps;
+    		glGetFloatv(GL_POINT_SIZE_MAX, &ps);
+    		rsc->setMaxPointSize(ps);
+		}
+		else
+		{
+			GLint vSize[2];
+			glGetIntegerv(GL_POINT_SIZE_RANGE,vSize);
+			rsc->setMaxPointSize(vSize[1]);
+		}
+        -}
+        -- Point size: Ends here
+        ------------------------------------------------------
+
+        -- Vertex texture fetching
+    (numVertTexUnits,caps22,vertTexUnitsShared) <- case supports "GL_ARB_vertex_shader" of
+        { True  -> do
+            vunits <- GL.get GL.maxVertexTextureImageUnits
+            -- GL always shares vertex and fragment texture units (for now?)
+            return (vunits,if vunits > 0 then [RSC_VERTEX_TEXTURE_FETCH] else [], True)
+        ; False -> return (0,[],False)
+        }
+        
+        -- Mipmap LOD biasing?
+    let caps23 = if (glVer 1 4 || supports "GL_EXT_texture_lod_bias") then [RSC_MIPMAP_LOD_BIAS] else []
+
+        -- Alpha to coverage?
+            -- Alpha to coverage always 'supported' when MSAA is available
+            -- although card may ignore it if it doesn't specifically support A2C
+        caps24 = if (supports "GL_ARB_multisample") then [RSC_ALPHA_TO_COVERAGE] else []
+
+        -- Advanced blending operations
+        caps25 = if (glVer 2 0) then [RSC_ADVANCED_BLEND_OPERATIONS] else []
+    return RenderSystemCapabilities
+        { rscDriverVersion                      = driverVersion
+        , rscVendor                             = vendorName
+    
+--        , rscNumWorldMatrices                   :: Int              -- ^ The number of world matrices available
+        , rscNumTextureUnits                    = fromIntegral numTexUnits
+        , rscStencilBufferBitDepth              = fromIntegral stencilBits
+--        , rscNumVertexBlendMatrices             :: Int
+        , rscCapabilities                       = Set.fromList $ caps0  ++ caps1  ++ caps2  ++ caps3  ++ caps4  ++ caps5  ++ caps6  ++ caps7  ++ caps8  ++ caps9 
+                                                              ++ caps10 ++ caps11 ++ caps12 ++ caps13 ++ caps14 ++ caps15 ++ caps16 ++ caps17 ++ caps18 ++ caps19 
+                                                              ++ caps20 ++ caps21 ++ caps22 ++ caps23 ++ caps24 ++ caps25
+    
+        , rscDeviceName                         = deviceName
+        , rscRenderSystemName                   = "OpenGL Rendering Subsystem"
+-- TODO    
+        , rscVertexProgramConstantFloatCount    = undefined
+        , rscVertexProgramConstantIntCount      = undefined
+        , rscVertexProgramConstantBoolCount     = undefined
+
+        , rscGeometryProgramConstantFloatCount  = undefined
+        , rscGeometryProgramConstantIntCount    = undefined
+        , rscGeometryProgramConstantBoolCount   = undefined
+
+        , rscFragmentProgramConstantFloatCount  = fragConstFloat
+        , rscFragmentProgramConstantIntCount    = fragConstInt
+        , rscFragmentProgramConstantBoolCount   = fragConstBool
+
+        , rscNumMultiRenderTargets              = fromIntegral numMTR
+        , rscMaxPointSize                       = realToFrac maxPointSize
+        , rscNonPOW2TexturesLimited             = False
+        , rscNumVertexTextureUnits              = fromIntegral numVertTexUnits
+        , rscVertexTextureUnitsShared           = vertTexUnitsShared
+-- TODO
+        , rscGeometryProgramNumOutputVertices   = undefined
+
+        , rscSupportedShaderProfiles            = Set.fromList $ prof1 ++ prof2 ++ prof3
+        }
+    
diff --git a/Graphics/LambdaCube/RenderSystem/GL/GLGpuProgram.hs b/Graphics/LambdaCube/RenderSystem/GL/GLGpuProgram.hs
new file mode 100644
--- /dev/null
+++ b/Graphics/LambdaCube/RenderSystem/GL/GLGpuProgram.hs
@@ -0,0 +1,147 @@
+module Graphics.LambdaCube.RenderSystem.GL.GLGpuProgram where
+
+import Data.Either
+
+import System.Log.Logger
+import Graphics.Rendering.OpenGL (($=))
+import qualified Graphics.Rendering.OpenGL as GL
+
+import Graphics.LambdaCube.HardwareVertexBuffer
+import Graphics.LambdaCube.GpuProgram
+import Graphics.LambdaCube.GpuProgramParams
+
+-- Some drivers (e.g. OS X on nvidia) incorrectly determine the attribute binding automatically
+-- and end up aliasing existing built-ins. So avoid! Fixed builtins are: 
+
+--  a  builtin				custom attrib name
+-- ----------------------------------------------
+--	0  gl_Vertex			vertex
+--  1  n/a					blendWeights		
+--	2  gl_Normal			normal
+--	3  gl_Color				colour
+--	4  gl_SecondaryColor	secondary_colour
+--	5  gl_FogCoord			fog_coord
+--  7  n/a					blendIndices
+--	8  gl_MultiTexCoord0	uv0
+--	9  gl_MultiTexCoord1	uv1
+--	10 gl_MultiTexCoord2	uv2
+--	11 gl_MultiTexCoord3	uv3
+--	12 gl_MultiTexCoord4	uv4
+--	13 gl_MultiTexCoord5	uv5
+--	14 gl_MultiTexCoord6	uv6, tangent
+--	15 gl_MultiTexCoord7	uv7, binormal
+getFixedAttributeIndex :: VertexElementSemantic -> Int -> Int
+getFixedAttributeIndex semantic index = case semantic of
+    { VES_POSITION              -> 0
+    ; VES_BLEND_WEIGHTS         -> 1
+    ; VES_NORMAL                -> 2
+    ; VES_DIFFUSE               -> 3
+    ; VES_SPECULAR              -> 4
+    ; VES_BLEND_INDICES         -> 7
+    ; VES_TEXTURE_COORDINATES   -> 8 + index
+    ; VES_TANGENT               -> 14
+    ; VES_BINORMAL              -> 15
+    --; _ -> error "Missing attribute!"
+    }
+
+isAttributeValid :: VertexElementSemantic -> Int -> Bool
+isAttributeValid semantic index = case semantic of
+    { VES_POSITION              -> False
+    ; VES_NORMAL                -> False
+    ; VES_DIFFUSE               -> False
+    ; VES_SPECULAR              -> False
+    ; VES_TEXTURE_COORDINATES   -> False
+    ; VES_BLEND_WEIGHTS         -> True
+    ; VES_BLEND_INDICES         -> True
+    ; VES_BINORMAL              -> True
+    ; VES_TANGENT               -> True
+    }
+{-
+data GLGpuProgram
+    = GLGpuProgram
+    { glgpType                  :: GpuProgramType        -- ^ The type of the program
+    , glgpFilename              :: String                -- ^ The name of the file to load source from (may be blank)
+    , glgpSource                :: String                -- ^ The assembler source of the program (may be blank until file loaded)
+    , glgpLoadFromFile          :: Bool                  -- ^ Whether we need to load source from file or not
+    , glgpSyntaxCode            :: String                -- ^ Syntax code e.g. arbvp1, vs_2_0 etc
+    , glgpSkeletalAnimation     :: Bool                  -- ^ Does this (vertex) program include skeletal animation?
+    , glgpMorphAnimation        :: Bool                  -- ^ Does this (vertex) program include morph animation?
+    , glgpPoseAnimation         :: Int                   -- ^ Does this (vertex) program include pose animation (count of number of poses supported)
+    , glgpVertexTextureFetch    :: Bool                  -- ^ Does this (vertex) program require support for vertex texture fetch?
+    , glgpNeedsAdjacencyInfo    :: Bool                  -- ^ Does this (geometry) program require adjacency information?
+    , glgpDefaultParams         :: GpuProgramParameters  -- ^ The default parameters for use with this object
+    , glgpCompileError          :: Bool                  -- ^ Did we encounter a compilation error?
+
+    , glgpProgramObject         :: GL.Program
+    }
+-}
+data GLGpuProgram
+    = GLGpuProgram
+    { glgpShaderObject          :: Either GL.VertexShader GL.FragmentShader
+    }
+    deriving Eq
+
+data GLLinkedGpuProgram
+    = GLLinkedGpuProgram
+    { gllgpProgramObject        :: GL.Program
+    }
+    deriving Eq
+
+instance LinkedGpuProgram GLLinkedGpuProgram --where
+
+instance GpuProgram GLGpuProgram --where
+--    gpType  = undefined
+
+compileShader src = do
+    [shader] <- GL.genObjectNames 1
+    GL.shaderSource shader $= [src]
+    GL.compileShader shader
+
+    -- TEMP CODE
+    infoLog <- GL.get (GL.shaderInfoLog shader)
+    infoM "ResourceLibrary" $ "infoLog cmp " ++ infoLog
+    ok <- GL.get (GL.compileStatus shader)
+    case ok of
+        { False -> do
+            GL.deleteObjectNames [shader]
+            errl <- GL.get GL.errors
+            return $ Right $ "shader compilation failed: " ++ concat [show c ++ " - " ++ m ++ "\n" | GL.Error c m <- errl]
+        ; True  -> return $ Left shader
+        }
+
+mkGLGpuProgram ptype src = case ptype of
+    { GPT_VERTEX_PROGRAM    -> do
+        debugM "ResourceLibrary" $ "compiling vertex shader: "
+        s <- compileShader src
+        case s of
+            { Right m   -> return $ Right m
+            ; Left sh   -> return $ Left $ GLGpuProgram $ Left sh
+            }
+    ; GPT_FRAGMENT_PROGRAM  -> do
+        debugM "ResourceLibrary" $ "compiling fragment shader: "
+        s <- compileShader src
+        case s of
+            { Right m   -> return $ Right m
+            ; Left sh   -> return $ Left $ GLGpuProgram $ Right sh
+            }
+    ; GPT_GEOMETRY_PROGRAM  -> undefined
+    }
+
+mkGLLinkedGpuProgram :: [GLGpuProgram] -> IO (Either GLLinkedGpuProgram String)
+mkGLLinkedGpuProgram pl = do
+    [p] <- GL.genObjectNames 1
+    let vp = lefts $ map glgpShaderObject pl
+        fp = rights $ map glgpShaderObject pl
+    GL.attachedShaders p $= (vp, fp)
+    GL.linkProgram p
+
+    ok <- GL.get (GL.linkStatus p)
+    infoLog <- GL.get (GL.programInfoLog p)
+    infoM "ResourceLibrary"  $ "infoLog link " ++ infoLog
+    case ok of
+        { False -> do
+            GL.deleteObjectNames [p]
+            errl <- GL.get GL.errors
+            return $ Right $ "GpuProgram linking failed: " ++ concat [show c ++ " - " ++ m ++ "\n" | GL.Error c m <- errl]
+        ; True  -> return $ Left $ GLLinkedGpuProgram p
+        }
diff --git a/Graphics/LambdaCube/RenderSystem/GL/GLIndexBuffer.hs b/Graphics/LambdaCube/RenderSystem/GL/GLIndexBuffer.hs
new file mode 100644
--- /dev/null
+++ b/Graphics/LambdaCube/RenderSystem/GL/GLIndexBuffer.hs
@@ -0,0 +1,142 @@
+module Graphics.LambdaCube.RenderSystem.GL.GLIndexBuffer where
+
+import Data.Word
+import Data.Maybe
+import Foreign.Marshal.Alloc
+import Foreign.Marshal.Utils
+import Foreign.Storable
+import Foreign.C.Types
+import Foreign.Ptr
+import Data.IORef
+import Control.Monad
+
+import Graphics.Rendering.OpenGL (($=))
+import qualified Graphics.Rendering.OpenGL as GL
+
+import Graphics.LambdaCube.RenderSystem
+import Graphics.LambdaCube.HardwareBuffer
+import Graphics.LambdaCube.HardwareIndexBuffer
+import Graphics.LambdaCube.RenderSystem.GL.GLUtils
+
+
+-- | Specialisation of HardwareIndexBuffer for GL
+data GLIndexBuffer
+    = GLIndexBuffer
+    { glibType         :: IndexType
+    , glibNumIndexes   :: Int
+           
+    , glibUsage        :: Usage
+    , glibLockInfo     :: IORef (Maybe (Int,Int,Bool)) -- LockStart LockSize RequireUpdate
+
+    , glibShadowBuffer :: Maybe (Ptr Word8)
+    , glibBufferObject :: Maybe GL.BufferObject
+    }
+    deriving Eq
+    
+instance HardwareIndexBuffer GLIndexBuffer where
+    getIndexType    = glibType
+    getNumIndexes   = glibNumIndexes
+    getIndexSize b  = case getIndexType b of
+        { IT_16BIT -> 2
+        ; IT_32BIT -> 4
+        }
+
+instance HardwareBuffer GLIndexBuffer where
+    getSizeInBytes b    = getIndexSize b * glibNumIndexes b
+    isSystemMemory      = isNothing . glibBufferObject
+    hasShadowBuffer b   = (isJust $ glibShadowBuffer b) && (isJust $ glibBufferObject b)
+    getUsage            = glibUsage
+    isLocked            = glibIsLocked
+    unlock              = glibUnlock
+    lock                = glibLock
+
+glibIsLocked b = do
+    i <- readIORef $ glibLockInfo b
+    return $ isJust i
+
+glibLock a offs len opts = do
+    lockinfo <- readIORef (glibLockInfo a)
+    when (isJust lockinfo) $ error "Cannot lock this buffer, it is already locked!"
+    writeIORef (glibLockInfo a) $ Just (offs,len,opts /= HBL_READ_ONLY)
+    case glibShadowBuffer a of
+        { Just b    -> return $ plusPtr b offs
+        ; Nothing   -> do
+            GL.bindBuffer GL.ElementArrayBuffer $= (glibBufferObject a)
+            -- Discard if required
+            when (opts == HBL_DISCARD) $ GL.bufferData GL.ElementArrayBuffer $= (fromIntegral $ getSizeInBytes a, nullPtr, getGLUsage $ getUsage a)
+            let isWriteOnly = case getUsage a of
+                    { HBU_WRITE_ONLY                        -> True
+                    ; HBU_STATIC_WRITE_ONLY                 -> True
+                    ; HBU_DYNAMIC_WRITE_ONLY                -> True
+                    ; HBU_DYNAMIC_WRITE_ONLY_DISCARDABLE    -> True
+                    ; _                                     -> False
+                    }
+                access = case (isWriteOnly,opts == HBL_READ_ONLY) of
+                    { (False,False) -> GL.ReadWrite
+                    ; (False,True)  -> GL.ReadOnly
+                    ; (True,_)      -> GL.WriteOnly
+                    }
+            mb <- GL.mapBuffer GL.ElementArrayBuffer access
+            case mb of
+                { Just b    -> return $ plusPtr b offs
+                ; Nothing   -> error "Index Buffer: Out of memory"
+                }
+        }
+
+glibUnlock a = do
+    lockinfo <- readIORef (glibLockInfo a)
+    let (lockStart,lockSize,reqUpdate) = case lockinfo of
+            { Just li   -> li
+            ; Nothing   -> error "Cannot unlock this buffer, it is not locked!"
+            }
+    writeIORef (glibLockInfo a) Nothing
+    case glibShadowBuffer a of
+        { Just b    -> when reqUpdate $ do -- If we used the shadow buffer this time...
+            GL.bindBuffer GL.ElementArrayBuffer $= (glibBufferObject a)
+            case lockStart == 0 && lockSize == getSizeInBytes a of
+                { True  -> GL.bufferData GL.ElementArrayBuffer $= (fromIntegral lockSize, b, getGLUsage $ getUsage a)
+                ; False -> GL.bufferSubData GL.ElementArrayBuffer GL.WriteToBuffer (fromIntegral lockStart) (fromIntegral lockSize) b
+                }
+        ; Nothing   -> do
+            GL.bindBuffer GL.ElementArrayBuffer $= (glibBufferObject a)
+            ok <- GL.unmapBuffer GL.ElementArrayBuffer
+            unless ok $ error "Buffer data corrupted, please reload"
+        }
+
+--mkGLIndexBuffer :: RenderSystem rs vb _ _ => rs -> IndexType -> Int -> Usage -> Bool -> IO GLIndexBuffer
+mkGLIndexBuffer rs itype numIndexes usage useShadowBuffer = do
+    let isize = case itype of
+        { IT_16BIT -> 2
+        ; IT_32BIT -> 4
+        }
+    lockinfo <- newIORef Nothing
+    [bufferObject] <- GL.genObjectNames 1
+    GL.bindBuffer GL.ElementArrayBuffer $= Just bufferObject
+    GL.bufferData GL.ElementArrayBuffer $= (fromIntegral $ numIndexes * isize, nullPtr, getGLUsage usage)
+    shadowBuffer <- case useShadowBuffer of
+        { True  -> do
+            b <- mallocBytes $ numIndexes * isize
+            return $ Just b
+        ; False -> return Nothing
+        }
+    return $ GLIndexBuffer
+        { glibType         = itype
+        , glibNumIndexes   = numIndexes
+                
+        , glibUsage        = usage
+        , glibLockInfo     = lockinfo
+
+        , glibShadowBuffer = shadowBuffer
+        , glibBufferObject = Just bufferObject
+        }
+
+rmGLIndexBuffer :: GLIndexBuffer -> IO ()
+rmGLIndexBuffer a = do
+    case glibBufferObject a of
+        { Just b    -> GL.deleteObjectNames [b]
+        ; Nothing   -> return ()
+        }
+    case glibShadowBuffer a of
+        { Just b    -> free b
+        ; Nothing   -> return ()
+        }
diff --git a/Graphics/LambdaCube/RenderSystem/GL/GLOcclusionQuery.hs b/Graphics/LambdaCube/RenderSystem/GL/GLOcclusionQuery.hs
new file mode 100644
--- /dev/null
+++ b/Graphics/LambdaCube/RenderSystem/GL/GLOcclusionQuery.hs
@@ -0,0 +1,37 @@
+module Graphics.LambdaCube.RenderSystem.GL.GLOcclusionQuery where
+
+import Graphics.Rendering.OpenGL (($=))
+import qualified Graphics.Rendering.OpenGL as GL
+
+import Graphics.LambdaCube.HardwareOcclusionQuery
+
+data GLOcclusionQuery
+    = GLOcclusionQuery
+    { gloqQueryObject    :: GL.QueryObject
+    }
+
+instance HardwareOcclusionQuery GLOcclusionQuery where
+    beginOcclusionQuery     = glBeginOcclusionQuery
+    endOcclusionQuery       = glEndOcclusionQuery
+    pullOcclusionQuery      = glPullOcclusionQuery
+--    getLastQuerysPixelcount :: a -> IO Int
+    isStillOutstanding      = glStillOutstanding
+
+mkGLOcclusionQuery = do
+    [q] <- GL.genObjectNames 1
+    return $ GLOcclusionQuery q
+    
+rmGLOcclusionQuery o = do
+    GL.deleteObjectNames [gloqQueryObject o]
+
+glBeginOcclusionQuery o = GL.beginQuery GL.SamplesPassed $ gloqQueryObject o
+    
+glEndOcclusionQuery o = GL.endQuery GL.SamplesPassed
+    
+glPullOcclusionQuery o = do
+    c <- GL.get $ GL.queryResult $ gloqQueryObject o
+    return $ fromIntegral c
+
+glStillOutstanding o = do
+    b <- GL.get $ GL.queryResultAvailable $ gloqQueryObject o
+    return $ not b
diff --git a/Graphics/LambdaCube/RenderSystem/GL/GLRenderSystem.hs b/Graphics/LambdaCube/RenderSystem/GL/GLRenderSystem.hs
new file mode 100644
--- /dev/null
+++ b/Graphics/LambdaCube/RenderSystem/GL/GLRenderSystem.hs
@@ -0,0 +1,1402 @@
+{-# LANGUAGE MultiParamTypeClasses #-}
+module Graphics.LambdaCube.RenderSystem.GL.GLRenderSystem where
+
+import Data.IntMap ((!))
+import qualified Data.Map as Map
+import qualified Data.IntMap as IntMap
+import qualified Data.Set as Set
+import Data.IORef
+import Data.Word
+import Data.Maybe
+import Control.Monad
+import Foreign.C.Types
+import Foreign.Ptr
+
+import Graphics.Rendering.OpenGL (($=))
+import qualified Graphics.Rendering.OpenGL as GL
+
+import Graphics.LambdaCube.Types
+import Graphics.LambdaCube.Common
+import Graphics.LambdaCube.Math
+import Graphics.LambdaCube.BlendMode
+import Graphics.LambdaCube.HardwareBuffer
+import Graphics.LambdaCube.HardwareVertexBuffer
+import Graphics.LambdaCube.HardwareIndexBuffer
+import Graphics.LambdaCube.VertexIndexData
+import Graphics.LambdaCube.RenderOperation
+import Graphics.LambdaCube.Texture
+import Graphics.LambdaCube.TextureUnitState
+import Graphics.LambdaCube.GpuProgram
+import Graphics.LambdaCube.RenderSystemCapabilities
+import Graphics.LambdaCube.RenderSystem
+import Graphics.LambdaCube.RenderSystem.GL.GLGpuProgram
+import Graphics.LambdaCube.RenderSystem.GL.GLTexture
+import Graphics.LambdaCube.RenderSystem.GL.GLVertexBuffer
+import Graphics.LambdaCube.RenderSystem.GL.GLIndexBuffer
+import Graphics.LambdaCube.RenderSystem.GL.GLOcclusionQuery
+import Graphics.LambdaCube.RenderSystem.GL.GLUtils
+import Graphics.LambdaCube.RenderSystem.GL.GLCapabilities
+
+data GLRenderSystem
+    = GLRenderSystem
+    { glrsWorldMatrix   :: IORef (GL.GLmatrix GL.GLfloat)
+    , glrsViewMatrix    :: IORef (GL.GLmatrix GL.GLfloat)
+    , glrsCapabilities  :: RenderSystemCapabilities
+    }
+
+mkGLRenderSystem = do
+    mat <- toGLMatrix $ scal 1
+    worldMat <- newIORef mat
+    viewMat <- newIORef mat
+    cap <- mkGLCapabilities
+
+    -- Initialize OpenGL
+    extSList    <- GL.get GL.glExtensions
+    (major,minor) <- GL.get $ GL.majorMinor GL.glVersion
+    -- setup capabilities
+    let ext = Set.fromList extSList
+        glVer a b = major > a || (major >= a && minor >= b)
+        supports s = Set.member s ext
+
+    when (glVer 1 2) $ do
+        -- Set nicer lighting model -- d3d9 has this by default
+        GL.lightModelColorControl $= GL.SeparateSpecularColor
+        GL.lightModelLocalViewer $= GL.Enabled
+
+    when (glVer 1 4) $ do
+        GL.colorSum $= GL.Enabled
+        GL.dither $= GL.Disabled
+
+    -- Check for FSAA
+    when (supports "GL_ARB_multisample") $ do
+        fsaa <- GL.get GL.sampleBuffers
+        when (fsaa > 0) $ 
+            GL.multisample $= GL.Enabled
+
+    return $ GLRenderSystem
+        { glrsWorldMatrix   = worldMat
+        , glrsViewMatrix    = viewMat
+        , glrsCapabilities  = cap
+        }
+
+glDirtyHackCopyTexImage tex x y w h = do
+    GL.textureBinding GL.Texture2D $= (Just $ gltxTextureObject tex)
+            -- only hint code: glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, 0, 0, 128, 128, 0);
+    GL.copyTexImage2D Nothing 0 GL.RGBA' (GL.Position (fromIntegral x) (fromIntegral y)) (GL.TextureSize2D (fromIntegral w) (fromIntegral h)) 0
+    
+
+instance RenderSystem GLRenderSystem GLVertexBuffer GLIndexBuffer GLOcclusionQuery GLTexture GLGpuProgram GLLinkedGpuProgram where
+    dirtyHackCopyTexImage _         = glDirtyHackCopyTexImage
+    getName _                       = "OpenGL Rendering Subsystem"
+    getCapabilities                 = glrsCapabilities
+    createVertexBuffer              = mkGLVertexBuffer
+    createIndexBuffer               = mkGLIndexBuffer
+    createOcclusionQuery _          = mkGLOcclusionQuery
+    createTexture rs                = mkGLTexture (glrsCapabilities rs)
+    createGpuProgram _              = mkGLGpuProgram
+    createLinkedGpuProgram _        = mkGLLinkedGpuProgram
+    bindLinkedGpuProgram _          = glBindLinkedGpuProgram
+    unbindLinkedGpuProgram _        = glUnBindLinkedGpuProgram
+    render _                        = glRender
+    bindGeometry _                  = glBindGeometry
+    unbindGeometry rs               = glUnBindGeometry (glrsCapabilities rs)
+    setViewport _ x y w h           = glSetViewport x y w h
+    setPolygonMode _ pm             = glSetPolygonMode pm
+    setWorldMatrix                  = glSetWorldMatrix
+    setViewMatrix                   = glSetViewMatrix
+    setProjectionMatrix _ m         = glSetProjectionMatrix m
+    clearFrameBuffer _ b c d s      = glClearFrameBuffer b c d s
+    setShadingType _                = glSetShadingType
+    setCullingMode _                = glSetCullingMode
+    setAlphaRejectSettings rs       = glSetAlphaRejectSettings (glrsCapabilities rs)
+    setDepthBias _                  = glSetDepthBias
+    setDepthBufferWriteEnabled _    = glSetDepthBufferWriteEnabled
+    setDepthBufferFunction _        = glSetDepthBufferFunction  --FIXME
+    setColourBufferWriteEnabled _   = glSetColourBufferWriteEnabled
+    setSurfaceParams _              = glSetSurfaceParams
+    setLightingEnabled _            = glSetLightingEnabled
+    setFog _                        = glSetFog
+    setSceneBlending _              = glSetSceneBlending
+    setSeparateSceneBlending _      = glSetSeparateSceneBlending
+    setPointParameters              = glSetPointParameters
+    setPointSpritesEnabled rs       = glSetPointSpritesEnabled (glrsCapabilities rs)
+    setActiveTextureUnit _          = glSetActiveTextureUnit
+    setTexture _                    = glSetTexture
+    setTextureAddressingMode _      = glSetTextureAddressingMode
+    setTextureUnitFiltering _       = glSetTextureUnitFiltering
+    setTextureLayerAnisotropy _     = glSetTextureLayerAnisotropy
+    setTextureMipmapBias _          = glSetTextureMipmapBias
+    setTextureMatrix _              = glSetTextureMatrix
+    setTextureBorderColour _        = glSetTextureBorderColour
+    setTextureCoordCalculation _    = glSetTextureCoordCalculation
+    setTextureBlendMode rs          = glSetTextureBlendMode (glrsCapabilities rs)
+    getMinimumDepthInputValue _     = -1
+    getMaximumDepthInputValue _     = 1
+
+    
+glSetDepthBias constantBias slopeScaleBias = case constantBias /= 0 || slopeScaleBias /= 0 of
+    { True  -> do
+        GL.polygonOffsetFill    $= GL.Enabled
+        GL.polygonOffsetPoint   $= GL.Enabled
+        GL.polygonOffsetLine    $= GL.Enabled
+        GL.polygonOffset        $= (realToFrac (-slopeScaleBias), realToFrac (-constantBias))
+    ; False -> do
+        GL.polygonOffsetFill    $= GL.Disabled
+        GL.polygonOffsetPoint   $= GL.Disabled
+        GL.polygonOffsetLine    $= GL.Disabled
+    }
+
+glSetViewport x y w h = do
+    let x' = fromIntegral x
+        y' = fromIntegral y
+        w' = fromIntegral w
+        h' = fromIntegral h
+    GL.viewport $= (GL.Position x' y', GL.Size w' h')
+    GL.scissor $= Just (GL.Position x' y', GL.Size w' h') -- Configure the viewport clipping
+
+glSetPolygonMode pm = case pm of
+    { PM_POINTS     -> GL.polygonMode $= (GL.Point,GL.Point)
+    ; PM_WIREFRAME  -> GL.polygonMode $= (GL.Line,GL.Line)
+    ; PM_SOLID      -> GL.polygonMode $= (GL.Fill,GL.Fill)
+    }
+
+glSetWorldMatrix rs m = do
+    worldMat <- toGLMatrix m
+    writeIORef (glrsWorldMatrix rs) worldMat
+    viewMat <- readIORef $ glrsViewMatrix rs
+    GL.matrixMode $= (GL.Modelview 0)
+    GL.matrix (Just (GL.Modelview 0)) $= viewMat
+    GL.multMatrix worldMat
+
+glSetViewMatrix rs m = do
+    viewMat <- toGLMatrix m
+    writeIORef (glrsViewMatrix rs) viewMat
+    worldMat <- readIORef $ glrsWorldMatrix rs
+    GL.matrixMode $= (GL.Modelview 0)
+    GL.matrix (Just (GL.Modelview 0)) $= viewMat
+    GL.multMatrix worldMat
+
+glSetProjectionMatrix m = do
+    mat <- toGLMatrix m
+    GL.matrix (Just GL.Projection) $= mat
+
+glClearFrameBuffer buffers colour depth stencil = do
+    tmpColorMask    <- GL.get GL.colorMask
+    tmpDepthMask    <- GL.get GL.depthMask
+    tmpStencilMask  <- GL.get GL.stencilMask
+    tmpScissor      <- GL.get GL.scissor
+    
+    when (fbtColour buffers) $ do
+        let (r',g',b',a')   = colour
+            (r,g,b,a)       = (f r',f g',f b',f a')
+            f               :: FloatType -> GL.GLclampf
+            f               = realToFrac
+        GL.colorMask $= GL.Color4 GL.Enabled GL.Enabled GL.Enabled GL.Enabled
+        GL.clearColor $= GL.Color4 r g b a
+
+    when (fbtDepth buffers) $ do
+        let f :: FloatType -> GL.GLclampd
+            f  = realToFrac
+        GL.depthMask $= GL.Enabled
+        GL.clearDepth $= f depth
+        
+    when (fbtStencil buffers) $ do
+        let f :: Word16 -> GL.GLint
+            f  = fromIntegral
+        GL.stencilMask $= (maxBound::GL.GLuint)
+        GL.clearStencil $= f stencil
+    
+    view <- GL.get GL.viewport
+    GL.scissor $= Just view
+
+    -- HINT: workaround for a mesa gma bug
+    when (fbtColour buffers) $ GL.clear [GL.ColorBuffer]
+    when (fbtDepth buffers) $ GL.clear [GL.DepthBuffer]
+    when (fbtStencil buffers) $ GL.clear [GL.StencilBuffer]
+    --GL.clear $ map fst $ filter (\(_,b) -> b) $ zip [GL.ColorBuffer, GL.DepthBuffer, GL.StencilBuffer] [fbtColour buffers, fbtDepth buffers, fbtStencil buffers]
+    
+    GL.scissor $= tmpScissor
+
+    GL.depthMask    $= tmpDepthMask
+    GL.colorMask    $= tmpColorMask
+    GL.stencilMask  $= tmpStencilMask
+    
+
+--glBindGeometry :: (HardwareVertexBuffer vb, HardwareIndexBuffer ib) => RenderOperation vb ib -> IO ()
+--glBindGeometry :: RenderOperation GLVertexBuffer GLIndexBuffer -> IO ()
+glBindGeometry ro tl = do
+    let multitexturing  = True -- 1 < (rscNumTextureUnits rcap)
+        vertexData      = roVertexData ro
+        decl            = vdVertexDeclaration vertexData
+        checkBinding e  = case vdVertexBufferBinding vertexData of
+                            VertexBufferBinding bm -> veSource e `IntMap.member` bm
+    --  bind vertex elements
+    mapM_ (bindElement ro tl) $ filter checkBinding $ vdElementList decl
+
+    when multitexturing $ GL.clientActiveTexture $= GL.TextureUnit 0
+    --  bind index data and call draw operation
+    case roIndexData ro of 
+        { Just indexData    -> do
+            let indexBuffer = idIndexBuffer indexData
+            GL.bindBuffer GL.ElementArrayBuffer $= glibBufferObject indexBuffer
+        ; Nothing           -> return ()
+        }
+
+--glUnBindGeometry :: RenderOperation GLVertexBuffer GLIndexBuffer -> IO ()
+glUnBindGeometry rsc ro = do
+    let multitexturing  = True -- 1 < (rscNumTextureUnits rcap)
+        f :: Int -> GL.GLuint
+        f = fromIntegral
+    
+    GL.clientState  GL.VertexArray $= GL.Disabled
+
+    -- only valid up to GL_MAX_TEXTURE_UNITS, which is recorded in mFixedFunctionTextureUnits
+    case multitexturing of
+        { True  -> do
+            forM_ [0..(rscNumTextureUnits rsc - 1)] $ \stage -> do
+                GL.clientActiveTexture $= (GL.TextureUnit $ f stage)
+                GL.clientState GL.TextureCoordArray $= GL.Disabled
+            GL.clientActiveTexture $= GL.TextureUnit 0
+        ; False -> GL.clientState GL.TextureCoordArray $= GL.Disabled
+        }
+    GL.clientState GL.NormalArray           $= GL.Disabled
+    GL.clientState GL.ColorArray            $= GL.Disabled
+    GL.clientState GL.SecondaryColorArray   $= GL.Disabled
+
+    -- unbind any custom attributes
+    {-
+    for (vector<GLuint>::type::iterator ai = attribsBound.begin(); ai != attribsBound.end(); ++ai)
+    {
+    	glDisableVertexAttribArrayARB(*ai); 
+    }
+    -}
+    
+    -- unbind buffers
+    GL.bindBuffer GL.ElementArrayBuffer $= Nothing
+    GL.bindBuffer GL.ArrayBuffer $= Nothing
+
+-- _render :: RenderSystemCapabilities -> RenderOperation -> IO ()
+--glRender :: Int -> GLRenderState -> RenderOperation -> IO GLRenderState
+--glRender :: (HardwareVertexBuffer vb, HardwareIndexBuffer ib) => Int -> RenderOperation vb ib -> IO ()
+glRender :: RenderOperation GLVertexBuffer GLIndexBuffer -> IO ()
+glRender ro = do
+    -- TODO:
+    --  calculate statistics
+    {-
+        -- Update stats
+        size_t val;
+
+        if (op.useIndexes)
+            val = op.indexData->indexCount;
+        else
+            val = op.vertexData->vertexCount;
+
+        -- account for a pass having multiple iterations
+        if (mCurrentPassIterationCount > 1)
+            val *= mCurrentPassIterationCount;
+		mCurrentPassIterationNum = 0;
+
+        switch(op.operationType)
+        {
+		case RenderOperation::OT_TRIANGLE_LIST:
+            mFaceCount += val / 3;
+            break;
+        case RenderOperation::OT_TRIANGLE_STRIP:
+        case RenderOperation::OT_TRIANGLE_FAN:
+            mFaceCount += val - 2;
+            break;
+	    case RenderOperation::OT_POINT_LIST:
+	    case RenderOperation::OT_LINE_LIST:
+	    case RenderOperation::OT_LINE_STRIP:
+	        break;
+	    }
+
+        mVertexCount += op.vertexData->vertexCount;
+        mBatchCount += mCurrentPassIterationCount;
+
+		-- sort out clip planes
+		-- have to do it here in case of matrix issues
+		if (mClipPlanesDirty)
+		{
+			setClipPlanesImpl(mClipPlanes);
+			mClipPlanesDirty = false;
+		}
+    -}
+        -- TODO
+    let vertexData      = roVertexData ro
+        multitexturing  = True -- 1 < (rscNumTextureUnits rcap)
+        --Use adjacency if there is a geometry program and it requested adjacency info
+        -- TODO
+        --bool useAdjacency = (mGeometryProgramBound && mCurrentGeometryProgram->isAdjacencyInfoRequired());
+        primType        = case roOperationType ro of -- Find the correct type to render
+            { OT_POINT_LIST     -> GL.Points
+            ; OT_LINE_LIST      -> GL.Lines
+            ; OT_LINE_STRIP     -> GL.LineStrip
+            ; OT_TRIANGLE_LIST  -> GL.Triangles
+            ; OT_TRIANGLE_STRIP -> GL.TriangleStrip
+            ; OT_TRIANGLE_FAN   -> GL.TriangleFan
+            }
+        {-
+		GLint primType;
+		switch (op.operationType)
+		{
+		case RenderOperation::OT_POINT_LIST:
+			primType = GL_POINTS;
+			break;
+		case RenderOperation::OT_LINE_LIST:
+			primType = useAdjacency ? GL_LINES_ADJACENCY_EXT : GL_LINES;
+			break;
+		case RenderOperation::OT_LINE_STRIP:
+			primType = useAdjacency ? GL_LINE_STRIP_ADJACENCY_EXT : GL_LINE_STRIP;
+			break;
+		default:
+		case RenderOperation::OT_TRIANGLE_LIST:
+			primType = useAdjacency ? GL_TRIANGLES_ADJACENCY_EXT : GL_TRIANGLES;
+			break;
+		case RenderOperation::OT_TRIANGLE_STRIP:
+			primType = useAdjacency ? GL_TRIANGLE_STRIP_ADJACENCY_EXT : GL_TRIANGLE_STRIP;
+			break;
+		case RenderOperation::OT_TRIANGLE_FAN:
+			primType = GL_TRIANGLE_FAN;
+			break;
+		}
+        -}
+    
+    --  bind index data and call draw operation
+    case roIndexData ro of 
+    { Just indexData  -> do
+        let indexBuffer = idIndexBuffer indexData
+            dp          = if isJust $ glibBufferObject indexBuffer then nullPtr else fromMaybe (error "fromJust 7") $ glibShadowBuffer indexBuffer
+            pBufferData = plusPtr dp $ idIndexStart indexData * getIndexSize indexBuffer
+            indexType   = if getIndexType indexBuffer == IT_16BIT then GL.UnsignedShort else GL.UnsignedInt
+        GL.drawElements primType (fromIntegral (idIndexCount indexData)) indexType pBufferData
+    ; Nothing -> do
+        GL.drawArrays primType 0 (fromIntegral (vdVertexCount vertexData))
+    }
+    
+--    GL.color $ GL.Color4 1 1 1 (1 :: GL.GLfloat)
+--    GL.secondaryColor $ GL.Color3 0 0 (0 :: GL.GLfloat)
+    return ()
+{-
+    bool RenderSystem::updatePassIterationRenderState(void)
+    {
+        if (mCurrentPassIterationCount <= 1)
+            return false;
+
+        --mCurrentPassIterationCount;
+		++mCurrentPassIterationNum;
+        if (!mActiveVertexGpuProgramParameters.isNull())
+        {
+            mActiveVertexGpuProgramParameters->incPassIterationNumber();
+            bindGpuProgramPassIterationParameters(GPT_VERTEX_PROGRAM);
+        }
+        if (!mActiveGeometryGpuProgramParameters.isNull())
+        {
+            mActiveGeometryGpuProgramParameters->incPassIterationNumber();
+            bindGpuProgramPassIterationParameters(GPT_GEOMETRY_PROGRAM);
+        }
+        if (!mActiveFragmentGpuProgramParameters.isNull())
+        {
+            mActiveFragmentGpuProgramParameters->incPassIterationNumber();
+            bindGpuProgramPassIterationParameters(GPT_FRAGMENT_PROGRAM);
+        }
+        return true;
+    }
+
+-}
+
+bindElement rop tl elem = do
+    let vertexData      = roVertexData $ rop
+
+    case vdVertexBufferBinding vertexData of
+        VertexBufferBinding bm -> let vertexBuffer = bm ! (veSource elem) in do
+            dp <- case glvbBufferObject vertexBuffer of
+                { Just b    -> do
+                    GL.bindBuffer GL.ArrayBuffer $= Just b
+                    return nullPtr  
+                ; Nothing   -> return $ fromMaybe (error "fromJust 8") $ glvbShadowBuffer vertexBuffer
+                }
+            let pBufferData     = plusPtr dp $ vdVertexStart vertexData * getVertexSize vertexBuffer + veOffset elem
+                sem             = veSemantic elem
+                isCustomAttrib  = False
+                bindArray t     = do
+                    GL.arrayPointer t $= GL.VertexArrayDescriptor (fromIntegral . getTypeCount . veType $ elem) (getGLType . veType $ elem) (fromIntegral . getVertexSize $ vertexBuffer) pBufferData
+                    GL.clientState  t $= GL.Enabled
+                {-
+                		if (mCurrentVertexProgram)
+                			isCustomAttrib = mCurrentVertexProgram->isAttributeValid(sem, elem->getIndex());
+                -}
+            --bind vertexBuffer
+            case isCustomAttrib of
+                { True  -> do
+                            -- Custom attribute support
+                            -- tangents, binormals, blendweights etc always via this route
+                            -- builtins may be done this way too
+                            let attrib = GL.AttribLocation . fromIntegral . getFixedAttributeIndex sem $ veIndex elem
+                            GL.vertexAttribPointer attrib $= (GL.KeepIntegral,GL.VertexArrayDescriptor (fromIntegral . getTypeCount . veType $ elem) (getGLType . veType $ elem) (fromIntegral . getVertexSize $ vertexBuffer) pBufferData)
+                            GL.vertexAttribArray attrib $= GL.Enabled
+                            --attribsBound.push_back(attrib);
+                ; False -> case sem of -- fixed-function & builtin attribute support
+                            { VES_POSITION              -> bindArray GL.VertexArray
+                            ; VES_NORMAL                -> bindArray GL.NormalArray
+                            ; VES_DIFFUSE               -> bindArray GL.ColorArray
+                            ; VES_SPECULAR              -> bindArray GL.SecondaryColorArray
+                            ; VES_TEXTURE_COORDINATES   -> do
+                            -- TODO
+                                let idx = veIndex elem
+                                    tus = map fst $ filter (\(_,a)-> idx==a) $ zip [0..] $ map tusTextureCoordSetIndex tl
+                                    f :: Int -> GL.GLuint
+                                    f = fromIntegral
+                                forM_ tus $ \tidx -> do
+                                    --print $ "bind stage="++show tidx ++ " texcoord="++show idx
+                                    GL.clientActiveTexture $= (GL.TextureUnit $ f tidx)
+                                    bindArray GL.TextureCoordArray
+                            -- TEMP CODE
+{-          
+                				if (mCurrentVertexProgram)
+                				{
+                					-- Programmable pipeline - direct UV assignment
+                					glClientActiveTextureARB(GL_TEXTURE0 + elem->getIndex());
+                					glTexCoordPointer(
+                						VertexElement::getTypeCount(elem->getType()), 
+                						GLBufferManager::getGLType(elem->getType()),
+                						static_cast<GLsizei>(vertexBuffer->getVertexSize()), 
+                						pBufferData);
+                					glEnableClientState( GL_TEXTURE_COORD_ARRAY );
+                				}
+                				else
+                				{
+                					-- fixed function matching to units based on tex_coord_set
+                					for (i = 0; i < mDisabledTexUnitsFrom; i++)
+                					{
+                						-- Only set this texture unit's texcoord pointer if it
+                						-- is supposed to be using this element's index
+                						if (mTextureCoordIndex[i] == elem->getIndex() && i < mFixedFunctionTextureUnits)
+                						{
+                							if (multitexturing)
+                							glClientActiveTextureARB(GL_TEXTURE0 + i);
+                							glTexCoordPointer(
+                								VertexElement::getTypeCount(elem->getType()), 
+                								GLBufferManager::getGLType(elem->getType()),
+                								static_cast<GLsizei>(vertexBuffer->getVertexSize()), 
+                								pBufferData);
+                							glEnableClientState( GL_TEXTURE_COORD_ARRAY );
+                						}
+                					}
+                				}
+-}            
+                            }
+                }
+
+
+glSetShadingType so = case so of
+    { SO_FLAT   -> GL.shadeModel $= GL.Flat
+    ; _         -> GL.shadeModel $= GL.Smooth
+    }
+
+glSetAlphaRejectSettings rsc func value alphaToCoverage = do
+    let caps    = rscCapabilities rsc
+        f       :: Int -> GL.GLclampf
+        f       = fromIntegral
+    case func == CMPF_ALWAYS_PASS of
+        { True  -> do
+            GL.alphaFunc $= Nothing
+            GL.sampleAlphaToCoverage $= GL.Disabled
+        ; False -> do
+            GL.alphaFunc $= Just (convertCompareFunction func, f value / 255)
+            let f x = case x of
+                    { True  -> GL.Enabled
+                    ; False -> GL.Disabled
+                    } 
+            when (Set.member RSC_ALPHA_TO_COVERAGE caps) $ 
+                GL.sampleAlphaToCoverage $= f alphaToCoverage
+        }
+
+glSetDepthBufferWriteEnabled enabled = case enabled of
+    { True  -> GL.depthMask $= GL.Enabled
+    ; False -> GL.depthMask $= GL.Disabled
+    }
+
+glSetDepthBufferFunction enabled func = do
+    GL.depthFunc $= if enabled then Just $ convertCompareFunction func else Nothing
+--FIXME: gl haskell binding has unified api for depthFunc 
+--glSetDepthBufferCheckEnabled enabled = case enabled of 
+
+glSetPointSpritesEnabled rsc enabled = do
+    case enabled of
+        { True  -> GL.pointSprite $= GL.Enabled
+        ; False -> GL.pointSprite $= GL.Disabled
+        }
+    --FIXME: Haskell GL bininding does not support these
+    {-
+    let maxTex    = rscNumTextureUnits rsc
+    a <- GL.get GL.activeTexture
+    -- Set sprite texture coord generation
+    -- Don't offer this as an option since D3D links it to sprite enabled
+    for (ushort i = 0; i < mFixedFunctionTextureUnits; ++i)
+    {
+        activateGLTextureUnit(i);
+        glTexEnvi(GL_POINT_SPRITE, GL_COORD_REPLACE, 
+            enabled ? GL_TRUE : GL_FALSE);
+    }
+    GL.activeTexture $= a
+    -}
+
+glSetSceneBlending sourceFactor destFactor op = do
+    case sourceFactor == SBF_ONE && destFactor == SBF_ZERO of
+        { True  -> GL.blend $= GL.Disabled
+        ; False -> do
+            GL.blend $= GL.Enabled
+            GL.blendFunc $= (getBlendMode sourceFactor, getBlendMode destFactor)
+        }
+    GL.blendEquation $= getBlendEquation op
+    -- FIXME
+    {-
+		if(GLEW_VERSION_1_4 || GLEW_ARB_imaging)
+        {
+			glBlendEquation(func);
+		}
+		else if(GLEW_EXT_blend_minmax && (func == GL_MIN || func == GL_MAX))
+        {
+			glBlendEquationEXT(func);
+		}
+    -}
+
+glSetSurfaceParams ambient diffuse specular emissive shininess (TrackVertexColourType a d s e) = do
+    -- Track vertex colour
+    -- There are actually 15 different combinations for tracking, of which
+    -- GL only supports the most used 5. This means that we have to do some
+    -- magic to find the best match. NOTE: 
+    --  GL_AMBIENT_AND_DIFFUSE != GL_AMBIENT | GL__DIFFUSE
+    case (a,d,s,e) of
+        { (False,False,False,False) -> GL.colorMaterial $= Nothing
+        ; (True,True,_,_)           -> GL.colorMaterial $= Just (GL.FrontAndBack,GL.AmbientAndDiffuse)
+        ; (True,False,_,_)          -> GL.colorMaterial $= Just (GL.FrontAndBack,GL.Ambient)
+        ; (_,True,_,_)              -> GL.colorMaterial $= Just (GL.FrontAndBack,GL.Diffuse)
+        ; (_,_,True,_)              -> GL.colorMaterial $= Just (GL.FrontAndBack,GL.Specular)
+        ; (_,_,_,True)              -> GL.colorMaterial $= Just (GL.FrontAndBack,GL.Emission)
+        }        
+    let f           = realToFrac
+        c (r,g,b,a) = GL.Color4 (f r) (f g) (f b) (f a)
+    GL.materialDiffuse   GL.FrontAndBack $= c diffuse
+    GL.materialAmbient   GL.FrontAndBack $= c ambient
+    GL.materialSpecular  GL.FrontAndBack $= c specular
+    GL.materialEmission  GL.FrontAndBack $= c emissive
+    GL.materialShininess GL.FrontAndBack $= f shininess
+
+glSetLightingEnabled enabled = case enabled of
+    { True  -> GL.lighting $= GL.Enabled
+    ; False -> GL.lighting $= GL.Disabled
+    }
+
+glSetFog mode colour density start end = do
+    let c (r,g,b,a) = GL.Color4 (realToFrac r) (realToFrac g) (realToFrac b) (realToFrac a)
+    case mode of
+        { FOG_NONE  -> do
+            GL.fog      $= GL.Disabled
+        ; FOG_EXP   -> do
+            GL.fog      $= GL.Enabled
+            GL.fogMode  $= (GL.Exp $ realToFrac density)
+            GL.fogColor $= c colour
+        ; FOG_EXP2  -> do
+            GL.fog      $= GL.Enabled
+            GL.fogMode  $= (GL.Exp2 $ realToFrac density)
+            GL.fogColor $= c colour
+        ; FOG_LINEAR-> do
+            GL.fog      $= GL.Enabled
+            GL.fogMode  $= (GL.Linear (realToFrac start) (realToFrac end))
+            GL.fogColor $= c colour
+        }
+
+glSetSeparateSceneBlending sourceFactor destFactor sourceFactorAlpha destFactorAlpha op alphaOp = do
+    case sourceFactor == SBF_ONE && destFactor == SBF_ZERO && 
+            sourceFactorAlpha == SBF_ONE && destFactorAlpha == SBF_ZERO of
+        { True  -> GL.blend $= GL.Disabled
+        ; False -> do
+            let f = getBlendMode
+            GL.blend $= GL.Enabled
+            GL.blendFuncSeparate $= ((f sourceFactor, f sourceFactorAlpha), (f destFactor, f destFactorAlpha))
+        }
+    GL.blendEquationSeparate $= (getBlendEquation op, getBlendEquation alphaOp)
+--FIXME: gl binding does not access these
+{-
+		if(GLEW_VERSION_2_0) {
+			glBlendEquationSeparate(func, alphaFunc);
+		}
+		else if(GLEW_EXT_blend_equation_separate) {
+			glBlendEquationSeparateEXT(func, alphaFunc);
+		}
+-}
+
+glSetPointParameters rs size attenuationEnabled constant linear quadratic minSize maxSize = do
+    let rsc     = getCapabilities rs
+        caps    = rscCapabilities rsc
+    (size',minSize',maxSize',constant',linear',quadratic') <- case attenuationEnabled of
+        { True  -> do
+            -- Point size is still calculated in pixels even when attenuation is
+            -- enabled, which is pretty awkward, since you typically want a viewport
+            -- independent size if you're looking for attenuation.
+            -- So, scale the point size up by viewport size (this is equivalent to
+            -- what D3D does as standard)
+
+            -- TODO
+        {-
+			size = size * mActiveViewport->getActualHeight();
+			minSize = minSize * mActiveViewport->getActualHeight();
+			if (maxSize == 0.0f)
+				maxSize = mCurrentCapabilities->getMaxPointSize(); // pixels
+			else
+				maxSize = maxSize * mActiveViewport->getActualHeight();
+        -}
+            when (Set.member RSC_VERTEX_PROGRAM caps) $ GL.vertexProgramPointSize $= GL.Enabled
+            -- XXX: why do I need this for results to be consistent with D3D?
+            -- Equations are supposedly the same once you factor in vp height
+            let correction = 0.005
+            return (size,minSize,if maxSize == 0 then rscMaxPointSize rsc else maxSize,constant,linear * correction,quadratic * correction)
+        ; False -> do
+            when (Set.member RSC_VERTEX_PROGRAM caps) $ GL.vertexProgramPointSize $= GL.Disabled
+            return (size,minSize,if maxSize == 0 then rscMaxPointSize rsc else maxSize,constant,linear,quadratic)
+        }
+    --no scaling required
+    -- GL has no disabled flag for this so just set to constant
+    let f = realToFrac
+    GL.pointSize $= f size'
+    GL.pointDistanceAttenuation $= (f constant',f linear',f quadratic')
+    GL.pointSizeRange $= (f minSize',f maxSize')
+    -- FIXME: gl binding handles this
+    {-
+		if (mCurrentCapabilities->hasCapability(RSC_POINT_EXTENDED_PARAMETERS))
+		{
+			glPointParameterfv(GL_POINT_DISTANCE_ATTENUATION, val);
+			glPointParameterf(GL_POINT_SIZE_MIN, minSize);
+			glPointParameterf(GL_POINT_SIZE_MAX, maxSize);
+		} 
+		else if (mCurrentCapabilities->hasCapability(RSC_POINT_EXTENDED_PARAMETERS_ARB))
+		{
+			glPointParameterfvARB(GL_POINT_DISTANCE_ATTENUATION, val);
+			glPointParameterfARB(GL_POINT_SIZE_MIN, minSize);
+			glPointParameterfARB(GL_POINT_SIZE_MAX, maxSize);
+		} 
+		else if (mCurrentCapabilities->hasCapability(RSC_POINT_EXTENDED_PARAMETERS_EXT))
+		{
+			glPointParameterfvEXT(GL_POINT_DISTANCE_ATTENUATION, val);
+			glPointParameterfEXT(GL_POINT_SIZE_MIN, minSize);
+			glPointParameterfEXT(GL_POINT_SIZE_MAX, maxSize);
+		}
+    -}
+    return ()
+
+glSetActiveTextureUnit stage = do
+    let f :: Int -> GL.GLuint
+        f = fromIntegral
+    GL.activeTexture $= GL.TextureUnit (f stage)
+{-
+			if (GLEW_VERSION_1_2 && unit < getCapabilities()->getNumTextureUnits())
+			{
+				glActiveTextureARB(GL_TEXTURE0 + unit);
+				mActiveTextureUnit = unit;
+				return true;
+			}
+			else if (!unit)
+			{
+				// always ok to use the first unit
+				return true;
+			}
+			else
+			{
+				return false;
+			}
+-}    
+
+glSetTexture tex = case tex of
+    { Just t    -> do
+        --TEMP CODE
+        GL.texture GL.Texture1D $= GL.Disabled
+        GL.textureBinding GL.Texture1D $= Nothing
+
+        GL.texture GL.Texture2D $= GL.Disabled
+        GL.textureBinding GL.Texture2D $= Nothing
+
+        GL.texture GL.Texture3D $= GL.Disabled
+        GL.textureBinding GL.Texture3D $= Nothing
+
+        GL.texture GL.TextureCubeMap $= GL.Disabled
+        GL.textureBinding GL.TextureCubeMap $= Nothing
+
+        let target = getGLTextureTarget $ txTextureType t
+        GL.texture target $= GL.Enabled
+        GL.textureBinding target $= (Just $ gltxTextureObject t)
+    ; Nothing   -> do
+        --TODO
+        GL.texture GL.Texture1D $= GL.Disabled
+        GL.textureBinding GL.Texture1D $= Nothing
+
+        GL.texture GL.Texture2D $= GL.Disabled
+        GL.textureBinding GL.Texture2D $= Nothing
+
+        GL.texture GL.Texture3D $= GL.Disabled
+        GL.textureBinding GL.Texture3D $= Nothing
+
+        GL.texture GL.TextureCubeMap $= GL.Disabled
+        GL.textureBinding GL.TextureCubeMap $= Nothing
+    }
+        
+{-
+	void GLRenderSystem::_setTexture(size_t stage, bool enabled, const TexturePtr &texPtr)
+	{
+		GLTexturePtr tex = texPtr;
+
+		GLenum lastTextureType = mTextureTypes[stage];
+
+		if (!activateGLTextureUnit(stage))
+			return;
+
+		if (enabled)
+		{
+			if (!tex.isNull())
+			{
+				// note used
+				tex->touch();
+				mTextureTypes[stage] = tex->getGLTextureTarget();
+			}
+			else
+				// assume 2D
+				mTextureTypes[stage] = GL_TEXTURE_2D;
+
+			if(lastTextureType != mTextureTypes[stage] && lastTextureType != 0)
+			{
+				if (stage < mFixedFunctionTextureUnits)
+				{
+					glDisable( lastTextureType );
+				}
+			}
+
+			if (stage < mFixedFunctionTextureUnits)
+			{
+				glEnable( mTextureTypes[stage] );
+			}
+
+			if(!tex.isNull())
+				glBindTexture( mTextureTypes[stage], tex->getGLID() );
+			else
+				glBindTexture( mTextureTypes[stage], static_cast<GLTextureManager*>(mTextureManager)->getWarningTextureID() );
+		}
+		else
+		{
+			if (stage < mFixedFunctionTextureUnits)
+			{
+				if (lastTextureType != 0)
+				{
+					glDisable( mTextureTypes[stage] );
+				}
+				glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+			}
+			// bind zero texture
+			glBindTexture(GL_TEXTURE_2D, 0); 
+		}
+
+		activateGLTextureUnit(0);
+	}
+
+	void GLRenderSystem::_setTextureCoordSet(size_t stage, size_t index)
+	{
+		mTextureCoordIndex[stage] = index;
+	}
+-}
+{-
+	void GLRenderSystem::_useLights(const LightList& lights, unsigned short limit)
+	{
+		// Save previous modelview
+		glMatrixMode(GL_MODELVIEW);
+		glPushMatrix();
+		// just load view matrix (identity world)
+		GLfloat mat[16];
+		makeGLMatrix(mat, mViewMatrix);
+		glLoadMatrixf(mat);
+
+		LightList::const_iterator i, iend;
+		iend = lights.end();
+		unsigned short num = 0;
+		for (i = lights.begin(); i != iend && num < limit; ++i, ++num)
+		{
+			setGLLight(num, *i);
+			mLights[num] = *i;
+		}
+		// Disable extra lights
+		for (; num < mCurrentLights; ++num)
+		{
+			setGLLight(num, NULL);
+			mLights[num] = NULL;
+		}
+		mCurrentLights = std::min(limit, static_cast<unsigned short>(lights.size()));
+
+		setLights();
+
+		// restore previous
+		glPopMatrix();
+
+	}
+
+	void GLRenderSystem::setGLLight(size_t index, Light* lt)
+	{
+		GLenum gl_index = GL_LIGHT0 + index;
+
+		if (!lt)
+		{
+			// Disable in the scene
+			glDisable(gl_index);
+		}
+		else
+		{
+			switch (lt->getType())
+			{
+			case Light::LT_SPOTLIGHT:
+				glLightf( gl_index, GL_SPOT_CUTOFF, 0.5f * lt->getSpotlightOuterAngle().valueDegrees() );
+				glLightf(gl_index, GL_SPOT_EXPONENT, lt->getSpotlightFalloff());
+				break;
+			default:
+				glLightf( gl_index, GL_SPOT_CUTOFF, 180.0 );
+				break;
+			}
+
+			// Color
+			ColourValue col;
+			col = lt->getDiffuseColour();
+
+
+			GLfloat f4vals[4] = {col.r, col.g, col.b, col.a};
+			glLightfv(gl_index, GL_DIFFUSE, f4vals);
+
+			col = lt->getSpecularColour();
+			f4vals[0] = col.r;
+			f4vals[1] = col.g;
+			f4vals[2] = col.b;
+			f4vals[3] = col.a;
+			glLightfv(gl_index, GL_SPECULAR, f4vals);
+
+
+			// Disable ambient light for movables;
+			f4vals[0] = 0;
+			f4vals[1] = 0;
+			f4vals[2] = 0;
+			f4vals[3] = 1;
+			glLightfv(gl_index, GL_AMBIENT, f4vals);
+
+			setGLLightPositionDirection(lt, gl_index);
+
+
+			// Attenuation
+			glLightf(gl_index, GL_CONSTANT_ATTENUATION, lt->getAttenuationConstant());
+			glLightf(gl_index, GL_LINEAR_ATTENUATION, lt->getAttenuationLinear());
+			glLightf(gl_index, GL_QUADRATIC_ATTENUATION, lt->getAttenuationQuadric());
+			// Enable in the scene
+			glEnable(gl_index);
+
+		}
+
+	}
+
+	void GLRenderSystem::setLights()
+	{
+		for (size_t i = 0; i < MAX_LIGHTS; ++i)
+		{
+			if (mLights[i] != NULL)
+			{
+				Light* lt = mLights[i];
+				setGLLightPositionDirection(lt, GL_LIGHT0 + i);
+			}
+		}
+	}
+
+	void GLRenderSystem::setGLLightPositionDirection(Light* lt, GLenum lightindex)
+	{
+		// Set position / direction
+		Vector4 vec;
+		// Use general 4D vector which is the same as GL's approach
+		vec = lt->getAs4DVector(true);
+
+#if OGRE_DOUBLE_PRECISION
+		// Must convert to float*
+		float tmp[4] = {vec.x, vec.y, vec.z, vec.w};
+		glLightfv(lightindex, GL_POSITION, tmp);
+#else
+		glLightfv(lightindex, GL_POSITION, vec.ptr());
+#endif
+		// Set spotlight direction
+		if (lt->getType() == Light::LT_SPOTLIGHT)
+		{
+			vec = lt->getDerivedDirection();
+			vec.w = 0.0; 
+#if OGRE_DOUBLE_PRECISION
+			// Must convert to float*
+			float tmp2[4] = {vec.x, vec.y, vec.z, vec.w};
+			glLightfv(lightindex, GL_SPOT_DIRECTION, tmp2);
+#else
+			glLightfv(lightindex, GL_SPOT_DIRECTION, vec.ptr());
+#endif
+		}
+	}
+-}
+
+glSetTextureAddressingMode texTarget (UVWAddressingMode u v w) = do
+    let target = getGLTextureTarget texTarget
+    GL.textureWrapMode target GL.S $= getTextureAddressingMode u
+    GL.textureWrapMode target GL.T $= getTextureAddressingMode v
+    GL.textureWrapMode target GL.R $= getTextureAddressingMode w
+
+glSetTextureBorderColour texTarget (r,g,b,a) = do
+    let target = getGLTextureTarget texTarget
+        f = realToFrac
+    GL.textureBorderColor target $= GL.Color4 (f r) (f g) (f b) (f a)
+
+glSetTextureUnitFiltering texTarget minFilter magFilter mipFilter = do
+    let target  = getGLTextureTarget texTarget
+        mag     = case magFilter of
+            { FO_ANISOTROPIC    -> GL.Linear'
+            ; FO_LINEAR         -> GL.Linear'
+            ; FO_POINT          -> GL.Nearest
+            ; FO_NONE           -> GL.Nearest
+            }
+        min     = case minFilter of
+            { FO_ANISOTROPIC    -> GL.Linear'
+            ; FO_LINEAR         -> GL.Linear'
+            ; FO_POINT          -> GL.Nearest
+            ; FO_NONE           -> GL.Nearest
+            }
+        mip     = case mipFilter of
+            { FO_ANISOTROPIC    -> Just GL.Linear'
+            ; FO_LINEAR         -> Just GL.Linear'
+            ; FO_POINT          -> Just GL.Nearest
+            ; FO_NONE           -> Nothing
+            }
+    GL.textureFilter target $= ((min,mip),mag)
+
+glSetTextureLayerAnisotropy texTarget maxAnisotropy = do
+    let target = getGLTextureTarget texTarget
+    maxSupportedAnisotropy <- GL.get GL.maxTextureMaxAnisotropy
+    GL.textureMaxAnisotropy target $= (min (realToFrac maxAnisotropy) (realToFrac maxSupportedAnisotropy))
+
+glSetTextureMipmapBias bias = do
+    GL.textureUnitLODBias $= realToFrac bias
+
+{-
+    = LayerBlendModeEx
+    { lbBlendType  :: LayerBlendType        -- ^ The type of blending (colour or alpha)
+    , lbOperation  :: LayerBlendOperationEx -- ^ The operation to be applied
+    , lbSource1    :: LayerBlendSource      -- ^ The first source of colour/alpha
+    , lbSource2    :: LayerBlendSource      -- ^ The second source of colour/alpha
+    , lbColourArg1 :: ColourValue           -- ^ Manual colour value for manual source1
+    , lbColourArg2 :: ColourValue           -- ^ Manual colour value for manual source2
+    , lbAlphaArg1  :: FloatType             -- ^ Manual alpha value for manual source1
+    , lbAlphaArg2  :: FloatType             -- ^ Manual alpha value for manual source2
+    , lbFactor     :: FloatType             -- ^ Manual blending factor
+    }
+
+doc: http://www.informit.com/articles/article.aspx?p=770639&seqNum=6
+FIXME: Test this code
+-}
+glSetTextureBlendMode rsc colorbm alphabm = do
+    let caps    = rscCapabilities rsc
+        hasDot3 = Set.member RSC_DOT3 caps
+        csrc1op = getLayerBlendSource $ lbSource1 colorbm
+        csrc2op = getLayerBlendSource $ lbSource2 colorbm
+        ccmd    = getTextureCombineFunction hasDot3 $ lbOperation colorbm
+        asrc1op = getLayerBlendSource $ lbSource1 alphabm
+        asrc2op = getLayerBlendSource $ lbSource2 alphabm
+        acmd    = getTextureCombineFunction hasDot3 $ lbOperation alphabm
+        f       = realToFrac
+
+    GL.textureFunction $= GL.Combine
+    GL.combineRGB $= ccmd
+    GL.argRGB GL.Arg0 $= GL.Arg GL.SrcColor csrc1op
+    GL.argRGB GL.Arg1 $= GL.Arg GL.SrcColor csrc2op
+    GL.argRGB GL.Arg2 $= GL.Arg GL.SrcColor GL.Constant
+    GL.combineAlpha $= acmd
+    GL.argAlpha GL.Arg0 $= GL.Arg GL.SrcAlpha asrc1op
+    GL.argAlpha GL.Arg1 $= GL.Arg GL.SrcAlpha asrc2op
+    GL.argAlpha GL.Arg2 $= GL.Arg GL.SrcAlpha GL.Constant
+
+    let argf bm cv1 cv2 = do
+            case lbOperation bm of
+                { LBX_BLEND_DIFFUSE_COLOUR  -> do
+                    GL.argRGB   GL.Arg2 $= GL.Arg GL.SrcColor GL.PrimaryColor
+                    GL.argAlpha GL.Arg2 $= GL.Arg GL.SrcAlpha GL.PrimaryColor
+                ; LBX_BLEND_DIFFUSE_ALPHA   -> do
+                    GL.argRGB   GL.Arg2 $= GL.Arg GL.SrcAlpha GL.PrimaryColor
+                    GL.argAlpha GL.Arg2 $= GL.Arg GL.SrcAlpha GL.PrimaryColor
+                ; LBX_BLEND_TEXTURE_ALPHA   -> do
+                    GL.argRGB   GL.Arg2 $= GL.Arg GL.SrcAlpha GL.CurrentUnit
+                    GL.argAlpha GL.Arg2 $= GL.Arg GL.SrcAlpha GL.CurrentUnit
+                ; LBX_BLEND_CURRENT_ALPHA   -> do
+                    GL.argRGB   GL.Arg2 $= GL.Arg GL.SrcAlpha GL.Previous
+                    GL.argAlpha GL.Arg2 $= GL.Arg GL.SrcAlpha GL.Previous
+                ; LBX_BLEND_MANUAL          -> do
+                    GL.constantColor    $= GL.Color4 0 0 0 (f $ lbFactor bm)
+                ; _                         -> return ()
+                }
+
+            when (LBS_MANUAL == lbSource1 bm) $ 
+                GL.constantColor    $= cv1
+                
+            when (LBS_MANUAL == lbSource2 bm) $
+                GL.constantColor    $= cv2
+
+        (cr1,cg1,cb1,ca1)   = lbColourArg1 colorbm
+        (cr2,cg2,cb2,ca2)   = lbColourArg2 colorbm
+        cf r g b a          = GL.Color4 (f r) (f g) (f b) (f a)
+        aa1                 = lbAlphaArg1 alphabm
+        aa2                 = lbAlphaArg2 alphabm
+    argf colorbm (cf cr1 cg1 cb1 ca1) (cf cr2 cg2 cb2 ca2)
+    argf alphabm (cf cr1 cg1 cb1 aa1) (cf cr2 cg2 cb2 aa2)
+
+    case lbOperation colorbm of
+        { LBX_MODULATE_X2   ->  GL.rgbScale $= 2
+        ; LBX_MODULATE_X4   ->  GL.rgbScale $= 4
+        ; _                 ->  GL.rgbScale $= 1
+        }
+
+    case lbOperation alphabm of
+        { LBX_MODULATE_X2   ->  GL.alphaScale $= 2
+        ; LBX_MODULATE_X4   ->  GL.alphaScale $= 4
+        ; _                 ->  GL.alphaScale $= 1
+        }
+
+glSetCullingMode mode = case mode of
+    { CULL_NONE             -> GL.cullFace $= Nothing
+    ; CULL_CLOCKWISE        -> GL.cullFace $= (Just GL.Back)
+    ; CULL_ANTICLOCKWISE    -> GL.cullFace $= (Just GL.Front)
+    }
+
+glSetColourBufferWriteEnabled r g b a = do
+    let f x = case x of
+            { True  -> GL.Enabled
+            ; False -> GL.Disabled
+            } 
+    GL.colorMask $= GL.Color4 (f r) (f g) (f b) (f a)
+
+glBindLinkedGpuProgram lp = do
+    GL.currentProgram $= Just (gllgpProgramObject lp)
+    --TEMP CODE
+    let p = gllgpProgramObject lp
+    loc_tex0 <- GL.get (GL.uniformLocation p "tex0") 
+    loc_tex1 <- GL.get (GL.uniformLocation p "tex1")
+    (GL.uniform loc_tex0) GL.$=! (GL.Index1 (0::GL.GLint))
+    (GL.uniform loc_tex1) GL.$=! (GL.Index1 (1::GL.GLint))
+
+glUnBindLinkedGpuProgram = do
+    GL.currentProgram $= Nothing
+
+{-
+	void GLRenderSystem::unbindGpuProgram(GpuProgramType gptype)
+	{
+
+		if (gptype == GPT_VERTEX_PROGRAM && mCurrentVertexProgram)
+		{
+			mActiveVertexGpuProgramParameters.setNull();
+			mCurrentVertexProgram->unbindProgram();
+			mCurrentVertexProgram = 0;
+		}
+		else if (gptype == GPT_GEOMETRY_PROGRAM && mCurrentGeometryProgram)
+		{
+			mActiveGeometryGpuProgramParameters.setNull();
+			mCurrentGeometryProgram->unbindProgram();
+			mCurrentGeometryProgram = 0;
+		}
+		else if (gptype == GPT_FRAGMENT_PROGRAM && mCurrentFragmentProgram)
+		{
+			mActiveFragmentGpuProgramParameters.setNull();
+			mCurrentFragmentProgram->unbindProgram();
+			mCurrentFragmentProgram = 0;
+		}
+		RenderSystem::unbindGpuProgram(gptype);
+
+	}
+
+	void RenderSystem::unbindGpuProgram(GpuProgramType gptype)
+	{
+	    switch(gptype)
+	    {
+        case GPT_VERTEX_PROGRAM:
+			// mark clip planes dirty if changed (programmable can change space)
+			if (mVertexProgramBound && !mClipPlanes.empty())
+				mClipPlanesDirty = true;
+            mVertexProgramBound = false;
+	        break;
+        case GPT_GEOMETRY_PROGRAM:
+			mGeometryProgramBound = false;
+			break;
+        case GPT_FRAGMENT_PROGRAM:
+            mFragmentProgramBound = false;
+	        break;
+	    }
+	}
+-}
+
+--glSetTextureMatrix :: Matrix4 -> IO ()
+glSetTextureMatrix xform = do
+    mat <- toGLMatrix xform
+    GL.matrix (Just GL.Texture) $= mat
+    
+{-
+	void GLRenderSystem::_setTextureMatrix(size_t stage, const Matrix4& xform)
+	{
+		if (stage >= mFixedFunctionTextureUnits)
+		{
+			// Can't do this
+			return;
+		}
+
+		GLfloat mat[16];
+		makeGLMatrix(mat, xform);
+
+		if (!activateGLTextureUnit(stage))
+			return;
+		glMatrixMode(GL_TEXTURE);
+
+		// Load this matrix in
+		glLoadMatrixf(mat);
+
+		if (mUseAutoTextureMatrix)
+		{
+			// Concat auto matrix
+			glMultMatrixf(mAutoTextureMatrix);
+		}
+
+		glMatrixMode(GL_MODELVIEW);
+		activateGLTextureUnit(0);
+	}
+-}
+
+-- glSetTextureCoordCalculation :: TexCoordCalcMethod -> IO ()
+glSetTextureCoordCalculation m = case m of
+    { TEXCALC_NONE -> do
+        GL.textureGenMode GL.S $= Nothing
+        GL.textureGenMode GL.T $= Nothing
+        GL.textureGenMode GL.R $= Nothing
+        GL.textureGenMode GL.Q $= Nothing
+        
+    ; TEXCALC_ENVIRONMENT_MAP   -> do
+        GL.textureGenMode GL.S $= Just GL.SphereMap
+        GL.textureGenMode GL.T $= Just GL.SphereMap
+        GL.textureGenMode GL.R $= Nothing
+        GL.textureGenMode GL.Q $= Nothing
+        -- TODO
+        {-
+		// Need to use a texture matrix to flip the spheremap
+		mUseAutoTextureMatrix = true;
+		memset(mAutoTextureMatrix, 0, sizeof(GLfloat)*16);
+		mAutoTextureMatrix[0] = mAutoTextureMatrix[10] = mAutoTextureMatrix[15] = 1.0f;
+		mAutoTextureMatrix[5] = -1.0f;
+        -}
+        
+    ; TEXCALC_ENVIRONMENT_MAP_PLANAR -> do
+        GL.textureGenMode GL.S $= Just GL.SphereMap
+        GL.textureGenMode GL.T $= Just GL.SphereMap
+        GL.textureGenMode GL.R $= Nothing
+        GL.textureGenMode GL.Q $= Nothing
+        
+    ; TEXCALC_ENVIRONMENT_MAP_REFLECTION -> do
+        GL.textureGenMode GL.S $= Just GL.ReflectionMap
+        GL.textureGenMode GL.T $= Just GL.ReflectionMap
+        GL.textureGenMode GL.R $= Just GL.ReflectionMap
+        GL.textureGenMode GL.Q $= Nothing
+        {-
+		// We need an extra texture matrix here
+		// This sets the texture matrix to be the inverse of the view matrix
+		mUseAutoTextureMatrix = true;
+		makeGLMatrix( M, mViewMatrix);
+
+		// Transpose 3x3 in order to invert matrix (rotation)
+		// Note that we need to invert the Z _before_ the rotation
+		// No idea why we have to invert the Z at all, but reflection is wrong without it
+		mAutoTextureMatrix[0] = M[0]; mAutoTextureMatrix[1] = M[4]; mAutoTextureMatrix[2] = -M[8];
+		mAutoTextureMatrix[4] = M[1]; mAutoTextureMatrix[5] = M[5]; mAutoTextureMatrix[6] = -M[9];
+		mAutoTextureMatrix[8] = M[2]; mAutoTextureMatrix[9] = M[6]; mAutoTextureMatrix[10] = -M[10];
+		mAutoTextureMatrix[3] = mAutoTextureMatrix[7] = mAutoTextureMatrix[11] = 0.0f;
+		mAutoTextureMatrix[12] = mAutoTextureMatrix[13] = mAutoTextureMatrix[14] = 0.0f;
+		mAutoTextureMatrix[15] = 1.0f;
+        -}
+        
+    ; TEXCALC_ENVIRONMENT_MAP_NORMAL -> do
+        GL.textureGenMode GL.S $= Just GL.NormalMap
+        GL.textureGenMode GL.T $= Just GL.NormalMap
+        GL.textureGenMode GL.R $= Just GL.NormalMap
+        GL.textureGenMode GL.Q $= Nothing
+
+    ; TEXCALC_PROJECTIVE_TEXTURE -> do
+        GL.textureGenMode GL.S $= Just (GL.EyeLinear $ GL.Plane 1 0 0 0)
+        GL.textureGenMode GL.T $= Just (GL.EyeLinear $ GL.Plane 0 1 0 0)
+        GL.textureGenMode GL.R $= Just (GL.EyeLinear $ GL.Plane 0 0 1 0)
+        GL.textureGenMode GL.Q $= Just (GL.EyeLinear $ GL.Plane 0 0 0 1)
+        {-
+		mUseAutoTextureMatrix = true;
+
+		// Set scale and translation matrix for projective textures
+		projectionBias = Matrix4::CLIPSPACE2DTOIMAGESPACE;
+
+		projectionBias = projectionBias * frustum->getProjectionMatrix();
+		if(mTexProjRelative)
+		{
+			Matrix4 viewMatrix;
+			frustum->calcViewMatrixRelative(mTexProjRelativeOrigin, viewMatrix);
+			projectionBias = projectionBias * viewMatrix;
+		}
+		else
+		{
+			projectionBias = projectionBias * frustum->getViewMatrix();
+		}
+		projectionBias = projectionBias * mWorldMatrix;
+
+		makeGLMatrix(mAutoTextureMatrix, projectionBias);
+        -}
+    }
+
+{-
+	void GLRenderSystem::_setTextureCoordCalculation(size_t stage, TexCoordCalcMethod m, 
+		const Frustum* frustum)
+	{
+		if (stage >= mFixedFunctionTextureUnits)
+		{
+			// Can't do this
+			return;
+		}
+
+
+		GLfloat M[16];
+		Matrix4 projectionBias;
+
+		// Default to no extra auto texture matrix
+		mUseAutoTextureMatrix = false;
+
+		GLfloat eyePlaneS[] = {1.0, 0.0, 0.0, 0.0};
+		GLfloat eyePlaneT[] = {0.0, 1.0, 0.0, 0.0};
+		GLfloat eyePlaneR[] = {0.0, 0.0, 1.0, 0.0};
+		GLfloat eyePlaneQ[] = {0.0, 0.0, 0.0, 1.0};
+
+		if (!activateGLTextureUnit(stage))
+			return;
+
+		switch( m )
+		{
+		case TEXCALC_NONE:
+			glDisable( GL_TEXTURE_GEN_S );
+			glDisable( GL_TEXTURE_GEN_T );
+			glDisable( GL_TEXTURE_GEN_R );
+			glDisable( GL_TEXTURE_GEN_Q );
+			break;
+
+		case TEXCALC_ENVIRONMENT_MAP:
+			glTexGeni( GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP );
+			glTexGeni( GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP );
+
+			glEnable( GL_TEXTURE_GEN_S );
+			glEnable( GL_TEXTURE_GEN_T );
+			glDisable( GL_TEXTURE_GEN_R );
+			glDisable( GL_TEXTURE_GEN_Q );
+
+			// Need to use a texture matrix to flip the spheremap
+			mUseAutoTextureMatrix = true;
+			memset(mAutoTextureMatrix, 0, sizeof(GLfloat)*16);
+			mAutoTextureMatrix[0] = mAutoTextureMatrix[10] = mAutoTextureMatrix[15] = 1.0f;
+			mAutoTextureMatrix[5] = -1.0f;
+
+			break;
+
+		case TEXCALC_ENVIRONMENT_MAP_PLANAR:            
+			// XXX This doesn't seem right?!
+#ifdef GL_VERSION_1_3
+			glTexGeni( GL_S, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP );
+			glTexGeni( GL_T, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP );
+			glTexGeni( GL_R, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP );
+
+			glEnable( GL_TEXTURE_GEN_S );
+			glEnable( GL_TEXTURE_GEN_T );
+			glEnable( GL_TEXTURE_GEN_R );
+			glDisable( GL_TEXTURE_GEN_Q );
+#else
+			glTexGeni( GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP );
+			glTexGeni( GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP );
+
+			glEnable( GL_TEXTURE_GEN_S );
+			glEnable( GL_TEXTURE_GEN_T );
+			glDisable( GL_TEXTURE_GEN_R );
+			glDisable( GL_TEXTURE_GEN_Q );
+#endif
+			break;
+		case TEXCALC_ENVIRONMENT_MAP_REFLECTION:
+
+			glTexGeni( GL_S, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP );
+			glTexGeni( GL_T, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP );
+			glTexGeni( GL_R, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP );
+
+			glEnable( GL_TEXTURE_GEN_S );
+			glEnable( GL_TEXTURE_GEN_T );
+			glEnable( GL_TEXTURE_GEN_R );
+			glDisable( GL_TEXTURE_GEN_Q );
+
+			// We need an extra texture matrix here
+			// This sets the texture matrix to be the inverse of the view matrix
+			mUseAutoTextureMatrix = true;
+			makeGLMatrix( M, mViewMatrix);
+
+			// Transpose 3x3 in order to invert matrix (rotation)
+			// Note that we need to invert the Z _before_ the rotation
+			// No idea why we have to invert the Z at all, but reflection is wrong without it
+			mAutoTextureMatrix[0] = M[0]; mAutoTextureMatrix[1] = M[4]; mAutoTextureMatrix[2] = -M[8];
+			mAutoTextureMatrix[4] = M[1]; mAutoTextureMatrix[5] = M[5]; mAutoTextureMatrix[6] = -M[9];
+			mAutoTextureMatrix[8] = M[2]; mAutoTextureMatrix[9] = M[6]; mAutoTextureMatrix[10] = -M[10];
+			mAutoTextureMatrix[3] = mAutoTextureMatrix[7] = mAutoTextureMatrix[11] = 0.0f;
+			mAutoTextureMatrix[12] = mAutoTextureMatrix[13] = mAutoTextureMatrix[14] = 0.0f;
+			mAutoTextureMatrix[15] = 1.0f;
+
+			break;
+		case TEXCALC_ENVIRONMENT_MAP_NORMAL:
+			glTexGeni( GL_S, GL_TEXTURE_GEN_MODE, GL_NORMAL_MAP );
+			glTexGeni( GL_T, GL_TEXTURE_GEN_MODE, GL_NORMAL_MAP );
+			glTexGeni( GL_R, GL_TEXTURE_GEN_MODE, GL_NORMAL_MAP );
+
+			glEnable( GL_TEXTURE_GEN_S );
+			glEnable( GL_TEXTURE_GEN_T );
+			glEnable( GL_TEXTURE_GEN_R );
+			glDisable( GL_TEXTURE_GEN_Q );
+			break;
+		case TEXCALC_PROJECTIVE_TEXTURE:
+			glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
+			glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
+			glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
+			glTexGeni(GL_Q, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
+			glTexGenfv(GL_S, GL_EYE_PLANE, eyePlaneS);
+			glTexGenfv(GL_T, GL_EYE_PLANE, eyePlaneT);
+			glTexGenfv(GL_R, GL_EYE_PLANE, eyePlaneR);
+			glTexGenfv(GL_Q, GL_EYE_PLANE, eyePlaneQ);
+			glEnable(GL_TEXTURE_GEN_S);
+			glEnable(GL_TEXTURE_GEN_T);
+			glEnable(GL_TEXTURE_GEN_R);
+			glEnable(GL_TEXTURE_GEN_Q);
+
+			mUseAutoTextureMatrix = true;
+
+			// Set scale and translation matrix for projective textures
+			projectionBias = Matrix4::CLIPSPACE2DTOIMAGESPACE;
+
+			projectionBias = projectionBias * frustum->getProjectionMatrix();
+			if(mTexProjRelative)
+			{
+				Matrix4 viewMatrix;
+				frustum->calcViewMatrixRelative(mTexProjRelativeOrigin, viewMatrix);
+				projectionBias = projectionBias * viewMatrix;
+			}
+			else
+			{
+				projectionBias = projectionBias * frustum->getViewMatrix();
+			}
+			projectionBias = projectionBias * mWorldMatrix;
+
+			makeGLMatrix(mAutoTextureMatrix, projectionBias);
+			break;
+		default:
+			break;
+		}
+		activateGLTextureUnit(0);
+	}
+-}    
diff --git a/Graphics/LambdaCube/RenderSystem/GL/GLTexture.hs b/Graphics/LambdaCube/RenderSystem/GL/GLTexture.hs
new file mode 100644
--- /dev/null
+++ b/Graphics/LambdaCube/RenderSystem/GL/GLTexture.hs
@@ -0,0 +1,361 @@
+module Graphics.LambdaCube.RenderSystem.GL.GLTexture where
+
+import qualified Data.Set as Set
+import Data.Maybe
+import Control.Monad
+import Foreign.Ptr
+
+import Graphics.Rendering.OpenGL (($=))
+import qualified Graphics.Rendering.OpenGL as GL
+import System.Log.Logger
+
+import Graphics.LambdaCube.Types
+import Graphics.LambdaCube.PixelFormat
+import Graphics.LambdaCube.Texture
+import Graphics.LambdaCube.Image
+import Graphics.LambdaCube.HardwareBuffer
+import Graphics.LambdaCube.RenderSystemCapabilities
+import Graphics.LambdaCube.RenderSystem.GL.GLUtils
+
+data GLTexture
+    = GLTexture
+    { gltxName                      :: String
+    , gltxWidth                     :: Int
+    , gltxHeight                    :: Int
+    , gltxDepth                     :: Int
+    , gltxNumRequestedMipmaps       :: TextureMipmap
+    , gltxNumMipmaps                :: Int
+    , gltxMipmapsHardwareGenerated  :: Bool
+    , gltxGamma                     :: FloatType
+    , gltxHwGamma                   :: Bool
+    , gltxFSAA                      :: Int
+    , gltxFSAAHint                  :: String
+    , gltxTextureType               :: TextureType
+    , gltxFormat                    :: PixelFormat
+    , gltxUsage                     :: TextureUsage
+    , gltxSrcFormat                 :: PixelFormat
+    , gltxSrcWidth                  :: Int
+    , gltxSrcHeight                 :: Int
+    , gltxSrcDepth                  :: Int
+
+    , gltxDesiredFormat             :: PixelFormat
+    , gltxDesiredIntegerBitDepth    :: Int
+    , gltxDesiredFloatBitDepth      :: Int
+    , gltxTreatLuminanceAsAlpha     :: Bool
+    
+    , gltxTextureObject             :: GL.TextureObject
+    }
+
+instance Eq GLTexture where
+    (==) a b    = gltxTextureObject a == gltxTextureObject b
+
+instance HardwareBuffer GLTexture
+
+instance Texture GLTexture where
+    txName                      = gltxName
+    txWidth                     = gltxWidth
+    txHeight                    = gltxHeight
+    txDepth                     = gltxDepth
+    txNumRequestedMipmaps       = gltxNumRequestedMipmaps
+    txNumMipmaps                = gltxNumMipmaps
+    txMipmapsHardwareGenerated  = gltxMipmapsHardwareGenerated
+    txGamma                     = gltxGamma
+    txHwGamma                   = gltxHwGamma
+    txFSAA                      = gltxFSAA
+    txFSAAHint                  = gltxFSAAHint
+    txTextureType               = gltxTextureType
+    txFormat                    = gltxFormat
+--    txUsage                     = gltxUsage
+    txSrcFormat                 = gltxSrcFormat
+    txSrcWidth                  = gltxSrcWidth
+    txSrcHeight                 = gltxSrcHeight
+    txSrcDepth                  = gltxSrcDepth
+
+    txDesiredFormat             = gltxDesiredFormat
+    txDesiredIntegerBitDepth    = gltxDesiredIntegerBitDepth
+    txDesiredFloatBitDepth      = gltxDesiredFloatBitDepth
+    txTreatLuminanceAsAlpha     = gltxTreatLuminanceAsAlpha
+
+{-
+    virtual TexturePtr createManual(const String & name, const String& group,
+        TextureType texType, uint width, uint height, uint depth, 
+		int num_mips, PixelFormat format, int usage = TU_DEFAULT, ManualResourceLoader* loader = 0,
+		bool hwGammaCorrection = false, uint fsaa = 0, const String& fsaaHint = StringUtil::BLANK);
+-}
+--createTexture                   :: a -> String -> TextureType -> Int -> Int -> Int -> Int -> PixelFormat -> TextueUsage -> Bool -> Int -> String -> IO t
+{-
+        virtual TexturePtr createManual(const String & name, const String& group,
+            TextureType texType, uint width, uint height, uint depth, 
+			int num_mips, PixelFormat format, int usage = TU_DEFAULT, ManualResourceLoader* loader = 0,
+			bool hwGammaCorrection = false, uint fsaa = 0, const String& fsaaHint = StringUtil::BLANK);
+            TextureUsage = bufferUsage::Usage, autoMipmap::Bool, isTarget::Bool
+    createTexture                   :: a -> String -> TextureType -> Int -> Int -> Int -> Int -> PixelFormat -> Usage -> Bool -> Bool -> Bool -> Int -> String -> IO t
+-}
+mkGLTexture :: RenderSystemCapabilities -> String -> TextureType -> Int -> Int -> Int -> TextureMipmap -> PixelFormat -> TextureUsage -> Bool -> Int -> String -> Maybe [Image] -> IO GLTexture
+--FIXME: image parameter is temporary!!!!
+mkGLTexture rcaps name texType width height depth numMips format usage hwGammaCorrection fsaa fsaaHint mimage = do
+    let caps = rscCapabilities rcaps
+    debugM "createTexture" $ "create " ++ show texType ++ " texture: " ++ name
+    
+    when (texType == TEX_TYPE_3D && Set.notMember RSC_TEXTURE_3D caps) $ error "3D Textures not supported before OpenGL 1.2"
+
+    (major,minor) <- GL.get $ GL.majorMinor GL.glVersion
+
+    let glVer a b   = major > a || (major >= a && minor >= b)
+        texTarget   = (getGLTextureTarget texType)
+        -- Convert to nearest power-of-two size if required
+        mWidth      = optionalPO2 rcaps width
+        mHeight     = optionalPO2 rcaps height
+        mDepth      = optionalPO2 rcaps depth
+
+        -- Adjust format if required
+        mFormat     = getNativeFormat texType format False -- TODO
+
+        -- Check requested number of mipmaps
+        maxMips     = getMaxMipmaps mWidth mHeight mDepth mFormat
+        mNumMipmaps = maxMips -- TODO min maxMips numMips
+
+    -- Generate texture name
+    [mTextureID] <- GL.genObjectNames 1 
+
+    -- Set texture type
+    GL.textureBinding texTarget $= Just mTextureID
+    
+    -- This needs to be set otherwise the texture doesn't get rendered
+    when (glVer 1 2) $ GL.textureLevelRange texTarget $= (0,fromIntegral mNumMipmaps)
+    
+    -- Set some misc default parameters so NVidia won't complain, these can of course be changed later
+    GL.textureFilter texTarget $= ((GL.Nearest,Nothing),GL.Nearest)
+
+    when (glVer 1 2) $ do
+        GL.textureWrapMode texTarget GL.S $= (GL.Repeated, GL.ClampToEdge)
+        GL.textureWrapMode texTarget GL.T $= (GL.Repeated, GL.ClampToEdge)
+
+    -- If we can do automip generation and the user desires this, do so
+    let mMipmapsHardwareGenerated = Set.member RSC_AUTOMIPMAP caps
+    -- FIXME
+    {-
+		// NVIDIA 175.16 drivers break hardware mip generation for non-compressed
+		// textures - disable until fixed
+		// Leave hardware gen on compressed textures since that's the only way we
+		// can realistically do it since GLU doesn't support DXT
+		// However DON'T do this on Apple, their drivers aren't subject to this
+		// problem yet and in fact software generation appears to cause a crash 
+		// in some cases which I've yet to track down
+if OGRE_PLATFORM != OGRE_PLATFORM_APPLE
+		if (Root::getSingleton().getRenderSystem()->getCapabilities()->getVendor() == GPU_NVIDIA
+			&& !PixelUtil::isCompressed(mFormat))
+		{
+			mMipmapsHardwareGenerated = false;
+		}
+endif
+    -}
+--TODO
+    let moreMips = case numMips of
+            { MIP_UNLIMITED -> True
+            ; MIP_DEFAULT   -> True -- TODO
+            ; MIP_NUMBER n  -> n > 0
+            }
+
+    when (tuAutoMipmap usage && moreMips && mMipmapsHardwareGenerated) $ GL.generateMipmap texTarget $= GL.Enabled
+
+    -- Allocate internal buffer so that glTexSubImageXD can be used
+    -- Internal format
+    let format' = getClosestGLInternalFormat mFormat hwGammaCorrection
+        isCompressed _ = False -- TODO
+    case isCompressed mFormat of
+        { True  -> do
+        {-
+			// Compressed formats
+			size_t size = PixelUtil::getMemorySize(mWidth, mHeight, mDepth, mFormat);
+			// Provide temporary buffer filled with zeroes as glCompressedTexImageXD does not
+			// accept a 0 pointer like normal glTexImageXD
+			// Run through this process for every mipmap to pregenerate mipmap piramid
+			uint8 *tmpdata = new uint8[size];
+			memset(tmpdata, 0, size);
+			
+			for(size_t mip=0; mip<=mNumMipmaps; mip++)
+			{
+				size = PixelUtil::getMemorySize(width, height, depth, mFormat);
+				switch(mTextureType)
+				{
+					case TEX_TYPE_1D:
+						glCompressedTexImage1DARB(GL_TEXTURE_1D, mip, format', 
+							width, 0, 
+							size, tmpdata);
+						break;
+					case TEX_TYPE_2D:
+						glCompressedTexImage2DARB(GL_TEXTURE_2D, mip, format',
+							width, height, 0, 
+							size, tmpdata);
+						break;
+					case TEX_TYPE_3D:
+						glCompressedTexImage3DARB(GL_TEXTURE_3D, mip, format',
+							width, height, depth, 0, 
+							size, tmpdata);
+						break;
+					case TEX_TYPE_CUBE_MAP:
+						for(int face=0; face<6; face++) {
+							glCompressedTexImage2DARB(GL_TEXTURE_CUBE_MAP_POSITIVE_X + face, mip, format',
+								width, height, 0, 
+								size, tmpdata);
+						}
+						break;
+				};
+				if(width>1)		width = width/2;
+				if(height>1)	height = height/2;
+				if(depth>1)		depth = depth/2;
+			}
+			delete [] tmpdata;
+        -}
+            
+            -- Compressed formats
+            -- Provide temporary buffer filled with zeroes as glCompressedTexImageXD does not
+            -- accept a 0 pointer like normal glTexImageXD
+            -- TODO: support compressed textures
+            {-
+            let setMip tmpdata (w,h,d) mip = do
+                    -- compressedTexImage1D :: Proxy -> Level -> TextureSize1D -> Border -> CompressedPixelData a -> IO ()
+                    -- CompressedPixelData !CompressedTextureFormat GLsizei (Ptr a)
+                    let size = getMemorySize w h d mFormat
+                    case texType of
+                        { TEX_TYPE_1D       -> GL.compressedTexImage1D GL.NoProxy mip (GL.TextureSize1D w) 0 (GL.CompressedPixelData (CompressedTextureFormat ) size tmpdata)
+                        ; TEX_TYPE_2D       -> 
+                        ; TEX_TYPE_3D       -> 
+                        ; TEX_TYPE_CUBE_MAP -> do
+                        }
+                    return (max 1 (w `div` 2), max 1 (h `div` 2), max 1 (d `div` 2))
+                setMips :: Ptr Word8 -> IO ()
+                setMips tmpdata = do
+                    pokeArray tmpdata $ replicate size 0
+                    -- Run through this process for every mipmap to pregenerate mipmap piramid
+                    foldM_ (setMip tmpdata) (mWidth,mHeight,mDepth) [0..mNumMipmaps]
+            allocaArray (getMemorySize mWidth mHeight mDepth mFormat) setMips
+            -}
+            return ()
+        ; False -> do
+            let setMip (w,h,d) mip = do
+                    -- Normal formats
+                    case texType of
+                        { TEX_TYPE_1D       -> GL.texImage1D GL.NoProxy mip format' (GL.TextureSize1D w) 0 (GL.PixelData GL.RGBA GL.UnsignedByte nullPtr)
+                        ; TEX_TYPE_2D       -> GL.texImage2D Nothing GL.NoProxy mip format' (GL.TextureSize2D w h) 0 (GL.PixelData GL.RGBA GL.UnsignedByte nullPtr)
+                        ; TEX_TYPE_3D       -> GL.texImage3D GL.NoProxy mip format' (GL.TextureSize3D w h d) 0 (GL.PixelData GL.RGBA GL.UnsignedByte nullPtr)
+                        ; TEX_TYPE_CUBE_MAP -> do
+                            GL.texImage2D (Just GL.TextureCubeMapPositiveX) GL.NoProxy mip format' (GL.TextureSize2D w h) 0 (GL.PixelData GL.RGBA GL.UnsignedByte nullPtr)
+                            GL.texImage2D (Just GL.TextureCubeMapNegativeX) GL.NoProxy mip format' (GL.TextureSize2D w h) 0 (GL.PixelData GL.RGBA GL.UnsignedByte nullPtr)
+                            GL.texImage2D (Just GL.TextureCubeMapPositiveY) GL.NoProxy mip format' (GL.TextureSize2D w h) 0 (GL.PixelData GL.RGBA GL.UnsignedByte nullPtr)
+                            GL.texImage2D (Just GL.TextureCubeMapNegativeY) GL.NoProxy mip format' (GL.TextureSize2D w h) 0 (GL.PixelData GL.RGBA GL.UnsignedByte nullPtr)
+                            GL.texImage2D (Just GL.TextureCubeMapPositiveZ) GL.NoProxy mip format' (GL.TextureSize2D w h) 0 (GL.PixelData GL.RGBA GL.UnsignedByte nullPtr)
+                            GL.texImage2D (Just GL.TextureCubeMapNegativeZ) GL.NoProxy mip format' (GL.TextureSize2D w h) 0 (GL.PixelData GL.RGBA GL.UnsignedByte nullPtr)
+                        }
+                    return (max 1 (w `div` 2), max 1 (h `div` 2), max 1 (d `div` 2))
+                f = fromIntegral
+            -- Run through this process to pregenerate mipmap piramid
+            foldM_ setMip (f mWidth,f mHeight,f mDepth) [0..(fromIntegral mNumMipmaps)]
+        }
+
+    -- TODO
+    -- TEMP CODE
+    when (isJust mimage) $ do
+        let images = fromJust mimage
+            imInfo i = (fmt,f w,f h)
+              where
+                f   = fromIntegral
+                fmt = case imFormat i of
+                    { PF_L8         -> GL.Luminance
+                    ; PF_BYTE_LA    -> GL.LuminanceAlpha
+                    ; PF_R8G8B8     -> GL.RGB
+                    ; PF_R8G8B8A8   -> GL.RGBA
+                    }
+                w   = imWidth i
+                h   = imHeight i
+            upload2D target i = do
+                let (fmt,w,h) = imInfo i
+                debugM "createTexture" $ "upload2d: " ++ imName i
+                GL.texImage2D target GL.NoProxy 0 format' (GL.TextureSize2D w h) 0 (GL.PixelData fmt GL.UnsignedByte $ imData i)
+                
+        errl <- GL.get GL.errors
+        unless (null errl) $ debugM "createTexture" $ "glerrors: \"" ++ concat [show c ++ " - " ++ m ++ "\n" | GL.Error c m <- errl] ++ "\""
+        case texType of
+            { TEX_TYPE_1D       -> do
+                let (fmt,w,h) = imInfo image
+                    image     = head images  
+                GL.texImage1D GL.NoProxy 0 format' (GL.TextureSize1D w) 0 (GL.PixelData fmt GL.UnsignedByte $ imData image)
+            ; TEX_TYPE_2D       -> upload2D Nothing $ head images
+            ; TEX_TYPE_CUBE_MAP -> mapM_ (uncurry upload2D) $ zip [ Just GL.TextureCubeMapPositiveZ -- front
+                                                                  , Just GL.TextureCubeMapNegativeZ -- back
+                                                                  , Just GL.TextureCubeMapPositiveY -- up
+                                                                  , Just GL.TextureCubeMapNegativeY -- down
+                                                                  , Just GL.TextureCubeMapNegativeX -- left
+                                                                  , Just GL.TextureCubeMapPositiveX -- right
+                                                                  ] images
+            ; _ -> return ()
+            }            
+    --_createSurfaceList();
+
+    -- Get final internal format
+    -- TODO
+    --mFormat = getBuffer(0,0)->getFormat();
+    debugM "createTexture" $ "created texture: " ++ name
+    return GLTexture
+        { gltxName                      = name
+        , gltxWidth                     = 0 --TODO
+        , gltxHeight                    = 0 --TODO
+        , gltxDepth                     = 0 --TODO
+        , gltxNumRequestedMipmaps       = MIP_DEFAULT --TODO
+        , gltxNumMipmaps                = 0 --TODO
+        , gltxMipmapsHardwareGenerated  = True --TODO
+        , gltxGamma                     = 0 --TODO
+        , gltxHwGamma                   = True --TODO
+        , gltxFSAA                      = 0 --TODO
+        , gltxFSAAHint                  = "" --TODO
+        , gltxTextureType               = texType
+        , gltxFormat                    = PF_R8G8B8 -- TODO
+        , gltxUsage                     = TextureUsage HBU_WRITE_ONLY False False-- TODO
+        , gltxSrcFormat                 = PF_R8G8B8 -- TODO
+        , gltxSrcWidth                  = 0 --TODO
+        , gltxSrcHeight                 = 0 --TODO
+        , gltxSrcDepth                  = 0 --TODO
+    
+        , gltxDesiredFormat             = PF_R8G8B8 --TODO
+        , gltxDesiredIntegerBitDepth    = 0 --TODO
+        , gltxDesiredFloatBitDepth      = 0 --TODO
+        , gltxTreatLuminanceAsAlpha     = True --TODO
+        
+        , gltxTextureObject             = mTextureID
+        }
+{-
+	void GLTexture::_createSurfaceList()
+	{
+		mSurfaceList.clear();
+		
+		// For all faces and mipmaps, store surfaces as HardwarePixelBufferSharedPtr
+		bool wantGeneratedMips = (mUsage & TU_AUTOMIPMAP)!=0;
+		
+		// Do mipmapping in software? (uses GLU) For some cards, this is still needed. Of course,
+		// only when mipmap generation is desired.
+		bool doSoftware = wantGeneratedMips && !mMipmapsHardwareGenerated && getNumMipmaps(); 
+		
+		for(size_t face=0; face<getNumFaces(); face++)
+		{
+			for(size_t mip=0; mip<=getNumMipmaps(); mip++)
+			{
+                GLHardwarePixelBuffer *buf = new GLTextureBuffer(mName, getGLTextureTarget(), mTextureID, face, mip,
+						static_cast<HardwareBuffer::Usage>(mUsage), doSoftware && mip==0, mHwGamma, mFSAA);
+				mSurfaceList.push_back(HardwarePixelBufferSharedPtr(buf));
+                
+                /// Check for error
+                if(buf->getWidth()==0 || buf->getHeight()==0 || buf->getDepth()==0)
+                {
+                    OGRE_EXCEPT(
+                        Exception::ERR_RENDERINGAPI_ERROR, 
+                        "Zero sized texture surface on texture "+getName()+
+                            " face "+StringConverter::toString(face)+
+                            " mipmap "+StringConverter::toString(mip)+
+                            ". Probably, the GL driver refused to create the texture.", 
+                            "GLTexture::_createSurfaceList");
+                }
+			}
+		}
+	}
+-}
diff --git a/Graphics/LambdaCube/RenderSystem/GL/GLUtils.hs b/Graphics/LambdaCube/RenderSystem/GL/GLUtils.hs
new file mode 100644
--- /dev/null
+++ b/Graphics/LambdaCube/RenderSystem/GL/GLUtils.hs
@@ -0,0 +1,326 @@
+module Graphics.LambdaCube.RenderSystem.GL.GLUtils where
+
+import qualified Data.Set as Set
+import Data.Bits
+import Unsafe.Coerce
+
+import Graphics.Rendering.OpenGL (($=))
+import qualified Graphics.Rendering.OpenGL as GL
+
+import Graphics.LambdaCube.Types
+import Graphics.LambdaCube.Math
+import Graphics.LambdaCube.Common
+import Graphics.LambdaCube.PixelFormat
+import Graphics.LambdaCube.Texture
+import Graphics.LambdaCube.BlendMode
+import Graphics.LambdaCube.HardwareBuffer
+import Graphics.LambdaCube.HardwareVertexBuffer
+import Graphics.LambdaCube.RenderSystemCapabilities
+import Graphics.LambdaCube.TextureUnitState
+
+toGLMatrix :: Matrix4 -> IO (GL.GLmatrix GL.GLfloat)
+toGLMatrix m = GL.newMatrix GL.ColumnMajor $ unsafeCoerce $ toListsMatrix4 m
+
+getGLUsage :: Usage -> GL.BufferUsage
+getGLUsage usage = case usage of
+    { HBU_STATIC                            -> GL.StaticDraw
+    ; HBU_STATIC_WRITE_ONLY                 -> GL.StaticDraw
+    ; HBU_DYNAMIC                           -> GL.DynamicDraw
+    ; HBU_DYNAMIC_WRITE_ONLY                -> GL.DynamicDraw
+    ; HBU_DYNAMIC_WRITE_ONLY_DISCARDABLE    -> GL.StreamDraw
+    ; _                                     -> GL.DynamicDraw
+    }
+
+getGLType :: VertexElementType -> GL.DataType
+getGLType t = case t of
+    { VET_FLOAT1        -> GL.Float
+    ; VET_FLOAT2        -> GL.Float
+    ; VET_FLOAT3        -> GL.Float
+    ; VET_FLOAT4        -> GL.Float
+    ; VET_SHORT1        -> GL.Short
+    ; VET_SHORT2        -> GL.Short
+    ; VET_SHORT3        -> GL.Short
+    ; VET_SHORT4        -> GL.Short
+    ; VET_COLOUR_ABGR   -> GL.UnsignedByte
+    ; VET_COLOUR_ARGB   -> GL.UnsignedByte
+    ; VET_UBYTE4        -> GL.UnsignedByte
+    }
+
+getGLTextureTarget :: TextureType -> GL.TextureTarget
+getGLTextureTarget textureType = case textureType of
+    { TEX_TYPE_1D       -> GL.Texture1D
+    ; TEX_TYPE_2D       -> GL.Texture2D
+    ; TEX_TYPE_3D       -> GL.Texture3D
+    ; TEX_TYPE_CUBE_MAP -> GL.TextureCubeMap
+    }
+
+
+optionalPO2 :: RenderSystemCapabilities -> Int -> Int
+optionalPO2 rcaps value = case Set.member RSC_NON_POWER_OF_2_TEXTURES (rscCapabilities rcaps) of
+    { True  -> value
+    ; False -> 2 ^ ( 1 + log2 (value-1) )
+    }
+  where
+    log2 n = case n of
+      0 -> -1
+      _ -> 1 + log2 (shiftR n 1) 
+
+getMaxMipmaps :: Int -> Int -> Int -> PixelFormat -> Int
+getMaxMipmaps width height depth format = maximum [f width, f height, f depth]
+  where
+    f x = floor $ logBase 2 $ fromIntegral x
+{-
+	size_t GLPixelUtil::getMaxMipmaps(size_t width, size_t height, size_t depth, PixelFormat format)
+	{
+		size_t count = 0;
+		do {
+			if(width>1)		width = width/2;
+			if(height>1)	height = height/2;
+			if(depth>1)		depth = depth/2;
+				
+			count ++;
+		} while(!(width == 1 && height == 1 && depth == 1));
+		
+		return count;
+	}
+-}
+-- TODO
+getNativeFormat :: TextureType -> PixelFormat -> Bool -> PixelFormat
+getNativeFormat ttype format isTarget = PF_R8G8B8
+{-
+	PixelFormat GLTextureManager::getNativeFormat(TextureType ttype, PixelFormat format, int usage)
+	{
+		// Adjust requested parameters to capabilities
+        const RenderSystemCapabilities *caps = Root::getSingleton().getRenderSystem()->getCapabilities();
+
+		// Check compressed texture support
+		// if a compressed format not supported, revert to PF_A8R8G8B8
+		if(PixelUtil::isCompressed(format) &&
+            !caps->hasCapability( RSC_TEXTURE_COMPRESSION_DXT ))
+		{
+			return PF_A8R8G8B8;
+		}
+		// if floating point textures not supported, revert to PF_A8R8G8B8
+		if(PixelUtil::isFloatingPoint(format) &&
+            !caps->hasCapability( RSC_TEXTURE_FLOAT ))
+		{
+			return PF_A8R8G8B8;
+		}
+        
+        // Check if this is a valid rendertarget format
+		if( usage & TU_RENDERTARGET )
+        {
+            /// Get closest supported alternative
+            /// If mFormat is supported it's returned
+            return GLRTTManager::getSingleton().getSupportedAlternative(format);
+        }
+
+		// Supported
+		return format;
+	}
+
+    PixelFormat GLRTTManager::getSupportedAlternative(PixelFormat format)
+    {
+        if(checkFormat(format))
+            return format;
+        /// Find first alternative
+        PixelComponentType pct = PixelUtil::getComponentType(format);
+        switch(pct)
+        {
+        case PCT_BYTE: format = PF_A8R8G8B8; break;
+        case PCT_SHORT: format = PF_SHORT_RGBA; break;
+        case PCT_FLOAT16: format = PF_FLOAT16_RGBA; break;
+        case PCT_FLOAT32: format = PF_FLOAT32_RGBA; break;
+        case PCT_COUNT: break;
+        }
+        if(checkFormat(format))
+            return format;
+        /// If none at all, return to default
+        return PF_A8R8G8B8;
+    }
+-}
+getGLInternalFormat :: PixelFormat -> Bool -> GL.PixelInternalFormat
+getGLInternalFormat mFormat hwGamma = case mFormat of
+    { PF_L8             -> GL.Luminance8
+    ; PF_L16            -> GL.Luminance16
+    ; PF_A8             -> GL.Alpha8
+    ; PF_A4L4           -> GL.Luminance4Alpha4
+    ; PF_BYTE_LA        -> GL.Luminance8Alpha8
+    ; PF_R3G3B2         -> GL.R3G3B2
+    ; PF_A1R5G5B5       -> GL.RGB5A1
+    ; PF_R5G6B5         -> GL.RGB5
+    ; PF_B5G6R5         -> GL.RGB5
+    ; PF_A4R4G4B4       -> GL.RGBA4
+    ; PF_R8G8B8         -> if hwGamma then GL.SRGB8 else GL.RGB8
+    ; PF_B8G8R8         -> if hwGamma then GL.SRGB8 else GL.RGB8
+    ; PF_X8B8G8R8       -> if hwGamma then GL.SRGB8 else GL.RGB8
+    ; PF_X8R8G8B8       -> if hwGamma then GL.SRGB8 else GL.RGB8
+    ; PF_A8R8G8B8       -> if hwGamma then GL.SRGB8Alpha8 else GL.RGBA8
+    ; PF_B8G8R8A8       -> if hwGamma then GL.SRGB8Alpha8 else GL.RGBA8 
+    ; PF_A2R10G10B10    -> GL.RGB10A2
+    ; PF_A2B10G10R10    -> GL.RGB10A2
+--FIXME    ; PF_FLOAT16_R      -> GL_LUMINANCE16F_ARB
+--FIXME    ; PF_FLOAT16_RGB    -> GL_RGB16F_ARB
+--FIXME    ; PF_FLOAT16_GR     -> GL_LUMINANCE_ALPHA16F_ARB
+--FIXME    ; PF_FLOAT16_RGBA   -> GL_RGBA16F_ARB
+--FIXME    ; PF_FLOAT32_R      -> GL_LUMINANCE32F_ARB
+--FIXME    ; PF_FLOAT32_GR     -> GL_LUMINANCE_ALPHA32F_ARB
+--FIXME    ; PF_FLOAT32_RGB    -> GL_RGB32F_ARB
+--FIXME    ; PF_FLOAT32_RGBA   -> GL_RGBA32F_ARB
+    ; PF_SHORT_RGBA     -> GL.RGBA16
+    ; PF_SHORT_RGB      -> GL.RGB16
+    ; PF_SHORT_GR       -> GL.Luminance16Alpha16
+--			case PF_DXT1:
+--				if (hwGamma)
+--					return GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT;
+--				else
+--					return GL_COMPRESSED_RGBA_S3TC_DXT1_EXT;
+--            case PF_DXT3:
+--				if (hwGamma)
+--					return GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT;
+--				else
+--	                return GL_COMPRESSED_RGBA_S3TC_DXT3_EXT;
+--            case PF_DXT5:
+--				if (hwGamma)
+--					return GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT;
+--				else
+--	                return GL_COMPRESSED_RGBA_S3TC_DXT5_EXT;
+    ; _                 -> error "Unsupported pixel format"
+    }
+{-   
+    GLenum GLPixelUtil::getGLInternalFormat(PixelFormat mFormat, bool hwGamma)
+    {
+        switch(mFormat) {
+            default:
+                return GL_NONE;
+        }
+    }
+    GLenum GLPixelUtil::getClosestGLInternalFormat(PixelFormat mFormat, bool hwGamma)
+    {
+        GLenum format = getGLInternalFormat(mFormat, hwGamma);
+        if(format==GL_NONE)
+		{
+			if (hwGamma)
+				return GL_SRGB8;
+			else
+				return GL_RGBA8;
+		}
+        else
+            return format;
+    }
+-}
+getClosestGLInternalFormat :: PixelFormat -> Bool -> GL.PixelInternalFormat
+getClosestGLInternalFormat mFormat hwGamma = case mFormat of
+    { PF_L8             -> GL.Luminance8
+    ; PF_L16            -> GL.Luminance16
+    ; PF_A8             -> GL.Alpha8
+    ; PF_A4L4           -> GL.Luminance4Alpha4
+    ; PF_BYTE_LA        -> GL.Luminance8Alpha8
+    ; PF_R3G3B2         -> GL.R3G3B2
+    ; PF_A1R5G5B5       -> GL.RGB5A1
+    ; PF_R5G6B5         -> GL.RGB5
+    ; PF_B5G6R5         -> GL.RGB5
+    ; PF_A4R4G4B4       -> GL.RGBA4
+    ; PF_R8G8B8         -> if hwGamma then GL.SRGB8 else GL.RGB8
+    ; PF_B8G8R8         -> if hwGamma then GL.SRGB8 else GL.RGB8
+    ; PF_X8B8G8R8       -> if hwGamma then GL.SRGB8 else GL.RGB8
+    ; PF_X8R8G8B8       -> if hwGamma then GL.SRGB8 else GL.RGB8
+    ; PF_A8R8G8B8       -> if hwGamma then GL.SRGB8Alpha8 else GL.RGBA8
+    ; PF_B8G8R8A8       -> if hwGamma then GL.SRGB8Alpha8 else GL.RGBA8 
+    ; PF_A2R10G10B10    -> GL.RGB10A2
+    ; PF_A2B10G10R10    -> GL.RGB10A2
+--FIXME    ; PF_FLOAT16_R      -> GL_LUMINANCE16F_ARB
+--FIXME    ; PF_FLOAT16_RGB    -> GL_RGB16F_ARB
+--FIXME    ; PF_FLOAT16_GR     -> GL_LUMINANCE_ALPHA16F_ARB
+--FIXME    ; PF_FLOAT16_RGBA   -> GL_RGBA16F_ARB
+--FIXME    ; PF_FLOAT32_R      -> GL_LUMINANCE32F_ARB
+--FIXME    ; PF_FLOAT32_GR     -> GL_LUMINANCE_ALPHA32F_ARB
+--FIXME    ; PF_FLOAT32_RGB    -> GL_RGB32F_ARB
+--FIXME    ; PF_FLOAT32_RGBA   -> GL_RGBA32F_ARB
+    ; PF_SHORT_RGBA     -> GL.RGBA16
+    ; PF_SHORT_RGB      -> GL.RGB16
+    ; PF_SHORT_GR       -> GL.Luminance16Alpha16
+-- FIXME
+--			case PF_DXT1:
+--				if (hwGamma)
+--					return GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT;
+--				else
+--					return GL_COMPRESSED_RGBA_S3TC_DXT1_EXT;
+--            case PF_DXT3:
+--				if (hwGamma)
+--					return GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT;
+--				else
+--	                return GL_COMPRESSED_RGBA_S3TC_DXT3_EXT;
+--            case PF_DXT5:
+--				if (hwGamma)
+--					return GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT;
+--				else
+--	                return GL_COMPRESSED_RGBA_S3TC_DXT5_EXT;
+    ; _                 -> if hwGamma then GL.SRGB8 else GL.RGBA8
+    }
+
+getBlendMode :: SceneBlendFactor -> GL.BlendingFactor
+getBlendMode blend = case blend of
+    { SBF_ONE                       -> GL.One
+    ; SBF_ZERO                      -> GL.Zero
+    ; SBF_DEST_COLOUR               -> GL.DstColor
+    ; SBF_SOURCE_COLOUR             -> GL.SrcColor
+    ; SBF_ONE_MINUS_DEST_COLOUR     -> GL.OneMinusDstColor
+    ; SBF_ONE_MINUS_SOURCE_COLOUR   -> GL.OneMinusSrcColor
+    ; SBF_DEST_ALPHA                -> GL.DstAlpha
+    ; SBF_SOURCE_ALPHA              -> GL.SrcAlpha
+    ; SBF_ONE_MINUS_DEST_ALPHA      -> GL.OneMinusDstAlpha
+    ; SBF_ONE_MINUS_SOURCE_ALPHA    -> GL.OneMinusSrcAlpha
+    }
+
+getBlendEquation op = case op of
+    { SBO_ADD               -> GL.FuncAdd
+    ; SBO_SUBTRACT          -> GL.FuncSubtract
+    ; SBO_REVERSE_SUBTRACT  -> GL.FuncReverseSubtract
+    ; SBO_MIN               -> GL.Min
+    ; SBO_MAX               -> GL.Max
+    }
+
+getTextureAddressingMode tam = case tam of
+    { TAM_WRAP      -> (GL.Repeated, GL.Repeat)
+    ; TAM_MIRROR    -> (GL.Mirrored, GL.Repeat)
+    ; TAM_CLAMP     -> (GL.Repeated, GL.ClampToEdge)
+    ; TAM_BORDER    -> (GL.Repeated, GL.ClampToBorder)
+    }
+
+getLayerBlendSource src = case src of 
+    { LBS_CURRENT   -> GL.Previous
+    ; LBS_TEXTURE   -> GL.CurrentUnit
+    ; LBS_MANUAL    -> GL.Constant
+    ; LBS_DIFFUSE   -> GL.PrimaryColor
+    ; LBS_SPECULAR  -> GL.PrimaryColor
+    }
+
+getTextureCombineFunction hasDot3 op = case op of
+    { LBX_SOURCE1               -> GL.Replace'
+    ; LBX_SOURCE2               -> GL.Replace'
+    ; LBX_MODULATE              -> GL.Modulate'
+    ; LBX_MODULATE_X2           -> GL.Modulate'
+    ; LBX_MODULATE_X4           -> GL.Modulate'
+    ; LBX_ADD                   -> GL.AddUnsigned'
+    ; LBX_ADD_SIGNED            -> GL.AddSigned
+    ; LBX_ADD_SMOOTH            -> GL.Interpolate
+    ; LBX_SUBTRACT              -> GL.Subtract
+    ; LBX_BLEND_DIFFUSE_COLOUR  -> GL.Interpolate
+    ; LBX_BLEND_DIFFUSE_ALPHA   -> GL.Interpolate
+    ; LBX_BLEND_TEXTURE_ALPHA   -> GL.Interpolate
+    ; LBX_BLEND_CURRENT_ALPHA   -> GL.Interpolate
+    ; LBX_BLEND_MANUAL          -> GL.Interpolate
+    ; LBX_DOTPRODUCT            -> if hasDot3 then GL.Dot3RGB else GL.Modulate'
+    }
+
+convertCompareFunction f = case f of
+    { CMPF_ALWAYS_FAIL      -> GL.Never
+    ; CMPF_ALWAYS_PASS      -> GL.Always
+    ; CMPF_LESS             -> GL.Less
+    ; CMPF_LESS_EQUAL       -> GL.Lequal
+    ; CMPF_EQUAL            -> GL.Equal
+    ; CMPF_NOT_EQUAL        -> GL.Notequal
+    ; CMPF_GREATER_EQUAL    -> GL.Gequal
+    ; CMPF_GREATER          -> GL.Greater
+    }
diff --git a/Graphics/LambdaCube/RenderSystem/GL/GLVertexBuffer.hs b/Graphics/LambdaCube/RenderSystem/GL/GLVertexBuffer.hs
new file mode 100644
--- /dev/null
+++ b/Graphics/LambdaCube/RenderSystem/GL/GLVertexBuffer.hs
@@ -0,0 +1,133 @@
+module Graphics.LambdaCube.RenderSystem.GL.GLVertexBuffer where
+
+import Data.Word
+import Data.Maybe
+import Foreign.Marshal.Alloc
+import Foreign.Marshal.Utils
+import Foreign.Storable
+import Foreign.C.Types
+import Foreign.Ptr
+import Data.IORef
+import Control.Monad
+
+import Graphics.Rendering.OpenGL (($=))
+import qualified Graphics.Rendering.OpenGL as GL
+
+import Graphics.LambdaCube.RenderSystem
+import Graphics.LambdaCube.HardwareBuffer
+import Graphics.LambdaCube.HardwareVertexBuffer
+import Graphics.LambdaCube.RenderSystem.GL.GLUtils
+
+-- | Specialisation of HardwareVertexBuffer for GL
+data GLVertexBuffer
+    = GLVertexBuffer
+    { glvbNumVertices      :: Int
+    , glvbVertexSize       :: Int
+            
+    , glvbUsage            :: Usage
+    , glvbLockInfo         :: IORef (Maybe (Int,Int,Bool)) -- LockStart LockSize RequireUpdate
+    
+    , glvbShadowBuffer     :: Maybe (Ptr Word8)
+    , glvbBufferObject     :: Maybe GL.BufferObject
+    }
+    deriving Eq
+
+instance HardwareVertexBuffer GLVertexBuffer where
+    getVertexSize   = glvbVertexSize
+    getNumVertices  = glvbNumVertices
+
+instance HardwareBuffer GLVertexBuffer where
+    getSizeInBytes b    = glvbVertexSize b * glvbNumVertices b
+    isSystemMemory      = isNothing . glvbBufferObject
+    hasShadowBuffer b   = (isJust $ glvbShadowBuffer b) && (isJust $ glvbBufferObject b)
+    getUsage            = glvbUsage
+    isLocked            = glvbIsLocked
+    unlock              = glvbUnlock
+    lock                = glvbLock
+
+glvbIsLocked b = do
+    i <- readIORef $ glvbLockInfo b
+    return $ isJust i
+
+glvbLock a offs len opts = do
+    lockinfo <- readIORef (glvbLockInfo a)
+    when (isJust lockinfo) $ error "Cannot lock this buffer, it is already locked!"
+    writeIORef (glvbLockInfo a) $ Just (offs,len,opts /= HBL_READ_ONLY)
+    case glvbShadowBuffer a of
+        { Just b    -> return $ plusPtr b offs
+        ; Nothing   -> do
+            GL.bindBuffer GL.ArrayBuffer $= (glvbBufferObject a)
+            -- Discard if required
+            when (opts == HBL_DISCARD) $ GL.bufferData GL.ArrayBuffer $= (fromIntegral $ getSizeInBytes a, nullPtr, getGLUsage $ getUsage a)
+            let isWriteOnly = case getUsage a of
+                    { HBU_WRITE_ONLY                        -> True
+                    ; HBU_STATIC_WRITE_ONLY                 -> True
+                    ; HBU_DYNAMIC_WRITE_ONLY                -> True
+                    ; HBU_DYNAMIC_WRITE_ONLY_DISCARDABLE    -> True
+                    ; _                                     -> False
+                    }
+                access = case (isWriteOnly,opts == HBL_READ_ONLY) of
+                    { (False,False) -> GL.ReadWrite
+                    ; (False,True)  -> GL.ReadOnly
+                    ; (True,_)      -> GL.WriteOnly
+                    }
+            mb <- GL.mapBuffer GL.ArrayBuffer access
+            case mb of
+                { Just b    -> return $ plusPtr b offs
+                ; Nothing   -> error "Vertex Buffer: Out of memory"
+                }
+        }
+
+glvbUnlock a = do
+    lockinfo <- readIORef (glvbLockInfo a)
+    let (lockStart,lockSize,reqUpdate) = case lockinfo of
+            { Just li   -> li
+            ; Nothing   -> error "Cannot unlock this buffer, it is not locked!"
+            }
+    writeIORef (glvbLockInfo a) Nothing
+    case glvbShadowBuffer a of
+        { Just b    -> when reqUpdate $ do -- If we used the shadow buffer this time...
+            GL.bindBuffer GL.ArrayBuffer $= (glvbBufferObject a)
+            case lockStart == 0 && lockSize == getSizeInBytes a of
+                { True  -> GL.bufferData GL.ArrayBuffer $= (fromIntegral lockSize, b, getGLUsage $ getUsage a)
+                ; False -> GL.bufferSubData GL.ArrayBuffer GL.WriteToBuffer (fromIntegral lockStart) (fromIntegral lockSize) b
+                }
+        ; Nothing   -> do
+            GL.bindBuffer GL.ArrayBuffer $= (glvbBufferObject a)
+            ok <- GL.unmapBuffer GL.ArrayBuffer
+            unless ok $ error "Buffer data corrupted, please reload"
+        }
+        
+--mkGLVertexBuffer :: RenderSystem rs => rs -> Int -> Int -> Usage -> Bool -> IO GLVertexBuffer
+mkGLVertexBuffer rs vertexSize numVerts usage useShadowBuffer = do
+    lockinfo <- newIORef Nothing
+    [bufferObject] <- GL.genObjectNames 1
+    GL.bindBuffer GL.ArrayBuffer $= Just bufferObject
+    GL.bufferData GL.ArrayBuffer $= (fromIntegral $ numVerts * vertexSize, nullPtr, getGLUsage usage)
+    shadowBuffer <- case useShadowBuffer of
+        { True  -> do
+            b <- mallocBytes $ numVerts * vertexSize
+            return $ Just b
+        ; False -> return Nothing
+        }
+    return $ GLVertexBuffer
+        { glvbNumVertices      = numVerts
+        , glvbVertexSize       = vertexSize
+                
+        , glvbUsage            = usage
+        , glvbLockInfo         = lockinfo
+
+        , glvbShadowBuffer     = shadowBuffer
+        , glvbBufferObject     = Just bufferObject
+        }
+
+rmGLVertexBuffer :: GLVertexBuffer -> IO ()
+rmGLVertexBuffer a = do
+    case glvbBufferObject a of
+        { Just b    -> GL.deleteObjectNames [b]
+        ; Nothing   -> return ()
+        }
+    case glvbShadowBuffer a of
+        { Just b    -> free b
+        ; Nothing   -> return ()
+        }
diff --git a/Graphics/LambdaCube/RenderSystemCapabilities.hs b/Graphics/LambdaCube/RenderSystemCapabilities.hs
new file mode 100644
--- /dev/null
+++ b/Graphics/LambdaCube/RenderSystemCapabilities.hs
@@ -0,0 +1,119 @@
+module Graphics.LambdaCube.RenderSystemCapabilities where
+
+import Data.Set
+
+import Graphics.LambdaCube.Types
+
+-- | Enum describing the different hardware capabilities we want to check for
+data Capabilities
+    = RSC_AUTOMIPMAP                    -- ^ Supports generating mipmaps in hardware
+    | RSC_BLENDING
+    | RSC_ANISOTROPY                    -- ^ Supports anisotropic texture filtering
+    | RSC_DOT3                          -- ^ Supports fixed-function DOT3 texture blend
+    | RSC_CUBEMAPPING                   -- ^ Supports cube mapping
+    | RSC_HWSTENCIL                     -- ^ Supports hardware stencil buffer
+    | RSC_VBO                           -- ^ Supports hardware vertex and index buffers
+    | RSC_VERTEX_PROGRAM                -- ^ Supports vertex programs (vertex shaders)
+    | RSC_FRAGMENT_PROGRAM              -- ^ Supports fragment programs (pixel shaders)
+    | RSC_SCISSOR_TEST                  -- ^ Supports performing a scissor test to exclude areas of the screen
+    | RSC_TWO_SIDED_STENCIL             -- ^ Supports separate stencil updates for both front and back faces
+    | RSC_STENCIL_WRAP                  -- ^ Supports wrapping the stencil value at the range extremeties
+    | RSC_HWOCCLUSION                   -- ^ Supports hardware occlusion queries
+    | RSC_USER_CLIP_PLANES              -- ^ Supports user clipping planes
+    | RSC_VERTEX_FORMAT_UBYTE4          -- ^ Supports the VET_UBYTE4 vertex element type
+    | RSC_INFINITE_FAR_PLANE            -- ^ Supports infinite far plane projection
+    | RSC_HWRENDER_TO_TEXTURE           -- ^ Supports hardware render-to-texture (bigger than framebuffer)
+    | RSC_TEXTURE_FLOAT                 -- ^ Supports float textures and render targets
+    | RSC_NON_POWER_OF_2_TEXTURES       -- ^ Supports non-power of two textures
+    | RSC_TEXTURE_3D                    -- ^ Supports 3d (volume) textures
+    | RSC_POINT_SPRITES                 -- ^ Supports basic point sprite rendering
+    | RSC_POINT_EXTENDED_PARAMETERS     -- ^ Supports extra point parameters (minsize, maxsize, attenuation)
+    | RSC_VERTEX_TEXTURE_FETCH          -- ^ Supports vertex texture fetch
+    | RSC_MIPMAP_LOD_BIAS               -- ^ Supports mipmap LOD biasing
+    | RSC_GEOMETRY_PROGRAM              -- ^ Supports hardware geometry programs
+    | RSC_HWRENDER_TO_VERTEX_BUFFER     -- ^ Supports rendering to vertex buffers
+
+    | RSC_TEXTURE_COMPRESSION           -- ^ Supports compressed textures
+    | RSC_TEXTURE_COMPRESSION_DXT       -- ^ Supports compressed textures in the DXT/ST3C formats
+    | RSC_TEXTURE_COMPRESSION_VTC       -- ^ Supports compressed textures in the VTC format
+    | RSC_TEXTURE_COMPRESSION_PVRTC     -- ^ Supports compressed textures in the PVRTC format
+    | RSC_FIXED_FUNCTION                -- ^ Supports fixed-function pipeline
+    | RSC_MRT_DIFFERENT_BIT_DEPTHS      -- ^ Supports MRTs with different bit depths
+    | RSC_ALPHA_TO_COVERAGE             -- ^ Supports Alpha to Coverage (A2C)
+    | RSC_ADVANCED_BLEND_OPERATIONS     -- ^ Supports Blending operations other than +
+
+    -- * DirectX specific caps
+    | RSC_PERSTAGECONSTANT              -- ^ Is DirectX feature "per stage constants" supported
+
+    -- * GL Specific Caps
+    | RSC_GL1_5_NOVBO                   -- ^ Supports openGL GLEW version 1.5
+    | RSC_FBO                           -- ^ Support for Frame Buffer Objects (FBOs)
+    | RSC_FBO_ARB                       -- ^ Support for Frame Buffer Objects ARB implementation (regular FBO is higher precedence)
+    | RSC_FBO_ATI                       -- ^ Support for Frame Buffer Objects ATI implementation (ARB FBO is higher precedence)
+    | RSC_PBUFFER                       -- ^ Support for PBuffer
+    | RSC_GL1_5_NOHWOCCLUSION           -- ^ Support for GL 1.5 but without HW occlusion workaround
+    | RSC_POINT_EXTENDED_PARAMETERS_ARB -- ^ Support for point parameters ARB implementation
+    | RSC_POINT_EXTENDED_PARAMETERS_EXT -- ^ Support for point parameters EXT implementation
+    deriving (Eq,Ord)
+
+data DriverVersion 
+    = DriverVersion 
+    { dvMajor   :: Int
+    , dvMinor   :: Int
+    , dvRelease :: Int
+    , dvBuild   :: Int
+    }
+    deriving Eq
+
+-- | Enumeration of GPU vendors.
+data GPUVendor
+    = GPU_UNKNOWN
+    | GPU_NVIDIA
+    | GPU_ATI
+    | GPU_INTEL
+    | GPU_S3
+    | GPU_MATROX
+    | GPU_3DLABS
+    | GPU_SIS
+    | GPU_IMAGINATION_TECHNOLOGIES
+    | GPU_APPLE -- ^ Apple Software Renderer
+    deriving Eq
+
+{-| singleton class for storing the capabilities of the graphics card. 
+@remarks
+This class stores the capabilities of the graphics card.  This
+information is set by the individual render systems.
+-}
+data RenderSystemCapabilities
+    = RenderSystemCapabilities
+    { rscDriverVersion                      :: DriverVersion
+    , rscVendor                             :: GPUVendor        -- ^ GPU Vendor
+
+--    , rscNumWorldMatrices                   :: Int              -- ^ The number of world matrices available
+    , rscNumTextureUnits                    :: Int              -- ^ The number of texture units available
+    , rscStencilBufferBitDepth              :: Int              -- ^ The stencil buffer bit depth
+--    , rscNumVertexBlendMatrices             :: Int              -- ^ The number of matrices available for hardware blending
+    , rscCapabilities                       :: Set Capabilities -- ^ Stores the capabilities flags.
+
+    , rscDeviceName                         :: String           -- ^ The name of the device as reported by the render system
+    , rscRenderSystemName                   :: String           -- ^ The identifier associated with the render system for which these capabilities are valid
+
+    , rscVertexProgramConstantFloatCount    :: Int              -- ^ The number of floating-point constants vertex programs support
+    , rscVertexProgramConstantIntCount      :: Int              -- ^ The number of integer constants vertex programs support
+    , rscVertexProgramConstantBoolCount     :: Int              -- ^ The number of boolean constants vertex programs support
+    , rscGeometryProgramConstantFloatCount  :: Int              -- ^ The number of floating-point constants geometry programs support
+    , rscGeometryProgramConstantIntCount    :: Int              -- ^ The number of integer constants vertex geometry support
+    , rscGeometryProgramConstantBoolCount   :: Int              -- ^ The number of boolean constants vertex geometry support
+    , rscFragmentProgramConstantFloatCount  :: Int              -- ^ The number of floating-point constants fragment programs support
+    , rscFragmentProgramConstantIntCount    :: Int              -- ^ The number of integer constants fragment programs support
+    , rscFragmentProgramConstantBoolCount   :: Int              -- ^ The number of boolean constants fragment programs support
+    , rscNumMultiRenderTargets              :: Int              -- ^ The number of simultaneous render targets supported
+    , rscMaxPointSize                       :: FloatType        -- ^ The maximum point size
+    , rscNonPOW2TexturesLimited             :: Bool             -- ^ Are non-POW2 textures feature-limited?
+    , rscNumVertexTextureUnits              :: Int              -- ^ The number of vertex texture units supported
+    , rscVertexTextureUnitsShared           :: Bool             -- ^ Are vertex texture units shared with fragment processor?
+    , rscGeometryProgramNumOutputVertices   :: Int              -- ^ The number of vertices a geometry program can emit in a single run
+
+    , rscSupportedShaderProfiles            :: Set String       -- ^ The list of supported shader profiles
+    }
+
diff --git a/Graphics/LambdaCube/Resource.hs b/Graphics/LambdaCube/Resource.hs
new file mode 100644
--- /dev/null
+++ b/Graphics/LambdaCube/Resource.hs
@@ -0,0 +1,145 @@
+module Graphics.LambdaCube.Resource where
+
+import qualified Data.List as List
+import Data.Map (Map)
+import qualified Data.Map as Map
+import Control.Monad
+import System.Directory
+import System.FilePath
+
+import qualified Data.ByteString.Lazy as B
+import qualified Data.ByteString as SB
+import Data.ByteString.Internal as B
+import Codec.Archive.Zip
+import System.Log.Logger
+
+import Graphics.LambdaCube.Loader.CompositorScript
+import Graphics.LambdaCube.Loader.MaterialScript
+import Graphics.LambdaCube.Loader.ResourceScript
+import Graphics.LambdaCube.Compositor
+import Graphics.LambdaCube.Material
+import Graphics.LambdaCube.Texture
+import Graphics.LambdaCube.GpuProgram
+import Graphics.LambdaCube.World
+
+-- load resources into resource library (initResources :: [ResourceGroup] -> ResourceLibrary)
+
+{-
+    Stores data about:
+      - loaded meshes (name)
+      - loaded and compiled materials (name)
+-}
+
+-- TODO: load all available materials
+-- scan path tree searching for *.material files
+data (Texture t, GpuProgram p, LinkedGpuProgram lp) => ResourceItem t p lp
+    = RI_Material   (String,Material t lp)
+    | RI_GpuProgram (String,GpuProgramDescriptor p)
+    | RI_Compositor (String,Compositor t lp)
+                
+addConfig cfgFile world = do
+    Just rp <- loadResourcesCfg cfgFile
+    addResourceLibrary rp world
+
+addResourceLibrary resPath w@World { wrResource = res } = do
+    -- fold on every group and path
+    -- getDirectoryContents :: FilePath -> IO [FilePath]
+    -- doesDirectoryExist :: FilePath -> IO Bool
+    -- takeExtension :: FilePath -> String
+    -- TODO:
+    --  scan whole resource path searching for resource files and load them:
+    --    .material
+    --    .program
+    --  add normal (uncompiled) materials to material library
+    let loadResGrp s (_,l) = foldM loadRes s l
+        loadRes l (PathZip,n) = return l
+        loadRes l p@(PathDir,n) = do
+            ok <- doesDirectoryExist n
+            case ok of
+                { True  -> do
+                    c <- getDirectoryContents n
+                    foldM (loadItem n) l c
+                ; False -> return l
+                }
+        loadItem dn l n = do
+            --parseMaterial -> Maybe (mats,verts,frags)
+            case takeExtension n of
+                { ".material" -> do
+                    debugM "ResourceLibrary" $ "load: " ++ n
+                    f <- B.readFile $ dn ++ "/" ++ n -- FIXME: this is temporary solution
+                    mb <- parseMaterial n $ map B.w2c $ B.unpack f
+                    case mb of
+                        { Nothing   -> do
+                            errorM  "ResourceLibrary" $ "Syntax error in file " ++ n
+                            return l
+                        ; Just (ml,vpl,fpl) -> do
+                            let ms = [RI_Material (mtName m,m) | m <- ml]
+                                vs = [RI_GpuProgram (gpdName m,m) | m <- vpl]
+                                fs = [RI_GpuProgram (gpdName m,m) | m <- fpl]
+                            return $ l ++ ms ++ vs ++ fs
+                        }
+                ; ".compositor" -> do
+                    debugM "ResourceLibrary" $ "load: " ++ n
+                    f <- B.readFile $ dn ++ "/" ++ n -- FIXME: this is temporary solution
+                    mb <- parseCompositor n $ map B.w2c $ B.unpack f
+                    case mb of
+                        { Nothing   -> do
+                            errorM  "ResourceLibrary" $ "Syntax error in file " ++ n
+                            return l
+                        ; Just cl -> do
+                            return $ l ++ [RI_Compositor (cmpName m,m) | m <- cl]
+                        }
+                ; _ -> return l
+                }
+        insertList = List.foldl' (flip (uncurry Map.insert))
+    l <- foldM loadResGrp [] resPath
+    return w { wrResource = res 
+                { rlResourceGroups = resPath ++ rlResourceGroups res
+                , rlMaterialMap     = insertList (rlMaterialMap res)    [m | (RI_Material m) <- l]
+                , rlGpuProgramMap   = insertList (rlGpuProgramMap res)  [m | (RI_GpuProgram m) <- l]
+                , rlCompositorMap   = insertList (rlCompositorMap res)  [m | (RI_Compositor m) <- l]
+                }
+             }
+               --ResourceLibrary (resPath++path) meshes (Map.union mats materialMap) texes (Map.union shads shaderMap) progs
+
+{-
+loadResourceGroup
+dropResourceGroup
+-}
+
+{-
+--compileMaterial
+-- load textures from disk to opengl
+-- drops unnecessary techniques (include,exlude rules)
+compileMaterial :: ResourceLibrary -> String -> IO (ResourceLibrary,Material)
+compileMaterial rlib m = do
+    let mm = (rlMaterialMap rlib)
+    if Map.notMember m mm then error ("Unknown material: " ++ m) else return ()
+    let (mt,mcmt) = mm Map.! m
+    (rlib',cmt) <- if isJust mcmt then return (rlib,fromMaybe (error "fromJust 0") mcmt) else compMat rlib mt -- copy original material data and load texture units
+    return (rlib',cmt) where
+        compMat rl mat@(Material {mtTechnique=techs}) = do
+            debugM "ResourceLibrary" $ "compiling material: " ++ m
+            (rl',techs') <- foldM compTechnique (rl,[]) techs
+            let matmap' = insert m (mat,Just cmt') (rlMaterialMap rl) 
+                cmt' = mat{mtTechnique=techs'}
+            return (rl'{rlMaterialMap=matmap'},cmt')
+        compTechnique (rl,l) t@(Technique {tcPass=p}) = do
+            excl <- excludeTechnique t
+            if excl then return (rl, l) else do
+                (rl',p') <- foldM compPass (rl,[]) p
+                return (rl',(l ++ [t{tcPass=p'}]))
+        compPass (rl,l) p = do
+            (rl',tu') <- foldM compTexUnit (rl,[]) $ psTextureUnit p
+            let (ProgRefName prog) = psShaderProgram p
+            (rl'',prog') <- compileProgram rl' prog
+            return (rl'',(l ++ [p{psTextureUnit=tu', psShaderProgram=(ProgRefObj prog')}]))
+        compTexUnit (rl,l) tu = do
+            (rl',texid) <- loadTexture rl $ head $ tuTexture tu
+            return (rl',(l ++ [tu{tuTextureObject=Just [texid]}]))
+        excludeTechnique t@(Technique {tcPass=p}) = do
+            -- exclude if shaders are not supported
+            version <- GL.get (GL.majorMinor GL.glVersion)
+            let reqShaders = not $ null $ filter (\(Pass {psShaderProgram=(ProgRefName (vp,pp))})-> isJust vp || isJust pp) p
+            if reqShaders && version < (2,0) then return True else return False
+-}
diff --git a/Graphics/LambdaCube/SceneGraph.hs b/Graphics/LambdaCube/SceneGraph.hs
new file mode 100644
--- /dev/null
+++ b/Graphics/LambdaCube/SceneGraph.hs
@@ -0,0 +1,141 @@
+module Graphics.LambdaCube.SceneGraph where
+
+import Data.Maybe
+import Data.Map as Map hiding (map)
+import qualified Data.IntMap as IntMap
+import Data.List as List
+import Control.Monad
+import System.FilePath
+
+import Data.Graph.Inductive
+
+import Graphics.LambdaCube.Types
+import Graphics.LambdaCube.Common
+import Graphics.LambdaCube.Math
+import Graphics.LambdaCube.Light
+import Graphics.LambdaCube.Material
+import Graphics.LambdaCube.Entity
+import Graphics.LambdaCube.Resource
+import Graphics.LambdaCube.RenderQueue
+import Graphics.LambdaCube.World
+import Graphics.LambdaCube.Texture
+import Graphics.LambdaCube.RenderSystem
+    
+--type MkSceneObjectAction = World -> IO (World, SceneObject)
+--type MkNodeAction = ResourceLibrary -> IO (ResourceLibrary,(String,String),SceneNode)
+
+--simpleCamera :: String -> MkSceneObjectAction
+simpleCamera name w = return (w,cam)
+  where
+    cam = SO_Camera Camera
+        { cmName        = name
+        , cmFov         = 45
+        , cmNear        = 0.1
+        , cmFar         = 5000
+        , cmAspectRatio = Nothing
+        , cmPolygonMode = PM_SOLID
+        }
+
+--wireCamera :: String -> MkSceneObjectAction
+wireCamera name w = return (w,cam)
+  where
+    cam = SO_Camera Camera
+        { cmName        = name
+        , cmFov         = 45
+        , cmNear        = 0.1
+        , cmFar         = 5000
+        , cmAspectRatio = Nothing
+        , cmPolygonMode = PM_WIREFRAME
+        }
+
+--light :: MkSceneObjectAction
+light w = return (w,SO_Light $ Light {})
+
+--camera :: Camera -> MkSceneObjectAction
+camera cam w = return (w,SO_Camera cam)
+
+--mesh :: String -> MkSceneObjectAction
+mesh name w = do
+    (w',e) <- createEntity w name name
+    return (w', SO_Entity e)
+
+--meshMat :: String -> [String] -> MkSceneObjectAction
+meshMat name mats w0 = do
+    (w1,e0) <- createEntity w0 name name
+    (w2,e1) <- setEntityMaterial w1 mats e0
+    return (w2, SO_Entity e1)
+
+--mkNode :: String -> String -> Matrix4 -> [MkSceneObjectAction] -> MkNodeAction
+mkNode parent name t objActs w = do
+    (w',o) <- foldM mkObjs (w,[]) objActs
+    return (w',(parent,name),SceneNode name o t)
+  where
+    mkObjs (w,l) a = do
+        (w',so) <- a w
+        return (w',so:l)
+{-
+addSkyBox :: String -> World -> IO World
+addSkyBox s w@World { wrResource = rl, wrScene = scene } = do
+    (rl',mat) <- compileMaterial rl s
+    return w { wrResource = rl', wrScene = scene{scSky = Just $ SkyBox mat} }
+-}
+
+{-
+data Scene = Scene
+    { scGraph :: Gr String ()
+    -- use: bytestring-trie (efficient ByteString map)
+    , scMap   :: Map String SceneNode
+    , scSky   :: Maybe Sky
+    -- Fog settings
+    }
+-}
+--addScene :: [MkNodeAction] -> World -> IO World
+addScene nodes w@World { wrResource = rl, wrScene = scene } = do
+    -- done: create scene nodes
+    let mkNodes (w,pl,nl) a = do
+            (w',p,sn) <- a w
+            return (w',p:pl,sn:nl)
+    (w',p,nodel) <- foldM mkNodes (w,[],[]) nodes
+    -- done: register node ids and names to bimap
+    -- done: create graph nodes 
+    -- done: create graph edges
+    let namel = map snName nodel
+        nodeids = newNodes (length nodes) $ scGraph scene
+        m' = (scMap scene) `Map.union` (Map.fromList $ zip namel $ zip nodeids nodel)
+        g = insEdges (map fe p) $ insNodes (zip nodeids namel) $ scGraph scene
+        fe (p,c) = (fst $ m' ! p, fst $ m' ! c,())
+        scene' = scene 
+               { scGraph   = g
+               , scMap     = m'
+               --, scSky     :: Maybe Sky
+               }
+
+    return w' { wrScene = scene' }
+    
+--updateTransforms :: [(String,Matrix4)] -> World -> IO World
+updateTransforms l = return . mapScene (\s -> foldr updateSceneNode s l)
+  where
+    updateSceneNode (name,mat) scene = scene { scMap = Map.insert name (n,sn') m}
+      where
+        m = scMap scene
+        (n,sn) = m ! name
+        sn' = sn {snTransform = mat}
+
+--flattenScene :: Scene -> FlattenScene
+flattenScene s = FlattenScene
+                 { fsCamera     = [(m,c) | (m,SO_Camera c) <- fs]
+                 , fsRenderable = [(m,prepare m e,rq,pr) | (m,SO_Entity e) <- fs]
+                 , fsLight      = [(m,l) | (m,SO_Light l) <- fs]
+                 }
+  where
+    rq = constRenderQueueMain
+    pr = constRenderableDefaultPriority
+    fs = visitNode s 0 $ transl 0 0 0
+
+    --visitNode :: Scene -> Int -> Matrix4 -> [(Matrix4,SceneObject)]
+    visitNode g n t = [(lt,e) | e <- snObject ln ] ++ (concat [ visitNode g sn lt | sn <- suc (scGraph g) n ])
+      where
+        Just name = lab (scGraph g) n
+        ln = snd $ (scMap g) ! name
+        lt = (snTransform ln) <> t
+
diff --git a/Graphics/LambdaCube/Technique.hs b/Graphics/LambdaCube/Technique.hs
new file mode 100644
--- /dev/null
+++ b/Graphics/LambdaCube/Technique.hs
@@ -0,0 +1,84 @@
+module Graphics.LambdaCube.Technique where
+
+import Graphics.LambdaCube.RenderSystemCapabilities
+import Graphics.LambdaCube.Pass
+import Graphics.LambdaCube.Texture
+import Graphics.LambdaCube.GpuProgram
+
+-- | illumination pass state type
+data IlluminationPassesState
+    = IPS_COMPILE_DISABLED
+    | IPS_NOT_COMPILED
+    | IPS_COMPILED
+    deriving Eq
+
+{-| Directive used to manually control technique support based on the
+	inclusion or exclusion of some factor.
+-}
+data IncludeOrExclude
+    = INCLUDE -- ^ Inclusive - only support if present
+    | EXCLUDE -- ^ Exclusive - do not support if present
+    deriving Eq
+
+-- | Rule controlling whether technique is deemed supported based on GPU vendor
+data GPUVendorRule
+    = GPUVendorRule
+    { gvrVendor           :: GPUVendor
+    , gvrIncludeOrExclude :: IncludeOrExclude
+    }
+    deriving Eq
+
+-- | Rule controlling whether technique is deemed supported based on GPU device name
+data GPUDeviceNameRule
+    = GPUDeviceNameRule
+    { gdrDevicePattern    :: String
+    , gdrIncludeOrExclude :: IncludeOrExclude
+    , gdrCaseSensitive    :: Bool
+    }
+    deriving Eq
+
+{-| Class representing an approach to rendering this particular Material. 
+@remarks
+    Ogre will attempt to use the best technique supported by the active hardware, 
+    unless you specifically request a lower detail technique (say for distant
+    rendering).
+-}
+data (Texture t, LinkedGpuProgram lp) => Technique t lp
+    = Technique
+    { tchPasses             :: [Pass t lp]           -- ^ List of primary passes
+--    , tchIlluminationPasses :: [IlluminationPass] -- ^ List of derived passes, categorised into IlluminationStage (ordered)
+
+--    , tchIsSupported        :: Bool
+--    IlluminationPassesState mIlluminationPassesCompilationPhase;
+    , tchLodIndex           :: Int              -- ^ LOD level
+    {-| Scheme index, derived from scheme name but the names are held on
+    	MaterialManager, for speed an index is used here.
+    -}
+    , tchSchemeIndex        :: Int 
+    , tchName               :: String           -- ^ optional name for the technique
+    
+    {-| When casting shadow, if not using default Ogre shadow casting material, or 
+      nor using fixed function casting, mShadowCasterMaterial let you customize per material
+      shadow caster behavior
+    -}
+--    , tchShadowCasterMaterial :: Material
+    {-| When casting shadow, if not using default Ogre shadow casting material, or 
+      nor using fixed function casting, mShadowCasterMaterial let you customize per material
+      shadow caster behavior.There only material name is stored so that it can be loaded once all file parsed in a resource group.
+    -}
+--    , tchShadowCasterMaterialName :: String
+    {-| When receiving shadow, if not using default Ogre shadow receiving material, or 
+      nor using fixed function texture projection receiving, mShadowReceiverMaterial let you customize per material
+      shadow caster behavior
+    -}
+--    , tchShadowReceiverMaterial :: Material
+    {-| When receiving shadow, if not using default Ogre shadow receiving material, or 
+      nor using fixed function texture projection receiving, mShadowReceiverMaterial let you customize per material
+      shadow caster behavior. There only material name is stored so that it can be loaded once all file parsed in a resource group.
+    -}
+--    , tchShadowReceiverMaterialName :: String
+
+    , tchGPUVendorRules     :: [GPUVendorRule]
+    , tchGPUDeviceNameRules :: [GPUDeviceNameRule]
+    }
+    
diff --git a/Graphics/LambdaCube/Texture.hs b/Graphics/LambdaCube/Texture.hs
new file mode 100644
--- /dev/null
+++ b/Graphics/LambdaCube/Texture.hs
@@ -0,0 +1,81 @@
+module Graphics.LambdaCube.Texture where
+
+import Graphics.LambdaCube.Types
+import Graphics.LambdaCube.PixelFormat
+import Graphics.LambdaCube.HardwareBuffer
+
+
+-- | Enum identifying the texture usage
+data TextureUsage
+    = TextureUsage
+    { tuUsage           :: Usage
+    , tuAutoMipmap      :: Bool     -- ^ mipmaps will be automatically generated for this texture
+    , tuRenderTarget    :: Bool     -- ^ this texture will be a render target, i.e. used as a target for render to texture
+                                    --   setting this flag will ignore all other texture usages except TU_AUTOMIPMAP
+    }
+    deriving Eq
+{-
+enum TextureUsage
+{
+	/// @copydoc HardwareBuffer::Usage
+	TU_STATIC = HardwareBuffer::HBU_STATIC,
+	TU_DYNAMIC = HardwareBuffer::HBU_DYNAMIC,
+	TU_WRITE_ONLY = HardwareBuffer::HBU_WRITE_ONLY,
+	TU_STATIC_WRITE_ONLY = HardwareBuffer::HBU_STATIC_WRITE_ONLY, 
+	TU_DYNAMIC_WRITE_ONLY = HardwareBuffer::HBU_DYNAMIC_WRITE_ONLY,
+	TU_DYNAMIC_WRITE_ONLY_DISCARDABLE = HardwareBuffer::HBU_DYNAMIC_WRITE_ONLY_DISCARDABLE,
+	/// mipmaps will be automatically generated for this texture
+	TU_AUTOMIPMAP = 0x100,
+	/// this texture will be a render target, i.e. used as a target for render to texture
+	/// setting this flag will ignore all other texture usages except TU_AUTOMIPMAP
+	TU_RENDERTARGET = 0x200,
+	/// default to automatic mipmap generation static textures
+	TU_DEFAULT = TU_AUTOMIPMAP | TU_STATIC_WRITE_ONLY
+    
+};
+-}
+
+-- | Enum identifying the texture type
+data TextureType
+    = TEX_TYPE_1D       -- ^ 1D texture, used in combination with 1D texture coordinates
+    | TEX_TYPE_2D       -- ^ 2D texture, used in combination with 2D texture coordinates (default)
+    | TEX_TYPE_3D       -- ^ 3D volume texture, used in combination with 3D texture coordinates
+    | TEX_TYPE_CUBE_MAP -- ^ 3D cube map, used in combination with 3D texture coordinates
+    deriving (Eq,Show)
+
+-- | Enum identifying special mipmap numbers
+data TextureMipmap
+    = MIP_UNLIMITED -- ^ Generate mipmaps up to 1x1
+    | MIP_DEFAULT   -- ^ Use TextureManager default
+    | MIP_NUMBER Int
+    deriving Eq
+
+class (Eq a, HardwareBuffer a) => Texture a where
+    txName                      :: a -> String
+    txWidth                     :: a -> Int
+    txHeight                    :: a -> Int
+    txDepth                     :: a -> Int
+    txNumRequestedMipmaps       :: a -> TextureMipmap
+    txNumMipmaps                :: a -> Int
+    txMipmapsHardwareGenerated  :: a -> Bool
+    txGamma                     :: a -> FloatType
+    txHwGamma                   :: a -> Bool
+    txFSAA                      :: a -> Int
+    txFSAAHint                  :: a -> String
+    txTextureType               :: a -> TextureType
+    txFormat                    :: a -> PixelFormat
+
+    --txUsage                     :: a -> TextureUsage
+    txAutoMipmap                :: a -> Bool    -- ^ mipmaps will be automatically generated for this texture
+    txRenderTarget              :: a -> Bool    -- ^ this texture will be a render target, i.e. used as a target for render to texture
+                                                --   setting this flag will ignore all other texture usages except TU_AUTOMIPMAP
+
+    txSrcFormat                 :: a -> PixelFormat
+    txSrcWidth                  :: a -> Int
+    txSrcHeight                 :: a -> Int
+    txSrcDepth                  :: a -> Int
+
+    txDesiredFormat             :: a -> PixelFormat
+    txDesiredIntegerBitDepth    :: a -> Int
+    txDesiredFloatBitDepth      :: a -> Int
+    txTreatLuminanceAsAlpha     :: a -> Bool
diff --git a/Graphics/LambdaCube/TextureUnitState.hs b/Graphics/LambdaCube/TextureUnitState.hs
new file mode 100644
--- /dev/null
+++ b/Graphics/LambdaCube/TextureUnitState.hs
@@ -0,0 +1,195 @@
+module Graphics.LambdaCube.TextureUnitState where
+
+import Graphics.LambdaCube.Types
+import Graphics.LambdaCube.Common
+import Graphics.LambdaCube.BlendMode
+import Graphics.LambdaCube.PixelFormat
+import Graphics.LambdaCube.Texture
+
+
+{-| Definition of the broad types of texture effect you can apply to a texture unit.
+@note
+    Note that these have no effect when using the programmable pipeline, since their
+    effect is overridden by the vertex / fragment programs.
+-}
+data TextureEffectType
+    = ET_ENVIRONMENT_MAP    -- ^ Generate all texture coords based on angle between camera and vertex
+    | ET_PROJECTIVE_TEXTURE -- ^ Generate texture coords based on a frustum
+    | ET_UVSCROLL           -- ^ Constant u/v scrolling effect
+    | ET_USCROLL            -- ^ Constant u scrolling effect
+    | ET_VSCROLL            -- ^ Constant u/v scrolling effect
+    | ET_ROTATE             -- ^ Constant rotation
+    | ET_TRANSFORM          -- ^ More complex transform
+    deriving Eq
+
+{-| Enumeration to specify type of envmap.
+@note
+    Note that these have no effect when using the programmable pipeline, since their
+    effect is overridden by the vertex / fragment programs.
+-}
+data EnvMapType
+    = ENV_PLANAR     -- ^ Envmap based on vector from camera to vertex position, good for planar geometry
+    | ENV_CURVED     -- ^ Envmap based on dot of vector from camera to vertex and vertex normal, good for curves
+    | ENV_REFLECTION -- ^ Envmap intended to supply reflection vectors for cube mapping
+    | ENV_NORMAL     -- ^ Envmap intended to supply normal vectors for cube mapping
+    
+{-| Useful enumeration when dealing with procedural transforms.
+@note
+    Note that these have no effect when using the programmable pipeline, since their
+    effect is overridden by the vertex / fragment programs.
+-}
+data TextureTransformType
+    = TT_TRANSLATE_U
+    | TT_TRANSLATE_V
+    | TT_SCALE_U
+    | TT_SCALE_V
+    | TT_ROTATE
+
+{-| Texture addressing modes - default is TAM_WRAP.
+@note
+    These settings are relevant in both the fixed-function and the
+    programmable pipeline.
+-}
+data TextureAddressingMode
+    = TAM_WRAP   -- ^ Texture wraps at values over 1.0
+    | TAM_MIRROR -- ^ Texture mirrors (flips) at joins over 1.0
+    | TAM_CLAMP  -- ^ Texture clamps at 1.0
+    | TAM_BORDER -- ^ Texture coordinates outside the range [0.0, 1.0] are set to the border colour
+    deriving Eq
+
+-- | Texture addressing mode for each texture coordinate.
+data UVWAddressingMode 
+    = UVWAddressingMode
+    { amU :: TextureAddressingMode
+    , amV :: TextureAddressingMode
+    , amW :: TextureAddressingMode
+    }
+    deriving Eq
+
+-- | Enum identifying the frame indexes for faces of a cube map (not the composite 3D type.
+data TextureCubeFace
+    = CUBE_FRONT
+    | CUBE_BACK
+    | CUBE_LEFT
+    | CUBE_RIGHT
+    | CUBE_UP
+    | CUBE_DOWN
+
+{-
+    = ET_ENVIRONMENT_MAP    -- ^ Generate all texture coords based on angle between camera and vertex
+        -- EnvMapType
+    | ET_PROJECTIVE_TEXTURE -- ^ Generate texture coords based on a frustum
+    | ET_UVSCROLL           -- ^ Constant u/v scrolling effect
+        -- speedX speedY
+    | ET_ROTATE             -- ^ Constant rotation
+        -- speed
+    | ET_TRANSFORM          -- ^ More complex transform
+
+xform info:
+    - anim type (scroll,rotate,scale) 
+    - wave type (sine,triangle,square,sawtooth,inversesawtooth)
+    - base
+    - frequency
+    - phase
+    - amplitude
+-}
+-- | Internal structure defining a texture effect.
+data TextureEffect
+    = TextureEffect
+    { teType        :: TextureEffectType
+    , teSubType     :: Int
+    , teArg1        :: FloatType
+    , teArg2        :: FloatType
+    , teWaveType    :: WaveformType
+    , teBase        :: FloatType
+    , teFrequency   :: FloatType
+    , tePhase       :: FloatType
+    , teAmplitude   :: FloatType
+    }
+    deriving Eq
+
+-- | The type of unit to bind the texture settings to.
+data BindingType
+    = BT_FRAGMENT   -- ^ Regular fragment processing unit - the default.
+    | BT_VERTEX     -- ^ Vertex processing unit - indicates this unit will be used for 
+                    --   a vertex texture fetch.
+    deriving Eq
+    
+-- | Enum identifying the type of content this texture unit contains.    
+data ContentType
+    = CONTENT_NAMED  -- ^ Normal texture identified by name
+    | CONTENT_SHADOW -- ^ A shadow texture, automatically bound by engine
+    deriving Eq
+
+-------------------------------------------------
+
+{-| Class representing the state of a single texture unit during a Pass of a
+    Technique, of a Material.
+@remarks
+    Texture units are pipelines for retrieving texture data for rendering onto
+    your objects in the world. Using them is common to both the fixed-function and 
+    the programmable (vertex and fragment program) pipeline, but some of the 
+    settings will only have an effect in the fixed-function pipeline (for example, 
+    setting a texture rotation will have no effect if you use the programmable
+    pipeline, because this is overridden by the fragment program). The effect
+    of each setting as regards the 2 pipelines is commented in each setting.
+@par
+    When I use the term 'fixed-function pipeline' I mean traditional rendering
+    where you do not use vertex or fragment programs (shaders). Programmable 
+    pipeline means that for this pass you are using vertex or fragment programs.
+-}
+data Texture t => TextureUnitState t
+    = TextureUnitState
+    { tusAnimDuration            :: Maybe FloatType     -- ^ Duration of animation in seconds
+    , tusCubic                   :: Bool                -- ^ is this a series of 6 2D textures to make up a cube?
+    
+    , tusTextureType             :: TextureType
+    , tusDesiredFormat           :: PixelFormat
+    , tusTextureSrcMipmaps       :: TextureMipmap       -- ^ Request number of mipmaps
+
+    , tusTextureCoordSetIndex    :: Int
+    , tusAddressMode             :: UVWAddressingMode
+    , tusBorderColour            :: ColourValue
+
+    , tusColourBlendMode         :: LayerBlendModeEx
+    , tusColourBlendFallbackSrc  :: SceneBlendFactor
+    , tusColourBlendFallbackDest :: SceneBlendFactor
+
+    , tusAlphaBlendMode          :: LayerBlendModeEx
+--        mutable bool mTextureLoadFailed;
+--    , tusTextureLoadFailed       :: Bool
+    , tusIsAlpha                 :: Bool
+    , tusHwGamma                 :: Bool
+
+--        mutable bool mRecalcTexMatrix;
+    , tusUMod                    :: FloatType
+    , tusVMod                    :: FloatType
+    , tusUScale                  :: FloatType
+    , tusVScale                  :: FloatType
+    , tusRotate                  :: FloatType
+--        mutable Matrix4 mTexModMatrix;
+
+    , tusMinFilter               :: FilterOptions       -- ^ Texture filtering - minification
+    , tusMagFilter               :: FilterOptions       -- ^ Texture filtering - magnification
+    , tusMipFilter               :: FilterOptions       -- ^ Texture filtering - mipmapping
+
+    , tusMaxAniso                :: Int             -- ^ Texture anisotropy
+    , tusMipmapBias              :: FloatType       -- ^ Mipmap bias
+
+--        bool mIsDefaultAniso;
+--        bool mIsDefaultFiltering;
+    , tusBindingType             :: BindingType      -- ^ Binding type (fragment or vertex pipeline)
+    , tusContentType             :: ContentType      -- ^ Content type of texture (normal loaded texture, auto-texture)
+
+    , tusFrameNames              :: [String]
+    , tusFrames                  :: Maybe [t]
+    , tusName                    :: String          -- ^ optional name for the TUS
+    , tusTextureAlias            :: String          -- ^ optional alias for texture frames
+    , tusEffects                 :: [TextureEffect]
+--------------------------------------
+
+    -- typedef multimap<TextureEffectType, TextureEffect>::type EffectMap;
+    -- EffectMap mEffects;
+    }
+    deriving Eq
+
diff --git a/Graphics/LambdaCube/Types.hs b/Graphics/LambdaCube/Types.hs
new file mode 100644
--- /dev/null
+++ b/Graphics/LambdaCube/Types.hs
@@ -0,0 +1,26 @@
+module Graphics.LambdaCube.Types where
+
+import Foreign.C.Types
+
+type FloatType = Float
+--type FloatType = CFloat
+--type FloatType = Double
+--type FloatType = CDouble
+
+data Matrix4 = Matrix4
+    !FloatType !FloatType !FloatType !FloatType
+    !FloatType !FloatType !FloatType !FloatType
+    !FloatType !FloatType !FloatType !FloatType
+    !FloatType !FloatType !FloatType !FloatType
+    deriving (Read, Show, Eq)
+
+data Vec4 = Vec4 !FloatType !FloatType !FloatType !FloatType
+    deriving (Read, Show, Eq)
+    
+
+type FloatType2 = (FloatType,FloatType)
+type FloatType3 = (FloatType,FloatType,FloatType)
+type FloatType4 = (FloatType,FloatType,FloatType,FloatType)
+
+type RGB = FloatType3
+type ColourValue = FloatType4
diff --git a/Graphics/LambdaCube/Utility.hs b/Graphics/LambdaCube/Utility.hs
new file mode 100644
--- /dev/null
+++ b/Graphics/LambdaCube/Utility.hs
@@ -0,0 +1,11 @@
+module Graphics.LambdaCube.Utility where
+
+import Data.List
+
+groupSetBy f l = foldl' g [] l
+  where
+    g el e = case partition ((f e) . head) el of
+        { ([],el')      -> [e]:el'
+        ; ([gl],el')    -> (e:gl):el'
+        ; _ -> error "Invalid case!"
+        }
diff --git a/Graphics/LambdaCube/VertexIndexData.hs b/Graphics/LambdaCube/VertexIndexData.hs
new file mode 100644
--- /dev/null
+++ b/Graphics/LambdaCube/VertexIndexData.hs
@@ -0,0 +1,239 @@
+module Graphics.LambdaCube.VertexIndexData where
+
+import Graphics.LambdaCube.HardwareVertexBuffer
+import Graphics.LambdaCube.HardwareIndexBuffer
+
+-- | Summary class collecting together vertex source information.
+data HardwareVertexBuffer vb => VertexData vb
+    = VertexData
+    { 
+    {-| Declaration of the vertex to be used in this operation.
+    @remarks Note that this is created for you on construction.
+    -}
+      vdVertexDeclaration   :: VertexDeclaration
+    {-| The vertex buffer bindings to be used. 
+    @remarks Note that this is created for you on construction.
+    -}
+    , vdVertexBufferBinding :: VertexBufferBinding vb
+    ---- | Whether this class should delete the declaration and binding
+    --bool mDeleteDclBinding;
+    -- | The base vertex index to start from
+    , vdVertexStart         :: Int
+    -- | The number of vertices used in this operation
+    , vdVertexCount         :: Int
+    }
+    deriving Eq
+-- | Struct used to hold hardware morph / pose vertex data information
+--struct HardwareAnimationData
+--{
+--	const VertexElement* targetVertexElement;
+--	Real parametric;
+--};
+--typedef vector<HardwareAnimationData>::type HardwareAnimationDataList;
+-- | VertexElements used for hardware morph / pose animation
+--HardwareAnimationDataList hwAnimationDataList;
+-- | Number of hardware animation data items used
+--size_t hwAnimDataItemsUsed;
+	
+	{-| Clones this vertex data, potentially including replicating any vertex buffers.
+	@param copyData Whether to create new vertex buffers too or just reference the existing ones
+	@param mgr If supplied, the buffer manager through which copies should be made
+	@remarks The caller is expected to delete the returned pointer when ready
+	-}
+--	VertexData* clone(bool copyData = true, HardwareBufferManagerBase* mgr = 0) const;
+
+    {-| Modifies the vertex data to be suitable for use for rendering shadow geometry.
+    @remarks
+        Preparing vertex data to generate a shadow volume involves firstly ensuring that the 
+        vertex buffer containing the positions is a standalone vertex buffer,
+        with no other components in it. This method will therefore break apart any existing
+        vertex buffers if position is sharing a vertex buffer. 
+        Secondly, it will double the size of this vertex buffer so that there are 2 copies of 
+        the position data for the mesh. The first half is used for the original, and the second 
+        half is used for the 'extruded' version. The vertex count used to render will remain 
+        the same though, so as not to add any overhead to regular rendering of the object.
+        Both copies of the position are required in one buffer because shadow volumes stretch 
+        from the original mesh to the extruded version. 
+    @par
+        It's important to appreciate that this method can fundamentally change the structure of your
+        vertex buffers, although in reality they will be new buffers. As it happens, if other 
+        objects are using the original buffers then they will be unaffected because the reference
+        counting will keep them intact. However, if you have made any assumptions about the 
+        structure of the vertex data in the buffers of this object, you may have to rethink them.
+    -}
+--    void prepareForShadowVolume(void);
+
+    {-| Additional shadow volume vertex buffer storage. 
+    @remarks
+        This additional buffer is only used where we have prepared this VertexData for
+        use in shadow volume construction, and where the current render system supports
+        vertex programs. This buffer contains the 'w' vertex position component which will
+        be used by that program to differentiate between extruded and non-extruded vertices.
+        This 'w' component cannot be included in the original position buffer because
+        DirectX does not allow 4-component positions in the fixed-function pipeline, and the original
+        position buffer must still be usable for fixed-function rendering.
+    @par    
+        Note that we don't store any vertex declaration or vertex buffer binding here because this
+        can be reused in the shadow algorithm.
+    -}
+--    HardwareVertexBufferSharedPtr hardwareShadowVolWBuffer;
+
+
+	{-| Reorganises the data in the vertex buffers according to the 
+		new vertex declaration passed in. Note that new vertex buffers
+		are created and written to, so if the buffers being referenced 
+		by this vertex data object are also used by others, then the 
+		original buffers will not be damaged by this operation.
+		Once this operation has completed, the new declaration 
+		passed in will overwrite the current one.
+	@param newDeclaration The vertex declaration which will be used
+		for the reorganised buffer state. Note that the new declaration
+		must not include any elements which do not already exist in the 
+		current declaration; you can drop elements by 
+		excluding them from the declaration if you wish, however.
+	@param bufferUsages Vector of usage flags which indicate the usage options
+		for each new vertex buffer created. The indexes of the entries must correspond
+		to the buffer binding values referenced in the declaration.
+	@param mgr Optional pointer to the manager to use to create new declarations
+		and buffers etc. If not supplied, the HardwareBufferManager singleton will be used
+	-}
+--	void reorganiseBuffers(VertexDeclaration* newDeclaration, const BufferUsageList& bufferUsage, 
+--		HardwareBufferManagerBase* mgr = 0);
+
+	{-| Reorganises the data in the vertex buffers according to the 
+		new vertex declaration passed in. Note that new vertex buffers
+		are created and written to, so if the buffers being referenced 
+		by this vertex data object are also used by others, then the 
+		original buffers will not be damaged by this operation.
+		Once this operation has completed, the new declaration 
+		passed in will overwrite the current one.
+        This version of the method derives the buffer usages from the existing
+        buffers, by using the 'most flexible' usage from the equivalent sources.
+	@param newDeclaration The vertex declaration which will be used
+		for the reorganised buffer state. Note that the new delcaration
+		must not include any elements which do not already exist in the 
+		current declaration; you can drop elements by 
+		excluding them from the declaration if you wish, however.
+	@param mgr Optional pointer to the manager to use to create new declarations
+		and buffers etc. If not supplied, the HardwareBufferManager singleton will be used
+	-}
+--	void reorganiseBuffers(VertexDeclaration* newDeclaration, HardwareBufferManagerBase* mgr = 0);
+
+    {-| Remove any gaps in the vertex buffer bindings.
+    @remarks
+        This is useful if you've removed elements and buffers from this vertex
+        data and want to remove any gaps in the vertex buffer bindings. This
+        method is mainly useful when reorganising vertex data manually.
+    @note
+        This will cause binding index of the elements in the vertex declaration
+        to be altered to new binding index.
+    -}
+--    void closeGapsInBindings(void);
+
+    {-| Remove all vertex buffers that never used by the vertex declaration.
+    @remarks
+        This is useful if you've removed elements from the vertex declaration
+        and want to unreference buffers that never used any more. This method
+        is mainly useful when reorganising vertex data manually.
+    @note
+        This also remove any gaps in the vertex buffer bindings.
+    -}
+--    void removeUnusedBuffers(void);
+
+	{-| Convert all packed colour values (VET_COLOUR_*) in buffers used to
+		another type.
+	@param srcType The source colour type to assume if the ambiguous VET_COLOUR
+		is encountered.
+	@param destType The destination colour type, must be VET_COLOUR_ABGR or
+		VET_COLOUR_ARGB.
+	-}
+--	void convertPackedColour(VertexElementType srcType, VertexElementType destType);
+
+
+	{-| Allocate elements to serve a holder of morph / pose target data 
+		for hardware morphing / pose blending.
+	@remarks
+		This method will allocate the given number of 3D texture coordinate 
+		sets for use as a morph target or target pose offset (3D position).
+		These elements will be saved in hwAnimationDataList.
+		It will also assume that the source of these new elements will be new
+		buffers which are not bound at this time, so will start the sources to 
+		1 higher than the current highest binding source. The caller is
+		expected to bind these new buffers when appropriate. For morph animation
+		the original position buffer will be the 'from' keyframe data, whilst
+		for pose animation it will be the original vertex data.
+	-}
+--	void allocateHardwareAnimationElements(ushort count);
+
+
+
+
+-- | Summary class collecting together index data source information.
+data HardwareIndexBuffer ib => IndexData ib
+    = IndexData
+    { idIndexBuffer :: ib   -- ^ pointer to the HardwareIndexBuffer to use, must be specified if useIndexes = true
+    , idIndexStart  :: Int  -- ^ index in the buffer to start from for this operation
+    , idIndexCount  :: Int  -- ^ The number of indexes to use from the buffer
+    }
+    deriving Eq
+    
+	{-| Clones this index data, potentially including replicating the index buffer.
+	@param copyData Whether to create new buffers too or just reference the existing ones
+	@param mgr If supplied, the buffer manager through which copies should be made
+	@remarks The caller is expected to delete the returned pointer when finished
+	-}
+--	IndexData* clone(bool copyData = true, HardwareBufferManagerBase* mgr = 0) const;
+
+	{-| Re-order the indexes in this index data structure to be more
+		vertex cache friendly; that is to re-use the same vertices as close
+		together as possible. 
+	@remarks
+		Can only be used for index data which consists of triangle lists.
+		It would in fact be pointless to use it on triangle strips or fans
+		in any case.
+	-}
+--	void optimiseVertexCacheTriList(void);
+
+
+{-| Vertex cache profiler.
+@remarks
+	Utility class for evaluating the effectiveness of the use of the vertex
+	cache by a given index buffer.
+-}
+{-
+class _OgreExport VertexCacheProfiler : public BufferAlloc
+{
+	public:
+		enum CacheType {
+			FIFO, LRU
+		};
+
+		VertexCacheProfiler(unsigned int cachesize = 16, CacheType cachetype = FIFO )
+			: size ( cachesize ), type ( cachetype ), tail (0), buffersize (0), hit (0), miss (0)
+		{
+			cache = OGRE_ALLOC_T(uint32, size, MEMCATEGORY_GEOMETRY);
+		};
+
+		~VertexCacheProfiler()
+		{
+			OGRE_FREE(cache, MEMCATEGORY_GEOMETRY);
+		}
+
+		void profile(const HardwareIndexBufferSharedPtr& indexBuffer);
+		void reset() { hit = 0; miss = 0; tail = 0; buffersize = 0; };
+		void flush() { tail = 0; buffersize = 0; };
+
+		unsigned int getHits() { return hit; };
+		unsigned int getMisses() { return miss; };
+		unsigned int getSize() { return size; };
+	private:
+		unsigned int size;
+		uint32 *cache;
+		CacheType type;
+
+		unsigned int tail, buffersize;
+		unsigned int hit, miss;
+
+		bool inCache(unsigned int index);
+};
+-}
diff --git a/Graphics/LambdaCube/World.hs b/Graphics/LambdaCube/World.hs
new file mode 100644
--- /dev/null
+++ b/Graphics/LambdaCube/World.hs
@@ -0,0 +1,904 @@
+{-# LANGUAGE MultiParamTypeClasses #-}
+module Graphics.LambdaCube.World where
+
+import Data.Maybe
+import qualified Data.List as List
+import Data.Map (Map,(!))
+import qualified Data.Map as Map
+import Data.IntMap (IntMap)
+import qualified Data.IntMap as IntMap
+import Control.Applicative
+import Control.Monad
+import System.Directory
+import System.FilePath
+
+import System.Log.Logger
+import Data.Graph.Inductive
+import qualified Data.ByteString.Lazy as B
+import qualified Data.ByteString as SB
+import qualified Data.ByteString.Internal as SB
+import Codec.Archive.Zip
+
+import Graphics.LambdaCube.Common
+import Graphics.LambdaCube.Loader.ResourceScript
+import Graphics.LambdaCube.Loader.MeshXML
+import Graphics.LambdaCube.Compositor
+import Graphics.LambdaCube.Material
+import Graphics.LambdaCube.Pass
+import Graphics.LambdaCube.Technique
+import Graphics.LambdaCube.TextureUnitState
+import Graphics.LambdaCube.PixelFormat
+import Graphics.LambdaCube.Math
+import Graphics.LambdaCube.Light
+import Graphics.LambdaCube.Image
+import Graphics.LambdaCube.Entity
+import Graphics.LambdaCube.Mesh
+import Graphics.LambdaCube.Types
+import Graphics.LambdaCube.Texture
+import Graphics.LambdaCube.GpuProgram
+import Graphics.LambdaCube.GpuProgramUsage
+import Graphics.LambdaCube.RenderQueue
+import Graphics.LambdaCube.RenderSystem
+import Graphics.LambdaCube.HardwareBuffer
+import Graphics.LambdaCube.HardwareVertexBuffer
+import Graphics.LambdaCube.HardwareIndexBuffer
+--import Graphics.LambdaCube.Resource
+import Graphics.LambdaCube.RenderOperation
+
+
+-- * World
+
+data (HardwareVertexBuffer vb, HardwareIndexBuffer ib, Texture t, LinkedGpuProgram lp) => FlattenScene vb ib t lp
+    = FlattenScene
+    { fsRenderable  :: [(Matrix4,[RenderEntity vb ib t lp],Int,Int)]    -- ^ List of Renderable information including WorldMatrix RenderQueueID and RenderPriority
+    , fsCamera      :: [(Matrix4,Camera)]
+    , fsLight       :: [(Matrix4,Light)]
+    }
+
+data RenderSystem r vb ib q t p lp => World r vb ib q t p lp
+    = World
+    { wrResource        :: ResourceLibrary vb ib t p lp -- IO related
+    , wrRenderSystem    :: r                            -- IO related
+    , wrScene           :: Scene vb ib t lp
+    , wrTargets         :: Map String (RenderTarget t lp)
+    , wrRenderOptions   :: IntMap RenderGroupOptions
+    , wrImageLoaders    :: [ImageLoader]
+    }
+
+mapResource f w = w { wrResource = f (wrResource w) }
+mapScene f w = w { wrScene = f (wrScene w) }
+mapTargets f w = w { wrTargets = f (wrTargets w) }
+
+mkWorld :: RenderSystem r vb ib q t p lp => r -> [ImageLoader] -> IO (World r vb ib q t p lp)
+mkWorld rs imgLoaders = return World
+          { wrResource      = mkResource
+          , wrRenderSystem  = rs
+          , wrScene         = mkScene
+          , wrTargets       = Map.empty
+          , wrRenderOptions = IntMap.empty 
+          , wrImageLoaders  = imgLoaders
+          }
+
+mkResource :: (HardwareVertexBuffer vb, HardwareIndexBuffer ib, Texture t, GpuProgram p, LinkedGpuProgram lp) => ResourceLibrary vb ib t p lp
+mkResource = ResourceLibrary [] Map.empty Map.empty Map.empty Map.empty Map.empty Map.empty
+
+mkScene :: (HardwareVertexBuffer vb, HardwareIndexBuffer ib, Texture t, LinkedGpuProgram lp) => Scene vb ib t lp
+--mkScene = Scene (mkUGraph [0] []) (IntMap.fromList [(0, SceneNode "Root" [] (transl 0 0 0))]) (Map.fromList [("Root",0)]) Nothing
+-- TODO: update for new scene structure
+mkScene =  Scene
+    { scGraph = mkGraph [(0,"Root")] []
+    -- use: bytestring-trie (efficient ByteString map)
+    , scMap   = Map.fromList [("Root", (0,SceneNode "Root" [] (transl 0 0 0)))]
+    , scSky   = Nothing
+    }
+
+-- * Resource
+
+data (HardwareVertexBuffer vb, HardwareIndexBuffer ib, Texture t, GpuProgram p, LinkedGpuProgram lp) => ResourceLibrary vb ib t p lp
+    = ResourceLibrary
+    { rlResourceGroups      :: [ResourceGroup]
+    , rlMeshMap             :: Map String (Mesh vb ib)
+    , rlMaterialMap         :: Map String (Material t lp)
+    , rlTextureMap          :: Map String t
+    , rlGpuProgramMap       :: Map String (GpuProgramDescriptor p)
+    , rlLinkedGpuProgramMap :: Map (String,String,String) lp
+    , rlCompositorMap       :: Map String (Compositor t lp)
+    }
+
+-- * SceneGraph
+
+data Camera
+    = Camera
+    { cmName        :: String
+    , cmFov         :: FloatType
+    , cmNear        :: FloatType
+    , cmFar         :: FloatType
+    , cmAspectRatio :: Maybe FloatType
+    , cmPolygonMode :: PolygonMode      -- ^ Rendering type
+    }
+{-
+        name					CDATA	#IMPLIED
+        id						ID		#IMPLIED
+        FOVy					CDATA	"45"
+        aspectRatio				CDATA	"1.3333333"
+        projectionType			(perspective | orthographic)	"perspective"
+        polygonMode				(points | wireframe | solid)	"solid"
+        useRenderingDistance	(yes | no)						"yes"
+        lodBiasFactor			CDATA	"1.0"
+-}
+cameraProjectionMatrix :: FloatType -> Camera -> Matrix4
+cameraProjectionMatrix a cam = perpectiveMatrix fov aspect near far
+  where
+    Camera
+        { cmFov         = fov
+        , cmNear        = near
+        , cmFar         = far
+        , cmAspectRatio = aspectr
+        } = cam
+    aspect = fromMaybe a aspectr
+    
+data (HardwareVertexBuffer vb, HardwareIndexBuffer ib, Texture t, LinkedGpuProgram lp) => SceneObject vb ib t lp
+    = SO_Entity (Entity vb ib t lp)
+    | SO_Camera Camera
+    | SO_Light Light
+--    | SO_ParticleSystem ParticleSystem
+
+--data RenderTarget
+--    = RT_MainBuffer
+--    | RT_FrameBuffer 
+    
+{-
+data RenderWindow = RenderWindow
+    { rwWidth    :: Int
+    , rwHeight   :: Int
+    , rwViewport :: [Viewport]
+    --, rtTarget -- texture or screen
+    }
+-}
+
+data (Texture t, LinkedGpuProgram lp) => RenderTarget t lp
+    = RenderTarget
+    { rtName     :: String
+    , rtWidth    :: Int
+    , rtHeight   :: Int
+    , rtViewport :: [Viewport t lp]
+    , rtTexture  :: Maybe String
+    }
+
+data (Texture t, LinkedGpuProgram lp) => Viewport t lp
+    = Viewport
+    { vpLeft            :: FloatType
+    , vpTop             :: FloatType
+    , vpWidth           :: FloatType
+    , vpHeight          :: FloatType
+    , vpCamera          :: String --Camera
+    , vpCompositors     :: [Compositor t lp]
+    , vpBackColour      :: ColourValue
+    , vpClearEveryFrame :: Bool
+    , vpClearBuffers    :: FrameBufferType
+    }
+
+--getViewportSize :: RenderTarget -> Viewport -> (Int,Int,Int,Int)
+getViewportSize t v = (x,y,w,h)
+  where
+    ww = fromIntegral $ rtWidth t
+    wh = fromIntegral $ rtHeight t
+    x = floor $ ww * (vpLeft v)
+    y = floor $ wh * (vpTop v)
+    w = floor $ ww * (vpWidth v)
+    h = floor $ wh * (vpHeight v)
+    
+data (HardwareVertexBuffer vb, HardwareIndexBuffer ib, Texture t, LinkedGpuProgram lp) => SceneNode vb ib t lp
+    = SceneNode
+    { snName      :: String
+    , snObject    :: [SceneObject vb ib t lp]
+    , snTransform :: Matrix4
+    }-- deriving (Show,Read)
+    
+data Sky
+    = SkyBox --Material
+    | SkyDome
+    | SkyPlane
+    
+{-
+data Scene = Scene
+    { scGraph :: Gr () ()
+--    , scMap     :: Map Int SceneNode
+    , scMap     :: IntMap SceneNode
+    , scNameMap :: Map String Int 
+    , scSky   :: Maybe Sky
+    -- Fog settings
+    }
+-}
+
+data (HardwareVertexBuffer vb, HardwareIndexBuffer ib, Texture t, LinkedGpuProgram lp) => Scene vb ib t lp
+    = Scene
+    { scGraph :: Gr String ()
+    -- use: bytestring-trie (efficient ByteString map)
+    , scMap   :: Map String (Int,SceneNode vb ib t lp) -- ^ Contains GraphNodeID and SceneNode.
+    , scSky   :: Maybe Sky
+    -- Fog settings
+    }
+
+getMesh name world = case Map.lookup name (rlMeshMap rl) of
+    Nothing -> do
+        f <- loadFile (rlResourceGroups rl) name
+        when (isNothing f) $ error $ "File not found: " ++ name
+        m <- case takeExtension name of
+            ".xml" -> do
+                debugM "ResourceLibrary" $ "parsing mesh XML file " ++ name
+                parseMesh rs $ map SB.w2c $ B.unpack $ fromMaybe (error "fromJust 9") f
+            _ -> error ("Unsupported format!")
+        return (m,world { wrResource = rl { rlMeshMap = Map.insert name m (rlMeshMap rl) } })
+    Just m -> return (m,world)
+  where
+    rl = wrResource world
+    rs = wrRenderSystem world
+
+--loadMaterialResources :: ResourceLibrary -> Material -> IO (ResourceLibrary,Material)
+loadMaterialResources rs loaders reslib0 mat = case isJust $ mtSupportedTechniques mat of
+    { True  -> return (reslib0,mat) -- Material is already initialized
+    ; False -> do
+        let isSupportedTech _ = True -- TODO
+            loadImage name = do
+                d <- loadFile (rlResourceGroups reslib0) name
+                case d of
+                    { Just imgdata  -> do
+                        let loadImg img loader = case img of
+                                { Just _    -> return img
+                                ; Nothing   -> loader name imgdata
+                                }
+                        foldM loadImg Nothing loaders
+                    ; Nothing   -> do
+                        debugM "Load image" $ "File not found: " ++ name
+                        return Nothing
+                    }
+            loadTextureUnit (rl0,tl) t = do
+                let loadTexture (rl0',tl') texname = case Map.lookup texname $ rlTextureMap rl0' of
+                        { Just t    -> return (rl0',t:tl')   -- texture is loaded
+                        ; Nothing   -> do   -- we have to create it
+                            -- TODO: create and load texture via render system
+                            i <- loadImage texname
+                            case i of
+                                { Just img  -> do
+                                    {-
+                                        virtual TexturePtr createManual(const String & name, const String& group,
+                                            TextureType texType, uint width, uint height, uint depth, 
+                                			int num_mips, PixelFormat format, int usage = TU_DEFAULT, ManualResourceLoader* loader = 0,
+                                			bool hwGammaCorrection = false, uint fsaa = 0, const String& fsaaHint = StringUtil::BLANK);
+        
+    { imName        :: String
+    , imHeight      :: Int
+    , imWidth       :: Int
+    , imDepth       :: Int
+    , imSize        :: Int
+    , imNumMipmaps  :: Int
+--    uint flags;
+    , imFormat      :: PixelFormat
+    , imData        :: (Ptr Word8) -- ^ Image can be empty
+    }
+        mkGLTexture :: String -> TextureType -> Int -> Int -> Int -> Int -> PixelFormat -> TextureUsage -> Bool -> Int -> String -> IO GLTexture
+        mkGLTexture name texType width height depth numMips format usage hwGammaCorrection fsaa fsaaHint = do
+                                    -}
+                                    --createTexture                   :: a -> String -> TextureType -> Int -> Int -> Int -> Int -> PixelFormat -> TextueUsage -> Bool -> Int -> String -> IO t
+                                    let usage = TextureUsage HBU_STATIC True False
+                                    t <- createTexture rs texname (tusTextureType t) (imWidth img) (imHeight img) (imDepth img)
+                                                                  (tusTextureSrcMipmaps t) (tusDesiredFormat t) usage (tusHwGamma t) 0 "" $ Just [img]
+                                    -- TODO
+                                    --let t = undefined
+                                    let texmap = rlTextureMap rl0'
+                                    return (rl0' { rlTextureMap = Map.insert texname t texmap },t:tl')
+                                ; Nothing   -> do
+                                    debugM "Load texture" $ "No proper image codec was found: " ++ texname
+                                    return (rl0',tl')
+                                }
+                        }
+                let loadCubicTexture rl0' texname = case Map.lookup (concat texname) $ rlTextureMap rl0' of
+                        { Just t    -> return (rl0',[t])   -- texture is loaded
+                        ; Nothing   -> do   -- we have to create it
+                            -- TODO: create and load texture via render system
+                            i <- mapM loadImage texname
+                            case all isJust i of
+                                { True  -> do
+                                    let usage = TextureUsage HBU_STATIC True False
+                                        img = fromJust $ head i
+                                    t <- createTexture rs (concat texname) (tusTextureType t) (imWidth img) (imHeight img) (imDepth img)
+                                                                  (tusTextureSrcMipmaps t) (tusDesiredFormat t) usage (tusHwGamma t) 0 "" $ Just $ map fromJust i
+                                    let texmap = rlTextureMap rl0'
+                                    return (rl0' { rlTextureMap = Map.insert (concat texname) t texmap },[t])
+                                ; False -> do
+                                    debugM "Load texture" $ "No proper image codec was found: " ++ concat texname
+                                    return (rl0',[])
+                                }
+                        }
+                -- load textures
+                -- TODO: load all frames
+                (rl1,tex) <- case tusTextureType t of
+                    { TEX_TYPE_CUBE_MAP -> loadCubicTexture rl0 $ tusFrameNames t
+                    ; _ -> foldM loadTexture (rl0,[]) $ tusFrameNames t
+                    }    
+                let frames = reverse tex -- TODO: wrong in cubemap case
+                return (rl1,(t { tusFrames = Just frames }):tl)
+            loadShader (rl0,sl) sn = case Map.lookup sn $ rlGpuProgramMap rl0 of
+                { Nothing   -> do
+                    errorM "loadShader" $ "Unknown GpuProgram: " ++ sn
+                    return (rl0,sl)
+                ; Just gpd    -> case gpdGpuProgram gpd of
+                    { Just p    -> return (rl0,p:sl)
+                    ; Nothing   -> do
+                        -- GpuProgram is not loaded yet
+                        let fname = gpdFilename gpd
+                        msource <- loadFile (rlResourceGroups rl0) fname
+                        case msource of
+                            { Nothing   -> do
+                                errorM "loadShader" $ "GpuProgram source not found: " ++ sn ++ " - " ++ fname
+                                return (rl0,sl)
+                            ; Just src  -> do
+                                eprog <- createGpuProgram rs (gpdType gpd) $ map SB.w2c $ B.unpack src
+                                case eprog of
+                                    { Right err -> do
+                                        errorM "loadShader" $ "Error compile " ++ sn ++ ": " ++ err
+                                        return (rl0,sl)
+                                    ; Left prog -> do
+                                        debugM "loadShader" $ "GpuProgram loaded: " ++ sn
+                                        let gpd'    = gpd { gpdGpuProgram = Just prog }
+                                            gpmap   = Map.insert sn gpd' $ rlGpuProgramMap rl0
+                                        return (rl0 { rlGpuProgramMap = gpmap }, prog:sl)
+                                    }
+                        }
+                    }
+                }
+            loadPass (rl0,pl) p = do
+                -- load GpuPrograms
+                (rl1,mlgp) <- case psLinkedGpuProgram p of
+                    { Just lgp  -> return (rl0,Just lgp)
+                    ; Nothing   -> do
+                        let getName Nothing     = ""
+                            getName (Just u)    = gpuProgramName u
+                            progName            = (getName $ psVertexProgramUsage p, getName $ psFragmentProgramUsage p, getName $ psGeometryProgramUsage p)
+                            (vpn,fpn,gpn)       = progName
+                            gpuprogmap          = rlGpuProgramMap rl0
+                            collectNames cl []  = return cl
+                            collectNames cl nl  = do
+                                -- check list nl
+                                let a = filter (`notElem` cl) nl
+                                    getAttach m = case Map.lookup m gpuprogmap of
+                                        { Nothing   -> do
+                                            errorM "loadShader" $ "Unknown attached GpuProgram: " ++ m
+                                            return []
+                                        ; Just gp   -> return $ gpdAttach gp
+                                        }
+                                b <- mapM getAttach a
+                                collectNames (cl ++ a) $ concat b
+                        -- collect required shaders name list
+                        progNames <- collectNames [] $ filter (/="") [vpn,fpn,gpn]
+                        case null progNames of
+                            { True  -> return (rl0,Nothing)
+                            ; False -> do
+                                -- load all shader
+                                (rl1,progs) <- foldM loadShader (rl0,[]) progNames
+                                case Map.lookup progName $ rlLinkedGpuProgramMap rl1 of
+                                    { Just lp   -> return (rl1,Just lp)
+                                    ; Nothing   -> do
+                                        -- create LinkedGpuProgram
+                                        elprog <- createLinkedGpuProgram rs progs
+                                        case elprog of
+                                            { Right err -> do
+                                                errorM "loadGpuProgram" $ "Error link " ++ (show progName) ++ ": " ++ err
+                                                return (rl1,Nothing)
+                                            ; Left lprog    -> do
+                                                debugM "loadGpuProgram" $ "GpuProgram linked: " ++ (show progName)
+                                                let lprogmap    = rlLinkedGpuProgramMap rl1
+                                                    lprogmap'   = Map.insert progName lprog lprogmap
+                                                return (rl1 { rlLinkedGpuProgramMap = lprogmap' },Just lprog)
+                                            }
+                                    }
+                            }
+                    }
+                -- load textureunitstates (Texture)
+                (rl2,texUnits) <- foldM loadTextureUnit (rl1,[]) $ psTextureUnitStates p
+                return (rl2,(p { psTextureUnitStates = reverse texUnits, psLinkedGpuProgram = mlgp }):pl)
+            loadTechnique (rl0,tl) t = do
+                -- load passes (GpuProgram)
+                (rl1,passes) <- foldM loadPass (rl0,[]) $ tchPasses t
+                return (rl1,(t { tchPasses = reverse passes }):tl)
+        -- select and load supported techniques
+        (reslib1,suppTech) <- foldM loadTechnique (reslib0,[]) $ filter isSupportedTech $ mtTechniques mat
+        -- Insert loaded material into MaterialMap
+        let matmap  = rlMaterialMap reslib1
+            mat'    = mat { mtSupportedTechniques = Just $ reverse suppTech }
+            reslib2 = reslib1 { rlMaterialMap = Map.insert (mtName mat') mat' matmap }
+        return (reslib2,mat')
+    }
+
+--getLoadedMaterial :: String -> World -> IO (World,Maybe Material)
+--NOTE: this should return with Nothing if there's no supported technique
+getLoadedMaterial matname world0 = case Map.lookup matname $ rlMaterialMap $ wrResource world0 of
+    { Nothing   -> do
+        errorM "loadMaterial" $ "Material not found: " ++ matname
+        return (world0,Nothing)
+    ; Just mat0 -> case isJust $ mtSupportedTechniques mat0 of
+        { True  -> return (world0,Just mat0)
+        ; False -> do
+            let rs      = wrRenderSystem world0
+                loaders = wrImageLoaders world0
+                rl0     = wrResource world0
+            (rl1,mat1) <- loadMaterialResources rs loaders rl0 mat0
+            --TODO: this should return with Nothing if there's no supported technique
+            return (world0 { wrResource = rl1 },Just mat1)
+            }
+    }
+
+--setEntityMaterial :: World -> [String] -> Entity -> IO (World,Entity)
+setEntityMaterial world0 mats ent = do
+    let reslib1 = wrResource world0
+        rs      = wrRenderSystem world0
+        loaders = wrImageLoaders world0
+        setSubEntMat (rl1,ses) (sent,matname) = do
+            let matmap  = (rlMaterialMap rl1)
+            (rl2,mat) <- case Map.lookup matname matmap of
+                { Just m    -> do
+                    loadMaterialResources rs loaders rl1 m
+                ; Nothing   -> do
+                    error $ "Material not found: " ++ matname
+                }
+            return (rl2,sent { seMaterial = mat } : ses)
+    
+    (reslib2,subents) <- foldM setSubEntMat (reslib1,[]) $ zip (enSubEntityList ent) mats
+    return (world0 { wrResource = reslib2 },ent { enSubEntityList = reverse subents })
+    
+--createEntity :: World -> String -> String -> IO (World,Entity)
+createEntity world0 ename mname = do
+    -- lookup mesh, load if not exists
+    --debugM "ResourceLibrary" $ "creating entity: \"" ++ ename ++ "\" from mesh: \"" ++ mname ++ "\""
+    (mesh,world1) <- getMesh mname world0
+    --debugM "ResourceLibrary" " done"
+
+    let reslib1 = wrResource world1
+        rs      = wrRenderSystem world1
+        loaders = wrImageLoaders world1
+        mkSubent (rl1,ses) smesh = do
+            let matname = (smMaterialName smesh)
+                matmap  = (rlMaterialMap rl1)
+            (rl2,mat) <- case Map.lookup matname matmap of
+                { Just m    -> do
+                    loadMaterialResources rs loaders rl1 m
+                ; Nothing   -> do
+                    --debugM "createEntity" $ "Material not found: " ++ matname
+                    -- TODO
+                    error $ "Material not found: " ++ matname
+                    --loadMaterialResources rs loaders rl1 (matmap ! "WarningMaterial")
+                }
+            return (rl2,SubEntity { seMaterial = mat, seSubMesh = smesh } : ses)
+
+    (reslib2,subents) <- foldM mkSubent (reslib1,[]) (msSubMeshList mesh)
+
+    let ent = Entity
+            { enName          = ename
+            , enRenderQueue   = constRenderQueueMain
+            , enMesh          = mesh
+            , enSubEntityList = reverse subents
+            }
+
+    return (world1 { wrResource = reslib2 },ent)
+
+--loadFile :: [ResourceGroup] -> String -> Maybe ByteString
+loadFile respath fname = foldM (\s (_,l)->foldM load s l) Nothing respath
+  where
+    load s@(Just str) _ = return s
+    load s (PathZip,n)  = do
+        -- TODO: this is a naive implementation with poor perfomance
+        f <- B.readFile n
+        let a = toArchive f
+        return $ fmap fromEntry $ findEntryByPath fname a
+    load Nothing (PathDir,n) = do
+        let ffname = (addTrailingPathSeparator n) ++ fname
+        e <- doesFileExist ffname
+        ret <- if e then B.readFile ffname else return B.empty
+        return $ if e then Just ret else Nothing
+
+renderWorld time name flatScene world = do
+    -- TODO
+    -- collect all render textures
+    -- render the world on all render textures
+    -- render the world last to the given named target
+    
+    -- forall viewports:
+    --   setup viewport related matrices
+    --   render scene
+    case Map.lookup name targetMap of
+        { Nothing   -> do
+            debugM "renderWold" $ "RenderTarget not found: " ++ name
+            return world
+        ; Just t    -> do
+            let targets     = Map.elems targetMap
+                (tg,tgs)    = List.partition ((== name) . rtName) targets
+                (rtl,rwl)   = List.partition (isNothing . rtTexture) tgs
+            mapM_ renderTarget $ rtl ++ rwl ++ tg
+            return world
+        }
+  where
+    targetMap   = wrTargets world
+    rs          = wrRenderSystem world
+
+    renderTarget rt = do
+        -- TODO: calc render statistics
+        let t = rtTexture rt
+        -- call setRenderTarget rs
+        mapM_ (renderViewport flatScene rt) $ rtViewport rt    
+        --if isNothing t then return () else do
+            --let tex = txObject $ (rlTextureMap $ wrResource world) ! (fromMaybe (error "fromJust 0") t)
+            --GL.textureBinding GL.Texture2D $= Just tex
+            -- only hint code: glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, 0, 0, 128, 128, 0);
+            --GL.copyTexImage2D Nothing 0 GL.RGBA' (GL.Position 0 0) (GL.TextureSize2D w' h') 0
+        --return ()
+    
+    renderViewport fs rtarget v = do
+        let (vx,vy,vw,vh) = getViewportSize rtarget v
+        setViewport rs vx vy vw vh
+        
+        -- Clear the viewport if required
+        when (vpClearEveryFrame v) $
+            clearFrameBuffer rs (vpClearBuffers v) (vpBackColour v) 1 0
+        
+        -- Begin the frame
+        --mDestRenderSystem->_beginFrame();
+        
+        -- Set rasterisation mode
+        setPolygonMode rs $ cmPolygonMode cam
+        
+        -- Set initial camera state
+        setProjectionMatrix rs $ cameraProjectionMatrix (fromIntegral vw / fromIntegral vh) cam
+        
+        --mDestRenderSystem->_setTextureProjectionRelativeTo(mCameraRelativeRendering, camera->getDerivedPosition());
+        --setTextureProjectionRelativeTo
+        
+        setViewMatrix rs cameraViewMatrix 
+        
+        -- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+        -- TODO: activate compositor chain render target if necessary
+        -- (re)initialize compositor resources if necessary
+        -- foreach compositor
+        --  select technique
+        --  create render textures
+        --  initialize target passes
+        -- do render
+        -- foreach compositor and target pass
+        --  bind target pass
+        --  execute each composition pass in target pass
+        --HINT:
+            -- 
+
+        -- FIXME: TEMP CODE        
+        unless (null $ vpCompositors v) $ do
+            -- bind render texture
+            return ()
+
+        -- render objects
+        rstat <- renderQueue time rs (wrRenderOptions world) emptyRenderStatistics $ fsRenderable fs
+--        print rstat
+
+        -- Compositor
+            -- TargetPass
+                -- Pass
+        forM_ (vpCompositors v) $ \c -> do 
+            let ct = head $ fromMaybe (error "fromJust 112") $ cmpSupportedTechniques c
+            -- select first technique
+            forM (zip [0..] $ ctTargetPasses ct ++ [ctOutputTarget ct]) $ \(ctpidx,ctp) -> do
+            --  -- copy previous output to target's output when input is previous
+                when (ctpInputMode ctp == IM_PREVIOUS) $ do
+                    -- FIXME
+                    dirtyHackCopyTexImage rs (fromMaybe (error "fromJust 212") $ tdTexture $ fromJust $ ctpOutput ctp) vx vy vw vh
+                forM (ctpPasses ctp) $ \cp -> do
+                    -- do composition pass action
+                    case cpType cp of
+                        { PT_RENDERQUAD -> do
+                            -- TODO
+                            -- setup quad material
+                            -- render quad
+                            let quadM   = fromMaybe (error "fromJust 312") $ Map.lookup "Quad.mesh.xml" (rlMeshMap $ wrResource world)
+                                quadSM  = head $ msSubMeshList quadM
+                                quadSE  = SubEntity { seMaterial = fromMaybe (error "fromJust 412") $ cpMaterial cp, seSubMesh = quadSM }
+                                quadE   = Entity "" constRenderQueueMain quadM [quadSE]
+                                quadRE  = head $ prepare (transl 0 0 0) quadE
+                                quadRP  = [RenderablePass (reOperation quadRE) p (transl 0 0 0) [] | p <- rePassList quadRE]
+                            setProjectionMatrix rs $ transl 0 0 0
+                            setViewMatrix rs $ transl 0 0 0
+                            setPolygonMode rs PM_SOLID
+                            renderPassGroup time rs emptyRenderStatistics quadRP
+                            return ()
+                        ; _ -> return ()
+                        }
+{-
+        unless (null $ vpCompositors v) $ do
+            -- FIXME: TEMP CODE        
+            -- unbind render texture, and we'll have the rendered scene in a texture
+            -- create a custom temp pass with temp render texture input
+            -- create quad render operation
+            let quadSM  = head $ msSubMeshList $ fromJust $ Map.lookup "Quad.mesh.xml" (rlMeshMap $ wrResource world)
+                quadRO  = RenderOperation
+                    { roVertexData      = fromJust $ smVertexData quadSM 
+                    , roOperationType   = smOperationType quadSM
+                    , roIndexData       = smIndexData quadSM
+                    }
+                quadP   = head $ tchPasses $ head $ fromJust $ mtSupportedTechniques $ fromJust $ Map.lookup "QuadMaterial" (rlMaterialMap $ wrResource world)
+                quadRP  = RenderablePass
+                    { rpOperation   = quadRO
+                    , rpPass        = quadP'
+                    , rpMatrix      = transl 0 0 0
+                    , rpLights      = []
+                    }
+                rtex    = fromJust $ Map.lookup "RenderTex01" $ (rlTextureMap $ wrResource world)
+                tus     = psTextureUnitStates quadP
+                tu      = head tus
+                tut     = tail tus
+                tu'     = tu { tusFrames = Just [rtex] }
+                quadP'  = quadP { psTextureUnitStates = (tu':tut) }
+            --setProjectionMatrix rs $ cameraProjectionMatrix (fromIntegral vw / fromIntegral vh) cam
+            setProjectionMatrix rs $ transl 0 0 0
+            setViewMatrix rs $ transl 0 0 0
+            dirtyHackCopyTexImage rs rtex vx vy vw vh
+            setPolygonMode rs PM_SOLID
+            renderPassGroup rs [quadRP]
+            -- invert back
+            --dirtyHackCopyTexImage rs rtex vx vy vw vh
+-}            --renderPassGroup rs [quadRP]
+            return ()                
+        
+{-
+    = RenderOperation
+    { roVertexData      :: VertexData vb      -- ^ Vertex source data
+    , roOperationType   :: OperationType    -- ^ The type of operation to perform
+    , roIndexData       :: Maybe (IndexData ib)        -- ^ Index data - only valid if useIndexes is true
+    }
+    = RenderablePass
+    { rpOperation   :: RenderOperation vb ib
+    , rpPass        :: Pass t lp
+    , rpMatrix      :: Matrix4
+    , rpLights      :: [(Matrix4,Light)]
+    }
+--renderPassGroup :: RenderSystem -> RenderablePass -> IO ()
+-} 
+        -- do a manual render for temp pass (we should reset world, view, projection and texture matrix)
+        
+        
+---------------------------------------------------------------------
+        -- push flatten scene into a render queue
+        --  collect lights which affect each renderable
+        --  fold addRenderable
+        -- call renderQueue
+        --let addRend (m,rend,grpID,prior) rq = addRenderable m rend (map snd $ fsLight fs) grpID prior rq
+        --renderQueue' rs $ foldr addRend emptyRenderQueue $ fsRenderable fs
+        -- old code below-------------------------------------------------------------------------------------------
+        --mapM_ (renderEntity (wrRenderSystem world)) $ optimize $ foldr (\(m,r) l -> (prepare m r) ++ l) [] [(a,b) | (a,b,_,_) <- fsRenderable fs]
+      where
+        (camMat,cam) = head $ Prelude.filter (\(_,a) -> camName == (cmName a)) cams
+        camName = vpCamera v
+        cams = fsCamera fs
+        (Matrix4
+            r11 r12 r13 _
+            r21 r22 r23 _
+            r31 r32 r33 _
+            tx ty tz _) = camMat
+        {-
+        cameraViewMatrix = (Matrix4
+            r11 r21 r31 0
+            r12 r22 r32 0
+            r13 r23 r33 0
+            (-tx) (-ty) (-tz) 1)
+        -}
+        cameraViewMatrix = camMat
+
+--    createTexture                   :: a -> String -> TextureType -> Int -> Int -> Int -> TextureMipmap -> PixelFormat -> TextureUsage -> Bool -> Int -> String -> Image -> IO t
+addRenderTexture n w h world = do
+    let rl = wrResource world
+        tm = rlTextureMap rl
+        rs = wrRenderSystem world
+    t <- createTexture rs n TEX_TYPE_2D w h 1 (MIP_NUMBER 1) PF_R8G8B8A8 (TextureUsage HBU_STATIC True False) False 0 "" Nothing
+    return world { wrResource = rl { rlTextureMap = Map.insert n t tm } }
+    --mapResource f w = w { wrResource = f (wrResource w) }
+
+--addRenderWindow :: String -> Int -> Int -> [Viewport] -> World -> IO World    
+addRenderWindow n w h l world = do
+    vl <- mapM (\f -> f world) l
+    let rt = RenderTarget
+            { rtName     = n
+            , rtWidth    = w
+            , rtHeight   = h
+            , rtViewport = vl
+            , rtTexture  = Nothing
+            }
+    return $ mapTargets (Map.insert n rt) world
+
+    {-
+    = Compositor
+    { cmpName                   :: String
+    , cmpTechniques             :: [CompositionTechnique t]
+    , cmpSupportedTechniques    :: Maybe [CompositionTechnique t]
+	}
+
+    = CompositionTechnique
+    { ctTextureDefinitions  :: [TextureDefinition t]
+    , ctTargetPasses        :: [CompositionTargetPass]  -- ^ Intermediate target passes
+    , ctOutputTarget        :: CompositionTargetPass    -- ^ Output target pass (can be only one)
+    , ctSchemeName          :: String                   -- ^ Optional scheme name
+    }
+
+    = TextureDefinition
+    { tdName            :: String
+    , tdWidth           :: Maybe Int        -- Nothing means adapt to target width
+    , tdHeight          :: Maybe Int        -- Nothing means adapt to target height
+    , tdWidthFactor     :: FloatType        -- multiple of target width to use (if width = Nothing)
+    , tdHeightFactor    :: FloatType        -- multiple of target height to use (if height = Nothing)
+    , tdFormatList      :: [PixelFormat]    -- more than one means MRT
+    , tdFsaa            :: Bool             -- FSAA enabled; true = determine from main target (if render_scene), false = disable
+    , tdHwGammaWrite    :: Bool             -- Do sRGB gamma correction on write (only 8-bit per channel formats) 
+    , tdShared          :: Bool             -- whether to use shared textures for this one
+    , tdTexture         :: Maybe t
+    }
+
+    = CompositionTargetPass
+    { ctpInputMode      :: InputMode            -- ^ Input name
+    , ctpOutputName     :: String               -- ^ (local) output texture
+    , ctpOutput         :: Maybe (TextureDefinition t)
+    , ctpPasses         :: [CompositionPass]    -- ^ Passes
+    , ctpOnlyInitial    :: Bool                 -- ^ This target pass is only executed initially after the effect has been enabled.
+    , ctpVisibilityMask :: Word32               -- ^ Visibility mask for this render
+    , ctpLodBias        :: FloatType            -- ^ LOD bias of this render
+    , ctpMaterialScheme :: String               -- ^ Material scheme name
+    , ctpShadowsEnabled :: Bool                 -- ^ Shadows option
+    }
+
+    = InputTex
+    { itName        :: String   -- ^ Name (local) of the input texture
+    , itMrtIndex    :: Int      -- ^ MRT surface index if applicable
+    }
+
+    = CompositionPass
+    { cpType                        :: PassType         -- ^ Type of composition pass
+    , cpIdentifier                  :: Word32           -- ^ Identifier for this pass
+    , cpMaterialName                :: String           -- ^ Material used for rendering
+    , cpMaterial                    :: Maybe (Material t lp)
+    , cpFirstRenderQueue            :: Int              -- ^ [first,last] render queue to render this pass (in case of PT_RENDERSCENE)
+    , cpLastRenderQueue             :: Int
+    , cpClearBuffers                :: (Bool,Bool,Bool) -- ^ Clear buffers (in case of PT_CLEAR), hint: [colour] [depth] [stencil]
+    , cpClearColour                 :: ColourValue      -- ^ Clear colour (in case of PT_CLEAR)
+    , cpClearDepth                  :: FloatType        -- ^ Clear depth (in case of PT_CLEAR)
+    , cpClearStencil                :: Word32           -- ^ Clear stencil value (in case of PT_CLEAR)
+    , cpInputs                      :: IntMap InputTex  -- ^ Inputs (for material used for rendering the quad)
+    , cpStencilCheck                :: Bool             -- ^ Stencil operation parameters
+    , cpStencilFunc                 :: CompareFunction
+    , cpStencilRefValue             :: Word32
+    , cpStencilMask                 :: Word32
+    , cpStencilFailOp               :: StencilOperation
+    , cpStencilDepthFailOp          :: StencilOperation
+    , cpStencilPassOp               :: StencilOperation
+    , cpStencilTwoSidedOperation    :: Bool
+    , cpQuadCornerModified          :: Bool             -- ^ true if quad should not cover whole screen
+    , cpQuadLeft                    :: FloatType        -- ^ quad positions in normalised coordinates [-1;1]x[-1;1] (in case of PT_RENDERQUAD)
+    , cpQuadTop                     :: FloatType
+    , cpQuadRight                   :: FloatType
+    , cpQuadBottom                  :: FloatType
+    , cpQuadFarCorners              :: Bool
+    , cpQuadFarCornersViewSpace     :: Bool
+    }
+
+data PassType
+    = PT_CLEAR          -- ^ Clear target to one colour
+    | PT_STENCIL        -- ^ Set stencil operation
+    | PT_RENDERSCENE    -- ^ Render the scene or part of it
+    | PT_RENDERQUAD     -- ^ Render a full screen quad
+    -}
+-- | Create render textures, and setup compositor chain.
+mkCompositorChain wr0 cl0 = do
+    -- do we really need this ???? -- HINT: add an implicit target to first compositor which renders the scene into a viewportsized texture, 
+    -- iterate trough compositors and select first supported technique
+    let rs = wrRenderSystem wr0
+        initCompositor (world0,cl) c = do -- :: (World,[Maybe Compositor]) -> Compositor -> (World,[Maybe Compositor])
+            -- TODO: select first supported technique
+            let ct = head $ cmpTechniques c
+            tds <- forM (ctTextureDefinitions ct) $ \td -> do
+                -- create render textures
+                let w   = fromMaybe 1 $ tdWidth td
+                    h   = fromMaybe 1 $ tdHeight td
+                    txn = (cmpName c ++ "/" ++ tdName td)
+                t <- createTexture rs txn TEX_TYPE_2D w h 1 (MIP_NUMBER 1) (head $ tdFormatList td) (TextureUsage HBU_STATIC True False) False 0 "" Nothing
+                debugM "Initialize Compositor" $ "Created compositor texture: " ++ txn
+                return td { tdTexture = Just t }
+            
+            let texmap  = Map.fromList [(tdName td,td) | td <- tds]
+                onamel  = map ctpOutputName $ ctTargetPasses ct
+                outtexl = [Map.lookup o texmap | o <- onamel]
+                checkTex b tn = case Map.member tn texmap of
+                    { True  -> return b
+                    ; False -> do
+                        errorM "Initialize Compositor" $ "Unknown compositor texture: " ++ tn
+                        return False
+                    }
+            oktex <- foldM checkTex True onamel
+            case oktex of
+                { False -> return (world0,Nothing:cl)
+                ; True  -> do
+                    -- setup compositor target pass output
+                    let tps0 = [tp { ctpOutput = o } | (o,tp) <- zip outtexl $ ctTargetPasses ct]
+                        initPasses (w0,tpl,okPasses) tp = do
+                            let initPass (w0,pl,okPass) cp = case cpType cp of
+                                    { PT_RENDERQUAD -> do
+                                        -- setup composition pass input
+                                        --  load material
+                                        (w1,mmat) <- getLoadedMaterial (cpMaterialName cp) w0
+                                        case mmat of
+                                            { Nothing   -> return (w1,cp:pl,False)
+                                            ; Just mat  -> do
+                                                --  check pass input texture names
+                                                okInput <- foldM checkTex True [itName it | it <- IntMap.elems $ cpInputs cp]
+                                                case okInput of
+                                                    { False -> return (w1,cp:pl,False)
+                                                    ; True  -> do
+                                                        -- foreach material pass and for each textureunitstate
+                                                        --  setup texture when it's a RT
+                                                        let fp p = p { psTextureUnitStates = tul' }
+                                                              where
+                                                                tul'    = [tu { tusFrames = fromMaybe (tusFrames tu) $ ft i } | (i,tu) <- tusl]
+                                                                ft i    = case IntMap.lookup i $ cpInputs cp of
+                                                                            { Nothing   -> Nothing
+                                                                            ; Just it   -> Just $ Just [fromJust $ tdTexture $ texmap Map.! (itName it)]
+                                                                            }
+                                                                tusl    = zip [0..] $ psTextureUnitStates p
+                                                            mat' = mat { mtSupportedTechniques = Just [tch { tchPasses = [fp p | p <- tchPasses tch] } | tch <- fromJust $ mtSupportedTechniques mat] } 
+                                                        --return with modified pass attached to the list
+                                                        return (w1,(cp { cpMaterial = Just mat' }):pl,okPass)
+                                                    }
+                                            }
+                                    ; _ -> return (w0,cp:pl,okPass)
+                                    }
+                            
+                            (w1,pl,okPasses') <- foldM initPass (w0,[],okPasses) $ ctpPasses tp
+                            return (w1,(tp { ctpPasses = reverse pl }):tpl, okPasses')
+                    
+                    (world1,tps1,okInit1) <- foldM initPasses (world0,[],True) tps0
+                    (world2,motp,okInit2) <- initPasses (world1,[],okInit1) $ ctOutputTarget ct
+                    case okInit2 of
+                        { False -> return (world2,Nothing:cl)
+                        ; True  -> do
+                            let otp     = head motp
+                                tps2    = reverse tps1 -- [tp | Just tp <- tps1]
+                            return (world2,(Just c { cmpSupportedTechniques = Just [ct { ctTextureDefinitions = tds, ctTargetPasses = tps2, ctOutputTarget = otp }] }):cl)
+                        }
+                }
+    -- setup compositor target pass input
+    (wr1,cl1) <- foldM initCompositor (wr0,[]) cl0
+    let cl2 = reverse [c | Just c <- cl1]
+    -- TODO: setup compositor chain connection
+    return (wr1,cl2)
+
+-- | Create a viewport and attach given compositors.
+mkViewport x y w h cam cnl world0 = do
+    -- collect compositors
+    let compMap = rlCompositorMap $ wrResource world0
+        getCompositor l cn = case Map.lookup cn compMap of
+            { Nothing   -> do
+                errorM "ApplyCompositor" $ "Unknown compositor: " ++ cn
+                return l
+            ; Just c    -> return $ c:l
+            }
+        
+    -- setup compositor chain
+    cl0 <- foldM getCompositor [] cnl
+    (world1,cl1) <- mkCompositorChain world0 $ reverse cl0
+    return Viewport
+        { vpLeft            = x
+        , vpTop             = y
+        , vpWidth           = w
+        , vpHeight          = h
+        , vpCamera          = cam
+        , vpCompositors     = cl1
+        , vpBackColour      = (0,0,0,0)
+        , vpClearEveryFrame = True
+        , vpClearBuffers    = FrameBufferType True True False
+        }
+
+--updateTargetSize :: String -> Int -> Int -> World -> IO World
+updateTargetSize n w h = return . mapTargets (Map.adjust f n)
+  where 
+    f t = t { rtWidth = w, rtHeight = h }
diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,28 @@
+Copyright (c) 2009, Csaba Hruska
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice,
+   this list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in the
+   documentation and/or other materials provided with the distribution.
+
+3. Neither the name of the author nor the names of its contributors may be
+   used to endorse or promote products derived from this software without
+   specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
diff --git a/README b/README
new file mode 100644
--- /dev/null
+++ b/README
@@ -0,0 +1,18 @@
+This is all highly experimental. Check out the examples package and
+the website for further details.
+
+There is one important feature that none of the examples can use due
+to the way cabal deals with data files.  You can specify the paths to
+your resources in an ini-style config file, which looks something like
+this:
+
+# Comment
+[Section]
+Zip=path/to/resources-1.zip
+Zip=path/to/resources-2.zip
+FileSystem=path/to/more/resources/1
+FileSystem=path/to/more/resources/2
+...
+
+You can use the addConfig function (found in comments in all the
+examples) to load this file.
diff --git a/Setup.hs b/Setup.hs
new file mode 100644
--- /dev/null
+++ b/Setup.hs
@@ -0,0 +1,2 @@
+import Distribution.Simple
+main = defaultMain
diff --git a/lambdacube-engine.cabal b/lambdacube-engine.cabal
new file mode 100644
--- /dev/null
+++ b/lambdacube-engine.cabal
@@ -0,0 +1,113 @@
+name: lambdacube-engine
+version: 0.1.1
+cabal-version: >= 1.6 && < 2
+build-type: Simple
+license: BSD3
+license-file: LICENSE
+author: Csaba Hruska
+maintainer: csaba (dot) hruska (at) gmail (dot) com
+stability: experimental
+homepage: http://www.haskell.org/haskellwiki/LambdaCubeEngine
+category: Graphics
+tested-with: GHC == 6.10.1, GHC == 6.10.4
+synopsis: 3D rendering engine entirely written in Haskell
+description: 
+  LambdaCube is a 3D rendering engine written entirely in Haskell.
+  It targets newer graphics hardware. The engine uses Ogre3D's mesh
+  and material file format. The main goal of this project is to
+  provide a modern and feature rich graphical backend for various
+  haskell projects (e.g. FRP libraries).
+extra-source-files:
+  README
+  Graphics/LambdaCube/Loader/Makefile
+  Graphics/LambdaCube/Loader/CompositorScriptScanner.x
+  Graphics/LambdaCube/Loader/FontDefinitionScriptScanner.x
+  Graphics/LambdaCube/Loader/MaterialScriptScanner.x
+  Graphics/LambdaCube/Loader/OverlayScriptScanner.x
+  Graphics/LambdaCube/Loader/ResourceScriptScanner.x
+
+library
+  build-depends: 
+    base >= 4.0.0.0 && < 5,
+    zip-archive >= 0.1.1.3 && < 1,
+    binary >= 0.5.0.1 && < 1,
+    uulib >= 0.9.10 && < 1,
+    OpenGL >= 2.2.3 && < 3,
+    bytestring >= 0.9.1.4 && < 1,
+    xml >= 1.3 && < 2,
+    stb-image >= 0.1.3 && < 1,
+    filepath >= 1.1.0.1 && < 2,
+    directory >= 1.0.0.2 && < 2,
+    array,
+    containers >= 0.2 && < 1,
+    fgl,
+    hslogger
+  exposed-modules:
+    Graphics.LambdaCube
+    Graphics.LambdaCube.Compositor
+--    Graphics.LambdaCube.HardwareBufferManager
+    Graphics.LambdaCube.World
+    Graphics.LambdaCube.Light
+    Graphics.LambdaCube.GpuProgram
+--    Graphics.LambdaCube.MovableObject
+    Graphics.LambdaCube.TextureUnitState
+    Graphics.LambdaCube.VertexIndexData
+    Graphics.LambdaCube.GpuProgramParams
+    Graphics.LambdaCube.Types
+    Graphics.LambdaCube.Image
+--    Graphics.LambdaCube.HardwarePixelBuffer
+    Graphics.LambdaCube.Common
+    Graphics.LambdaCube.HardwareIndexBuffer
+    Graphics.LambdaCube.Texture
+--    Graphics.LambdaCube.ParticleSystem
+    Graphics.LambdaCube.Technique
+    Graphics.LambdaCube.GpuProgramUsage
+    Graphics.LambdaCube.PixelFormat
+    Graphics.LambdaCube.AnimationState
+    Graphics.LambdaCube.Pass
+    Graphics.LambdaCube.Material
+    Graphics.LambdaCube.RenderSystemCapabilities
+--    Graphics.LambdaCube.Overlay
+--    Graphics.LambdaCube.Loader.ParticleSystemScript
+    Graphics.LambdaCube.Loader.Generated.CompositorScriptScanner
+    Graphics.LambdaCube.Loader.Generated.ResourceScriptScanner
+--    Graphics.LambdaCube.Loader.Generated.FontDefinitionScriptScanner
+    Graphics.LambdaCube.Loader.Generated.MaterialScriptScanner
+--    Graphics.LambdaCube.Loader.Generated.OverlayScriptScanner
+    Graphics.LambdaCube.Loader.MeshXML
+    Graphics.LambdaCube.Loader.MaterialScript
+--    Graphics.LambdaCube.Loader.LMeshBinary
+    Graphics.LambdaCube.Loader.ParserUtil
+--    Graphics.LambdaCube.Loader.OverlayScript
+    Graphics.LambdaCube.Loader.CompositorScript
+    Graphics.LambdaCube.Loader.StbImage
+    Graphics.LambdaCube.Loader.ResourceScript
+    Graphics.LambdaCube.Math
+    Graphics.LambdaCube.SceneGraph
+    Graphics.LambdaCube.HardwareBuffer
+    Graphics.LambdaCube.Resource
+    Graphics.LambdaCube.Mesh
+    Graphics.LambdaCube.RenderSystem
+    Graphics.LambdaCube.RenderQueue
+    Graphics.LambdaCube.Frustum
+    Graphics.LambdaCube.RenderSystem.GL
+    Graphics.LambdaCube.RenderSystem.GL.GLGpuProgram
+    Graphics.LambdaCube.RenderSystem.GL.GLCapabilities
+    Graphics.LambdaCube.RenderSystem.GL.GLTexture
+    Graphics.LambdaCube.RenderSystem.GL.GLUtils
+    Graphics.LambdaCube.RenderSystem.GL.GLOcclusionQuery
+    Graphics.LambdaCube.RenderSystem.GL.GLRenderSystem
+    Graphics.LambdaCube.RenderSystem.GL.GLVertexBuffer
+    Graphics.LambdaCube.RenderSystem.GL.GLIndexBuffer
+    Graphics.LambdaCube.Entity
+    Graphics.LambdaCube.HardwareVertexBuffer
+    Graphics.LambdaCube.BlendMode
+    Graphics.LambdaCube.RenderOperation
+    Graphics.LambdaCube.Utility
+    Graphics.LambdaCube.HardwareOcclusionQuery
+
+--    Graphics.LambdaCube
+--    Graphics.LambdaCube.Loader.StbImage
+--    Graphics.LambdaCube.RenderSystem.GL
+
+  ghc-options: -O2 -Wall
