#!/usr/bin/env python

# compressor.py
from subprocess import Popen, PIPE

def compress(value):
    """Compresses a string with the xz binary"""

    process = Popen(["xz", "--compress", "--force"], stdin=PIPE, stdout=PIPE)
    return process.communicate(value)[0]

def decompress(value):
    """Decompresses a string with the xz binary"""

    process = Popen(["xz", "--decompress", "--stdout", "--force"],
                    stdin=PIPE, stdout=PIPE)
    return process.communicate(value)[0]

def compress_file(path):
    """Compress the file at 'path' with the xz binary"""

    process = Popen(["xz", "--compress", "--force", "--stdout", path], stdout=PIPE)
    return process.communicate()[0]

# compressor.py

from optparse import OptionParser
from sys import argv
import base64
import cPickle
from cStringIO import StringIO
from os.path import basename

def load():
    ppds_compressed = base64.b64decode(ppds_compressed_b64)
    ppds_decompressed = decompress(ppds_compressed)
    ppds = cPickle.loads(ppds_decompressed)
    return ppds

def ls():
    binary_name = basename(argv[0])
    ppds = load()
    for key, value in ppds.iteritems():
        if key == 'ARCHIVE': continue
        for ppd in value[2]:
            print ppd.replace('"', '"' + binary_name + ':', 1)

def cat(ppd):
    # Ignore driver's name, take only PPD's
    ppd = ppd.split(":")[-1]
    # Remove also the index
    ppd = "0/" + ppd[ppd.find("/")+1:]

    ppds = load()
    ppds['ARCHIVE'] = StringIO(decompress(ppds['ARCHIVE']))

    if ppds.has_key(ppd):
        start = ppds[ppd][0]
        length = ppds[ppd][1]
        ppds['ARCHIVE'].seek(start)
        return ppds['ARCHIVE'].read(length)

def main():
    usage = "usage: %prog list\n" \
            "       %prog cat URI"
    version = "%prog 0.4.9\n" \
              "Copyright (c) 2010 Vitor Baptista.\n" \
              "This is free software; see the source for copying conditions.\n" \
              "There is NO warranty; not even for MERCHANTABILITY or\n" \
              "FITNESS FOR A PARTICULAR PURPOSE."
    parser = OptionParser(usage=usage,
                          version=version)
    (options, args) = parser.parse_args()

    if len(args) == 0 or len(args) > 2:
        parser.error("incorrect number of arguments")

    if args[0].lower() == 'list':
        ls()
    elif args[0].lower() == 'cat':
        if not len(args) == 2:
            parser.error("incorrect number of arguments")
        ppd = cat(args[1])
        if not ppd:
            parser.error("Printer '%s' does not have default driver!" % args[1])
        print ppd
    else:
        parser.error("argument " + args[0] + " invalid")

# PPDs Archive
ppds_compressed_b64 = "/Td6WFoAAATm1rRGAgAhARYAAAB0L+Wj4FSBIGBdABQZCgMPj8dYIupuhXxusVnKHAuOIjxzE2qsfblGR3CmZ6sn/Fhgg1TFcoaWDe/hzNrgLcxTnXFAZ9CLYGleyQb3ZBGquGvzLyv6LiyYdhXT1Ack5IHhgvcdEp1yfnwqhGnWzv/Xm6OlM8jfJKPGa4RiKTemliyBeCV9t8RqfuFRAW3kogZ0ANqswFkUJxmTInelwS1ZPWrF1x4IkqpXVmt+AU+wTqoR2O6B5W6gw0dknvFkuU7CEzaNXY7ZdgDh1tHh5Lif1XYvPzdmaHZZrNz1lWEIlsoHgJIiWxQumG9jQmv9vy4Wmp6GfwEGIrTWNP2y98Gy39iXvVUDJwoIxMiWw9m6daY69LBFt82xmP2RnVb1hh8K7A7bNRuTVwc/XqbdSrHQ9OONpVrXWDhzc3O8jX/qycJ+WtFUboNM0FEO+BkzoseobOb61qv9IoDA2cIjhIVGZTPcv1eiVHiUgprIRlgcicl+gvAGkizSOa19Alt1MNouX8GcIAgt7r5RMPbh33Uxn+tF0+CG02nXZXixpFRvLQ1g0XMT9S3SkTUodR3CtWK6VldK711+1nNEkIiKzNeIVUHF3hJF4xuzcxRcc/WQ5RoflbBoSXa4aVESH80i4+EYogWOJAKOidU93zr6doz5iouOqdW0afxnB3Pr7djEylLybL9+dyYHj3KaRP/PcqmwzDeYSzOB1g5j0Uf4lOF4cjTVq4JM8oHe/FRw2VOuIKQOomWFsS3dzFu7jNyQWS/rMrZJ6ZMS55A2oPQmUCrzMEEM3QDrB4GXScDuCWXWhhNETDJRPf5A/vZntTYFO1uPQoNRhum4EbOR9aI0dt7KrZ7qTAs2YHZrVKx++FgTigaH5j+5arMy2iotNMoSBwuTU6IFX9ri2a7uw8/7jnU0bN8ncjbtMD6YJbtLrwcR0OAfs+p9GiEvUidjxJh/2Enc2N3FcRiv017lAO8QdibUSANj0u7RpkYRma+5owA8sQHyd4rmzKgryWcP2p1Sir7aQHWkrjeS9oKsKR+Sxutu06vGtf1wxCi/9PSXC22WGxjPjMWwYi3JtsJ/yIWujJq5W+cZnnzb4WYBCxBvWKcIJ9SleEuufqh7FmzMOKjql8gV3YN0CSJV23CJsYZ5QrOSQTkvlRufdQsJJGqJJl3FVIuYrnzVglwr9wNfQx3h/9qDVPNfUaCVcKkieldBLwDeBqLpBzcmOtTDnft1laYKFW0YUrwYCKQCKkSr+SpGY5bvsRIj7cuZuJOL2Ft5VzPw6O+X4xPQSNKNIZzN/kTDO1d+ehP58iMkMe5/QFdTRCF2rQtdkPziookXP/HXJcB3EdGN1UKT5oVRG0DcYj1UlbVzPM3dBToltZ6le9dY+IrqOS9PvLOTLUfxL0azkfDyM3yQ3/jguE6x/2Mm78ZtVl2TGQ8BDm8ywND1nIjJYvoNFiwcCOPQPg7nDzh+AbMWr9WffeJnSY+DMiI5wEzzwNRFXhTiVh3EZZpzmoa8TcfpYxPX2eTW99HVOs2gFRxAk58BrtNs7omz70YpzLox+l/pOypWuk46wQYwivCdYZQc4BUnRt/+dhASDVOQG/1SAJ7QGDBUJ59hH35EHaHyox0+9WE35mJfI0eMdhKzMRIEPKrQkz/Yo5/odDC9qyMRTZuFTKDfIMmAtNmA2i0M7bN5RXH7WcZVO1Gev6Vllcg6VK72gG+/+3DJBpfaUqrezPF0JmD8wFC8OxMqYzl4UscikqJEPs8zag2YaHeAolsgpYleTzqF+YAH2zqW/GTv8q86zw8NQC6T5Ny4w3dSMPtAbTAA8OLNoZz5ytC3MWNV2qprrW8CfrSMi+1O0tI4sPI+DPQLdY6siam8YSPHxG3Iuo1iT5Lwt15uVfMbjUwb6Wtiaky81InD7hXbPsbsDuhBU74QT+V1qWpngi0qi117VUklY49Q7e7+xkrrjpWWpc7/7XDw+G/kqzouQQuKW2iOHPmjhqo16ytE2lllmnMlZ2sjeNKwe4OF3g46o1vzvul6Ld5nbksTjqo+TVf6+SXauA8NH1Qsr30d+T9lklLY3oyTWFTzUFEz3oJyQKfLAnb3Kqbftq/H8W4bPeFc8ot1Ibkh6wYYPLxORQ2AxrTZa/J0GKGPWn7avCxMJ2R0a3XzwaXv2FPO028yv6gvF8vEl0qT3MSJUD27rgqQHjGGBJ62sysEv8dXOV80XrDyka4IPkf5WepkXY3SDaCrYePKQC0LzusC/2MScCcEXPrZcjqCBT7ckbNREu+pjOjqlFArejsEUekcGOEqzqYCG1DwETSUYzHCP9rnlPxcYeS1a+ob7+70jPVqKnKjDy8YZCRnztt2mBuVyyzy6+K7lv3dZUMbSS2kpks9rVIC2pMx+7ss27FGBYDde+MrMj24W801JgzTmVId805TE2xVgMSQ03o72SyLHFPJzq/+SFl2pYU/tW18Q1olxliXiyPVZqCsDUKxVFldk7WVtxswFFWDrbpghcy28KWZVgR6fh0cyehYypKzo/dQu1jVvEmB6SxD2V1wnCVlfGc2a8ubgVtyTKEO5XbUSUAjU+YXnjtuoFZFjZXVuVNIw/Ny8rcmgy9MUl913fa57w3N3byrKDVDWFmim5LY59nyGiyylZSABjlyjl23m50kB/SdYAiz4RDYZM/Gn7Lv7qHiRhGU24LJywIhIRn1LRCVAmu8jH2eCMNjaTYnLQ+XO384VQIHWvgc7rShZpkoyX5UA9j2mu6cSceaoZ+z2tvdwE43i6fRfBvHBzHHwEwR3pMVLK22oNpxapQXETN4FMn5BGI63j+fNINBjFKGx8pRczTqOAmlXDv15YKgVBk2MoO1gd2aJvsCHOOrfxPdp9k5ygNtn57OwKFA34lPKCRQ2AaP+r643rkhUkTjzHdwGEb8fiBzdLqGOIvdXydEGqKLiPzSX7iWVVel1CONIggW7VU3o5QlK50jaqUTkVQYFzmVWLUT0uTCG49VyBBLGak0bvJ0sWX2UaMiTwQuFlTp7g6GStb9s9wFRwiWZyFIzF5W7GjJi3lov9LJSqwQ7do+91Z3zenlt/WudEOA0HgNgKq7WPtmACM8ebrPToT9eRDpuh3Nprhd83MvkQw39f4Ao7Zzn1FpDjPW3wipkiEH4qoj+8BKZ53DCabYMNs4fp7LRBZfPYcfnKB/rPh2YKO1FzIUXTC+ikVEv41HIwLPxmCPbTERpUfjjDZHlYrGgDQClTXp22Ao+FZvK9p6cjYF0vIOfWhR3MWGioOf8p+wzV+tUDBYv/USmrUMg/lXDioUQF+vPgAr7j1e7NwwqXDt3dKPEa08afzgkLLOQvRCuoftjmQJPwsCQD/d04uEMtpKIT87M+HEMRtw/PEi21n1vansRABfsaEu+RjAGA2R4OoFfDfnj5xVE2/iz2GxVfbnDWGcqRfJfBq4GpM/6LEkQ6cFzy1qLa12u5A/SZBqIBWYwxk1KQ+NEURaYYY4v0vudTyvgMzAVBLugAtixjtWqoVccjaO7LPQnYU19fAonDn1cbIID0GBmOwEmCOqbsq0JXhqmzpmYaPYU/zNd5X3oXswqfj4UTLqImWu1+NNqEGpWsMdLyxDYzEocgwBlATn+LQ60THUf194CRjoTwSIBKstV52DKx7Vhgps3LojT+t+AdcF0eXzVKN47Q9ych7lh8g1NPOtlY/Qbox9Kl1ZI4tOzUKlfEDRFOgMp4ZPoygSxoqwA5HQApuWEAJrEk0RzgEtz3E0Yh9nLwyZqMOCGhEhSrgZQX4E7HLZ2nWf4/94e05GTeRGyy9B1wJGFuar8NM2uIGrLIaj2OarpwtKW7Kb+jQor5LdJruqgpz8jRagT4K57oqFkJmutVpXx72nq2hqOCWQ+3fFPflhHZoFXwneLWxVCbdTANOCBItrNr+0rw2Y6fJiOuM/f8rCNpaRBsQtMpXAdDmrwpRhwVlY35+kTTpIGtTuXEH4doNh0Iyvyi/siCMdZYFkLjK//uW6g65+RwcS++5fsBPvVCiVQtXu6/zITAInwQfm1od5WmL9GX+c4s7vdf/3424zD2i+AMT6y32YTou+ht7HvxmoZvyhYfolHQOG+H2XITKHg4FS3wk5SH/ErsImpRXkUVAzMMjZMINZ1UZxjz9ItRriTH5k+2KebjhoFTEGeorIaxi9Se7ykWYEtDjlrQtlg2IzdX94Z0zQ7Go2J6es+P4JrghCnfjyQjYZH4XcdLsFs8kkIXc7gzgQ7Xz7ScfRJ0EfF4AkGGRUqLRBGGtDMoViEVF2RfWj6LbGeMNPMeMjEFe+u5w4QDwwXdbwHBBfJJRiTIPvHx+ssq8Wqnc04IMQQwUeotTVSzKMNgbPHvi2sCBvy0C+adncansZzZMvwaIECNRPBUdeEkU9/qzC1ejUh3SGmRNIbqdAO3jnOe8MNZP7arEGeEj5oVDh4+XNJ9CjDuVnL02+VzkDFO+zzQgsUZyM+lDoXPPM+8sElsJ3ujV2iISJXjNxHOAp7QHGVxNvW8XJbyn/GblLWLeXWKgpZ8FPiuAqJFJj/fCUyeZLkBaQCd+ddA1espIHoeEmlEwjmks6a+Ee4vIv3GXYcZO8Mj876fpQZyEnHHTI8S91HeG9M6qaJI36ysZ8qq/8UHwyX9QFWSq6KysZY4y8uIU5GyymfpXV4Mo8ZJ04tCuqLAMfunAgP+AOJDJ7oKak95eVpTta2dI4/t2n7r1rHi5DDJPJcGBDfFbrycj/qnLfpGps3Zam63FubaJSapaCv2+XCEjh9hPsauK9dPXGS7ZTN6U2xXIlWmecxIAtF15vu+lc98VJuwdkZuOy45M55JlUbHnOdnmqdUScMOLzmaPsu4w5auUJO75LIDut2nR65RqkLzKijWCGqLh956EguDSA0VtfTlUf3/CL0SQiwiDHoOj4NM62TetUvxHtJrYulcyr+PK4EX9ms10+fHpFSBYopijv7iEaDI/SQ3PLJFzH/9VN9BRQkpqz1+6YPTw83vmuvU67eOhA64e5q3NIjnA915oFJrGhuaXYcz6xtKxgKhg4Dl5r5tSFWjEJpqyTkcguAfOdYT3xJOU9UMPZTJWeFXC37hmGtW+fDfFa9kH5XfOy+HP3uCkt4su9JOTylzkXRF7Jdq/lxae1Q1wwNjlXZnx38v+GKzZNXLDy6Y9UEdBYM7eu4sb0hiUpbG5+lG12w+p9S+QoXFjGFWN0zY1Fjci/wI7kSoLD/Io1xvbZP8WCcaNJpkEpuH3tK6EJ/v9S4Riz4r9bECaxOPf3Yh4mL4Xhy1DuFLjTPZ0XHjp/gYCelwr9Pd8AsBRjH+mPM3CKiofRhbEeiRN8O5B4iszT55M/Angceig69NmQcq3QQlyLck8denTHqlWSug4Q+l9kBg2zRIp9tx/ruZM1/YrnEeaK4+9wZzXzgJ0FjHPRz37lvXFGab0sVLjhiG7cRr1v5gqY3Em2LnsnoQ+hg0yhfuf+dahuP5bZ0CGvKYt54ZAVcbMfzoNiGGie88WdNZWLVS2sOzexYNbPcHIrCWZIpuRjeQm6+Odq2+JyRGNarxMRhdNfE3R4kTj4UVwOwJea9NzDmnqXQK29Z4SbgLiZaAuH+tub9O9CVsqrwHJ+db+oOgyGgUVPadR8wfn49NunfqOyteTNRkwvVRZjB2s0Utj/tgV9h4yyfDWq89eWd8yvvUA/FF4Gd1hB0paTehyjLHxt7kFUyzkrbCd+9c1eKSikxrLnDI6h03zpIck32CRwdJezit2iyshDtHXkZgFX2LzUO0qhBnm/OeMfEIEqPT9SfbbBzXwCyg4Jg+ExqZz36Y87ZltE8jAQDHp5okdAtZ1HXjh+WVig81GMcH3OAAVMW8PeU8sUFaGHo2LxLh/skdY1mUKFZz1wd5icXHxa/MgVp3oZL3dhU8FpYmISvzeuUAyHDTlpCx0x2JSYHOMIag8gR/hYwPuzEhOgw02Ae3K1TnlJ1kJVksH1tGxIq6y/BSTD06YH05Rs25rgiGkGUAXFVsmJ7lW+/3iwsFABA5JY0M9ys+PiBDV/yy82UlCcXDSiibRG4ythe+2opFnHu1K9ckq/VRAv8ghH7ZOe3Sf233Gq7ZDjkNIfcPLy5/coeV1ZBv0rmhujRPSa0yQWpRavntS388JKYQpHkdYyXm173xbo4x/U5PfJ3/KkGam4maJt9L2E9bvMauXywU4Sq56vP+tKhSJBAMo0r/6tD4OdU94XqvEOrtRuwgn1Wmtu1anRu8fpM9FM7Q5i+JBgJxzgrwjxbW0yqUBC27JpMuUD9LdJMeXX1mhNqWdE0cryzKGrCDruERjP8s+SimEosujrKI4Kar4EIEPDANN0wmONUB/00U3qMIU/xZ450LbtnDmHZPxy/jc51kNHL/nOEVuwB4oJ5O8IiF5fqu6ZhqCo9r5kkC6NcsldAkuzZPI3GyQLPOGibk7o0iuUxOqnpzKD4Lg6f4/2erqzDGgdIKaeJVA113awmMvZ8IwmUdPlaIvqCavR7kAoxEk/ieVDqSEOBe5s4i7r5lwn18pvb9lJSKQu1SSOnqUrJBiNBs0gv13qNwNKj9Xo+5595iK3LETrmgFJuoWFbBKVBwqRMlSTXMXOiZ/dlNWpacbpmy08reN/lRJHLrupLsTK5p6ve7Gg4jYpsiCfW/Am0s8Q8OMPGGchr54Ca0QeyGdyI3M+K4fgKFEd45OHC2TU3/QmJJ0Bh+8BjzGVxaK0ne/nYXLsovpx15ZFfXg+KjvS3pDyHWKQEThyIxO8ATE1S61jwP+0DGtidhEkYS0k2/+TP72PHi5CXUqFYZsOJVveBTKNCLKcTFugK3hHRygH3dcrrrOtsLgDM4/0rgjU9hM3oYZP71p2vSE9mtd/QThJg1KGT64lDSc78SIzu4rSuGQ6E/dPzpz40xWPwALhDk/HGRIGzHBrBvmdDX5KGUpLw1fShyLIIAfIN2RZwXPgKvtrL7HD9YagwVavmBLNrqcnkurwAhS5wMI1rAbhmi2sBf7GE2zNmG91AETj7qWd2BUo49ndU8AED1D3aV1klMSmeH7RwmsqU1nLPHcIlJX6LBI8voPJUzXWidbyNbPM0qyy7SU04v2zfiBIGs+aktp19yUqahhBpKDoRcUNETdgCDuUNVcHSqTjxfNI5Vh7slfvKQr1h5jpHjJRDu6vyJ08AsuHb6e5RX2lzc/GEZkXcGpGLUilpc0s6oXNyj/A+93slayHb0aAiQRlud2mSh5AWMzmYUrhr4jN1olQJ0KOhJFQdoEDET4WFaqWqWILQ065Y9MOiVch+G8lzUQPq3LpXUkjzmmoe5N88NeOjXVKOwAIzdllw5VJodvvIioI691hvDAC2qNVfEYvx8FUA/Xc3PCIM4yHIw4X7XADgiJuQyWBWe4UROp3FPk/GA/hU+7YJg5E7b4o0b16ce5S7WSCWckxPUogAsnoeWqHbHj+hOpmGhQ/BRFbrBXqbo5D4jAUGeB2bKE2zAJcgwmafQ9QRQZHKxHzLXwicwFEuCKPaIJMLI4VdExjo71nx4jMg8wW2vpqiOru/l/OhtmyHhyq8zHDge81Sh5SsaHZDPZgkusF1PfWhgWk2dzsqXWOIe/d1EGA4Uaf05KeQDmJ/9LoHAh+6neDysj/DblypYpuA7sE0QXlDA5xTyrUUWwbgvqGqWbb8NDEdcpAemXtuGBQcZIrrx/a/Sw6MY37D/6oJfMz7OSvzNyWtOq+5KXRvr3bSYZ79hws+Oi3fG1EFhoi2Ibxma0NZMwJWjCIHLRH8d+uqVDYQucfb9jHJBXt0hBjqWogZkAvO8HSH2LuOQHLkgVdzqWLu67E/aHrf3zp982PnAYBbpqQq98fz1xOblt66Bmyh4ezSIW57PeqIPn2GD9GVZPF0KlzoKx6Oe5X9mh80IY7fA1kvUfHG3V80m+VsiHUirKetW4n2jddfdyffiXua2HIui18VwDBjgnnXf+lYgJzqlvD9uj6rOPxBmVsmXo6aIctazkM3rXazB4fiwd/lE0tyBPf6EP/LbYTFRSVstLJ6ESExaQhxvz9khqhpE8E5lhi0tO6iz4xqd2BsoJdodChRIXsFN8VroKsrxpsfkm30vq2tJRCTRPOB8nnqkpkcGMxQ6/uOUo5VV2AnG6gHQw8d1pkn8nG0DQ6SGOPGZ/u5qEmRtqFQqUM9IKVntHKO37DQJ7sPwec7UDgL10cm6VVq6syPHlRY/iWQ+tF8zGfVczltvDVdVG/l0XLoHPCChFKIXCKircKkd3qTY8WNlyi8e6BZAP5lVMDmAQBBVw4X6gvQsUvqvevb3DhirSokQTBI/b2zpt0sp9y5nfrOF4VQCDOpsSKdNW+LaJ3Ls20gk07fLlYdC4WniGIWDDHd6SplvePiRryPCLx2uh++OTBHT0TOfO7GyMW/GJrZGSGKJoNNfkGP+ZiTMhP33/bwevu2yirGqroI7wqeiIUs9E/QrT2v/g75zrQOf1j9RsdF88nQ86PFVuCeWQCCB8lrie6SDVvGb/Vao6LPw6aLVz+YfoMW2Y1vy/QzC8PcWPoq+ctMmw1AbuF2vNexVR4RfDUIGWino0PARALDilERYKlswagj1xRWg2uudlqCIvdWxSlmiiXmHXYWG0htnC3jyJT3msLSyqPeTheX+6QK2kN5OosMEm6mOTu2p+2g+ejx7DObC0qG6uki0DHtFjsSexUY5IWuaDmI0L86bk1Qrtczdt30qtbh5ZmqgZX8lvmpbKMRspu18mcJ7jntO5s2IzRfe3CB66/qvbRGLZkxexANwJ7FTxHEqXiKufKLynTUcJiOnI2lsrxRDLOjzjDinLC5wbm7Y6wyPIhHjBP2qN3XSwq1qvI6GWn6zkAMz+RJXLdDxpb7uLTIkPvnNUquVBC40qVIZCSDGDgJegR7OrAfX1ZdkBnTIo/rF74JBqSZYYjIQAbH3JWsWQFGciHeI4y5oUBzU6Fla5Li626HUpwP5BQw1YlET8rHLgQWboxaMeONuGJ3m8BEPSHolR2I5q1abYT9PImtnZdbIoLWX16Z4UXDFHUnTwxH+dXyN3ttwUGKGjQvoDfIJvQy0KaFWOCTqCHslKuLQQEH/jDyB/SQd1dOkrH5LviKD1e/AaYNkUiPawAq0rG86xHvnn7E61ZC7CywgOG6sU2eKakHf9lmXSbfRDbiwHFS8UNP31IcWpFV4B+VmXVo4n8aHzfr+yVjAeufSUxvFuVDqgx7S6/FL1o9qA4TbacrJPMNzBtA4N8lYGUJQrJuXVI+Sp/HIlWrTFu8/H4Xij1KVU4i9W0shndl2deLWb3141b/mj2OHReDYkjpcG16bdj+ne4zItkkR9TN+MOvWLaFM/H9EXvs/GAeTd554BAqQg9aLB2/SIZ8YNcngjFF8dE+hJYYKDG3oCXvBn4FDmPWZfsm10/OF+z45x0UC7N2BcQfuoj2Qyl2w+iYkkkST9KTnneJPENikE7MKd+5xXHk3TEqBVVYjecPZ9t6Y8lnFVnHZekkfbQ6g0RWUmGLzr7iYWnWo5Cvrdb0UuSsvTX5eSPUdR9XM1BS1RevJStJAxyGUPi1fEEKnmlY011k51UGeXPyN6jF9IYvDvvfmRqWI/auLpD4DUsBNzuH5f3Fb8IWVUQrzYH16M09gLvIf+hFr4bIrXm0c//KxBEfUycK8ssQ1XyXoPzbJQ2mBKPEIcunSovlXR56AzPgU0aLLQbGg8xWDVa1piOoP10drKT+703pJzXDvCZesMiImYCRDJrqzi95NjB/nguhk9ZpfhbivD0U6hFRAYKYPP3RFABm4XWoUJtzqqslWqNbzmXRm7NvtmnfT0jRkFZdKX2PRipomA7CsIlXUFkewYGzW7u8gJE6KJcy4CIpsfCQK3GH1E6aeP4Bs7l2XSwROQaz5Km92fmrb22BzZMYcogLlaaqflAR9V50BaSEgWMPG/LqQuHck/9yHRJFepYSAKSOIeoia2mE7BFnvpvObTvb0Us0ViYqGoBk/xjdyWqGoNoCgahe3ovg04na1vP8gEghr0ezDcoEY3O3jkiykn1Y907T0lAuHOpHdSRg5+LERe4kfC+uyfXtO3XwbyamiPTCIwXOU3oXoZGgUViGPvlQqY2tbmA6+K4HN8Dk/BjNuLp6fi393SEeUqfZHhEyfPFYC1pG2xgrAZIJod8OkVmmKT/skCmVDXXsttaZW7F4XdZrH2oXj/qekjK2CX1D6e0lPhpsMvJ+vhagO2d5Ictqun08LzmhNgyz1FsJL0CHDYAo8UQIeG2yISRwyDrZPxy8OHF6EnguDAAAswDptxwU5lInyYFww+Km8xfhf1dqt5rm/3xOFoMmhe/eIREzO620e+wjzHnW4QPnf3WF5vm0DNkWzHSmPi3qUb/VUYPbgZO708U379kTanCY2Hdxkb49wcpMWMFuFjUfwWW6xTYajh8FO6Lh5IO2zcLTU0frU3S0s1ZjdOepT4XRzkofb+9hrxgS3nj7gnGEi5ALylLc6QaIH0d6kVwDXJCGS3inUFnjaND4u3/QFavPjaYuUOnJnX1CWG4DMxd4peldXLtiPsWUlHcjwv5va1qxoxuGd9jzgk5jXHxDxPLy97qzyT23gNTz/mVp1x/n+yAE+zuPv+5mMGIPeLbPWROF4HYAupuzyVdRvm5H71BGnyCxxx3i9whb3LA2HioqFM9rOfq9l48tNbnyAkgdRO3+26bzEFUfEdt0IqHUSMXBRtniQ48I5wWDyZgSKGC1J2pt4Aca4k8JuHMGKof8lE2ZRRTHAs3znS7VXVgF50FrpI7Slv8Q7ZsBQkI4hZcpFG/mNrlWHjR5b46tltc2SwOJn7VyLIrLQKtgvkftEYvaqIT2ROI4TzaWnuZL4VIEgtdMKs8a4i+inXFmUTJy9xaOULrQx8ncdQ8mQVnvjvAeNuPudqXzys7rmbmdtDe5kLRVLUr3ADuASMlZZ6A9IRF/+woJ6KRK32Q45Xy/ghxWG/BiBEqC2uBc56EiCT8jFwGPBlsBqOV7tAxfY3hVqSLkUsZlA+O3q8WleXHy4iJDG4sALH5ftAy0P52AAH8QIKpAQDofBRxscRn+wIAAAAABFla"

if __name__ == "__main__":
    try:
        main()
    except (IOError, KeyboardInterrupt):
        # We don't want neither IOError nor KeyboardInterrupt throwing a
        # traceback into stdout.
        pass
