You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by da...@apache.org on 2011/04/07 22:41:24 UTC

svn commit: r1089997 - in /commons/proper/sanselan/trunk/src: main/java/org/apache/sanselan/ main/java/org/apache/sanselan/common/ main/java/org/apache/sanselan/formats/xbm/ main/java/org/apache/sanselan/formats/xpm/ test/data/images/xbm/ test/data/ima...

Author: damjan
Date: Thu Apr  7 20:41:24 2011
New Revision: 1089997

URL: http://svn.apache.org/viewvc?rev=1089997&view=rev
Log:
Added support for reading and writing XBM images, relevant tests,
and a very basic C language parser that can be reused for XPM files too.

Added:
    commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/common/BasicCParser.java   (with props)
    commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/formats/xbm/
    commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/formats/xbm/XbmImageParser.java   (with props)
    commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/formats/xpm/
    commons/proper/sanselan/trunk/src/test/data/images/xbm/
    commons/proper/sanselan/trunk/src/test/data/images/xbm/1/
    commons/proper/sanselan/trunk/src/test/data/images/xbm/1/Oregon Scientific DS6639 - DSC_0307 - small.xbm
    commons/proper/sanselan/trunk/src/test/data/images/xbm/1/info.txt   (with props)
    commons/proper/sanselan/trunk/src/test/java/org/apache/sanselan/formats/xbm/
    commons/proper/sanselan/trunk/src/test/java/org/apache/sanselan/formats/xbm/XbmBaseTest.java   (with props)
    commons/proper/sanselan/trunk/src/test/java/org/apache/sanselan/formats/xbm/XbmReadTest.java   (with props)
Modified:
    commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/ImageFormat.java
    commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/ImageParser.java
    commons/proper/sanselan/trunk/src/test/java/org/apache/sanselan/common/byteSources/ByteSourceImageTest.java
    commons/proper/sanselan/trunk/src/test/java/org/apache/sanselan/roundtrip/RoundtripTest.java

Modified: commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/ImageFormat.java
URL: http://svn.apache.org/viewvc/commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/ImageFormat.java?rev=1089997&r1=1089996&r2=1089997&view=diff
==============================================================================
--- commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/ImageFormat.java (original)
+++ commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/ImageFormat.java Thu Apr  7 20:41:24 2011
@@ -76,6 +76,7 @@ public class ImageFormat
     public static final ImageFormat IMAGE_FORMAT_WBMP = new ImageFormat("WBMP");
     public static final ImageFormat IMAGE_FORMAT_PCX = new ImageFormat("PCX");
     public static final ImageFormat IMAGE_FORMAT_DCX = new ImageFormat("DCX");
+    public static final ImageFormat IMAGE_FORMAT_XBM = new ImageFormat("XBM");
 
     public static final ImageFormat[] getAllFormats()
     {
@@ -85,7 +86,7 @@ public class ImageFormat
                 IMAGE_FORMAT_PSD, IMAGE_FORMAT_PBM, IMAGE_FORMAT_PGM,
                 IMAGE_FORMAT_PPM, IMAGE_FORMAT_PNM, IMAGE_FORMAT_TGA,
                 IMAGE_FORMAT_JBIG2, IMAGE_FORMAT_ICNS, IMAGE_FORMAT_WBMP,
-                IMAGE_FORMAT_PCX, IMAGE_FORMAT_DCX,
+                IMAGE_FORMAT_PCX, IMAGE_FORMAT_DCX, IMAGE_FORMAT_XBM,
         };
 
         return result;

Modified: commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/ImageParser.java
URL: http://svn.apache.org/viewvc/commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/ImageParser.java?rev=1089997&r1=1089996&r2=1089997&view=diff
==============================================================================
--- commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/ImageParser.java (original)
+++ commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/ImageParser.java Thu Apr  7 20:41:24 2011
@@ -45,6 +45,7 @@ import org.apache.sanselan.formats.pnm.P
 import org.apache.sanselan.formats.psd.PsdImageParser;
 import org.apache.sanselan.formats.tiff.TiffImageParser;
 import org.apache.sanselan.formats.wbmp.WbmpImageParser;
+import org.apache.sanselan.formats.xbm.XbmImageParser;
 import org.apache.sanselan.util.Debug;
 
 public abstract class ImageParser extends BinaryFileParser implements
@@ -59,6 +60,7 @@ public abstract class ImageParser extend
                 new PNMImageParser(), new IcoImageParser(),
                 new IcnsImageParser(), new WbmpImageParser(),
                 new PcxImageParser(), new DcxImageParser(),
+                new XbmImageParser(),
         // new JBig2ImageParser(),
         // new TgaImageParser(),
         };

Added: commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/common/BasicCParser.java
URL: http://svn.apache.org/viewvc/commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/common/BasicCParser.java?rev=1089997&view=auto
==============================================================================
--- commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/common/BasicCParser.java (added)
+++ commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/common/BasicCParser.java Thu Apr  7 20:41:24 2011
@@ -0,0 +1,373 @@
+/*
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ * 
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *  under the License.
+ */
+
+package org.apache.sanselan.common;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.PushbackInputStream;
+import java.util.Map;
+import org.apache.sanselan.ImageReadException;
+
+public class BasicCParser
+{
+    private PushbackInputStream is;
+
+    public BasicCParser(ByteArrayInputStream is)
+    {
+        this.is = new PushbackInputStream(is);
+    }
+
+    public String nextToken() throws IOException, ImageReadException
+    {
+        // I don't know how complete the C parsing in an XPM file
+        // is meant to be, this is just the very basics...
+
+        boolean inString = false;
+        boolean inIdentifier = false;
+        boolean hadBackSlash = false;
+        StringBuilder token = new StringBuilder();
+        for (int c = is.read(); c != -1; c = is.read())
+        {
+            if (inString)
+            {
+                if (c == '\\')
+                {
+                    token.append('\\');
+                    hadBackSlash = !hadBackSlash;
+                }
+                else if (c == '"')
+                {
+                    token.append('"');
+                    if (!hadBackSlash)
+                        return token.toString();
+                    hadBackSlash = false;
+                }
+                else if (c == '\r' || c == '\n')
+                    throw new ImageReadException("Unterminated string in XPM file");
+                else
+                {
+                    token.append((char)c);
+                    hadBackSlash = false;
+                }
+            }
+            else if (inIdentifier)
+            {
+                if (Character.isLetterOrDigit(c) || c == '_')
+                    token.append((char)c);
+                else
+                {
+                    is.unread(c);
+                    return token.toString();
+                }
+            }
+            else
+            {
+                if (c == '"')
+                {
+                    token.append('"');
+                    inString = true;
+                }
+                else if (Character.isLetterOrDigit(c) || c == '_')
+                {
+                    token.append((char)c);
+                    inIdentifier = true;
+                }
+                else if (c == '{' || c == '}' ||
+                        c == '[' || c == ']' ||
+                        c == '*' || c == ';' ||
+                        c == '=' || c == ',')
+                {
+                    token.append((char)c);
+                    return token.toString();
+                }
+                else if (c == ' ' || c == '\t' || c == '\r' || c == '\n')
+                    ;
+                else
+                    throw new ImageReadException("Unhandled/invalid character '" +
+                            ((char)c) + "' found in XPM file");
+            }
+        }
+
+        if (inIdentifier)
+            return token.toString();
+        if (inString)
+            throw new ImageReadException("Unterminated string ends XMP file");
+        return null;
+    }
+
+    public static ByteArrayOutputStream preprocess(InputStream is,
+            StringBuilder firstComment, Map defines)
+            throws IOException, ImageReadException
+    {
+        boolean inString = false;
+        boolean inComment = false;
+        boolean inDirective = false;
+        boolean hadSlash = false;
+        boolean hadStar = false;
+        boolean hadBackSlash = false;
+        ByteArrayOutputStream out = new ByteArrayOutputStream();
+        boolean seenFirstComment = (firstComment == null);
+        StringBuilder directiveBuffer = new StringBuilder();
+        for (int c = is.read(); c != -1; c = is.read())
+        {
+            if (inComment)
+            {
+                if (c == '*')
+                {
+                    if (hadStar && !seenFirstComment)
+                        firstComment.append('*');
+                    hadStar = true;
+                }
+                else if(c == '/')
+                {
+                    if (hadStar)
+                    {
+                        hadStar = false;
+                        inComment = false;
+                        seenFirstComment = true;
+                    }
+                    else
+                        out.write(c);
+                }
+                else
+                {
+                    if (hadStar && !seenFirstComment)
+                        firstComment.append('*');
+                    hadStar = false;
+                    if (!seenFirstComment)
+                        firstComment.append((char)c);
+                }
+            }
+            else if (inString)
+            {
+                if (c == '\\')
+                {
+                    if (hadBackSlash)
+                        out.write('\\');
+                    hadBackSlash = true;
+                }
+                else if (c == '"')
+                {
+                    if (hadBackSlash)
+                    {
+                        out.write('\\');
+                        hadBackSlash = false;
+                    }
+                    else
+                        inString = false;
+                    out.write('"');
+                }
+                else if (c == '\r' || c == '\n')
+                    throw new ImageReadException("Unterminated string in file");
+                else
+                {
+                    if (hadBackSlash)
+                    {
+                        out.write('\\');
+                        hadBackSlash = false;
+                    }
+                    out.write(c);
+                }
+            }
+            else if (inDirective)
+            {
+                if (c == '\r' || c == '\n')
+                {
+                    inDirective = false;
+                    String[] tokens = tokenizeRow(directiveBuffer.toString());
+                    if (tokens.length < 2 || tokens.length > 3)
+                        throw new ImageReadException("Bad preprocessor directive");
+                    if (!tokens[0].equals("define"))
+                        throw new ImageReadException("Invalid/unsupported " +
+                                "preprocessor directive '" + tokens[0] + "'");
+                    defines.put(tokens[1], (tokens.length == 3) ? tokens[2] : null);
+                    directiveBuffer.setLength(0);
+                }
+                else
+                    directiveBuffer.append((char)c);
+            }
+            else
+            {
+                if (c == '/')
+                {
+                    if (hadSlash)
+                        out.write('/');
+                    hadSlash = true;
+                }
+                else if (c == '*')
+                {
+                    if (hadSlash)
+                    {
+                        inComment = true;
+                        hadSlash = false;
+                    }
+                    else
+                        out.write(c);
+                }
+                else if (c == '"')
+                {
+                    if (hadSlash)
+                        out.write('/');
+                    hadSlash = false;
+                    out.write(c);
+                    inString = true;
+                }
+                else if (c == '#')
+                {
+                    if (defines == null)
+                        throw new ImageReadException("Unexpected preprocessor directive");
+                    inDirective = true;
+                }
+                else
+                {
+                    if (hadSlash)
+                        out.write('/');
+                    hadSlash = false;
+                    out.write(c);
+                    // Only whitespace allowed before first comment:
+                    if (c != ' ' && c != '\t' && c != '\r' && c != '\n')
+                        seenFirstComment = true;
+                }
+            }
+        }
+        if (hadSlash)
+            out.write('/');
+        if (hadStar)
+            out.write('*');
+        if (inString)
+            throw new ImageReadException("Unterminated string at the end of file");
+        if (inComment)
+            throw new ImageReadException("Unterminated comment at the end of file");
+        return out;
+    }
+
+    public static String[] tokenizeRow(String row)
+            throws ImageReadException
+    {
+        String[] tokens = row.split("[ \t]");
+        int numLiveTokens = 0;
+        for (int i = 0; i < tokens.length; i++)
+        {
+            if (tokens[i] != null && tokens[i].length() > 0)
+                ++numLiveTokens;
+        }
+        String[] liveTokens = new String[numLiveTokens];
+        int next = 0;
+        for (int i = 0; i < tokens.length; i++)
+        {
+            if (tokens[i] != null && tokens[i].length() > 0)
+                liveTokens[next++] = tokens[i];
+        }
+        return liveTokens;
+    }
+
+    public static void unescapeString(StringBuilder stringBuilder, String string)
+            throws ImageReadException
+    {
+        if (string.length() < 2)
+            throw new ImageReadException("Parsing XPM file failed, " +
+                    "string is too short");
+        if (string.charAt(0) != '"' || string.charAt(string.length() - 1) != '"')
+            throw new ImageReadException("Parsing XPM file failed, " +
+                    "string not surrounded by '\"'");
+        boolean hadBackSlash = false;
+        for (int i = 1; i < (string.length() - 1); i++)
+        {
+            char c = string.charAt(i);
+            if (hadBackSlash)
+            {
+                if (c == '\\')
+                    stringBuilder.append('\\');
+                else if (c == '"')
+                    stringBuilder.append('"');
+                else if (c == '\'')
+                    stringBuilder.append('\'');
+                else if (c == 'x')
+                {
+                    if (i + 2 >= string.length())
+                        throw new ImageReadException("Parsing XPM file failed, " +
+                                "hex constant in string too short");
+                    char hex1 = string.charAt(i + 1);
+                    char hex2 = string.charAt(i + 2);
+                    i += 2;
+                    int constant;
+                    try
+                    {
+                        constant =  Integer.parseInt("" + hex1 + hex2, 16);
+                    }
+                    catch (NumberFormatException nfe)
+                    {
+                        throw new ImageReadException("Parsing XPM file failed, " +
+                                "hex constant invalid", nfe);
+                    }
+                    stringBuilder.append((char)constant);
+                }
+                else if (c == '0' || c == '1' || c == '2' || c == '3' || c == '4' ||
+                        c == '5' || c == '6' || c == '7')
+                {
+                    int length = 1;
+                    if (i+1 < string.length() && '0' <= string.charAt(i+1) &&
+                            string.charAt(i+1) <= '7')
+                        ++length;
+                    if (i+2 < string.length() && '0' <= string.charAt(i+2) &&
+                            string.charAt(i+2) <= '7')
+                        ++length;
+                    int constant = 0;
+                    for (int j = 0; j < length; j++)
+                    {
+                        constant *= 8;
+                        constant += (string.charAt(i + j) - '0');
+                    }
+                    i += length - 1;
+                    stringBuilder.append((char)constant);
+                }
+                else if (c == 'a')
+                    stringBuilder.append((char)0x07);
+                else if (c == 'b')
+                    stringBuilder.append((char)0x08);
+                else if (c == 'f')
+                    stringBuilder.append((char)0x0c);
+                else if (c == 'n')
+                    stringBuilder.append((char)0x0a);
+                else if (c == 'r')
+                    stringBuilder.append((char)0x0d);
+                else if (c == 't')
+                    stringBuilder.append((char)0x09);
+                else if (c == 'v')
+                    stringBuilder.append((char)0x0b);
+                else
+                    throw new ImageReadException("Parsing XPM file failed, " +
+                            "invalid escape sequence");
+                hadBackSlash = false;
+            }
+            else
+            {
+                if (c == '\\')
+                    hadBackSlash = true;
+                else if (c == '"')
+                    throw new ImageReadException("Parsing XPM file failed, " +
+                            "extra '\"' found in string");
+                else
+                    stringBuilder.append(c);
+            }
+        }
+        if (hadBackSlash)
+            throw new ImageReadException("Parsing XPM file failed, " +
+                    "unterminated escape sequence found in string");
+    }
+}

Propchange: commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/common/BasicCParser.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/formats/xbm/XbmImageParser.java
URL: http://svn.apache.org/viewvc/commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/formats/xbm/XbmImageParser.java?rev=1089997&view=auto
==============================================================================
--- commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/formats/xbm/XbmImageParser.java (added)
+++ commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/formats/xbm/XbmImageParser.java Thu Apr  7 20:41:24 2011
@@ -0,0 +1,420 @@
+/*
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ * 
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *  under the License.
+ */
+
+package org.apache.sanselan.formats.xbm;
+
+import java.awt.Dimension;
+import java.awt.image.BufferedImage;
+import java.awt.image.ColorModel;
+import java.awt.image.DataBuffer;
+import java.awt.image.DataBufferByte;
+import java.awt.image.IndexColorModel;
+import java.awt.image.WritableRaster;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Properties;
+import java.util.UUID;
+import org.apache.sanselan.ImageFormat;
+import org.apache.sanselan.ImageInfo;
+import org.apache.sanselan.ImageParser;
+import org.apache.sanselan.ImageReadException;
+import org.apache.sanselan.ImageWriteException;
+import org.apache.sanselan.common.BasicCParser;
+import org.apache.sanselan.common.IImageMetadata;
+import org.apache.sanselan.common.byteSources.ByteSource;
+
+public class XbmImageParser extends ImageParser
+{
+    public XbmImageParser()
+    {
+    }
+
+    public String getName()
+    {
+        return "Xbm-Custom";
+    }
+
+    public String getDefaultExtension()
+    {
+        return DEFAULT_EXTENSION;
+    }
+    private static final String DEFAULT_EXTENSION = ".xbm";
+    private static final String ACCEPTED_EXTENSIONS[] =
+    {
+        ".xbm",
+    };
+
+    protected String[] getAcceptedExtensions()
+    {
+        return ACCEPTED_EXTENSIONS;
+    }
+
+    protected ImageFormat[] getAcceptedTypes()
+    {
+        return new ImageFormat[]
+        {
+            ImageFormat.IMAGE_FORMAT_XBM, //
+        };
+    }
+
+    public boolean embedICCProfile(File src, File dst, byte profile[])
+    {
+        return false;
+    }
+
+    public IImageMetadata getMetadata(ByteSource byteSource, Map params)
+            throws ImageReadException, IOException
+    {
+        return null;
+    }
+
+    public ImageInfo getImageInfo(ByteSource byteSource, Map params)
+            throws ImageReadException, IOException
+    {
+        XbmHeader xbmHeader = readXbmHeader(byteSource);
+        return new ImageInfo("XBM", 1,
+                new ArrayList(), ImageFormat.IMAGE_FORMAT_XBM,
+                "X BitMap",
+                xbmHeader.height, "image/x-xbitmap", 1,
+                0, 0, 0, 0,
+                xbmHeader.width, false, false, false,
+                ImageInfo.COLOR_TYPE_BW,
+                ImageInfo.COMPRESSION_ALGORITHM_NONE);
+    }
+
+    public Dimension getImageSize(ByteSource byteSource,
+            Map params)
+            throws ImageReadException, IOException
+    {
+        XbmHeader xbmHeader = readXbmHeader(byteSource);
+        return new Dimension(xbmHeader.width, xbmHeader.height);
+    }
+
+    public byte[] getICCProfileBytes(ByteSource byteSource,
+            Map params)
+            throws ImageReadException, IOException
+    {
+        return null;
+    }
+
+    private static class XbmHeader
+    {
+        int width;
+        int height;
+        int xHot = -1;
+        int yHot = -1;
+
+        public XbmHeader(int width, int height, int xHot, int yHot)
+        {
+            this.width = width;
+            this.height = height;
+            this.xHot = xHot;
+            this.yHot = yHot;
+        }
+
+        public void dump(PrintWriter pw)
+        {
+            pw.println("XbmHeader");
+            pw.println("Width: " + width);
+            pw.println("Height: " + height);
+            if (xHot != -1 && yHot != -1)
+            {
+                pw.println("X hot: " + xHot);
+                pw.println("Y hot: " + yHot);
+            }
+        }
+    }
+
+    private static class XbmParseResult
+    {
+        XbmHeader xbmHeader;
+        BasicCParser cParser;
+    }
+
+    private XbmHeader readXbmHeader(ByteSource byteSource)
+            throws ImageReadException, IOException
+    {
+        XbmParseResult result = parseXbmHeader(byteSource);
+        return result.xbmHeader;
+    }
+
+    private XbmParseResult parseXbmHeader(ByteSource byteSource)
+            throws ImageReadException, IOException
+    {
+        InputStream is = null;
+        try
+        {
+            is = byteSource.getInputStream();
+            Map defines = new HashMap();
+            ByteArrayOutputStream preprocessedFile = BasicCParser.preprocess(
+                    is, null, defines);
+            int width = -1;
+            int height = -1;
+            int xHot = -1;
+            int yHot = -1;
+            for (Iterator it = defines.entrySet().iterator(); it.hasNext();)
+            {
+                Map.Entry entry = (Map.Entry)it.next();
+                String name = (String)entry.getKey();
+                if (name.endsWith("_width"))
+                    width = Integer.parseInt((String)entry.getValue());
+                else if (name.endsWith("_height"))
+                    height = Integer.parseInt((String)entry.getValue());
+                else if (name.endsWith("_x_hot"))
+                    xHot = Integer.parseInt((String)entry.getValue());
+                else if (name.endsWith("_y_hot"))
+                    yHot = Integer.parseInt((String)entry.getValue());
+            }
+            if (width == -1)
+                throw new ImageReadException("width not found");
+            if (height == -1)
+                throw new ImageReadException("height not found");
+
+            XbmParseResult xbmParseResult = new XbmParseResult();
+            xbmParseResult.cParser = new BasicCParser(
+                    new ByteArrayInputStream(preprocessedFile.toByteArray()));
+            xbmParseResult.xbmHeader = new XbmHeader(width, height, xHot, yHot);
+            return xbmParseResult;
+        }
+        finally
+        {
+            try
+            {
+                if (is != null)
+                    is.close();
+            }
+            catch (IOException ignored)
+            {
+            }
+        }
+    }
+
+    private BufferedImage readXbmImage(XbmHeader xbmHeader, BasicCParser cParser)
+            throws ImageReadException, IOException
+    {
+        String token;
+        token = cParser.nextToken();
+        if (token == null || !token.equals("static"))
+            throw new ImageReadException("Parsing XBM file failed, no 'static' token");
+        token = cParser.nextToken();
+        if (token == null)
+            throw new ImageReadException("Parsing XBM file failed, no 'unsigned' " +
+                    "or 'char' token");
+        if (token.equals("unsigned"))
+            token = cParser.nextToken();
+        if (token == null || !token.equals("char"))
+            throw new ImageReadException("Parsing XBM file failed, no 'char' token");
+        String name = cParser.nextToken();
+        if (name == null)
+            throw new ImageReadException("Parsing XBM file failed, no variable name");
+        if (name.charAt(0) != '_' && !Character.isLetter(name.charAt(0)))
+            throw new ImageReadException("Parsing XBM file failed, variable name " +
+                    "doesn't start with letter or underscore");
+        for (int i = 0; i < name.length(); i++)
+        {
+            char c = name.charAt(i);
+            if (!Character.isLetterOrDigit(c) && c != '_')
+                throw new ImageReadException("Parsing XBM file failed, variable name " +
+                        "contains non-letter non-digit non-underscore");
+        }
+        token = cParser.nextToken();
+        if (token == null || !token.equals("["))
+            throw new ImageReadException("Parsing XBM file failed, no '[' token");
+        token = cParser.nextToken();
+        if (token == null || !token.equals("]"))
+            throw new ImageReadException("Parsing XBM file failed, no ']' token");
+        token = cParser.nextToken();
+        if (token == null || !token.equals("="))
+            throw new ImageReadException("Parsing XBM file failed, no '=' token");
+        token = cParser.nextToken();
+        if (token == null || !token.equals("{"))
+            throw new ImageReadException("Parsing XBM file failed, no '{' token");
+
+        int rowLength = (xbmHeader.width + 7) / 8;
+        byte[] imageData = new byte[rowLength * xbmHeader.height];
+        for (int i = 0; i < imageData.length; i++)
+        {
+            token = cParser.nextToken();
+            if (token == null || !token.startsWith("0x"))
+                throw new ImageReadException("Parsing XBM file failed, " +
+                        "hex value missing");
+            if (token.length() > 4)
+                throw new ImageReadException("Parsing XBM file failed, " +
+                        "hex value too long");
+            int value = Integer.parseInt(token.substring(2), 16);
+            int flipped = 0;
+            for (int j = 0; j < 8; j++)
+            {
+                if ((value & (1 << j)) != 0)
+                    flipped |= (0x80 >>> j);
+            }
+            imageData[i] = (byte) flipped;
+
+            token = cParser.nextToken();
+            if (token == null)
+                throw new ImageReadException("Parsing XBM file failed, " +
+                        "premature end of file");
+            if (!token.equals(",") && (i < (imageData.length - 1) || !token.equals("}")))
+                throw new ImageReadException("Parsing XBM file failed, " +
+                        "punctuation error");
+        }
+
+        int[] palette = {0xffffff, 0x000000};
+        ColorModel colorModel = new IndexColorModel(1, 2,
+                palette, 0, false, -1, DataBuffer.TYPE_BYTE);
+        DataBufferByte dataBuffer = new DataBufferByte(imageData, imageData.length);
+        WritableRaster raster = WritableRaster.createPackedRaster(dataBuffer,
+                xbmHeader.width, xbmHeader.height, 1, null);
+        BufferedImage image = new BufferedImage(colorModel, raster,
+                colorModel.isAlphaPremultiplied(), new Properties());
+        return image;
+    }
+
+    public boolean dumpImageFile(PrintWriter pw, ByteSource byteSource)
+            throws ImageReadException, IOException
+    {
+        readXbmHeader(byteSource).dump(pw);
+        return true;
+    }
+
+    public final BufferedImage getBufferedImage(ByteSource byteSource,
+            Map params) throws ImageReadException, IOException
+    {
+        XbmParseResult result = parseXbmHeader(byteSource);
+        return readXbmImage(result.xbmHeader, result.cParser);
+    }
+
+    private String randomName()
+    {
+        UUID uuid = UUID.randomUUID();
+        StringBuilder stringBuilder = new StringBuilder("a");
+        long bits = uuid.getMostSignificantBits();
+        // Long.toHexString() breaks for very big numbers
+        for (int i = 64 - 8; i >= 0; i -= 8)
+            stringBuilder.append(Integer.toHexString((int)((bits >> i) & 0xff)));
+        bits = uuid.getLeastSignificantBits();
+        for (int i = 64 - 8; i >= 0; i -= 8)
+            stringBuilder.append(Integer.toHexString((int)((bits >> i) & 0xff)));
+        return stringBuilder.toString();
+    }
+
+    private String toPrettyHex(int value)
+    {
+        String s = Integer.toHexString(0xff & value);
+        if (s.length() == 2)
+            return "0x" + s;
+        return "0x0" + s;
+    }
+
+    public void writeImage(BufferedImage src, OutputStream os, Map params)
+            throws ImageWriteException, IOException
+    {
+        // make copy of params; we'll clear keys as we consume them.
+        params = (params == null) ? new HashMap() : new HashMap(params);
+
+        // clear format key.
+        if (params.containsKey(PARAM_KEY_FORMAT))
+            params.remove(PARAM_KEY_FORMAT);
+
+        if (params.size() > 0)
+        {
+            Object firstKey = params.keySet().iterator().next();
+            throw new ImageWriteException("Unknown parameter: " + firstKey);
+        }
+
+        String name = randomName();
+
+        os.write(("#define " + name + "_width " + src.getWidth() + "\n").getBytes("US-ASCII"));
+        os.write(("#define " + name + "_height " + src.getHeight() + "\n").getBytes("US-ASCII"));
+        os.write(("static unsigned char " + name + "_bits[] = {").getBytes("US-ASCII"));
+
+        int bitcache = 0;
+        int bits_in_cache = 0;
+        String separator = "\n  ";
+        int written = 0;
+        for (int y = 0; y < src.getHeight(); y++)
+        {
+            for (int x = 0; x < src.getWidth(); x++)
+            {
+                int argb = src.getRGB(x, y);
+                int red = 0xff & (argb >> 16);
+                int green = 0xff & (argb >> 8);
+                int blue = 0xff & (argb >> 0);
+                int sample = (red + green + blue) / 3;
+                if (sample > 127)
+                    sample = 0;
+                else
+                    sample = 1;
+                bitcache |= (sample << bits_in_cache);
+                ++bits_in_cache;
+                if (bits_in_cache == 8)
+                {
+                    os.write(separator.getBytes("US-ASCII"));
+                    separator = ",";
+                    if (written == 12)
+                    {
+                        os.write("\n  ".getBytes("US-ASCII"));
+                        written = 0;
+                    }
+                    os.write(toPrettyHex(bitcache).getBytes("US-ASCII"));
+                    bitcache = 0;
+                    bits_in_cache = 0;
+                    ++written;
+                }
+            }
+            if (bits_in_cache != 0)
+            {
+                os.write(separator.getBytes("US-ASCII"));
+                separator = ",";
+                if (written == 12)
+                {
+                    os.write("\n  ".getBytes("US-ASCII"));
+                    written = 0;
+                }
+                os.write(toPrettyHex(bitcache).getBytes("US-ASCII"));
+                bitcache = 0;
+                bits_in_cache = 0;
+                ++written;
+            }
+        }
+
+        os.write("\n};\n".getBytes("US-ASCII"));
+    }
+
+    /**
+     * Extracts embedded XML metadata as XML string.
+     * <p>
+     *
+     * @param byteSource
+     *            File containing image data.
+     * @param params
+     *            Map of optional parameters, defined in SanselanConstants.
+     * @return Xmp Xml as String, if present.  Otherwise, returns null.
+     */
+    public String getXmpXml(ByteSource byteSource, Map params)
+            throws ImageReadException, IOException
+    {
+        return null;
+    }
+}

Propchange: commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/formats/xbm/XbmImageParser.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: commons/proper/sanselan/trunk/src/test/data/images/xbm/1/Oregon Scientific DS6639 - DSC_0307 - small.xbm
URL: http://svn.apache.org/viewvc/commons/proper/sanselan/trunk/src/test/data/images/xbm/1/Oregon%20Scientific%20DS6639%20-%20DSC_0307%20-%20small.xbm?rev=1089997&view=auto
==============================================================================
--- commons/proper/sanselan/trunk/src/test/data/images/xbm/1/Oregon Scientific DS6639 - DSC_0307 - small.xbm (added)
+++ commons/proper/sanselan/trunk/src/test/data/images/xbm/1/Oregon Scientific DS6639 - DSC_0307 - small.xbm Thu Apr  7 20:41:24 2011
@@ -0,0 +1,717 @@
+#define adbe1c3fcd16143da8c2bd7adfa6dcf80_width 300
+#define adbe1c3fcd16143da8c2bd7adfa6dcf80_height 225
+static unsigned char adbe1c3fcd16143da8c2bd7adfa6dcf80_bits[] = {
+  0xff,0xfd,0xff,0xff,0xff,0x7f,0xef,0x3f,0xfe,0xdf,0xff,0xff,
+  0xff,0xff,0xff,0xdf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfb,
+  0xff,0xff,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xf7,0xff,0xff,
+  0xff,0x0f,0xfd,0xff,0xff,0xff,0xff,0xbf,0xd6,0x4b,0xfd,0xff,
+  0xff,0xff,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+  0xff,0x7f,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfb,
+  0xff,0xff,0xff,0x0f,0xff,0xff,0xff,0xff,0xff,0xff,0xfb,0xc1,
+  0xfa,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xbf,0x9f,0xff,
+  0xff,0x7f,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+  0xff,0xfa,0xff,0xff,0xff,0x0f,0xde,0xfd,0xff,0xff,0xff,0xff,
+  0x0a,0x80,0xce,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,
+  0xfe,0xff,0xff,0xff,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+  0xff,0xff,0xff,0xfd,0xff,0xff,0xff,0x0f,0xff,0xff,0xff,0xff,
+  0xff,0xaf,0x0b,0x20,0xff,0xff,0xff,0xff,0xf7,0xff,0xff,0x7f,
+  0xff,0xff,0xfc,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+  0xff,0xff,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0x0f,0xff,0xfd,
+  0xff,0xff,0xbf,0xdf,0x2e,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,
+  0xff,0xff,0xff,0xff,0xff,0xd7,0xff,0xfe,0x5f,0xff,0xff,0xff,
+  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfa,0xff,0xff,0xff,0x0f,
+  0xff,0xff,0xff,0xff,0xff,0xff,0xab,0xfa,0xfb,0xff,0xff,0xff,
+  0xff,0xff,0xff,0xff,0xdf,0xff,0xf3,0xe3,0xff,0xff,0xfd,0xff,
+  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xbf,0xfe,0xd3,0xff,0xff,
+  0xff,0x0f,0xfc,0xdf,0xff,0xff,0xff,0xfe,0xdf,0xff,0xfc,0xff,
+  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xe7,0xcf,0xff,0xff,0xfd,
+  0xf3,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0xff,0xee,
+  0xff,0xff,0xff,0x0f,0xff,0xff,0xff,0xff,0xff,0xff,0x5a,0xef,
+  0xef,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xd3,0xdf,0xff,
+  0xff,0xff,0xfb,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+  0xff,0xae,0xff,0xff,0xff,0x0f,0xff,0xff,0xff,0xff,0xff,0xff,
+  0xdf,0xaf,0xe7,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xe7,
+  0xbf,0xff,0xff,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,
+  0xfb,0xff,0xff,0xbf,0xff,0xff,0xff,0x0f,0xff,0xaf,0xff,0xff,
+  0xff,0xbf,0xef,0xfd,0xff,0xff,0xff,0xf7,0xff,0xff,0xff,0xff,
+  0xfd,0xb3,0xfe,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+  0xff,0xff,0xfb,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xff,0xff,
+  0xff,0xff,0xff,0x7f,0x1b,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+  0xff,0xff,0xfb,0x33,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+  0xff,0xff,0xff,0xff,0xef,0xff,0xff,0xdf,0xff,0xff,0xff,0x0f,
+  0xff,0xef,0xff,0xff,0xff,0xff,0xfd,0xb2,0xff,0xff,0xef,0xff,
+  0xff,0x7f,0x7f,0xff,0xff,0x8f,0x7b,0xff,0xff,0xff,0xff,0xff,
+  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xaf,0xff,0xff,
+  0xff,0x0f,0xf7,0xff,0xff,0xff,0xff,0xff,0xf7,0xe5,0xfe,0xff,
+  0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0x8b,0x77,0xff,0xff,0xff,
+  0xff,0xff,0xff,0xff,0xff,0xff,0xf7,0xff,0xff,0xff,0xff,0xfd,
+  0xff,0xff,0xff,0x0f,0xbf,0xdd,0xff,0xff,0xff,0xff,0x13,0xf4,
+  0xff,0xff,0xff,0xff,0xf7,0xff,0xff,0xdb,0xff,0xaf,0xf7,0xf7,
+  0xff,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+  0xff,0xff,0xff,0xff,0xff,0x0f,0xeb,0xf7,0xff,0xbf,0xff,0xff,
+  0x71,0x3a,0xfe,0xff,0xff,0xf7,0x3f,0xf7,0xff,0xdf,0x8f,0xfb,
+  0xfc,0xf7,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xef,0xff,
+  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xf6,0xfe,0xff,0xdf,
+  0xff,0xff,0x7e,0xd5,0xf4,0xff,0xff,0xff,0x4f,0xf8,0xff,0x9f,
+  0x97,0xff,0xff,0xdf,0xff,0xff,0xff,0xbf,0xff,0xff,0xff,0xff,
+  0xff,0xff,0xff,0xff,0xff,0xfc,0xff,0xff,0xff,0x0f,0xeb,0xff,
+  0xff,0xfe,0xff,0xff,0xff,0xd8,0xdd,0xff,0xff,0xff,0x2f,0xf0,
+  0xff,0x0f,0x5f,0xbf,0xff,0xff,0xff,0xff,0xff,0xfd,0xff,0xff,
+  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,
+  0xaa,0xf5,0xff,0xff,0xfb,0xef,0xff,0x1b,0xa7,0xff,0xff,0xff,
+  0x0f,0xff,0xff,0xff,0x3d,0x0f,0xff,0xff,0xff,0xff,0xff,0xff,
+  0xff,0xff,0xff,0xfd,0xff,0xff,0xff,0xff,0xff,0xfb,0xff,0xff,
+  0xff,0x0f,0xbd,0x6a,0xff,0xff,0xff,0xff,0xff,0xff,0xdd,0xff,
+  0xff,0xff,0x3f,0xdf,0x7f,0xff,0x7f,0x1d,0xff,0xff,0xff,0xff,
+  0xff,0xf1,0xfe,0xff,0x7f,0xf9,0xff,0xff,0xff,0xff,0xff,0xff,
+  0xff,0xff,0xff,0x0f,0xee,0xa9,0xef,0xff,0xd7,0xff,0xff,0xff,
+  0xff,0xff,0xff,0xff,0xdf,0xbf,0xff,0xff,0xff,0x5e,0xff,0xff,
+  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfc,0xff,0xff,0xff,0xef,
+  0xff,0xcf,0xfe,0xff,0xff,0x0f,0x57,0x57,0xfe,0xef,0xbf,0xff,
+  0xff,0xff,0xff,0xff,0xff,0xff,0xf7,0xdd,0xff,0xff,0xff,0xdf,
+  0xff,0xff,0xff,0xff,0xf7,0xff,0xff,0xff,0xff,0xfd,0xff,0xff,
+  0xff,0xff,0xff,0xfb,0xff,0xff,0xff,0x0f,0xaa,0x55,0xff,0xff,
+  0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xbf,0xdf,0xff,0xff,
+  0xff,0xff,0xff,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xef,0xff,
+  0xff,0xff,0xff,0xff,0xff,0xff,0xf7,0xff,0xff,0x0f,0x5d,0xd5,
+  0xfa,0xfa,0x7f,0xff,0xef,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,
+  0xff,0xff,0xff,0xff,0xff,0xfb,0xff,0xff,0xff,0xfe,0xff,0xff,
+  0x9f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,
+  0xaa,0xaa,0x7d,0xfb,0xdf,0xff,0xff,0xfd,0xff,0xff,0xff,0xff,
+  0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xe7,0xff,0xf3,0xff,0xff,
+  0xff,0xff,0x9f,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,
+  0xff,0x0f,0x55,0x55,0xed,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,
+  0xff,0xff,0x86,0xff,0xff,0xff,0xff,0xff,0x9f,0xff,0xff,0xff,
+  0xff,0xfc,0xff,0xff,0xff,0xdf,0xff,0xff,0xff,0xff,0xff,0xaf,
+  0xff,0xff,0xff,0x0f,0xaa,0xea,0xee,0xff,0xff,0xff,0xff,0xff,
+  0xff,0xff,0xff,0x6f,0x93,0xbf,0xff,0xff,0xff,0xbf,0xcf,0xff,
+  0xff,0xff,0xdf,0xff,0xf7,0xf7,0xff,0xff,0xff,0xff,0xff,0xff,
+  0xff,0xff,0xff,0xff,0xff,0x0f,0x55,0xf9,0x7d,0xfd,0xff,0xff,
+  0xff,0xff,0xff,0xff,0xfe,0xef,0x9f,0xff,0xfc,0xff,0xff,0xbf,
+  0xdf,0xff,0xff,0xff,0xf7,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+  0xff,0xff,0xff,0xff,0xfe,0xff,0xff,0x0f,0x55,0x7d,0xfe,0x7f,
+  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+  0xff,0x7f,0xfb,0xff,0x1f,0xf0,0xbf,0xff,0xff,0xff,0xff,0xff,
+  0xff,0xff,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xaa,0xfa,
+  0xff,0xf7,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x2f,
+  0xff,0xff,0xff,0x7f,0xf3,0xff,0x07,0x00,0xff,0xff,0xff,0xff,
+  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,
+  0x55,0xfd,0xff,0xc3,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+  0xff,0x18,0xff,0xff,0xff,0xff,0xec,0xff,0x01,0x00,0xf8,0xff,
+  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+  0xff,0x0f,0xaa,0xb2,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+  0xfe,0xf3,0xff,0xbf,0xff,0xff,0xff,0xff,0xff,0x3f,0x00,0x00,
+  0xc0,0xff,0xff,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,
+  0xff,0xff,0xff,0x0f,0x85,0x98,0xff,0xef,0xff,0xff,0xff,0xff,
+  0xff,0xff,0xff,0xf8,0xff,0xbf,0xf7,0xff,0xff,0xff,0xff,0x0f,
+  0x00,0x00,0x00,0x84,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+  0xff,0xff,0xff,0xff,0xff,0x0f,0x0a,0x80,0x5f,0xff,0xff,0xff,
+  0xff,0xff,0xff,0x3f,0xcc,0xac,0xff,0x8f,0xff,0xff,0xff,0xff,
+  0xff,0x03,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0xff,
+  0xff,0xff,0xff,0xf9,0xff,0xff,0xff,0x0f,0x02,0xc4,0xbf,0xfb,
+  0xff,0xff,0xff,0xff,0xff,0x8f,0x54,0x04,0xfe,0x5f,0xff,0xff,
+  0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0x7f,
+  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x12,0x80,
+  0x7f,0xf5,0xff,0xff,0xff,0xff,0xff,0xcf,0x70,0xed,0xfe,0xff,
+  0xff,0xff,0xff,0xff,0x3f,0x00,0x00,0x00,0x02,0x00,0x00,0xff,
+  0xff,0x7f,0xfb,0xff,0xff,0xff,0xff,0xe7,0xff,0xff,0xff,0x0f,
+  0x82,0x80,0xff,0xfe,0xff,0xff,0xef,0xff,0xff,0xd3,0xd8,0x39,
+  0xff,0xf7,0xff,0xff,0xff,0xff,0x0d,0x00,0x00,0x00,0x3c,0x00,
+  0x00,0xf8,0xff,0xff,0xf7,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+  0xff,0x0f,0x15,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x33,
+  0x3f,0xff,0xf0,0xff,0xff,0xff,0xff,0xff,0x03,0x00,0x00,0x00,
+  0xe0,0x01,0x00,0xc0,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,
+  0xff,0xff,0xff,0x0f,0x00,0x00,0xff,0xff,0xff,0xff,0x7f,0xff,
+  0xff,0xf4,0x7a,0xd7,0xe1,0xff,0xff,0xff,0xfb,0xff,0x00,0x00,
+  0x00,0x00,0x00,0x0f,0x00,0x00,0xfe,0xff,0xff,0xff,0xff,0xff,
+  0xff,0x7f,0xfd,0xff,0xff,0x0f,0x45,0x00,0xfc,0xff,0xff,0xff,
+  0xff,0xff,0xff,0xf4,0xe6,0x7f,0xf0,0xff,0xff,0xff,0xed,0x3f,
+  0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x02,0xf8,0xff,0xff,0xff,
+  0xff,0xff,0xff,0xff,0xfe,0xff,0xff,0x0f,0x00,0x80,0xff,0xff,
+  0xff,0xff,0xff,0x4f,0xf7,0x1f,0xf7,0xff,0xfc,0xff,0xf4,0xff,
+  0xf9,0x1f,0x00,0x08,0x00,0x00,0x00,0xe0,0x03,0x1e,0xf0,0xfd,
+  0xff,0xff,0xff,0xff,0xff,0xfb,0xff,0xff,0xff,0x0f,0x02,0x00,
+  0xfe,0xff,0xff,0xff,0xff,0xff,0xf7,0xfc,0xff,0xfb,0xfc,0xff,
+  0xfd,0xff,0xd0,0x02,0x00,0x0e,0x00,0x00,0x01,0xe0,0x3f,0x3c,
+  0xe0,0xf9,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,
+  0x00,0x40,0xff,0xfd,0xff,0xff,0xbf,0xff,0xff,0xe7,0xff,0xbf,
+  0xff,0xff,0xfe,0xdf,0xd0,0x00,0x80,0x0f,0x00,0x00,0x02,0xc8,
+  0xfc,0x21,0x80,0xf9,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+  0xff,0x0f,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xdf,0xff,0xc7,
+  0xf5,0xfe,0xff,0xfd,0x5c,0x4f,0x38,0x00,0xf0,0x0f,0x00,0x00,
+  0x01,0xe0,0xfe,0x1f,0x00,0xf8,0xff,0xff,0xff,0xff,0xff,0xef,
+  0xff,0xff,0xff,0x0f,0x02,0xe0,0xff,0xff,0xff,0xff,0xff,0xee,
+  0xff,0xe1,0xf8,0xff,0xff,0xf6,0x3e,0x3f,0x09,0x00,0xf0,0x0f,
+  0x00,0x00,0x01,0xc0,0xfd,0x7f,0x00,0xe0,0xff,0xff,0xff,0xff,
+  0xff,0xe7,0xff,0xff,0xff,0x0f,0x00,0xe0,0xff,0xff,0xff,0xff,
+  0xff,0xff,0xff,0xdb,0xff,0xff,0xff,0xe7,0x85,0x7f,0x01,0x00,
+  0xf8,0x07,0x00,0x00,0x01,0xe0,0xfe,0xff,0x03,0x00,0xff,0xff,
+  0xff,0xff,0xff,0xfd,0xff,0xff,0xff,0x0f,0x00,0xc0,0xff,0xff,
+  0xff,0xff,0xff,0xff,0xaf,0xff,0xff,0xff,0xff,0xfd,0xc7,0xff,
+  0x00,0x00,0xf8,0x0f,0x00,0x00,0x01,0xc0,0xfd,0x7f,0x3f,0x00,
+  0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x02,0xc0,
+  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3e,0xfe,0x5f,
+  0x3f,0x7f,0x00,0x00,0xf8,0x07,0x00,0x80,0x05,0xc0,0xfe,0x7f,
+  0xff,0x01,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,
+  0x00,0xc0,0xff,0xff,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xfb,
+  0xfe,0x7f,0xff,0x1f,0x00,0x00,0xf8,0x07,0x00,0x80,0x1f,0xc0,
+  0xfe,0x7f,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+  0xff,0x0f,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+  0xff,0xff,0xff,0x3f,0xff,0x03,0x00,0x00,0xfc,0x07,0x00,0x80,
+  0xff,0xc1,0xfd,0x7f,0xff,0x7f,0xf0,0xff,0xff,0xff,0xff,0xff,
+  0xff,0xff,0xff,0x0f,0x00,0xe2,0xff,0xfe,0xff,0xff,0xff,0xff,
+  0xff,0xff,0xff,0xff,0xff,0xff,0xfb,0x00,0x00,0x00,0xf8,0x07,
+  0x00,0x00,0xff,0xef,0xfe,0x7f,0xff,0xdf,0xe3,0xff,0xff,0xff,
+  0xff,0xff,0xff,0xff,0xff,0x0f,0x81,0xf8,0xff,0xff,0xff,0xff,
+  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x45,0x00,0x00,0x00,
+  0xfc,0x07,0x08,0x00,0xfc,0xff,0xff,0x7c,0xff,0x1f,0x8e,0xff,
+  0xff,0xff,0xff,0x9f,0xff,0xff,0xff,0x0f,0x40,0xff,0xf7,0xff,
+  0xfa,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1d,0x00,
+  0x00,0x00,0xfc,0x03,0x01,0x00,0xc2,0xff,0xff,0xff,0xff,0x5f,
+  0x70,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x20,0xef,
+  0xff,0xbf,0xf6,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+  0x07,0x00,0x00,0x00,0x7c,0xc0,0x00,0x00,0x40,0xfc,0xff,0x7f,
+  0xff,0x1f,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,
+  0xc4,0xff,0xbe,0xfb,0xfb,0xff,0xf7,0xff,0xff,0xff,0xff,0xff,
+  0xff,0xbf,0x03,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0xe1,
+  0xff,0xff,0xff,0x5f,0x44,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+  0xff,0x0f,0x80,0xff,0x93,0xf3,0xbf,0xff,0xdf,0xff,0xff,0xff,
+  0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x00,
+  0x00,0x20,0xfe,0x7f,0x7f,0x1f,0x01,0xff,0xff,0xff,0xff,0xff,
+  0xff,0xff,0xff,0x0f,0xe1,0xf7,0xdd,0xff,0xfd,0xff,0xff,0xff,
+  0xff,0xff,0xff,0xff,0xff,0x3f,0x00,0x00,0x00,0x00,0xc0,0x00,
+  0x00,0x00,0x00,0x00,0xf1,0xff,0xff,0x5f,0x44,0xff,0xff,0xff,
+  0xff,0xff,0xff,0x7f,0xff,0x0f,0x80,0xd9,0xe7,0xfd,0xfb,0xff,
+  0xfc,0xff,0xff,0xff,0xff,0xff,0xfd,0x0f,0x00,0x00,0x00,0x10,
+  0x30,0x00,0x00,0x00,0x00,0x00,0x08,0xff,0xff,0x3f,0x00,0xfe,
+  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x00,0xe4,0x7c,0xed,
+  0xe7,0xff,0xb7,0xff,0xff,0xff,0xff,0xff,0xff,0x03,0x00,0x00,
+  0x00,0x0e,0x04,0x00,0x00,0x00,0x0e,0x00,0x80,0xf2,0xff,0x5f,
+  0x80,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x01,0x00,
+  0x7e,0xcc,0xff,0x7b,0x3f,0xff,0xff,0xdf,0xff,0xff,0xff,0x00,
+  0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0xfe,0x00,0x00,0x80,
+  0xff,0x5f,0x00,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,
+  0x00,0x00,0x1e,0xe5,0xff,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,
+  0x7f,0x00,0x00,0x00,0xc0,0x60,0x00,0x00,0x00,0x00,0xff,0x0f,
+  0x00,0x40,0xfe,0x7f,0x00,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,
+  0xf7,0x0f,0x00,0x00,0x72,0xe2,0xff,0xbf,0xfb,0xff,0xff,0xff,
+  0xff,0xff,0x1f,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,
+  0xfe,0xff,0x00,0x00,0xc8,0xff,0x07,0xfd,0xff,0xff,0xff,0xff,
+  0xff,0xff,0xfb,0x0f,0x00,0x00,0x3f,0xbd,0xff,0xff,0xef,0xff,
+  0xef,0xff,0xff,0xff,0x07,0x00,0x00,0x00,0x00,0x03,0x00,0x00,
+  0x00,0x00,0xfe,0xff,0x0f,0x00,0xa0,0xfe,0x3f,0xf8,0xff,0xff,
+  0xff,0xff,0xff,0xff,0xff,0x0f,0x00,0x00,0xaf,0xfd,0xfd,0xbf,
+  0xff,0xff,0xff,0xff,0xfb,0xff,0x01,0x00,0x00,0x00,0xc0,0x00,
+  0x00,0x00,0x00,0x00,0xfe,0xff,0x7f,0x00,0x00,0xe1,0xff,0xf9,
+  0xff,0xbf,0xff,0xff,0xff,0xff,0xff,0x0f,0x01,0x85,0xf3,0xfd,
+  0xff,0xff,0xff,0xff,0xff,0xff,0xef,0xff,0x00,0x00,0x00,0x00,
+  0x10,0x00,0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0x07,0x00,0x10,
+  0xff,0xf3,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x00,0x28,
+  0xf1,0xff,0xff,0xff,0xff,0xff,0xff,0xef,0x1f,0x3f,0x00,0x00,
+  0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0x1f,
+  0x00,0x00,0xf8,0xf1,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,
+  0x80,0xc2,0xfa,0xff,0xfe,0xff,0xff,0xfd,0xff,0xff,0xf7,0x0f,
+  0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0xfe,0xff,
+  0xff,0x3f,0x00,0x00,0x44,0xe3,0xff,0xff,0xff,0xff,0xff,0xff,
+  0xff,0x0f,0x20,0x75,0xff,0xff,0xff,0xff,0xdf,0xfd,0xff,0xff,
+  0xbf,0x03,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,
+  0xfe,0xff,0xff,0x7f,0x38,0x00,0x00,0xe0,0xff,0xff,0xff,0xff,
+  0xff,0xff,0xff,0x0f,0x48,0xd5,0xfb,0xff,0xff,0xff,0xff,0xfd,
+  0xff,0xff,0x5f,0x01,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,
+  0x00,0x00,0xfc,0xff,0xff,0x7f,0xf8,0x03,0x00,0xe0,0xff,0xff,
+  0xff,0xff,0xff,0xff,0xff,0x0f,0x90,0xbe,0xfb,0xff,0xff,0xff,
+  0xff,0xeb,0xff,0xff,0x37,0x00,0x00,0x00,0x00,0x02,0x00,0x00,
+  0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0xf8,0x1f,0x00,0xc0,
+  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x78,0xfd,0xfb,0xff,
+  0xff,0xff,0xff,0xfb,0xff,0xff,0x0d,0x00,0x00,0x00,0xc0,0x00,
+  0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0xf0,0xff,
+  0x00,0xc0,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0x0f,0x68,0xeb,
+  0xff,0xff,0xff,0xfb,0xff,0xff,0xff,0xff,0x07,0x00,0x00,0x00,
+  0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,
+  0xf0,0xff,0x0f,0x80,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0x0f,
+  0xf2,0x2a,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0x6f,0x01,0x00,
+  0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,
+  0xff,0xff,0xf1,0xff,0x7f,0x80,0xff,0xff,0xfe,0xff,0xff,0xff,
+  0xff,0x0f,0x68,0xd1,0xfa,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+  0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+  0xfc,0xff,0xff,0xff,0xe1,0xff,0xff,0x03,0xff,0xbf,0xfe,0xff,
+  0xff,0xff,0xff,0x0f,0xd5,0x4e,0xff,0xff,0xff,0xff,0xff,0xff,
+  0xbf,0x3f,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,
+  0x00,0x00,0xfc,0xff,0xff,0xff,0xe1,0xff,0xff,0x0f,0xfe,0xff,
+  0xff,0xff,0xff,0xff,0xff,0x0f,0x54,0xeb,0xfb,0xff,0xff,0xff,
+  0xff,0xfd,0x7f,0x0e,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,
+  0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0xe1,0xff,0xff,0x0f,
+  0xff,0xff,0xf7,0xff,0xff,0xff,0xff,0x0f,0x5a,0xd5,0xff,0xdf,
+  0xff,0xff,0xff,0xf6,0x7f,0x07,0x00,0x00,0x00,0x02,0x00,0x00,
+  0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0xc3,0xff,
+  0xff,0x1f,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xae,0xaa,
+  0xff,0xff,0xff,0xff,0xff,0x5f,0xbf,0x01,0x00,0x00,0x80,0x00,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,
+  0xc3,0xff,0xff,0x3f,0xfc,0xff,0xef,0xff,0xff,0xff,0xff,0x0f,
+  0x5b,0xd7,0xff,0xff,0xfe,0xff,0xef,0x4b,0x3a,0x01,0x00,0x00,
+  0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0xff,
+  0xff,0xff,0xc3,0xff,0xff,0x3f,0xfc,0xff,0xff,0xff,0xff,0xff,
+  0xff,0x0f,0x56,0xed,0xff,0xff,0xff,0xff,0x8f,0xf9,0x93,0x00,
+  0x00,0x00,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+  0xfc,0xff,0xff,0xff,0xc7,0xff,0xff,0x7f,0xf8,0xff,0xff,0xff,
+  0xff,0xff,0xff,0x0f,0xad,0xea,0xff,0x7f,0xff,0xff,0x57,0xfe,
+  0xd7,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+  0x00,0x00,0xf8,0xff,0xff,0xff,0x87,0xff,0xff,0x7f,0xf8,0xff,
+  0xff,0xff,0xff,0xff,0xff,0x0f,0x7a,0xbf,0xff,0xff,0xff,0xff,
+  0x7f,0x70,0x6f,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,
+  0x00,0x00,0x00,0x00,0xf8,0xff,0xff,0xff,0x87,0xff,0xff,0xff,
+  0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xee,0xfe,0xff,0xdf,
+  0xff,0xff,0xdc,0xfb,0x67,0x02,0x00,0x30,0x00,0x00,0x00,0x00,
+  0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0xff,0xff,0xff,0x87,0xff,
+  0xff,0xff,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xdd,0x57,
+  0xff,0xff,0xff,0xff,0xa0,0xfa,0x3f,0x03,0x00,0x08,0x00,0x00,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0xff,0xff,0xff,
+  0x87,0xff,0xff,0xff,0xe1,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,
+  0x6a,0xab,0xfa,0xff,0xff,0x7f,0x00,0xff,0xd2,0x03,0x00,0x01,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0xff,
+  0xff,0xff,0x0f,0xff,0xff,0xff,0xe1,0xff,0xff,0xff,0xff,0xff,
+  0xff,0x0f,0x8b,0xfa,0xf5,0xff,0xff,0x7f,0x66,0xde,0xfc,0x03,
+  0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+  0xf8,0xff,0xff,0xff,0x0f,0xff,0xff,0xff,0xc1,0xff,0xff,0xff,
+  0xff,0xff,0xff,0x0f,0xaa,0xff,0xea,0xf7,0xff,0x7f,0x80,0xbf,
+  0xde,0x03,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+  0x00,0x00,0xf8,0xff,0xff,0xff,0x0f,0xff,0xff,0xff,0x83,0xff,
+  0xff,0xff,0xff,0xff,0xff,0x0f,0xd4,0xff,0xf7,0xdf,0xef,0xff,
+  0x51,0xad,0xcd,0xe3,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+  0x00,0x00,0x00,0x00,0xf8,0xff,0xff,0xff,0x0f,0xff,0xff,0xff,
+  0x03,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xaa,0xa4,0xed,0xff,
+  0x5f,0xee,0xc7,0x53,0xe4,0x91,0x00,0x00,0x00,0x00,0x00,0x00,
+  0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xff,0xff,0xff,0x1f,0xff,
+  0xff,0xff,0x07,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x1b,0x57,
+  0xe2,0xff,0xef,0xdf,0x3b,0x0b,0xe1,0xa1,0x00,0x00,0x00,0x00,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xff,0xff,0xff,
+  0x0f,0xfe,0xff,0xff,0x07,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,
+  0xe5,0xeb,0x6d,0xeb,0xef,0xe7,0x4f,0xa3,0xe0,0x11,0x00,0x00,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,
+  0xff,0xff,0x1f,0xfe,0xff,0xff,0x0f,0xff,0xff,0xff,0xff,0xff,
+  0xff,0x0f,0xfc,0x5b,0xf7,0xf6,0x9f,0x91,0x85,0x28,0xe0,0x04,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x00,
+  0xc0,0xff,0xff,0xff,0x1f,0xfe,0xff,0xff,0x0f,0xfe,0xff,0xff,
+  0xbf,0xff,0xff,0x0f,0xfe,0xb9,0xfa,0xff,0x4f,0x02,0x00,0x0a,
+  0x20,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,
+  0x5f,0xf8,0x01,0xfc,0xff,0xff,0x1f,0xfe,0xff,0xff,0x0f,0xfe,
+  0xff,0xe7,0xbf,0xff,0xff,0x0f,0x7f,0xef,0x6f,0xef,0x15,0x54,
+  0x32,0x05,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+  0x00,0xf8,0x7f,0xe8,0x7f,0x40,0xff,0xff,0x1f,0xfe,0xff,0xff,
+  0x0f,0xfe,0xff,0xff,0x9f,0xff,0xff,0x0f,0x7d,0xff,0x9f,0xbf,
+  0x7f,0x55,0x89,0x00,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x00,
+  0x00,0x00,0x80,0xff,0x5f,0xf4,0xff,0x0f,0xf0,0xff,0x3f,0xfe,
+  0xff,0xff,0x1f,0xfc,0xff,0xdf,0x9f,0xfd,0xff,0x0f,0xf7,0xfe,
+  0x7f,0xfb,0xfb,0xda,0xa2,0x04,0x14,0x00,0x80,0x05,0x00,0x00,
+  0x00,0x00,0x00,0x00,0xe0,0xff,0x7f,0xe8,0xff,0xfe,0x01,0xfe,
+  0x1f,0xfe,0xff,0xff,0x1f,0xfc,0xff,0xff,0x9f,0xff,0xff,0x0f,
+  0x9e,0xda,0xde,0xdd,0x1f,0x7f,0x9c,0x05,0x02,0x00,0xb0,0x02,
+  0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xff,0x5f,0xfc,0xff,0xf2,
+  0x1f,0xe0,0x1f,0xfc,0xff,0xff,0x1f,0xfc,0xff,0xff,0xff,0xfd,
+  0xff,0x0f,0xf5,0xbd,0xfa,0xbe,0x5e,0x9c,0xfa,0x83,0x00,0x00,
+  0x58,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0xff,0xff,0x7f,0xe8,
+  0xfb,0x00,0xfd,0x07,0x08,0xfc,0xff,0xff,0x1f,0xfc,0xff,0xff,
+  0xff,0xff,0xff,0x0f,0xaa,0x65,0xf5,0xc3,0x2b,0x5e,0x75,0x41,
+  0x00,0x80,0xca,0x01,0x00,0x00,0x00,0x00,0x00,0x14,0xfe,0xff,
+  0x7f,0xfc,0xff,0x04,0xa1,0xbf,0x00,0xf8,0xff,0xff,0x3f,0xf8,
+  0xff,0xff,0xff,0xff,0xff,0x0f,0xe9,0x2a,0xfa,0xd7,0x6b,0x2c,
+  0x75,0x11,0x00,0xa0,0x5d,0x01,0x00,0x00,0x00,0x00,0x00,0x19,
+  0xff,0xff,0x5f,0xf4,0xff,0x00,0x09,0xfd,0x0f,0xf0,0xff,0xff,
+  0x3f,0xf8,0xff,0xff,0xff,0xff,0xff,0x0f,0x2a,0xd9,0xdd,0x57,
+  0xe9,0xcf,0xa5,0x09,0x00,0xb0,0xf5,0x01,0x00,0x00,0x00,0x00,
+  0xa0,0xc0,0xff,0xff,0x7f,0xfc,0xff,0x00,0x00,0xe1,0xfe,0x00,
+  0xff,0xff,0x3f,0xf0,0xff,0xff,0xff,0xff,0xff,0x0f,0x55,0x35,
+  0xff,0xad,0xaa,0xd9,0xc9,0x02,0x00,0x18,0x2f,0x00,0x00,0x00,
+  0x00,0x00,0xb4,0x4a,0xff,0xff,0xbf,0xf4,0xff,0x04,0xa9,0xc4,
+  0xe8,0x1f,0xc0,0xff,0x3f,0xf0,0xff,0xff,0xff,0xff,0xff,0x0f,
+  0x12,0xd5,0x7d,0xfd,0x9a,0x06,0xc9,0x18,0x00,0x0c,0xa5,0x01,
+  0x00,0x00,0x00,0x00,0x26,0x0e,0xff,0xff,0x7f,0xff,0x7f,0x00,
+  0x81,0xc1,0x00,0xff,0x03,0xfe,0x3f,0xf0,0xff,0xff,0xff,0xff,
+  0xff,0x0f,0x6b,0xa9,0xdb,0xff,0xb1,0xc0,0x7c,0x1c,0x00,0x84,
+  0x37,0x00,0x00,0x00,0x00,0x68,0xa4,0x88,0xff,0xff,0x3f,0x54,
+  0xff,0x03,0x20,0xc1,0x20,0xf4,0x7f,0x80,0x3f,0xf0,0xff,0xff,
+  0xff,0xff,0xff,0x0f,0xf5,0x67,0xfd,0xf3,0x51,0x42,0x15,0x0f,
+  0x00,0x86,0x1c,0x00,0x00,0x00,0x00,0x21,0xa4,0xe0,0xff,0xff,
+  0xff,0x7e,0xff,0x3f,0x00,0xc0,0x08,0x01,0xfe,0x07,0x18,0xe0,
+  0xff,0xff,0xff,0xff,0xff,0x0f,0xff,0x5f,0xf7,0xe2,0x1d,0xb8,
+  0x9f,0x07,0x00,0x86,0x05,0x00,0x00,0x00,0x40,0xa2,0x85,0xe9,
+  0xff,0x9f,0xff,0x7f,0xa0,0xff,0x2f,0xc0,0x20,0x90,0x26,0xff,
+  0x00,0xe0,0xff,0xff,0xff,0xff,0xff,0x0f,0xff,0xbf,0x3f,0xd0,
+  0x1b,0xe0,0xed,0x07,0x00,0xc7,0x00,0x00,0x00,0x00,0x28,0x8a,
+  0x81,0x03,0xff,0x00,0xff,0x7e,0x00,0xf0,0xff,0xc3,0x28,0x14,
+  0x86,0xf4,0x1f,0xe0,0xff,0xff,0xff,0xff,0xdf,0x0f,0xff,0xff,
+  0xff,0xf1,0xb3,0xd6,0xea,0x06,0x00,0x3d,0x00,0x00,0x00,0x00,
+  0x82,0x8a,0x05,0x08,0x2f,0x80,0x7f,0x7f,0x00,0x00,0xfc,0xff,
+  0x20,0x90,0xa6,0x40,0xff,0xe1,0xff,0xff,0xff,0xff,0xff,0x0f,
+  0xff,0xff,0xfd,0xbf,0x77,0x10,0xf6,0x03,0x00,0x0d,0x00,0x00,
+  0x00,0x20,0xb2,0x81,0x91,0xe8,0x01,0x80,0xff,0x7c,0x00,0x00,
+  0x40,0xff,0x0f,0x00,0x06,0x04,0xe8,0xef,0xff,0xff,0xff,0xff,
+  0xff,0x0f,0xff,0x77,0xfb,0xcf,0xec,0x65,0xf7,0x02,0x80,0x01,
+  0x00,0x00,0x00,0x38,0x18,0x91,0x90,0x3e,0x00,0x80,0xff,0x7f,
+  0x00,0x00,0x00,0xe0,0xff,0x05,0xa6,0x05,0xe0,0xff,0xff,0xff,
+  0xff,0xff,0xff,0x0f,0xaf,0x5f,0xff,0x5d,0xef,0xd9,0xb9,0x02,
+  0x00,0x10,0x00,0x00,0x80,0xbf,0x20,0x18,0xf2,0x05,0x00,0x80,
+  0x7f,0x7f,0x00,0x00,0x00,0x00,0xfc,0x7f,0x8c,0x10,0xe8,0xff,
+  0xff,0xff,0xff,0xff,0xff,0x0f,0x3e,0xff,0xff,0x75,0x98,0x75,
+  0x5d,0x01,0x00,0x00,0x00,0x00,0xb0,0xbf,0xf0,0x38,0x7e,0x00,
+  0x00,0x80,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0xff,0x0f,0x10,
+  0xc2,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xfb,0x6f,0xfb,0xe7,
+  0xdf,0x69,0x5d,0x01,0x00,0x00,0x00,0x00,0xa6,0x3f,0x59,0xfc,
+  0x03,0x00,0x00,0x80,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0xe0,
+  0xff,0x15,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xdf,0xff,
+  0xef,0xff,0x7f,0x67,0xae,0x00,0x00,0x00,0x00,0x80,0xb4,0x3f,
+  0x1a,0xbd,0x00,0x00,0x00,0x80,0x7f,0x7f,0x00,0x00,0x00,0x00,
+  0x00,0x00,0xf8,0xbf,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,
+  0xff,0xef,0xf7,0xff,0x6f,0xbf,0xef,0x00,0x00,0x00,0x00,0x70,
+  0xa4,0x5f,0x10,0x07,0x00,0x00,0x00,0x80,0xff,0x7f,0x00,0x00,
+  0x00,0x00,0x00,0x00,0x40,0xff,0xc7,0xff,0xff,0xff,0xff,0xff,
+  0xdf,0x0f,0xff,0x17,0xe5,0xff,0x87,0x7e,0x57,0x00,0x00,0x00,
+  0x00,0x52,0xb7,0x9f,0xf0,0x00,0x00,0x00,0x00,0x80,0xff,0x7f,
+  0x00,0xc0,0x00,0x00,0x00,0xc0,0x00,0xf0,0xff,0xff,0xff,0xff,
+  0xff,0xff,0xff,0x0f,0xff,0x4f,0x2b,0xfb,0xe1,0xb7,0x6b,0x00,
+  0x00,0x00,0x40,0x00,0x93,0xdf,0x0f,0x00,0x00,0x00,0x00,0x80,
+  0x7f,0x7d,0x00,0xe0,0x01,0x00,0x00,0xe0,0x1f,0x00,0xfc,0xff,
+  0xff,0xff,0xff,0xff,0xff,0x0f,0xbd,0xff,0x3d,0xd4,0xcb,0xff,
+  0x57,0x00,0x00,0x00,0x30,0x89,0xd3,0xff,0x01,0x00,0x00,0x00,
+  0x00,0x80,0xff,0x7c,0x00,0x60,0x91,0x01,0x00,0xe0,0xff,0x07,
+  0x40,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x5f,0xff,0x7c,0xa2,
+  0xf2,0xdb,0x7d,0x00,0x00,0x00,0x47,0x83,0x13,0x1f,0x00,0x00,
+  0x00,0x00,0x00,0x80,0xff,0x7f,0x00,0x60,0x90,0x39,0x00,0xe0,
+  0xff,0x7f,0x00,0xf0,0xff,0xff,0xff,0xff,0xff,0x0f,0xe6,0xf7,
+  0xff,0x42,0xf9,0xeb,0x7f,0x00,0x00,0xc0,0x17,0x8c,0xa8,0x03,
+  0x00,0x00,0x00,0x00,0x00,0x80,0xff,0x7f,0x00,0x60,0xd0,0x49,
+  0x00,0xe0,0xff,0xff,0x03,0xf0,0xff,0xbf,0xff,0xff,0xff,0x0f,
+  0xbb,0x57,0xdf,0x5e,0xff,0xef,0x3f,0x00,0x00,0xa8,0x07,0x05,
+  0x3c,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xff,0x7f,0x00,0xf0,
+  0x50,0x49,0x00,0xe0,0xff,0xff,0x03,0xf0,0xff,0xff,0xff,0xff,
+  0xff,0x0f,0x7f,0x7e,0xcf,0x58,0xfe,0xf9,0x3f,0x00,0x00,0x8a,
+  0x87,0x45,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x37,0x34,
+  0x00,0x30,0x61,0x39,0x00,0xe0,0xff,0xff,0x03,0xf0,0xff,0x7f,
+  0xff,0xff,0xff,0x0f,0x7f,0xcd,0x3c,0x2e,0xfe,0xf7,0x3f,0x00,
+  0x60,0xca,0x07,0x79,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,
+  0x49,0x68,0x00,0x00,0x69,0x28,0x00,0xe0,0x40,0xff,0x03,0xe0,
+  0xff,0xff,0xfe,0xff,0xff,0x0f,0xff,0x3a,0x3b,0x4f,0xfe,0xfb,
+  0x3f,0x00,0x48,0x88,0x07,0x1e,0x00,0x00,0x00,0x00,0x00,0x00,
+  0xa0,0x8a,0x21,0x00,0x00,0x00,0x00,0x49,0x00,0xe0,0x00,0xf8,
+  0x03,0xf0,0xff,0x77,0xfe,0xff,0xff,0x0f,0xff,0x6b,0xf7,0xf3,
+  0xff,0xf9,0x1f,0x00,0x81,0xcb,0xe3,0x01,0x00,0x00,0x00,0x00,
+  0x00,0x00,0x50,0x02,0x01,0x20,0x00,0x00,0x00,0x40,0x00,0xc0,
+  0x01,0xe0,0x03,0xe0,0xff,0xff,0xfc,0xff,0xff,0x0f,0xff,0xfb,
+  0xfe,0xf5,0xff,0xfd,0x9b,0xa0,0x94,0xc9,0x3f,0x00,0x00,0x00,
+  0x00,0x00,0x00,0x00,0x90,0x8a,0x00,0x00,0x00,0x00,0x00,0x00,
+  0x00,0xe0,0x00,0xc0,0x03,0xf0,0xff,0xff,0xfd,0xff,0xff,0x0f,
+  0xef,0xf7,0xef,0xfc,0xff,0xfd,0x1f,0x3c,0xa6,0xd1,0x0b,0x00,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x12,0x05,0x00,0x00,0x00,
+  0x00,0x00,0x00,0xc0,0x00,0xc0,0x03,0xe0,0xff,0xff,0xf8,0xff,
+  0xff,0x0f,0xf7,0x1f,0xcd,0xff,0xff,0xfc,0x8f,0xae,0x20,0xfa,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x0d,0x01,0x00,
+  0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0xc0,0x03,0xe0,0xff,0xff,
+  0xff,0xff,0xff,0x0f,0xc7,0xdf,0xc0,0xff,0xff,0xfd,0x03,0x2f,
+  0x16,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x11,
+  0x00,0x00,0x80,0x01,0x00,0x00,0x00,0xc0,0x01,0xc0,0x03,0xe0,
+  0xff,0xff,0xff,0xff,0xff,0x0f,0x8f,0xdf,0xdf,0xe7,0xff,0x7f,
+  0xf8,0x2f,0xd6,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+  0x00,0x1d,0x00,0x00,0x40,0x53,0x00,0x00,0x00,0x60,0x01,0xc0,
+  0x03,0xe0,0xff,0xff,0xff,0xff,0xff,0x0f,0x1f,0xfd,0xdd,0xfb,
+  0xff,0x3f,0xff,0x2f,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+  0x00,0x00,0xf0,0x02,0x00,0x00,0x80,0x91,0x01,0x00,0x00,0xe0,
+  0x17,0x80,0x03,0xe0,0xff,0xff,0xf7,0xff,0xff,0x0f,0xff,0xff,
+  0xeb,0xfd,0xd7,0xcf,0xff,0x87,0x07,0x00,0x00,0x00,0x00,0x00,
+  0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0xff,0x00,0x00,
+  0x00,0xc0,0xff,0xc7,0x03,0xe0,0xff,0xff,0xe7,0xff,0xff,0x0f,
+  0xff,0xff,0xff,0xf7,0x5d,0xf3,0xff,0xdf,0x00,0x00,0x00,0x00,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,
+  0x00,0x00,0x00,0x00,0xff,0xbf,0x03,0xe0,0xff,0xff,0xe7,0xff,
+  0xff,0x0f,0xff,0xff,0xff,0xf7,0x89,0xff,0xff,0x3f,0x00,0x00,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xff,0x03,0xe0,0xff,0xff,
+  0xe1,0xff,0xff,0x0f,0xff,0xfb,0xff,0xf7,0xe5,0xff,0xff,0x05,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x03,0xa0,
+  0xff,0xff,0xc1,0xff,0xff,0x0f,0xff,0xff,0x9f,0xff,0xf3,0xff,
+  0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+  0x00,0x00,0xff,0xff,0xff,0xff,0xff,0x0f,0x9f,0xfd,0xef,0xff,
+  0xfd,0xff,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+  0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0x0f,0xff,0xff,
+  0xf7,0xbf,0xff,0xff,0x0b,0x00,0x00,0x00,0x00,0x00,0xc0,0x1f,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,
+  0x00,0x00,0x08,0x00,0x78,0x20,0xff,0xff,0xff,0xff,0xff,0x0f,
+  0xfb,0xff,0xff,0xdf,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,
+  0xf8,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0xc5,0x03,0x00,0x00,
+  0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0xc0,0xff,0xff,0xff,0xff,
+  0xff,0x0f,0xef,0xef,0xff,0xff,0xff,0x1f,0x00,0x00,0x00,0x00,
+  0x00,0x00,0xfe,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0xca,0x01,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x80,0xfe,0xff,
+  0xff,0xff,0xff,0x0f,0xef,0xff,0xff,0xf3,0xff,0x03,0x00,0x00,
+  0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,
+  0x45,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+  0xff,0xff,0xff,0xff,0xff,0x0f,0xff,0xfb,0xff,0xf7,0xff,0x00,
+  0x00,0x00,0x00,0x00,0x00,0x80,0xff,0xff,0x01,0x00,0x00,0x00,
+  0x00,0x80,0xea,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+  0x00,0x00,0xff,0xff,0xff,0xff,0xff,0x0f,0xff,0xff,0xff,0xff,
+  0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,0x03,0x00,
+  0x00,0x00,0x00,0x00,0xff,0x07,0x00,0x08,0x00,0x00,0x00,0x00,
+  0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0x0f,0xff,0xff,
+  0xff,0xff,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,
+  0x03,0x00,0x00,0x00,0x00,0x00,0xff,0x57,0x03,0x14,0x00,0x00,
+  0x00,0x00,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0x0f,
+  0xff,0xff,0xff,0xff,0x03,0x80,0x00,0x00,0x00,0x00,0x00,0xc0,
+  0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf4,0x07,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9f,0xff,0xff,0xff,
+  0xff,0x0f,0xff,0xff,0xff,0x7f,0x01,0x30,0x00,0x00,0x00,0x00,
+  0x00,0xe0,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+  0x00,0xfc,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x8f,0xff,
+  0xff,0xff,0xff,0x0f,0xff,0xff,0xff,0x1f,0x01,0x44,0x00,0x00,
+  0x00,0x00,0x00,0xe0,0xff,0xff,0x07,0x00,0x00,0x00,0x00,0x00,
+  0x05,0x00,0xdc,0x02,0xd0,0x0f,0x00,0x00,0x00,0x00,0x00,0x80,
+  0x0f,0xff,0xff,0xff,0xff,0x0f,0xff,0xff,0xff,0x8f,0x00,0x16,
+  0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0x07,0x00,0x00,0x00,
+  0x00,0xb0,0x0a,0x00,0x00,0xaa,0x05,0xe0,0x17,0x00,0x00,0x00,
+  0x00,0x00,0x9f,0xff,0xff,0xff,0xff,0x0f,0xff,0xff,0xff,0x47,
+  0x00,0xe6,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0x0f,0x00,
+  0x00,0x00,0xf8,0xff,0x01,0x00,0x50,0xa5,0x2a,0x09,0x40,0x3f,
+  0x00,0x00,0x00,0x00,0xc0,0xff,0xff,0xff,0xff,0x0f,0xff,0xff,
+  0xff,0xcf,0x00,0x17,0x00,0x00,0x00,0x00,0x00,0xf0,0xff,0xff,
+  0x0f,0x00,0x00,0xe0,0xff,0xff,0x96,0x00,0x4a,0xd1,0x5f,0x75,
+  0x2f,0x40,0x5f,0x00,0x18,0x00,0xd8,0xff,0xff,0xff,0xff,0x0f,
+  0xff,0xff,0xff,0x67,0x00,0x77,0x00,0x00,0x00,0x00,0x00,0xe0,
+  0xff,0xff,0x0f,0x00,0xd0,0xff,0xff,0xff,0x7f,0x01,0x90,0x6a,
+  0x57,0xbb,0xda,0x15,0x40,0x2f,0x08,0x00,0xcc,0xff,0xff,0xff,
+  0xff,0x0f,0xff,0xff,0xff,0x07,0x00,0x8b,0x00,0x00,0x00,0x00,
+  0x00,0xf0,0xff,0xff,0x0f,0xe0,0xff,0xff,0xff,0xff,0x05,0x00,
+  0x00,0x80,0x1e,0xf5,0x7f,0x45,0x2d,0x00,0xfd,0x01,0xdc,0xff,
+  0xff,0xff,0xff,0x0f,0xff,0xff,0xff,0x67,0x00,0x54,0x00,0x00,
+  0x00,0x00,0x00,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+  0x2a,0x00,0x00,0x00,0x40,0xda,0x5f,0xbd,0xff,0x5f,0x04,0xfa,
+  0xaf,0xff,0xff,0xff,0xff,0x0f,0xff,0xff,0xff,0xff,0x01,0xa2,
+  0x00,0x00,0x00,0x00,0x00,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,
+  0xff,0xff,0x57,0x01,0x00,0x00,0x00,0x40,0xb5,0x6a,0xbf,0xff,
+  0x7f,0x41,0x83,0xff,0xff,0xff,0xff,0x0f,0xff,0xff,0xff,0xf7,
+  0x03,0x5e,0x00,0x00,0x00,0x00,0x00,0xf0,0xff,0xff,0xff,0xff,
+  0xff,0xff,0xff,0xff,0x5b,0x00,0x00,0x00,0x82,0x00,0x00,0xb5,
+  0xea,0xff,0xd7,0xaa,0xeb,0xff,0xff,0xff,0xff,0x0f,0xff,0xff,
+  0xff,0xfb,0x03,0xa2,0x00,0x00,0x00,0x00,0x00,0xf5,0xff,0xff,
+  0xff,0xff,0xff,0xff,0xff,0xff,0xaf,0x02,0x00,0x00,0x00,0x2a,
+  0x04,0x80,0xd4,0xff,0xaf,0xca,0xf6,0xff,0xff,0xff,0xff,0x0f,
+  0xff,0xff,0xff,0xff,0x07,0x0d,0x00,0x00,0x00,0x00,0xf8,0xff,
+  0xff,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0x5f,0x09,0x00,0x00,
+  0x80,0x40,0x92,0x12,0x00,0x50,0x5d,0x10,0xf5,0xfe,0xff,0xff,
+  0xff,0x0f,0xff,0xff,0xff,0xff,0x07,0x00,0x00,0x00,0x00,0xd0,
+  0xff,0xff,0xbf,0xf2,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x12,
+  0x00,0x00,0x2a,0xaa,0x44,0x49,0x55,0x15,0xa1,0xd5,0xe4,0xfd,
+  0xff,0xff,0xff,0x0f,0xff,0xff,0xff,0xfb,0x07,0x00,0x00,0x00,
+  0x00,0xf5,0xff,0xff,0x5f,0xed,0xff,0xff,0xff,0xff,0xff,0xff,
+  0xff,0xaf,0x04,0x00,0x40,0x11,0x15,0xaa,0xaa,0xaa,0x0a,0x24,
+  0xff,0xff,0xff,0xff,0xff,0x0f,0xff,0xff,0xff,0xff,0x07,0x00,
+  0x00,0x00,0xfa,0xe2,0xff,0xff,0xbf,0xfd,0xff,0xff,0xff,0xff,
+  0xff,0xff,0xff,0xff,0xff,0x95,0xaa,0xaa,0x52,0x55,0x95,0x55,
+  0x55,0x89,0xd0,0xff,0xff,0xff,0xff,0x0f,0xff,0xff,0xff,0xff,
+  0x07,0x00,0x00,0xf8,0x55,0xe5,0xff,0xff,0xaf,0xdc,0xff,0xff,
+  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x02,0x41,0xad,0xaa,
+  0x6a,0xb5,0x5a,0x25,0xca,0xfd,0xff,0xff,0xff,0x0f,0xff,0xff,
+  0xff,0xff,0x0f,0x00,0xf4,0xbf,0x6e,0xe5,0xff,0xef,0xcf,0xd8,
+  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xaf,0x82,0x03,
+  0x40,0x54,0xb5,0xea,0xaa,0x52,0xf9,0xff,0xff,0xff,0xff,0x0f,
+  0xff,0xff,0xff,0xff,0x0f,0xe0,0xff,0x55,0xf5,0xe6,0xff,0xff,
+  0x87,0xd0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfd,
+  0x81,0x03,0xf0,0xab,0x6a,0xaf,0xb6,0x2a,0xf5,0xff,0xff,0xff,
+  0xff,0x0f,0xff,0xff,0xff,0xff,0x8f,0xff,0xff,0xfb,0xbb,0xcd,
+  0xff,0xdf,0x07,0xc0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+  0xff,0xaa,0x02,0x03,0xf0,0xff,0x07,0x50,0x55,0x85,0xfa,0xff,
+  0xff,0xff,0xff,0x0f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xbf,
+  0xf6,0xc5,0xff,0xff,0x03,0xa0,0xff,0xff,0xff,0xff,0xff,0xff,
+  0xff,0xff,0xff,0xff,0xfb,0x03,0xf0,0xff,0x07,0xe0,0xab,0x7a,
+  0xfd,0xff,0xff,0xff,0xff,0x0f,0xff,0xff,0xff,0xff,0xff,0xff,
+  0xff,0xfb,0xed,0x8a,0xff,0xff,0x13,0xc0,0xff,0xff,0xff,0xff,
+  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfb,0xff,0x07,0xe0,
+  0xff,0x03,0xed,0xff,0xff,0xff,0xff,0x0f,0xff,0xff,0xff,0xff,
+  0xff,0xff,0xff,0x7f,0xf7,0x85,0xff,0xff,0x03,0x80,0xff,0xff,
+  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+  0x0f,0xe0,0xff,0x07,0xf8,0xff,0xff,0xff,0xff,0x0f,0xff,0xff,
+  0xff,0xff,0xfe,0xff,0xff,0xfb,0xda,0x8d,0xff,0xff,0x13,0x80,
+  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+  0xff,0xff,0xff,0xf7,0xff,0x03,0xf8,0xff,0xff,0xff,0xff,0x0f,
+  0xff,0xff,0xff,0xc7,0xfc,0xff,0xff,0x7f,0xf7,0x8a,0xff,0xff,
+  0x01,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+  0xff,0xff,0xff,0xff,0xeb,0xff,0xff,0x2f,0xf8,0xff,0xff,0xff,
+  0xff,0x0f,0xff,0xff,0xff,0x4b,0xfc,0xff,0xff,0xf7,0xfa,0x0f,
+  0xff,0xff,0x21,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+  0xff,0xff,0xff,0xff,0xff,0xff,0xdf,0xff,0xff,0xff,0xff,0xff,
+  0xff,0xff,0xff,0x0f,0xff,0xff,0xff,0x0b,0xf8,0xff,0xff,0xff,
+  0x57,0x0d,0xff,0xff,0x01,0x80,0xff,0xff,0xff,0xff,0xff,0xff,
+  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdf,0xff,0xff,0xff,
+  0xff,0xff,0xff,0xff,0xff,0x0f,0xff,0xff,0xff,0x19,0xf0,0xff,
+  0xff,0x57,0xfd,0x1b,0xff,0xff,0x21,0x80,0xff,0xff,0xff,0xff,
+  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdf,0xff,
+  0xcf,0xfe,0xff,0xff,0xff,0xff,0xff,0x0f,0xff,0xff,0xff,0x0d,
+  0xf8,0xff,0xff,0xff,0xab,0x0f,0xff,0xff,0x21,0xa0,0xff,0xff,
+  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+  0xdd,0xff,0x8f,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xff,0xff,
+  0xff,0x09,0xf0,0xff,0xff,0xff,0xff,0x1d,0xfe,0xff,0x21,0xcd,
+  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+  0xff,0x7f,0x80,0xfc,0xcf,0xff,0xff,0xff,0xff,0xdf,0xff,0x0f,
+  0xff,0xff,0xff,0x11,0xf0,0xff,0xff,0xff,0xff,0xbf,0xfe,0xff,
+  0xd9,0xe1,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+  0xff,0xff,0xff,0x3f,0x00,0xfc,0xff,0xff,0xff,0xff,0xff,0xef,
+  0xff,0x0f,0xff,0xff,0xff,0x28,0xe0,0xff,0xff,0xff,0xff,0xff,
+  0xff,0xff,0xe1,0xc4,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+  0xff,0xff,0xff,0xff,0xff,0x0f,0x00,0xfc,0xff,0xff,0xff,0xff,
+  0xff,0xb7,0xff,0x0f,0xff,0xff,0xff,0x10,0xe0,0xff,0xff,0xff,
+  0xff,0xff,0xff,0xff,0xb3,0xc2,0xff,0xff,0xff,0xff,0xff,0xff,
+  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03,0x00,0xfc,0xff,0xff,
+  0xff,0xff,0xff,0xd7,0xff,0x0f,0xff,0xff,0xff,0xd8,0xe1,0xff,
+  0xff,0xff,0xff,0xff,0xff,0xff,0x73,0xe1,0xff,0xff,0xff,0xff,
+  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc3,0x02,0xfc,
+  0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0x0f,0xff,0xff,0xff,0xf8,
+  0xf5,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x63,0xe5,0xff,0xff,
+  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+  0x01,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xff,0xff,
+  0xff,0xf9,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xe7,0xe6,
+  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,
+  0xff,0xff,0x07,0xfc,0xff,0xff,0xff,0x7f,0xff,0x7f,0xff,0x0f,
+  0xfe,0xff,0xff,0x71,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+  0x27,0xf7,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+  0xff,0xff,0xff,0xff,0x02,0xbc,0xff,0xff,0xff,0xff,0xff,0x5f,
+  0xff,0x0f,0xff,0xff,0xff,0xc3,0xfc,0xff,0xff,0xff,0xff,0xff,
+  0xff,0xff,0x0f,0xfa,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+  0xff,0xff,0xff,0xff,0xff,0xff,0x26,0xfc,0xff,0xff,0xff,0xff,
+  0xff,0xbf,0xff,0x0f,0xff,0xff,0xff,0xe3,0xfc,0xff,0xff,0xff,
+  0xff,0xff,0xff,0xff,0x0f,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,
+  0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0x5f,0xa3,0xfc,0xff,0xff,
+  0xff,0xff,0xff,0xff,0xff,0x0f,0xff,0xff,0xff,0x07,0xfe,0xff,
+  0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0xfe,0xff,0xff,0xff,0xff,
+  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0x1d,0xb7,0xfe,
+  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xfe,0xff,0xff,0xbf,
+  0xff,0xff,0xff,0xff,0xdf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xfe,0x7b,
+  0xda,0xfe,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0x0f,0xfe,0xff,
+  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+  0xff,0xff,0xff,0xfb,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,
+  0xfe,0x52,0x15,0xfc,0x7f,0xfe,0xdf,0xff,0xff,0xff,0xff,0x0f,
+  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+  0xff,0xff,0xff,0xff,0xff,0xef,0xff,0xff,0xff,0xff,0xff,0xff,
+  0xff,0xbf,0xfe,0xa9,0x6a,0xfd,0xbf,0xff,0xfb,0xff,0xff,0xff,
+  0xff,0x0f,0xef,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+  0xff,0xff,0xff,0xff,0xff,0xef,0xff,0xff,0xff,0xff,0xff,0xff,
+  0xff,0xff,0xff,0xff,0xfe,0x05,0x05,0xfc,0x3f,0x7f,0xe4,0xbf,
+  0xff,0xff,0xff,0x0f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+  0xff,0xff,0xdf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+  0xff,0xff,0xff,0xff,0xff,0x7f,0xaf,0x52,0x50,0xa1,0x2a,0x29,
+  0x15,0xaa,0x52,0xa9,0xaa,0x0a,0xff,0xff,0xff,0xff,0xff,0xff,
+  0xef,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xbf,0xaa,0xad,0x56,
+  0xd5,0xd6,0xea,0x55,0x7d,0xef,0xf6,0x0f,0xd5,0xeb,0xfe,0xff,
+  0xff,0xff,0xf3,0xff,0xff,0xff,0xf7,0xfe,0xff,0xff,0xff,0xff,
+  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdf,0x7d,
+  0xdb,0xb5,0x7d,0xbb,0xaf,0xfe,0xaf,0xff,0x5f,0x0f,0x50,0x08,
+  0x00,0x80,0xaa,0xaa,0xf5,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,
+  0xaf,0xaf,0xfd,0x6f,0xab,0xed,0xf5,0xdf,0xff,0xf7,0xff,0x0d,
+  0x4a,0x81,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd5,0xff,0xff,
+  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x57,0xfd,0xff,
+  0xff,0xff,0x75,0xff,0x56,0xd5,0xdd,0xb6,0x5f,0xed,0xff,0xff,
+  0x5f,0x0f,0x25,0x2a,0x8a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+  0x00,0x00,0x20,0xa9,0xee,0xff,0xff,0xff,0xff,0xff,0xff,0x57,
+  0xfa,0xff,0xff,0xff,0xaf,0x57,0x55,0x75,0x6a,0xdb,0x6a,0xbb,
+  0xba,0xff,0xff,0x0e,0x52,0x81,0x00,0x80,0x00,0x00,0x00,0x00,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x55,0xff,
+  0xff,0xaf,0xaa,0xfe,0xff,0xff,0xff,0x54,0x57,0xd5,0xd4,0x76,
+  0x6f,0xfd,0xef,0xff,0xff,0x0f,0x2d,0x14,0x80,0x00,0x00,0x00,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x42,
+  0x2b,0xeb,0x7a,0xff,0xff,0xff,0xff,0x0f,0x11,0xa1,0x02,0x00,
+  0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa4,0xfb,0x0f,0x54,0x02,
+  0x08,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+  0x21,0x08,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x20,
+  0xa0,0x0a,0x88,0x42,0x0a,0x00,0x00,0x40,0x00,0x00,0x00,0x00,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+  0x10,0x88,0x00,0x00,0x44,0x88,0x02,0x01,0x20,0x00,0x00,0x00,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+  0x00,0x00,0x00,0x20,0x55,0x09,0x2a,0x25,0x28,0x90,0x00,0x00,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x95,0x10,0x00,0x00,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x50,0x0a,
+  0x12,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x84,0x08,
+  0x0a,0x11,0x00,0x80,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x11,0x80,
+  0x18,0x00,0x15,0x4a,0x2a,0x12,0x00,0x00,0x00,0x00,0x00,0x00,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,
+  0x48,0x55,0x41,0x05,0x4a,0x12,0x00,0x08,0x00,0x00,0x00,0x00,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+  0x00,0x00,0x00,0x08,0xaa,0x0a,0x29,0x48,0xa1,0x50,0x00,0x00,
+  0x00,0x84,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+  0x00,0x00,0x00,0x00,0x10,0x00,0x04,0x05,0x8a,0x04,0x05,0x01,
+  0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+  0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x90,0x80,0x00,0x41,0x81,
+  0x10,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x04,
+  0x8a,0x6a,0x21,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+  0x04,0x00,0x95,0x00,0x42,0x20,0x0a,0x00,0x00,0x00,0x00,0x00,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x10,0x00,0x00,
+  0x00,0x00,0x80,0x00,0x05,0x85,0x44,0x91,0x00,0x01,0x00,0x00,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+  0x00,0x00,0x50,0x02,0x28,0x01,0x54,0x50,0x20,0x08,0x10,0x40,
+  0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+  0x00,0x00,0x00,0x00,0x00,0xa0,0x84,0x04,0x85,0x0a,0x42,0x01,
+  0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x02,0x12,0x22,
+  0x85,0x52,0x00,0x08,0x40,0x00,0x00,0x00,0x20,0x00,0x00,0x00,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,
+  0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0x00,0x00,0x00,0xa8,0x00,
+  0x92,0xa8,0x20,0x05,0x00,0x00,0x96,0x08,0x00,0x00,0x80,0x00,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,
+  0x02,0x08,0x69,0x01,0x85,0x40,0x0b,0x08,0x08,0x10,0x00,0x05,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,
+  0x14,0x00,0x48,0x00,0xab,0x0a,0x51,0x01,0x00,0x02,0x00,0x00,
+  0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+  0x00,0x00,0x40,0x00,0x55,0x09,0x55,0xa5,0x00,0xc0,0x04,0x04,
+  0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+  0x00,0x44,0x01,0x50,0x00,0x04,0x21,0x02,0xaa,0x94,0x22,0x21,
+  0x01,0x02,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+  0x00,0x00,0x00,0x80,0x00,0x00,0x40,0x11,0x80,0x0a,0x51,0x49,
+  0x54,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0xa0,0x84,0x00,
+  0x8a,0x12,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x04,0x00,0x00,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x00,0x02,
+  0xa1,0x00,0x12,0x15,0x09,0x69,0x07,0x82,0x01,0x04,0x00,0x08,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,
+  0x00,0x84,0x14,0x05,0xaa,0x2a,0xa5,0x94,0x08,0x00,0x00,0x00,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
+  0x00,0x00,0x01,0x02,0x02,0x08
+};

Added: commons/proper/sanselan/trunk/src/test/data/images/xbm/1/info.txt
URL: http://svn.apache.org/viewvc/commons/proper/sanselan/trunk/src/test/data/images/xbm/1/info.txt?rev=1089997&view=auto
==============================================================================
--- commons/proper/sanselan/trunk/src/test/data/images/xbm/1/info.txt (added)
+++ commons/proper/sanselan/trunk/src/test/data/images/xbm/1/info.txt Thu Apr  7 20:41:24 2011
@@ -0,0 +1,2 @@
+Contributed to the project by Damjan Jovanovic.
+Converted from ../../pxm/1/Oregon Scientific DS6639 - DSC_0307 - small.pbm

Propchange: commons/proper/sanselan/trunk/src/test/data/images/xbm/1/info.txt
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: commons/proper/sanselan/trunk/src/test/java/org/apache/sanselan/common/byteSources/ByteSourceImageTest.java
URL: http://svn.apache.org/viewvc/commons/proper/sanselan/trunk/src/test/java/org/apache/sanselan/common/byteSources/ByteSourceImageTest.java?rev=1089997&r1=1089996&r2=1089997&view=diff
==============================================================================
--- commons/proper/sanselan/trunk/src/test/java/org/apache/sanselan/common/byteSources/ByteSourceImageTest.java (original)
+++ commons/proper/sanselan/trunk/src/test/java/org/apache/sanselan/common/byteSources/ByteSourceImageTest.java Thu Apr  7 20:41:24 2011
@@ -62,7 +62,8 @@ public class ByteSourceImageTest extends
                     || imageFile.getName().toLowerCase().endsWith(".pcx")
                     || imageFile.getName().toLowerCase().endsWith(".dcx")
                     || imageFile.getName().toLowerCase().endsWith(".psd")
-                    || imageFile.getName().toLowerCase().endsWith(".wbmp"))
+                    || imageFile.getName().toLowerCase().endsWith(".wbmp")
+                    || imageFile.getName().toLowerCase().endsWith(".xbm"))
             {
                 // these formats can't be parsed without a filename hint.
                 // they have ambiguous "magic number" signatures.

Added: commons/proper/sanselan/trunk/src/test/java/org/apache/sanselan/formats/xbm/XbmBaseTest.java
URL: http://svn.apache.org/viewvc/commons/proper/sanselan/trunk/src/test/java/org/apache/sanselan/formats/xbm/XbmBaseTest.java?rev=1089997&view=auto
==============================================================================
--- commons/proper/sanselan/trunk/src/test/java/org/apache/sanselan/formats/xbm/XbmBaseTest.java (added)
+++ commons/proper/sanselan/trunk/src/test/java/org/apache/sanselan/formats/xbm/XbmBaseTest.java Thu Apr  7 20:41:24 2011
@@ -0,0 +1,43 @@
+/*
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ * 
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *  under the License.
+ */
+
+package org.apache.sanselan.formats.xbm;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.List;
+import org.apache.sanselan.ImageReadException;
+import org.apache.sanselan.SanselanTest;
+
+public abstract class XbmBaseTest extends SanselanTest
+{
+
+    private static boolean isXbm(File file) throws IOException, ImageReadException
+    {
+        return file.getName().toLowerCase().endsWith(".xbm");
+    }
+
+    private static final ImageFilter IMAGE_FILTER = new ImageFilter() {
+        public boolean accept(File file) throws IOException, ImageReadException
+        {
+            return isXbm(file);
+        }
+    };
+
+    protected List getXbmImages() throws IOException, ImageReadException
+    {
+        return getTestImages(IMAGE_FILTER);
+    }
+}

Propchange: commons/proper/sanselan/trunk/src/test/java/org/apache/sanselan/formats/xbm/XbmBaseTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: commons/proper/sanselan/trunk/src/test/java/org/apache/sanselan/formats/xbm/XbmReadTest.java
URL: http://svn.apache.org/viewvc/commons/proper/sanselan/trunk/src/test/java/org/apache/sanselan/formats/xbm/XbmReadTest.java?rev=1089997&view=auto
==============================================================================
--- commons/proper/sanselan/trunk/src/test/java/org/apache/sanselan/formats/xbm/XbmReadTest.java (added)
+++ commons/proper/sanselan/trunk/src/test/java/org/apache/sanselan/formats/xbm/XbmReadTest.java Thu Apr  7 20:41:24 2011
@@ -0,0 +1,58 @@
+/*
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ * 
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *  under the License.
+ */
+
+package org.apache.sanselan.formats.xbm;
+
+import java.awt.image.BufferedImage;
+import java.io.File;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import org.apache.sanselan.ImageInfo;
+import org.apache.sanselan.ImageReadException;
+import org.apache.sanselan.Sanselan;
+import org.apache.sanselan.common.IImageMetadata;
+import org.apache.sanselan.util.Debug;
+
+public class XbmReadTest extends XbmBaseTest
+{
+
+    public void test() throws IOException, ImageReadException
+    {
+        Debug.debug("start");
+
+        List images = getXbmImages();
+        for (int i = 0; i < images.size(); i++)
+        {
+            if (i % 10 == 0)
+                Debug.purgeMemory();
+
+            File imageFile = (File) images.get(i);
+            Debug.debug("imageFile", imageFile);
+
+            IImageMetadata metadata = Sanselan.getMetadata(imageFile);
+            // assertNotNull(metadata);
+
+            Map params = new HashMap();
+            ImageInfo imageInfo = Sanselan.getImageInfo(imageFile, params);
+            assertNotNull(imageInfo);
+
+            BufferedImage image = Sanselan.getBufferedImage(imageFile);
+            assertNotNull(image);
+        }
+    }
+
+}

Propchange: commons/proper/sanselan/trunk/src/test/java/org/apache/sanselan/formats/xbm/XbmReadTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: commons/proper/sanselan/trunk/src/test/java/org/apache/sanselan/roundtrip/RoundtripTest.java
URL: http://svn.apache.org/viewvc/commons/proper/sanselan/trunk/src/test/java/org/apache/sanselan/roundtrip/RoundtripTest.java?rev=1089997&r1=1089996&r2=1089997&view=diff
==============================================================================
--- commons/proper/sanselan/trunk/src/test/java/org/apache/sanselan/roundtrip/RoundtripTest.java (original)
+++ commons/proper/sanselan/trunk/src/test/java/org/apache/sanselan/roundtrip/RoundtripTest.java Thu Apr  7 20:41:24 2011
@@ -92,6 +92,8 @@ public class RoundtripTest extends Sanse
                     COLOR_FULL_RGB, true), //
             new FormatInfo(ImageFormat.IMAGE_FORMAT_DCX, true, true,
                     COLOR_FULL_RGB, true), //
+            new FormatInfo(ImageFormat.IMAGE_FORMAT_XBM, true, true,
+                    COLOR_BITMAP, false), //
     };
 
     private BufferedImage createArgbBitmapImage(int width, int height)