# ructf2010 histograph bitmap decoder
# http://smokedchicken.org

import array, struct
import sys


filename = sys.argv[1]

f = file(filename, 'rb')
f.seek(0x436);
action = f.read()
f.close()

data = bytearray(action)


table = "0E79CAE2488E3F66D88C7C50315C06627DE71246B81ECDBCB5517886BD955A42E4964598533002B3DFCF57C0154F09A8F685678A5F94C4EE64A59C6AAE55EDE908B2033DD98D3A43386959820571B613ECD347074AF06F10751B704E260B90340FF1EAA02865C916F252E56D41EBFB61E69FE058C274A9730CD02E77B03ED6B1C8D76C7F1F198472FA27FC2B32C788FD49E323AFF5FE3C1D4CAD21008FF92FD5689EBA297E83B78BE12A7BACA356AAF463DBDE1AD299D1CC4B39C12414DC6BBF8991A75ED4FF18AB172D76921C9BB97ADD444D1181935D04C554A4B4CE33DA229D20CB605B25E8A62CF70D01A2F835BEF3A13B0AC6369A6E37EFBB40808797C3".decode('hex')

pos = 0
flag = bytearray(32)
i = 0
while i < 500:
    for j in range(300):
        j2 = 299 - j
        if (j2 <= 0x16) or (j2 > 0x116) or (i <= 0x1a) or (i > 0x1da):
            continue

        if (data[j2*500 + i] == 0x24):
            if (data[(j2 - 1)*500 + i] == pos):
                flag[pos] = 0x116 - j - 1
                pos = pos + 1
                break
            elif (data[(j2 - 1)*500 + i] == 0x24) and (data[(j2 + 1)*500 + i] != 0x24) and (data[(j2 - 2)*500 + i] != 0x24):
                flag[pos] = 0x116 - j - 1
                pos = pos + 1
                i = i + 14
                break
    i = i + 1

indexes = bytearray(32)

for i in range(32):
    for j in range(len(table)):
        if flag[i] == ord(table[j]):
            indexes[i] = j


# index = flag[i] + Sum mod 256
Sum = (indexes[31] - 61) % 256

flag2 = bytearray(32)
for i in range(32):
    flag2[i] = (indexes[i] - Sum) % 256


Sum2 = 0
result = ""
for i in range(32):
    Sum2 = Sum2 + (i + 1) * flag2[i]
    result = result + chr(flag2[i])

Sum2 = Sum2 % 256

if Sum != Sum2:
    print "Incorrect checksum"

print result


