""" Python Character Mapping Codec generated from 'CP862.TXT' with gencodec.py.

Written by Marc-Andre Lemburg (mal@lemburg.com).

(c) Copyright CNRI, All Rights Reserved. NO WARRANTY.
(c) Copyright 2000 Guido van Rossum.

"""#"

import codecs

### Codec APIs

class Codec(codecs.Codec):

    def encode(self,input,errors='strict'):

        return codecs.charmap_encode(input,errors,encoding_map)

    def decode(self,input,errors='strict'):

        return codecs.charmap_decode(input,errors,decoding_map)

class StreamWriter(Codec,codecs.StreamWriter):
    pass

class StreamReader(Codec,codecs.StreamReader):
    pass

### encodings module API

def getregentry():

    return (Codec().encode,Codec().decode,StreamReader,StreamWriter)

### Decoding Map

decoding_map = codecs.make_identity_dict(range(256))
decoding_map.update({
        0x0080: 0x05d0, # HEBREW LETTER ALEF
        0x0081: 0x05d1, # HEBREW LETTER BET
        0x0082: 0x05d2, # HEBREW LETTER GIMEL
        0x0083: 0x05d3, # HEBREW LETTER DALET
        0x0084: 0x05d4, # HEBREW LETTER HE
        0x0085: 0x05d5, # HEBREW LETTER VAV
        0x0086: 0x05d6, # HEBREW LETTER ZAYIN
        0x0087: 0x05d7, # HEBREW LETTER HET
        0x0088: 0x05d8, # HEBREW LETTER TET
        0x0089: 0x05d9, # HEBREW LETTER YOD
        0x008a: 0x05da, # HEBREW LETTER FINAL KAF
        0x008b: 0x05db, # HEBREW LETTER KAF
        0x008c: 0x05dc, # HEBREW LETTER LAMED
        0x008d: 0x05dd, # HEBREW LETTER FINAL MEM
        0x008e: 0x05de, # HEBREW LETTER MEM
        0x008f: 0x05df, # HEBREW LETTER FINAL NUN
        0x0090: 0x05e0, # HEBREW LETTER NUN
        0x0091: 0x05e1, # HEBREW LETTER SAMEKH
        0x0092: 0x05e2, # HEBREW LETTER AYIN
        0x0093: 0x05e3, # HEBREW LETTER FINAL PE
        0x0094: 0x05e4, # HEBREW LETTER PE
        0x0095: 0x05e5, # HEBREW LETTER FINAL TSADI
        0x0096: 0x05e6, # HEBREW LETTER TSADI
        0x0097: 0x05e7, # HEBREW LETTER QOF
        0x0098: 0x05e8, # HEBREW LETTER RESH
        0x0099: 0x05e9, # HEBREW LETTER SHIN
        0x009a: 0x05ea, # HEBREW LETTER TAV
        0x009b: 0x00a2, # CENT SIGN
        0x009c: 0x00a3, # POUND SIGN
        0x009d: 0x00a5, # YEN SIGN
        0x009e: 0x20a7, # PESETA SIGN
        0x009f: 0x0192, # LATIN SMALL LETTER F WITH HOOK
        0x00a0: 0x00e1, # LATIN SMALL LETTER A WITH ACUTE
        0x00a1: 0x00ed, # LATIN SMALL LETTER I WITH ACUTE
        0x00a2: 0x00f3, # LATIN SMALL LETTER O WITH ACUTE
        0x00a3: 0x00fa, # LATIN SMALL LETTER U WITH ACUTE
        0x00a4: 0x00f1, # LATIN SMALL LETTER N WITH TILDE
        0x00a5: 0x00d1, # LATIN CAPITAL LETTER N WITH TILDE
        0x00a6: 0x00aa, # FEMININE ORDINAL INDICATOR
        0x00a7: 0x00ba, # MASCULINE ORDINAL INDICATOR
        0x00a8: 0x00bf, # INVERTED QUESTION MARK
        0x00a9: 0x2310, # REVERSED NOT SIGN
        0x00aa: 0x00ac, # NOT SIGN
        0x00ab: 0x00bd, # VULGAR FRACTION ONE HALF
        0x00ac: 0x00bc, # VULGAR FRACTION ONE QUARTER
        0x00ad: 0x00a1, # INVERTED EXCLAMATION MARK
        0x00ae: 0x00ab, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
        0x00af: 0x00bb, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
        0x00b0: 0x2591, # LIGHT SHADE
        0x00b1: 0x2592, # MEDIUM SHADE
        0x00b2: 0x2593, # DARK SHADE
        0x00b3: 0x2502, # BOX DRAWINGS LIGHT VERTICAL
        0x00b4: 0x2524, # BOX DRAWINGS LIGHT VERTICAL AND LEFT
        0x00b5: 0x2561, # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE
        0x00b6: 0x2562, # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE
        0x00b7: 0x2556, # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE
        0x00b8: 0x2555, # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE
        0x00b9: 0x2563, # BOX DRAWINGS DOUBLE VERTICAL AND LEFT
        0x00ba: 0x2551, # BOX DRAWINGS DOUBLE VERTICAL
        0x00bb: 0x2557, # BOX DRAWINGS DOUBLE DOWN AND LEFT
        0x00bc: 0x255d, # BOX DRAWINGS DOUBLE UP AND LEFT
        0x00bd: 0x255c, # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE
        0x00be: 0x255b, # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE
        0x00bf: 0x2510, # BOX DRAWINGS LIGHT DOWN AND LEFT
        0x00c0: 0x2514, # BOX DRAWINGS LIGHT UP AND RIGHT
        0x00c1: 0x2534, # BOX DRAWINGS LIGHT UP AND HORIZONTAL
        0x00c2: 0x252c, # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
        0x00c3: 0x251c, # BOX DRAWINGS LIGHT VERTICAL AND RIGHT
        0x00c4: 0x2500, # BOX DRAWINGS LIGHT HORIZONTAL
        0x00c5: 0x253c, # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
        0x00c6: 0x255e, # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
        0x00c7: 0x255f, # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE
        0x00c8: 0x255a, # BOX DRAWINGS DOUBLE UP AND RIGHT
        0x00c9: 0x2554, # BOX DRAWINGS DOUBLE DOWN AND RIGHT
        0x00ca: 0x2569, # BOX DRAWINGS DOUBLE UP AND HORIZONTAL
        0x00cb: 0x2566, # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
        0x00cc: 0x2560, # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
        0x00cd: 0x2550, # BOX DRAWINGS DOUBLE HORIZONTAL
        0x00ce: 0x256c, # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
        0x00cf: 0x2567, # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE
        0x00d0: 0x2568, # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE
        0x00d1: 0x2564, # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE
        0x00d2: 0x2565, # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE
        0x00d3: 0x2559, # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE
        0x00d4: 0x2558, # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE
        0x00d5: 0x2552, # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE
        0x00d6: 0x2553, # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE
        0x00d7: 0x256b, # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE
        0x00d8: 0x256a, # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE
        0x00d9: 0x2518, # BOX DRAWINGS LIGHT UP AND LEFT
        0x00da: 0x250c, # BOX DRAWINGS LIGHT DOWN AND RIGHT
        0x00db: 0x2588, # FULL BLOCK
        0x00dc: 0x2584, # LOWER HALF BLOCK
        0x00dd: 0x258c, # LEFT HALF BLOCK
        0x00de: 0x2590, # RIGHT HALF BLOCK
        0x00df: 0x2580, # UPPER HALF BLOCK
        0x00e0: 0x03b1, # GREEK SMALL LETTER ALPHA
        0x00e1: 0x00df, # LATIN SMALL LETTER SHARP S (GERMAN)
        0x00e2: 0x0393, # GREEK CAPITAL LETTER GAMMA
        0x00e3: 0x03c0, # GREEK SMALL LETTER PI
        0x00e4: 0x03a3, # GREEK CAPITAL LETTER SIGMA
        0x00e5: 0x03c3, # GREEK SMALL LETTER SIGMA
        0x00e6: 0x00b5, # MICRO SIGN
        0x00e7: 0x03c4, # GREEK SMALL LETTER TAU
        0x00e8: 0x03a6, # GREEK CAPITAL LETTER PHI
        0x00e9: 0x0398, # GREEK CAPITAL LETTER THETA
        0x00ea: 0x03a9, # GREEK CAPITAL LETTER OMEGA
        0x00eb: 0x03b4, # GREEK SMALL LETTER DELTA
        0x00ec: 0x221e, # INFINITY
        0x00ed: 0x03c6, # GREEK SMALL LETTER PHI
        0x00ee: 0x03b5, # GREEK SMALL LETTER EPSILON
        0x00ef: 0x2229, # INTERSECTION
        0x00f0: 0x2261, # IDENTICAL TO
        0x00f1: 0x00b1, # PLUS-MINUS SIGN
        0x00f2: 0x2265, # GREATER-THAN OR EQUAL TO
        0x00f3: 0x2264, # LESS-THAN OR EQUAL TO
        0x00f4: 0x2320, # TOP HALF INTEGRAL
        0x00f5: 0x2321, # BOTTOM HALF INTEGRAL
        0x00f6: 0x00f7, # DIVISION SIGN
        0x00f7: 0x2248, # ALMOST EQUAL TO
        0x00f8: 0x00b0, # DEGREE SIGN
        0x00f9: 0x2219, # BULLET OPERATOR
        0x00fa: 0x00b7, # MIDDLE DOT
        0x00fb: 0x221a, # SQUARE ROOT
        0x00fc: 0x207f, # SUPERSCRIPT LATIN SMALL LETTER N
        0x00fd: 0x00b2, # SUPERSCRIPT TWO
        0x00fe: 0x25a0, # BLACK SQUARE
        0x00ff: 0x00a0, # NO-BREAK SPACE
})

### Encoding Map

encoding_map = codecs.make_encoding_map(decoding_map)
